144 lines
3.0 KiB
Plaintext
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
|