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

@@ -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