MODBUS-TCP协议简介与编程流程图

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

  本文主要目的是为了写一个简单的MODBUS-TCP服务器-客户端程序而记录的知识点,里面包含了编程所需要的必要背景知识和协议解析流程图。

MODBUS基本数据类型

  MODBUS有四种基本数据类型:
  离散量输入:客户端只能读取它,由服务器提供,占1个比特位,可以传输现实中的开关量输入,比如接近开关的通断信息等。
  线圈:客户端可以可写入和读取,服务器根据客户端的设定改变其值,占1个比特位,可以控制现实中的继电器的吸合与断开。
  输入寄存器:客户端只能读取它,最小单位是16比特字,它也可以传输8位数据。传输超过16比特数据的时候需要多个输入寄存器,现实中的温度,电压等数据可通过输入寄存器来传输。
  保持寄存器:客户端可以写入或者读取,最小单位是16比特字,可以设置一些参数,以及现实中的电压等物理量。

MODBUS-TCP数据格式

一个正常的MODBUS-TCP数据帧包括以下三部分:
MODBUS-TCP协议简介与编程流程图
  这三部分合称为ADU,也就是应用数据单元,其中功能码和数据合称为PDU,也就是协议数据单元。ADU中的MBAP(MODBUS Application Protocol)是MODBUS-TCP特有的内容。PDU在所有MODBUS中格式完全相同。
  MODBUS-TCP数据帧使用端口502发送,端口502是互联网组织专门为MODBUS-TCP协议保留的端口号。

MBAP报文头格式:

  MBAP报文头(MODBUS协议报文头)共7个字节,其含义如下:
  事务元标识符:2字节,由于客户端可以同时发送多条请求,为了区分服务器响应的是哪条请求,客户端在请求帧中使用计数器值填充此区域,服务器可以在响应帧中返回相同的计数值供客户端来区分请求。
  协议标识符:2字节,保持为0,表示是MODBUS协议
长度:2字节,后续字节数
  单元标识符:1字节,对于需要转发给串行链路的MODBUS设备才有意义,一般无需考虑,写0即可。

PDU格式

  由于不同功能码对应着不同的数据格式,因此需要将功能码和数据部分一起阐释,我这里只介绍我的程序将要涉及到的功能码3和16。之所以只选择了这两个功能码,是由于这两个功能码基本上就可以涵盖数据采集相关的所有功能,写多个寄存器可以设置采集参数、DA输出、设置开关量输出……读多个寄存器可以读取各种采集结果。

03 (0x03)读保持寄存器

  每个寄存器的宽度是16位,2个字节,由于是大端模式(Big-endian),因此高字节在前,低字节在后,其具体数据格式如下:
请求:

功能码 1个字节 3(0x03)
起始地址 2个字节 0~65535(0xFFFFF)
寄存器数量 2个字节 N=1~125(0x7D)

响应:

功能码 1个字节 3(0x03)
字节数 1个字节 N*2
寄存器值 N*2个字节

举例:
下列是请求读地址偏移0一个寄存器的值,寄存器值是0
字节序号(10进制):00 01 02 03 04 05 06 07 08 09 10 11
发送字符(16进制):00 00 00 00 00 06 00 03 00 00 00 01
接受字符(16进制):00 00 00 00 00 05 00 03 02 00 00

寄存器数量是受限于MODBUS-RTU的协议数据帧(PDU)长度不能超过252,PDU中的功能码和字节数占用两个字节,因此(252-2)/2=125

读保持寄存器流程图
MODBUS-TCP协议简介与编程流程图

16 (0x10)写保持寄存器

  写保持寄存器是读多个寄存器的反向操作,它可以与读多个寄存器是同一个功能项的读写操作,也可以是不同功能项的单独操作。例如在DA(数模转换)中,使用写多个寄存器设置DA输出值,然后可以用读多个寄存器返回之前设定的值。也可以相同的地址,返回AD(模数转换)的采集值,这取决于实际应用。其具体格式如下:
请求:

功能码 1个字节 16(0x10)
起始地址 2个字节 0~65535(0xFFFFF)
寄存器数量 2个字节 N=1~123(0x7B)
字节数 1个字节 2*N
寄存器值 N*2个字节 大端排列的值

PDU最大字节数为252,减去功能码,起始地址,寄存器数量,字节数所占用的6个字节为246,因此寄存器数量最大为123。

响应:

功能码 1个字节 16(0x10)
起始地址 2个字节 与请求起始地址相同
寄存器数量 2个字节 N

举例:
下列是请求写地址偏移0一个寄存器的值,寄存器值是0
字节序号(10进制):00 01 02 03 04 05 06 07 08 09 10 11 12 13 14
发送字符(16进制):00 00 00 00 00 09 00 10 00 00 00 01 02 00 00
接受字符(16进制):00 00 00 00 00 06 00 10 00 00 00 01

写多个寄存器流程图:
MODBUS-TCP协议简介与编程流程图

异常响应

  当请求失败的时候,服务器将会返回异常响应,异常响应帧会在功能码的位置将原有功能码+0x80,后面的数据是异常码,其具体格式如下:
异常响应:

功能码 1个字节 0x80+请求功能码
异常码    1个字节   常用异常码:
01:不支持的功能码
02:地址错误,起始地址+寄存器数量如果超范围,也属于地址错误
03:数据错误,这里的数据还包括了PDU数据本身,比如请求的寄存器数量超过了PDU所允许的最大长度。
04:从站故障,在服务器处理请求过程中遇到了错误。

MODBUS-TCP请求响应流程

  服务器在接收到客户端请求后,首先判断协议标识符,如果是MODBUS协议,才能继续处理,然后根据MBAP报文头中的后续字节数来拆出一个完整的数据帧。如果客户端是使用请求-响应方式来发送请求,则服务器接收到的每包数据都应该是且只有一个完整的数据包。最后根据功能码来将请求交给各个功能码子程序来处理。流程图如下:
MODBUS-TCP协议简介与编程流程图

接下来就要真正写程序了!文章来源地址https://www.toymoban.com/news/detail-400143.html

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

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

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

相关文章

  • Java与Modbus-TCP/IP网络通讯

    通过Java与Modbus-TCP/IP网络通讯实现举例5中的功能

    2024年02月10日
    浏览(36)
  • TwinCAT3 Modbus-TCP Client/Server使用

    目录 一、环境配置和准备 1、PLC中安装TF6250-Modbus-TCP库 2、勾选TF6250的license 3、PLC工程中添加Tc2_ModbusSrv库文件 4、分别创建测试ModbusTCP测试的Server和Client程序 二、PLC作为Client端 1、设置测试电脑IP地址 2、运行MobusTCP测试工具 3、PLC端程序编写 (1)读取离散量输入 (2)读取线圈

    2024年01月16日
    浏览(33)
  • Python 解析HJ212-2017并输出Modbus-TCP

    功能:   利用python开启服务端口,接受来着环保数采仪上传的HJ212-2017报文数据,解析后并输出Modbus-TCP给上位机或PLC读取,可同时连10个主站。 应用场景: 污水厂进出水在线监测环保数采仪的数据协议转换成通用标准协议。 本次实验由于没有数采仪只能通过TCP客户端模拟报

    2024年02月02日
    浏览(37)
  • CCLINK转MODBUS-TCP网关cclink通讯接线图 终端电阻

    大家好,今天我们要聊的是生产管理系统中的CCLINK和MODBUS-TCP协议,它们的不同使得数据互通比较困难,但捷米JM-CCLK-TCP网关的出现改变了这一切。 1捷米JM-CCLK-TCP是一款自主研发的CCLINK从站功能的通讯网关,它的主要功能是将各种MODBUS-TCP设备接入到CCLINK总线中。网关连接到C

    2024年02月13日
    浏览(32)
  • 用Python采用Modbus-Tcp的方式读取PLC模块数据

    使用计算器得到需要的寄存器地址 这里PLC地址是83,对应的程序16进制读取地址是53 实际上由于PLC地址从1开始,所以这里实际地址应该是52,因为计算机从0开始 使用网络调试助手生成报文 使用Python中的内置函数int()。以下是将人员卡号’b’3b44’\\\'转换为十进制的示例代码: 使

    2024年02月16日
    浏览(45)
  • 用Python采用Modbus-Tcp的方式读取485电子水尺数据

    使用Python开发服务器程序,实现以下功能: 采用问询的方式读取各类传感器数据 正确高速解析各类传感器的数据 存储解析后的各类传感器数据 存储程序运行过程中的log 管理log,超过一定量、一定时间自动删除log 打包发布 或者 在后台运行py服务器程序 该传感器支持485通信

    2024年02月16日
    浏览(41)
  • 海康Visionmaster-通讯管理:使用 Modbus TCP 通讯 协议与流程交互

    使用 Modbus TCP 通讯协议与视觉通讯,当地址为 0000 的保持型寄存器(4x 寄存器)变为 1 时,触发视觉流程执行一次,同时视觉将地址为 0000 的寄存器复位(也即写为 0),视觉流程执行完成后,将结果数据:特征匹配状态、特征匹配点 X、特征匹配点Y、特征角度分别写入到地址为

    2024年02月04日
    浏览(238)
  • TCP/IP协议模型的五层处理流程简介

    TCP/IP是一种分层模型,它将通信协议分解为五个层次,每个层次都有特定的功能和任务。以下是TCP/IP五层的处理流程: 应用层(Application Layer):这是TCP/IP模型的最上层,负责处理应用程序的请求和数据。在该层,应用程序(例如浏览器、电子邮件客户端等)与用户进行交互

    2024年02月16日
    浏览(31)
  • GNU Radio简介及流程图搭建

    欢迎来到无线通信的世界,初步接触 GNU Radio,对其学习进行一个记录。 GNU Radio 是一个免费的开源软件开发工具包,提供信号处理模块来实现软件无线电 。它可以与现成的低成本外部射频硬件一起使用,以创建软件定义的无线电,也可以在类似模拟的环境中不使用硬件。它被

    2024年01月22日
    浏览(30)
  • linux【网络编程】TCP协议通信模拟实现、日志函数模拟、守护进程化、TCP协议通信流程、三次握手与四次挥手

    Tcp通信模拟实现与Udp通信模拟实现的区别不大,一个是面向字节流,一个是面向数据报;udp协议下拿到的数据可以直接发送,tcp协议下需要创建链接,用文件描述符完成数据的读写 1.1.1 接口认识 1.1.1.1 listen:监听socket 1.1.1.2 accept:获取连接 通信就用accept返回的文件描述符,

    2024年02月06日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包