技术论坛

 OPC UA网关(服务)程序附完整代码

返回主题列表
作者 主题
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 网关主要部分

  1. 节点配置

  2. 服务配置

  3. PLC变量监控,读取和写入

部分代码展示

//节点的类

        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 更新的版本
链接:https://pan.baidu.com/s/19oBM7rcghFWzRbeC7a8NHA
提取码:flom


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网关(服务)程序附完整代码

谢谢分享 opcua一直是不会

养活一团春意思,撑起两根穷骨头
zunzhi
侠圣

经验值: 2714
发帖数: 118
精华帖: 5
3楼    2022-08-18 19:33:41
主题:回复:OPC UA网关(服务)程序附完整代码

六、使用方法

  1. 节点配置,注意严格按照格式增加和减少变量

<?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网关(服务)程序附完整代码

好好学习1

落英缤纷
侠客

经验值: 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网关(服务)程序附完整代码


能把工业软件和Visual Studio 结合使用的都是大佬


Zhenxing.Yu
侠客

经验值: 979
发帖数: 97
精华帖: 0
26楼    2022-08-24 13:42:31
主题:回复:OPC UA网关(服务)程序附完整代码


感谢分享,正好在学习OPC

既来之,则安之
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网关(服务)程序附完整代码


,市面上可用的OPC UA使用效果不好,楼主的思路很好,并且ua绝对是趋势,以后所谓的OPC中间件厂家不好做了

做最好的自己!活出自我!
yzm_cumt
至圣

经验值: 18269
发帖数: 2653
精华帖: 14
31楼    2022-08-25 13:28:48
主题:回复:OPC UA网关(服务)程序附完整代码


,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网关(服务)程序附完整代码

学习楼主的精神,太牛了!

您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。