找答案的高端用户(找答案钻石及双钻级别的用户)将尽可能从此问题下的所有回
答中,为您推荐最佳答案。届时您可以根据推荐数采纳答案。
如果自提问时间起7天内您仍无法选出最佳答案,您可以选择“无满意答案”关闭此问题。
问题
取消精华
首页精华问答
取消推荐
高端用户推荐
申请置评
已申请置评
修改
修改标签
添加标签
官方认证
取消官方认证
修改标签
添加标签
转移分类
删除
{{itemCategory}}
收藏({{answerDetail.Q_FavoriteCounts}})
手机扫码追踪该问题,
觉得实用,立即去分享!
点击复制链接
专家建议
取消最佳答案
修改
FUNCTION "fcCRC16_ModbusRTU" : Void
VAR_INPUT
uiInNumBytes : UInt; // 输入字节数
END_VAR
VAR_OUTPUT
byOutCRCHigh : Byte; // 输出CRC高字节
byOutCRCLow : Byte; // 输出CRC低字节
END_VAR
VAR_IN_OUT
byInputArray : Array[*] of Byte; // 输入字节数组
END_VAR
VAR_TEMP
iTempLowerLimit : DInt; // 数组下界
iTempUpperLimit : DInt; // 数组上界
wTempCRC : Word; // 临时CRC值
iByteIndex : Int; // 字节索引
iBitIndex : Int; // 位索引
wTemp : Word; // 临时变量
END_VAR
VAR_CONSTANT
cwXor : Word := 16#A001; // CRC多项式
cwStart : Word := 16#FFFF; // CRC初始值
END_VAR
// 获取数组上下界
iTempLowerLimit := LOWER_BOUND(byInputArray);
iTempUpperLimit := UPPER_BOUND(byInputArray);
// 动态调整上界
IF uiInNumBytes < (iTempUpperLimit - iTempLowerLimit + 1) THEN
iTempUpperLimit := iTempLowerLimit + uiInNumBytes - 1;
END_IF
// 初始化CRC寄存器
wTempCRC := cwStart;
// 主循环处理每个字节
FOR iByteIndex := iTempLowerLimit TO iTempUpperLimit DO
// 字节异或操作
wTempCRC := wTempCRC XOR byInputArray[iByteIndex];
// 内嵌位循环处理每一位
FOR iBitIndex := 0 TO 7 DO
// 右移操作
wTemp := wTempCRC SHR 1;
// 判断最低位是否为1
IF (wTempCRC AND 1) = 1 THEN
wTempCRC := wTemp XOR cwXor;
ELSE
wTempCRC := wTemp;
END_IF;
END_FOR;
END_FOR;
// 输出CRC高、低字节
byOutCRCHigh := BYTE#(wTempCRC SHR 8);
byOutCRCLow := BYTE#(wTempCRC AND 255);
END_FUNCTION
等您来回答
换一换
{{item.CoinValue}}西币
{{item.VisitNum}}人想问
本版相关问题
换一换
首次回答问题,获得
双倍西币积分!
立即成为技术知识分享的一员!
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!

西门子商城