初步测试OK

This commit is contained in:
edisondeng
2026-05-10 08:57:34 +08:00
parent ee67076ec7
commit 485fb32a72
7 changed files with 4343 additions and 4263 deletions

View File

@ -73,7 +73,7 @@ extern "C" {
🚀 核心身份标识:烧录不同设备时,请务必修改这个数字! 🚀 核心身份标识:烧录不同设备时,请务必修改这个数字!
比如设备A烧录时改为 0x01设备B烧录时改为 0x02 比如设备A烧录时改为 0x01设备B烧录时改为 0x02
========================================================= */ ========================================================= */
#define MY_DEVICE_ID 0x02 #define MY_DEVICE_ID 101
/* ========================================================= /* =========================================================
🚀 开发调试开关 🚀 开发调试开关

View File

@ -32,7 +32,6 @@ typedef enum {
MODBUS_STATE_CONNECTING, MODBUS_STATE_CONNECTING,
MODBUS_STATE_SEND_QUERY, MODBUS_STATE_SEND_QUERY,
MODBUS_STATE_WAIT_RESPONSE, MODBUS_STATE_WAIT_RESPONSE,
MODBUS_STATE_PROCESS_DATA,
MODBUS_STATE_ERROR_RETRY MODBUS_STATE_ERROR_RETRY
} modbus_client_state_t; } modbus_client_state_t;
@ -47,4 +46,10 @@ void ModbusTCP_Client_Init(uint8_t sn);
*/ */
void ModbusTCP_Client_Task(void); void ModbusTCP_Client_Task(void);
/**
* @brief 获取最新成功读取的 Modbus 寄存器值
* @retval 16位寄存器值 (未读到时默认返回 0xFFFF)
*/
uint16_t ModbusTCP_Get_LastRegVal(void);
#endif #endif

View File

@ -388,13 +388,21 @@ int main(void)
#if USE_IO_MONITOR #if USE_IO_MONITOR
if (HAL_GetTick() - g_last_hb_tick >= 30000) { if (HAL_GetTick() - g_last_hb_tick >= 30000) {
g_last_hb_tick = HAL_GetTick(); g_last_hb_tick = HAL_GetTick();
uint8_t hb_payload[3]; uint8_t hb_payload[5]; // 扩充为 5 字节
hb_payload[0] = IO_Monitor_GetAllStates(); hb_payload[0] = IO_Monitor_GetAllStates();
hb_payload[1] = (uint8_t)(g_hb_seq >> 8); hb_payload[1] = (uint8_t)(g_hb_seq >> 8);
hb_payload[2] = (uint8_t)(g_hb_seq & 0xFF); hb_payload[2] = (uint8_t)(g_hb_seq & 0xFF);
uint16_t modbus_val = 0xFFFF; // 默认值
#if USE_W5500
modbus_val = ModbusTCP_Get_LastRegVal(); // 获取最新 Modbus 寄存器值
#endif
hb_payload[3] = (uint8_t)(modbus_val >> 8);
hb_payload[4] = (uint8_t)(modbus_val & 0xFF);
g_hb_seq++; g_hb_seq++;
RF433_SendPacket(PROTO_TYPE_HB, hb_payload, 3); RF433_SendPacket(PROTO_TYPE_HB, hb_payload, 5); // 发送 5 字节
} }
#endif #endif

View File

@ -18,6 +18,14 @@ static modbus_client_state_t g_state = MODBUS_STATE_IDLE;
static uint32_t g_last_tick = 0; static uint32_t g_last_tick = 0;
static uint16_t g_transaction_id = 0; static uint16_t g_transaction_id = 0;
/* 保存最新的寄存器值,用于心跳上报和变化检测 */
static uint16_t s_last_reg_val = 0xFFFF;
uint16_t ModbusTCP_Get_LastRegVal(void)
{
return s_last_reg_val;
}
/* 服务器信息 */ /* 服务器信息 */
static uint8_t dest_ip[4] = MODBUS_SERVER_IP; static uint8_t dest_ip[4] = MODBUS_SERVER_IP;
static uint16_t dest_port = MODBUS_SERVER_PORT; static uint16_t dest_port = MODBUS_SERVER_PORT;
@ -134,37 +142,36 @@ void ModbusTCP_Client_Task(void)
break; break;
case MODBUS_STATE_WAIT_RESPONSE: // 等待响应状态 case MODBUS_STATE_WAIT_RESPONSE: // 等待响应状态
if ((len = getSn_RX_RSR(g_sn)) > 0) { // 检查是否有数据到达 len = getSn_RX_RSR(g_sn);
if (len >= 9) { // 至少需要 9 字节 (MBAP 头 7 字节 + PDU 至少 2 字节)
if (len > sizeof(tmp_buf)) len = sizeof(tmp_buf); // 防止缓存溢出 if (len > sizeof(tmp_buf)) len = sizeof(tmp_buf); // 防止缓存溢出
ret = recv(g_sn, tmp_buf, len); // 接收数据 ret = recv(g_sn, tmp_buf, len); // 接收数据
if (ret > 0) { // 接收成功
g_state = MODBUS_STATE_PROCESS_DATA; // 切换到处理数据状态
}
} else if (HAL_GetTick() - g_last_tick > 3000) { // 等待超时 (3秒)
LOG_WARN("MODBUS", "Response timeout");
close(g_sn); // 关闭连接
g_state = MODBUS_STATE_IDLE; // 返回空闲重试
}
break;
case MODBUS_STATE_PROCESS_DATA: // 处理数据状态
/* 校验响应 (检查 MBAP 长度、功能码等) */ /* 校验响应 (检查 MBAP 长度、功能码等) */
if (len >= 9 && tmp_buf[7] == 0x03) { // 基本校验 if (ret >= 9 && tmp_buf[7] == 0x03) { // 基本校验
uint16_t reg_val = (tmp_buf[9] << 8) | tmp_buf[10]; // 提取寄存器值 uint16_t reg_val = (tmp_buf[9] << 8) | tmp_buf[10]; // 提取寄存器值
LOG_INFO("MODBUS", "Read Register %d OK: 0x%04X", TARGET_REG_ADDR + 40001, reg_val); LOG_INFO("MODBUS", "Read Register %d OK: 0x%04X", TARGET_REG_ADDR + 40001, reg_val);
/* 🚀 关键步骤:通过 433 无线转发结果 */ /* 如果检测到寄存器值发生变化,才通过 433 无线立即发送 */
if (reg_val != s_last_reg_val) {
s_last_reg_val = reg_val; // 更新缓存的值
uint8_t payload[2]; // 构造 433 负载 uint8_t payload[2]; // 构造 433 负载
payload[0] = tmp_buf[9]; // 寄存器高位 payload[0] = tmp_buf[9]; // 寄存器高位
payload[1] = tmp_buf[10]; // 寄存器低位 payload[1] = tmp_buf[10]; // 寄存器低位
RF433_SendPacket(PROTO_TYPE_NET, payload, 2); // 打包并通过无线发出 RF433_SendPacket(PROTO_TYPE_NET, payload, 2); // 打包并通过无线发出
LOG_INFO("MODBUS", "Value changed, sent over 433");
g_state = MODBUS_STATE_IDLE; // 处理完成,返回空闲 }
g_last_tick = HAL_GetTick(); // 记录本次完成时间
} else { // 响应格式非法 } else { // 响应格式非法
LOG_ERROR("MODBUS", "Invalid response format"); LOG_ERROR("MODBUS", "Invalid response format");
}
g_state = MODBUS_STATE_IDLE; // 返回空闲 g_state = MODBUS_STATE_IDLE; // 返回空闲
g_last_tick = HAL_GetTick(); // 更新计时 g_last_tick = HAL_GetTick(); // 更新计时
} else if (HAL_GetTick() - g_last_tick > 3000) { // 等待超时 (3秒)
LOG_WARN("MODBUS", "Response timeout");
close(g_sn); // 关闭连接
g_state = MODBUS_STATE_IDLE; // 返回空闲重试
} }
break; break;

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -18,7 +18,7 @@
wiz_NetInfo default_net_info = { wiz_NetInfo default_net_info = {
.mac = {0x00, 0x08, 0xdc, 0x12, 0x22, 0x12}, .mac = {0x00, 0x08, 0xdc, 0x12, 0x22, 0x12},
#if TEST_A701 #if TEST_A701
.ip = {192, 168, 6, 7}, .ip = {192, 168, 6, 212},
.gw = {192, 168, 6, 1}, .gw = {192, 168, 6, 1},
#else #else
.ip = {192, 168, 0, 5}, .ip = {192, 168, 0, 5},