Code Monkey home page Code Monkey logo

opcuahelper's Introduction

OpcUaHelper

Build status NuGet Status NuGet Download Gitter NetFramework Visual Studio License status copyright status

一个通用的二次封装的opc ua客户端类库,基于.net 4.6.1创建,基于官方opc ua基金会跨平台库创建,方便的实现和OPC Server进行数据交互。本类库每个几个月就同步官方的类库。

免责声明

OpcUa相关的组件版权归OPC UA基金会所有,使用本库时请遵循OPC UA基金会的授权规则。

  1. 非商用情况,如果你的项目仅仅是自己公司使用的,那么需要注册为OPC基金会的成员,否则,必须开源。
  2. 商用都是需要额外授权的,请联系OPC基金会。

FormBrowseServer

在开发客户端之前,需要使用本窗口来进行查看服务器的节点状态,因为在请求服务器的节点数据之前,必须知道节点的名称,而节点的名称可以通过这个窗口获取。以下演示实例化操作

OpcUaHelper.Forms.FormBrowseServer formBrowseServer = new Forms.FormBrowseServer( );
formBrowseServer.ShowDialog( );

当然你可以固定住这个地址,传入地址即可,此处为示例:

OpcUaHelper.Forms.FormBrowseServer formBrowseServer = new Forms.FormBrowseServer( "opc.tcp://127.0.0.1:62541/SharpNodeSettings/OpcUaServer" );
formBrowseServer.ShowDialog( );

界面效果如下,包含了节点的查看,订阅操作,双击值表格,还可以修改服务器的值(如果这个节点支持修改的话),查看节点的信息: Picture

Server Prepare

如果你没有opc ua的服务器的话,可以参照本示例的服务器,本示例的服务器是项目 SharpNodeSettings 的示例。可以直接下载这个项目运行服务器软件。

或者选择在线的客户端测试: opc.tcp://118.24.36.220:62547/DataAccessServer

OpcUaClient

实例化操作

OpcUaClient m_OpcUaClient = new OpcUaClient();

设置匿名连接

m_OpcUaClient.UserIdentity = new UserIdentity( new AnonymousIdentityToken( ) );

设置用户名连接

m_OpcUaClient.UserIdentity = new UserIdentity( "user", "password" );

使用证书连接

X509Certificate2 certificate = new X509Certificate2( "[证书的路径]", "[密钥]", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable );
m_OpcUaClient.UserIdentity = new UserIdentity( certificate );

设置完连接的权限之后,就可以真正的启动连接操作了,连接的操作必须要放到try...catch...之前,必须使用async标记方法

private async void button1_Click( object sender, EventArgs e )
{
    // connect to server, this is a sample
    try
    {
        await m_OpcUaClient.ConnectServer( "opc.tcp://127.0.0.1:62541/SharpNodeSettings/OpcUaServer" );
    }
    catch (Exception ex)
    {
        ClientUtils.HandleException( "Connected Failed", ex );
    }
}

Read/Write Node

如果我们想要读取上图节点浏览器的温度数据,节点字符串为

ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/温度

类型为Int16, 所以我们使用下面的方法读取

try
{
    short value = m_OpcUaClient.ReadNode<short>( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/温度" );
}
catch(Exception ex)
{
    ClientUtils.HandleException( this.Text, ex );
}

你也可以使用异步读取,只是外面的方法上需要使用async标记

try
{
    short value = await m_OpcUaClient.ReadNodeAsync<short>( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/温度" );
}
catch (Exception ex)
{
    ClientUtils.HandleException( this.Text, ex );
}

接下来写入节点操作,如果该节点的权限不支持写的话,就会触发异常

try
{
    m_OpcUaClient.WriteNode( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/温度", (short)123 );
}
catch (Exception ex)
{
    ClientUtils.HandleException( this.Text, ex );
}

批量读取的操作,分为类型不一致和类型一致两种操作,下面都做个示例

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 = m_OpcUaClient.ReadNodes( nodeIds.ToArray() );



    // 如果你批量读取的值的类型都是一样的,比如float,那么有简便的方式
    List<string> tags = new List<string>( );
    tags.Add( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/风俗" );
    tags.Add( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/转速" );

    // 按照顺序定义的值
    List<float> values = m_OpcUaClient.ReadNodes<float>( tags.ToArray() );

}
catch (Exception ex)
{
    ClientUtils.HandleException( this.Text, ex );
}

批量写入的操作如下:

try
{
    // 此处演示写入一个short,2个float类型的数据批量写入操作
    bool success = m_OpcUaClient.WriteNodes( new string[] {
        "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/温度",
        "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/风俗",
        "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/转速"},
        new object[] {
            (short)1234,
            123.456f,
            123f
        } );
    if (success)
    {
        // 写入成功
    }
    else
    {
        // 写入失败,一个失败即为失败
    }
}
catch (Exception ex)
{
    ClientUtils.HandleException( this.Text, ex );
}

Read History

try
{
    // 此处演示读取历史数据的操作,读取8月18日12点到13点的数据,如果想要读取成功,该节点是支持历史记录的
    List<float> values = m_OpcUaClient.ReadHistoryRawDataValues<float>( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/转速",
        new DateTime( 2018, 8, 18, 12, 0, 0 ), new DateTime( 2018, 8, 18, 13, 0, 0 ) ).ToList( );
    // 列表数据可用于显示曲线之类的操作

}
catch (Exception ex)
{
    ClientUtils.HandleException( this.Text, ex );
}

Read Attribute

本类库支持读取一个节点的相关的所有的属性,主要包含了值,描述,名称,权限等级,等等操作

try
{
    OpcNodeAttribute[] nodeAttributes = m_OpcUaClient.ReadNoteAttributes( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/温度" );
    foreach (var item in nodeAttributes)
    {
        Console.Write( string.Format( "{0,-30}", item.Name ) );
        Console.Write( string.Format( "{0,-20}", item.Type ) );
        Console.Write( string.Format( "{0,-20}", item.StatusCode ) );
        Console.WriteLine( string.Format( "{0,20}", item.Value ) );
    }
                
    // 输出如下
    //  Name                          Type                StatusCode                         Vlaue

    //  NodeClass                     Int32               Good                                   2
    //  BrowseName                    QualifiedName       Good                              2:温度
    //  DisplayName                   LocalizedText       Good                                温度
    //  Description                   LocalizedText       Good                                    
    //  WriteMask                     UInt32              Good                                  96
    //  UserWriteMask                 UInt32              Good                                  96
    //  Value                         Int16               Good                              -11980
    //  DataType                      NodeId              Good                                 i=4
    //  ValueRank                     Int32               Good                                  -1
    //  ArrayDimensions               Null                Good                                    
    //  AccessLevel                   Byte                Good                                   3
    //  UserAccessLevel               Byte                Good                                   3
    //  MinimumSamplingInterval       Double              Good                                   0
    //  Historizing                   Boolean             Good                               False
}
catch (Exception ex)
{
    ClientUtils.HandleException( this.Text, ex );
}

Read Reference

本类库支持读取一个节点的关联节点,包含了几个简单的基本信息

try
{
    ReferenceDescription[] references = m_OpcUaClient.BrowseNodeReference( "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端" );
    foreach (var item in references)
    {
        Console.Write( string.Format( "{0,-30}", item.NodeClass ) );
        Console.Write( string.Format( "{0,-30}", item.BrowseName ) );
        Console.Write( string.Format( "{0,-20}", item.DisplayName ) );
        Console.WriteLine( string.Format( "{0,-20}", item.NodeId.ToString( ) ) );
    }

    ;
    // 输出如下
    //  NodeClass                     BrowseName                      DisplayName           NodeId

    //  Variable                      2:温度                          温度                  ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/温度
    //  Variable                      2:风俗                          风俗                  ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/风俗
    //  Variable                      2:转速                          转速                  ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/转速
    //  Variable                      2:机器人关节                    机器人关节            ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/机器人关节
    //  Variable                      2:cvsdf                         cvsdf                 ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/cvsdf
    //  Variable                      2:条码                          条码                  ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/条码
    //  Variable                      2:开关量                        开关量                ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/开关量
}
catch (Exception ex)
{
    ClientUtils.HandleException( this.Text, ex );
}

Subscript

订阅数据分为订阅单个节点和批量订阅操作,下面分别演示,本订阅的机制基于官方库进行了二次设计,方便扩展实现

  1. 举例说明,有个节点,ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/温度 的数据需要订阅,订阅后再界面上的 textBox3 上显示出来
m_OpcUaClient.AddSubscription( "A", "ns=2;s=Devices/分厂一/车间二/ModbusTcp客户端/温度", SubCallback );

这个关键字 A 是自己定义的,方便回调判断或是取消订阅用的,方法 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( );
        }
    }
}

当服务器的值变化之后,文本框的值也会变化。如果想要取消订阅

m_OpcUaClient.RemoveSubscription( "A" );
  1. 举例说明批量订阅,此处举例批量订阅3个点节点,按顺序在 textBox5 , textBox9 , textBox10 文本框按照顺序进行显示,此处比上面的操作需要麻烦一点, 需要缓存下批量订阅的节点信息
// 缓存的批量订阅的节点
private string[] MonitorNodeTags = null;

private void button5_Click( object sender, EventArgs e )
{
    // 多个节点的订阅
    MonitorNodeTags = new string[]
    {
        textBox6.Text,
        textBox7.Text,
        textBox8.Text,
    };
    m_OpcUaClient.AddSubscription( "B", MonitorNodeTags, 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( );
        }
    }
    else if(key == "B")
    {
        // 需要区分出来每个不同的节点信息
        MonitoredItemNotification notification = args.NotificationValue as MonitoredItemNotification;
        if (monitoredItem.StartNodeId.ToString( ) == MonitorNodeTags[0])
        {
            textBox5.Text = notification.Value.WrappedValue.Value.ToString( );
        }
        else if (monitoredItem.StartNodeId.ToString( ) == MonitorNodeTags[1])
        {
            textBox9.Text = notification.Value.WrappedValue.Value.ToString( );
        }
        else if (monitoredItem.StartNodeId.ToString( ) == MonitorNodeTags[2])
        {
            textBox10.Text = notification.Value.WrappedValue.Value.ToString( );
        }
    }
}

Thanks

感谢使用本库,如何有任何的疑问,可以联系作者,也可以加群讨论:592132877

创作不易,感谢打赏

Picture

opcuahelper's People

Contributors

dathlin avatar dependabot[bot] avatar shizukanaqun avatar wangyongxiao avatar wqliceman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

opcuahelper's Issues

订阅问题

请问下再demo项目里面 订阅后,没有执行callback回调,会是什么原因呢

无服务器连接状态属性

IsConnected属性只是对连接调用的一个记忆,不能实时反应服务器的状态,
建议添加:ServerState属性
在 private void Session_KeepAlive(Session session, KeepAliveEventArgs e)函数中添加或修改:
if (e != null && m_session != null)
{
ServerState = e.CurrentState;//设置服务器状态
if (ServiceResult.IsBad(e.Status))
...

SHA1 signed certificates are not trusted

Previous versions worked, but when using the latest tool, there was an "SHA1 signed certificates are not trusted" error when logging in anonymously. What should I do?

Opc UA Event & Alarm 问题

Hello dathlin:
非常感谢你提供的 OPC UA库,对于学习和开发非常有帮助。有一个问题想请教一下
我在使用 UaExpert(一款常用的OPC UA 软件) 作为Opc Ua client 测试时,发现他会提供一个Event View的窗口,具体功能如下:
“ This document type can be used to subscribe to events and alarms of the UA server. It supports the selection of event fields and can acknowledge and confirm alarms. It also supports reading of historical event data for a given time period.”
通过这个窗口,我可以抓取到所连接的设备的报警,提示等信息。

我想问下 目前 OpcUaHelper 是否也提供了 Event &Alarm 的开发接口或者方法那? 如果有 可否提供一些 reference 作参考

非常感谢

VS2019编译出错

严重性 代码 说明 项目 文件 行 禁止显示状态
警告 未能找到引用的组件“System.Xml.ReaderWriter”。 OpcUaHelper
警告 未能找到引用的组件“System.Threading.Tasks.Extensions”。 OpcUaHelper
警告 未能找到引用的组件“System.Text.Encodings.Web”。 OpcUaHelper
警告 未能找到引用的组件“System.Security.Cryptography.X509Certificates”。 OpcUaHelper
警告 未能找到引用的组件“System.Security.Cryptography.Primitives”。 OpcUaHelper
警告 未能找到引用的组件“System.Security.Cryptography.Encoding”。 OpcUaHelper
警告 未能找到引用的组件“System.Security.Cryptography.Algorithms”。 OpcUaHelper
警告 未能找到引用的组件“System.Runtime.InteropServices.RuntimeInformation”。 OpcUaHelper
警告 未能找到引用的组件“System.Runtime.CompilerServices.Unsafe”。 OpcUaHelper
警告 未能找到引用的组件“System.Reflection.Metadata”。 OpcUaHelper
警告 未能找到引用的组件“System.Numerics.Vectors”。 OpcUaHelper
警告 未能找到引用的组件“System.Net.Sockets”。 OpcUaHelper
警告 未能找到引用的组件“System.Net.Http”。 OpcUaHelper
警告 未能找到引用的组件“System.IO.FileSystem”。 OpcUaHelper
警告 未能找到引用的组件“System.IO.FileSystem.Primitives”。 OpcUaHelper
警告 未能找到引用的组件“System.IO.Compression”。 OpcUaHelper
警告 未能找到引用的组件“System.IO.Compression.ZipFile”。 OpcUaHelper
警告 未能找到引用的组件“System.Globalization.Calendars”。 OpcUaHelper
警告 未能找到引用的组件“System.Diagnostics.DiagnosticSource”。 OpcUaHelper
警告 未能找到引用的组件“System.Console”。 OpcUaHelper
警告 未能找到引用的组件“System.Collections.Immutable”。 OpcUaHelper
警告 未能找到引用的组件“System.Buffers”。 OpcUaHelper
警告 未能找到引用的组件“Opc.Ua.Server”。 OpcUaHelper
警告 未能找到引用的组件“Opc.Ua.Gds.Server.Common”。 OpcUaHelper
警告 未能找到引用的组件“Opc.Ua.Gds.Client.Common”。 OpcUaHelper
警告 未能找到引用的组件“Opc.Ua.Core”。 OpcUaHelper
警告 未能找到引用的组件“Opc.Ua.Configuration”。 OpcUaHelper
警告 未能找到引用的组件“Opc.Ua.Client”。 OpcUaHelper
警告 未能找到引用的组件“Newtonsoft.Json”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.Win32.Primitives”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.Net.Http.Headers”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.Extensions.Primitives”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.Extensions.PlatformAbstractions”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.Extensions.Options”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.Extensions.ObjectPool”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.Extensions.Logging”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.Extensions.Logging.Abstractions”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.Extensions.FileSystemGlobbing”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.Extensions.FileProviders.Physical”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.Extensions.FileProviders.Abstractions”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.Extensions.DependencyInjection”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.Extensions.DependencyInjection.Abstractions”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.Extensions.Configuration”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.Extensions.Configuration.EnvironmentVariables”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.Extensions.Configuration.Abstractions”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.AspNetCore.WebUtilities”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.AspNetCore.Server.Kestrel”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.AspNetCore.Server.Kestrel.Https”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.AspNetCore.Http”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.AspNetCore.Http.Features”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.AspNetCore.Http.Extensions”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.AspNetCore.Http.Abstractions”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.AspNetCore.Hosting”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.AspNetCore.Hosting.Server.Abstractions”。 OpcUaHelper
警告 未能找到引用的组件“Microsoft.AspNetCore.Hosting.Abstractions”。 OpcUaHelper
警告 未能找到引用的组件“BouncyCastle.Crypto”。 OpcUaHelper

Description 取不到值

如题,我使用ReadNoteAttributes() 方法,读取 说明,总是为空值,应该怎么处理

订阅

订阅数据,客户端应该怎么设置订阅刷新的频率?

关于BadRequestTimeout的处理

Hi:
我开发了一款客户端软件,连接的OPCUA server是使用labview编写的。我在程序启动时,建立了单态的opcua 客户端,在程序运行时出现此错误。

06/06/2023 17:28:28.347 KEEP ALIVE LATE: 0.0094888s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=21/5333
06/06/2023 17:28:28.347 Publish #104091, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.349 Publish #104090, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.349 Publish #104087, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.349 PUBLISH #104090 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.348 Publish #104083, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.350 PUBLISH - Did not send another publish request. GoodPublishRequestCount=21, MinPublishRequestCount=21
06/06/2023 17:28:28.350 PUBLISH #104083 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.349 PUBLISH #104087 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.349 Publish #104085, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.349 Publish #104084, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.350 Publish #104086, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.351 PUBLISH #104084 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.351 PUBLISH - Did not send another publish request. GoodPublishRequestCount=21, MinPublishRequestCount=21
06/06/2023 17:28:28.349 PUBLISH #104091 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.351 PUBLISH #104085 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.350 Publish #104089, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.352 PUBLISH - Did not send another publish request. GoodPublishRequestCount=21, MinPublishRequestCount=21
06/06/2023 17:28:28.353 PUBLISH #104089 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.350 PUBLISH - Did not send another publish request. GoodPublishRequestCount=21, MinPublishRequestCount=21
06/06/2023 17:28:28.351 PUBLISH #104086 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.348 Publish #104088, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.355 PUBLISH #104088 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.355 PUBLISH - Did not send another publish request. GoodPublishRequestCount=24, MinPublishRequestCount=21
06/06/2023 17:28:28.361 KEEP ALIVE LATE: 0.00602s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=25/5350
06/06/2023 17:28:28.362 Publish #104101, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.362 Publish #104098, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.362 Publish #104102, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.364 Publish #104093, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.363 Publish #104100, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.364 PUBLISH #104093 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.365 PUBLISH #104100 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.364 Publish #104095, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.364 Publish #104096, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.365 PUBLISH #104095 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.365 PUBLISH - Did not send another publish request. GoodPublishRequestCount=25, MinPublishRequestCount=21
06/06/2023 17:28:28.364 PUBLISH #104102 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.366 PUBLISH #104096 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.363 Publish #104097, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.364 PUBLISH #104098 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.364 Publish #104094, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.363 PUBLISH #104101 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.365 PUBLISH - Did not send another publish request. GoodPublishRequestCount=25, MinPublishRequestCount=21
06/06/2023 17:28:28.367 PUBLISH #104097 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.368 PUBLISH #104094 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.368 Publish #104099, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.366 PUBLISH - Did not send another publish request. GoodPublishRequestCount=25, MinPublishRequestCount=21
06/06/2023 17:28:28.376 PUBLISH #104099 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.364 Publish #104092, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.364 Publish #104103, Reconnecting=False, Error: BadRequestTimeout
06/06/2023 17:28:28.377 PUBLISH #104092 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.378 PUBLISH - Did not send another publish request. GoodPublishRequestCount=26, MinPublishRequestCount=21
06/06/2023 17:28:28.378 PUBLISH - Did not send another publish request. GoodPublishRequestCount=26, MinPublishRequestCount=21
06/06/2023 17:28:28.378 PUBLISH #104103 - Unhandled error BadRequestTimeout during Publish.
BadRequestTimeout 'BadRequestTimeout'

06/06/2023 17:28:28.379 PUBLISH - Did not send another publish request. GoodPublishRequestCount=27, MinPublishRequestCount=21
06/06/2023 17:28:28.394 KEEP ALIVE LATE: 0.0107359s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=21/5386
06/06/2023 17:28:28.409 KEEP ALIVE LATE: 0.0091924s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=21/5407

Read Structure

Hello,

is it possible to read a structure UDT Element with this library? I mean with a return type connected to the UDT in the PLC definition?

BadSecureChannelClosed

EXCEPTION (ServiceResultException)

BadSecureChannelClosed

SERVICE RESULT (BadSecureChannelClosed)

SERVICE RESULT (BadTcpSecureChannelUnknown)

Could not verify security on response.

SERVICE RESULT (BadTcpSecureChannelUnknown)

Token #13 has expired. Lifetime=03:51:43.500

可否增加ReadNodeAsync的非泛型方法

首先非常感谢作者,提供如此好用的封装和示例
是否可以考虑增加ReadNodeAsync的非泛型方法呢?毕竟生产实际中还是有不少返回值不确定的并且读取单个节点的需求诶!

建议添加批量写异步操作

基于网络的数据读写,异步操作是非常重要的,这里依照项目中的其他代码修改了一个类似的:
public Task<List> WriteNodeAsync(string[] tags, object[] values)
{
WriteValueCollection valuesToWrite = new WriteValueCollection();
for (int i = 0; i < tags.Length; i++)
{
if (i < values.Length)
{
WriteValue valueToWrite = new WriteValue()
{
NodeId = new NodeId(tags[i]),
AttributeId = Attributes.Value
};
valueToWrite.Value.Value = values[i];
valueToWrite.Value.StatusCode = StatusCodes.Good;
valueToWrite.Value.ServerTimestamp = DateTime.MinValue;
valueToWrite.Value.SourceTimestamp = DateTime.MinValue;
valuesToWrite.Add(valueToWrite);
}
}

        // Wrap the WriteAsync logic in a TaskCompletionSource, so we can use C# async/await syntax to call it:
        var taskCompletionSource = new TaskCompletionSource<List<bool>>();
        m_session.BeginWrite(
            requestHeader: null,
            nodesToWrite: valuesToWrite,
            callback: ar =>
            {
                var response = m_session.EndWrite(
                  result: ar,
                  results: out StatusCodeCollection results,
                  diagnosticInfos: out DiagnosticInfoCollection diag);

                try
                {
                    ClientBase.ValidateResponse(results, valuesToWrite);
                    ClientBase.ValidateDiagnosticInfos(diag, valuesToWrite);
                    List<bool> retList = new List<bool>();
                    foreach(var item in results)
                    {
                        retList.Add(StatusCode.IsGood(item));
                    }
                    
                    taskCompletionSource.SetResult(retList);
                }
                catch (Exception ex)
                {
                    taskCompletionSource.TrySetException(ex);
                }
            },
            asyncState: null);
        return taskCompletionSource.Task;
    }

Subscription读取数据不全

我通过subscription来订阅一个第三方opc ua server(KepserverEX 6.4)上的数据,共10个node,

每个node每隔100ms产生一个值,该值通过函数来生成,是递增的,这样能确保每个周期都有数据
通知到subscription;

但奇怪的是,不管server安装在局域网内的另一台机子上还是本机上,subscription订阅到的数据

都有缺失;作为对照,使用了java编译的另一个ua客户端来订阅数据,收到的数据是齐全的,同时,server本地存储的数据也是齐全的。

 所以,我不确定是是不是opc foundation提供的库有问题。不知道您有没有测试过相关的性能。

谢谢解答!

服务器断网信息提示不及时

在private void Session_KeepAlive(Session session, KeepAliveEventArgs e)函数中的
if (ServiceResult.IsBad(e.Status))
{
//这里面的提示至少延迟15秒
}
//添加类似如下(延迟3秒):
else
{
// update status.
UpdateStatus(false, e.CurrentTime, " Server Status:"
+ e.CurrentState+" Address:[{0}]", session.Endpoint.EndpointUrl);

}

子节点过多,陷入死循环的问题

获取子节点过多会陷入死循环,OpcUaHelper.FormUtils第487行:
‘revisedContiuationPoints = continuationPoints;’
应该改为:
‘continuationPoints = revisedContiuationPoints’

opc server的variable太多無法讀取

您好:

在使用OpcUaHelper.Tool查詢variable的時候發現如果opc server的variable太多
會無法讀取,測試了一下超過50個以上就會出現這個狀況
想問一下有沒有什麼解法?

照著說明寫了一個方法去遍歷節點嘗試

public static void fore(OpcUaClient m_OpcUaClient,string opcid)
{
try
{
ReferenceDescription[] references = m_OpcUaClient.BrowseNodeReference(opcid);
ReferenceDescription[] reff = m_OpcUaClient.BrowseNodeReference("");
foreach (var item in references)
{
if (item.NodeClass.ToString() == "Object")
{
i++;
Console.WriteLine(i);
Console.Write(string.Format("{0,-30}", item.NodeClass));
Console.Write(string.Format("{0,-30}", item.BrowseName));
Console.Write(string.Format("{0,-20}", item.DisplayName));
Console.WriteLine(string.Format("{0,-20}", item.NodeId.ToString()));
fore(m_OpcUaClient, item.NodeId.ToString());
}
else if(item.NodeClass.ToString() == "Variable")
{
i++;
Console.WriteLine(i);
Console.Write(string.Format("{0,-30}", item.NodeClass));
Console.Write(string.Format("{0,-30}", item.BrowseName));
Console.Write(string.Format("{0,-20}", item.DisplayName));
Console.WriteLine(string.Format("{0,-20}", item.NodeId.ToString()));
}
else { Console.WriteLine("未知的class"); }
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}

出現了以下錯誤
System.NullReferenceException: 並未將物件參考設定為物件的執行個體。 於 OpcUaHelper.OpcUaClient.BrowseNodeReference(String tag) 於 ConsoleApp1.Program.fore(OpcUaClient m_OpcUaClient, String opcid) 於 D:\wo rkspace\OpcUaHelper-master\ConsoleApp1\Program.cs: 行 72

可否添加数据组的管理?

就是对一组数据的批量刷新,批量更新的类,譬如在实际的客户端,在某一个当前页面,可能只更新30个特定变量,在另一个页面又是另一些特定变量,用组对数据进行管理可进一步简化读写操作。
我在本项目的基础上实现了一个简单的,思路类似如下:
DataItem.cs用于存储当前读取到的单个变量,最重要的是public void Refresh(DataValue dataValue)
DataGroup.cs对批量数据进行管理:
public DataGroupBase(List<string> keyList, List<string> tagList, OpcUaClient opcUaClient)
存储变量:
public Dictionary<string,DataItemBindable> Data { get;private set; }

public virtual async Task<FeedbackInfo> ReadAsync()

public virtual async Task<FeedbackInfo> WriteAsync()
对Data进行批量操作
而订阅更新的关键代码:
Data[itemKey].Refresh(notification.Value);
外部访问 Data[keyName]
目前这种方式用在WPF中非常方便,DataItem实现了数据通知(NET Standard不能实现,必须另创建一个库),在XAML中的控件只需要简单的
进行绑定,并指向KeyName即可(Word1为变量在字典中的Key):
<TextBox Text="{Binding Data[Word1].Value,Mode=TwoWay}"/>

服务器订阅节点后偶发获取信号值为空

使用该API订阅服务器大约20个节点,信号类型为byte,在回调函数的notification判断不为空的前提下,变化的value仍然偶发 为空,导致我没有正确获取服务器信号,如图
image

关于订阅频率时间问题

opcUaClient.AddSubscription("A", tags[0], SubCallback); opcUaClient.AddSubscription("B", tags[1], SubCallback); var subs = opcUaClient.Session.Subscriptions; subs.First().MonitoredItems.First().SamplingInterval = 1000; subs.First().PublishingInterval = 1000;

设置 Subscription的PublishingInterval属性 或者 MonitoredItem的SamplingInterval属性都不管用,请问下如何解决?

如何进行文件传输

比方说服务器所在应用程序有一个生成试验报告的功能客户端调用这个生成试验报告,怎么将生成的报告传输给客户端。用什么方式可以实现吗

证书生成的问题

请问如何生成客户端的证书,找不到证书在哪,代码里的哪部分可以生成证书

用FormBrowserServer方法时出现错误

        using (OpcUaHelper.Forms.FormBrowseServer form = new FormBrowseServer())
        {
            form.ShowDialog();
        }

在地址上填上我本地的OPC UA server 地址,点击Connect(我的OPC server是Prosys OPC UA Simulation Server), 出现以下错误,请帮忙看看,谢谢!!

System.Reflection.TargetInvocationException
HResult=0x80131604
Message=Exception has been thrown by the target of an invocation.
Source=mscorlib
StackTrace:
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Delegate.DynamicInvokeImpl(Object[] args)
at System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme)
at System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)
at System.Windows.Forms.Control.InvokeMarshaledCallbacks()
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.RunDialog(Form form)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at System.Windows.Forms.Form.ShowDialog()
at WindowsFormsApp.Form1.Button1_Click(Object sender, EventArgs e) in C:\Users\bingdeng tan\source\repos\WindowsFormsApp1\WindowsFormsApp1\Form1.cs:line 90
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at WindowsFormsApp.Program.Main() in C:\Users\bingdeng tan\source\repos\WindowsFormsApp1\WindowsFormsApp1\Program.cs:line 19

Inner Exception 1:
InvalidCastException: Cannot cast an absolute ExpandedNodeId to a NodeId. Use
ExpandedNodeId.ToNodeId instead.

Force reconnect reason=BadConnectionClosed 'Remote side closed connection'

Hi:
我开发了一款客户端软件,连接的OPCUA server是使用labview编写的。我在程序启动时,建立了单态的opcua 客户端,在程序运行时出现此错误。这并未触发ReconnectStarting事件,与此同时在使用Uaexpert客户端进行测试时并未出现此问题。

06/06/2023 17:33:04.253 KEEP ALIVE LATE: 0.0102529s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=21/5271
06/06/2023 17:33:04.269 KEEP ALIVE LATE: 0.0097328s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=21/5292
06/06/2023 17:33:04.284 KEEP ALIVE LATE: 0.0079604s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=21/5313
06/06/2023 17:33:04.314 KEEP ALIVE LATE: 0.0089844s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=21/5355
06/06/2023 17:33:04.330 KEEP ALIVE LATE: 0.0080157s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=21/5376
06/06/2023 17:33:04.335 Session: Unexpected error invoking KeepAliveCallback.
 MissingMethodException '找不到方法:“Void Opc.Ua.Client.SessionReconnectHandler..ctor()”。'

06/06/2023 17:33:04.346 KEEP ALIVE LATE: 0.0073916s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=21/5397
06/06/2023 17:33:04.361 KEEP ALIVE LATE: 0.0040681s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=21/5418
06/06/2023 17:33:04.377 KEEP ALIVE LATE: 0.0110701s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=21/5439
06/06/2023 17:33:04.393 Session RECONNECT starting.
06/06/2023 17:33:04.393 KEEP ALIVE LATE: 0.0093491s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=21/5460
06/06/2023 17:33:04.393 Session REPLACING channel.
06/06/2023 17:33:04.395 TransportChannel RECONNECT: Reconnecting to opc.tcp://192.168.110.31:8888/.
06/06/2023 17:33:04.395 ChannelId 0: in Connecting state.
06/06/2023 17:33:04.401 ChannelId 0: in Opening state.
06/06/2023 17:33:04.401 ChannelId 0: Token #0 created. CreatedAt=09:33:04.401. Lifetime=-1.
06/06/2023 17:33:04.404 Security Policy: http://opcfoundation.org/UA/SecurityPolicy#None
06/06/2023 17:33:04.405 Sender Certificate: (none)
06/06/2023 17:33:04.405 SECURE CHANNEL CREATED [.NET Standard ClientChannel UA-TCP 1.4.371.91] [ID=55] Connected To: opc.tcp://192.168.110.31:8888/ [None/None/Binary]
06/06/2023 17:33:04.405 ChannelId 55: Token #1 activated. CreatedAt=09:33:04.401. Lifetime=3600000.
06/06/2023 17:33:04.406 ChannelId 55: in Open state.
06/06/2023 17:33:04.406 ChannelId 55: Token Expiry 06/06/2023 10:33:04, renewal scheduled in 2699996 ms.
06/06/2023 17:33:04.406 CLIENTCHANNEL SOCKET CONNECTED: 0086B698, ChannelId=55
06/06/2023 17:33:04.406 ChannelId 54: in Closing state.
06/06/2023 17:33:04.409 ChannelId 54: Force reconnect reason=BadConnectionClosed 'Remote side closed connection'
06/06/2023 17:33:04.410 Publish #278906, Reconnecting=True, Error: BadSecureChannelClosed
06/06/2023 17:33:04.411 Publish abandoned after error due to reconnect: BadSecureChannelClosed
略
06/06/2023 17:33:05.028 Publish #279430, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:05.027 Publish #279429, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:04.941 KEEP ALIVE LATE: 0.3378851s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=42/5076
06/06/2023 17:33:09.108 Publish #284353, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.109 Publish #284354, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.111 Publish #284358, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.112 Publish #284364, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.113 Publish #284359, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.113 Publish #284365, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.112 Publish #284363, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.112 Publish #284361, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.101 Publish #284344, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.110 Publish #284357, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.108 KEEP ALIVE LATE: 4.5045293s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=34/287
06/06/2023 17:33:09.112 Publish #284360, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.107 Publish #284351, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.110 Publish #284356, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.105 Publish #284349, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.073 Publish #284302, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.112 Publish #284362, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.106 Publish #284350, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.093 Publish #284331, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.104 Publish #284348, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.137 KEEP ALIVE LATE: 0.0052507s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=2/279
06/06/2023 17:33:09.258 Session: Unexpected error invoking KeepAliveCallback.
 MissingMethodException '找不到方法:“Void Opc.Ua.Client.SessionReconnectHandler..ctor()”。'

06/06/2023 17:33:09.076 Publish #284304, Reconnecting=False, Error: BadSecureChannelClosed
06/06/2023 17:33:09.268 KEEP ALIVE LATE: 0.009973s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=59/189
06/06/2023 17:33:09.284 KEEP ALIVE LATE: 0.0112905s, EndpointUrl=opc.tcp://192.168.110.31:8888/, RequestCount=21/210

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.