详细解释什么是Modbus、RTU、485

 一、简述

1、Modbus是什么?

        Modbus是一种通信协议,相当于机器之间经过一定规范的一种语言,它属于一种串行通信协议。

        问题:什么是串行通信?

2、Modbus RTU、Modbus TCP是什么?

        Modbus RTU、Modbus ASCII、Modbus TCP、Modbus Plus都属于通信协议,都是由Modbus协议变换来的,在Modbus的基础上进行改变所衍变出Modbus RTU、Modbus ASCII、Modbus TCP、Modbus Plus。

3、RS485、RS232是什么?

        RS:推荐标准

        485、232:标识号

        RS485、RS232指的是不同的电平标准。他们属于通信接口标准。

二、详解

1、Modbus、Modbus RTU、Modbus TCP都是通信协议。

        归纳:Modbus 通信协议就是一种用在工业上的简单协议!

2、通讯过程

        Modbus是主从方式通信,且是一主多从的通信协议,也就是说,不能同步进行通信,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信。从机不会自己发送消息给主站,只能回复从主机发送的消息请求。

        Modbus并没有忙机制判断,比方说主机给从机发送命令, 从机没有收到或者正在处理其他东西,这时候就不能响应主机,因为modbus的总线只是传输数据,没有其他仲裁机制,所以需要通过软件的方式来判断是否正常接收。

        举例:就像你给同学打电话(电话就是唯一地址),然后打电话过去,相当于主机找从机,然后对方方接通给你回复信息。(大概意思是这样)

3、Modbus协议存储区及功能码

Modbus协议中部分功能码
代码名称英文寄存器PLC地址位/字操作操作数量
01读线圈状态Read Coils00001~09999位操作单个或多个
02读离散输入状态Read Discrete Inputs10001~19999位操作单个或多个
03读保持寄存器Read Holding Registers40001~49999字操作单个或多个
04读输入寄存器Read Input Registers30001~39999字操作单个或多个
05写单个线圈Write Single Coil00001~09999位操作单个
06写单个保持寄存器Write Single Register40001~49999字操作单个
15写多个线圈Write Multiple Coils00001~09999位操作多个
16写多个保持寄存器Write Multiple Registers40001~49999字操作多个

功能码的操作可分为两种:

        位操作 —— 最小单位为一位(bit),包括读线圈状态功能码 01、读离散输入状态功能码 02、写单个线圈功能码 05 和写多个线圈功能码 15;

        字操作 —— 最小单位为两个字节,包括读保持寄存器功能码 03、读输入寄存器功能码 04、写单个保持寄存器功能码 06 和写多个保持寄存器功能码 16。

4、Modbus 协议类型

        Modbus协议的传输模式一般分为三种,包括。包括ASCII、RTU、TCP三种报文类型

        串行端口存在多个版本的Modbus协议,而最常见的是下面四种:

        Modbus-Rtu

        Modbus-Ascll

        Modbus-Tcp

5、Modbus RTU协议

        Modbus协议上规定,设备上必须要有Modbus RTU协议,且默认模式必须是Modbus RTU。

        ModbusPlus在工业现场一般都是采用Modbus RTU协议,一般大家说的基于串口通信的Modbus通信协议都是指Modbus RTU通信协议。

        与Modbus RTU协议相比较,Modbus TCP协议则是在RTU协议上加一个MBAP报文头,并且由于TCP是基于可靠连接的服务,RTU协议中的CRC校验码就不再需要,所以在Modbus TCP协议中是没有CRC校验码的,所以就常用一句比较通俗的话来说:Modbus TCP协议就是Modbus RTU协议在前面加上五个0以及一个6,然后去掉两个CRC校验码字节就OK。

6、Modbus报文帧结构

        RTU协议中的指令由地址码(一个字节),功能码(一个字节),起始地址(两个字节),数据(N个字节),校验码(两个字节)五个部分组成。

        帧结构 = 地址 + 功能码 +数据 + 校验

报文格式
从站地址功能码数据CRC校验
1 byte(字节)1 byte(字节)N bytes(字节)2 bytes(字节)

        从机地址:每个从机都有一个唯一地址,占用一个字节,主机发送的地址码,相对应地址码的从机进行应答。地址码为0时,为广播地址,所有从机均能识别,从站不做应答。

        功能码:占用一个字节,ModBus通讯规约定义功能号为1到127。通过功能码告诉从机,要进行什么操作。

        数据区:根据功能码不同,有不同功能。例如,功能码告诉从机读取寄存器的值,则数据区必需包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。

        校验:在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确。

7、Modbus RTU数据报文结构

        主机请求(发送)01 03 01 8E 00 04 25 DE  //读(0x03),从寄存器地址01 8E 开始读,读4个寄存器00 04

        从机响应(返回)01 03 08 00 01 00 01 00 01 00 01 28 D7  //  08表示数据长度  ,00 01 00 01 00 01 00 01读到的数据

        从左向右分析该数据报文:
         主机请求: 

        01为设备地址,指的是请求从机的地址;

        03为功能码,此时代码03为读取保持寄存器数据;

        01 8E为起始地址;

        00 04为寄存器数量;

        25 DE表示CRC校验位  ;

         从机响应:

         01为设备地址,从机地址;

         03为功能码,正常情况下应答报文要求与先前对应的请求保持一致,如果出错则返回80h+先前的功能码;

         08指示接下来数据的字节长度;

         00 01 00 01 00 01 00 01为被读取的保持寄存器中的数据值;

         28 D7表示CRC校验位;

        主机请求(发送)00 10 00 20 00 01  02 00 00 AC A0 // 写(0x10),从寄存器地址 00 20开始写,写一个寄存器 00 01,写入值 00 00

        从机响应(返回):00 10 00 20 00 01 01 D2

        从左向右分析该数据报文:
        主机请求:

        00为设备地址,指的是请求从机的地址;

        10为功能码,此时代码10为写多个保持寄存器数据;

        00 20为起始地址;

        00 01为寄存器数量;

        02为写入字节数

        00 00写入数值

         AC A0表示CRC校验位 

         从机响应:
         00为设备地址,从机地址;
         10为功能码,正常情况下应答报文要求与先前对应的请求保持一致,如果出错则返回80h+先前的功能码;
         00 20寄存器的起始地址;
         00 01为被写入保持寄存器的数量;
         01D2表示CRC校验位;

8、常用功能码数据帧格式

1) 功能码-0x04(读输入寄存器)

        举例:读取2号站,30008~30009 2个输入寄存器的数值。

        Modbus RTU主站设备请求帧格式:

设备

地址

[1字节]

功能码

[1字节]

起始地址

[2字节]

寄存器数量

[2字节]

校验

[2字节]

高8位

低8位

高8位

低8位

高8位

低8位

0X02

0X04

0X00

0X07

0X00

0X02

0XC0

0X39

        2号站设备响应帧格式:

设备

地址

[1字节]

功能码

[1字节]

字节数

[1字节]

寄存器值

[寄存器数量*2字节]

校验

[2字节]

寄存器1

[高8位]

寄存器1

[低8位]

....

寄存器N

[高8位]

寄存器N

[低8位]

高8位

低8位

0x02

0x04

0x04

0x08

0x20

0x1A

0x43

0X81

0XBF

寄存器

30008数值

寄存器

30009数值

2) 功能码-0x10(写多个寄存器)

        举例:向2号站,40002~40003 2个保持寄存器分别写入0x000A,0x0102数值

        Modbus RTU主站设备请求帧格式:

设备

地址

[1字节]

功能码

[1字节]

起始地址

[2字节]

寄存器数量

[2字节]

字节数

[1字节]

寄存器值

[寄存器数量*2字节]

校验

[2字节]

高8位

低8位

高8位

低8位

寄存器1

[高8位]

寄存器1

[低8位]

....

寄存器N

[高8位]

寄存器N

[低8位]

高8位

低8位

0x02

0x10

0x00

0x01

0x00

0x02

0x04

0x00

0x0A

0x01

0x02

0x9D

0x74

写入寄存器40002

写入寄存器40003

        2号站设备响应帧格式:

设备

地址

[1字节]

功能码

[1字节]

起始地址

[2字节]

寄存器数量

[2字节]

校验

[2字节]

高8位

低8位

高8位

低8位

高8位

低8位

0x02

0x10

0x00

0x01

0x00

0x02

0x10

0x3B

3) 功能码-0x02(读离散量输入)

        举例:读取2号站,10197~10218 22个离散量的状态。

        Modbus RTU主站设备请求帧格式:

设备

地址

[1字节]

功能码

[1字节]

起始地址

[2字节]

离散输入数量

[2字节]

校验

[2字节]

高8位

低8位

高8位

低8位

高8位

低8位

0x02

0x02

0x00

0xC4

0x00

0x16

0xB8

0x0A

        2号站设备响应帧格式:

设备

地址

[1字节]

功能码

[1字节]

字节数

[1字节]

离散量输入状态

校验

[2字节]

离散量

1-8

离散量

9-16

...

离散量

N~N+7

高8位

低8位

0X02

0X02

0x030xAC0xDB0x350x220xBB

        通过前面的介绍,可以看到Modbus RTU协议数据帧是没有起始符和结束符,所以两个数据帧之间需要靠时间间隔来区分。协议中规定信息帧发送至少要有3.5个字符时间的停顿间隔。即在一个数据帧的最后一个字符传输完成之后,需要至少3.5个字符时间的停顿标定数据帧的结束,一个新的数据帧可在此停顿之后开始。如果一个新消息在小于3.5个字符时间内接着前个消息开始,接受的设备将认为它是前一数据帧的延续,这将导致CRC校验出错。同时整个数据帧必须作为一连续的流传输。如果在帧完成之前有超过1.5字符时间的停顿时间,接受设备将刷新不完整的数据帧从而认为存在丢包现象。

        那么一个字符是什么呢,他由1个bit起始位,8bit数据位,1个bit奇偶校验位,1个bit停止位组成,在发送时从起始位开始。

9、modbus TCP数据报文结构

        Modbus TCP协议是在RTU协议前面添加MBAP报文头,由于TCP是基于可靠连接的服务,RTU协议中的CRC校验码就不再需要,所以在Modbus TCP协议中是没有CRC校验码。

MBAP报文头:

事务处理标识协议标识长度单元标识符
2字节2字节2字节1字节
事务处理标识可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文
协议标识00 00表示ModbusTCP协议
长度表示接下来的数据长度,单位为字节
单元标识符可以理解为设备地址

主机请求(发送):00 00 00 00 00 06 00 03 00 20 00 01 
从机响应(返回):00 00 00 00 00 05 00 03 02 00 00 

主机请求(发送):00 00 00 00 00 06 00 04 00 30 00 01
从机响应(返回):00 00 00 00 00 05 00 04 02 00 08 

主机请求(发送):00 00 00 00 00 09 00 10 00 20 00 01 02 00 00

从机响应(返回):00 00 00 00 00 06 00 10 00 20 00 01

三、modbus TCP、modbus RTU数据报文结构比较(16进制)

1、读指令对比(0x04)

MBAP报文头地址码功能码寄存器地址寄存器数量CRC校验
Modbus RTU010400 0000 1671 C4
Modbus TCP00 00 00 00 00 06 010400 0000 16

2、写指令对比(0x10)

MBAP报文头地址码功能码寄存器地址寄存器数量数据长度正文CRC校验
Modbus RTU001000 2000 010200AC A0
Modbus TCP00 00 00 00 00 09 001000 2000 010200

四、RS485、RS232介绍

1、由来

        RS-232是串行数据接口标准,最初都是由电子工业协会(EIA)制订并发布的,RS-232在1962年发布,命名为EIA-232-E,作为工业标准,以保证不同厂家产品之间的兼容。RS-422由RS-232发展而来,它是为弥补RS-232之不足而提出的。为改进RS-232通信距离短、速率低的缺点,RS-422定义了一种平衡通信接口,将传输速率提高到10Mb/s,传输距离延长到1219米(速率低于100kb/s时),并允许在一条平衡总线上连接最多10个接收器。RS-422是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-422-A标准。为扩展应用范围,EIA又于1983年在RS-422基础上制定了RS-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/EIA-485-A标准。由于EIA提出的建议标准都是以“RS”作为前缀,所以在通讯工业领域,仍然习惯将上述标准以RS作前缀称谓。

2、RS232介绍

        RS232通讯又叫串口通讯方式。是指计算机通过RS232国际标准协议用串口连接线和单台设备(控制器)进行通讯的方式。

        通讯距离:9600波特率下建议在13米以内。

        通讯速率(波特率 Baud Rate):缺省常用的是 9600 bps,常见的还有 1200 2400 4800 19200 38400等。波特率越大,传输速度越快,但稳定的传输距离越短,抗干扰能力越差。

        串口连接线:一般标配是3米以内。

3、RS485介绍

        RS485和RS232的基本的通讯机理是一致的,他的优点在于弥补了RS232通讯距离短,不能进行多台设备同时进行联网管理的缺点。

        计算机通过 RS232、RS485转换器,依次连接多台485设备(门禁控制器),采用轮询的方式,对总线上的设备轮流进行通讯。

        接线标示是 485+ 485-,分别对应链接设备(控制器)的 485+ 485-。

        通讯距离:最远的设备(控制器)到计算机的连线理论上的距离是1200米,建议客户控制在800米以内,能控制在300米以内效果最好。如果距离超长,可以选购 485中继器(延长器)(请向专业的转换器生产公司购买,中继器的放置位置是在总线中间还是开始,请参考相关厂家的说明书。)选购中继器理论上可以延长到 3000米。

        负载数量:即一条485总线可以带多少台设备(控制器),这个取决于控制器的通讯芯片和485转换器的通讯芯片的选型,一般有 32台,64台,128台,256台几种选择,这个是理论的数字,实际应用时,根据现场环境,通讯距离等因素,负载数量达不到指标数。微耕公司控制器和转换器按256台设计,实际建议客户每条总线控制在80台以内。如果有几百上千台控制器,请采用 多串口卡 或者 485HUB来解决,具体 请参考“如果系统控制器数成百上千台,如何组网?”坚决禁止使用无源485转换器,具体请参考“为什么禁止使用无源485转换器?”

        485通讯总线(必须用双绞线,或者网线的其中一组),如果用普通的电线(没有双绞)干扰将非常大,通讯不畅,甚至通讯不上。

        每台控制器设备必须手牵手地串下去,不可以有星型连接或者分叉。如果有星型连接或者分叉,干扰将非常大,通讯不畅,甚至通讯不上。

4、RS422介绍

        他的通讯原理和RS485类似,区别在于他的总线是两组双绞线(4根线),分别标示为 R+ R- T+ T- 。缺点是布线成本高,容易搞错。现在用得比较少了。

        RS-422标准全称是“平衡电压数字接口电路的电气特性”,它定义了接口电路的特性。图5是典型的RS-422四线接口。实际上还有一根信号地线,共5根线。图4是其DB9连接器引脚定义。由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节点。即一个主设备(Master),其余为从设备(Salve),从设备之间不能通信,所以RS-422支持点对多的双向通信。接收器输入阻抗为4k,故发端最大负载能力是10×4k+100Ω(终接电阻)。RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)实现。

        RS-422的最大传输距离为4000英尺(约1219米),最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。

        RS-422需要一终接电阻,要求其阻值约等于传输电缆的特性阻抗。在矩距离传输时可不需终接电阻,即一般在300米以下不需终接电阻。终接电阻接在传输电缆的最远端。

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Dev-C++ 中的预告提示(pre-prompt)通常是在代码中存在语法错误或其他编译问题时出现的。解决这个问题的方法有以下几种: 1. 检查代码:检查代码是否有语法错误或其他编译问题,并修复错误。 2. 重新编译代码:如果代码已经修复,请重新编译代码。 3. 重启Dev-C++:如果仍然存在问题,请重启Dev-C++,然后重试编译。 4. 更新Dev-C++:如果仍然存在问题,请考虑更新Dev-C++至最新版本,以确保所使用的软件是最新的。 希望这些信息能帮助您解决Dev-C++中的预告提示问题。 ### 回答2: 在Dev C中进行调试时,遇到pre-prompt窗口的问题可以通过以下方法解决。 首先,pre-prompt窗口是由于在代码中使用了system函数而导致的。system函数可以执行一些系统命令,但它也会在命令执行后暂停程序的运行,等待用户输入任意键才会继续运行。因此,在调试过程中,pre-prompt窗口会出现并等待用户操作,进一步导致调试过程中断。 为了解决这个问题,我们可以考虑以下两种方法: 1. 删除或注释掉使用system函数的代码:如果使用system函数的代码不是必须的,或者不依赖于用户的输入,那么可以直接删除或注释掉这部分代码。这样可以避免pre-prompt窗口的出现,程序可以继续正常运行。 2. 修改代码以避免pre-prompt窗口的出现:如果使用system函数的代码是必要的,并且依赖于用户的输入,我们可以通过将system函数封装到一个函数中,并在函数中添加相应的逻辑判断,避免调试时出现pre-prompt窗口。例如,在函数中可以通过判断是否处于调试模式来决定是否执行system函数以及是否等待用户输入。 总之,解决Dev C中调试时pre-prompt窗口的问题,一方面可以删除或注释掉使用system函数的代码,另一方面可以修改代码以避免pre-prompt窗口的出现。这样可以使调试过程更加顺利地进行。 ### 回答3: 在Dev C++中调试时,遇到pre-prompt问题时,可以采取以下解决方法。 首先,我们需要了解pre-prompt的含义。pre-prompt是指在程序运行时,出现一个提示框,在提示框中等待用户输入特定的数据或命令。由于这个提示框会暂停程序的执行,因此会影响程序的调试。 要解决pre-prompt问题,一个常用的方法是将输入数据或命令在代码中直接设置好,以避免出现预期之外的等待。这样就能够使程序的执行不受干扰,方便进行调试。 另外一个解决方法是使用自动化测试。可以编写一个测试脚本,通过模拟用户输入,代替手动输入,来完成程序的运行和调试。这样能够更好地控制程序的输入和输出,提高调试效率。 另外,还可以使用条件编译来解决pre-prompt问题。使用条件编译的方式,可以根据不同的调试阶段选择性地启用或禁用pre-prompt代码,从而在调试时避免pre-prompt的干扰。 最后,如果以上方法无法解决pre-prompt问题,也可以考虑使用其他集成开发环境(IDE)进行调试。例如,可以尝试使用Visual Studio等IDE,它们提供了更强大的调试功能,可以更好地处理pre-prompt问题。 综上所述,对于Dev C++中调试时遇到的pre-prompt问题,可以通过设置输入数据、使用自动化测试、条件编译或尝试其他IDE等方法进行解决。这将提高调试效率,便于我们找出程序中的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值