slave_485.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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. // }
  67. pusRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;
  68. pusRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;
  69. iRegIndex++;
  70. usNRegs--;
  71. }
  72. break;
  73. }
  74. } else {
  75. eStatus = MB_ENOREG;
  76. }
  77. wire_controller_acc = 0;
  78. return eStatus;
  79. }
  80. /**
  81. * Modbus slave coils callback function.
  82. *
  83. * @param pucRegBuffer coils buffer
  84. * @param usAddress coils address
  85. * @param usNCoils coils number
  86. * @param eMode read or write
  87. *
  88. * @return result
  89. */
  90. eMBErrorCode RegCoilsCB(UCHAR *pucRegBuffer, USHORT usAddress,
  91. USHORT usNCoils, eMBRegisterMode eMode) {
  92. return MB_ENOERR;
  93. }
  94. /**
  95. * Modbus slave discrete callback function.
  96. *
  97. * @param pucRegBuffer discrete buffer
  98. * @param usAddress discrete address
  99. * @param usNDiscrete discrete number
  100. *
  101. * @return result
  102. */
  103. eMBErrorCode RegDiscreteCB(UCHAR *pucRegBuffer, USHORT usAddress, USHORT usNDiscrete) {
  104. return MB_ENOERR;
  105. }
  106. void set_reg_value(uint8_t reg_address, uint16_t reg_value) {
  107. usSRegHoldBuf[reg_address] = reg_value;
  108. }
  109. void get_reg_value(uint8_t reg_address, uint16_t *reg_value) {
  110. *reg_value = usSRegHoldBuf[reg_address];
  111. }
  112. uint16_t get_reg_value2(uint8_t reg_address) {
  113. return usSRegHoldBuf[reg_address];
  114. }
  115. _Noreturn void reg_check_task(void *pv) {
  116. uint16_t power=0, fan_level=0,dipnum=0;
  117. for (;;) {
  118. dipnum=read_dip5();//0 1 2 ,
  119. get_reg_value(POWER_REG_ADDRESS,&power);
  120. if(power==0)
  121. {
  122. for(int i=0;i<dipnum;i++)
  123. {
  124. fan_control(PWMComParam[i],0);
  125. HAL_TIM_PWM_Stop(PWMComParam[i].htim, PWMComParam[i].timChannel);
  126. }
  127. }else {
  128. for(int i=0;i<dipnum;i++)
  129. {
  130. get_reg_value(FAN1_LEVEL_REG_ADDRESS+dipBuf[i],&fan_level);
  131. if(fan_level<=0)
  132. {
  133. fan_control(PWMComParam[i],0);
  134. HAL_TIM_PWM_Stop(PWMComParam[i].htim, PWMComParam[i].timChannel);
  135. }else{
  136. HAL_TIM_PWM_Start(PWMComParam[i].htim, PWMComParam[i].timChannel);
  137. fan_control(PWMComParam[i],40+(fan_level/9));
  138. }
  139. }
  140. }
  141. HAL_IWDG_Refresh(&hiwdg);
  142. osDelay(500);
  143. }
  144. }
  145. _Noreturn void slave_485_task(void *pvParameters) {
  146. // 回调配置
  147. mb_reg_callback_t calls = {
  148. .eMbRegHoldingCb = RegHoldingCB,
  149. .eMbRegInputCb = RegInputCB,
  150. };
  151. wireControllerSlaveObj.eMode = MB_RTU;
  152. wireControllerSlaveObj.ucSlaveAddress = (uint8_t) pvParameters;
  153. wireControllerSlaveObj.ulBaudRate = 9600;
  154. wireControllerSlaveObj.eParity = MB_PAR_NONE;
  155. wireControllerSlaveObj.pTimHandle = htim2;
  156. wireControllerSlaveObj.pUartHandle = huart2;
  157. wireControllerSlaveObj.enPort = GPIOA;
  158. wireControllerSlaveObj.enPin = GPIO_PIN_1;
  159. wireControllerSlaveObj.callback = &calls;
  160. eMBInit(&wireControllerSlaveObj);
  161. eMBEnable(&wireControllerSlaveObj);
  162. for (;;) {
  163. eMBPoll(&wireControllerSlaveObj);
  164. osDelay(5);
  165. }
  166. }
  167. /**
  168. * 初始化485从站
  169. */
  170. void slave_485_init(uint8_t address) {
  171. osThreadNew(slave_485_task, (void *) address, &task_attributes);
  172. osThreadNew(reg_check_task, NULL, &task_attributes);
  173. }