# 旋光仪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位在后）