You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
4.4 KiB
102 lines
4.4 KiB
#include "modbus_processer.h"
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
/***********************485rx**************************/
|
|
//接收到了多少数据
|
|
volatile uint16_t s_modbus_uart_rx_off = 0;
|
|
//当前是否正在处理接收到的数据
|
|
volatile bool s_modbus_uart_rx_buf_is_processing = false;
|
|
/***********************485tx**************************/
|
|
static modbus_processer_t* g_processer;
|
|
|
|
#define GET_UINT16(uint8) (uint16_t)(((uint16_t)((uint8)[0]) << 8) + (uint8)[1])
|
|
|
|
void modbus_processer_init(modbus_processer_t* processer) { g_processer = processer; }
|
|
void modbus_processer_push_data(uint8_t rxdata) {
|
|
if (!s_modbus_uart_rx_buf_is_processing) {
|
|
if (s_modbus_uart_rx_off < g_processer->modbus_processer_rx_buf_size) {
|
|
g_processer->modbus_processer_rx_buf[s_modbus_uart_rx_off] = rxdata;
|
|
s_modbus_uart_rx_off++;
|
|
}
|
|
}
|
|
}
|
|
|
|
ModbusFunctionCode modbus_get_function_code(modbus_processer_context_t* context) { //
|
|
return context->tx->functionCode;
|
|
}
|
|
|
|
void modbus_set_tx_reg_03(modbus_processer_context_t* context, uint16_t regoff, uint16_t regdata) {
|
|
uint16_t off = regoff - context->rx->d.O03.startreg;
|
|
ModbusCreateTx_setReg(g_processer->modbus_processer_tx_buf, g_processer->modbus_processer_tx_buf_size, off, //
|
|
regdata);
|
|
}
|
|
|
|
uint16_t modbus_get_reg_10(modbus_processer_context_t* context, uint16_t regoff) {
|
|
uint16_t off = regoff - context->rx->d.O10.startreg;
|
|
uint8_t* data = context->rx->d.O10.reg;
|
|
if ((off + 1) * 2 <= context->rx->d.O10.bytenum) {
|
|
uint16_t u16 = GET_UINT16(&data[off * 2]);
|
|
return u16;
|
|
} else {
|
|
uint16_t u16 = data[off * 2];
|
|
return u16;
|
|
}
|
|
}
|
|
|
|
bool modbus_if_register_exists_03(modbus_processer_context_t* context, uint16_t regoff) {
|
|
uint16_t startreg = context->rx->d.O03.startreg;
|
|
uint16_t endreg = context->rx->d.O03.startreg + context->rx->d.O03.numreg;
|
|
return regoff >= startreg && regoff < endreg;
|
|
}
|
|
|
|
bool modbus_if_register_exists_10(modbus_processer_context_t* context, uint16_t regoff) {
|
|
uint16_t startreg = context->rx->d.O10.startreg;
|
|
uint16_t endreg = context->rx->d.O10.startreg + context->rx->d.O10.numreg;
|
|
return regoff >= startreg && regoff < endreg;
|
|
}
|
|
|
|
void modbus_send_03(modbus_processer_context_t* context, ModbusStatus modbus_status) {
|
|
uint16_t sendlegth = 0;
|
|
if (modbus_status == Modbus_OK) {
|
|
context->tx->functionCode = context->rx->functionCode;
|
|
context->tx->deviceId = g_processer->modbus_device_id;
|
|
context->tx->d.O10.regnum = context->rx->d.O10.numreg;
|
|
context->tx->d.O10.startreg = context->rx->d.O10.startreg;
|
|
//构造回执,并发送
|
|
ModbusCreateTxData(g_processer->modbus_processer_tx_buf, g_processer->modbus_processer_tx_buf_size, &sendlegth, context->tx);
|
|
g_processer->tx(g_processer->modbus_processer_tx_buf, sendlegth);
|
|
} else {
|
|
//构造异常包并发送
|
|
ModbusCreateExceptionData(g_processer->modbus_processer_tx_buf, //
|
|
g_processer->modbus_processer_tx_buf_size, //
|
|
&sendlegth, //
|
|
g_processer->modbus_device_id, //
|
|
context->rx->functionCode, //
|
|
modbus_status);
|
|
g_processer->tx(g_processer->modbus_processer_tx_buf, sendlegth);
|
|
}
|
|
}
|
|
|
|
void modbus_send_10(modbus_processer_context_t* context, ModbusStatus modbus_status) {
|
|
uint16_t sendlegth = 0;
|
|
if (modbus_status == Modbus_OK) {
|
|
context->tx->functionCode = context->rx->functionCode;
|
|
context->tx->deviceId = g_processer->modbus_device_id;
|
|
context->tx->d.O10.regnum = context->rx->d.O10.numreg;
|
|
context->tx->d.O10.startreg = context->rx->d.O10.startreg;
|
|
//构造回执,并发送
|
|
ModbusCreateTxData(g_processer->modbus_processer_tx_buf, g_processer->modbus_processer_tx_buf_size, &sendlegth, context->tx);
|
|
g_processer->tx(g_processer->modbus_processer_tx_buf, sendlegth);
|
|
} else {
|
|
//构造异常包并发送
|
|
ModbusCreateExceptionData(g_processer->modbus_processer_tx_buf, //
|
|
g_processer->modbus_processer_tx_buf_size, //
|
|
&sendlegth, //
|
|
g_processer->modbus_device_id, //
|
|
context->rx->functionCode, //
|
|
modbus_status);
|
|
g_processer->tx(g_processer->modbus_processer_tx_buf, sendlegth);
|
|
}
|
|
}
|