1、【修改】FreeModbus主机事件处理及方法执行部分源码,使得在主机广播写从机的过程中,也同时更新主机缓冲区。
Signed-off-by: armink <armink.ztl@gmail.com>
This commit is contained in:
parent
7513daf118
commit
6f01fe6286
Binary file not shown.
|
@ -120,7 +120,12 @@ eMBMasterFuncReadCoils( UCHAR * pucFrame, USHORT * usLen )
|
||||||
eMBException eStatus = MB_EX_NONE;
|
eMBException eStatus = MB_EX_NONE;
|
||||||
eMBErrorCode eRegStatus;
|
eMBErrorCode eRegStatus;
|
||||||
|
|
||||||
if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN )
|
/* If this request is broadcast, and it's read mode. This request don't need execute. */
|
||||||
|
if ( xMBMasterRequestIsBroadcast() )
|
||||||
|
{
|
||||||
|
eStatus = MB_EX_NONE;
|
||||||
|
}
|
||||||
|
else if ( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN )
|
||||||
{
|
{
|
||||||
vMBMasterGetPDUSndBuf(&ucMBFrame);
|
vMBMasterGetPDUSndBuf(&ucMBFrame);
|
||||||
usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 );
|
usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 );
|
||||||
|
|
|
@ -104,7 +104,12 @@ eMBMasterFuncReadDiscreteInputs( UCHAR * pucFrame, USHORT * usLen )
|
||||||
eMBException eStatus = MB_EX_NONE;
|
eMBException eStatus = MB_EX_NONE;
|
||||||
eMBErrorCode eRegStatus;
|
eMBErrorCode eRegStatus;
|
||||||
|
|
||||||
if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN )
|
/* If this request is broadcast, and it's read mode. This request don't need execute. */
|
||||||
|
if ( xMBMasterRequestIsBroadcast() )
|
||||||
|
{
|
||||||
|
eStatus = MB_EX_NONE;
|
||||||
|
}
|
||||||
|
else if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN )
|
||||||
{
|
{
|
||||||
vMBMasterGetPDUSndBuf(&ucMBFrame);
|
vMBMasterGetPDUSndBuf(&ucMBFrame);
|
||||||
usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 );
|
usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 );
|
||||||
|
|
|
@ -294,7 +294,12 @@ eMBMasterFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen )
|
||||||
eMBException eStatus = MB_EX_NONE;
|
eMBException eStatus = MB_EX_NONE;
|
||||||
eMBErrorCode eRegStatus;
|
eMBErrorCode eRegStatus;
|
||||||
|
|
||||||
if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN )
|
/* If this request is broadcast, and it's read mode. This request don't need execute. */
|
||||||
|
if ( xMBMasterRequestIsBroadcast() )
|
||||||
|
{
|
||||||
|
eStatus = MB_EX_NONE;
|
||||||
|
}
|
||||||
|
else if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN )
|
||||||
{
|
{
|
||||||
vMBMasterGetPDUSndBuf(&ucMBFrame);
|
vMBMasterGetPDUSndBuf(&ucMBFrame);
|
||||||
usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 );
|
usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 );
|
||||||
|
@ -397,7 +402,12 @@ eMBMasterFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen
|
||||||
eMBException eStatus = MB_EX_NONE;
|
eMBException eStatus = MB_EX_NONE;
|
||||||
eMBErrorCode eRegStatus;
|
eMBErrorCode eRegStatus;
|
||||||
|
|
||||||
if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READWRITE_SIZE_MIN )
|
/* If this request is broadcast, and it's read mode. This request don't need execute. */
|
||||||
|
if ( xMBMasterRequestIsBroadcast() )
|
||||||
|
{
|
||||||
|
eStatus = MB_EX_NONE;
|
||||||
|
}
|
||||||
|
else if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READWRITE_SIZE_MIN )
|
||||||
{
|
{
|
||||||
vMBMasterGetPDUSndBuf(&ucMBFrame);
|
vMBMasterGetPDUSndBuf(&ucMBFrame);
|
||||||
usRegReadAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_READ_ADDR_OFF] << 8U );
|
usRegReadAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_READ_ADDR_OFF] << 8U );
|
||||||
|
|
|
@ -103,7 +103,12 @@ eMBMasterFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen )
|
||||||
eMBException eStatus = MB_EX_NONE;
|
eMBException eStatus = MB_EX_NONE;
|
||||||
eMBErrorCode eRegStatus;
|
eMBErrorCode eRegStatus;
|
||||||
|
|
||||||
if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN )
|
/* If this request is broadcast, and it's read mode. This request don't need execute. */
|
||||||
|
if ( xMBMasterRequestIsBroadcast() )
|
||||||
|
{
|
||||||
|
eStatus = MB_EX_NONE;
|
||||||
|
}
|
||||||
|
else if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN )
|
||||||
{
|
{
|
||||||
vMBMasterGetPDUSndBuf(&ucMBFrame);
|
vMBMasterGetPDUSndBuf(&ucMBFrame);
|
||||||
usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 );
|
usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 );
|
||||||
|
|
|
@ -389,6 +389,7 @@ void vMBMasterSetCBRunInMasterMode( BOOL IsMasterMode );
|
||||||
USHORT usMBMasterGetPDUSndLength( void );
|
USHORT usMBMasterGetPDUSndLength( void );
|
||||||
void vMBMasterSetPDUSndLength( USHORT SendPDULength );
|
void vMBMasterSetPDUSndLength( USHORT SendPDULength );
|
||||||
void vMBMasterSetCurTimerMode( eMBMasterTimerMode eMBTimerMode );
|
void vMBMasterSetCurTimerMode( eMBMasterTimerMode eMBTimerMode );
|
||||||
|
BOOL xMBMasterRequestIsBroadcast( void );
|
||||||
eMBMasterErrorEventType eMBMasterGetErrorType( void );
|
eMBMasterErrorEventType eMBMasterGetErrorType( void );
|
||||||
void vMBMasterSetErrorType( eMBMasterErrorEventType errorType );
|
void vMBMasterSetErrorType( eMBMasterErrorEventType errorType );
|
||||||
eMBMasterReqErrCode vMBMasterWaitRequestFinish( void );
|
eMBMasterReqErrCode vMBMasterWaitRequestFinish( void );
|
||||||
|
|
|
@ -116,8 +116,8 @@ PR_BEGIN_EXTERN_C
|
||||||
* And if slave is not respond in this time,the master will process this timeout error.
|
* And if slave is not respond in this time,the master will process this timeout error.
|
||||||
* Then master can send other frame */
|
* Then master can send other frame */
|
||||||
#define MB_MASTER_TIMEOUT_MS_RESPOND (100 )
|
#define MB_MASTER_TIMEOUT_MS_RESPOND (100 )
|
||||||
/*! \brief The total slaves in Modbus Master system.Default 16.
|
/*! \brief The total slaves in Modbus Master system. Default 16.
|
||||||
* Note : The slave ID must be continuous from 0.*/
|
* \note : The slave ID must be continuous from 1.*/
|
||||||
#define MB_MASTER_TOTAL_SLAVE_NUM ( 16 )
|
#define MB_MASTER_TOTAL_SLAVE_NUM ( 16 )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -259,7 +259,7 @@ eMBMasterPoll( void )
|
||||||
static USHORT usLength;
|
static USHORT usLength;
|
||||||
static eMBException eException;
|
static eMBException eException;
|
||||||
|
|
||||||
int i;
|
int i , j;
|
||||||
eMBErrorCode eStatus = MB_ENOERR;
|
eMBErrorCode eStatus = MB_ENOERR;
|
||||||
eMBMasterEventType eEvent;
|
eMBMasterEventType eEvent;
|
||||||
eMBMasterErrorEventType errorType;
|
eMBMasterErrorEventType errorType;
|
||||||
|
@ -305,16 +305,24 @@ eMBMasterPoll( void )
|
||||||
for (i = 0; i < MB_FUNC_HANDLERS_MAX; i++)
|
for (i = 0; i < MB_FUNC_HANDLERS_MAX; i++)
|
||||||
{
|
{
|
||||||
/* No more function handlers registered. Abort. */
|
/* No more function handlers registered. Abort. */
|
||||||
if (xMasterFuncHandlers[i].ucFunctionCode == 0)
|
if (xMasterFuncHandlers[i].ucFunctionCode == 0) {
|
||||||
{
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (xMasterFuncHandlers[i].ucFunctionCode
|
else if (xMasterFuncHandlers[i].ucFunctionCode == ucFunctionCode) {
|
||||||
== ucFunctionCode)
|
|
||||||
{
|
|
||||||
vMBMasterSetCBRunInMasterMode(TRUE);
|
vMBMasterSetCBRunInMasterMode(TRUE);
|
||||||
eException = xMasterFuncHandlers[i].pxHandler(ucMBFrame,
|
/* If master request is broadcast,
|
||||||
&usLength);
|
* the master need execute function for all slave.
|
||||||
|
*/
|
||||||
|
if ( xMBMasterRequestIsBroadcast() ) {
|
||||||
|
usLength = usMBMasterGetPDUSndLength();
|
||||||
|
for(j = 1; j <= MB_MASTER_TOTAL_SLAVE_NUM; j++){
|
||||||
|
vMBMasterSetDestAddress(j);
|
||||||
|
eException = xMasterFuncHandlers[i].pxHandler(ucMBFrame, &usLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
eException = xMasterFuncHandlers[i].pxHandler(ucMBFrame, &usLength);
|
||||||
|
}
|
||||||
vMBMasterSetCBRunInMasterMode(FALSE);
|
vMBMasterSetCBRunInMasterMode(FALSE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -395,10 +395,9 @@ xMBMasterRTUTimerExpired(void)
|
||||||
eSndState = STATE_M_TX_IDLE;
|
eSndState = STATE_M_TX_IDLE;
|
||||||
|
|
||||||
vMBMasterPortTimersDisable( );
|
vMBMasterPortTimersDisable( );
|
||||||
/* If timer mode is convert delay ,then Master is idel now. */
|
/* If timer mode is convert delay, the master event then turns EV_MASTER_EXECUTE status. */
|
||||||
if (eMasterCurTimerMode == MB_TMODE_CONVERT_DELAY) {
|
if (eMasterCurTimerMode == MB_TMODE_CONVERT_DELAY) {
|
||||||
vMBMasterCBRequestScuuess( );
|
xNeedPoll = xMBMasterPortEventPost( EV_MASTER_EXECUTE );
|
||||||
vMBMasterRunResRelease( );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return xNeedPoll;
|
return xNeedPoll;
|
||||||
|
@ -433,5 +432,10 @@ void vMBMasterSetCurTimerMode( eMBMasterTimerMode eMBTimerMode )
|
||||||
{
|
{
|
||||||
eMasterCurTimerMode = eMBTimerMode;
|
eMasterCurTimerMode = eMBTimerMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The master request is broadcast? */
|
||||||
|
BOOL xMBMasterRequestIsBroadcast( void ){
|
||||||
|
return xFrameIsBroadcast;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue