FUNCTION_BLOCK SPITemplate EXTENDS spi
VAR_OUTPUT
dwRaw: DWORD;
rValue: REAL;
END_VAR
VAR
usiBitWidth: USINT;
rResolution: REAL;
END_VAR
SUPER^();
CASE _iState OF
0:
IF SUPER^.init() THEN
_iState := 1;
END_IF
1:
_iState := 10;
END_CASE
METHOD AfterReadInputs: INT
VAR
aby: ARRAY [..] OF ;
usiChannel: USINT;
END_VAR
SUPER^.AfterReadInputs();
IF _iState = 10 THEN
FOR usiChannel := 0 TO 0 DO
aby[0] := 1;
aby[1] := 16#80 + SHL(usiChannel AND 7, 4);
aby[2] := 0;
aby[3] := 0;
IF NOT transfer(pabyTxBuffer:=ADR(aby) , pabyRxBuffer:=ADR(aby) , udiLen:=3 , uiDelayus:=0) THEN
_iState := 1000;
END_IF
CASE usiChannel OF
0:
dwRaw := aby[3];
dwRaw := SHL(dwRaw,8) OR aby[2];
dwRaw := SHL(dwRaw,8) OR aby[1];
dwRaw := SHL(dwRaw,8) OR aby[0];
rValue := DWORD_TO_REAL(SHR(dwRaw, usiBitWidth));
rValue := rValue * rResolution;
END_CASE
END_FOR
END_IF
METHOD BeforeWriteOutputs: INT
VAR
i: USINT;
END_VAR
SUPER^.BeforeWriteOutputs();
METHOD Initialize: UDINT
VAR_INPUT
wModuleType: UINT;
dwInstance: UDINT;
pConnector: pointer;
END_VAR
VAR
pParam: pointer;
udiResult: UDINT;
pusiBitWidth: pointer;
prResolution: pointer;
END_VAR
SUPER^.Initialize(wModuleType, dwInstance, pConnector);
pParam := ConfigGetParameter(_pConnector, 1000);
IF pParam <> 0 THEN
pusiBitWidth := IoStandard.ConfigGetParameterValuePointer(pParam, ADR(udiResult));
usiBitWidth := pusiBitWidth^;
END_IF
pParam := ConfigGetParameter(_pConnector, 1001);
IF pParam <> 0 THEN
prResolution := IoStandard.ConfigGetParameterValuePointer(pParam, ADR(udiResult));
rResolution := prResolution^;
END_IF