聊聊Modbus通信常见的问题

通信网络

650人已加入

描述

下面我们就来列举一些常见问题。不管你是新手,使用者还是开发者,相信多多少少都遇到过Modbus 通信问题。

一 串口参数配置问题。

易错指数:☆☆☆☆☆

排查指数:☆

这类问题,虽然容易出错,但也容易排查。

TTL威廉希尔官方网站

一般来说,我们要进行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:地线。

接收对发送,发送对接收,地相连。

TTL威廉希尔官方网站

常见的几种错误接法:

1)RX接RX, TX接TX,GND接GND的。

如果没学过串口通信,接线一看,RX对RX,TX对TX,没毛病呀,当年接闭路电视也是这样接的呀。

TTL威廉希尔官方网站

2)RX接TX,TX接RX。没接GND的。

TTL威廉希尔官方网站

这种情况呢,如果两个设备某种情况共地的话,是可以通信上的。但如果设备用了隔离地,那就不好说了。

笔者就遇到过有客户在用的时候,没有接地,然后还和笔者说,为什么以前我不用接地也可以通信上,换新的设备为什么要接地。

3)RX接TX,TX接RX,也接了GND的。但是,一个是TTL电平的,一个是CMOS电平的。

这样是不行的。怎么样通俗一点讲呢。

TTL威廉希尔官方网站

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控制器可能就响应不过来了,造成该次的通信超时。

所以这个时间也是需要注意的,稍微不注意,就会出错。

六 干扰问题

易错指数:☆☆

排查指数:☆☆☆☆

有时候呀,配置没问题,软件没问题,甚至在办公室通信好好的,放到现场,就是出现通信问题。你是否也遇过呢。

如果没有遇到过,也没有关系,听我给你编,哦,不是,是编写的编,容我编辑一下。

为什么会有干扰呢。这就得从通信本质出发了。

通信用的是线,通信过程,靠的是电平为高为低来表示不同的数据,实质主是一个电信号的传输。电信号,一会高,一会低,不同的波特率,也就是频率不一样了,可以类比于交流电的传输了。

这么讲,可能有些干。

TTL威廉希尔官方网站

比如485的数据在传输中,应该类似于这种方波形式的,能比较明显的看到0和1的数据。

TTL威廉希尔官方网站

如果存在干扰,可能波形就会变成这样了。

那一般干扰源可能有哪些呢。

1)某些功率比较大的设备启动或停止

在通信过程中,某些功率比较大的设备启动或停止,使通信双方的设备的电源产生了一定的抖动,然后因为威廉希尔官方网站 设计没考虑到电源抖动或者抖动太大,稳压威廉希尔官方网站 部分效果不理想,就会影响到通信。

这种影响是伴随有设备的启动或停止,看起来还稍微有些规律。

2)还有可能就是供电本身的问题

特别是RS232的形式,因为是使用共地传输,容易生产共模干扰,抗噪声和抗干扰能力相对较弱

比如是9V或者24供电,但是存在较大的纹波,这个就会干扰到串口通信。

3)现场如果有变频器,那变频器在工作的时候,也容易产生干扰,使通信不稳定。

4)485接地了,但是那个地线有干扰或者有漏电,反而影响了通信。

七 波特率误差问题

易错指数:☆

排查指数:☆☆☆☆☆

要了解这个问题,我们就得聊一下波特率是怎么来的。

CPU一般都会有一个晶振,常见的有12M晶振,11.0592M或者更高的晶振。我们就举例12M和11.0592M晶振吧。这是一个主频率。波特率呢就是通过这个主频通过分频分出来的了。这就有一个分频比。

也就是有的单片机,控制器,计算出来的波特率,也许并不是正好就是这个数值,是有一定的误差的。

那么这种误差会带来什么效果呢。

数据会错乱,比如0xAA变变成0xAB。

就会表现为数据收发出现异常,导致通信不上,而且查起来也很难查。

明明参数配置正确,用法也没有问题,接线也正常,用第三方串口工具抓数据一看,数据也都正常,就是通信不上。

这种情况,就得借助示波器来分析了。具体怎么用示波器分析呢,请见下一篇进阶篇介绍了。

八 疑难杂症

易错指数:?????

排查指数:?????

既然是疑难杂症,那就不合适在入门篇讲解了,想进一步了解的同学,咱们进阶篇见。

在进阶篇主要讲485上的modbus,以及笔者积累的一些常用的排查方法,工具等介绍,顺便再分享一些典型的出差案例,带你走入简单又神奇的Modbus 通信。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分