【EPICS学习记录】根据官方教程创建一个IOC应用


前言

参照官网给出的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服务器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值