📄 workproc.cpp
字号:
#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 + -