#include "plsr_modbus_data.h" #include "modbus_data_store.h" #include #ifndef PLSR_HOST_TEST #include "stm32f4xx_hal.h" typedef struct { GPIO_TypeDef *port; uint16_t pin; uint8_t point; uint8_t activeLow; } PLSR_MODBUS_INPUT_PIN; /* Project attachment "实现PLSR指令.pdf", XDM-60T4-E page 3. * X13=PA14 is intentionally omitted because PA14 is SWDCLK while board * validation/debug is active. X21..X43 have no supplied MCU mapping. */ static const PLSR_MODBUS_INPUT_PIN PlsrModbusInputPins[] = { {GPIOH, GPIO_PIN_10, 0U, 0U}, /* X0 */ {GPIOH, GPIO_PIN_11, 1U, 0U}, /* X1 */ {GPIOG, GPIO_PIN_8, 2U, 0U}, /* X2 */ {GPIOB, GPIO_PIN_4, 3U, 0U}, /* X3 */ {GPIOB, GPIO_PIN_5, 4U, 0U}, /* X4 */ {GPIOG, GPIO_PIN_12, 5U, 0U}, /* X5 */ {GPIOB, GPIO_PIN_6, 6U, 0U}, /* X6 */ {GPIOB, GPIO_PIN_7, 7U, 0U}, /* X7 */ {GPIOF, GPIO_PIN_10, 10U, 0U}, /* X10 */ {GPIOA, GPIO_PIN_15, 11U, 0U}, /* X11 */ {GPIOB, GPIO_PIN_3, 12U, 0U}, /* X12 */ {GPIOI, GPIO_PIN_4, 14U, 0U}, /* X14 */ {GPIOI, GPIO_PIN_5, 15U, 0U}, /* X15 */ {GPIOI, GPIO_PIN_6, 16U, 0U}, /* X16 */ {GPIOI, GPIO_PIN_7, 17U, 0U}, /* X17 */ {GPIOE, GPIO_PIN_2, 20U, 0U} /* X20 */ }; #define PLSR_MODBUS_INPUT_PIN_COUNT \ ((uint32_t)(sizeof(PlsrModbusInputPins) \ / sizeof(PlsrModbusInputPins[0]))) static uint32_t PlsrModbusInputRawMask; static uint32_t PlsrModbusInputLogicalMask; static uint32_t PlsrModbusInputMappedMask; static uint8_t PlsrModbusInputIsMapped(uint32_t point) { return ((point < 32UL) && ((PlsrModbusInputMappedMask & (1UL << point)) != 0UL)) ? 1U : 0U; } #endif static uint8_t PlsrModbusDevice(PLSR_DEVICE_TYPE device, MODBUS_DATA_DEVICE *modbusDevice) { if ((modbusDevice == NULL) || (device > PLSR_DEVICE_FD)) { return 0U; } *modbusDevice = (MODBUS_DATA_DEVICE)device; return 1U; } static uint8_t PlsrModbusValidateWords(void *context, PLSR_DEVICE_TYPE device, uint32_t firstAddress, uint32_t wordCount) { MODBUS_DATA_DEVICE modbusDevice; (void)context; if (PlsrModbusDevice(device, &modbusDevice) == 0U) { return 0U; } return ModbusDataValidateWords(modbusDevice, firstAddress, wordCount); } static uint8_t PlsrModbusReadWord(void *context, PLSR_DEVICE_TYPE device, uint32_t address, uint16_t *value) { MODBUS_DATA_DEVICE modbusDevice; (void)context; if (PlsrModbusDevice(device, &modbusDevice) == 0U) { return 0U; } return ModbusDataReadWord(modbusDevice, address, value); } static uint8_t PlsrModbusReadDword(void *context, PLSR_DEVICE_TYPE device, uint32_t address, int32_t *value) { MODBUS_DATA_DEVICE modbusDevice; (void)context; if (PlsrModbusDevice(device, &modbusDevice) == 0U) { return 0U; } return ModbusDataReadDword(modbusDevice, address, value); } static uint8_t PlsrModbusBitDevice(PLSR_DEVICE_TYPE device, MODBUS_BIT_DEVICE *modbusDevice) { if ((modbusDevice == NULL) || (device < PLSR_DEVICE_X) || (device > PLSR_DEVICE_HM)) { return 0U; } *modbusDevice = (MODBUS_BIT_DEVICE)(device - PLSR_DEVICE_X); return 1U; } static uint8_t PlsrModbusReadBit(void *context, PLSR_DEVICE_TYPE device, uint32_t address, uint8_t *value) { MODBUS_BIT_DEVICE modbusDevice; (void)context; if (PlsrModbusBitDevice(device, &modbusDevice) == 0U) { return 0U; } #ifndef PLSR_HOST_TEST if ((device == PLSR_DEVICE_X) && (PlsrModbusInputIsMapped(address) == 0U)) { return 0U; } #endif return ModbusDataReadBit(modbusDevice, address, value); } void PlsrModbusDataSourceInit(PLSR_DATA_SOURCE *source) { if (source == NULL) { return; } source->context = NULL; source->validateWords = PlsrModbusValidateWords; source->readWord = PlsrModbusReadWord; source->readDword = PlsrModbusReadDword; source->readBit = PlsrModbusReadBit; } PLSR_RESULT PlsrModbusInputInit(void) { #ifdef PLSR_HOST_TEST return PLSR_RESULT_OK; #else GPIO_InitTypeDef gpio; uint32_t index; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOI_CLK_ENABLE(); gpio.Mode = GPIO_MODE_INPUT; gpio.Pull = GPIO_NOPULL; gpio.Speed = GPIO_SPEED_FREQ_LOW; gpio.Alternate = 0U; PlsrModbusInputMappedMask = 0UL; for (index = 0UL; index < PLSR_MODBUS_INPUT_PIN_COUNT; index++) { gpio.Pin = PlsrModbusInputPins[index].pin; HAL_GPIO_Init(PlsrModbusInputPins[index].port, &gpio); PlsrModbusInputMappedMask |= 1UL << PlsrModbusInputPins[index].point; } PlsrModbusInputPoll(); return PLSR_RESULT_OK; #endif } void PlsrModbusInputPoll(void) { #ifndef PLSR_HOST_TEST uint32_t rawMask = 0UL; uint32_t logicalMask = 0UL; uint32_t index; for (index = 0UL; index < PLSR_MODBUS_INPUT_PIN_COUNT; index++) { const PLSR_MODBUS_INPUT_PIN *input = &PlsrModbusInputPins[index]; uint8_t raw = ((input->port->IDR & input->pin) != 0UL) ? 1U : 0U; uint8_t logical = (input->activeLow != 0U) ? ((raw == 0U) ? 1U : 0U) : raw; if (raw != 0U) { rawMask |= 1UL << input->point; } if (logical != 0U) { logicalMask |= 1UL << input->point; } (void)ModbusDataWriteBit(MODBUS_BIT_DEVICE_X, input->point, logical); } PlsrModbusInputRawMask = rawMask; PlsrModbusInputLogicalMask = logicalMask; #endif } uint32_t PlsrModbusInputGetRawMask(void) { #ifdef PLSR_HOST_TEST return 0UL; #else return PlsrModbusInputRawMask; #endif } uint32_t PlsrModbusInputGetLogicalMask(void) { #ifdef PLSR_HOST_TEST return 0UL; #else return PlsrModbusInputLogicalMask; #endif } uint32_t PlsrModbusInputGetMappedMask(void) { #ifdef PLSR_HOST_TEST return 0UL; #else return PlsrModbusInputMappedMask; #endif }