C# OPC UA服务器
前言
本文将使用一个基于开源项目HslCommunication创建的OPC UA网关,方便通过配置创建一个OPC UA的网关中心。具体的操作及支持的设备信息项目参照下面:
开源项目HslCommunication的github地址:https://github.com/dathlin/HslCommunication 如果喜欢可以star或是fork,还可以打赏支持。此项目在工业界非常的流行,用来采集设备的数据以及在多个软件之间进行数据传送,以及一些简单的控件显示。
联系作者及加群方式(激活码在群里发放):http://www.hslcommunication.cn/Cooperation
在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输入下面的指令安装:
1
|
Install-Package HslCommunication |
NuGet安装教程 http://www.cnblogs.com/dathlin/p/7705014.html
Demo软件下载
版本将会随着更新功能会有所变化,相应的本博客也会有更新,如下也会做一些更新日志的声明:
v0.0.1
2018年5月1日 13:47:22
预发行版,初步的测试。
特性支持
- 支持空设备节点,创建单纯的节点以供设备读写
- 支持三菱PLC的设备节点,针对的MC协议的二进制和ASCII的机制
- 支持西门子设备节点,支持S7协议,Fetch/Write
- 支持欧姆龙设备节点,支持FINS/TCP节点
- 支持Modbus-Tcp设备节点
- 支持异形Modbus-Tcp设备节点
- 支持NetSimplify客户端节点,这个协议可以在多个电脑之前传送数据。
使用说明
本软件的OPC UA的节点配置需要要节点配置器和解析规则配置器组成,节点配置器来配置OPC UA的节点分类规则,节点描述等信息,但是具体的数据标签由解析规则配置器组成。
以下就具体说明下程序大致的配置步骤:
- 配置客户端分类信息,新增想要的设备,新增设备时需要选择相应的设备类型。
- 新建完设备类型之后,需要配置数据请求,指定读取的地址,读取的长度,然后配置解析规则代码。
- 如果没有解析规则代码,那就需要先配置规则解析,本系统支持可视化的规则配置,具体的配置方法本文下文会深度讲解。
主界面的简单介绍
打开软件的主界面,如下,在初次使用软件的时候,系统默认了三个固定的根节点
- Devices 设备类的根节点
- ModbusServer Modbus服务器的节点,目前不支持
- ModbusAlien 异形ModbusTcp设备对象
如果没有配置软件节点信息,那就需要先点击 系统配置 的 节点配置 菜单了。主界面如下
节点配置的界面如下,此处有个细节,点击节点名称,即可以在右侧的数据列表里显示出来当前选择的节点的详细信息,做左侧节点的操作,通过鼠标右键的菜单来操作:
添加节点分类操作
此处简单的演示添加一个简单的分类操作信息。鼠标在Devices上右键即可操作
然后就会弹出一个编辑框,这样我们就实现了一个类别节点的添加,注意:类别节点是可以相互嵌套的,可以形成复杂的分类
复杂类型节点举例:
然后点击 保存文件 菜单,然后关掉当前窗口,回到主界面,点击 启动引擎,点击 测试客户端 菜单,启动一个通用的OPC UA客户端来浏览服务器上有什么数据信息
可以看到OPC UA的服务器已经按照我们设想创建好了数据节点信息。然后重启软件,我们重新进入 节点配置器 节点进行操作。
编辑和删除节点操作
想要对哪个节点进行操作,就选择哪个节点,然后右键,发现就2个额外的操作选择,编辑节点 和 删除节点 。注意,这里的编辑和删除适用于所有分类节点和设备节点,准确的说,除了3个根节点外不能修改外,其他节点都是可修改的。
删除节点的时候需要注意有个细节:如果当前删除的节点没有子节点,该节点直接进行删除,如果包含了子节点,将会弹出一个对话框。
新增一个演示设备示例,Modbus-Tcp设备
此处我们演示一个例子,添加一个Modbus-Tcp的设备,为啥要拿这个演示呢,因为基于HslCommunication组件的项目中提供了一个Modbus服务器演示项目,可以方便的进行本机的调试测试等等操作。
下载地址:ModbusTcpServer.zip
在开始开发前,还要说明个事情,虽然HslCommunication组件支持读取线圈,寄存器,输入点操作,但是此处只支持读取寄存器,如果要读取线圈怎么办,可以采用的解决方案是把线圈的数据先挪到寄存器里,再进行解决。
OK,万事俱备,开始吧。
然后我们输入好设备的基本信息,比如说名字,描述,IP地址,端口号,客户端的站号等等操作
然后点击 确认 。回到节点配置器如下:
这样就添加成功了一个设备,我们选中这个节点后,右侧的数据列表就显示了这个设备的相关信息。
先不要急着给设备添加访问请求,因为目前没有 配置解析规则 ,那么接下来的操作是点击上图的 保存文件 按钮操作,然后回到主界面
这时候我们进入一个关键的操作,那就是配置解析规则,这个是什么意思呢,我先解释下,我们从设备读取数据通常是字节数据,并不是一些基础的数据类型,比如说short,ushort,int,uint,float.double之类的数据,这个解析规则就是起这样的作用的。比如ModbusTcp我们需要读取20个地址长度的寄存器,那么读取出来以后就是40字节长度,这些寄存器里都有什么数据呢
[ 0 - 1 ] 数据一 short类型
[ 2 - 3 ] 数据二 ushort类型
[ 4 - 7 ] 温度 float类型
[ 8 - 31 ] 机器人关节数据 共计6个长度的float数组
[ 32 - 39 ] 条码 共计8个字节长度
以上是我们假设的数据,因为我也不知道您实际中会碰到怎样的情况,此处就做了一些比较经验的假设,还假设了一个数组的存在,条码的字符串存在,OK,有了这些信息,我们就可以添加解析规则了。
还是老的操作,我们接下来要看看需要我们输入什么信息了。
随便输入一个规则名称吧,然后点击 确认。
接下来我们就需要来添加真正的规则解析了。
先根据上面的信息来填写数据一的信息,索引为0,数据长度为1,因为没有数组。点击确认。
然后继续添加规则
然后添加温度数据
然后再添加机器人位置数据,注意,这是一个数组,长度为6,那么按照下面设置,数据长度的信息需要设置为6
在添加最后一个数据为条码
到这里为止,我们添加了所有的数据了,回到 解析规则器配置界面 ,看看刚刚配置到的成果吧,
左边显示了字节的信息,共配置了40个字节的数据,每种数据类型的背景颜色都不一致,用于快速的区分不同种类的数据类型,可视化的界面显示了所有配置的数据信息,类型,已经所在的字节位置。方便的快速检查有没有遗漏的信息。
确认可以之后,点击菜单的 保存文件 按钮,然后回到节点配置器
这下子可以真的完成数据配置界面了,这里再假设我们需要读取的数据在地址0开始的20个地址的寄存器里。
接下来就按照我们假设的信息输入
这里的请求地址是寄存器的地址,地址规则如下:
- Modbus协议 就是纯数字的内容
- 三菱PLC D100,或是W1A0
- 西门子PLC M100,DB20.30之类的
- 欧姆龙 D100,A100
- SimplifyNet 纯数字,或是1.0.3
这有什么规律呢,我们可以发现这些地址的格式需要HslCommunication支持,所以在配置前,最好使用HslCommunicationDemo软件进行简单的测试,关于该软件的下载地址:
添加完成后,保存。回到软件的主界面。然后点击 启动引擎 ,这时候我们还没开始Modbus服务器,看看有什么效果。
下面显示加载的设备信息中发现了一台设备,类型为ModbusTcp设备,这台设备的服务器我们还没有开启,所以在设备监控项里这个设备处于闪烁中,我们把鼠标移动这个小框框里看看,
可以看到一些设备的基本信息,名称,状态,上次接收时间,这里的上次接收时间是什么意思呢,初始化的情况下,默认为1天之前,好了,接下来我们开好服务器的软件。
我们一点击 启动服务 按钮后,运行日志立马显示有设备连接上来了,
当HslSharp的设备连接上了服务器之后,会怎么样呢。
背景颜色已经变绿色了,上次接收时间也更新了,状态也变成了 在线 状态,然后我们在看看OPC UA的客户端,有什么效果。
然后我们更改下数据试试,在Modbus服务器的界面,在地址2里写入float类型的数据,123.456试试看
然后再去OPC UA的客户端界面刷新数据看看数据效果
此处验证成功,再写一个吧,写个条码信息,在地址16-19里,写入ABCDEFGH;
我们就可以看到
此处有个小BUG,做演示截图的时候来不及改这个BUG了,后面肯定会修复。并在日志里声明
特别说明
你看我们在配置数据解析规则的时候并没有指定数据的大小端,比如三菱是小端在前,大端在后的,西门子是大端在前,小端在后的,Modbus协议和欧姆龙是以字为单位反转的。实际上在本软件中无需理会,我们只要关注什么数据,占了多少长度即可。还是相当方便的。如果有更好的建议,可以联系作者改进。
ModbusTcp异形客户端配置
异形ModbusTcp的配置和大体上和上面的ModbusTCP配置是一样的,但有一些小区别,需要下次完善更新。
请发表评论