Skip to content

7 Modbus.Net.OPC

parallelbgls edited this page Jun 30, 2017 · 10 revisions

类图OPC

基本概念

OPC是OPC基金会研发的标准实时通讯协议,拥有两种方式:基于虚拟串口的OPC DA和基于以太网tcp协议的OPC UA。

地址对应

首先要注意一件事情:

  • 使用Modbus.Net.OPC之前要注意您的OPC地址应该遵循如下两种规范的其中一种:
    1. 只有一个文件夹,下面包含所有点位信息。
    2. 拥有树状文件夹,最后的标签应该包含所有父节点的信息,用任意分隔符将其分隔。

不满足上面两种规范的其中之一的OPC点表不能使用Modbus.Net.OPC,请直接使用H-opc。

Modbus.Net.OPC有一个非常特殊的Formater叫AddressFormaterOPC。

它的参数中有一个Lambda函数,这个函数的参数是设备和地址,你应该根据这两个参数输出该地址对应的OPC标签(OPC Tag)。

下面举例

如果你的标签为"1/15/Value_Opening", 1为设备Id, 15是站号,Value_Opening是点的信息。
分隔符为"/",遵循规范2。
你可以把该Lambda表达式写成这样(分隔符为'/'):

(baseMachine, addressUnit) => return new string[]{baseMachine.Id, ((XXUnitExtend)addressUnit.unitExtend).stationId, addressUnit.Name};

如果遵循规范1,则应写成这样(分隔符这时直接赋值为''):

(baseMachine, addressUnit) => return new string[]{baseMachine.Id+"."+((XXUnitExtend)addressUnit.unitExtend).stationId+"."+addressUnit.Name};

如果标签为"1.15.Value_Opening", 遵循规范2,那么直接把分隔符设置为'.'。

正则表达式

所有的tag在匹配的时候默认使用正则表达式,所以tag在匹配时满足一切正则表达式的要求。

比如:如果你想在第一个标签中使用宽匹配,只要像下面这样写。

(baseMachine, addressUnit) => return new string[]{"(.*)", baseMachine.Id, ((XXUnitExtend)addressUnit.unitExtend).stationId, addressUnit.Name};

有关权限问题

如果OPC服务的托管程序运行在管理员权限之下,那个运行Modbus.Net.OPC获取这个OPC服务数据的程序也必须使用管理员权限运行,否则会无法连接的错误。

特别注意事项(1.3.9以上)

所有的tag不能存在TAB符(既'\r'),Modbus.Net.OPC占用了这个符号作为分隔符。

如何写OPC的连接地址

OPC DA 应为 "opcda://PC-Name/OPC-Software-Name"。
推荐使用Matrkon OPC Client扫描整个计算机上所有的OPC DA连接。

OPC UA 应为 "opc.tcp://PC-Name/Opc-Software-Name"。

Home

Clone this wiki locally