本文章是一个项目系列文章的第三篇,如果你还不了解前面的内容,请参考机房自动化监控手把手分享给你 - 0 总体说明
本章原计划讲解空调设备对接,后来发现先得讲明白RS485和Modbus协议内容,否则对不起手把手这个要求,所以就以温湿度这个最简单的设备作为本文内容了。
0 现场对接准备
我们现场实施采用如下思路:先保证监控箱供电正常,把串口服务器以太网接口接入内网交换机。然后把我们的笔记本电脑也能够接入内网,并且与监控箱串口服务器在同一个网段。
电脑上配置相关软件,确保监控箱能够与pc上的软件能够正常访问。
下面我以我的经验和理解,给你直观简单讲解一下RS485接口和以此为基础Modbus RTU协议内容。如果你已经对此了解,可以略过。如果你不了解,那么这些内容应该是最容易让你理解的教材,否则对不起这个“手把手”
0.1 RS485接口
RS485接口可以说是工业设备现场用的最多也是最简单的一种电器接口。只需要两根线,就可以把多个RS485设备连接在一起,设备间连接采用“手牵手的方式”,下面我给你一个简单的示意图:
上图的4个设备都有RS485接口,我们可以把这些设备用2芯电缆手牵手连接起来。这个图和实际现场接线几乎一样的,并不是抽象示意图。实际上上面的电缆线最好采用两芯屏蔽电缆,可以把电缆的屏蔽层接大地。一些工业现场如果要求更严格,你这个两芯电缆必须采购RS485专用电缆,我感觉里面的差别就是除了屏蔽层之外,内部的两根芯是卷绕在一起的,能够有更好的抗干扰能力。上面的设备间如果距离远了,整个线缆的两端可能还需要并联接一个120欧姆的电阻,用来避免信号反射回去。
事实上,机房环境非常好,距离又近,基本上你随便找根两芯线都可以搞定。
那么为什么RS485接口那么受欢迎呢?
很明显这个连接已经简单到不能再简单了,并且理论上的距离可以达到1000米,能够满足大部分工业现场设备连接需要。同时,人家抗干扰能力也有先天优势,那么这两根芯如何抗干扰的呢?
RS485这两根芯A,B采用的是电压差方式传输数据,当电压相差超过一定数值之后就认为这个数值是1,低于一定数值之后就是0。你可以想象,上面4个设备附近突然打了个雷,电缆上被电磁波感应出干扰电压,这个干扰电压在两根芯上可以认为是差不多的,那么线缆上的压差几乎不受影响(这应该就是抗共模干扰的能力,不要被这个专业术语唬住,其实大白话应该就这么简单)。
你仔细看上面的4个设备由3根电缆连接在一起,总体上形成一个总线。扣扣脚指头你就能明白,4个设备在同一时间,只能有一个设备发送数据——发送数据的设备控制485A和485B这两根芯的电压差变化,而其他设备就观察这个变化获得对应的数据。不仅如此,设备间还需要有如下一致性才能正常通信。
0.1.1 说话的速度:波特率
在同一个总线上的设备,必须遵循同一个信号变化速度,也即是AB两根线在0 1 变化之间的时间间隔必须一致,否则就错乱了。比如2400、4800、9600、19200他们分别代表1秒钟内变化次数,这个波特率越大,那么每秒能够传输的数据量就越大(传输速率)。但很明显速率越大,抗干扰能力就会下降。我在工业现场用的最多的波特率是9600.
0.1.2 数据字节位数和校验
我们计算机的数据基本以byte字节作为基础,而RS485 AB一次压差只能传输1bit,所以为了能够传输字节,除了波特率一致之外,还需要设定每个数据的位数如8,停止位1,是否要寄偶校验。这些参数在一个总线上的所有设备只需要保持一致就行。
有了上面RS485的统一参数,这下设备间就可以通信了吧。还不够:比如你说中文,总线上另一个人说英语,互相听不懂,那就没法传递信息了。同时还有个问题:如果这个总线上同时有两个设备发送数据,那就乱套打架了。那么如何避免呢?这就需要设备间有个协调机制了,也就是通信协议了。
0.2 Modbus RTU协议
有了上面的RS485总线和4个设备,好比有了4个人,每个人都有一个嘴巴和耳朵。但这些人都比较蠢,同一时间只能一个人说话,其他人才能听明白。这时,我们就需要让他们遵循一点的说话规则,这就是通信协议。对通信来说,Modbus RTU协议是工业现场最简单的通信协议之一。
0.2.1 主从设备划分
Modbus协议规定,一个总线上只能有一个主设备,其他都是从设备。所有的通信都只能由主设备发起,从设备根据发起的请求判断是否需要自己回答,主设备请求结束之后,对应的某一个从设备开始发送自己的应答数据。
这个主从机制就可以保证总线上同一时间,只有一个设备发送数据。
这种主从设备限定能够满足大部分工业现场需要,以我们这次机房监控为例,我们制作的监控箱可以提供3个RS485接口,可以建立3个RS485总线。监控箱RS485口是主设备,而现场的机器和传感器都是从设备。连接之后,如果我们监控箱不发起请求,它们就不做任何信息发送。
0.2.2 从设备地址
还是以上图4个设备为例,如果“设备1”是主设备,那么从设备(设备2、设备3、设备x)应该如何区分呢。Modbus协议规定,每个从设备都可以有1字节的设备地址(值范围1-254)。同一个总线上的从设备地址不能相同,这样当主设备发起请求的时候,第一个字节就是从设备地址,那么总线上所有的从设备在发现主设备的请求数据之后,只需要判断第一个字节,就可以知道是不是自己应该答复的内容。并且在应答的时候,发送数据第一个字节也是自己的地址。
0.2.3 功能码
有了以上内容之后,那么我们就可以进入主设备对其中一个从设备一次“请求-应答”的详细传输数据了。
Modbus规定,主设备发起请求的第一个字节是设备地址,第二个字节就是功能码了,这个功能码代表了请求的类型。用的最多的读取数据功能码是:
class="table-box"> 01 | 读取线圈状态 | 取得一组逻辑线圈的当前状态(ON/OFF) 说人话:其实就是读取-只读的开关量或bool值,每个数据1bit 地址格式:000xx |
02 | 读取输入状态 | 取得一组开关输入的当前状态(ON/OFF) 说人话:其实就是读取-可读写的开关量或bool值,每个数据1bit 地址格式:100xx |
03 | 读取保持寄存器 | 在一个或多个保持寄存器中取得当前的二进制值 说人话:其实就是读取-可读写的word数据,每个数据16bit(word) 地址格式:400xx |
04 | 读取输入寄存器 | 在一个或多个输入寄存器中取得当前的二进制值 说人话:其实就是读取-只读的word数据,每个数据16bit(word) 地址格式:300xx |
评论记录:
回复评论: