slave_485.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /**
  2. * @Author: 李建
  3. * @Date: 2024/8/13 10:38
  4. * Description:
  5. * Copyright: Copyright (©) 2024 永续绿建. All rights reserved.
  6. */
  7. #include "slave_485.h"
  8. #include "mb.h"
  9. #include "cmsis_os2.h"
  10. #include "fan.h"
  11. #include "tim.h"
  12. #include "usart.h"
  13. #include "flash.h"
  14. #include "iwdg.h"
  15. osThreadAttr_t task_attributes = {
  16. .name = "slave_485",
  17. .stack_size = 128 * 6,
  18. .priority = (osPriority_t) osPriorityAboveNormal,
  19. };
  20. USHORT usSRegHoldStart = S_REG_HOLDING_START;
  21. USHORT usSRegHoldBuf[S_REG_HOLDING_NREGS] = {0};
  22. static uint8_t wire_controller_acc = 0; // 线控器通讯累加器
  23. eMBRTUSlaveObj wireControllerSlaveObj;
  24. uint8_t test = 0;
  25. static eMBErrorCode RegInputCB(UCHAR *pucRegBuffer, USHORT usAddress, USHORT usNRegs) {
  26. return MB_ENOERR;
  27. }
  28. static eMBErrorCode RegHoldingCB(UCHAR *pucRegBuffer, USHORT usAddress,
  29. USHORT usNRegs, eMBRegisterMode eMode) {
  30. eMBErrorCode eStatus = MB_ENOERR;
  31. USHORT iRegIndex;
  32. USHORT *pusRegHoldingBuf;
  33. USHORT REG_HOLDING_START;
  34. USHORT REG_HOLDING_NREGS;
  35. USHORT usRegHoldStart;
  36. pusRegHoldingBuf = usSRegHoldBuf;
  37. REG_HOLDING_START = S_REG_HOLDING_START;
  38. REG_HOLDING_NREGS = S_REG_HOLDING_NREGS;
  39. usRegHoldStart = usSRegHoldStart;
  40. /* it already plus one in modbus function method. */
  41. usAddress--;
  42. if ((usAddress >= REG_HOLDING_START)
  43. && (usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS)) {
  44. iRegIndex = usAddress - usRegHoldStart;
  45. switch (eMode) {
  46. /* read current register values from the protocol stack. */
  47. case MB_REG_READ:
  48. while (usNRegs > 0) {
  49. *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] >> 8);
  50. *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] & 0xFF);
  51. iRegIndex++;
  52. usNRegs--;
  53. }
  54. break;
  55. /* write current register values with new values from the protocol stack. */
  56. case MB_REG_WRITE:
  57. while (usNRegs > 0) {
  58. if(iRegIndex==0)
  59. {
  60. set_reg_value(FAN1_LEVEL_REG_ADDRESS,0);
  61. set_reg_value(FAN2_LEVEL_REG_ADDRESS,0);
  62. set_reg_value(FAN3_LEVEL_REG_ADDRESS,0);
  63. set_reg_value(FAN4_LEVEL_REG_ADDRESS,0);
  64. set_reg_value(FAN5_LEVEL_REG_ADDRESS,0);
  65. }
  66. pusRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;
  67. pusRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;
  68. iRegIndex++;
  69. usNRegs--;
  70. }
  71. break;
  72. }
  73. } else {
  74. eStatus = MB_ENOREG;
  75. }
  76. wire_controller_acc = 0;
  77. return eStatus;
  78. }
  79. /**
  80. * Modbus slave coils callback function.
  81. *
  82. * @param pucRegBuffer coils buffer
  83. * @param usAddress coils address
  84. * @param usNCoils coils number
  85. * @param eMode read or write
  86. *
  87. * @return result
  88. */
  89. eMBErrorCode RegCoilsCB(UCHAR *pucRegBuffer, USHORT usAddress,
  90. USHORT usNCoils, eMBRegisterMode eMode) {
  91. return MB_ENOERR;
  92. }
  93. /**
  94. * Modbus slave discrete callback function.
  95. *
  96. * @param pucRegBuffer discrete buffer
  97. * @param usAddress discrete address
  98. * @param usNDiscrete discrete number
  99. *
  100. * @return result
  101. */
  102. eMBErrorCode RegDiscreteCB(UCHAR *pucRegBuffer, USHORT usAddress, USHORT usNDiscrete) {
  103. return MB_ENOERR;
  104. }
  105. void set_reg_value(uint8_t reg_address, uint16_t reg_value) {
  106. usSRegHoldBuf[reg_address] = reg_value;
  107. }
  108. void get_reg_value(uint8_t reg_address, uint16_t *reg_value) {
  109. *reg_value = usSRegHoldBuf[reg_address];
  110. }
  111. uint16_t get_reg_value2(uint8_t reg_address) {
  112. return usSRegHoldBuf[reg_address];
  113. }
  114. _Noreturn void reg_check_task(void *pv) {
  115. uint16_t power=0, fan_level=0,dipnum=0;
  116. for (;;) {
  117. dipnum=read_dip5();//0 1 2 ,
  118. for(int i=0;i<dipnum;i++)
  119. {
  120. HAL_TIM_PWM_Start(PWMComParam[i].htim, PWMComParam[i].timChannel);
  121. get_reg_value(FAN1_LEVEL_REG_ADDRESS+dipBuf[i],&fan_level);
  122. if(fan_level<=0)
  123. {
  124. fan_control(PWMComParam[i],0);
  125. }else{
  126. fan_control(PWMComParam[i],40+(fan_level/9*2));
  127. }
  128. }
  129. HAL_IWDG_Refresh(&hiwdg);
  130. osDelay(500);
  131. }
  132. }
  133. _Noreturn void slave_485_task(void *pvParameters) {
  134. // 回调配置
  135. mb_reg_callback_t calls = {
  136. .eMbRegHoldingCb = RegHoldingCB,
  137. .eMbRegInputCb = RegInputCB,
  138. };
  139. wireControllerSlaveObj.eMode = MB_RTU;
  140. wireControllerSlaveObj.ucSlaveAddress = (uint8_t) pvParameters;
  141. wireControllerSlaveObj.ulBaudRate = 9600;
  142. wireControllerSlaveObj.eParity = MB_PAR_NONE;
  143. wireControllerSlaveObj.pTimHandle = htim2;
  144. wireControllerSlaveObj.pUartHandle = huart2;
  145. wireControllerSlaveObj.enPort = GPIOA;
  146. wireControllerSlaveObj.enPin = GPIO_PIN_1;
  147. wireControllerSlaveObj.callback = &calls;
  148. eMBInit(&wireControllerSlaveObj);
  149. eMBEnable(&wireControllerSlaveObj);
  150. for (;;) {
  151. eMBPoll(&wireControllerSlaveObj);
  152. osDelay(5);
  153. }
  154. }
  155. /**
  156. * 初始化485从站
  157. */
  158. void slave_485_init(uint8_t address) {
  159. osThreadNew(slave_485_task, (void *) address, &task_attributes);
  160. osThreadNew(reg_check_task, NULL, &task_attributes);
  161. }