Modbus-RTU错误响应

目录

一、基础信息

1.1、适用场景

1.2、变量类型

1.3、调用非本文函数

二、主要程序内容

2.1、头文件声明内容

2.2、子函数

三、使用示例

3.1、STM32的HAL库串口1发送响应数据

3.2、STC单片机串口1发送响应数据


一、基础信息

1.1、适用场景

C程序Modbus-RTU模式,主机发指令给从机,从机解码出错时,生成错误响应数据。

错误判断及响应数据参照GB-T19582.1-2008《基于Modbus协议的工业自动化网络规范 第1部分:Modbus应用协议》。

1.2、变量类型

uint8_t,为8位无符号整形变量;

uint16_t,为16位无符号整形变量。

1.3、调用非本文函数

ModbusCRC:

Modbus查表法CRC校验程序_VIFIN的博客-CSDN博客C程序编写Modbus查表法的CRC校验。https://blog.csdn.net/VIFIN/article/details/125788125

二、主要程序内容

2.1、头文件声明内容

enum ReadOrWriteRegisterErrorType	//读写寄存器错误类型
{
	FunctionCodeError = 1,			//错误功能码
	RegisterAddressError,			//寄存器地址错误
	RegisterNumberOrDataError,		//寄存器读取数量或写入值错误
	ReadOrWriteError,				//读写结果错误
};

typedef enum
{
	Modbus_OK,					//执行完成
	Modbus_ERROR,				//执行错误
	Modbus_NOP,					//空操作
}ModbusResult_TypeDef;			//Modbus程序执行结果

2.2、子函数

/******************************************
 * 功能:Modbus错误时的响应数据
 * 输入:
 * 		@error_type:错误类型
 * 		@p_error_buffer:错误数据缓存的首指针地址
 * 		@p_creat_buffer:生成的错误响应数据缓存的首指针地址
 * 		@p_creat_size:生成错误响应数据字节长度的存放地址
 * 返回:Modbus函数执行结果
******************************************/
ModbusResult_TypeDef ModbusError(uint8_t error_type, uint8_t* p_error_buffer, uint8_t* p_creat_buffer, uint8_t* p_creat_size)
{
	uint16_t crc_buffer;

	*(p_creat_buffer + 0) = *(p_error_buffer + 0);					//从机地址
	*(p_creat_buffer + 1) = *(p_error_buffer + 1) + 0x80;			//错误功能码
	*(p_creat_buffer + 2) = error_type;								//错误类型

	crc_buffer = ModbusCRC(3, p_creat_buffer);						//计算CRC
	*(p_creat_buffer + 3) = crc_buffer % 256;
	*(p_creat_buffer + 4) = crc_buffer / 256;

	*p_creat_size = 5;

	return Modbus_OK;
}

error_type:错误类型,根据错误类型,对应填写头文件定义的枚举“ ReadOrWriteRegisterErrorType”的对应内容。

p_error_buffer:错误数据缓存的首指针地址,一般填写串口接收缓存的数组名;

p_creat_buffer:生成的错误响应数据缓存的首指针地址,一般填写串口发送缓存的数组名;

p_creat_size:生成错误响应数据字节长度的存放地址,一般填写uint8_t类型的变量。

返回值:Modbus函数执行结果。

三、使用示例

示例:错误功能码函数及其参数的使用。

Receive_buffer:串口接收数据缓存的数组;

Transmit_buffer:串口发送数据缓存的数组;

Transmit_size:串口发送数据字节长度。

ModbusError(FunctionCodeError, Receive_buffer, Transmit_buffer, &Transmit_size);

3.1、STM32的HAL库串口1发送响应数据

HAL_UART_Transmit(&huart1, Transmit_buffer, Transmit_size, 5);

3.2、STC单片机串口1发送响应数据

STC单片机发送函数引用博客STC单片机串口无阻塞发送函数_VIFIN的博客-CSDN博客的串口无阻塞发送函数。

U1Transimt(Transmit_buffer,Transmit_size);

你可能感兴趣的:(Modbus,stm32)