Finished first implementation of modbus error registers

This commit is contained in:
Matthias Heisig
2025-04-14 19:38:17 +02:00
parent 4a00a4c414
commit f79cf27c0c
19 changed files with 998 additions and 531 deletions

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<DUT Name="ST_DWORD_UNIT_ERROR_BITMAP" Id="{560d7018-6164-4678-9d70-c41b4bfe9348}">
<Declaration><![CDATA[TYPE ST_DWORD_UNIT_ERROR_BITMAP :
STRUCT
bTNegLow : BIT; // Bit 0
bTNegHigh : BIT; // Bit 1
bTNegError : BIT; // Bit 2
bTPosLow : BIT; // Bit 3
bTPosHigh : BIT; // Bit 4
bTPosError : BIT; // Bit 5
bPInNegLow : BIT; // Bit 6
bPInNegHigh : BIT; // Bit 7
bPInNegError : BIT; // Bit 8
bPInPosLow : BIT; // Bit 9
bPInPosHigh : BIT; // Bit 10
bPInPosError : BIT; // Bit 11
bPTankNegLow : BIT; // Bit 12
bPTankNegHigh : BIT; // Bit 13
bPTankNegError : BIT; // Bit 14
bPTankPosLow : BIT; // Bit 15
bPTankPosHigh : BIT; // Bit 16
bPTankPosError : BIT; // Bit 17
bVHigh : BIT; // Bit 18
bVLow : BIT; // Bit 19
bVError : BIT; // Bit 20
bValveNeg : BIT; // Bit 21
bValvePos : BIT; // Bit 22
bPumpNeg : BIT; // Bit 23
bPumpPos : BIT; // Bit 24
bLeack : BIT; // Bit 25
bSafetyIntlk : BIT; // Bit 26
END_STRUCT
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="ST_DWORD_UNIT_WARNING_BITMAP" Id="{fe3a1ecb-072b-4492-b355-17d925e9fa12}">
<Declaration><![CDATA[TYPE ST_DWORD_UNIT_WARNING_BITMAP :
STRUCT
bTNegLow : BIT; // Bit 0
bTNegHigh : BIT; // Bit 1
bTPosLow : BIT; // Bit 2
bTPosHigh : BIT; // Bit 3
bPInNegLow : BIT; // Bit 4
bPInNegHigh : BIT; // Bit 5
bPInPosLow : BIT; // Bit 6
bPInPosHigh : BIT; // Bit 7
bPTankNegLow : BIT; // Bit 8
bPTankNegHigh : BIT; // Bit 9
bPTankPosLow : BIT; // Bit 10
bPTankPosHigh : BIT; // Bit 11
bVHigh : BIT; // Bit 12
bVLow : BIT; // Bit 13
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<DUT Name="ST_WORD_BMS_ERROR_BITMAP" Id="{33fc17c1-ae64-4c44-aa8c-117a09c656ef}">
<Declaration><![CDATA[TYPE ST_WORD_BMS_ERROR_BITMAP :
STRUCT
bEStop : BIT; // Bit 0
bEthercat : BIT; // Bit 1
bDCSwitchS1 : BIT; // Bit 2
bDCSwitchS2 : BIT; // Bit 3
bError : BIT; // Bit 4
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</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_WORD_BMS_WARNING_BITMAP" Id="{6dfd9c4b-4e74-434e-9f65-01d443c224d5}">
<Declaration><![CDATA[TYPE ST_WORD_BMS_WARNING_BITMAP :
STRUCT
bNotAllInAuto : BIT;
bSafetyIntlkString1 : BIT;
bSafetyIntlkString2 : BIT;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<DUT Name="U_BMS_ERROR_REGISTER" Id="{f3b37ac5-caba-4b85-a532-93295a2b6a11}">
<Declaration><![CDATA[TYPE U_BMS_ERROR_REGISTER :
UNION
wRegister : WORD;
stBitmap : ST_WORD_BMS_ERROR_BITMAP;
END_UNION
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<DUT Name="U_BMS_WARNING_REGISTER" Id="{00faf0ca-8dad-4f4f-9244-3aea273b10bd}">
<Declaration><![CDATA[TYPE U_BMS_WARNING_REGISTER :
UNION
wRegister : WORD;
stBitmap : ST_WORD_BMS_WARNING_BITMAP;
END_UNION
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<DUT Name="U_UNIT_ERROR_REGISTER" Id="{07ba2ddc-5e9f-4e51-9106-3d60de54c4e3}">
<Declaration><![CDATA[TYPE U_UNIT_ERROR_REGISTER :
UNION
dwRegister : DWORD;
stBitmap : ST_DWORD_UNIT_ERROR_BITMAP;
END_UNION
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<DUT Name="U_UNIT_WARNING_REGISTER" Id="{30d76b14-f783-4b87-a308-2e6a78ac04eb}">
<Declaration><![CDATA[TYPE U_UNIT_WARNING_REGISTER :
UNION
dwRegister : DWORD;
stBitmap : ST_DWORD_UNIT_WARNING_BITMAP;
END_UNION
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -1,25 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.11">
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<DUT Name="ST_MODBUS_REG_13" Id="{ff1eee07-3bd7-4808-a42a-073911e581d6}">
<Declaration><![CDATA[TYPE ST_MODBUS_REG_13 :
<Declaration><![CDATA[{attribute 'pack_mode' := '1'}
TYPE ST_MODBUS_REG_13 :
STRUCT
// String warning active flags
// Addr: 13.000
wBMSWarningActive : WORD;
wBMSWarningActive : U_BMS_WARNING_REGISTER;
// String error active
// Addr: 13.001
wBMSErrorActive : WORD;
wBMSErrorActive : U_BMS_ERROR_REGISTER;
// String warning active flags
// (Bit 0 -> String 1, Bit 1 -> String 2, etc.)
// (Bit 0 -> Warning in string 1 active, Bit 1 -> String 2, etc.)
// Addr: 13.002
wStringWarningActive : WORD;
// String error active
// (Bit 0 -> String 1, Bit 1 -> String 2, etc.)
// (Bit 0 -> Error in string 1 active, Bit 1 -> String 2, etc.)
// Addr: 13.003
wStringErrorActive : WORD;
// Confirm alarms through modbus
// Addr: 13.004
wConfirmAlarms : WORD;
END_STRUCT
END_TYPE
]]></Declaration>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.11">
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<GVL Name="GVL_MODBUS" Id="{913a9222-1338-4c08-b758-91c1bd26dcd9}">
<Declaration><![CDATA[{attribute 'qualified_only'}
VAR_GLOBAL
@@ -20,11 +20,13 @@ VAR_GLOBAL
// Addr: 13.000
stBMSErrorReg : ST_MODBUS_REG_13;
// Addr: 14.000 -> 14.023
awWarningsUnitsActive : ARRAY [0..(GVL_CONFIG.uiNumberOfUnits-1)] OF WORD;
// Addr: 14.000 -> 14.047
// Index 0 -> Unit 1, Index 1 -> Unit 2 etc.
awWarningsUnitsActive : ARRAY [0..(GVL_CONFIG.uiNumberOfUnits-1)] OF U_UNIT_WARNING_REGISTER;
// Addr: 15.000 -> 15.023
awErrorsUnitsActive : ARRAY [0..(GVL_CONFIG.uiNumberOfUnits-1)] OF WORD;
// Addr: 15.000 -> 15.047
// Index 0 -> Unit 1, Index 1 -> Unit 2 etc.
awErrorsUnitsActive : ARRAY [0..(GVL_CONFIG.uiNumberOfUnits-1)] OF U_UNIT_ERROR_REGISTER;
END_VAR]]></Declaration>
</GVL>
</TcPlcObject>

View File

@@ -9,7 +9,7 @@
<WriteProductVersion>true</WriteProductVersion>
<GenerateTpy>false</GenerateTpy>
<Name>PLC</Name>
<ProgramVersion>3.1.4026.14</ProgramVersion>
<ProgramVersion>3.1.4026.15</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>
@@ -57,6 +57,30 @@
<Compile Include="DUTs\E_COMPONENT_STATUS.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="DUTs\Modbus\ErrorWarningRegisters\ST_DWORD_UNIT_ERROR_BITMAP.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="DUTs\Modbus\ErrorWarningRegisters\ST_DWORD_UNIT_WARNING_BITMAP.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="DUTs\Modbus\ErrorWarningRegisters\ST_WORD_BMS_ERROR_BITMAP.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="DUTs\Modbus\ErrorWarningRegisters\ST_WORD_BMS_WARNING_BITMAP.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="DUTs\Modbus\ErrorWarningRegisters\U_BMS_ERROR_REGISTER.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="DUTs\Modbus\ErrorWarningRegisters\U_BMS_WARNING_REGISTER.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="DUTs\Modbus\ErrorWarningRegisters\U_UNIT_ERROR_REGISTER.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="DUTs\Modbus\ErrorWarningRegisters\U_UNIT_WARNING_REGISTER.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="DUTs\Modbus\HoldingRegisters\ST_MODBUS_REG_10.TcDUT">
<SubType>Code</SubType>
</Compile>
@@ -158,6 +182,7 @@
<Folder Include="DUTs" />
<Folder Include="DUTs\Modbus" />
<Folder Include="DUTs\Modbus\HoldingRegisters" />
<Folder Include="DUTs\Modbus\ErrorWarningRegisters" />
<Folder Include="GVLs" />
<Folder Include="POUs\Sunspec" />
<Folder Include="POUs\Sunspec\ModelData" />
@@ -2607,7 +2632,7 @@
<Type n="String">System.String</Type>
<Type n="UInt32">System.UInt32</Type>
</TypeList>
</XmlArchive>
</XmlArchive>
</PlcProjectOptions>
</ProjectExtensions>
</Project>

File diff suppressed because one or more lines are too long

View File

@@ -1,11 +1,15 @@
<?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_Module" Id="{87be924f-018d-4c09-997b-f0c0054414cc}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_Module
VAR_INPUT
// Emergency stop ok
xEmergencyStopOk : BOOL;
// Unit numbering start (0 based index)
// Unit 1 -> Index 0
uiFirstUnitIndex : UINT;
// Enable
xEnable : BOOL;
@@ -179,6 +183,8 @@ END_IF
// Leackage Unit 1/2 error (1 - OK; 0 - Leackage)
// ===============================
IF (NOT xLeakageSegments12) AND (NOT _fbLeackageSegment12Alarm.bRaised) AND xReleaseErrors THEN
GVL_MODBUS.awErrorsUnitsActive[uiFirstUnitIndex].stBitmap.bLeack := 1;
GVL_MODBUS.awErrorsUnitsActive[uiFirstUnitIndex+1].stBitmap.bLeack := 1;
_fbLeackageSegment12Alarm.Raise(0);
END_IF
@@ -195,6 +201,8 @@ END_IF
// Leackage Unit 3/4 error (1 - OK; 0 - Leackage)
// ===============================
IF (NOT xLeakageSegments34) AND (NOT _fbLeackageSegment34Alarm.bRaised) AND xReleaseErrors THEN
GVL_MODBUS.awErrorsUnitsActive[uiFirstUnitIndex+2].stBitmap.bLeack := 1;
GVL_MODBUS.awErrorsUnitsActive[uiFirstUnitIndex+3].stBitmap.bLeack := 1;
_fbLeackageSegment34Alarm.Raise(0);
END_IF
@@ -223,7 +231,9 @@ _fbUnit1(
xConfirmAlarms:= xConfirmAlarms,
xReleaseManualMode := xReleaseManualMode,
rBalancingTargetVoltage := rBalancingTargetVoltage,
xAllToManualMode := xAllToManualMode);
xAllToManualMode := xAllToManualMode,
stModbusWarnings := GVL_MODBUS.awWarningsUnitsActive[uiFirstUnitIndex],
stModbusErrors := GVL_MODBUS.awErrorsUnitsActive[uiFirstUnitIndex]);
refstHMIInterface.stHMIInterfaceUnit1.rCurrent := rCurrent;
@@ -261,7 +271,9 @@ _fbUnit2(
xConfirmAlarms:= xConfirmAlarms,
xReleaseManualMode := xReleaseManualMode,
rBalancingTargetVoltage := rBalancingTargetVoltage,
xAllToManualMode := xAllToManualMode);
xAllToManualMode := xAllToManualMode,
stModbusWarnings := GVL_MODBUS.awWarningsUnitsActive[uiFirstUnitIndex+1],
stModbusErrors := GVL_MODBUS.awErrorsUnitsActive[uiFirstUnitIndex+1]);
refstHMIInterface.stHMIInterfaceUnit2.rCurrent := rCurrent;
@@ -299,7 +311,9 @@ _fbUnit3(
xConfirmAlarms:= xConfirmAlarms,
xReleaseManualMode := xReleaseManualMode,
rBalancingTargetVoltage := rBalancingTargetVoltage,
xAllToManualMode := xAllToManualMode);
xAllToManualMode := xAllToManualMode,
stModbusWarnings := GVL_MODBUS.awWarningsUnitsActive[uiFirstUnitIndex+2],
stModbusErrors := GVL_MODBUS.awErrorsUnitsActive[uiFirstUnitIndex+2]);
refstHMIInterface.stHMIInterfaceUnit3.rCurrent := rCurrent;
@@ -337,7 +351,9 @@ _fbUnit4(
xConfirmAlarms:= xConfirmAlarms,
xReleaseManualMode := xReleaseManualMode,
rBalancingTargetVoltage := rBalancingTargetVoltage,
xAllToManualMode := xAllToManualMode);
xAllToManualMode := xAllToManualMode,
stModbusWarnings := GVL_MODBUS.awWarningsUnitsActive[uiFirstUnitIndex+3],
stModbusErrors := GVL_MODBUS.awErrorsUnitsActive[uiFirstUnitIndex+3]);
refstHMIInterface.stHMIInterfaceUnit4.rCurrent := rCurrent;
@@ -587,37 +603,5 @@ _fbLeackageSegment34Alarm.ipArguments.Clear().AddString(_sName);]]></ST>
</Implementation>
</Set>
</Property>
<LineIds Name="FB_Module">
<LineId Id="3" Count="81" />
<LineId Id="86" Count="9" />
<LineId Id="371" Count="1" />
<LineId Id="96" Count="25" />
<LineId Id="123" Count="9" />
<LineId Id="373" Count="1" />
<LineId Id="133" Count="25" />
<LineId Id="160" Count="9" />
<LineId Id="375" Count="1" />
<LineId Id="170" Count="25" />
<LineId Id="197" Count="9" />
<LineId Id="377" Count="1" />
<LineId Id="207" Count="135" />
<LineId Id="380" Count="1" />
<LineId Id="383" Count="0" />
<LineId Id="379" Count="0" />
<LineId Id="384" Count="0" />
<LineId Id="343" Count="27" />
<LineId Id="2" Count="0" />
</LineIds>
<LineIds Name="FB_Module.FB_init">
<LineId Id="3" Count="26" />
<LineId Id="2" Count="0" />
</LineIds>
<LineIds Name="FB_Module.Name.Get">
<LineId Id="2" Count="0" />
</LineIds>
<LineIds Name="FB_Module.Name.Set">
<LineId Id="3" Count="16" />
<LineId Id="2" Count="0" />
</LineIds>
</POU>
</TcPlcObject>

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;
// String number for unit numbering starting with 0 for String 1
uiStringNumber : UINT;
// Error shutdown -> No discharge throught inverter
xErrorShutdown : BOOL;
@@ -27,9 +30,6 @@ VAR_INPUT
// Reset Safety
xResetSafety : BOOL;
// All safetyinterlocks from safety plc are ok
xSafetyIntlksOk AT %I* : BOOL;
// Safety communication error
{attribute 'analysis' := '-33'}
xSafetyComError AT %I* : BOOL;
@@ -49,9 +49,6 @@ VAR_INPUT
// Switch all components to manual mode
xAllToManualMode : BOOL;
// Repair switch closed
xRepairSwitchOk AT %I* : BOOL;
// String inverter ip
sInverterIP : STRING;
@@ -61,6 +58,15 @@ VAR_INPUT
xIsoErrorL2 AT %I* : BOOL;
END_VAR
VAR_OUTPUT
// Repair switch closed
xRepairSwitchOk AT %I* : BOOL;
// All safetyinterlocks from safety plc are ok
xSafetyIntlksOk AT %I* : BOOL;
// All component safety interlocks are ok
xSafetyIntlksComponentsOk : BOOL;
// Current string voltage
rCurrentVoltage : REAL;
@@ -301,12 +307,12 @@ _fbStringCurrent(
stHMIInterface.rCurrent := _fbStringCurrent.stHMIInterface.rValue;
// ===============================
// Module 1
// ===============================
_fbModule1(
xEnable := _xEnable,
uiFirstUnitIndex := uiStringNumber * 12,
rCurrent := stHMIInterface.rCurrent,
xStartBalancing := _xStartBalancing,
xInverterEnabled := _fbInverter.xActive,
@@ -321,14 +327,12 @@ _fbModule1(
rBalancingTargetVoltage := rSmallestSegmentVoltage);
// ===============================
// Module 2
// ===============================
_fbModule2(
xEnable := _xEnable,
uiFirstUnitIndex := uiStringNumber * 12 + 4,
rCurrent := stHMIInterface.rCurrent,
xStartBalancing := _xStartBalancing,
xInverterEnabled := _fbInverter.xActive,
@@ -343,13 +347,12 @@ _fbModule2(
rBalancingTargetVoltage := rSmallestSegmentVoltage);
// ===============================
// Module 3
// ===============================
_fbModule3(
xEnable := _xEnable,
uiFirstUnitIndex := uiStringNumber * 12 + 8,
rCurrent := stHMIInterface.rCurrent,
xStartBalancing := _xStartBalancing,
xInverterEnabled := _fbInverter.xActive,
@@ -364,10 +367,18 @@ _fbModule3(
rBalancingTargetVoltage := rSmallestSegmentVoltage);
// ===============================
// Handle component safety interlocks ok
// ===============================
xSafetyIntlksComponentsOk := _fbModule1.xSafetyIntlksOk AND _fbModule2.xSafetyIntlksOk AND _fbModule3.xSafetyIntlksOk;
// ===============================
// Handle modules error state
// ===============================
_xModuleError := _fbModule1.xError OR _fbModule2.xError OR _fbModule3.xError;
_xModuleError := _fbModule1.xError OR _fbModule2.xError OR _fbModule3.xError OR (NOT xSafetyIntlksComponentsOk);
IF _xModuleError THEN
xError := TRUE;
END_IF
// ===============================
// Handle modules warning state
@@ -388,7 +399,7 @@ _xAllModulesInShutdownDischargeMode := _fbModule1.xInShutdownDischargeMode AND _
// ===============================
// Handle safety interlock alarm
// ===============================
IF NOT xSafetyIntlksOk AND NOT _fbSafetyInterlocksNotOkAlarm.bRaised THEN
IF (NOT xSafetyIntlksOk) AND NOT _fbSafetyInterlocksNotOkAlarm.bRaised THEN
_fbSafetyInterlocksNotOkAlarm.Raise(0);
END_IF
@@ -553,7 +564,7 @@ END_IF
CASE _iState OF
0: // Idle
// Start in normal mode
IF xEnable AND (NOT xStartBalancing) AND xAllModulesInAutoMode AND xRepairSwitchOk THEN
IF xEnable AND (NOT xStartBalancing) AND xAllModulesInAutoMode AND xRepairSwitchOk AND (NOT _xModuleError) THEN
_xEnable := TRUE;
//eStatus := E_COMPONENT_STATUS.STARTING;
IF xInSafetyCheckMode THEN
@@ -564,7 +575,7 @@ CASE _iState OF
END_IF
// Start in balancing mode
IF (NOT xEnable) AND xStartBalancing AND xAllModulesInAutoMode THEN
IF (NOT xEnable) AND xStartBalancing AND xAllModulesInAutoMode AND (NOT _xModuleError) THEN
_xStartBalancing := TRUE;
_xReleaseLimitErrorsInternal := FALSE;
//eStatus := E_COMPONENT_STATUS.STARTING;
@@ -611,7 +622,7 @@ CASE _iState OF
_iState := 0;
END_IF
IF xError THEN
IF _xModuleError THEN
_xEnable := FALSE;
_iState := 1000;
END_IF
@@ -651,6 +662,11 @@ CASE _iState OF
_iState := 1000;
END_IF
IF _xModuleError THEN
_xEnable := FALSE;
_iState := 1000;
END_IF
20: // Check if DC relais closed and safety is ok
IF NOT xDCCBOpen THEN
_tonErrorDCCBNotClosed.IN := FALSE;
@@ -680,6 +696,11 @@ CASE _iState OF
_iState := 40;
END_IF
IF _xModuleError THEN
_xEnable := FALSE;
_iState := 1000;
END_IF
21: // Wait for inverter to be ready
_tonInverterStartupTimeout(IN := TRUE);
IF _fbInverter.xActive AND (NOT _fbInverter.xError) THEN

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="FB_Unit" Id="{e9bb815b-eb46-4920-800d-910484e58b22}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_Unit
VAR_INPUT
@@ -48,6 +48,13 @@ VAR_INPUT
// Inverter enabled status
xInverterEnabled : BOOL;
END_VAR
VAR_IN_OUT
// Modbus warning register
stModbusWarnings : U_UNIT_WARNING_REGISTER;
// Modbus error register
stModbusErrors : U_UNIT_ERROR_REGISTER;
END_VAR
VAR_OUTPUT
// Unit state
//eUnitState : E_COMPONENT_STATUS := E_COMPONENT_STATUS.OFF;
@@ -315,9 +322,11 @@ _fbPosolytValveTankOutlet(
// Set error active if fb has error
IF _fbPosolytValveTankOutlet.xError THEN
stModbusErrors.stBitmap.bValvePos := 1;
_xErrorActive := TRUE;
END_IF
// Set safety interlock flag if fb has safety interlocks active
IF NOT stHMIInterface.stNS12.stInterlock.xSafetyINTLKOk THEN
xSafetyIntlksOk := FALSE;
@@ -346,6 +355,7 @@ _fbNegolytValveTankOutlet(
// Set error active if fb has error
IF _fbNegolytValveTankOutlet.xError THEN
stModbusErrors.stBitmap.bValveNeg := 1;
_xErrorActive := TRUE;
END_IF
@@ -385,6 +395,7 @@ _fbPosolytPumpInlet(
// Set error active if fb has error
IF _fbPosolytPumpInlet.xError THEN
stModbusErrors.stBitmap.bPumpPos := 1;
_xErrorActive := TRUE;
END_IF
@@ -429,6 +440,7 @@ _fbNegolytPumpInlet(
// Set error active if fb has error
IF _fbNegolytPumpInlet.xError THEN
stModbusErrors.stBitmap.bPumpNeg := 1;
_xErrorActive := TRUE;
END_IF
@@ -461,6 +473,26 @@ _fbPressurePosolytSegmentInlet(
_rFilteredPressPosolytInlet := _rFilteredPressPosolytInlet * 0.9 + stHMIInterface.stP11.rValue * 0.1;
stHMIInterface.stP11.rValue := _rFilteredPressPosolytInlet;
// Set modbus error register bits
IF _fbPressurePosolytSegmentInlet.xErrorLow THEN
stModbusErrors.stBitmap.bPInPosLow := 1;
END_IF
IF _fbPressurePosolytSegmentInlet.xErrorHigh THEN
stModbusErrors.stBitmap.bPInPosHigh := 1;
END_IF
IF _fbPressurePosolytSegmentInlet.xError THEN
stModbusErrors.stBitmap.bPInPosError := 1;
END_IF
// Set modbus warning register bits
IF _fbPressurePosolytSegmentInlet.xWarningLow THEN
stModbusWarnings.stBitmap.bPInPosLow := 1;
END_IF
IF _fbPressurePosolytSegmentInlet.xWarningHigh THEN
stModbusWarnings.stBitmap.bPInPosHigh := 1;
END_IF
// Set error active if fb has error
IF _fbPressurePosolytSegmentInlet.xError THEN
_xErrorActive := TRUE;
@@ -489,6 +521,25 @@ _fbPressureNegolytSegmentInlet(
_rFilteredPressNegolytInlet := _rFilteredPressNegolytInlet * 0.9 + stHMIInterface.stP21.rValue * 0.1;
stHMIInterface.stP21.rValue := _rFilteredPressNegolytInlet;
// Set modbus error register bits
IF _fbPressureNegolytSegmentInlet.xErrorLow THEN
stModbusErrors.stBitmap.bPInNegLow := 1;
END_IF
IF _fbPressureNegolytSegmentInlet.xErrorHigh THEN
stModbusErrors.stBitmap.bPInNegHigh := 1;
END_IF
IF _fbPressureNegolytSegmentInlet.xError THEN
stModbusErrors.stBitmap.bPInNegError := 1;
END_IF
// Set modbus warning register bits
IF _fbPressureNegolytSegmentInlet.xWarningLow THEN
stModbusWarnings.stBitmap.bPInNegLow := 1;
END_IF
IF _fbPressureNegolytSegmentInlet.xWarningHigh THEN
stModbusWarnings.stBitmap.bPInNegHigh := 1;
END_IF
// Set error active if fb has error
IF _fbPressureNegolytSegmentInlet.xError THEN
_xErrorActive := TRUE;
@@ -517,6 +568,25 @@ _fbPressurePosolytTankInlet(
_rFilteredPressPosolytTank := _rFilteredPressPosolytTank * 0.9 + stHMIInterface.stP12.rValue * 0.1;
stHMIInterface.stP12.rValue := _rFilteredPressPosolytTank;
// Set modbus error register bits
IF _fbPressurePosolytTankInlet.xErrorLow THEN
stModbusErrors.stBitmap.bPTankPosLow := 1;
END_IF
IF _fbPressurePosolytTankInlet.xErrorHigh THEN
stModbusErrors.stBitmap.bPTankPosHigh := 1;
END_IF
IF _fbPressurePosolytTankInlet.xError THEN
stModbusErrors.stBitmap.bPTankPosError := 1;
END_IF
// Set modbus warning register bits
IF _fbPressurePosolytTankInlet.xWarningLow THEN
stModbusWarnings.stBitmap.bPTankPosLow := 1;
END_IF
IF _fbPressurePosolytTankInlet.xWarningHigh THEN
stModbusWarnings.stBitmap.bPTankPosHigh := 1;
END_IF
// Set error active if fb has error
IF _fbPressurePosolytTankInlet.xError THEN
_xErrorActive := TRUE;
@@ -545,6 +615,25 @@ _fbPressureNegolytTankInlet(
_rFilteredPressNegolytTank := _rFilteredPressNegolytTank * 0.9 + stHMIInterface.stP22.rValue * 0.1;
stHMIInterface.stP22.rValue := _rFilteredPressNegolytTank;
// Set modbus error register bits
IF _fbPressureNegolytTankInlet.xErrorLow THEN
stModbusErrors.stBitmap.bPTankNegLow := 1;
END_IF
IF _fbPressureNegolytTankInlet.xErrorHigh THEN
stModbusErrors.stBitmap.bPTankNegHigh := 1;
END_IF
IF _fbPressureNegolytTankInlet.xError THEN
stModbusErrors.stBitmap.bPTankNegError := 1;
END_IF
// Set modbus warning register bits
IF _fbPressureNegolytTankInlet.xWarningLow THEN
stModbusWarnings.stBitmap.bPTankNegLow := 1;
END_IF
IF _fbPressureNegolytTankInlet.xWarningHigh THEN
stModbusWarnings.stBitmap.bPTankNegHigh := 1;
END_IF
// Set error active if fb has error
IF _fbPressureNegolytTankInlet.xError THEN
_xErrorActive := TRUE;
@@ -569,6 +658,25 @@ _fbTempSensorPosolyt(
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface=> stHMIInterface.stT11);
// Set modbus error register bits
IF _fbTempSensorPosolyt.xErrorLow THEN
stModbusErrors.stBitmap.bTPosLow := 1;
END_IF
IF _fbTempSensorPosolyt.xErrorHigh THEN
stModbusErrors.stBitmap.bTPosHigh := 1;
END_IF
IF _fbTempSensorPosolyt.xError THEN
stModbusErrors.stBitmap.bTPosError := 1;
END_IF
// Set modbus warning register bits
IF _fbTempSensorPosolyt.xWarningLow THEN
stModbusWarnings.stBitmap.bTPosLow := 1;
END_IF
IF _fbTempSensorPosolyt.xWarningHigh THEN
stModbusWarnings.stBitmap.bTPosHigh := 1;
END_IF
IF _fbTempSensorPosolyt.xError THEN
_xErrorActive := TRUE;
END_IF
@@ -591,6 +699,25 @@ _fbTempSensorNegolyt(
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface=> stHMIInterface.stT21);
// Set modbus error register bits
IF _fbTempSensorNegolyt.xErrorLow THEN
stModbusErrors.stBitmap.bTNegLow := 1;
END_IF
IF _fbTempSensorNegolyt.xErrorHigh THEN
stModbusErrors.stBitmap.bTNegHigh := 1;
END_IF
IF _fbTempSensorNegolyt.xError THEN
stModbusErrors.stBitmap.bTNegError := 1;
END_IF
// Set modbus warning register bits
IF _fbTempSensorNegolyt.xWarningLow THEN
stModbusWarnings.stBitmap.bTNegLow := 1;
END_IF
IF _fbTempSensorNegolyt.xWarningHigh THEN
stModbusWarnings.stBitmap.bTNegHigh := 1;
END_IF
IF _fbTempSensorNegolyt.xError THEN
_xErrorActive := TRUE;
END_IF
@@ -614,6 +741,25 @@ _fbVoltageSegment(
stHMIInterface=> stHMIInterface.stE31,
rScaledValue => rCurrentVoltage);
// Set modbus error register bits
IF _fbVoltageSegment.xErrorLow THEN
stModbusErrors.stBitmap.bVLow := 1;
END_IF
IF _fbVoltageSegment.xErrorHigh THEN
stModbusErrors.stBitmap.bVHigh := 1;
END_IF
IF _fbVoltageSegment.xError THEN
stModbusErrors.stBitmap.bVError := 1;
END_IF
// Set modbus warning register bits
IF _fbVoltageSegment.xWarningLow THEN
stModbusWarnings.stBitmap.bVLow := 1;
END_IF
IF _fbVoltageSegment.xWarningHigh THEN
stModbusWarnings.stBitmap.bVHigh := 1;
END_IF
// Set error active if fb has error
IF _fbVoltageSegment.xError THEN
_xErrorActive := TRUE;
@@ -704,6 +850,18 @@ StateMachine();
xError := _xErrorActive;
xWarning := _xWarningActive;
IF (NOT xSafetyIntlksOk) THEN
stModbusErrors.stBitmap.bSafetyIntlk := 1;
END_IF
// ===============================
// Reset modbus error register with alarm confirmation
// ===============================
IF xConfirmAlarms THEN
stModbusErrors.dwRegister := 0;
stModbusWarnings.dwRegister := 0;
END_IF
// ===============================
// Handle general error message

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
@@ -122,8 +122,6 @@ VAR
_xAllComponentsToManualMode : BOOL;
// DEBUG
_xRestart : BOOL;
_ModbusDebugTest : ST_MODBUS_REG_11;
_fbStringReadyTimeout : TON;
@@ -158,21 +156,7 @@ VAR
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// ===============================
// DEBUG
IF _xRestart AND (_iState = 1010) THEN
GVL_MODBUS.stModbusEMSComm.stModbusReg12.diSetpointActivePower := 0;
_xConfirmAlarms := TRUE;
END_IF
IF _xRestart AND (_iState = 0) THEN
_xRestart := FALSE;
GVL_MODBUS.stModbusEMSComm.stModbusReg12.diSetpointActivePower := 1000;
END_IF
// DEBUG
// ===============================
IF _xFirstCycle THEN
<ST><![CDATA[IF _xFirstCycle THEN
_xFirstCycle := FALSE;
_xGetPowerMeterData := TRUE;
@@ -206,6 +190,12 @@ IF GVL_SCADA.stAckAlarmsButton.xRequest THEN
GVL_SCADA.stAckAlarmsButton.xRequest := FALSE;
END_IF
// Ack alarms through modbus
IF GVL_MODBUS.stBMSErrorReg.wConfirmAlarms > 0 THEN
GVL_MODBUS.stBMSErrorReg.wConfirmAlarms := 0;
_xConfirmAlarms := TRUE;
END_IF
// ===============================
// EtherCAT communication error
// ===============================
@@ -218,6 +208,7 @@ _wDebug2 := (_wEtherCATState AND 16#2000);
// String 1 on X1 = Port D = 0x8000
IF (NOT _xEtherCatString1Ok) AND (NOT _fbEtherCATErrorString1.bRaised) THEN
_fbEtherCATErrorString1.Raise(0);
GVL_MODBUS.stBMSErrorReg.wBMSErrorActive.stBitmap.bEthercat := 1;
END_IF
IF _fbEtherCATErrorString1.bRaised AND (_xEtherCatString1Ok) THEN
@@ -231,6 +222,7 @@ END_IF
// String 2 on X2 = Port B = 0x2000
IF (NOT _xEtherCatString2Ok) AND (NOT _fbEtherCATErrorString2.bRaised) THEN
_fbEtherCATErrorString2.Raise(0);
GVL_MODBUS.stBMSErrorReg.wBMSErrorActive.stBitmap.bEthercat := 1;
END_IF
IF _fbEtherCATErrorString2.bRaised AND _xEtherCatString2Ok THEN
@@ -260,6 +252,8 @@ IF _fbEStopNotOk.eConfirmationState = TcEventConfirmationState.WaitForConfirmati
_fbEStopNotOk.Confirm(0);
END_IF
GVL_MODBUS.stBMSErrorReg.wBMSErrorActive.stBitmap.bEStop := (NOT _xEmergencyStopOk) OR _fbEStopNotOk.bRaised OR (_fbEStopNotOk.eConfirmationState <> TcEventConfirmationState.Confirmed);
// ===============================
// Hardware reset button part 1
// ===============================
@@ -303,6 +297,7 @@ _tonStartupDelay(IN := TRUE);
// Call string 1
_afbStrings[0](
xEnable := _xEnableString,
uiStringNumber := 0,
xErrorShutdown := _xErrorShutdown,
xStartBalancing := _xStartBalancing,
sInverterIP := GVL_CONFIG.sInverterIpString1,
@@ -321,9 +316,17 @@ IF _afbStrings[0].xError THEN
_xErrorActive := TRUE;
END_IF
// Handle string 1 modbus error and warning
GVL_MODBUS.stBMSErrorReg.wStringErrorActive.0 := _afbStrings[0].xError;
GVL_MODBUS.stBMSErrorReg.wStringWarningActive.0 := _afbStrings[0].xWarning;
GVL_MODBUS.stBMSErrorReg.wBMSErrorActive.stBitmap.bDCSwitchS1 := _afbStrings[0].xRepairSwitchOk;
GVL_MODBUS.stBMSErrorReg.wBMSWarningActive.stBitmap.bSafetyIntlkString1 := (NOT _afbStrings[0].xSafetyIntlksOk);
// Call string 2
_afbStrings[1](
xEnable := _xEnableString,
uiStringNumber := 1,
xErrorShutdown := _xErrorShutdown,
xStartBalancing := _xStartBalancing,
sInverterIP := GVL_CONFIG.sInverterIpString2,
@@ -342,6 +345,16 @@ IF _afbStrings[1].xError THEN
_xErrorActive := TRUE;
END_IF
// Handle string 1 modbus error and warning
GVL_MODBUS.stBMSErrorReg.wStringErrorActive.1 := _afbStrings[1].xError;
GVL_MODBUS.stBMSErrorReg.wStringWarningActive.1 := _afbStrings[1].xWarning;
GVL_MODBUS.stBMSErrorReg.wBMSErrorActive.stBitmap.bDCSwitchS2 := _afbStrings[1].xRepairSwitchOk;
GVL_MODBUS.stBMSErrorReg.wBMSWarningActive.stBitmap.bSafetyIntlkString2 := (NOT _afbStrings[1].xSafetyIntlksOk);
// Copy general error to modbus error register
GVL_MODBUS.stBMSErrorReg.wBMSErrorActive.stBitmap.bError := _xErrorActive;
// ===============================
// Get global string status information
// ===============================
@@ -616,6 +629,9 @@ IF _xStringsInAutoMode AND _fbNoAutomaticModeAlarm.bRaised THEN
_fbNoAutomaticModeAlarm.Clear(0, TRUE);
END_IF
// Copy auto mode warning message to modbus register
GVL_MODBUS.stBMSErrorReg.wBMSWarningActive.stBitmap.bNotAllInAuto := (NOT _xStringsInAutoMode);
// Reset automatic buttons
IF GVL_SCADA.stAutomaticModeHMI.stStartAutoButton.xRequest THEN
GVL_SCADA.stAutomaticModeHMI.stStartAutoButton.xRequest := FALSE;
@@ -626,6 +642,8 @@ END_IF
// Reset alarm confirmation
IF _xConfirmAlarms OR _rtHardwareResetButton.Q THEN
GVL_MODBUS.stBMSErrorReg.wBMSErrorActive.wRegister := 0;
GVL_MODBUS.stBMSErrorReg.wBMSWarningActive.wRegister := 0;
_xConfirmAlarms := FALSE;
END_IF

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="FB_PowerSupplySunspec" Id="{a826dd09-442c-45c5-8ae3-9b71f293003c}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_PowerSupplySunspec
VAR_INPUT
@@ -27,6 +27,9 @@ VAR
// Current state
_iState : INT := 0;
// Internal power command
_rPowerInternal : REAL;
// FB for reading Modbus holding registers
_fbReadRegister : FB_MBReadRegs;
@@ -67,9 +70,6 @@ VAR
// Current state of the inverters internal statemachine
_uiInverterState : UINT;
// Last written power to the inverter
_rOldPower : REAL;
// Value to enable or dissable the Power limiting feature
_uiMaxLimEn : UINT;
@@ -88,9 +88,15 @@ VAR
// 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;
// Timer for setting the inverter power
_tonSetPowerTimer : TON;
// 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;
@@ -227,6 +233,7 @@ CASE _iState OF
// If enable and INTLK Ok
IF xEnable THEN
_iState := 10;
_rPowerInternal := 0.0;
_tonPollingTimer(IN := FALSE, PT := _timPollingDelay);
ELSE
_tonPollingTimer(IN := TRUE, PT := _timPollingDelay);
@@ -598,7 +605,7 @@ CASE _iState OF
_rWMax := LREAL_TO_REAL(_uiWMax * EXPT(10,_iWMaxSF));
// Calculate power to write to register
_iWMaxLimPct := LREAL_TO_INT((rPower*100)/(_rWMax * EXPT(10,_iWMaxLimPctSF)));
_iWMaxLimPct := LREAL_TO_INT((_rPowerInternal*100)/(_rWMax * EXPT(10,_iWMaxLimPctSF)));
ELSE
xError := TRUE;
// Goto error state
@@ -629,7 +636,6 @@ CASE _iState OF
// And there is no error, then continue
IF NOT _fbWriteRegister.bError THEN
_iState := 50;
_rOldPower := rPower;
_uiMaxLimEn := 1;
_uiLastSetPowerLimitErrorCounter := _uiSetPowerLimitErrorCounter;
_uiSetPowerLimitErrorCounter := 0;
@@ -734,8 +740,8 @@ CASE _iState OF
IF NOT _fbWriteRegister.bBusy THEN
// And there is no error, then continue
IF NOT _fbWriteRegister.bError THEN
_iState := 51;
_uiPCSSetOperation := 4;
_iState := 60; // 51
_uiPCSSetOperation := 1; // 4
ELSE
xError := TRUE;
// Goto error state
@@ -764,10 +770,11 @@ CASE _iState OF
// If writing modbus register is done
IF NOT _fbWriteRegister.bBusy THEN
// And there is no error, then continue
IF NOT _fbWriteRegister.bError THEN
_uiPCSSetOperation := 1;
IF (NOT _fbWriteRegister.bError) THEN
//_uiPCSSetOperation := 1;
_iState := 60;
ELSE
_uiPCSSetOperation := 1;
// Goto error state
_iState := 1000;
END_IF
@@ -806,20 +813,26 @@ CASE _iState OF
65: // Wait for polling timer
_tonPollingTimer(IN := TRUE, PT := _timPollingDelay);
_tonSetPowerTimer(IN := TRUE, PT := _timSetPowerDelay);
IF _tonPollingTimer.Q THEN
_tonPollingTimer(IN := FALSE);
_iState := 70;
ELSIF (ABS(rPower - _rOldPower) > 0.1) THEN
//_tonPollingTimer(IN := FALSE);
ELSIF (ABS(rPower - _rPowerInternal) > 0.1) AND _tonSetPowerTimer.Q AND xEnable THEN
_tonSetPowerTimer(IN := FALSE);
_rPowerInternal := rPower;
// Calculate power to write to register
_iWMaxLimPct := LREAL_TO_INT((_rPowerInternal*100)/(_rWMax * EXPT(10,_iWMaxLimPctSF)));
// If power has been changed, goto set power limit mode
_iState := 40;
// Calculate power to write to register
_iWMaxLimPct := LREAL_TO_INT((rPower*100)/(_rWMax * EXPT(10,_iWMaxLimPctSF)));
END_IF
// check if inverter should shut down
IF NOT xEnable THEN
IF (NOT xEnable) THEN
_uiPCSSetOperation := 3;
_rPowerInternal := 0.0;
_iWMaxLimPct := 0;
// Goto shutdown sequence
_iState := 200;
END_IF
@@ -1024,7 +1037,8 @@ CASE _iState OF
_xInverterHBCounterIncremented := FALSE;
END_IF
_iState := 65;
// _iState := 65;
_iState := 93;
ELSE
xError := TRUE;
// Goto error state
@@ -1034,8 +1048,75 @@ CASE _iState OF
_fbReadRegister(bExecute := FALSE);
END_IF
93: // Send current power demand
_iErrorInState := _iState;
_fbWriteRegister(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#FF, // 16#FF for Modbus TCP
nQuantity:= 1,
nMBAddr:= W_MAX_LIM_PCT_REGISTER,
cbLength:= SIZEOF(_iWMaxLimPct),
pSrcAddr:= ADR(_iWMaxLimPct),
bExecute:= TRUE,
tTimeout:= T#5S,
bBusy=> ,
bError=> ,
nErrId=> );
200: // Shutdown sequence
// If writing modbus register is done
IF NOT _fbWriteRegister.bBusy THEN
// And there is no error, then continue
IF NOT _fbWriteRegister.bError THEN
_iState := 65;
_uiMaxLimEn := 1;
_uiLastSetPowerLimitErrorCounter := _uiSetPowerLimitErrorCounter;
_uiSetPowerLimitErrorCounter := 0;
// Calculate reactive power setting
//_iMaxPowerVar := LREAL_TO_INT((rReactivePower*100)/(_iMaxPowerVar * EXPT(10,_iVarPctSF)));
ELSE
_uiSetPowerLimitErrorCounter := _uiSetPowerLimitErrorCounter + 1;
IF _uiSetPowerLimitErrorCounter > 5 THEN
// Goto error state
_iState := 1000;
ELSE
_iState := 41;
END_IF
END_IF
_fbWriteRegister(bExecute := FALSE);
END_IF
200: // Shutdown send zero power command
_iErrorInState := _iState;
_fbWriteRegister(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#FF, // 16#FF for Modbus TCP
nQuantity:= 1,
nMBAddr:= W_MAX_LIM_PCT_REGISTER,
cbLength:= SIZEOF(_iWMaxLimPct),
pSrcAddr:= ADR(_iWMaxLimPct),
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
_iState := 201;
_uiPCSSetOperation := 3;
ELSE
// Goto error state
_iState := 1000;
END_IF
_fbWriteRegister(bExecute := FALSE);
END_IF
201: // Shutdown sequence
_iErrorInState := _iState;
_fbWriteRegister(
sIPAddr:= sInverterIPAddr,

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.15">
<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="{A93E0B35-31B3-621B-91F7-8267E02F5B8B}" TmcPath="PLC\PLC.tmc">
<Instance Id="#x08502000" TcSmClass="TComPlcObjDef" KeepUnrestoredLinks="2" TmcHash="{3270BB88-6285-1427-AFE9-B1C8C7F0C387}" TmcPath="PLC\PLC.tmc">
<Name>PLC Instance</Name>
<CLSID ClassFactory="TcPlc30">{08500001-0000-0000-F000-000000000064}</CLSID>
<Vars VarGrpType="2" AreaNo="1">
@@ -278,6 +278,19 @@
<Name>MAIN._xShowAckEmergencyStop</Name>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN.xSafetyRun</Name>
<Comment><![CDATA[ Safety]]></Comment>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN.xSafetyErrAck</Name>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._xShowErrorOnButton</Name>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._afbStrings[0].xCloseDCCB</Name>
<Comment><![CDATA[ Signal to close dc circuit breaker]]></Comment>
@@ -1282,19 +1295,6 @@
<Comment><![CDATA[ Motor speed setpoint]]></Comment>
<Type>INT</Type>
</Var>
<Var>
<Name>MAIN.xSafetyRun</Name>
<Comment><![CDATA[ Safety]]></Comment>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN.xSafetyErrAck</Name>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._xShowErrorOnButton</Name>
<Type>BOOL</Type>
</Var>
</Vars>
<Vars VarGrpType="1">
<Name>PlcTask Inputs</Name>
@@ -1303,8 +1303,29 @@
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._afbStrings[0].xSafetyIntlksOk</Name>
<Comment><![CDATA[ All safetyinterlocks from safety plc are ok]]></Comment>
<Name>MAIN.xSafetyResterTaster</Name>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._xHarwareResetButton</Name>
<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>
</Var>
<Var>
<Name>MAIN._fbSafety.xPressureInRange</Name>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._fbSafety.xTemperaturesInRange</Name>
<Type>BOOL</Type>
</Var>
<Var>
@@ -1312,11 +1333,6 @@
<Comment><![CDATA[ Safety communication error]]></Comment>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._afbStrings[0].xRepairSwitchOk</Name>
<Comment><![CDATA[ Repair switch closed]]></Comment>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._afbStrings[0].xECStateSCS</Name>
<Type>UINT</Type>
@@ -1329,6 +1345,16 @@
<Name>MAIN._afbStrings[0].xIsoErrorL2</Name>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._afbStrings[0].xRepairSwitchOk</Name>
<Comment><![CDATA[ Repair switch closed]]></Comment>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._afbStrings[0].xSafetyIntlksOk</Name>
<Comment><![CDATA[ All safetyinterlocks from safety plc are ok]]></Comment>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._afbStrings[0].xDCCBOpen</Name>
<Comment><![CDATA[ Signal that dc circuit breakers are closed]]></Comment>
@@ -4091,21 +4117,11 @@
EL30xx also sets this if an underrange or overrange error is present]]></Comment>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._afbStrings[1].xSafetyIntlksOk</Name>
<Comment><![CDATA[ All safetyinterlocks from safety plc are ok]]></Comment>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._afbStrings[1].xSafetyComError</Name>
<Comment><![CDATA[ Safety communication error]]></Comment>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._afbStrings[1].xRepairSwitchOk</Name>
<Comment><![CDATA[ Repair switch closed]]></Comment>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._afbStrings[1].xECStateSCS</Name>
<Type>UINT</Type>
@@ -4118,6 +4134,16 @@
<Name>MAIN._afbStrings[1].xIsoErrorL2</Name>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._afbStrings[1].xRepairSwitchOk</Name>
<Comment><![CDATA[ Repair switch closed]]></Comment>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._afbStrings[1].xSafetyIntlksOk</Name>
<Comment><![CDATA[ All safetyinterlocks from safety plc are ok]]></Comment>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._afbStrings[1].xDCCBOpen</Name>
<Comment><![CDATA[ Signal that dc circuit breakers are closed]]></Comment>
@@ -6880,32 +6906,6 @@
EL30xx also sets this if an underrange or overrange error is present]]></Comment>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN.xSafetyResterTaster</Name>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._xHarwareResetButton</Name>
<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>
</Var>
<Var>
<Name>MAIN._fbSafety.xPressureInRange</Name>
<Type>BOOL</Type>
</Var>
<Var>
<Name>MAIN._fbSafety.xTemperaturesInRange</Name>
<Type>BOOL</Type>
</Var>
</Vars>
<Contexts>
<Context>
@@ -7444,7 +7444,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>
@@ -7456,7 +7456,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>
@@ -8401,7 +8401,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>
@@ -8411,7 +8411,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>
@@ -8421,7 +8421,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>
@@ -9411,7 +9411,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -9686,7 +9686,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -9961,7 +9961,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -10236,7 +10236,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -10511,7 +10511,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -14018,7 +14018,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x0309000e" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -14201,7 +14201,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x0309000f" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -15191,7 +15191,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -15466,7 +15466,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -15741,7 +15741,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -16016,7 +16016,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -16291,7 +16291,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -19798,7 +19798,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090015" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -19981,7 +19981,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090016" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -20971,7 +20971,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -21246,7 +21246,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -21521,7 +21521,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -21796,7 +21796,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -22071,7 +22071,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -25578,7 +25578,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090021" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -25761,7 +25761,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090022" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -26612,7 +26612,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>
@@ -26622,7 +26622,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>
@@ -26632,7 +26632,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>
@@ -27621,7 +27621,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -27893,7 +27893,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -28165,7 +28165,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -28437,7 +28437,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -28709,7 +28709,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -32214,7 +32214,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090028" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -32395,7 +32395,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090029" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -33382,7 +33382,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -33654,7 +33654,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -33926,7 +33926,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -34198,7 +34198,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -34470,7 +34470,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -37975,7 +37975,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x0309002f" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -38156,7 +38156,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090030" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -39143,7 +39143,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -39415,7 +39415,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -39687,7 +39687,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -39959,7 +39959,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -40231,7 +40231,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>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>02000000340c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6664</PdoIndex>
<PdoIndex>5632</PdoIndex>
@@ -43736,7 +43736,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090036" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>
@@ -43917,7 +43917,7 @@ Bit1: Value smaller than Limit2]]></Comment>
<ModuleIdent>3214</ModuleIdent>
<Module Id="#x03090037" Type="EL3214-0090" Class="">
<Name>Module 1 (EL3214-0090)</Name>
<ImageId>524</ImageId>
<ImageId>554</ImageId>
<ModuleData>020000008e0c0000000014000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6660</PdoIndex>
<PdoIndex>5636</PdoIndex>

View File

@@ -26,6 +26,30 @@
<EndAddress>12004</EndAddress>
<VarName>GVL_MODBUS.stModbusEMSComm.stModbusReg12</VarName>
</MappingInfo>
<!-- 13.000 Registers -->
<MappingInfo>
<AdsPort>851</AdsPort>
<StartAddress>13000</StartAddress>
<EndAddress>13004</EndAddress>
<VarName>GVL_MODBUS.stBMSErrorReg</VarName>
</MappingInfo>
<!-- 14.000 Registers -->
<MappingInfo>
<AdsPort>851</AdsPort>
<StartAddress>14000</StartAddress>
<EndAddress>14047</EndAddress>
<VarName>GVL_MODBUS.awWarningsUnitsActive</VarName>
</MappingInfo>
<!-- 15.000 Registers -->
<MappingInfo>
<AdsPort>851</AdsPort>
<StartAddress>15000</StartAddress>
<EndAddress>15047</EndAddress>
<VarName>GVL_MODBUS.awErrorsUnitsActive</VarName>
</MappingInfo>
</OutputRegisters>
</Mapping>
</Configuration>