5.1 KiB
5.1 KiB
旋光仪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
函数中,需要实现设备初始化的具体逻辑:
case 0x0001: // 设备初始化
// TODO: 用户需要实现硬件初始化操作(如传感器、外设复位)
...
2. 测量流程控制
在system_ctrl_cmd_handler
函数中,需要实现开始/停止测量的具体逻辑:
case 0x0002: // 开始测量
// TODO: 用户需要实现启动测量流程(控制测量模块)
...
case 0x0003: // 停止测量
// TODO: 用户需要实现停止测量流程
...
3. 温度控制功能
在system_ctrl_cmd_handler
函数中,需要实现温度控制的具体逻辑:
case 0x0005: // 开始控温
// TODO: 用户需要实现启动温度控制模块
...
case 0x0006: // 停止控温
// TODO: 用户需要实现停止温度控制模块
...
4. 历史数据时间戳
在mb_save_to_history
函数中,需要实现真实的时间戳获取:
uint32_t timestamp = 0; // TODO: User needs to implement actual timestamp
5. 数据清零操作
在system_ctrl_cmd_handler
函数中,需要完善数据清零的具体逻辑:
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系统
#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;
// 调整温度控制...
}
// 延时或其他操作
...
}
}
注意事项
- 所有函数和变量命名遵循小写+下划线的代码风格
- 温度范围限制为-10℃到100℃
- 旋光管长度必须大于0
- 自动测量次数范围为1-255
- 历史数据最多存储4组
- 浮点数传输采用大端模式(高16位在前,低16位在后)