?? mb_mfunction.c
字號:
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機發展有限公司
** 研 究 所
** 產品一部
**
** http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: MB_MFunction.c
**創 建 人: 周立山
**最后修改日期: 2005年7月29日
**描 述: MODBUS RTU 協議棧
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 周立山
** 版 本: 1.0a
** 日 期: 2005年7月29日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
void Test(void *ParameterPtr)
{
}
void Test2(uint8 *PDUPtr,void *ParameterPtr)
{
}
//***************************************************************
// 函數名稱:ReadOper2PDU
// 輸入參數:ParameterPtr,數據結構指針
// 輸出參數:無
// 功能描述:封裝讀操作幀。0x01
//***************************************************************
void ReadOper2PDU( uint8 FunCode,void *ParameterPtr )
{
READ_PARAMET *PPtr;
uint8 Request[5];
PPtr = (READ_PARAMET *)ParameterPtr;
Request[0] = FunCode;
Request[1] = (uint8)(PPtr->RStartAddr>>8);
Request[2] = (uint8)(PPtr->RStartAddr);
Request[3] = (uint8)(PPtr->RQuantity>>8);
Request[4] = (uint8)(PPtr->RQuantity);
PutDataInPUD(Request,5);
}
//***************************************************************
// 函數名稱:ReadRegPRASD
// 輸入參數:PDUPtr,保存收到的數據的起始指針
// ParameterPtr,數據結構指針
// 輸出參數:無
// 功能描述:處理收到的寄存器(保存寄存器/輸入寄存器)數據。
//***************************************************************
void ReadRegPRASD(uint8 *PDUPtr,void *ParameterPtr)
{
uint8 ByteCount;
uint8 i;
uint8 *DataPtr;
READ_PARAMET *PPtr;
PPtr = (READ_PARAMET *)ParameterPtr; // 指令參數結構指針
DataPtr = &PDUPtr[2]; // 數據或起始指針
ByteCount = PDUPtr[1]; // 寄存器個數
for(i=0;i<(ByteCount/2);i++)
{
*(PPtr->DataPtr+i) = (DataPtr[i*2]<<8)|DataPtr[i*2+1];
}
}
//***************************************************************
// 函數名稱:ReadDiscretePRASD
// 輸入參數:PDUPtr,保存收到的數據的起始指針
// ParameterPtr,數據結構指針
// 輸出參數:無
// 功能描述:處理收到的離散或線圈數據。
//***************************************************************
void ReadDiscretePRASD(uint8 *PDUPtr,void *ParameterPtr)
{
uint8 ByteCount;
uint8 i;
uint8 *DataPtr;
READ_PARAMET *PPtr;
PPtr = (READ_PARAMET *)ParameterPtr; // 指令參數結構指針
ByteCount = PDUPtr[1]; // 寄存器個數
DataPtr = (uint8 *)PPtr->DataPtr;
for(i=0;i<ByteCount;i++)
{
DataPtr[i] = PDUPtr[2+i];
}
}
// 數據處理函數
void NoDataPRASD(uint8 *PDUPtr,void *ParameterPtr)
{
PDUPtr = PDUPtr;
ParameterPtr = ParameterPtr;
}
/****************************************************************/
void ReadCoils2PDU(void *ParameterPtr); // 讀線圈寄存器
void ReadDiscreteInputs2PDU(void *ParameterPtr); // 讀離散輸入寄存器
void ReadHoldReg2PDU(void *ParameterPtr); // 讀保持寄存器
void ReadInputReg2PDU(void *ParameterPtr); // 讀輸入寄存器
void WriteSingleCoil2PDU(void *ParameterPtr); // 寫單個線圈
void WriteSingleRegPDU(void *ParameterPtr); // 寫單寄存器
void WriteMultipleCoils2PDU(void *ParameterPtr); // 寫多線圈
void WriteMultipleReg2PDU(void *ParameterPtr); // 寫多寄存器
void MaskWriteReg2PDU(void *ParameterPtr); // 處理屏蔽寄存器指令
void ReadWriteMultipleReg2PDU(void *ParameterPtr); // 讀寫多個寄存器
FUNCTION_PACK_PDU FunPDUPackHanlde[MAX_FUNCTION]={
{0x01,ReadCoils2PDU}, // 讀線圈
{0x02,ReadDiscreteInputs2PDU}, // 讀離散量輸入
{0x03,ReadHoldReg2PDU}, // 讀保持寄存器
{0x04,ReadInputReg2PDU}, // 讀輸入寄存器
{0x05,WriteSingleCoil2PDU}, // 寫單個線圈
{0x06,WriteSingleRegPDU}, // 寫單個寄存器
{0x0f,WriteMultipleCoils2PDU},
{0x10,WriteMultipleReg2PDU},
{0x16,MaskWriteReg2PDU}, // 處理屏蔽寄存器指令
{0x17,ReadWriteMultipleReg2PDU} // 讀寫多個寄存器
};
void ReadOper2PDU( uint8 FunCode,void *ParameterPtr );
// Function of Parse Reponse And StoreData
FUNCTION_DATA_HANDLE FunParRepAndStData[MAX_FUNCTION]={
{0x01,ReadDiscretePRASD},// 讀線圈
{0x02,ReadDiscretePRASD},// 讀離散量輸入,與讀線圈處理方式一樣
{0x03,ReadRegPRASD}, // 讀保持寄存器
{0x04,ReadRegPRASD}, // 讀輸入寄存器處理函數
{0x05,NoDataPRASD},
{0x06,NoDataPRASD},
{0x0f,NoDataPRASD},
{0x10,NoDataPRASD},
{0x16,NoDataPRASD}, // 處理屏蔽寄存器指令
{0x17,ReadRegPRASD} // 讀寫多個寄存器
};
//***************************************************************
// 函數名稱:ReadCoils2PDU
// 輸入參數:ParameterPtr,數據結構指針
// 輸出參數:無
// 功能描述:封裝讀線圈幀。0x01
//***************************************************************
void ReadCoils2PDU(void *ParameterPtr)
{
ReadOper2PDU( 0x01,ParameterPtr );
}
//***************************************************************
// 函數名稱:ReadDiscreteInputs2PDU
// 輸入參數:ParameterPtr,數據結構指針
// 輸出參數:無
// 功能描述:封裝讀離散輸入幀。0x02
//***************************************************************
void ReadDiscreteInputs2PDU(void *ParameterPtr)
{
ReadOper2PDU( 0x02,ParameterPtr );
}
//***************************************************************
// 函數名稱:ReadHoldReg2PDU
// 輸入參數:ParameterPtr,數據結構指針
// 輸出參數:無
// 功能描述:封裝讀保持寄存器幀。0x03
//***************************************************************
void ReadHoldReg2PDU(void *ParameterPtr)
{
ReadOper2PDU( 0x03,ParameterPtr );
}
//***************************************************************
// 函數名稱:ReadInputReg2PDU
// 輸入參數:ParameterPtr,數據結構指針
// 輸出參數:無
// 功能描述:封裝讀輸入寄存器幀。0x04
//***************************************************************
void ReadInputReg2PDU(void *ParameterPtr)
{
ReadOper2PDU( 0x04,ParameterPtr );
}
//***************************************************************
// 函數名稱:WriteSingleCoil2PDU
// 輸入參數:ParameterPtr,數據結構指針
// 輸出參數:無
// 功能描述:封裝寫單個線圈幀。0x05
//***************************************************************
void WriteSingleCoil2PDU(void *ParameterPtr)
{
RW_PARAMET *PPtr;
uint8 Request[5];
PPtr = (READ_PARAMET *)ParameterPtr;
Request[0] = 0x05;
Request[1] = (uint8)(PPtr->WStartAddr>>8);
Request[2] = (uint8)(PPtr->WStartAddr);
Request[3] = (uint8)((*PPtr->DataPtr)>>8);
Request[4] = (uint8)(*PPtr->DataPtr);
PutDataInPUD(Request,5);
}
//***************************************************************
// 函數名稱:WriteSingleRegPDU
// 輸入參數:ParameterPtr,數據結構指針
// 輸出參數:無
// 功能描述:封裝寫單個寄存器幀。0x06
//***************************************************************
void WriteSingleRegPDU(void *ParameterPtr)
{
RW_PARAMET *PPtr;
uint8 Request[5];
PPtr = (READ_PARAMET *)ParameterPtr;
Request[0] = 0x06;
Request[1] = (uint8)(PPtr->WStartAddr>>8);
Request[2] = (uint8)(PPtr->WStartAddr);
Request[3] = (uint8)((*PPtr->DataPtr)>>8);
Request[4] = (uint8)(*PPtr->DataPtr);
PutDataInPUD(Request,5);
}
//***************************************************************
// 函數名稱:WriteMultipleCoils2PDU
// 輸入參數:ParameterPtr,數據結構指針
// 輸出參數:無
// 功能描述:封裝寫多個線圈幀。0x0f
//***************************************************************
void WriteMultipleCoils2PDU(void *ParameterPtr) // 寫多線圈
{
WRITE_PARAMET *PPtr;
uint8 *DataPtr;
uint8 Request[256],i;
uint8 Bytes;
PPtr = (WRITE_PARAMET *)ParameterPtr;
Bytes = (PPtr->WQuantity/8)+(PPtr->WQuantity%8)?1:0;
Request[0] = 0x0f;
Request[1] = (uint8)(PPtr->WStartAddr>>8);
Request[2] = (uint8)(PPtr->WStartAddr);
Request[3] = (uint8)(PPtr->WQuantity>>8);
Request[4] = (uint8)(PPtr->WQuantity);
Request[5] = Bytes; // 字符個數
DataPtr = (uint8*)PPtr->DataPtr;
for(i=0;i<Bytes;i++)
{
Request[6+i] = *(DataPtr+i) ;
}
PutDataInPUD(Request,6+Bytes);
}
//***************************************************************
// 函數名稱:WriteSingleCoil2PDU
// 輸入參數:ParameterPtr,數據結構指針
// 輸出參數:無
// 功能描述:封裝寫多個寄存器幀。0x10
//***************************************************************
void WriteMultipleReg2PDU(void *ParameterPtr)
{
WRITE_PARAMET *PPtr;
uint8 Request[256],i;
PPtr = (WRITE_PARAMET *)ParameterPtr;
Request[0] = 0x10;
Request[1] = (uint8)(PPtr->WStartAddr>>8);
Request[2] = (uint8)(PPtr->WStartAddr);
Request[3] = (uint8)(PPtr->WQuantity>>8);
Request[4] = (uint8)(PPtr->WQuantity);
Request[5] = (uint8)(PPtr->WQuantity*2); // 字符個數
for(i=0;i<PPtr->WQuantity;i++)
{
Request[6+i*2] = *(PPtr->DataPtr+i)>>8;
Request[7+i*2] = *(PPtr->DataPtr+i);
}
PutDataInPUD(Request,6+(PPtr->WQuantity)*2);
}
//***************************************************************
// 函數名稱:MaskWriteReg2PDU
// 輸入參數:ParameterPtr,數據結構指針
// 輸出參數:無
// 功能描述:封裝屏蔽寫寄存器幀。0x16
//***************************************************************
void MaskWriteReg2PDU(void *ParameterPtr) // 處理屏蔽寄存器指令
{
MASK_WRITE_REG *PPtr;
uint8 Request[7];
PPtr = (MASK_WRITE_REG *) ParameterPtr;
Request[0] = 0x16;
Request[1] = (uint8)(PPtr->RefAddress>>8);
Request[2] = (uint8)(PPtr->RefAddress);
Request[3] = (uint8)(PPtr->And_Mask>>8);
Request[4] = (uint8)(PPtr->And_Mask);
Request[5] = (uint8)(PPtr->OR_Mask>>8);
Request[6] = (uint8)(PPtr->OR_Mask);
PutDataInPUD(Request,7); // 封裝PDU包
}
//***************************************************************
// 函數名稱:ReadWriteMultipleReg2PDU
// 輸入參數:ParameterPtr,數據結構指針
// 輸出參數:無
// 功能描述:封裝讀和寫多個寄存器幀。0x17
//***************************************************************
void ReadWriteMultipleReg2PDU(void *ParameterPtr) // 讀寫多個寄存器
{
RW_PARAMET *PPtr;
uint8 Request[256];
uint8 i;
PPtr = (RW_PARAMET *) ParameterPtr;
Request[0] = 0x17;
Request[1] = (uint8)(PPtr->RStartAddr>>8); // 讀出的起始指針
Request[2] = (uint8)(PPtr->RStartAddr);
Request[3] = (uint8)(PPtr->RQuantity>>8); // 讀出的數量
Request[4] = (uint8)(PPtr->RQuantity);
Request[5] = (uint8)(PPtr->WStartAddr>>8); // 寫入的起始地址
Request[6] = (uint8)(PPtr->WStartAddr);
Request[7] = (uint8)(PPtr->WQuantity>>8); // 寫入的數量
Request[8] = (uint8)(PPtr->WQuantity);
Request[9] = (uint8)(PPtr->WQuantity*2); // 寫入的字節數
for(i=0;i<PPtr->WQuantity;i++) // 寫入的數據
{
Request[10+i*2] = *(PPtr->DataPtr+i)>>8;
Request[11+i*2] = *(PPtr->DataPtr+i);
}
PutDataInPUD(Request,10+(PPtr->WQuantity)*2); // 封裝PDU包
}
//***************************************************************
//***************************************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -