在程序设计调试的时候,难免会发生一些低级错误,究竟是什么问题让两个人困惑了半天呢?
言归正传,一个朋友要更换一台加工中心的主轴变频器,相应的程序块是STL代码,让我帮忙解读一下控制字和状态字。这段STL的程序并不复杂,找了个时间将程序从头到尾捋了一遍,把通信报文的状态字和控制字逐位解析出来。
程序块接口
部分STL代码
朋友将我分析出来的报文和实际的PROFIBUS报文(设备从总线捕获的)数据对比,发现报文中速度数据不太对。为什么报文中的速度值0XFBC4不在正常速度范围内呢?
程序中给速度做了限定:
- 正转速度给定速度>=100%,输出0x4000,所以速度的取值范围0X0000~0X4000;
- 同理反转最大输出0XC000,最高位符号位,反转的速度范围为0X8000-0XC000。(这里是错误的)
04 4F FB C4 //04 4F这个两个字节控制字,FB C4这两个字节是给定速度
06 B7 FF 9D
04 47 00 00
02 33 00 00
04 4F 00 00
02 B7 FF A5
04 47 00 00
02 33 00 00
变频器速度的取值范围
我把STL代码又分析了一遍,从程序解读出来报文都是正确的,两个都搞程序的人讨论了半个小时后,终于恍然大悟,原来是负数,[笑哭][笑哭][笑哭],此时变频器是反转的。变频器反转的取值范围不是0X8000-0XC000而是0X0000-0XC000,也就是十进制的0~-16384,报文中的0XFB C4转换为整数就是-1084。
N年前就知道计算机中数值用补码存放,到了实际用的时候脑子就瓦特了,错以为计算机用原码存储。
总结:
在计算机系统中,数值一律用补码来表示和存储。PLC中整数用补码表示,正数的原码等于补码,负数的原码取反 1才是补码。
原码反码补码知识
序号 |
数值 |
原码 |
反码 |
补码 |
备注 |
1 |
1084 |
2#0000 0100 0011 1100 |
16#043C |
16#043C | |
2 |
-1084 |
2#1000 0100 0011 1100 |
16#FBC3 |
16#FBC4 |
题外:
变频器的国外的,找不到这个品牌了,没有办法用相同型号的替代,PLC程序也是没法改动,只是给了一个变频器的控制块。
有很多成熟协议转换的模块,不能改变报文的内容,两个变频的控制字是不一样的,他需要将PROFIBUS总线转到MODBUS总线,对报文结构进行调整,实现变频器的控制。
,