恭喜,你发布的帖子
发布于 2017-10-07 20:30:15
8楼
FUNCTION "CRC_CHK" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_IN_OUT
ArrayBuf : Array[*] of Byte;
END_VAR
VAR_TEMP
ArrayBuf_LEN : UDInt;
VariantBuf : Variant;
CRC_INDEX : Int;
VariantBuf_LEN : DInt;
CRC_BIT : Int;
temp : Word;
temp_1 : Byte;
END_VAR
BEGIN
VariantPut(SRC:=#ArrayBuf,
DST:=#VariantBuf);
#ArrayBuf_LEN :=CountOfElements(#VariantBuf);
//CRC校验,将从数据块的第0个字节开始,一直到发送的最后一个字节
#ArrayBuf[#VariantBuf_LEN - 1] := 16#FF; //CRC寄存器的初始化
#ArrayBuf[#VariantBuf_LEN - 2] := 16#FF; //CRC寄存器的初始化
#temp.%B0 := #ArrayBuf[#VariantBuf_LEN - 1];
#temp.%B1 := #ArrayBuf[#VariantBuf_LEN - 2];
FOR #CRC_INDEX := 0 TO #VariantBuf_LEN - 3 BY 1 DO
//信息字节与当前CRC最低有效字节异或
#temp_1 := #ArrayBuf[#CRC_INDEX] AND 16#FF;
#temp := #temp_1 XOR #temp;
FOR #CRC_BIT := 0 TO 7 BY 1 DO
IF (#temp AND 16#01) = 16#01 THEN //CRC最低有效位为真
#temp := SHR(IN := #temp, N := 1); //右移1位
#temp := #temp XOR 16#A001; //与多项式异或
ELSE
#temp := SHR(IN := #temp, N := 1); //右移1位
END_IF;
END_FOR;
END_FOR;
//将CRC校验传到缓冲区
#ArrayBuf[#VariantBuf_LEN - 1] := #temp.%B1;
#ArrayBuf[#VariantBuf_LEN - 2] := #temp.%B0;
END_FUNCTION
以上是修改过的程序,用Array[*] of Byte确实不用开辟新的空间,但读取长度还需要 Variant类型的,这个程序仅仅是编译通过,没有测试的。
程序是块生成源,保存SCL格式的,再用笔记本打开复制出来的。
精华帖版主置评:认真研究,说干就干。钻研精神值得称赞。 -yming
请填写推广理由:
分享
只看
楼主