大型货车超载超速实时检测系统
count[i]=count[i]|((*P_IOA_Data&(0x0001<<i))>> count[i]=count[i]|((*P_IOA_Data&(0x0001<<i))>>i); //串行接收一位
if(n==1&&count[i]) //若第一位数据为1,则以负数处理
count[i]=0xffffffff;
}
}
}//for(n=1;n<=25;n++) //25个脉冲
for(i=0;i<4;i++)
weight[i][k]=count[i];
k++;
for(i=0;i<4;i++)
count[i]=0;
*P_Watchdog_Clear = C_WDTCLR;
}//while(k<=4),只读取五个数据,放在weight数组中
for(n=0;n<4;n++)
{
for(i=2;i<8;i++)
weightA[n]=weight[n][i]+weightA[n];
weightA[n]=weightA[n]/7-198;
}
for(n=0;n<4;n++)
weightS=weightS+weightA[n];
weightS=weightS/sin(A);//用倾角传感器测量角度
*P_IOA_Data=0x0002; //设置PD_SCK为高,60um,HX711和和压力传感器进入断电状态
return weightA;
}
(2)主程序相关程序流程图
运动前超载处理流程图如图4.2:
相关说明:
标志K
K= -1 静止且不超载
K=0 初次静止超载
K=1 运动超载
K=2 停车后超载
countR 取数据次数
countW, 超载次数
v 车速度
m 车载重量
tR 车启动时间
tS 停车时间
图4.2 运动前超载处理流程图
运动停车后超载处理程序图如图4.3:
运动中超载处理流程图如图4.4:
相关说明:
标志K
K= -1 静止且不超载
K=0 初次静止超载
K=1 运动超载
K=2 停车后超载
countR 取数据次数
countW, 超载次数
v 车速度
m 车载重量
tR 车启动时间
tS 停车时间
图4.3 运动后停车超载处理程序图
图4.4 运动中超载处理流程图小车运动前超载处理程序如下[25]:
Void BeforeTheStateDidNotExercise(float* parameter,float weight,int *countR,int *countW)
{
(*countR)++;
if(*countR>=17)
*countR=0;
if(weight>M)
{
(*countW)++;
if(*countW>=12)
{
*parameter=0;
*countW=0;
overloadAlarm();//启动报警
}
}
}
运动中超载处理程序:
void campaignStatus(float* parameter,float weight,int *countR,int *countW,clock_t *start)
{
if(* parameter!=1)
(*countR)++;
momentNow();//记录当前时间
*start=clock();
t1recordTheCurrenttime();//记录当前时间
if(weight>M)
(*countW)++;
if(*countR>=100)
{
if( *countW>=70)
{
overloadAlarm();//启动报警
* parameter=1;
}
*countR=0;
*countW=0;
}
}
运动后停车超载处理:
void afterStoppingState(float* parameter,float weight,int *countR,int *countW,clock_t *finish)
{
(*countR)++;
//记录当前时间t2
*finish=clock();
if(weight>M)
(*countW)++;
if(*countR>=100)
{
if(*countW<30)
{
*parameter=-1;
sendRelevantInformationToTheHost(countW,countR);// 发送相关信息到主机
}
*countR=0;
*countW=0;
}
}
//根据速度和参数K和parameter确定车体状态
void carStatus(float speed,float* parameter,float weight,int *countR,int *countW)
{
//超载持续时间
clock_t start, finish;
double duration;
if(speed==0)
{
if(*parameter<=0)
BeforeTheStateDidNotExercise(parameter,weight,countR,countW);
else
afterStoppingState(parameter,weight,countR,countW,clock_t &finish);
}
else
campaignStatus(parameter,weight,countR,countW,clock_t &start);
//超重持续时间