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 applicationPROD_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< envPathscd "${TOP}"## Register all support components
dbLoadDatabase "dbd/streamTest.dbd"
streamTest_registerRecordDeviceDriver pdbbaseepicsEnvSet("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

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

  1. EPICS modbus模块驱动程序示例2(模拟量)

    本文以聚英电子的JY-DAMAIAO模拟量测控模块为例,讲解如何使用EPICS modbus模块实现对模拟设备读写控制.由于对设备施加电压以及测量电压都较电流容易,本人选择的这个模块能够读取6路0-1 ...

  2. EPICS modbus模块驱动程序示例1(数字量)

    本文以Moxa ioLogik E2210(Moxa官网对这种设备的详细介绍ioLogik E2210 - 通用控制器和远程 I/O ioLogik E2200 系列 | MOXA)通用控制器和远程I ...

  3. python中基于tcp协议的通信(数据传输)

    tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据 ...

  4. Python中的端口协议之基于UDP协议的通信传输

    阅读目录 UDP协议: 1.python中基于udp协议的客户端与服务端通信简单过程实现 2.udp协议的一些特点(与tcp协议的比较) 3.利用socketserver模块实现udp传输协议的并发通 ...

  5. EPICS -- autosave模块使用示例

    Autosave自动保存EPICS过程变量(PVs)的值到一台文件服务器上文件中,并且在IOC(输入输出控制器--EPICS业务端)被重启时,恢复那些值. 以下展示一个如何使用这个autosave模块 ...

  6. 电子词典(基于TCP协议多进程通信和数据库)

    项目:电子词典 项目要求: 登录注册功能,不能重复登录,重复注册.用户信息也存储在数据库中. 单词查询功能 历史记录功能,存储单词,意思,以及查询时间,存储在数据库 基于TCP,支持多客户端连接 采用 ...

  7. 基于TCP协议实现通信

    实现一个简单的从客户端发送一个消息到服务端的功能 public static void main(String[] args) throws IOException { ServerSocket se ...

  8. java socket 通信协议_java网络通信(基于TCP协议可靠通信的socket编程)

    package cn.wang; import java.io.*; import java.net.*; public class Server { static int num = 1;//客户端 ...

  9. Nginx使用stream模块分流实现端口复用

    使用Nginx复用端口有很多方法,最普遍的方法是在不同的server块中监听同一端口,根据不同的主机名完成分流.本文介绍了一种较新的端口复用方法,它可以方便地对TLS加密的TCP数据进行分流. 1 N ...

最新文章

  1. 近期论文中的数据集整理0409
  2. lua脚本简单编辑及常用指令
  3. RabbitMQ——安装
  4. 如何使用ping命令检查网络故障
  5. js确保正确this的几种写法
  6. Java 实现排序
  7. 【牛客 - 317F】小a的子序列(线性dp,tricks)
  8. 电脑上的linux是什么文件夹,linux删除文件夹,详细教您电脑的linux怎么样删除文件夹...
  9. 百度 自然语言处理API
  10. c++枚举和c语言枚举_C语言枚举初学者指南
  11. anaconda创建和删除环境
  12. Java线程基础回顾及内存模型,看你还记得多少?
  13. Pareto Optimality 帕累托最优 是什么
  14. c# 判断两个集合是否有交集
  15. sp_send_dbmail参数设置
  16. echarts绘制分时图(2)-- 配置echarts
  17. html6张拼图,拼图6张-好看的6宫格拼图大全-稿定设计
  18. 高德poi类别23个大类 261个中类 4705个小类
  19. 宁芝普拉姆键盘说明书以及键盘校验软件
  20. matlab gui gca,matlab和rest做GCA分析的不同

热门文章

  1. [JZOJ 5804] 简单的序列
  2. BestCoder Round #85 (hdu5804,hdu5805,hdu5806,hdu5807)
  3. channel通道的一些细节
  4. 收到面试通知后,如何准备可以大大提升面试成功率?
  5. 二字动词 复盘赋能_落地、赋能、共创、共建、复盘,互联网圈的漂亮词儿,你懂几个?...
  6. 怎么用计算机给u盘加密文件,电脑如何使用bitlocker功能给u盘加密
  7. 浅析negroni-gzip 过滤器的源码
  8. 小虎电商浏览器:鹰智客服插件怎么下载?安装麻烦吗?
  9. python操作word、ppt、pdf
  10. 熊猫直播P2P分享率优化(上):IP组网