工作:MODBUS通讯协议知识

news2024/11/28 1:46:49

工作:MODBUS通讯协议知识

一、Modbus三种通讯分类

  1. Modbus TCP/IP
    使用网口通讯,更多是用于快速网络设备,如机器人,上位机视觉。
    在这里插入图片描述

  2. Modbus RTU
    使用RS232或者RS485/RS422接口,通讯方式是串口通讯,是直接传输二进制数值的通讯,工业领域用得最多。
    在这里插入图片描述

  3. Modbus ASCII
    使用RS232或者RS485/RS422接口,通讯方式是串口通讯,Modbus ASCII比前两者少用,支持Modbus ASCII协议的设备一定也会支持Modbus RTU协议。
    在这里插入图片描述
    在这里插入图片描述

三种类型区别:
硬件接口以及传输数据方式不一样

如果设备之间需要Modbus协议通讯的时候,这两个设备必须都支持Modbus协议。由于是基于串口通讯,串口通讯的格式双方也要一致。 如96 8 1 偶(UART通讯格式)。
在这里插入图片描述

二、Modbus协议格式

1. Modbus报文解析

在这里插入图片描述

2. 报文里的设备地址(从站地址)

在这里插入图片描述

3. 报文中的校验码

在这里插入图片描述

在这里插入图片描述

发送时,串口通讯软件将带对数据校验后带校验码报文发出去(勾上数据校验即可),对方收到后,对发过来的带校验码的报文进行校验后,其校验码一定是00 00

注意,串口通讯里的奇偶校验位是不在Modbus报文的,奇偶校验位是在串口通讯UART发送一个字节后对该字节进行奇偶校验,只对此字节负责,不对Modbus报文内容负责。

3.常用功能码

Modbus中常用的功能码有 8个,可以分为位操作和字操作两类,如下表
在这里插入图片描述

3.1 读线圈功能码H01/H02

在这里插入图片描述
这里读取的线圈数量不可以超过2000Bits(250字节X8bits),下面有介绍原因

在这里插入图片描述
如下为FX3U PLC输入与输出线圈,设备规格书一般会提示是哪些只读,哪些是可读可写。
在这里插入图片描述上图中H02功能码是可以读出X0-X377,但不可以使用参数为读写的H01功能码去读取x0-x377,因为X点只支持读取。
例子:
(1)读取PLC的M点(读取什么类型只要参照上面Modbus参数即可,发送时记得勾选数据校验)

01【从站地址】 01【功能码】 00【起始地址(高字节)】 00【起始地址(低字节)】 00【读取数量(高字节)】 10【读取数量(低字节)】

即从M0开始读取,读取10个Bit位

返回值:

01【从站地址】 01【功能码】 02【返回数据字节数】 FF【返回字节1(低字节)】 00【返回字节2(高字节)】 F8【CRC校验码】 0C【CRC校验码】

因为读10Bit位,所以会返回2个字节,00FF即M0-M7全ON,M8-M15全OFF,注意返回的数据里,低字节在前,高字节在后。

(2)读取PLC的X点(读取什么类型只要参照上面Modbus参数即可,发送时记得勾选数据校验)
01【从站地址】 02【功能码】 34【起始地址(高字节)】 00【起始地址(低字节)】 00【读取数量(高字节)】 06【读取数量(低字节)】

即从X0开始读取,读取6个Bit位

返回值:

01【从站地址】 02【功能码】 01【返回数据字节数】 03【返回字节1(低字节)】 _【返回字节2(高字节)】 E1【CRC校验码】 89【CRC校验码】

因为读6Bit位,所以只会返回1个字节,03即X0-X1全ON,X2-X7全OFF,注意返回的数据里,低字节在前,高字节在后。
这里如果用H01(此功能码参数为可读可写的数据)会报错的,返回如01 81 02 C1 91的数据,81就是读取出错,因为X点为只读参数,不可对其使用H01

3.2 读寄存器功能码H03和H04

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

如下为FX3U PLC寄存器,通常设备规格书一般会提示是哪些只读,哪些是可读可写。

在这里插入图片描述
在这里插入图片描述

例子:
(1)读取PLC的数据寄存器D(读取什么类型只要参照上面Modbus参数即可,发送时记得勾选数据校验)

01【从站地址】 03【功能码】 00【起始地址(高字节)】 00【起始地址(低字节)】 00【读取字数量(高字节)】 02【读取字数量(低字节)】

即从D0开始读取,读取2个字节。

返回值:

01【从站地址】 03【功能码】 04【返回数据字节数】 1A【返回字节1(寄存器1高字节)】 1B【返回字节2(寄存器1低字节)】 1C【返回字节3(寄存器2高字节)】 1D【返回字节4(寄存器2低字节)】 F8【CRC校验码】 0C【CRC校验码】

因为读2个字,所以会返回4个字节,值分别为1A 1B 1C 1D,注意返回的数据里,高字节在前,低字节在后。

3.3 写单线圈和多线圈功能码H05和H0F

在这里插入图片描述

在这里插入图片描述上面打错字,”十字进“是十进制

如下为FX3U PLC线圈,通常设备规格书一般会提示是哪些只读,哪些是可读可写。
在这里插入图片描述
例子:
(1)置位/复位单个PLC的中间继电器M(读取什么类型只要参照上面Modbus参数,发送时记得勾选数据校验)

01【从站地址】 05【功能码】 00【起始地址(高字节)】 00【起始地址(低字节)】 FF【置位FF/复位00】 00【固定值】

即置位M0。

返回值:

01【从站地址】 05【功能码】 00【起始地址(高字节)】 00【起始地址(低字节)】 FF【置位FF/复位00】 00【固定值】 8C【CRC校验码】 3A【CRC校验码】

(2)置位/复位多个PLC的中间继电器M(读取什么类型只要参照上面Modbus参数,发送时记得勾选数据校验)

01【从站地址】 0F【功能码】 00【起始地址(高字节)】 00【起始地址(低字节)】 00【写线圈数量(高字节)】 09【写线圈数量(低字节)】 02【字节数】 FF【线圈形成的十六进制值(低字节)】 01【线圈形成的十六进制值(高字节)】

即以十六进制值FF置位或复位低字节那8个线圈,以十六进制值01置位或复位高字节那1个线圈(M0-M7全ON,M8=on),
注意是先低字节再到高字节。

返回值:

01【从站地址】 0F【功能码】 00【起始地址(高字节)】 00【起始地址(低字节)】 00【写线圈数量(高字节)】 09【写线圈数量(低字节)】 95【CRC校验码】 CD【CRC校验码】

3.4 写单寄存器和多寄存器功能码H06和H10

在这里插入图片描述

在这里插入图片描述
注意H10的H是十六进制
如下为FX3U PLC寄存器,通常设备规格书一般会提示是哪些只读,哪些是可读可写。
在这里插入图片描述
例子:
(1)读单个寄存器(读取什么类型只要参照上面Modbus参数,发送时记得勾选数据校验)

01【从站地址】 06【功能码】 00【寄存器地址(高字节)】 02【寄存器地址(低字节)】 FF【写入值(高字节)】 FF【写入值(低字节)】

返回值:
01【从站地址】 06【功能码】 00【寄存器地址(高字节)】 02【寄存器地址(低字节)】 FF【写入值(高字节)】 FF【写入值(低字节)】 29【CRC校验码】 BA【CRC校验码】

(2)读多个寄存器(读取什么类型只要参照上面Modbus参数,发送时记得勾选数据校验)
01【从站地址】 10【功能码】 00【寄存器地址(高字节)】 00【寄存器地址(低字节)】 00【写寄存器数量(高字节)】 03【写寄存器数量(低字节)】 03【写入总字节数】 0A【写入字节1(寄存器1高字节)】 0B【写入字节2(寄存器1低字节)】 1A【写入字节3(寄存器2高字节)】 1B【写入字节4(寄存器2低字节)】 2A【写入字节5(寄存器3高字节)】 2B【写入字节6(寄存器3低字节)】

返回值:

01【从站地址】 10【功能码】 00【寄存器地址(高字节)】 00【寄存器地址(低字节)】 00【写寄存器数量(高字节)】 03【写寄存器数量(低字节)】 80【CRC校验码高字节】 08【CRC校验码低字节】

3.5 Modbus消息结构-摘自作者Pou光明

Pou光明写得也很好,简略易懂。

以功能码01(0x01)与03(0X03)为例进行说明。

(1)功能码01H读取Modbus从站中线圈寄存器的状态,可以是单个寄存器,或者是多个连续的寄存器。(看懂前面3.1可以跳过)

发送:
假设从站地址为01H,读取线圈寄存器的起始地址为0017H,读取38(十进制)个寄存器,指令结构如下表:
在这里插入图片描述
这里发送了01 01 00 17 00 26 OD D4 这8个字节。设备B接收到了这8个字节,那么设备B就根据Modbus协议约定功能执行相应的动作,这8个字节称为报文,也叫一个信息帧,当然因为命令差异,报文可以不止8个字节。

响应:

各线圈的状态与数据内容的每个bit对应,1代表ON,0代表OFF.若查询线圈的数量不是8的倍数,则在最后一个字节的高位补0.
读线圈结果:
在这里插入图片描述
第一个字节CDH对应线圈0017H到001E的状态,转为二进制是11001101,其中bit0对应0017H,bit7对应001E
在这里插入图片描述

(2) 功能码03H读取Modbus从站中读取保存寄存器的状态,可以是单个寄存器,或者是多个连续的寄存器。(看懂前面3.2可以跳过)

在这里插入图片描述

三、 Modbus协议的绝对地址

1 对应区的值范围与功能。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、学习Modbus通讯,举例设置PLC主从站

本节为摘选第二集: MODBUS RTU模式下通信设置和线路连接(三菱PLC)的部分内容。

以FX3U的 Modbus RTU进行设置,实际项目要根据实际项目硬件规格书进行设置。

1. 硬件

Modbus RTU使用串口通讯,可以使用RS485接线
在这里插入图片描述
在这里插入图片描述

  • 实际接线举例…

以FX3U-32MT+485BD板+485ADP-MB为例
在这里插入图片描述
FX3U只能扩展出2个通道。这里特别说明下,如果没有485BD板,那么此时的485ADP-MB就
变成了通道1。
在这里插入图片描述

2. 软件

由于要验证功能码报文,所以拿串口调试助手当主站,plc当从站。而且由于485BD板不能当从站,因此要通过485ADP-MB来进行测试。
TIPS:PLC是一个最好的从站设备,它有MODBUS所有的存储区特性.
在这里插入图片描述
(a) 由于要拿通道2的485ADP-MB来进行测试,所以要用到以下特殊寄存器
D8420: 通信格式:我们按照如下通信格式进行设置: 数据位=8,奇偶校验=偶校验,停止位=1,波特率=9600,RS485连接。那么按照通信格式设置表格它的二进制为0001 0000 10000111,转换为16进制值是H1087,所以 “MOV H1087 D8420”
在这里插入图片描述
在这里插入图片描述

( b ) D8421: 协议: 我们按照如下协议设置: MODBUS协议,MODBUS从站,RTU模式。那么它的16进制值为H11,要"MOV H11 D8421"
在这里插入图片描述

( c ) D8434:从站本站号: 设置为1。那么它的16进制值为H1,要“MOV H1 D8434"
将上面三个的特殊寄存器设置完后,我们要用M8411特殊辅助寄存器来触发将它们写入到PLC中。它是在用到MODBUS通信时,用来写入通信设定的。如果是RS/RS2指令,就可以用M8002来写入,没有特殊要求。
在这里插入图片描述

到此,FX3U的485ADP-MB从站就设置完毕了.

五、FX3U Modbus指令ADPRW

可以使用SSCOM作从站,PLC作主站,然后PLC往SSCOM发内容进行通讯,成功通讯后可以显示出来PLC发出的报文,方便进行练习。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • SSCOM接到的信息

但是由于SSCOM不是真正设备,无法返回M0/M1数据,所以PLC M100/M101会还是OFF

六、Modbus调试助手

本节内容摘自-Pou光明

TCP协议下有Server和Client,两个都需要设置,不然只有一个也无法通信~
实验材料:Windows系统的电脑、Modbus Poll(Client)、ModSim32(Server)

1. ModSim32(Server)的相关设置

(1) ModSim32 初始界面
在这里插入图片描述
(2)修改Address和Length,MODBUS Point Type使用默认类型,Devide Id使用默认值是1,方便使用
在这里插入图片描述
(3)点击上方菜单栏【Connection】–>【Connect】–>【Modbus/TCP Svr】。确定服务器端口,点击【OK】按钮。成功启动后不再有“NOT CONNECTED!”显示
在这里插入图片描述
本次我们使用的是第三种保持寄存器类型。
本教程主要侧重Server与Client的通信搭建,其他更多的功能熟练之后容易探索。

2. Modbus Pol(Client)的相关设置

(1)Modbus Poll初始化界面
Tx代表接收数据,Err表示错误,F代表功能码类型,SR是扫描(发送)周期
在这里插入图片描述
在这里插入图片描述

(2)读写定义的设置

点击上方菜单栏的【Setup】->【Read/Write Definition…】或者F8快捷键直接打开

Slave ID保持一致为1,Function使用默认参数,注意这里地址设置为0,与Server端地址相差1,Quantity是设置的寄存器数量,下次给大家分享pymodbus库时会有很好的对应说明,这里面了解下即可。Scan Rate使用默认的即可。下方的View Rows 是对可以看见的区域设置,随便点点,没什么大问题的。之后点击【Apply】->【OK】按钮使设置成功。
在这里插入图片描述

  • (a)TCP IP的通讯设置

在这里插入图片描述
在这里插入图片描述

  • (b)串口通讯的设置(Modbus RTU/Mobus ASCII才用)

(3)连接服务器的设置

点击上方菜单栏的【Connection】->【Connect…】或F3快捷键直接打开

Connection 默认选择的是Modbus TCP/IP,下方是远程Modbus Server的设置,像网络调试助手一样连接服务器一样,需要设置服务器的Ip和Port.其余参数使用默认传参数即可。之后点击【OK】按钮即可。
在这里插入图片描述

  • (a)Modbus TCP 连接服器

(4)连接成功与更改数值

连接成功如下:
在这里插入图片描述
更改数据操作:

鼠标左键双击蓝色单元格,会出现弹窗图中的弹窗,修改Value部分单元格数值为【666】,之后点击【Send】按钮完成修改。
在这里插入图片描述
修改成功后效果:
在这里插入图片描述
(5)Modbus客户端这边设置相对多一些,熟悉后就像使用网络调试助手一样。从设置上来看,Client与Server双方在访问的地址上必须一致,否则Client连接时会报出【无效地址】的错误。如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/866863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Dynamics 365 字段类型介绍

实体的本质是数据库表,所以每种字段类型都有自己对应的数据库类型。不同的类型也有自己不同的展示界面。 1 字段类型总览 Dynamics365中支持的类型如图,其在C#中对应的类型在括号中 文本类型:单行文本(string)、多行文本(string) 数字类型:整数(int)、浮点数(double)、十…

fork--创建进程

fork–创建进程 fork函数基本知识 pid_t fork(void) 返回值:在父进程中,成功的话返回子进程的pid,失败返回-1在子进程中,返回值pid为0fork()函数将运行着的进程分裂出另一个子进程,它通过拷贝父进程的方式创建子进程…

FFmpeg常见命令行(五):FFmpeg滤镜使用

前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》,结合我自己的工作学习经历,我准备写一个音视频系列blog。本文是音视频系…

PHP最简单自定义自己的框架model使用(七)

1、实现model使用效果 2、自动加载model,KJ.php //自动加载文件public static function _autoload($className){switch ($className){//自动model类case substr($className,-5)Model:$path MODEL./.$className..php;if(is_file($path)) include $path;break;//自动加载控制器…

性能测试工具——LoadRunner(1)

一、LoadRunner三大组件 1.1每个组件是干什么的 VUG:录制脚本(编写脚本) Controller:设计场景,运行场景 Analysis:产生性能测试报告 1.2三大组件之间的关系 二、LoadRunner脚本录制 2.1了解WebTours系统 启动WebTours&#xf…

《Linux从练气到飞升》No.12 Linux进程概念

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…

Oracle 知识篇+分区表上的索引由global改为local注意事项

★ 知识点 二、知识点 Local型索引有如下优点 1.Only one index partition must be rebuilt when a maintenance operation other than SPLIT PARTITION or ADD PARTITION is performed on an underlying table partition. 2.The duration of a partition maintenance opera…

ubuntu虚拟机磁盘压缩:vmware-toolbox-cmd命令实现

压缩之前,虚拟机占用磁盘空间 虚拟机必须已经安装vmware-tool,运行如下命令,参看磁盘的挂载点 sudo /usr/bin/vmware-toolbox-cmd disk list $sudo /usr/bin/vmware-toolbox-cmd disk list [sudo] password for lkmao: Shrink disk is disab…

RabbitMQ 消息队列(Spring boot AMQP)

文章目录 🍰有几个原因可以解释为什么要选择 RabbitMQ:🥩mq之间的对比🌽RabbitMQ vs Apache Kafka🌽RabbitMQ vs ActiveMQ🌽RabbitMQ vs RocketMQ🌽RabbitMQ vs Redis 🥩linux docke…

v-md-editor自定义锚点(生成目录)数组转树结构

接前两篇博文,最终方案终于定了,也把之前做的编辑器模式给否决了,原因是系统中有老的文档需要平替,因此就不能通过编辑器这种模式了,太麻烦了。 最终方案:线下手动pandoc word转markdown,然后将…

Nginx安装和配置文件详解

目录 1.安装Nginx1.yum安装2.编译安装3.Nginx命令 2.配置文件详解 1.安装Nginx 1.yum安装 [rootdocker ~]# yum -y install nginx通过 rpm -ql nginx 查看安装信息 2.编译安装 2.1安装所需要的依赖 yum install -y gcc gcc-c make libtool wget pcre pcre-devel zlib zlib-…

【雕爷学编程】Arduino动手做(13)---TTP223B电容式触摸模块之通过串口监视器检测电容触摸键的状态与控制继电器

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…

学习three.js —— 第一天

1.创建三要素 场景 // 创建场景 const scene new THREE.Scene() 相机 // 创建透视相机 const camera new THREE.PerspectiveCamera(a,b,c,d) // 参数含义 // a:相机可视垂直角度;b:相机可视长宽比;c:近端距离;d:远端…

YOLOv5改进系列(19)——替换主干网络之Swin TransformerV1(参数量更小的ViT模型)

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

小结:基于 JavaWeb 的宠物店管理系统

宠物店管理系统 系统介绍系统展示登录界面用户注册页面 店主主界面宠物信息管理页面修改宠物信息 宠物出入库管理页面宠物订单查询页面宠物账单查看页面用户信息管理页面修改用户信息 用户主界面宠物订购页面用户订购支付页面 个人资料编辑页面个人订单查看页面 系统说明开发环…

尚硅谷大数据项目《在线教育之采集系统》笔记005

视频地址:尚硅谷大数据项目《在线教育之采集系统》_哔哩哔哩_bilibili 目录 P057 P058 P059 P060 P061 P062 P063 P064 P065 P066 P067 P068 P069 P070 P071 P072 P073 P057 #!/bin/bashMAXWELL_HOME/opt/module/maxwell/maxwell-1.29.2status_ma…

虚拟机的创建与使用

一、虚拟机的下载 链接:百度网盘下载链接 提取码:a9p4 二、新建虚拟机系统 需要有版本序列号 注意: 选择 第一个是纯dos 的窗口指令 桌面没有任何东西 选择第二个就是正常的操作系统.有文件夹 我的电脑之类的 三、从主机中复制文件到虚拟机中需要安装 …

【自用】JAVA复习(初级到循环 0-156集):break、while、for、continue、return

总览 1.break 2.while 3.for 4.continue 5.return 一、break 1.作用 跳出当前的循环。 2.break 在多重循环中的使用&#xff1a;配合标签使用 二、while 三、for 1.for( ; ; )、for( ; i<10 ; ) 四、continue 1.作用 用于结束本次循环&#xff0c;开始下一次循环 …

C语言笔试训练【第九天】

文章目录 &#x1f47f;1、下列程序的输出是&#xff08; &#xff09;&#x1f48e;2、二维数组X按行顺序存储&#xff0c;其中每个元素占1个存储单元。若 X[4][4] 的存储地址为 Oxf8b82140 , X[9][9] 的存储地址为 Oxf8b8221c ,则 X[7][7] 的存储地址为&#xff08; &#xf…

软件外包开发的VUE开发框架

Vue.js&#xff08;通常简称为Vue&#xff09;是一个流行的渐进式JavaScript框架&#xff0c;用于构建用户界面。它的核心库专注于视图层&#xff0c;但也可以结合其他库和工具来构建完整的单页面应用&#xff08;SPA&#xff09;。以下分享Vue.js的开发框架和特点&#xff0c;…