Finished first implementation of modbus error registers
This commit is contained in:
@@ -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