(* @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