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

📄 modbus.h

📁 MODBUS协议实现.本程序实现了modbus协议
💻 H
字号:
/*******************************************************************************
*
*                              MODBUS通信协议
*
********************************************************************************
*版本:0.0.1
*功能:基于AVR系列单片机实现主从机之间的数据通信(第3层协议)
*特点:支持主从模式选择
*     可实现mega162 和 mega16 芯片之间的自动切换
*	  可快速设置115200bps和57600bps
*	  有专用通信缓存,方便数据的存放
*     有接收和发送数据提示(以LED灯显示)
*	  可超时重发多次,超过一定次数才发弃本帧的发送.
*	  有错误警报编码生成
*已实现的功能码:
*	  0x03		读保持寄存器
*	  0x04		读输入寄存器
*	  0x06		写单个寄存器
*	  0x10		写多个寄存器
*缺点:1.发送时,不能接收数据,只有完全按应答时才可正常通信.
*	  2.发送完一帧且收到应答或失帧后,才能发送下一帧.
*     同时程序会进入死循环(直到一帧发送结束).最大时长为: 
*	  超时时间(TIME_OUT_MAX)*允许超时次数(STOP_TIMES+1) + 1帧数据发送时间(<2ms)
*时间:2006-11-16
*作者:wayne
********************************************************************************
*版本:0.0.2
*修正:MOD_REG_MIN的值,由-1变成0.主要是程序对无符进行比较时-1则为取反之大数
*     主定时器中connectState状态多请空了,使接收回发不正常
*	  对LED提示灯函数定义进行了改进
*时间:2006-11-17
*作者:wayne
*******************************************************************************/
#include "TARGET.H"

#ifdef __iom162v_h
	 #pragma interrupt_handler usrtReceive:20     
	 #pragma interrupt_handler time0INT:18
	 #define MODBUS_UDR	   UDR0
	 #define T0_TIMSK_VAL  0x02
	 
	 #define LED_PORT	   PORTD
	 #define sendPIN	   3
	 #define receivePIN    2
#else
	 /* __iom16v_h 不同板子其相应中断也不一样*/
	 #pragma interrupt_handler usrtReceive:12
	 #pragma interrupt_handler time0INT:10
	 #define MODBUS_UDR	   UDR
	 #define T0_TIMSK_VAL  0x01
	 
	 #define LED_PORT	   PORTB
	 #define sendPIN	   6
	 #define receivePIN    7
#endif

/*提示灯,在发送数据和接收数据时会点亮*/
#define sendLED(x)	   ( x?(LED_PORT &= ~BIT(sendPIN)):(LED_PORT |= BIT(sendPIN)) )
#define receiveLED(x)  ( x?(LED_PORT &= ~BIT(receivePIN)):(LED_PORT |= BIT(receivePIN)) )

/*通信地址*/
#define TARGET_ADDRESS   0x02
#define LOCAL_ADDRESS 	 0x01

/*通信主定时器相关参数宏定义 crystal  :11.059MHZ
分频:系统频率时间/ 分频 = 定时器频率
计数:( 256 - T0_COUNT )*定时频率 = 定时时间
停止位: STOP_TIMES * 定时时间 = 发送数据分隔时间(应大于3.5个字符时间)
超时时间: 发送数据间隔 * TIME_OUT_MAX = 允许超时时间
波特率UBRR: 115200 = 5;57600  = 11;19200  = 35;9600   = 71
当前传输格式:8数据位,无校检位,2停止位,控制流无 
*/
//#define BAUDRATE57600
#define BAUDRATE115200

#ifdef BAUDRATE115200
	   /*115200,95us/Byte,Time0 100us timeout 100ms*/
	   #define BAUD_RATE	  5
	   #define DIVIDED		  0x02
	   #define T0_COUNT		  (256 - 138)
	   #define STOP_TIMES	  2
	   #define TIME_OUT_MAX	  1000
#else
	   /*57600,192us/Byte,Time0 200us timeout 100ms(10ms/8Byte real time)*/
	   /*注:台达屏在此通信频率下进行多寄存器写时不稳定.*/
	   #define BAUD_RATE	  11
	   #define DIVIDED		  0x03
	   #define T0_COUNT		  (256 - 35)
	   #define STOP_TIMES	  2
	   #define TIME_OUT_MAX	  500
#endif

#ifdef MODBUS_GLOBAL
	   #define MODBUS_EXT
#else
	   #define MODBUS_EXT extern
#endif

/*通信数据区大小,因为可能为多寄存器操作则此时数据大*/
#define BUFF_MAX		 100
/*通信寄存器大小*/
#define REG_MAX		   	 100	
#define CHECK_BUFF		 4

/*寄存器值范围   MIN <= X < MAX */
#define MOD_REG_MIN 	 0 				
#define MOD_REG_MAX 	 REG_MAX

/*错误信息定义*/
#define MOD_ERROR  		 0x80
#define CAN_ERR_TIMES	 0x03

MODBUS_EXT enum  connectState{ STATE_REC = 0x01, STATE_SEND = 0x02,
			  	STATE_NULL = 0x00 };	   	 	   			  	   /*当前状态:接收数据、发送数据、无操作*/
MODBUS_EXT enum  errorCode{ ERR_STOP = 0x06, ERR_UNKOWN = 0x05, ERR_SLAVEMOD = 0x07,
			  	ERR_OUTRANGE = 0x02, ERR_FUN = 0x01, ERR_NULL = 0x00, ERR_SEND_REC = 0x08,
			  	ERR_TRAN = 0x03, ERR_TARGET = 0x04 };		  	   /*通信错误编码*/
MODBUS_EXT enum  functionCode{ FUN_NULL = 0x00, FUN_READ_REG = 0x03, FUN_WRITE_REG = 0x06,
			    FUN_READ_INPUT = 0x04, FUN_WRITE_MULTI = 0x10 };   /*通信功能码*/
MODBUS_EXT enum  connectMod{ MASTER = 1, SLAVE = 0 };		   /*主从模式*/

/*MASTER模式下的相关参数*/
MODBUS_EXT uchar requestDataCount;  	 	/*请求读写数据的个数(双字节)*/
MODBUS_EXT uchar requestDataAddr;		/*本地请求交互数据的寄存器地址*/
MODBUS_EXT uchar requestFunCode;			/*请求交互的功能码*/

MODBUS_EXT uchar canSendNext;			/*可发送下一串数*/
MODBUS_EXT uchar	connectState;			/*发送标志位, 为1时:接受数据;为2时:发送数据;为0时不做操作*/
MODBUS_EXT uchar stopCount;				/*停止次数*/
MODBUS_EXT uchar errorCount;				/*通信错误次数,大于3时提示*/
MODBUS_EXT uchar errorMessage;			/*通信错误提示信息编码*/
MODBUS_EXT uchar selConnectMod;	   	  	/*当前选择的通信主从模式*/
MODBUS_EXT uchar checkBuff[CHECK_BUFF];  /*回复校检数组*/
MODBUS_EXT uchar sendData[BUFF_MAX];		/*发送数据数组*/
MODBUS_EXT uchar receiveData[BUFF_MAX];	/*接受数据数组*/
MODBUS_EXT uint  sendSp;	 				/*发送数据的当前数据指针*/
MODBUS_EXT uint  sendNum;  				/*当前要发的数据个数*/
MODBUS_EXT uint  receiveNum;				/*接受数据长度*/
MODBUS_EXT uint  connectAddress;			/*通信地址*/
MODBUS_EXT uint  requestTimeOut;			/*回复超时最大时间*/
MODBUS_EXT uint  registerData[REG_MAX];	/*寄存器组数据*/


MODBUS_EXT uint GetCRCCode(uchar* pSendBuf, uint nLen);
MODBUS_EXT void usrtReceive(void);
MODBUS_EXT uint crcReceive(void);
MODBUS_EXT void errorPackage(uchar code);
MODBUS_EXT void backDataPackage(void);
MODBUS_EXT void InitModbus(uchar connectMod );
MODBUS_EXT void sendDataPackage(uchar funCode, uint addr, uint count, uint regAddr);
MODBUS_EXT uint checkRecPackage(void);

⌨️ 快捷键说明

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