MODBUS协议

一、概念

        modbus是一个公开免费的协议,广泛应用于工业控制领域(PLC和仪器,PLC和PLC,PLC和上位机,PLC和触摸屏等等,其中PLC是可控制逻辑单元)

        他有两种物理接口(硬件协议),一个是串口(RS232,RS485,RS422),一个是以太网。串口主要用于modbus RTU或者是modbus ascii模式,而以太网主要用于modbus tcp协议。

        一般的通信方式是:主机广播或者单播发送指令,从机分析请求,并且给主机应答(如果出错就返回异常功能码)。从机只能响应主机,不能主动发送数据

二、功能码0x01-读取线圈中的数据

主机发送,读线圈数据(注意:数据以16进制格式发送)

从机地址功能码寄存器起始地址高字节寄存器起始地址低字节寄存器数量高字节寄存器数量低字节CRC校验高字节CRC校验低字节

从机响应 (注意:接收数据也是16进制)

从机地址功能码返回数据长度(一个字节,最多是255个数据)数据CRC校验高字节CRC校验低字节

举例:

主机:01 01 00 00 00 08 3D CC

从机:01 01 01 21 91 90

三、功能码0x03读保持寄存器的数据

 typedef struct {//作为从机时使用u8  myadd;        //本设备从机地址u8  rcbuf[100];   //modbus接受缓冲区u8  timout;       //modbus数据持续时间u8  recount;      //modbus端口接收到的数据个数u8  timrun;       //modbus定时器是否计时标志u8  reflag;       //modbus一帧数据接受完成标志位u8  sendbuf[100]; //modbus接发送缓冲区//作为主机添加部分u8 Host_Txbuf[8];	//modbus发送数组	u8 slave_add;		//要匹配的从机设备地址(做主机实验时使用)u8 Host_send_flag;//主机设备发送数据完毕标志位int Host_Sendtime;//发送完一帧数据后时间计数u8 Host_time_flag;//发送时间到标志位,=1表示到发送数据时间了u8 Host_End;//接收数据后处理完毕}MODBUS;
 //参数1从机地址,参数2起始地址,参数3寄存器个数void Host_send03(uint8_t slave,uint16_t StartAddr,uint16_t num){int j;uint16_t crc;//计算的CRC校验位modbus.slave_add=slave;//这是先把从机地址存储下来,后面接收数据处理时会用到modbus.Host_Txbuf[0]=slave;//这是要匹配的从机地址modbus.Host_Txbuf[1]=0x03;//功能码modbus.Host_Txbuf[2]=StartAddr/256;//起始地址高位modbus.Host_Txbuf[3]=StartAddr%256;//起始地址低位modbus.Host_Txbuf[4]=num/256;//寄存器个数高位modbus.Host_Txbuf[5]=num%256;//寄存器个数低位crc=Modbus_CRC16(&modbus.Host_Txbuf[0],6); //获取CRC校验位modbus.Host_Txbuf[6]=crc/256;//CRC校验高位modbus.Host_Txbuf[7]=crc%256;//CRC校验低位//开始发送数据RS485_TX_ENABLE;//使能485控制端(启动发送)  for(j=0;j<i;j++){Modbus_Send_Byte(modbus.sendbuf[j]);}RS485_RX_ENABLE;//失能485控制端(改为接收)}
 //主机接收从机的消息进行处理功能码0x03void HOST_receive03(){u16 crc,rccrc;//计算crc和接收到的crcif(modbus.reflag == 0)  //如果接收未完成则返回空{return;}//(数组中除了最后两位CRC校验位其余全算)crc = Modbus_CRC16(&modbus.rcbuf[0],modbus.recount-2); //获取CRC校验位rccrc = modbus.rcbuf[modbus.recount-2]*256+modbus.rcbuf[modbus.recount-1];//计算读取的CRC校验位if(crc == rccrc) //CRC检验成功 开始分析包{	if(modbus.rcbuf[0] == modbus.slave_add)  // 检查地址是是对应从机发过来的{if(modbus.rcbuf[1]==3)//功能码时03{int i;int count=(int)modbus.rcbuf[2];//这是数据个数printf("从机返回 %d 个寄存器数据:\r\n",count/2);for(i=0;i<count;i=i+2){printf("data%d= %d\r\n",i+1,(int)modbus.rcbuf[4+i]+((int)modbus.rcbuf[3+i])*256);}}}}}	modbus.recount = 0;//接收计数清零modbus.reflag = 0; //接收标志清零}

 

四、功能码0x06向一个寄存器中写入数据

 void Host_send06(uint8_t slave,uint16_t Addr,uint16_t data){uint16_t crc,j;//计算的CRC校验位modbus.slave_add=slave;//从机地址赋值一下,后期有用modbus.Host_Txbuf[0]=slave;//这是要匹配的从机地址modbus.Host_Txbuf[1]=0x06;//功能码modbus.Host_Txbuf[2]=Addr/256;//写入寄存器地址高位modbus.Host_Txbuf[3]=Addr%256;//写入寄存器低位modbus.Host_Txbuf[4]=data/256;//写入数据高位modbus.Host_Txbuf[5]=data%256;//写入数据低位crc=Modbus_CRC16(&modbus.Host_Txbuf[0],6); //获取CRC校验位modbus.Host_Txbuf[6]=crc/256;//CRC校验高位modbus.Host_Txbuf[7]=crc%256;//CRC校验低位//开始发送数据RS485_TX_ENABLE;//使能485控制端(启动发送)  for(j=0;j<i;j++){Modbus_Send_Byte(modbus.sendbuf[j]);}RS485_RX_ENABLE;//失能485控制端(改为接收)}
 //从机返回数据void Host_receive06(){int crc,rccrc;crc = Modbus_CRC16(&modbus.rcbuf[0],6); //获取CRC校验位rccrc = modbus.rcbuf[6]*256+modbus.rcbuf[7];//计算读取的CRC校验位if(crc == rccrc) //CRC检验成功 开始分析包{	if(modbus.rcbuf[0] == modbus.slave_add)  // 检查地址是是对应从机发过来的{if(modbus.rcbuf[1]==6)//功能码时06{printf("地址为 %d 的从机寄存器 %d 中写入数据 %d \r\n ",(int)modbus.rcbuf[0],(int)modbus.rcbuf[3]+((int)modbus.rcbuf[2])*256,(int)modbus.rcbuf[5]+((int)modbus.rcbuf[4])*256);}}}	}

五、功能码0x10-多个寄存器写入数据 

 

        理解加模仿,然后自己写功能吗0x10的代码

 

六、主机接收从机所有数据合并函数

 void Modbus_receiveAll(){u16 crc,rccrc;//crc和接收到的crcif(modbus.reflag == 0)  //如果接收未完成则返回空{return;}crc = Modbus_CRC16(&modbus.rcbuf[0],modbus.recount-2); //获取CRC校验位rccrc = modbus.rcbuf[modbus.recount-2]*256+modbus.rcbuf[modbus.recount-1];//计算读取的CRC校验位if(crc == rccrc) //CRC检验成功 开始分析包{	if(modbus.rcbuf[0] == modbus.myadd)  // 检查地址是否时自己的地址{switch(modbus.rcbuf[1])   //分析modbus功能码{case 3:      //处理读保存寄存器的数据的代码     break;case 6:      //对应代码                       break;case 16:     //对应代码                       break;}}else if(modbus.rcbuf[0] == 0) //广播地址不予回应{}	 }	modbus.recount = 0;//接收计数清零modbus.reflag = 0; //接收标志清零}

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

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

相关文章

uniapp 蓝牙小程序-兼容安卓和iOS

withTimeout方法可以在搜寻设备时等待指定的秒数&#xff0c;如果30秒内未搜索到则取消搜索 /*** 超时控制函数* param {Promise} promise 回调函数* param {number} timeout 超时时间, 默认10s*/ export function withTimeout(promise, timeout 10000) {let timeoutEvent …

基于Netty连接池泄露问题了解客户端启动源码

连接池导致内存泄漏案例演示 简介 我们生产环境常常会用Netty客户端作为连接工具&#xff0c;尽管Netty强大且方便&#xff0c;但是使用不当的话也可能造成严重的生成事故。笔者本文就以一个连接池使用不当导致内存泄漏的案例来展开探讨。 问题复现 服务端代码 我们先贴出…

Sui承诺向流动性质押协议投入$SUI

Sui将提供SUI以支持三个流动性质押协议及其相应的流动性质押token&#xff08; Liquid Staking Tokens&#xff0c;LST&#xff09;&#xff0c;为网络上不断增长的DeFi领域增加了流动性。此次注入将加强LST在交易和其他DeFi 用途中的流动性。 流动性质押让SUI所有者通过将其t…

32、应急响应——linux

文章目录 一、linux进程排查二、linux文件排查三、linux用户排查四、linux持久化排查4.1 历史命令4.2 定时任务排查4.3 开机启动项排查 五、linux日志分析六、工具应用 一、linux进程排查 查看资源占用&#xff1a;top查看所有进程&#xff1a;ps -ef根据进程PID查看进程详细信…

ARM开发

ARM课程介绍 课程特点 ARM开发 --> Linux移植 --> 驱动开发 前后联系&#xff1a;ARM和系统移植为驱动开发学习做准备工作 所需知识&#xff1a;C语言基础及STM32需要的硬件知识 课程要求 目标&#xff1a;学习程序运行原理、硬件的控制原理 会看原理图、芯片手册、学习…

ChatGPT对话为什么不用WebSocket而使用EventSource?

文章目录 1. 引言2. WebSocket和EventSource简介2.1 WebSocket2.2 EventSource 3. ChatGPT对话系统的特点4. EventSource的优势4.1 简单易用4.2 容错性强4.3 兼容性良好 5. 为何选择EventSource而非WebSocket&#xff1f;5.1 单向通信模式5.2 长轮询模式5.3 简化部署和维护 6. …

SpringBoot+Netty+Websocket实现消息推送

这样一个需求&#xff1a;把设备异常的状态每10秒推送到页面并且以弹窗弹出来&#xff0c;这个时候用Websocket最为合适&#xff0c;今天主要是后端代码展示。 添加依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifact…

用Go汇编实现一个快速排序算法

本代码全网首发&#xff0c;使用Go plan9 windows arm64汇编&#xff0c;实现基础版快速排序算法。 未引入随机因子的快速排序的普通Go代码长这样。 func QuickSort(arr []int) {if len(arr) < 1 {return}base, l, r : arr[0], 0, len(arr)-1for i : 1; i < r; {if arr…

Vue H5项目,怎么引入uni.webview sdk,调用uni postMessage实现手机蓝牙连接打印功能(uniapp)

前言 目前公司Vue H5项目&#xff0c;用webview打包成APP&#xff0c;现产品提出这样打包出来的app运行较慢&#xff0c;需要用uniapp方式&#xff08;即使用HBuilder编辑器来打包H5&#xff09;来打包&#xff0c;那需要的基座就不是安卓的基座而是uniapp的基座&#xff0c;而…

扭矩法、屈服点法哪个比较高效?——SunTorque智能扭矩系统

在机械制造和维修领域&#xff0c;拧紧螺栓和螺母是一项重要的操作。拧紧方法的合理选择和使用&#xff0c;对于确保机械设备的稳定性和安全性具有至关重要的作用。本文SunTorque智能扭矩系统将介绍两种最常用的拧紧方法&#xff0c;并探讨它们的轴力范围计算方法。一、扭矩法 …

电信网关配置管理系统后台 upload.php 文件上传漏洞复现

0x01 产品简介 中国电信集团有限公司(英文名称“China Telecom”、简称“中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。 0x02 漏洞概述 电信网关配置管理系统后台 /manager/teletext/material/upload.php 接口存在文件上传漏洞,攻击者…

【数电笔记】56-消抖开关

目录 说明&#xff1a; 1. 按键抖动形成的原因 2. 按键消抖的方法 3. 用与非RS触发器构成消抖开关&#xff08;硬件消抖&#xff09; 说明&#xff1a; 笔记配套视频来源&#xff1a;B站本系列笔记并未记录所有章节&#xff0c;只对个人认为重要章节做了笔记&#xff1b;标…

【稳定检索|投稿优惠】2024年艺术鉴赏与社会科学教育国际会议(ICAASSE 2024)

2024年艺术鉴赏与社会科学教育国际会议(ICAASSE 2024) 2024 International Conference on Art Appreciation and Social Science Education(ICAASSE) 一、【会议简介】 2024年艺术鉴赏与社会科学教育国际会议(ICAASSE 2024)&#xff0c;这场学术盛宴&#xff0c;将于2024年2月1…

郝斌C语言自学教程笔记

赫斌C语言——笔记目录 c语言编程预备知识流程控制函数变量指针结构体位运算符 前段时间康哥看我C语言基础不牢,推荐我学习郝斌老师的C语言课程&#xff0c;花2周看完之后发现确实是目前所看的C语言课程中最好的&#xff0c;不仅非常适合入门&#xff0c;而且对即使学了几年C语…

怒斥以色列后突发心脏病倒地,土耳其议员抢救无效身亡!

这两天互联网上热传一段视频&#xff0c;说的就是土耳其议员在议会演讲时突然倒地晕厥&#xff0c;两天后就去世了。这可真是让人震惊啊&#xff01; 据说这位议员是土耳其反对党幸福党的&#xff0c;名字叫比特梅兹。他在议会发表批评以色列的言论时&#xff0c;情绪过于激动…

安装2023最新版Java SE 21.0.1来开发Java应用程序

安装2023最新版Java SE 21.0.1来开发Java应用程序 Install the latest version of Java SE 21.01 to Develop Java Applications By JacksonML 本文简要介绍如何下载和安装2023年最新版Java Development Kit (简称JDK&#xff0c;即Java开发工具包标准版&#xff09;21.0.1&…

长尾问题之LDAM

做法&代码&公式 step1: 全连接层的权重W和特征向量X都归一化,相乘 W * X P (得到各个类别的概率) # 定义权重&#xff0c;初始化 weight nn.Parameter(torch.FloatTensor(num_classes, num_features)) weight.data.uniform_(-1, 1).renorm_(2, 1, 1e-5).mul_(1e5)#…

Java 线程的基本概念

创建和运行线程 方法一&#xff0c;直接使用 Thread // 创建线程对象 Thread t new Thread() {public void run() {// 要执行的任务}};// 启动线程 t.start();例如&#xff1a; // 构造方法的参数是给线程指定名字&#xff0c;推荐 Thread t1 new Thread("t1") …

网络安全——SQL注入实验

一、实验目的要求&#xff1a; 二、实验设备与环境&#xff1a; 三、实验原理&#xff1a; 四、实验步骤&#xff1a; 五、实验现象、结果记录及整理&#xff1a; 六、分析讨论与思考题解答&#xff1a; 七、实验截图&#xff1a; 一、实验目的要求&#xff1a; 1、…

《Cadence 16.6电路设计与仿真从入门到精通》——1.4 Cadence SPB 16.6的启动

《Cadence 16.6电路设计与仿真从入门到精通》——1.4 Cadence SPB 16.6的启动  2017-05-027334 版权 简介: 本节书摘来自异步社区《Cadence 16.6电路设计与仿真从入门到精通》一书中的第1章,第1.4节,作者: 王超 , 胡仁喜等 更多章节内容可以访问云栖社区“异步社区”公…