📄 mpctestview.cpp
字号:
// 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 + -