?? mbslave.c
字號:
/****************************************Copyright (c)**************************************************
** 廣州致遠電子有限公司
**
** http://www.21cm.com.cn
**
**
**--------------File Info-------------------------------------------------------------------------------
** File name: MBSlave.c
** Last modified Date: 2005-01-11
** Last Version: 1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Created by: ZhouLishan
** Created date: 2005-01-11
** Version: 1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#include "modbus.h"
#ifdef UCOSII
OS_EVENT *mb_handle_event_ptr;
#endif
extern uint16 Modbus_CRC16(uint8 *Buff_addr,uint16 len);
extern SendResponse(uint8 *buff,uint16 len);
// 功能代碼處理函數數組
extern AT_CODE FUNCTION_ARRAY FCodeHandleArray[MAX_FUNCTION];
//********************************************************************************************************
// 函數名稱:MBSlaveIni
// 輸入參數:DevicInfPtr,從機描述信息數據結構指針
// 輸出參數:無
// 功能描述:MODBUS從機初始化
//********************************************************************************************************
void MBSlaveIni(SLAVE_INFORMATION *DevicInfPtr)
{
ADUData.Address = DevicInfPtr->Address;
ADUData.ADUBuffPtr = DevicInfPtr->RequestPtr;
ADUData.ADULength = 0;
// ADUData.RedundancyCheck = 0;
ADUData.EndT15 = FALSE;
ADUData.FrameOK = FALSE;
PDUData.PDUBuffPtr = NULL;
// PDUData.Response.ExceptionCode = 0;
#ifdef UCOSII
mb_handle_event_ptr = OSSemCreate(0); // MODBUS處理信號量
#endif
}
//********************************************************************************************************
// 函數名稱:FunctionHandle
// 輸入參數:無
// 輸出參數:無
// 功能描述:功能請求處理
//********************************************************************************************************
void FunctionHandle(void)
{
uint8 i;
PDU_RESPONSE Response;
for(i=0;i<MAX_FUNCTION;i++)
{
if(FCodeHandleArray[i].Code==PDUData.FunctionCode)
{
Response.PDUDataPtr = PDUData.PDUBuffPtr;
Response.PDUByteLength = PDUData.PDULength;
FCodeHandleArray[i].Function( &Response ); // 執行處理返回數據結構指針
// PDUData.PDUBuffPtr = Response.PDUDataPtr;
PDUData.PDULength = Response.PDUByteLength;
PDUData.ExceptionCode = Response.ExceptionCode;
return;
}
}
PDUData.ExceptionCode = EXCEPTION_CODE_1; // 功能代碼無效
}
void PackPDU2ADU(void)
{
if(PDUData.ExceptionCode) // 請求處理失敗
{
*PDUData.PDUBuffPtr = PDUData.FunctionCode|0x80;
*(PDUData.PDUBuffPtr+1) = PDUData.ExceptionCode;
PDUData.PDULength = 2;
}
ADUData.ADULength = PDUData.PDULength + 3; // ADU = Adress + PDU + CRC/LRC = 1 + PDU + 2;
}
//********************************************************************************************************
// 函數名稱:TransfersReplyHandle
// 輸入參數:無
// 輸出參數:無
// 功能描述:傳輸應答幀處理
//********************************************************************************************************
void TransfersReplyHandle(void)
{
uint16 CRC_OR_LRC;
*ADUData.ADUBuffPtr = ADUData.Address; // 設備地址
CRC_OR_LRC = Modbus_CRC16(ADUData.ADUBuffPtr,ADUData.ADULength-2); // 計算CRC (ADU中CRC前的數據)
*(ADUData.ADUBuffPtr+ADUData.ADULength-1) = (uint8)(CRC_OR_LRC/0x100); // CRC Hi or LRC Hi
*(ADUData.ADUBuffPtr+ADUData.ADULength-2) = (uint8)CRC_OR_LRC; // CRC Hi or LRC Hi
SendResponse(ADUData.ADUBuffPtr,ADUData.ADULength);
}
//********************************************************************************************************
// 函數名稱:FunctionHandle
// 輸入參數:無
// 輸出參數:無
// 功能描述:MODBUS服務函數
//********************************************************************************************************
void IdleModbus(void)
{
uint8 err;
// 檢驗有效幀
OSSemPend(mb_handle_event_ptr,0,&err);
if(PDUData.FrameOK==FALSE) // 接收幀未結束返回
return;
PDUData.FrameOK = FALSE;
FunctionHandle(); // 功能代碼處理函數
PackPDU2ADU(); // 將PDU幀封裝成ADU幀
TransfersReplyHandle(); // 傳輸應答幀
// 準備收到下一幀
// ADUData.ADUBuffPtr = SlaveDevice.RequestPtr;
ADUData.ADULength = 0;
PDUData.PDUBuffPtr = NULL;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -