Linked all tank sensors in media cabinet
- Additional fixes for the hmi
This commit is contained in:
248
PLC/01_Stationen/MediaStation/FB_Levi_LFC6IO.TcPOU
Normal file
248
PLC/01_Stationen/MediaStation/FB_Levi_LFC6IO.TcPOU
Normal file
@@ -0,0 +1,248 @@
|
||||
<?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>
|
||||
Reference in New Issue
Block a user