您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

250 行
6.6 KiB

  1. #include "plsr_modbus_data.h"
  2. #include "modbus_data_store.h"
  3. #include <stddef.h>
  4. #ifndef PLSR_HOST_TEST
  5. #include "stm32f4xx_hal.h"
  6. typedef struct
  7. {
  8. GPIO_TypeDef *port;
  9. uint16_t pin;
  10. uint8_t point;
  11. uint8_t activeLow;
  12. } PLSR_MODBUS_INPUT_PIN;
  13. /* Project attachment "实现PLSR指令.pdf", XDM-60T4-E page 3.
  14. * X13=PA14 is intentionally omitted because PA14 is SWDCLK while board
  15. * validation/debug is active. X21..X43 have no supplied MCU mapping. */
  16. static const PLSR_MODBUS_INPUT_PIN PlsrModbusInputPins[] =
  17. {
  18. {GPIOH, GPIO_PIN_10, 0U, 0U}, /* X0 */
  19. {GPIOH, GPIO_PIN_11, 1U, 0U}, /* X1 */
  20. {GPIOG, GPIO_PIN_8, 2U, 0U}, /* X2 */
  21. {GPIOB, GPIO_PIN_4, 3U, 0U}, /* X3 */
  22. {GPIOB, GPIO_PIN_5, 4U, 0U}, /* X4 */
  23. {GPIOG, GPIO_PIN_12, 5U, 0U}, /* X5 */
  24. {GPIOB, GPIO_PIN_6, 6U, 0U}, /* X6 */
  25. {GPIOB, GPIO_PIN_7, 7U, 0U}, /* X7 */
  26. {GPIOF, GPIO_PIN_10, 10U, 0U}, /* X10 */
  27. {GPIOA, GPIO_PIN_15, 11U, 0U}, /* X11 */
  28. {GPIOB, GPIO_PIN_3, 12U, 0U}, /* X12 */
  29. {GPIOI, GPIO_PIN_4, 14U, 0U}, /* X14 */
  30. {GPIOI, GPIO_PIN_5, 15U, 0U}, /* X15 */
  31. {GPIOI, GPIO_PIN_6, 16U, 0U}, /* X16 */
  32. {GPIOI, GPIO_PIN_7, 17U, 0U}, /* X17 */
  33. {GPIOE, GPIO_PIN_2, 20U, 0U} /* X20 */
  34. };
  35. #define PLSR_MODBUS_INPUT_PIN_COUNT \
  36. ((uint32_t)(sizeof(PlsrModbusInputPins) \
  37. / sizeof(PlsrModbusInputPins[0])))
  38. static uint32_t PlsrModbusInputRawMask;
  39. static uint32_t PlsrModbusInputLogicalMask;
  40. static uint32_t PlsrModbusInputMappedMask;
  41. static uint8_t PlsrModbusInputIsMapped(uint32_t point)
  42. {
  43. return ((point < 32UL)
  44. && ((PlsrModbusInputMappedMask & (1UL << point)) != 0UL))
  45. ? 1U
  46. : 0U;
  47. }
  48. #endif
  49. static uint8_t PlsrModbusDevice(PLSR_DEVICE_TYPE device,
  50. MODBUS_DATA_DEVICE *modbusDevice)
  51. {
  52. if ((modbusDevice == NULL) || (device > PLSR_DEVICE_FD))
  53. {
  54. return 0U;
  55. }
  56. *modbusDevice = (MODBUS_DATA_DEVICE)device;
  57. return 1U;
  58. }
  59. static uint8_t PlsrModbusValidateWords(void *context,
  60. PLSR_DEVICE_TYPE device,
  61. uint32_t firstAddress,
  62. uint32_t wordCount)
  63. {
  64. MODBUS_DATA_DEVICE modbusDevice;
  65. (void)context;
  66. if (PlsrModbusDevice(device, &modbusDevice) == 0U)
  67. {
  68. return 0U;
  69. }
  70. return ModbusDataValidateWords(modbusDevice, firstAddress, wordCount);
  71. }
  72. static uint8_t PlsrModbusReadWord(void *context,
  73. PLSR_DEVICE_TYPE device,
  74. uint32_t address,
  75. uint16_t *value)
  76. {
  77. MODBUS_DATA_DEVICE modbusDevice;
  78. (void)context;
  79. if (PlsrModbusDevice(device, &modbusDevice) == 0U)
  80. {
  81. return 0U;
  82. }
  83. return ModbusDataReadWord(modbusDevice, address, value);
  84. }
  85. static uint8_t PlsrModbusReadDword(void *context,
  86. PLSR_DEVICE_TYPE device,
  87. uint32_t address,
  88. int32_t *value)
  89. {
  90. MODBUS_DATA_DEVICE modbusDevice;
  91. (void)context;
  92. if (PlsrModbusDevice(device, &modbusDevice) == 0U)
  93. {
  94. return 0U;
  95. }
  96. return ModbusDataReadDword(modbusDevice, address, value);
  97. }
  98. static uint8_t PlsrModbusBitDevice(PLSR_DEVICE_TYPE device,
  99. MODBUS_BIT_DEVICE *modbusDevice)
  100. {
  101. if ((modbusDevice == NULL) || (device < PLSR_DEVICE_X)
  102. || (device > PLSR_DEVICE_HM))
  103. {
  104. return 0U;
  105. }
  106. *modbusDevice = (MODBUS_BIT_DEVICE)(device - PLSR_DEVICE_X);
  107. return 1U;
  108. }
  109. static uint8_t PlsrModbusReadBit(void *context,
  110. PLSR_DEVICE_TYPE device,
  111. uint32_t address,
  112. uint8_t *value)
  113. {
  114. MODBUS_BIT_DEVICE modbusDevice;
  115. (void)context;
  116. if (PlsrModbusBitDevice(device, &modbusDevice) == 0U)
  117. {
  118. return 0U;
  119. }
  120. #ifndef PLSR_HOST_TEST
  121. if ((device == PLSR_DEVICE_X)
  122. && (PlsrModbusInputIsMapped(address) == 0U))
  123. {
  124. return 0U;
  125. }
  126. #endif
  127. return ModbusDataReadBit(modbusDevice, address, value);
  128. }
  129. void PlsrModbusDataSourceInit(PLSR_DATA_SOURCE *source)
  130. {
  131. if (source == NULL)
  132. {
  133. return;
  134. }
  135. source->context = NULL;
  136. source->validateWords = PlsrModbusValidateWords;
  137. source->readWord = PlsrModbusReadWord;
  138. source->readDword = PlsrModbusReadDword;
  139. source->readBit = PlsrModbusReadBit;
  140. }
  141. PLSR_RESULT PlsrModbusInputInit(void)
  142. {
  143. #ifdef PLSR_HOST_TEST
  144. return PLSR_RESULT_OK;
  145. #else
  146. GPIO_InitTypeDef gpio;
  147. uint32_t index;
  148. __HAL_RCC_GPIOA_CLK_ENABLE();
  149. __HAL_RCC_GPIOB_CLK_ENABLE();
  150. __HAL_RCC_GPIOE_CLK_ENABLE();
  151. __HAL_RCC_GPIOF_CLK_ENABLE();
  152. __HAL_RCC_GPIOG_CLK_ENABLE();
  153. __HAL_RCC_GPIOH_CLK_ENABLE();
  154. __HAL_RCC_GPIOI_CLK_ENABLE();
  155. gpio.Mode = GPIO_MODE_INPUT;
  156. gpio.Pull = GPIO_NOPULL;
  157. gpio.Speed = GPIO_SPEED_FREQ_LOW;
  158. gpio.Alternate = 0U;
  159. PlsrModbusInputMappedMask = 0UL;
  160. for (index = 0UL; index < PLSR_MODBUS_INPUT_PIN_COUNT; index++)
  161. {
  162. gpio.Pin = PlsrModbusInputPins[index].pin;
  163. HAL_GPIO_Init(PlsrModbusInputPins[index].port, &gpio);
  164. PlsrModbusInputMappedMask |=
  165. 1UL << PlsrModbusInputPins[index].point;
  166. }
  167. PlsrModbusInputPoll();
  168. return PLSR_RESULT_OK;
  169. #endif
  170. }
  171. void PlsrModbusInputPoll(void)
  172. {
  173. #ifndef PLSR_HOST_TEST
  174. uint32_t rawMask = 0UL;
  175. uint32_t logicalMask = 0UL;
  176. uint32_t index;
  177. for (index = 0UL; index < PLSR_MODBUS_INPUT_PIN_COUNT; index++)
  178. {
  179. const PLSR_MODBUS_INPUT_PIN *input = &PlsrModbusInputPins[index];
  180. uint8_t raw = ((input->port->IDR & input->pin) != 0UL) ? 1U : 0U;
  181. uint8_t logical = (input->activeLow != 0U)
  182. ? ((raw == 0U) ? 1U : 0U)
  183. : raw;
  184. if (raw != 0U)
  185. {
  186. rawMask |= 1UL << input->point;
  187. }
  188. if (logical != 0U)
  189. {
  190. logicalMask |= 1UL << input->point;
  191. }
  192. (void)ModbusDataWriteBit(MODBUS_BIT_DEVICE_X,
  193. input->point,
  194. logical);
  195. }
  196. PlsrModbusInputRawMask = rawMask;
  197. PlsrModbusInputLogicalMask = logicalMask;
  198. #endif
  199. }
  200. uint32_t PlsrModbusInputGetRawMask(void)
  201. {
  202. #ifdef PLSR_HOST_TEST
  203. return 0UL;
  204. #else
  205. return PlsrModbusInputRawMask;
  206. #endif
  207. }
  208. uint32_t PlsrModbusInputGetLogicalMask(void)
  209. {
  210. #ifdef PLSR_HOST_TEST
  211. return 0UL;
  212. #else
  213. return PlsrModbusInputLogicalMask;
  214. #endif
  215. }
  216. uint32_t PlsrModbusInputGetMappedMask(void)
  217. {
  218. #ifdef PLSR_HOST_TEST
  219. return 0UL;
  220. #else
  221. return PlsrModbusInputMappedMask;
  222. #endif
  223. }