fix: 修复电子负载通信相关问题并优化批量发送逻辑

1. 修改apps/chrg/applications/utils/chrg_eload.c:移除idx为0时的LCD显示条件代码,修复文件末尾换行缺失
2. 修改apps/chrg/applications/thread/chrg_comm.c:移除冗余的全局指针变量,优化调试打印信息
3. 修改apps/chrg/applications/thread/chrg_roll_sou.c:新增电流命令覆盖逻辑,优化线程接收超时配置,移除不必要的延时
This commit is contained in:
yhf
2026-07-19 15:37:54 +08:00
parent b68ffe3bf3
commit 2ba4fc16b7
3 changed files with 2 additions and 375 deletions
+1 -3
View File
@@ -537,8 +537,6 @@ eMBException funcReadHoldingRegister (rt_uint8_t *reqFrame, rt_uint16_t reqLen,
rt_uint8_t *resFrame, rt_uint16_t *resLen) rt_uint8_t *resFrame, rt_uint16_t *resLen)
{ {
rt_uint16_t regAddress = 0, cntReg = 0; rt_uint16_t regAddress = 0, cntReg = 0;
struct chrg_north_t *pNOR = &chrgnorth;
struct chrg_switch_t *pSW = &pNOR->sw[0];
eMBException eStatus = MB_EX_NONE; eMBException eStatus = MB_EX_NONE;
eMBErrorCode eRegStatus; eMBErrorCode eRegStatus;
@@ -562,7 +560,7 @@ eMBException funcReadHoldingRegister (rt_uint8_t *reqFrame, rt_uint16_t reqLen,
} else { } else {
*resLen = 3+cntReg * 2; *resLen = 3+cntReg * 2;
} }
rt_kprintf("------COM VOLT =%d -------\n------COM CURR =%d-------", pSW->Now_voltage,pSW->Now_current); rt_kprintf("------COM READ addr=%d count=%d-------\n", regAddress, cntReg);
return eStatus; return eStatus;
} }
@@ -1,373 +1,3 @@
// /****************************************************************************
// 文件名称 : chrg_roll_sou.c
// 完成日期 :
// 当前版本号 : V1.0
// 主要功能 : 实现南向通信轮巡请求命令。以独立线程处理。
// 版本历史 : 创建原始版本
// 说明 :
// ******************************************************************************/
// #include <stdlib.h>
// #include <string.h>
// #include <rtthread.h>
// #include "chrg_def.h"
// #include "chrg_led.h"
// #include "chrg_thread.h"
// #include "chrg_roll_sou.h"
// #include "chrg_eload.h"
// #include "chrg_utils.h"
// #define LOG_TAG "chrg.rollsou"
// #include <rtdbg.h>
// struct chrg_rollsou_t chrgrollsou = {
// .run = RUN_AUTO,
// .ch = IDX_SOU_CH1,
// .part = MB_R_PART1,
// .mode = 0,
// };
// #define SOU_CMD_QUEUE_SIZE 4
// struct chrg_sou_cmd_t {
// eIDX_SOU_CH ch;
// rt_uint16_t reg;
// rt_uint16_t value;
// };
// static struct chrg_sou_cmd_t sou_cmd_queue[SOU_CMD_QUEUE_SIZE];
// static rt_uint8_t sou_cmd_head = 0;
// static rt_uint8_t sou_cmd_tail = 0;
// static rt_uint8_t sou_cmd_count = 0;
// static void sou_cmd_enqueue(eIDX_SOU_CH ch, rt_uint16_t reg, rt_uint16_t value)
// {
// if (sou_cmd_count < SOU_CMD_QUEUE_SIZE) {
// sou_cmd_queue[sou_cmd_tail].ch = ch;
// sou_cmd_queue[sou_cmd_tail].reg = reg;
// sou_cmd_queue[sou_cmd_tail].value = value;
// sou_cmd_tail = (sou_cmd_tail + 1) % SOU_CMD_QUEUE_SIZE;
// sou_cmd_count++;
// } else {
// LOG_W("sou command queue full, drop command\n");
// }
// }
// static int sou_cmd_dequeue(struct chrg_sou_cmd_t *cmd)
// {
// if (sou_cmd_count == 0) {
// return -1;
// }
// cmd->ch = sou_cmd_queue[sou_cmd_head].ch;
// cmd->reg = sou_cmd_queue[sou_cmd_head].reg;
// cmd->value = sou_cmd_queue[sou_cmd_head].value;
// sou_cmd_head = (sou_cmd_head + 1) % SOU_CMD_QUEUE_SIZE;
// sou_cmd_count--;
// return 0;
// }
// static int sou_cmd_exists(void)
// {
// return sou_cmd_count > 0;
// }
// /*****************************************************************
// 函数名称: chrg_set_sou_reg
// 函数描述: 南向通道设置寄存器请求命令
// 输入参数: idx:通道 reg:寄存器地址 value:寄存器值
// 输出参数: -
// 返回说明: -
// 其它说明: -
// *****************************************************************/
// void chrg_set_sou_reg (eIDX_SOU_CH idx, rt_uint16_t reg, rt_uint16_t value)
// {
// struct chrg_thread_t *pTHR = &chrgthr[IDX_THR_ROLL_SOU];
// struct chrg_rollsou_t *pROLL = &chrgrollsou;
// rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
// sou_cmd_enqueue(idx, reg, value);
// pROLL->run = RUN_LCD;
// rt_mutex_release(pTHR->mutex);
// rt_kprintf("ch=:%d,reg=%02x,value=%02x\n",idx,reg,value);
// }
// /*****************************************************************
// 函数名称: chrg_send_sou_upadata_data
// 函数描述: 南向通道升级命令
// 输入参数: idx:通道 reg:寄存器地址 value:寄存器值
// 输出参数: -
// 返回说明: -
// 其它说明: -
// *****************************************************************/
// void chrg_send_sou_upadata_data (rt_uint8_t *buf,rt_uint16_t leng)
// {
// struct chrg_thread_t *pTHR = &chrgthr[IDX_THR_ROLL_SOU];
// struct chrg_rollsou_t *pROLL = &chrgrollsou;
// pROLL->updata_data = buf;
// pROLL->leng = leng;
// // rt_kprintf("idx=%d,reg=%02x,value=%02x\n",RUN_UPDATAidx,reg,value);
// rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
// pROLL->run = RUN_UPDATA;
// rt_mutex_release(pTHR->mutex);
// }
// ///*****************************************************************
// //函数名称: chrg_set_sou_more_reg
// //函数描述: 南向通道设置寄存器请求命令
// //输入参数: idx:通道 reg:寄存器地址 value:寄存器值 value2:第二个寄存器值
// //输出参数: -
// //返回说明: -
// //其它说明: -
// //*****************************************************************/
// //void chrg_set_sou_more_reg (eIDX_SOU_CH idx, rt_uint16_t reg, rt_uint16_t value,rt_uint16_t value2)
// //{
// // struct chrg_thread_t *pTHR = &chrgthr[IDX_THR_ROLL_SOU];
// // struct chrg_rollsou_t *pROLL = &chrgrollsou;
// // pROLL->more_reg_flag = 1; // 使用多寄存器标志位
// // pROLL->ch = idx;
// // pROLL->reg = reg;
// // pROLL->value = value;
// // pROLL->value2 = value2;
// // rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
// // pROLL->run = RUN_LCD;
// // rt_mutex_release(pTHR->mutex);
// //}
// /*****************************************************************
// 函数名称: chrg_roll_sou_thread_entry
// 函数描述: 南向通道轮巡请求数据线程体
// 输入参数: *data: 本线程信息
// 输出参数: -
// 返回说明: -
// 其它说明: -
// *****************************************************************/
// rt_uint8_t aaaaaa = 0;
// void chrg_roll_sou_thread_entry (void *data)
// {
// struct chrg_thread_t *pTHR = (struct chrg_thread_t *)data;
// if (RT_NULL == pTHR) {
// return ;
// }
// rt_uint8_t run = 0;
// rt_uint8_t index = 0, idx = 0;
// rt_err_t ret = RT_EOK;
// struct chrg_rollsou_t *pROLL = &chrgrollsou;
// struct chrg_thread_t *pTS = &chrgthr[IDX_THR_SOUTH];
// struct mb_msg_t *pMB_R = RT_NULL;
// rt_uint8_t number = 0;
// while (1) {
// /* 每轮先非阻塞排空积压消息,防止邮箱满导致 south 线程永久阻塞 */
// {
// rt_uint8_t drain_cnt = 0;
// struct mb_msg_t *pDrain = RT_NULL;
// while (drain_cnt < 8) {
// ret = rt_mb_recv(pTS->mb, (rt_uint32_t *)&pDrain, 0);
// if (ret != RT_EOK) break;
// if (pDrain != RT_NULL) {
// if (pDrain->payload != RT_NULL) rt_free(pDrain->payload);
// rt_free(pDrain);
// }
// drain_cnt++;
// }
// }
// rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
// run = pROLL->run;
// rt_mutex_release(pTHR->mutex);
// switch (run) {
// // rt_kprintf("-------- ROLL SOU TIME START \n --------");
// case RUN_AUTO: {
// if(pROLL->mode!=0){
// }else{
// idx = index%(TOTAL_SOU_CHS); // [0, 3]
// // rt_kprintf("start_idx = %d",idx);
// if (0 == chrgsouth.enable[idx]) { // 通道未启用
// index++;
// rt_thread_mdelay(5);
// continue;
// } else { // 通道启用
// chrg_led_flashing(IDX_LED3, TIMES_ONE, PULSE_TIME*2, PULSE_TIME*2);
// if (idx != (rt_uint8_t)pROLL->idx) {
// pROLL->idx = (eIDX_SOU_CH)idx;
// chrg_south_switch((eIDX_SOU_CH)idx);
// pROLL->part = MB_R_PART1;
// }
// chrg_eload_refresh(ID_ELOAD, pROLL->part);
// if (pROLL->part < TOTAL_MB_R) {
// //pROLL->part++;
// //if (pROLL->part > MB_R_PART1) { // 仅1条,若需轮巡全部,注释此条件
// index++;
// //}
// } else {
// index++;
// }
// }
// }
// }
// break;
// case RUN_LCD: {
// struct chrg_sou_cmd_t cmd;
// rt_uint8_t do_cmd = 0;
// rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
// if (sou_cmd_dequeue(&cmd) == 0) {
// do_cmd = 1;
// pROLL->ch = cmd.ch;
// }
// rt_mutex_release(pTHR->mutex);
// if (do_cmd) {
// chrg_south_switch(cmd.ch);
// chrg_eload_write_reg(ID_ELOAD, cmd.reg, cmd.value);
// }
// rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
// if (!sou_cmd_exists()) {
// pROLL->run = RUN_AUTO;
// }
// rt_mutex_release(pTHR->mutex);
// }
// break;
// case RUN_CONSOLE: {
// chrg_south_switch((eIDX_SOU_CH)pROLL->ch);
// chrg_eload_refresh(ID_ELOAD, pROLL->part);
// }
// break;
// case RUN_UPDATA:{
// chrg_south_switch((eIDX_SOU_CH)pROLL->ch);
// if(pROLL->send_flag==1){
// chrg_eload_send_ymodem_data(pROLL->updata_data,pROLL->leng);
// pROLL->send_flag = 0;
// }
// /* 升级模式不下发Modbus邮件,等待south线程捕获ymodem应答后继续 */
// rt_thread_mdelay(50);
// continue;
// }
// break;
// case RUN_COM: {
// chrg_south_switch((eIDX_SOU_CH)pROLL->ch);
// chrg_eload_write_reg(ID_ELOAD, pROLL->reg, pROLL->value);
// }
// break;
// case RUN_NONE:
// default:
// rt_thread_mdelay(5);
// continue;
// break;
// }
// ret = rt_mb_recv(pTS->mb, (rt_uint32_t *)&pMB_R, 100 ); // 超时 200ms
// if ((RT_EOK == ret)&&(RT_NULL != pMB_R)) { // 存在返回数据
// if (0 == mb_crc16(pMB_R->payload, pMB_R->length)) {
// if (RUN_AUTO != run) { // 恢复自动轮巡或继续执行待发命令
// rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
// pROLL->run = sou_cmd_exists() ? RUN_LCD : RUN_AUTO;
// rt_mutex_release(pTHR->mutex);
// }
// else { // 自动轮巡态,分析接收的数据
// #if DEBUG_SOUTH
// rt_kprintf("length = %d",pMB_R->length);
// #endif
// if(pMB_R->length!=43){//31修改成43,一共19个寄存器*2+4,多读了4位
// ret = rt_mb_recv(pTS->mb, (rt_uint32_t *)&pMB_R, 30); // 超时 200ms
// #if DEBUG_SOUTH
// rt_kprintf("ret = %d\n",ret);
// #endif
// if ((RT_EOK == ret)&&(RT_NULL != pMB_R)) { // 存在返回数据
// chrg_eload_parse(idx, pROLL->part, pMB_R->payload, pMB_R->length);
// }
// }
// else chrg_eload_parse(idx, pROLL->part, pMB_R->payload, pMB_R->length);
// }
// }
// else {
// LOG_E("crc failed.");
// }
// if (RT_NULL != pMB_R->payload) {
// rt_free(pMB_R->payload);
// pMB_R->payload = RT_NULL;
// }
// if (RT_NULL != pMB_R) {
// rt_free(pMB_R);
// pMB_R = RT_NULL;
// }
// // rt_thread_mdelay(200); // 间隔 20ms
// rt_thread_mdelay(10); // 间隔 200ms
// } else { // 设备应答超时
// if (RUN_AUTO != run) { // 非自动轮巡
// rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
// pROLL->run = sou_cmd_exists() ? RUN_LCD : RUN_AUTO; // 切换会自动轮巡或继续执行待发命令
// rt_mutex_release(pTHR->mutex);
// }
// }
// // rt_kprintf("-------- ROLL SOU TIME END\n --------");
// }
// }
// #if 1
// static int south_send(rt_uint8_t argc, char **argv)
// {
// int ch = 0, pt = 0;
// if (3 != argc) {
// rt_kprintf("help : %s [0-3] [0-1]\r\n", argv[0]);
// return -1;
// }
// ch = (rt_uint8_t)atoi(argv[1]);
// if ((ch < 0)||(ch >= TOTAL_SOU_CHS)) {
// rt_kprintf("help : %s [0-3] [0-1]\r\n", argv[0]);
// return -1;
// }
// pt = (rt_uint8_t)atoi(argv[2]);
// if ((pt < 0)||(pt >= TOTAL_MB_R)) {
// rt_kprintf("help : %s [0-3] [0-1]\r\n", argv[0]);
// return -1;
// }
// struct chrg_rollsou_t *pROLL = &chrgrollsou;
// pROLL->run = RUN_CONSOLE;
// pROLL->ch = (rt_uint8_t)ch;
// pROLL->part = (rt_uint8_t)pt;
// return 0;
// }
// MSH_CMD_EXPORT(south_send, south send test);
// static int south_run (int argc, char **argv)
// {
// if (2 != argc) {
// rt_kprintf("help : %s start|stop\r\n", argv[0]);
// return -1;
// }
// struct chrg_rollsou_t *pROLL = &chrgrollsou;
// if (rt_strcmp(argv[1], "start") == 0) {
// pROLL->run = RUN_AUTO;
// } else if (rt_strcmp(argv[1], "stop") == 0) {
// pROLL->run = RUN_NONE;
// } else {
// rt_kprintf("help : %s start|stop\r\n", argv[0]);
// return -1;
// }
// return 0;
// }
// MSH_CMD_EXPORT(south_run, south auto run);
// #endif
/**************************************************************************** /****************************************************************************
文件名称 : chrg_roll_sou.c 文件名称 : chrg_roll_sou.c
完成日期 : 完成日期 :
+1 -2
View File
@@ -278,7 +278,6 @@ int chrg_eload_parse (rt_uint8_t idx, rt_uint8_t pt, rt_uint8_t *data, rt_uint16
pLOAD->Ripple = swap_u16(pP1->Ripple); pLOAD->Ripple = swap_u16(pP1->Ripple);
pSW->Now_voltage = pLOAD->voltage; pSW->Now_voltage = pLOAD->voltage;
pSW->Now_current = pLOAD->current; pSW->Now_current = pLOAD->current;
if(idx == 0)
#if LCD_OPEN #if LCD_OPEN
// for(int i = 0;i<4;i++){ // for(int i = 0;i<4;i++){
// if(pNOR->sw[i].change_flag == 0x01){ // if(pNOR->sw[i].change_flag == 0x01){
@@ -391,4 +390,4 @@ void LCD_SHOW(rt_uint8_t idx, struct eload_p1_t *pP1, struct chrg_eload_t *pLOAD
case SHOW_DZF: Show_DZF(idx, pLOAD, tmp, online,vzf); pSW->show_step = SHOW_STATUS; break; case SHOW_DZF: Show_DZF(idx, pLOAD, tmp, online,vzf); pSW->show_step = SHOW_STATUS; break;
} }
chrg_lcd_send(tmp); chrg_lcd_send(tmp);
} }