我的题目是实时采集并给出控制信号的,还要和计算机实现通信,老师让我做的是自由口协议,我用了异或和校验的方法,可是不知道为什么它有时就是对的,有时计算的校验值是错的,不能正常通信,麻烦各位帮我看看吧
//接收校验正确,向计算机输出子程序
NETWORK 1 //NETWORK TITLE (single line)
//
//NETWORK COMMENTS
//
LD SM0.0
MOVB 16#01, VB602 // 反馈正确命令
MOVB 16#0D, VB600
MOVB 16#BE, VB601
MOVB 16#08, VB603
MOVB 16#ED, VB613
NETWORK 2 //NETWORK TITLE (PLC变频采样值发送,
//
//NETWORK COMMENTS
//
LDB= VB702, 1 //如果是PLC变频命令
MOVD VD14, VD604 //将采集温度赋给发送温度缓冲区VD610
MOVD VD200, VD608 //将计算频率赋给发送频率寄存器VD614
//BMB VB108, VB603, 6 //将采集时间送给VB603-VBVB608
NETWORK 3 //NETWORK TITLE 采样流量和时间发送至计算机)
//
//NETWORK COMMENTS
//
LDB= VB702, 2 //如果是流量PID命令
MOVD VD30, VD604 //传流量
//BMB VB108, VB603, 6 //传时间
MOVD +0, VD608 //频率区清零
NETWORK 4 //NETWORK TITLE (发送停止成功信息)
//
//NETWORK COMMENTS
//
//
LDB= VB702, 0 //如果是停止命令
MOVB 8, VB603 //
MOVD 16#00000000, VD604 //
MOVD 16#00000000, VD608 //
//MOVB 16#00, VB615 //
//MOVW 16#0000, VW616 //数据区都清零
NETWORK 5 //NETWORK TITLE (发送,
//
//NETWORK COMMENTS
//
LD SM0.0
MOVB 0, VB160 //发送校验值赋初值
MOVD &VB604, VD152 //获取校验区首地址
//计算校验码
NETWORK 6
LD SM0.0
FOR VW177, +1, +8
NETWORK 7
LD SM0.0
XORB *VD152, VB160
NETWORK 8
LD SM0.0
INCD VD152
NETWORK 9
NEXT
NETWORK 10
LD SM0.0
MOVB VB160, VB612 //将校验值送给vd618
NETWORK 11
LD SM4.5 //如果线路空闲
R SM87.7, 1 //停止接收
RCV VB700, 0 //
XMT VB600, 0 //发送数据给计算机
最佳答案
如果你用起始字符和结束字符的话,那就把中间数据转换为ASCII后再发送,否则发送的数据有可能刚好是结束字符,从而提前结束接受,那么算出来的校验肯定是不对的。
提问者对于答案的评价:
看看
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc357095.html