前言
参照官网给出的IOC创建教程逐步操作完成了一个IOC应用的创建,官网教程中有部分过程表述的不清晰(或者说对我这样的小白而言不太友好),自己摸索之后完成了IOC的创建,并把流程记录下来。其中有一些操作不是很理解,有问题或者建议欢迎指正。
一、前提
已经安装好EPICS和ASYN、StreamDevice包并完成环境配置,具体教程可以参考【EPICS学习记录】Ubuntu下的EPICS安装以及Asyn、Streamdevice工具包配置问题解决
官网的教程链接:https://docs.epics-controls.org/en/latest/getting-started/creating-ioc.html
二、创建IOC文件
先在EPICS文件夹下创建一个我个人的practice文件夹,再在此文件夹下创建一个用于存放IOC的文件夹,我将其命名为iocs:
cd $HOME/EPICS/practice
mkdir iocs
cd iocs
然后根据系统的example文件模板,创建一个IOC,此处我将其命名为sIOC:
mkdir sIOC;
cd sIOC
makeBaseApp.pl -t example sIOC
makeBaseApp.pl -i -t example sIOC
执行后终端显示如下,按Enter推出:
Using target architecture darwin-x86 (only one available)
The following applications are available:
sIOC
What application should the IOC(s) boot?
The default uses the IOC's name, even if not listed above.
Application name? (just return)
在命令号输入make执行编译,完成创建。
三、添加ASYN和StreamDevice的包路径
打开sIOCApp/src/路径下的Makefile文件,并在文档末尾添加如下内容,然后保存,关闭:
#add asyn and streamDevice to this IOC production libs
sIOC_LIBS += stream
sIOC_LIBS += asyn
还需要在support文件中将asyn.dbd和stream.dbd包含进去,打开sIOCApp/src/路径下的xxxSupport.dbd文件,在末尾加上如下内容,然后保存关闭:
include "stream.dbd"
include "asyn.dbd"
registrar(drvAsynIPPortRegisterCommands)
registrar(drvAsynSerialPortRegisterCommands)
registrar(vxi11RegisterCommands)
为了让程序找的到上述文件,需要在sIOC/configure目录下的RELEASE文件中,在文档末尾添加路径:
SUPPORT = /home/yifeng/EPICS/support
ASYN=$(SUPPORT)/asyn
STREAM=$(SUPPORT)/StreamDevice
注意上述SUPPORT 路径中的“/home/yifeng/”根据自己的用户名进行修改,“STREAM=$(SUPPORT)/StreamDevice”中注意大小写,也注意自己的实际文件夹名称是否对应
在sIOC/configure目录下先清理之前的编译,命令行输入make distclean,然后再执行make重新编译(官网教程中这么教的,不知道具体原因)。
四、运行IOC
使用终端cd命令进入,具体路径根据自己定义的进行修改:
cd EPICS/practice/iocs/sIOC/iocBoot/iocsIOC
ls
文件夹中存在st.cmd的文件名原本显示是灰色的,说明不可执行,须修改其执行权限,输入如下命令:
chmod +x st.cmd
./st.cmd
文件名变成绿色之后便可执行,命令行输入./st.cmd即运行该IOC。
IOC程序创建完成,但是目前还没有数据库文件,也没有协议文件。
五、添加数据库和协议文件
根据官网教程中的表述,应该是说需要将数据库(.db)和协议(.proto)文件添加到sIOC/sIOCApp/Db目录下:
因此在sIOC/sIOCApp/Db目录下执行如下操作创建两个文件:
touch MDO.db
touch MDO.proto
然后将其内容分别修改为:
// MDO.db的内容:
record(stringin, $(P)$(R)idn){
field(DESC, "Asks for info blabla")
field(DTYP, "stream")
field(INP, "@MDO.proto getStr(*IDN,99) $(PORT) $(A)")
field(PINI, "YES")
}
//MDO.proto的内容:
Terminator = LF;
getStr{
out "$1?";
in "%s";
@replytimeout {out "$1?"; in "%s";}
}
保存,然后找到sIOCApp/Db路径下的Makefile文件,打开并添加如下内容:
//此部分内容为原先就有的
DB += circle.db
DB += dbExample1.db
DB += dbExample2.db
DB += sIOCVersion.db
DB += dbSubExample.db
DB += user.substitutions
//在其后添加如下两行内容
DB += MDO.db
DB += MDO.proto
保存,然后在当前文件夹下执行make编译
回到sIOC文件夹下再次执行make编译
六、配置网络信息
最后还需要在执行文件中添加IP、端口等信息,找到sIOC/iocBoot/iocsIOC路径下的st.cmd文件,修改文件信息为如下(自己对照一下原文件内容并添加进去即可):
#!../../bin/darwin-x86/sampleIOC
#- You may have to change sampleIOC to something else
#- everywhere it appears in this file
< envPaths
epicsEnvSet ("STREAM_PROTOCOL_PATH","$(TOP)/db")
cd "${TOP}"
## Register all support components
dbLoadDatabase "dbd/sampleIOC.dbd"
sampleIOC_registerRecordDeviceDriver pdbbase
## Load record instances
dbLoadTemplate "db/user.substitutions"
dbLoadRecords "db/sampleIOCVersion.db", "user=UUUUUU"
dbLoadRecords "db/dbSubExample.db", "user=UUUUUU"
#IF if the user also defines EPICS_CAS_INTF_ADDR_LIST then beacon address
#list automatic configuration is constrained to the network interfaces specified
#therein, and therefore only the broadcast addresses of the specified LAN interfaces,
#and the destination addresses of all specified point-to-point links, will be automatically configured.
#epicsEnvSet ("EPICS_CAS_INTF_ADDR_LIST","aaa.aaa.aaa.aaa")
# connect to the device ... IP-Address ! Port 2025 used by textronix, see manual
drvAsynIPPortConfigure("L0","bbb.bbb.bbb.bbb:pppp",0,0,0)
## Load record instances
dbLoadRecords("db/MDO.db", "P=UUUUUU:,PORT=L0,R=MDO:,L=0,A=0")
#- Set this to see messages from mySub
#var mySubDebug 1
#- Run this to trace the stages of iocInit
#traceIocInit
cd "${TOP}/iocBoot/${IOC}"
iocInit
## Start any sequence programs
#seq sncExample, "user=UUUUUU"
其中UUU是用户名,bbb.bbb是IP地址,ppp是端口号
还需要设置一下环境变量:
export EPICS_CA_ADDR_LIST=ccc.ccc.ccc.ccc
这一行代码将EPICS的环境变量 EPICS_CA_ADDR_LIST 设置为 ccc.ccc.ccc.ccc,这是网络的广播地址。EPICS会使用这个地址来寻找运行EPICS Channel Access服务器的主机。
export EPICS_CA_AUTO_ADDR_LIST=NO
这一行代码将EPICS的环境变量 EPICS_CA_AUTO_ADDR_LIST 设置为 NO,这意味着EPICS不会自动获取可用的网络地址列表。相反,它会使用 EPICS_CA_ADDR_LIST 中指定的地址列表来连接到Channel Access服务器。