cascade_slave.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #include "common.h"
  2. #define DEV_CHN_REG (4000)
  3. #define SWITCH_STATUE_REG (4001)
  4. #define POWER_INFO_REG (4002)
  5. #define TEPM_HUM_REG (4016)
  6. #define SENCOR_STATUS (4018)
  7. enum{
  8. IP_DEV_CHN,
  9. IP_SWITCH_STATUE,
  10. IP_POWER_INFO,
  11. IP_TEMP_HUM,
  12. IP_SENCOR_STATUS,
  13. };
  14. enum{
  15. TYPE_U16,
  16. TYPE_U32
  17. };
  18. typedef struct mmap_modbus{
  19. int offset;
  20. void *addr; //libmodbus source addr
  21. }mmap_modbus_t;
  22. typedef struct {
  23. modbus_mapping_t *map;
  24. }slave_handle_t;
  25. static slave_handle_t slHandle;
  26. modbus_mapping_t *cascade_slave_map()
  27. {
  28. return slHandle.map;
  29. }
  30. static inline GlobalDeviceManager* get_dm(void)
  31. {
  32. return &__globalDeviceManage;
  33. }
  34. static mmap_modbus_t modbus_ip[]={
  35. [IP_DEV_CHN] = {.offset = DEV_CHN_REG },
  36. [IP_SWITCH_STATUE] = {.offset = SWITCH_STATUE_REG },
  37. [IP_POWER_INFO] = {.offset = POWER_INFO_REG },
  38. [IP_TEMP_HUM] = {.offset = TEPM_HUM_REG },
  39. [IP_SENCOR_STATUS] = {.offset = SENCOR_STATUS }
  40. };
  41. int cascade_slave_init(void)
  42. {
  43. GlobalDeviceManager* mgr=get_dm();
  44. slave_handle_t *sh=&slHandle;
  45. sh->map = modbus_mapping_new_start_address(0,0,0,0,DEV_CHN_REG,500,0,0); //500 ge
  46. modbus_ip[IP_DEV_CHN].addr = &mgr->cascade_mmap->dev_chn;
  47. modbus_ip[IP_SWITCH_STATUE].addr = &mgr->cascade_mmap->switch_statues;
  48. modbus_ip[IP_POWER_INFO] .addr = &mgr->cascade_mmap->o_voltalge;
  49. modbus_ip[IP_TEMP_HUM] .addr = &mgr->cascade_mmap->tempetratue;
  50. modbus_ip[IP_SENCOR_STATUS] .addr = &mgr->cascade_mmap->sencor_status;
  51. printf("single dc address init 4000\n");
  52. return 0;
  53. }
  54. static void slave_read(slave_handle_t *sh, uint32_t addr,int num,uint32_t reg_type,uint32_t type)
  55. {
  56. if(addr >= DEV_CHN_REG && addr <= SENCOR_STATUS)
  57. {
  58. if(type == TYPE_U16)
  59. {
  60. uint16_t *base_addr = (uint16_t *)modbus_ip[reg_type].addr;
  61. uint32_t step = addr - sh->map->start_registers;
  62. base_addr = base_addr + (addr - modbus_ip[reg_type].offset);
  63. uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
  64. if(num < 126)
  65. {
  66. memcpy(map_addr, base_addr,2*num);
  67. }
  68. }else
  69. {
  70. uint32_t *base_addr = (uint32_t *)modbus_ip[reg_type].addr;
  71. uint32_t step = addr - sh->map->start_registers;
  72. base_addr = base_addr + (addr - modbus_ip[reg_type].offset);
  73. uint32_t *map_addr = (uint32_t *)&(sh->map->tab_registers[step]);
  74. if(num < 126)
  75. {
  76. memcpy(map_addr, base_addr,2*num);
  77. }
  78. }
  79. }
  80. }
  81. void cascade_slave_read(uint32_t addr,uint32_t lenth)
  82. {
  83. slave_handle_t *sh=&slHandle;
  84. switch (addr)
  85. {
  86. case 4000:
  87. {
  88. slave_read(sh,addr,lenth,IP_DEV_CHN,TYPE_U16);
  89. }
  90. break;
  91. case 4001:
  92. {
  93. slave_read(sh,addr,lenth,IP_SWITCH_STATUE,TYPE_U16);
  94. }
  95. break;
  96. case 4002 ... 4015:
  97. {
  98. slave_read(sh,addr,lenth,IP_POWER_INFO,TYPE_U32);
  99. }
  100. break;
  101. case 4016 ... 4017:
  102. {
  103. slave_read(sh,addr,lenth,IP_TEMP_HUM,TYPE_U16);
  104. }
  105. break;
  106. case 4018:
  107. {
  108. slave_read(sh,addr,lenth,IP_SENCOR_STATUS,TYPE_U16);
  109. }
  110. break;
  111. default:
  112. break;
  113. }
  114. }