[Modbus] 如何看懂 Modbus TCP 通讯协定

最近笔者接了一个工控系统,其中PLC所使用的是Modbus TCP的通讯协定。

由于这个部分因为从来没有接触过,所以花了一点时间研究。

趁著现在记忆犹新,赶紧写下来,方便日后对照,也让读者们能够快速看懂Modbus TCP协定。

Modbus为工业上常用的通讯协定之一,也是目前工业领域通讯协定常用的标准协定。

一般来说,Modbus主要可以再细分为两种协定(Modbus?RTU?、Modbus ASCII 、Modbus TCP)

Modbus?RTU?是一种为使用二进制表示法来进行数据的传递与交换,也是比较多人使用的,因为方便,也不需要转换为ASCII

Modbus ASCII 则是一种对于人类来说,可读性较高的协定。

而以上两种方式在传递数据的结尾皆需要加上 CRC (错误检查机制)。

其中 Modbus 也可以借由以太网路 TCP/IP 的方式来进行传递数据,叫做?Modbus TCP

也是我们今天主要要介绍的协定。

此种通讯格式不需要计算CRC,取而代之的是使用识别码的方式来进行数据验证。

在学习 Modbus协定之前,我们需要先了解每一个Byte各代表的意思为何

以下为 Modbus TCP request 的封包格式:

TCP Header Address Function Code Start register addr data
6bytes 1byte 1byte 2byte N bytes

TCP Header

其中我们会发现?TCP Header 一共占了6Byte

这6个Byte主要是由三个字段所组成,每一个字段都占2Byte

本次通讯的识别码(Transaction ID):会产生2个Byte的随机值,用来识别该次通讯。

通讯方式(Protocal ID):基本上都是0,用来表示采用哪种通讯协定。0表示为 Modbus / TCP

数据长度(Length):用来定义从Address开始 ~ data字段结束,所占的总长度为何。

Address

共占1Byte,用来记录该次通讯要存取?slave端位址

Function Code

共占1Byte,用来定义该次通讯是要做哪种操作。

其中常见的Function Code有以下几种:

01: 读取当前 digital out status

02: 读取当前 digital input status

03: 读取当前 analog out status

04: 读取当前 analog input status

05: 写入单个??digital out value

06: 写入单个??analog out value

15: 写入多个??digital out value

16: 写入多个??analog out value

Start register addr

共占2Byte,用来定义寄存器起始位址

data

长度为非固定,由传送的数据长度而定。

以上为每一个字段的解说,接下来笔者撷取了一张从WireShark所侧录到的 Modbus封包来做解说。

上图为, 由WireShark所侧录到的Modbus封包,用来开启LED指示灯的控制代码。

从ac开始到 01结束是整个Modbus的封包内容。

封包内容如下:ac 70 00 00 00 06 58 06 00 c8 00 01

其中我们刚刚有说到,Modbus的Header 共占 6Byte,也就是:

本次通讯的识别码(Transaction ID):ac 70

通讯方式(Protocal ID):00 00

数据长度(Length):00 06 ?其中?06代表接下来一共有 6Byte的封包内容

上述的三个字段均为Modbus的Header,每一个都占2Byte,共占6Byte。

slave端位址(Address):58?

操作码(Function Code):06 代表写入单一数值

寄存器起始位址(Start register addr):00 c8?

传送数据(Data): 00 01

最后,附上一张Modbus控制的表格来做个结束。

操作码 06: 写入LED开灯资讯

Transaction ID Protocal ID Length Address Function Code Start register addr Data
ac 70 00 00 00 06 58 06 00 c8 00 01

意思为:Master要求写入数据到设备位址58的寄存器位址 00c8,写入的资讯为 00 01。

以上文章叙述如有错误及观念不正确,请不吝啬指教:)

有任何家教、案子 或技术相关问题 请都欢迎联系我

http://www.zhenghui.idv.tw/

原文:大专栏  [Modbus] 如何看懂 Modbus TCP 通讯协定

原文地址:https://www.cnblogs.com/chinatrump/p/11516503.html

时间: 2024-10-07 05:26:07

[Modbus] 如何看懂 Modbus TCP 通讯协定的相关文章

Modbus从机(服务器)通讯设计

摘要:本文在国家标准GB/T 19582-2008的框架下,讨论Modbus协议在串行链路RS485以及TCP/IP上的实现过程和注意事项.涉及到Modbus帧界定.lwip协议栈移植等关键内容,对于难度较大的读写多个线圈命令,本文给出了关键源代码. 1. 简介 从1979年开始,Modbus作为工业串行链路的事实标准,Modbus使成千上万的自动化设备能够通信.目前,对简单而精致的Modbus结构的支持仍在增长.互联网用户能够使用TCP/IP栈上的保留系统端口502访问Modbus. Modb

Modbus: 1. Java使用Modbus读取Slave端数据(TCP)

最近手上接了个Unity3D的项目,这个项目需要和真机联动,和真机联动我们需要通过Modbus协议.所以Modbus这一块的就我来实现,因为项目最好会打包为android的,所以就用java来做,看了下java中还真有不少相关的库,最后决定用Jamod这个库,地址:Jamod 在使用的过程中发现,Jamod再封装某些对象的时候都是单例的,比如说我想在一台电脑上模拟出一个Slave端出来,但是这个库限定了在同一台电脑的同一个程序中只能模拟出一个,如果我想模拟多个就需要弄出多个程序出来,这显然不符合

GCDAsyncSocket类库,IOS下TCP通讯使用心得

关于在IOS下使用Socket进行通讯的技术文章也许诺很久了,今日又是一个还债的日子,网上虽然很多介绍过AsyncSocket或GCDAsyncSocket的文章,但其实就那么一两篇大部分都是转载,于是我义正言辞.慷慨激昂的批判他们这种不负责任的态度,学习,不是给自己学的,是要和大家分享的.技术的共享有利于整体行业的进步,也可以使自身更深入全面的了解. 之前的文章中我们讲到过TCP通讯协议,并且也对其进行了较为详细的介绍和描述,关于TCP通讯的原理此处我们不再赘述,如有需要的看官可自行翻阅本人所

推荐一款开源的C#TCP通讯框架

原来收费的TCP通讯框架开源了,这是一款国外的开源TCP通信框架,使用了一段时间,感觉不错,介绍给大家 框架名称是networkcomms 作者开发了5年多,目前已经停止开发,对于中小型的应用场景,够用了. 框架的地址是: https://github.com/MarcFletcher/NetworkComms.Net 界面如下: 点那个Download就可以下载源码了 下载之后,解压缩之后的文件列表如下: 可以用VS打开NetworkCommsDotNet工程文件了 用 vs2010打开,可能

C#TCP通讯框架

开源的C#TCP通讯框架 原来收费的TCP通讯框架开源了,这是一款国外的开源TCP通信框架,使用了一段时间,感觉不错,介绍给大家 框架名称是networkcomms 作者开发了5年多,目前已经停止开发,对于中小型的应用场景,够用了. 框架的地址是: https://github.com/MarcFletcher/NetworkComms.Net 界面如下: 点那个Download就可以下载源码了 下载之后,解压缩之后的文件列表如下: 可以用VS打开NetworkCommsDotNet工程文件了

看懂redis

[教你看懂redis配置 – 简介] 我们可以在启动redis-server时指定应该加载的配置文件,方法如下: 复制代码 代码如下: $ ./redis-server /path/to/redis.conf 接下来,我们就来讲解下redis配置文件的各个配置项的含义,注意,本文是基于redis-2.8.4版本进行讲解的. redis官方提供的redis.conf文件,足有700+行,其中100多行为有效配置行,另外的600多行为注释说明. 在配置文件的开头部分,首先明确了一些度量单位: # 1

boost asio 异步实现tcp通讯

---恢复内容开始--- asioboost 目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化 一.前言 boost asio可算是一个简单易用,功能又强大可跨平台的C++通讯库,效率也表现的不错,linux环境是epoll实现的,而windows环境是iocp实现的.而tcp通讯是项目当中经常用到通讯方式之一,实现的方法有各式各样,因此总结一套适用于自己项目的方法是很有必要,很可能下一个项目直接套上去就可以用了. 二.实现思路 1.通讯包数

C# Socket的TCP通讯

Socket的TCP通讯 一. socket的通讯原理 服务器端的步骤如下. (1)建立服务器端的Socket,开始侦听整个网络中的连接请求. (2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接. (3)当完成通信后,服务器关闭与客户端的Socket连接. 客户端的步骤如下. (1)建立客户端的Socket,确定要连接的服务器的主机名和端口. (2)发送连接请求到服务器,并等待服务器的回馈信息. (3)连接成功后,与服务器进行数据的交互. (4)数据处

一张图看懂ANSYS17.0 流体 新功能与改进

一张图看懂ANSYS17.0 流体 新功能与改进 提交 我的留言 加载中 已留言 一张图看懂ANSYS17.0 流体 新功能与改进 原创2016-02-03ANSYS模拟在线模拟在线 模拟在线 微信号sim_ol 功能介绍这是数值模拟.仿真分析领域最大的公众号,没有之一!!! 点上方“模拟在线”查看更多“牛B”资讯! 感谢ANSYS公司对平台的友情支持,本次17.0的改进报告均为ANSYS提供(授权直接摘抄,确实给小编省事不少啊).本次首先带来是流体方面的改进和优化.后续陆续推送结构.电磁等各方