1、按如下步骤,建立IOC应用程序框架:
- [blctrl@bjAli exer37]$ makeBaseApp.pl -t ioc streamTest
- [blctrl@bjAli exer37]$ makeBaseApp.pl -i -t ioc streamTest
- Using target architecture linux-x86_64 (only one available)
- The following applications are available:
- streamTest
- What application should the IOC(s) boot?
- The default uses the IOC's name, even if not listed above.
- Application name?
- [blctrl@bjAli exer37]$ ls
- configure iocBoot Makefile streamTestApp
2、编辑configure/RELEASE文件,增加以下内容:
- SUPPORT=/usr/local/EPICS/synApps/support
- STREAM=$(SUPPORT)/stream
- ASYN=$(SUPPORT)/asyn
- CALC=$(SUPPORT)/calc
- SSCAN=$(SUPPORT)/sscan
-
-
- # EPICS_BASE should appear last so earlier modules can override stuff:
- EPICS_BASE = /usr/local/EPICS/base
3、编辑streamTestApp/src/Makefile文件,内容如下:
- TOP=../..
-
- include $(TOP)/configure/CONFIG
- #----------------------------------------
- # ADD MACRO DEFINITIONS AFTER THIS LINE
- #=============================
-
- #=============================
- # Build the IOC application
-
- PROD_IOC = streamTest
- # streamTest.dbd will be created and installed
- DBD += streamTest.dbd
-
- # streamTest.dbd will be made up from these files:
- streamTest_DBD += base.dbd
-
- # Include dbd files from all support applications:
- streamTest_DBD += asyn.dbd
- streamTest_DBD += drvAsynIPPort.dbd
- streamTest_DBD += stream.dbd
-
- # Add all the support libraries needed by this IOC
- #streamTest_LIBS += xxx
-
- # streamTest_registerRecordDeviceDriver.cpp derives from streamTest.dbd
- streamTest_SRCS += streamTest_registerRecordDeviceDriver.cpp
-
- # Build the main IOC entry point on workstation OSs.
- streamTest_SRCS_DEFAULT += streamTestMain.cpp
- streamTest_SRCS_vxWorks += -nil-
-
- # Add support from base/src/vxWorks if needed
- #streamTest_OBJS_vxWorks += $(EPICS_BASE_BIN)/vxComLibrary
-
- # Finally link to the EPICS Base libraries
- streamTest_LIBS += asyn
- streamTest_LIBS += stream
- streamTest_LIBS += $(EPICS_BASE_IOC_LIBS)
4、进入streamTestApp/Db/目录,创建两个文件streamTest.db和demo.proto,其内容分别如下:
streamTest.db:
- record(ai, "$(USER):FINVAR")
- {
- field(DTYP, "stream")
- field(INP, "@demo.proto getFINVAR NC")
- field(SCAN, "I/O Intr")
- }
-
- record(longin, "$(USER):IINVAR")
- {
- field(DTYP, "stream")
- field(INP, "@demo.proto getIINVAR NC")
- field(SCAN, "I/O Intr")
- }
-
- record(ao, "$(USER):FOUTVAR")
- {
- field(DTYP, "stream")
- field(OUT, "@demo.proto setFOUTVAR NC")
- field(EGU, "Float")
- field(PREC, "2")
- field(DRVL, "0")
- field(DRVH, "60")
- field(LOPR, "0")
- field(HOPR, "60")
- }
-
- record(longout, "$(USER):IOUTVAR")
- {
- field(DTYP, "stream")
- field(OUT, "@demo.proto setIOUTVAR NC")
- field(EGU, "Integer")
- field(DRVL, "0")
- field(DRVH, "100")
- field(LOPR, "0")
- field(HOPR, "100")
- }
-
- record(stringin, "$(USER):SINVAR")
- {
- field(DTYP, "stream")
- field(INP, "@demo.proto getSINVAR NC")
- field(SCAN, "I/O Intr")
- }
-
- record(stringout, "$(USER):SOUTVAR")
- {
- field(DTYP, "stream")
- field(OUT, "@demo.proto setSOUTVAR NC")
- }
-
- record(bi, "$(USER):BINVAR")
- {
- field(DTYP, "stream")
- field(INP, "@demo.proto getBINVAR NC")
- field(ZNAM, "Close")
- field(ONAM, "Open")
- field(SCAN, "I/O Intr")
- }
-
- record(bo, "$(USER):BOUTVAR")
- {
- field(DTYP, "stream")
- field(OUT, "@demo.proto setBOUTVAR NC")
- field(ZNAM, "OFF")
- field(ONAM, "ON")
- }
-
- record(waveform, "$(USER):WFINVAR")
- {
- field(DTYP, "stream")
- field(FTVL, "DOUBLE")
- field(NELM, "10")
- field(INP, "@demo.proto getWFINVAR NC")
- field(SCAN, "I/O Intr")
- }
-
- record(waveform, "$(USER):WFOUTVAR")
- {
- field(DTYP, "stream")
- field(FTVL, "DOUBLE")
- field(NELM, "10")
- field(INP, "@demo.proto setWFOUTVAR NC")
- }
demo.proto:
- Terminator = CR LF;
- InTerminator = LF;
- Separator = " ";
- ReplyTimeout = 10000;
- ReadTimeout = 10000;
-
- getFINVAR
- {
- PollPeriod = 100;
- in "getfinvar %f";
- @mismatch
- {
- disconnect;
- }
- }
-
- getIINVAR
- {
- PollPeriod = 100;
- in "getiinvar %d";
- }
-
- setFOUTVAR
- {
- out "setfoutvar %.2f";
- }
-
- setIOUTVAR
- {
- out "setioutvar %d";
- }
-
- getSINVAR
- {
- PollPeriod = 100;
- in "getsinvar %s";
- }
-
- setSOUTVAR
- {
- out "setsoutvar %s";
- }
-
- getBINVAR
- {
- PollPeriod = 100;
- in "getbinvar %s";
- }
-
- setBOUTVAR
- {
- out "setboutvar %s";
- }
-
- getWFINVAR
- {
- PollPeriod = 100;
- in "getwfinvar %f";
- }
-
- setWFOUTVAR
- {
- out "setwfinvar %.2f";
- }
编辑以上目录中Makefile文件,增加以下一行:
DB += streamTest.db
5、退回到这个IOC应用程序的顶层目录,执行make编译程序。
6、进入iocBoot/iocstreamTest/目录,编辑st.cmd文件:
- #!../../bin/linux-x86_64/streamTest
-
- #- You may have to change streamTest to something else
- #- everywhere it appears in this file
-
- < envPaths
-
- cd "${TOP}"
-
- ## Register all support components
- dbLoadDatabase "dbd/streamTest.dbd"
- streamTest_registerRecordDeviceDriver pdbbase
-
- epicsEnvSet("STREAM_PROTOCOL_PATH", "${TOP}/streamTestApp/Db")
- drvAsynIPPortConfigure("NC", "172.27.144.214:6666")
-
- ## Load record instances
- dbLoadRecords("db/streamTest.db","USER=blctrl")
-
- cd "${TOP}/iocBoot/${IOC}"
- iocInit
7、另开一个终端窗口,运行nc -l 6666对本机6666端口进行监听,用于与以上IOC程序进行通信:
[blctrl@bjAli ~]$ nc -l 6666
8、启动这个IOC应用程序:
- [blctrl@bjAli iocstreamTest]$ ../../bin/linux-x86_64/streamTest st.cmd
- #!../../bin/linux-x86_64/streamTest
- < envPaths
- epicsEnvSet("IOC","iocstreamTest")
- epicsEnvSet("TOP","/home/blctrl/exer/exer36")
- epicsEnvSet("STREAM","/usr/local/EPICS/synApps/support/stream")
- epicsEnvSet("SUPPORT","/usr/local/EPICS/synApps/support")
- epicsEnvSet("ASYN","/usr/local/EPICS/synApps/support/asyn")
- epicsEnvSet("CALC","/usr/local/EPICS/synApps/support/calc")
- epicsEnvSet("SSCAN","/usr/local/EPICS/synApps/support/sscan")
- epicsEnvSet("EPICS_BASE","/usr/local/EPICS/base")
- cd "/home/blctrl/exer/exer36"
- ## Register all support components
- dbLoadDatabase "dbd/streamTest.dbd"
- streamTest_registerRecordDeviceDriver pdbbase
- epicsEnvSet("STREAM_PROTOCOL_PATH", "/home/blctrl/exer/exer36/streamTestApp/Db")
- drvAsynIPPortConfigure("NC", "172.27.144.214:6666")
- ## Load record instances
- dbLoadRecords("db/streamTest.db","USER=blctrl")
- cd "/home/blctrl/exer/exer36/iocBoot/iocstreamTest"
- iocInit
- Starting iocInit
- ############################################################################
- ## EPICS R7.0.3.1
- ## EPICS Base built Oct 6 2022
- ############################################################################
- iocRun: All initialization complete
- ## Start any sequence programs
- #seq sncxxx,"user=blctrl"
- epics> dbl
- blctrl:SOUTVAR
- blctrl:BOUTVAR
- blctrl:FOUTVAR
- blctrl:WFINVAR
- blctrl:WFOUTVAR
- blctrl:IINVAR
- blctrl:BINVAR
- blctrl:IOUTVAR
- blctrl:FINVAR
- blctrl:SINVAR
- epics>
9、在启动一个终端,用caget和caput等通道访问命令进行测试:
1) 向从运行nc命令的终端窗口中输入协议字符串,测试从服务器向IOC中记录输入:
- [blctrl@bjAli ~]$ nc -l 6666
- getiinvar 16
- getsinvar helloworld
- getbinvar Open
- getwfinvar 1.5 2.6 3.7 8.9 10.5
- getfinvar 28.8
用caget命令观察IOC中各自输入记录的值:
- [blctrl@bjAli ~]$ caget blctrl:IINVAR
- blctrl:IINVAR 16
- [blctrl@bjAli ~]$ caget blctrl:SINVAR
- blctrl:SINVAR helloworld
- [blctrl@bjAli ~]$ caget blctrl:WFINVAR
- blctrl:WFINVAR 10 1.5 2.6 3.7 8.9 10.5 0 0 0 0 0
- [blctrl@bjAli ~]$ caget blctrl:FINVAR
- blctrl:FINVAR 28.8
2) 通过caput向输出记录写入数据,观察服务器上的输出:
- [blctrl@bjAli ~]$ caput blctrl:FOUTVAR 18.6
- Old : blctrl:FOUTVAR 0
- New : blctrl:FOUTVAR 18.6
- [blctrl@bjAli ~]$ caput blctrl:IOUTVAR 29
- Old : blctrl:IOUTVAR 0
- New : blctrl:IOUTVAR 29
- [blctrl@bjAli ~]$ caput blctrl:BOUTVAR ON
- Old : blctrl:BOUTVAR OFF
- New : blctrl:BOUTVAR ON
- [blctrl@bjAli ~]$ caput blctrl:SOUTVAR GoodMorning
- Old : blctrl:SOUTVAR
- New : blctrl:SOUTVAR GoodMorning
- [blctrl@bjAli ~]$ caput -a blctrl:WFOUTVAR 4 1.2 1.5 8.8 9.6
- Old : blctrl:WFOUTVAR 10 1.2 0 0 0 0 0 0 0 0 0
- New : blctrl:WFOUTVAR 10 1.2 1.5 8.8 9.6 0 0 0 0 0 0
观察服务器上的输出:
- [blctrl@bjAli ~]$ nc -l 6666
- setfoutvar 18.60
- setioutvar 29
- setboutvar ON
- setsoutvar GoodMorning
- setwfinvar 1.20 1.50 8.80 9.60