⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mbserial.c

📁 485串行通讯
💻 C
📖 第 1 页 / 共 3 页
字号:
/**
  @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 + -