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