ParamManagerScripts/backend/script_groups/TwinCat/.example/ADSVARTRANSLATE.EXP

144 lines
3.0 KiB
Plaintext

(* @PATH := '\/Functions_Collection' *)
(* @SYMFILEFLAGS := '0' *)
FUNCTION_BLOCK ADSVARTRANSLATE
VAR_INPUT
FORMAT : STRING(255);
SOURCELEN : UDINT;
SOURCEADDR : DWORD;
DESTADDR : DWORD;
START : BOOL;
END_VAR
VAR_OUTPUT
READY : BOOL;
ERR : BOOL;
END_VAR
VAR
baName : ARRAY [1..255] OF BYTE;
nStrMaxIdx : INT;
nStrIdx : INT;
baData : ARRAY [1..255] OF BYTE;
nDataMaxIdx : INT;
nDataIdx : INT;
nCount : INT;
bTemp : BYTE;
fbRTrig : R_TRIG;
END_VAR
(* @END_DECLARATION := '0' *)
fbRTrig(CLK:= START);
IF fbRTrig.Q THEN
ERR := FALSE;
nStrMaxIdx := MIN(LEN(FORMAT),255);
MEMCPY(ADR(baName),ADR(FORMAT),nStrMaxIdx);
nDataMaxIdx := UDINT_TO_INT(MIN(SOURCELEN,255));
MEMCPY(ADR(baData),SOURCEADDR,nDataMaxIdx);
nStrIdx := 1;
nDataIdx := 1;
WHILE(nStrIdx<=nStrMaxIdx) DO
nCount := 1;
IF(baName[nStrIdx] >= 48 AND baName[nStrIdx] <= 57) THEN
nCount := baName[nStrIdx] - 48;
nStrIdx := nStrIdx+1;
IF(nStrIdx>nStrMaxIdx) THEN
ERR := TRUE;
EXIT;
END_IF
IF(baName[nStrIdx] >= 48 AND baName[nStrIdx] <= 57) THEN
nCount := 10 * nCount + baName[nStrIdx] - 48;
nStrIdx := nStrIdx+1;
IF(nStrIdx>nStrMaxIdx) THEN
ERR := TRUE;
EXIT;
END_IF
END_IF
END_IF
IF(baName[nStrIdx] = 68 OR baName[nStrIdx] = 100) THEN
(*
dword data: revert bytes
*)
WHILE(nCount > 0)DO
IF((nDataIdx+3) > nDataMaxIdx) THEN
ERR := TRUE;
EXIT;
END_IF
bTemp := baData[nDataIdx];
baData[nDataIdx] := baData[nDataIdx+3];
baData[nDataIdx+3] := bTemp;
bTemp := baData[nDataIdx+1];
baData[nDataIdx+1] := baData[nDataIdx+2];
baData[nDataIdx+2] := bTemp;
nDataIdx := nDataIdx + 4;
nCount := nCount - 1;
END_WHILE;
nStrIdx := nStrIdx+1;
ELSIF(baName[nStrIdx] = 82 OR baName[nStrIdx] = 114) THEN
(*
real data: revert bytes
*)
WHILE(nCount > 0)DO
IF((nDataIdx+3) > nDataMaxIdx) THEN
ERR := TRUE;
EXIT;
END_IF
bTemp := baData[nDataIdx];
baData[nDataIdx] := baData[nDataIdx+3];
baData[nDataIdx+3] := bTemp;
bTemp := baData[nDataIdx+1];
baData[nDataIdx+1] := baData[nDataIdx+2];
baData[nDataIdx+2] := bTemp;
nDataIdx := nDataIdx + 4;
nCount := nCount - 1;
END_WHILE;
nStrIdx := nStrIdx+1;
ELSIF(baName[nStrIdx] = 87 OR baName[nStrIdx] = 119) THEN
(*
word data: swap high / low byte
*)
WHILE(nCount > 0)DO
IF((nDataIdx+1) > nDataMaxIdx) THEN
ERR := TRUE;
EXIT;
END_IF
bTemp := baData[nDataIdx];
baData[nDataIdx] := baData[nDataIdx+1];
baData[nDataIdx+1] := bTemp;
nDataIdx := nDataIdx + 2;
nCount := nCount - 1;
END_WHILE;
nStrIdx := nStrIdx+1;
ELSIF(baName[nStrIdx] = 66 OR baName[nStrIdx] = 98) THEN
(*
byte data: skip byte
*)
WHILE(nCount > 0)DO
IF(nDataIdx > nDataMaxIdx) THEN
ERR := TRUE;
EXIT;
END_IF
nDataIdx := nDataIdx + 1;
nCount := nCount - 1;
END_WHILE;
nStrIdx := nStrIdx+1;
ELSE
ERR := TRUE;
EXIT;
END_IF
END_WHILE;
MEMCPY(DESTADDR,ADR(baData),nDataMaxIdx);
END_IF
READY := START;
END_FUNCTION_BLOCK