upd
This commit is contained in:
59
modbus.c
59
modbus.c
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user