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:
parent
16b697f9c4
commit
a0158a6cbf
|
|
@ -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(®_buf[0]);
|
float val = modbus_get_float(®_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(®s[offset]);
|
// float val = modbus_get_float(®s[offset]);
|
||||||
float val = modbus_get_float_abcd(®s[offset]);
|
float val = modbus_get_float_abcd(®s[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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue