更新opcua心跳状态日志

This commit is contained in:
2248356998 qq.com
2023-07-17 20:59:32 +08:00
parent 9a3bc6b8b3
commit 7351e62d87

View File

@@ -50,15 +50,14 @@ public class OPCUAClient : DisposableObject
/// <summary>
/// 当前的订阅组,组名称/组
/// </summary>
private Dictionary<string, Subscription> dic_subscriptions;
private Dictionary<string, Subscription> dic_subscriptions = new();
private ApplicationInstance m_application;
private ApplicationInstance m_application = new();
private ApplicationConfiguration m_configuration;
private EventHandler m_ConnectComplete;
private bool m_IsConnected;
private EventHandler m_KeepAliveComplete;
@@ -78,8 +77,6 @@ public class OPCUAClient : DisposableObject
/// </summary>
public OPCUAClient()
{
dic_subscriptions = new();
var certificateValidator = new CertificateValidator();
certificateValidator.CertificateValidation += CertificateValidation;
SecurityConfiguration securityConfigurationcv = new SecurityConfiguration
@@ -92,7 +89,7 @@ public class OPCUAClient : DisposableObject
certificateValidator.Update(securityConfigurationcv);
// 构建应用程序配置
var configuration = new ApplicationConfiguration
m_configuration = new ApplicationConfiguration
{
ApplicationName = OPCUAName,
ApplicationType = ApplicationType.Client,
@@ -171,9 +168,7 @@ public class OPCUAClient : DisposableObject
DisableHiResClock = true
};
configuration.Validate(ApplicationType.Client);
m_configuration = configuration;
m_application = new ApplicationInstance();
m_configuration.Validate(ApplicationType.Client);
m_application.ApplicationConfiguration = m_configuration;
@@ -892,7 +887,6 @@ public class OPCUAClient : DisposableObject
/// <returns>The new session object.</returns>
private async Task<ISession> ConnectAsync(string serverUrl)
{
// disconnect from existing session.
Disconnect();
if (m_configuration == null)
@@ -900,13 +894,12 @@ public class OPCUAClient : DisposableObject
throw new ArgumentNullException("未初始化配置");
}
var useSecurity = OPCNode?.IsUseSecurity ?? true;
// select the best endpoint.
EndpointDescription endpointDescription = CoreClientUtils.SelectEndpoint(serverUrl, useSecurity);
EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(m_configuration);
ConfiguredEndpoint endpoint = new ConfiguredEndpoint(null, endpointDescription, endpointConfiguration);
//创建本地证书
await m_application.CheckApplicationInstanceCertificate(true, 0, 1200);
//var x509 = await m_configuration.SecurityConfiguration.ApplicationCertificate.Find(true);
m_session = await Opc.Ua.Client.Session.Create(
m_configuration,
endpoint,
@@ -918,14 +911,12 @@ public class OPCUAClient : DisposableObject
new string[] { });
// set up keep alive callback.
m_session.KeepAlive += new KeepAliveEventHandler(Session_KeepAlive);
// update the client status
m_IsConnected = true;
// raise an event.
DoConnectComplete(null);
m_ConnectComplete?.Invoke(this, null);
//如果是订阅模式,连接时添加订阅组
if (OPCNode.ActiveSubscribe)
AddSubscription(Guid.NewGuid().ToString(), Variables.ToArray());
// return the new session.
@@ -933,16 +924,10 @@ public class OPCUAClient : DisposableObject
}
private void DoConnectComplete(object state)
{
m_ConnectComplete?.Invoke(this, null);
}
private async Task<OperResult<Dictionary<string, List<OPCNodeAttribute>>>> ReadNoteAttributeAsync(BrowseDescriptionCollection nodesToBrowse, ReadValueIdCollection nodesToRead, CancellationToken cancellationToken)
{
int startOfProperties = nodesToRead.Count;
ReferenceDescriptionCollection references = await FormUtils.BrowseAsync(m_session, nodesToBrowse, false);
if (references == null)
@@ -1032,18 +1017,13 @@ public class OPCUAClient : DisposableObject
/// </summary>
private void Server_ReconnectComplete(object sender, EventArgs e)
{
// ignore callbacks from discarded objects.
if (!Object.ReferenceEquals(sender, m_reConnectHandler))
{
return;
}
m_session = m_reConnectHandler.Session;
m_reConnectHandler.SafeDispose();
m_reConnectHandler = null;
// raise any additional notifications.
m_ReconnectComplete?.Invoke(this, e);
}
@@ -1054,23 +1034,19 @@ public class OPCUAClient : DisposableObject
checkLock.Lock();
try
{
// check for events from discarded sessions.
if (!Object.ReferenceEquals(session, m_session))
if (session != m_session)
{
return;
}
// start reconnect sequence on communication error.
if (ServiceResult.IsBad(e.Status))
{
if (OPCNode?.ReconnectPeriod <= 0)
{
UpdateStatus(true, e.CurrentTime, "连接失败 ({0})", e.Status);
return;
OPCNode.ReconnectPeriod = 5000;
}
UpdateStatus(true, e.CurrentTime, "重新连接中 in {0}s", OPCNode?.ReconnectPeriod);
UpdateStatus(true, e.CurrentTime, "心跳检测错误:{0},重新连接中", e.Status.ToString());
if (m_reConnectHandler == null)
{
@@ -1083,10 +1059,8 @@ public class OPCUAClient : DisposableObject
return;
}
// update status.
UpdateStatus(false, e.CurrentTime, "连接正常 [{0}]", session.Endpoint.EndpointUrl);
UpdateStatus(false, e.CurrentTime, "心跳检测正常 [{0}]", session.Endpoint.EndpointUrl);
// raise any additional notifications.
m_KeepAliveComplete?.Invoke(this, e);
}
finally