📄 sl.c
字号:
// 停止向采集板命令重传
CAIJI_Resend_Flag = 0;
CAIJI_Timer = 0;
if(WAVE_Resend_Flag == 0)
{
TMR3CN &=0xFB; // 关闭定时器3
}
// 设置向监控中心发送的命令报文
WAVE_Comm_Len = 0;
if(WAVECOM_Gather == 1)
{
// 发送被动上传数据命令
{
// 命令头
WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Send_SeqNr++; // 命令序列号
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00; // 命令标识
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00; // command [0]
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00; // command [1]
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x03+CAIJI_Data_Len-0x06; // 数据长度
// 中心序号
WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Receive_SeqNr;
// 尾帧标识
WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[4];
// 帧序号
WAVE_Command_Buf[WAVE_Comm_Len++] = Frame_Num;
// 送入采集数据
for(i=0;i<CAIJI_Data_Len - 6;i++)
{
WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[6+i];
}
}
}
else
{
// 现场定时上传采集数据
{
// 命令头
WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Send_SeqNr++; // 命令报文序列号
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00; // 发送命令标识
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00; // Command[0]
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x01; // Command[1]
WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Len + 3; // 数据长度
// 尾帧标识
WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[4];
// 帧序号
WAVE_Command_Buf[WAVE_Comm_Len++] = Frame_Num;
// 设置时间
{
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x14; // 年(高位)
CS_RTC = 0; // 从时间芯片读取时间
while(RegA & 0x80 != 0x00);
WAVE_Command_Buf[WAVE_Comm_Len++] = Year;
WAVE_Command_Buf[WAVE_Comm_Len++] = Month;
WAVE_Command_Buf[WAVE_Comm_Len++] = Day;
WAVE_Command_Buf[WAVE_Comm_Len++] = Hour;
WAVE_Command_Buf[WAVE_Comm_Len++] = Minute;
WAVE_Command_Buf[WAVE_Comm_Len++] = Second;
CS_RTC = 1;
}
// 送入采集数据
for(i=0;i<CAIJI_Data_Len - 6;i++)
{
WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[6+i];
}
// 备份数据
{
// 备份长度
Write_Byte(Current_Add,CAIJI_Data_Len+1);
Current_Add++;
// 备份数据
for(i=0;i<CAIJI_Data_Len+1;i++)
{
Write_Byte(Current_Add,WAVE_Command_Buf[7+i]);
Current_Add++;
}
}
}
}
// 向中心发命令
SEND_DATA_WAVECOM(WAVE_Comm_Len); // 向监控中心发送数据
// 设置重传标识
WAVE_Resend_Flag = 1; // 设置命令重传标识
WAVE_Resend_Num = 0;
WAVE_Timer = 10;
TMR3CN |= 0x04; // 开启定时器3
// ----------------------------------------------------------
// 设置后续重发帧
Frame_Num++;
if(CAIJI_Data_Buffer[4] == 0)
{
// 帧传输结束
// 清数据采集好标识
Data_Ready_Flag = 0;
if(WAVECOM_Gather == 1)
{
WAVECOM_Gather = 0;
if(Time_Gather == 1)
{
// 向采集板发送采集命令(类型为定时发送规定的)
// 命令头
CAIJI_Comm_Len = 0;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x05;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x04;
// 冲次数
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x01;
// 参量类型
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x03;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x08;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x10;
// 发送数据
SEND_DATA_CAIJI(CAIJI_Comm_Len);
// 设置命令重传标识
CAIJI_Resend_Flag = 1;
CAIJI_Resend_Num = 0;
CAIJI_Timer = 1;
TMR3CN |= 0x04; // 开启定时器3
// 设置初始帧序号
Frame_Num = 1;
}
else
{
Data_Gather_Comm = 0;
}
}
else
{
// 清除数据采集标识
Time_Gather = 0;
Data_Gather_Comm = 0;
// 设置备份项数和备份数据发送标识
address = Backup_Index*0x1000;
// Write_Byte(address,0xAA); // 标识该帧已发送
Write_Byte(address,Frame_Num-1);
// 修改记录号
if(Backup_Index == 4)
{
Backup_Index = 2;
CS_RTC = 0;
Record_Ind = 2;
CS_RTC = 1;
}
else
{
Backup_Index++;
CS_RTC = 0;
Record_Ind = Backup_Index;
CS_RTC = 1;
}
}
}
}
// 故障通知命令处理
void Trouble_Inform_Comm(void)
{
CAIJI_Receive_SeqNr = CAIJI_Data_Buffer[0]; // 保存接收序列号
// 停止其它一切的命令及应答
WAVE_Resend_Flag = 0;
WAVE_Timer = 0;
CAIJI_Resend_Flag = 0;
CAIJI_Timer = 0;
TMR3CN &=0xFB; // 关闭定时器3
WAVECOM_Gather = 0;
Time_Gather = 0;
Data_Gather_Comm = 0;
// 向采集板回送应答代码
CAIJI_Comm_Len = 0;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Receive_SeqNr;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0xAA;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x10;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x00;
SEND_DATA_CAIJI(CAIJI_Comm_Len);
// 向监控中心发命令代码
WAVE_Comm_Len = 0;
WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Send_SeqNr++; // 命令报文序列号
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00; // 发送命令标识
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00; // Command[0]
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x02; // Command[1]
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x08+0x03; // 数据长度
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x14; // 年(高位)
CS_RTC = 0; // 从时间芯片读取时间
while(RegA & 0x80 != 0x00);
WAVE_Command_Buf[WAVE_Comm_Len++] = Year;
WAVE_Command_Buf[WAVE_Comm_Len++] = Month;
WAVE_Command_Buf[WAVE_Comm_Len++] = Day;
WAVE_Command_Buf[WAVE_Comm_Len++] = Hour;
WAVE_Command_Buf[WAVE_Comm_Len++] = Minute;
WAVE_Command_Buf[WAVE_Comm_Len++] = Second;
CS_RTC = 1;
WAVE_Command_Buf[WAVE_Comm_Len++] = 0xAA; // 故障标识
WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[4]; // 故障信息
WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[5];
WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[6];
WAVE_Resend_Flag = 1; // 设置命令重传标识
WAVE_Resend_Num = 0;
WAVE_Timer = 10;
TMR3CN |= 0x04; // 开启定时器3
}
// 数据准备好命令处理
void Data_Ready_Comm()
{
if(WAVE_Resend_Flag == 1 || CAIJI_Resend_Flag == 1)
{
return; // 如有数据重发,不作处理
}
CAIJI_Receive_SeqNr = CAIJI_Data_Buffer[0]; // 保存接收序列号
// 向采集板回送应答代码
CAIJI_Comm_Len = 0;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Receive_SeqNr;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0xAA;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x10;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x00;
SEND_DATA_CAIJI(CAIJI_Comm_Len);
// 设置数据准备好标识
Data_Ready_Flag = 1;
}
// 向采集板取数据命令
void Get_Data_Comm(void)
{
CAIJI_Comm_Len = 0;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x06;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x01;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = Frame_Num;
// 发送数据
SEND_DATA_CAIJI(CAIJI_Comm_Len);
// 设置命令重传标识
CAIJI_Resend_Flag = 1;
CAIJI_Resend_Num = 0;
CAIJI_Timer = 1;
TMR3CN |= 0x04; // 开启定时器3
}
// --------------------------------------------------------------------------------------------------
// 处理监控中心发来的UDP信息
void WAVE_Rec_Ack(void)
{
unsigned char i;
for(i=0;i<WAVE_Receive_Num - 31;i++)
{
WAVE_Data_Buffer[i] = RECEIVEBUFFER[29+i];
}
switch(WAVE_Data_Buffer[1]) // 命令代码和应答代码分类
{
case 0x00: // 命令代码
if(WAVE_Resend_Flag == 1 || CAIJI_Resend_Flag == 1 || Data_Gather_Comm == 1)
{
return; // 当前有数据重传或者正在进行数据采集,不应答
}
switch(WAVE_Data_Buffer[2]) // 命令类型分类
{
case 0x00: // 参数设置命令
switch(WAVE_Data_Buffer[3])
{
case 0x00: // 设置油井编号和油井冲次
Machine_Message_Set();
break;
case 0x01: // 设置油管回压超限值
Pressure_Limit_Set();
break;
case 0x02: // 设置电动机功率超限值
Power_Limit_Set();
break;
case 0x03: // 设置上传时间
UP_Timer_Set();
break;
case 0x04: // 设置时间间隔
Time_Interval_Set();
break;
default:
break;
}
case 0x01: // 数据采集命令
Data_Gather_Set();
break;
case 0x02: // 控制命令
switch(WAVE_Data_Buffer[3])
{
case 0x00: // 开机命令
Open_Machine_Comm();
break;
case 0x01: // 关机命令
Close_Machine_Comm();
break;
default:
break;
}
default:
break;
}
case 0x01: // 应答报文
if(WAVE_Data_Buffer[0] != WAVE_Send_SeqNr-1)
{
return;
}
// 清除重发标识
WAVE_Resend_Flag = 0;
WAVE_Timer = 0;
Test_Frame_Answer = 0;
if(CAIJI_Resend_Flag == 0)
{
TMR3CN &=0xFB; //Stop Timer3
}
break;
default:
break;
}
}
// 油井信息设置命令
void Machine_Message_Set(void)
{
unsigned char i;
unsigned char xdata temp[19];
// 校验长度
if(WAVE_Data_Buffer[4] != 3)
{
return;
}
// 备份数据
for(i=1;i<17;i++)
{
temp[i-1] = XBYTE[StartAddress+i];
}
// 擦除扇区
CS_RTC = 1;
Erase_Sector(StartAddress);
// 保存发来的序列号
WAVE_Receive_SeqNr = WAVE_Data_Buffer[0];
// 恢复前面的数据
for(i=0;i<6;i++)
{
Write_Byte(StartAddress+1+i,temp[i]);
}
// 写入修改的数据
for(i=0;i<2;i++)
{
Write_Byte(StartAddress+Machine_Num+i,WAVE_Data_Buffer[5+i]); // 油井编号
}
Write_Byte(StartAddress+Machine_Cycle,WAVE_Data_Buffer[7]); // 油井冲次
// 恢复后面的数据
for(i=9;i<16;i++)
{
Write_Byte(StartAddress+1+i,temp[i]);
}
Write_Byte(StartAddress,0xAA); // 设置FLASH设置标识位
// 向监控中心发应答信息
WAVE_Comm_Len = 0;
WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Receive_SeqNr; // 应答序列号
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x01; // 应答命令标识
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00; // 状态
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00; // 长度
SEND_DATA_WAVECOM(WAVE_Comm_Len); // 向监控中心发送数据
// 向采集板发送设置参数
CAIJI_Comm_Len = 0;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x00;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x01;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = WAVE_Data_Buffer[7];
SEND_DATA_CAIJI(CAIJI_Comm_Len);
// 设置重发标识
CAIJI_Resend_Flag = 1;
CAIJI_Timer = 1;
CAIJI_Resend_Num =0 ;
TMR3CN |= 0x04; // 开启定时器3
}
// 油管回压超限值设置命令
void Pressure_Limit_Set(void)
{
unsigned char i;
unsigned char xdata temp[19];
// 校验长度
if(WAVE_Data_Buffer[4] != 0x02)
{
return;
}
// 备份数据
for(i=1;i<17;i++)
{
temp[i-1] = XBYTE[StartAddress+i];
}
// 擦除扇区
CS_RTC = 1;
Erase_Sector(StartAddress);
// 保存发来底序列号
WAVE_Receive_SeqNr = WAVE_Data_Buffer[0];
// 恢复前面的数据
for(i=0;i<9;i++)
{
Write_Byte(StartAddress+1+i,temp[i]);
}
// 写入修改的数据
for(i=0;i<2;i++)
{
Write_Byte(StartAddress+Pressure_Limit+i,WAVE_Data_Buffer[5+i]); // 油管回压超限值
}
// 恢复后面的数据
for(i=11;i<16;i++)
{
Write_Byte(StartAddress+1+i,temp[i]);
}
Write_Byte(StartAddress,0xAA); // 设置FLASH设置标识
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -