This commit is contained in:
2025-12-13 22:56:37 +03:00
parent dce9b85a84
commit 61182cd5e5

View File

@@ -1,8 +1,4 @@
#include "modbus.h"
#define TX_EN GPIO_WriteBit(RS485_GPIO, RS485_GPIO_Pin, Bit_SET);
#define TX_DIS GPIO_WriteBit(RS485_GPIO, RS485_GPIO_Pin, Bit_RESET);
#define MODBUS_LED_ON GPIO_WriteBit(Modbus_LED, Modbus_LED_Pin, Bit_SET);
#define MODBUS_LED_OFF GPIO_WriteBit(Modbus_LED, Modbus_LED_Pin, Bit_RESET);
static uint8_t buf_ptr = 0;
static unsigned char rx_buf_ptr = 0;
@@ -34,13 +30,17 @@ static void (*ModbusRIRPoll)(void);
static void (*ModbusRHRPoll)(void);
static void (*ModbusWSRPoll)(uint16_t, uint16_t);
#ifdef CURRENT_OPERATION_MODE_UART
void modbus_connect_callback_send_byte(void (*s)(USART_TypeDef*, unsigned char)) {
ModbusUartSendByte = s;
}
#endif
#ifdef CURRENT_OPERATION_MODE_TCP
void modbus_connect_callback_send_buf_tcp(int32_t (*s)(uint8_t, unsigned char*, uint16_t)) {
ModbusTcpSendByte = s;
}
#endif
void modbus_connect_callback_rir_poll(void (*s)(void)) {
ModbusRIRPoll = s;
@@ -90,9 +90,8 @@ void modbus_wsr_answer() {
CRC16 = modbus_CRC16(crc_buf, 6);
switch(CURRENT_OPERATION_MODE) {
case 0:
TX_EN;
#ifdef CURRENT_OPERATION_MODE_UART
MODBUS_TX_EN;
ModbusUartSendByte(Modbus_UART, (modbus_id == dev_id) ? dev_id : com_dev_id);
ModbusUartSendByte(Modbus_UART, (unsigned char)MODBUS_WSR_CMD);
ModbusUartSendByte(Modbus_UART, modbus_reg_addr >> 8);
@@ -102,9 +101,9 @@ void modbus_wsr_answer() {
ModbusUartSendByte(Modbus_UART, CRC16 >> 8);
ModbusUartSendByte(Modbus_UART, CRC16 & 0xff);
TX_DIS;
break;
case 1:
MODBUS_TX_DIS;
#endif
#ifdef CURRENT_OPERATION_MODE_TCP
tx_buf[0] = (modbus_id == dev_id) ? dev_id : com_dev_id;
tx_buf[1] = MODBUS_WSR_CMD;
tx_buf[2] = modbus_reg_addr >> 8;
@@ -115,8 +114,7 @@ void modbus_wsr_answer() {
tx_buf[7] = CRC16 & 0xff;
ModbusTcpSendByte(DEFAULT_TCP_MODBUS_SOCKET, tx_buf, 8);
break;
}
#endif
}
void modbus_rir_answer() {
@@ -138,9 +136,9 @@ void modbus_rir_answer() {
CRC16 = modbus_CRC16(crc_buf, regs_to_read * 2 + CRC_COUNT_OFFSET);
switch(CURRENT_OPERATION_MODE) {
case 0:
TX_EN;
#ifdef CURRENT_OPERATION_MODE_UART
MODBUS_TX_EN;
ModbusUartSendByte(Modbus_UART, (modbus_id == dev_id) ? dev_id : com_dev_id);
ModbusUartSendByte(Modbus_UART, (unsigned char) MODBUS_RIR_CMD);
ModbusUartSendByte(Modbus_UART, regs_to_read * 2);
@@ -152,9 +150,9 @@ void modbus_rir_answer() {
}
ModbusUartSendByte(Modbus_UART, (unsigned char)(CRC16 >> 8));
ModbusUartSendByte(Modbus_UART, (unsigned char)(CRC16 & 0xff));
TX_DIS;
break;
case 1:
MODBUS_TX_DIS;
#endif
#ifdef CURRENT_OPERATION_MODE_TCP
tx_buf[buf_ptr++] = (modbus_id == dev_id) ? dev_id : com_dev_id;
tx_buf[buf_ptr++] = (unsigned char) MODBUS_RIR_CMD;
tx_buf[buf_ptr++] = regs_to_read * 2;
@@ -167,8 +165,7 @@ void modbus_rir_answer() {
tx_buf[buf_ptr++] = CRC16 >> 8;
tx_buf[buf_ptr++] = CRC16 & 0xff;
ModbusTcpSendByte(DEFAULT_TCP_MODBUS_SOCKET, tx_buf, buf_ptr);
break;
}
#endif
}
@@ -191,9 +188,9 @@ void modbus_rhr_answer() {
CRC16 = modbus_CRC16(crc_buf, regs_to_read * 2 + CRC_COUNT_OFFSET);
switch(CURRENT_OPERATION_MODE) {
case 0:
TX_EN;
#ifdef CURRENT_OPERATION_MODE_UART
MODBUS_TX_EN;
ModbusUartSendByte(Modbus_UART, (modbus_id == dev_id) ? dev_id : com_dev_id);
ModbusUartSendByte(Modbus_UART, (unsigned char) MODBUS_RHR_CMD);
ModbusUartSendByte(Modbus_UART, regs_to_read * 2);
@@ -205,9 +202,9 @@ void modbus_rhr_answer() {
}
ModbusUartSendByte(Modbus_UART, (unsigned char)(CRC16 >> 8));
ModbusUartSendByte(Modbus_UART, (unsigned char)(CRC16 & 0xff));
TX_DIS;
break;
case 1:
MODBUS_TX_DIS;
#endif
#ifdef CURRENT_OPERATION_MODE_TCP
tx_buf[buf_ptr++] = (modbus_id == dev_id) ? dev_id : com_dev_id;
tx_buf[buf_ptr++] = (unsigned char) MODBUS_RHR_CMD;
tx_buf[buf_ptr++] = regs_to_read * 2;
@@ -220,9 +217,7 @@ void modbus_rhr_answer() {
tx_buf[buf_ptr++] = CRC16 >> 8;
tx_buf[buf_ptr++] = CRC16 & 0xff;
ModbusTcpSendByte(DEFAULT_TCP_MODBUS_SOCKET, tx_buf, buf_ptr);
break;
}
#endif
}
static unsigned char modbus_rx_CRC_check(unsigned char modbus_cmd) {
@@ -392,6 +387,7 @@ void modbus_poll(void) {
} // switch
}
//======================= UART HANDLERS =========================//
#ifdef CURRENT_OPERATION_MODE_UART
void Modbus_UART_IRQHandler(void) {
if (USART_GetITStatus(Modbus_UART, USART_IT_RXNE) != RESET) {
while(USART_GetFlagStatus(Modbus_UART,USART_FLAG_RXNE) == RESET) {}
@@ -418,13 +414,16 @@ void Modbus_TIM_IRQHandler(void) {
timer_state = 0;
rx_flag = 1;
}
#endif
//======================== TCP HANDLERS ========================//
#ifdef CURRENT_OPERATION_MODE_TCP
void Modbus_TCP_Handler(unsigned char* buf, uint8_t size) {
for (rx_buf_ptr = 0; rx_buf_ptr < size; rx_buf_ptr++) {
rx_buf[rx_buf_ptr] = buf[rx_buf_ptr];
rx_buf[rx_buf_ptr] = buf[rx_buf_ptr];
}
rx_flag = 1;
}
#endif