RTU&&TCP单个写入

Java modbus读寄存器 ssm_数据帧


RTU&&TCP多个写入

Java modbus读寄存器 ssm_从站_02


RTU&&TCP数据读取

Java modbus读寄存器 ssm_数据_03


Modbus功能码:

功能码     名称               作用
 
1    读取线圈状态      取得一组逻辑线圈的当前状态(ON/OFF)
 
2    读取输入状态      取得一组开关输入的当前状态(ON/OFF)
 
3    读取保持寄存器    在一个或多个保持寄存器中取得当前的二进制值
 
4    读取输入寄存器    在一个或多个输入寄存器中取得当前的二进制值
 
5    强置单线圈        强置一个逻辑线圈的通断状态
 
6    预置单寄存器      把具体二进值装入一个保持寄存器
 
7    读取异常状态      取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定
 
8   回送诊断校验       把诊断校验报文送从机,以对通信处理进行评鉴
 
9   编程(只用于484)   使主机模拟编程器作用,修改PC从机逻辑
 
10  控询(只用于484)   可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送
 
11  读取事件计数        可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时
 
12  读取通信事件记录     可是主机检索每台从机的ModBus事务处理通信事件记录。如果某项事务处理完成,记录会给出有关错误
 
13  编程(184/384 484 584) 可使主机模拟编程器功能修改PC从机逻辑
 
14  探询(184/384 484 584)可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送
 
15  强置多线圈  强置一串连续逻辑线圈的通断
 
16  预置多寄存器  把具体的二进制值装入一串连续的保持寄存器
 
17  报告从机标识 可使主机判断编址从机的类型及该从机运行指示灯的状态
 
18 (884和MICRO 84) 可使主机模拟编程功能,修改PC状态逻辑
 
19  重置通信链路   发生非可修改错误后,是从机复位于已知状态,可重置顺序字节
 
20  读取通用参数(584L)  显示扩展存储器文件中的数据信息
 
21  写入通用参数(584L) 把通用参数写入扩展存储文件,或修改之
 
22~64  保留作扩展功能备用
 
65~72 保留以备用户功能所用
 
73~119 非法功能
 
120~127 保留 留作内部作用
 
128~255 保留  用于异常应答

MODBUS通讯之数据帧格式解读

一.背景

之前在一个工控项目上用代码分别实现了Modbus主站和Modbus从站(注:其实官方提供有现成的MODBUS从站库代码,并且支持大多数的嵌入式平台,如果项目比较急,把官方的库代码移植,剪裁一下就可以用了,但是我发现当你对MODBUS了解的比较熟悉之后,针对你自己特定的项目/产品完全可以自己实现更加精简,高效的代码),目前产品已经量产发布使用。现回过头来整理一下有关Modbus通讯的一些知识,打算把它写成一个系列博客,目前这是第一篇。Modbus协议包括Modbus-RTU、Modbus-ASCII、Modbus-TCP。其中MODBUS-RTU最常用,本文主要主要介绍的也是MODBUS-RTU。

Java modbus读寄存器 ssm_从站_04

二.MODBUS数据帧组成

首先我们要知道一帧正常的MODBUS数据帧包含的内容有:地址域 + 功能码 + 数据 + 差错校验

Java modbus读寄存器 ssm_Java modbus读寄存器 ssm_05


三.下面逐一解释MODBUS数据帧各部分的具体含义:

(1)地址域:即主站要访问的从站地址,其范围0~247

(2)功能码:即主站想要对从站进行何种操作。
从大的方面看分为读(主站读取从站数据),写(主站向从站读取数据)
再往细分就是具体读取从站哪块区域的数据,以及具体将数据写到从站的哪块区域。操作从站不同的数据区对应有不同的功能码,在文末《MODBUS协议规范》文档中有详细介绍

(3)数据:如果主站的请求是读数据,那么该“数据”要包含的信息有: 从哪里开始读数据 + 读多少数据。 如果主站的请求是向从站写数据,那么该“数据”要包含的信息有:从哪里开始写数据 + 写多少个字节数据 + 要写的具体数据

(4)差错校验:为了保证数据传输的正确性,Modbus协议会在数据帧最后面加上两个字节的差错校验

四.举实例详细说明主站和从站之间的数据帧交互过程
(1) 主站 请求读 从站数据:

Java modbus读寄存器 ssm_从站_06


主站向从站发送的实际请求数据帧:03 04 00 08 00 01 B0 3B (假设从站地址为03)

其中:

03:为主站要访问的域名(即从站地址,范围0~247)。

04:表示功能码。

00 08:从从站08这个地址开始读取数据。

00 01:即将读取数据的长度。

b0 3b:两个字节的校验数据。

从站接收到主站的请求数据帧之后实际的响应数据帧为:03 04 02 00 0A 40 F7
其中:
03:为从站地址即域名(即从站地址,范围0~247)。
04:表示功能码。
02:被读取数据长度(包含一个字节高8位数据,一个字节低8八位数据)
00 0A:被读取的具体数据
40 F7两个字节的校验数据

(2) 主站 请求写 从站数据:

Java modbus读寄存器 ssm_物联网_07


主站向从站发送的实际请求数据帧:03 10 00 01 00 02 04 00 0A 01 02 99 88 (假设从站地址为03)

其中

03:为主站要访问的域名(即从站地址,范围0~247)。

10:功能码。

00 01:往从站01这个地址开始写数据。

00 02:寄存器数量。

04:一共写4个字节数据。

04 00 01 02:具体数据。

99 88:两个字节的校验数据。

从站接收到主站的请求数据帧之后实际的响应数据帧为:03 10 00 01 00 02 11 EA
其中
03:为从站地址即域名(即从站地址,范围0~247)。
10:功能码。
00 01:往从站01这个地址开始写数据。(原样返回/响应)
00 02:寄存器数量。(原样返回/响应)
11 EA两个字节的校验数据

以上我们介绍了Modbus数据帧 主站发送 ,从站响应 这么一个“你来我往”的实际数据帧交互过程。