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

📄 calctask.cpp

📁 通过DDE实现从InTouch取泵站机组功率、叶片角度、扬程来计算机组流量和效率
💻 CPP
字号:
#include "stdafx.h"
#include "CalcBasedDDE.h"
#include "CalcBasedDDEDlg.h"
#include "math.h"
#include "resource.h"
#include "CurveData.h"

int    M_RunFlag[MchNum];
float  curLift=0,M_Flow[MchNum],M_Effi[MchNum],M_Power[MchNum];
extern DDE_DATA ddeReadData[DDE_READ_NUM],ddeWriteData[DDE_WRITE_NUM];
extern BOOL  DDEComBusy,CalcBusy;
void InitData();
UINT MainCalcProcess(LPVOID lpParam);
/////////////////////////////////////////////////////////////////////////////
void InitData()
{
	//机组运行状态
	strcpy(ddeReadData[0].Tagname,"JZ1_RUN");
	strcpy(ddeReadData[1].Tagname,"JZ2_RUN");
	strcpy(ddeReadData[2].Tagname,"JZ3_RUN");
	strcpy(ddeReadData[3].Tagname,"JZ4_RUN");
	strcpy(ddeReadData[4].Tagname,"JZ5_RUN");
	//机组功率
	strcpy(ddeReadData[5].Tagname,"LCU1_EIN008");
	strcpy(ddeReadData[6].Tagname,"LCU2_EIN008");
	strcpy(ddeReadData[7].Tagname,"LCU3_EIN008");
	strcpy(ddeReadData[8].Tagname,"LCU4_EIN008");
	strcpy(ddeReadData[9].Tagname,"LCU5_EIN008");
	//机组叶片角度
	strcpy(ddeReadData[10].Tagname,"YP_AIN0001");
	strcpy(ddeReadData[11].Tagname,"YP_AIN0002");
	strcpy(ddeReadData[12].Tagname,"YP_AIN0003");
	strcpy(ddeReadData[13].Tagname,"YP_AIN0004");
	strcpy(ddeReadData[14].Tagname,"YP_AIN0005");
	//当前扬程
	strcpy(ddeReadData[15].Tagname,"LCU_LEVEL");
	//机组流量
	strcpy(ddeWriteData[0].Tagname,"LCU1_FLOW");
	strcpy(ddeWriteData[1].Tagname,"LCU2_FLOW");
	strcpy(ddeWriteData[2].Tagname,"LCU3_FLOW");
	strcpy(ddeWriteData[3].Tagname,"LCU4_FLOW");
	strcpy(ddeWriteData[4].Tagname,"LCU5_FLOW");
	//机组效率
	strcpy(ddeWriteData[5].Tagname,"LCU1_EFF");
	strcpy(ddeWriteData[6].Tagname,"LCU2_EFF");
	strcpy(ddeWriteData[7].Tagname,"LCU3_EFF");
	strcpy(ddeWriteData[8].Tagname,"LCU4_EFF");
	strcpy(ddeWriteData[9].Tagname,"LCU5_EFF");
}

FLOAT CalMFlow(int no,float lift,float angel)
{
	int i;
	float result=0,Temp1,Temp2;
	
	if (angel>dAngl[dAnglNum-1]) 
		angel=dAngl[dAnglNum-1];
	if (angel<dAngl[0])           
		angel=dAngl[0];  
	for (i=0;i<dAnglNum;i++)
	{
		if (angel>=dAngl[i] && angel<=dAngl[i+1])
		{   
			Temp1=(angel-dAngl[i])*(dFlow[no+1][i+1]-dFlow[no+1][i])/(dAngl[i+1]-dAngl[i])+dFlow[no+1][i];
			Temp2=(angel-dAngl[i])*(dFlow[no][i+1]-dFlow[no][i])/(dAngl[i+1]-dAngl[i])+dFlow[no][i];
			break;
		}
	}
	result=(lift-dLift[no])*(Temp1-Temp2)/(dLift[no+1]-dLift[no])+Temp2;
	return (result);
}

FLOAT CalMEffi(float lift,float flow,float power)
{
	float result=0;
	
	if (power>0.01)
	{
		result=(float)(100*(9.81*flow*lift/power));
		if (result>MAX_EFFI) result=MAX_EFFI;
		if (result<MIN_EFFI) result=MIN_EFFI;
	}
	else
	{
		result=0;
	}
	
	return (result);
}

UINT MainCalcProcess(LPVOID lpParam)
{
	CCalcBasedDDEDlg *pDlg= (CCalcBasedDDEDlg *)lpParam;
	int i,nLift;
	float TFlow;
	float M_Angle[MchNum];
	BOOL  NoAngData[MchNum]; 	
	
	for (i=0; i<MchNum; i++)
	{
		NoAngData[i]=FALSE;
	}

	while (pDlg->mainAlive)
	{
		//等待读数据完成事件
		while (DDEComBusy)
			Sleep(20);
		CalcBusy=TRUE;
		//取得机组运行状态数据
		for (i=0; i<MchNum; i++)
		{
			if (ddeReadData[i].value != BAD_DATA)  
			{
				M_RunFlag[i]=(int)ddeReadData[i].value;
			}
		}
		//取得机组有功功率数据
		for (i=0; i<MchNum; i++)
		{
			if (ddeReadData[MchNum+i].value != BAD_DATA)  
				M_Power[i]=ddeReadData[MchNum+i].value;
		}
		//取得机组叶片角度数据
		for(i=0; i<MchNum; i++)
		{  
			if(ddeReadData[2*MchNum+i].value != BAD_DATA)
			{
				M_Angle[i]=ddeReadData[2*MchNum+i].value;
				NoAngData[i]=FALSE;
			}
			else
				NoAngData[i]=TRUE;
		}
		//取得当前扬程数据
		if(ddeReadData[3*MchNum].value != BAD_DATA)	   
			curLift=ddeReadData[3*MchNum].value;
		
		//计算扬程数组索引
		if (curLift<dLift[0])
			nLift=0;
		else if (curLift>dLift[dLiftNum-1])
			nLift=dLiftNum-2;
		else
		{
			for(i=0;i<dLiftNum;i++)
			{
				if ( curLift>=dLift[i] && curLift<=dLift[i+1])
				{   
					nLift=i;
					break;
				}
			}
		} 
		//计算流量、效率
		for(i=0; i<MchNum; i++)
		{
			if((M_RunFlag[i]==1) && (!NoAngData[i]))
			{
				M_Flow[i]=CalMFlow(nLift,curLift,M_Angle[i]); 
				M_Effi[i]=CalMEffi(curLift,M_Flow[i],M_Power[i]); 			 
			}
			else
			{
				M_Flow[i]=0.0f;  
				M_Effi[i]=0.0f;
			}
			TFlow=TFlow+M_Flow[i];
		}
		//赋值到DDE写缓存
		for (i=0; i<MchNum; i++)
		{
			ddeWriteData[i].value       =M_Flow[i];
			ddeWriteData[i+MchNum].value=M_Effi[i];
		}
		CalcBusy=FALSE;
		Sleep(300);
	}
	if (pDlg)
	{
		if (pDlg->mainAlive)
			pDlg->SendMessage(WM_COMMAND,IDOK,0);
	}
	return 333;
}



⌨️ 快捷键说明

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