147 lines
2.9 KiB
XML
147 lines
2.9 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<TcPlcObject Version="1.1.0.1">
|
|
<POU Name="FB_CoolPlate" Id="{629e3316-5d72-4e23-a03a-af14d37e58d6}" SpecialFunc="None">
|
|
<Declaration><![CDATA[FUNCTION_BLOCK FB_CoolPlate
|
|
VAR_INPUT
|
|
rTempSetpoint : REAL := 25.0;
|
|
END_VAR
|
|
VAR_OUTPUT
|
|
END_VAR
|
|
VAR
|
|
// Card inputs
|
|
_stStatus AT %I* : ST_SerialStatus;
|
|
_byDataIn AT %I* : ARRAY[0..21] OF BYTE;
|
|
|
|
// Card outputs
|
|
_stCtrl AT %Q* : ST_SerialCrl;
|
|
_byDataOut AT %Q* : ARRAY[0..21] OF BYTE;
|
|
|
|
// Internal temp setpoint
|
|
_rTempSetpoint : REAL;
|
|
|
|
// Send trigger
|
|
_xSend : BOOL;
|
|
|
|
// Send temp test
|
|
_xTempTest : BOOL;
|
|
|
|
// Init trigger
|
|
_xInit : BOOL;
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[// Clamp temperature settings
|
|
_rTempSetpoint := rTempSetpoint;
|
|
|
|
IF _rTempSetpoint > 60.0 THEN
|
|
_rTempSetpoint := 60.0;
|
|
END_IF
|
|
|
|
IF _rTempSetpoint < 10.0 THEN
|
|
_rTempSetpoint := 10.0;
|
|
END_IF
|
|
|
|
// Init card on first run
|
|
IF _xInit THEN
|
|
_xInit := FALSE;
|
|
_stCtrl.bInitRequest := 1;
|
|
END_IF
|
|
|
|
IF _stStatus.bInitAccepted THEN
|
|
_stCtrl.bInitRequest := 0;
|
|
END_IF
|
|
|
|
// Send
|
|
IF _xSend THEN
|
|
_xSend := FALSE;
|
|
_stCtrl.bTransmitRequest := 1;
|
|
END_IF
|
|
|
|
IF _stStatus.bTransmitAccepted THEN
|
|
_stCtrl.bTransmitRequest := 0;
|
|
END_IF
|
|
|
|
// Debug test
|
|
IF _xTempTest THEN
|
|
_xTempTest := FALSE;
|
|
M_SetTemp(rTemp := _rTempSetpoint);
|
|
_xSend := TRUE;
|
|
END_IF]]></ST>
|
|
</Implementation>
|
|
<Method Name="M_CalcChecksum" Id="{dc2c8dbc-8315-4281-befa-84b7f4e74dc9}">
|
|
<Declaration><![CDATA[METHOD M_CalcChecksum
|
|
VAR_INPUT
|
|
uiStartIndex : UINT;
|
|
uiEndIndex : UINT;
|
|
END_VAR
|
|
VAR_OUTPUT
|
|
byHigh : BYTE;
|
|
byLow : BYTE;
|
|
END_VAR
|
|
VAR
|
|
_dwChecksum : DWORD;
|
|
_uiCounter : UINT;
|
|
|
|
_byHigh : BYTE;
|
|
_byLow : BYTE;
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[// Calculate sum
|
|
FOR _uiCounter := uiStartIndex TO uiEndIndex DO
|
|
_dwChecksum := _dwChecksum + _byDataOut[_uiCounter];
|
|
END_FOR
|
|
|
|
// Use lower bytes
|
|
_byHigh := SHR(_dwChecksum.%B0 AND 16#F0, 4);
|
|
_byLow := _dwChecksum.%B0 AND 16#0F;
|
|
|
|
// Add offset
|
|
_byHigh := _byHigh + 16#30;
|
|
_byLow := _byLow + 16#30;
|
|
|
|
byHigh := _byHigh;
|
|
byLow := _byLow;]]></ST>
|
|
</Implementation>
|
|
</Method>
|
|
<Method Name="M_SetTemp" Id="{e9f6069c-f4a0-47e4-9ef0-4fbbec8764d9}">
|
|
<Declaration><![CDATA[METHOD M_SetTemp
|
|
VAR_INPUT
|
|
rTemp : REAL;
|
|
END_VAR
|
|
VAR
|
|
_dwTemp : DWORD;
|
|
_sTemp : STRING(4);
|
|
|
|
_byHigh : BYTE;
|
|
_byLow : BYTE;
|
|
_sHexString : STRING(4);
|
|
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[// Convert temperature
|
|
_dwTemp := REAL_TO_DWORD(rTemp * 10)*10;
|
|
_sTemp := DWORD_TO_STRING(_dwTemp);
|
|
|
|
_byDataOut[0] := 16#02; // STX
|
|
_byDataOut[1] := 16#31; // Command code
|
|
_byDataOut[2] := _sTemp[0];
|
|
_byDataOut[3] := _sTemp[1];
|
|
_byDataOut[4] := _sTemp[2];
|
|
_byDataOut[5] := _sTemp[3];
|
|
_byDataOut[6] := 16#03; // ETX
|
|
|
|
M_CalcChecksum(
|
|
uiStartIndex:= 1,
|
|
uiEndIndex:= 5,
|
|
byHigh=> _byDataOut[7],
|
|
byLow=> _byDataOut[8]);
|
|
|
|
_byDataOut[9] := 16#0D; // <CR>
|
|
|
|
_stCtrl.byOutputLength := 10;]]></ST>
|
|
</Implementation>
|
|
</Method>
|
|
</POU>
|
|
</TcPlcObject> |