feat: 心跳包新增固件版本号字段,更新协议文档
This commit is contained in:
@ -48,6 +48,32 @@ extern "C" {
|
|||||||
/* Exported macro ------------------------------------------------------------*/
|
/* Exported macro ------------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN EM */
|
/* USER CODE BEGIN EM */
|
||||||
|
|
||||||
|
// 基准年份
|
||||||
|
#define XTELL_BASE_YEAR 2026
|
||||||
|
/**
|
||||||
|
* 宏定义:3-4-5-4 固件版本编码
|
||||||
|
* y: Year (2026-2033)
|
||||||
|
* m: Month (1-12)
|
||||||
|
* d: Day (1-31)
|
||||||
|
* b: Build (0-15)
|
||||||
|
*/
|
||||||
|
#define MAKE_XTELL_CODE(y, m, d, b) ( \
|
||||||
|
((( (y) - XTELL_BASE_YEAR ) & 0x07) << 13) | \
|
||||||
|
(((m) & 0x0F) << 9) | \
|
||||||
|
(((d) & 0x1F) << 4) | \
|
||||||
|
(((b) & 0x0F) << 0) \
|
||||||
|
)
|
||||||
|
|
||||||
|
// 举例:2026年3月19日,第10次编译 (b=9)
|
||||||
|
// 计算过程: (0 << 13) | (3 << 9) | (19 << 4) | 9 = 0x0600 | 0x0130 | 0x0009
|
||||||
|
#define XTELL_FIRMWARE_CODE MAKE_XTELL_CODE(2026, 5, 10, 1)
|
||||||
|
// ---- - -- -
|
||||||
|
// | | | |
|
||||||
|
// | | | 编译次数
|
||||||
|
// | | 日
|
||||||
|
// | 月
|
||||||
|
// 年
|
||||||
|
|
||||||
#ifndef USE_W5500
|
#ifndef USE_W5500
|
||||||
#define USE_W5500 1 /* 默认启用W5500以太网模块 */
|
#define USE_W5500 1 /* 默认启用W5500以太网模块 */
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
/* Modbus TCP 配置 */
|
/* Modbus TCP 配置 */
|
||||||
#if TEST_A701
|
#if TEST_A701
|
||||||
#define MODBUS_SERVER_IP {192, 168, 6, 4} /* A701 测试服务器 */
|
#define MODBUS_SERVER_IP {192, 168, 0, 6} /* A701 测试服务器 */
|
||||||
#else
|
#else
|
||||||
#define MODBUS_SERVER_IP {192, 168, 0, 1} /* 现场生产服务器 */
|
#define MODBUS_SERVER_IP {192, 168, 0, 1} /* 现场生产服务器 */
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -388,21 +388,35 @@ 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[5]; // 扩充为 5 字节
|
uint8_t hb_payload[7];
|
||||||
hb_payload[0] = IO_Monitor_GetAllStates();
|
uint8_t io_state = IO_Monitor_GetAllStates();
|
||||||
hb_payload[1] = (uint8_t)(g_hb_seq >> 8);
|
|
||||||
hb_payload[2] = (uint8_t)(g_hb_seq & 0xFF);
|
|
||||||
|
|
||||||
uint16_t modbus_val = 0xFFFF; // 默认值
|
|
||||||
#if USE_W5500
|
#if USE_W5500
|
||||||
modbus_val = ModbusTCP_Get_LastRegVal(); // 获取最新 Modbus 寄存器值
|
uint8_t phy_link_status;
|
||||||
|
ctlwizchip(CW_GET_PHYLINK, (void *)&phy_link_status);
|
||||||
|
if (phy_link_status == PHY_LINK_ON) {
|
||||||
|
io_state |= 0x80;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
hb_payload[3] = (uint8_t)(modbus_val >> 8);
|
|
||||||
hb_payload[4] = (uint8_t)(modbus_val & 0xFF);
|
hb_payload[0] = (uint8_t)(g_hb_seq >> 8);
|
||||||
|
hb_payload[1] = (uint8_t)(g_hb_seq & 0xFF);
|
||||||
|
|
||||||
|
hb_payload[2] = (uint8_t)(XTELL_FIRMWARE_CODE >> 8);
|
||||||
|
hb_payload[3] = (uint8_t)(XTELL_FIRMWARE_CODE & 0xFF);
|
||||||
|
|
||||||
|
hb_payload[4] = io_state;
|
||||||
|
|
||||||
|
uint16_t modbus_val = 0xFFFF;
|
||||||
|
#if USE_W5500
|
||||||
|
modbus_val = ModbusTCP_Get_LastRegVal();
|
||||||
|
#endif
|
||||||
|
hb_payload[5] = (uint8_t)(modbus_val >> 8);
|
||||||
|
hb_payload[6] = (uint8_t)(modbus_val & 0xFF);
|
||||||
|
|
||||||
g_hb_seq++;
|
g_hb_seq++;
|
||||||
|
|
||||||
RF433_SendPacket(PROTO_TYPE_HB, hb_payload, 5); // 发送 5 字节
|
RF433_SendPacket(PROTO_TYPE_HB, hb_payload, sizeof(hb_payload));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@ -18,8 +18,8 @@
|
|||||||
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, 212},
|
.ip = {192, 168, 0, 212},
|
||||||
.gw = {192, 168, 6, 1},
|
.gw = {192, 168, 0, 1},
|
||||||
#else
|
#else
|
||||||
.ip = {192, 168, 0, 5},
|
.ip = {192, 168, 0, 5},
|
||||||
.gw = {192, 168, 0, 1},
|
.gw = {192, 168, 0, 1},
|
||||||
|
|||||||
41
docs/报文.md
41
docs/报文.md
@ -68,26 +68,41 @@ AA 55 LEN ID [DATA] SUM
|
|||||||
```
|
```
|
||||||
|
|
||||||
### 2.4 系统心跳包 (30秒/次)
|
### 2.4 系统心跳包 (30秒/次)
|
||||||
系统定时上报当前存活状态,包含当前的 I/O 状态及防丢包序列号。
|
系统定时上报当前存活状态,包含当前的 I/O 状态、防丢包序列号、固件版本及 Modbus 寄存器值。
|
||||||
|
|
||||||
|
#### 2.4.1 标准心跳包 (8字节Payload)
|
||||||
|
|
||||||
```text
|
```text
|
||||||
AA AA 05 ID [IO] [SEQ_H] [SEQ_L] SUM
|
AA AA 09 [DEVICE_ID] [SEQ_H] [SEQ_L] [FW_H] [FW_L] [IO_STATUS] [MODBUS_H] [MODBUS_L] SUM
|
||||||
-- -- -- -- ---- ------- ------- ---
|
-- -- -- ----------- --------------- ------------- ----------- --------------------- ---
|
||||||
| | | | | | | |
|
| | | | | | | | |
|
||||||
| | | | | | | +-- 校验和
|
| | | | | | | | +-- 1字节 校验和
|
||||||
| | | | | +-------+-------- 2字节序列号 (0-65535, 循环自增)
|
| | | | | | | +-------------------- 2字节 Modbus 寄存器值
|
||||||
| | | | +----------------------- 当前 4 路 I/O 状态位
|
| | | | | | +------------------------------------- 1字节 I/O 状态
|
||||||
| | | +---------------------------- 本机设备 ID
|
| | | | | | Bit7: W5500 网线连接状态
|
||||||
| | +-------------------------------- 长度固定为 0x05 (ID + 3字节Payload + SUM)
|
| | | | | | Bit3-Bit0: 4路 DI 状态
|
||||||
| +------------------------------------ 类型标识:0xAA (Heartbeat)
|
| | | | | +--------------------------------------------------- 2字节序列号
|
||||||
+---------------------------------------- 固定起始符
|
| | | | +------------------------------------------------------------------ 2字节固件版本编码
|
||||||
|
| | | +----------------------------------------------------------------------------------- 1字节本机设备 ID
|
||||||
|
| | +--------------------------------------------------------------------------------------------- 长度 0x09,后续的总字节数
|
||||||
|
| +------------------------------------------------------------------------------------------------- 类型 0xAA
|
||||||
|
+----------------------------------------------------------------------------------------------------- 固定起始符
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Payload 字段说明:**
|
||||||
|
| 字段 | 长度 | 说明 |
|
||||||
|
|------|------|------|
|
||||||
|
| SEQ_H, SEQ_L | 2 | 2字节序列号 (0-65535, 循环自增) |
|
||||||
|
| FW_H, FW_L | 2 | 2字节固件版本编码 (MAKE_XTELL_CODE 宏定义) |
|
||||||
|
| DEVICE_ID | 1 | 本机设备 ID (MY_DEVICE_ID) |
|
||||||
|
| IO_STATUS | 1 | 1字节 I/O 状态 |
|
||||||
|
| MODBUS_H, MODBUS_L | 2 | 2字节 Modbus 寄存器值 (最新读取值) |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 3. 示例说明 (假设 Device ID = 0x01)
|
## 3. 示例说明 (假设 Device ID = 0x01)
|
||||||
|
|
||||||
* **心跳包示例**:`AA AA 04 01 0F 00 05 72`
|
* **心跳包示例**:`AA AA 08 01 00 05 06 41 01 0F 01 2C 5A`
|
||||||
* 表示:ID为1的设备,I/O全为高,序列号为5。
|
* 表示:ID为1的设备,序列号5,固件版本 0x0641 (2026年5月10日第1次编译),本机ID=1,I/O全高,Modbus=0x012C (300)(8字节payload)
|
||||||
* **485透传示例**:`AA 48 05 01 41 42 43 44 4D`
|
* **485透传示例**:`AA 48 05 01 41 42 43 44 4D`
|
||||||
* 表示:ID为1的设备,转发了 485 数据 "ABCD" (长度 4+1=5)。
|
* 表示:ID为1的设备,转发了 485 数据 "ABCD" (长度 4+1=5)。
|
||||||
|
|||||||
Reference in New Issue
Block a user