248 lines
6.3 KiB
XML
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> |