PLC调试翻车记1:负数补码惹的祸

云平台

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

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

程序块接口

部分STL代码

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

  程序中给速度做了限定:

  正转速度给定速度>=100%,输出0x4000,所以速度的取值范围0X0000~0X4000;同理反转最大输出0XC000,最高位符号位,反转的速度范围为0X8000-0XC000。(这里是错误的)04 4F FB C4 //04 4F这个两个字节控制字,FB C4这两个字节是给定速度06 B7 FF 9D04 47 00 0002 33 00 0004 4F 00 0002 B7 FF A504 47 00 0002 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总线,对报文结构进行调整,实现变频器的控制。

标签: 云平台