📄 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 + -