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 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模块使用示例 -- 基于字符串协议的通信相关推荐
- EPICS modbus模块驱动程序示例2(模拟量)
本文以聚英电子的JY-DAMAIAO模拟量测控模块为例,讲解如何使用EPICS modbus模块实现对模拟设备读写控制.由于对设备施加电压以及测量电压都较电流容易,本人选择的这个模块能够读取6路0-1 ...
- EPICS modbus模块驱动程序示例1(数字量)
本文以Moxa ioLogik E2210(Moxa官网对这种设备的详细介绍ioLogik E2210 - 通用控制器和远程 I/O ioLogik E2200 系列 | MOXA)通用控制器和远程I ...
- python中基于tcp协议的通信(数据传输)
tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据 ...
- Python中的端口协议之基于UDP协议的通信传输
阅读目录 UDP协议: 1.python中基于udp协议的客户端与服务端通信简单过程实现 2.udp协议的一些特点(与tcp协议的比较) 3.利用socketserver模块实现udp传输协议的并发通 ...
- EPICS -- autosave模块使用示例
Autosave自动保存EPICS过程变量(PVs)的值到一台文件服务器上文件中,并且在IOC(输入输出控制器--EPICS业务端)被重启时,恢复那些值. 以下展示一个如何使用这个autosave模块 ...
- 电子词典(基于TCP协议多进程通信和数据库)
项目:电子词典 项目要求: 登录注册功能,不能重复登录,重复注册.用户信息也存储在数据库中. 单词查询功能 历史记录功能,存储单词,意思,以及查询时间,存储在数据库 基于TCP,支持多客户端连接 采用 ...
- 基于TCP协议实现通信
实现一个简单的从客户端发送一个消息到服务端的功能 public static void main(String[] args) throws IOException { ServerSocket se ...
- java socket 通信协议_java网络通信(基于TCP协议可靠通信的socket编程)
package cn.wang; import java.io.*; import java.net.*; public class Server { static int num = 1;//客户端 ...
- Nginx使用stream模块分流实现端口复用
使用Nginx复用端口有很多方法,最普遍的方法是在不同的server块中监听同一端口,根据不同的主机名完成分流.本文介绍了一种较新的端口复用方法,它可以方便地对TLS加密的TCP数据进行分流. 1 N ...
最新文章
- 近期论文中的数据集整理0409
- lua脚本简单编辑及常用指令
- RabbitMQ——安装
- 如何使用ping命令检查网络故障
- js确保正确this的几种写法
- Java 实现排序
- 【牛客 - 317F】小a的子序列(线性dp,tricks)
- 电脑上的linux是什么文件夹,linux删除文件夹,详细教您电脑的linux怎么样删除文件夹...
- 百度 自然语言处理API
- c++枚举和c语言枚举_C语言枚举初学者指南
- anaconda创建和删除环境
- Java线程基础回顾及内存模型,看你还记得多少?
- Pareto Optimality 帕累托最优 是什么
- c# 判断两个集合是否有交集
- sp_send_dbmail参数设置
- echarts绘制分时图(2)-- 配置echarts
- html6张拼图,拼图6张-好看的6宫格拼图大全-稿定设计
- 高德poi类别23个大类	261个中类	4705个小类
- 宁芝普拉姆键盘说明书以及键盘校验软件
- matlab gui gca,matlab和rest做GCA分析的不同
热门文章
- [JZOJ 5804] 简单的序列
- BestCoder Round #85 (hdu5804,hdu5805,hdu5806,hdu5807)
- channel通道的一些细节
- 收到面试通知后,如何准备可以大大提升面试成功率?
- 二字动词 复盘赋能_落地、赋能、共创、共建、复盘,互联网圈的漂亮词儿,你懂几个?...
- 怎么用计算机给u盘加密文件,电脑如何使用bitlocker功能给u盘加密
- 浅析negroni-gzip 过滤器的源码
- 小虎电商浏览器:鹰智客服插件怎么下载?安装麻烦吗?
- python操作word、ppt、pdf
- 熊猫直播P2P分享率优化(上):IP组网