'-------------------------------------------------------------------- 'Name: CALC_CRC.TIG '-------------------------------------------------------------------- USER_VAR_STRICT #INCLUDE DEFINE_A.INC ARRAY wgCRC16Table(256) OF WORD WORD CRC_value 'for CRC calculation TASK MAIN ' begin task MAIN WORD wlCRC16_Value STRING A$ ' for command string INSTALL_DEVICE #1, "LCD1.TDD" A$ = "123456789" ' where CRC is calculated from ' A$ = "<2><3><6><53>" ' where CRC is calculated from ' A$="<2><3><12><52><255><255><255><255><255><255>" CALL CalcCRC16 (A$, wlCRC16_Value) USING "UH<4><4> 0.0.0.0.4" PRINT USING #1, "CRC Value: "; wlCRC16_Value END ' end task MAIN '---------------------------------------------------------------------------------------- ' Routine for calculating various CRC-16 checksums '---------------------------------------------------------------------------------------- ' ' You can calculate various different CRC-16 checksums by setting the appropriate ' values into the defines at the top of the code: ' ' seed polynomial Rever- Swap ' CRC-16 type value value sion XorOut CRC Bytes ' --------------------------------------------------------------------- ' CRC-16 00000h 0a001h* TRUE 00000h FALSE ' CRC-16 (Modbus) 0ffffh 0a001h* TRUE 00000h FALSE ' CRC-CCITT (XMODEM) 00000h 01021h FALSE 00000h FALSE ' CRC-CCITT (0xFFFF) 0ffffh 01021h FALSE 00000h FALSE ' CRC-CCITT (0x1D0F) 01d0fh 01021h FALSE 00000h FALSE ' CRC-CCITT (KERMIT) 00000h 08408h* TRUE 00000h TRUE ' CRC-16/DNP 00000h 0A6BCh* TRUE 0FFFFh TRUE ' ' * Polynomial values already reserved '---------------------------------------------------------------------------------------- ' ' Input: spData$ = string with data for CRC calculation ' ' Output: wvpCRC = word variable containing CRC value ' 'WS-------------------------------------------------------------------------------------- #DEFINE CRC_SEED_VALUE 00000h'01D0Fh'0FFFFh' #DEFINE POLYNOMIAL_VAL 0A001h'01021h'08408h'0A6BCh' #DEFINE REVERSION TRUE'FALSE' #DEFINE XOROUT 00000h'0FFFFh' #DEFINE SWAPCRC FALSE'TRUE' SUB calcCRC16(STRING spData$; VAR WORD wvpCRC) LONG BUFIDX BYTE BITIDX, REVERSED WORD Temp REVERSED = REVERSION wvpCRC = CRC_SEED_VALUE FOR BUFIDX = 0 TO LEN(spData$)-1 IF REVERSED = TRUE THEN wvpCRC = wvpCRC BITXOR ASC(MID$(spData$,BUFIDX,1)) ELSE wvpCRC = wvpCRC BITXOR (ASC(MID$(spData$,BUFIDX,1)) * 100h) ENDIF FOR BITIDX = 0 TO 7 IF REVERSED = TRUE THEN IF (wvpCRC BITAND 00001h) = 00001h THEN wvpCRC = (wvpCRC SHR 1) BITAND 07FFFh wvpCRC = wvpCRC BITXOR POLYNOMIAL_VAL ELSE wvpCRC = wvpCRC SHR 1 BITAND 07FFFh ENDIF ELSE IF (wvpCRC BITAND 08000h) = 08000h THEN wvpCRC = wvpCRC SHL 1 wvpCRC = wvpCRC BITXOR POLYNOMIAL_VAL ELSE wvpCRC = wvpCRC SHL 1 ENDIF ENDIF NEXT NEXT wvpCRC = wvpCRC BITAND 0FFFFh wvpCRC = wvpCRC BITXOR XOROUT IF SWAPCRC = TRUE THEN wvpCRC = BYTE_MIRR(wvpCRC, 2) ENDIF END