Minor bugfixes and future addons

This commit is contained in:
Matthias Heisig
2025-04-06 10:21:01 +02:00
parent 84e0e174a1
commit 2221f6bab3
22 changed files with 795 additions and 509 deletions

View File

@@ -3,49 +3,119 @@
<POU Name="FB_PowerMeter" Id="{9d4159f4-2d3f-4522-a770-c038a26d9d77}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_PowerMeter
VAR_INPUT
xResetEnergyCounter : BOOL;
xGetEnergyCounters : BOOL;
// IP 75 -> Umrichter
// IP 80 -> Hilfsenergie
sIpAddress : STRING(80);
END_VAR
VAR_OUTPUT
lrEnergyFromGrid : LREAL;
lrEnergyIntoGrid : LREAL;
xBusy : BOOL;
xError : BOOL;
END_VAR
VAR
_fbReadRegs : FB_MBReadInputRegs;
_fbWriteRegs : FB_MBWriteRegs;
_fbReadRegs : FB_MBReadRegs;
_awWordArray : ARRAY[0..3] OF WORD;
_awSwapped : ARRAY[0..3] OF WORD;
_udiErrorId : UDINT;
_fbREResetEnergyCounter : R_TRIG;
_fbGetEnergyCounters : R_TRIG;
_xResetEnergyCounter : BOOL;
_iState : INT := 0;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[_fbREResetEnergyCounter(CLK := xResetEnergyCounter);
<ST><![CDATA[_fbGetEnergyCounters(CLK := xGetEnergyCounters);
IF _fbREResetEnergyCounter.Q THEN
IF _fbGetEnergyCounters.Q THEN
_xResetEnergyCounter := TRUE;
END_IF
CASE _iState OF
0: // Idle
IF _xResetEnergyCounter THEN
xBusy := TRUE;
xError := FALSE;
_xResetEnergyCounter := FALSE;
_iState := 10;
END_IF
10: // Reset energy counters
_fbWriteRegs(
sIPAddr:= '192.168.42.80',
10: // Read energy from grid
_fbReadRegs(
sIPAddr:= sIpAddress,
nTCPPort:= 502,
nUnitID:= 16#FF ,
nQuantity:= ,
nMBAddr:= 16#0600,
cbLength:= ,
pSrcAddr:= ,
bExecute:= ,
nUnitID:= 16#FF,
nQuantity:= 4,
nMBAddr:= 8192,
cbLength:= SIZEOF(_awWordArray),
pDestAddr:= ADR(_awWordArray),
bExecute:= TRUE,
tTimeout:= ,
bBusy=> ,
bError=> ,
nErrId=> );
nErrId=> ,
cbRead=> );
IF (NOT _fbReadRegs.bBusy) AND (NOT _fbReadRegs.bError) THEN
_fbReadRegs(bExecute := FALSE);
SwapArray();
MEMCPY(ADR(lrEnergyFromGrid), ADR(_awSwapped), 8);
_iState := 20;
END_IF
IF _fbReadRegs.bError THEN
xBusy := FALSE;
xError := TRUE;
_udiErrorId := _fbReadRegs.nErrId;
lrEnergyFromGrid := 0;
_fbReadRegs(bExecute := FALSE);
_iState := 1000;
END_IF
20: // Read energy to grid
_fbReadRegs(
sIPAddr:= '192.168.42.75',
nTCPPort:= 502,
nUnitID:= 16#FF,
nQuantity:= 4,
nMBAddr:= 8196,
cbLength:= SIZEOF(_awWordArray),
pDestAddr:= ADR(_awWordArray),
bExecute:= TRUE,
tTimeout:= ,
bBusy=> ,
bError=> ,
nErrId=> ,
cbRead=> );
IF (NOT _fbReadRegs.bBusy) AND (NOT _fbReadRegs.bError) THEN
_fbReadRegs(bExecute := FALSE);
SwapArray();
MEMCPY(ADR(lrEnergyIntoGrid), ADR(_awSwapped), 8);
_iState := 0;
xBusy := FALSE;
END_IF
IF _fbReadRegs.bError THEN
xBusy := FALSE;
xError := TRUE;
_udiErrorId := _fbReadRegs.nErrId;
lrEnergyIntoGrid := 0;
_fbReadRegs(bExecute := FALSE);
_iState := 0;
END_IF
END_CASE]]></ST>
</Implementation>
<Action Name="SwapArray" Id="{96198008-b45e-42ee-9345-377fed90aab6}">
<Implementation>
<ST><![CDATA[_awSwapped[0] := _awWordArray[3];
_awSwapped[1] := _awWordArray[2];
_awSwapped[2] := _awWordArray[1];
_awSwapped[3] := _awWordArray[0];]]></ST>
</Implementation>
</Action>
</POU>
</TcPlcObject>