首页 > 编程知识 正文

modbus 485(MODBUS协议最简单又是最直白的解释)

时间:2023-05-03 14:56:24 阅读:122702 作者:1790

Modbus为单主站的主站/从站通信模式。 Modbus网络中只能存在一个主站。 主站在Modbus网络中没有地址。 从站的地址范围为0 - 247,其中0为广播地址,从站的实际地址范围为1 - 247。 Modbus通信标准协议可以在诸如RS232C、RS485、光纤、无线等等的各种传输系统中传播。 Modbus有两种串行传输模式: ASCII和RTU。 定义数据如何打包和解码。 支持Modbus协议的设备通常支持RTU格式。 通信双方必须同时支持上述模式之一。 上面是官话,下面是我说的大白话。 modbus协议也是通信协议的一种,并不神秘。 通信协议包括两个方面。 另一方面,通信格式,即波特率、检查方案、数据位、停止位的波特率:每秒发送的位数,即通信速率; 例如,波特率为9600,每秒可以传输9600位。 位的概念请看以下数据位介绍检查方式。 奇检查或偶检查或无检查旨在确定传输过程中是否存在错误。 它只用于确定8位或7位组成一个字符的字符的传输是否有误。 但是,不能完全判断传输是否有错误。 例如,在检查中,在发送来8个“11111111”时,即使到达接收端,由于噪声而成为“10111101”,如果“1”的个数保持偶数,则接收端也不能判断为发送来的字符错误。 数据位)传输字符由几个位组成,计算机的基本单位是“位”,其值是“1”而不是“0”。 另外,如传输路径a那样,在定义通信格式的情况下,是被定义的8位,传输的数据为(00001010 ); 停止位:传输一个字符有几个停止位,在天判断一个字符的传输是否结束,开始接收下一个字符。 通信格式的作用是规范发送方和接收方的传输格式,如果两种通信格式不同,则接收方不能正确地判断从发送方发送的是什么。 例如,如果接收端设定的波特率是10 (每秒仅接收10比特)比特,发送端的波特率是20 (每秒发送20比特),则接收端不能接收每秒发送的20个字符,为10个检查方式:如果双方的检查方式不同,就没有统一的标准来认定传输是否有误。 数据位是接收端设定的7位,接收7位时识别为1个字符,实际发送端设定8位时,接收端认证的字符和发送端发送的字符不同。 **参加预交流的双方设定的通信格式必须相同! 二、通信标准(这句话是我自己定义的,不能引用。 会被嘲笑的。 )通信格式只是确保接收方能够正确接收发送方发送的所有字符(实际上,如上所述,检查方式并不保证完全正确,而是需要通过通信标准的校验和计算来验证整体的正确性。 以下说明) )中,关于接收到的字符串整体用于什么,在通信标准MODBUS的通信之前,首先对ASCII方式进行说明。 发送ASCII方式时的规格定义如下。 起始符设备地址功能代码数据验证结束符1 (起始符:接收一系列字符,必须始终知道这一系列字符从哪里开始。 这就是起始符的作用,无论接收方以前接收到多少个字符,接收方都起到起始符的作用。 收到起始符后,以前的字符将忽略它,从起始符开始分析以后的字符! MODBUS的ASCII方式的起始符为冒号“: )设备地址。 如上所述,MODBUS为单主机/从机通信模式,一个主机下可以连接10多个从机。 如果大家都挂在一条线上,没有一个设备地址,就不知道发到哪个从机,大家一应答,这条线的信号就乱七八糟,主站也不知道收到了什么。 所以,设定这样的设备地址,告诉那个从机。

只要这个从机回答,其他的就闭嘴! “两天,请回答。 其他人都保持沉默。 ”广播地址(0)为命令式,不要求从站回答。 “听着,晚上大家都去家里喝酒。 不去的人会死。 散会了! ”

设备地址需要2个字符,例如送到2号站则为“02”

当前组合为“: 02”

3 )功能代码:告诉从机应该做什么。 例如,读取数据的指令为“3”,从站接收该指令,根据下一个数据要求的具体地址,将具体地址的数据返回给主站。

功能代码在读取命令3时也需要2个字符,如“03”

目前的组合是“: 0203”

4 (数据: )

1、告诉我分站的具体部件通信地址,写在哪里,从哪里读。 当读变频器设定频率的通信目的地为00A0时

部件的通信地址必须为4个字符。 控制器的部件地址小于4个字符时,在开头添加0。 例如,如果部件的通信目标为A0,则在开头添加0:“00A0”这两个0

2、数据中可能包含要读取的字节数。 例如,连续读取PLC的2个16位寄存器时,其字节数为4个,为“0004”。 你知道吧。 读取个数也必须为4个字符、不到4个字符,前面必须填零

当前组合为“: 020300A00004”

3、要实现写入功能时,数据中可能包含写入的数据。 例如,包含写入16位寄存器的值、写入如“0D98”的数值

当前组合为“: 020600 a00d 98”“06为单个寄存器的写入命令

4、连续写入多个寄存器时,该数据包含的内容又不同。 那个有以下可能性。

寄存器地址(4个字符)字数(4个字符)字节数(2个字符)中写入的数值

很混乱吗? 没关系。 获得具体控制器后,该控制器的通信说明书将说明该数据包含哪些内容,以及排列方式。 你一定对我上面四点中可能的字体很生气。 我认为说明应该具体说明而不是可能性

么又可能什么!
这又要重复说明一下MODBUS的通讯规范,
起始符 + 设备地址 + 功能代码 + 数据 + 校验 + 结束符
MODBUS是一种标准通讯协议,这种标准定义了上面红色字符的通讯规范,除了数据项,其他的都是固定字符个数。
数据呢,因为功能代码的不同,其包含的内容也不同!所以我只好说可能包含这个,可能包含那个。您无须担心此数据变来变去,造成接收方不知道如何分析。接收方在接收到功能代码时,就已经知道此数据包含多少个字符了!

5检验和:前面说过,通讯格式里的校验方式并不能保证每个字符都正确,所以这里就把所有字符的值加在一起,其和(检验值)传给接收方,接收再把接收到的字符的值加在一起,与发送方传送过来的检验值比较,如果相等,就算接收正确了。"这种方式极大地提高了传输的可靠性,保证了传输的顺利进行,为传输事业做出了巨大贡献"这样的描述让您想到了什么?假话呗,检验只是提高了校验的可靠性。并不能完全判断传输是否正确。想要最大限度的提高传输的可靠性,唯有最大限度地降低干扰!于是产生了232,485,422传输方式,他们的区别就在于传输的可靠性!

1+2+3=6 3+2+1=6 这两个字符串的作用肯定是不一样的!但是其校验和是一样的,如果在传输过程中,由于干扰,1变3,3变1,根据校验和的计算,接收方并不知道由于干扰而造成传输错误,此时,或是出现通讯错误,或是出现通讯混乱。
如,命令码03,由于干扰而变成了30,此时校验和是一样的,而MODBUS并没有30这个命令码,接收不认识,于是出现通讯错误。
再如,读变频器的设定频率通讯地址是0001,由于干扰而变成了0010,此时校验和是一样的,但是通讯地址却变了,变频器就可能返回的是其他数据,造成通讯混乱!
校验字符是要求两个字符,如果计算结果超过两个字符,则取后两位!
**参加校验计算的字符是起始符与校验符之间的字符串(不含起始符与校验符)
现在的组合是“:02030A000004FB“ (假设校验和为FB)
02030A000004参加校验和计算

6结束符:

接收到一串字符,总要知道在那个地方结束吧,这就是结束符的作用,接收方不管以后还会收到多少个字符。当接收到结束符时,以后再接收的字符就算是下一轮的东西了,从起始符到结束符之间的字符就是它要分析的字符! MODBUS的ASCII方式结束符是— Chr (13)+Chr (10)
现在的组合是“:02030A000004FB“+ Chr (13)+Chr (10)
至此,ASCII方式的发送就完成了,控制器接收到此串字符后,根据MODBUS协议定义的通讯规范分析此串字符的作用,然后返回相应的字符!

注意:发送的字符都是以十六进制数表示!

控制器返回的字符根据命令的不同而不同,此处不好讲解,在下面具体例子中会有说明!

再说RTU方式:RTU方式发送时的规范定义如下:至少3.5个字符传输时间的停顿间隔时间标定消息的开始 设备地址 + 功能代码+ 数据 + 校验 + 至少3.5个字符传输时间的停顿间隔时间标定了消息的结束 其他的就不用说了,与ASCII方式一样的作用,唯独这3.5个字符的时间搞晕了很多人,实际我也不敢太解释,大致说一下吧,您就当听着玩,比如通讯格式是9600,E,8,1波特率是做什么的?一秒传输多少个位(比如一秒传送9600个位),一个字符是多少个位呢?通讯格式已经标定了(7个位或是8个位),那3.5个字符的传送时间就好算了吧:

3.5*11(或10)=39个位(35个位),传3.5个字符需要的时间是:39/9600=4毫秒。
不是说八位嘛,怎么乘11,记住了,还有一个起始位,奇或偶的校验位(无奇偶校验,则没有此位),停止位(两个停止位就是2了。)
如9600,N,8,2为11个位,
9600,N,7,1.为9个位
就是说,您得保证发送字符串的连续性,中间停顿时间超过4毫秒,接收方就认为您已经发送完了这组消息,开始处理了。这就是至少3.5个字符传输时间的停顿间隔时间标定了消息的结束的含义
如果您发送的太连续,下一组消息与上一组消息之间的间隔时间没超过4毫秒,接收方就认为这些字符是一组消息,按一组消息去处理。所以,您发送结束一组命令后,必须间隔4毫秒才能发送下一组命令. 这就是至少3.5个字符传输时间的停顿间隔时间标定消息的开始的含义

至此我的大白话结束,有什么错误,请您批评,多谢!

通讯协议实际也就是这回事,任何一个协议都大同小异。通讯格式,通讯规范两种而已。您如果愿意,也可以自己定义一个通讯规范,用PLC或是VB语言按照您自己定义的这个规范处理,如果可靠性超过modbus,那您的通讯规范就是最流行的了!

我经常问某些产品推广人员,“您设备的通讯协议是什么”,他回答:“232”或是“485”。今天您看了上面这些大白话,请您就不要再这样回答了。
Modbus通信标准协议可以通过各种传输方式传播,如 RS232C、RS485、光纤、无线电等。
“232”或是“485”只是一种线路传输方式,与协议是无关的!232传输抗干扰性差,485传输抗干扰相对强。

MODBUS做为一种标准的协议,应用于各种PLC,控制器,仪表。这些仪表或是控制器应用中,元件的通讯地址肯定是不一样了;各个命令码的各部分组成的意义也许也会不同;
但是,它一定会遵守MODBUS的协议规范。即,每个命令码的组成一定符合MODBUS的规范!一样不多,一样不少!

下面针对某种支持MODBUS协议的控制器,说一下具体的读/写例子

1 读某控制器的十五个寄存器值,发送的字符串是:(ASCII方式)

“: 01031000000FDD”+ Chr (13)+Chr (10)
起始符“:” + 站号(01) + 读命令(03)+ 起始寄存器通讯地址(1000)+ 字数(15;转换成十六进制000F)+ 校验和(DD)+ 结束符

控制器返回的字符数是71个
起始符“:” + 站号(01) + 读命令(03)+ 字数(0F)+ 60个数据字符(一个寄存器是4个,一共十五个) + 校验和(DD)+ 结束符(两个)

2 分别向某控制器两个寄存器写入数值,发送的字符串是:(ASCII方式)

“: 01101000000204”+ 写入的数值(8个字符)+ 校验和 + Chr (13)+Chr (10)
起始符“:” + 站号(01) + 写命令(10)+ 起始寄存器通讯地址(1000)+ 字数(2;转换成十六进制0002)+ 字节数(04) + 校验和(因为写入数值是变化的,需要得经过计算得出校验和)+ 结束符

控制器返回的字符数是17个
起始符“:” + 站号(01) + 写命令(10)+ 起始寄存器通讯地址(1000)+ 字数(02)+ 错误码(2个) + 校验和(DD)+ 结束符(两个)

*错误码,当通讯正确时是什么,通讯错误时是什么,具体控制器会有说明

读其他仪表的某值时,参照上述读的规范,也就是更改一下起始寄存器通讯地址、字数、校验和(校验和是编制程序块自动计算的。)
要读多个仪表的同一个检测值更简单,更改站号就可以了。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。