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

📄 workproc.cpp

📁 hart工业仪表的微机仿真程序,在C++Builder下制作,能够仿真仪表(执行器)的动作以及数学模型,方便实用.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <vcl.h>
#include "math.h"
#include "stdlib.h"
#include "Sim_Valve.h"
//一、系统工作程序,处理测量、控制与计算
//
//1、系统时间中断程序,
//100ms中断一次,进行一次处理,所有工作中的程序都在此完成
//void Meas_TimerTimer(TObject *Sender)
//2、自动测量控制总控制程序
//测量控制的总控制程序,在时间中断程序中调用
//void Auto_Work(void)
//3、工作数据显示程序
//主要功能,显示m_Valve_Pos中的数据
//4、手动测量控制程序
//void Mani_Work(void)
//5、没有初始化时的测量控制程序
//void NoInit_Work(void)
//6、工作中的状态显示
//void Disp_Work_State(void)
//7、数据处理,米字管状态处理
//显示自动手动或设定值
//void Process_Set_Data(unsigned char S[],unsigned char D[])
//8、显示小二位数
//void Disp_Work_Num(void)
//9、阀自动工作模式控制
//需修改
//void Valve_Model()
//10、手动时控制
//需修改
//void Valve_Model_Mani(int d)
//11、手动时控制,未初始化时
//需修改
//void Valve_Model_Mani_Noini(int d)

///////////////////////////////////////////////////////////
//1、系统时间中断程序,
//100ms中断一次,进行一次处理,所有工作中的程序都在此完成


void TMainForm::Work_Timer_Process(void)
{
   if(m_System_State==1)//当前系统已初始化
   {
     if(m_Work_AM==1)   //自动状态
        Work_Auto();
     else
        Work_Mani();
   }
   else
      Work_NoInit();
}

///////////////////////////////////////////////////////////
//2、自动测量控制总控制程序
//测量控制的总控制程序,在时间中断程序中调用
void TMainForm::Work_Auto(void)
{
 //  m_Valve_Pos=25.0+random(50);  //测量阀当前位置
   Work_Valve_Model();                 //测量与控制
   Work_Disp_Data();
   Work_Disp_State();              //状态测量与显示
   Work_Disp_Num();                //序号报警显示
}
///////////////////////////////////////////////////////////
//3、工作数据显示程序
//主要功能,显示m_Valve_Pos中的数据
void TMainForm::Work_Disp_Data(void)
{
   int valve_pos,i;
   unsigned char va=0;
   unsigned char Valve_Code[12];
   valve_pos=m_Valve_Pos*10.0+0.5;      //用于显示一位小数,四舍五入
   if(valve_pos<0)
   {
     valve_pos=(-1.0)*valve_pos;
     va=1;
   }
   if(valve_pos>=-999 && valve_pos<=1000)
   {
     Disp_HexToDec(valve_pos,Valve_Code); //转成十进制数
     Disp_Process_Data(1,Valve_Code);     //数处理
     Valve_Code[8]=0x0C;                  //在第一位上显示P
     Valve_Code[9]=0x0E;                  //在第一位上显示P
     Valve_Code[1]|=0x01;                 //在第3位上显示小数点
     if(va==1)
     {
       Valve_Code[6]|=0x00;               //显示负号
       Valve_Code[7]|=0x04;               //显示负号
     }
   }
   else
    for(i=0;i<5;i+=2)
    {
     Valve_Code[i*2]=0x09;                //错误时显示EEEEE
     Valve_Code[i*2+1]=0x0E;
    }
   Disp_Data(Valve_Code);               //显示数据
   Work_Disp_Curve();                   //单片机中无用
}
///////////////////////////////////////////////////////////
//4、手动测量控制程序
void TMainForm::Work_Mani(void)
{
   Work_Disp_Data();               //显示数据
   Work_Disp_State();              //状态测量与显示
   Work_Disp_Num();                //序号报警显示
}
///////////////////////////////////////////////////////////
//5、没有初始化时的测量控制程序
void TMainForm::Work_NoInit(void)
{
   Work_Disp_Data();               //显示数据
   Work_Disp_State();              //状态测量与显示
   Work_Disp_Num();                //序号报警显示
}
///////////////////////////////////////////////////////////
//6、工作中的状态显示
void TMainForm::Work_Disp_State(void)
{
   unsigned char Valve_Code[6];
   if(m_System_State==0) //未初始化,NOINI与空交替显示
   {
      m_Count1++;
      if(m_Count1>4)
        m_Count1=0;
      if(m_Count1<2)
        Disp_State(m_SYS_State[1]);   //NOINI
      else
        Disp_State(m_SYS_State[6]);   //空
   }
   else if(m_Work_AM==0)                //已初始化手动时
   {
      Work_Process_Set_Data(m_SYS_State[2],Valve_Code);
      Disp_State(Valve_Code);       //显示MANXX
   }
   else if(m_Work_AM==1)             //自动时
   {
      Work_Process_Set_Data(m_SYS_State[3],Valve_Code);
      Disp_State(Valve_Code);       //显示AUTXX
   }
}
///////////////////////////////////////////////////////////
//7、数据处理,米字管状态处理
//显示自动手动或设定值
void TMainForm::Work_Process_Set_Data(unsigned char S[],unsigned char D[])
{
    double current;
    unsigned int valve_pos;
    unsigned char Valve_Code[6];
    current=In_Edit->Text.ToDouble();  //测量电流0~24mA量程,输入
    ////////////////////////////////////////////////////////
    //线性转换,电流转为百分比,0~20(4~20)——0~100
    if(m_SCUR==0)
      m_APP_Current=(current)*100.0/20.0;   //0~20mA
    else
      m_APP_Current=(current-4)*100.0/16.0; //4~20mA
    //线性转换,分程参数,m_SPRA~m_SPRE——0~100
    m_APP_Current=100*(m_APP_Current-m_SPRA)/(m_SPRE-m_SPRA);

    if(m_APP_Current<0) m_APP_Current=0;
    else  if(m_APP_Current>100) m_APP_Current=100;
    //m_APP_Current为设定流量
    ////////////////////////////////////////////////////////

    //将设定流量转换成设定位置,设定值转换,线性,等百分比,反等百分比,分点补偿
    //0~100——0~100
    m_APP_Current_Pos=Work_SetValve_Translate(m_APP_Current);
    //0~100——m_YA~m_YE
    m_APP_Current_Pos=(m_YE-m_YA)/100.0*m_APP_Current_Pos+m_YA;
    //显示行程或流量
    if(m_YNRM==0)                     //YNRM=MPOS时
       current=m_APP_Current_Pos;
    else                              //YNRM=FLOW时
       current=m_APP_Current;
    //显示方向
    if(m_YDIR==1)
      m_YDIR=100.0-m_YDIR;
    //以下为显示设定值AUT44或MAN44
    valve_pos=current+0.5;   //用于显示设定值,四舍五入
    if(valve_pos<100)
      Disp_HexToDecM(valve_pos,Valve_Code); //转成十进制数
    else
    {
      Valve_Code[3]='A';               //100时显示A0
      Valve_Code[4]='0';
    }
    D[0]=S[0];
    D[1]=S[1];
    D[2]=S[2];
    D[3]=Valve_Code[3];
    D[4]=Valve_Code[4];
    D[5]=0;
}
///////////////////////////////////////////////////////////
//8、显示小二位数
void TMainForm::Work_Disp_Num(void)
{
    Disp_Num( m_Work_Num[0]);
}

double TMainForm::Work_SetValve_Translate(double m)
{
   double R[10]={0,25,33,50,25,33,50};
   double m_Pos;
   int i;
   if(m_SFCT==0)
     m_Pos=m;
   else if(m_SFCT>=1 && m_SFCT<=3)
   {
     if(m_YE!=m_YA)
     {
       if(m>=0.0 && m<=100.0)
       {
         m_Pos=(1-1/R[m_SFCT])*m/100.0+1/R[m_SFCT];//0~100至1/R~1;
         m_Pos=(log(m_Pos)/log(R[m_SFCT])+1)*100.0;//l/L=(logR Q/Qm+1)100
       }
       else
         m_Pos=10;
//       m_Pos=m_Pos*100.0;//YA-YE---0-1;
     }
     else
       return 0;
   }
   else if(m_SFCT>=3 && m_SFCT<=6)
   {
       m_Pos=(pow(R[m_SFCT],m/100.0-1.0))*100;     //l/L=(R Q/Qm-1)100
   }
   else if(m_SFCT==7)
   {//查表与插值程序,表是顺序表,SL0~SL20共21个数据
    //输入是m=0~100的信号。
    //0  5  10  15  20  25  30  35  40  45  50  55  60  65  70  75  80  85  90  95  100
    //SL01   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20
    i=m/5;
    if(i!=20)
      m_Pos=(m_SL[i+1]-m_SL[i])*(m-i*5)/5+m_SL[i];
    else
      m_Pos=m_SL[20];
   }
   return m_Pos;
}
double TMainForm::Work_Valve_Translate(double m)
{
   double R[7]={0,25,33,50,25,33,50};
   double m_Pos;
   if(m_SFCT==0)
      m_Pos=m;
   else if(m_SFCT==1 || m_SFCT==2 || m_SFCT==3)
   {
     if(m_YE!=m_YA)
     {
       m_Pos=(pow(R[m_SFCT],m/100.0-1.0));
       m_Pos=(m_Pos-1/R[m_SFCT])*100/(1-1/R[m_SFCT]);//YA-YE----1/R-1
//       m_Pos=m_Pos*100.0;//YA-YE---0-1;
     }
     else
       return 0;
   }
   else if(m_SFCT==4 || m_SFCT==5 || m_SFCT==6)
   {
        if(m_Pos>=0)
        {
         m_Pos=(1-1/R[m_SFCT])*m/100.0+1/R[m_SFCT];//0~100至1/R~1;
         m_Pos=(log(m_Pos)/log(R[m_SFCT])+1)*100.0;   //Q/Qm=log R l/L-1
        }
        else
         m_Pos=0;

   }
   return m_Pos;
}
///////////////////////////////////////////////////////////
//9、阀自动工作模式控制
//需修改
void TMainForm::Work_Valve_Model()
{
    double k1,k2,k3,k4,k5,T=1,current,p1,p2;
    double m_pos1,m_pos2;
    double m_Valve_Flow;
//  模型参数
    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();
//   设定值
    if(m_YNRM==0)          //YNRM=MPOS时,行程显示

⌨️ 快捷键说明

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