Skip to content

Commit

Permalink
Merge pull request #36 from Autabee/Generation
Browse files Browse the repository at this point in the history
Generation
  • Loading branch information
peacefighter1996 authored Sep 2, 2024
2 parents 17166a0 + a4f0079 commit 14580ac
Show file tree
Hide file tree
Showing 18 changed files with 171 additions and 84 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="8.0.7" />
<PackageReference Include="MudBlazor" Version="7.5.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="8.0.8" />
<PackageReference Include="MudBlazor" Version="7.6.0" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
<ItemGroup>
<PackageReference Include="Autabee.Utility.Messaging" Version="1.0.1" />
<PackageReference Include="Blazor.ContextMenu" Version="2.1.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="8.0.7" />
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="8.0.8" />
<PackageReference Include="Serilog" Version="4.0.1" />
</ItemGroup>

Expand Down
4 changes: 2 additions & 2 deletions src/Autabee.OpcScout/Autabee.OpcScout.BlazorView.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
<PackageReference Include="Autabee.Utility.Messaging" Version="1.0.1" />
<PackageReference Include="Blazor.ContextMenu" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageReference Include="MudBlazor" Version="7.5.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="8.0.7" />
<PackageReference Include="MudBlazor" Version="7.6.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="8.0.8" />
<PackageReference Include="Serilog" Version="4.0.1" />
</ItemGroup>

Expand Down
6 changes: 3 additions & 3 deletions src/Autabee.OpcScoutApp/Autabee.OpcScoutApp.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,9 @@
<ItemGroup>
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<ProjectReference Include="..\Autabee.OpcScout\Autabee.OpcScout.BlazorView.csproj" />
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebView.Maui" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls" Version="8.0.82" />
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="8.0.82" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebView.Maui" Version="8.0.82" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="8.0.0" />
</ItemGroup>

Expand Down
4 changes: 2 additions & 2 deletions src/Autabee.OpcScoutWeb/Autabee.OpcScoutWeb.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
Expand Down Expand Up @@ -33,7 +33,7 @@

<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.21.0" />
<PackageReference Include="MudBlazor" Version="7.5.0" />
<PackageReference Include="MudBlazor" Version="7.6.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.DelegatingText" Version="1.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<TargetFrameworks>netstandard2.0;net48;net6.0;net8.0</TargetFrameworks>
<Description>Opc client interface</Description>
<PackageProjectUrl>https://github.com/Autabee/Autabee.OpcCommunication/tree/main/src/ManagedOpcClient</PackageProjectUrl>
<Version>0.3.10</Version>
<Version>0.3.11</Version>
<Nullable>enable</Nullable>
<PackageTags>opcua;client;opcua-client</PackageTags>
<LangVersion>latest</LangVersion>
Expand Down
148 changes: 114 additions & 34 deletions src/ManagedOpcClient/AutabeeManagedOpcClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1073,8 +1073,8 @@ string GetCorrectedTypeName(string value)
public NodeValueRecord ReadValue(ValueNodeEntry nodeEntry)
{
if (nodeEntry == null) throw new ArgumentNullException(nameof(nodeEntry));
var body = (session.ReadValue(nodeEntry.GetNodeId())).Value;
return CreateNodeValue(nodeEntry, body);
var dv = session.ReadValue(nodeEntry.GetNodeId());
return CreateNodeValue(nodeEntry, dv.Value, dv.ServerTimestamp);
}

public NodeValueRecord[] ReadValues(ValueNodeEntryCollection list)
Expand Down Expand Up @@ -1165,27 +1165,27 @@ public NodeValueRecord CreateNodeValue(ValueNodeEntry entry, DataValue tempResul
{
if (entry.IsUDT && (tempResult is DataValue dvValue2))
{
return CreateNodeValue(entry, (ExtensionObject)dvValue2.Value);
return CreateNodeValue(entry, (ExtensionObject)dvValue2.Value, tempResult.ServerTimestamp);
}
else if (entry.IsUDT) throw new Exception("Unknown type");
else if (tempResult is DataValue dvValue1)
{
return entry.CreateRecord(dvValue1.Value);
return entry.CreateRecord(dvValue1.Value, tempResult.ServerTimestamp);
}
else return entry.CreateRecord(tempResult);
else return entry.CreateRecord(tempResult, tempResult.ServerTimestamp);

}
public NodeValueRecord CreateNodeValue(ValueNodeEntry entry, ExtensionObject tempResult)
public NodeValueRecord CreateNodeValue(ValueNodeEntry entry, ExtensionObject tempResult, DateTime TimeStamp = default)
{
return entry.CreateRecord(ConstructEncodable(entry, (byte[])tempResult.Body));
return entry.CreateRecord(ConstructEncodable(entry, (byte[])tempResult.Body), TimeStamp);
}
public NodeValueRecord CreateNodeValue(ValueNodeEntry entry, object tempResult)
public NodeValueRecord CreateNodeValue(ValueNodeEntry entry, object tempResult, DateTime TimeStamp = default)
{
return tempResult switch
{
DataValue dvValue => CreateNodeValue(entry, dvValue),
ExtensionObject eoValue => CreateNodeValue(entry, eoValue),
_ => entry.CreateRecord(tempResult),
DataValue dvValue => CreateNodeValue(entry, dvValue, TimeStamp),
ExtensionObject eoValue => CreateNodeValue(entry, eoValue, TimeStamp),
_ => entry.CreateRecord(tempResult, TimeStamp),
};
}

Expand Down Expand Up @@ -1687,32 +1687,108 @@ public MonitoredItem AddMonitoredItem(
MonitoredNodeValueRecordEventHandler handler = null)

Check warning on line 1687 in src/ManagedOpcClient/AutabeeManagedOpcClient.cs

View workflow job for this annotation

GitHub Actions / Publish to nuget

Cannot convert null literal to non-nullable reference type.
{
MonitoredItem monitoredItem = CreateMonitoredItem(nodeEntry, handler: handler);
try
AddMonitoredItem(subscription, monitoredItem);
return monitoredItem;
}

public IEnumerable<MonitoredItem> AddMonitoredItems(
Subscription subscription,
ValueNodeEntryCollection nodeEntries,
bool globalCall = false,
IEnumerable<MonitoredNodeValueRecordEventHandler> handlers = null)

Check warning on line 1698 in src/ManagedOpcClient/AutabeeManagedOpcClient.cs

View workflow job for this annotation

GitHub Actions / Publish to nuget

Cannot convert null literal to non-nullable reference type.
{
IEnumerable<MonitoredItem> monitoredItems = new MonitoredItem[nodeEntries.Count];
if (handlers == null)
{
subscription.AddItem(monitoredItem);
subscription.ApplyChanges();
monitoredItems = nodeEntries.Select(o => CreateMonitoredItem(o, globalCall: globalCall));
}
catch (Exception)
else
{
throw;

if (nodeEntries.Count != handlers.Count()) throw new ArgumentException("The number of handlers must match the number of node ids");
var tmp = new MonitoredItem[nodeEntries.Count];
for (int i = 0; i < nodeEntries.Count; i++)
{
tmp[i] = CreateMonitoredItem(nodeEntries[i], handler: handlers.ElementAt(i));
}
monitoredItems = tmp;
}
return monitoredItem;
AddMonitoredItems(subscription, monitoredItems);
return monitoredItems;
}
public IEnumerable<MonitoredItem> AddMonitoredItems(
Subscription subscription,
ValueNodeEntryCollection nodeEntries,
bool globalCall = false,
MonitoredNodeValueRecordEventHandler handler = null)

Check warning on line 1723 in src/ManagedOpcClient/AutabeeManagedOpcClient.cs

View workflow job for this annotation

GitHub Actions / Publish to nuget

Cannot convert null literal to non-nullable reference type.
{
IEnumerable<MonitoredItem> monitoredItems = new MonitoredItem[nodeEntries.Count];
if (handler == null)
{
monitoredItems = nodeEntries.Select(o => CreateMonitoredItem(o, globalCall: globalCall));
}
else
{
monitoredItems = nodeEntries.Select(o => CreateMonitoredItem(o, handler: handler));
}
AddMonitoredItems(subscription, monitoredItems);
return monitoredItems;
}

public MonitoredItem AddMonitoredItem(
Subscription subscription,
NodeId nodeEntry,
MonitoredNodeValueEventHandler handler = null)
Subscription subscription,
NodeId nodeId,
MonitoredNodeValueEventHandler handler = null)

Check warning on line 1741 in src/ManagedOpcClient/AutabeeManagedOpcClient.cs

View workflow job for this annotation

GitHub Actions / Publish to nuget

Cannot convert null literal to non-nullable reference type.
{
MonitoredItem monitoredItem = CreateMonitoredItem(nodeEntry, handler: handler);
MonitoredItem monitoredItem = CreateMonitoredItem(nodeId, handler: handler);
AddMonitoredItem(subscription, monitoredItem);
return monitoredItem;
}
public IEnumerable<MonitoredItem> AddMonitoredItems(Subscription subscription, ValueNodeEntryCollection nodeEntrys)

public IEnumerable<MonitoredItem> AddMonitoredItems(
Subscription subscription,
NodeIdCollection nodeEntries,
bool globalCall = false,
IEnumerable<MonitoredNodeValueEventHandler> handlers = null)
{
IEnumerable<MonitoredItem> items = nodeEntrys.NodeEntries.Select(o => CreateMonitoredItem(o));
AddMonitoredItems(subscription, items);
return items;
IEnumerable<MonitoredItem> monitoredItems = new MonitoredItem[nodeEntries.Count];
if (handlers == null)
{
monitoredItems = nodeEntries.Select(o => CreateMonitoredItem(o, globalCall: globalCall));
}
else
{

if (nodeEntries.Count != handlers.Count()) throw new ArgumentException("The number of handlers must match the number of node ids");
var tmp = new MonitoredItem[nodeEntries.Count];
for (int i = 0; i < nodeEntries.Count; i++)
{
tmp[i] = CreateMonitoredItem(nodeEntries[i],handler: handlers.ElementAt(i));
}
monitoredItems = tmp;
}
AddMonitoredItems(subscription, monitoredItems);
return monitoredItems;
}
public IEnumerable<MonitoredItem> AddMonitoredItems(
Subscription subscription,
NodeIdCollection nodeEntries,
bool globalCall = false,
MonitoredNodeValueEventHandler handler = null)
{
IEnumerable<MonitoredItem> monitoredItems = new MonitoredItem[nodeEntries.Count];
if (handler == null)
{
monitoredItems = nodeEntries.Select(o => CreateMonitoredItem(o, globalCall: globalCall));
}
else
{
monitoredItems = nodeEntries.Select(o => CreateMonitoredItem(o, handler: handler));
}
AddMonitoredItems(subscription, monitoredItems);
return monitoredItems;
}

public void AddMonitoredItem(
Subscription subscription,
MonitoredItem item)
Expand All @@ -1727,6 +1803,7 @@ public void AddMonitoredItem(
throw;
}
}

public void AddMonitoredItems(
Subscription subscription,
IEnumerable<MonitoredItem> item)
Expand All @@ -1741,6 +1818,7 @@ public void AddMonitoredItems(
throw;
}
}

public Subscription GetSubscription(int publishingIntervalMilliSec)
{
var subscription = subscriptions.FirstOrDefault(o => o.PublishingInterval == publishingIntervalMilliSec);
Expand All @@ -1755,13 +1833,14 @@ public MonitoredItem CreateMonitoredItem(
uint queueSize = 1,
bool discardOldest = true,
bool globalCall = false,
MonitoringMode monitoringMode = MonitoringMode.Reporting,
MonitoredNodeValueRecordEventHandler handler = null)
{
if (handler == null && !globalCall)
{
throw new ArgumentNullException(nameof(handler), "Either handler or globalCall must be set");
}
MonitoredItem monitoredItem = CreateMonitoredItem(nodeEntry, samplingInterval, queueSize, discardOldest);
MonitoredItem monitoredItem = CreateMonitoredItem(nodeEntry, samplingInterval, queueSize, discardOldest, monitoringMode);
if (handler != null)
{
monitoredItem.Notification += (sender, arg) => MonitoredNode(sender, nodeEntry, arg, handler);
Expand All @@ -1779,13 +1858,14 @@ public MonitoredItem CreateMonitoredItem(
uint queueSize = 1,
bool discardOldest = true,
bool globalCall = false,
MonitoringMode monitoringMode = MonitoringMode.Reporting,
MonitoredNodeValueEventHandler handler = null)
{
if (handler == null && !globalCall)
{
throw new ArgumentNullException(nameof(handler), "Either handler or globalCall must be set");
}
MonitoredItem monitoredItem = CreateMonitoredItem(nodeId, samplingInterval, queueSize, discardOldest);
MonitoredItem monitoredItem = CreateMonitoredItem(nodeId, samplingInterval, queueSize, discardOldest, monitoringMode);
if (handler != null)
{
monitoredItem.Notification += (sender, arg) => MonitoredNode(sender, arg, handler);
Expand All @@ -1797,26 +1877,26 @@ public MonitoredItem CreateMonitoredItem(

return monitoredItem;
}
public static MonitoredItem CreateMonitoredItem(ValueNodeEntry nodeEntry, int samplingInterval, uint queueSize, bool discardOldest)
public static MonitoredItem CreateMonitoredItem(ValueNodeEntry nodeEntry, int samplingInterval, uint queueSize, bool discardOldest, MonitoringMode monitoringMode = MonitoringMode.Reporting)
{
MonitoredItem monitoredItem = new MonitoredItem();
monitoredItem.DisplayName = nodeEntry.NodeString;
monitoredItem.StartNodeId = nodeEntry.UnregisteredNodeId;
monitoredItem.StartNodeId = nodeEntry.GetNodeId();
monitoredItem.AttributeId = Attributes.Value;
monitoredItem.MonitoringMode = MonitoringMode.Reporting;
monitoredItem.MonitoringMode = monitoringMode;
monitoredItem.SamplingInterval = samplingInterval;
monitoredItem.QueueSize = queueSize;
monitoredItem.DiscardOldest = discardOldest;
return monitoredItem;
}

static public MonitoredItem CreateMonitoredItem(NodeId nodeId, int samplingInterval, uint queueSize, bool discardOldest)
static public MonitoredItem CreateMonitoredItem(NodeId nodeId, int samplingInterval, uint queueSize, bool discardOldest, MonitoringMode monitoringMode = MonitoringMode.Reporting)
{
MonitoredItem monitoredItem = new MonitoredItem();
monitoredItem.DisplayName = nodeId.ToString();
monitoredItem.StartNodeId = nodeId;
monitoredItem.AttributeId = Attributes.Value;
monitoredItem.MonitoringMode = MonitoringMode.Reporting;
monitoredItem.MonitoringMode = monitoringMode;
monitoredItem.SamplingInterval = samplingInterval;
monitoredItem.QueueSize = queueSize;
monitoredItem.DiscardOldest = discardOldest;
Expand Down Expand Up @@ -1849,15 +1929,15 @@ private void MonitoredNode(
{
if (!entry.IsUDT)
{
handler?.Invoke(monitorItem, CreateNodeValue(entry, ((MonitoredItemNotification)arg.NotificationValue).Value.Value));
handler?.Invoke(monitorItem, CreateNodeValue(entry, ((MonitoredItemNotification)arg.NotificationValue).Value.Value, ((MonitoredItemNotification)arg.NotificationValue).Value.ServerTimestamp));
}
else
{
// item.Decode(arg.NotificationValue);
ExtensionObject obj = ((ExtensionObject)((MonitoredItemNotification)arg.NotificationValue).Value.Value);
if (obj.Encoding == ExtensionObjectEncoding.Binary)
{
handler.Invoke(monitorItem, entry.CreateRecord(ConstructEncodable(entry, (byte[])obj.Body)));
handler.Invoke(monitorItem, entry.CreateRecord(ConstructEncodable(entry, (byte[])obj.Body), ((MonitoredItemNotification)arg.NotificationValue).Value.ServerTimestamp));
}
else
{
Expand Down
10 changes: 0 additions & 10 deletions src/ManagedOpcClient/AutabeeManagedOpcClientExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -404,16 +404,6 @@ public static MonitoredItem AddMonitoredItem(this AutabeeManagedOpcClient client
new NodeId(nodeId),
handler);

public static IEnumerable<MonitoredItem> AddMonitoredItems(this AutabeeManagedOpcClient client, TimeSpan publishingInterval, ValueNodeEntryCollection nodeEntrys)
=> client.AddMonitoredItems(
client.GetSubscription(publishingInterval),
nodeEntrys);

public static IEnumerable<MonitoredItem> AddMonitoredItems(this AutabeeManagedOpcClient client, int publishingIntervalMilliSec, ValueNodeEntryCollection nodeEntrys)
=> client.AddMonitoredItems(
client.GetSubscription(publishingIntervalMilliSec),
nodeEntrys);

public static Subscription GetSubscription(this AutabeeManagedOpcClient client, TimeSpan publishingInterval) => client.GetSubscription(publishingInterval.Milliseconds);
#endregion

Expand Down
11 changes: 8 additions & 3 deletions src/ManagedOpcClient/ManagedNode/NodeValueRecord.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,31 @@ namespace Autabee.Communication.ManagedOpcClient.ManagedNode
{
public class NodeValueRecord
{
public NodeValueRecord(ValueNodeEntry nodeEntry, object value)
public NodeValueRecord(ValueNodeEntry nodeEntry, object value, DateTime dateTime = default)
{


NodeEntry = nodeEntry;
Value = value;
TimeStamp = dateTime == default ? DateTime.UtcNow : dateTime;
}

public NodeValueRecord(string nodeId, object value)
public NodeValueRecord(string nodeId, object value, DateTime dateTime = default)
{
NodeEntry = new ValueNodeEntry(nodeId, value.GetType());
Value = value;
TimeStamp = dateTime == default ? DateTime.UtcNow : dateTime;
}

public ValueNodeEntry NodeEntry { get; protected set; }
public object Value { get; set; }
public DateTime TimeStamp { get; set; }

public Type ValueType { get => NodeEntry.Type; }

public override string ToString()
{
return $"[{NodeEntry}] {Value}";
return $"[{TimeStamp:O} | {NodeEntry}] {Value}";
}
}
}
Loading

0 comments on commit 14580ac

Please sign in to comment.