📄 mbserial.c
字号:
/**
@brief send Diagnostic request and get response(0x08)
@param port which port to use
@param address slave device address
@param subfunc subfunction code
@param data data to be sent to slave device
@return MB_OK for success, on error return error code
*/
/*---------------------------------------------------------------------------*/
int MBSerialDiagnostic(int port, u8 address, u16 subfunc, u16 data)
{
u8 adu[ MB_ASCII_ADU_MAX_LENGTH], pdu[ MAX_BUFFER_SIZE];
int pdu_len= 0, adu_len= 0, ret= 0;
u16 ret_subfunc, ret_data;
/// make PDU
pdu_len= MBDiagnostic( pdu, subfunc, data);
adu_len= MBSerialSendAndWaitResponse( port, adu, pdu, pdu_len, address);
if( adu_len < 0)
return adu_len;
pdu_len= MBGetPDU( pdu, adu, adu_len);
ret= MBGetResponseDiagnostic( pdu, &ret_subfunc, &ret_data);
if( ret < 0)
return ret;
if( ( ret_subfunc != subfunc) || ( ret_data != data))
return MB_ERROR_EXECPTION;
return MB_OK;
}
/*---------------------------------------------------------------------------*/
/**
@brief send Get Comm Event Counter request and get response(0x0B)
@param port which port to use
@param address slave device address
@param status status of Comm Conuter
@param eventcount event counter
@return MB_OK for success, on error return error code
*/
/*---------------------------------------------------------------------------*/
int MBSerialGetCommEventCounter(int port, u8 address, u16 *status, u16 *eventcount)
{
u8 adu[ MB_ASCII_ADU_MAX_LENGTH], pdu[ MAX_BUFFER_SIZE];
int pdu_len= 0, adu_len= 0, ret= 0;
/// make PDU
pdu_len= MBGetCommEventCounter( pdu);
adu_len= MBSerialSendAndWaitResponse( port, adu, pdu, pdu_len, address);
if( adu_len < 0)
return adu_len;
pdu_len= MBGetPDU( pdu, adu, adu_len);
ret= MBGetResponseGetCommEventCounter( pdu, status, eventcount);
if( ret < 0)
return ret;
return MB_OK;
}
/*---------------------------------------------------------------------------*/
/**
@brief send Get Comm Event Counter request and get response(0x0C)
@param port which port to use
@param address slave device address
@param status status of Comm Conuter
@param eventcount event counter
@param messagecount counter for processed message
@param events new events
@return MB_OK for success, on error return error code
*/
/*---------------------------------------------------------------------------*/
int MBSerialGetCommEventLog(int port, u8 address, u16 *status, u16 *eventcount, u16 *messagecount, u8 *events)
{
u8 adu[ MB_ASCII_ADU_MAX_LENGTH], pdu[ MAX_BUFFER_SIZE];
int pdu_len= 0, adu_len= 0, ret= 0;
/// make PDU
pdu_len= MBGetCommEventLog( pdu);
adu_len= MBSerialSendAndWaitResponse( port, adu, pdu, pdu_len, address);
if( adu_len < 0)
return adu_len;
pdu_len= MBGetPDU( pdu, adu, adu_len);
ret= MBGetResponseGetCommEventLog( pdu, status, eventcount, messagecount, events);
if( ret < 0)
return ret;
return MB_OK;
}
/*---------------------------------------------------------------------------*/
/**
@brief send Report Slave ID request and get response(0x11)
@param port which port to use
@param address slave device address
@param slave_id buffer to store slave id
@param status status of the device
@return MB_OK for success, on error return error code
*/
/*---------------------------------------------------------------------------*/
int MBSerialReportSlaveID(int port, u8 address, u8 *slave_id, u8 *status)
{
u8 adu[ MB_ASCII_ADU_MAX_LENGTH], pdu[ MAX_BUFFER_SIZE];
int pdu_len= 0, adu_len= 0, ret= 0;
/// make PDU
pdu_len= MBReportSlaveID( pdu);
adu_len= MBSerialSendAndWaitResponse( port, adu, pdu, pdu_len, address);
if( adu_len < 0)
return adu_len;
pdu_len= MBGetPDU( pdu, adu, adu_len);
ret= MBGetResponseReportSlaveID( pdu, slave_id, status);
if( ret < 0)
return ret;
return MB_OK;
}
/* Modbus slave function or response to master */
/*---------------------------------------------------------------------------*/
/**
@brief send Read Decrete Inputs response(0x02)
@param port which port to use
@param address slave device address
@param no number of registers
@param value registers status
@return MB_OK for success, on error return error code
*/
/*---------------------------------------------------------------------------*/
int MBSerialSendReadDecreteInputs(int port, u8 address, u16 no, u8 *value)
{
u8 pdu[ MAX_BUFFER_SIZE];
int pdu_len= 0, adu_len= 0;
/// make PDU
pdu_len= MBResponseReadDecreteInputs( pdu, no, value);
adu_len= MBSerialWrite( port, pdu, pdu_len, address);
if( adu_len < 0)
return adu_len;
return MB_OK;
}
/*---------------------------------------------------------------------------*/
/**
@brief send Read Coils response(0x01)
@param port which port to use
@param address slave device address
@param no number of registers
@param value registers status
@return MB_OK for success, on error return error code
*/
/*---------------------------------------------------------------------------*/
int MBSerialSendReadCoils(int port, u8 address, u16 no, u8 *value)
{
u8 pdu[ MAX_BUFFER_SIZE];
int pdu_len= 0, adu_len= 0;
/// make PDU
pdu_len= MBResponseReadCoils( pdu, no, value);
adu_len= MBSerialWrite( port, pdu, pdu_len, address);
if( adu_len < 0)
return adu_len;
return MB_OK;
}
/*---------------------------------------------------------------------------*/
/**
@brief send Read Input Registers response(0x04)
@param port which port to use
@param address slave device address
@param no number of registers
@param value registers status
@return MB_OK for success, on error return error code
*/
/*---------------------------------------------------------------------------*/
int MBSerialSendReadInputRegisters(int port, u8 address, u16 no, u16 *value)
{
u8 pdu[ MAX_BUFFER_SIZE];
int pdu_len= 0, adu_len= 0;
/// make PDU
pdu_len= MBResponseReadInputRegisters( pdu, no, value);
adu_len= MBSerialWrite( port, pdu, pdu_len, address);
if( adu_len < 0)
return adu_len;
return MB_OK;
}
/*---------------------------------------------------------------------------*/
/**
@brief send Read Holding Registers response(0x03)
@param port which port to use
@param address slave device address
@param no number of registers
@param value registers status
@return MB_OK for success, on error return error code
*/
/*---------------------------------------------------------------------------*/
int MBSerialSendReadHoldingRegisters(int port, u8 address, u16 no, u16 *value)
{
u8 pdu[ MAX_BUFFER_SIZE];
int pdu_len= 0, adu_len= 0;
/// make PDU
pdu_len= MBResponseReadHoldingRegisters( pdu, no, value);
adu_len= MBSerialWrite( port, pdu, pdu_len, address);
if( adu_len < 0)
return adu_len;
return MB_OK;
}
/*---------------------------------------------------------------------------*/
/**
@brief send Write Multiple Registers response(0x10)
@param port which port to use
@param address slave device address
@param startdevreg starting register address
@param noreg number of registers, between 1 ~ 120
@return MB_OK for success, on error return error code
*/
/*---------------------------------------------------------------------------*/
int MBSerialSendWriteMultipleRegisters(int port, u8 address, u16 startdevreg, u16 noreg)
{
u8 pdu[ MAX_BUFFER_SIZE];
int pdu_len= 0, adu_len= 0;
/// make PDU
pdu_len= MBResponseWriteMultipleRegisters( pdu, startdevreg, noreg);
adu_len= MBSerialWrite( port, pdu, pdu_len, address);
if( adu_len < 0)
return adu_len;
return MB_OK;
}
/*---------------------------------------------------------------------------*/
/**
@brief send Write Single Coil response(0x05)
@param port which port to use
@param address slave device address
@param coilreg coil register address
@param onoff 0xFF00 for on,0x0000 for off
@return MB_OK for success, on error return error code
*/
/*---------------------------------------------------------------------------*/
int MBSerialSendWriteSingleCoil(int port, u8 address, u16 coilreg, u16 onoff)
{
u8 pdu[ MAX_BUFFER_SIZE];
int pdu_len= 0, adu_len= 0;
/// make PDU
pdu_len= MBResponseWriteSingleCoil( pdu, coilreg, onoff);
adu_len= MBSerialWrite( port, pdu, pdu_len, address);
if( adu_len < 0)
return adu_len;
return MB_OK;
}
/*---------------------------------------------------------------------------*/
/**
@brief send Write Single Register response(0x06)
@param port which port to use
@param address slave device address
@param addr register address
@param value value to write
@return MB_OK for success, on error return error code
*/
/*---------------------------------------------------------------------------*/
int MBSerialSendWriteSingleRegister(int port, u8 address, u16 addr, u16 value)
{
u8 pdu[ MAX_BUFFER_SIZE];
int pdu_len= 0, adu_len= 0;
/// make PDU
pdu_len= MBResponseWriteSingleRegister( pdu, addr, value);
adu_len= MBSerialWrite( port, pdu, pdu_len, address);
if( adu_len < 0)
return adu_len;
return MB_OK;
}
/*---------------------------------------------------------------------------*/
/**
@brief send Read FIFO Queue response(0x18)
@param port which port to use
@param address slave device address
@param no bytes of the following data
@param count FIFO value buffer size(<=31)
@param value values of FIFO register
@return MB_OK for success, on error return error code
*/
/*---------------------------------------------------------------------------*/
int MBSerialSendReadFIFOueue(int port, u8 address, u16 no, u16 count, u16 *value)
{
u8 pdu[ MAX_BUFFER_SIZE];
int pdu_len= 0, adu_len= 0;
/// make PDU
pdu_len= MBResponseReadFIFOQueue( pdu, no, count, value);
adu_len= MBSerialWrite( port, pdu, pdu_len, address);
if( adu_len < 0)
return adu_len;
return MB_OK;
}
/*---------------------------------------------------------------------------*/
/**
@brief send Read Execption Status response(0x07)
@param port which port to use
@param address slave device address
@param status eight exception status in one byte
@return MB_OK for success, on error return error code
*/
/*---------------------------------------------------------------------------*/
int MBSerialSendReadExecptionStatus(int port, u8 address, u8 status)
{
u8 pdu[ MAX_BUFFER_SIZE];
int pdu_len= 0, adu_len= 0;
/// make PDU
pdu_len= MBResponseReadExceptionStatus( pdu, status);
adu_len= MBSerialWrite( port, pdu, pdu_len, address);
if( adu_len < 0)
return adu_len;
return MB_OK;
}
/*---------------------------------------------------------------------------*/
/**
@brief send Diagnostic response(0x08)
@param port which port to use
@param address slave device address
@param subfunc subfunction code
@param data response data of request
@return MB_OK for success, on error return error code
*/
/*---------------------------------------------------------------------------*/
int MBSerialSendDiagnostic(int port, u8 address, u16 subfunc, u16 data)
{
u8 pdu[ MAX_BUFFER_SIZE];
int pdu_len= 0, adu_len= 0;
/// make PDU
pdu_len= MBResponseDiagnostic( pdu, subfunc, data);
adu_len= MBSerialWrite( port, pdu, pdu_len, address);
if( adu_len < 0)
return adu_len;
return MB_OK;
}
/*---------------------------------------------------------------------------*/
/**
@brief send Get Comm Event Counter response(0x0B)
@param port which port to use
@param address slave device address
@param status status of Comm Conuter
@param eventcount event counter
@return MB_OK for success, on error return error code
*/
/*---------------------------------------------------------------------------*/
int MBSerialSendGetCommEventCounter(int port, u8 address, u16 status, u16 eventcount)
{
u8 pdu[ MAX_BUFFER_SIZE];
int pdu_len= 0, adu_len= 0;
/// make PDU
pdu_len= MBResponseGetCommEventCounter( pdu, status, eventcount);
adu_len= MBSerialWrite( port, pdu, pdu_len, address);
if( adu_len < 0)
return adu_len;
return MB_OK;
}
/*---------------------------------------------------------------------------*/
/**
@brief send Get Comm Event Counter response(0x0C)
@param port which port to use
@param address slave device address
@param no number of the following data
@param status status of Comm Conuter
@param eventcount event counter
@param messagecount counter for processed message
@param events new events
@return MB_OK for success, on error return error code
*/
/*---------------------------------------------------------------------------*/
int MBSerialSendGetCommEventLog(int port, u8 address, u8 no, u16 status, u16 eventcount, u16 messagecount, u8 *events)
{
u8 pdu[ MAX_BUFFER_SIZE];
int pdu_len= 0, adu_len= 0;
/// make PDU
pdu_len= MBResponseGetCommEventLog( pdu, no, status, eventcount, messagecount, events);
adu_len= MBSerialWrite( port, pdu, pdu_len, address);
if( adu_len < 0)
return adu_len;
return MB_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -