⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 autoinit.cpp

📁 hart工业仪表的微机仿真程序,在C++Builder下制作,能够仿真仪表(执行器)的动作以及数学模型,方便实用.
💻 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 + -