设想直流电源,它的输出端插座接口有三个管脚,分别是正极、负极和接地极。 相应地,负载的插头也应当有三个管脚与电源侧一一对应,这样才能正确地获得电能供应。 注意到这里有三个必须满足的条件: 第一是插头和插座管脚的形状、大小和插针直径及长度必须一一对应, 否则无法完成接插操作。这一点规定了插头组合的物理结构和管脚定义。 第二是电源的输出电压值必须满足载侧的需求值,否则无法完成电参量的要求。
设想直流电源,它的输出端插座接口有三个管脚,分别是正极、负极和接地极。 相应地,负载的插头也应当有三个管脚与电源侧一一对应,这样才能正确地获得电能供应。
注意到这里有三个必须满足的条件:
第一是插头和插座管脚的形状、大小和插针直径及长度必须一一对应, 否则无法完成接插操作。这一点规定了插头组合的物理结构和管脚定义。
第二是电源的输出电压值必须满足载侧的需求值,否则无法完成电参量的要求。 这一点决定了插头组合的电平规范。
第三是电源的输出阻抗与负载的输入阻抗必须匹配,否则不能实现完善的供电。 这一点决定了电源的工作性质。
这三点其实就是电源插头组合在物理层面上的规范性协议。
再看通信接口。 在有关计算机信息交换的ISO/ OSI模型里, 物理层是最底层(第一层),它规定了接口的机械外形、接口管脚定义、接口电平和字节格式。
这里的字节格式,指的是一个字节中有几个数据位,有几个起始位/停止位,有几个奇偶校验位。 一般地,一个字节有8个数据位,1个起始位(停止位),和1个奇偶校验位。 注意:起始位和停止位可以合并。
再看通信接口和通信网络的工作制问题。
当我们拿手机挂电话时,我们发现通信双方在通话的同时也可以接听,这叫做 全双工 (双向工作制); 如果说话的时候不能听,而接听的时候不能说,但任何一方都具有说和听的能力, 也即对讲机的通话型式,这叫做 半双工 。
(说明一下:这些图是我在ABB所做的有关MODBUS通信的PPT节录, 比较早了,但基本内容是正确的。这些图供参考。)
RS422接口和RS232接口是全双工接口,而RS485则是半双工接口。
对于半双工接口,显然需要有通信的发起者, 所以RS485接口和网络一定具有主站和若干从站,并且从站的数量也有规定。 一般地,从站的数量是32个。
RS485主站与从站的关系问题,看似只是通信工作制的不同, 其本质是通信各方对通信总线控制权的合理分配。
我们再看总线连接问题。
我们还是以电源为例。 我们可以从电源引出一条主干线,然后再并联若干个支路并分别送到若干个负载。 只要满足电源的功率要求,显然这是可行的。
如果我们用同样的方法来引出RS485的 通信线 , 是否可行呢?答案是否定的。 我们必须从通信主站先引一条线到第一个通信子站, 再从第一子站引第二条线到第二子站,如此循环直到最后一个子站。 在通信线的终端,还要配一个终端电阻。 在这条通信线路上,任何一点如果发生断路,则后续的通信链路上的通信也就断了。 这种接线方法形象地被称为菊花瓣连接方法, 或者链形连接方法,而电源的接线方法则被称为星形连接方法。
我们发现,从电气接线来看,链路是并联的。 但从通信来看,链路是菊花瓣的, 属于一个接一个的有秩序的连接。
现在我们可以总结一下了:
RS485的总线网络接线方式必须是链形菊花瓣的接线方式, 并且属于半双工的通信方式; RS232是点到点的接线方式,属于全双工通信。 不管是RS232接口,还是RS485接口,它们必须符合物理层的通信规约。
再看MODBUS-RTU通信协议:
有了物理层通信接口,是不是就能通信呢?答案是否定的。 物理层通信接口只是使得通信双方具备通信条件而已。 但若双方说的话谁都听不懂, 或者通信双方的说话方式及语法结构不相符, 显然这也无法通信。
在OSI模型中, 物理层之上是数据链路层。 MODBUS-RTU协议就是数据链路层协议, 只要通信双方都采用了MODBUS-RTU协议, 则能确保通信语言是双方都能听得懂的语句格式。
注意这里的词汇“ 语句 ”。 物理层 定义的是字节, 相当于语言中的字, 数据链路层则把字节组织成语句,也即帧。 帧规定了通信双方所用语句的语法结构。
MODBUS也是主从式的。 和物理层的总线控制是一样的,这里的主从关系, 就是对通信总线的控制权做了规定。 主站先下达命令,占用总线; 接着把总线空置,交给从站去写回应码; 从站完成后,再把总线还给主站。
现在我们来看看ISO的HDLC规定的帧结构, 也即通信语句的语法结构,如下:
在MODBUS通信协议下, 不同的命令功能码它的帧结构不尽相同。 对于读寄存器命令, MODBUS的主站帧结构是: 2个字节的地址码,1个字节的功能码,2个字节的数据地址码, 2个字节的CRC校验码; MODBUS的从站回应帧结构是: 2个字节的功能码,1个字节的回应区字节总数, N个字节的回应数据,2个字节的CRC 校验码 。
虽然物理层协议与数据链路层协议不同, 但数据链路层协议的执行必须建立在通信双方物理层连接已经符合要求, 并且已经可以无障碍地实现信息交互的基础上。
这个规则在ISO/OSI模型的七层协议中必须完全彻底地得到执行。 在ISO/OSI模型中, 通信双方的低层次协议必须为上层协议建立透明的无故障的连接和信息交换关系。 也就是说,各层次的上下级关系必须是绝对的。
从数据链路层再往上, 就是网络层了。 它的任务是构成现场总线的信息交换网。
网络层的功能包括: 把通信帧打包成数据分组, 然后把数据分组发送给对方。
由于通信双方的网络结构可能不同, 于是对于同种网就需要用 网桥来 连接, 而异种网则需要用网关来连接。
网络之间的信道可能有多条。 数据分组在发送时有多种路径可以选择。 负责选择路径的元件称为路由器。 路由器不但决定了真实的数据交换网络路径, 还可以构建虚拟的网络路径, 还要决定数据分组的发送秩序。 因此,路由器是网络层中最复杂最关键的装备。
OSI模型中,把物理层+数据链路层+网络层合并称为现场总线, 其通信接口就是8针的RJ45水晶头。 显见,RJ45与RS232/RS485/RA422完全不是一回事。
网络层的数据分组是数据帧的组合。 通俗地说,数据分组是一篇短文, 或者是一页待传递的数据组合单元。
网络层在发送数据分组时,其路由问题和接收组合问题见下图:
我们看到网络层在通信时先由路由器确定路由路径, 然后把分组发送到对方。 对方接收到分组后,把分组按前后秩序组合起来,再解包为实际文档。
指的注意的是: 由于网络层有了路由器, 因此网络层支持星形网络结构。
现在我们来关注一下ISO/OSI的7层模型,如下:
由于题主并未提及更高层的协议, 我们也就给予忽略。 但需要明确的是: 从网络层 再往上,各层之间发送的信息单位已经是完整的报文了。 OSI模型也规定了报文的语法结构, 限于篇幅给予忽略。
值得注意的是:RS232/RS485/RS422通信接口以及它们的定义,是非常明确的。 包括管脚的电平,管脚的功能定义, 以及接口在信息发送和接收信息时的数据流时序关系, 这些都必须准确和严格,否则就无法执行信息交换。
当PLC与某电力仪表交换信息, 并且这些电力仪表符合RS485/MODBUS-RTU通信规范。 我们要做什么事呢?
第一,我们按菊花瓣结构的通信链路要求去接线, 将PLC的通信接口与N个电力仪表接口连接起来。 最后一个电力仪表的末端要配100欧的终端电阻。
第二,我们把这N个电力仪表按地址递增的原则确定各自的地址, 例如01H、02H、1FH等等。 这里的H表示是16进制,1F表示16+15=31。
第三,我们在PLC编程软件中设定好电力仪表规定的通信速率 。
第四,我们在PLC编程软件中按电力仪表的数据区地址码设定好MODBUS通信码, 以及各个子站的循环关系。
注意,这里的MODBUS通信码满足PLC的IEC 61131-3编程模块要求, 一般的PLC梯形图没有此功能。 梯形图满足IEC 61131-1要求,但不满足IEC 61131-3要求。
第五,在PLC的内存中开辟专用数据区, 存放从电力仪表读取到并处理后的信息, 以便让更高层的总站来读取信息。 此数据区有一个名称,叫做数据点表,有时也简称通信协议。
最后,当然就是开机测试了。其中的内容很多,限于篇幅不再介绍。
我们来看一个在RS485网络上用MODBUS-RTU读取数据的例子,如下:
某电力仪表,地址是01H。 在电力仪表内存第2000的位置上, 放置了三相电流和三相电压等6个数据, 每个数据占用两个字节,共12个字节。
此电力仪表的通信速率是9600bps。什么意思呢? bps表示一个0/1,也就是比特,这说明每秒钟这条总线上可以发送9600个比特。 我们已经知道一个字节有8个数据位, 1个起始位,1个奇偶校验位, 刚好10位或者10个比特, 所以,如果电力仪表的通信速率是9600bps, 那么1秒钟就可以发送: 9600/10=960个字节。
我们还知道,主站的读数据的帧结构(下行帧)中, 有1个字节的地址,1个字节的功能码, 2个字节的内存地址,2个字节的数据数量, 2个字节的CRC校验码,总共有8个字节, 所以主站发送读数据MODBUS通信帧占用的时间是:8X10/9600=8.33毫秒。
对于本例,我们知道MODBUS-RUT读数据的命令是0X03H,也即03命令。 注意这里的写法:0X是字头,中间的03是命令,最后的H表示是16进制。
具体通信帧的是:01 03 07 D0 00 06 C5 45, 其中0X01H是地址,0X03H是命令, 0X07D0H是内存地址2000,0X0006H表示读取连续6个字, 也即内存中的电流和电压参数, 0XC545H是01 03 07 D0 00 06的CRC校验码。
那么电力仪表的回应帧(上行帧)的帧结构是: 1个字节的地址,1个字节的功能码, 1个字节的数据区字节数,12个字节的数据, 2个字节的CRC校验码,总共17个字节,占用时间是: 17X10/9600=17.7毫秒。
具体的仪表回应通信帧是: 01 03 0C 00 64 0064 0064 00 DC 00 DC 00 DC D6 F5, 其中0X01H和0X03H的意义同前, 0X0CH表示上传数据区有12个字节,0X0064H表示A相电流为100A, 后面的两组为B相和C相电流,均为100A, 0X00DCH表示A相电压为220V,其后两组为B相和C相电压, 均为220V,最后0XD6F5H为CRC校验码。
从主站发起下行通信帧,再等待10毫秒让从站回应, 再接收到从站发还的上行通信帧,总历时为:
如果有31个相同的仪表等待主站一一访问, 则主站从访问第一个仪表开始, 到最后回应完毕,总历时:
这里的1.12秒就是在通信速率为9600bps 下这31台仪表的读数据循环周期, 且忽略了主站再次发送下行通信帧的等待时间, 实际时间会略微再长一些。
相信,看到这里, 大家对MODBUS-RTU下的通信帧应当有了较为深刻的认识。
提醒大家:一个字有两个字节。 一般地,字节只能用来表达8个开关量。 但对于 模拟量, 则要用字来表达。 例如电流1250A,16进制下是04E2H, 要用2个字节才能表达完整。 也因此,各种电力仪表中,模拟量都是用字来表达的。
以下是MODBUS的部分常用功能码,也即命令码:
以下是PLC在读取双投开关ASCO控制器的数据点表的下行和上行通信帧范例:
几个相关的问题解释一下:
1)有些现场总线, 用令牌解决了总线的控制权问题。
大家很容易想到,如果从站有紧急事项需要主站来服务, 可是MODBUS规定了轮询规则, 等到自己的时候,可能会太迟了。 于是许多现场总线就发明了一个特殊的东西,叫做令牌。 令牌很短,只有一个字节,它可以很快地在总线上传递。 令牌在各站点中传递,谁拿到令牌,谁就是主站,就可以发布信息。 如果本站没有事情需要发布,就把令牌交给下一个站点,由此解决了总线占用问题。
2)当链路发生断路时, 为了避免出现通信中断,可采用双主站措施。 双主站(PLC的两个主站RS485接口)之间用握手线连接, 平时主用RS485开通,而辅助RS485浮空。 浮空的RS485虽然接在总线上, 但它处于高阻态等效于完全脱离。 当发生断路时,从站确认后立即开通通信, 从链路两头进行连接通信。
有时,还采取环状通信措施。限于篇幅,不做介绍。
3)MODBUS可工作在网络层, 此时协议变为MODBUS-TCP,但还是符合主从结构。
4)MODBUS协议是美国莫迪康公司发明的, 该公司的宗旨是:MODBUS协议为不收费的公开协议。 后来莫迪康公司被 施耐德公司 收购了,施耐德公司继承了莫迪康公司的做法, MODBUS是不收费的公开协议。 既然MODBUS已经成为施耐德的协议, 施耐德把它延伸到网络层,构建了网络层的MODBUS-TCP协议, 以及内部专用的MODBUS-PLUS协议。 限于篇幅,对于这两个协议的描述此处从略。
5)关于RS232和RS485的区别
学过模电和数电的人都知道差分电路。 差分电路具有共模抑制比,能够消除共模误差。 RS485接口就具有此特征。 因此RS232接口的传输距离仅为十几米, 而RS485/RS422接口的传输距离为1200米。
我们从图中看到, 虽然RS232和RS485接口的外形是一致的, 但它们的性能和信息交换模式不同,因此抗干扰能力也不同。
6)当距离很长的时候,RS485接口还可以接入光纤, 但需要配备1对光纤转换器。 之所以要1对,是因为其中一只用于电转光, 而第二只则用于光转电。 光纤收发器中间的通信介质就是光缆或者光纤。 (注意哦,光纤是光缆的芯线,不要以为是两种东西)
光纤分为单模和多模。单模的光纤较细, 光在传输过程中反射较少,因而失真小, 其传输距离可达15km以上; 多模的光纤较粗,光在传输过程中反射较多, 因而失真大,其传输距离为1.5km。
7)CRC校验码是二进制不借位的除法,用以做接收信息是否出错的检验。
注意这里的f(x)就是除去CRC校验码的MODBUS通信帧, 除数是CRC16。帧中的CRC是运算后的余数。
主站在发送帧之前,把帧先做CRC计算, 再把CRC运算的余数附在帧尾发送给从站。 从站接收到帧后,先对帧除去CRC的部分做CRC运算来检验是否正确, 若不正确,从站要求主站重发。
同理,当从站发送信息给主站时, 主站也根据CRC来检查数据的正确性。 若发现错误,则要求从站重发。
8)关于MODBUS-RTU、MODBUS-ASC和MODBUS-TCP
如果MODBUS中字节表达数据的方式采取BCD码, 则被称为MODBUS-RTU; 如果MODBUS中字节表达数据的方式采取ASCII码, 则被称为MODBUS-ASC; 如果MODBUS运行在网络层上,则被称为MODBUS-TCP。
ASCII码的内容如下:
MODBUS在实际使用中, 大多数都采用BCD码,因此MODBUS-RTU得到广泛应用。
BCD码如下:
值得注意的是:在协议使用中, 数据帧中的数值都是用16进制数来表达的。 例如100A电流写成0X64H,而380V电压则写成0X17CH。
9)关于RS485网络使用的双绞通信线和接地
我们知道,两条平行的线缆之间会有 分布电容, 而分布电容会削弱信号的强度。 为了消除分布电容,通信线的两条平行线需要按一定长度互相旋转对绞, 这种线被称为 双绞线。 双绞线的对绞长度有规范,它与通信速率密切相关。 在实际使用时,要按通信速率来选择合适的双绞线。
双绞线的外层有屏蔽层。屏蔽层必须单点接地, 不得在线头线尾同时接地, 防止地电流流过引起干扰。在实际布线时, 采取各线段独立接地,切忌采用所有线段的屏蔽层前后连接统一接地的做法。
10)关于菊花瓣的通信链路连接方式
绝对的菊花瓣链形网络是不存在的。 事实上,我们用菊花瓣链形接线方法构建的通信网络中, 各个节点是接线端子, 由接线端子通过双绞线连接到各个子站, 这些双绞线就构成了类似的星形结构, 我们不妨把这种接线方式称为链形网络下的准星形接线。
在工程实践中证明,准星形接线的长度不得超过70cm。 一旦超过,则可能出现通信不稳定状态。
事实上,70cm也成为行业中的一条不成文的质检规范。
100欧终端电阻在通信速率低时可加可不加, 但当通信速率较高时(高于19.2kbps), 建议一定要加。例如PROFIBUS下的RS485网络, 终端电阻已经植入终端设备中,只需拨动开关即可加入或者撤离。
终端电阻的用途是吸收反射波。
我们在两棵树间紧紧地绑上一根绳子,接着敲击绳子的某一侧, 我们会看到有传导波向另一端传去,并能看到反射波。 如果敲击的频率适当,则在绳子中间出现波的不动点,这叫做驻波。
对于通信来说,不管是反射波还是驻波,将严重影响通信质量。 终端电阻用于吸收反射波,并且可提升最终子站的电平水平。
RS485和MODBUS这两个概念,都需要通过实践去掌握它们, 单单凭着阅读文本,很难理解和掌握。 如果这篇小文能给大家的实践活动带来益处,我会感到分外欣慰。