?? mb_pfunction.c
字號(hào):
/****************************************Copyright (c)**************************************************
** 廣州致遠(yuǎn)電子有限公司
**
** http://www.21cm.com.cn
**
**--------------File Info-------------------------------------------------------------------------------
** File name: MB_PFunction.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"
//**************************************************
// 函數(shù)名稱:MB_GetDiscrete
// 輸入?yún)?shù):Address,線圈地址
// 輸出參數(shù):返回線圈值(0\1)
// 功能描述:獲取離散值函數(shù),訪函數(shù)由用戶編寫
//**************************************************
uint8 MB_GetDiscrete(uint16 Address);
//**************************************************
// 函數(shù)名稱:MB_GetCoils
// 輸入?yún)?shù):Address,線圈地址
// 輸出參數(shù):返回線圈值(0\1)
// 功能描述:獲取線圈值函數(shù),訪函數(shù)由用戶編寫
//**************************************************
uint8 MB_GetCoils(uint16 Address);
//**************************************************
// 函數(shù)名稱:MB_SetCoil
// 輸入?yún)?shù):Address,線圈地址
// CoilValue,線圈值(0\1)
// 輸出參數(shù):返回寄存器值
// 功能描述:設(shè)置線圈值函數(shù),訪函數(shù)由用戶編寫
//**************************************************
uint8 MB_SetCoil(uint16 Address,uint8 CoilValue);
//**************************************************
// 函數(shù)名稱:MB_GetInputRegValue
// 輸入?yún)?shù):Address,寄存器地址
// 輸出參數(shù):返回寄存器值
// 功能描述:讀輸入寄存器值函數(shù),訪函數(shù)由用戶編寫
//**************************************************
uint16 MB_GetInputRegValue(uint16 Address);
//**************************************************
// 函數(shù)名稱:MB_GetRegValue
// 輸入?yún)?shù):Address,寄存器地址
// 輸出參數(shù):返回寄存器值
// 功能描述:讀保持寄存器值函數(shù),訪函數(shù)由用戶編寫
//**************************************************
uint16 MB_GetRegValue(uint16 Address);
//**************************************************
// 函數(shù)名稱:MB_SetRegValue
// 輸入?yún)?shù):Address,寄存器地址
// Value,寫入的值
// 輸出參數(shù):無
// 功能描述:寫保持寄存器值函數(shù),訪函數(shù)由用戶編寫
//**************************************************
void MB_SetRegValue(uint16 Address,uint16 Value);
/****************************************************************************************/
// 函數(shù)名稱:FReadCoils
// 輸入?yún)?shù):Response
// 輸出參數(shù):無
// 功能描述:處理讀單線圈指令01
/***************************************************************************************/
void FReadCoils(PDU_RESPONSE *Response);
/****************************************************************************************/
// 函數(shù)名稱:FReadDiscreteInputs
// 輸入?yún)?shù):Response
// 輸出參數(shù):無
// 功能描述:處理讀離散輸入指令02
/***************************************************************************************/
void FReadDiscreteInputs(PDU_RESPONSE *Response);
/****************************************************************************************/
// 函數(shù)名稱:FReadHoldingReg
// 輸入?yún)?shù):Response
// 輸出參數(shù):無
// 功能描述:處理讀保持寄存器指令03
/****************************************************************************************/
void FReadHoldingReg(PDU_RESPONSE *Response);
/****************************************************************************************/
// 函數(shù)名稱:FReadInputReg
// 輸入?yún)?shù):Response
// 輸出參數(shù):無
// 功能描述:處理讀輸入寄存器指令04
/****************************************************************************************/
void FReadInputReg(PDU_RESPONSE *Response);
/****************************************************************************************/
// 函數(shù)名稱:FWriteSingleCoil
// 輸入?yún)?shù):Response
// 輸出參數(shù):無
// 功能描述:處理寫單線圈指令05
/****************************************************************************************/
void FWriteSingleCoil(PDU_RESPONSE *Response);
/****************************************************************************************/
// 函數(shù)名稱:FWriteSingleReg
// 輸入?yún)?shù):Response
// 輸出參數(shù):無
// 功能描述:處理寫單線圈指令06
/****************************************************************************************/
void FWriteSingleReg(PDU_RESPONSE *Response);
/****************************************************************************************/
// 函數(shù)名稱:FWriteMultipleCoils
// 輸入?yún)?shù):Response
// 輸出參數(shù):無
// 功能描述:處理寫多線圈指令15
/****************************************************************************************/
void FWriteMultipleCoils(PDU_RESPONSE *Response);
/****************************************************************************************/
// 函數(shù)名稱:FWriteMultipleReg
// 輸入?yún)?shù):Response
// 輸出參數(shù):無
// 功能描述:處理寫多寄存器指令16
/****************************************************************************************/
void FWriteMultipleReg(PDU_RESPONSE *Response);
/****************************************************************************************/
// 函數(shù)名稱:FMaskWriteReg
// 輸入?yún)?shù):Response
// 輸出參數(shù):無
// 功能描述:處理屏蔽寄存器指令22
/****************************************************************************************/
void FMaskWriteReg(PDU_RESPONSE *Response);
/****************************************************************************************/
// 函數(shù)名稱:FRWMultipleReg
// 輸入?yún)?shù):Response
// 輸出參數(shù):無
// 功能描述:處理讀寫多寄存器指令23
/****************************************************************************************/
void FRWMultipleReg(PDU_RESPONSE *Response);
void FTest(PDU_RESPONSE *Response){}
AT_CODE FUNCTION_ARRAY FCodeHandleArray[MAX_FUNCTION]={
#if READ_COILS_EN > 0
{0x01,FReadCoils}, // 讀線圈
#endif
#if READ_DIS_INPUT_EN > 0
{0x02,FReadDiscreteInputs}, // 讀離散量輸入
#endif
#if READ_HOLD_REG_EN > 0
{0x03,FReadHoldingReg}, // 讀保持寄存器
#endif
#if READ_INPUT_REG_EN > 0
{0x04,FReadInputReg}, // 讀輸入寄存器
#endif
#if WRITE_SING_COIL_EN > 0
{0x05,FWriteSingleCoil}, // 寫單個(gè)線圈
#endif
#if WRITE_SING_REG_EN > 0
{0x06,FWriteSingleReg}, // 寫單個(gè)寄存器
#endif
#if WRITE_MULT_COIL_EN > 0
{0x0f,FWriteMultipleCoils}, // 寫多個(gè)線圈
#endif
#if WRITE_MULT_REG_EN > 0
{0x10,FWriteMultipleReg}, // 寫多個(gè)寄存器
#endif
#if MASK_WRITE_REG_EN > 0
{0x16,FMaskWriteReg}, // 處理屏蔽寄存器指令
#endif
#if READ_WRITE_REG_EN > 0
{0x17,FRWMultipleReg}, // 讀寫多個(gè)寄存器
#endif
{0x00,FTest} // 測試功能代碼
};
#if READ_DIS_INPUT_EN
//************************************************************************************
// 函數(shù)名稱:ReadDiscreteInputs
// 輸入?yún)?shù):CoilsDataPtr,存放離散輸入數(shù)據(jù)指針
// StAddr,離散的起始地址
// Quantity,離散的數(shù)量
// 輸出參數(shù):正常返回TRUE,出錯(cuò)返回FALSE。
// 功能描述:讀離散輸入操作函數(shù)
//************************************************************************************
uint8 ReadDiscreteInputs(uint8 *CoilsDataPtr,uint16 StAddr ,uint16 Quantity)
{
uint8 *CoilsInByte;
uint8 offset;
uint16 i=0 ;
CoilsInByte = CoilsDataPtr;
while(i<Quantity)
{
*CoilsInByte = 0;
for(offset=0;offset<8;offset++,i++) // 將線圈值寫入一個(gè)字節(jié)
{
if(i<Quantity)
{
*CoilsInByte |= MB_GetDiscrete(StAddr+i)<<offset;
}
}
CoilsInByte++;
}
return TRUE;
}
#endif
#if READ_COILS_EN
//************************************************************************************
// 函數(shù)名稱:ReadCoils
// 輸入?yún)?shù):CoilsDataPtr,存放線圈數(shù)據(jù)指針
// StAddr,線圈的起始地址
// Quantity,線圈的數(shù)量
// 輸出參數(shù):正常返回TRUE,出錯(cuò)返回FALSE。
// 功能描述:讀多線圈操作函數(shù)
//************************************************************************************
uint8 ReadCoils(uint8 *CoilsDataPtr,uint16 StAddr ,uint16 Quantity)
{
uint8 *CoilsInByte;
uint8 offset;
uint16 i=0 ;
CoilsInByte = CoilsDataPtr;
while(i<Quantity)
{
*CoilsInByte = 0;
for(offset=0;offset<8;offset++,i++) // 將線圈值寫入一個(gè)字節(jié)
{
if(i<Quantity)
{
*CoilsInByte |= MB_GetCoils(StAddr+i)<<offset;
}
}
CoilsInByte++;
}
return TRUE;
}
#endif
#if WRITE_SING_COIL_EN
//************************************************************************************
// 函數(shù)名稱:WriteSingleCoil
// 輸入?yún)?shù):DataPtr,數(shù)據(jù)指針,
// StAddr,寄存器起始地址
// Quantity,寄存器數(shù)量。
// 輸出參數(shù):正常返回TRUE,出錯(cuò)返回FALSE。
// 功能描述:寫單線圈處理函數(shù)
//************************************************************************************
uint8 WriteSingleCoil(uint16 OutputAddr,uint16 OutputValue)
{
return MB_SetCoil(OutputAddr,(OutputValue==0xff00)?1:0);
}
#endif
#if WRITE_MULT_COIL_EN
//************************************************************************************
// 函數(shù)名稱:WriteMultipleCoils
// 輸入?yún)?shù):DataPtr,數(shù)據(jù)指針,
// StAddr,寄存器起始地址
// Quantity,寄存器數(shù)量。
// 輸出參數(shù):正常返回TRUE,出錯(cuò)返回FALSE。
// 功能描述:寫多線圈處理函數(shù)
//************************************************************************************
uint8 WriteMultipleCoils(uint8 *DataPtr,uint16 StAddr ,uint16 Quantity)
{
uint16 i;
uint8 CoilInByte;
for(i=0;i<Quantity;i++)
{
if((i%8)==0)
CoilInByte = *(DataPtr+(i/8));
if( FALSE == MB_SetCoil(StAddr+i,(CoilInByte>>(i%8))&0x01))
return FALSE;
}
return TRUE;
}
#endif
#if READ_INPUT_REG_EN
//************************************************************************************
// 函數(shù)名稱:ReadInputReg
// 輸入?yún)?shù):DataPtr,數(shù)據(jù)指針,
// StAddr,寄存器起始地址
// Quantity,寄存器數(shù)量。
// 輸出參數(shù):正常返回TRUE,出錯(cuò)返回FALSE。
// 功能描述:讀輸入寄存器
//************************************************************************************
uint8 ReadInputReg(uint8 *DataPtr,uint16 StAddr ,uint16 Quantity)
{
uint8 i;
uint16 Value;
for(i=0;i<Quantity;i++)
{
Value = MB_GetInputRegValue(StAddr+i);
*(DataPtr+i*2) = (uint8)(Value>>8); // 先傳高位
*(DataPtr+i*2+1) = (uint8)Value; // 后傳低位
}
return TRUE;
}
#endif
#if READ_HOLD_REG_EN+READ_WRITE_REG_EN+MASK_WRITE_REG_EN
//************************************************************************************
// 函數(shù)名稱:ReadHoldingReg
// 輸入?yún)?shù):DataPtr,數(shù)據(jù)指針,16位數(shù)據(jù)高8位在低字節(jié),低8位在高字節(jié)
// StAddr,寄存器起始地址
// Quantity,寄存器數(shù)量。
// 輸出參數(shù):正常返回TRUE,出錯(cuò)返回FALSE。
// 功能描述:讀寄存器處理函數(shù)
//************************************************************************************
uint8 ReadHoldingReg(uint8 *DataPtr,uint16 StAddr ,uint16 Quantity)
{
uint8 i;
uint16 Value;
for(i=0;i<Quantity;i++)
{
Value = MB_GetRegValue(StAddr+i);
*(DataPtr+i*2) = (uint8)(Value>>8); // 先傳高位
*(DataPtr+i*2+1) = (uint8)Value; // 后傳低位
}
return TRUE;
}
#endif
#if WRITE_MULT_REG_EN+READ_WRITE_REG_EN+MASK_WRITE_REG_EN+WRITE_SING_REG_EN
//************************************************************************************
// 函數(shù)名稱:WriteHoldingReg
// 輸入?yún)?shù):DataPtr,數(shù)據(jù)指針,16位數(shù)據(jù)高8位在低字節(jié),低8位在高字節(jié)
// StAddr,寄存器起始地址
// Quantity,寄存器數(shù)量。
// 輸出參數(shù):正常返回TRUE,出錯(cuò)返回FALSE。
// 功能描述:寫寄存器處理函數(shù)
//************************************************************************************
uint8 WriteHoldingReg(uint8 *KeepDataPtr,uint16 StAddr ,uint16 Quantity)
{
uint8 i;
uint16 Value;
for(i=0;i<Quantity;i++)
{
Value = (*(KeepDataPtr+i*2)<<8)|(*(KeepDataPtr+i*2+1));
MB_SetRegValue(StAddr+i,Value);
}
return TRUE;
}
#endif
#if READ_COILS_EN > 0
/****************************************************************************************/
// 函數(shù)名稱:FReadCoils
// 輸入?yún)?shù):Response,為PDU_RESPONSE類型的指針,PDU_RESPONSE:
// typedef struct __PDU_RESPONSE{
// uint8* PDUDataPtr; 請(qǐng)求數(shù)據(jù)指針,功能代碼處理函數(shù)必需將處理的數(shù)據(jù)包存在該指針的開始位始
// uint8 PDUByteLength;請(qǐng)求數(shù)據(jù)數(shù)長度
// uint8 ExceptionCode;僅為輸出錯(cuò)異常代碼,正常操作設(shè)為0
// }PDU_RESPONSE
// 輸出參數(shù):無
// 功能描述:處理讀多線圈指令01
/***************************************************************************************/
void FReadCoils(PDU_RESPONSE *Response)
{
uint8 * PDUPtr;
uint16 StAddr ,Quantity;
// 從請(qǐng)求PDU中提取相關(guān)參數(shù)
PDUPtr = Response->PDUDataPtr;
StAddr = PDUPtr[1]<<8|PDUPtr[2];
Quantity = PDUPtr[3]<<8|PDUPtr[4];
Response->PDUByteLength = 2 + Quantity/8+((Quantity%8)?1:0) ; // 正常返回的數(shù)據(jù)長度
if((Quantity>=0x001)&&(Quantity<=0x07d0))
{
if((StAddr<END_COILS_ADDR)&&((StAddr+Quantity)<=END_COILS_ADDR))
{
if(ReadCoils(PDUPtr+2,StAddr,Quantity))
{
*(PDUPtr+1) = Quantity/8+(Quantity%8)?1:0; // 字節(jié)數(shù)
Response->ExceptionCode = 0x00;
}
else
Response->ExceptionCode = 0x04;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -