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