作者 | 主题 |
---|---|
zunzhi 侠圣 经验值: 2714 发帖数: 118 精华帖: 5 |
楼主 2022-08-18 19:02:58
主题:OPC UA网关(服务)程序附完整代码 网上OPC UA服务端的介绍非常少,网关的更是找不到,找到的几乎都是收费的,最近静下心把OPC基金会的代码学习了一遍,结合一些大牛的文章,写了一个简单的OPC UA网关。目前网关的设备只支持西门子,因为只有西门子的仿真器足够强大(S7协议可以仿真),后续根据条件会加上三菱、欧姆龙等等。人过中年,总想踏踏实实做点事情,如果有好的工作平台希望大家能介绍一下,感谢! OPC是应用于工业通信的,在windows环境的下一种通讯技术,原有的通信技术难以满足日益复杂的环境,在可扩展性,安全性,跨平台性方面的不足日益明显,所以OPC基金会在几年前提出了面向未来的架构设计的OPC 统一架构,简称OPC UA,截止目前为止,越来越多公司将OPC UA作为开放的数据标准. OPC UA 基于Web服务(windows的WCF)开发的,同时又具有MQTT 可订阅的特性,部署方便、使用简单,容易被大家广泛的接受,于是随着工业4.0的发展逐渐普及 一、测试平台搭建 1.软件配置 仿真采用:S7-PLCSIM Advanced V4.0 SP1 编程采用:TIA V15.1 2.编写简单程序,提供基础变量,如布尔,整型,实数等供测试 3.仿真注意事项 1)PLC组态地址,仿真PLC地址必须和虚拟机一个网段 2)项目属性要选择块编译时支持仿真、数据块优化项去掉,通信属性中勾选允许远程PUT/GET 二.OPC UA网关架构流程 三、OPC UA 编译环境 编译软件:Visual Studio 2022 编译框架:Microsoft .NET Framework 4.6.2 四、OPC UA 网关主要部分
部分代码展示 //节点的类 public class OpcuaNode { //节点名称 public string NodeName { get; set; } //父节点 public string ParentNode { get; set; } //节点数据类型 public string DataType { get; set; } //节点类型 public string NodeType { get; set; } //节点的值 public string NodeValue { get; set; } //节点的地址 public string Adress { get; set; } } OPC UA的主要数据类型,注意和PLC变量对应 -<Aliases> <Alias Alias="Boolean">i=1</Alias> <Alias Alias="SByte">i=2</Alias> <Alias Alias="Byte">i=3</Alias> <Alias Alias="Int16">i=4</Alias> <Alias Alias="UInt16">i=5</Alias> <Alias Alias="Int32">i=6</Alias> <Alias Alias="UInt32">i=7</Alias> <Alias Alias="Int64">i=8</Alias> <Alias Alias="UInt64">i=9</Alias> <Alias Alias="Float">i=10</Alias> <Alias Alias="Double">i=11</Alias> <Alias Alias="DateTime">i=13</Alias> <Alias Alias="String">i=12</Alias> </Aliases> 读取节点配置文件加载到树形控件,同时给节点类赋值,详细见附件源码 connectPlc(); //判断PLC连接状态 if (lianjie == 1&&server==null) { //清空节点列表 opcuaNodes.Clear(); //清空列表 treeView1.Nodes.Clear(); //加载文件 doc.Load(xmlpath); //遍历节点 RecursionTreeControl1(doc.DocumentElement, treeView1.Nodes); //展开视图 treeView1.ExpandAll(); 服务启动初始化,读取服务配置,包括服务地址、端口、证书、签名或密钥的存放路径,是否启用匿名登录、是否启用非安全登录等等,详细见附件源码 //声明应用实例 ApplicationInstance application; //声明服务 ServerBase server; //声明服务配置 ApplicationConfiguration config; private void UaServerInit() { try { // Initialize the user interface. Application.EnableVisualStyles(); ApplicationInstance.MessageDlg = new ApplicationMessageDlg(); application = new ApplicationInstance(); application.ApplicationType = ApplicationType.Server; application.ConfigSectionName = "MyOPC.UA.Server"; //读取服务配置 config = application.LoadApplicationConfiguration(false).Result; //读取服务地址和端口 textBox1.Text = config.ServerConfiguration.BaseAddresses.ElementAt(1).ToString(); } catch (Exception ex) { ExceptionDlg.Show(application.ApplicationName, ex); } } PLC 变量监控分读和写2个部分,读是开一个定时器循环读取PLC的变量的值,不断刷新,写是绑定OPC UA的一个变量写入事件,写入动作时才会触发,具体见附件源码 定时读取 //CreateAddressSpace中开启定时器,读PLC m_simulationTimer = new Timer(DoSimulation, null, 1000, 1000); //定时读取PLC并更新数据 private void DoSimulation(object state) { try { lock (Lock) { var timeStamp = DateTime.UtcNow; foreach (BaseDataVariableState variable in m_dynamicNodes) { variable.Value = GetNewValue(variable); variable.Timestamp = timeStamp; variable.ClearChangeMasks(SystemContext, false); } } } catch (Exception e) { Utils.LogError(e, "Unexpected error doing simulation."); } } //读取PLC private object GetNewValue(BaseVariableState variable) { object value = null; //判断变量地址是否为空 if (variable.Des cription.Text.Length > 0) { //实数处理 //if (variable.DataType == DataTypeIds.Float) if (variable.DataType == DataTypeIds.Float variable.DataType == DataTypeIds.Double) { value = Form1.plc.Read(variable.Des cription.Text); var buffer = new byte[4]; buffer[3] = (byte)((uint)value >> 24); buffer[2] = (byte)((uint)value >> 16); buffer[1] = (byte)((uint)value >> 8); buffer[0] = (byte)((uint)value >> 0); value = (BitConverter.ToSingle(buffer, 0)).ToString(); return value; } //字符串处理 //if (variable.DataType == DataTypeIds.Float) else if (variable.DataType == DataTypeIds.String) { int tt = variable.Des cription.Text.IndexOf("."); int dbnum = int.Parse(variable.Des cription.Text.Substring(2,1)); int dbcount = int.Parse(variable.Des cription.Text.Substring(tt+4)); var count = (byte)Form1.plc.Read(DataType.DataBlock, dbnum, dbcount, VarType.Byte, 1); value = Form1.plc.Read(DataType.DataBlock, dbnum, dbcount + 1, VarType.String, count+1).ToString().Substring(1); return value; } //字符处理 else if (variable.DataType == DataTypeIds.ByteString) { value = Form1.plc.Read(variable.Des cription.Text); byte[] array = new byte[1]; array[0] = (byte)(Convert.ToInt32(value)); //ASCII码强制转换二进制 value = Convert.ToString(System.Text.Encoding.ASCII.GetString(array));//str为ASCII码对应的字符 return value; } else { //读取变量 value = Form1.plc.Read(variable.Des cription.Text); return value; } } else { value = null; } // skip Variant Null if (value is Variant variant) { if (variant.Value == null) { value = null; } } return value; } 写的事件绑定 /// <summary> /// Creates a new variable. /// </summary> private BaseDataVariableState CreateVariable(NodeState parent, string path, string name, NodeId dataType, int valueRank) {
//绑定客户端写入事件 variable.OnWriteValue = ToWritePLC;
} 具体见附件吧,已经超出字数限制了! 为了数据的安全,防止误操作,我加了一个写入保护开关,需要时开启 五、运行测试,读写正常
努力工作,好好学习!
|
zunzhi 侠圣 经验值: 2714 发帖数: 118 精华帖: 5 |
1楼 2022-08-18 19:17:11
主题:回复:OPC UA网关(服务)程序附完整代码 OPC UA网关源码(不含编译好的程序) 链接:https://pan.baidu.com/s/1M_vdAWUlrcNT5VU2IpPPbA 提取码:7f16 OPC UA网关程序(大家测试一下,有BUG在此贴反馈,我修改优化,争取做成一个成熟的产品) 链接:https://pan.baidu.com/s/18R_ITKafb87TafyhpIwFjg 提取码:nt2s 2022.10.8 更新的版本 MatrikonOPCUAExplorer (好用的OPC客户端) 链接:https://pan.baidu.com/s/1QnDQlrAp-AyfRLgIOP4RZw 提取码:cto4 OPC 基金会的OPC客户端 链接:https://pan.baidu.com/s/1cTWXk8CKyQBDFxTu3EibnA 提取码:dmwf 测试的PLC程序 链接:https://pan.baidu.com/s/1XB3Pwxp5N9SSd6nRWAHMdA 提取码:u0u1 创作不易,请大家多多点赞支持!谢谢!
努力工作,好好学习!
|
贤贤易色 奇侠 经验值: 8091 发帖数: 1308 精华帖: 6 |
2楼 2022-08-18 19:22:10
主题:回复:OPC UA网关(服务)程序附完整代码
养活一团春意思,撑起两根穷骨头
|
zunzhi 侠圣 经验值: 2714 发帖数: 118 精华帖: 5 |
3楼 2022-08-18 19:33:41
主题:回复:OPC UA网关(服务)程序附完整代码 六、使用方法
<?xml version="1.0" encoding="UTF-8"?> <!-- 根目录--> <Root> <!-- 目录--> <Node Name="Motor1" ParentNode="Root" NodeType="Folder" > <!-- 变量--> <Node Name="Start1" ParentNode="Motor1" NodeType="Variable" DataType="DataTypeIds.Boolean" Adress="M10.0" > </Node> <Node Name="Stop1" ParentNode="Motor1" NodeType="Variable" DataType="DataTypeIds.Boolean" Adress="M10.1" > </Node> <Node Name="Speed1" ParentNode="Motor1" NodeType="Variable" DataType="DataTypeIds.Float" Adress="MD12" > </Node> </Node> <!-- 目录--> <Node Name="Motor2" ParentNode="Root" NodeType="Folder" > <!-- 变量--> <Node Name="Start2" ParentNode="Motor2" NodeType="Variable" DataType="DataTypeIds.Boolean" Adress="M20.0" > </Node> <Node Name="Stop2" ParentNode="Motor2" NodeType="Variable" DataType="DataTypeIds.Boolean" Adress="M20.1" > </Node> <Node Name="Speed2" ParentNode="Motor2" NodeType="Variable" DataType="DataTypeIds.Float" Adress="MD22" > </Node> </Node> <!-- 目录--> <Node Name="DBTest" ParentNode="Root" NodeType="Folder" > <!-- 变量--> <Node Name="Name" ParentNode="DBTest" NodeType="Variable" DataType="DataTypeIds.String" Adress="DB1.DBD0" > </Node> <Node Name="Age" ParentNode="DBTest" NodeType="Variable" DataType="DataTypeIds.Int16" Adress="DB1.DBW256" > </Node> <Node Name="High" ParentNode="DBTest" NodeType="Variable" DataType="DataTypeIds.Float" Adress="DB1.DBD258" > </Node> <Node Name="Good" ParentNode="DBTest" NodeType="Variable" DataType="DataTypeIds.Boolean" Adress="DB1.DBX262.0" > </Node> <Node Name="SintTest" ParentNode="DBTest" NodeType="Variable" DataType="DataTypeIds.Int16" Adress="DB1.DBW264" > </Node> <Node Name="CharTest" ParentNode="DBTest" NodeType="Variable" DataType="DataTypeIds.ByteString" Adress="DB1.DBB266" > </Node> </Node> </Root> 2.服务配置方法 修改端口和服务地址
努力工作,好好学习!
|
zunzhi 侠圣 经验值: 2714 发帖数: 118 精华帖: 5 |
4楼 2022-08-18 19:59:52
主题:回复:OPC UA网关(服务)程序附完整代码 把我的贴子整理下 OPC UA通信测试(增加云数据库、微信小程序等) https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1755840&b_id=66&s_id=0&num=0#anch 本贴PLC做为OPC UA服务器,我的程序时客户端 S7_1500PLC物联网学习项目(MQTT协议) https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1710468&b_id=66&s_id=0&num=0#anch 本贴是介绍MQTT通信 PLC信息采集(一个学习MES的简单项目) https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1702551&b_id=66&s_id=0&num=0#anch 本贴介绍经典的TCP通信 C#改的一个监控IO的小程序 https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1680680&b_id=66&s_id=0&num=0#anch 本贴介绍的是经典的S7通信 工业4.0的快速发展,数据采集越来越重要,希望我的贴子能给大家带来帮助,同时也希望大家也能多多指点我,纠正我的错误,大家一起共同进步!
努力工作,好好学习!
|
RENHQ 至圣 经验值: 68945 发帖数: 12231 精华帖: 59 |
5楼 2022-08-18 21:41:00
主题:回复:OPC UA网关(服务)程序附完整代码
Q群:https://jq.qq.com/?k=9BDuEgf6
|
MSF数控维修 侠圣 经验值: 2808 发帖数: 158 精华帖: 0 |
6楼 2022-08-19 07:56:31
主题:回复:OPC UA网关(服务)程序附完整代码 创作不易,积极学习 |
锋言锋语 至圣 经验值: 23682 发帖数: 3381 精华帖: 52 |
7楼 2022-08-19 08:18:27
主题:回复:OPC UA网关(服务)程序附完整代码 楼主可以针对特定设备开发opc server。
不忘初心
|
yacado 侠圣 经验值: 3804 发帖数: 500 精华帖: 3 |
8楼 2022-08-19 08:28:55
主题:回复:OPC UA网关(服务)程序附完整代码 |
黑猫警长W 至圣 经验值: 18389 发帖数: 2409 精华帖: 1 |
9楼 2022-08-19 09:22:48
主题:回复:OPC UA网关(服务)程序附完整代码 |
0615317263 至圣 经验值: 19253 发帖数: 4217 精华帖: 2 |
10楼 2022-08-19 11:00:28
主题:回复:OPC UA网关(服务)程序附完整代码 |
手机用户20190411240LDZ 新手 经验值: 20 发帖数: 1 精华帖: 0 |
11楼 2022-08-19 13:10:57
主题:回复:OPC UA网关(服务)程序附完整代码 |
WOWUWUWU 至圣 经验值: 10373 发帖数: 1794 精华帖: 0 |
12楼 2022-08-19 18:50:11
主题:回复:OPC UA网关(服务)程序附完整代码
谢谢分享。
|
猥琐青年 游民 经验值: 66 发帖数: 1 精华帖: 0 |
13楼 2022-08-19 22:01:57
主题:回复:OPC UA网关(服务)程序附完整代码 |
海上漂2 侠圣 经验值: 4895 发帖数: 1164 精华帖: 0 |
14楼 2022-08-20 08:49:20
主题:回复:OPC UA网关(服务)程序附完整代码
13070952128
|
执着探路者 至圣 经验值: 11049 发帖数: 651 精华帖: 5 |
15楼 2022-08-20 10:38:36
主题:回复:OPC UA网关(服务)程序附完整代码 门槛太高,看不明白。但是必须为楼主无私分享点赞!
人生如逆水行舟,不进则退。
|
斩风control 侠圣 经验值: 2308 发帖数: 444 精华帖: 2 |
16楼 2022-08-20 16:02:44
主题:回复:OPC UA网关(服务)程序附完整代码
fighting
|
Ready_OK 至圣 经验值: 15530 发帖数: 1735 精华帖: 0 |
18楼 2022-08-21 16:43:26
主题:回复:OPC UA网关(服务)程序附完整代码
海纳百川,厚德务实!
|
工控小西门子 至圣 经验值: 14013 发帖数: 3254 精华帖: 1 |
19楼 2022-08-21 17:55:51
主题:回复:OPC UA网关(服务)程序附完整代码
就是一个字——坚持!!!
|
hf1 奇侠 经验值: 8149 发帖数: 1442 精华帖: 3 |
20楼 2022-08-21 21:36:10
主题:回复:OPC UA网关(服务)程序附完整代码 感谢楼主无私的付出,学习了! |
胖头陀 奇侠 经验值: 9587 发帖数: 432 精华帖: 0 |
21楼 2022-08-22 11:17:57
主题:回复:OPC UA网关(服务)程序附完整代码 |
落英缤纷 侠客 经验值: 863 发帖数: 28 精华帖: 0 |
22楼 2022-08-22 16:40:22
主题:回复:OPC UA网关(服务)程序附完整代码 |
yecao2006 至圣 经验值: 18031 发帖数: 1524 精华帖: 2 |
23楼 2022-08-23 11:48:20
主题:回复:OPC UA网关(服务)程序附完整代码 非常使用的分享,感谢楼主。
我回来了!继续努力!
|
hf1 奇侠 经验值: 8149 发帖数: 1442 精华帖: 3 |
24楼 2022-08-23 16:24:47
主题:回复:OPC UA网关(服务)程序附完整代码 讲得比较详细,感谢分享! |
填坑 游民 经验值: 55 发帖数: 4 精华帖: 0 |
25楼 2022-08-24 11:15:00
主题:回复:OPC UA网关(服务)程序附完整代码 |
Zhenxing.Yu 侠客 经验值: 979 发帖数: 97 精华帖: 0 |
26楼 2022-08-24 13:42:31
主题:回复:OPC UA网关(服务)程序附完整代码
既来之,则安之
|
kirk27 侠士 经验值: 1019 发帖数: 35 精华帖: 0 |
27楼 2022-08-25 08:38:00
主题:回复:OPC UA网关(服务)程序附完整代码 |
大酱猛男 侠客 经验值: 737 发帖数: 37 精华帖: 0 |
28楼 2022-08-25 09:03:40
主题:回复:OPC UA网关(服务)程序附完整代码 |
Ready_OK 至圣 经验值: 15530 发帖数: 1735 精华帖: 0 |
29楼 2022-08-25 10:24:05
主题:回复:OPC UA网关(服务)程序附完整代码
海纳百川,厚德务实!
|
ZD_JY 至圣 经验值: 13049 发帖数: 1080 精华帖: 8 |
30楼 2022-08-25 13:27:41
主题:回复:OPC UA网关(服务)程序附完整代码
做最好的自己!活出自我!
|
yzm_cumt 至圣 经验值: 18269 发帖数: 2653 精华帖: 14 |
31楼 2022-08-25 13:28:48
主题:回复:OPC UA网关(服务)程序附完整代码
sometimes you have to be your own hero!
|
平常客 奇侠 经验值: 7096 发帖数: 1668 精华帖: 1 |
32楼 2022-08-25 22:47:10
主题:回复:OPC UA网关(服务)程序附完整代码 感谢知识分享
随遇而安
|
手机用户20210609378629 游民 经验值: 71 发帖数: 2 精华帖: 0 |
33楼 2022-08-27 22:15:50
主题:回复:OPC UA网关(服务)程序附完整代码 写得很好,能留个联系方式,相互交流下不 |
笨笨笨笨 奇侠 经验值: 7127 发帖数: 1022 精华帖: 2 |
34楼 2022-08-30 09:20:54
主题:回复:OPC UA网关(服务)程序附完整代码
心有多远路就有多远
|
长衫造纸龙 游侠 经验值: 544 发帖数: 103 精华帖: 0 |
37楼 2022-08-30 21:24:08
主题:回复:OPC UA网关(服务)程序附完整代码 学习楼主的精神,太牛了! |