| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #include "common.h"
- #define DEV_CHN_REG (4000)
- #define SWITCH_STATUE_REG (4001)
- #define POWER_INFO_REG (4002)
- #define TEPM_HUM_REG (4016)
- #define SENCOR_STATUS (4018)
- enum{
- IP_DEV_CHN,
- IP_SWITCH_STATUE,
- IP_POWER_INFO,
- IP_TEMP_HUM,
- IP_SENCOR_STATUS,
- };
- enum{
- TYPE_U16,
- TYPE_U32
- };
- typedef struct mmap_modbus{
- int offset;
- void *addr; //libmodbus source addr
- }mmap_modbus_t;
- typedef struct {
- modbus_mapping_t *map;
- }slave_handle_t;
- static slave_handle_t slHandle;
- modbus_mapping_t *cascade_slave_map()
- {
- return slHandle.map;
- }
- static inline GlobalDeviceManager* get_dm(void)
- {
- return &__globalDeviceManage;
- }
- static mmap_modbus_t modbus_ip[]={
- [IP_DEV_CHN] = {.offset = DEV_CHN_REG },
- [IP_SWITCH_STATUE] = {.offset = SWITCH_STATUE_REG },
- [IP_POWER_INFO] = {.offset = POWER_INFO_REG },
- [IP_TEMP_HUM] = {.offset = TEPM_HUM_REG },
- [IP_SENCOR_STATUS] = {.offset = SENCOR_STATUS }
- };
- int cascade_slave_init(void)
- {
- GlobalDeviceManager* mgr=get_dm();
- slave_handle_t *sh=&slHandle;
- sh->map = modbus_mapping_new_start_address(0,0,0,0,DEV_CHN_REG,500,0,0); //500 ge
- modbus_ip[IP_DEV_CHN].addr = &mgr->cascade_mmap->dev_chn;
- modbus_ip[IP_SWITCH_STATUE].addr = &mgr->cascade_mmap->switch_statues;
- modbus_ip[IP_POWER_INFO] .addr = &mgr->cascade_mmap->o_voltalge;
- modbus_ip[IP_TEMP_HUM] .addr = &mgr->cascade_mmap->tempetratue;
- modbus_ip[IP_SENCOR_STATUS] .addr = &mgr->cascade_mmap->sencor_status;
- printf("single dc address init 4000\n");
- return 0;
- }
- static void slave_read(slave_handle_t *sh, uint32_t addr,int num,uint32_t reg_type,uint32_t type)
- {
- if(addr >= DEV_CHN_REG && addr <= SENCOR_STATUS)
- {
- if(type == TYPE_U16)
- {
- uint16_t *base_addr = (uint16_t *)modbus_ip[reg_type].addr;
- uint32_t step = addr - sh->map->start_registers;
- base_addr = base_addr + (addr - modbus_ip[reg_type].offset);
- uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
- if(num < 126)
- {
- memcpy(map_addr, base_addr,2*num);
- }
- }else
- {
- uint32_t *base_addr = (uint32_t *)modbus_ip[reg_type].addr;
- uint32_t step = addr - sh->map->start_registers;
- base_addr = base_addr + (addr - modbus_ip[reg_type].offset);
- uint32_t *map_addr = (uint32_t *)&(sh->map->tab_registers[step]);
- if(num < 126)
- {
- memcpy(map_addr, base_addr,2*num);
- }
- }
- }
- }
- void cascade_slave_read(uint32_t addr,uint32_t lenth)
- {
- slave_handle_t *sh=&slHandle;
- switch (addr)
- {
- case 4000:
- {
- slave_read(sh,addr,lenth,IP_DEV_CHN,TYPE_U16);
- }
- break;
- case 4001:
- {
- slave_read(sh,addr,lenth,IP_SWITCH_STATUE,TYPE_U16);
- }
- break;
- case 4002 ... 4015:
- {
- slave_read(sh,addr,lenth,IP_POWER_INFO,TYPE_U32);
- }
- break;
- case 4016 ... 4017:
- {
- slave_read(sh,addr,lenth,IP_TEMP_HUM,TYPE_U16);
- }
- break;
- case 4018:
- {
- slave_read(sh,addr,lenth,IP_SENCOR_STATUS,TYPE_U16);
- }
- break;
- default:
- break;
- }
- }
|