- 打卡等级:以坛为家I
- 打卡总天数:375
- 最近打卡:2025-04-26 15:51:33
已绑定手机
高级会员
- 积分
- 822
|
赚点积分 勿喷{:5_313:}
/******************************************************************/
/*** 函数名称:void ReadReg(void) *******/
/*** 函数说明:读读寄存器 *******/
/*** 参数:none *******/
/*** 编写: 小坤 *******/
/*** 备注:2024-2-23 V1.0 *******/
/******************************************************************/
void ReadReg(void)
{
Buff_u16_u8 Buff1={0};
INT8U buff_n[255];
INT16U i=0;
INT8U n=0;
Modbus.Reg_Len = Modbus.buff[4]*256+Modbus.buff[5]; //寄存器长度
if((Modbus.Reg_Len<1)||(Modbus.Reg_Len>125)) return; //寄存器个数范围 1<=寄存器数量<=125
if(Modbus.Reg_addr+Modbus.Reg_Len > Reg_len) return; //起始地址+寄存器长度<=总寄存器数量
buff_n[n++] = GSPCCommControlComponent.address; //地址
buff_n[n++] = Modbus.CMD; //功能码
buff_n[n++] = Modbus.Reg_Len*2; //数据长度
for(i=Modbus.Reg_addr; i<(Modbus.Reg_addr+Modbus.Reg_Len); i++ )
{
//Buff1.Dat = Modbus.Read_Reg[i];
Buff1.Dat = Get_Read_Data(i);
buff_n[n++] = Buff1.Byte[1];
buff_n[n++] = Buff1.Byte[0]; //数据
}
Modbus.CRC_data = crc16( buff_n, n);
buff_n[n++] = Modbus.CRC_data>>8;
buff_n[n++] = Modbus.CRC_data&0xFF; //校验
//putchars4_8th(buff_n, n); //串口4发送
UART4_Send_n(buff_n, n);
}
/******************************************************************/
/*** 函数名称:void WriteReg(void) *******/
/*** 函数说明:写寄存器 *******/
/*** 参数:none *******/
/*** 编写: 小坤 *******/
/*** 备注:2024-2-23 V1.0 *******/
/******************************************************************/
void WriteReg(void)
{
Buff_u16_u8 Buff1;
INT8U buff_n[10];
INT16U i=0;
INT8U n=0;
if( Modbus.CMD == 0X06 ) //写单个寄存器
{
if( Modbus.Reg_addr <= Reg_len) //判断地址是否合规
{
Buff1.Byte[1] = Modbus.buff[4];
Buff1.Byte[0] = Modbus.buff[5]; //获取数据
Modbus.Write_Reg[Modbus.Reg_addr] = Buff1.Dat; //寄存器赋值
Modbus.Write_state = 1; /* 加入存储 */
goto END;
}
}
if( Modbus.CMD == 0X10 ) //写多个寄存器
{
Modbus.Reg_Len = Modbus.buff[4]*256+Modbus.buff[5];
if((Modbus.Reg_Len<1)||(Modbus.Reg_Len>123)) return; //寄存器个数范围 1<=寄存器数量<=123
if(Modbus.Reg_Len*2!=Modbus.buff[6]) return; //数据字节数据范围 Modbus.Reg_Len*2
if(Modbus.Reg_addr+Modbus.Reg_Len > Reg_len) return; //起始地址+寄存器长度<=总寄存器数量
for(i=Modbus.Reg_addr; i<(Modbus.Reg_addr+Modbus.Reg_Len); i++ )
{
Buff1.Byte[1] = Modbus.buff[n+7];
n++;
Buff1.Byte[0] = Modbus.buff[n+7];;
n++;
Modbus.Write_Reg[i] = Buff1.Dat; //寄存器赋值
}
Modbus.Write_state = 1; /* 加入存储 */
}
END:
for(n=0; n<6; n++)
{
buff_n[n] = Modbus.buff[n]; //返回值
}
Modbus.CRC_data = crc16(buff_n, n);
buff_n[n++] = Modbus.CRC_data>>8;
buff_n[n++] = Modbus.CRC_data&0xFF; //校验
//putchars4_8th(buff_n, n); //串口4发送
UART4_Send_n(buff_n, n);
}
/******************************************************************/
/*** 函数名称:void ZT_Moddus_Cail_Task(void) *******/
/*** 函数说明:Modbus任务处理 从机 *******/
/*** 参数:none *******/
/*** 编写: 小坤 *******/
/*** 备注:2024-2-23 V1.0 *******/
/******************************************************************/
void Moddus_Task(void)
{
INT8U i=0;
for( i=0; i<Uart4.Rx_counter; i++ )
{
Modbus.buff[i] = Uart4.Rx_buff[i];
}
Modbus.len = Uart4.Rx_counter;
Modbus.CRC_data = crc16((INT8U*)&Modbus.buff, (Modbus.len-2)); //计算CRC校验值
Modbus.CRC_H = Modbus.CRC_data >> 8;
Modbus.CRC_L = Modbus.CRC_data & 0xFF; //拆分高低位
if((Modbus.buff[Modbus.len - 2] == Modbus.CRC_H) && (Modbus.buff[Modbus.len - 1] == Modbus.CRC_L)) //判断CRC校验是否正确
{
Modbus.address = Modbus.buff[0]; //地址
if((Modbus.address == GSPCCommControlComponent.address)||(Modbus.address == 255)) //判断地址
{
Modbus.CMD = Modbus.buff[1]; //功能码
Modbus.Reg_addr = Modbus.buff[2]*256+Modbus.buff[3]; //寄存器地址
switch(Modbus.CMD )
{
case 0x03: ReadReg(); break; //读寄存器
case 0x06:
case 0x10: WriteReg(); break; //写寄存器
//default: Send_Err(Err_CMD); break; //异常功能码
}
}
}
}
|
-
-
|