?? autoinit.cpp
字號(hào):
#include <vcl.h>
#include "math.h"
#include "stdlib.h"
#include "Sim_Valve.h"
//////////////////////////////////////////////////////////
//二、自動(dòng)初始化過(guò)程
//1、自動(dòng)初始化開始
void TMainForm::Set_Auto_Init_Start()
{
m_Auto_Init=1; //自動(dòng)初始化標(biāo)志
m_Error=0; //無(wú)錯(cuò)誤
m_Auto_Init_Num=0; //自動(dòng)初始化1,RUN1
m_Auto_Init_Count=0; //計(jì)數(shù)器
// Meas_Timer->Interval=1000;
Work_Timer->Enabled=true; //啟動(dòng)自動(dòng)初始化定時(shí)器
Work_Valve_Model_Mani_Noini(1);
Work_Valve_Model_Mani_Noini(1);
Disp_State(m_Init_Disp[m_Auto_Init_Num]);//顯示RUN 1
}
//////////////////////////////////////////////////////////
//2、自動(dòng)初始化結(jié)束
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、自動(dòng)初始化主控制程序
void TMainForm::Set_Auto_Init_Process()
{
if(m_Error==0)
Set_Disp_Wait_Num();// 顯示等待循環(huán)標(biāo)志
// Auto_Work();
m_Count4++;
m_DEBA=5;
if(m_Count4>=2)
{
m_Count4=0;
if(m_Auto_Init_Num==0)
Set_Auto_Init_Run1(); //過(guò)程1確定正反作用,自動(dòng)設(shè)置變量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(); //顯示數(shù)據(jù)
}
void TMainForm::Set_Mani_Sub_Key(void)
{
Work_Valve_Model_Mani_Noini(0);
Work_Disp_Data(); //顯示數(shù)據(jù)
}
void TMainForm::Set_Mani_Init_Start()
{
m_Mani_Init=1; //手動(dòng)初始化標(biāo)志
m_Error=0;
m_Mani_Init_Num=0; //無(wú)錯(cuò)誤
m_Auto_Init_Num=0; //自動(dòng)初始化1,RUN1
m_Auto_Init_Count=0; //計(jì)數(shù)器
// Meas_Timer->Interval=1000;
Work_Timer->Enabled=true; //啟動(dòng)自動(dòng)初始化定時(shí)器
Disp_State(m_Mani_Init_Disp[0]); //顯示YEND1
Work_Disp_Data(); //顯示數(shù)據(jù)
}
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、自動(dòng)初始化結(jié)束
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、自動(dòng)初始化RUN1程序,確定作用方向
void TMainForm::Set_Auto_Init_Run1(void)
{
int i,d[20];
if(m_Auto_Init_Count<10) //正向運(yùn)動(dòng)
{
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) //反向運(yùn)動(dòng)
{
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; //進(jìn)入下一過(guò)程
m_Error=0;
m_SDIR=d[0];
m_Auto_Z0=0; //閥到一個(gè)端點(diǎn)
m_Auto_Z1=0; //第一個(gè)點(diǎn)正確與否標(biāo)志
m_Auto_Z2=0; //第二個(gè)點(diǎn)正確與否標(biāo)志
Disp_State(m_Init_Disp[m_Auto_Init_Num]);
m_Valve_Pos_Last=m_Valve_Pos;
}
else //出現(xiàn)錯(cuò)誤閃爍顯示ERROR 與RUN 1
{
m_Error=1;
Disp_Num( m_Wait_Loop[4]);
Set_Auto_Disp_Error();
}
}
}
//////////////////////////////////////////////////////////
//5、自動(dòng)初始化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;
}
//在規(guī)定時(shí)間內(nèi)未到達(dá)指定的位置,顯示錯(cuò)誤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; //進(jìn)入下一過(guò)程
m_Error=0;
m_Auto_Z1=0;
m_Auto_Z2=0;
Disp_State(m_Init_Disp[m_Auto_Init_Num]);
}
}
//////////////////////////////////////////////////////////
//6、自動(dòng)初始化RUN3程序,確定執(zhí)行時(shí)間
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; //進(jìn)入下一過(guò)程
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; //進(jìn)入下一過(guò)程
m_Error=0;
m_Auto_Z1=0;
m_Auto_Z2=0;
Disp_State(m_Init_Disp[m_Auto_Init_Num]);
}
}
//優(yōu)化瞬態(tài)響應(yīng)
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; //進(jìn)入下一過(guò)程
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; //用于顯示一位小數(shù),四舍五入
Disp_HexToDec(valve_pos,Valve_Code); //轉(zhuǎn)成十進(jìn)制數(shù)
Disp_Process_Data(2,Valve_Code); //數(shù)處理
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位上顯示小數(shù)點(diǎn)
Valve_Code[0]=0x0C; //度符號(hào)
Valve_Code[1]=0x0C; //度符號(hào)
Disp_Data(Valve_Code); //顯示數(shù)據(jù)
m_DEBA=0.5;
m_System_State=1; //當(dāng)前系統(tǒng)狀態(tài),0未初始化1已初始化
Parm_Save(); //存貯工作參數(shù)
Set_Save(); //存貯設(shè)定參數(shù)
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)
{ //出現(xiàn)錯(cuò)誤閃爍顯示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]);
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -