From 863f181e2af065d1765a420b9ada5097e8322901 Mon Sep 17 00:00:00 2001 From: hxy7yx <1595670487@qq.com> Date: Mon, 14 Aug 2023 16:09:22 +0800 Subject: [PATCH] feat(modbus):write multiple tags --- plugins/modbus/modbus_req.c | 38 ++++++++++++++++++++++++++++++++--- plugins/modbus/modbus_req.h | 6 +++++- plugins/modbus/modbus_rtu.c | 10 +++++++-- plugins/modbus/modbus_stack.c | 18 ++++++++++------- plugins/modbus/modbus_stack.h | 2 +- plugins/modbus/modbus_tcp.c | 10 +++++++-- 6 files changed, 68 insertions(+), 16 deletions(-) diff --git a/plugins/modbus/modbus_req.c b/plugins/modbus/modbus_req.c index 462d9474..3314e8b9 100644 --- a/plugins/modbus/modbus_req.c +++ b/plugins/modbus/modbus_req.c @@ -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) diff --git a/plugins/modbus/modbus_req.h b/plugins/modbus/modbus_req.h index 30c666a1..cbd5f6db 100644 --- a/plugins/modbus/modbus_req.h +++ b/plugins/modbus/modbus_req.h @@ -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 diff --git a/plugins/modbus/modbus_rtu.c b/plugins/modbus/modbus_rtu.c index 7321fdb6..bea6cd3b 100644 --- a/plugins/modbus/modbus_rtu.c +++ b/plugins/modbus/modbus_rtu.c @@ -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); } \ No newline at end of file diff --git a/plugins/modbus/modbus_stack.c b/plugins/modbus/modbus_stack.c index 4921e801..955b95e9 100644 --- a/plugins/modbus/modbus_stack.c +++ b/plugins/modbus/modbus_stack.c @@ -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; } diff --git a/plugins/modbus/modbus_stack.h b/plugins/modbus/modbus_stack.h index 3334b0ee..8e1df0a7 100644 --- a/plugins/modbus/modbus_stack.h +++ b/plugins/modbus/modbus_stack.h @@ -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 \ No newline at end of file diff --git a/plugins/modbus/modbus_tcp.c b/plugins/modbus/modbus_tcp.c index ab8546a5..29a5075d 100644 --- a/plugins/modbus/modbus_tcp.c +++ b/plugins/modbus/modbus_tcp.c @@ -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); } \ No newline at end of file