OPC UA简介

2023-05-16

OPC是应用于工业通信的,在windows环境的下一种通讯技术,原有的通信技术难以满足日益复杂的环境,在可扩展性,安全性,跨平台性方面的不足日益明显,所以OPC基金会在几年前提出了面向未来的架构设计的OPC 统一架构,简称OPC UA,截止目前为止,越来越多公司将OPC UA作为开放的数据标准,在未来工业4.0行业上也将大放异彩。

 

在OPC UA的服务器端。会公开一些数据节点,或是方法等信息,允许第三方使用标准的OPC协议来进行访问,在传输层已经安全的处理所有的消息,对于客户端的访问来说,应该是非常清楚简单的。

 

本篇文章是讲述如何开发C#的OPC UA客户端的方式,关于如何开发OPC UA可配置的服务器,请参照另一篇博客:http://www.cnblogs.com/dathlin/p/8976955.html 这篇博客讲述了如何创建基于三菱,西门子,欧姆龙,ModbusTcp客户端,异形ModbusTcp客户端的OPC UA服务器引擎。

联系作者及加群方式(激活码在群里发放):http://www.hslcommunication.cn/Cooperation

2.0版本说明


2018年8月18日 20:09:24  基于OPC UA的最新官方库,重新调整了订阅的代码实现,开源地址:https://github.com/dathlin/OpcUaHelper 除了组件的源代码之外,还包含了一个服务器的示例,就是下面的的示例操作。

更加详细的代码说明可以参照GitHub上的readme文件

前期准备


准备好开发的IDE,首选Visual Studio2017版本,新建项目,或是在你原有的项目上进行扩展。注意:项目的.NET Framework版本最低为4.6

打开NuGet管理器,输入指令(如果不明白,参考http://www.cnblogs.com/dathlin/p/7705014.html):

1

Install-Package OpcUaHelper

或者:

然后在窗体的界面新增引用:

1

using OpcUaHelper;

接下就可以愉快码代码了。

 

 

OPC UA服务器准备


此处有一个供网友测试的服务器:opc.tcp://118.24.36.220:62547/DataAccessServer

当然,一般的网友都会使用Kepware软件,在此处介绍一个我自己开发的OPC UA网关服务器,支持三菱,西门子,欧姆龙,modbustcp客户端转化成OPC UA服务器,支持创建modbus服务器,异形服务器,地址是

https://github.com/dathlin/SharpNodeSettings

 

节点浏览器


我们在得到一个OPC UA的服务器之后,第一件事就是使用节点浏览器对所有的节点进行访问,不然你根本就不知道服务器公开了什么东西,此处我使用了一个测试服务器,该地址为云端地址,不保证以后会不会继续支持访问,目前来说还是可以访问的。

比如这个地址:opc.tcp://118.24.36.220:62547/DataAccessServer

OK,然后我们可以使用代码来显示这个服务器到底有什么数据了!在窗体上新增一个按钮,双击它进入点击事件,写上

1

2

3

4

5

6

7

private void button1_Click(object sender, EventArgs e)

{

    using (FormBrowseServer form = new FormBrowseServer())

    {

        form.ShowDialog();

    }

}

然后就会显示如下的界面:在地址栏输入上述地址,点击连接(此处能连接上的条件是服务器配置为允许匿名登录):

 

左边区域可以随便点击看看,可以看到所有公开的数据,比如点击一个数据节点,下面图片中的Name节点,右边编辑框会显示该节点的ID标识,这个标识很重要,关系到等会的读写操作。

客户端实例化


 

1

2

3

4

5

6

7

8

9

10

11

private OpcUaClient opcUaClient = new OpcUaClient();

 

private async void Form1_Load(object sender, EventArgs e)

{

    await opcUaClient.ConnectServer("opc.tcp://118.24.36.220:62547/DataAccessServer");

}

 

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

    opcUaClient.Disconnect();

}

如上所示,在窗体载入的时候实例化,在窗体关闭的时候断开连接。下面的节点操作和其他操作使用的实例都是这个opcUaClient,如果你连接的服务器是需要用户名和密码的,那么修改Load中的代码如下:

1

2

3

private async void Form1_Load(object sender, EventArgs e)

        {

            opcUaClient.UserIdentity = new Opc.Ua.UserIdentity("admin""123456");

1

await opcUaClient.ConnectServer("opc.tcp://118.24.36.220:62547/DataAccessServer");

1

}

  

节点读取操作


我们要读取一个节点数据,有两个信息是必须知道的

  • 节点的ID标识,就是在上述节点浏览器中的编辑框的信息("ns=2;s=Machines/Machine A/Name")
  • 节点的数据类型,这个是必须知道的,不然也不好读取数据。(“string”)

上面的两个信息都可以通过节点浏览器来获取到信息,现在,我们已经获取到了这两个信息,就上面的括号里的数据,然后我们在新增一个按钮,来读取数据:

1

2

3

4

5

6

7

8

9

10

11

12

13

private void button2_Click(object sender, EventArgs e)

{

    try

    {

        string value = opcUaClient.ReadNode<string>("ns=2;s=Machines/Machine A/Name");

        MessageBox.Show(value); // 显示测试数据

    }

    catch(Exception ex)

    {

        // 使用了opc ua的错误处理机制来处理错误,网络不通或是读取拒绝

        ClientUtils.HandleException(Text, ex);

    }

}

可以看到,真正的读取数据的操作只有一行代码,但是此处展示了一个良好的编程习惯,使用try..catch..,关于错误捕获的使用以后会专门开篇文章讲解。在展示一个读取float数据类型的示例

1

2

3

4

5

6

7

8

9

10

11

12

13

private void button2_Click(object sender, EventArgs e)

{

    try

    {

        float value = opcUaClient.ReadNode<float>("ns=2;s=Machines/Machine B/TestValueFloat");

        MessageBox.Show(value.ToString()); // 显示100.5

    }

    catch(Exception ex)

    {

        // 使用了opc ua的错误处理机制来处理错误,网络不通或是读取拒绝

        ClientUtils.HandleException(Text, ex);

    }

}

其他的类型参照这种写法就行,哪怕是数组类型也是没有关系的。

类型未知节点读取操作


我们要读取一个节点数据,假设我们只知道一个节点的ID,或者说这个节点的类型是可能变化的,那么我们需要读取到值的同时读取到这个数据的类型,那么代码参照下面

  • 节点的ID标识,就是在上述节点浏览器中的编辑

节点的数据类型最终由 value.WrappedValue.TypeInfo 来决定,有两个属性,是否是数组和基础类型,下面的代码只有int类型进行了严格的数组判断,其他类型参照即可。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

    private void button3_Click(object sender, EventArgs e)

    {

        Opc.Ua.DataValue value = opcUaClient.ReadNode("ns=2;s=Robots/RobotA/RobotMode");

        // 一个数据的类型是不是数组由 value.WrappedValue.TypeInfo.ValueRank 来决定的

        // -1 说明是一个数值

        // 1  说明是一维数组,如果类型BuiltInType是Int32,那么实际是int[]

        // 2  说明是二维数组,如果类型BuiltInType是Int32,那么实际是int[,]

        if (value.WrappedValue.TypeInfo.BuiltInType == Opc.Ua.BuiltInType.Int32)

        {

            if (value.WrappedValue.TypeInfo.ValueRank == -1)

            {

                int temp = (int)value.WrappedValue.Value;               // 最终值

            }

            else if (value.WrappedValue.TypeInfo.ValueRank == 1)

            {

                int[] temp = (int[])value.WrappedValue.Value;           // 最终值

            }

            else if (value.WrappedValue.TypeInfo.ValueRank == 2)

            {

                int[,] temp = (int[,])value.WrappedValue.Value;         // 最终值

            }

        }

        else if(value.WrappedValue.TypeInfo.BuiltInType == Opc.Ua.BuiltInType.UInt32)

        {

            uint temp = (uint)value.WrappedValue.Value;                 // 数组的情况参照上面的例子

        }

        else if (value.WrappedValue.TypeInfo.BuiltInType == Opc.Ua.BuiltInType.Float)

        {

            float temp = (float)value.WrappedValue.Value;               // 数组的情况参照上面的例子

        }

        else if (value.WrappedValue.TypeInfo.BuiltInType == Opc.Ua.BuiltInType.String)

        {

            string temp = (string)value.WrappedValue.Value;             // 数组的情况参照上面的例子

        }

        else if (value.WrappedValue.TypeInfo.BuiltInType == Opc.Ua.BuiltInType.DateTime)

        {

            DateTime temp = (DateTime)value.WrappedValue.Value;         // 数组的情况参照上面的例子

        }

    }

}

 

批量节点读取操作


批量读取节点时,有个麻烦之处在于类型不一定都是一致的,所以为了支持更加广泛的读取操作,只提供Opc.Ua.DataValue的读取,读取到数据后需要自己做一些转换,根据类型来自己转,参照上面类型未知的节点操作代码。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

try

{

    // 添加所有的读取的节点,此处的示例是类型不一致的情况

    List<NodeId> nodeIds = new List<NodeId>( );

    nodeIds.Add( new NodeId( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/温度" ) );

    nodeIds.Add( new NodeId( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/风俗" ) );

    nodeIds.Add( new NodeId( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/转速" ) );

    nodeIds.Add( new NodeId( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/机器人关节" ) );

    nodeIds.Add( new NodeId( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/cvsdf" ) );

    nodeIds.Add( new NodeId( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/条码" ) );

    nodeIds.Add( new NodeId( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/开关量" ) );

 

    // dataValues按顺序定义的值,每个值里面需要重新判断类型

    List<DataValue> dataValues = opcUaClient.ReadNodes( nodeIds.ToArray() );

    // 然后遍历你的数据信息

    foreach (var dataValue in dataValues)

    {

        // 获取你的实际的数据

        object value = dataValue.WrappedValue.Value;

    }

 

 

 

 

    // 如果你批量读取的值的类型都是一样的,比如float,那么有简便的方式

    List<string> tags = new List<string>( );

    tags.Add( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/风俗" );

    tags.Add( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/转速" );

 

    // 按照顺序定义的值

    List<float> values = opcUaClient.ReadNodes<float>( tags.ToArray() );

 

}

catch (Exception ex)

{

    ClientUtils.HandleException( this.Text, ex );

}

  

 

 

节点写入操作


 

节点的写入操作和读取类似,我们还是必须要先知道节点的ID和数据类型,和读取最大的区别是,写入的操作很有可能会失败,因为服务器对于数据的输入都是很敏感的,这部分权限肯定会控制的,也就是很有可能会发生写入拒绝,此处的测试服务器允许写入,下面举例在Name节点写入“abcd测试写入啊”信息:

1

2

3

4

5

6

7

8

9

10

11

12

13

private void button3_Click(object sender, EventArgs e)

{

    try

    {

        bool IsSuccess = opcUaClient.WriteNode("ns=2;s=Machines/Machine B/Name","abcd测试写入啊");

        MessageBox.Show(IsSuccess.ToString()); // 显示True,如果成功的话

    }

    catch(Exception ex)

    {

        // 使用了opc ua的错误处理机制来处理错误,网络不通或是读取拒绝

        ClientUtils.HandleException(Text, ex);

    }

}

再写个例子,写入Float数据

1

2

3

4

5

6

7

8

9

10

11

12

13

private void button3_Click(object sender, EventArgs e)

{

    try

    {

        bool IsSuccess = opcUaClient.WriteNode("ns=2;s=Machines/Machine B/TestValueFloat",123.456f);

        MessageBox.Show(IsSuccess.ToString()); // 显示True,如果成功的话

    }

    catch(Exception ex)

    {

        // 使用了opc ua的错误处理机制来处理错误,网络不通或是读取拒绝

        ClientUtils.HandleException(Text, ex);

    }

}

要想查看是否真的写入,可以使用节点数据浏览器来查看是否真的写入。

批量节点写入操作


 写入节点操作时,类型并不一定是统一的,所以此处提供统一的object数组写入,需要注意,对应的节点名称和值的类型必须一致!

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

private void button5_Click(object sender, EventArgs e)

{

    // 批量写入的代码

    string[] nodes = new string[]

    {

        "ns=2;s=Robots/RobotA/RobotMode",

        "ns=2;s=Robots/RobotA/UserFloat"

    };

    object[] data = new object[]

    {

        4,

        new float[]{5,3,1,5,7,8}

    };

 

    // 都成功返回True,否则返回False

    bool result = opcUaClient.WriteNodes(nodes, data);

}

 

数据订阅


下面举例说明订阅ns=2;s=Machines/Machine B/TestValueFloat的数据,我们假设这个在服务器上是不断变化的,按照如下的方式进行数据订阅:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

private void button2_Click( object sender, EventArgs e )

{

    // sub

    OpcUaClient.AddSubscription( "A""ns=2;s=Machines/Machine B/TestValueFloat", SubCallback );

}

 

private void SubCallback(string key, MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs args )

{

    if (InvokeRequired)

    {

        Invoke( new Action<string, MonitoredItem, MonitoredItemNotificationEventArgs>( SubCallback ), key, monitoredItem, args );

        return;

    }

 

    if (key == "A")

    {

        // 如果有多个的订阅值都关联了当前的方法,可以通过key和monitoredItem来区分

        MonitoredItemNotification notification = args.NotificationValue as MonitoredItemNotification;

        if (notification != null)

        {

            textBox3.Text = notification.Value.WrappedValue.Value.ToString( );

        }

    }

}

移除订阅

1

OpcUaClient.RemoveSubscription( "A" );

  

批量订阅的方式,参照源代码或是 github的说明文件。

 

 

  

方法调用


 

有些OPC 服务器会提供方法调用,测试服务器提供了一个方法,它支持两个int参数输入,string参数输出,方法节点为:ns=2;s=Machines/Machine B/Calculate

我们接下来看看调用服务器的方法到底返回了什么?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

private void button6_Click(object sender, EventArgs e)

{

    try

    {

        string value = opcUaClient.CallMethodByNodeId("ns=2;s=Machines/Machine B",

            "ns=2;s=Machines/Machine B/Calculate", 123, 456)[0].ToString();

        MessageBox.Show(value);// 显示:我也不知道刚刚发生了什么,调用设备为:Machine B

    }

    catch(Exception ex)

    {

        // 使用了opc ua的错误处理机制来处理错误,网络不通或是读取拒绝

        ClientUtils.HandleException(Text, ex);

    }

}

我们在调用方法的时候需要传入方法的父节点 ID,以及方法的ID,必须先清楚方法的传入参数和传出参数才能对应的代码。

日志输出


OPC UA客户端在运行时会输出一大堆的日志,容量会增加的比较快,是否需要配置,请谨慎处理,如果真的有需要,按照下面的配置方式来完成

1

2

3

4

5

private void button5_Click(object sender, EventArgs e)

{

    // False 代表每次启动清空日志,True代码不清空,注意,该日志大小增加非常快

    opcUaClient.SetLogPathName(Application.StartupPath + "\\Logs\\opc.ua.client.txt"false);

}

上述的都是一些最常用的方法了,已经可以应付大多数的需求,该客户端类还提供了一些连接启动事件,断开事件等等,可以满足额外的需求。

 

引用读取


这种情况比较少,比如服务器端有个MachineB节点,下面放了一些数据,如果客户端把读取的节点写死一般问题也不大,应该服务器很少会改变,但是服务器真的改变了呢。。。。比如在MachineB下追加了一个数据,这种情况确实很少,但是对于我们写成相对动态的情况来说,就很有必要,但是中间问题很多,因为新增的节点类型你是不知道的,ID也是不知道的,所以还先要读取引用,然后在读取数据,然后在判断类型,进行相应的转化。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

private void button6_Click(object sender, EventArgs e)

{

    try

    {

        Opc.Ua.ReferenceDescription[] reference = opcUaClient.BrowseNodeReference("ns=2;s=Machines/Machine B");

 

        foreach (var refer in reference)

        {

            // 如果不是值节点,就不要了,否则下面读取了也是没有意义的

            if (refer.NodeClass != NodeClass.Variable)

            {

                continue;

            }

             

 

            // 分别读取数据

            Opc.Ua.DataValue dataValue = opcUaClient.ReadNode((Opc.Ua.NodeId)refer.NodeId);

            if (dataValue.WrappedValue.TypeInfo.BuiltInType == Opc.Ua.BuiltInType.Boolean)

            {

                // 读取到的是bool数据,在这里做处理

                bool value = (bool)dataValue.WrappedValue.Value;

            }

            else if (dataValue.WrappedValue.TypeInfo.BuiltInType == Opc.Ua.BuiltInType.String)

            {

                // 读取到的是string字符串,在这里做处理

                string value = dataValue.WrappedValue.Value.ToString();

            }

        }

    }

    catch (Exception ex)

    {

        // 使用了opc ua的错误处理机制来处理错误,网络不通或是读取拒绝

        ClientUtils.HandleException(Text, ex);

    }

}

 

异步操作


 

在读取写入单个节点的功能中,提供了一个异步版本,用来方便的进行异步操作

1

2

3

4

5

6

7

8

9

10

11

12

13

private async void button2_Click(object sender, EventArgs e)

{

    try

    {

        float value = await opcUaClient.ReadNodeAsync<float>("ns=2;s=Machines/Machine B/TestValueFloat");

        MessageBox.Show(value.ToString()); // 显示100.5

    }

    catch(Exception ex)

    {

        // 使用了opc ua的错误处理机制来处理错误,网络不通或是读取拒绝

        ClientUtils.HandleException(Text, ex);

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

private async void button3_Click(object sender, EventArgs e)

{

    try

    {

        bool IsSuccess = await opcUaClient.WriteNodeAsync("ns=2;s=Machines/Machine B/TestValueFloat",123.456f);

        MessageBox.Show(IsSuccess.ToString()); // 显示True,如果成功的话

    }

    catch(Exception ex)

    {

        // 使用了opc ua的错误处理机制来处理错误,网络不通或是读取拒绝

        ClientUtils.HandleException(Text, ex);

    }

}

  

 

查看本地以注册的服务器


利用官方的控件库来实现的一个操作,允许查看本地的已经注册的服务器。

1

2

3

4

5

6

7

8

9

10

11

12

private void button6_Click( object sender, EventArgs e )

{

    // 获取本机已经注册的服务器地址

    string endpointUrl = new Opc.Ua.Client.Controls.DiscoverServerDlg( ).ShowDialog( opcUaClient.AppConfig, null );

    // 获取其他服务器注册的地址,注意,需要该IP的安全策略配置正确

    // string endpointUrl = new Opc.Ua.Client.Controls.DiscoverServerDlg( ).ShowDialog( opcUaClient.AppConfig, "192.168.0.100" );

 

    if (!string.IsNullOrEmpty( endpointUrl ))

    {

        // 获取到的需要操作的服务器地址

    }

}

 

 

触发事件


本opc ua客户端类,包含了几个常用的事件,现在进行说明:

  • ConnectComplete 事件:在第一次连接到服务器完成的时候触发
  • ReconnectStarting 事件:开始重新连接到服务器的时候触发
  • ReconnectComplete 事件:重新连接到服务器的时候触发
  • KeepAliveComplete 事件:因为opc ua客户端每隔5秒会与服务器进行通讯验证,每次验证都会触发该方法
  • OpcStatusChange 事件:本OPC UA客户端的终极事件,当客户端的状态变更都会触发,包括了连接,重连,断开,状态激活,opc ua的状态等等

事件类的完整代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

/// <summary>

/// 状态通知的消息类

/// </summary>

public class OpcUaStatusEventArgs : EventArgs

{

    /// <summary>

    /// 是否异常

    /// </summary>

    public bool Error { getset; }

    /// <summary>

    /// 时间

    /// </summary>

    public DateTime Time { getset; }

    /// <summary>

    /// 文本

    /// </summary>

    public string Text { getset; }

 

    /// <summary>

    /// 转化为字符串

    /// </summary>

    /// <returns></returns>

    public override string ToString()

    {

        return Error ? "[异常]" "[正常]" + Time.ToString("  yyyy-MM-dd HH:mm:ss  ") + Text;

    }

}

 

获取客户端网络是否正常有个属性

1

2

3

4

5

6

7

/// <summary>

/// Indicate the connect status

/// </summary>

public bool Connected

{

    get return m_IsConnected; }

}

 

 

特别说明


虽然提供了删除一个节点和新增一个节点的方法,但是在客户端是不允许操作的,调用无效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OPC UA简介 的相关文章

  • Sinutrain下载安装与开启OPC UA---kalrry

    Sinumerik下载安装与开启OPC UA kalrry 前言一 安装前准备二 Win7安装1 软件安装2 开启授权3 文件配置4 客户端连接 三 Win10 11安装四 启动后使用五 启动OPC UA 前言 本教程只适用于 Sinutr
  • 博途V17(S7-1200)OPC-UA通信测试

    文章目录 环境 步骤 安装 博途端 UAExpert端 参考 环境 S7 1200 TIA Portal V17 笔记本 与PLC网线连接 Windows10 UaExpert 步骤 安装 TIA Portal v17 博途 安装教程附安装
  • OPC UA性能评估

    本文是对这篇论文的总结 xff0c 该文章从性能和资源使用方面比较了工业4 0的4个主要协议 xff1a OPC UA xff0c DDS xff0c ROS和MQTT 这4个协议都是基于以太网 xff08 Ethernet based x
  • Softing的OPC UA C++ SDK全面升级:具有高功能性和易用性

    为支持反向连接 Reverse Connect 和访问全局发现服务器 Global Discovery Server GDS Softing的OPC UA C Software Development Kit SDK 已全面升级 OPC U
  • OPC UA协议报文,基础介绍+Hello报文解析

    消息主要分为 消息头和附加字段 通讯过程 协议标准第一部分进行总体介绍 协议标准第四部分有详细介绍通讯过程 流程介绍 整体流程 连接套接字 Hello 打开安全信道 创建会话 关闭安全信道 关闭套接字 订阅等事件 服务器审核行为 聚合的服务
  • OPC服务器简介和入门介绍

    什么是OPC OPC代表OLE 对象链接和嵌入 过程控制 OPC是最流行的数据连接标准 用于在控制器 设备 应用程序和其他基于服务器的系统之间进行通信 而无需进入数据传输的自定义驱动程序 工厂自动化系统或过程由来自不同供应商或供应商的不同协
  • 工业物联网协议对比:MQTT Sparkplug vs OPC-UA

    引言 工业系统需要确保数据的无缝交换 因此对于高效 安全的通信协议具有极高的依赖性 MQTT Sparkplug 和 OPC UA 是两个经常被提到的工业协议 本文将全面比较 MQTT Sparkplug 和 OPC UA 以及它们的衍生版
  • Movicon/Connext设备连接实例(四)——Movicon.NExT与西门子1200PLC 以太网通讯

    Movicon Next是全新一代的HMI SCADA解决方案 拥有众多超越传统的扩展功能 Movicon平台有着广泛的应用场景 且在众多行业中继承了优秀的解决方案 得到了市场广泛认证 针对不同的行业都能对快速找出解决方案并快速部署 且整个
  • 物联网平台如何为OPC服务器创造新生命力

    在前一篇的 OPC服务器简介和入门介绍 中为大家介绍了OPC的体系结构 传统opc服务器具有的如下几个优势特点 1 支持与不同的供应商沟通 2 消除系统中对自定义驱动程序的需求 3 减少设备负载 4 方便访问数据 这让我们在纷繁的工业设备和
  • Matrikon OPC常见问题及解决方案(一)

    本文主要分享了使用MatrikonOPC服务器时遇到的一些最常见的问题和相应的解决方案 在联系MatrikonOPC支持团队之前 你可以看一下以下问题 解决方案和问题 答案部分是否能帮助你解决目前问题 问题和解决方案 安装时出现 aprxd
  • 不同的 DCOM / COM 安全设置意味着什么?

    我们的应用程序广泛使用 COM 和 DCOM 因此我们需要确保正确设置 COM 安全权限 我知道我可以在组件服务 MMC 管理单元下访问这些权限 并且可以在计算机的属性页下设置默认值 限制 在 DCOM Config 节点下 我可以深入了解
  • 在 Mercurial 中指定编辑器

    一般来说 如果我有一个 W 类型的自定义文件 并且想要使用自定义应用程序 编辑器 X 打开 查看它 当我想要编辑 查看该文件时 如何设置 Hg 来调用应用程序 X 具体示例 我使用 TortoiseHg 来跟踪一组文件 这些文件是由自定义应
  • 使用 opc ua .net 库在 Unity3d 中创建一个非常简单的 OPC 客户端

    我在尝试实现一个简单的方法时遇到这些错误OPC使用 Unity3D 的 Net 客户端 这些错误出现在 Visual Studio 中 Severity Code Description Project File Line Suppress
  • OpenOPC Gateway 在 OsX 或 Linux 中运行使用客户端

    我用OpenOPC图书馆python https sourceforge net projects openopc https sourceforge net projects openopc 在网关模式 网关在 Windows 上运行 客
  • OPC 节点路径中的“ns=2;s=”有何意义?

    我注意到所有 OPC 标签 ID 的前缀都是ns 2 s 可能的 NodeId 值的一些示例是 ns 2 s AcquisitionTimeRemaining ns 2 s Status ns 2 s Time 我想知道这个前缀的意义是什么
  • 使用 xml 模式中的节点填充 opcua 地址空间

    我正在开展一个项目 根据规范构建 opc ua 服务器 我在实现方面已经走得足够远 目前正在处理写入请求 我已经在服务器地址空间中有一些节点 看起来有很多节点 实际上也有很多 几乎不可能创建 并一一添加节点 无论如何回到问题 我已经从 op
  • OPC 新手指南:如何编写 C# Hello World 客户端?

    这是我的情况 我们开发了一款用于监控太阳能发电厂的软件 我必须介绍 OPC 作为一种从物理设备本身获取数据的新方法 这就是为什么我最终尝试了解 OPC 但迄今为止这令人沮丧 我已经安装了 Matrikon 模拟器 并使用 Matrikon
  • DYMOLA:opc 服务器如何使用 MATLAB 使用 dsin.txt 或 mat 文件进行初始化

    我在 DYMOLA 中创建了一个 OPC 服务器 现在我在 DYMOSIM 中有这个可以单击并初始化 使用 dsin txt 的 MAT 文件 现在我在 MATLAB 中创建了一个 GUI 文件 并获取变量的输入并创建了一个 mat 文件
  • OPC-UA 的替代方案 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 作为访问由各种 PLC 组成的系统的过程数据的解决方案 是否有 OPC UA 的合适替代方案 独立于平
  • MATLAB - GUI 和 OPC 服务器

    我想在 MATLAB 中设计一个图形用户界面 可以使用 MATLAB 的过程控制对象链接和嵌入 OPC 工具箱连续读取数据 我怎样才能实现这个 我已经设计了图形用户界面 但我无法将数据读入图形用户界面 就这样做 type opctoolMA

随机推荐