测量小百科|C#通信之EPICS通道访问
来源: | 作者:JYTEK | 发布时间: 2021-02-09 | 811 次浏览 | 分享到:

全文字数1338 | 阅读需要4分钟


关键词:C#通信、EPICS、CA、PV、原子操作


导读

EPICS即“实验物理及工业控制系统”(Experimental Physics and Industrial Control System),是上世纪90年代初由美国洛斯阿拉莫斯国家实验室(LANL)和阿贡国家实验室(ANL)等联合开发的大型控制软件系统。基于分布式标准的EPICS结构包括两部分:IOC层和OPI层。IOC层又可以细分为6层:通道访问(CA)服务器接口、数据库访问接口、动态数据库、记录支持模块、设备支持模块、设备驱动器。OPI层可以细分为两层:通道访问(CA)客户接口和应用软件【1】【2】


EPICS CA

CAEPICS系统的最基本机制,它所能提供的服务包括动态通道定位,数据读写,访问监控,连接监控和自动重接等,CA客户可以根据通道名直接访问系统中的任何一个通道,通道具有回叫(callback)机制,根据客户的预先指定发送监控所得的信息,这样便无须依靠巡回检测来监控系统,可以极大地减轻网络负荷【1】


CAC#类库

C#中有开源的EPICS CA类库,在GitHub上有源码【1】,实现了EPICS V3.14的通道访问协议,包含了服务端(Server)和客户端(Client)的实现【3】。在C#项目的Nuget管理中搜索EPICS或者ChannelAccess可以搜索到这个开源的库,安装后即可使用EPICS的通道访问功能。当前这个类库可支持.NET Framwork 4.5及以上版本,以及.NET Standard 2.0


图 1 Nuget安装EPCIS CA的C#类库


CA Server示例

EPICS服务端,提供了CAPV创建和更新,可以以一定频率定期更新PV的值,也可以在值发生变化的时候按需进行更新。图2中的范例代码,就是创建一个名称为“REC:VAL”PV,并设定以Hz的频率对其进行刷新,在“PrepareRecord”事件中更新PV的值,然后值就会被更新给所有监听了该PV的所有客户端。


 2 EPICS CA Server示例代码


CA Client示例

EPICS客户端,可以监测CAPV值,当发生变化的时候会触发“MonitorChanged”事件,或者按需获取PV的值。图3中的范例代码是创建一个名称为“REC:VAL”PV监测通道,并注册“MonitorChanged”事件,监测PV值的变化。如果服务端不在同一台机器,则需要在Configuration中设置SearchAddress,指定服务器地址和端口号。创建后会自动尝试连接服务端,如果监听过程中,与服务端的网络连接中断,客户端也会自动尝试进行重新连接。


 3 EPICS CA Server示例代码


CA PV值的更新

EPCIS PV的值可以通过Scan属性,设定间隔指定时间自动更新PV的值给客户端,也可以设定Scan的方案为ON_CHANGE,即PV的值发生变化了更新。对于int/double/string等单值类型的变量,发生变化比较好确定。而EPCIS支持数组类型的PV,数组中的值不止一个,如果在赋值的过程中,PV被更新给客户端,则会导致客户端得到的数据一部分是上一次更新的数据,一部分是更新后的。因此,何时更新数组给所有客户端,从而保证数组值的完整性是比较重要的。


ChannelAccess类库提供了原子操作的接口,Server端的代码如图4所示,创建数组通道之后,设定通道的Scan方案为ON_CHANGE,通过using(channel.CreateAtomicChange())保证在using语句块中更新数组的值时,不会将不完整的数组更新给客户端,从而保证了数组数据的完整性。


图 4 EPCIS CA Server更新数组示例代码


参考

【1】 EPICS百度百科:https://baike.baidu.com/item/EPICS 

【2】 EPCIS维基百科:https://en.wikipedia.org/wiki/EPICS 

【3】 NETChannelAccess源码 GitHub地址:https://github.com/paulscherrerinstitute/NetChannelAccess 

【4】 NETChannelAccess Nuget地址:https://www.nuget.org/packages/ChannelAccess/2019.9.24.1

【5】 EPICS官网:https://epics.anl.gov/