Finished first implementation of modbus error registers
This commit is contained in:
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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" />
|
||||
@@ -215,8 +240,8 @@
|
||||
<ProjectExtensions>
|
||||
<PlcProjectOptions>
|
||||
<XmlArchive>
|
||||
<Data>
|
||||
<o xml:space="preserve" t="OptionKey">
|
||||
<Data>
|
||||
<o xml:space="preserve" t="OptionKey">
|
||||
<v n="Name">"<ProjectRoot>"</v>
|
||||
<d n="SubKeys" t="Hashtable" ckt="String" cvt="OptionKey">
|
||||
<v>{192FAD59-8248-4824-A8DE-9177C94C195A}</v>
|
||||
@@ -2598,16 +2623,16 @@
|
||||
</d>
|
||||
<d n="Values" t="Hashtable" />
|
||||
</o>
|
||||
</Data>
|
||||
<TypeList>
|
||||
<Type n="Boolean">System.Boolean</Type>
|
||||
<Type n="Hashtable">System.Collections.Hashtable</Type>
|
||||
<Type n="Int32">System.Int32</Type>
|
||||
<Type n="OptionKey">{54dd0eac-a6d8-46f2-8c27-2f43c7e49861}</Type>
|
||||
<Type n="String">System.String</Type>
|
||||
<Type n="UInt32">System.UInt32</Type>
|
||||
</TypeList>
|
||||
</XmlArchive>
|
||||
</Data>
|
||||
<TypeList>
|
||||
<Type n="Boolean">System.Boolean</Type>
|
||||
<Type n="Hashtable">System.Collections.Hashtable</Type>
|
||||
<Type n="Int32">System.Int32</Type>
|
||||
<Type n="OptionKey">{54dd0eac-a6d8-46f2-8c27-2f43c7e49861}</Type>
|
||||
<Type n="String">System.String</Type>
|
||||
<Type n="UInt32">System.UInt32</Type>
|
||||
</TypeList>
|
||||
</XmlArchive>
|
||||
</PlcProjectOptions>
|
||||
</ProjectExtensions>
|
||||
</Project>
|
||||
624
PLC/PLC.tmc
624
PLC/PLC.tmc
File diff suppressed because one or more lines are too long
@@ -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>
|
||||
@@ -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,
|
||||
@@ -341,8 +345,6 @@ _fbModule2(
|
||||
xConfirmAlarms:= xConfirmAlarms,
|
||||
xAllToManualMode := xAllToManualMode,
|
||||
rBalancingTargetVoltage := rSmallestSegmentVoltage);
|
||||
|
||||
|
||||
|
||||
|
||||
// ===============================
|
||||
@@ -350,6 +352,7 @@ _fbModule2(
|
||||
// ===============================
|
||||
_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
|
||||
@@ -650,6 +661,11 @@ CASE _iState OF
|
||||
END_IF
|
||||
_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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -460,7 +472,27 @@ _fbPressurePosolytSegmentInlet(
|
||||
// Filter pressure sensor data for HMI
|
||||
_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;
|
||||
@@ -488,6 +520,25 @@ _fbPressureNegolytSegmentInlet(
|
||||
// Filter pressure sensor data for HMI
|
||||
_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
|
||||
@@ -516,6 +567,25 @@ _fbPressurePosolytTankInlet(
|
||||
// Filter pressure sensor data for HMI
|
||||
_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
|
||||
@@ -544,6 +614,25 @@ _fbPressureNegolytTankInlet(
|
||||
// Filter pressure sensor data for HMI
|
||||
_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
|
||||
@@ -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
|
||||
|
||||
@@ -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><;
|
||||
|
||||
|
||||
// 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
|
||||
|
||||
|
||||
@@ -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,22 +813,28 @@ 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;
|
||||
_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=> );
|
||||
|
||||
// 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 sequence
|
||||
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user