1 /*
2  * Copyright (C) 2015-2018 Alibaba Group Holding Limited
3  */
4 
5 #include <mbmaster.h>
6 #include "../pdu/pdu.h"
7 #include "main_process.h"
8 
9 /* function code 0x01 */
mbmaster_read_coils(mb_handler_t * req_handler,uint8_t slave_addr,uint16_t start_addr,uint16_t quantity,uint8_t * respond_buf,uint8_t * respond_count,uint32_t timeout)10 mb_status_t mbmaster_read_coils(mb_handler_t *req_handler, uint8_t slave_addr, uint16_t start_addr,
11                                 uint16_t quantity, uint8_t *respond_buf, uint8_t *respond_count, uint32_t timeout)
12 {
13     mb_status_t status = MB_SUCCESS;
14     status = mbmaster_main_type1_process(req_handler, FUNC_CODE_READ_COILS, slave_addr, start_addr, quantity,
15                                          respond_buf, respond_count, timeout);
16     return status;
17 }
18 
19 /* function code 0x02 */
mbmaster_read_discrete_inputs(mb_handler_t * req_handler,uint8_t slave_addr,uint16_t start_addr,uint16_t quantity,uint8_t * respond_buf,uint8_t * respond_count,uint32_t timeout)20 mb_status_t mbmaster_read_discrete_inputs(mb_handler_t *req_handler, uint8_t slave_addr, uint16_t start_addr,
21                                           uint16_t quantity, uint8_t *respond_buf, uint8_t *respond_count,
22                                           uint32_t timeout)
23 {
24     mb_status_t status = MB_SUCCESS;
25     status = mbmaster_main_type1_process(req_handler, FUNC_CODE_READ_DISCRETE_INPUTS, slave_addr, start_addr,
26                                          quantity, respond_buf, respond_count, timeout);
27     return status;
28 }
29 
30 /* function code 0x03 */
mbmaster_read_holding_registers(mb_handler_t * req_handler,uint8_t slave_addr,uint16_t start_addr,uint16_t quantity,uint8_t * respond_buf,uint8_t * respond_count,uint32_t timeout)31 mb_status_t mbmaster_read_holding_registers(mb_handler_t *req_handler, uint8_t slave_addr, uint16_t start_addr,
32                                             uint16_t quantity, uint8_t *respond_buf, uint8_t *respond_count,
33                                             uint32_t timeout)
34 {
35     mb_status_t status = MB_SUCCESS;
36     status = mbmaster_main_type1_process(req_handler, FUNC_CODE_READ_HOLDING_REGISTERS, slave_addr, start_addr,
37                                          quantity, respond_buf, respond_count, timeout);
38     return status;
39 }
40 
41 /* function code 0x04 */
mbmaster_read_input_registers(mb_handler_t * req_handler,uint8_t slave_addr,uint16_t start_addr,uint16_t quantity,uint8_t * respond_buf,uint8_t * respond_count,uint32_t timeout)42 mb_status_t mbmaster_read_input_registers(mb_handler_t *req_handler, uint8_t slave_addr, uint16_t start_addr,
43                                           uint16_t quantity, uint8_t *respond_buf, uint8_t *respond_count,
44                                           uint32_t timeout)
45 {
46     mb_status_t status = MB_SUCCESS;
47     status = mbmaster_main_type1_process(req_handler, FUNC_CODE_READ_INPUT_REGISTERS, slave_addr, start_addr,
48                                          quantity, respond_buf, respond_count, timeout);
49     return status;
50 }
51 
52 /* function code 0x05 */
mbmaster_write_single_coil(mb_handler_t * req_handler,uint8_t slave_addr,uint16_t coil_addr,uint16_t coil_value,uint16_t * resp_addr,uint16_t * resp_value,uint8_t * exception_code,uint32_t timeout)53 mb_status_t mbmaster_write_single_coil(mb_handler_t *req_handler, uint8_t slave_addr, uint16_t coil_addr,
54                                        uint16_t coil_value, uint16_t *resp_addr, uint16_t *resp_value,
55                                        uint8_t *exception_code, uint32_t timeout)
56 {
57     mb_status_t status = MB_SUCCESS;
58     status = mbmaster_main_type2_process(req_handler, FUNC_CODE_WRITE_SINGLE_COIL, slave_addr, coil_addr,
59                                          coil_value, resp_addr, resp_value, exception_code, timeout);
60     return status;
61 }
62 
63 /* function code 0x06 */
mbmaster_write_single_register(mb_handler_t * req_handler,uint8_t slave_addr,uint16_t register_addr,uint16_t register_value,uint16_t * resp_addr,uint16_t * resp_value,uint8_t * exception_code,uint32_t timeout)64 mb_status_t mbmaster_write_single_register(mb_handler_t *req_handler, uint8_t slave_addr, uint16_t register_addr,
65                                            uint16_t register_value, uint16_t *resp_addr, uint16_t *resp_value,
66                                            uint8_t *exception_code, uint32_t timeout)
67 {
68     mb_status_t status = MB_SUCCESS;
69     status = mbmaster_main_type2_process(req_handler, FUNC_CODE_WRITE_SINGLE_REGISTERS, slave_addr, register_addr,
70                                          register_value, resp_addr, resp_value, exception_code, timeout);
71     return status;
72 }
73 
74 /* function code 0x0F */
mbmaster_write_multiple_coils(mb_handler_t * req_handler,uint8_t slave_addr,uint16_t start_addr,uint16_t quantity,uint8_t * outputs_buf,uint16_t * resp_addr,uint16_t * resp_quantity,uint8_t * exception_code,uint32_t timeout)75 mb_status_t mbmaster_write_multiple_coils(mb_handler_t *req_handler, uint8_t slave_addr, uint16_t start_addr,
76                                           uint16_t quantity, uint8_t *outputs_buf, uint16_t *resp_addr,
77                                           uint16_t *resp_quantity, uint8_t *exception_code, uint32_t timeout)
78 {
79     mb_status_t status = MB_SUCCESS;
80     status = mbmaster_main_type3_process(req_handler, FUNC_CODE_WRITE_MULTIPLE_COILS, slave_addr, start_addr,
81                                          quantity, outputs_buf, resp_addr, resp_quantity, exception_code, timeout);
82     return status;
83 }
84 
85 /* function code 0x10 */
mbmaster_write_multiple_registers(mb_handler_t * req_handler,uint8_t slave_addr,uint16_t start_addr,uint16_t quantity,uint8_t * outputs_buf,uint16_t * resp_addr,uint16_t * resp_quantity,uint8_t * exception_code,uint32_t timeout)86 mb_status_t mbmaster_write_multiple_registers(mb_handler_t *req_handler, uint8_t slave_addr, uint16_t start_addr,
87                                               uint16_t quantity, uint8_t *outputs_buf, uint16_t *resp_addr,
88                                               uint16_t *resp_quantity, uint8_t *exception_code, uint32_t timeout)
89 {
90     mb_status_t status = MB_SUCCESS;
91     status = mbmaster_main_type3_process(req_handler, FUNC_CODE_WRITE_MULTIPLE_REGISTERS, slave_addr, start_addr,
92                                          quantity, outputs_buf, resp_addr, resp_quantity, exception_code, timeout);
93     return status;
94 }
95 
96