外贸网站收到询盘淘客网站建设视频

news/2025/9/30 21:35:14/文章来源:
外贸网站收到询盘,淘客网站建设视频,标书制作教程全过程,一个公司的网址怎么弄目录 一、modbus简介 二、功能码01、02 三、modbus解析 四、功能码03、04 五、功能码05 六、功能码06 七、功能码16 一、modbus简介 我们在网上查阅modbus的资料发现很多很杂#xff0c;modbus-RTU ASCII TCP等等#xff0c;还有跟PLC结合的#xff0c;地址还分1开…目录 一、modbus简介 二、功能码01、02 三、modbus解析 四、功能码03、04 五、功能码05 六、功能码06 七、功能码16 一、modbus简介 我们在网上查阅modbus的资料发现很多很杂modbus-RTU   ASCII  TCP等等还有跟PLC结合的地址还分1开头的4开头的搞得有点懵那其实是各行业有各自差异化的规则而已实际上modbus就是  地址码功能码数据区校验码  了这是核心具体可以看这篇比较简洁。modbus rtu六种功能码详细解析-电子发烧友网 对于我们物联网领域而言就是方便在主机端接入其它厂家的传感器或执行器设备就是了比如温湿度、PH计等等厂家在生产的时候产品定位就是配套应用商所以modbus协议基本是标配只是不同厂家的传感器modbus的数据地址定义不一样而已当然也有少数厂家用自定义协议非要用的话就得多费时间去了解它的协议了那modbus协议的传感器我们如果有驱动的话请求或解析就可以直接复用了下图是TB上随便搜索的485温湿度传感器的通讯协议。 另外modbus对于我们来讲物理层一般都是RS485的当然了要用RS232或TTL串口甚至是4G、LORA也都是可以的。modbus协议使用的时候一般是主机发送请求从机回复结果的流程主机可以请求传感器数据也可以设置内容比如控制继电器开关一应一答每次轮询根据波特率要有一定间隔一般几十到几百毫秒像RS485的波特率不要太高一般是9600如果距离有几百米建议更低4800或2400。在实际工程项目中主机跟从机的485通讯经常会有莫名其妙的问题(通讯不上或者乱码)这个就要靠经验解决了。 那我们写modbus驱动文件的意义在哪里要怎么写就跟之前用过的mqtt协议一样我们这个驱动程序主要作用就是组合报文和解析报文这样当你拿到一个厂家的modbus传感器的时候直接调用这个驱动文件的函数就可以请求数据了最后再根据厂家对数据的定义进行应用层解析就行了。接下来我们就几个常用的功能码做详细介绍。 二、功能码01、02 01的作用就是读取开关量输出状态02的作用是读取IO输入状态其实都差不多返回的数据中正常每个bit位代表各自的开关/输入状态比如数据如下 请求01 02 00 00 00 04 79 C9 返回01 02 01 0B E0 4F 这里面的含义是请求起始数据地址为0x0000的4个输入状态返回的是地址码01、功能码02、数据长度01、数据区0B和CRC校验码E0 4F那对于应用层来讲有用的数据就是0B了我们现在把0B换成二进制显示是 0000 1011那么这个数据正常理解就是1、2、4路输入触发3路正常具体的要以厂家提供的资料为准。功能码01也是一个道理的。这里面如果你请求的寄存器数量小于8个那从机会返回一个字节数据每个bit代表一个寄存器状态多余的是高位无效一般用0代替。 下面是具体的请求代码 /* 描述 :modbus 0x01的报文组合 输入 : 输出 : */ u16 drv_modbus_send_fun01(u8 slave_addr, u16 reg_start, u16 reg_num, u8 *make_buff, u16 make_size) {if(make_size20){return 0;}u16 make_len0;u16 crcValue;make_buff[make_len]slave_addr;make_buff[make_len]0x01;make_buff[make_len]reg_start8;make_buff[make_len]reg_start;make_buff[make_len]reg_num8;make_buff[make_len]reg_num;crcValuedrv_crc16(make_buff, make_len);make_buff[make_len]crcValue8;make_buff[make_len]crcValue;return make_len; }/* 描述 :modbus 0x02的报文组合 输入 : 输出 : */ u16 drv_modbus_send_fun02(u8 slave_addr, u16 reg_start, u16 reg_num, u8 *make_buff, u16 make_size) {if(make_size20){return 0;}u16 make_len0;u16 crcValue;make_buff[make_len]slave_addr;make_buff[make_len]0x02;make_buff[make_len]reg_start8;make_buff[make_len]reg_start;make_buff[make_len]reg_num8;make_buff[make_len]reg_num;crcValuedrv_crc16(make_buff, make_len);make_buff[make_len]crcValue8;make_buff[make_len]crcValue;return make_len; } 代码的核心就是根据从机地址、寄存器起始地址、寄存器数量来组合报文应用层再把这个报文发送出去至于是使用RS485还是RS232都是可以的驱动层不关心。 三、modbus解析 对于协议解析就很有讲究了我看到的大部分解析代码都是数据包丢进解析函数里然后函数直接就CRC校验出错就返回了这样的解析代码其实稳定性不太好因为实际传输的时候会经常莫名其妙的数据头或尾巴多出个00或FF或者其它数据但是完整正确的数据包又在里面这样CRC校验肯定是错的所以这里我把解析函数升级了下这样鲁棒性会好点。 /* 描述 : modbus 基础数据解析 输入 : 输出 : */ u16 drv_modbus_parse_base(u8 slave_addr, u8 fun_code, u8 *in_buff, u16 in_len, u8 *out_buff, u16 out_size) {u16 recv_lenin_len, crcValue;u8 *pDatain_buff;u8 data_len0;if(recv_len4 || recv_len250)return 0;for(u8 i0;i4recv_len;i,pData){if(pData[0]slave_addr pData[1]fun_code)//比较地址和功能码{data_lenpData[2];crcValuepData[data_len3]8|pData[data_len4];if(crcValuedrv_crc16(pData, data_len3)){if(data_lenout_size){memcpy(out_buff, pData[3], data_len);}else{data_len0;} break;} } }return data_len; } 首先要声明的是这个代码适合读取数据的功能码比如01、02、03和04对于设置功能码05、06成功了直接返回相同报文可以用字符串匹配的方式进行确认这里先略过。这段代码的核心是匹配用户需要的从机地址和功能码这就相当于数据标识头了有了这个以后至少可以过滤掉前面无用的干扰数据了之后的第三字节就是数据长度了有了这个长度值就能够准确地做CRC校验了 校验成功之后把数据区的内容复制出来就可以了剩下的是应用层的事情了。 对于功能码01和02对应的解析函数就是调用上面的函数就行了具体如下。 /* 描述 : modbus 0x01 数据解析 输入 : 输出 : */ u16 drv_modbus_parse_fun01(u8 slave_addr, u8 *in_buff, u16 in_len, u8 *out_buff, u16 out_size) {return drv_modbus_parse_base(slave_addr, 0x01, in_buff, in_len, out_buff, out_size); }/* 描述 : modbus 0x02 数据解析 输入 : 输出 : */ u16 drv_modbus_parse_fun02(u8 slave_addr, u8 *in_buff, u16 in_len, u8 *out_buff, u16 out_size) {return drv_modbus_parse_base(slave_addr, 0x02, in_buff, in_len, out_buff, out_size); }四、功能码03、04 03和04功能码比较相似差别在于03是保持寄存器可读可写04是输入寄存器只读。比如热敏温度头的数据一般就用04来读取主机不能改变空调的设定温度一般用03来读取同时可以用06来设置更改。具体组合报文代码如下 /* 描述 :modbus 0x03的报文组合 输入 : 输出 : */ u16 drv_modbus_send_fun03(u8 slave_addr, u16 reg_start, u16 reg_num, u8 *make_buff, u16 make_size) {if(make_size20){return 0;}u16 make_len0;u16 crcValue;make_buff[make_len]slave_addr;make_buff[make_len]0x03;make_buff[make_len]reg_start8;make_buff[make_len]reg_start;make_buff[make_len]reg_num8;make_buff[make_len]reg_num;crcValuedrv_crc16(make_buff, make_len);make_buff[make_len]crcValue8;make_buff[make_len]crcValue;return make_len; }/* 描述 :modbus 0x04的报文组合 输入 : 输出 : */ u16 drv_modbus_send_fun04(u8 slave_addr, u16 reg_start, u16 reg_num, u8 *make_buff, u16 make_size) {if(make_size20){return 0;}u16 make_len0;u16 crcValue;make_buff[make_len]slave_addr;make_buff[make_len]0x04;make_buff[make_len]reg_start8;make_buff[make_len]reg_start;make_buff[make_len]reg_num8;make_buff[make_len]reg_num;crcValuedrv_crc16(make_buff, make_len);make_buff[make_len]crcValue8;make_buff[make_len]crcValue;return make_len; }跟01、02功能码是差不多的解析代码也是类似 /* 描述 : modbus 0x03 数据解析 输入 : 输出 : */ u16 drv_modbus_parse_fun03(u8 slave_addr, u8 *in_buff, u16 in_len, u8 *out_buff, u16 out_size) {return drv_modbus_parse_base(slave_addr, 0x03, in_buff, in_len, out_buff, out_size); }/* 描述 : modbus 0x04 数据解析 输入 : 输出 : */ u16 drv_modbus_parse_fun04(u8 slave_addr, u8 *in_buff, u16 in_len, u8 *out_buff, u16 out_size) {return drv_modbus_parse_base(slave_addr, 0x04, in_buff, in_len, out_buff, out_size); } 应用层数据解析以文章开头的温湿度为例调用drv_modbus_parse_fun03函数后out_buff内的数据就是02 92 FF 9B四个字节具体的转换如下图所示。 五、功能码05 其作用是设置单路输出比如第二路继电器开开就往寄存器内设置FF 00关就设置00 00设置成功后就直接返回原数据。那么对于05功能码的返回要如何处理呢两个选择一个是用我的工程里drv_common.c的memstr函数做匹配看下返回的数据包里有没有包含刚才设置的数据串另一个选择是直接忽略有没有设置成功不要在这里观测而是用01功能码实时读取输出状态值如果状态不匹配要怎么处理由应用层自己决定比如重复执行3次后仍然失败那就向用户发端出故障信息人工介入等等。 /* 描述 :modbus 0x05的报文组合 输入 : 输出 : */ u16 drv_modbus_send_fun05(u8 slave_addr, u16 reg_start, u16 reg_value, u8 *make_buff, u16 make_size) {if(make_size20){return 0;}u16 make_len0;u16 crcValue;make_buff[make_len]slave_addr;make_buff[make_len]0x05;make_buff[make_len]reg_start8;make_buff[make_len]reg_start;make_buff[make_len]reg_value8;make_buff[make_len]reg_value; crcValuedrv_crc16(make_buff, make_len);make_buff[make_len]crcValue8;make_buff[make_len]crcValue;return make_len; }六、功能码06 06和03对应的寄存器是一样的03读06写比如空调预设温度、净化器预设转速等这些都可以叫保持寄存器。有点区别是 03可以批量读取连续的寄存器06只能单个设置06的具体代码如下 /* 描述 :modbus 0x06的报文组合 输入 : 输出 : */ u16 drv_modbus_send_fun06(u8 slave_addr, u16 reg_start, u16 reg_value, u8 *make_buff, u16 make_size) {if(make_size20){return 0;}u16 make_len0;u16 crcValue;make_buff[make_len]slave_addr;make_buff[make_len]0x06;make_buff[make_len]reg_start8;make_buff[make_len]reg_start;make_buff[make_len]reg_value8;make_buff[make_len]reg_value; crcValuedrv_crc16(make_buff, make_len);make_buff[make_len]crcValue8;make_buff[make_len]crcValue;return make_len; }06的返回解析跟05类似正常直接忽略就行了用03功能码去监测到底有没有设置成功。 七、功能码16 16是十进制的也就是16进制的0x10功能码是06的扩展它可以批量设置寄存器稍微复杂点具体看如下代码 /* 描述 : modbus 0x10的报文组合 输入 : 输出 : */ u16 drv_modbus_send_fun16(u8 slave_addr, u16 reg_start, u16 reg_num, u8 *reg_data, u8 *make_buff, u16 make_size) {u16 make_len0;u16 crcValue;u8 data_lenreg_num*2;if(make_size10data_len)return 0;make_buff[make_len]slave_addr;make_buff[make_len]0x10;make_buff[make_len]reg_start8;make_buff[make_len]reg_start; //寄存器起始地址make_buff[make_len]reg_num8;make_buff[make_len]reg_num; //寄存器数量make_buff[make_len]data_len;//数据区长度memcpy(make_buff[make_len], reg_data, data_len);//数据区make_lendata_len;crcValuedrv_crc16(make_buff, make_len);make_buff[make_len]crcValue8;make_buff[make_len]crcValue;return make_len; } 返回也是忽略就行了用03去读取监测。 modbus的解析大概就是这样了完整版的内容比较多但是根据平时项目的使用频率来看常用的就这些了其他的要学习只能自己再找找资料了。 具体代码在这里下载https://download.csdn.net/download/ypp240124016/89091325 工程原来上传过了自己添加驱动程序测试就行了。https://download.csdn.net/download/ypp240124016/89044525 本项目的交流QQ群:701889554

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

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

相关文章

PWN手成长之路-05-ROP

与远程环境进行交互,可以进行输入,但是输入之后无任何回显。file 查看文件。64位 ELF 。checksec 查看文件安全属性。IDA 打开文件。查看 main 函数的反编译代码。查看 buf 这个字符数组(栈上的缓冲区),本身 buf …

随机采样研究随笔

\(y=x^n\) 在 O(n) 复杂度随机 \(y=(1-x)^a x^b\) 在 O(n) 复杂度随机 线性时间随机 \(n\) 个有序的 \([0,1]\) 实数。 线性时间随机 \(sum=0\) 的一个 1,-1 序列 \(O(n\sqrt n)\) 时间随机一个合法括号序列

Python 正则表达式实战:一文搞定文本处理

在 Python 中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、搜索、替换等操作。无论是数据清洗、文本解析还是复杂的文本处理任务,正则表达式都能轻松应对。今天,就让我们一起深入学习 Py…

2025-2026-1 20231301 《信息安全设计》第八周学习总结

View Post2025-2026-1 20231301 《信息安全设计》第八周学习总结2025-2026-1 20231301 《信息安全设计》第八周学习总结 目录作业信息学习内容总结一、TLS协议深度解析二、OpenSSL SSL/TLS编程实战三、OpenSSL命令行TL…

太月星网站建设程序开发一键生成微信小程序

你知道吗,C类是编程世界中的一种强大工具,它可以帮助我们更好地组织和管理代码。接下来,我将为你呈现一篇近万字的C类的教程,希望能帮助你熟悉这个概念。 首先,让我们从C类的定义开始。类是一个模板,它描述…

2025-2026-1 20231301 《信息安全设计》第七周学习总结

View Post2025-2026-1 20231301 《信息安全设计》第七周学习总结2025-2026-1 20231301 《信息安全设计》第七周学习总结 目录作业信息学习内容总结第十章:身份认证和PKI理论基础一、PKI体系架构深度解析二、证书处理实…

springboot+vue心理健康服务小程序(源码+文档+调试+基础修改+答疑) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

肉山谷英雄传说新手任务登录英文网站怎么做装修网站建设网

文章目录 前言UUID 处理的更改正则表达式的更改结束 前言 Android 14 已经出来好久好久了… 今天其他的暂且不论,单纯的讲一下 OpenJDK 17 更新的两点变更(扒源代码)~ 对正则表达式的更改UUID 处理 首先,正则表达式的更改&…

网站备案查询 工信部wordpress 删除标签页

导语 如果之前的单机版hadoop环境安装满足不了你,集群版hadoop一定合你胃口,轻松入手。目录 集群规划前置条件配置免密登录 3.1 生成密匙 3.2 免密登录 3.3 验证免密登录集群搭建 4.1 下载并解压 4.2 配置环境变量 4.4 修改配置 4.4 分发程序 4.5 初始化…

湛江企业自助建站时尚网站设计案例

1. 模型旋转角度尽量取整数,保证线条不会出现锯齿 2. 修改反锯齿模型为FXAA方式,默认的TemporalAA方式会闪烁 3. 动态更新的纹理尺寸一般都不会是2的N次方,比如401X518。 解决方案是 动态更新一张1024x1024的贴图的其中401X518,…

南宁网站建设招聘建设工程合同备案在什么网站上

2016只剩下不到百分之一的时间了,网上陆续看到各种企业或个人的总结或盘点,公司也必须规定每个员工要做年度工作总结,或许是环境释然,心里也有无数次要做总结的念头,尤其是月末年末这种感觉更重,但却没静下…

没用的博客园页面的要素介绍(待更新)

1. 关于那几行字点击查看"<b style=color:rgb(119, 248, 255)>又是一年雨季</b>","<b style=color:rgb(119, 248, 255)>青苔悄悄爬满缝隙</b>","<b style=color:…

详细介绍:Music Tag Web 怎么安装 ffmpeg?

详细介绍:Music Tag Web 怎么安装 ffmpeg?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

2025-2026-1 20231301 《信息安全设计》第六周学习总结

View Post2025-2026-1 20231301 《信息安全设计》第六周学习总结2025-2026-1 20231301 《信息安全设计》第六周学习总结 目录作业信息学习内容总结一、Windows密码体系架构深度解析二、CryptoAPI核心编程实战三、CSP服…

作业-1

实验任务一task1-1#include<stdio.h> #include<stdlib.h> int main() {printf(" O \n");printf("<H>\n");printf("I I\n");printf(" O \n");printf("…

MacOS拉取git代码报.DS_Store 冲突修复

命令到冲突的文件夹下 1、先查看当前目录下面是否有.DS_Store 这个文件ls -a2、如果存在则继续运行git rm -r --cached .DS_Store

国家住房和城乡建设部官方网站下载百度官方网站

什么是&#xff1f;为什么&#xff1f;需要负载均衡 一个网站在创建初期&#xff0c;一般来说都是只有一台服务器对用户提供服务 ​ 从图里可以看出&#xff0c;用户经过互联网直接连接了后端服务器&#xff0c;如果这台服务器什么时候突然 GG 了&#xff0c;用户将无法访问这…

自己有网站怎么做点卡?商业网点建设中心网站

720云全景漫游制作工具自2014年8月上线后&#xff0c;为数十万创作者提供全景图片&全景视频&高清矩阵上传、编辑、分享一站式软件服务&#xff0c;获得众多创作者的青睐与认可&#xff0c;同时也承载了创作者越来越多的期望&#xff0c;为了给大家提供更灵活多样的功能…

完整教程:Coze源码分析-资源库-删除数据库-前端源码-核心API/总结

完整教程:Coze源码分析-资源库-删除数据库-前端源码-核心API/总结pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

完整教程:Java核心 之JVM

完整教程:Java核心 之JVM2025-09-30 21:13 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…