Modbus通讯协议从一窍不通到原来如此 |
您所在的位置:网站首页 › 为什么网页下载速度慢 › Modbus通讯协议从一窍不通到原来如此 |
最近学习Modbus,本人0基础,学习之前都不知道Modbus是什么,以前从未接触过这个协议;看资料看了4天,CSDN上的博文总是不尽人意、缺枝短叶,看完仍是一头雾水;后来结合着Modbus中文协议,终于算是有了比较透彻的理解。在此细心的整理了两天的学习笔记,给出了一个比较完整的学习流程和知识记录。 1. 基本宏观概念(大方面,是什么,干啥用的)目录: 1.1通信模式分类 并行通信串行通信 1.2单播模式与广播模式1.3Modbus基本概念1.4应用场景 1.1 通信模式分类 1.1.1 并行通信(数据各位同时传送)一般快速设备之间采用并行通信,譬如CPU与存储设备、存储器与存储器、主机与打印机等都采用并行通讯。并行通讯,有多少位数据就必须有多少根数据线,如下图是11 位数据就有11根数据线。 串行通信最少可以只需一根通信线,只发或只收。因而大大节省了系统资源,降低了系统成本。由于只用一根数据线,所以是以降低传送速度来换取资源的,它常用在传送距离远,速度要求不高的场合。 具有固定的通信格式,数据以相同的帧格式传送,每一帧由起始位、数据位、奇偶校验位和停止位组成。 起始位:通信线路上没有数据传输的时候处于高电平(逻辑“1“)状态,当发送设备发送一个字符数据时,先发送一个低电平(逻辑“0“)信号,告诉接收端”开始发送数据了“,这个低电平就是一个起始位,接收端收到这个信息就准备接收信息。数据位:可以是5 位、6 位、7 位、或8 位。数据传送时,低位在前。奇偶校验位:用于数据传输过程的检错 奇校验:保证数据位和校验位“1”的个数为奇数偶校验:保证数据位和校验位“1”的个数为偶数无校验:没有校验位,此时校验位用一个停止位补充,即有两个停止位 停止位:停止位可以是1位、也可以是1.5 位或2 位。接收端收到停止位后,知道上一字符已传送完毕,同时,也为接收下一字符作好准备。若停止位后不是紧接着传送下一个字符,则让线路保持为“1”。“1”表示通信线路处于空闲等待状态。存在空闲位是异步通信的特性之一。
通信就是交流,协议就是交流的规范或者语言。Modbus简单来说就是主机和远程设备的交流语言。工业上,比如我想获得工厂温度、湿度信息,那我先通过传感器获得温度湿度数据,保存到记录里,我在办公室想知道这个信息,那么我只要保证三点:和工厂的控制设备连接、发送命令,控制设备返回响应,这三项满足,就能远程获取信息或者控制控制器了。 那么这里面包括了几点:数据的存储和读取(线圈和寄存器)、命令的种类(功能码)、数据的传输(通信模式、数据帧格式)、数据正确与否的检验(校验)、反馈或响应(异常码)等模块。 目录: 2.1 单播模式与广播模式2.2 Modbus地址规则2.3 Modbus帧格式2.4 寄存器 寄存器种类寄存器地址分配 2.5 功能码 功能码分类部分功能码举例 2.6 异常码 通信状况响应类型异常码表事务处理流程 2.7 数据帧格式 0x01功能码0x03功能码0x0f功能码0x10功能码 2.8 三种通信模式 串行传输模式:RTU、ASCII以太网(TCP/IP) 2.1 单播模式与广播模式单播模式:“一对一”通讯。主站只寻找某一确定的从站,从站接收到命令后处理,并返回一个应答报文。主站需要发出一个命令报名并处理从站返回的报文,从站需要接收主站的命令报文并发出一个应答报文。每个子节点必须有唯一的地址(1-247)。 广播模式:“一对所有”。主站向所有从站发送请求,对于主站发送的广播请求没有应答返回,广播请求必须是写命令。所有从站必须接收写功能的广播。地址0用来广播通信。 2.2 Modbus帧格式Modbus应用协议定义了一个独立于通信层的协议数据单元PDU(Protocol DataUnit),在不同的总线或者网络的Modbus协议同过在PDU上添加对应的附加域,构造出能用于当前通信的ADU。
Modbus合法字节地址为十进制0-247,0为广播地址,每个子设备地址为1-247。主节点将子节点地址填入地址域来寻找子节点,子节点将自己的地址填入来告知主节点是哪个子节点在应答。 功能码表明了主节点要求子节点执行的操作。数据部分包括了请求时的具体细节或者返回时的数据细节。差错校验是串行传输中对地址域和PDU的冗余校验值,不同的传输模式采用不同的校验方式 2.3 寄存器(数据的存储和读取) 2.3.1 寄存器种类 寄存器种类说明PLC类比举例线圈状态输出端口。可设定端口的输出状态,也可以读取该位的输出状态。可分为两种不同的执行状态,例如保持型或边沿触发型。可读可写。DO数字量输出电磁阀输出,MOSFET输出,LED显示等。离散输入状态输入端口。通过外部设定改变输入状态,可读但不可写。DI数字量输入拨码开关,接近开关等。保持寄存器输出参数或保持参数,控制器运行时被设定的某些参数。可读可写。AO模拟量输出模拟量输出设定值,PID运行参数,变量阀输出大小,传感器报警上限下限。输入寄存器输入参数。控制器运行时从外部设备获得的参数。可读但不可写。AI模拟量输入模拟量输入 2.3.2 寄存器地址分配寄存器PLC地址指存放于控制器中的地址,这些控制器可以是PLC,也可以使触摸屏,或是文本显示器。PLC地址一般采用10进制描述,共有5位,其中第一位代表寄存器类型。 寄存器协议地址指指通信时使用的寄存器地址,例如PLC地址40001对应寻址地址0x0000,40002对应寻址地址0x0001,寄存器寻址地址一般使用16进制描述。例如,PLC寄存器地址40003对应协议地址0002,PLC寄存器地址30003对应协议地址0002,虽然两个PLC寄存器寄存器通信时使用相同的地址,但是需要使用不同的功能码访问,不同的功能码对应操作对应确定的PLC地址,所以访问时不存在冲突。 寄存器PLC地址寄存器协议地址适用的功能码(指令代号)寄存器种类读写状态00001-099990000-FFFF01H、05H、0FH线圈状态可读可写10001-199990000-FFFF02H离散输入状态可读30001-399990000-FFFF04H输入寄存器可读40001-499990000-FFFF03H、06H、0FH保持寄存器可读可写 2.4 功能码(主机发送的命令代码) 2.4.1功能码分类功能码按操作对象可以分为两种:位操作功能码(最小单位是bit)和字操作功能码(最小单位为2字节) 功能码按使用范围可以分为三种: 公共功能码: 是较好地被定义的功能码 保证是唯一的 MODBUS组织可改变的 公开证明的 具有可用的一致性调试 由Modbus-IDA.org确认的 用户定义功能码: 有两个用户定义功能码的定义范围,即65-72和十进制100-110用户没有MODBUS组织的任何批准就可以选择和实现一个功能码不能保证被选功能码的使用是唯一的如果用户要重新设置功能作为一个公共功能码,那么用户必须启动RFC,以便将改变引入公共分类中,并且指配一个新的公共功能码。保留功能码: 一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。 2.4.2 部分功能码举例 功能码异常功能码(+ 0×80)中文名称寄存器PLC地址位操作/字操作操作数量0×010×81读线圈状态00001-09999位操作单个或多个0×020×82读离散输入状态10001-19999位操作单个或多个0×030×83读保持寄存器40001-49999字操作单个或多个0×040×84读输入寄存器30001-39999字操作单个或多个0×050×85写单个线圈00001-09999位操作单个0×060×86写单个保持寄存器40001-49999字操作单个0×0F0×8F写多个线圈00001-09999位操作多个0×100×90写多个保持寄存器40001-49999字操作多个 2.5 异常码(服务器或从站返回的异常代号) 2.5.1 通信状况 当主机向设备发送命令后,可能会出现以4下种情况: 请求正确的到达服务器,并且请求的内容服务器可以处理,那么服务器返回一个正常响应请求正确的到达服务器,但是请求服务器无法处理(例如请求读一个不存在的寄存器),此时服务器将返回一个异常响应,通知主机错误和错误的类型。请求到达服务器,但是不正确,检测到了通信错误(奇偶校验、LRC、CRC等等),那么不返回响应,主机将最终成为超时状态请求就没到达服务器,服务器没收到也就更不会响应,主机也会成为超时状态 2.5.2 响应类型 综上,根据服务器处理结果,可以建立两种类型的响应: 一个正常MODBUS应答帧: 功能码域:响应功能码 = 请求功能码 数据域:请求中要求的任何数据 校验码:响应帧自身计算 从站地址功能码数据校验码(低位)校验码(高位)从站自身地址与请求功能码保持一致(范围:0x00-0x7f)请求中要求的任何数据XXXX一个异常MODBUS应答帧: 用来为客户机提供处理过程中与被发现的差错相关的信息 功能码域:响应功能码 = 请求功能码 + 0x80(见2.4.2) 数据域:提供一个异常码来指示差错原因 校验码:响应帧自身计算 从站地址功能码数据校验码(低位)校验码(高位)从站自身地址请求功能码 + 0x80异常码XXXX请求帧格式 从站地址功能码起始地址(高位)起始地址(低位)数量(高位)数量(低位)校验码(低位)校验码(高位)0x030x010x000x130x000x1BXXXX含义: 目标所在从站:0x03(3号) 命令:0x01(读线圈状态) 寄存器种类:线圈状态 目标起始索引地址:0x0013(索引地址 = 19) 目标起始PLC地址: 00001 + 19 = 00020(线圈状态PLC地址范围:00001-09999) 读取线圈数量:0x1B(1B = 27个,即27bit数据) 目标线圈范围:00020 - 00046(从00020开始27个线圈) 校验码:XXXX 正常应答帧格式 从站地址功能码字节计数字节一字节二字节三字节四校验码(低位)校验码(高位)0x030x010x040xCD0x6B0xB20x05YYYY含义: 返回从3号从站读取的共4个字节的数据,数据为:0xCD、0x6B、0xB2、0x05(为了举例子暂时编的),校验码为YYYY。 补充: 由于读取的是线圈(bit),若读取的个数不为8的倍数,比如这次读27bit,则取整数字节4字节32bit返回,剩余5bit用0补全。 2.6.2 0x03功能码(读保持寄存器)请求帧格式 从站地址功能码起始地址(高位)起始地址(低位)数量(高位)数量(低位)校验码(低位)校验码(高位)0x030x030x000x060x000x02XXXX含义: 目标所在从站:0x03(3号) 命令:0x03(读保持寄存器) 寄存器种类:保持寄存器 目标起始索引地址:0x0006(索引地址 = 6) 目标起始PLC地址: 40001 + 6 = 40007(保持寄存器PLC地址范围:40001-49999) 读取寄存器数量:0x02(02 = 2个,即2×2byte = 4byte数据)(一个寄存器为2字节) 目标线圈范围:40007-40008(从40007开始2个寄存器) 校验码:XXXX 正常应答帧格式 从站地址功能码字节计数字节一(高位)字节一(低位)字节二(高位)字节二(低位)校验码(低位)校验码(高位)0x030x030x020xA10x050x040xCDYYYY含义: 返回从3号从站读取的共2个寄存器的数据,数据为:0xA105(40007上的数据)、0x04CD(40008上的数据)(为了举例子暂时编的),校验码为YYYY。 2.6.3 0x0f功能码(写多个线圈)请求帧格式 从站地址功能码起始地址(高位)起始地址(低位)数量(高位)数量(低位)字节数字节一字节二字节三校验码(低位)校验码(高位)0x010x0f0x000x130x000x150x030x120x1A0x04XXXX含义: 目标所在从站:0x01(1号) 命令:0x0f(写多个线圈) 寄存器种类:线圈 目标起始索引地址:0x0013(索引地址 = 19) 目标起始PLC地址: 00001 + 19 = 00020(线圈状态PLC地址范围:00001-09999) 写入线圈数量:0x15(0x15 = 21bit数据) 实际写入线圈数量:21bit + 3bit = 24bit = 3byte(只能 目标线圈范围:00020-00040(从00020开始21个线圈) 字节一的值:0x12(0x12 = 18 = 0001 0010) 字节二的值:0x1A(0x1A = 26 = 0001 1010) 字节三的值:0xAC(0x04 = 4 = 0000 0100)(最高三位为补0) 校验码:XXXX 补充: 若写入的线圈个数不为8的倍数,则高位补0使其字节数为整数。 正常应答帧格式(在原报文基础上除去字节数和具体字节并加上当前校验码) 从站地址功能码起始地址(高位)起始地址(低位)数量(高位)数量(低位)校验码(低位)校验码(高位)0x010x0f0x000x130x000x15YYYY含义: 向1号从站起始地址为00020处写入21个线圈的值成功,校验码为YYYY。 2.6.4 0x10功能码(写多个保持寄存器)请求帧格式 从站地址功能码起始地址(高位)起始地址(低位)数量(高位)数量(低位)字节数字节校验码(低位)校验码(高位)0x010x100x000x530x000x020x040x13141A1BXXXX含义: 目标所在从站:0x01(1号) 命令:0x10(写多个保持寄存器) 寄存器种类:保持寄存器 目标起始索引地址:0x0053(索引地址 = 83) 目标起始PLC地址: 40001 + 83 = 40084(线圈状态PLC地址范围:40001-49999) 写入寄存器数量:0x02(02 = 2个,即2×2byte = 4byte数据)(一个寄存器为2字节) 目标寄存器范围:40084-40085(从40084开始2个保持寄存器) 写入字节数:0x04(4个) 写入字节内容:0x13141A1B(40084保持寄存器写入0x1314 = 0001 0011 0001 0100 ,40085保持寄存器写入0x1A1B = 0001 1010 0001 1011) 校验码:XXXX 正常应答帧格式(在原报文基础上除去字节数和具体字节并加上当前校验码) 从站地址功能码起始地址(高位)起始地址(低位)数量(高位)数量(低位)校验码(低位)校验码(高位)0x010x100x000x530x000x02YYYY含义: 向1号从站的40084位置开始写入两个保持寄存器成功,校验码为YYYY。 2.7 三种通信模式 2.7.1 串行传输模式(异步串行传输)主从协议,位于OSI模型的第二层。由于没有冲突检测,为了防止混乱,只有一个主站,向“从站”发送命令并处理从节点的响应,从站接收主站的命令并做出响应;主站只能启动一个Modbus事务处理,从站没有收到主站的请求时不主动传输数据,也不与其他从站通信。 物理层上,最常用RS-485 2线制接口或4线制接口,当需要短距离的点到点通信时,也可以使用RS-232串行接口。 串行总线作为客户机,从站作为服务器。在串行链路上,所有设备的传输模式(及串行口参数)必须相同。所有设备必须实现RTU模式,ASCII模式只是一个选项,默认模式必须是RTU模式。 编码系统:8位二进制,每个8位字节含有两个4位十六进制字符 字节格式(11位) 有校验:1个起始位,8个数据位,1个奇偶校验位,1个停止位无校验:1个起始位,8个数据位,2个停止位串行发送字符:从左到右:最低有效位(LSB)…最高有效位(MSB) 校验(奇校验ODD、偶校验EVEN和无校验NONE) 默认校验模式必须是偶校验,为了保证和其他产品的兼容性,建议使用无校验。如果使用无校验,那么多附加一个停止位来满足定长11位异步字符。帧格式(最大256字节) 地址功能码数据CRC校验1byte = 8bit1byte = 8bitNbyte = N×8bit2byte = 16bit帧判断 结束判断:用时长至少为3.5个字符时间的空闲间隔将报文帧区分开,如果3.5个字符时间未接收到字符,则视为该帧结束。 帧校验(CRC循环冗余校验,2字节,检验整个报文内容) 发送方计算CRC的值并附加到帧尾,接收报文的过程中,接收设备重新计算CRC的值,并将计算的结果和接收到的CRC比较;若不相等,则产生了错误。 ASCII(使用LRC纵向冗余校验) 用两个ASCII码字符发送报文中的一个8位字节,当通信链路或者设备不能满足RTU模式的定时管理要求时使用。 编码系统:十六进制,ASCII字符0-9,A-F,报文中每个ASCII字符表示一个十六进制字符字节格式(10位) 有校验:1个起始位,7个数据位,1个奇偶校验位,1个停止位无校验:1个起始位,7个数据位,2个停止位 串行发送字符:从左到右:最低有效位(LSB)…最高有效位(MSB)校验(奇校验ODD、偶校验EVEN和无校验NONE) 默认校验模式必须是偶校验,为了保证和其他产品的兼容性,建议使用无校验。如果使用无校验,那么多附加一个停止位来满足定长10位异步字符。MODBUS TCP/IP通信结构: 串行链路上一个主站多个从站的模式演变为多个客户机和多个服务器的模式,IANA(Internet Assigned NumbersAuthority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,ModbusTCP/IP服务器端通常该端口作为接收报文的端口, 这是目前在仪表与自动化行业中唯一分配到的端口号。 MODBUS TCP/IP帧: MODBUS 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上 的 MODBUS协议映射能够在应用数据单元(ADU)上引入一些附加域。 在TCP/IP上使用一种专用报文头来识别Modbus应用数据单元ADU,即MBAP报文头。 MBAP报文头格式(长7字节): MODBUS TCP/IP帧格式: 协议数据单元前加MBAP报文头,没有了校验码,其他数据格式相同 请求帧格式: 事务元处理标识符(高位)事务元处理标识符(低位)协议标识符(高位)协议标识符(低位)长度(高位)长度(低位)单元标识符功能码起始地址(高位)起始地址(低位)寄存器数量(高位)寄存器数量(低位)0x150x010x000x000x000x060xFF0x030x000x060x000x02正常应答帧格式: 事务元处理标识符(高位)事务元处理标识符(低位)协议标识符(高位)协议标识符(低位)长度(高位)长度(低位)单元标识符功能码字节计数字节一(高位)字节一(低位)字节二(高位)字节二(低位)0x150x010x000x000x000x060xFF0x030x020xA10x050x040xCD参考文章: MODBUS协议整理——功能码简述ModbusTcp和ModbusRtuModbus协议中文版 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |