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


    1、按如下步骤,建立IOC应用程序框架:

    1. [blctrl@bjAli exer37]$ makeBaseApp.pl -t ioc streamTest
    2. [blctrl@bjAli exer37]$ makeBaseApp.pl -i -t ioc streamTest
    3. Using target architecture linux-x86_64 (only one available)
    4. The following applications are available:
    5. streamTest
    6. What application should the IOC(s) boot?
    7. The default uses the IOC's name, even if not listed above.
    8. Application name?
    9. [blctrl@bjAli exer37]$ ls
    10. configure iocBoot Makefile streamTestApp

    2、编辑configure/RELEASE文件,增加以下内容:

    1. SUPPORT=/usr/local/EPICS/synApps/support
    2. STREAM=$(SUPPORT)/stream
    3. ASYN=$(SUPPORT)/asyn
    4. CALC=$(SUPPORT)/calc
    5. SSCAN=$(SUPPORT)/sscan
    6. # EPICS_BASE should appear last so earlier modules can override stuff:
    7. EPICS_BASE = /usr/local/EPICS/base

    3、编辑streamTestApp/src/Makefile文件,内容如下:

    1. TOP=../..
    2. include $(TOP)/configure/CONFIG
    3. #----------------------------------------
    4. # ADD MACRO DEFINITIONS AFTER THIS LINE
    5. #=============================
    6. #=============================
    7. # Build the IOC application
    8. PROD_IOC = streamTest
    9. # streamTest.dbd will be created and installed
    10. DBD += streamTest.dbd
    11. # streamTest.dbd will be made up from these files:
    12. streamTest_DBD += base.dbd
    13. # Include dbd files from all support applications:
    14. streamTest_DBD += asyn.dbd
    15. streamTest_DBD += drvAsynIPPort.dbd
    16. streamTest_DBD += stream.dbd
    17. # Add all the support libraries needed by this IOC
    18. #streamTest_LIBS += xxx
    19. # streamTest_registerRecordDeviceDriver.cpp derives from streamTest.dbd
    20. streamTest_SRCS += streamTest_registerRecordDeviceDriver.cpp
    21. # Build the main IOC entry point on workstation OSs.
    22. streamTest_SRCS_DEFAULT += streamTestMain.cpp
    23. streamTest_SRCS_vxWorks += -nil-
    24. # Add support from base/src/vxWorks if needed
    25. #streamTest_OBJS_vxWorks += $(EPICS_BASE_BIN)/vxComLibrary
    26. # Finally link to the EPICS Base libraries
    27. streamTest_LIBS += asyn
    28. streamTest_LIBS += stream
    29. streamTest_LIBS += $(EPICS_BASE_IOC_LIBS)

    4、进入streamTestApp/Db/目录,创建两个文件streamTest.db和demo.proto,其内容分别如下:

    streamTest.db

    1. record(ai, "$(USER):FINVAR")
    2. {
    3. field(DTYP, "stream")
    4. field(INP, "@demo.proto getFINVAR NC")
    5. field(SCAN, "I/O Intr")
    6. }
    7. record(longin, "$(USER):IINVAR")
    8. {
    9. field(DTYP, "stream")
    10. field(INP, "@demo.proto getIINVAR NC")
    11. field(SCAN, "I/O Intr")
    12. }
    13. record(ao, "$(USER):FOUTVAR")
    14. {
    15. field(DTYP, "stream")
    16. field(OUT, "@demo.proto setFOUTVAR NC")
    17. field(EGU, "Float")
    18. field(PREC, "2")
    19. field(DRVL, "0")
    20. field(DRVH, "60")
    21. field(LOPR, "0")
    22. field(HOPR, "60")
    23. }
    24. record(longout, "$(USER):IOUTVAR")
    25. {
    26. field(DTYP, "stream")
    27. field(OUT, "@demo.proto setIOUTVAR NC")
    28. field(EGU, "Integer")
    29. field(DRVL, "0")
    30. field(DRVH, "100")
    31. field(LOPR, "0")
    32. field(HOPR, "100")
    33. }
    34. record(stringin, "$(USER):SINVAR")
    35. {
    36. field(DTYP, "stream")
    37. field(INP, "@demo.proto getSINVAR NC")
    38. field(SCAN, "I/O Intr")
    39. }
    40. record(stringout, "$(USER):SOUTVAR")
    41. {
    42. field(DTYP, "stream")
    43. field(OUT, "@demo.proto setSOUTVAR NC")
    44. }
    45. record(bi, "$(USER):BINVAR")
    46. {
    47. field(DTYP, "stream")
    48. field(INP, "@demo.proto getBINVAR NC")
    49. field(ZNAM, "Close")
    50. field(ONAM, "Open")
    51. field(SCAN, "I/O Intr")
    52. }
    53. record(bo, "$(USER):BOUTVAR")
    54. {
    55. field(DTYP, "stream")
    56. field(OUT, "@demo.proto setBOUTVAR NC")
    57. field(ZNAM, "OFF")
    58. field(ONAM, "ON")
    59. }
    60. record(waveform, "$(USER):WFINVAR")
    61. {
    62. field(DTYP, "stream")
    63. field(FTVL, "DOUBLE")
    64. field(NELM, "10")
    65. field(INP, "@demo.proto getWFINVAR NC")
    66. field(SCAN, "I/O Intr")
    67. }
    68. record(waveform, "$(USER):WFOUTVAR")
    69. {
    70. field(DTYP, "stream")
    71. field(FTVL, "DOUBLE")
    72. field(NELM, "10")
    73. field(INP, "@demo.proto setWFOUTVAR NC")
    74. }

    demo.proto

    1. Terminator = CR LF;
    2. InTerminator = LF;
    3. Separator = " ";
    4. ReplyTimeout = 10000;
    5. ReadTimeout = 10000;
    6. getFINVAR
    7. {
    8. PollPeriod = 100;
    9. in "getfinvar %f";
    10. @mismatch
    11. {
    12. disconnect;
    13. }
    14. }
    15. getIINVAR
    16. {
    17. PollPeriod = 100;
    18. in "getiinvar %d";
    19. }
    20. setFOUTVAR
    21. {
    22. out "setfoutvar %.2f";
    23. }
    24. setIOUTVAR
    25. {
    26. out "setioutvar %d";
    27. }
    28. getSINVAR
    29. {
    30. PollPeriod = 100;
    31. in "getsinvar %s";
    32. }
    33. setSOUTVAR
    34. {
    35. out "setsoutvar %s";
    36. }
    37. getBINVAR
    38. {
    39. PollPeriod = 100;
    40. in "getbinvar %s";
    41. }
    42. setBOUTVAR
    43. {
    44. out "setboutvar %s";
    45. }
    46. getWFINVAR
    47. {
    48. PollPeriod = 100;
    49. in "getwfinvar %f";
    50. }
    51. setWFOUTVAR
    52. {
    53. out "setwfinvar %.2f";
    54. }

    编辑以上目录中Makefile文件,增加以下一行:

    DB += streamTest.db

    5、退回到这个IOC应用程序的顶层目录,执行make编译程序。

    6、进入iocBoot/iocstreamTest/目录,编辑st.cmd文件

    1. #!../../bin/linux-x86_64/streamTest
    2. #- You may have to change streamTest to something else
    3. #- everywhere it appears in this file
    4. < envPaths
    5. cd "${TOP}"
    6. ## Register all support components
    7. dbLoadDatabase "dbd/streamTest.dbd"
    8. streamTest_registerRecordDeviceDriver pdbbase
    9. epicsEnvSet("STREAM_PROTOCOL_PATH", "${TOP}/streamTestApp/Db")
    10. drvAsynIPPortConfigure("NC", "172.27.144.214:6666")
    11. ## Load record instances
    12. dbLoadRecords("db/streamTest.db","USER=blctrl")
    13. cd "${TOP}/iocBoot/${IOC}"
    14. iocInit

    7、另开一个终端窗口,运行nc -l 6666对本机6666端口进行监听,用于与以上IOC程序进行通信:

    [blctrl@bjAli ~]$ nc -l 6666

    8、启动这个IOC应用程序:

    1. [blctrl@bjAli iocstreamTest]$ ../../bin/linux-x86_64/streamTest st.cmd
    2. #!../../bin/linux-x86_64/streamTest
    3. < envPaths
    4. epicsEnvSet("IOC","iocstreamTest")
    5. epicsEnvSet("TOP","/home/blctrl/exer/exer36")
    6. epicsEnvSet("STREAM","/usr/local/EPICS/synApps/support/stream")
    7. epicsEnvSet("SUPPORT","/usr/local/EPICS/synApps/support")
    8. epicsEnvSet("ASYN","/usr/local/EPICS/synApps/support/asyn")
    9. epicsEnvSet("CALC","/usr/local/EPICS/synApps/support/calc")
    10. epicsEnvSet("SSCAN","/usr/local/EPICS/synApps/support/sscan")
    11. epicsEnvSet("EPICS_BASE","/usr/local/EPICS/base")
    12. cd "/home/blctrl/exer/exer36"
    13. ## Register all support components
    14. dbLoadDatabase "dbd/streamTest.dbd"
    15. streamTest_registerRecordDeviceDriver pdbbase
    16. epicsEnvSet("STREAM_PROTOCOL_PATH", "/home/blctrl/exer/exer36/streamTestApp/Db")
    17. drvAsynIPPortConfigure("NC", "172.27.144.214:6666")
    18. ## Load record instances
    19. dbLoadRecords("db/streamTest.db","USER=blctrl")
    20. cd "/home/blctrl/exer/exer36/iocBoot/iocstreamTest"
    21. iocInit
    22. Starting iocInit
    23. ############################################################################
    24. ## EPICS R7.0.3.1
    25. ## EPICS Base built Oct 6 2022
    26. ############################################################################
    27. iocRun: All initialization complete
    28. ## Start any sequence programs
    29. #seq sncxxx,"user=blctrl"
    30. epics> dbl
    31. blctrl:SOUTVAR
    32. blctrl:BOUTVAR
    33. blctrl:FOUTVAR
    34. blctrl:WFINVAR
    35. blctrl:WFOUTVAR
    36. blctrl:IINVAR
    37. blctrl:BINVAR
    38. blctrl:IOUTVAR
    39. blctrl:FINVAR
    40. blctrl:SINVAR
    41. epics>

    9、在启动一个终端,用caget和caput等通道访问命令进行测试:

    1) 向从运行nc命令的终端窗口中输入协议字符串,测试从服务器向IOC中记录输入:

    1. [blctrl@bjAli ~]$ nc -l 6666
    2. getiinvar 16
    3. getsinvar helloworld
    4. getbinvar Open
    5. getwfinvar 1.5 2.6 3.7 8.9 10.5
    6. getfinvar 28.8

    用caget命令观察IOC中各自输入记录的值:

    1. [blctrl@bjAli ~]$ caget blctrl:IINVAR
    2. blctrl:IINVAR 16
    3. [blctrl@bjAli ~]$ caget blctrl:SINVAR
    4. blctrl:SINVAR helloworld
    5. [blctrl@bjAli ~]$ caget blctrl:WFINVAR
    6. blctrl:WFINVAR 10 1.5 2.6 3.7 8.9 10.5 0 0 0 0 0
    7. [blctrl@bjAli ~]$ caget blctrl:FINVAR
    8. blctrl:FINVAR 28.8

    2) 通过caput向输出记录写入数据,观察服务器上的输出:

    1. [blctrl@bjAli ~]$ caput blctrl:FOUTVAR 18.6
    2. Old : blctrl:FOUTVAR 0
    3. New : blctrl:FOUTVAR 18.6
    4. [blctrl@bjAli ~]$ caput blctrl:IOUTVAR 29
    5. Old : blctrl:IOUTVAR 0
    6. New : blctrl:IOUTVAR 29
    7. [blctrl@bjAli ~]$ caput blctrl:BOUTVAR ON
    8. Old : blctrl:BOUTVAR OFF
    9. New : blctrl:BOUTVAR ON
    10. [blctrl@bjAli ~]$ caput blctrl:SOUTVAR GoodMorning
    11. Old : blctrl:SOUTVAR
    12. New : blctrl:SOUTVAR GoodMorning
    13. [blctrl@bjAli ~]$ caput -a blctrl:WFOUTVAR 4 1.2 1.5 8.8 9.6
    14. Old : blctrl:WFOUTVAR 10 1.2 0 0 0 0 0 0 0 0 0
    15. New : blctrl:WFOUTVAR 10 1.2 1.5 8.8 9.6 0 0 0 0 0 0

    观察服务器上的输出:

    1. [blctrl@bjAli ~]$ nc -l 6666
    2. setfoutvar 18.60
    3. setioutvar 29
    4. setboutvar ON
    5. setsoutvar GoodMorning
    6. setwfinvar 1.20 1.50 8.80 9.60
  • 相关阅读:
    【每日一读】CoRGi: Content-Rich Graph Neural Networks with Attention
    VM16Pro的Win10虚拟机安装Linux子系统Kali
    线程是如何实现的?
    WebSocket的那些事(6- RabbitMQ STOMP目的地详解)
    【Docker】实现JMeter分布式压测
    【CPP】数组名与指针
    论文管理系统(增删查改功能的实现)
    青少年编程学习 等级考试 信奥赛NOI/蓝桥杯/NOC/GESP等比赛资料合集
    [Unity][VR]Passthrough2-创建一个基本的Passthrough应用
    React笔记(五)hook
  • 原文地址:https://blog.csdn.net/yuyuyuliang00/article/details/127795631