📄 autoinit.cpp
字号:
#include <vcl.h>
#include "math.h"
#include "stdlib.h"
#include "Sim_Valve.h"
//////////////////////////////////////////////////////////
//二、自动初始化过程
//1、自动初始化开始
void TMainForm::Set_Auto_Init_Start()
{
m_Auto_Init=1; //自动初始化标志
m_Error=0; //无错误
m_Auto_Init_Num=0; //自动初始化1,RUN1
m_Auto_Init_Count=0; //计数器
// Meas_Timer->Interval=1000;
Work_Timer->Enabled=true; //启动自动初始化定时器
Work_Valve_Model_Mani_Noini(1);
Work_Valve_Model_Mani_Noini(1);
Disp_State(m_Init_Disp[m_Auto_Init_Num]);//显示RUN 1
}
//////////////////////////////////////////////////////////
//2、自动初始化结束
void TMainForm::Set_Auto_Init_Stop()
{
m_Auto_Init=0;
m_Error=0;
m_Auto_Init_Num=0;
m_Auto_Init_Count=0;
// Meas_Timer->Interval=250;
Work_Timer->Enabled=false;
Set_Disp();
}
//////////////////////////////////////////////////////////
//3、自动初始化主控制程序
void TMainForm::Set_Auto_Init_Process()
{
if(m_Error==0)
Set_Disp_Wait_Num();// 显示等待循环标志
// Auto_Work();
m_Count4++;
m_DEBA=5;
if(m_Count4>=2)
{
m_Count4=0;
if(m_Auto_Init_Num==0)
Set_Auto_Init_Run1(); //过程1确定正反作用,自动设置变量m_SDIR
else if(m_Auto_Init_Num==1)
Set_Auto_Init_Run2();
else if(m_Auto_Init_Num==2)
Set_Auto_Init_Run3();
else if(m_Auto_Init_Num==3)
Set_Auto_Init_Run4();
else if(m_Auto_Init_Num==4)
Set_Auto_Init_Run5();
}
// Disp_Num(m_Wait_Loop[4]);
}
void TMainForm::Set_Mani_Add_Key(void)
{
Work_Valve_Model_Mani_Noini(1);
Work_Disp_Data(); //显示数据
}
void TMainForm::Set_Mani_Sub_Key(void)
{
Work_Valve_Model_Mani_Noini(0);
Work_Disp_Data(); //显示数据
}
void TMainForm::Set_Mani_Init_Start()
{
m_Mani_Init=1; //手动初始化标志
m_Error=0;
m_Mani_Init_Num=0; //无错误
m_Auto_Init_Num=0; //自动初始化1,RUN1
m_Auto_Init_Count=0; //计数器
// Meas_Timer->Interval=1000;
Work_Timer->Enabled=true; //启动自动初始化定时器
Disp_State(m_Mani_Init_Disp[0]); //显示YEND1
Work_Disp_Data(); //显示数据
}
void TMainForm::Set_Mani_Func_Key(void)
{
m_Mani_Pos[m_Mani_Init_Num]=m_Valve_Pos;
if(m_Mani_Init_Num==1)
{
if(m_Mani_Pos[0]<5 || m_Mani_Pos[0]>95
|| m_Mani_Pos[1]<5 || m_Mani_Pos[1]>95)
m_Error=1;
if(fabs(m_Mani_Pos[1]-m_Mani_Pos[0])<80)
m_Error=1;
}
if(m_Mani_Init_Num<1)
{
m_Mani_Init_Num++;
Disp_State(m_Mani_Init_Disp[m_Mani_Init_Num]); //显示YEND1
}
else if(m_Error==1 && m_Mani_Init_Num==1)
{
m_Mani_Init_Num++;
Disp_State(m_Mani_Init_Disp[m_Mani_Init_Num]); //显示RANGE
}
else if(m_Error==0)
{
Set_Auto_Init_Start();
}
else if(m_Error==1)
Set_Mani_Init_Stop();
}
//////////////////////////////////////////////////////////
//2、自动初始化结束
void TMainForm::Set_Mani_Init_Stop()
{
m_Mani_Init=0;
m_Auto_Init=0;
m_Error=0;
m_Auto_Init_Num=0;
m_Auto_Init_Count=0;
// Meas_Timer->Interval=250;
Work_Timer->Enabled=false;
Set_Disp();
}
//////////////////////////////////////////////////////////
//4、自动初始化RUN1程序,确定作用方向
void TMainForm::Set_Auto_Init_Run1(void)
{
int i,d[20];
if(m_Auto_Init_Count<10) //正向运动
{
m_Auto_Init_Count++;
Work_Valve_Model_Mani_Noini(1);
if((m_Valve_Pos-m_Valve_Pos_Old)>0.2)
{
m_SDIR_m[m_Auto_Init_Count]=0;
}
else if((m_Valve_Pos-m_Valve_Pos_Old)<-0.2)
{
m_SDIR_m[m_Auto_Init_Count]=1;
}
else
m_SDIR_m[m_Auto_Init_Count]=m_Auto_Init_Count;
m_Valve_Pos_Old=m_Valve_Pos;
}
else if(m_Auto_Init_Count<20) //反向运动
{
m_Auto_Init_Count++;
Work_Valve_Model_Mani_Noini(0);
Work_Valve_Model_Mani_Noini(0);
Work_Valve_Model_Mani_Noini(0);
if((m_Valve_Pos-m_Valve_Pos_Old)<-1)
m_SDIR_m[m_Auto_Init_Count]=0;
else if((m_Valve_Pos-m_Valve_Pos_Old)>1)
m_SDIR_m[m_Auto_Init_Count]=1;
else
m_SDIR_m[m_Auto_Init_Count]=m_Auto_Init_Count;
m_Valve_Pos_Old=m_Valve_Pos;
}
else
{
for(i=0;i<5;i++)
d[i]=m_SDIR_m[i+3];
for(i=5;i<10;i++)
d[i]=m_SDIR_m[i+8];
for(i=0;i<9;i++)
{
if(d[i]!=d[i+1])
i=30;
}
Disp_Num(m_Wait_Loop[4]);
if(i!=31)
{
m_Auto_Init_Count=0;
m_Count1=0;
m_Count2=0;
m_Count3=0;
m_Auto_Init_Num=1; //进入下一过程
m_Error=0;
m_SDIR=d[0];
m_Auto_Z0=0; //阀到一个端点
m_Auto_Z1=0; //第一个点正确与否标志
m_Auto_Z2=0; //第二个点正确与否标志
Disp_State(m_Init_Disp[m_Auto_Init_Num]);
m_Valve_Pos_Last=m_Valve_Pos;
}
else //出现错误闪烁显示ERROR 与RUN 1
{
m_Error=1;
Disp_Num( m_Wait_Loop[4]);
Set_Auto_Disp_Error();
}
}
}
//////////////////////////////////////////////////////////
//5、自动初始化RUN2程序,确定上下限
void TMainForm::Set_Auto_Init_Run2(void)
{
//先让阀走到最下端
if(m_Auto_Init_Count<VALVE_MAX_TIME)
{
m_Auto_Init_Count++;
Work_Valve_Model_Mani_Noini(0);
if(fabs(m_Valve_Pos-m_Valve_Pos_Old)<0.01)
{
m_Count3++;
if(m_Count3>=10)
{
m_Auto_Z0=1;
m_Error=0;
m_Auto_Init_Count=VALVE_MAX_TIME;
m_Count3=0;
}
}
else m_Count3=0;
m_Valve_Pos_Old=m_Valve_Pos;
}
//在规定时间内未到达指定的位置,显示错误ERROR
else if(m_Auto_Z0==0)
{
m_Error=1;
Disp_Num( m_Wait_Loop[4]);
Set_Auto_Disp_Error();
return;
}
else if(m_Auto_Init_Count<2*VALVE_MAX_TIME)//上升
{
m_Auto_Init_Count++;
Work_Valve_Model_Mani_Noini(1);
if(fabs(m_Valve_Pos-m_Valve_Pos_Old)<0.01)
{
m_Count3++;
if(m_Count3>=10)
{
m_Auto_Z1=1;
if(m_SDIR==0)
m_YE=m_Valve_Pos;
else
m_YA=m_Valve_Pos;
m_Count3=0;
m_Error=0;
m_Auto_Init_Count=2*VALVE_MAX_TIME;
}
}
else m_Count3=0;
m_Valve_Pos_Old=m_Valve_Pos;
}
else if(m_Auto_Z1==0)
{
m_Error=1;
Disp_Num( m_Wait_Loop[4]);
Set_Auto_Disp_Error();
return;
}
else if(m_Auto_Init_Count<3*VALVE_MAX_TIME)
{
m_Auto_Init_Count++;
Work_Valve_Model_Mani_Noini(0);
if(fabs(m_Valve_Pos-m_Valve_Pos_Old)<0.01)
{
m_Count3++;
if(m_Count3>=10)
{
m_Auto_Z2=1;
m_Error=0;
if(m_SDIR==0)
m_YA=m_Valve_Pos;
else
m_YE=m_Valve_Pos;
m_Auto_Init_Count=3*VALVE_MAX_TIME;
}
}
else m_Count3=0;
m_Valve_Pos_Old=m_Valve_Pos;
}
else if(m_Auto_Z2==0)
{
m_Error=1;
Disp_Num( m_Wait_Loop[4]);
Set_Auto_Disp_Error();
return;
}
else
{
Disp_Num( m_Wait_Loop[4]);
m_Auto_Init_Count=0;
m_Count1=0;
m_Count2=0;
m_Count3=0;
m_Auto_Init_Num=2; //进入下一过程
m_Error=0;
m_Auto_Z1=0;
m_Auto_Z2=0;
Disp_State(m_Init_Disp[m_Auto_Init_Num]);
}
}
//////////////////////////////////////////////////////////
//6、自动初始化RUN3程序,确定执行时间
void TMainForm::Set_Auto_Init_Run3(void)
{
if(m_Auto_Init_Count<VALVE_MAX_TIME)
{
m_Auto_Init_Count++;
Work_Valve_Model_Mani_Noini(1);
if(m_SDIR==0)
{
if(m_Valve_Pos>m_YE-5.0)
{
m_Up_Time=m_Auto_Init_Count;
m_Auto_Init_Count=VALVE_MAX_TIME;
m_Auto_Z1=1;
m_Error=0;
}
}
else
{
if(m_Valve_Pos<m_YA+5.0)
{
m_Down_Time=m_Auto_Init_Count;
m_Auto_Init_Count=VALVE_MAX_TIME;
m_Auto_Z1=1;
m_Error=0;
}
}
}
else if(m_Auto_Z1==0)
{
m_Error=1;
Disp_Num( m_Wait_Loop[4]);
Set_Auto_Disp_Error();
return;
}
else if(m_Auto_Init_Count<2*VALVE_MAX_TIME)
{
m_Auto_Init_Count++;
Work_Valve_Model_Mani_Noini(0);
if(m_SDIR==0)
{
if(m_Valve_Pos<m_YA+5.0)
{
m_Up_Time=m_Auto_Init_Count-VALVE_MAX_TIME;
m_Auto_Init_Count=2*VALVE_MAX_TIME;
m_Auto_Z2=1;
m_Error=0;
}
}
else
{
if(m_Valve_Pos>m_YE-5.0)
{
m_Up_Time=m_Auto_Init_Count-VALVE_MAX_TIME;
m_Auto_Init_Count=2*VALVE_MAX_TIME;
m_Auto_Z2=1;
m_Error=0;
}
}
}
else if(m_Auto_Z2==0)
{
m_Error=1;
Disp_Num( m_Wait_Loop[4]);
Set_Auto_Disp_Error();
return;
}
else
{
Disp_Num(m_Wait_Loop[4]);
m_Auto_Init_Count=0;
m_Count1=0;
m_Count2=0;
m_Count3=0;
m_Auto_Init_Num=3; //进入下一过程
m_Error=0;
m_Auto_Z1=0;
m_Auto_Z2=0;
Disp_State(m_Init_Disp[m_Auto_Init_Num]);
}
}
//最小化定位增量
void TMainForm::Set_Auto_Init_Run4(void)
{
if(m_Auto_Init_Count<VALVE_MAX_TIME)
{
m_Auto_Init_Count++;
Work_Valve_Model_Mani_Noini(1);
m_Error=0;
m_Auto_Z1=1;
}
else if(m_Auto_Z1==0)
{
m_Error=1;
Disp_Num( m_Wait_Loop[4]);
Set_Auto_Disp_Error();
return;
}
else if(m_Auto_Init_Count<2*VALVE_MAX_TIME)
{
m_Auto_Init_Count++;
Work_Valve_Model_Mani_Noini(0);
m_Auto_Z2=1;
m_Error=0;
}
else if(m_Auto_Z2==0)
{
m_Error=1;
Disp_Num( m_Wait_Loop[4]);
Set_Auto_Disp_Error();
return;
}
else
{
Disp_Num(m_Wait_Loop[4]);
m_Auto_Init_Count=0;
m_Count1=0;
m_Count2=0;
m_Count3=0;
m_Auto_Init_Num=4; //进入下一过程
m_Error=0;
m_Auto_Z1=0;
m_Auto_Z2=0;
Disp_State(m_Init_Disp[m_Auto_Init_Num]);
}
}
//优化瞬态响应
void TMainForm::Set_Auto_Init_Run5(void)
{
unsigned int valve_pos;
unsigned char Valve_Code[12];
if(m_Auto_Init_Count<VALVE_MAX_TIME)
{
m_Auto_Init_Count++;
Work_Valve_Model_Mani_Noini(1);
m_Auto_Z1=1;
m_Error=0;
}
else if(m_Auto_Z1==0)
{
m_Error=1;
Disp_Num( m_Wait_Loop[4]);
Set_Auto_Disp_Error();
return;
}
else if(m_Auto_Init_Count<2*VALVE_MAX_TIME)
{
m_Auto_Init_Count++;
Work_Valve_Model_Mani_Noini(0);
m_Auto_Z2=1;
m_Error=0;
}
else if(m_Auto_Z2==0)
{
m_Error=1;
Disp_Num( m_Wait_Loop[4]);
Set_Auto_Disp_Error();
return;
}
else
{
Disp_Num(m_Wait_Loop[4]);
m_Auto_Init_Num=5; //进入下一过程
Disp_State(m_Init_Disp[m_Auto_Init_Num]);
m_Auto_Init=0;
m_Error=0;
m_Auto_Init_Num=0;
m_Auto_Init_Count=0;
// Meas_Timer->Interval=250;
Work_Timer->Enabled=false;
valve_pos=(m_YE-m_YA)*10.0+0.5; //用于显示一位小数,四舍五入
Disp_HexToDec(valve_pos,Valve_Code); //转成十进制数
Disp_Process_Data(2,Valve_Code); //数处理
Valve_Code[8]=0x00; //在第一位上显示空
Valve_Code[9]=0x00; //在第一位上显示空
Valve_Code[6]=Valve_Code[4];
Valve_Code[7]=Valve_Code[5];
Valve_Code[4]=Valve_Code[2];
Valve_Code[5]=Valve_Code[3];
Valve_Code[2]=Valve_Code[0];
Valve_Code[3]=Valve_Code[1];
Valve_Code[3]|=0x01; //在第3位上显示小数点
Valve_Code[0]=0x0C; //度符号
Valve_Code[1]=0x0C; //度符号
Disp_Data(Valve_Code); //显示数据
m_DEBA=0.5;
m_System_State=1; //当前系统状态,0未初始化1已初始化
Parm_Save(); //存贮工作参数
Set_Save(); //存贮设定参数
Check_Data_Save();
}
}
//---------------------------------------------------------------------------
void TMainForm::Set_Disp_Wait_Num()
{
if(m_Error==0)
{
if(m_Count1<3)
m_Count1++;
else
m_Count1=0;
Disp_Num(m_Wait_Loop[m_Count1]);
}
}
void TMainForm::Set_Auto_Disp_Error(void)
{ //出现错误闪烁显示ERROR 与RUN 1
m_Error=1;
if(m_Count2>=1)
{
m_Count2=0;
Disp_State(m_SYS_State[0]);
}
else
{
m_Count2=1;
Disp_State(m_Init_Disp[m_Auto_Init_Num]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -