177 lines
6.4 KiB
C
177 lines
6.4 KiB
C
/****************************************************************************
|
|
文件名称 : chrg_comm.h
|
|
完成日期 :
|
|
当前版本号 : V1.0
|
|
主要功能 : 实现对外通讯协议 MODBUS 服务端,以独立线程等待处理响应请求数据。
|
|
版本历史 : 创建原始版本
|
|
说明 :
|
|
******************************************************************************/
|
|
|
|
#ifndef __CHRG_COMM_H__
|
|
#define __CHRG_COMM_H__
|
|
|
|
#include <rtthread.h>
|
|
|
|
#include "chrg_tty.h"
|
|
|
|
|
|
#define MODBUS_ADDRESS_DEFAULT 0x01
|
|
|
|
#define BITS_UCHAR 8U
|
|
|
|
#define S_DISCRETE_INPUT_START 0
|
|
#define S_DISCRETE_INPUT_NDISCRETES 16
|
|
#define S_COIL_START 0
|
|
#define S_COIL_NCOILS 64
|
|
#define S_REG_INPUT_START 0
|
|
#define S_REG_INPUT_NREGS 100
|
|
#define S_REG_HOLDING_START 0
|
|
#define S_REG_HOLDING_NREGS 100
|
|
|
|
#define MB_HANDLERS_MAX (16)
|
|
|
|
typedef enum {
|
|
MB_REG_READ, /*!< Read register values and pass to protocol stack. */
|
|
MB_REG_WRITE /*!< Update register values. */
|
|
} eMBRegisterMode;
|
|
|
|
typedef enum {
|
|
MB_ENOERR, /*!< no error. */
|
|
MB_ENOREG, /*!< illegal register address. */
|
|
MB_EINVAL, /*!< illegal argument. */
|
|
MB_EPORTERR, /*!< porting layer error. */
|
|
MB_ENORES, /*!< insufficient resources. */
|
|
MB_EIO, /*!< I/O error. */
|
|
MB_EILLSTATE, /*!< protocol stack in illegal state. */
|
|
MB_ETIMEDOUT /*!< timeout error occurred. */
|
|
} eMBErrorCode;
|
|
|
|
#define MB_ADDRESS_BROADCAST (0) // 广播地址
|
|
#define MB_ADDRESS_MIN (1) // 地址最小值
|
|
#define MB_ADDRESS_MAX (247) // 地址最大值
|
|
|
|
#define MB_READ_COILS (0x01) // 读线圈
|
|
#define MB_READ_DISCRETE_INPUTS (0x02) // 读离散输入
|
|
#define MB_READ_HOLDING_REGISTER (0x03) // 读保持寄存器
|
|
#define MB_READ_INPUT_REGISTER (0x04) // 读输入寄存器
|
|
#define MB_WRITE_SINGLE_COIL (0x05) // 写单个线圈
|
|
#define MB_WRITE_REGISTER (0x06) // 写单个寄存器
|
|
#define MB_WRITE_MULTIPLE_COILS (0x0F) // 写多个线圈
|
|
#define MB_WRITE_MULTIPLE_REGISTERS (0x10) // 写多个寄存器
|
|
#define MB_FUNC_ERROR (0x80)
|
|
|
|
typedef enum {
|
|
MB_EX_NONE = 0x00,
|
|
MB_EX_ILLEGAL_FUNCTION = 0x01,
|
|
MB_EX_ILLEGAL_DATA_ADDRESS = 0x02,
|
|
MB_EX_ILLEGAL_DATA_VALUE = 0x03,
|
|
MB_EX_SLAVE_DEVICE_FAILURE = 0x04,
|
|
MB_EX_ACKNOWLEDGE = 0x05,
|
|
MB_EX_SLAVE_BUSY = 0x06,
|
|
MB_EX_MEMORY_PARITY_ERROR = 0x08,
|
|
MB_EX_GATEWAY_PATH_FAILED = 0x0A,
|
|
MB_EX_GATEWAY_TGT_FAILED = 0x0B
|
|
} eMBException;
|
|
|
|
#define MB_SER_PDU_SIZE_MIN 4 /*!< Minimum size of a Modbus RTU frame. */
|
|
#define MB_SER_PDU_SIZE_MAX 256 /*!< Maximum size of a Modbus RTU frame. */
|
|
#define MB_SER_PDU_SIZE_CRC 2 /*!< Size of CRC field in PDU. */
|
|
#define MB_SER_PDU_ADDR_OFF 0 /*!< Offset of slave address in Ser-PDU. */
|
|
#define MB_SER_PDU_PDU_OFF 1 /*!< Offset of Modbus-PDU in Ser-PDU. */
|
|
|
|
typedef eMBException(*pFunctionHandler) (rt_uint8_t *reqFrame, rt_uint16_t reqLen,
|
|
rt_uint8_t *resFrame, rt_uint16_t *resLen);
|
|
|
|
struct code_func_t {
|
|
rt_uint8_t code;
|
|
pFunctionHandler func;
|
|
};
|
|
|
|
/*!
|
|
* Constants which defines the format of a modbus frame. The example is
|
|
* shown for a Modbus RTU/ASCII frame. Note that the Modbus PDU is not
|
|
* dependent on the underlying transport.
|
|
*
|
|
* <code>
|
|
* <------------------------ MODBUS SERIAL LINE PDU (1) ------------------->
|
|
* <----------- MODBUS PDU (1') ---------------->
|
|
* +-----------+---------------+----------------------------+-------------+
|
|
* | Address | Function Code | Data | CRC/LRC |
|
|
* +-----------+---------------+----------------------------+-------------+
|
|
* | | | |
|
|
* (2) (3/2') (3') (4)
|
|
*
|
|
* (1) ... MB_SER_PDU_SIZE_MAX = 256
|
|
* (2) ... MB_SER_PDU_ADDR_OFF = 0
|
|
* (3) ... MB_SER_PDU_PDU_OFF = 1
|
|
* (4) ... MB_SER_PDU_SIZE_CRC = 2
|
|
*
|
|
* (1') ... MB_PDU_SIZE_MAX = 253
|
|
* (2') ... MB_PDU_FUNC_OFF = 0
|
|
* (3') ... MB_PDU_DATA_OFF = 1
|
|
* </code>
|
|
*/
|
|
|
|
#define MB_PDU_SIZE_MAX 253 /*!< Maximum size of a PDU. */
|
|
#define MB_PDU_SIZE_MIN 1 /*!< Function Code */
|
|
#define MB_PDU_FUNC_OFF 0 /*!< Offset of function code in PDU. */
|
|
#define MB_PDU_DATA_OFF 1 /*!< Offset for response data in PDU. */
|
|
|
|
#define MB_PDU_FUNC_READ_ADDR_OFF (MB_PDU_DATA_OFF)
|
|
#define MB_PDU_FUNC_WRITE_ADDR_OFF (MB_PDU_DATA_OFF)
|
|
#define MB_PDU_FUNC_WRITE_MUL_ADDR_OFF (MB_PDU_DATA_OFF)
|
|
#define MB_PDU_FUNC_READWRITE_READ_ADDR_OFF (MB_PDU_DATA_OFF)
|
|
|
|
|
|
#define MB_PDU_FUNC_READ_DISCCNT_OFF (MB_PDU_DATA_OFF + 2)
|
|
#define MB_PDU_FUNC_READ_REGCNT_OFF (MB_PDU_DATA_OFF + 2)
|
|
#define MB_PDU_FUNC_READ_COILCNT_OFF (MB_PDU_DATA_OFF + 2)
|
|
#define MB_PDU_FUNC_WRITE_VALUE_OFF (MB_PDU_DATA_OFF + 2)
|
|
#define MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF (MB_PDU_DATA_OFF + 2)
|
|
#define MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF (MB_PDU_DATA_OFF + 2)
|
|
#define MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF (MB_PDU_DATA_OFF + 4)
|
|
#define MB_PDU_FUNC_WRITE_MUL_VALUES_OFF (MB_PDU_DATA_OFF + 5)
|
|
|
|
#define MB_PDU_FUNC_READ_SIZE (4)
|
|
#define MB_PDU_FUNC_WRITE_SIZE (4)
|
|
#define MB_PDU_FUNC_WRITE_MUL_SIZE_MIN (5)
|
|
|
|
#define MB_PDU_FUNC_READ_DISCCNT_MAX (0x07D0)
|
|
#define MB_PDU_FUNC_READ_COILCNT_MAX (0x07D0)
|
|
#define MB_PDU_FUNC_READ_REGCNT_MAX (0x007D)
|
|
#define MB_PDU_FUNC_WRITE_MUL_REGCNT_MAX (0x0078)
|
|
#define MB_PDU_FUNC_WRITE_MUL_COILCNT_MAX (0x07B0)
|
|
|
|
#define THR_NAME_COMM "thr.comm"
|
|
#define DEV_NAME_COMM "uart1"
|
|
|
|
struct chrg_comm_t {
|
|
const char *devname;
|
|
|
|
struct chrg_tty_t *tty;
|
|
|
|
rt_uint16_t rx_len;
|
|
rt_uint8_t rx_buf[SIZE_BUF_TTY];
|
|
rt_uint16_t tx_len;
|
|
rt_uint8_t tx_buf[SIZE_BUF_TTY];
|
|
|
|
rt_uint8_t addr; // slave address
|
|
};
|
|
|
|
extern struct chrg_comm_t chrgcomm;
|
|
|
|
/*****************************************************************
|
|
函数名称: chrg_comm_thread_entry
|
|
函数描述: 对外RS485通信线程体
|
|
输入参数: *data: 本线程信息
|
|
输出参数: -
|
|
返回说明: -
|
|
其它说明: -
|
|
*****************************************************************/
|
|
extern void chrg_comm_thread_entry (void *data);
|
|
|
|
#endif
|
|
|
|
|
|
|