C# ModbusTcp 概念
1 概念
要开发一个新项目,上位机与下位机通讯使用Modbus TCP协议,在网上找了好多资料了解此协议,此处仅描述TCP/IP协议。
Modbus原先是施耐德电气(Schneider Electric)为PLC(可编程逻辑控制器)通信而研发的一种串行通信协议,现在它已经成为工业领域通信协议的业界标准,并且现在是工业电子、工业控制、电力等设备之间常用的连接方式。
Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为Modbus Master,从设备方使用的协议称为Modbus Slave。Modbus的工作方式是请求/应答,每次通讯都是主设备先发送指令,可以是广播,或是向特定从设备的单播,从设备响应指令,并按要求应答,或者报告异常。当主设备不发送请求时,从设备不会自己发出数据,从设备和从设备之间不能直接通讯。
Modbus TCP/IP协议应用于以太网连接,ModbusTCP的数据帧格式:ADU = MBAP + PDU,即 MBAP(7字节) + 功能码 (1字节)+ 数据域(长度不定,由具体功能决定)。
MBAP为报文头,长度为7字节,组成如下:
事务处理标识 | 协议标识 | 长度 | 单元标识符 |
2byte | 2byte | 2byte | 1byte |
事务处理标识: 报文的序列号,每次通信之后就要加1以区别不同的通信数据报文。
协议标识符 : 00 00表示ModbusTCP协议。
长度 :表示长度后面所有的字节数,即值为ADU字节长度减去6,单位为字节。
单元标识符 : 可以理解为从设备地址。
功能码
功能码 | 作 用 |
---|---|
0x01 | 读线圈 |
0x02 | 读离散量输入 |
0x03 | 读保持寄存器 |
0x04 | 读输入寄存器 |
0x05 | 写单个线圈 |
0x06 | 写单个寄存器 |
0x0F | 写多个线圈 |
0x10 | 写多个寄存器 |
2 例子
数据帧格式:ADU = MBAP + PDU,即 MBAP(7字节) + 功能码 (1字节)+ 数据域
MODBUS请求的生成:
在收到来自用户应用的需求后,客户端必须生成一个MODBUS请求,并发送到TCP管理。
MBAP+ 功能码 +起始地址H+ 起始地址L+ 寄存器数量H+ 寄存器数量L(共12字节)。
- 如:起始地址是0x0000,寄存器数量是 0x0003
00 01 00 00 00 06 01 03 00 00 00 03
见下表:
类型 | 描述 | 字节大小 | 实例 |
---|---|---|---|
MBAP报文头 | 事务处理标识符 | 2 | 0x0001 |
协议标识符 | 2 | 0x0000 | |
长度 | 2 | 0x0006 | |
单元标识符(从设备地址) | 1 | 0x01 | |
MODBUS请求 | 功能码 | 1 | 0x03 |
起始地址 | 2 | 0x0000 | |
寄存器数量 | 2 | 0x0003 |
MODBUS响应的生成
一旦处理请求,MODBUS 服务器必须使用适当的MODBUS服务器事务处理生成一个响应,并且必须将响应发送到TCP管理组件。
根据处理结果,可以生成两类响应:
肯定的MODBUS响应:
响应功能码 = 请求功能码
回:数据长度为0x06,第一个寄存器的数据为0x21,其余为0x00
00 01 00 00 00 09 01 03 06 00 21 00 00 00 00
类型 | 描述 | 字节大小 | 实例 |
---|---|---|---|
MBAP报文头 | 事务处理标识符 | 2 | 0x0001 |
协议标识符 | 2 | 0x0000 | |
长度 | 2 | 0x0009 | |
单元标识符(从设备地址) | 1 | 0x01 | |
MODBUS请求 | 功能码 | 1 | 0x03 |
数据长度 | 2 | 0x06 | |
数据 | 6 | 0x002100000000 |
MODBUS异常响应:
目的是为客户机提供与处理过程检测到的错误相关的信息
响应功能码 = 请求功能码+0x80
提供异常码来表明出错的原因。
异常码 | MODBUS名称 | 备注 |
---|---|---|
01 | 非法的功能码 | 服务器不了解功能码 |
02 | 非法的数据地址 | 与请求有关 |
03 | 非法的数据值 | 与请求有关 |
04 | 服务器故障 | 在执行过程中,服务器故障 |
05 | 确认 | 服务器接受服务调用,但是需要相对长的时间完成服务。因此,服务器仅返回一个服务调用接收的确认 |
06 | 服务器繁忙 | 服务器不能接受MODBUS请求PDU。客户应用由责任决定是否和何时重发请求。 |
0A | 网关故障 | 网关路经是无效的 |
0B | 网关故障 |
目标设备没有响应 |
参考建议:
https://blog.csdn.net/sgmcumt/article/details/87435191
https://blog.csdn.net/YiWangJiuShiXingFu/article/details/105557082
https://blog.csdn.net/qq_36339249/article/details/90664839
C# ModbusTcp 概念相关推荐
- 关于跨网闸数据同步的方式调研Java实现ModbusTCP通信
1 网闸的概念 网闸_百度百科 (baidu.com) 2 跨网闸数据同步的方式了解 目前了解到有三种方式: 1 配置开放ip.端口,外网直接访问http://www.voidcn.com/artic ...
- 深入浅出ModbusTcp
一:概念可参考 https://blog.csdn.net/sgmcumt/article/details/87435191 二:仿真工具下载 https://modbustools.com/down ...
- PLC程序实例二:ModBusTCP客户端编程实例与测试方法
一.需求描述 1.设备作为服务端时,需要给出对应的测试方法,即要求 PLC 作为客户端,设备作为服务端,因此要求编写 PLC 的ModBusTCP客户端 2.先了解一下设备作为服务端的ModBusTC ...
- RPC 笔记(03)— gRPC 概念、安装、编译、客户端和服务端示例
1. gRPC 概念 gRPC 是 Google 开源的一款高性能的 RPC 框架.GitHub 上介绍如下: gRPC is a modern, open source, high-performa ...
- RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别
1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...
- 数据结构(01)— 算法复杂度概念及常见的复杂度计算
1. 大 O 表示法 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度.大 O 表示法指出了最糟情况下的运行时间.大 O 表示法在讨论运行时间时, ...
- OpenCV 笔记(01)— OpenCV 概念、整体架构、各模块主要功能
1. OpenCV 概念 图像处理( Image Processing )是用计算机对图像进行分析, 以达到所需结果的技术, 又称影像处理. 图像处理技术一般包括图像压缩, 增强和复原, 匹配.描述和 ...
- 用男女朋友关系解释计算机常用概念
运维方面 很多同学对热备,冷备,云备了解不深,我科普一下 IT 行业各种备份术语.以后别闹笑话了. 假设你是一位女性,你有一位男朋友,于此同时你和另外一位男生暧昧不清,比朋友好,又不是恋人.你随时可以 ...
- python中的新式类与旧式类的一些基于descriptor的概念(上)
python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...
最新文章
- 如何利用FineReport制作动态树报表
- mybatis 调用 oracle 存储过程 select into 无记录时NO_DATA_FOUND异常处理分析
- IIS7.5 HTTP 错误 500.19 - Internal Server Error 问题的解决方案
- python能编写手机软件-怎么用Python编写一个手机聊天软件或程序
- 第七篇T语言实例开发,文本与程序的几种打开方法(版5.3)
- 第九章 字符串,字符和字节
- 单人制作游戏手册之四:独立游戏怎么预估收益
- 被流氓360设置浏览器主页的解决办法(如果你也遇到了跟我一样的问题,不妨看一下是不是这个原因)...
- java bean工厂_从零构建轻量级Java Web框架
- (转) 基于MapReduce的ItemBase推荐算法的共现矩阵实现(一)
- 我和小美的撸码日记(1)之软件也需靠脸吃饭,带您做张明星脸(附后台经典框架 DEMO 下载)...
- windows下使用Nginx服务器实现负载均衡方法
- 【转自Mgen】 .NET(C#):谈谈各种结束进程的方法
- 考不上本科是智商问题,这话有错吗?
- 用pod安装swiftyJson的一个实例
- ogg格式怎么转换为mp3?
- 安卓加载asset中的json文件_Android Studio读取本地json(读取assets中的文件)
- python刘卫国实验题_刘卫国c 程序设计实践教程答案
- listbox java_listbox读取数据库
- 阿里云LOGO在线设计入口说明