发表于:2006/1/15 11:10:00
#0楼
FUNCTION FC300: VOID
VAR_INPUT
Source:ARRAY[0..19] OF BYTE;
Number:INT;
END_VAR
VAR_OUTPUT
CrcHigh,CrcLow:BYTE;
END_VAR
VAR_TEMP
Crc16Low, Crc16High, CLow, CHigh:BYTE;
SaveLow, SaveHigh:BYTE;
i, j:INT;
END_VAR
BEGIN
Crc16Low:=B#16#FF;
CRC16High:=B#16#FF;
CLow:=B#16#1;
CHigh:=B#16#A0;
FOR i:= 0 TO Number-1 BY 1 DO
Crc16Low:= Crc16Low XOR Source[i];
FOR j:= 0 TO 7 BY 1 DO
SaveHigh:= Crc16High;
SaveLow:= Crc16Low;
Crc16High:=SHR(IN:=Crc16High,N:=1);
Crc16Low:=SHR(IN:=Crc16Low,N:=1);
IF ((SaveHigh AND 2#1)=2#1) THEN
Crc16Low:= Crc16Low OR 2#10000000;
END_IF;
IF ((SaveLow AND 2#1) = 2#1) THEN //如果LSB为1,则与多项式码进行异或
CRC16High:= CRC16High XOR CHigh;
Crc16Low:= Crc16Low XOR CLow;
END_IF;
END_FOR;
END_FOR;
CrcHigh:=Crc16High;
CrcLow:=Crc16Low;
END_FUNCTION
对SCL有兴趣的朋友交流
MSN:yncxm@hotmail.com
VAR_INPUT
Source:ARRAY[0..19] OF BYTE;
Number:INT;
END_VAR
VAR_OUTPUT
CrcHigh,CrcLow:BYTE;
END_VAR
VAR_TEMP
Crc16Low, Crc16High, CLow, CHigh:BYTE;
SaveLow, SaveHigh:BYTE;
i, j:INT;
END_VAR
BEGIN
Crc16Low:=B#16#FF;
CRC16High:=B#16#FF;
CLow:=B#16#1;
CHigh:=B#16#A0;
FOR i:= 0 TO Number-1 BY 1 DO
Crc16Low:= Crc16Low XOR Source[i];
FOR j:= 0 TO 7 BY 1 DO
SaveHigh:= Crc16High;
SaveLow:= Crc16Low;
Crc16High:=SHR(IN:=Crc16High,N:=1);
Crc16Low:=SHR(IN:=Crc16Low,N:=1);
IF ((SaveHigh AND 2#1)=2#1) THEN
Crc16Low:= Crc16Low OR 2#10000000;
END_IF;
IF ((SaveLow AND 2#1) = 2#1) THEN //如果LSB为1,则与多项式码进行异或
CRC16High:= CRC16High XOR CHigh;
Crc16Low:= Crc16Low XOR CLow;
END_IF;
END_FOR;
END_FOR;
CrcHigh:=Crc16High;
CrcLow:=Crc16Low;
END_FUNCTION
对SCL有兴趣的朋友交流
MSN:yncxm@hotmail.com