// ************************************************************************************// // * 输出数据缓冲区 // // ************************************************************************************// typedef struct { // uint16 Reserve; //00 sint16 UDis; //00 电流 (或电压)(客户指定格式) // Bit15表示符号,0-正、1-负 // Bit0~bit14表示数据(RX)。 // 量程>=300:实际值=RX/10; // 量程<300:实际值=RX/100; uint16 Ver; //01 Va.bb.cc sint16 U; //02 电流 (或电压) // 量程>3000:实际值=RX; // 3000>=量程>300:实际值=RX/10; // 300>=量程>30:实际值=RX/100; // 30>=量程>3:实际值=RX/1000 // 3>=量程>0:实际值=RX/10000 uint16 Null1; //03 uint16 Freq; //04 DC保留 uint16 RS485_Addr; //05 默认为:0 uint16 RS485_BaudRate; //06 1—2400bps/2—4800bps/3—9600bps/4—19200bps/默认:3(9600bps) uint16 RS485_Parity; //07 0—无校验/1—奇校验/2—偶校验/默认:0—无校验 uint16 Null2[7]; //9-14 保留 uint16 Uns; //0F 保留 uint16 Un; //16 变送器量程 sint16 UClibZero; //17 直流零点标定 uint16 UClibFullP; //18 直流正满值标定 sint16 UClibFullN; //19 直流负满值标定 sint16 CustZero; //21 客户零点修正值:默认0,两位小数 uint16 CustGain; //22 客户增益修正值:默认10000 uint16 CustType; //23 协议模式 1:中恒协议,其他:信瑞达内部协议 uint16 Null4[12]; //21-34 保留 uint16 FilterSet; //35 滤波深度0~2,保留 uint16 MeterType; //36 交直流类型,保留 uint16 RS485_StopBits; //37 }SysStruct; extern SysStruct Sys; //系统数据 typedef struct { uint16 Reserve; //00 保留位 sint16 RS485_Addr; //00 从机地址0~255、其中0xFF为广播地址、默认:0 // 初始地址为0 uint32 U; //01 客户读,电流 // 只读(0x03),电流占用 2 个寄存 // 器共 4 个字节,有符号数。0001H // 为高 16 位,0002H 为低 16 位数 // 据。负值用补码格式表示。 // 可能会出现数据对其的问题,到时候需要补一个保留位 uint16 Ver; //03 版本号 Va.bb.cc uint16 Null[3]; //04~05 保留 }CustStruct; extern CustStruct Cust; //客户数据区 typedef struct { sint32 UdcIns; //00 直流低通输出瞬时值 sint32 UdcAvg; //03 直流输出,不分段,实际输出的百分比 sint32 Uout; //04 32位的实际输出值,有符号数,自带4位小数的整型 uint16 Un; //05 量程(寄存器地址:0BH) }OrgiStruct; extern OrgiStruct Orgi; #define SYS_DATA_LEN sizeof(SysStruct) #define CUST_DATA_LEN sizeof(CustStruct) #define ORGI_DATA_LEN sizeof(OrgiStruct) #define CFG_DATA_LEN ((CFG_END_ADDR-CFG_START_ADDR+1)*2) /* 系统数据地址定义 */ #define CFG_START_ADDR ((uint16*)&Sys.RS485_Addr-(uint16*)&Sys) // 标定参数起始地址 #define CFG_END_ADDR ((uint16*)&Sys.RS485_StopBits-(uint16*)&Sys) // 标定参数结束地址 #define ORGI_START_ADDR 0 // 原始数据起始地址 #define ORGI_END_ADDR (ORGI_DATA_LEN / 2 - 1) // 原始数据结束地址 // ************************************************************************************************* // * 数据配置数据保存地址 // ************************************************************************************************* #define FLASH_START_ADDR_SYSCFG (0x8000000+0x400*22) // 系统参数保存起始地址,第22页 #define FLASH_START_ADDR_SYSCFG1 FLASH_START_ADDR_SYSCFG // ************************************************************************************************* // * FLASH常数定义 // ************************************************************************************************* #define FLASH_BASE_ADDR ((uint32)0x08000000UL) // FLASH起始地址 // #define FLASH_PAGE_SIZE ((uint32)0x00000400UL) // FLASH页面大小 #define RAM_BASE_ADDR ((uint32)0x20000000UL) // RAM起始地址 #define RAM_END_ADDR ((uint32)0x20000C00UL) // RAM结束地址 对照6.1读取电流数据(支持功能码:0x03) 备注:产品地址默认为1,广播地址为250。 寄存器地址 详情 数据类型 读写 备注 0x0056 读取电流数据 INT16 只写 bit15为符号位:1-负;0-正 bit0~bit14为电流值,电流值=数值/(10^小数点个数),单位为mA. 6.2读取产品参数(0x03) 寄存器地址 详情 数据 类型 读写 备注 0x0001 软件版本号 UINT16 只读 Va.bb.cc 0x0002 直流漏电流 INT16 只读 补码形式,电流值=数值/(10^小数点个数),单位为mA. 0x0003 保留 UINT16 只读 0x0004 保留 UINT16 只读 0x0005 产品地址 UINT16 只读 0x0006 波特率 INT16 只读 1—2400bps 2—4800bps 3—9600bps 4—19200bps 默认为:3-9600bps 0x0007 校验位 UINT16 只读 0—无校验 1—奇校验 2—偶校验 默认为:0-无校验 0x0008 保留 UINT16 只读 0x0009 小数点个数 UINT16 只读 范围:0~3 备注:ADD产品地址,若地址忘记,可用广播地址0xFA读取,使用广播地址时,仅可链接1台传感器。 6.3产品参数设置(0x06) 寄存器地址 详情 数据类型 读写 备注 0x033E INT16 只写 漏电流零点校零 0x0004 范围:1~200 UINT16 只写 产品地址设置 0x0005 范围:1~4 UINT16 只写 波特率设置 0x0006 范围:0~3 UINT16 只写 校验位设置 0x0008 范围:1~3 UINT16 只写 小数位设置 以下内容不对用户开放 6.4读取 产品参数(支持功能码:0x03、0x06) 寄存器地址 详情 数据类型 读写 备注 0x0000 直流电流 UINT16 只读 0x0001 软件版本号 UINT16 只读 Va.bb.cc 0x0002 直流漏电流 INT16 只读 补码形式,电流值=数值/(10^小数点个数),单位为mA. 0x0003 保留 UINT16 只读 0x0004 保留 UINT16 只读 0x0005 产品地址 UINT16 只读 0x0006 波特率 INT16 只读 5—2400bps 6—4800bps 7—9600bps 8—19200bps 默认为:3-9600bps 0x0007 校验位 UINT16 只读 3—无校验 4—奇校验 5—偶校验 默认为:0-无校验 0x0008 保留 UINT16 只读 0x0009 小数点个数 UINT16 只读 范围:0~3 0x000A 保留 UINT16 只读 0x000B 电压零点CCR UINT16 只读 0x000C 正向电压满值CCR UINT16 只读 0x000D 反向电压满值CCR UINT16 只读 0x000E 2.5V零点AD值 UINT16 只读 0x000F 保留 UINT16 只读 0x0010 产品量程 UINT16 只读 0x0011 直流AD零点 INT16 只读 0x0012 保留 UINT16 只读 0x0013 直流AD正斜率 INT16 只读 0x0014 直流AD负斜率 INT16 只读 0x0015 保留 UINT16 只读 0x0016 保留 UINT16 只读 0x0017 保留 UINT16 只读 0x0018 半周期 UINT16 读写 0x0019 采样时间 UINT16 读写 0x001A 采样起始时间 UINT16 读写 0x001B 共模一次(RC)滤波常数 UINT16 读写 0x001C 共模二次(积分)滤波常数 UINT16 读写 0x001D 差模一次(RC)滤波常数 UINT16 读写 0x001E 差模二次(积分)滤波常数 INT16 读写 0x001F 电阻R29值 ohm UINT16 读写 0x0020 反馈线圈匝数 UINT16 读写 6.5修改产品参数、校正(支持功能码:0x06) 寄存器地址 数据 数据类型 读写 备注 0x0004 范围:1~200 UINT16 只写 地址设置 0x0005 范围:1~4 UINT16 只写 波特率设置 0x0006 范围:0~3 UINT16 只写 校验位设置 0x0008 范围:1~3 UINT16 只写 小数位设置 0x000F UINT16 只写 产品量程设置 0x033E INT16 只写 电流零点校正 0x0340 INT16 只写 电流正向校正 0x0342 INT16 只写 电流反向校正 0x00C8 INT16 只写 电压零点校正 0x00C9 INT16 只写 电压正向校正 0x00CA INT16 只写 电压反向显示 修改代码

时间: 2025-06-01 12:07:02 浏览: 28
### 实现寄存器地址的数据读取和设置功能 以下代码示例展示了如何根据提供的寄存器地址(如 `0x0056`、`0x0001` 等)和功能码(如 `0x03`、`0x06`),实现电流数据读取、产品参数读取与设置的功能。 #### 1. 功能码 `0x03`:读取寄存器数据 ```c #include <stdint.h> #include <string.h> #define MODBUS_ADDR 1 // 默认从站地址 #define FUNCTION_CODE_READ_HOLDING_REGISTERS 0x03 void ModbusReadHoldingRegisters(uint8_t *pMbBuf, uint8_t u8MbBufLen) { uint16_t u16Add = 0; // 起始地址 uint16_t u16Num = 0; // 要读取的寄存器个数 uint16_t u16Cnt = 0; // 数据个数 if (u8MbBufLen != 8) { // 判断接收数组长度是否为8字节 return; } // 合并接收到的起始地址 u16Add = pMbBuf[2] << 8 | pMbBuf[3]; // 合并接收到的寄存器数量 u16Num = pMbBuf[4] << 8 | pMbBuf[5]; // 构建响应报文 uint8_t ModbusBuf[256]; // 响应缓冲区 uint8_t MdobusTxCnt = 0; ModbusBuf[MdobusTxCnt++] = pMbBuf[0]; // 发送接收到的从站地址 ModbusBuf[MdobusTxCnt++] = pMbBuf[1]; // 发送功能码 ModbusBuf[MdobusTxCnt++] = u16Num * 2; // 发送数据字节数 for (u16Cnt = 0; u16Cnt < u16Num; u16Cnt++) { // 模拟读取寄存器数据 uint16_t regValue = ReadRegister(u16Add + u16Cnt); // 根据地址读取寄存器值 ModbusBuf[MdobusTxCnt++] = (regValue >> 8) & 0xFF; // 高字节 ModbusBuf[MdobusTxCnt++] = regValue & 0xFF; // 低字节 } // 添加CRC校验 CRCSendBuf(ModbusBuf, MdobusTxCnt); } uint16_t ReadRegister(uint16_t address) { // 模拟读取寄存器值 switch (address) { case 0x0056: // 读取电流数据 return 0x7FFF; // 示例值 case 0x0001: // 软件版本号 return 0x0102; // 示例值 default: return 0xFFFF; // 无效地址返回错误值 } } ``` #### 2. 功能码 `0x06`:设置寄存器数据 ```c #define FUNCTION_CODE_WRITE_SINGLE_REGISTER 0x06 void ModbusWriteSingleRegister(uint8_t *pMbBuf, uint8_t u8MbBufLen) { uint16_t u16Add = 0; // 寄存器地址 uint16_t u16Value = 0; // 写入值 if (u8MbBufLen != 6) { // 判断接收数组长度是否为6字节 return; } // 合并接收到的寄存器地址 u16Add = pMbBuf[2] << 8 | pMbBuf[3]; // 合并接收到的写入值 u16Value = pMbBuf[4] << 8 | pMbBuf[5]; // 写入寄存器 WriteRegister(u16Add, u16Value); // 构建响应报文 uint8_t ModbusBuf[6]; uint8_t MdobusTxCnt = 0; ModbusBuf[MdobusTxCnt++] = pMbBuf[0]; // 发送接收到的从站地址 ModbusBuf[MdobusTxCnt++] = pMbBuf[1]; // 发送功能码 ModbusBuf[MdobusTxCnt++] = (u16Add >> 8) & 0xFF; // 发送寄存器地址高字节 ModbusBuf[MdobusTxCnt++] = u16Add & 0xFF; // 发送寄存器地址低字节 ModbusBuf[MdobusTxCnt++] = (u16Value >> 8) & 0xFF; // 发送写入值高字节 ModbusBuf[MdobusTxCnt++] = u16Value & 0xFF; // 发送写入值低字节 // 添加CRC校验 CRCSendBuf(ModbusBuf, MdobusTxCnt); } void WriteRegister(uint16_t address, uint16_t value) { // 模拟写入寄存器值 switch (address) { case 0x0004: // 设置产品地址 SetProductAddress(value); break; case 0x0005: // 设置波特率 SetBaudRate(value); break; default: break; } } void SetProductAddress(uint16_t address) { // 设置产品地址逻辑 } void SetBaudRate(uint16_t baudRate) { // 设置波特率逻辑 } ``` #### 3. 串口接收数据事件处理 ```c void MyCom_DataReceived(uint8_t *bData, uint16_t mReceiveByteCount) { if (mReceiveByteCount >= 6 && bData[1] == FUNCTION_CODE_READ_HOLDING_REGISTERS) { ModbusReadHoldingRegisters(bData, mReceiveByteCount); } else if (mReceiveByteCount >= 6 && bData[1] == FUNCTION_CODE_WRITE_SINGLE_REGISTER) { ModbusWriteSingleRegister(bData, mReceiveByteCount); } } ``` --- ###
阅读全文

大家在看

recommend-type

adlink 凌华IO卡 PCI-Dask.dll说明资料 功能参考手册

关于 PCI-Dask.dll 方法函数的说明文件,ADLINK的多款IO板卡的编程说明和支持文件。 PCI-6202/PCI-6208A/cPCI-6208A/PCI-6208V/16V/cPCI-6208V/PCI-6308A/PCI-6308V/PCI-7200/c/PCI-7200/PCI-7230/cPCI-7230/PCI-7233/PCI-7233H/PCI-7234/PCI-7224/PCI-7248/cPCI-7248/cPCI-7249R/PCI-7250/cPCI-7252/PCI-7256/PCI-7258/PCI-7260/PCI-7296/PCI-7300A/cPCI-7300A/PCI-7348/PCI-7350/PCI-7396/PCI-7432/cPCI-7432/PCI-7433/cPCI-7433/PCI-7434/cPCI-7434/cPCI-7432R/cPCI-7433R/cPCI-7434R/PCI-7442/PCI-744
recommend-type

基于YOLO网络的行驶车辆目标检测matlab仿真+操作视频

1.领域:matlab,YOLO网络的行驶车辆目标检测算法 2.内容:基于YOLO网络的行驶车辆目标检测matlab仿真+操作视频 3.用处:用于YOLO网络的行驶车辆目标检测算法编程学习 4.指向人群:本硕博等教研学习使用 5.运行注意事项: 使用matlab2021a或者更高版本测试,运行里面的Runme_.m文件,不要直接运行子函数文件。运行时注意matlab左侧的当前文件夹窗口必须是当前工程所在路径。 具体可观看提供的操作录像视频跟着操作。
recommend-type

JSON,VC++简单交互纯源码!

VC实现json向服务端发送数据,基本可以完成数据发送和解析工作了。具体相应功能请测试后,资源来自网络!
recommend-type

matlab对excel数据批处理实战案例二.rar

matlab对excel数据批处理实战案例二
recommend-type

MarkdownEditor精简绿色版

MarkdownEditor精简绿色版

最新推荐

recommend-type

2022java软件工程师英文简历.docx

2022java软件工程师英文简历.docx
recommend-type

自制Excel表格汇总工具

Python 手搓工具
recommend-type

2021教师网络课程研修总结3篇.doc

2021教师网络课程研修总结3篇.doc
recommend-type

2022CAD在工程制图课程中的应用.docx

2022CAD在工程制图课程中的应用.docx
recommend-type

2022IoT项目如何选择正确的软件架构.docx

2022IoT项目如何选择正确的软件架构.docx
recommend-type

ChmDecompiler 3.60:批量恢复CHM电子书源文件工具

### 知识点详细说明 #### 标题说明 1. **Chm电子书批量反编译器(ChmDecompiler) 3.60**: 这里提到的是一个软件工具的名称及其版本号。软件的主要功能是批量反编译CHM格式的电子书。CHM格式是微软编译的HTML文件格式,常用于Windows平台下的帮助文档或电子书。版本号3.60说明这是该软件的一个更新的版本,可能包含改进的新功能或性能提升。 #### 描述说明 2. **专门用来反编译CHM电子书源文件的工具软件**: 这里解释了该软件的主要作用,即用于解析CHM文件,提取其中包含的原始资源,如网页、文本、图片等。反编译是一个逆向工程的过程,目的是为了将编译后的文件还原至其原始形态。 3. **迅速地释放包括在CHM电子书里面的全部源文件**: 描述了软件的快速处理能力,能够迅速地将CHM文件中的所有资源提取出来。 4. **恢复源文件的全部目录结构及文件名**: 这说明软件在提取资源的同时,会尝试保留这些资源在原CHM文件中的目录结构和文件命名规则,以便用户能够识别和利用这些资源。 5. **完美重建.HHP工程文件**: HHP文件是CHM文件的项目文件,包含了编译CHM文件所需的所有元数据和结构信息。软件可以重建这些文件,使用户在提取资源之后能够重新编译CHM文件,保持原有的文件设置。 6. **多种反编译方式供用户选择**: 提供了不同的反编译选项,用户可以根据需要选择只提取某些特定文件或目录,或者提取全部内容。 7. **支持批量操作**: 在软件的注册版本中,可以进行批量反编译操作,即同时对多个CHM文件执行反编译过程,提高了效率。 8. **作为CHM电子书的阅读器**: 软件还具有阅读CHM电子书的功能,这是一个附加特点,允许用户在阅读过程中直接提取所需的文件。 9. **与资源管理器无缝整合**: 表明ChmDecompiler能够与Windows的资源管理器集成,使得用户可以在资源管理器中直接使用该软件的功能,无需单独启动程序。 #### 标签说明 10. **Chm电子书批量反编译器**: 这是软件的简短标签,用于标识软件的功能类型和目的,即批量反编译CHM电子书。 #### 文件名称列表说明 11. **etextwizard.cdsetup.exe**: 这是一个安装程序的文件名,带有.exe扩展名,表明它是一个可执行文件。这可能是用户安装ChmDecompiler软件的安装包。 12. **说明_Readme.html**: 这是一个包含说明文档的HTML文件,通常包含软件的安装指南、使用方法、常见问题解答等。用户应该在安装或使用软件之前仔细阅读该文档。 综合来看,ChmDecompiler是一款功能强大的工具软件,它可以处理CHM电子书的反编译需求,支持多种反编译方式,同时提供方便的用户界面和功能集成,极大地降低了用户进行电子书资料恢复或二次编辑的难度。此外,软件的安装程序和说明文档也遵循了行业标准,方便用户使用和理解。
recommend-type

【数据融合技术】:甘肃土壤类型空间分析中的专业性应用

# 摘要 数据融合技术作为一种集成多源数据信息的方法,在土壤类型空间分析中发挥着关键作用。本文介绍了数据融合技术的基本概念及其理论基础,阐述了数据预处理、同步整合及冲突解决等关键技术,并详细描述了甘肃土壤类型数据准备的流程,包括数据采集、质量评估、空间化处理及融合实践准备。通过具体案例分析,展示了数据融合在土壤类型空间分布分析、土壤质量评估及土壤保护规划中的应用。同时,文
recommend-type

redistemplate.opsForValue()返回值

<think>嗯,用户想知道RedisTemplate.opsForValue()方法的返回值类型。首先,我需要回忆一下Spring Data Redis的相关知识。记得RedisTemplate提供了不同数据结构的操作类,比如opsForValue对应字符串类型。opsForValue()方法返回的是一个ValueOperations对象,这个对象负责操作字符串类型的数据。 接下来,我需要确认返回类型的具体信息。根据官方文档,ValueOperations是一个接口,它定义了set、get等方法。当用户调用RedisTemplate.opsForValue()时,实际上会返回一个实现该接口
recommend-type

ktorrent 2.2.4版本Linux客户端发布

标题:“ktorrent”指的是一个流行的BitTorrent客户端软件,通常运行在类Unix操作系统上,特别是在Linux系统中。BitTorrent是一种点对点(P2P)文件共享协议,它允许用户之间共享文件,并且使用一种高效的“分片”下载技术,这意味着用户可以从许多其他用户那里同时下载文件的不同部分,从而加快下载速度并减少对单一源服务器的压力。 描述:提供的描述部分仅包含了重复的文件名“ktorrent-2.2.4.tar.gz”,这实际上表明了该信息是关于特定版本的ktorrent软件包,即版本2.2.4。它以.tar.gz格式提供,这是一种常见的压缩包格式,通常用于Unix-like系统中。在Linux环境下,tar是一个用于打包文件的工具,而.gz后缀表示文件已经被gzip压缩。用户需要先解压缩.tar.gz文件,然后才能安装软件。 标签:“ktorrent,linux”指的是该软件包是专为Linux操作系统设计的。标签还提示用户ktorrent可以在Linux环境下运行。 压缩包子文件的文件名称列表:这里提供了一个文件名“ktorrent-2.2.4”,该文件可能是从互联网上下载的,用于安装ktorrent版本2.2.4。 关于ktorrent软件的详细知识点: 1. 客户端功能:ktorrent提供了BitTorrent协议的完整实现,用户可以通过该客户端来下载和上传文件。它支持创建和管理种子文件(.torrent),并可以从其他用户那里下载大型文件。 2. 兼容性:ktorrent设计上与KDE桌面环境高度兼容,因为它是用C++和Qt框架编写的,但它也能在非KDE的其他Linux桌面环境中运行。 3. 功能特点:ktorrent提供了多样的配置选项,比如设置上传下载速度限制、选择存储下载文件的目录、设置连接数限制、自动下载种子包内的多个文件等。 4. 用户界面:ktorrent拥有一个直观的图形用户界面(GUI),使得用户可以轻松地管理下载任务,包括启动、停止、暂停以及查看各种统计数据,如下载速度、上传速度、完成百分比等。 5. 插件系统:ktorrent支持插件系统,因此用户可以扩展其功能,比如添加RSS订阅支持、自动下载和种子管理等。 6. 多平台支持:虽然ktorrent是为Linux系统设计的,但有一些类似功能的软件可以在不同的操作系统上运行,比如Windows和macOS。 7. 社区支持:ktorrent拥有活跃的社区,经常更新和改进软件。社区提供的支持包括论坛、文档以及bug跟踪。 安装和配置ktorrent的步骤大致如下: - 首先,用户需要下载相应的.tar.gz压缩包文件。 - 然后,使用终端命令解压该文件。通常使用命令“tar xzvf ktorrent-2.2.4.tar.gz”。 - 解压后,用户进入解压得到的目录并可能需要运行“qmake”来生成Makefile文件。 - 接着,使用“make”命令进行编译。 - 最后,通过“make install”命令安装软件。某些情况下可能需要管理员权限。 在编译过程中,用户可以根据自己的需求配置编译选项,比如选择安装路径、包含特定功能等。在Linux系统中,安装和配置过程可能会因发行版而异,有些发行版可能通过其包管理器直接提供对ktorrent的安装支持。
recommend-type

【空间分布规律】:甘肃土壤类型与农业生产的关联性研究

# 摘要 本文对甘肃土壤类型及其在农业生产中的作用进行了系统性研究。首先概述了甘肃土壤类型的基础理论,并探讨了土壤类型与农业生产的理论联系。通过GIS技术分析,本文详细阐述了甘肃土壤的空间分布规律,并对其特征和影响因素进行了深入分析。此外,本文还研究了甘肃土壤类型对农业生产实际影响,包括不同区域土壤改良和作物种植案例,以及土壤养分、水分管理对作物生长周期和产量的具体影响。最后,提出了促进甘肃土壤与农业可持续发展的策略,包括土壤保护、退化防治对策以及土壤类型优化与农业创新的结合。本文旨在为