⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbus.h

📁 自己编写的mod bus 协议源代码。基于keilc51开发。主要使用回调函数
💻 H
字号:
/*
*********************************************************************************************************
*                                          Modbus Protocol Module
*
*                        (c) Copyright 2006-08-01, XXXXXXXXXXXXXXXXXXXX Corp., ltd, 
*                                           All Rights Reserved
*
*                                                  V1.00
*
* File : modbus.h
* By   : kevin zhu
*********************************************************************************************************
*/
#ifndef __MOD_H__
#define __MOD_H__


#ifdef  MOD_GLOBALS
#define MOD_EXT
#else
#define MOD_EXT  extern
#endif

/*
*********************************************************************************************************
*                                         standard C51 libs
*********************************************************************************************************
*/
#include <AT89X55.h>
#include <stdio.h>    
#include <absacc.h>
#include <string.h>
#include <intrins.h>

/*
*********************************************************************************************************
*                                         constants
*********************************************************************************************************
*/
/*hardware layer*/
#define Timer0H							0xfc    //1ms
#define Timer0L							0x66
#define BAUDH							0xff
#define BAUDL							0xdc

/*driver layer*/
#define MAX_REC_LEN						100
#define MAX_SEND_LEN					512
#define TMROUT_9600BPS					20
#define REC_MAX_TMROUT					1000
#define REC_TIMEOUT_MOD					0

/*protocol layer*/
enum FNC_CODE
{					  
	READ_COIL_STATUS			=		1,
    READ_INPUT_STATUS,
    READ_HOLDING_REGISTERS,
    READ_INPUT_REGISTERS,
	FORCE_SINGLE_COIL,
	PRESET_SINGLE_REGISTER,
	PRESET_MULTIPLE_REGISTERS   =       16
};
enum EXP_CODE
{					  
	ILLEGAL_FUNCTION			=		1,
    ILLEGAL_DATA_ADDRESS,
    ILLEGAL_DATA_VALUE,
    SLAVE_DEVICE_FAILURE,
	ACKNOWLEDGE,
	SLAVE_DEVICE_BUSY,
	NEGATIVE_ACKNOWLEDGE,
	MEMORY_PARITY_ERROR
};

/*
*********************************************************************************************************
*                                         data types
*********************************************************************************************************
*/
/*driver layer*/
typedef unsigned char  BOOLEAN;
typedef unsigned char  INT8U;                    /* Unsigned  8 bit quantity                           */
typedef signed   char  INT8S;                    /* Signed    8 bit quantity                           */
typedef unsigned int   INT16U;                   /* Unsigned 16 bit quantity                           */
typedef signed   int   INT16S;                   /* Signed   16 bit quantity                           */
typedef unsigned long  INT32U;                   /* Unsigned 32 bit quantity                           */
typedef signed   long  INT32S;                   /* Signed   32 bit quantity                           */
typedef float          FP32;                     /* Single precision floating point                    */
typedef double         FP64;                     /* Double precision floating point                    */

typedef struct
{	
	INT8U xdata *pRecBuf;				//define recieve buffer and variable;
	INT8U  RecCnt;
	INT8U  RecLen;
	INT8U  RecFstFlg;
	INT16U RecTimeOutCnt;
	INT8U  RecStateMachine;
	BOOLEAN   RecOk;
	
	INT8U xdata *pTrBuf;				//define transmit buffer and variable;
	INT8U  TrCnt;
	INT8U  TrLen;
	BOOLEAN   TrOk;
}COM;

/*protocol control layer*/
typedef struct
{
	INT8U        Dev;					/*设备地址*/
	INT8U		 PtcMode;				/*MODBUS协议传输模式(RTU或ASCII)*/
	INT16U       nSizeOfDOTbl;			/*线圈状态数据存放长度*/
	INT16U       nSizeOfDITbl;			/*离散量数据存放长度*/
	INT16U       nSizeOfAITbl;			/*模拟量数据存放长度*/
	INT8U  xdata *pAITbl;				/*存放模拟量数据表*/
	INT8U  xdata *pDITbl;				/*存放离散量数据表*/
	INT8U  xdata *pDOTbl;				/*存放线圈状态数据表*/
										/*设置离散输出通道状态回调函数*/
    void (code *DOCtrl)(INT8U n,BOOLEAN State);
										/*设置单路寄存器回调函数*/
    void (code *AOCtrl)(INT8U n,INT16U Data);
										/*设置多路寄存器回调函数*/
    void (code *MultAOCtrl)(INT16U xdata *p,INT16U len);
}DTBL;


/*
*********************************************************************************************************
*                                         variables
*********************************************************************************************************
*/
/*driver layer*/
MOD_EXT INT8U  xdata RecBuf[MAX_REC_LEN];		//receive buf define
MOD_EXT INT8U  xdata TrBuf[MAX_SEND_LEN];		//transmit buf define
MOD_EXT COM   xdata COM1;						//uart1 define

/*protocol layer*/
MOD_EXT DTBL  xdata PtcData;					//protocol data table .include AI,DI,DO

/*
*********************************************************************************************************
*                                         functions
*********************************************************************************************************
*/
MOD_EXT void ModBusComDrv(void);
MOD_EXT void ModBusTimer0Drv(void);
MOD_EXT void DOCfgFnct(void (code *DOSet)(INT8U n,BOOLEAN State));
MOD_EXT void AOCfgFnct(void (code *AOSet)(INT8U n,INT16U Data));
MOD_EXT void MultAOCfgFnct(void (code *MultAOSet)(INT16U xdata *p,INT16U len));

#ifdef CRC_TBL
/*
*********************************************************************************************************
*                                         code field
*********************************************************************************************************
*/
INT8U code auchCRCHi[256] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40
} ;
/* Table of CRC values for low–order byte */
INT8U code  auchCRCLo[256] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
0x40
} ;
#endif

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -