尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

终于有人把RS485说清楚了,现场踩了七八年的坑,今天全倒出来

终于有人把RS485说清楚了,现场踩了七八年的坑,今天全倒出来 我刚入行那会儿接手第一个带RS485接口的项目心里想的是不就是两根线嘛A接A、B接B波特率设对了就能通能有多大事。后来我被现实抽了无数个嘴巴子。同样的接线方式这个项目跑得稳稳当当换到另一个现场就连不上。同一个设备今天调通了明天又不行了。最邪门的一次上午还能收数据下午就全是乱码查了一圈发现是旁边那台大功率变频器开机了。RS485这东西看着比RS232复杂不到哪去就是一个差分信号、半双工、能挂多个设备。但真到了现场你就明白了说明书上写的理论最远1200米理论挂载32个节点跟实际能用完全是两码事。今天就按照我自己这些年踩坑的经验一条一条说清楚RS485到底是个什么玩意儿以及它到底有多能折腾人。先整明白RS485是干什么的要理解RS485得先明白它跟RS232的区别。RS232是点对点的一根线只能连一台设备通信距离也就十几米。RS485是差分信号传输用两根线A和B靠两根线之间的电压差来表示0和1。差分信号抗干扰能力强所以距离能拉到几百上千米而且可以挂多个设备在一条总线上。工业现场为什么普遍用RS485就仨原因距离远、抗干扰、能挂多台设备。但它有个要命的限制半双工。就是你发数据的时候不能收收的时候不能发一根线上同一时刻只能有一个设备在说话。这就意味着你得轮着来一台设备说完了下一台才能接着说大家排队不能抢。我刚接触485的时候总是下意识拿它当232用觉得不就是两根线收发嘛。后来被半双工这个特性坑了好几次才长记性。你发完数据之后不能马上切换接收得等一小段时间让总线稳定下来不然切换太快了总线上的电平还没稳定收到的数据里前面几个字节全是错的。第一个坑线接对了但是没接好RS485只有两根数据线A和B有些设备还带一根地线GND。很多人的接线方式是直接把A对A、B对B一拧胶布一缠完了。我最早也这么干后来出了个事。现场有两百多米远的一台仪表数据时通时不通有时候一整天都正常有时候一上午断七八次。我去了现场把线重新接了一遍好了一天第二天又不行了。后来老师傅过来看了一眼说你的屏蔽层接了吗RS485的屏蔽线就那根网线外头包着的金属编织层你得把它接到设备的接地端子上不然就成了天线到处接收干扰。我那根线用了普通的双绞线根本没屏蔽层能不丢数据吗。换了带屏蔽的双绞线屏蔽层单端接地问题解决了。从那儿以后我的接线规矩是这样的必须用双绞线A和B一对绞在一起抗共模干扰。屏蔽层只在设备端接地PLC那边浮空或者也接地但两头接地不行两头接地会形成地环路干扰更大。线径不能太细超过三四百米我用0.75平方毫米以上的线。还有一个更基础但很多人不知道的事。RS485的两个终端要各接一个120欧姆的终端电阻A和B之间并联上去。为什么因为485总线上的信号走到尽头如果没电阻匹配会反射回来跟后面的信号混在一起数据就错了。我第一次听到这个说法的时候觉得终端电阻这名字听着就高级肯定要买专用的东西。后来发现其实就是个普通电阻1/4瓦的就行120欧姆往接线端子上一塞一拧完事。便宜的几毛钱一个。当然这个电阻也不是什么时候都接。总线上的设备只有两个一头一尾各接一个。如果中间某个设备接了这个电阻反而会把总线电平拉偏设备多了驱动能力不够信号就畸变了。我的做法是我自己的设备上不焊这个电阻留个跳线或者拨码开关现场根据实际情况决定要不要接。第二个坑手拉手不是你想的那样RS485的接线方式是手拉手就是一台设备出线接到第二台设备第二台再接到第三台串起来一条总线。不是从一台设备分叉出去接好几台那是星形接法RS485不能这么干。我以前犯过一个低级错误在配电柜里把四台仪表的485线全拧到一个接线排上想着这不就是并联嘛跟电路一样。结果死活通信不上偶尔能收上来一两个字节全是乱码。后来查了资料才知道星形接法导致信号在分叉点反射四个分支的信号互相干扰设备多了驱动器的负载也不够。标准做法就是手拉手一条主线从头串到尾设备就挂在主线上。如果现场布局限制非得走星形怎么办也有办法。我后来用了个叫RS485集线器的东西也叫HUB它能把星形的各路信号隔离整形之后再合并到一起。好一点的带光电隔离每个端口独立驱动能解决大部分布线问题。但这东西是额外成本能不用就不用布线阶段就按手拉手来。第三个坑数据能收发但总有乱码这是最折磨人的一种情况。接线没问题终端电阻也加了波特率也对得上但时不时收上来的数据里总有一两个字节是错的。我碰见这情况头一回的时候翻了三天代码把CRC校验改了三遍查缓冲区逻辑查了无数遍最后发现是波特率偏差的问题。事情是这样的。有些国产设备用的晶振精度不高标称9600的波特率实际跑出来的可能是9580或者9620。偏差在正负百分之二三以内单独一台设备跟电脑通信看不出来偶尔错一个字节你以为是干扰。但你要是总线上挂了很多台设备每台的波特率偏差方向还不一样有的偏快有的偏慢数据就乱得一塌糊涂。后来我养成了一个习惯所有项目里能设波特率的地方一律用低一点的9600比19200稳定19200比38400稳定能跑9600就不往上跑。速度慢一点容错空间大一点。还有一个被很多人忽略的点是收发切换的时间。RS485是半双工你从发送状态切到接收状态得给硬件留点时间。我以前写过这样的代码发完数据立刻把485芯片的收发控制脚拉低切换到接收模式然后马上开始读串口。结果总是读不到数据或者读到半包。后来在发完数据之后加了个延时根据波特率算了一下9600波特率下大概延时个两三毫秒就够了。加了延时之后一切正常。这个逻辑我后来封装成固定的写法发完数据串口缓冲区的数据确保全部发送完毕然后延时两毫秒再切换收发控制脚再开始接收。顺序不能反先确保发完再切方向。第四个坑没共地通信就不稳RS485是差分信号理论上不需要共地两根线A和B就能传数据。但实际现场我建议你还是把地线接上。为什么因为RS485虽然不靠地线传信号但它有个共模电压的容限范围大概是负七伏到正十二伏。如果两端的设备地电位不一样比如设备A的地是0伏设备B的地因为距离远或者接地不良飘到了5伏那么A发过来的信号到了B这边共模电压就超标了信号就识别不了。这也就是为什么有时候两台设备离得近通信正常同样两台设备拉远到几百米就通不了。远了之后地电位差变大共模电压超标了。解决的办法就是把各台设备的GND用一根线连起来让它们的地电位保持一致。但不是所有设备都有GND端子没有的话我就把屏蔽层接上也能起点作用。还有一种情况是两边的设备电源不共地用的是不同的开关电源。这时候更要接GND线不然地电位差可能大到几十伏轻则通信不稳重则烧毁接口芯片。我干过这事儿把一台仪表的485口烧了一股糊味儿就是因为没共地两边地电位差太大了。第五个坑带电插拔最容易出大事这算是一个教训。以前调试的时候图方便设备不断电直接拔485线换到另一台设备上接着调。有一回拔的时候线头碰到了旁边220伏的端子一声响火花一冒我手一哆嗦那块USB转485转换器直接烧了。更惨的是有一次我把带电的485线插到一台仪表上仪表直接冒烟了。那台仪表两千多块厂家不给保修因为是用户操作不当造成的损坏。后来我买了带隔离的转换器贵是贵了点但至少电脑这边的串口口再也不会被烧了。设备那边的接口该烧还是烧只是把损坏隔离在了转换器这一侧不会殃及电脑。但最好还是养成习惯断电之后再接线别图那几秒钟的快。说说实际项目里的经验数字干了这么多年有些数字是我自己用出来的不是说明书上的理论值。距离方面9600波特率下我用过最长的线是八百多米屏蔽双绞线中间加了一个中继器跑得还行偶尔丢包但不频繁。再远我就不敢保证稳定了要么换光纤转换器要么走以太网。节点数量方面标准的RS485驱动器理论上能带32个节点但我的实际经验是超过15个最好加个中继器或者换成高阻输入的驱动器。节点越多总线负载越大信号幅度越低抗干扰能力越差。我遇到过一个项目总线上挂了二十台设备波特率降到2400才勉强跑稳定。速率方面我现在有个习惯能用多低就用多低。9600用不了降48004800还不行降2400。现场稳定压倒一切速度快那点优势在稳定性面前不值一提。有次一个甲方非要让我跑115200我说跑可以但不保证长期稳定。结果三个月后丢包严重又让我改回9600了。布线方面485线绝对不能跟动力线走同一个线槽。电缆沟里动力线和信号线之间必须隔开至少十厘米以上。穿管的话分两根管走别往一根PVC管里塞。变频器、大电机这类设备跟它的线保持一米以上的距离变频器的高频谐波能通过空间耦合到你485线上那干扰根本压不住。再说点有用的经验排查485故障的时候我有个常用的笨办法。拿个USB转485的转换器挂到总线上打开串口调试助手监听总线上所有设备的数据。哪个设备没回数据、哪个设备回了错误数据、哪个设备一直在发数据霸占着总线一看就知道谁在捣乱。有时候总线上某台设备坏了它会一直往总线上发数据别的设备想说话都说不了因为485是半双工的有人占着线其他人就发不了。用调试助手一看全是那台设备的数据流直接拔掉总线马上恢复正常。换个新的上去就行。还有个排查工具是万用表。测A和B之间的电压设备在空闲状态下A和B之间的电压应该在负一点几伏到负二点几伏之间A相对B为负代表空闲电平。如果你测出来A和B之间是正电压或者0伏说明总线上有设备一直在发数据或者某台设备的收发控制脚卡在发送状态了。再不行就拿示波器抓波形。虽然大部分现场调试没这条件但要是条件允许一看波形什么都清楚了。信号边沿陡不陡、有没有过冲、幅值够不够、空闲电平对不对一目了然。最后几句实在话RS485就是一根破线两根芯加一层屏蔽皮。但这根线能把你折腾得死去活来。我见过工厂里用了十年的老线屏蔽层都锈了还在跑稳得很。也见过新布的精装修线配了最好的转换器三天两头丢数据。区别在哪不在钱多钱少在细节有没有做到位。线选对了吗屏蔽接地接对了吗终端电阻加对了吗布线避开干扰源了吗共地线拉了吗波特率设保守了吗这些问题你全部处理好了RS485稳如老狗一年不重启都不带丢一个包的。有一个没处理好你调代码调出花来也白搭物理层的毛病软件永远修不好。干到后面我发现了一件事RS485调不通的时候八成不是代码的锅是现场接线、布线、干扰这些乱七八糟的事儿。我后来排查问题的顺序变了先拿万用表测一遍线路确认物理层没问题了再去翻代码。倒过来干的话一天时间全浪费在代码上最后一测发现是线断了能把自己气死。
返回列表