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

📄 workproc.cpp

📁 hart工业仪表的微机仿真程序,在C++Builder下制作,能够仿真仪表(执行器)的动作以及数学模型,方便实用.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
      current=m_APP_Current_Pos;
    else
      current=m_APP_Current; //YNRN=FLOW时,流量
//紧密关闭处理
    k1=T*T/(m_mm+m_mK*T);
    k2=(m_mK*T+2*m_mm)/(m_mm+m_mK*T);
    k3=m_mm/(m_mm+m_mK*T);
    k4=T*T/(m_mm+m_mK*T);

    if((current-m_Valve_Pos)>m_DEBA)
    {
       m_mP1=p1;
       m_mP2=0.0;
       if(m_mW1-m_mW2>=0.1)
         k5=1.0;
       else if(m_mW1-m_mW2<-0.1)
         k5=-1.0;
       else k5=0;
    }
    else if((current-m_Valve_Pos)<-m_DEBA)
    {
       m_mP1=0.0;
       m_mP2=p2;
       if(m_mW1-m_mW2>=0.1)
         k5=1.0;
       else if(m_mW1-m_mW2<-0.1)
         k5=-1.0;
       else k5=0;
    }
    else
       m_mF=0.0;


    m_mW=k1*(m_mP1-m_mP2)+k2*m_mW1-k3*m_mW2-k4*k5*m_mF;
    //m_mW为反馈的位置百分比
    //实际是经电位器测量,经换算而得
    if(m_mW<0) m_mW=0;
    if(m_mW>100) m_mW=100;

/*
    if(m_YCLS==1 || m_YCLS==2 || m_YCLS==3) //紧密关闭
    {
       if(m_YCLS==1 && m_APP_Current>99.0)
         m_mW=m_mW-(m_YCUP-m_YE);
       else if(m_YCLS==2 && m_APP_Current<1.0)
         m_mW=m_mW+m_YA-m_YCDO;
       else if(m_YCLS==3)
       {
         if(m_APP_Current>99.0)
         {
           m_mW=m_mW-(m_YCUP-m_YE);
           if(m_mW<0) m_mW=0;
         }
         else if(m_APP_Current<1.0)
         {
           m_mW=m_mW+m_YA-m_YCDO;
         }
      }

    }
*/
    //阀实际位置
    m_Valve_Pos=m_mW;
   //将阀位置YA至YE数 转换成0至100%
    m_Valve_Flow=100/(m_YE-m_YA)*(m_Valve_Pos-m_YA);
    m_Valve_Check_Pos=m_Valve_Flow;
    //将阀位置转换为流量,线性,等百分比,反等百分比,表插值
    m_Valve_Flow=Work_Valve_Translate(m_Valve_Flow);
    //m_Valve_Flow  当前阀流量
    //用于计算
    if(m_YNRM==0)    //YNRM=MPOS时,行程显示
      m_Valve_Pos=m_Valve_Pos;
    else             //YNRM=FLOW时,流量显示
      m_Valve_Pos=m_Valve_Flow;

    m_mA=m_mW*16.0/100.0+4.0;
    W_Edit->Text=CurrToStr(m_mW);
    A_Edit->Text=CurrToStr(m_mA);

    if(m_mP1>0.01)
    {
       P1_Panel->Color=clRed;
       m_Valve1_State=1;
    }
    else
    {
       m_Valve1_State=0;
       P1_Panel->Color=clBtnFace;
    }
    if(m_mP2>0.01)
    {
       m_Valve2_State=1;
       P2_Panel->Color=clRed;
    }
    else
    {
       m_Valve2_State=0;
       P2_Panel->Color=clBtnFace;
    }
    Check_Number();
    m_mW2=m_mW1;
    m_mW1=m_mW;
}
///////////////////////////////////////////////////////////
//10、手动时控制
//需修改
void TMainForm::Work_Valve_Model_Mani(int d)
{
    double k1,k2,k3,k4,k5,T=1,current,p1,p2;
//    double max_p,min_p;
    m_mP1=0.0;
    m_mP2=0.0;
    p1=P1_Edit->Text.ToDouble();
    p2=P2_Edit->Text.ToDouble();
    m_mK=K_Edit->Text.ToDouble();
    m_mK=K_Edit->Text.ToDouble();
    m_mF=F_Edit->Text.ToDouble();
    m_mm=m_Edit->Text.ToDouble();
    m_APP_Current=In_Edit->Text.ToDouble();
    current=(m_APP_Current-4)*100.0/16.0;

    k1=T*T/(m_mm+m_mK*T);
    k2=(m_mK*T+2*m_mm)/(m_mm+m_mK*T);
    k3=m_mm/(m_mm+m_mK*T);
    k4=T*T/(m_mm+m_mK*T);

    if(d==1)
    {
       m_mP1=p1;
       m_mP2=0.0;
       if(m_mW1-m_mW2>=0.1)
         k5=1.0;
       else if(m_mW1-m_mW2<-0.1)
         k5=-1.0;
       else k5=0;
    }
    else if(d==0)
    {
       m_mP1=0.0;
       m_mP2=p2;
       if(m_mW1-m_mW2>=0.1)
         k5=1.0;
       else if(m_mW1-m_mW2<-0.1)
         k5=-1.0;
       else k5=0;
    }
    m_mW=k1*(m_mP1-m_mP2)+k2*m_mW1-k3*m_mW2-k4*k5*m_mF;

    if(m_mP1>0.01)
       P1_Panel->Color=clRed;
    else
       P1_Panel->Color=clBtnFace;

    if(m_mP2>0.01)
       P2_Panel->Color=clRed;
    else
       P2_Panel->Color=clBtnFace;
//    max_p=MaxEdit->Text.ToDouble();
//    min_p=MinEdit->Text.ToDouble();

    if(m_mW<m_YA) m_mW=m_YA;
    if(m_mW>m_YE) m_mW=m_YE;
    m_mW2=m_mW1;
    m_mW1=m_mW;

    m_mA=m_mW*16.0/100.0+4.0;
    W_Edit->Text=CurrToStr(m_mW);
    A_Edit->Text=CurrToStr(m_mA);

    if(m_YNRM!=0 && m_System_State==1)                     //YNRM=MPOS时,需计算
       m_Valve_Pos=100/(m_YE-m_YA)*(m_mW-m_YA);
    else
       m_Valve_Pos=m_mW;
}
///////////////////////////////////////////////////////////
//11、手动时控制,未初始化时
//需修改
void TMainForm::Work_Valve_Model_Mani_Noini(int d)
{
    double k1,k2,k3,k4,k5,T=1,current,p1,p2;
    double max_p,min_p;
    int z,b;
    m_mP1=0.0;
    m_mP2=0.0;
    p1=P1_Edit->Text.ToDouble();
    p2=P2_Edit->Text.ToDouble();
    m_mK=K_Edit->Text.ToDouble();
    m_mK=K_Edit->Text.ToDouble();
    m_mF=F_Edit->Text.ToDouble();
    m_mm=m_Edit->Text.ToDouble();
    m_APP_Current=In_Edit->Text.ToDouble();
    current=(m_APP_Current-4)*100.0/16.0;

    k1=T*T/(m_mm+m_mK*T);
    k2=(m_mK*T+2*m_mm)/(m_mm+m_mK*T);
    k3=m_mm/(m_mm+m_mK*T);
    k4=T*T/(m_mm+m_mK*T);

    if(d==1)
    {
       m_mP1=p1;
       m_mP2=0.0;
       if(m_mW1-m_mW2>=0.1)
         k5=1.0;
       else if(m_mW1-m_mW2<-0.1)
         k5=-1.0;
       else k5=0;
    }
    else if(d==0)
    {
       m_mP1=0.0;
       m_mP2=p2;
       if(m_mW1-m_mW2>=0.1)
         k5=1.0;
       else if(m_mW1-m_mW2<-0.1)
         k5=-1.0;
       else k5=0;
    }
    m_mW=k1*(m_mP1-m_mP2)+k2*m_mW1-k3*m_mW2-k4*k5*m_mF;

    if(m_mP1>0.01)
       P1_Panel->Color=clRed;
    else
       P1_Panel->Color=clBtnFace;

    if(m_mP2>0.01)
       P2_Panel->Color=clRed;
    else
       P2_Panel->Color=clBtnFace;
    max_p=MaxEdit->Text.ToDouble();
    min_p=MinEdit->Text.ToDouble();

    if(m_mW<min_p) m_mW=min_p;
    if(m_mW>max_p) m_mW=max_p;
    m_mW2=m_mW1;
    m_mW1=m_mW;

    m_mA=m_mW*16.0/100.0+4.0;
    W_Edit->Text=CurrToStr(m_mW);
    A_Edit->Text=CurrToStr(m_mA);
    z=zEdit->Text.ToInt();
    b=bEdit->Text.ToInt();
    if(b!=0)
    {
      if(z==0)
        m_Valve_Pos=m_mW;
      else
        m_Valve_Pos=100.0-m_mW;
    }
}
void TMainForm::Work_Func_Key(void)
{
       if(m_Work_AM==0)
         m_Work_AM=1;
       else
         m_Work_AM=0;
       Parm_Save();
}
void TMainForm::Work_Start(void)
{
     m_Work_State=0;
     Work_Timer->Enabled=true;
     Disp_Debug_Param();
}
void TMainForm::Work_Sub_Key(void)
{
     if(m_System_State==1)   //当前系统状态,0未初始化1已初始化
     {
      if(m_Work_AM==0)        //当前系统状态,0手动1自动
        Work_Valve_Model_Mani(0);
     }
     else
     {
        Work_Valve_Model_Mani_Noini(0);
     }
}
void TMainForm::Work_Add_Key(void)
{
     if(m_System_State==1)   //当前系统状态,0未初始化1已初始化
     {
      if(m_Work_AM==0)        //当前系统状态,0手动1自动
        Work_Valve_Model_Mani(1);
     }
     else
     {
        Work_Valve_Model_Mani_Noini(1);
     }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -