Modbus协议在TCP/IP上的运用

这篇具有很好参考价值的文章主要介绍了Modbus协议在TCP/IP上的运用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 Modbus规约

  1. Modbus规约是典型的一问一答的通信规约,支持多种电气接口,可在各种介质上传输,并且消息帧格式简单、紧凑、易懂,方便形成工业控制网络。

  2. 通用的Modbus帧由4个部分组成:地址域、功能码、数据和差错校验。整个帧被称为应用数据单元(ADU),功能码和数据组成协议数据单元(PDU)。如下图所示:
    Modbus协议在TCP/IP上的运用

  3. 通信连接方式主要分为2种,串口和TCP/IP物理层,而串口里又细分为RTU模式和ASCII模式。串口的报文都需要差错校验,但是TCP/IP不需要。
    Modbus协议在TCP/IP上的运用

  4. 对于串口部分本文不涉及,本文主要围绕Modbus TCP/IP规约的几种常见功能码进行介绍。

2 Modbus TCP/IP

2.1 概要

  1. Modbus TCP/IP最大帧数据长度为260字节,不需要校验功能,因为
    • 底层TCP/IP确保端到端的连接
    • TCP/IP链路层确保传输数据的准确性
  2. 其中,MBAP报文头占用7个字节,分别是:
    • 2个字节的传输标识符(Transaction Id),包序号,可设为0,也可每次通信自动+1,在同一时刻,这个标识符必须唯一;
    • 2个字节的协议标识符(Protocol Id),Modbus协议为0,所以值为0x0000;
    • 2个字节的字节长度(Length),记录后续的字节个数,由服务器应答时生成,其他三个都是复制
    • 1字节的单元标识符(Unit Id),识别从机设备,为从站地址,即Slave Id
  3. 报文头后,就是功能码+数据部分。如下图:
    Modbus协议在TCP/IP上的运用
  4. 下文是常见的功能码使用,所讲结构单指PDU部分。注意:当响应异常时,异常功能码=正常功能码+0x80

2.2 0x01读线圈

  1. 该功能码的功能是读取各离散输出的开关(ON/OFF)状态。一个寄存器是2个字节,一个字节有8比特位,该功能就是读每个比特位的状态0/1。
  2. 请求PDU结构为:1字节的功能码+2字节的起始地址+2字节的线圈数量,如下图所示:
    Modbus协议在TCP/IP上的运用
  3. 响应PDU结构为:1字节功能码+1字节数+N个字节的线圈状态,如下图所示:
    Modbus协议在TCP/IP上的运用
  4. 举例,请求读离散量输出20-38的实例:
    • 请求PDU为:01 0013 0013,功能码0x01;起始地址0x0013,从0开始寻址线圈;输出数量0x0013,从20-38一共19个点
    • 响应PDU:01 03 CD 6B 05,功能码0x01;字节数0x03,一字节8比特位,要知道19个状态,需要3个字节;输出状态27-20为0xCD;输出状态35-28为0x6B;输出状态38-36为0x05。用零填充剩余高比特位。

2.3 0x03读保持寄存器

  1. 功能:使用该功能码读取保持寄存器连续块的内容,从0开始寻址寄存器。
  2. 请求PDU结构:1字节功能码+2字节起始地址+2字节寄存器数量(从起始地址开始要读多少个寄存器)
    Modbus协议在TCP/IP上的运用
  3. 响应PDU:1字节功能码+1字节字节数+字节数个字节表示寄存器值。
    Modbus协议在TCP/IP上的运用
  4. 举例,请求读寄存器108-110的值
    • 请求PDU:03 006B 0003,功能码0x03;起始地址0x006B,因为从0开始寻址,所以108对应107;寄存器数量0x0003,108-110共3个寄存器
    • 响应PDU:03 06 023B 0000 0065,功能码0x03,字节数0x06,3个寄存器,每个寄存器有2个字节,所以6个字节;寄存器108值0x023B;寄存器109值0x0000;寄存器110值0x0065

2.4 0x05写单个寄存器

  1. 功能:使用该功能码写单个输出为ON或OFF,0xFF00表示ON,0x0000表示OFF,其余都为非法值。从0开始寻址线圈。
  2. 请求PDU:1字节功能码+2字节输出地址+2字节输出值
    Modbus协议在TCP/IP上的运用
  3. 响应PDU:1字节功能码+2字节输出地址+2字节输出值。当响应正常时,请求PDU和响应PDU是一样的;异常时,1字节异常功能码+1字节异常码组成。
  4. 举例,请求写线圈173为ON:
    • 请求PDU:05 00AC FF00,功能码0x05;输出地址0x00AC,因为从0开始寻址线圈,所以173对应172;输出值0xFF00表示ON
    • 响应PDU:05 00AC FF00

2.5 0x06写单个寄存器

  1. 功能:使用该功能码写单个保持寄存器,从0开始寻址寄存器

  2. 请求PDU:1字节功能码+2字节寄存器地址+2字节寄存器值
    Modbus协议在TCP/IP上的运用

  3. 响应PDU:1字节功能码+2字节寄存器地址+2字节寄存器值。当响应正常时,请求PDU和响应PDU是一样的;异常时,1字节异常功能码+1字节异常码组成。

  4. 举例,请求将0x0003写入寄存器2中:文章来源地址https://www.toymoban.com/news/detail-508047.html

    • 请求PDU:06 0001 0003,功能码0x06;寄存器地址0x0001,从0开始寻址,所以寄存器2对应1;寄存器值0x0003
    • 响应PDU:06 0001 0003

2.6 0x10写多个寄存器

  1. 功能:使用该功能码写连续寄存器块。从0开始寻址。
  2. 请求PDU:1字节功能码+2字节起始地址+2字节寄存器数量+1字节的字节数+字节数个字节的寄存器值
    Modbus协议在TCP/IP上的运用
  3. 响应PDU:1个字节功能码+2字节起始地址+2字节寄存器数量
    Modbus协议在TCP/IP上的运用
  4. 举例,请求将0x000A和0x0102写入以2为开始的两个寄存器
    • 请求PDU:10 0001 0002 04 000A 0102,功能码0x10;起始地址0x0001;寄存器数量0x0002;字节数量0x04;写入值0x000A和0x0102
    • 响应PDU:10 0001 0002

3 实例(ADU)

  1. 客户端和服务端通过TCP/IP进行连接,下面为通信信息。
  2. 客户端请求:19B2 0000 0006 06 03 0027 0002
    • 0x19B2,MBAP报文头里的Transaction Id,服务端只要复制该内容,通常表示这一来回的序列号
    • 0x0000,MBAP报文头的Protocol Id,Modbus TCP/IP规定协议为0x0000,服务端只要复制该内容
    • 0x0006,MBAP报文头的Length,表示该字节以后的字节数量,服务器回时要自行计算。实例可见,该部分后06 03 0027 0002共有6个字节
    • 0x06,MBAP报文头的Unit Id,表示从站设备地址,slave Id
    • 0x03,功能码为0x03,读保持寄存器
    • 0x0027,起始地址,从寄存器40开始,因为从0寻址
    • 0x0002,寄存器数量,从起始寄存器开始读2个寄存器
  3. 服务端正常响应:19B2 0000 0007 06 03 04 0000 0000
    • 0x0007,表示其后的字节数,响应报文是7个字节,所以与请求报文的0x0006不同
    • 0x04,表示读寄存器的字节数,读2个寄存器,共4个字节
    • 0x0000 0000,读取的内容
  4. 服务端异常响应:19B2 0000 0003 06 83 02
    • 0x83,异常功能码是由正常功能码+0x80计算而来
    • 0x02,异常码,表示异常原因为非法数据地址。对于服务器(或从站)来说,询问中接收到的数据地址是不可允许的地址。比如:本次请求为读寄存器40-41的值,但是从站只有40个寄存器,这时将产生异常码0x02
    • 异常码还有许多,自行搜索查看

到了这里,关于Modbus协议在TCP/IP上的运用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式通信协议【Modbus】Modbus TCP的帧格式

    Client request:例: 19 B2 00 00 00 06 06 03 00 27 00 02 上面是modbus客户端发出的报文内容,为modbus tcp/ip协议格式,其前面的六个字节为头字节( header handle); 19 B2 00 00 00 06 19 B2  00 00 00 06 两个Client发出的检验信息,Sever端只是需要将这两个字节的内容copy以后再放到response的报文的相应位

    2024年02月05日
    浏览(49)
  • Modbus-TCP协议说明

    文章要说明Modbus TCP协议的相关内容。此协议是1996年施耐德公司推出的基于TCP/IP协议的Modbus协议。 此协议与Modbus-RTU协议最大的不同就是,使用了在TCP/IP协议上的专用的报文头识别Modbus应用数据单元。这种报文头被称为MBAP报文头。  报文头的长度是7个字节,分别有: 事务处理

    2024年02月11日
    浏览(46)
  • C# Modbus通信从入门到精通(21)——Modbus TCP协议原理

    Modbus TCP是走网口的,也可以在同一时间内有多个从站访问主站,并且通过Modbus事务处理标识来区分同一时刻的不同Modbus事务,这是区别于Modbus ASCII和Modbus RTU的地方。 Modbus客户端通常输入Modbus服务器的IP地址和端口号来建立TCP连接,然后根据从站地址来确定具体访问哪个从站

    2024年02月15日
    浏览(37)
  • Modbus tcp和Tcp/ip有什么区别

             Modbus TCP是一种基于TCP/IP协议的应用层协议 ,它是Modbus协议的扩展。Modbus协议是一种串行通信协议,最初是由Modicon公司在1979年开发的,用于工业自动化控制系统中设备之间的通信。 Modbus TCP则是将Modbus协议转换为基于以太网的TCP/IP协议 ,以支持更广泛的设备和系

    2024年02月10日
    浏览(29)
  • modbus-tcp-rtu协议图表

    MODBUS TCP 读寄存器 请求 序号 意义 所占字节 字节存放格式 1 事务处理标识 2个字节 高字节在前 2 协议标识 2个字节 高字节在前 3 长度 2个字节 高字节在前 4 单元标识 1个字节 0x00-0xff 5 功能码 1个字节 0x03 6 起始寄存器地址 2个字节 高字节在前 7 寄存器个数 2个字节 高字节在前

    2024年01月23日
    浏览(27)
  • MODBUS TCP协议实例数据帧详细分析

    Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式

    2024年02月05日
    浏览(53)
  • Modbus TCP/IP之异常响应

    对于查询报文,存在以下四种处理反馈: 正常接收,正常处理,返回正常响应报文; 因为通信错误等原因,造成从站设备没有接收到查询报文,主站设备将按超时处理; 从站设备接收到的查询报文存在通信错误(如:Modbus串行的LRC、CRC错误),此时从站设备将丢弃报文不响

    2024年02月08日
    浏览(43)
  • Modbus TCP 协议详解及C语言示例

    Modbus TCP 是一种应用于以太网的通讯协议,基于Modbus RTU协议。Modbus协议是一种应用于串行数据通信的协议,广泛应用于工业控制系统。Modbus TCP 将传统的 Modbus RTU 消息封装在 TCP/IP 报文中,使其能够在现代的以太网环境中进行通信。本文将详细介绍 Modbus TCP 协议的报文格式、各

    2024年02月16日
    浏览(26)
  • Modbus/Modbus TCP/EtherNet IP转MQTT物联网网关

    MQT-805是基于RS485、10M/100M网口通讯,支持Modbus总线协议、Modbus TCP协议(双网口)、支持EtherNet/IP协议(双网口)透明传输、2路数字量输入(DI)、2路数字量输出(DO)、GPS定位和4G(全网通)无线数据通讯网络的一款远程监控终端,主要针对需要无人值守和远程监控的工业监控现场,可用于

    2024年02月22日
    浏览(32)
  • python 与PLC 基于 modbus tcp 协议通讯

    Modbus是一种串行通信协议,是工业领域通信协议的业界标准,是工业电子设备之间常用的连接方式。最近在工作中需要上位机python程序和PLC做通讯,就测试了下使用modbus tcp 通讯。         目前实际测试结果是与西门子PLC/信捷PLC都可以正常通讯使用,但是看到网上说可以传输

    2024年02月17日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包