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

📄 mpctestview.cpp

📁 VC++实现的预测控制
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MPCTestView.cpp : implementation of the CMPCTestView class
//

#include "stdafx.h"
#include "MPCTest.h"
#include "MPCTestSet.h"
#include "MPCTestDoc.h"
#include "MPCTestView.h"
#include "SelectServer.h"
#include "ZhuTai.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CArray<mytag*,mytag*>* AITagList;
extern CArray<mytag*,mytag*>* AOTagList;
bool m_one = 0;//转载动态库标示
CString DllPath;//动态库文件路径
CString IniPathName;//配置文件
CString functionname;//被调用函数名
CString dialogname;//被调用对话框名
extern double ComputeTime;
extern mytag* newtag;
BOOL m_IsStart;//是否可以开始
CArray<COPCClient *,COPCClient *> pDocs;//管理多个OPC Server
extern CString m_CurveAIName[50],m_CurveAOName[50];
/////////////////////////////////////////////////////////////////////////////
// CMPCTestView

IMPLEMENT_DYNCREATE(CMPCTestView, CRecordView)

BEGIN_MESSAGE_MAP(CMPCTestView, CRecordView)
//{{AFX_MSG_MAP(CMPCTestView)
ON_COMMAND(ID_START, OnStart)
ON_WM_TIMER()
ON_COMMAND(ID_LOOPSET, OnLoopset)
ON_COMMAND(ID_OPEN_INIFILE, OnOpenInifile)
ON_COMMAND(ID_SETUP, OnSetup)
ON_COMMAND(ID_STOP, OnStop)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMPCTestView construction/destruction

CMPCTestView::CMPCTestView()
: CRecordView(CMPCTestView::IDD)
{
	//{{AFX_DATA_INIT(CMPCTestView)
	m_pSet = NULL;
	m_static1 = _T("");
	m_static2 = _T("");
	m_static3 = _T("");
	m_Stop = FALSE;
	//}}AFX_DATA_INIT
	// TODO: add construction code here
    time =0.0;
	m_IsStart = FALSE;
	m_LoadDll = FALSE;
}

CMPCTestView::~CMPCTestView()
{
	FreeLibrary(hDll);
	delete pDoc;
}

void CMPCTestView::DoDataExchange(CDataExchange* pDX)
{
	CRecordView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMPCTestView)
	DDX_Control(pDX, IDC_SIARTCHARTCTRL1, m_siachart);
	DDX_Text(pDX, IDC_STATIC1, m_static1);
	DDX_Text(pDX, IDC_STATIC2, m_static2);
	DDX_Text(pDX, IDC_STATIC3, m_static3);
	//}}AFX_DATA_MAP
}

BOOL CMPCTestView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	
	return CRecordView::PreCreateWindow(cs);
}

void CMPCTestView::OnInitialUpdate()
{
	m_pSet = &GetDocument()->m_mPCTestSet;
    pDoc = new COPCClient();
	pDocs.SetAtGrow(0,pDoc);
	AITagList =new CArray<mytag*,mytag*> ;
	AOTagList =new CArray<mytag*,mytag*> ;
	CRecordView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
    m_siachart.SetTimeAxisMode(1);
    	COleDateTime Timer1(1899,12,30,0,0,0);
			COleDateTime Timer;
			Timer = COleDateTime::GetCurrentTime();
			time =0;
			COleDateTimeSpan totalTime;
			totalTime = Timer-Timer1;
			m_siachart.SetTimeAxisMinTime(totalTime);
			m_siachart.SetTimeAxisMaxTime(totalTime);
			time = time+totalTime;	
    m_siachart.SetLegends(0);
	ResizeParentToFit();
	
}

/////////////////////////////////////////////////////////////////////////////
// CMPCTestView printing

BOOL CMPCTestView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMPCTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMPCTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMPCTestView diagnostics

#ifdef _DEBUG
void CMPCTestView::AssertValid() const
{
	CRecordView::AssertValid();
}

void CMPCTestView::Dump(CDumpContext& dc) const
{
	CRecordView::Dump(dc);
}

CMPCTestDoc* CMPCTestView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMPCTestDoc)));
	return (CMPCTestDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMPCTestView database support
CRecordset* CMPCTestView::OnGetRecordset()
{
	return m_pSet;
}

/////////////////////////////////////////////////////////////////////////////
// CMPCTestView message handlers

void CMPCTestView::OnStart() 
{
	// TODO: Add your command handler code here
	if(m_IsStart)
	{
		if(!m_LoadDll)
		{
			
		    hDll=::LoadLibrary(DllPath);//加载链接库
	        if(hDll==NULL){ 
		     AfxMessageBox("找不到PIDDLL.dll,加载动态链接库失败,"); 
	        return ;}
			m_LoadDll = TRUE;
		}
		if(!m_Stop)
		{
			UpdateData(FALSE); 
			SetTimer(1,ComputeTime*1000,NULL);//
			if(pDoc==NULL)
			{
				MessageBox("请先连接服务器");
				return;
			}
			
			CString s = "MC-EtherNet-H1 Interface.FI1.FBLOCK.FI-0005 PID.MODE_BLK.TARGET";
			pDoc->Additem(s, "", 0 );
			pDoc->Write(s,16);
			m_Stop = TRUE;
		}
	}
	else
	{
		AfxMessageBox("请先进行回路设置或调用以前的回路配置!");
		return;
	}
	
}
void CMPCTestView::control()
{
	
    typedef double (*pShow)(CArray<mytag*,mytag*>* AiList,CArray<mytag*,mytag*>* AoList);
	pShow Show=(pShow)::GetProcAddress(hDll,functionname); 
	Show(AITagList,AOTagList);
	if(Show==NULL)
	{
		AfxMessageBox("函数调用失败"); //调用加载动态链接库失败
		return;
	}
    pDoc->WriteItems();
}
void CMPCTestView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	//读写OPC数据
	if(m_Stop)
	{
		CString s;
		CString myString;//转化OPC数据,显示曲线存入数据库
		POSITION pos = pDoc->items.GetHeadPosition();
		int k = pDoc->items.GetCount();
		
		for( int index=0; index<k; index++ )
		{
			
			
			Item* pItem = pDoc->items.GetAt( pos );
			switch (pItem->value.vt)
			{
 		         case VT_I2:		//SHORT
					 AITagList->GetAt(index)->value = double(pItem->value.iVal);	
					 break;
				 case VT_I4:		//LONG
					 AITagList->GetAt(index)->value = double(pItem->value.iVal);			
					 break;
				 case VT_R4://Float
					 {
						 for(int i=0;i<AITagList->GetSize();i++)
						 {
							 if(AITagList->GetAt(i)->name.Compare(pItem->name)==0)
							 {
								 newtag =new mytag;
								 newtag->value = double(pItem->value.fltVal);
								 newtag->name = AITagList->GetAt(i)->name;
								 newtag->pos = AITagList->GetAt(i)->pos;
								 AITagList->SetAtGrow(i,newtag) ;
								 
								 break;
							 }
						 }
						 for(i=0;i<AOTagList->GetSize();i++)
						 {
							 if(AOTagList->GetAt(i)->name.Compare(pItem->name)==0)
							 {
								 newtag =new mytag;
								 newtag->value = double(pItem->value.fltVal);
								 newtag->name = AOTagList->GetAt(i)->name;
								 newtag->pos = AOTagList->GetAt(i)->pos;
								 AOTagList->SetAtGrow(i,newtag); 
								 //delete tag;
								 break;
							 }
						 }
						 break;
					 }
				 case VT_R8:		//Double
					 {
						 for(int i=0;i<AITagList->GetSize();i++)
						 {
							 if(AITagList->GetAt(i)->name.Compare(pItem->name)==0)
							 {
								 mytag* tag =new mytag;
								 tag->value = double(pItem->value.dblVal);
								 tag->name = AITagList->GetAt(i)->name;
								 tag->pos = AITagList->GetAt(i)->pos;
								 AITagList->SetAtGrow(i,tag) ;
								 delete tag;
								 
								 break;
							 }
						 }
						 for(i=0;i<AOTagList->GetSize();i++)
						 {
							 if(AOTagList->GetAt(i)->name.Compare(pItem->name)==0)
							 {
								 mytag* tag =new mytag;
								 tag->value = double(pItem->value.dblVal);
								 tag->name = AOTagList->GetAt(i)->name;
								 tag->pos = AOTagList->GetAt(i)->pos;
								 AOTagList->SetAtGrow(i,tag) ;
								 delete tag;
								 break;
							 }
						 }
						 
						 
						 break;
					 }
				 case VT_BOOL:
					 AITagList->GetAt(index)->value = double(pItem->value.boolVal);					
                     break;
				 case VT_UI2:	//WORD
					 AITagList->GetAt(index)->value = double(pItem->value.uiVal);		
					 break;
				 case VT_UI4:	//DWORD
					 AITagList->GetAt(index)->value = double(pItem->value.ulVal);				
					 break;
				 case VT_BSTR:	//String
					 ReadItemStringValue[index]=pItem->value.bstrVal;
					 break;
					 
			}
			m_siachart.AddXYPoint(index,time,double(pItem->value.fltVal)); 
			
			
			
			pDoc->items.GetNext(pos);		   
		}
		
		s.Format("%.5f",AITagList->GetAt(0)->value);
		m_static1 =  "第一条曲线 灯箱实际温度"+s;
		s.Format("%.5f",AITagList->GetAt(1)->value);
		m_static2 = "第二条曲线 灯箱设定温度"+s;
		s.Format("%.5f",AOTagList->GetAt(0)->value);
		m_static3=  "第三条曲线 实际控制值"+s;
		if(pDocs.GetSize()>1)
		{
			for(int count =0;count<pDocs.GetSize();count++)
			{
				POSITION pos = pDocs.GetAt(count+1)->items.GetHeadPosition();
				int k = pDocs.GetAt(count+1)->items.GetCount();
				for( int index=0; index<k; index++ )
				{
					
					
					Item* pItem = pDocs.GetAt(count+1)->items.GetAt( pos );
					switch (pItem->value.vt)
					{
					case VT_I2:		//SHORT
						AITagList->GetAt(index)->value = double(pItem->value.iVal);	
						break;
					case VT_I4:		//LONG
						AITagList->GetAt(index)->value = double(pItem->value.iVal);			
						break;
					case VT_R4://Float
						{
							for(int i=0;i<AITagList->GetSize();i++)
							{
								if(AITagList->GetAt(i)->name.Compare(pItem->name)==0)
								{
									newtag =new mytag;
									newtag->value = double(pItem->value.fltVal);
									newtag->name = AITagList->GetAt(i)->name;
									newtag->pos = AITagList->GetAt(i)->pos;
									AITagList->SetAtGrow(i,newtag) ;								   
									break;
								}
							}
							for(i=0;i<AOTagList->GetSize();i++)
							{
                                if(AOTagList->GetAt(i)->name.Compare(pItem->name)==0)
								{
									newtag =new mytag;
									newtag->value = double(pItem->value.fltVal);
									newtag->name = AOTagList->GetAt(i)->name;
									newtag->pos = AOTagList->GetAt(i)->pos;
									AOTagList->SetAtGrow(i,newtag); 
									//delete tag;
									break;
								}
							}
							break;
						}
					case VT_R8:		//Double
						{
							for(int i=0;i<AITagList->GetSize();i++)
							{
								if(AITagList->GetAt(i)->name.Compare(pItem->name)==0)
								{
									mytag* tag =new mytag;
									tag->value = double(pItem->value.dblVal);

⌨️ 快捷键说明

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