你的说明书也该还有一页吧,例子的返回数据最后应该还有2个字节TEX和BCC,所以应该是发送6给字节(01H 31H 02H 47H 03H 74H),返回16字节(01H 31H 02H 51H 30H 2BH 30H 30H 31H 32H 33H 34H 34H 6BH 67H 03H A5H),BCC校验码=51H xor 30H xor 2BH xor 30H xor 30H xor 31H xor 32H xor 33H xor 34H xor 34H xor 6BH xor 67H xor 03H=75H + 30H=A5H.
发送的6个字节放在一个“初始寄存器表”V1000开始,用一条COMM指令即可通讯。
返回数据放到V0~V7共8个寄存器,返回数据中的有效数据从第5字节开始,所以把V0~V7用BSHR字节右移一个字节结果放到V10~V17中,用CTOF指令把V12~V15的7个字节转换为浮点数V100V101;
把V15的高字节(重量指数部分)取出转换为浮点数V20V21(指数浮点数a),FXY指令计算10.0的a次方放到V30V31;
用FMUL把V100V101乘以V30V31最后结果V50V51。
没有贴图,不知道你看明白没有,(*^__^*) 嘻嘻……
不好意思,工作忙,来晚一步。楼上回答的不错,不过我觉得回来的是17字节,借着楼上说的,我就按照他的说明写个具体操作程序吧!
首先在初始寄存器表填入要发送的命令,如下图:
里面:01H 31H 02H 47H 03H 74H就是我们要发送的读取重量的命令。接着调用COMM指令,个参数填写如下:
选用低字节发送模式,即只把V1000到V1005的低字节数据发送出去。发送完毕,转为接收称返回的17个字节数据:
数据为:01H 31H 02H 51H 30H 2BH 30H 30H 31H 32H 33H 34H 34H 6BH 67H 03H A5H
在PLC里存放在V0为起始的寄存器里,如下图所示:
根据协议和返回数据看,V2的高字节到V5寄存器的数据是我们需要的,即+0.001234,所以我们对数据进行左移一个字节处理,处理前为了让原始数据不被破坏,先进行数据的块移动,用BMOV指令移动到V10到V18的寄存器中,然后再用字节左移指令,移动完数据变成如下:
接着对字符2B 30 30 31 32 33 34转成浮点数,海为CTOF指令可以轻松完成!
以上就可以得到称重仪表的小数部分,程序如下:
以上程序是用海为自带的通讯仿真器实现的,点击仿真按钮,在“调试”菜单里选择他通讯仿真器:
填入仪表返回的数据,点击应答即可:
最后就是对称的指数数据的解析,该数据存放在V16的高字节中,所以要把他解析出来,先提取V16的高字节得到34H,再把34H-30H=4 那么就是它的指数部分,再用FXY指令计算10.0的4次方,得到数值10000,然后10000乘以上面计算的0.001234得到示例里值:12.34kg。程序如下:
V16得到高低字节存在V20(V16的低字节数据)V21(V16的高字节数据,我们要的数据)
V21减去48就是本例的34H-30H(十进制数48),数值放在V104中,因为是整数,而FXY是浮点数运算,故需要把V104转成浮点数先。转成浮点数后,用FXY算出10的4次方值,放在寄存器V108,最后小数乘以指数得到重量值,程序如下:
源程序xiazai: http://pan.baidu.com/s/1eQlLtZW 提取码:zwev
回复内容:
对: chjun 如果我想要工作状态稳定信号取出如何处理? 内容的回复!
可能我想的比较简单,但是我的想法是这样的,也就是再加条判断的程序。
思路是这样的:(S)称量是否稳定,存在返回数据的第5个字节,也就是放在V12的高字节里,如下图:
那我只要在程序后面再加一个高字节比较开关指令,判断V12的高字节的值是等于30H(字符"0")还是31H(字符"1"),等于字符0的话 就是说明称重稳定,然后提取并且使用我们上述回来的值,程序如下:
上面这个程序就是只有在通讯成功了,而且判断数据稳定了,才得到最终的值。
不知道这样的思路可以不?楼主可以测试看看。
回复内容:
对: chjun 哦,看到了,谢谢明天测一下;另外:我这个地方有点看不懂... 内容的回复!
1.comm模块-Rxd=是从V0开始Rn=17意思是从V0~V16被comm模块占用吗?
因为这个Rn表示接受回来的字节数,也就是17个字节,海为一个寄存器V由两个字节组成,所以17个字节就是占用连续的9个寄存器,也就是V0到V8。
内部寄存器排列方式为V2047 V2046....V10 V9 V8 V7 ... V0 知道这个排列,到时候左移或者右移就很清楚了。
2.BMOV相当于将V0~V7复制到V10~V17吗?
是的 是这样子的。