feat(modbus):write multiple tags

This commit is contained in:
hxy7yx
2023-08-14 16:09:22 +08:00
parent b02b095534
commit 863f181e2a
6 changed files with 68 additions and 16 deletions
+35 -3
View File
@@ -445,7 +445,7 @@ int modbus_value_handle(void *ctx, uint8_t slave_id, uint16_t n_byte,
}
int modbus_write(neu_plugin_t *plugin, void *req, neu_datatag_t *tag,
neu_value_u value)
neu_value_u value, bool response)
{
modbus_point_t point = { 0 };
int ret = modbus_tag_to_point(tag, &point);
@@ -498,12 +498,44 @@ int modbus_write(neu_plugin_t *plugin, void *req, neu_datatag_t *tag,
uint16_t response_size = 0;
ret = modbus_stack_write(plugin->stack, req, point.slave_id, point.area,
point.start_address, point.n_register, value.bytes,
n_byte, &response_size);
n_byte, &response_size, response);
if (ret > 0) {
process_protocol_buf(plugin, point.slave_id, response_size);
}
return 0;
return ret;
}
int modbus_write_tag(neu_plugin_t *plugin, void *req, neu_datatag_t *tag,
neu_value_u value)
{
int ret = 0;
ret = modbus_write(plugin, req, tag, value, true);
return ret;
}
int modbus_write_tags(neu_plugin_t *plugin, void *req, UT_array *tags)
{
int ret = 0;
int rv = 0;
utarray_foreach(tags, neu_plugin_tag_value_t *, tv)
{
ret = modbus_write(plugin, req, tv->tag, tv->value, false);
if (ret <= 0) {
rv = 1;
}
}
if (rv == 0) {
plugin->common.adapter_callbacks->driver.write_response(
plugin->common.adapter, req, NEU_ERR_SUCCESS);
} else {
plugin->common.adapter_callbacks->driver.write_response(
plugin->common.adapter, req, NEU_ERR_PLUGIN_DISCONNECTED);
}
return ret;
}
int modbus_write_resp(void *ctx, void *req, int error)
+5 -1
View File
@@ -58,7 +58,11 @@ int modbus_send_msg(void *ctx, uint16_t n_byte, uint8_t *bytes);
int modbus_value_handle(void *ctx, uint8_t slave_id, uint16_t n_byte,
uint8_t *bytes, int error);
int modbus_write(neu_plugin_t *plugin, void *req, neu_datatag_t *tag,
neu_value_u value);
neu_value_u value, bool response);
int modbus_write_tag(neu_plugin_t *plugin, void *req, neu_datatag_t *tag,
neu_value_u value);
int modbus_write_tags(neu_plugin_t *plugin, void *req, UT_array *tags);
int modbus_write_resp(void *ctx, void *req, int error);
#endif
+8 -2
View File
@@ -42,6 +42,7 @@ static int driver_validate_tag(neu_plugin_t *plugin, neu_datatag_t *tag);
static int driver_group_timer(neu_plugin_t *plugin, neu_plugin_group_t *group);
static int driver_write(neu_plugin_t *plugin, void *req, neu_datatag_t *tag,
neu_value_u value);
static int driver_write_tags(neu_plugin_t *plugin, void *req, UT_array *tags);
static const neu_plugin_intf_funs_t plugin_intf_funs = {
.open = driver_open,
@@ -57,7 +58,7 @@ static const neu_plugin_intf_funs_t plugin_intf_funs = {
.driver.group_timer = driver_group_timer,
.driver.write_tag = driver_write,
.driver.tag_validator = driver_tag_validator,
.driver.write_tags = NULL,
.driver.write_tags = driver_write_tags,
};
const neu_plugin_module_t neu_plugin_module = {
@@ -312,5 +313,10 @@ static int driver_group_timer(neu_plugin_t *plugin, neu_plugin_group_t *group)
static int driver_write(neu_plugin_t *plugin, void *req, neu_datatag_t *tag,
neu_value_u value)
{
return modbus_write(plugin, req, tag, value);
return modbus_write_tag(plugin, req, tag, value);
}
static int driver_write_tags(neu_plugin_t *plugin, void *req, UT_array *tags)
{
return modbus_write_tags(plugin, req, tags);
}
+11 -7
View File
@@ -225,7 +225,7 @@ int modbus_stack_read(modbus_stack_t *stack, uint8_t slave_id,
int modbus_stack_write(modbus_stack_t *stack, void *req, uint8_t slave_id,
enum modbus_area area, uint16_t start_address,
uint16_t n_reg, uint8_t *bytes, uint8_t n_byte,
uint16_t *response_size)
uint16_t *response_size, bool response)
{
static __thread neu_protocol_pack_buf_t pbuf = { 0 };
modbus_action_e m_action = MODBUS_ACTION_DEFAULT;
@@ -275,13 +275,17 @@ int modbus_stack_write(modbus_stack_t *stack, void *req, uint8_t slave_id,
int ret = stack->send_fn(stack->ctx, neu_protocol_pack_buf_used_size(&pbuf),
neu_protocol_pack_buf_get(&pbuf));
if (ret > 0) {
stack->write_resp(stack->ctx, req, NEU_ERR_SUCCESS);
plog_notice((neu_plugin_t *) stack->ctx, "send write req, %hhu!%hu",
slave_id, start_address);
if (response) {
stack->write_resp(stack->ctx, req, NEU_ERR_SUCCESS);
plog_notice((neu_plugin_t *) stack->ctx, "send write req, %hhu!%hu",
slave_id, start_address);
}
} else {
stack->write_resp(stack->ctx, req, NEU_ERR_PLUGIN_DISCONNECTED);
plog_warn((neu_plugin_t *) stack->ctx, "send write req fail, %hhu!%hu",
slave_id, start_address);
if (response) {
stack->write_resp(stack->ctx, req, NEU_ERR_PLUGIN_DISCONNECTED);
plog_warn((neu_plugin_t *) stack->ctx,
"send write req fail, %hhu!%hu", slave_id, start_address);
}
}
return ret;
}
+1 -1
View File
@@ -52,7 +52,7 @@ int modbus_stack_read(modbus_stack_t *stack, uint8_t slave_id,
int modbus_stack_write(modbus_stack_t *stack, void *req, uint8_t slave_id,
enum modbus_area area, uint16_t start_address,
uint16_t n_reg, uint8_t *bytes, uint8_t n_byte,
uint16_t *response_size);
uint16_t *response_size, bool response);
bool modbus_stack_is_rtu(modbus_stack_t *stack);
#endif
+8 -2
View File
@@ -42,6 +42,7 @@ static int driver_validate_tag(neu_plugin_t *plugin, neu_datatag_t *tag);
static int driver_group_timer(neu_plugin_t *plugin, neu_plugin_group_t *group);
static int driver_write(neu_plugin_t *plugin, void *req, neu_datatag_t *tag,
neu_value_u value);
static int driver_write_tags(neu_plugin_t *plugin, void *req, UT_array *tags);
static const neu_plugin_intf_funs_t plugin_intf_funs = {
.open = driver_open,
@@ -57,7 +58,7 @@ static const neu_plugin_intf_funs_t plugin_intf_funs = {
.driver.group_timer = driver_group_timer,
.driver.write_tag = driver_write,
.driver.tag_validator = driver_tag_validator,
.driver.write_tags = NULL,
.driver.write_tags = driver_write_tags,
};
const neu_plugin_module_t neu_plugin_module = {
@@ -279,5 +280,10 @@ static int driver_group_timer(neu_plugin_t *plugin, neu_plugin_group_t *group)
static int driver_write(neu_plugin_t *plugin, void *req, neu_datatag_t *tag,
neu_value_u value)
{
return modbus_write(plugin, req, tag, value);
return modbus_write_tag(plugin, req, tag, value);
}
static int driver_write_tags(neu_plugin_t *plugin, void *req, UT_array *tags)
{
return modbus_write_tags(plugin, req, tags);
}