在程序设计调试的时候,难免会发生一些低级错误,究竟是什么问题让两个人困惑了半天呢?

言归正传,一个朋友要更换一台加工中心的主轴变频器,相应的程序块是STL代码,让我帮忙解读一下控制字和状态字。这段STL的程序并不复杂,找了个时间将程序从头到尾捋了一遍,把通信报文的状态字和控制字逐位解析出来。

plc补码怎么取出?负数补码惹的祸(1)

程序块接口

plc补码怎么取出?负数补码惹的祸(2)

部分STL代码

朋友将我分析出来的报文和实际的PROFIBUS报文(设备从总线捕获的)数据对比,发现报文中速度数据不太对。为什么报文中的速度值0XFBC4不在正常速度范围内呢?

程序中给速度做了限定:

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

plc补码怎么取出?负数补码惹的祸(3)

变频器速度的取值范围

我把STL代码又分析了一遍,从程序解读出来报文都是正确的,两个都搞程序的人讨论了半个小时后,终于恍然大悟,原来是负数,[笑哭][笑哭][笑哭],此时变频器是反转的。变频器反转的取值范围不是0X8000-0XC000而是0X0000-0XC000,也就是十进制的0~-16384,报文中的0XFB C4转换为整数就是-1084。

N年前就知道计算机中数值用补码存放,到了实际用的时候脑子就瓦特了,错以为计算机用原码存储。

总结:

在计算机系统中,数值一律用补码来表示和存储。PLC中整数用补码表示,正数的原码等于补码,负数的原码取反 1才是补码。

plc补码怎么取出?负数补码惹的祸(4)

原码反码补码知识

序号

数值

原码

反码

补码

备注

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总线,对报文结构进行调整,实现变频器的控制。

,