Skip to content

Commit de1ce93

Browse files
authored
Allow complex data type BoilerStatus to be written (#413)
* * Allow OPC UA Write to OverheatInterval, MaintenanceInterval and OverheatThresholdDegrees * restart timers for intervals * Add test to verify successful write and read of ParameterSet nodes * Update deprecated github actions * fix codeql compilation error * avoid compiler/lang features * Update version * Make ComplexType BoilerStatus writable * Increase version for next release * Rename test method * removed commend out code * update outdated nuget packages
1 parent 78db404 commit de1ce93

File tree

4 files changed

+33
-11
lines changed

4 files changed

+33
-11
lines changed

src/PluginNodes/ComplexTypeBoilerPluginNode.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,10 @@ private void AddNodes(FolderState methodsFolder)
5656
var passiveBoiler1Node = (BaseObjectState)_plcNodeManager.FindPredefinedNode(new NodeId(BoilerModel1.Objects.Boiler1, _plcNodeManager.NamespaceIndexes[(int)NamespaceType.Boiler]), typeof(BaseObjectState));
5757
var boilersNode = (BaseObjectState)_plcNodeManager.FindPredefinedNode(new NodeId(BoilerModel2.Objects.Boilers, _plcNodeManager.NamespaceIndexes[(int)NamespaceType.Boiler]), typeof(BaseObjectState));
5858
var boiler2Node = (BaseObjectState)_plcNodeManager.FindPredefinedNode(new NodeId(5017, _plcNodeManager.NamespaceIndexes[(int)NamespaceType.Boiler]), typeof(BaseObjectState));
59-
59+
60+
var boilerStatus = (BaseDataVariableState)_plcNodeManager.FindPredefinedNode(ExpandedNodeId.ToNodeId(BoilerModel1.VariableIds.Boiler1_BoilerStatus, _plcNodeManager.Server.NamespaceUris), typeof(BaseDataVariableState));
61+
AllowReadAndWrite(boilerStatus);
62+
6063
// Convert to node that can be manipulated within the server.
6164
_node = new Boiler1State(null);
6265
_node.Create(_plcNodeManager.SystemContext, passiveBoiler1Node);
@@ -191,5 +194,12 @@ private ServiceResult OnHeaterOffCall(ISystemContext context, MethodState method
191194
_node.BoilerStatus.Value.HeaterState = BoilerHeaterStateType.Off;
192195
_logger.LogDebug("OnHeaterOffCall method called");
193196
return ServiceResult.Good;
197+
}
198+
private void AllowReadAndWrite(BaseDataVariableState variable)
199+
{
200+
variable.Timestamp = _timeService.Now();
201+
variable.AccessLevel = AccessLevels.CurrentReadOrWrite;
202+
variable.UserAccessLevel = AccessLevels.CurrentReadOrWrite;
203+
variable.ClearChangeMasks(_plcNodeManager.SystemContext, includeChildren: false);
194204
}
195205
}

src/opc-plc.csproj

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@
2525
<FrameworkReference Include="Microsoft.AspNetCore.App" />
2626
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.1" />
2727
<PackageReference Include="Mono.Options" Version="6.12.0.148" />
28-
<PackageReference Include="OpenTelemetry" Version="1.10.0" />
29-
<PackageReference Include="OpenTelemetry.Api" Version="1.10.0" />
30-
<PackageReference Include="OpenTelemetry.Api.ProviderBuilderExtensions" Version="1.10.0" />
31-
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.10.0" />
32-
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.10.0" />
33-
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.10.0" />
34-
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.9.0" />
35-
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.10.0" />
36-
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.10.0" />
28+
<PackageReference Include="OpenTelemetry" Version="1.11.2" />
29+
<PackageReference Include="OpenTelemetry.Api" Version="1.11.2" />
30+
<PackageReference Include="OpenTelemetry.Api.ProviderBuilderExtensions" Version="1.11.2" />
31+
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.11.2" />
32+
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.11.2" />
33+
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.11.2" />
34+
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.11.1" />
35+
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.11.1" />
36+
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.11.1" />
3737
<PackageReference Include="Serilog.Extensions.Logging.File" Version="3.0.0" />
3838
<PackageReference Update="Microsoft.SourceLink.GitHub" Version="8.0.0" />
3939
<PackageReference Update="Nerdbank.GitVersioning" Version="3.7.115" />

tests/BoilerTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,18 @@ public void Heater_WhenStopped_HasFallingPressure()
115115
pressure.Should().BeLessThan(previousPressure, "pressure should drop when heater is off");
116116
previousPressure = pressure;
117117
}
118+
}
119+
120+
[TestCase]
121+
public void Heater_CanbeWritten()
122+
{
123+
var newValue = GetBoilerModel();
124+
newValue.Pressure = 42_000;
125+
var nodeId = NodeId.Create(BoilerModel1.Variables.Boiler1_BoilerStatus, OpcPlc.Namespaces.OpcPlcBoiler, Session.NamespaceUris);
126+
var statusCode = WriteValue(nodeId, newValue);
127+
statusCode.Should().Be(StatusCodes.Good);
128+
var currentValue = GetBoilerModel();
129+
currentValue.Pressure.Should().Be(newValue.Pressure);
118130
}
119131

120132
private void TurnHeaterOn()

version.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"$schema": "https://raw.githubusercontent.com/AArnott/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json",
3-
"version": "2.12.30",
3+
"version": "2.12.31",
44
"versionHeightOffset": -1,
55
"publicReleaseRefSpec": [
66
"^refs/heads/main$",

0 commit comments

Comments
 (0)