Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于 1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus 已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
Modbus协议属于应用层的报文传输协议,Modbus协议本身是个比较泛的说法,它有三种类型,分别是Modbus ASCII,Modbus RTU,Modbus TCP/IP,三者的协议并不相同,但有类似的地方,所以说Modbus协议时,最好说这三种类型中的一种
数据模型是对可访问数据的一种抽象,Modbus协议的数据模型定义了四种可访问的数据,分别是:
既然数据模型是一种抽象,在实际使用时必须将其映射到真实的物理存储区才能被访问。
Modbus协议允许设备将四种数据分别映射到不同的存储区块中,各个区块之间相互独立,使用不同的功能码可读取到不同的数值,如下图所示:
Modbus协议也允许设备将四种数据映射到同一存储区块中,这样通过不同的功能码读取数据可能会得到相同的数据(比如:输入寄存器和保持寄存器为同一物理区块),如下图所示:
线圈:因为Modbus最初是为PLC服务的,所以线圈是PLC相关的术语,实际上就可以类比为开关量(继电器状态),每一个bit对应一个信号的开关状态,要么是1,要么是0;所以一个byte就可以同时控制8路的信号。比如控制外部8路io的高低。线圈寄存器支持读也支持写,写在功能码里面又分为写单个线圈和写多个线圈;
离散输入:如果线圈寄存器理解了这个自然也明白了。离散输入寄存器就相当于线圈的只读模式,他也是每个bit表示一个开关量,而他的开关量只能读取输入的开关信号,是不能够写的。比如我读取外部按键的按下还是松开。
保持寄存器:这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。一般对应参数设置,比如我设置时间年月日,不但可以写也可以读出来现在的时间。写也分为单个写和多个写。
输入寄存器:这个和保持寄存器类似,但是也是只支持读而不能写,一般是读取各种实时数据。一个寄存器也是占据两个byte的空间。类比我我通过读取输入寄存器获取现在的AD采集值。
规律:
输入:表示这个存储区只能读,不能写;
其余的则可读可写
注意:网上的资料对Modbus数据模型这一部分的介绍各不相同,一开始看这部分资料时被搞得乱七八糟,为什么同一种东西会有这么多不同的说法,无奈把说法不同但却是同一种东西汇总一下:
线圈 = 输出线圈 = 开关量输出 = 位状态
离散量输入 = 输入线圈 = 开关量输入
保持寄存器 = 输出寄存器 = 寄存器
Modbus数据模型 = PLC存储区
也就是真实的物理存储区
存储区范围:分为5位和6位,对应了标准地址和扩展地址;如果使用的是5位标准地址,则4种存储区分别用5位地址中的首位来区分,如线圈是0,离散量是1,输入寄存器是3,保持寄存器是4,剩下的4位就从1 ~ 9999开始编址,表示一片连续的地址
有些设备是6位的地址,编址方法跟5位的类似,只不过地址最大只能到65536
数据模型 | 地址前缀标号 | 5位 | 6位 | 访问方式 |
---|---|---|---|---|
线圈 | 0 | 00001 ~ 09999 | 000001 ~ 065536 | 读/写 |
离散量输入 | 1 | 10001 ~ 19999 | 100001 ~ 165536 | 只读 |
输入寄存器 | 3 | 30001 ~ 39999 | 300001 ~ 365536 | 只读 |
保持寄存器 | 4 | 40001 ~ 49999 | 400001 ~ 465536 | 读/写 |
通信的本质其实就是要么我说,你听,要么你说,我听,那应用到主机与从机之间时,就是要么主机往从机写入数据,要么主机往从机读取数据。
当通讯命令由发送设备(主机)发送至接收设备(从机)时,符合相应地址码的从机接收通讯命令,并根据功能码及相关要求读取信息,如果CRC校验无误,则执行相应的任务,然后把执行结果(数据)返送给主机。返回的信息中包括地址码、功能码、执行后的数据以及CRC校验码。如果CRC校验出错就不返回任何信息。
地址码是每次通讯信息帧的第一字节(8位),从0到247。其中0为广播地址,从机的实际地址范围为 1 ~ 247;这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送信息。当从机回送信息时,回送数据均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机返回的地址码表明回送的从机地址。相应的
地址码表明该信息来自于何处。
对存储区的操作有:读和写,分别有以下的组合,再给这些操作编个号,就是功能码
功能码是每次通讯信息帧传送的第二个字节。ModBus通讯规约可定义的功能码为1到127。有些PLC器件仅用到其中的一部分功能码。作为主机请求发送,通过功能码告诉从机应执行什么动作。作为从机响应,从机返回的功能码与从主机发送来的功能码一样,就表明从机已响应主机并且已进行相关的操作。
数据区包括需要由从机返送何种信息或执行什么动作。这些信息可以是数据(如︰开关量输入/输出、模拟量输入/输出、寄存器、参考地址等。例如,主机通过功能码03告诉从机返回寄存器的值(包含要读取寄存器的起始地址及读取寄存器的长度),则返回的数据包括寄存器的数据长度及数据内容。对于不同的从机,地址和数据信息都不相同
主机或从机可用校验码进行判别接收信息是否正确。由于电子噪声或一些其它干扰,信息在传输过程中有时会发生错误,错误校验码(CRC)可以检验主机或从机在通讯数据传送过程中的信息是否有误,错误的数据可以放弃(无论是发送还是接收),这样增加了系统的
安全和效率。
MODBUS 通讯协议的CRC(冗余循环码)包含2个字节,即16位二进制数。CRC码由发送设备(主机)计算,放置于发送信息帧的尾部。接收信息的设备(从机)再重新计算接收到信息的CRC,比较计算得到的CRC是否与接收到的相符,如果两者不相符,则表明出错。
CRC校验码可用一些工具计算出,在软件编程中一般用查数组的方式
Modbus RTU报文格式:从机地址(设备编号)+ 功能码 + 数据 + 校验 (只要是Modbus协议,都遵循这样的报文格式,其中数据是个泛指,还分为读取和回应两种不同的数据)
读单个或多个线圈(位状态)
主机发送:从机地址 01 起始地址 读取数据个数 CRC校验
从机返回:从机地址 01 读取到的数据长度 数据DATA1…DATAN CRC校验
写单个线圈(位状态)
主机发送:从机地址 05 起始地址 要写入的数据 CRC校验
从机返回:从机地址 05 起始地址 写入的数据 CRC校验
写数据时,从机返回的数据与主机发送的数据一样
读单个或多个线圈(开关量)
例如︰主机要读取地址为01,开关量DO1,DO2的输出状态。从机数据寄存器的地址和数据为︰
起始位地址 | D0寄存器数据(16进制) | 备注 |
---|---|---|
0000 | 02 | DO2输出状态为1,DO1输出状态为0 |
主机发送的报文格式:
主机发送 | 字节数 | 发送的信息 | 备注 |
---|---|---|---|
从机地址 | 1 | 01 | 发送至地址为01的从机 |
功能码 | 1 | 01 | 读开关量输出状态 |
起始地址 | 2 | 0000 | 起始位地址为0000 |
读数据长度 | 2 | 0002 | 读取两个开关量状态 |
CRC码 | 2 | BDCB | 由主机计算得到CRC码 |
从机响应返回的报文格式:
从机响应 | 字节数 | 返回的信息 | 备注 |
---|---|---|---|
从机地址 | 1 | 01 | 来自从机01 |
功能码 | 1 | 01 | 读开关量输出状态 |
数据长度 | 1 | 01 | 1个字节(8个bit位) |
D0状态数据 | 1 | 02 | D0寄存器内容 |
CRC码 | 2 | D049 | 由从机计算得到CRC码 |
写单个保持寄存器
例如∶主机要把数据07D0,保存到地址为002C的从机寄存器中去(从机地址码为01)。
主机发送的报文格式:
主机发送 | 字节数 | 发送的信息 | 备注 |
---|---|---|---|
从机地址 | 1 | 01 | 发送至地址为01的从机 |
功能码 | 1 | 06 | 写单个保持寄存器 |
起始地址 | 2 | 002C | 要写入的寄存器地址 |
写入数据 | 2 | 07D0 | 写入的新数据 |
CRC码 | 2 | 4BAF | 由主机计算得到的CRC码 |
从机响应返回的报文格式:
与主机发送的报文格式及数据内容完全相同。
注意:主机发送的报文数据中,寄存器的起始地址是相对地址,像002C是相对40001来说的,00001、10001这些是绝对地址;
通过相对地址算出绝对地址要先确定数据模型的地址,如读保持寄存器,起始地址是006B,那006B是107,对应的地址就是40108,
如果是输入寄存器,起始地址也是006B,那对应的地址就是30108
首先在485总线上,MODBUS RTU协议理论是可以挂200+台设备,但实际应用中,由于阻抗等原因,一般是32台,除去自身的话,就是31台。
RS485总线可以连接256个设备,但测试后发现这个数字有比较大的差异。有一种说法认为专门开发串行嵌入式的RS485总线只能连接32个节点,这由自身的驱动能力决定的。有人说网上的各种485总线产品可以支持128个,也有人说可以支持256个,甚至高达400个,那么RS485转换器到底支持多少个?
485通信中的一个串行端口能控制多少台设备的问题,由485网络中的电特性和协议特性决定。电特性就是,为了保证485网络中的特征阻抗在允许范围内,应该是120欧姆左右,因为连接的设备越多特征阻抗越小,所以在485网络中一般是120欧姆的终端,同时保证信号的衰减在允许的范围内。因此,有长距离传输和中继的情况。协议特性是在485网络上传输的协议支持的地址范围,Modbus应该是32个,能连接31个设备。
RS-485连接采用菊花链方式连接,而不能采用星型网络拓扑