1. 引言
随着船舶智能化发展,化学品船装卸控制系统越来越趋于信息化、智能化。化学品船装卸控制系统的上位机软件,作为系统功能的最终展示界面,不仅需要集成阀门遥控、液位遥测、集成控制、自动控制等各个模块的控制与反馈数据,还需要对控制指令及反馈数据有较好实时性响应要求。这些功能对化学品船装卸控制系统的通信模块提出了极高要求,既能够实现与多个不同厂家硬件通信的要求,还需要满足数据通信的实时性要求。
基于以上要求,本文提出了一种基于Winform框架的OPC UA通信方法 [1] [2] [3] [4],基于Visual Studio 2019开发平台,采用C#及Winform开发框架 [5],设计开发OPC UA客户端通信模块,实现了化学品船装卸控制系统高速、高效的通信模块设计与开发,并进行了试验验证。结果表明,采用的通信协议及数据读写机制,能够对多个不同厂家、不同驱动程序设备的数据统一采集,实现了化学品船智能液货系统上位机应用程序与控制器PLC的高效、实时数据交互,为后续化学品船智能液货系统上位机中各种监控功能的开发奠定集成。
2. 系统架构
2.1. 化学品船装卸控制系统功能架构
化学品船装卸控制系统框架如下图1所示。先通过上位机制定装卸货作业时序计划并将制定的装卸货作业计划发送至下位机,装卸货作业时序计划为各货舱的装卸货顺序及装卸货量、各压载舱的压排顺序及压排海水量,下位机按照装卸货作业时序计划制定各个货舱和压载舱在不同时序阶段下的控制逻辑,并将控制逻辑下发至各个货舱和压载舱中的控制执行设备,由控制执行设备完成自动化装卸货。
装卸货作业时序计划的制定步骤为,先由上位机中搭载的专家系统根据前三载化学品的化学性质以及人工输入的约束条件生成多个配载方案,并确定多个配载方案下的船舶姿态,然后通过上位机选取船舶姿态最好的配载方案作为最优配载方案,对最优配载方案进行人工校核,通过人工校核后以该最优配载方案作为装卸货作业时序计划输出至下位机,约束条件包括装货/卸货、货物种类、货量、码头允许的扬程和流量,该设计一方面根据装卸货需求,按照先后顺序给出货舱的目标装卸量和压载舱的压载量,同时满足了船舶姿态稳定、船体结构不受伤害的要求,另一方面,经人工确定后再将得到的装卸货作业时序计划输出至下位机,人机交互性好。

Figure 1. Functional architecture diagram
图1. 功能架构图
以上系统中,上位机与下位机的通信采用OPC UA协议进行实现。
2.2. 通信模块软件框架
如下图2所示,基于OPC UA通信接口,完成化学品船智能液货集成控制系统应用程序与PLC控制器的数据交互,最终实现对货品状态数据的采集以及泵操作阀门操作等动作控制。

Figure 2. Communication module framework
图2. 通信模块框架
化学品船智能液货集成控制系统应用程序要正常工作,对OPC UA通信模块提出以下要求:
1) 整个系统的数据量大概有1万个点,需要实现对这些数据的高效实时读取;
2) 在满足数据采集的同时,软件界面的控制指令需要通过通信模块,及时地发送至被控对象,延时时间不能超过500 ms。
3) 为通信系统的冗余性,本项目配置的2个OPC UA服务器,客户端软件需实现OPC UA通信的短线重连及自动切换功能,以保证通信的稳定性。
3. OPCUA客户端开发
3.1. OPCUA客户端插件安装
利用基于C#语言的OPCUA开源客户端OPCUaHelper开源库,作为本项目中OPCUA客户端开发工具,实现对西门子OPCUA服务器的访问。OPCUaHelper是基于OPC UA协议的开源OPC UA客户端组件,提供一个opc ua的二次扩展类,基于.net 4.6.1创建,基于官方opc ua基金会跨平台库创建,封装了节点读写,批量节点读写,引用读取,特性读取,历史数据读取,方法调用,节点订阅,批量订阅等操作。还提供了一个节点浏览器工具。
3.2. 建立服务器连接
采用异步方式连接OPC UA服务器,核心代码如下。实例化1个OPC UA客户端类OpcUaClient,制定OPC UA服务器的IP地址及端口号,通过异步方式建立与OPC UA服务器连接。
public string connectString = opc.tcp://192.168.16.206:55105
public OpcUaClient opcUaClient;
public async void OpcUa_Connect()
{
opcUaClient = new OpcUaClient();//
errTxt = OPC服务器联接成功
try
{
await opcUaClient.ConnectServer (connectString);
}
catch (Exception ex)
{
errTxt = OPC联接失败: + ex.Message;
}
CommonVariable.uaopcConnected = true;
}
4. OPC UA客户端读写操作实现
4.1. 消息订阅读取OPC服务器
为实现对大量数据的实时读取,需尽可能实现有效读取,即只要数据发生改变时才进行读取,数据没有发生改变或者改变量较小时不进行读取通信,这样可以极大地利用带宽,实现大量数据的实时读写,该数据读写机制就是数据的发布/订阅机制。
所谓发布/订阅机制是一种以基于内容的消息传输方式,每个消息都有一个主题(Topic),网络中的客户可以发布和订阅某一主题的消息,一旦发布了某一个主题的消息,所有订阅者都将会及时收到该主题的消息,数据流向如下图3所示。

Figure 3. Data flow for publish/subscribe mechanisms
图3. 发布/订阅机制的数据流向
1) 获取OPC UA中需要订阅数据的变量路径
要订阅变量节点,就需要获取OPCUA服务器中变量节点的绝对路径,如下图所示,主要包括DB112、DB114、DB115、DB200、DB201、DB202、DB203等数据块共计2400个变量需要订阅。

2) 批量节点订阅
节点路径得到后,就可以通过OPCUA客户端实例opcUaClient进行订阅了,如下图所示,将所有需要读取的变量进行批量订阅。

3) 实时监控数据变化及读取操作
一旦完成了数据订阅,只要被订阅的任何一个数据发送变化,将触发读取订阅数据的回调函数,实时读取被订阅变量的最新值。同时,数据读取模式在数据没有变化时不会触发任何代码,不仅大大节省了带宽、提高通信效率,还为监控系统的实时性提供了底层支撑。
4.2. 事件触发写入OPC服务器
为保证控制指令下发的实时性,只要有新的控制指令产生,立即触发写入事件,将新的控制指令相关数据即可写入到OPCUA服务器中,以保证控制数据写入的实时性。
1) 获取OPC UA中需要写入数据的变量路径
同理,要实现写入,就需要获取OPCUA服务器中数据吸入变量节点的绝对路径,如下图所示,写入数据主要分布在DB112、DB114数据块中



2) 监听类属性变化触发事件
利用开源插件Fody以及PropertyChanged.Fody,来监听类的属性(即需写入数据的变量),一旦类的属性发送值改变,立即触发PropertyChanged事件,在该事件函数中可定义相关的操作,如向OPCUA服务器中写入最新数据。如下图所示。

3) 数据写入OPCUA服务器
以DB112数据块中类的属性AutoControlCommand为例,一旦界面中产生了新的与上一次不一样的AutoControlCommand指令,程序自动触发OnAutoControlCommandChanged事件,并在该事件中执行OPCUA的写入方法writeNode,将最新的AutoControlCommand数值写入到OPCUA服务器中。

5. 验证
智能液货集成控制系统应用程序界面如下图4和图5所示,主要包括对左舷6个货舱、右舷6个货舱共12个舱的装货及卸货控制。根据统计,通信数据大概有1万个,系统连续运行7 × 24小时,测试结果表明,该通信模块既能对大量数据实时读取,也能实时响应控制指令实现对被控对象的即时控制。OPC UA通信模块的读写通信速度及实时性满足项目工程要求。
6 总结
基于化学品船智能液货系统上位机软件的通信需求,本文设计并开发了基于C#及Winform平台设计的OPC UA客户端通信模块。为实现对多达1万个数据点的实时读取,采用基于发布/订阅机制的数据读取机制,在极大地利用带宽的同时,实现大量数据的实时读写。同时,为保证控制指令的响应实时性,

Figure 4. Cargo pump system monitoring interface
图4. 货油泵系统监控界面

Figure 5. Ballast pump system monitoring interface
图5. 压载泵系统监控界面
采用数据改变事件触发机制,一旦有新的控制指令马上,系统立刻触发事件,进行控制指令数据的下发。最后,在化学品船智能液货系统中进行了应用验证,验证结果满足设计需求。