Added Kaco inverter implementation

- Added Kaco inverter implementation
- Small refactoring
- Added release inverter power signal for simultaneous start of the
  inverters
This commit is contained in:
Matthias Heisig
2025-08-11 23:26:40 +09:00
parent 6f97c1aa6b
commit 9c6e28b83d
20 changed files with 1426 additions and 1665 deletions

View File

@@ -9,7 +9,7 @@
<WriteProductVersion>true</WriteProductVersion>
<GenerateTpy>false</GenerateTpy>
<Name>PLC</Name>
<ProgramVersion>3.1.4026.15</ProgramVersion>
<ProgramVersion>3.1.4026.17</ProgramVersion>
<Application>{afd0b275-de2f-4006-ab0f-6826ccfce7be}</Application>
<TypeSystem>{18a2eab9-0077-4cea-9d3b-9a168bdf0814}</TypeSystem>
<Implicit_Task_Info>{6e35f35d-280b-4da2-9c5b-fc35ab6da425}</Implicit_Task_Info>
@@ -28,7 +28,6 @@
</DeploymentEvents>
<Company>CMBlu Energy AG</Company>
<Released>false</Released>
<AllowChecksForLibrary>false</AllowChecksForLibrary>
<POUsForPropertyAccessIncluded>false</POUsForPropertyAccessIncluded>
<GlobalVersionStructureIncluded>false</GlobalVersionStructureIncluded>
<Title>Uniper</Title>
@@ -149,6 +148,7 @@
</Compile>
<Compile Include="POUs\FB_UMD705.TcPOU">
<SubType>Code</SubType>
<ExcludeFromBuild>true</ExcludeFromBuild>
</Compile>
<Compile Include="POUs\FB_Unit.TcPOU">
<SubType>Code</SubType>
@@ -156,31 +156,34 @@
<Compile Include="POUs\MAIN.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Sunspec\FB_PowerSupplyKaco.TcPOU">
<Compile Include="POUs\Sunspec\Kaco\E_KACO_CURRENT_STATE.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Sunspec\FB_PowerSupplySunspec.TcPOU">
<Compile Include="POUs\Sunspec\Kaco\E_KACO_PCU_ERROR.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Sunspec\ModelData\ST_SunspecInverterThreePhase.TcDUT">
<Compile Include="POUs\Sunspec\Kaco\E_KACO_PCU_STATE.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Sunspec\ModelData\ST_SunspecNameplateRatings.TcDUT">
<Compile Include="POUs\Sunspec\Kaco\FB_PowerSupplyKaco.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Sunspec\StatePattern\StateEvents\I_SunspecStateEvents.TcIO">
<Compile Include="POUs\Sunspec\Kaco\ST_KACU_PCU.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Sunspec\StatePattern\States\FB_SunspecErrorState.TcPOU">
<Compile Include="POUs\Sunspec\Refu\FB_PowerSupplySunspec.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Sunspec\StatePattern\States\FB_SunspecOffState.TcPOU">
<Compile Include="POUs\Sunspec\Refu\ModelData\ST_SunspecInverterThreePhase.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Sunspec\ST_SUNSPEC_CURRENT_VALUES.TcDUT">
<Compile Include="POUs\Sunspec\Refu\ModelData\ST_SunspecNameplateRatings.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Sunspec\U_SUNSPEC_ERROR.TcDUT">
<Compile Include="POUs\Sunspec\Refu\ST_SUNSPEC_CURRENT_VALUES.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\Sunspec\Refu\U_SUNSPEC_ERROR.TcDUT">
<SubType>Code</SubType>
</Compile>
</ItemGroup>
@@ -191,12 +194,9 @@
<Folder Include="DUTs\Modbus\ErrorWarningRegisters" />
<Folder Include="GVLs" />
<Folder Include="POUs\Sunspec" />
<Folder Include="POUs\Sunspec\ModelData" />
<Folder Include="POUs\Sunspec\StatePattern">
<ExcludeFromBuild>true</ExcludeFromBuild>
</Folder>
<Folder Include="POUs\Sunspec\StatePattern\StateEvents" />
<Folder Include="POUs\Sunspec\StatePattern\States" />
<Folder Include="POUs\Sunspec\Kaco" />
<Folder Include="POUs\Sunspec\Refu" />
<Folder Include="POUs\Sunspec\Refu\ModelData" />
<Folder Include="VISUs" />
<Folder Include="POUs" />
</ItemGroup>
@@ -237,6 +237,12 @@
<DefaultResolution>Tc3_Module, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc3_Module</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="UML State Chart Types">
<DefaultResolution>UML Statechart Types, 4.2.2.0 (3S - Smart Software Solutions GmbH)</DefaultResolution>
<Namespace>UML_SC</Namespace>
<SystemLibrary>true</SystemLibrary>
<ResolverGuid>d9a6b70a-92f0-4827-8ca3-8ce8a61652d9</ResolverGuid>
</PlaceholderReference>
</ItemGroup>
<ItemGroup>
<None Include="PLC.tmc">
@@ -261,7 +267,7 @@
<d n="SubKeys" t="Hashtable" />
<d n="Values" t="Hashtable" ckt="String" cvt="String">
<v>CurrentUmlCompilerVersion</v>
<v>4.2.1.0</v>
<v>4.4.0.0</v>
</d>
</o>
<v>{246001F4-279D-43AC-B241-948EB31120E1}</v>
@@ -2610,7 +2616,7 @@
<d n="SubKeys" t="Hashtable" />
<d n="Values" t="Hashtable" ckt="String" cvt="String">
<v>ActiveVisuProfile</v>
<v>IR0whWr8bwcQCAAAY7rhNAAAAACAAgAAGMPQIgAAAAABAAAAAAAAAAEaUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwACTHsAZgA5ADUAYgBiADQAMgA2AC0ANQA1ADIANAAtADQAYgA0ADUALQA5ADQAMAAwAC0AZgBiADAAZgAyAGUANwA3AGUANQAxAGIAfQADCE4AYQBtAGUABDBUAHcAaQBuAEMAQQBUACAAMwAuADEAIABCAHUAaQBsAGQAIAA0ADAAMgA2AC4ANwAFFlAAcgBvAGYAaQBsAGUARABhAHQAYQAGTHsAMQA2AGUANQA1AGIANgAwAC0ANwAwADQAMwAtADQAYQA2ADMALQBiADYANQBiAC0ANgAxADQANwAxADMAOAA3ADgAZAA0ADIAfQAHEkwAaQBiAHIAYQByAGkAZQBzAAhMewAzAGIAZgBkADUANAA1ADkALQBiADAANwBmAC0ANABkADYAZQAtAGEAZQAxAGEALQBhADgAMwAzADUANgBhADUANQAxADQAMgB9AAlMewA5AGMAOQA1ADgAOQA2ADgALQAyAGMAOAA1AC0ANAAxAGIAYgAtADgAOAA3ADEALQA4ADkANQBmAGYAMQBmAGUAZABlADEAYQB9AAoOVgBlAHIAcwBpAG8AbgALBmkAbgB0AAwKVQBzAGEAZwBlAA0KVABpAHQAbABlAA4aVgBpAHMAdQBFAGwAZQBtAE0AZQB0AGUAcgAPDkMAbwBtAHAAYQBuAHkAEAxTAHkAcwB0AGUAbQARElYAaQBzAHUARQBsAGUAbQBzABIwVgBpAHMAdQBFAGwAZQBtAHMAUwBwAGUAYwBpAGEAbABDAG8AbgB0AHIAbwBsAHMAEyhWAGkAcwB1AEUAbABlAG0AcwBXAGkAbgBDAG8AbgB0AHIAbwBsAHMAFCRWAGkAcwB1AEUAbABlAG0AVABlAHgAdABFAGQAaQB0AG8AcgAVIlYAaQBzAHUATgBhAHQAaQB2AGUAQwBvAG4AdAByAG8AbAAWHlYAaQBzAHUARQBsAGUAbQBYAFkAQwBoAGEAcgB0ABcUVgBpAHMAdQBJAG4AcAB1AHQAcwAYGFYAaQBzAHUARQBsAGUAbQBCAGEAcwBlABkmRABlAHYAUABsAGEAYwBlAGgAbwBsAGQAZQByAHMAVQBzAGUAZAAaCGIAbwBvAGwAGyJQAGwAdQBnAGkAbgBDAG8AbgBzAHQAcgBhAGkAbgB0AHMAHEx7ADQAMwBkADUAMgBiAGMAZQAtADkANAAyAGMALQA0ADQAZAA3AC0AOQBlADkANAAtADEAYgBmAGQAZgAzADEAMABlADYAMwBjAH0AHRxBAHQATABlAGEAcwB0AFYAZQByAHMAaQBvAG4AHhRQAGwAdQBnAGkAbgBHAHUAaQBkAB8WUwB5AHMAdABlAG0ALgBHAHUAaQBkACBIYQBmAGMAZAA1ADQANAA2AC0ANAA5ADEANAAtADQAZgBlADcALQBiAGIANwA4AC0AOQBiAGYAZgBlAGIANwAwAGYAZAAxADcAIRRVAHAAZABhAHQAZQBJAG4AZgBvACJMewBiADAAMwAzADYANgBhADgALQBiADUAYwAwAC0ANABiADkAYQAtAGEAMAAwAGUALQBlAGIAOAA2ADAAMQAxADEAMAA0AGMAMwB9ACMOVQBwAGQAYQB0AGUAcwAkTHsAMQA4ADYAOABmAGYAYwA5AC0AZQA0AGYAYwAtADQANQAzADIALQBhAGMAMAA2AC0AMQBlADMAOQBiAGIANQA1ADcAYgA2ADkAfQAlTHsAYQA1AGIAZAA0ADgAYwAzAC0AMABkADEANwAtADQAMQBiADUALQBiADEANgA0AC0ANQBmAGMANgBhAGQAMgBiADkANgBiADcAfQAmFk8AYgBqAGUAYwB0AHMAVAB5AHAAZQAnVFUAcABkAGEAdABlAEwAYQBuAGcAdQBhAGcAZQBNAG8AZABlAGwARgBvAHIAQwBvAG4AdgBlAHIAdABpAGIAbABlAEwAaQBiAHIAYQByAGkAZQBzACgQTABpAGIAVABpAHQAbABlACkUTABpAGIAQwBvAG0AcABhAG4AeQAqHlUAcABkAGEAdABlAFAAcgBvAHYAaQBkAGUAcgBzACs4UwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAsEnYAaQBzAHUAZQBsAGUAbQBzAC0McwB5AHMAdABlAG0ALkg2AGMAYgAxAGMAZABlADEALQBkADUAZABjAC0ANABhADMAYgAtADkAMAA1ADQALQAyADEAZgBhADcANQA2AGEAMwBmAGEANAAvKEkAbgB0AGUAcgBmAGEAYwBlAFYAZQByAHMAaQBvAG4ASQBuAGYAbwAwTHsAYwA2ADEAMQBlADQAMAAwAC0ANwBmAGIAOQAtADQAYwAzADUALQBiADkAYQBjAC0ANABlADMAMQA0AGIANQA5ADkANgA0ADMAfQAxGE0AYQBqAG8AcgBWAGUAcgBzAGkAbwBuADIYTQBpAG4AbwByAFYAZQByAHMAaQBvAG4AMwxMAGUAZwBhAGMAeQA0MEwAYQBuAGcAdQBhAGcAZQBNAG8AZABlAGwAVgBlAHIAcwBpAG8AbgBJAG4AZgBvADUwTABvAGEAZABMAGkAYgByAGEAcgBpAGUAcwBJAG4AdABvAFAAcgBvAGoAZQBjAHQANhpDAG8AbQBwAGEAdABpAGIAaQBsAGkAdAB5ANAAAhoD0AMBLQTQBQYaB9AHCBoBRQcJCdAACRoERQoLBAQAAAAGAAAAAAAAAAAAAADQDAutAgAAANANAS0O0A8BLRDQAAkaBEUKCwQEAAAABgAAAAAAAAAAAAAA0AwLrQEAAADQDQEtEdAPAS0Q0AAJGgRFCgsEBAAAAAYAAAAAAAAAAAAAANAMC60CAAAA0A0BLRLQDwEtENAACRoERQoLBAQAAAAGAAAAAAAAAAAAAADQDAutAgAAANANAS0T0A8BLRDQAAkaBEUKCwQEAAAABgAAAAAAAAAAAAAA0AwLrQIAAADQDQEtFNAPAS0Q0AAJGgRFCgsEBAAAAAYAAAAAAAAAAAAAANAMC60CAAAA0A0BLRXQDwEtENAACRoERQoLBAQAAAAGAAAAAAAAAAAAAADQDAutAgAAANANAS0W0A8BLRDQAAkaBEUKCwQEAAAABgAAAAAAAAAAAAAA0AwLrQIAAADQDQEtF9APAS0Q0AAJGgRFCgsEBAAAAAYAAAAAAAAAAAAAANAMC60EAAAA0A0BLRjQDwEtENAZGq0BRRscAdAAHBoCRR0LBAQAAAACAAAAAAAAAAAAAADQHh8tINAhIhoCRSMkAtAAJRoFRQoLBAMAAAADAAAAAAAAAAoAAADQJgutAAAAANADAS0n0CgBLRHQKQEtENAAJRoFRQoLBAMAAAADAAAAAAAAAAoAAADQJgutAQAAANADAS0n0CgBLRHQKQEtEJoqKwFFAAEC0AABLSzQAAEtLdAAHy0u0C8wGgPQMQutAQAAANAyC60jAAAA0DMarQDQNDAaA9AxC60CAAAA0DILrQYAAADQMxqtANA1Gq0A0DYarQA=</v>
<v>IR0whWr8bwfyBwAAaCbC8QAAAABVAgAA1xHl6QAAAAABAAAAAAAAAAEaUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwACTHsAZgA5ADUAYgBiADQAMgA2AC0ANQA1ADIANAAtADQAYgA0ADUALQA5ADQAMAAwAC0AZgBiADAAZgAyAGUANwA3AGUANQAxAGIAfQADCE4AYQBtAGUABDJUAHcAaQBuAEMAQQBUACAAMwAuADEAIABCAHUAaQBsAGQAIAA0ADAAMgA2AC4AMQA1AAUWUAByAG8AZgBpAGwAZQBEAGEAdABhAAZMewAxADYAZQA1ADUAYgA2ADAALQA3ADAANAAzAC0ANABhADYAMwAtAGIANgA1AGIALQA2ADEANAA3ADEAMwA4ADcAOABkADQAMgB9AAcSTABpAGIAcgBhAHIAaQBlAHMACEx7ADMAYgBmAGQANQA0ADUAOQAtAGIAMAA3AGYALQA0AGQANgBlAC0AYQBlADEAYQAtAGEAOAAzADMANQA2AGEANQA1ADEANAAyAH0ACUx7ADkAYwA5ADUAOAA5ADYAOAAtADIAYwA4ADUALQA0ADEAYgBiAC0AOAA4ADcAMQAtADgAOQA1AGYAZgAxAGYAZQBkAGUAMQBhAH0ACg5WAGUAcgBzAGkAbwBuAAsGaQBuAHQADApVAHMAYQBnAGUADQpUAGkAdABsAGUADhpWAGkAcwB1AEUAbABlAG0ATQBlAHQAZQByAA8OQwBvAG0AcABhAG4AeQAQDFMAeQBzAHQAZQBtABESVgBpAHMAdQBFAGwAZQBtAHMAEjBWAGkAcwB1AEUAbABlAG0AcwBTAHAAZQBjAGkAYQBsAEMAbwBuAHQAcgBvAGwAcwATKFYAaQBzAHUARQBsAGUAbQBzAFcAaQBuAEMAbwBuAHQAcgBvAGwAcwAUJFYAaQBzAHUARQBsAGUAbQBUAGUAeAB0AEUAZABpAHQAbwByABUiVgBpAHMAdQBOAGEAdABpAHYAZQBDAG8AbgB0AHIAbwBsABYUVgBpAHMAdQBJAG4AcAB1AHQAcwAXGFYAaQBzAHUARQBsAGUAbQBCAGEAcwBlABgmRABlAHYAUABsAGEAYwBlAGgAbwBsAGQAZQByAHMAVQBzAGUAZAAZCGIAbwBvAGwAGiJQAGwAdQBnAGkAbgBDAG8AbgBzAHQAcgBhAGkAbgB0AHMAG0x7ADQAMwBkADUAMgBiAGMAZQAtADkANAAyAGMALQA0ADQAZAA3AC0AOQBlADkANAAtADEAYgBmAGQAZgAzADEAMABlADYAMwBjAH0AHBxBAHQATABlAGEAcwB0AFYAZQByAHMAaQBvAG4AHRRQAGwAdQBnAGkAbgBHAHUAaQBkAB4WUwB5AHMAdABlAG0ALgBHAHUAaQBkAB9IYQBmAGMAZAA1ADQANAA2AC0ANAA5ADEANAAtADQAZgBlADcALQBiAGIANwA4AC0AOQBiAGYAZgBlAGIANwAwAGYAZAAxADcAIBRVAHAAZABhAHQAZQBJAG4AZgBvACFMewBiADAAMwAzADYANgBhADgALQBiADUAYwAwAC0ANABiADkAYQAtAGEAMAAwAGUALQBlAGIAOAA2ADAAMQAxADEAMAA0AGMAMwB9ACIOVQBwAGQAYQB0AGUAcwAjTHsAMQA4ADYAOABmAGYAYwA5AC0AZQA0AGYAYwAtADQANQAzADIALQBhAGMAMAA2AC0AMQBlADMAOQBiAGIANQA1ADcAYgA2ADkAfQAkTHsAYQA1AGIAZAA0ADgAYwAzAC0AMABkADEANwAtADQAMQBiADUALQBiADEANgA0AC0ANQBmAGMANgBhAGQAMgBiADkANgBiADcAfQAlFk8AYgBqAGUAYwB0AHMAVAB5AHAAZQAmVFUAcABkAGEAdABlAEwAYQBuAGcAdQBhAGcAZQBNAG8AZABlAGwARgBvAHIAQwBvAG4AdgBlAHIAdABpAGIAbABlAEwAaQBiAHIAYQByAGkAZQBzACcQTABpAGIAVABpAHQAbABlACgUTABpAGIAQwBvAG0AcABhAG4AeQApHlUAcABkAGEAdABlAFAAcgBvAHYAaQBkAGUAcgBzACo4UwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQArEnYAaQBzAHUAZQBsAGUAbQBzACwMcwB5AHMAdABlAG0ALUg2AGMAYgAxAGMAZABlADEALQBkADUAZABjAC0ANABhADMAYgAtADkAMAA1ADQALQAyADEAZgBhADcANQA2AGEAMwBmAGEANAAuKEkAbgB0AGUAcgBmAGEAYwBlAFYAZQByAHMAaQBvAG4ASQBuAGYAbwAvTHsAYwA2ADEAMQBlADQAMAAwAC0ANwBmAGIAOQAtADQAYwAzADUALQBiADkAYQBjAC0ANABlADMAMQA0AGIANQA5ADkANgA0ADMAfQAwGE0AYQBqAG8AcgBWAGUAcgBzAGkAbwBuADEYTQBpAG4AbwByAFYAZQByAHMAaQBvAG4AMgxMAGUAZwBhAGMAeQAzMEwAYQBuAGcAdQBhAGcAZQBNAG8AZABlAGwAVgBlAHIAcwBpAG8AbgBJAG4AZgBvADQwTABvAGEAZABMAGkAYgByAGEAcgBpAGUAcwBJAG4AdABvAFAAcgBvAGoAZQBjAHQANRpDAG8AbQBwAGEAdABpAGIAaQBsAGkAdAB5ANAAAhoD0AMBLQTQBQYaB9AHCBoBRQcJCNAACRoERQoLBAQAAAAHAAAAAAAAAAAAAADQDAutAgAAANANAS0O0A8BLRDQAAkaBEUKCwQEAAAABwAAAAAAAAAAAAAA0AwLrQEAAADQDQEtEdAPAS0Q0AAJGgRFCgsEBAAAAAcAAAAAAAAAAAAAANAMC60CAAAA0A0BLRLQDwEtENAACRoERQoLBAQAAAAHAAAAAAAAAAAAAADQDAutAgAAANANAS0T0A8BLRDQAAkaBEUKCwQEAAAABwAAAAAAAAAAAAAA0AwLrQIAAADQDQEtFNAPAS0Q0AAJGgRFCgsEBAAAAAcAAAAAAAAAAAAAANAMC60CAAAA0A0BLRXQDwEtENAACRoERQoLBAQAAAAHAAAAAAAAAAAAAADQDAutAgAAANANAS0W0A8BLRDQAAkaBEUKCwQEAAAABwAAAAAAAAAAAAAA0AwLrQQAAADQDQEtF9APAS0Q0BgZrQFFGhsB0AAbGgJFHAsEBAAAAAIAAAAAAAAAAAAAANAdHi0f0CAhGgJFIiMC0AAkGgVFCgsEAwAAAAMAAAAAAAAACgAAANAlC60AAAAA0AMBLSbQJwEtEdAoAS0Q0AAkGgVFCgsEAwAAAAMAAAAAAAAACgAAANAlC60BAAAA0AMBLSbQJwEtEdAoAS0QmikqAUUAAQLQAAEtK9AAAS0s0AAeLS3QLi8aA9AwC60BAAAA0DELrSQAAADQMhmtANAzLxoD0DALrQIAAADQMQutBgAAANAyGa0A0DQZrQDQNRmtAA==</v>
</d>
</o>
<v>{8A0FB252-96EB-4DCC-A5B4-B4804D05E2D6}</v>

File diff suppressed because one or more lines are too long

View File

@@ -1,11 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.8">
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<POU Name="FB_String" Id="{46501225-f446-4674-bfed-3be64273e576}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_String
VAR_INPUT
// Enable
xEnable : BOOL;
// Release inverter power
xReleaseInverterPower : BOOL;
// String number for unit numbering starting with 0 for String 1
uiStringNumber : UINT;
@@ -176,8 +179,8 @@ VAR
_sName : STRING;
// String inverter
_fbInverter : FB_PowerSupplySunspec(Name);
//_fbInverter : FB_PowerSupplyKaco(Name);
//_fbInverter : FB_PowerSupplySunspec(Name);
_fbInverter : FB_PowerSupplyKaco(Name);
// Internal inverter power command
_rPowerInverterInternal : REAL;
@@ -378,6 +381,7 @@ xOff := _fbModule1.xOff AND _fbModule2.xOff AND _fbModule3.xOff;
_fbInverter(
sInverterIPAddr:= sInverterIP,
xEnable:= _xEnableInverter AND xEmergencyStopOk,
xReleasePower := xReleaseInverterPower,
rPower:= _rPowerInverterInternal,
xReset:= xConfirmAlarms,
rMaxBattPower:= DINT_TO_REAL(GVL_CONFIG.diMaxStringDischargePower),

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<POU Name="FB_UMD705" Id="{e3557e0d-5497-476d-aba3-e3a1e4ffd057}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_UMD705
VAR_INPUT
@@ -43,14 +43,5 @@ IF _xExecute THEN
_xExecute := FALSE;
END_IF]]></ST>
</Implementation>
<LineIds Name="FB_UMD705">
<LineId Id="21" Count="0" />
<LineId Id="24" Count="11" />
<LineId Id="23" Count="0" />
<LineId Id="22" Count="0" />
<LineId Id="17" Count="1" />
<LineId Id="9" Count="0" />
<LineId Id="19" Count="1" />
</LineIds>
</POU>
</TcPlcObject>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.8">
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<POU Name="MAIN" Id="{bbd7302c-91ce-4697-9f4b-743f57ca5819}" SpecialFunc="None">
<Declaration><![CDATA[PROGRAM MAIN
VAR
@@ -9,6 +9,7 @@ VAR
_xReleaseLimitsErrors : BOOL := TRUE;
_xConfirmAlarms : BOOL;
_xEnableString : BOOL;
_xReleaseInverterPower : BOOL;
_xStartBalancing : BOOL;
_xCanChangeMode : BOOL := TRUE;
@@ -362,6 +363,7 @@ END_IF
// Call string 1
_afbStrings[0](
xEnable := _xEnableString AND GVL_CONFIG.axStringEnabled[0],
xReleaseInverterPower := _xReleaseInverterPower,
uiStringNumber := 0,
eOperationMode := _eStringOpMode,
xErrorShutdown := _xErrorShutdown,
@@ -414,6 +416,7 @@ GVL_MODBUS.stBMSErrorReg.wBMSWarningActive.stBitmap.bTCabinetSCSString1High := _
// Call string 2
_afbStrings[1](
xEnable := _xEnableString AND GVL_CONFIG.axStringEnabled[1],
xReleaseInverterPower := _xReleaseInverterPower,
uiStringNumber := 1,
eOperationMode := _eStringOpMode,
xErrorShutdown := _xErrorShutdown,
@@ -923,6 +926,7 @@ _fbPowerMeter24V();]]></ST>
// Wait for power command
IF (ABS(_rAutoPowerRequest) > DINT_TO_REAL(GVL_CONFIG.diMinimumAbsPowerForEnable)) AND (NOT _xStringsErrorActive) AND _xStringsAllInAutomaticMode AND (NOT _xEMSHeartbeatNotOK) THEN
_iState := 5;
_xReleaseInverterPower := FALSE;
_xCanChangeMode := FALSE;
_xErrorShutdown := FALSE;
END_IF
@@ -974,6 +978,7 @@ _fbPowerMeter24V();]]></ST>
30: // String and inverter enabled
// Set inverter power to modbus requested power
_rPowerInverter := _rAutoPowerRequest;
_xReleaseInverterPower := TRUE;
// Check if the battery should still be active
IF (_rAutoPowerRequest = 0.0) THEN
@@ -1078,6 +1083,7 @@ _fbPowerMeter24V();]]></ST>
// Check for errors
IF _xStringsErrorActive OR _xEMSHeartbeatNotOK THEN
_xReleaseInverterPower := FALSE;
_xEnableString := FALSE;
_xErrorShutdown := TRUE;
_tonBeginShutdown(In := FALSE);
@@ -1092,6 +1098,7 @@ _fbPowerMeter24V();]]></ST>
IF GVL_CONFIG.xShutdownDischargeWithInverter THEN
_iState := 40;
ELSE
_xReleaseInverterPower := FALSE;
_rPowerInverter := 0.0;
_xEnableString := FALSE;
GVL_SCADA.stAutomaticModeHMI.diSetpointAutomatic := 0;
@@ -1112,6 +1119,7 @@ _fbPowerMeter24V();]]></ST>
IF _xStringsShutdownDischargeAllowed OR _xEMSHeartbeatNotOK THEN
_rPowerInverter := GVL_CONFIG.rAbsShutdownDischargePower;
ELSE
_xReleaseInverterPower := FALSE;
_xGetPowerMeterData := TRUE;
GVL_MODBUS.stModbusEMSComm.stModbusReg10.uiActiveParallelMembers := 0;
_rPowerInverter := 0.0;
@@ -1155,6 +1163,7 @@ _fbPowerMeter24V();]]></ST>
1000: // Error state
GVL_MODBUS.stModbusEMSComm.stModbusReg10.uiActiveParallelMembers := 0;
_xReleaseInverterPower := FALSE;
_xEnableString := FALSE;
_rPowerInverter := 0.0;
GVL_MODBUS.stModbusEMSComm.stModbusReg11.eBatteryStatus := E_BATTERY_STATUS.ERROR;
@@ -1210,6 +1219,7 @@ END_IF
<ST><![CDATA[CASE _iStateBalancing OF
0: // Test
IF GVL_SCADA.stAutomaticModeHMI.stStartAutoButton.xRequest THEN
_xReleaseInverterPower := FALSE;
_iStateBalancing := 5;
END_IF
@@ -1256,7 +1266,8 @@ END_CASE]]></ST>
</Action>
<Action Name="SM_MANUAL" Id="{ddef276e-9f4f-4258-b863-d254dd94b701}">
<Implementation>
<ST><![CDATA[_xCanChangeMode := TRUE;]]></ST>
<ST><![CDATA[_xCanChangeMode := TRUE;
_xReleaseInverterPower := FALSE;]]></ST>
</Implementation>
</Action>
<Action Name="SM_PRECHARGE" Id="{b84aedc8-0039-40a2-8abe-a166eca7bebc}">
@@ -1282,6 +1293,7 @@ CASE _iStatePrecharge OF
IF _xStartPrecharge AND _xStringsAllInAutomaticMode THEN
_xEnableString := TRUE;
_iStatePrecharge := 10;
_xReleaseInverterPower := FALSE;
_rPowerInverter := 0.0;
_xCanChangeMode := FALSE;
END_IF
@@ -1374,6 +1386,7 @@ CASE _iStateSafetyCheck OF
// Wait for start command
IF _xStartSafetyCheck AND _xStringsAllInAutomaticMode THEN
_xEnableString := TRUE;
_xReleaseInverterPower := FALSE;
_iStateSafetyCheck := 10;
_rPowerInverter := 0.0;
_xCanChangeMode := FALSE;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<DUT Name="E_KACO_CURRENT_STATE" Id="{2acb7f0e-c391-4c10-827a-e41a4c5478d9}">
<Declaration><![CDATA[{attribute 'qualified_only'}
{attribute 'strict'}
{attribute 'to_string'}
TYPE E_KACO_CURRENT_STATE :
(
OFF := 1,
SLEEPING := 2,
STARTING := 3,
MPPT := 4,
THROTTLED := 5,
SHUTTING_DOWN := 6,
FAULT := 7,
STANDBY := 8,
PRECHARGE := 9,
GRID_PRE_CONNECTED := 10,
GRID_CONNECTED := 11,
NO_ERROR_PENDING := 12
);
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<DUT Name="E_KACO_PCU_ERROR" Id="{9d943541-7a37-4e53-993d-e5fb676cf523}">
<Declaration><![CDATA[{attribute 'qualified_only'}
{attribute 'strict'}
{attribute 'to_string'}
TYPE E_KACO_PCU_ERROR :
(
NO_EVENT := 0,
OVER_TEMP := 1,
OVER_VOLT := 2,
UNDER_VOLT := 3,
BATT_POL_INCORREC := 4,
COUNTER_TOO_HIGH := 5,
DURING_PRECHARGE := 6,
BATT_VOLT_OUT_OF_RANGE := 7,
I2C_COMM := 8,
CAN_COMM := 9,
SWITCH_OFF_AC_DSP := 10
);
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<DUT Name="E_KACO_PCU_STATE" Id="{d3455f44-85c3-4eb1-962f-0096c587ed27}">
<Declaration><![CDATA[{attribute 'qualified_only'}
{attribute 'strict'}
{attribute 'to_string'}
TYPE E_KACO_PCU_STATE :
(
WAIT_FOR_STARTUP :=1,
STANDBY :=2,
SWITCH_REL_MINUS :=3,
SWITCH_REL_PRECHARGE :=4,
SWITCH_REL_PLUS :=5,
RUNNING :=6,
COOLDOWN :=7,
ERROR :=8,
CLEAR_ERROR :=9
);
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,848 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<POU Name="FB_PowerSupplyKaco" Id="{43c28077-20d6-4076-bde1-bc92c785654f}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_PowerSupplyKaco
VAR_INPUT
sInverterIPAddr : STRING;
xEnable : BOOL;
xReleasePower : BOOL;
rPower : REAL;
xReset : BOOL;
rMaxBattPower : REAL := 40_000; // 24kW
END_VAR
VAR_OUTPUT
// Inverter active
xActive : BOOL;
// FB error
xError : BOOL;
// Heartbeat ok signal
xHeartbeatOk : BOOL := TRUE;
// Current inverter values
stCurrentValues : ST_SUNSPEC_CURRENT_VALUES;
END_VAR
VAR
// Battery limits
// 0 - Min discharge voltage
// 1 - Max discharge current
// 2 - Discharge cutoff amp -> 0 = off
// 3 - Max charge voltage
// 4 - Max chrage current
// 5 - Charge cutoff amp -> 0 = off
_auiBatteryLimitValues : ARRAY[0..5] OF UINT := [6600, 300, 0, 9600, 300, 0];
// Current state
_iState : INT := 0;
// State for startup state machine
_iStateStartup : INT := 0;
// Startup busy flag
_xStartupBusy : BOOL;
// Internal power command
_rPowerInternal : REAL := 0;
// Enum for requested state
_eRequestedState : (OFF := 1, STANDBY := 8, GRID_PRE_CONNECTED := 10, GRID_CONNECTED := 11) := OFF;
// Watchdog timeout in seconds
_uiWatchdogTimeoutSeconds : UINT := 10;
// FB for reading Modbus holding registers
_fbReadRegisters : FB_MBReadRegs;
// FB for writing Modbus holding registers
_fbWriteRegisters : FB_MBWriteRegs;
// FB for writing heartbeat register
_fbWriteHearbeatRegister : FB_MBWriteSingleReg;
// FB for writing requested state
_fbWriteRequestedState : FB_MBWriteSingleReg;
// FB for writing current power command
// Write multiple registers is used here
// because FB_MBWriteSingleReg expects an
// unsigned data type
_fbWritePowerCommand : FB_MBWriteRegs;
// FB for reading current state
_fbReadCurrentState : FB_MBReadRegs;
// FB for reading pcu state register
_fbReadPCUState : FB_MBReadRegs;
// FB for reading dc values
_fbReadDCValues : FB_MBReadRegs;
// FB for reading ac values
_fbReadACValues : FB_MBReadRegs;
// Time for polling for current dc values and check for inverter error
_timPollingDelay : TIME := T#500MS;
// Time for setting the current power
_timSetPowerDelay : TIME := T#250MS;
// Timer for polling of current values
_tonPollingTimer : TON;
_tTimeoutPolling : TIME := T#5S;
// Timer for setting the inverter power
_tonSetPowerTimer : TON;
// Timer for watchdog
_tonWatchdogResetTimer : TON := (PT := T#1S);
_tTimeoutWriteWatchdogRegister : TIME := T#5S;
// Inverter alarm
_fbErrorInverterAlarm : FB_TcAlarm;
// Flag if battery limits have been set
_xBatteryLimitsSet : BOOL := FALSE;
// Flag to see if an error occured during setting the battery limits
_xErrorSetBatteryLimits : BOOL := FALSE;
// Battery limit scaling factors
_arBattScalingFactors : ARRAY[0..1] OF INT;
// Helper variable for writing a 1 to a register
_uiEnableLimit : UINT := 1;
// Retry timer to set battery limits
_fbTONSetBatteryLimits : TON := (PT := T#5S);
// Inverter power output
_iWSetPct : INT := 0;
// Converter max power scaling factor
_iWMaxSF : INT;
// Scaling factor for power setpoint
_iWSetPctSF : INT := -2;
// Scaled converter max power
_rWMax : REAL;
// Unscaled converter max power
_uiWMax : UINT;
// Current DC values (DCA, DCA_SF, DCV, DCV_SF, DCW, DCW_SF) in word array for efficient modbus reading
_awCurrentDCValues : ARRAY[0..5] OF WORD;
// Current AC values (W, W_SF, Hz, Hz_SF, VA, VA_SF, VAr, VAr_SF, PF, PF_SF) in word array for efficient modbus reading
_awCurrentACValues : ARRAY[0..21] OF WORD;
// Current state
_eCurrentState : E_KACO_CURRENT_STATE;
// Current PCU state and alarm messages
_stPCUState : ST_KACU_PCU;
// Error during cyclic reading
_xErrorCyclicData : BOOL;
// Internal inverter error
_xErrorInverter : BOOL;
// Inverter name for alarm message
_sName : STRING;
END_VAR
VAR CONSTANT
// Battery limits registers (Model 64202)
// 41120 is Voltage and 41121 is amp
BATTERY_LIMIT_SF_START : WORD := 41120;
BATTERY_SET_LIMITS_START : WORD := 41122;
DIS_MIN_V : WORD := 41122;
DIS_MAX_A : WORD := 41123;
CHA_MAX_V : WORD := 41125;
CHA_MAX_A : WORD := 41126;
EN_LIMIT : WORD := 41129;
// Power registers (Model 64201)
W_SET_PCT : WORD := 41069;
// Basic settings registers (Model 121)
W_MAX : WORD := 40214;
W_MAX_SF : WORD := 40234;
// Start of register with the current dc values
// Size 4
DC_VALUES_START_REGISTER : WORD := 40097;
// Start of register with the current ac values
// SIZE 10
AC_VALUES_START_REGISTER : WORD := 40072;
// Inverter statemachine status register
// Size 1, enum16 (Range = 0 .. 65534, Not implemented = 0xFFFF)
PCU_STATUS_START_REGISTER : WORD := 41078;
// Inverter current state
CURRENT_STATE_REGISTER : WORD := 41065;
// Control register to set the target state of the inverters state machine
// Size 1, enum16 (Range = 0 .. 65534, Not implemented = 0xFFFF)
REQUESTED_STATE_REGISTER : WORD := 41064;
// Hearbeat register
WATCHDOG_REGISTER : WORD := 41068;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[_rPowerInternal := rPower;
// Clamp rPower to maximum allowed power
IF (rPower > rMaxBattPower) THEN
_rPowerInternal := rMaxBattPower;
END_IF
IF (rPower < -rMaxBattPower) THEN
_rPowerInternal := -rMaxBattPower;
END_IF
HandleHeartbeat();
HandleCyclicData();
CASE _iState OF
0: // Pre-init phase (no battery limits set)
_fbTONSetBatteryLimits(IN := TRUE);
IF _fbTONSetBatteryLimits.Q THEN
_fbTONSetBatteryLimits(IN := FALSE);
_eRequestedState := OFF;
_iStateStartup := 0;
_iState := 10;
END_IF
10: // Try to set battery limits
SetBatteryLimits();
IF (NOT _xStartupBusy) THEN
// Battery limits set and no error
IF _xBatteryLimitsSet AND (NOT _xErrorSetBatteryLimits) THEN
_iWSetPct := 0;
_iState := 20;
END_IF
// If there was an error settings the battery limits, retry
IF _xErrorSetBatteryLimits THEN
_iState := 0;
END_IF
END_IF
20: // Read max power scaling
_fbReadRegisters(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#01, // 16#FF for Modbus TCP
nQuantity:= 1,
nMBAddr:= W_MAX_SF,
cbLength:= SIZEOF(_iWMaxSF),
pDestAddr:= ADR(_iWMaxSF),
bExecute:= TRUE,
tTimeout:= T#5S,
bBusy=> ,
bError=> ,
nErrId=> ,
cbRead=> );
// Check if reading mudbus register is done
IF NOT _fbReadRegisters.bBusy THEN
// If there was no error then continue
IF NOT _fbReadRegisters.bError THEN
_iState := 30;
// Check for valid value
IF (_iWMaxSF < -10) OR (_iWMaxSF > 10) OR (_iWMaxSF = 16#8000) THEN
// Goto error state
_iState := 1000;
END_IF
ELSE
xError := TRUE;
// Goto error state
_iState := 1000;
END_IF
_fbReadRegisters(bExecute := FALSE);
END_IF
30: // Read max power
_fbReadRegisters(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#01, // 16#FF for Modbus TCP
nQuantity:= 1,
nMBAddr:= W_MAX,
cbLength:= SIZEOF(_uiWMax),
pDestAddr:= ADR(_uiWMax),
bExecute:= TRUE,
tTimeout:= T#5S,
bBusy=> ,
bError=> ,
nErrId=> ,
cbRead=> );
// Check if reading mudbus register is done
IF NOT _fbReadRegisters.bBusy THEN
// If there was no error then continue
IF NOT _fbReadRegisters.bError THEN
_iState := 40;
// Calculate WMax
// Reading a register with scaling factor = value * 10^SF
_rWMax := LREAL_TO_REAL(_uiWMax * EXPT(10,_iWMaxSF));
ELSE
xError := TRUE;
// Goto error state
_iState := 1000;
END_IF
_fbReadRegisters(bExecute := FALSE);
END_IF
40: // Idle state, wait for enable
// If enable and INTLK Ok
IF xEnable THEN
_eRequestedState := GRID_CONNECTED;
IF xReleasePower THEN
// Calculate power to write to register
// (could not find where the scaling for wset can be read but its -2!)
// => 10% = 1000
// Writing a register with scaling factor = value / (10^SF)
//_iWSetPct := LREAL_TO_INT((_rPowerInternal*100)/(_rWMax * EXPT(10,-2)));
_iWSetPct := REAL_TO_INT((_rPowerInternal*100) / (_rWMax * EXPT(10,_iWSetPctSF)));
ELSE
_iWSetPct := 0;
END_IF
ELSE
_eRequestedState := OFF;
_iWSetPct := 0;
END_IF
// Comm error or Watchdog error occured
IF _xErrorCyclicData OR (NOT xHeartbeatOk) THEN
_iWSetPct := 0;
_eRequestedState := OFF;
_iState := 1000;
END_IF
// Dont set inverter into off state when an internal error occured
// because this will reset the error message
IF _xErrorInverter THEN
_iWSetPct := 0;
_iState := 1000;
END_IF
1000: // Error state
xError := TRUE;
_iState := 1001;
1001: // Error state, wait for reset
IF xReset AND (NOT xEnable) AND (NOT _xErrorCyclicData) AND (NOT _xErrorInverter) THEN
_eRequestedState := OFF;
xError := FALSE;
_iState := 0;
END_IF
END_CASE
// ===============================
// Inverter alarm handling
// ===============================
IF xError AND (NOT _fbErrorInverterAlarm.bRaised) THEN
_fbErrorInverterAlarm.Raise(0);
END_IF
IF (NOT xError) AND _fbErrorInverterAlarm.bRaised THEN
_fbErrorInverterAlarm.Clear(0, FALSE);
END_IF
IF (_fbErrorInverterAlarm.eConfirmationState = TcEventConfirmationState.WaitForConfirmation) AND xReset THEN
_fbErrorInverterAlarm.Confirm(0);
END_IF]]></ST>
</Implementation>
<Method Name="FB_Init" Id="{5f7291f3-1517-49b9-b6a8-07debcc66730}">
<Declaration><![CDATA[//FB_Init ist immer implizit verfügbar und wird primär für die Initialisierung verwendet.
//Der Rückgabewert wird nicht ausgewertet. Für gezielte Einflussnahme können Sie
//die Methoden explizit deklarieren und darin mit dem Standard-Initialisierungscode
//zusätzlichen Code bereitstellen. Sie können den Rückgabewert auswerten.
METHOD FB_Init: BOOL
VAR_INPUT
bInitRetains: BOOL; // TRUE: Die Retain-Variablen werden initialisiert (Reset warm / Reset kalt)
bInCopyCode: BOOL; // TRUE: Die Instanz wird danach in den Kopiercode kopiert (Online-Change)
sName : STRING;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[_sName := sName;
// Create inverter main alarm
_fbErrorInverterAlarm.CreateEx(stEventEntry := TC_EVENTS.Inverter.InverterError, bWithConfirmation := TRUE, 0);
_fbErrorInverterAlarm.ipArguments.Clear().AddString(_sName);]]></ST>
</Implementation>
</Method>
<Action Name="HandleCyclicData" Id="{4343583a-b80a-437e-8fc8-9963ab894fbc}">
<Implementation>
<ST><![CDATA[// Reset error flags on reset command
IF _xErrorCyclicData AND xReset THEN
_xErrorCyclicData := FALSE;
END_IF
// Fetch cyclic data with polling timer
_tonPollingTimer(IN := TRUE);
// Write requested state
_fbWriteRequestedState(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#01,
nMBAddr:= REQUESTED_STATE_REGISTER,
nValue:= INT_TO_WORD(_eRequestedState),
bExecute:= _tonPollingTimer.Q AND (NOT _fbWriteRequestedState.bBusy),
tTimeout:= _tTimeoutPolling,
bBusy=> ,
bError=> ,
nErrId=> );
IF (NOT _fbWriteRequestedState.bBusy) AND _fbWriteRequestedState.bError THEN
_xErrorCyclicData := TRUE;
END_IF
// Write current power command
_fbWritePowerCommand(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#01,
nQuantity := 1,
nMBAddr:= W_SET_PCT,
cbLength := SIZEOF(_iWSetPct),
pSrcAddr:= ADR(_iWSetPct),
bExecute:= _tonPollingTimer.Q AND (NOT _fbWritePowerCommand.bBusy),
tTimeout:= _tTimeoutPolling,
bBusy=> ,
bError=> ,
nErrId=> );
IF (NOT _fbWritePowerCommand.bBusy) AND _fbWritePowerCommand.bError THEN
_xErrorCyclicData := TRUE;
END_IF
// Read current state
_fbReadCurrentState(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#01,
nQuantity:= 1,
nMBAddr:= CURRENT_STATE_REGISTER,
cbLength:= SIZEOF(_eCurrentState),
pDestAddr:= ADR(_eCurrentState),
bExecute:= _tonPollingTimer.Q AND (NOT _fbReadCurrentState.bBusy),
tTimeout:= _tTimeoutPolling,
bBusy=> ,
bError=> ,
nErrId=> ,
cbRead=> );
IF (NOT _fbReadCurrentState.bBusy) AND _fbReadCurrentState.bError THEN
_xErrorCyclicData := TRUE;
END_IF
IF _eCurrentState = E_KACO_CURRENT_STATE.GRID_CONNECTED OR _eCurrentState = E_KACO_CURRENT_STATE.THROTTLED THEN
xActive := TRUE;
ELSE
xActive := FALSE;
END_IF
// Read current pcu status
_fbReadPCUState(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#01,
nQuantity:= 2,
nMBAddr:= PCU_STATUS_START_REGISTER,
cbLength:= SIZEOF(_stPCUState),
pDestAddr:= ADR(_stPCUState),
bExecute:= _tonPollingTimer.Q AND (NOT _fbReadPCUState.bBusy),
tTimeout:= _tTimeoutPolling,
bBusy=> ,
bError=> ,
nErrId=> ,
cbRead=> );
IF (NOT _fbReadPCUState.bBusy) AND _fbReadPCUState.bError THEN
_xErrorCyclicData := TRUE;
END_IF
IF (_stPCUState.ePCUState = E_KACO_PCU_STATE.ERROR) OR (_stPCUState.ePCUError <> E_KACO_PCU_ERROR.NO_EVENT) THEN
_xErrorInverter := TRUE;
ELSE
_xErrorInverter := FALSE;
END_IF
// Read current dc values
_fbReadDCValues(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#01, // 16#FF for Modbus TCP
nQuantity:= 6,
nMBAddr:= DC_VALUES_START_REGISTER,
cbLength:= SIZEOF(_awCurrentDCValues),
pDestAddr:= ADR(_awCurrentDCValues),
bExecute:= _tonPollingTimer.Q AND (NOT _fbReadDCValues.bBusy),
tTimeout:= _tTimeoutPolling,
bBusy=> ,
bError=> ,
nErrId=> ,
cbRead=> );
// Check if reading modbus register is done
IF (NOT _fbReadDCValues.bBusy) THEN
// If there was no error and the converter has no error continue
IF (NOT _fbReadDCValues.bError) THEN
stCurrentValues.rActDCCurrent := LREAL_TO_REAL(WORD_TO_INT(_awCurrentDCValues[0]) * EXPT(10,WORD_TO_INT(_awCurrentDCValues[1])));
stCurrentValues.rActDCVoltage := LREAL_TO_REAL(WORD_TO_UINT(_awCurrentDCValues[2]) * EXPT(10,WORD_TO_INT(_awCurrentDCValues[3])));
stCurrentValues.rActDCPower := LREAL_TO_REAL(WORD_TO_INT(_awCurrentDCValues[4]) * EXPT(10,WORD_TO_INT(_awCurrentDCValues[5])));
ELSE
// Dont throw comm error here because this is just
// informational data and not process critical
stCurrentValues.rActDCCurrent := 0.0;
stCurrentValues.rActDCVoltage := 0.0;
stCurrentValues.rActDCPower := 0.0;
END_IF
END_IF
// Read current ac values
_fbReadACValues(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#01, // 16#FF for Modbus TCP
nQuantity:= 22,
nMBAddr:= AC_VALUES_START_REGISTER,
cbLength:= SIZEOF(_awCurrentACValues),
pDestAddr:= ADR(_awCurrentACValues),
bExecute:= _tonPollingTimer.Q AND (NOT _fbReadACValues.bBusy),
tTimeout:= _tTimeoutPolling,
bBusy=> ,
bError=> ,
nErrId=> ,
cbRead=> );
// Check if reading mudbus register is done
IF (NOT _fbReadACValues.bBusy) THEN
// If there was no error and the converter has no error continue
IF (NOT _fbReadACValues.bError) THEN
stCurrentValues.rActACCurrent := LREAL_TO_REAL(WORD_TO_INT(_awCurrentACValues[0]) * EXPT(10,WORD_TO_INT(_awCurrentACValues[4])));
stCurrentValues.rActtACPhaseACurrent := LREAL_TO_REAL(WORD_TO_INT(_awCurrentACValues[1]) * EXPT(10,WORD_TO_INT(_awCurrentACValues[4])));
stCurrentValues.rActtACPhaseBCurrent := LREAL_TO_REAL(WORD_TO_INT(_awCurrentACValues[2]) * EXPT(10,WORD_TO_INT(_awCurrentACValues[4])));
stCurrentValues.rActtACPhaseCCurrent := LREAL_TO_REAL(WORD_TO_INT(_awCurrentACValues[3]) * EXPT(10,WORD_TO_INT(_awCurrentACValues[4])));
stCurrentValues.rActACPower := LREAL_TO_REAL(WORD_TO_INT(_awCurrentACValues[12]) * EXPT(10,WORD_TO_INT(_awCurrentACValues[13])));
stCurrentValues.rActACFreq := LREAL_TO_REAL(WORD_TO_UINT(_awCurrentACValues[14]) * EXPT(10,WORD_TO_INT(_awCurrentACValues[15])));
stCurrentValues.rActApparentPower := LREAL_TO_REAL(WORD_TO_INT(_awCurrentACValues[16]) * EXPT(10,WORD_TO_INT(_awCurrentACValues[17])));
stCurrentValues.rActReactivePower := LREAL_TO_REAL(WORD_TO_INT(_awCurrentACValues[18]) * EXPT(10,WORD_TO_INT(_awCurrentACValues[19])));
stCurrentValues.rActPowerFactor := LREAL_TO_REAL(WORD_TO_INT(_awCurrentACValues[20]) * EXPT(10,WORD_TO_INT(_awCurrentACValues[21])));
ELSE
// Dont throw comm error here because this is just
// informational data and not process critical
stCurrentValues.rActACCurrent := 0.0;
stCurrentValues.rActtACPhaseACurrent := 0.0;
stCurrentValues.rActtACPhaseBCurrent := 0.0;
stCurrentValues.rActtACPhaseCCurrent := 0.0;
stCurrentValues.rActACPower := 0.0;
stCurrentValues.rActACFreq := 0.0;
stCurrentValues.rActApparentPower := 0.0;
stCurrentValues.rActReactivePower := 0.0;
stCurrentValues.rActPowerFactor := 0.0;
END_IF
END_IF
// Reset polling timer
IF _tonPollingTimer.Q THEN
_tonPollingTimer(IN := FALSE);
END_IF]]></ST>
</Implementation>
</Action>
<Action Name="HandleHeartbeat" Id="{eeb5f65a-fd91-4c22-ab2e-3080c24e87fb}">
<Implementation>
<ST><![CDATA[// Reset hearbeat signal only with reset signal
IF (NOT xHeartbeatOk) AND xReset THEN
xHeartbeatOk := TRUE;
END_IF
// Self resetting watchdog timer
_tonWatchdogResetTimer(IN := TRUE);
// Timeout should be less than timer interval
_fbWriteHearbeatRegister(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#01,
nMBAddr:= WATCHDOG_REGISTER,
nValue:= _uiWatchdogTimeoutSeconds,
bExecute:= _tonWatchdogResetTimer.Q AND (NOT _fbWriteHearbeatRegister.bBusy),
tTimeout:= _tTimeoutWriteWatchdogRegister,
bBusy=> ,
bError=> ,
nErrId=> );
// Because there is no heartbeat register to read,
// we will use a successfull write as a valid heartbeat signal
IF _fbWriteHearbeatRegister.bError THEN
xHeartbeatOk := FALSE;
xError := TRUE;
END_IF
// Reset timer
IF _tonWatchdogResetTimer.Q THEN
_tonWatchdogResetTimer(IN := FALSE);
END_IF]]></ST>
</Implementation>
</Action>
<Property Name="Name" Id="{1af22804-e4c4-4295-b5b9-5968e747d45b}">
<Declaration><![CDATA[PROPERTY Name : STRING]]></Declaration>
<Get Name="Get" Id="{6338c761-e06b-4a94-a0d3-0502e3ee997d}">
<Declaration><![CDATA[VAR
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[Name := _sName;]]></ST>
</Implementation>
</Get>
<Set Name="Set" Id="{eebb6389-e8f3-42a9-a08a-6e1cad8f0192}">
<Declaration><![CDATA[VAR
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[_sName := Name;
_fbErrorInverterAlarm.ipArguments.Clear().AddString(_sName);]]></ST>
</Implementation>
</Set>
</Property>
<Action Name="SetBatteryLimits" Id="{15c86a66-2f5b-42ab-82c5-3aeebcab0e43}">
<Implementation>
<ST><![CDATA[CASE _iStateStartup OF
0: // Start
_xBatteryLimitsSet := FALSE;
_xErrorSetBatteryLimits := FALSE;
_xStartupBusy := TRUE;
_iStateStartup := 10;
10: // Read scaling factors
_fbReadRegisters(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#FF, // 16#FF for Modbus TCP
nQuantity:= 2,
nMBAddr:= BATTERY_LIMIT_SF_START,
cbLength:= SIZEOF(_arBattScalingFactors),
pDestAddr:= ADR(_arBattScalingFactors),
bExecute:= TRUE,
tTimeout:= T#5S,
bBusy=> ,
bError=> ,
nErrId=> ,
cbRead=> );
// Check if reading mudbus register is done
IF NOT _fbReadRegisters.bBusy THEN
IF (NOT _fbReadRegisters.bError) THEN
_iStateStartup := 20;
ELSE
// Goto error state
//_xErrorSetBatteryLimits := TRUE;
_iStateStartup := 1000;
END_IF
_fbReadRegisters(bExecute := FALSE);
END_IF
20: // Set battery limits
_fbWriteRegisters(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#FF, // 16#FF for Modbus TCP
nQuantity:= 6,
nMBAddr:= BATTERY_SET_LIMITS_START,
cbLength:= SIZEOF(_auiBatteryLimitValues),
pSrcAddr:= ADR(_auiBatteryLimitValues),
bExecute:= TRUE,
tTimeout:= T#5S,
bBusy=> ,
bError=> ,
nErrId=> );
// If writing modbus register is done
IF NOT _fbWriteRegisters.bBusy THEN
// And there is no error, then continue
IF (NOT _fbWriteRegisters.bError) THEN
_iStateStartup := 60;
ELSE
// Goto error state
_iStateStartup := 1000;
END_IF
_fbWriteRegisters(bExecute := FALSE);
END_IF
(*
20: // Set min voltage
_fbWriteRegister(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#FF, // 16#FF for Modbus TCP
nQuantity:= 1,
nMBAddr:= DIS_MIN_V,
cbLength:= SIZEOF(uiMinDisVoltage),
pSrcAddr:= ADR(uiMinDisVoltage),
bExecute:= TRUE,
tTimeout:= T#5S,
bBusy=> ,
bError=> ,
nErrId=> );
// If writing modbus register is done
IF NOT _fbWriteRegister.bBusy THEN
// And there is no error, then continue
IF (NOT _fbWriteRegister.bError) THEN
_iStateStartup := 30;
ELSE
// Goto error state
//_xErrorSetBatteryLimits := TRUE;
_iStateStartup := 1000;
END_IF
_fbWriteRegister(bExecute := FALSE);
END_IF
30: // Set max voltage
_fbWriteRegister(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#FF, // 16#FF for Modbus TCP
nQuantity:= 1,
nMBAddr:= CHA_MAX_V,
cbLength:= SIZEOF(uiMaxChaVoltage),
pSrcAddr:= ADR(uiMaxChaVoltage),
bExecute:= TRUE,
tTimeout:= T#5S,
bBusy=> ,
bError=> ,
nErrId=> );
// If writing modbus register is done
IF NOT _fbWriteRegister.bBusy THEN
// And there is no error, then continue
IF (NOT _fbWriteRegister.bError) THEN
_iStateStartup := 40;
ELSE
// Goto error state
//_xErrorSetBatteryLimits := TRUE;
_iStateStartup := 1000;
END_IF
_fbWriteRegister(bExecute := FALSE);
END_IF
40: // Set charge current
_fbWriteRegister(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#FF, // 16#FF for Modbus TCP
nQuantity:= 1,
nMBAddr:= CHA_MAX_A,
cbLength:= SIZEOF(uiMaxChaCurrent),
pSrcAddr:= ADR(uiMaxChaCurrent),
bExecute:= TRUE,
tTimeout:= T#5S,
bBusy=> ,
bError=> ,
nErrId=> );
// If writing modbus register is done
IF NOT _fbWriteRegister.bBusy THEN
// And there is no error, then continue
IF (NOT _fbWriteRegister.bError) THEN
_iStateStartup := 50;
ELSE
// Goto error state
_xErrorSetBatteryLimits := TRUE;
_iStateStartup := 1000;
END_IF
_fbWriteRegister(bExecute := FALSE);
END_IF
50: // Set discharge current
_fbWriteRegister(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#FF, // 16#FF for Modbus TCP
nQuantity:= 1,
nMBAddr:= DIS_MAX_A,
cbLength:= SIZEOF(uiMaxDisCurrent),
pSrcAddr:= ADR(uiMaxDisCurrent),
bExecute:= TRUE,
tTimeout:= T#5S,
bBusy=> ,
bError=> ,
nErrId=> );
// If writing modbus register is done
IF NOT _fbWriteRegister.bBusy THEN
// And there is no error, then continue
IF (NOT _fbWriteRegister.bError) THEN
_iStateStartup := 60;
ELSE
// Goto error state
_xErrorSetBatteryLimits := TRUE;
_iStateStartup := 1000;
END_IF
_fbWriteRegister(bExecute := FALSE);
END_IF
*)
60: // Enable battery limits
_fbWriteRegisters(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#FF, // 16#FF for Modbus TCP
nQuantity:= 1,
nMBAddr:= EN_LIMIT,
cbLength:= SIZEOF(_uiEnableLimit),
pSrcAddr:= ADR(_uiEnableLimit),
bExecute:= TRUE,
tTimeout:= T#5S,
bBusy=> ,
bError=> ,
nErrId=> );
// If writing modbus register is done
IF NOT _fbWriteRegisters.bBusy THEN
// And there is no error, then continue
IF (NOT _fbWriteRegisters.bError) THEN
_iStateStartup := 70;
ELSE
// Goto error state
//_xErrorSetBatteryLimits := TRUE;
_iState := 1000;
END_IF
_fbWriteRegisters(bExecute := FALSE);
END_IF
70: // Battery limits set
_xBatteryLimitsSet := TRUE;
_xStartupBusy := FALSE;
1000: // Error state
_xErrorSetBatteryLimits := TRUE;
_xBatteryLimitsSet := FALSE;
_xStartupBusy := FALSE;
END_CASE]]></ST>
</Implementation>
</Action>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<DUT Name="ST_KACU_PCU" Id="{268343cf-ebff-47ff-8ac9-f65faeb58856}">
<Declaration><![CDATA[{attribute 'pack_mode' := '1'}
TYPE ST_KACU_PCU :
STRUCT
ePCUState : E_KACO_PCU_STATE;
ePCUError : E_KACO_PCU_ERROR;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<DUT Name="ST_SunspecInverterThreePhase" Id="{f9acf95c-14fe-4c1e-9c73-dff4af6d43b5}">
<Declaration><![CDATA[// Sunspec register 40.070 - 40.120 (Size 52)
TYPE ST_SunspecInverterThreePhase :

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<DUT Name="ST_SunspecNameplateRatings" Id="{d43d4b8b-dd50-4ed8-ac51-53563f3eb7b3}">
<Declaration><![CDATA[// Sunspec register 40.122 - 40.149 (Size 28)
TYPE ST_SunspecNameplateRatings :

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<DUT Name="ST_SUNSPEC_CURRENT_VALUES" Id="{429ce2f6-f580-460c-8eb4-3ddb289effd4}">
<Declaration><![CDATA[TYPE ST_SUNSPEC_CURRENT_VALUES :
STRUCT

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<DUT Name="U_SUNSPEC_ERROR" Id="{4000836c-9d7f-470c-9b50-f6d22b3eac05}">
<Declaration><![CDATA[TYPE U_SUNSPEC_ERROR :
UNION

View File

@@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
<Itf Name="I_SunspecStateEvents" Id="{9f2878c1-5bc9-4cdb-9e46-4b259f381081}">
<Declaration><![CDATA[INTERFACE I_SunspecStateEvents
]]></Declaration>
<Method Name="Error" Id="{506b8d17-6aa9-4aab-bfd8-11f2ebedfcfc}">
<Declaration><![CDATA[METHOD Error : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
</Method>
<Method Name="PowerSetpointChanged" Id="{3dcaeb52-d0ac-4f7e-99ba-b5f155953486}">
<Declaration><![CDATA[METHOD PowerSetpointChanged : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
</Method>
<Property Name="sDescription" Id="{330ef48f-f9ea-4ee7-a639-0ea32e088efd}">
<Declaration><![CDATA[PROPERTY sDescription : STRING]]></Declaration>
<Get Name="Get" Id="{2bcfde01-0834-4a30-8867-40b073885fa2}">
<Declaration><![CDATA[]]></Declaration>
</Get>
</Property>
<Method Name="Start" Id="{f29f72f2-1d04-48a4-8608-368ea20f3369}">
<Declaration><![CDATA[METHOD Start : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
</Method>
</Itf>
</TcPlcObject>

View File

@@ -1,68 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
<POU Name="FB_SunspecErrorState" Id="{32768020-5348-440d-ba86-8c22b89748ca}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FINAL FB_SunspecErrorState IMPLEMENTS I_SunspecStateEvents
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
<Method Name="Error" Id="{179954d6-9aec-4f12-920f-8ebcc939e9f0}">
<Declaration><![CDATA[{warning 'Methodenimplementierung hinzufügen'}
METHOD Error : BOOL
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="PowerSetpointChanged" Id="{13d718a0-4c83-4300-bbaa-e213ad7aa8af}">
<Declaration><![CDATA[{warning 'Methodenimplementierung hinzufügen'}
METHOD PowerSetpointChanged : BOOL
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Property Name="sDescription" Id="{d53971e2-a389-4522-ba1a-c5ff9ecf2f10}">
<Declaration><![CDATA[{warning 'Eigenschaftenimplementierung hinzufügen'}
PROPERTY sDescription : STRING
]]></Declaration>
<Get Name="Get" Id="{de420402-9047-4ee6-9fc9-cc905acb4d0f}">
<Declaration><![CDATA[VAR
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[sDescription := 'Inverter has error']]></ST>
</Implementation>
</Get>
</Property>
<Method Name="Start" Id="{2cda83e0-be11-442b-bf87-a7ac125ff2e7}">
<Declaration><![CDATA[{warning 'Methodenimplementierung hinzufügen'}
METHOD Start : BOOL
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<LineIds Name="FB_SunspecErrorState">
<LineId Id="9" Count="0" />
</LineIds>
<LineIds Name="FB_SunspecErrorState.Error">
<LineId Id="4" Count="0" />
</LineIds>
<LineIds Name="FB_SunspecErrorState.PowerSetpointChanged">
<LineId Id="4" Count="0" />
</LineIds>
<LineIds Name="FB_SunspecErrorState.sDescription.Get">
<LineId Id="2" Count="0" />
</LineIds>
<LineIds Name="FB_SunspecErrorState.Start">
<LineId Id="4" Count="0" />
</LineIds>
</POU>
</TcPlcObject>

View File

@@ -1,68 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
<POU Name="FB_SunspecOffState" Id="{e011d22f-f815-46e1-94fd-3c9f3920043c}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FINAL FB_SunspecOffState IMPLEMENTS I_SunspecStateEvents
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
<Method Name="Error" Id="{d664cadd-ac2b-4ff0-bcb2-b0337fcba29b}">
<Declaration><![CDATA[{warning 'Methodenimplementierung hinzufügen'}
METHOD Error : BOOL
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="PowerSetpointChanged" Id="{381d5fe1-608f-4100-85b9-2a00e88d6ec8}">
<Declaration><![CDATA[{warning 'Methodenimplementierung hinzufügen'}
METHOD PowerSetpointChanged : BOOL
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Property Name="sDescription" Id="{6bb22c27-a09d-421c-ba72-b88d70f45bf4}">
<Declaration><![CDATA[{warning 'Eigenschaftenimplementierung hinzufügen'}
PROPERTY sDescription : STRING
]]></Declaration>
<Get Name="Get" Id="{8e1a3f8b-86f3-43a4-b3ca-5e780a9a61e0}">
<Declaration><![CDATA[VAR
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[sDescription := 'Inverter off']]></ST>
</Implementation>
</Get>
</Property>
<Method Name="Start" Id="{6bd7c404-10c1-4936-a0c8-70f2c38a5fbf}">
<Declaration><![CDATA[{warning 'Methodenimplementierung hinzufügen'}
METHOD Start : BOOL
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<LineIds Name="FB_SunspecOffState">
<LineId Id="9" Count="0" />
</LineIds>
<LineIds Name="FB_SunspecOffState.Error">
<LineId Id="4" Count="0" />
</LineIds>
<LineIds Name="FB_SunspecOffState.PowerSetpointChanged">
<LineId Id="4" Count="0" />
</LineIds>
<LineIds Name="FB_SunspecOffState.sDescription.Get">
<LineId Id="2" Count="0" />
</LineIds>
<LineIds Name="FB_SunspecOffState.Start">
<LineId Id="4" Count="0" />
</LineIds>
</POU>
</TcPlcObject>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0"?>
<TcSmProject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.beckhoff.com/schemas/2012/07/TcSmProject" TcSmVersion="1.0" TcVersion="3.1.4026.12">
<TcSmProject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.beckhoff.com/schemas/2012/07/TcSmProject" TcSmVersion="1.0" TcVersion="3.1.4026.17">
<DataTypes>
<DataType>
<Name GUID="{2438F91B-E188-4ED7-8594-54354F9ED6A4}" Namespace="Safety" TcBaseType="true">FSOE_6</Name>
@@ -269,7 +269,7 @@
</System>
<Plc>
<Project GUID="{9AE64910-5EB2-4866-93FD-EFE059C38C36}" Name="PLC" PrjFilePath="PLC\PLC.plcproj" TmcFilePath="PLC\PLC.tmc" ReloadTmc="true" AmsPort="851" FileArchiveSettings="#x000e" CopyTmcToTarget="true" CopyTpyToTarget="false" SymbolicMapping="true">
<Instance Id="#x08502000" TcSmClass="TComPlcObjDef" KeepUnrestoredLinks="2" TmcHash="{07E9B518-2512-A373-B429-1E1430A84C16}" TmcPath="PLC\PLC.tmc">
<Instance Id="#x08502000" TcSmClass="TComPlcObjDef" KeepUnrestoredLinks="2" TmcHash="{753F5CD6-82D5-7E39-B54F-6667A9E46654}" TmcPath="PLC\PLC.tmc">
<Name>PLC Instance</Name>
<CLSID ClassFactory="TcPlc30">{08500001-0000-0000-F000-000000000064}</CLSID>
<Vars VarGrpType="2" AreaNo="1">
@@ -7015,11 +7015,6 @@
<Comment><![CDATA[ Hardware reset button]]></Comment>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._uiEtherCATState</Name>
<Comment><![CDATA[ String EtherCAT state]]></Comment>
<Type>UINT</Type>
</Var>
<Var>
<Name>MAIN._fbSafety.xVoltagesInRange</Name>
<Type>BOOL</Type>
@@ -7032,6 +7027,11 @@
<Name>MAIN._fbSafety.xTemperaturesInRange</Name>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._uiEtherCATState</Name>
<Comment><![CDATA[ String EtherCAT state]]></Comment>
<Type>UINT</Type>
</Var>
<Var>
<Name>MAIN._fbTempCabinetSCSString1.iAnalogValue</Name>
<Comment><![CDATA[ Analog input value]]></Comment>
@@ -7633,7 +7633,7 @@
<ModuleIdent>17827710</ModuleIdent>
<Module Id="#x03090001" Type="FSOE" Class="1918">
<Name>Module 1 (FSOE)</Name>
<ImageId>518</ImageId>
<ImageId>548</ImageId>
<ModuleData>020000007e07100100002c000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6656</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -7645,7 +7645,7 @@
<ModuleIdent>691</ModuleIdent>
<Module Id="#x03090002" Type="FSLOGIC" Class="FSLOGIC">
<Name>Module 2 (FSLOGIC)</Name>
<ImageId>518</ImageId>
<ImageId>548</ImageId>
<ModuleData>02000000b3020000000004000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>7167</PdoIndex>
<PdoIndex>6143</PdoIndex>
@@ -8596,7 +8596,7 @@ Bit1: Value bigger/equal Limit2]]></Comment>
<ModuleIdent>201</ModuleIdent>
<Module Id="#x03090007" Type="FSOUT" Class="FSOUT">
<Name>Module 2 (FSOUT)</Name>
<ImageId>518</ImageId>
<ImageId>548</ImageId>
<ModuleData>02000000c9000000000004000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6142</PdoIndex>
</Module>
@@ -8606,7 +8606,7 @@ Bit1: Value bigger/equal Limit2]]></Comment>
<ModuleIdent>1950</ModuleIdent>
<Module Id="#x03090008" Type="DEVICEIO" Class="DEVICEIO">
<Name>Module 3 (DEVICEIO)</Name>
<ImageId>518</ImageId>
<ImageId>548</ImageId>
<ModuleData>020000009e070000000004000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>7166</PdoIndex>
</Module>
@@ -8616,7 +8616,7 @@ Bit1: Value bigger/equal Limit2]]></Comment>
<ModuleIdent>691</ModuleIdent>
<Module Id="#x03090009" Type="FSLOGIC" Class="FSLOGIC">
<Name>Module 4 (FSLOGIC)</Name>
<ImageId>518</ImageId>
<ImageId>548</ImageId>
<ModuleData>02000000b3020000000004000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>7167</PdoIndex>
<PdoIndex>6143</PdoIndex>
@@ -9592,7 +9592,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090006" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -9867,7 +9867,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x0309000a" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -10142,7 +10142,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x0309000b" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -10417,7 +10417,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x0309000c" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -10712,7 +10712,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x0309000d" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -14219,7 +14219,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x0309000e" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -14402,7 +14402,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x0309000f" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -15379,7 +15379,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090010" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -15654,7 +15654,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090011" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -15929,7 +15929,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090012" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -16204,7 +16204,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090013" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -16499,7 +16499,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090014" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -20006,7 +20006,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090015" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -20189,7 +20189,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090016" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -21166,7 +21166,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090017" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -21441,7 +21441,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090018" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -21716,7 +21716,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x0309001e" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -21991,7 +21991,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x0309001f" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -22286,7 +22286,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090020" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -25793,7 +25793,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090021" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -25976,7 +25976,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090022" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -26830,7 +26830,7 @@ Bit1: Value bigger/equal Limit2]]></Comment>
<ModuleIdent>201</ModuleIdent>
<Module Id="#x0309001b" Type="FSOUT" Class="FSOUT">
<Name>Module 2 (FSOUT)</Name>
<ImageId>518</ImageId>
<ImageId>548</ImageId>
<ModuleData>02000000c9000000000004000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6142</PdoIndex>
</Module>
@@ -26840,7 +26840,7 @@ Bit1: Value bigger/equal Limit2]]></Comment>
<ModuleIdent>1950</ModuleIdent>
<Module Id="#x0309001c" Type="DEVICEIO" Class="DEVICEIO">
<Name>Module 3 (DEVICEIO)</Name>
<ImageId>518</ImageId>
<ImageId>548</ImageId>
<ModuleData>020000009e070000000004000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>7166</PdoIndex>
</Module>
@@ -26850,7 +26850,7 @@ Bit1: Value bigger/equal Limit2]]></Comment>
<ModuleIdent>691</ModuleIdent>
<Module Id="#x0309001d" Type="FSLOGIC" Class="FSLOGIC">
<Name>Module 4 (FSLOGIC)</Name>
<ImageId>518</ImageId>
<ImageId>548</ImageId>
<ModuleData>02000000b3020000000004000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>7167</PdoIndex>
<PdoIndex>6143</PdoIndex>
@@ -27823,7 +27823,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090023" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -28095,7 +28095,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090024" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -28367,7 +28367,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090025" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -28639,7 +28639,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090026" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -28930,7 +28930,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090027" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -32435,7 +32435,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090028" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -32616,7 +32616,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090029" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -33587,7 +33587,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x0309002a" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -33859,7 +33859,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x0309002b" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -34131,7 +34131,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x0309002c" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -34403,7 +34403,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x0309002d" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -34694,7 +34694,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x0309002e" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -38199,7 +38199,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x0309002f" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -38380,7 +38380,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090030" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -39351,7 +39351,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090031" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -39623,7 +39623,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090032" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -39895,7 +39895,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090033" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -40167,7 +40167,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090034" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -40458,7 +40458,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3124</ModuleIdent>
<Module Id="#x03090035" Type="TwinSAFE Single Channel" Class="">
<Name>Module 1 (TwinSAFE Single Channel)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -43963,7 +43963,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090036" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -44144,7 +44144,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090037" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>523</ImageId>
<ImageId>553</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>