refactor(libmodbus_m): MY_LOG_→LOG_ 统一日志宏 + 代码风格规范

- 全局替换 MY_LOG_I/MY_LOG_E/MY_LOG_W 为统一的 LOG_I/LOG_E/LOG_W
- get_base_path(): 对齐配置路径约定(WORK_PATH 优先 → 可执行文件目录
- 修复关键字空格(if(/for(/while(/switch( → if (/for (/while (/switch ()
- 花括号/空行按 Allman 风格规范
This commit is contained in:
ypc 2026-07-08 17:35:42 +08:00
parent 16b697f9c4
commit a0158a6cbf
1 changed files with 164 additions and 154 deletions

View File

@ -20,20 +20,30 @@ LOCAL std::vector<stru_modbus_m_write_req> g_write_queue;
LOCAL std::string get_base_path() LOCAL std::string get_base_path()
{ {
char proc_dir[512] = {0}; char buf[512] = {0};
if(0 != func_proc_self_dir(proc_dir, sizeof(proc_dir)))
/* 优先使用 WORK_PATH 环境变量RK3568 装置运行时设置) */
if (0 == func_get_work_path(buf, sizeof(buf)))
{ {
MY_LOG_E("func_get_process_self_dir failed"); return std::string(buf) + "/";
}
/* fallback: 从可执行文件路径推导(本地调试用) */
if (0 != func_proc_self_dir(buf, sizeof(buf)))
{
LOG_E("func_proc_self_dir failed");
return ""; return "";
} }
return std::string(proc_dir);
return std::string(buf) + "/";
} }
// ==================== 数据类型映射 ==================== // ==================== 数据类型映射 ====================
LOCAL uint8_t modbus_type_to_local_type(uint8_t type) LOCAL uint8_t modbus_type_to_local_type(uint8_t type)
{ {
switch(type) switch (type)
{ {
case 2: return DATA_TYPE_B; // bit/线圈 case 2: return DATA_TYPE_B; // bit/线圈
case 4: return DATA_TYPE_U16; // uint16 case 4: return DATA_TYPE_U16; // uint16
@ -46,7 +56,7 @@ LOCAL uint8_t modbus_type_to_local_type(uint8_t type)
LOCAL uint8_t dc_data_type_size(uint8_t data_type) LOCAL uint8_t dc_data_type_size(uint8_t data_type)
{ {
switch(data_type) switch (data_type)
{ {
case DATA_TYPE_B: return 1; case DATA_TYPE_B: return 1;
case DATA_TYPE_U8: return 1; case DATA_TYPE_U8: return 1;
@ -65,7 +75,7 @@ LOCAL uint8_t dc_data_type_size(uint8_t data_type)
LOCAL int parse_channels(XMLElement *p_root) LOCAL int parse_channels(XMLElement *p_root)
{ {
XMLElement *p_ch = p_root->FirstChildElement("Channel"); XMLElement *p_ch = p_root->FirstChildElement("Channel");
while(NULL != p_ch) while (NULL != p_ch)
{ {
stru_modbus_m_channel ch; stru_modbus_m_channel ch;
ch.id = (uint32_t)p_ch->IntAttribute("id", 0); ch.id = (uint32_t)p_ch->IntAttribute("id", 0);
@ -83,14 +93,14 @@ LOCAL int parse_channels(XMLElement *p_root)
ch.connected = false; ch.connected = false;
g_modbus_m_cfg.channels.push_back(ch); g_modbus_m_cfg.channels.push_back(ch);
MY_LOG_I("channel %d: mode=%s, host=%s:%d", ch.id, ch.mode.c_str(), ch.host.c_str(), ch.port); LOG_I("channel %d: mode=%s, host=%s:%d", ch.id, ch.mode.c_str(), ch.host.c_str(), ch.port);
p_ch = p_ch->NextSiblingElement("Channel"); p_ch = p_ch->NextSiblingElement("Channel");
} }
if(g_modbus_m_cfg.channels.empty()) if (g_modbus_m_cfg.channels.empty())
{ {
MY_LOG_E("no channel configured"); LOG_E("no channel configured");
return -1; return -1;
} }
return 0; return 0;
@ -122,33 +132,33 @@ LOCAL int parse_point_item(XMLElement *p_item, std::vector<stru_modbus_m_item> &
item.factor = (float)p_item->FloatAttribute("factor", 1.0f); item.factor = (float)p_item->FloatAttribute("factor", 1.0f);
item.offset = (float)p_item->FloatAttribute("offset", 0.0f); item.offset = (float)p_item->FloatAttribute("offset", 0.0f);
if(NULL != p_item->Attribute("saddr")) if (NULL != p_item->Attribute("saddr"))
item.saddr = p_item->Attribute("saddr"); item.saddr = p_item->Attribute("saddr");
if(NULL != p_item->Attribute("desc")) if (NULL != p_item->Attribute("desc"))
item.desc = p_item->Attribute("desc"); item.desc = p_item->Attribute("desc");
// 验证通道ID // 验证通道ID
bool ch_found = false; bool ch_found = false;
for(auto &ch : g_modbus_m_cfg.channels) for (auto &ch : g_modbus_m_cfg.channels)
{ {
if(ch.id == item.channel) if (ch.id == item.channel)
{ {
ch_found = true; ch_found = true;
break; break;
} }
} }
if(!ch_found) if (!ch_found)
{ {
MY_LOG_E("item no=%d: channel %d not found", item.no, item.channel); LOG_E("item no=%d: channel %d not found", item.no, item.channel);
return -1; return -1;
} }
// 创建数据指针 // 创建数据指针
uint8_t local_type = modbus_type_to_local_type(item.type); uint8_t local_type = modbus_type_to_local_type(item.type);
item.p_val = dc_create_data(local_type); item.p_val = dc_create_data(local_type);
if(NULL == item.p_val) if (NULL == item.p_val)
{ {
MY_LOG_E("dc_create_data_ptr_by_type failed, type=%d", local_type); LOG_E("dc_create_data_ptr_by_type failed, type=%d", local_type);
return -1; return -1;
} }
@ -159,77 +169,77 @@ LOCAL int parse_point_item(XMLElement *p_item, std::vector<stru_modbus_m_item> &
LOCAL int parse_points(XMLElement *p_root) LOCAL int parse_points(XMLElement *p_root)
{ {
XMLElement *p_point = p_root->FirstChildElement("Point"); XMLElement *p_point = p_root->FirstChildElement("Point");
if(NULL == p_point) if (NULL == p_point)
{ {
MY_LOG_E("Point not found"); LOG_E("Point not found");
return -1; return -1;
} }
if(NULL != p_point->Attribute("desc")) if (NULL != p_point->Attribute("desc"))
g_modbus_m_cfg.point.desc = p_point->Attribute("desc"); g_modbus_m_cfg.point.desc = p_point->Attribute("desc");
// 解析 St遥信 // 解析 St遥信
XMLElement *p_st = p_point->FirstChildElement("St"); XMLElement *p_st = p_point->FirstChildElement("St");
if(NULL != p_st) if (NULL != p_st)
{ {
XMLElement *p_item = p_st->FirstChildElement("Item"); XMLElement *p_item = p_st->FirstChildElement("Item");
while(NULL != p_item) while (NULL != p_item)
{ {
if(0 != parse_point_item(p_item, g_modbus_m_cfg.point.st_vec)) if (0 != parse_point_item(p_item, g_modbus_m_cfg.point.st_vec))
{ {
return -1; return -1;
} }
p_item = p_item->NextSiblingElement("Item"); p_item = p_item->NextSiblingElement("Item");
} }
MY_LOG_I("parsed %zu st items", g_modbus_m_cfg.point.st_vec.size()); LOG_I("parsed %zu st items", g_modbus_m_cfg.point.st_vec.size());
} }
// 解析 Mx遥测 // 解析 Mx遥测
XMLElement *p_mx = p_point->FirstChildElement("Mx"); XMLElement *p_mx = p_point->FirstChildElement("Mx");
if(NULL != p_mx) if (NULL != p_mx)
{ {
XMLElement *p_item = p_mx->FirstChildElement("Item"); XMLElement *p_item = p_mx->FirstChildElement("Item");
while(NULL != p_item) while (NULL != p_item)
{ {
if(0 != parse_point_item(p_item, g_modbus_m_cfg.point.mx_vec)) if (0 != parse_point_item(p_item, g_modbus_m_cfg.point.mx_vec))
{ {
return -1; return -1;
} }
p_item = p_item->NextSiblingElement("Item"); p_item = p_item->NextSiblingElement("Item");
} }
MY_LOG_I("parsed %zu mx items", g_modbus_m_cfg.point.mx_vec.size()); LOG_I("parsed %zu mx items", g_modbus_m_cfg.point.mx_vec.size());
} }
// 解析 Co遥控 // 解析 Co遥控
XMLElement *p_co = p_point->FirstChildElement("Co"); XMLElement *p_co = p_point->FirstChildElement("Co");
if(NULL != p_co) if (NULL != p_co)
{ {
XMLElement *p_item = p_co->FirstChildElement("Item"); XMLElement *p_item = p_co->FirstChildElement("Item");
while(NULL != p_item) while (NULL != p_item)
{ {
if(0 != parse_point_item(p_item, g_modbus_m_cfg.point.co_vec)) if (0 != parse_point_item(p_item, g_modbus_m_cfg.point.co_vec))
{ {
return -1; return -1;
} }
p_item = p_item->NextSiblingElement("Item"); p_item = p_item->NextSiblingElement("Item");
} }
MY_LOG_I("parsed %zu co items", g_modbus_m_cfg.point.co_vec.size()); LOG_I("parsed %zu co items", g_modbus_m_cfg.point.co_vec.size());
} }
// 解析 Ao参数 // 解析 Ao参数
XMLElement *p_ao = p_point->FirstChildElement("Ao"); XMLElement *p_ao = p_point->FirstChildElement("Ao");
if(NULL != p_ao) if (NULL != p_ao)
{ {
XMLElement *p_item = p_ao->FirstChildElement("Item"); XMLElement *p_item = p_ao->FirstChildElement("Item");
while(NULL != p_item) while (NULL != p_item)
{ {
if(0 != parse_point_item(p_item, g_modbus_m_cfg.point.ao_vec)) if (0 != parse_point_item(p_item, g_modbus_m_cfg.point.ao_vec))
{ {
return -1; return -1;
} }
p_item = p_item->NextSiblingElement("Item"); p_item = p_item->NextSiblingElement("Item");
} }
MY_LOG_I("parsed %zu ao items", g_modbus_m_cfg.point.ao_vec.size()); LOG_I("parsed %zu ao items", g_modbus_m_cfg.point.ao_vec.size());
} }
return 0; return 0;
@ -238,32 +248,32 @@ LOCAL int parse_points(XMLElement *p_root)
int modbus_m_cfg_parse(const std::string &path) int modbus_m_cfg_parse(const std::string &path)
{ {
XMLDocument doc; XMLDocument doc;
if(XML_SUCCESS != doc.LoadFile(path.c_str())) if (XML_SUCCESS != doc.LoadFile(path.c_str()))
{ {
MY_LOG_E("load xml failed: %s", path.c_str()); LOG_E("load xml failed: %s", path.c_str());
return -1; return -1;
} }
XMLElement *p_root = doc.RootElement(); XMLElement *p_root = doc.RootElement();
if(NULL == p_root) if (NULL == p_root)
{ {
MY_LOG_E("root element not found"); LOG_E("root element not found");
return -1; return -1;
} }
if(0 != parse_channels(p_root)) if (0 != parse_channels(p_root))
{ {
MY_LOG_E("parse channels failed"); LOG_E("parse channels failed");
return -1; return -1;
} }
if(0 != parse_points(p_root)) if (0 != parse_points(p_root))
{ {
MY_LOG_E("parse points failed"); LOG_E("parse points failed");
return -1; return -1;
} }
MY_LOG_I("modbus_m cfg parsed: %zu channels, st=%zu, mx=%zu, co=%zu, ao=%zu", LOG_I("modbus_m cfg parsed: %zu channels, st=%zu, mx=%zu, co=%zu, ao=%zu",
g_modbus_m_cfg.channels.size(), g_modbus_m_cfg.channels.size(),
g_modbus_m_cfg.point.st_vec.size(), g_modbus_m_cfg.point.st_vec.size(),
g_modbus_m_cfg.point.mx_vec.size(), g_modbus_m_cfg.point.mx_vec.size(),
@ -278,13 +288,13 @@ int modbus_m_cfg_parse(const std::string &path)
LOCAL int channel_connect(stru_modbus_m_channel *p_ch) LOCAL int channel_connect(stru_modbus_m_channel *p_ch)
{ {
if(NULL == p_ch) if (NULL == p_ch)
{ {
return -1; return -1;
} }
// 释放旧连接 // 释放旧连接
if(NULL != p_ch->ctx) if (NULL != p_ch->ctx)
{ {
modbus_close(p_ch->ctx); modbus_close(p_ch->ctx);
modbus_free(p_ch->ctx); modbus_free(p_ch->ctx);
@ -292,29 +302,29 @@ LOCAL int channel_connect(stru_modbus_m_channel *p_ch)
} }
// 创建上下文 // 创建上下文
if(p_ch->mode == "tcp") if (p_ch->mode == "tcp")
{ {
p_ch->ctx = modbus_new_tcp(p_ch->host.c_str(), p_ch->port); p_ch->ctx = modbus_new_tcp(p_ch->host.c_str(), p_ch->port);
if(NULL == p_ch->ctx) if (NULL == p_ch->ctx)
{ {
MY_LOG_E("modbus_new_tcp failed: %s:%d", p_ch->host.c_str(), p_ch->port); LOG_E("modbus_new_tcp failed: %s:%d", p_ch->host.c_str(), p_ch->port);
return -1; return -1;
} }
// TCP 模式下设置默认从站地址 // TCP 模式下设置默认从站地址
modbus_set_slave(p_ch->ctx, MODBUS_TCP_SLAVE); modbus_set_slave(p_ch->ctx, MODBUS_TCP_SLAVE);
} }
else if(p_ch->mode == "rtu") else if (p_ch->mode == "rtu")
{ {
p_ch->ctx = modbus_new_rtu(p_ch->device.c_str(), p_ch->baud, p_ch->parity, p_ch->data_bit, p_ch->stop_bit); p_ch->ctx = modbus_new_rtu(p_ch->device.c_str(), p_ch->baud, p_ch->parity, p_ch->data_bit, p_ch->stop_bit);
if(NULL == p_ch->ctx) if (NULL == p_ch->ctx)
{ {
MY_LOG_E("modbus_new_rtu failed: %s", p_ch->device.c_str()); LOG_E("modbus_new_rtu failed: %s", p_ch->device.c_str());
return -1; return -1;
} }
} }
else else
{ {
MY_LOG_E("unknown mode: %s", p_ch->mode.c_str()); LOG_E("unknown mode: %s", p_ch->mode.c_str());
return -1; return -1;
} }
@ -325,9 +335,9 @@ LOCAL int channel_connect(stru_modbus_m_channel *p_ch)
modbus_set_error_recovery(p_ch->ctx, (modbus_error_recovery_mode)(MODBUS_ERROR_RECOVERY_LINK | MODBUS_ERROR_RECOVERY_PROTOCOL)); modbus_set_error_recovery(p_ch->ctx, (modbus_error_recovery_mode)(MODBUS_ERROR_RECOVERY_LINK | MODBUS_ERROR_RECOVERY_PROTOCOL));
// 建立连接 // 建立连接
if(0 != modbus_connect(p_ch->ctx)) if (0 != modbus_connect(p_ch->ctx))
{ {
MY_LOG_E("modbus_connect failed: ch=%d, mode=%s", p_ch->id, p_ch->mode.c_str()); LOG_E("modbus_connect failed: ch=%d, mode=%s", p_ch->id, p_ch->mode.c_str());
modbus_free(p_ch->ctx); modbus_free(p_ch->ctx);
p_ch->ctx = NULL; p_ch->ctx = NULL;
p_ch->connected = false; p_ch->connected = false;
@ -335,13 +345,13 @@ LOCAL int channel_connect(stru_modbus_m_channel *p_ch)
} }
p_ch->connected = true; p_ch->connected = true;
MY_LOG_I("channel %d connected: mode=%s", p_ch->id, p_ch->mode.c_str()); LOG_I("channel %d connected: mode=%s", p_ch->id, p_ch->mode.c_str());
return 0; return 0;
} }
LOCAL int channels_init() LOCAL int channels_init()
{ {
for(auto &ch : g_modbus_m_cfg.channels) for (auto &ch : g_modbus_m_cfg.channels)
{ {
channel_connect(&ch); channel_connect(&ch);
} }
@ -350,9 +360,9 @@ LOCAL int channels_init()
LOCAL void channels_close() LOCAL void channels_close()
{ {
for(auto &ch : g_modbus_m_cfg.channels) for (auto &ch : g_modbus_m_cfg.channels)
{ {
if(NULL != ch.ctx) if (NULL != ch.ctx)
{ {
modbus_close(ch.ctx); modbus_close(ch.ctx);
modbus_free(ch.ctx); modbus_free(ch.ctx);
@ -368,7 +378,7 @@ LOCAL void channels_close()
// 读取线圈 (FC 0x01) 或离散输入 (FC 0x02) // 读取线圈 (FC 0x01) 或离散输入 (FC 0x02)
LOCAL int read_bits(stru_modbus_m_channel *p_ch, uint8_t slave, uint8_t fc, uint16_t addr, uint16_t count, uint8_t *p_dest) LOCAL int read_bits(stru_modbus_m_channel *p_ch, uint8_t slave, uint8_t fc, uint16_t addr, uint16_t count, uint8_t *p_dest)
{ {
if(NULL == p_ch || NULL == p_ch->ctx || !p_ch->connected) if (NULL == p_ch || NULL == p_ch->ctx || !p_ch->connected)
{ {
return -1; return -1;
} }
@ -376,11 +386,11 @@ LOCAL int read_bits(stru_modbus_m_channel *p_ch, uint8_t slave, uint8_t fc, uint
modbus_set_slave(p_ch->ctx, slave); modbus_set_slave(p_ch->ctx, slave);
int ret = -1; int ret = -1;
if(fc == 0x01) if (fc == 0x01)
{ {
ret = modbus_read_bits(p_ch->ctx, addr, count, p_dest); ret = modbus_read_bits(p_ch->ctx, addr, count, p_dest);
} }
else if(fc == 0x02) else if (fc == 0x02)
{ {
ret = modbus_read_input_bits(p_ch->ctx, addr, count, p_dest); ret = modbus_read_input_bits(p_ch->ctx, addr, count, p_dest);
} }
@ -391,7 +401,7 @@ LOCAL int read_bits(stru_modbus_m_channel *p_ch, uint8_t slave, uint8_t fc, uint
// 读取寄存器 (FC 0x03 或 0x04) // 读取寄存器 (FC 0x03 或 0x04)
LOCAL int read_registers(stru_modbus_m_channel *p_ch, uint8_t slave, uint8_t fc, uint16_t addr, uint16_t count, uint16_t *p_dest) LOCAL int read_registers(stru_modbus_m_channel *p_ch, uint8_t slave, uint8_t fc, uint16_t addr, uint16_t count, uint16_t *p_dest)
{ {
if(NULL == p_ch || NULL == p_ch->ctx || !p_ch->connected) if (NULL == p_ch || NULL == p_ch->ctx || !p_ch->connected)
{ {
return -1; return -1;
} }
@ -399,11 +409,11 @@ LOCAL int read_registers(stru_modbus_m_channel *p_ch, uint8_t slave, uint8_t fc,
modbus_set_slave(p_ch->ctx, slave); modbus_set_slave(p_ch->ctx, slave);
int ret = -1; int ret = -1;
if(fc == 0x03) if (fc == 0x03)
{ {
ret = modbus_read_registers(p_ch->ctx, addr, count, p_dest); ret = modbus_read_registers(p_ch->ctx, addr, count, p_dest);
} }
else if(fc == 0x04) else if (fc == 0x04)
{ {
ret = modbus_read_input_registers(p_ch->ctx, addr, count, p_dest); ret = modbus_read_input_registers(p_ch->ctx, addr, count, p_dest);
} }
@ -415,7 +425,7 @@ LOCAL int read_registers(stru_modbus_m_channel *p_ch, uint8_t slave, uint8_t fc,
// 读取单个 Item 值(按 fc 分发) // 读取单个 Item 值(按 fc 分发)
LOCAL int read_item_value(stru_modbus_m_channel *p_ch, stru_modbus_m_item *p_item) LOCAL int read_item_value(stru_modbus_m_channel *p_ch, stru_modbus_m_item *p_item)
{ {
if(NULL == p_ch || NULL == p_item) if (NULL == p_ch || NULL == p_item)
{ {
return -1; return -1;
} }
@ -423,11 +433,11 @@ LOCAL int read_item_value(stru_modbus_m_channel *p_ch, stru_modbus_m_item *p_ite
uint8_t local_type = modbus_type_to_local_type(p_item->type); uint8_t local_type = modbus_type_to_local_type(p_item->type);
// FC 0x01/0x02: 读线圈/离散输入(位) // FC 0x01/0x02: 读线圈/离散输入(位)
if(p_item->fc == 0x01 || p_item->fc == 0x02) if (p_item->fc == 0x01 || p_item->fc == 0x02)
{ {
uint8_t bit_val = 0; uint8_t bit_val = 0;
int ret = read_bits(p_ch, p_item->slave, p_item->fc, p_item->addr, p_item->count, &bit_val); int ret = read_bits(p_ch, p_item->slave, p_item->fc, p_item->addr, p_item->count, &bit_val);
if(ret > 0) if (ret > 0)
{ {
uint8_t val = bit_val ? 1 : 0; uint8_t val = bit_val ? 1 : 0;
memcpy(p_item->p_val, &val, 1); memcpy(p_item->p_val, &val, 1);
@ -436,20 +446,20 @@ LOCAL int read_item_value(stru_modbus_m_channel *p_ch, stru_modbus_m_item *p_ite
} }
// FC 0x03/0x04: 读保持/输入寄存器 // FC 0x03/0x04: 读保持/输入寄存器
if(p_item->fc == 0x03 || p_item->fc == 0x04) if (p_item->fc == 0x03 || p_item->fc == 0x04)
{ {
// 临时缓冲区(最大 125 个寄存器) // 临时缓冲区(最大 125 个寄存器)
uint16_t reg_buf[256]; uint16_t reg_buf[256];
uint16_t read_cnt = p_item->count > 125 ? 125 : p_item->count; uint16_t read_cnt = p_item->count > 125 ? 125 : p_item->count;
int ret = read_registers(p_ch, p_item->slave, p_item->fc, p_item->addr, read_cnt, reg_buf); int ret = read_registers(p_ch, p_item->slave, p_item->fc, p_item->addr, read_cnt, reg_buf);
if(ret <= 0) if (ret <= 0)
{ {
return ret; return ret;
} }
// type=2: 从寄存器提取位FC03/04 读线圈模式) // type=2: 从寄存器提取位FC03/04 读线圈模式)
if(p_item->type == 2 && p_item->bit < 16) if (p_item->type == 2 && p_item->bit < 16)
{ {
uint8_t val = (reg_buf[0] >> p_item->bit) & 0x01; uint8_t val = (reg_buf[0] >> p_item->bit) & 0x01;
memcpy(p_item->p_val, &val, 1); memcpy(p_item->p_val, &val, 1);
@ -457,10 +467,10 @@ LOCAL int read_item_value(stru_modbus_m_channel *p_ch, stru_modbus_m_item *p_ite
} }
// type=4 (uint16) // type=4 (uint16)
if(p_item->type == 4) if (p_item->type == 4)
{ {
uint16_t val = reg_buf[0]; uint16_t val = reg_buf[0];
if(p_item->factor != 1.0f || p_item->offset != 0.0f) if (p_item->factor != 1.0f || p_item->offset != 0.0f)
{ {
float fval = val * p_item->factor + p_item->offset; float fval = val * p_item->factor + p_item->offset;
val = (uint16_t)fval; val = (uint16_t)fval;
@ -470,10 +480,10 @@ LOCAL int read_item_value(stru_modbus_m_channel *p_ch, stru_modbus_m_item *p_ite
} }
// type=6 (float32): 2 个连续寄存器 // type=6 (float32): 2 个连续寄存器
if(p_item->type == 6 && read_cnt >= 2) if (p_item->type == 6 && read_cnt >= 2)
{ {
float val = modbus_get_float(&reg_buf[0]); float val = modbus_get_float(&reg_buf[0]);
if(p_item->factor != 1.0f || p_item->offset != 0.0f) if (p_item->factor != 1.0f || p_item->offset != 0.0f)
{ {
val = val * p_item->factor + p_item->offset; val = val * p_item->factor + p_item->offset;
} }
@ -482,7 +492,7 @@ LOCAL int read_item_value(stru_modbus_m_channel *p_ch, stru_modbus_m_item *p_ite
} }
// type=7 (uint32): 2 个连续寄存器 // type=7 (uint32): 2 个连续寄存器
if(p_item->type == 7 && read_cnt >= 2) if (p_item->type == 7 && read_cnt >= 2)
{ {
uint32_t val = ((uint32_t)reg_buf[0] << 16) | reg_buf[1]; uint32_t val = ((uint32_t)reg_buf[0] << 16) | reg_buf[1];
memcpy(p_item->p_val, &val, 4); memcpy(p_item->p_val, &val, 4);
@ -490,10 +500,10 @@ LOCAL int read_item_value(stru_modbus_m_channel *p_ch, stru_modbus_m_item *p_ite
} }
// type=13 (string) // type=13 (string)
if(p_item->type == 13) if (p_item->type == 13)
{ {
char *p_str = (char *)p_item->p_val; char *p_str = (char *)p_item->p_val;
for(uint16_t i = 0; i < read_cnt && i < 64; i++) for (uint16_t i = 0; i < read_cnt && i < 64; i++)
{ {
p_str[i * 2] = (reg_buf[i] >> 8) & 0xFF; p_str[i * 2] = (reg_buf[i] >> 8) & 0xFF;
p_str[i * 2 + 1] = reg_buf[i] & 0xFF; p_str[i * 2 + 1] = reg_buf[i] & 0xFF;
@ -526,29 +536,29 @@ typedef struct
LOCAL void build_poll_groups(std::vector<stru_modbus_m_item> &items, std::vector<stru_poll_group> &groups) LOCAL void build_poll_groups(std::vector<stru_modbus_m_item> &items, std::vector<stru_poll_group> &groups)
{ {
for(auto &item : items) for (auto &item : items)
{ {
// 只处理读类型的 fc // 只处理读类型的 fc
if(item.fc != 0x01 && item.fc != 0x02 && item.fc != 0x03 && item.fc != 0x04) if (item.fc != 0x01 && item.fc != 0x02 && item.fc != 0x03 && item.fc != 0x04)
{ {
continue; continue;
} }
// 查找已有组 // 查找已有组
bool found = false; bool found = false;
for(auto &g : groups) for (auto &g : groups)
{ {
if(g.channel == item.channel && g.slave == item.slave && g.fc == item.fc) if (g.channel == item.channel && g.slave == item.slave && g.fc == item.fc)
{ {
g.items.push_back(&item); g.items.push_back(&item);
if(item.addr < g.min_addr) g.min_addr = item.addr; if (item.addr < g.min_addr) g.min_addr = item.addr;
if(item.addr + item.count > g.max_addr) g.max_addr = item.addr + item.count; if (item.addr + item.count > g.max_addr) g.max_addr = item.addr + item.count;
found = true; found = true;
break; break;
} }
} }
if(!found) if (!found)
{ {
stru_poll_group g; stru_poll_group g;
g.channel = item.channel; g.channel = item.channel;
@ -564,19 +574,19 @@ LOCAL void build_poll_groups(std::vector<stru_modbus_m_item> &items, std::vector
LOCAL void poll_groups(std::vector<stru_poll_group> &groups) LOCAL void poll_groups(std::vector<stru_poll_group> &groups)
{ {
for(auto &g : groups) for (auto &g : groups)
{ {
// 查找通道 // 查找通道
stru_modbus_m_channel *p_ch = NULL; stru_modbus_m_channel *p_ch = NULL;
for(auto &ch : g_modbus_m_cfg.channels) for (auto &ch : g_modbus_m_cfg.channels)
{ {
if(ch.id == g.channel && ch.connected) if (ch.id == g.channel && ch.connected)
{ {
p_ch = &ch; p_ch = &ch;
break; break;
} }
} }
if(NULL == p_ch) if (NULL == p_ch)
{ {
continue; continue;
} }
@ -584,13 +594,13 @@ LOCAL void poll_groups(std::vector<stru_poll_group> &groups)
uint16_t total_count = g.max_addr - g.min_addr; uint16_t total_count = g.max_addr - g.min_addr;
// FC 01/02: 读位 // FC 01/02: 读位
if(g.fc == 0x01 || g.fc == 0x02) if (g.fc == 0x01 || g.fc == 0x02)
{ {
uint8_t bits[256] = {0}; uint8_t bits[256] = {0};
int ret = read_bits(p_ch, g.slave, g.fc, g.min_addr, total_count > 2000 ? 2000 : total_count, bits); int ret = read_bits(p_ch, g.slave, g.fc, g.min_addr, total_count > 2000 ? 2000 : total_count, bits);
if(ret > 0) if (ret > 0)
{ {
for(auto *p_item : g.items) for (auto *p_item : g.items)
{ {
uint16_t offset = p_item->addr - g.min_addr; uint16_t offset = p_item->addr - g.min_addr;
uint8_t val = bits[offset] ? 1 : 0; uint8_t val = bits[offset] ? 1 : 0;
@ -601,44 +611,44 @@ LOCAL void poll_groups(std::vector<stru_poll_group> &groups)
} }
// FC 03/04: 读寄存器 // FC 03/04: 读寄存器
if(g.fc == 0x03 || g.fc == 0x04) if (g.fc == 0x03 || g.fc == 0x04)
{ {
uint16_t regs[256] = {0}; uint16_t regs[256] = {0};
int ret = read_registers(p_ch, g.slave, g.fc, g.min_addr, total_count > 125 ? 125 : total_count, regs); int ret = read_registers(p_ch, g.slave, g.fc, g.min_addr, total_count > 125 ? 125 : total_count, regs);
if(ret > 0) if (ret > 0)
{ {
for(auto *p_item : g.items) for (auto *p_item : g.items)
{ {
uint16_t offset = (p_item->addr - g.min_addr); uint16_t offset = (p_item->addr - g.min_addr);
if(p_item->type == 2) if (p_item->type == 2)
{ {
// FC03/04 线圈模式:从寄存器提取位 // FC03/04 线圈模式:从寄存器提取位
uint16_t reg_idx = offset; uint16_t reg_idx = offset;
uint8_t val = (regs[reg_idx] >> p_item->bit) & 0x01; uint8_t val = (regs[reg_idx] >> p_item->bit) & 0x01;
memcpy(p_item->p_val, &val, 1); memcpy(p_item->p_val, &val, 1);
} }
else if(p_item->type == 4) else if (p_item->type == 4)
{ {
uint16_t val = regs[offset]; uint16_t val = regs[offset];
if(p_item->factor != 1.0f || p_item->offset != 0.0f) if (p_item->factor != 1.0f || p_item->offset != 0.0f)
{ {
float fval = val * p_item->factor + p_item->offset; float fval = val * p_item->factor + p_item->offset;
val = (uint16_t)fval; val = (uint16_t)fval;
} }
memcpy(p_item->p_val, &val, 2); memcpy(p_item->p_val, &val, 2);
} }
else if(p_item->type == 6 && offset + 1 < 256) else if (p_item->type == 6 && offset + 1 < 256)
{ {
// float val = modbus_get_float(&regs[offset]); // float val = modbus_get_float(&regs[offset]);
float val = modbus_get_float_abcd(&regs[offset]); float val = modbus_get_float_abcd(&regs[offset]);
if(p_item->factor != 1.0f || p_item->offset != 0.0f) if (p_item->factor != 1.0f || p_item->offset != 0.0f)
{ {
val = val * p_item->factor + p_item->offset; val = val * p_item->factor + p_item->offset;
} }
memcpy(p_item->p_val, &val, 4); memcpy(p_item->p_val, &val, 4);
} }
else if(p_item->type == 7 && offset + 1 < 256) else if (p_item->type == 7 && offset + 1 < 256)
{ {
uint32_t val = ((uint32_t)regs[offset] << 16) | regs[offset + 1]; uint32_t val = ((uint32_t)regs[offset] << 16) | regs[offset + 1];
memcpy(p_item->p_val, &val, 4); memcpy(p_item->p_val, &val, 4);
@ -662,19 +672,19 @@ LOCAL void process_write_queue()
queue.swap(g_write_queue); queue.swap(g_write_queue);
} }
for(auto &req : queue) for (auto &req : queue)
{ {
// 查找通道 // 查找通道
stru_modbus_m_channel *p_ch = NULL; stru_modbus_m_channel *p_ch = NULL;
for(auto &ch : g_modbus_m_cfg.channels) for (auto &ch : g_modbus_m_cfg.channels)
{ {
if(ch.id == req.channel && ch.ctx != NULL) if (ch.id == req.channel && ch.ctx != NULL)
{ {
p_ch = &ch; p_ch = &ch;
break; break;
} }
} }
if(NULL == p_ch) if (NULL == p_ch)
{ {
LOG_E("write: channel %d not found", req.channel); LOG_E("write: channel %d not found", req.channel);
continue; continue;
@ -683,7 +693,7 @@ LOCAL void process_write_queue()
modbus_set_slave(p_ch->ctx, req.slave); modbus_set_slave(p_ch->ctx, req.slave);
int ret = -1; int ret = -1;
if(req.is_coil) if (req.is_coil)
{ {
ret = modbus_write_bit(p_ch->ctx, req.addr, req.value ? 1 : 0); ret = modbus_write_bit(p_ch->ctx, req.addr, req.value ? 1 : 0);
} }
@ -692,7 +702,7 @@ LOCAL void process_write_queue()
ret = modbus_write_register(p_ch->ctx, req.addr, req.value); ret = modbus_write_register(p_ch->ctx, req.addr, req.value);
} }
if(ret < 0) if (ret < 0)
{ {
LOG_E("write failed: ch=%d, slave=%d, fc=0x%02x, addr=%d", req.channel, req.slave, req.fc, req.addr); LOG_E("write failed: ch=%d, slave=%d, fc=0x%02x, addr=%d", req.channel, req.slave, req.fc, req.addr);
} }
@ -710,14 +720,14 @@ LOCAL void enqueue_write(const stru_modbus_m_write_req &req)
LOCAL void modbus_m_signal_co_change_callback(const char *saddr, dc_ctrl_step_t step, uint8_t data_type, uint8_t setting_zone, const void *p_data) LOCAL void modbus_m_signal_co_change_callback(const char *saddr, dc_ctrl_step_t step, uint8_t data_type, uint8_t setting_zone, const void *p_data)
{ {
if(step != DC_CTRL_DIRECT) if (step != DC_CTRL_DIRECT)
{ {
return; return;
} }
for(auto &item : g_modbus_m_cfg.point.co_vec) for (auto &item : g_modbus_m_cfg.point.co_vec)
{ {
if(item.saddr == saddr) if (item.saddr == saddr)
{ {
stru_modbus_m_write_req req; stru_modbus_m_write_req req;
req.channel = item.channel; req.channel = item.channel;
@ -726,7 +736,7 @@ LOCAL void modbus_m_signal_co_change_callback(const char *saddr, dc_ctrl_step_t
req.addr = item.addr; req.addr = item.addr;
req.is_coil = true; req.is_coil = true;
if(data_type == DATA_TYPE_B) if (data_type == DATA_TYPE_B)
{ {
req.value = p_data ? (*(uint8_t *)p_data ? 1 : 0) : 0; req.value = p_data ? (*(uint8_t *)p_data ? 1 : 0) : 0;
} }
@ -736,7 +746,7 @@ LOCAL void modbus_m_signal_co_change_callback(const char *saddr, dc_ctrl_step_t
} }
enqueue_write(req); enqueue_write(req);
MY_LOG_I("co write: ch=%d, slave=%d, addr=%d, val=%d", req.channel, req.slave, req.addr, req.value); LOG_I("co write: ch=%d, slave=%d, addr=%d, val=%d", req.channel, req.slave, req.addr, req.value);
break; break;
} }
} }
@ -744,14 +754,14 @@ LOCAL void modbus_m_signal_co_change_callback(const char *saddr, dc_ctrl_step_t
LOCAL void modbus_m_signal_ao_change_callback(const char *saddr, dc_ctrl_step_t step, uint8_t data_type, uint8_t setting_zone, const void *p_data) LOCAL void modbus_m_signal_ao_change_callback(const char *saddr, dc_ctrl_step_t step, uint8_t data_type, uint8_t setting_zone, const void *p_data)
{ {
if(step != DC_CTRL_DIRECT) if (step != DC_CTRL_DIRECT)
{ {
return; return;
} }
for(auto &item : g_modbus_m_cfg.point.ao_vec) for (auto &item : g_modbus_m_cfg.point.ao_vec)
{ {
if(item.saddr == saddr) if (item.saddr == saddr)
{ {
stru_modbus_m_write_req req; stru_modbus_m_write_req req;
req.channel = item.channel; req.channel = item.channel;
@ -760,11 +770,11 @@ LOCAL void modbus_m_signal_ao_change_callback(const char *saddr, dc_ctrl_step_t
req.addr = item.addr; req.addr = item.addr;
req.is_coil = false; req.is_coil = false;
if(data_type == DATA_TYPE_U16) if (data_type == DATA_TYPE_U16)
{ {
req.value = p_data ? *(uint16_t *)p_data : 0; req.value = p_data ? *(uint16_t *)p_data : 0;
} }
else if(data_type == DATA_TYPE_F32) else if (data_type == DATA_TYPE_F32)
{ {
float f = p_data ? *(float *)p_data : 0; float f = p_data ? *(float *)p_data : 0;
req.value = (uint16_t)f; req.value = (uint16_t)f;
@ -775,7 +785,7 @@ LOCAL void modbus_m_signal_ao_change_callback(const char *saddr, dc_ctrl_step_t
} }
enqueue_write(req); enqueue_write(req);
MY_LOG_I("ao write: ch=%d, slave=%d, addr=%d, val=%d", req.channel, req.slave, req.addr, req.value); LOG_I("ao write: ch=%d, slave=%d, addr=%d, val=%d", req.channel, req.slave, req.addr, req.value);
break; break;
} }
} }
@ -786,39 +796,39 @@ LOCAL void modbus_m_signal_ao_change_callback(const char *saddr, dc_ctrl_step_t
LOCAL int signal_register_items(const std::vector<stru_modbus_m_item> &items, const std::string &signal_type) LOCAL int signal_register_items(const std::vector<stru_modbus_m_item> &items, const std::string &signal_type)
{ {
for(auto &item : items) for (auto &item : items)
{ {
uint8_t local_type = modbus_type_to_local_type(item.type); uint8_t local_type = modbus_type_to_local_type(item.type);
if(signal_type == "st") if (signal_type == "st")
{ {
if(0 != dc_signal_out(item.saddr.c_str(), item.desc.c_str(), local_type, item.p_val, MODULE_MODBUS_M)) if (0 != dc_signal_out(item.saddr.c_str(), item.desc.c_str(), local_type, item.p_val, MODULE_MODBUS_M))
{ {
MY_LOG_E("dc_signal_out failed: %s", item.saddr.c_str()); LOG_E("dc_signal_out failed: %s", item.saddr.c_str());
return -1; return -1;
} }
} }
else if(signal_type == "mx") else if (signal_type == "mx")
{ {
if(0 != dc_signal_out(item.saddr.c_str(), item.desc.c_str(), local_type, item.p_val, MODULE_MODBUS_M)) if (0 != dc_signal_out(item.saddr.c_str(), item.desc.c_str(), local_type, item.p_val, MODULE_MODBUS_M))
{ {
MY_LOG_E("dc_signal_out failed: %s", item.saddr.c_str()); LOG_E("dc_signal_out failed: %s", item.saddr.c_str());
return -1; return -1;
} }
} }
else if(signal_type == "co") else if (signal_type == "co")
{ {
if(0 != dc_signal_yk(item.saddr.c_str(), item.desc.c_str(), local_type, DC_CTRL_DIRECT, item.p_val, modbus_m_signal_co_change_callback, MODULE_MODBUS_M)) if (0 != dc_signal_yk(item.saddr.c_str(), item.desc.c_str(), local_type, DC_CTRL_DIRECT, item.p_val, modbus_m_signal_co_change_callback, MODULE_MODBUS_M))
{ {
MY_LOG_E("dc_signal_yk failed: %s", item.saddr.c_str()); LOG_E("dc_signal_yk failed: %s", item.saddr.c_str());
return -1; return -1;
} }
} }
else if(signal_type == "ao") else if (signal_type == "ao")
{ {
if(0 != dc_signal_ao(item.saddr.c_str(), item.desc.c_str(), local_type, DC_CTRL_DIRECT, item.p_val, modbus_m_signal_ao_change_callback, MODULE_MODBUS_M)) if (0 != dc_signal_ao(item.saddr.c_str(), item.desc.c_str(), local_type, DC_CTRL_DIRECT, item.p_val, modbus_m_signal_ao_change_callback, MODULE_MODBUS_M))
{ {
MY_LOG_E("dc_signal_ao failed: %s", item.saddr.c_str()); LOG_E("dc_signal_ao failed: %s", item.saddr.c_str());
return -1; return -1;
} }
} }
@ -829,24 +839,24 @@ LOCAL int signal_register_items(const std::vector<stru_modbus_m_item> &items, co
LOCAL int signals_init() LOCAL int signals_init()
{ {
if(0 != signal_register_items(g_modbus_m_cfg.point.st_vec, "st")) if (0 != signal_register_items(g_modbus_m_cfg.point.st_vec, "st"))
{ {
return -1; return -1;
} }
if(0 != signal_register_items(g_modbus_m_cfg.point.mx_vec, "mx")) if (0 != signal_register_items(g_modbus_m_cfg.point.mx_vec, "mx"))
{ {
return -1; return -1;
} }
if(0 != signal_register_items(g_modbus_m_cfg.point.co_vec, "co")) if (0 != signal_register_items(g_modbus_m_cfg.point.co_vec, "co"))
{ {
return -1; return -1;
} }
if(0 != signal_register_items(g_modbus_m_cfg.point.ao_vec, "ao")) if (0 != signal_register_items(g_modbus_m_cfg.point.ao_vec, "ao"))
{ {
return -1; return -1;
} }
MY_LOG_I("signals registered: st=%zu, mx=%zu, co=%zu, ao=%zu", LOG_I("signals registered: st=%zu, mx=%zu, co=%zu, ao=%zu",
g_modbus_m_cfg.point.st_vec.size(), g_modbus_m_cfg.point.st_vec.size(),
g_modbus_m_cfg.point.mx_vec.size(), g_modbus_m_cfg.point.mx_vec.size(),
g_modbus_m_cfg.point.co_vec.size(), g_modbus_m_cfg.point.co_vec.size(),
@ -860,15 +870,15 @@ LOCAL int signals_init()
int modbus_m_init() int modbus_m_init()
{ {
if(0 != signals_init()) if (0 != signals_init())
{ {
MY_LOG_E("signals_init failed"); LOG_E("signals_init failed");
return -1; return -1;
} }
if(0 != channels_init()) if (0 != channels_init())
{ {
MY_LOG_E("channels_init failed"); LOG_E("channels_init failed");
// 部分通道失败也可继续 // 部分通道失败也可继续
} }
@ -882,10 +892,10 @@ void modbus_m_show_info()
{ {
printf("===== Modbus Master Info =====\n"); printf("===== Modbus Master Info =====\n");
printf("Channels: %zu\n", g_modbus_m_cfg.channels.size()); printf("Channels: %zu\n", g_modbus_m_cfg.channels.size());
for(auto &ch : g_modbus_m_cfg.channels) for (auto &ch : g_modbus_m_cfg.channels)
{ {
printf(" ch[%d]: mode=%s, connected=%d", ch.id, ch.mode.c_str(), ch.connected); printf(" ch[%d]: mode=%s, connected=%d", ch.id, ch.mode.c_str(), ch.connected);
if(ch.mode == "tcp") if (ch.mode == "tcp")
{ {
printf(", %s:%d", ch.host.c_str(), ch.port); printf(", %s:%d", ch.host.c_str(), ch.port);
} }
@ -910,13 +920,13 @@ LOCAL void cmd_modbus_m(int argc, char *argv[])
const char *str = "\ const char *str = "\
modbus_m info ----------> \n"; modbus_m info ----------> \n";
if(argc < 2) if (argc < 2)
{ {
printf("%s", str); printf("%s", str);
return; return;
} }
if(0 == strcmp(argv[1], "info")) if (0 == strcmp(argv[1], "info"))
{ {
modbus_m_show_info(); modbus_m_show_info();
} }
@ -940,21 +950,21 @@ int app_modbus_m_init1(void *arg)
dc_signal_out("modbus_m.run_cnt", "modbus_m.run_cnt", DATA_TYPE_U32, &p_app->run_cnt, MODULE_MODBUS_M); dc_signal_out("modbus_m.run_cnt", "modbus_m.run_cnt", DATA_TYPE_U32, &p_app->run_cnt, MODULE_MODBUS_M);
std::string base_path = get_base_path(); std::string base_path = get_base_path();
if(base_path.empty()) if (base_path.empty())
{ {
MY_LOG_E("get_base_path failed"); LOG_E("get_base_path failed");
return -1; return -1;
} }
g_modbus_m_base_path = base_path + "config/MODBUS/"; g_modbus_m_base_path = base_path + "config/MODBUS/";
std::string cfg_path = g_modbus_m_base_path + "modbus_m.xml"; std::string cfg_path = g_modbus_m_base_path + "modbus_m.xml";
if(0 != modbus_m_cfg_parse(cfg_path)) if (0 != modbus_m_cfg_parse(cfg_path))
{ {
MY_LOG_E("modbus_m_cfg_parse failed: %s", cfg_path.c_str()); LOG_E("modbus_m_cfg_parse failed: %s", cfg_path.c_str());
return -1; return -1;
} }
if(0 != modbus_m_init()) if (0 != modbus_m_init())
{ {
LOG_E("modbus_m_init failed"); LOG_E("modbus_m_init failed");
return -1; return -1;
@ -970,7 +980,7 @@ int app_modbus_m_init2(void *arg)
void *app_modbus_m(void *arg) void *app_modbus_m(void *arg)
{ {
if(NULL == arg) if (NULL == arg)
{ {
LOG_E("app_modbus_m arg null"); LOG_E("app_modbus_m arg null");
return NULL; return NULL;
@ -985,9 +995,9 @@ void *app_modbus_m(void *arg)
// 预构建轮询分组 // 预构建轮询分组
build_poll_groups(g_modbus_m_cfg.point.st_vec, st_groups); build_poll_groups(g_modbus_m_cfg.point.st_vec, st_groups);
build_poll_groups(g_modbus_m_cfg.point.mx_vec, mx_groups); build_poll_groups(g_modbus_m_cfg.point.mx_vec, mx_groups);
MY_LOG_I("poll groups: st=%zu, mx=%zu", st_groups.size(), mx_groups.size()); LOG_I("poll groups: st=%zu, mx=%zu", st_groups.size(), mx_groups.size());
while(1) while (1)
{ {
task_event_recv(p_app->p_event, task_event_recv(p_app->p_event,
0x01 | 0x02 | 0x04, 0x01 | 0x02 | 0x04,