**古月金真**

简介

Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。

Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。

标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。

ModbusTCP数据帧

ModbusTCP的数据帧可分为两部分:MBAP+PDU。

报文头MBAP

MBAP为报文头,长度为7字节,组成如下:

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

事务处理标志
传输标识用于将请求与未来响应之间建立联系。因此,对TCP 连接来说,在同一时刻,这个标识符必须是唯一的。有几种使用此标识符的方式:

  • 例如:可以作为一个带有计数器的简单“TCP顺序号”,在每一个请求时增加计数器;
  • 也可以用作智能索引或指针,来识别事务处理的内容,以便记忆当前的远端服务器和未处理的请求。
    服务器收接受的请求数量取决于其容量,即:服务器资源量和TCP 窗口尺寸。同样,客户机同时启动事务处理的数量也取决于客户机的资源容量。这个实现参数称为“NnmberMaxofClientTransaction”,必须作为MODBUS 客户机的一个特性进行描述。根据设备的类型,此参数取值为1~16。

单元标识符
在MODBUS或MODBUS+串行链路子网中对设备进行寻址时,这个域是用于路由的目的。在这种情况下,“Unit Identifier”携带一个远端设备的MODBUS从站地址:

  • 如果MODBUS服务器连接到MODBUS+或MODBUS串行链路子网,并通过一个桥或网关配置地址这个服务器,MODBUS单元标识符对识别连接到网桥或网关后的子网的从站设备是必需的。目的IP地址识别了网桥本身的地址,而网桥则使用MODBUS单元标识符将请求转交给正确的从站设备。
  • 分配串行链路上MODBUS从站设备地址为1~247(10进制),地址0作为广播地址。
    对TCP/IP 来说,利用IP 地址寻址MODBUS 服务器;因此,MODBUS 单元标识符是无用的。必需使用值0xFF。
  • 当对直接连接到TCP/IP网络上的MODBUS服务器寻址时,建议不要在“单元标识符”域使用有效的MODBUS从站地址。在一个自动系统中重新分配IP地址的情况下,并且如果以前分配的MODBUS服务器的IP地址又被指配给网关,使用一个有效的从站地址可能会由于网关的路由不畅而引起麻烦。使用无效的从站地址,网关仅是简单地废弃MODBUD PDU,而不会有任何问题。建议:在采用0xFF作为“单元标识符”的无效值。
    注:0也可以用作与MODBUS/TCP设备直接通信。

帧结构PDU

PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。
功能码
Modbus的操作对象有四种:线圈、离散输入、输入寄存器、保持寄存器。

对象 含义
线圈 PLC的输出位,开关量,在Modbus中可读可写
离散量 PLC的输入位,开关量,在Modbus中只读
输入寄存器 PLC中只能从模拟量输入端改变的寄存器,在Modbus中只读
保持寄存器 PLC中用于输出模拟量信号的寄存器,在Modbus中可读可写

根据对象的不同,Modbus的功能码有:

功能码 含义
0x01 读线圈
0x05 写单个线圈
0x0F 写多个线圈
0x02 读离散量输入
0x04 读输入寄存器
0x03 读保存寄存器
0x06 写单个保持寄存器
0x10 写多个保持寄存器

PDU详细结构

0x01:读线圈
在从站中读1~2000个连续线圈状态,ON=1,OFF=0

  • 请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)
  • 响应:MBAP 功能码 数据长度 数据(一个地址的数据为1位)
  • 如:在从站0x01中,读取开始地址为0x0002的线圈数据,读0x0008位
    00 01 00 00 00 06 01 01 00 02 00 08
  • 回:数据长度为0x01个字节,数据为0x01,第一个线圈为ON,其余为OFF
    00 01 00 00 00 04 01 01 01 01

0x05:写单个线圈
将从站中的一个输出写成ON或OFF,0xFF00请求输出为ON,0x000请求输出为OFF

  • 请求:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)
  • 响应:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)
  • 如:将地址为0x0003的线圈设为ON
    00 01 00 00 00 06 01 05 00 03 FF 00
  • 回:写入成功
    00 01 00 00 00 06 01 05 00 03 FF 00

0x0F:写多个线圈
将从站中的一个输出写成ON或OFF,0xFF00请求输出为ON,0x000请求输出为OFF

  • 请求:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)
  • 响应:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L

0x02:读离散量输入
从一个从站中读1~2000个连续的离散量输入状态

  • 请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)
  • 响应:MBAP 功能码 数据长度 数据(长度:9+ceil(数量/8))
  • 如:从地址0x0000开始读0x0012个离散量输入
    00 01 00 00 00 06 01 02 00 00 00 12
  • 回:数据长度为0x03个字节,数据为0x01 04 00,表示第一个离散量输入和第11个离散量输入为ON,其余为OFF
    00 01 00 00 00 06 01 02 03 01 04 00

0x04:读输入寄存器
从一个远程设备中读1~2000个连续输入寄存器

  • 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
  • 响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)
  • 如:读起始地址为0x0002,数量为0x0005的寄存器数据
    00 01 00 00 00 06 01 04 00 02 00 05
  • 回:数据长度为0x0A,第一个寄存器的数据为0x0c,其余为0x00
    00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00

0x03:读保持寄存器
从远程设备中读保持寄存器连续块的内容

  • 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
  • 响应:MBAP 功能码 数据长度 寄存器数据(长度:寄存器数量×2)
  • 如:起始地址是0x0000,寄存器数量是 0x0003
    00 01 00 00 00 06 01 03 00 00 00 03
  • 回:数据长度为0x06,第一个寄存器的数据为0x21,其余为0x00
    00 01 00 00 00 09 01 03 06 00 21 00 00 00 00

0x06:写单个保持寄存器
在一个远程设备中写一个保持寄存器

  • 请求:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)
  • 响应:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)
  • 如:向地址是0x0000的寄存器写入数据0x000A
    00 01 00 00 00 06 01 06 00 00 00 0A
  • 回:写入成功
    00 01 00 00 00 06 01 06 00 00 00 0A

0x10:写多个保持寄存器
在一个远程设备中写连续寄存器块(1~123个寄存器)

  • 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L 字节长度 寄存器值(13+寄存器数量×2)
  • 响应:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
  • 如:向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F
    00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F
  • 回:写入成功
    00 01 00 00 00 06 01 10 00 00 00 01

Modbus TCP 示例报文

ModBusTcp与串行链路Modbus的数据域是一致的,具体数据域可以参考串行Modbus。这里给出几个ModbusTcp的链路解析说明,辅助新人分析报文。




ModbusTCP通信

通信方式
Modbus设备可分为主站(poll)和从站(slave)。主站只有一个,从站有多个,主站向各从站发送请求帧,从站给予响应。在使用TCP通信时,主站为client端,主动建立连接;从站为server端,等待连接。

  • 主站请求:功能码+数据
  • 从站正常响应:请求功能码+响应数据
  • 从站异常响应:异常功能码+异常码,其中异常功能码即将请求功能码的最高有效位置1,异常码指示差错类型
  • 注意:需要超时管理机制,避免无期限的等待可能不出现的应答

IANA(Internet Assigned Numbers Authority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,这是目前在仪表与自动化行业中唯一分配到的端口号。

通信过程

  1. connect 建立TCP连接
  2. 准备Modbus报文
  3. 使用send命令发送报文
  4. 在同一连接下等待应答
  5. 使用recv命令读取报文,完成一次数据交换
  6. 通信任务结束时,关闭TCP连接

本文借鉴两位大佬文章,原文链接:
云逸:https://www.cnblogs.com/ioufev/articles/10830028.html
http://devdiary.blog.sohu.com/188191457.html

ModbusTCP --古月金真相关推荐

  1. 西门子控制东元伺服电机----古月金真

    西门子伺服电机基础实训 ******古月金真***** 1.1. 实训目标 1. 职业技能:掌握伺服驱动器的配置和伺服电机的使用方法 2. 职业知识:了解本课程的学习的主要内容,掌握伺服电机的工作原理 ...

  2. EasyBuilder8000的安装(古月金真)

    5.1.1 EB8000 软件的安装步骤 EB8000 软件的安装时先准备好EB8000安装包,双击EB8000安装包中的"setup.exe"文件,双击"setup.e ...

  3. 西门子-扫描枪数据读取 ----古月金真

    1.1. 实训目标 1.职业技能:掌握扫描枪的使用方法 2.职业知识:了解本课程的学习的主要内容,掌握扫描枪的工作原理及动 手能力. 3.职业道德:培养学生对的认知分析能力,并能从硬件到软件的过渡,认 ...

  4. 变频器的常用参数设置(古月金真著)

    变频器的常用参数设置 由上图可知P00控制的是频率,即是控制变频器输出的频率改变电机转速. 当P00设置为0时,则输出频率大小是通过变频器上的旋钮来控制. 当P00设置为1时,输出频率大小是通过改变变 ...

  5. 标准Modbus通讯协议格式----古月金真

    Modbus协议是请求/应答通信协议,其中功能码主要用于表述该数据报文执行的功能,当服务器对客户机进行响应时,它使用功能码域来指示正常响应(无差错)或者异常响应(即出现某种差错). 功能码说明 Mod ...

  6. MPB:亚热带生态所谭支良、焦金真等-​反刍动物瘤胃样品采集与保存

    为进一步提高<微生物组实验手册>稿件质量,本项目新增大众评审环节.文章在通过同行评审后,采用公众号推送方式分享全文,任何人均可在线提交修改意见.公众号格式显示略有问题,建议电脑端点击文末阅 ...

  7. ReactorKit

    Swift ReactorKit 框架 ReactorKit 是一个响应式.单向 Swift 应用框架.下面来介绍一下 ReactorKit 当中的基本概念和使用方法. 目录 基本概念 设计目标 Vi ...

  8. 树莓派分辨率进行设置

    古月金真 在用电脑进行远程控制显示时发现电脑上显示的分辨率太小,对分辨率进行修改. 先打开终端对话框,如下图所示: 输入命令:sudo raspi-config 回车弹出对话框如下: 选第五个回车弹出 ...

  9. MPB:亚热带生态所谭支良组-基于微生物成分数据的差异zOTU分析流程

    为进一步提高<微生物组实验手册>稿件质量,本项目新增大众评审环节.文章在通过同行评审后,采用公众号推送方式分享全文,任何人均可在线提交修改意见.公众号格式显示略有问题,建议电脑端点击文末阅 ...

  10. 《全唐诗》前言和后记

    据敦煌残卷补<全唐诗>的整理工作,曾化过二十多年的心血.按照原来计划,全稿分为三卷:"卷一均有作者姓氏,专补<全唐诗>:卷二均失作者姓氏,凡残诗集依集编次,凡选诗(指 ...

最新文章

  1. Nature:盐粒大小的相机,可以拍出清晰彩色照片,未来或可应用到手机
  2. 【微信小程序企业级开发教程】后台用Java操作MySQL表
  3. 更改hostname后vnc无法进入图形界面
  4. boost::lockfree::queue用法的测试程序
  5. CentosMySQL5.6安装方法
  6. 当才华还撑不起梦想时,你应该静下心来看这些
  7. Andorid 反编译App
  8. mysql 装载dump文件_mysql命令、mysqldump命令找不到解决
  9. 建立项目接口文档_分享:一步一个脚印,vue入门之使用mockjs搭建vue项目测试服务器...
  10. python增强运算符_Python学习【第3篇】:Python之运算符
  11. 【java笔记】常用函数式接口(3):Predicate接口
  12. 关于URL编码(转载)
  13. [模拟][字符串]计算器的改良
  14. Linux 常用快捷键大全
  15. 水电缴费系统php源码_php水电费缴费管理系统
  16. 计算机和未来汽车有联系吗,汽车的未来是会奔跑的计算机?
  17. 计算机相关英语论文,计算机相关英文论文.doc
  18. Unity中Vive Controller手柄模型渲染流程和模型替换
  19. springboot 启动报错 Unexpected filename extension of file
  20. 又学一招——Chrome 插件安装技巧

热门文章

  1. 【Q3D】报错合集2:[error] Solving for capacitance/conductance, process caxtr.exe : Corrupt mesh file.
  2. Oracle层次查询小结
  3. 郭襄,爱上爱情(转摘)
  4. python:实现平均阈值算法(附完整源码)
  5. Mail_Android_Video_SW_DDK_Intergration_Guide_And_Codec_User_Manual中文翻译【chapter3】
  6. java写个恶作剧小程序_用C语言写一个恶作剧关机小程序
  7. 在ubuntu16.04上开机挂载自动U盘遇到的问题记录
  8. uniapp中用renderjs,弄明白关系
  9. 考完大学之后。。。扎心!
  10. 陕西计算机cad证考试报名,我是自学的CAD现在想考试怎么去那报名考试 – 手机爱问...