EPICS stream模块使用示例 -- 基于字符串协议的通信

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
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值