153 lines
5.1 KiB
Markdown
153 lines
5.1 KiB
Markdown
# 旋光仪Modbus通信协议实现
|
||
|
||
## 概述
|
||
本目录包含基于nanomodbus库实现的旋光仪Modbus通信协议代码。该实现完全遵循`旋光仪Modbus通信协议规范.md`中的定义,提供了完整的寄存器映射、命令处理和数据同步功能。
|
||
|
||
## 文件结构
|
||
```
|
||
mb_hmi/
|
||
├── mb_regs_def.h # 寄存器地址和命令码定义
|
||
├── mb_command.h # 命令处理模块头文件
|
||
├── mb_command.c # 命令处理模块实现
|
||
├── mb_server.h # Modbus服务器模块头文件
|
||
├── mb_server.c # Modbus服务器模块实现
|
||
├── mb_interface.h # 用户接口头文件
|
||
├── mb_interface.c # 用户接口实现
|
||
└── CMakeLists.txt # 构建配置文件
|
||
```
|
||
|
||
## 主要功能
|
||
|
||
### 1. 寄存器映射
|
||
- 保持寄存器 (3xxxx):可读写参数,如控制命令、测量模式、目标温度等
|
||
- 输入寄存器 (4xxxx):只读数据,如实时温度、旋光度、测量结果等
|
||
|
||
### 2. 命令处理
|
||
- 系统控制命令:设备初始化、开始/停止测量、数据清零、开始/停止控温
|
||
- 参数设置:测量模式、目标温度、旋光管长度、测量精度、自动测量次数
|
||
- 数据查询:实时数据、测量结果、设备状态、历史数据
|
||
|
||
### 3. 用户接口
|
||
提供了丰富的接口函数,方便用户与Modbus模块交互:
|
||
|
||
#### 数据写入接口
|
||
- `mb_write_current_temp(float temp)`: 写入当前温度数据
|
||
- `mb_write_current_rotation(float rotation)`: 写入当前旋光度数据
|
||
- `mb_write_measurement_result(uint8_t mode, float value, float temp)`: 写入测量结果
|
||
|
||
#### 参数获取接口
|
||
- `mb_get_target_temp()`: 获取目标温度设置
|
||
- `mb_get_tube_length()`: 获取旋光管长度设置
|
||
- `mb_get_measure_mode()`: 获取测量模式
|
||
- `mb_get_auto_measure_count()`: 获取自动测量次数
|
||
- `mb_get_running_state()`: 获取运行状态
|
||
- `mb_is_measure_complete()`: 检查测量是否完成
|
||
|
||
## 用户需要实现的部分
|
||
|
||
### 1. 硬件初始化操作
|
||
在`system_ctrl_cmd_handler`函数中,需要实现设备初始化的具体逻辑:
|
||
```c
|
||
case 0x0001: // 设备初始化
|
||
// TODO: 用户需要实现硬件初始化操作(如传感器、外设复位)
|
||
...
|
||
```
|
||
|
||
### 2. 测量流程控制
|
||
在`system_ctrl_cmd_handler`函数中,需要实现开始/停止测量的具体逻辑:
|
||
```c
|
||
case 0x0002: // 开始测量
|
||
// TODO: 用户需要实现启动测量流程(控制测量模块)
|
||
...
|
||
case 0x0003: // 停止测量
|
||
// TODO: 用户需要实现停止测量流程
|
||
...
|
||
```
|
||
|
||
### 3. 温度控制功能
|
||
在`system_ctrl_cmd_handler`函数中,需要实现温度控制的具体逻辑:
|
||
```c
|
||
case 0x0005: // 开始控温
|
||
// TODO: 用户需要实现启动温度控制模块
|
||
...
|
||
case 0x0006: // 停止控温
|
||
// TODO: 用户需要实现停止温度控制模块
|
||
...
|
||
```
|
||
|
||
### 4. 历史数据时间戳
|
||
在`mb_save_to_history`函数中,需要实现真实的时间戳获取:
|
||
```c
|
||
uint32_t timestamp = 0; // TODO: User needs to implement actual timestamp
|
||
```
|
||
|
||
### 5. 数据清零操作
|
||
在`system_ctrl_cmd_handler`函数中,需要完善数据清零的具体逻辑:
|
||
```c
|
||
case 0x0004: // 数据清零
|
||
// TODO: 用户需要实现清除测量数据
|
||
...
|
||
```
|
||
|
||
## 数据同步机制
|
||
系统提供了自动的数据同步机制,当用户通过接口函数写入数据后,相应的Modbus寄存器会自动更新。主要的同步函数包括:
|
||
|
||
- `mb_sync_realtime_temp()`: 同步实时温度数据
|
||
- `mb_sync_realtime_rotation()`: 同步实时旋光度数据
|
||
- `mb_sync_result()`: 同步测量结果数据
|
||
- `mb_sync_running_status_reg()`: 同步设备状态
|
||
- `mb_sync_exception_reg()`: 同步报警状态
|
||
- `mb_sync_running_state()`: 同步运行状态
|
||
|
||
## 使用示例
|
||
|
||
### 初始化Modbus系统
|
||
```c
|
||
#include "hmi_server.h"
|
||
|
||
int main(void)
|
||
{
|
||
// 初始化Modbus服务器
|
||
if (hmi_server_init() != 0) {
|
||
// 初始化失败处理
|
||
return -1;
|
||
}
|
||
|
||
// 主循环
|
||
while (1) {
|
||
// 应用程序代码
|
||
|
||
// 写入当前温度示例
|
||
float current_temp = 25.5; // 假设从传感器读取的温度
|
||
mb_write_current_temp(current_temp);
|
||
|
||
// 写入测量结果示例
|
||
if (measurement_done) {
|
||
uint8_t mode = 0; // 旋光度模式
|
||
float value = 1.69; // 测量值
|
||
float temp_at_meas = 25.5; // 测量时的温度
|
||
mb_write_measurement_result(mode, value, temp_at_meas);
|
||
}
|
||
|
||
// 检查Modbus设置的参数示例
|
||
float target_temp = mb_get_target_temp();
|
||
if (target_temp != current_temp_setpoint) {
|
||
// 更新温度控制目标
|
||
current_temp_setpoint = target_temp;
|
||
// 调整温度控制...
|
||
}
|
||
|
||
// 延时或其他操作
|
||
...
|
||
}
|
||
}
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
1. 所有函数和变量命名遵循小写+下划线的代码风格
|
||
2. 温度范围限制为-10℃到100℃
|
||
3. 旋光管长度必须大于0
|
||
4. 自动测量次数范围为1-255
|
||
5. 历史数据最多存储4组
|
||
6. 浮点数传输采用大端模式(高16位在前,低16位在后) |