• EPICS应用程序开发1 -- 开始


    1、介绍

    本章简要介绍创建EPICS IOC应用程序。它包含:

    • 对创建、构建以及运行一个示例IOC应用程序的介绍
    • 对创建、构建以及执行一个示例通道访问客户端的介绍
    • 简要介绍iocsh,它是一个base提供的命令shell
    • 描述构建IOC组件的规则
    • 描述makeBaseApp.pl,它是一个产生用于构建应用程序的文件的perl脚本。
    • 简要讨论vxWorks boot参数

    除非你一定程度上熟悉了IOC概念,诸如记录类型、设备和驱动支持以及已经有了一些创建IOC数据库的经验,否则本章难于理解。一旦你有了这些经验,本章提供了构建应用程序所需的绝大部分信息。以下的示例认为已经构建了EPICS base。

    2、示例IOC应用程序

    这部分解释了如何在一个目录中创建一个示例IOC应用程序,命名这个应用程序未myexample和ioc目录iocmyexample。

    2.1 检查是否定义了EPICS_HOST_ARCH

    Unix/Linux:

    1. [root@telecom ~]# echo $EPICS_HOST_ARCH
    2. linux-x86_64

    Windows:

    set EPICS_HOST_ARCH

    这应该显示你工作站架构,例如:linux-x86_64或者win64-x86。如果你得到了一个"Undefined variable"错误,你应该设置EPICS_HOST_ARCH为你主机操作系统后跟一个短划线并且接着i主机架构,例如solaris-sparc。在base/startup目录中提供的perl脚本帮助设置EPICS_HOST_ARCH。

    1. [root@telecom ~]# /usr/local/EPICS/base/startup/EpicsHostArch
    2. linux-x86_64

    2.2 创建示例应用程序

    以下命令创建一个示例应用程序:

    1. mkdir
    2. cd
    3. /bin/<arch>/makeBaseApp.pl -t example myexample
    4. /bin/<arch>/makeBaseApp.pl -i -t example myexample

    在这里,表明你计算机的操作系统架构。例如,linux-x86_64。最后一条命令将询问你输入这个IOC的架构。它提供一个已经为哪些架构构建了base的列表。以下是一个在linux-x86_64主机上构建一个示例IOC应用程序的操作步骤: 

    1. [root@telecom EPICS]# mkdir example
    2. [root@telecom EPICS]# cd example/
    3. [root@telecom example]# /usr/local/EPICS/base/bin/linux-x86_64/makeBaseApp.pl -t example myexample
    4. [root@telecom example]# /usr/local/EPICS/base/bin/linux-x86_64/makeBaseApp.pl -i -t example myexample
    5. Using target architecture linux-x86_64 (only one available)
    6. The following applications are available:
    7. myexample
    8. What application should the IOC(s) boot?
    9. The default uses the IOC's name, even if not listed above.
    10. Application name?
    11. [root@telecom example]# ls
    12. configure iocBoot Makefile myexampleApp

    必须给出到的完整路径名(一个EPICS base已经构建的副本)。与你EPICS系统管理员确认什么路径到你的

    Window用户注意:在Windows上必须用perl 调用Perl脚本。Perl脚本是区分大小写。例如,要在Windows上创建一个应用程序:

    perl C:\epics\base\bin\win32-x86\makeBaseApp.pl -t example myexample

    2.3 检查文件

    花点时间检查在目录下出现的文件。在构建前做这件事。这使你在没有见到由make产生文件情况下见到构建一个应用程序所需的一般文件。

    1. [root@telecom example]# ls -R
    2. .:
    3. configure iocBoot Makefile myexampleApp
    4. ./configure:
    5. CONFIG CONFIG_SITE Makefile RELEASE RULES RULES_DIRS RULES.ioc RULES_TOP
    6. ./iocBoot:
    7. iocmyexample Makefile
    8. ./iocBoot/iocmyexample:
    9. Makefile README st.cmd
    10. ./myexampleApp:
    11. Db Makefile src
    12. ./myexampleApp/Db:
    13. circle.db dbExample1.db dbExample2.db dbSubExample.db Makefile myexampleVersion.db user.substitutions
    14. ./myexampleApp/src:
    15. dbSubExample.c devmyexampleVersion.dbd initTrace.dbd myexampleHello.dbd sncExample.stt xxxRecord.dbd
    16. dbSubExample.dbd devXxxSoft.c Makefile myexampleMain.cpp sncProgram.st xxxSupport.dbd
    17. devmyexampleVersion.c initTrace.c myexampleHello.c sncExample.dbd xxxRecord.c

    2.4 Sequencer示例

    sequencer现在是作为一个非捆绑产品被支持的。这个示例包含一个示例状态标记程序sncExample.stt。由于由makeBaseApp创建,这个示例未被构建或者执行。

    在sncExample.stt能够被编译前,必须已经使用这个示例使用的相同base版构建本sequencer模块。

    要构建sncExample,编辑以下文件:

    • configure/RELEASE:设置base为这个sequencer的位置。
    • iocBoot/iocmyexample/st.cmd:从以下行移除注释字符#:

    #seq sncExample "user="

    Makefile包含用于以这个示例IOC应用程序组件和以一个称为sncProgram的独立程序(一个通过通道访问连接一个单独IOC数据库的可执行程序)构建这个sncExample代码的组件。

    2.5 构建

    目录中执行命令:make

    1. [root@rockygu example]# make
    2. make -C ./configure install
    3. make[1]: Entering directory '/EPICS/example/configure'
    4. perl -CSD /EPICS/base/bin/linux-x86_64/makeMakefile.pl O.linux-x86_64 ../..
    5. ...
    6. perl -CSD /EPICS/base/bin/linux-x86_64/convertRelease.pl -t /EPICS/example envPaths
    7. make[2]: Leaving directory '/EPICS/example/iocBoot/iocmyexample'
    8. make[1]: Leaving directory '/EPICS/example/iocBoot'

    注意:在GNU make不为默认的系统上,需要另一个命令,例如gnumake, gmake等。见你EPICS系统管理员。

    2.6 检查文件

    这时你将看到由make产生的文件以及原先文件。

    2.7 运行IOC示例

    这个示例可以运行在vxWorks,RTEMS或者在一个受到支持的主机上。

    在一台主机上,例如Linux或Solaris:

    1. [root@rockygu EPICS]# cd example/iocBoot/iocmyexample/
    2. [root@rockygu iocmyexample]# ../../bin/linux-x86_64/myexample st.cmd
    3. #!../../bin/linux-x86_64/myexample
    4. < envPaths
    5. epicsEnvSet("IOC","iocmyexample")
    6. epicsEnvSet("TOP","/EPICS/example")
    7. epicsEnvSet("EPICS_BASE","/EPICS/base")
    8. cd "/EPICS/example"
    9. ## Register all support components
    10. dbLoadDatabase "dbd/myexample.dbd"
    11. myexample_registerRecordDeviceDriver pdbbase
    12. ## Load record instances
    13. dbLoadTemplate "db/user.substitutions"
    14. dbLoadRecords "db/myexampleVersion.db", "user=root"
    15. dbLoadRecords "db/dbSubExample.db", "user=root"
    16. #var mySubDebug 1
    17. #traceIocInit
    18. cd "/EPICS/example/iocBoot/iocmyexample"
    19. iocInit
    20. Starting iocInit
    21. ############################################################################
    22. ## EPICS R7.0.4.1
    23. ## Rev. 2022-06-14T15:34+0800
    24. ############################################################################
    25. iocRun: All initialization complete
    26. ## Start any sequence programs
    27. #seq sncExample, "user=root"
    28. epics>

    在vxWorks/RTEMS:如在本章末尾描述地设置你地boot参数并且接着启动这个ioc。

    在这个ioc被启动后,尝试一些在"IOC Test Facility"章描述地shell命令。尤其运行dbl来获取一个记录列表。

    1. epics> dbl
    2. root:circle:angle
    3. root:line:a
    4. root:circle:x
    5. root:circle:y
    6. root:calcExample
    7. root:calcExample1
    8. root:calc1
    9. root:calcExample2
    10. root:calc2
    11. root:calcExample3
    12. root:calc3
    13. root:myexample:version
    14. root:line:b
    15. root:aiExample
    16. root:aiExample1
    17. root:ai1
    18. root:aiExample2
    19. root:ai2
    20. root:aiExample3
    21. root:ai3
    22. root:aSubExample
    23. root:subExample
    24. root:circle:step
    25. root:circle:period
    26. root:compressExample
    27. root:circle:tick
    28. root:xxxExample

    在非wxWorks IOCs上使用地iocsh命令解释器提供了一个help工具。主要输入help:

    1. epics> help
    2. Type 'help ' to see the arguments of <command>.
    3. # ClockTime_Report ClockTime_Shutdown
    4. asDumpHash asInit asSetFilename asSetSubstitutions
    5. ascar asdbdump asphag aspmem asprules
    6. aspuag astac callbackParallelThreads
    7. callbackQueueShow callbackSetQueueSize casr
    8. cd coreRelease date dbDumpBreaktable
    9. dbDumpDevice dbDumpDriver dbDumpField dbDumpFunction dbDumpLink
    10. dbDumpMenu dbDumpPath dbDumpRecord dbDumpRecordType
    11. dbDumpRegistrar dbDumpVariable dbLoadDatabase dbLoadRecords dbLoadTemplate
    12. dbLockShowLocked dbNotifyDump dbPutAttribute dbPvdDump
    13. dbPvdTableSize dbReportDeviceConfig dbStateClear dbStateCreate
    14. dbStateSet dbStateShow dbStateShowAll dba dbap
    15. dbb dbc dbcar dbd dbel
    16. dbgf dbgl dbgrep dbhcr dbior
    17. dbjlr dbl dbla dbli dblsr
    18. dbnr dbp dbpf dbpr dbpvar
    19. dbs dbsr dbstat dbtgf dbtpf
    20. dbtpn dbtr echo eltc epicsEnvSet
    21. epicsEnvShow epicsEnvUnset epicsMutexShowAll epicsParamShow
    22. epicsPrtEnvParams epicsThreadResume
    23. epicsThreadShow epicsThreadShowAll epicsThreadSleep
    24. errlog errlogInit errlogInit2 exit
    25. generalTimeReport gft hello help
    26. installLastResortEventProvider iocBuild iocInit iocLogInit
    27. iocLogPrefix iocLogShow iocPause iocRun iocshCmd
    28. iocshLoad iocshRun myexample_registerRecordDeviceDriver
    29. on pft postEvent pval pvasr
    30. pwd refdiff refmon refsave refshow
    31. registryDeviceSupportFind registryDriverSupportFind registryDump
    32. registryFunctionFind registryRecordTypeFind
    33. scanOnceQueueShow scanOnceSetQueueSize scanpel
    34. scanpiol scanppl setIocLogDisable startPVAServer
    35. stopPVAServer taskwdShow tpn traceIocInit var

     或者help ,此处是一个由help显示的命令之一。

    1. epics> help dbpr
    2. Usage: dbpr 'record name' 'interest level'
    3. Database Print Record.
    4. Print values of record fields.

     help命令接收通配符,因此help dbt*将提供以字符dbt开头的所有命令的信息。

    1. epics> help dbt*
    2. Usage: dbtgf 'record name'
    3. Database Test Get Field.
    4. Get field with different DBR_* types
    5. Usage: dbtpf 'record name' value
    6. Database Test Put Field.
    7. Usage: dbtpn 'record name' value
    8. Database Put Notify
    9. Without value, begin async. processing and get
    10. With value, begin put, process, and get
    11. Usage: dbtr 'record name'
    12. Process record and then some fields.

    在vxWorks上,help功能通过首先输入iocsh获取。

    3 通道访问主机示例

    可以通过以下命令产生一个示例主机示例:

    1. [root@rockygu EPICS]# mkdir client
    2. [root@rockygu EPICS]# cd client/
    3. [root@rockygu client]# makeBaseApp.pl -t caClient caClient
    4. [root@rockygu client]# make
    5. make -C ./configure install
    6. make[1]: Entering directory '/EPICS/client/configure'
    7. perl -CSD /EPICS/base/bin/linux-x86_64/makeMakefile.pl O.linux-x86_64 ../..
    8. ...
    9. make[1]: Leaving directory '/EPICS/client/caClientApp'

    提供了两个通道访问示例:

    1) caExample:这个示例程序接受一个pvname参数,连接并且读取这个pv的当前值,显示结果并且终止。要运行这个示例,只要输入/bin//caExample ,如下:

    1. [root@rockygu linux-x86_64]# ./caExample root:ai1
    2. root:ai1 3.000000
    • :是一个你应用程序顶层目录的完整路径名。
    • :你主机架构。
    • :由dbl ioc shell命令显示的记录名中一个。

    2) caMonitor:这个示例程序接受一个其包含一个pvnames列表的文件名参数,每个pvname出现在单独一行。它连接每个pv并且发出monitor请求。它显示所有通道访问事件、连接事件等的消息。

    1. [root@rockygu linux-x86_64]# cat pvnames
    2. root:ai1
    3. root:ai2
    4. root:ai3
    5. [root@rockygu linux-x86_64]# ./caMonitor pvnames
    6. accessRightsCallback
    7. pv: root:ai1 type(-1) nelements(0) host(localhost:5064) read(1) write(1) state(0)
    8. connectionCallback
    9. pv: root:ai1 type(6) nelements(1) host(localhost:5064) read(1) write(1) state(2)
    10. accessRightsCallback
    11. pv: root:ai2 type(-1) nelements(0) host(localhost:5064) read(1) write(1) state(0)
    12. connectionCallback
    13. pv: root:ai2 type(6) nelements(1) host(localhost:5064) read(1) write(1) state(2)
    14. accessRightsCallback
    15. pv: root:ai3 type(-1) nelements(0) host(localhost:5064) read(1) write(1) state(0)
    16. connectionCallback
    17. pv: root:ai3 type(6) nelements(1) host(localhost:5064) read(1) write(1) state(2)
    18. Event Callback: root:ai1 = 6
    19. Event Callback: root:ai2 = 3
    20. Event Callback: root:ai3 = 1
    21. Event Callback: root:ai1 = 7
    22. Event Callback: root:ai2 = 4
    23. Event Callback: root:ai1 = 8
    24. Event Callback: root:ai1 = 9
    25. Event Callback: root:ai3 = 2
    26. Event Callback: root:ai2 = 5
    27. Event Callback: root:ai1 = 0
    28. Event Callback: root:ai1 = 1
    29. Event Callback: root:ai2 = 6
    30. Event Callback: root:ai1 = 2
    31. ...

    4、iocsh

    因为只在vxWorks上才有vxWorks Shell,EPICS base提供了iocsh。在主程序中,按以下能够调用它:

    1. iocsh("filename")
    2. iocsh(0)

    如果这个参数是一个文件名,在文件中的命令被执行并且iocsh返回。如果参数是0,则iocsh进入交互模式,即是:它进行提示并且在发出exit命令前执行命令。

    这个shell在"IOC Shell"中更详细地描述。

    在vxWorks上,iocsh不是自动的被启动。通过向vxWorks shell发出以下命令可以启动它。

    iocsh

    要返回vxWorks shell,只要发出:

    exit

    5 构建IOC组件

    详细地构建规则在"Build Facility"中讲解。这部分描述用于构建IOC应用程序所需地大部分组件的方法。它使用来自由makeBaseApp产生的myexampleApp/src/Makefile的摘要。

    1. [root@rockygu src]# cat Makefile
    2. TOP=../..
    3. include $(TOP)/configure/CONFIG
    4. #----------------------------------------
    5. # ADD MACRO DEFINITIONS BELOW HERE
    6. # Use typed rset structure (see 3.16.1 release notes)
    7. USR_CPPFLAGS += -DUSE_TYPED_RSET
    8. # xxxRecord.h will be created from xxxRecord.dbd
    9. DBDINC += xxxRecord
    10. # Install xxxSupport.dbd into /dbd
    11. DBD += xxxSupport.dbd
    12. # Build an IOC support library
    13. LIBRARY_IOC += myexampleSupport
    14. # Compile and add code to the support library
    15. myexampleSupport_SRCS += xxxRecord.c
    16. myexampleSupport_SRCS += devXxxSoft.c
    17. # Link locally-provided code into the support library,
    18. # rather than directly into the IOC application, that
    19. # causes problems on Windows DLL builds
    20. myexampleSupport_SRCS += dbSubExample.c
    21. myexampleSupport_SRCS += devmyexampleVersion.c
    22. myexampleSupport_SRCS += myexampleHello.c
    23. myexampleSupport_SRCS += initTrace.c
    24. myexampleSupport_LIBS += $(EPICS_BASE_IOC_LIBS)
    25. # Auto-generate a header file containing a version string.
    26. # Version comes from the VCS if available, else date+time.
    27. GENVERSION = myexampleVersion.h
    28. # Macro name
    29. GENVERSIONMACRO = myexampleVERSION
    30. # Build the IOC application
    31. PROD_IOC = myexample
    32. # myexample.dbd will be created and installed
    33. DBD += myexample.dbd
    34. # myexample.dbd will include these files:
    35. myexample_DBD += base.dbd
    36. myexample_DBD += xxxSupport.dbd
    37. myexample_DBD += dbSubExample.dbd
    38. myexample_DBD += devmyexampleVersion.dbd
    39. myexample_DBD += myexampleHello.dbd
    40. myexample_DBD += initTrace.dbd
    41. # myexample_registerRecordDeviceDriver.cpp derives from myexample.dbd
    42. myexample_SRCS += myexample_registerRecordDeviceDriver.cpp
    43. # Build the main IOC entry point where needed
    44. myexample_SRCS_DEFAULT += myexampleMain.cpp
    45. myexample_SRCS_vxWorks += -nil-
    46. # Link in the code from our support library
    47. myexample_LIBS += myexampleSupport
    48. # To build SNL programs, SNCSEQ must be defined
    49. # in the /configure/RELEASE file
    50. ifneq ($(SNCSEQ),)
    51. # Build sncExample into myexampleSupport
    52. sncExample_SNCFLAGS += +r
    53. myexample_DBD += sncExample.dbd
    54. # A .stt sequence program is *not* pre-processed:
    55. myexampleSupport_SRCS += sncExample.stt
    56. myexampleSupport_LIBS += seq pv
    57. myexample_LIBS += seq pv
    58. # Build sncProgram as a standalone program
    59. PROD_HOST += sncProgram
    60. sncProgram_SNCFLAGS += +m
    61. # A .st sequence program *is* pre-processed:
    62. sncProgram_SRCS += sncProgram.st
    63. sncProgram_LIBS += seq pv
    64. sncProgram_LIBS += $(EPICS_BASE_HOST_LIBS)
    65. endif
    66. # Link QSRV (pvAccess Server) if available
    67. ifdef EPICS_QSRV_MAJOR_VERSION
    68. myexample_LIBS += qsrv
    69. myexample_LIBS += $(EPICS_BASE_PVA_CORE_LIBS)
    70. myexample_DBD += PVAServerRegister.dbd
    71. myexample_DBD += qsrv.dbd
    72. endif
    73. # Finally link IOC to the EPICS Base libraries
    74. myexample_LIBS += $(EPICS_BASE_IOC_LIBS)
    75. include $(TOP)/configure/RULES
    76. #----------------------------------------
    77. # ADD EXTRA GNUMAKE RULES BELOW HERE
    78. # Explicit dependency needed for generated header file
    79. devmyexampleVersion$(DEP): $(COMMON_DIR)/$(GENVERSION)

    能够构建以下两种类型的应用程序:

    1) 进行支持的应用程序:这些是打算由ioc应用程序使用的应用程序。在这里描述的规则安装东西到以下目录之一,而这些目录就被创建在下。

    • include:C include文件被安装在这里。由应用程序提供的头文件或从xxxRecord.dbd或xxxMenu.dbd文件产生的头文件。
    • dbd:每个文件包含include, recordtype, device, driver和registrar数据库定义命令的某个组合。以下被安装:a) xxxRecord.dbd和xxxMenu.dbd文件; b) 一个任意的xxx.dbd文件; c) ioc应用程序安装由yyyInude.dbd产生的一个yyy.dbd文件。
    • db:包含记录实例定义的文件。
    • lib/arch:所有源模块被编译和放置在一个共享或静态库中。

    2) IOC应用程序:这些是被装载到实际IOCs中的应用程序。

    5.1 绑定到IOC组件

    因为仅在ioc初始化过程中才绑定很多IOC组件,必须提供链接到合适的共享和/或静态库的某些方法。用于IOCs的方法是从一个xxxInclude.dbd文件产生一个引用合适的库模块的C++程序。以下数据库定义关键字被用于这个目的:

    1. recordtype
    2. device
    3. driver
    4. function
    5. variable
    6. registrar

    这个方法也要求IOC组件包含一个合适的epicsExport语句。所有组件必须包含这条语句:

    #include 

    定义任何导出函数的任何组件也必须包括:

    #include 

    每个记录支持模块必须包含一个像以下的语句:

    epicsExportAddress(rset,xxxRSET);

    每个设备支持模块必须包含一个像以下的语句:

    epicsExportAddress(dset,devXxxSoft);

    每个驱动模块必须包含一个像以下的语句:

    epicsExportAddress(drvet,drvXxx);

    在包含这个函数的C源文件中使用一个epicsRegisterFunction以及在应用程序数据库描述文件中用一个function语句注册函数。makeBaseApp示例包含以下语句注册两个函数与一个subroutine记录一起使用:

    在dbSubExample.c中:

    1. epicsRegisterFunction(mySubInit);
    2. epicsRegisterFunction(mySubProcess);

    在dbSubExample.dbd中:

    1. function(mySubInit)
    2. function(mySubProcess)

    数据库定义关键字variable强制对一个整数或double变量进行一个引用,例如调试变量。mySubExample.dbd文件中包含像以下的定义:

    variable(mySubDebug)

    定义这个变量的代码必须包含像这样的代码(以dbSubExample.c为例):

    1. ...
    2. int mySubDebug;
    3. ...
    4. epicsExportAddress(int, mySubDebug);
    5. ...

     关键字registrar表示这个EPICS组件提供一个具有以下原型的指定名称注册函数:

    typdedef void (*REGISTRAR)(void);

    这个函数通常注册东西,如在"Registry"章节描述的。makeBaseApp示例提供了一个简单的iocsh命令,用以下注册函数注册它:

    1. static void helloRegister(void) {
    2. iocshRegister(&helloFuncDef, helloCallFunc);
    3. }
    4. epicsExportRegistrar(helloRegister)

     

    5.2 Makefile规则

    5.2.1 构建一个进行支持的应用程序

    1. # 将xxxRecord.dbd创建xxxRecord.h
    2. DBDINC += xxxRecord
    3. DBD += xxxSupport.dbd
    4. LIBRARY_IOC += myexampleSupport
    5. myexampleSupport_SRCS += xxxRecord.c
    6. myexampleSupport_SRCS += devXxxSoft.c
    7. myexampleSupport_SRCS += dbSubExample.c
    8. myexampleSupport_LIBS += $(EPICS_BASE_IOC_LIBS)

    1)DBDINC规则查找一个名为xxxRecord.dbd文件。从这个文件创建一个文件xxxRecord.h并且安装其到/include。

    2)DBD规则在源目录中寻找xxxSupport.dbd并且安装它到/dbd。

    3)LIBRARY_IOC变量请求创建一个库并且安装这个库到/lib/

    4) myexampleSupport_SRCS语句指名所有被编辑和放入这个库的源文件

    5)以上语句是构建很多进行支持的应用程序所需的一切。

    5.2.2 构建IOC应用程序

    以下语句构建IOC应用程序:

    1. # Build the IOC application
    2. PROD_IOC = myexample
    3. # myexample.dbd will be created and installed
    4. DBD += myexample.dbd
    5. # myexample.dbd will include these files:
    6. myexample_DBD += base.dbd
    7. myexample_DBD += xxxSupport.dbd
    8. myexample_DBD += dbSubExample.dbd
    9. myexample_DBD += devmyexampleVersion.dbd
    10. myexample_DBD += myexampleHello.dbd
    11. myexample_DBD += initTrace.dbd
    12. # myexample_registerRecordDeviceDriver.cpp derives from myexample.dbd
    13. myexample_SRCS += myexample_registerRecordDeviceDriver.cpp
    14. # Build the main IOC entry point where needed
    15. myexample_SRCS_DEFAULT += myexampleMain.cpp
    16. myexample_SRCS_vxWorks += -nil-
    17. # Link in the code from our support library
    18. myexample_LIBS += myexampleSupport
    19. # To build SNL programs, SNCSEQ must be defined
    20. # in the /configure/RELEASE file
    21. ifneq ($(SNCSEQ),)
    22. # Build sncExample into myexampleSupport
    23. sncExample_SNCFLAGS += +r
    24. myexample_DBD += sncExample.dbd
    25. # A .stt sequence program is *not* pre-processed:
    26. myexampleSupport_SRCS += sncExample.stt
    27. myexampleSupport_LIBS += seq pv
    28. myexample_LIBS += seq pv
    29. # Build sncProgram as a standalone program
    30. PROD_HOST += sncProgram
    31. sncProgram_SNCFLAGS += +m
    32. # A .st sequence program *is* pre-processed:
    33. sncProgram_SRCS += sncProgram.st
    34. sncProgram_LIBS += seq pv
    35. sncProgram_LIBS += $(EPICS_BASE_HOST_LIBS)
    36. endif
    37. # Link QSRV (pvAccess Server) if available
    38. ifdef EPICS_QSRV_MAJOR_VERSION
    39. myexample_LIBS += qsrv
    40. myexample_LIBS += $(EPICS_BASE_PVA_CORE_LIBS)
    41. myexample_DBD += PVAServerRegister.dbd
    42. myexample_DBD += qsrv.dbd
    43. endif
    44. # Finally link IOC to the EPICS Base libraries
    45. myexample_LIBS += $(EPICS_BASE_IOC_LIBS)

    PROC_IOC设置这个ioc应用程序的名称,在这里称为myexample。

    DBD定义myexample.dbd将使得构建规则从在myexample_DBD定义中的文件创建这个myexample.dbd文件并且放置其到/dbd路径下,并且这个产生的dbd文件将包含在myexample_DBD指定文件的内容。

    能够指定任何数目的myexample_SRCS语句。格式_registerRecordDeviceDriver.cpp是特殊的;当见到它们时,perl脚本registerRecordDeviceDriver.pl被执行并且指定.dbd作为输入。这个脚本自动地产生_registerRecordDeviceDriver.cpp。

    6 makeBaseApp.pl

    makeBaseApp.pl是一个创建应用程序区域的perl脚本。它可以创建以下:

    • /Makefile
    • /configure:这个目录包含了由EPICS build系统需要的文件。
    • /xxxApp:一个对应一个主要子模块的目录和相关文件的集合。
    • /iocBoot:一个子目录和相关联文件。
    • /iocBoot/iocxxx:对应单个ioc的一个子目录和文件。

    makeBaseApp.pl创建目录并且接着复制模板文件到这个新创建的目录同时展开这些模板文件中的宏。EPICS提供了两个模板文件集合:simple和example。但每个站点能够创建它自己的可能提供其它功能的模板文件集合。这部分描述makeBaseApp自身的功能,下一部分提供有关simple和example模板的详情情况。

    6.1 用法

    makeBaseApp有四种可能的命令行格式:

    1) /bin//makeBaseApp.pl -h提供帮助。

    1. [root@telecom ~]# /usr/local/EPICS/base/bin/linux-x86_64/makeBaseApp.pl -h
    2. Usage:
    3. /bin/<arch>/makeBaseApp.pl -h
    4. display help on command options
    5. /bin/<arch>/makeBaseApp.pl -l [options]
    6. list application types
    7. /bin/<arch>/makeBaseApp.pl -t type [options] [app ...]
    8. create application directories
    9. /bin/<arch>/makeBaseApp.pl -i -t type [options] [ioc ...]
    10. create ioc boot directories
    11. where
    12. app Application name (the created directory will have "App" appended)
    13. ioc IOC name (the created directory will have "ioc" prepended)
    14. -a arch Set the IOC architecture for use with -i (e.g. vxWorks-68040)
    15. If arch is not specified, you will be prompted
    16. -b base Set the location of EPICS base (full path)
    17. If not specified, base path is taken from configure/RELEASE
    18. If configure does not exist, from environment
    19. If not found in environment, from makeBaseApp.pl location
    20. -d Enable debug messages
    21. -i Specifies that ioc boot directories will be generated
    22. -l List valid application types for this installation
    23. If this is specified the other options are not used
    24. -p app Set the application name for use with -i
    25. If not specified, you will be prompted
    26. -T top Set the template top directory (where the application templates are)
    27. If not specified, top path is taken from configure/RELEASE
    28. If configure does not exist, top path is taken from environment
    29. If not found in environment, the templates from EPICS base are used
    30. -t type Set the application type (-l for a list of valid types)
    31. If not specified, type is taken from environment
    32. If not found in environment, "default" is used
    33. -u user Set username; overrides OS defaults
    34. Environment:
    35. EPICS_MBA_DEF_APP_TYPE Application type you want to use as default
    36. EPICS_MBA_TEMPLATE_TOP Template top directory
    37. EPICS_MBA_BASE Location of EPICS base
    38. Example: Create exampleApp
    39. /bin/<arch>/makeBaseApp.pl -t example example
    40. /bin/<arch>/makeBaseApp.pl -i -t example example

    2) /bin//makeBaseApp.pl -l [options]列出可用的应用程序模板。这种调用不改变当前目录。

    1. [root@telecom ~]# /usr/local/EPICS/base/bin/linux-x86_64/makeBaseApp.pl -l
    2. Valid application types are:
    3. support
    4. caClient
    5. example
    6. ioc
    7. caPerl
    8. Valid iocBoot types are:
    9. example
    10. ioc

    3) /bin//makeBaseApp.pl [-t type] [options] app ...

    创建应用程序目录。

    4) /bin//makeBaseApp.pl -i -t type [options] ioc ...

    创建ioc启动目录。

    对应所有命令格式的选项:

    1) -b base:提供到EPICS base的完整路径。如果不指定,从在configure/RELEASE中EPICS_BASE项获取这个值。如果configure目录不存在,路径从用于调用makeBaseApp的命令行获取。

    2) -T template:设置合适的顶层目录(应用程序模板所在位置)。如果未指定,从在configure/RELEASE中TEMPLATE_TOP条目获取这个模板路径。如果不存在,从环境变量EPICS_MBA_TEMPLAT4E_TOP获取这个路径,或者如果这不是设置,使用来自EPICS base的模板。

    3) -d:详细输出(用于调试)。

    对makeBaseApp.pl [-t type] [options] app ...唯一的参数:

    1) app:一个或多个应用程序名称(创建的目录将在其名称尾部添加"App")。

    2) -t type:设置模板类型(使用-l调用来获取一个有效类型列表)。如果没有使用这个选项,从环境变量EPICS_MBA_DEF_APP_TYPE获取类型,或者如果不是那样,设置值"default"并且接着尝试"example"。

    对于makeBaseApp.pl -i [options] ioc ...唯一的参数:

    1) ioc:一个或者多个IOC名称(创建的目录将在这个名称前面添加"ioc")

    2) -a arch: 设置IOC架构(例如:vxWorks-68040)。如果未指定-a arch,将提示你。

    6.2 环境变量

    EPICS_MBA_DEF_APP_TYPE:你想要以默认使用的应用程序类型。

    EPICS_MBA_TEMPLAT4E_TOP:模板顶层目录。

    6.3 描述

    要创建一个新的,发出这些命令:

    1. mkdir
    2. cd
    3. /bin/<arch>/makeBaseApp.pl -t <type> ...
    4. /bin/<arch>/makeBaseApp.pl -i -t <type> ...

    makeBaseApp做以下事情:

    1) 通过按顺序检查以下定位到EPICS_BASE

    • 如果指定了-b选项,使用其值
    • 如果/configure/RELEASE文件存在并且位为EPICS_BASE定义了一个值,使用它。
    • 从makeBaseApp程序调用获取它。为了是这有效,必须给出到你正在使用的EPICS base发行版中makeBaseApp.pl的完整路径名称。

    2) 用相同方式定位到TEMPLATE_TOP

    • 如果指定了-T选项,使用它的值。
    • 如果/configure/RELEASE文件存在,并且为TEMPLATE_TOP定义了一个值,使用它。
    • 如果定义了EPICS_MBA_TEMPLATE_TOP,使用它的值。
    • 它被设置成/templat4es/makeBaseApp/top

    3) 如果制定了-l,列出应用程序类型的列表,并且makeBaseApp终结。

    4)如果指定了-i,而未定义-a,则提示用户输入IOC架构

    5)通过按顺序检查以下,决定这个应用程序类型:

    如果指定-t,使用它

    如果定义了EPICS_MBA_DEF_APP_TYPE,使用它的值。

    如果一个模板defaultApp存在,应用程序类型被设置为default。

    如果一个模板exampleApp存在,应用程序类型被设置成example。

    6) 如果在TEMPLATE_TOP中没有找到这个应用程序类型,makeBaseApp发出一个错误并且终结。

    7) 如果Makefile不存在,创建它。

    8) 如果目录configure不存在,创建它并且用所有configure文件进行提供。

    9) 如果指定了-i:

    • 如果目录iocBoot不存在,创建它并且从模板boot目录复制文件到它。
    • 对于在命令行上指定的每个,创建一个目录iocBoot/ioc并且用来自模板(带有RelaceLine()标记替换)的文件填充它。

    如果未指定-i:对于在命令行上指定的每个,创建一个目录App,并且用来自模板用ReplaceLine标记替换的目录树填充它(用ReplaceLine标记替换)。

    6.4 在一个Template中标记替换

    当从模板复制某些文件到新的应用程序结构体时,makeBaseApp用此时知道的值替换在文件名称或文本中一些预定义的标记。一个应用程序模板可以按以下扩展这个功能:

    1) 在makeBaseApp中定义的两个perl子程序

    • ReplaceFileName:这替代从模板获取的任何文件的名称中的以下:_APPNAME_ _APPTYPE_
    • ReplaceLine:这替代从模板获取每个文件的每行中的以下:_USER_ _EPICS_BASE_ _ARCH_ _APPNAME_ _APPTYPE_ _TEMPLATE_TOP_ _IOC_

    2) 如果应用程序类型目录有一个名为Replace.pl的文件,这个文件可能:

    • 用其自己的版本替换以上子程序中一个或者两个。
    • 提供一个子程序ReplaceFilenameHook($file),其将在以上描述的子程序ReplaceFilename末尾被调用。
    • 提供一个子程序ReplaceLineHook($file),其将在ReplaceLine末尾被调用。
    • 包含其它代码,在命令行选项被解析后运行它。

    6.5 由base提供的MakeBaseApp模板

    6.5.1 support

    这创建适合于构建一个进行支持的应用程序的文件。

    6.5.2 ioc

    不带-i选项,这创建适合于构建一个ioc应用程序的文件。用-i选项,它创建一个ioc boot目录。

    6.5.3 example

    不用-i选项,它创建用于运行一个示例的文件。一个support和一个ioc应用程序都被构建。用-i选项,它创建一个能够被用于运行这个示例的ioc boot目录。

    6.5.4 caClient

    这构建两个通道访问客户端。

    6.5.5 caServer

    这构建一个示例便携式访问服务器。

    7 vxWorks boot参数

    通过调试口串口对你的IOC设置vxWorks boot参数。如果你能够连接调试口到你工作站上一个终端窗口,就简单得多。在Linux上,‘screen’程序使你通过一个本地串口进行通信;如果IOC连接了ttyS0,运行screen /dev/ttyS0。

    vxWorks boot参数看起来像以下:

    1. boot device : xxx
    2. processor number : 0
    3. host name : xxx
    4. file name : /vxWorks
    5. inet on ethernet (e) : xxx.xxx.xxx.xxx:
    6. host inet (h) : xxx.xxx.xxx.xxx
    7. user (u) : xxx
    8. ftp password (pw) : xxx
    9. flags (f) : 0x0
    10. target name (tn) : for this inet address>
    11. startup script (s) : /iocBoot/iocmyexample/st.cmd

    每个字段的实际值是取决于站点和IOC。你能够随意更改的两个字段是vxWorks启动镜像以及启动脚本的位置。

    注意:必须指定正确板卡支持启动镜像的完整路径名。如果使用bootp,相同信息将需要被放置在bootp主机配置数据库来替代。

    当你的启动参数设置合适时,只要按下你IOC上重置按钮或者使用@mingl来开始启动。你将发现IOC的调试口连接到你工作站上一个滚动窗口是非常方便的。

  • 相关阅读:
    MySQL中的运算符
    [Docker]六.Docker自动部署nodejs以及golang项目
    在学习DNS的过程中给我的启发
    面试不到10分钟就被赶出来了,问的实在是太变态了...
    SpringBoot+Vue项目疫情防控期间某村外出务工人员信息管理系统
    springboot依赖的小知识点
    Python基础小知识问答系列-匿名函数
    缓存学习总结4(分布式缓存)
    常用注解@JsonField、@JsonFormat、@DateTimeFormat区别
    React 项目结构小结
  • 原文地址:https://blog.csdn.net/yuyuyuliang00/article/details/126915422