| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- #include "stdio.h"
- #include "string.h"
- #include "board.h"
- #include "small_modbus.h"
- #include "board_virtualIO.h"
- void vio_lowlevel_update(void);
- #define INPUT_COILS_MAX 64
- uint8_t input_coils[INPUT_COILS_MAX / 8] = {0};
- int vio_read_input_coils(uint16_t addr, uint16_t num, uint8_t *buffer)
- {
- uint16_t index = 0;
- uint16_t io_start = 0;
- uint16_t io_end = 0;
- if ((0 <= addr) && (addr < INPUT_COILS_MAX))
- {
- io_start = addr;
- if ((addr + num) > (INPUT_COILS_MAX))
- {
- io_end = INPUT_COILS_MAX;
- }
- else
- {
- io_end = addr + num;
- }
- while (io_start < io_end)
- {
- dio_set_val(buffer, index, dio_get_val(input_coils, io_start));
- io_start++;
- index++;
- }
- }
- return index;
- }
- int vio_lowlevel_update_input_coils(uint16_t addr, uint16_t num, uint8_t *buffer)
- {
- uint16_t index = 0;
- uint16_t io_start = 0;
- uint16_t io_end = 0;
- if ((0 <= addr) && (addr < INPUT_COILS_MAX))
- {
- io_start = addr;
- if ((addr + num) > (INPUT_COILS_MAX))
- {
- io_end = INPUT_COILS_MAX;
- }
- else
- {
- io_end = addr + num;
- }
- while (io_start < io_end)
- {
- dio_set_val(input_coils, io_start, dio_get_val(buffer, index));
- io_start++;
- index++;
- }
- }
- return index;
- }
- #define HOLD_COILS_MAX 64
- uint8_t hold_coils[HOLD_COILS_MAX / 8] = {0};
- int vio_read_hold_coils(uint16_t addr, uint16_t num, uint8_t *buffer)
- {
- uint16_t index = 0;
- uint16_t io_start = 0;
- uint16_t io_end = 0;
- if ((0 <= addr) && (addr < HOLD_COILS_MAX))
- {
- io_start = addr;
- if ((addr + num) > (HOLD_COILS_MAX))
- {
- io_end = HOLD_COILS_MAX;
- }
- else
- {
- io_end = addr + num;
- }
- while (io_start < io_end)
- {
- dio_set_val(buffer, index, dio_get_val(hold_coils, io_start));
- io_start++;
- index++;
- }
- }
- return index;
- }
- int vio_write_hold_coils(uint16_t addr, uint16_t num, uint8_t *buffer)
- {
- uint16_t count = 0;
- uint16_t index = 0;
- uint16_t io_start = 0;
- uint16_t io_end = 0;
- int val_old = 0;
- int val_new = 0;
- if ((0 <= addr) && (addr < HOLD_COILS_MAX))
- {
- io_start = addr;
- if ((addr + num) > (HOLD_COILS_MAX))
- {
- io_end = HOLD_COILS_MAX;
- }
- else
- {
- io_end = addr + num;
- }
- while (io_start < io_end)
- {
- val_old = dio_get_val(hold_coils, io_start);
- val_new = dio_get_val(buffer, index);
- if (val_old != val_new)
- {
- dio_set_val(hold_coils, io_start, val_new);
- count++;
- }
- io_start++;
- index++;
- }
- }
- if (count)
- {
- //通知硬件更新输出
- vio_lowlevel_update();
- }
- return index;
- }
- int vio_lowlevel_update_hold_coils(uint16_t addr, uint16_t num, uint8_t *buffer)
- {
- uint16_t index = 0;
- uint16_t io_start = 0;
- uint16_t io_end = 0;
- if ((0 <= addr) && (addr < HOLD_COILS_MAX))
- {
- io_start = addr;
- if ((addr + num) > (HOLD_COILS_MAX))
- {
- io_end = HOLD_COILS_MAX;
- }
- else
- {
- io_end = addr + num;
- }
- while (io_start < io_end)
- {
- dio_set_val(hold_coils, io_start, dio_get_val(buffer, index));
- io_start++;
- index++;
- }
- }
- return index;
- }
- #define INPUT_REG_MAX 16
- uint16_t input_regs[INPUT_REG_MAX] = {0};
- int vio_read_input_regs(uint16_t addr, uint16_t num, uint16_t *buffer)
- {
- uint16_t index = 0;
- uint16_t io_start = 0;
- uint16_t io_end = 0;
- if ((0 <= addr) && (addr < INPUT_REG_MAX))
- {
- io_start = addr;
- if ((addr + num) > (INPUT_REG_MAX))
- {
- io_end = INPUT_REG_MAX;
- }
- else
- {
- io_end = addr + num;
- }
- while (io_start < io_end)
- {
- aio_set_val(buffer, index, aio_get_val(input_regs, io_start));
- io_start++;
- index++;
- }
- }
- return index;
- }
- int vio_lowlevel_update_input_regs(uint16_t addr, uint16_t num, uint16_t *buffer)
- {
- uint16_t index = 0;
- uint16_t io_start = 0;
- uint16_t io_end = 0;
- if ((0 <= addr) && (addr < INPUT_REG_MAX))
- {
- io_start = addr;
- if ((addr + num) > (INPUT_REG_MAX))
- {
- io_end = INPUT_REG_MAX;
- }
- else
- {
- io_end = addr + num;
- }
- while (io_start < io_end)
- {
- aio_set_val(input_regs, io_start, aio_get_val(buffer, index));
- io_start++;
- index++;
- }
- }
- return index;
- }
- #define HOLD_REG_MAX 16
- uint16_t hold_regs[HOLD_REG_MAX] = {0};
- int vio_read_hold_regs(uint16_t addr, uint16_t num, uint16_t *buffer)
- {
- uint16_t index = 0;
- uint16_t io_start = 0;
- uint16_t io_end = 0;
- if ((0 <= addr) && (addr < HOLD_REG_MAX))
- {
- io_start = addr;
- if ((addr + num) > (HOLD_REG_MAX))
- {
- io_end = HOLD_REG_MAX;
- }
- else
- {
- io_end = addr + num;
- }
- while (io_start < io_end)
- {
- aio_set_val(buffer, index, aio_get_val(hold_regs, io_start));
- io_start++;
- index++;
- }
- }
- return index;
- }
- int vio_write_hold_regs(uint16_t addr, uint16_t num, uint16_t *buffer)
- {
- uint16_t count = 0;
- uint16_t index = 0;
- uint16_t io_start = 0;
- uint16_t io_end = 0;
- int val_old = 0;
- int val_new = 0;
- if ((0 <= addr) && (addr < HOLD_REG_MAX))
- {
- io_start = addr;
- if ((addr + num) > (HOLD_REG_MAX))
- {
- io_end = HOLD_REG_MAX;
- }
- else
- {
- io_end = addr + num;
- }
- while (io_start < io_end)
- {
- val_old = aio_get_val(hold_regs, io_start);
- val_new = aio_get_val(buffer, index);
- if (val_old != val_new)
- {
- aio_set_val(hold_regs, io_start, val_new);
- count++;
- }
- io_start++;
- index++;
- }
- }
- if (count)
- {
- //通知硬件更新输出
- vio_lowlevel_update();
- }
- return index;
- }
- int vio_lowlevel_update_hold_regs(uint16_t addr, uint16_t num, uint16_t *buffer)
- {
- uint16_t index = 0;
- uint16_t io_start = 0;
- uint16_t io_end = 0;
- if ((0 <= addr) && (addr < HOLD_REG_MAX))
- {
- io_start = addr;
- if ((addr + num) > (HOLD_REG_MAX))
- {
- io_end = HOLD_REG_MAX;
- }
- else
- {
- io_end = addr + num;
- }
- while (io_start < io_end)
- {
- aio_set_val(hold_regs, io_start, aio_get_val(buffer, index));
- io_start++;
- index++;
- }
- }
- return index;
- }
|