optical/NxFuncs/modbus/modbus_def.h

147 lines
3.8 KiB
C
Raw Normal View History

2025-09-04 01:45:08 +00:00
#ifndef __MODBUS_DEF_H__
#define __MODBUS_DEF_H__
#include "config.h"
#include "serial.h"
//----------------------------------------------------------------
// modbus Э<><EFBFBD><E9B6A8>
/*
*/
//------------------------------------------------------------------
/*modbus<75><73>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><>ֵ<EFBFBD>Ѱַ<D1B0>ռ<EFBFBD>Ϊ256<35><36>
* ----------------------------------
* | 0 | 1-247 | 248-255 |
* |---------------------------------
* |<EFBFBD><EFBFBD><EFBFBD>ַ|<EFBFBD>ӽڵ<EFBFBD><EFBFBD><EFBFBD>ַ| <EFBFBD><EFBFBD><EFBFBD><EFBFBD> |
* |---------------------------------
*/
#ifndef MODBUS_IDXMAX
#define MODBUS_IDXMAX 247 // ֧<>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>վ<EFBFBD><D5BE><EFBFBD><EFBFBD>
#endif
#define MODBUS_LENMAX 50 // <20><><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ(<28><>λ: <20><>)
#define MDBSRXLEN_A (MODBUS_LENMAX*4 + 21) // ASCII <20><>ʽ
#define MDBSRXLEN_R (MODBUS_LENMAX*2 + 10) // RTU <20><>ʽ
#define MDBSRXLEN_MAX MDBSRXLEN_A // <20><>λ<EFBFBD>ֽ<EFBFBD>
//------------------------------------------------------------------
//------------------------------------------------------------------
// ֧<>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>
#define READ_COIL_STATUS 0x01 // <20><>ȡ<EFBFBD><C8A1>Ȧ״̬(λ<><CEBB><EFBFBD><EFBFBD>)
#define READ_INPUT_STATUS 0x02 // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>״̬(λ<><CEBB><EFBFBD><EFBFBD>)
#define READ_HOLDING_REGISTER 0x03 // <20><>ȡ<EFBFBD><C8A1><EFBFBD>ּĴ<D6BC><C4B4><EFBFBD>
#define READ_INPUT_REGISTER 0x04 // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
#define WRITE_SINGLE_COIL 0x05 // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȧ(λ<><CEBB><EFBFBD><EFBFBD>)
#define WRITE_SINGLE_REGISTER 0x06 // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ּĴ<D6BC><C4B4><EFBFBD>
#define WRITE_MULTIPLE_COIL 0x0F // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȧ(λ<><CEBB><EFBFBD><EFBFBD>)
#define WRITE_MULTIPLE_REGISTER 0x10 // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ּĴ<D6BC><C4B4><EFBFBD>
//------------------------------------------------------------------
#define MODBUS_RD READ_HOLDING_REGISTER // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define MODBUS_WR WRITE_SINGLE_REGISTER // д<><D0B4><EFBFBD><EFBFBD>
#define MODBUS_WR_MULTI WRITE_MULTIPLE_REGISTER // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//------------------------------------------------------------------
#ifndef MODBUS_MAX_WR
#define MODBUS_MAX_WR 10
#endif
#ifndef MODBUS_MAX_RD
#define MODBUS_MAX_RD 10
#endif
typedef struct
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 midx; // <20><>վ<EFBFBD><D5BE><EFBFBD><EFBFBD>
u8 index; // վ<>ţ<EFBFBD>1~247(ʮ<><CAAE><EFBFBD><EFBFBD>)
u8 cmd; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u16 addr; // <20><><EFBFBD>ݵ<EFBFBD>ַ
u16 wrdat[MODBUS_MAX_WR]; // д<><D0B4><EFBFBD><EFBFBD>
u16 wlen; // д<><D0B4><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
u16 rddat[MODBUS_MAX_RD]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u16 rlen; // <20><>ȡ<EFBFBD><C8A1><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
}Rs485Cmd;
#ifndef MAX_485CMD
#define MAX_485CMD 20
#endif
typedef void (*Resv485ExProc)(Rs485Cmd * pcmd); // <20>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct
{
int init; // 1:<3A><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 idxNum;
u8 idxList[MODBUS_IDXMAX]; // վ<><D5BE><EFBFBD>б<EFBFBD>,<2C><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>վ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>1~247(ʮ<><CAAE><EFBFBD><EFBFBD>)
Rs485Cmd cmdbuf[MAX_485CMD];
// <20>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD>
int working; // <20><><EFBFBD>ڶ<EFBFBD>д<EFBFBD><D0B4>; = 1, <20><><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int bufCmdNum; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>; != 0, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int bufHead;
int bufTail;
int steps;
u32 stepTime;
Resv485ExProc resv485exproc; // <20>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int modrsvTimout; // <20><>ȡ<EFBFBD><C8A1>ʱʱ<CAB1><CAB1>
}Rs485Ctrl;
//------------------------------------------------------------------
typedef void (*OnOffFunc)(void);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ
typedef struct
{
int modBusMode; // ͨѶģʽ, = 0, RTUģʽ; = 1, ASCIIģʽ
int filterChk; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>λ<EFBFBD><CEBB>־, = 0, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>; = 1, <20><><EFBFBD><EFBFBD>
u32 modBusWait; // ͨѶ<CDA8><D1B6>ʱ, <20><>λus,<2C><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
UsartSendData ModBusCommSend; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UsartGetData ModBusCommReceive; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UsartCleanRsBuf ModBusCommCleanRsBuf; // <20><><EFBFBD>ս<EFBFBD><D5BD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
IsUsartSendOver IsModBusCommSendOver; // <20>жϷ<D0B6><CFB7>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>
OnOffFunc CommOutEn; // <20><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
OnOffFunc CommOutDis; // <20><><EFBFBD>ݷ<EFBFBD><DDB7>ͽ<EFBFBD>ֹ
}ModbusCtrl;
// ע<><D7A2>modbusͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>
void RegisterModbusCommFunc(ModbusCtrl* pCtrl, UsartSendData send, UsartGetData get, UsartCleanRsBuf clean, IsUsartSendOver sdover, OnOffFunc outen, OnOffFunc outdis);
//------------------------------------------------------------------
// Ĭ<>Ϻ<EFBFBD><CFBA><EFBFBD>
int DefSendData(u8 * pDatBuf, int len);
int DefGetData(u8 * pDat, int expectLen);
int DefCleanRsBuf(void);
int DefIsSendOver(void);
void DefOutEn(void);
void DefOutDis(void);
u16 ModbusCrc16(u8 * puchMsg, u16 usDataLen);
u8 AsciiToRtu(u8 ascii);
u8 RtuToAscii(u8 rtu);
#endif