Files
infineon_plc/PLC/01_Stationen/MediaStation/FB_Levi_LFC6IO.TcPOU
m.heisig f4562af86f Linked all tank sensors in media cabinet
- Additional fixes for the hmi
2026-03-10 18:03:28 +01:00

248 lines
6.3 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_Levi_LFC6IO" Id="{650b4e84-15bc-4cc6-bda5-d5ab333779ee}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_Levi_LFC6IO
VAR_INPUT
// Base station address
byBaseAddr : BYTE;
xReleaseAlarms : BOOL;
xConfirmAlarms : BOOL;
END_VAR
VAR_IN_OUT
// Modbus master comm fb
fbMBMaster : FB_ModbusMaster;
END_VAR
VAR_OUTPUT
// Current flowrate in ml/min
rCurrFlowrate : ARRAY[0..5] OF REAL;
xBusy : BOOL;
xDone : BOOL;
xError : BOOL;
END_VAR
VAR
// Full scale value of all channels in ml/min
_dwFullScale : DWORD := 4000;
// Channel data
_astChannelData : ARRAY[0..5] OF ST_Levi_ChData;
// Temporary data storage for writing settings
_awTempData : ARRAY[0..1] OF WORD;
// Start waiting for response
_xExecute : BOOL;
_xReady : BOOL;
_xError : BOOL;
// Request data
_stModbusData : ST_Modbus_Req;
_xMBDone : BOOL;
_xMBError : BOOL;
// State machine state
_iState : INT;
END_VAR
VAR CONSTANT
REG_SET_MODE : WORD := 0;
REG_FULL_SCALE : WORD := 2;
REG_CH_DATA : WORD := 0;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[CASE _iState OF
// Idle
0:
IF _xExecute THEN
_xExecute := FALSE;
_iState := 10;
END_IF
// Wait for reading done
10:
IF _xMBDone THEN
_xReady := TRUE;
xBusy := FALSE;
xDone := TRUE;
_iState := 0;
END_IF
IF _xMBError THEN
_iState := 900;
END_IF
// Error state
900:
xDone := FALSE;
xBusy := FALSE;
xError := TRUE;
_iState := 901;
// Wait for reset
901:
IF xConfirmAlarms THEN
_xReady := TRUE;
xError := FALSE;
_iState := 0;
END_IF
END_CASE
// Calculate output data
M_CalcOutputData();]]></ST>
</Implementation>
<Method Name="M_CalcOutputData" Id="{5b932e1a-1437-4032-adb5-2eae4b98574c}">
<Declaration><![CDATA[METHOD PRIVATE M_CalcOutputData
VAR
i : int;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[FOR i := 0 TO 5 DO
// Current flowrate from channel data is in % of full scale (-30.000 ~ 30.000 => (-300 ~ +300) %
// _Full scale is in l/min but scaling is as followed: 10 ~ 500000 => (0.010 ~ 500) l/min => (10 ~ 500.000) ml/min
// Result is in ml/min
rCurrFlowrate[i] := (SINT_TO_REAL(_astChannelData[i].siCurrFlow) * DWORD_TO_REAL(_dwFullScale)) / 10_000;
END_FOR
]]></ST>
</Implementation>
</Method>
<Method Name="M_DisableSetMode" Id="{f89e844d-3a6f-40d7-9da3-bae450f616ea}">
<Declaration><![CDATA[METHOD M_DisableSetMode : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF _xReady THEN
M_StartExec();
// Prepare value to write
_awTempData[0] := 0;
_awTempData[1] := 0;
_stModbusData.bySlaveAddr := byBaseAddr;
_stModbusData.eCmd := E_Modbus_Cmd.WRITE_HOLDING;
_stModbusData.pvData := ADR(_awTempData);
_stModbusData.pxDone := ADR(_xMBDone);
_stModbusData.pxError := ADR(_xMBError);
_stModbusData.wDataSize := SIZEOF(_awTempData[0]);
_stModbusData.wQuantity := 1;
_stModbusData.wStartAddr := REG_SET_MODE;
fbMBMaster.M_Enqueue(stReq := _stModbusData);
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_EnableSetMode" Id="{de18b8f5-be31-468c-a5e8-49fab953c64b}">
<Declaration><![CDATA[METHOD M_EnableSetMode : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF _xReady THEN
M_StartExec();
// Prepare value to write
_awTempData[0] := 2#10;
_awTempData[1] := 0;
_stModbusData.bySlaveAddr := byBaseAddr;
_stModbusData.eCmd := E_Modbus_Cmd.WRITE_HOLDING;
_stModbusData.pvData := ADR(_awTempData);
_stModbusData.pxDone := ADR(_xMBDone);
_stModbusData.pxError := ADR(_xMBError);
_stModbusData.wDataSize := SIZEOF(_awTempData[0]);
_stModbusData.wQuantity := 1;
_stModbusData.wStartAddr := REG_SET_MODE;
fbMBMaster.M_Enqueue(stReq := _stModbusData);
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_PollSensorData" Id="{95195e13-015b-491e-bb17-770ecd95cc2e}">
<Declaration><![CDATA[METHOD M_PollSensorData : BOOL;
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF _xReady THEN
M_StartExec();
_stModbusData.bySlaveAddr := byBaseAddr;
_stModbusData.eCmd := E_Modbus_Cmd.READ_INPUTS;
_stModbusData.pvData := ADR(_astChannelData);
_stModbusData.pxDone := ADR(_xMBDone);
_stModbusData.pxError := ADR(_xMBError);
_stModbusData.wDataSize := SIZEOF(_astChannelData);
_stModbusData.wQuantity := 24;
_stModbusData.wStartAddr := REG_CH_DATA;
fbMBMaster.M_Enqueue(stReq := _stModbusData);
END_IF
]]></ST>
</Implementation>
</Method>
<Method Name="M_ReadFullScale" Id="{14c84036-88ce-4b20-9f11-8cae269c566f}">
<Declaration><![CDATA[METHOD M_ReadFullScale : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF _xReady THEN
M_StartExec();
_stModbusData.bySlaveAddr := byBaseAddr;
_stModbusData.eCmd := E_Modbus_Cmd.READ_HOLDING;
_stModbusData.pvData := ADR(_dwFullScale);
_stModbusData.pxDone := ADR(_xMBDone);
_stModbusData.pxError := ADR(_xMBError);
_stModbusData.wDataSize := SIZEOF(_dwFullScale);
_stModbusData.wQuantity := 2;
_stModbusData.wStartAddr := REG_FULL_SCALE;
fbMBMaster.M_Enqueue(stReq := _stModbusData);
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_SetFullScale" Id="{ee32b999-71fe-4e16-ab8c-09e92e1f41ef}">
<Declaration><![CDATA[METHOD M_SetFullScale : BOOL
VAR_INPUT
// Full scale in ml/min
dwFullScale : DWORD;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF _xReady THEN
M_StartExec();
_dwFullScale := dwFullScale;
_stModbusData.bySlaveAddr := byBaseAddr;
_stModbusData.eCmd := E_Modbus_Cmd.WRITE_HOLDING;
_stModbusData.pvData := ADR(_dwFullScale);
_stModbusData.pxDone := ADR(_xMBDone);
_stModbusData.pxError := ADR(_xMBError);
_stModbusData.wDataSize := SIZEOF(_dwFullScale);
_stModbusData.wQuantity := 2;
_stModbusData.wStartAddr := REG_FULL_SCALE;
fbMBMaster.M_Enqueue(stReq := _stModbusData);
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_StartExec" Id="{991a93fa-4cc2-4ad6-b2a3-8f9bf70f5fb5}">
<Declaration><![CDATA[METHOD PRIVATE M_StartExec
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[xBusy := TRUE;
xDone := FALSE;
xError := FALSE;
_xReady := FALSE;
_xExecute := TRUE;]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>