TwinCAT 3 CRC16程序

ST

TYPE ST_CRC_16 :
STRUCT
	nCRCHighLow:WORD;
	nCRCLowHigh:WORD;
	nCRCHigh:BYTE;
	nCRCLow:BYTE;
END_STRUCT
END_TYPE

FUN_CRC_16

FUNCTION FUN_CRC_16 : ST_CRC_16
VAR_INPUT
	pData:POINTER TO BYTE;
	nLength:UINT;
END_VAR
VAR
	nCRCInitial:WORD;
	i:UINT;
	j:UINT;
END_VAR
nCRCInitial:=16#FFFF;
FOR i:=0 TO nLength-1 BY 1 DO
	nCRCInitial:=pData[i] XOR nCRCInitial;
	FOR j:=0 TO 7 BY 1 DO
		IF (nCRCInitial AND 16#01)>0 THEN
			nCRCInitial:=SHR(nCRCInitial,1);
			nCRCInitial:=nCRCInitial XOR 16#A001;//0xa001是由0x8005高低位转换所得
		ELSE
			nCRCInitial:=SHR(nCRCInitial,1);
		END_IF
	END_FOR
END_FOR
FUN_CRC_16.nCRCHigh:=WORD_TO_BYTE(SHR(nCRCInitial,8));
FUN_CRC_16.nCRCLow:=WORD_TO_BYTE(nCRCInitial);
FUN_CRC_16.nCRCHighLow:=nCRCInitial;
FUN_CRC_16.nCRCLowHigh:=SHR(nCRCInitial,8) OR SHL(nCRCInitial,8);

P_CRC_16

PROGRAM P_CRC_16
VAR
	TestDATA:ARRAY[0..7] OF BYTE:=[16#B5,16#FF,16#F0,16#03,16#01,16#01,16#55,16#23];

	TestCRCHigh:BYTE;
	TestCRCLow:BYTE;

	TestCRCFun:ST_CRC_16;
END_VAR
//倍福自带CRC16
TestCRCHigh:=MEM.HighByte(MEM.CRC16_Modbus(pMemoryBlock:=ADR(TestDATA) ,uiLength:=SIZEOF(TestDATA)));
TestCRCLow:=MEM.LowByte(MEM.CRC16_Modbus(pMemoryBlock:=ADR(TestDATA) ,uiLength:=SIZEOF(TestDATA)));

//FUN
TestCRCFun:=FUN_CRC_16(pData:=ADR(TestDATA),nLength:=SIZEOF(TestDATA));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值