本章简要介绍创建EPICS IOC应用程序。它包含:
除非你一定程度上熟悉了IOC概念,诸如记录类型、设备和驱动支持以及已经有了一些创建IOC数据库的经验,否则本章难于理解。一旦你有了这些经验,本章提供了构建应用程序所需的绝大部分信息。以下的示例认为已经构建了EPICS base。
这部分解释了如何在一个
Unix/Linux:
- [root@telecom ~]# echo $EPICS_HOST_ARCH
- 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。
- [root@telecom ~]# /usr/local/EPICS/base/startup/EpicsHostArch
- linux-x86_64
以下命令创建一个示例应用程序:
- mkdir
- cd
/bin/<arch>/makeBaseApp.pl -t example myexample /bin/<arch>/makeBaseApp.pl -i -t example myexample
在这里,
- [root@telecom EPICS]# mkdir example
- [root@telecom EPICS]# cd example/
- [root@telecom example]# /usr/local/EPICS/base/bin/linux-x86_64/makeBaseApp.pl -t example myexample
- [root@telecom example]# /usr/local/EPICS/base/bin/linux-x86_64/makeBaseApp.pl -i -t example myexample
- Using target architecture linux-x86_64 (only one available)
- The following applications are available:
- myexample
- What application should the IOC(s) boot?
- The default uses the IOC's name, even if not listed above.
- Application name?
- [root@telecom example]# ls
- configure iocBoot Makefile myexampleApp
必须给出到
Window用户注意:在Windows上必须用perl
perl C:\epics\base\bin\win32-x86\makeBaseApp.pl -t example myexample
花点时间检查在
- [root@telecom example]# ls -R
- .:
- configure iocBoot Makefile myexampleApp
-
- ./configure:
- CONFIG CONFIG_SITE Makefile RELEASE RULES RULES_DIRS RULES.ioc RULES_TOP
-
- ./iocBoot:
- iocmyexample Makefile
-
- ./iocBoot/iocmyexample:
- Makefile README st.cmd
-
- ./myexampleApp:
- Db Makefile src
-
- ./myexampleApp/Db:
- circle.db dbExample1.db dbExample2.db dbSubExample.db Makefile myexampleVersion.db user.substitutions
-
- ./myexampleApp/src:
- dbSubExample.c devmyexampleVersion.dbd initTrace.dbd myexampleHello.dbd sncExample.stt xxxRecord.dbd
- dbSubExample.dbd devXxxSoft.c Makefile myexampleMain.cpp sncProgram.st xxxSupport.dbd
- devmyexampleVersion.c initTrace.c myexampleHello.c sncExample.dbd xxxRecord.c
sequencer现在是作为一个非捆绑产品被支持的。这个示例包含一个示例状态标记程序sncExample.stt。由于由makeBaseApp创建,这个示例未被构建或者执行。
在sncExample.stt能够被编译前,必须已经使用这个示例使用的相同base版构建本sequencer模块。
要构建sncExample,编辑以下文件:
#seq sncExample "user=
Makefile包含用于以这个示例IOC应用程序组件和以一个称为sncProgram的独立程序(一个通过通道访问连接一个单独IOC数据库的可执行程序)构建这个sncExample代码的组件。
在
- [root@rockygu example]# make
- make -C ./configure install
- make[1]: Entering directory '/EPICS/example/configure'
- perl -CSD /EPICS/base/bin/linux-x86_64/makeMakefile.pl O.linux-x86_64 ../..
- ...
- perl -CSD /EPICS/base/bin/linux-x86_64/convertRelease.pl -t /EPICS/example envPaths
- make[2]: Leaving directory '/EPICS/example/iocBoot/iocmyexample'
- make[1]: Leaving directory '/EPICS/example/iocBoot'
注意:在GNU make不为默认的系统上,需要另一个命令,例如gnumake, gmake等。见你EPICS系统管理员。
这时你将看到由make产生的文件以及原先文件。
这个示例可以运行在vxWorks,RTEMS或者在一个受到支持的主机上。
在一台主机上,例如Linux或Solaris:
- [root@rockygu EPICS]# cd example/iocBoot/iocmyexample/
- [root@rockygu iocmyexample]# ../../bin/linux-x86_64/myexample st.cmd
- #!../../bin/linux-x86_64/myexample
- < envPaths
- epicsEnvSet("IOC","iocmyexample")
- epicsEnvSet("TOP","/EPICS/example")
- epicsEnvSet("EPICS_BASE","/EPICS/base")
- cd "/EPICS/example"
- ## Register all support components
- dbLoadDatabase "dbd/myexample.dbd"
- myexample_registerRecordDeviceDriver pdbbase
- ## Load record instances
- dbLoadTemplate "db/user.substitutions"
- dbLoadRecords "db/myexampleVersion.db", "user=root"
- dbLoadRecords "db/dbSubExample.db", "user=root"
- #var mySubDebug 1
- #traceIocInit
- cd "/EPICS/example/iocBoot/iocmyexample"
- iocInit
- Starting iocInit
- ############################################################################
- ## EPICS R7.0.4.1
- ## Rev. 2022-06-14T15:34+0800
- ############################################################################
- iocRun: All initialization complete
- ## Start any sequence programs
- #seq sncExample, "user=root"
- epics>
在vxWorks/RTEMS:如在本章末尾描述地设置你地boot参数并且接着启动这个ioc。
在这个ioc被启动后,尝试一些在"IOC Test Facility"章描述地shell命令。尤其运行dbl来获取一个记录列表。
- epics> dbl
- root:circle:angle
- root:line:a
- root:circle:x
- root:circle:y
- root:calcExample
- root:calcExample1
- root:calc1
- root:calcExample2
- root:calc2
- root:calcExample3
- root:calc3
- root:myexample:version
- root:line:b
- root:aiExample
- root:aiExample1
- root:ai1
- root:aiExample2
- root:ai2
- root:aiExample3
- root:ai3
- root:aSubExample
- root:subExample
- root:circle:step
- root:circle:period
- root:compressExample
- root:circle:tick
- root:xxxExample
在非wxWorks IOCs上使用地iocsh命令解释器提供了一个help工具。主要输入help:
- epics> help
- Type 'help
' to see the arguments of <command>. - # ClockTime_Report ClockTime_Shutdown
- asDumpHash asInit asSetFilename asSetSubstitutions
- ascar asdbdump asphag aspmem asprules
- aspuag astac callbackParallelThreads
- callbackQueueShow callbackSetQueueSize casr
- cd coreRelease date dbDumpBreaktable
- dbDumpDevice dbDumpDriver dbDumpField dbDumpFunction dbDumpLink
- dbDumpMenu dbDumpPath dbDumpRecord dbDumpRecordType
- dbDumpRegistrar dbDumpVariable dbLoadDatabase dbLoadRecords dbLoadTemplate
- dbLockShowLocked dbNotifyDump dbPutAttribute dbPvdDump
- dbPvdTableSize dbReportDeviceConfig dbStateClear dbStateCreate
- dbStateSet dbStateShow dbStateShowAll dba dbap
- dbb dbc dbcar dbd dbel
- dbgf dbgl dbgrep dbhcr dbior
- dbjlr dbl dbla dbli dblsr
- dbnr dbp dbpf dbpr dbpvar
- dbs dbsr dbstat dbtgf dbtpf
- dbtpn dbtr echo eltc epicsEnvSet
- epicsEnvShow epicsEnvUnset epicsMutexShowAll epicsParamShow
- epicsPrtEnvParams epicsThreadResume
- epicsThreadShow epicsThreadShowAll epicsThreadSleep
- errlog errlogInit errlogInit2 exit
- generalTimeReport gft hello help
- installLastResortEventProvider iocBuild iocInit iocLogInit
- iocLogPrefix iocLogShow iocPause iocRun iocshCmd
- iocshLoad iocshRun myexample_registerRecordDeviceDriver
- on pft postEvent pval pvasr
- pwd refdiff refmon refsave refshow
- registryDeviceSupportFind registryDriverSupportFind registryDump
- registryFunctionFind registryRecordTypeFind
- scanOnceQueueShow scanOnceSetQueueSize scanpel
- scanpiol scanppl setIocLogDisable startPVAServer
- stopPVAServer taskwdShow tpn traceIocInit var
或者help
- epics> help dbpr
-
- Usage: dbpr 'record name' 'interest level'
-
- Database Print Record.
- Print values of record fields.
help命令接收通配符,因此help dbt*将提供以字符dbt开头的所有命令的信息。
- epics> help dbt*
-
- Usage: dbtgf 'record name'
-
- Database Test Get Field.
- Get field with different DBR_* types
- Usage: dbtpf 'record name' value
-
- Database Test Put Field.
-
- Usage: dbtpn 'record name' value
-
- Database Put Notify
- Without value, begin async. processing and get
- With value, begin put, process, and get
- Usage: dbtr 'record name'
-
- Process record and then some fields.
在vxWorks上,help功能通过首先输入iocsh获取。
可以通过以下命令产生一个示例主机示例:
- [root@rockygu EPICS]# mkdir client
- [root@rockygu EPICS]# cd client/
- [root@rockygu client]# makeBaseApp.pl -t caClient caClient
- [root@rockygu client]# make
- make -C ./configure install
- make[1]: Entering directory '/EPICS/client/configure'
- perl -CSD /EPICS/base/bin/linux-x86_64/makeMakefile.pl O.linux-x86_64 ../..
- ...
- make[1]: Leaving directory '/EPICS/client/caClientApp'
提供了两个通道访问示例:
1) caExample:这个示例程序接受一个pvname参数,连接并且读取这个pv的当前值,显示结果并且终止。要运行这个示例,只要输入
- [root@rockygu linux-x86_64]# ./caExample root:ai1
- root:ai1 3.000000
2) caMonitor:这个示例程序接受一个其包含一个pvnames列表的文件名参数,每个pvname出现在单独一行。它连接每个pv并且发出monitor请求。它显示所有通道访问事件、连接事件等的消息。
- [root@rockygu linux-x86_64]# cat pvnames
- root:ai1
- root:ai2
- root:ai3
- [root@rockygu linux-x86_64]# ./caMonitor pvnames
-
- accessRightsCallback
- pv: root:ai1 type(-1) nelements(0) host(localhost:5064) read(1) write(1) state(0)
-
- connectionCallback
- pv: root:ai1 type(6) nelements(1) host(localhost:5064) read(1) write(1) state(2)
-
- accessRightsCallback
- pv: root:ai2 type(-1) nelements(0) host(localhost:5064) read(1) write(1) state(0)
-
- connectionCallback
- pv: root:ai2 type(6) nelements(1) host(localhost:5064) read(1) write(1) state(2)
-
- accessRightsCallback
- pv: root:ai3 type(-1) nelements(0) host(localhost:5064) read(1) write(1) state(0)
-
- connectionCallback
- pv: root:ai3 type(6) nelements(1) host(localhost:5064) read(1) write(1) state(2)
- Event Callback: root:ai1 = 6
- Event Callback: root:ai2 = 3
- Event Callback: root:ai3 = 1
- Event Callback: root:ai1 = 7
- Event Callback: root:ai2 = 4
- Event Callback: root:ai1 = 8
- Event Callback: root:ai1 = 9
- Event Callback: root:ai3 = 2
- Event Callback: root:ai2 = 5
- Event Callback: root:ai1 = 0
- Event Callback: root:ai1 = 1
- Event Callback: root:ai2 = 6
- Event Callback: root:ai1 = 2
- ...
因为只在vxWorks上才有vxWorks Shell,EPICS base提供了iocsh。在主程序中,按以下能够调用它:
- iocsh("filename")
- 或
- iocsh(0)
如果这个参数是一个文件名,在文件中的命令被执行并且iocsh返回。如果参数是0,则iocsh进入交互模式,即是:它进行提示并且在发出exit命令前执行命令。
这个shell在"IOC Shell"中更详细地描述。
在vxWorks上,iocsh不是自动的被启动。通过向vxWorks shell发出以下命令可以启动它。
iocsh
要返回vxWorks shell,只要发出:
exit
详细地构建规则在"Build Facility"中讲解。这部分描述用于构建IOC应用程序所需地大部分组件的方法。它使用来自由makeBaseApp产生的myexampleApp/src/Makefile的摘要。
- [root@rockygu src]# cat Makefile
- TOP=../..
-
- include $(TOP)/configure/CONFIG
- #----------------------------------------
- # ADD MACRO DEFINITIONS BELOW HERE
-
- # Use typed rset structure (see 3.16.1 release notes)
- USR_CPPFLAGS += -DUSE_TYPED_RSET
-
- # xxxRecord.h will be created from xxxRecord.dbd
- DBDINC += xxxRecord
-
- # Install xxxSupport.dbd into
/dbd - DBD += xxxSupport.dbd
-
- # Build an IOC support library
- LIBRARY_IOC += myexampleSupport
-
- # Compile and add code to the support library
- myexampleSupport_SRCS += xxxRecord.c
- myexampleSupport_SRCS += devXxxSoft.c
-
- # Link locally-provided code into the support library,
- # rather than directly into the IOC application, that
- # causes problems on Windows DLL builds
- myexampleSupport_SRCS += dbSubExample.c
- myexampleSupport_SRCS += devmyexampleVersion.c
- myexampleSupport_SRCS += myexampleHello.c
- myexampleSupport_SRCS += initTrace.c
-
- myexampleSupport_LIBS += $(EPICS_BASE_IOC_LIBS)
-
- # Auto-generate a header file containing a version string.
- # Version comes from the VCS if available, else date+time.
- GENVERSION = myexampleVersion.h
- # Macro name
- GENVERSIONMACRO = myexampleVERSION
-
- # Build the IOC application
- PROD_IOC = myexample
-
- # myexample.dbd will be created and installed
- DBD += myexample.dbd
-
- # myexample.dbd will include these files:
- myexample_DBD += base.dbd
- myexample_DBD += xxxSupport.dbd
- myexample_DBD += dbSubExample.dbd
- myexample_DBD += devmyexampleVersion.dbd
- myexample_DBD += myexampleHello.dbd
- myexample_DBD += initTrace.dbd
-
- # myexample_registerRecordDeviceDriver.cpp derives from myexample.dbd
- myexample_SRCS += myexample_registerRecordDeviceDriver.cpp
-
- # Build the main IOC entry point where needed
- myexample_SRCS_DEFAULT += myexampleMain.cpp
- myexample_SRCS_vxWorks += -nil-
-
- # Link in the code from our support library
- myexample_LIBS += myexampleSupport
-
- # To build SNL programs, SNCSEQ must be defined
- # in the
/configure/RELEASE file - ifneq ($(SNCSEQ),)
- # Build sncExample into myexampleSupport
- sncExample_SNCFLAGS += +r
- myexample_DBD += sncExample.dbd
- # A .stt sequence program is *not* pre-processed:
- myexampleSupport_SRCS += sncExample.stt
- myexampleSupport_LIBS += seq pv
- myexample_LIBS += seq pv
-
- # Build sncProgram as a standalone program
- PROD_HOST += sncProgram
- sncProgram_SNCFLAGS += +m
- # A .st sequence program *is* pre-processed:
- sncProgram_SRCS += sncProgram.st
- sncProgram_LIBS += seq pv
- sncProgram_LIBS += $(EPICS_BASE_HOST_LIBS)
- endif
-
- # Link QSRV (pvAccess Server) if available
- ifdef EPICS_QSRV_MAJOR_VERSION
- myexample_LIBS += qsrv
- myexample_LIBS += $(EPICS_BASE_PVA_CORE_LIBS)
- myexample_DBD += PVAServerRegister.dbd
- myexample_DBD += qsrv.dbd
- endif
-
- # Finally link IOC to the EPICS Base libraries
- myexample_LIBS += $(EPICS_BASE_IOC_LIBS)
-
- include $(TOP)/configure/RULES
- #----------------------------------------
- # ADD EXTRA GNUMAKE RULES BELOW HERE
-
- # Explicit dependency needed for generated header file
- devmyexampleVersion$(DEP): $(COMMON_DIR)/$(GENVERSION)
能够构建以下两种类型的应用程序:
1) 进行支持的应用程序:这些是打算由ioc应用程序使用的应用程序。在这里描述的规则安装东西到以下目录之一,而这些目录就被创建在
2) IOC应用程序:这些是被装载到实际IOCs中的应用程序。
因为仅在ioc初始化过程中才绑定很多IOC组件,必须提供链接到合适的共享和/或静态库的某些方法。用于IOCs的方法是从一个xxxInclude.dbd文件产生一个引用合适的库模块的C++程序。以下数据库定义关键字被用于这个目的:
- recordtype
- device
- driver
- function
- variable
- registrar
这个方法也要求IOC组件包含一个合适的epicsExport语句。所有组件必须包含这条语句:
#include
定义任何导出函数的任何组件也必须包括:
#include
每个记录支持模块必须包含一个像以下的语句:
epicsExportAddress(rset,xxxRSET);
每个设备支持模块必须包含一个像以下的语句:
epicsExportAddress(dset,devXxxSoft);
每个驱动模块必须包含一个像以下的语句:
epicsExportAddress(drvet,drvXxx);
在包含这个函数的C源文件中使用一个epicsRegisterFunction以及在应用程序数据库描述文件中用一个function语句注册函数。makeBaseApp示例包含以下语句注册两个函数与一个subroutine记录一起使用:
在dbSubExample.c中:
- epicsRegisterFunction(mySubInit);
- epicsRegisterFunction(mySubProcess);
在dbSubExample.dbd中:
- function(mySubInit)
- function(mySubProcess)
数据库定义关键字variable强制对一个整数或double变量进行一个引用,例如调试变量。mySubExample.dbd文件中包含像以下的定义:
variable(mySubDebug)
定义这个变量的代码必须包含像这样的代码(以dbSubExample.c为例):
- ...
- int mySubDebug;
- ...
- epicsExportAddress(int, mySubDebug);
- ...
关键字registrar表示这个EPICS组件提供一个具有以下原型的指定名称注册函数:
typdedef void (*REGISTRAR)(void);
这个函数通常注册东西,如在"Registry"章节描述的。makeBaseApp示例提供了一个简单的iocsh命令,用以下注册函数注册它:
- static void helloRegister(void) {
- iocshRegister(&helloFuncDef, helloCallFunc);
- }
- epicsExportRegistrar(helloRegister)
5.2.1 构建一个进行支持的应用程序
- # 将xxxRecord.dbd创建xxxRecord.h
- DBDINC += xxxRecord
- DBD += xxxSupport.dbd
-
- LIBRARY_IOC += myexampleSupport
-
- myexampleSupport_SRCS += xxxRecord.c
- myexampleSupport_SRCS += devXxxSoft.c
- myexampleSupport_SRCS += dbSubExample.c
-
- myexampleSupport_LIBS += $(EPICS_BASE_IOC_LIBS)
1)DBDINC规则查找一个名为xxxRecord.dbd文件。从这个文件创建一个文件xxxRecord.h并且安装其到
2)DBD规则在源目录中寻找xxxSupport.dbd并且安装它到
3)LIBRARY_IOC变量请求创建一个库并且安装这个库到
4) myexampleSupport_SRCS语句指名所有被编辑和放入这个库的源文件
5)以上语句是构建很多进行支持的应用程序所需的一切。
以下语句构建IOC应用程序:
- # Build the IOC application
- PROD_IOC = myexample
-
- # myexample.dbd will be created and installed
- DBD += myexample.dbd
-
- # myexample.dbd will include these files:
- myexample_DBD += base.dbd
- myexample_DBD += xxxSupport.dbd
- myexample_DBD += dbSubExample.dbd
- myexample_DBD += devmyexampleVersion.dbd
- myexample_DBD += myexampleHello.dbd
- myexample_DBD += initTrace.dbd
-
- # myexample_registerRecordDeviceDriver.cpp derives from myexample.dbd
- myexample_SRCS += myexample_registerRecordDeviceDriver.cpp
-
- # Build the main IOC entry point where needed
- myexample_SRCS_DEFAULT += myexampleMain.cpp
- myexample_SRCS_vxWorks += -nil-
-
- # Link in the code from our support library
- myexample_LIBS += myexampleSupport
-
- # To build SNL programs, SNCSEQ must be defined
- # in the
/configure/RELEASE file - ifneq ($(SNCSEQ),)
- # Build sncExample into myexampleSupport
- sncExample_SNCFLAGS += +r
- myexample_DBD += sncExample.dbd
- # A .stt sequence program is *not* pre-processed:
- myexampleSupport_SRCS += sncExample.stt
- myexampleSupport_LIBS += seq pv
- myexample_LIBS += seq pv
-
- # Build sncProgram as a standalone program
- PROD_HOST += sncProgram
- sncProgram_SNCFLAGS += +m
- # A .st sequence program *is* pre-processed:
- sncProgram_SRCS += sncProgram.st
- sncProgram_LIBS += seq pv
- sncProgram_LIBS += $(EPICS_BASE_HOST_LIBS)
- endif
-
- # Link QSRV (pvAccess Server) if available
- ifdef EPICS_QSRV_MAJOR_VERSION
- myexample_LIBS += qsrv
- myexample_LIBS += $(EPICS_BASE_PVA_CORE_LIBS)
- myexample_DBD += PVAServerRegister.dbd
- myexample_DBD += qsrv.dbd
- endif
-
- # Finally link IOC to the EPICS Base libraries
- myexample_LIBS += $(EPICS_BASE_IOC_LIBS)
PROC_IOC设置这个ioc应用程序的名称,在这里称为myexample。
DBD定义myexample.dbd将使得构建规则从在myexample_DBD定义中的文件创建这个myexample.dbd文件并且放置其到
能够指定任何数目的myexample_SRCS语句。格式
makeBaseApp.pl是一个创建应用程序区域的perl脚本。它可以创建以下:
makeBaseApp.pl创建目录并且接着复制模板文件到这个新创建的目录同时展开这些模板文件中的宏。EPICS提供了两个模板文件集合:simple和example。但每个站点能够创建它自己的可能提供其它功能的模板文件集合。这部分描述makeBaseApp自身的功能,下一部分提供有关simple和example模板的详情情况。
makeBaseApp有四种可能的命令行格式:
1)
- [root@telecom ~]# /usr/local/EPICS/base/bin/linux-x86_64/makeBaseApp.pl -h
- Usage:
/bin/<arch>/makeBaseApp.pl -h- display help on command options
/bin/<arch>/makeBaseApp.pl -l [options]- list application types
/bin/<arch>/makeBaseApp.pl -t type [options] [app ...]- create application directories
/bin/<arch>/makeBaseApp.pl -i -t type [options] [ioc ...]- create ioc boot directories
- where
- app Application name (the created directory will have "App" appended)
- ioc IOC name (the created directory will have "ioc" prepended)
-
- -a arch Set the IOC architecture for use with -i (e.g. vxWorks-68040)
- If arch is not specified, you will be prompted
- -b base Set the location of EPICS base (full path)
- If not specified, base path is taken from configure/RELEASE
- If configure does not exist, from environment
- If not found in environment, from makeBaseApp.pl location
- -d Enable debug messages
- -i Specifies that ioc boot directories will be generated
- -l List valid application types for this installation
- If this is specified the other options are not used
- -p app Set the application name for use with -i
- If not specified, you will be prompted
- -T top Set the template top directory (where the application templates are)
- If not specified, top path is taken from configure/RELEASE
- If configure does not exist, top path is taken from environment
- If not found in environment, the templates from EPICS base are used
- -t type Set the application type (-l for a list of valid types)
- If not specified, type is taken from environment
- If not found in environment, "default" is used
- -u user Set username; overrides OS defaults
-
- Environment:
- EPICS_MBA_DEF_APP_TYPE Application type you want to use as default
- EPICS_MBA_TEMPLATE_TOP Template top directory
- EPICS_MBA_BASE Location of EPICS base
-
- Example: Create exampleApp
-
/bin/<arch>/makeBaseApp.pl -t example example /bin/<arch>/makeBaseApp.pl -i -t example example
2)
- [root@telecom ~]# /usr/local/EPICS/base/bin/linux-x86_64/makeBaseApp.pl -l
- Valid application types are:
- support
- caClient
- example
- ioc
- caPerl
- Valid iocBoot types are:
- example
- ioc
3)
创建应用程序目录。
4)
创建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,将提示你。
EPICS_MBA_DEF_APP_TYPE:你想要以默认使用的应用程序类型。
EPICS_MBA_TEMPLAT4E_TOP:模板顶层目录。
要创建一个新的
- mkdir
- cd
/bin/<arch>/makeBaseApp.pl -t <type> ... /bin/<arch>/makeBaseApp.pl -i -t <type> ...
makeBaseApp做以下事情:
1) 通过按顺序检查以下定位到EPICS_BASE
2) 用相同方式定位到TEMPLATE_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:
如果未指定-i:对于在命令行上指定的每个
当从模板复制某些文件到新的应用程序结构体时,makeBaseApp用此时知道的值替换在文件名称或文本中一些预定义的标记。一个应用程序模板可以按以下扩展这个功能:
1) 在makeBaseApp中定义的两个perl子程序
2) 如果应用程序类型目录有一个名为Replace.pl的文件,这个文件可能:
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
这构建一个示例便携式访问服务器。
通过调试口串口对你的IOC设置vxWorks boot参数。如果你能够连接调试口到你工作站上一个终端窗口,就简单得多。在Linux上,‘screen’程序使你通过一个本地串口进行通信;如果IOC连接了ttyS0,运行screen /dev/ttyS0。
vxWorks boot参数看起来像以下:
- boot device : xxx
- processor number : 0
- host name : xxx
- file name :
/vxWorks - inet on ethernet (e) : xxx.xxx.xxx.xxx:
- host inet (h) : xxx.xxx.xxx.xxx
- user (u) : xxx
- ftp password (pw) : xxx
- flags (f) : 0x0
- target name (tn) :
for this inet address> - startup script (s) :
/iocBoot/iocmyexample/st.cmd
每个字段的实际值是取决于站点和IOC。你能够随意更改的两个字段是vxWorks启动镜像以及启动脚本的位置。
注意:必须指定正确板卡支持启动镜像的完整路径名。如果使用bootp,相同信息将需要被放置在bootp主机配置数据库来替代。
当你的启动参数设置合适时,只要按下你IOC上重置按钮或者使用@mingl来开始启动。你将发现IOC的调试口连接到你工作站上一个滚动窗口是非常方便的。