| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- #include "modbus.h"
- #include "crcLib.h"
- #include "gd32e23x.h"
- #include "string.h"
- // #include "systick.h"
- #include "util.h"
- #include <stdlib.h>
- #include "modbus.h"
- #include <string.h>
- #include "FreeRTOS.h"
- #include "task.h"
- static modbus_slave_t slave;
- //static modbus_master_t master;
- static uint8_t modbus_mode = 0;
- int8_t modbus_slave_init(uint8_t address)
- {
- slave.address = address;
- slave.max_length = MODBUS_SLAVE_REG_MAX;
- slave.length = 0;
- slave.send_buffer_len = 0;
- memset(&(slave.send_buffer), 0, MODBUS_SLAVE_SEND_BUFF_LEX);
- slave.cmd_len = 0;
- return 0;
- }
- modbus_slave_t *modbus_slave_get(void)
- {
- return &slave;
- }
- int8_t modbus_slave_add_reg(uint16_t address, uint16_t data, uint8_t access, modbus_reg_read_cb_t read_cb, modbus_reg_write_cb_t write_cb)
- {
- if (slave.length < slave.max_length)
- {
- modbus_reg_t *reg = &(slave.regs[slave.length]);
- reg->address = address;
- reg->data = data;
- reg->access = access;
- reg->write_cb = write_cb;
- reg->read_cb = read_cb;
- slave.length++;
- return 0;
- }
- else
- {
- return -1;
- }
- }
- modbus_reg_t *modbus_slave_get_reg(uint16_t address)
- {
- for (int i = 0; i < slave.length; i++)
- {
- if (slave.regs[i].address == address)
- {
- return &slave.regs[i];
- }
- }
- return NULL;
- }
- int8_t modbus_slave_reg_read_raw(uint16_t address, uint16_t *data)
- {
- modbus_reg_t *reg = modbus_slave_get_reg(address);
- if (reg != NULL)
- {
- *data = reg->data;
- return 0;
- }
- else
- {
- return -1;
- }
- }
- int8_t modbus_slave_reg_write_raw(uint16_t address, uint16_t data)
- {
- modbus_reg_t *reg = modbus_slave_get_reg(address);
- if (reg != NULL)
- {
- reg->data = data;
- return 0;
- }
- else
- {
- return -1;
- }
- }
- int8_t modbus_slave_reg_read(uint16_t address, uint16_t *data)
- {
- modbus_reg_t *reg = modbus_slave_get_reg(address);
- if (reg != NULL)
- {
- if (reg->access == 1)
- {
- return -2;
- }
- if (reg->read_cb != NULL)
- {
- reg->data = reg->read_cb(address);
- }
- *data = reg->data;
- return 0;
- }
- else
- {
- return -1;
- }
- }
- int8_t modbus_slave_reg_write(uint16_t address, uint16_t data)
- {
- modbus_reg_t *reg = modbus_slave_get_reg(address);
- if (reg != NULL)
- {
- if (reg->access == 0)
- {
- return -2;
- }
- reg->data = data;
- if (reg->write_cb != NULL)
- {
- reg->write_cb(address, reg->data);
- }
- return 0;
- }
- else
- {
- return -1;
- }
- }
- int8_t modbus_slave_reg_read_mult(uint16_t address, uint16_t reg_num, uint16_t *data)
- {
- for (int i = 0; i < reg_num; i++)
- {
- if (modbus_slave_reg_read(address + i, data + i) != 0)
- {
- return -1;
- }
- }
- return 0;
- }
- int8_t modbus_slave_reg_write_mult(uint16_t address, uint16_t reg_num, uint16_t *data)
- {
- for (int i = 0; i < reg_num; i++)
- {
- if (modbus_slave_reg_write(address + i, data[i]) != 0)
- {
- return -1;
- }
- }
- return 0;
- }
- int8_t modbus_slave_cmd_add(uint8_t cmd, modbus_slave_cmd_cb_t cmd_cb)
- {
- if (slave.cmd_len < MODBUS_SLAVE_CMD_MAX)
- {
- modbus_cmd_t *box = &(slave.cmds[slave.cmd_len]);
- box->cmd = cmd;
- box->cb = cmd_cb;
- slave.cmd_len++;
- return 0;
- }
- else
- {
- return -1;
- }
- }
- modbus_cmd_t* modbus_slave_cmd_get(uint8_t cmd)
- {
- for (int i = 0; i < slave.cmd_len; i++)
- {
- if (slave.cmds[i].cmd == cmd)
- {
- return &slave.cmds[i];
- }
- }
- return NULL;
- }
- //void modbus_master_init(uint16_t timeout, modbus_master_reg_cb_t reg_cb)
- //{
- // master.state = 0;
- // master.timeout = timeout;
- // master.timeout_counter = 0;
- // master.address = 0;
- // master.function = 0;
- // master.error = 0;
- // master.error_code = 0;
- // master.data_length = 0;
- // master.reg_cb = reg_cb;
- // memset(master.data, 0, 256);
- //}
- //modbus_master_t *modbus_master_get(void)
- //{
- // return &master;
- //}
- //int8_t modbus_master_wait_for_response(void)
- //{
- // if (master.state != 3)
- // {
- // master.timeout_counter += MODBUS_MASTER_SLEEP_TIME;
- // if (master.timeout_counter >= master.timeout)
- // {
- // master.timeout_counter = 0;
- // master.state = 0;
- // master.error = 1;
- // master.error_code = 0;
- // if (master.reg_cb != NULL)
- // {
- // master.reg_cb(master.address, master.error, master.error_code);
- // }
- // return -1;
- // }
- // else
- // {
- // vTaskDelay(pdMS_TO_TICKS(MODBUS_MASTER_SLEEP_TIME));
- // }
- // }
- // master.state = 0;
- // if (master.reg_cb != NULL)
- // {
- // master.reg_cb(master.address, master.error, master.error_code);
- // }
- // return 0;
- //}
- void modbus_set_mode(uint8_t mode)
- {
- modbus_mode = mode;
- }
- uint8_t modbus_get_mode(void)
- {
- return modbus_mode;
- }
|