下面我们就来列举一些常见问题。不管你是新手,使用者还是开发者,相信多多少少都遇到过Modbus 通信问题。
一 串口参数配置问题。
易错指数:☆☆☆☆☆
排查指数:☆
这类问题,虽然容易出错,但也容易排查。
一般来说,我们要进行Modbus通信,最先查看的就是串口参数了。
也就五个参数。
通信类型:RS232,一般是RX,TX,GND三根线。485常见是(+),(-)两根线,也有接GND的,这样就是三根线了。所以有时候看到三根线的通信,未必就是232,也有可能是485的。
波特率:这个,如果设置不对,就会通信不上。这个好像也没什么好说的。
数据位:如果是Modbus RTU的话,数据位只能是8。如果是ASCII的话,就没有关系了,通信双方保持一致就行了。
停止位:这个如果协议是ASCII的话,要注意看对方设备的参数是否是2个停止位。
校验位:这个一般容易出错的点在于,有时候即便校验位不匹配,偶尔能通信,容易造成混淆。
所以该类问题主要是一小心容易设置错误,不过,排查起来也很快。
解决方案:把参数配置正常即可。
二 接线问题
易错指数:☆☆☆☆
排查指数:☆☆
接线问题我们可以从232和485两种分析一下。
232的通信呢,是RX接TX。TX接RX。GND接GND的。
RX:接收。
TX:发送。
GND:地线。
接收对发送,发送对接收,地相连。
常见的几种错误接法:
1)RX接RX, TX接TX,GND接GND的。
如果没学过串口通信,接线一看,RX对RX,TX对TX,没毛病呀,当年接闭路电视也是这样接的呀。
2)RX接TX,TX接RX。没接GND的。
这种情况呢,如果两个设备某种情况共地的话,是可以通信上的。但如果设备用了隔离地,那就不好说了。
笔者就遇到过有客户在用的时候,没有接地,然后还和笔者说,为什么以前我不用接地也可以通信上,换新的设备为什么要接地。
3)RX接TX,TX接RX,也接了GND的。但是,一个是TTL电平的,一个是CMOS电平的。
这样是不行的。怎么样通俗一点讲呢。
TTL电平,可以理解为可以从CPU引脚直接出来的。而CMOS电平呢,是经过一定的电平转换的,简单地说,就是两种电平属性不一样,原则上是不能直接接在一起的。
这种情况,就需要一个TTL转CMOS,或者是TTL转232.
如果是485的通信呢,也是有接错的。
不过,485一般就两根线。A对A,B对B。也就两种可能,接错了,大不了反一下再试一下。所以也好排查。
这里补充一点,有的朋友可能从事相关行业比较晚,有些高级一点的485,可以做到A,B线不用区分,也就是正接反接都能自适应的。不过要记住,不是所有的设备都能自适应,使用时还是要留个心眼。
解决方案:把线接正确即可。
三 用法问题
易错指数:☆☆☆
排查指数:☆☆
这类问题呢,比较杂。
Modbus协议呢,主要的参数有站号,功能码,地址和长度。
在这几个参数中,也是容易出错。
站号: 站号一般错的可能性比较小,因为站号对不上,直接通信不上。
功能码:这个功能码,在前面的协议介绍呢,无非就是读和写。
对于读来说,并没有区分单读和多读。但是对于写来说,就有单写和多读了。
比如写字寄存器,可以用06H功能码,也可以用10H功能码。10H功能码是多写,多写当然包含写一个了。
于是就会出现有些控制器,压根就没有做单写的功能,直接不支持06功能码。
对于这种情况的解决方案是:要么让从站设备支持06功能,要么主站设备在写的时候,使用的是10H功能码,不使用06H功能码。
地址:对于没有的地址,自然是访问不到了。
这种情况往往需要对从设备进行排查。有时候遇到同一个系列,但不同型号的PLC,控制器,就会出现地址寄存器不一样的情况。
如果明确从站设备没有相应的地址,则主站设备不需要访问不存在的地址即可。
长度:也就是寄存器个数。
这个寄存器个数呢,也分两种。
一种是从站设备所能支持最大的访问个数。比如主站访问个数16的时候可以,访问个数为32的时候不行,那就有可能是从站设备压根就不支持到32个数寄存器一起访问了。
另一种是跨寄存器访问。
比如从设备有4X1寄存器,4X3寄存器,4X2就是没有。
然后主站访问4X1地址,访问个数为三个。这种情况下,有些从设备就不会回复或者报错,因为从站设备认为4X2没有,不能访问。
用法还有就是在Modbus的485通信里,有且只能有一个主站。如果在485里,有多个主站,就会造成通信异常的。
四 协议高低字节问题。
易错指数:☆☆
排查指数:☆☆☆
在Modbus RTU的报文中呢,地址和个数,还有CRC校验,都是一个字,也就是两个字节表示的,当然还有数据也是字单位的。
因为在实现过程中,有些做控制器的编程的时候,因为种种原因,将高低字节处理反了,那就会造成通信上的问题。
地址的高低字节反了:表现为通信不上或者数据对应不上。
个数的高低字节反了:读一个,就变成了读256个,好家伙,控制器直接反应不过来了。通信自然也出问题了。
数据的高低字节反了:数据错乱。比如PLC里的值为1,然后主站读到显示的是256。如果是浮点数,那乱的更离谱。
前面几个倒还好,CRC校验这个就不好查了。因为CRC很难直接看出对还是错,有没有反。
有些从控制器呢,它自己对接收到的报文,不进行CRC判断,然后回复的报文里,CRC校验高低字节是反的,甚至是错的,这个就比较难查了。
这不综合排查指数给出三颗星不过分呀。
五 时间类问题
易错指数:☆☆☆
排查指数:☆☆☆☆
这类问题呢,错起来让人头疼,查起来让人更头疼。
在串口通信里,串口发送数据流是要花时间的,PLC控制器收到报文后,也是要花时间处理的。如果在时间控制上,没有注意好,就会造成通信问题的。
以9600波特率来说,一个字节大概花1ms的时间进行传输。如果读20个字寄存器,对方回复40多个字节,也就是光报文传输的时间都要40ms了。PLC收到报文要时间,处理数据要花时间,回复报文要花时间,这里面就涉及很多时间了。
不过,我们在通信过程中,一般只关心两个时间。
1)回复时间。
当主控制器发送报文之后,PLC要等多久才进行回复,也就是可以理解为,主控制器需要等多久才能收到PLC的报文。
比如PLC回复需要500ms的时间,主控制器就等了400ms,就认为PLC没有回复了,就判断超时了。然后就开始发送下一个请求了。
造成的影响就是主控制器读取数据超时,或者表现数据数据串包吧。
举例:
主控制器发送读4X1的报文,等了300ms没收到数据,就判断为超时。
主控制器紧接着发送读4X2的报文,等了200ms。也就是PLC在第500ms的时候,回复了读4X1的报文。
主控制器将PLC回复4X1的报文,误判断为是读4X2的。就会造成4X2的数据显示为4X1的,导致数据串包了。
这种情况的解决方案就是要确认PLC控制器的回复时间(响应时间)。
2)通信间隔时间。
这个时间指的是,当主控制器发送一次请求,PLC控制器也回复了。在完成这一次通信请求之后,主控制器间隔多久发下一次请求。这个可以称为通信间隔时间。
有些PLC控制器在完成一次请求之后,是不能接受太快的请求的,需要休息一段时间的。
比如,有些PLC控制器,在收到主控制器的写命令之后,是先回复报文给主控制器,表示收到写命令了,然后再去执行相应的写操作。在PLC控制器还没有处理好写命令的时候,这时候主控制器再发送新的请求,PLC控制器可能就响应不过来了,造成该次的通信超时。
所以这个时间也是需要注意的,稍微不注意,就会出错。
六 干扰问题
易错指数:☆☆
排查指数:☆☆☆☆
有时候呀,配置没问题,软件没问题,甚至在办公室通信好好的,放到现场,就是出现通信问题。你是否也遇过呢。
如果没有遇到过,也没有关系,听我给你编,哦,不是,是编写的编,容我编辑一下。
为什么会有干扰呢。这就得从通信本质出发了。
通信用的是线,通信过程,靠的是电平为高为低来表示不同的数据,实质主是一个电信号的传输。电信号,一会高,一会低,不同的波特率,也就是频率不一样了,可以类比于交流电的传输了。
这么讲,可能有些干。
比如485的数据在传输中,应该类似于这种方波形式的,能比较明显的看到0和1的数据。
如果存在干扰,可能波形就会变成这样了。
那一般干扰源可能有哪些呢。
1)某些功率比较大的设备启动或停止
在通信过程中,某些功率比较大的设备启动或停止,使通信双方的设备的电源产生了一定的抖动,然后因为电路设计没考虑到电源抖动或者抖动太大,稳压电路部分效果不理想,就会影响到通信。
这种影响是伴随有设备的启动或停止,看起来还稍微有些规律。
2)还有可能就是供电本身的问题
特别是RS232的形式,因为是使用共地传输,容易生产共模干扰,抗噪声和抗干扰能力相对较弱
比如是9V或者24供电,但是存在较大的纹波,这个就会干扰到串口通信。
3)现场如果有变频器,那变频器在工作的时候,也容易产生干扰,使通信不稳定。
4)485接地了,但是那个地线有干扰或者有漏电,反而影响了通信。
七 波特率误差问题
易错指数:☆
排查指数:☆☆☆☆☆
要了解这个问题,我们就得聊一下波特率是怎么来的。
CPU一般都会有一个晶振,常见的有12M晶振,11.0592M或者更高的晶振。我们就举例12M和11.0592M晶振吧。这是一个主频率。波特率呢就是通过这个主频通过分频分出来的了。这就有一个分频比。
也就是有的单片机,控制器,计算出来的波特率,也许并不是正好就是这个数值,是有一定的误差的。
那么这种误差会带来什么效果呢。
数据会错乱,比如0xAA变变成0xAB。
就会表现为数据收发出现异常,导致通信不上,而且查起来也很难查。
明明参数配置正确,用法也没有问题,接线也正常,用第三方串口工具抓数据一看,数据也都正常,就是通信不上。
这种情况,就得借助示波器来分析了。具体怎么用示波器分析呢,请见下一篇进阶篇介绍了。
八 疑难杂症
易错指数:?????
排查指数:?????
既然是疑难杂症,那就不合适在入门篇讲解了,想进一步了解的同学,咱们进阶篇见。
在进阶篇主要讲485上的modbus,以及笔者积累的一些常用的排查方法,工具等介绍,顺便再分享一些典型的出差案例,带你走入简单又神奇的Modbus 通信。
评论
查看更多