📄 plcview.cpp
字号:
// PLCView.cpp : implementation of the CPLCView class
//
#include "stdafx.h"
#include "PLC.h"
#include "PLCDoc.h"
#include "PLCView.h"
#include "inputpart.h"
#include "inputline.h"
//#include <iostream.h>
//#include <fstream.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
char FileName[168];//当前文件名
char IsLadModi='N';//'Y'表梯形图被修改了
char IsPlcModi='N';//'Y'表指令表被修改了
bool IsRun=false;//true表仿真运行;false表停止
CBrush BrushRed,BrushGreen;
char FaceKind='T';//'T'表示梯形图;'I'表示指令;'L'逻辑测试
char PartKind=0, partName=0, EnterCancel='C';//对话框:Enter//Cancel
short PartCode=0, Partpara=0;
CSize sizeTotal;
CSize sizePage(300,300);
CSize sizeLine(25,25); //50,50
unsigned short TotalLine=1;//指令表总行数
unsigned short CurrLine=0;//指令表当前行
char Order;//0=NOP;1=LD;2=LDI;3=AND;4=ANI;5=OR;6=ORI;7=ANB;
//8=ORB;9=OUT;10=SET;11=RST;12=MPS;13=MRD;14=MPP;15=END;
char Name;//0=X,1=Y,2=M,3=T,4=C;
unsigned short Code;
unsigned short Para;
char EnCa='C';//对话框:Enter//Cancel
struct INSTRUCTION//指令表数据结构
{
char Order;//0=NOP;1=LD;2=LDI;3=AND;4=ANI;5=OR;6=ORI;7=ANB;
//8=ORB;9=OUT;10=SET;11=RST;12=MPS;13=MRD;14=MPP;15=END;
char Name;//0=X,1=Y,2=M,3=T,4=C;
unsigned short Code;//元件代号
unsigned short Para;//参数
} Instruct[1002];
unsigned short TotalLad=1;//梯形图总行数
unsigned short CurrLadH=0;//梯形图当前行
char CurrLadV=0;//梯形图当前列
unsigned short PageLeng=500;//每页梯形图的总长度;由显示器分辨率和最大化或最小化决定
struct LADDER//梯形图数据结构
{
char m_Kind[16];//类型
char m_Name[16];//名字
unsigned short m_Code[16];//元件代号
unsigned short m_Para[16];//参数
char m_Branch[16];//是否分支
} lad[1002];
unsigned short Di=0;//辅助变量
unsigned short Input[4];//输入继电器
unsigned short Output[16];//输出辅助继电器
//定时器:0-3为10ms/通用;4-7为10ms/积算;8-11为1s/通用;12-15为1s/积算;
short CurrT[16],Tison[16];//当前计时值;是否打开
//计数器:0-15为通用
short CurrC[16],Cpulse[16],Cison[16];//当前计数值;当前脉冲状态;是否打开
/////////////////////////////////////////////////////////////////////////////
// CPLCView
IMPLEMENT_DYNCREATE(CPLCView, CScrollView)
BEGIN_MESSAGE_MAP(CPLCView, CScrollView)
//{{AFX_MSG_MAP(CPLCView)
ON_COMMAND(IDR_HOR, OnHor)
ON_WM_LBUTTONDOWN()
ON_COMMAND(IDR_VER, OnVer)
ON_COMMAND(IDR_OPEN, OnOpen)
ON_COMMAND(IDR_CLO, OnClo)
ON_COMMAND(IDR_SET, OnSet)
ON_COMMAND(IDR_RESET, OnReset)
ON_COMMAND(IDR_OUT, OnOut)
ON_COMMAND(IDR_DELETEPART, OnDeletepart)
ON_COMMAND(IDR_DELETEVER, OnDeletever)
ON_COMMAND(IDR_DELETELINE, OnDeleteline)
ON_COMMAND(IDR_INSERTLINE, OnInsertline)
ON_COMMAND(IDR_EDITLINE, OnEditline)
ON_WM_KEYDOWN()
ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_BN_CLICKED(IDC_INSR, OnInsr)
ON_BN_CLICKED(IDC_LAD, OnLad)
ON_BN_CLICKED(IDC_TEST, OnTest)
ON_WM_LBUTTONDBLCLK()
ON_WM_TIMER()
ON_WM_SIZE()
ON_COMMAND(ID_FILE_NEW, OnFileNew)
ON_WM_DESTROY()
ON_WM_RBUTTONDOWN()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPLCView construction/destruction
CPLCView::CPLCView()
{
// TODO: add construction code here
}
CPLCView::~CPLCView()
{
}
BOOL CPLCView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
PCusor.x=8; PCusor.y=0;
pen.CreatePen(PS_SOLID,3,RGB(13,24,165));
strcpy(FileName, "");//当前文件名
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CPLCView drawing
void CPLCView::OnDraw(CDC* pDC)
{
if(FaceKind=='T')
{
pDC->SetROP2(R2_COPYPEN);
pDC->SelectStockObject(BLACK_PEN);
unsigned short index=0;
char allow=0;
while(index<=TotalLad)
{
allow=0;
while(allow<16) {DrawPart(pDC, index, allow); allow=allow+1;}
index=index+1;
}
pDC->SetTextColor(RGB(129,18,237));
char Str[6];
index=0;
while(index<=TotalLad)
{
sprintf(Str,"%04d",index);
pDC->TextOut(12,50*index+35,Str,4);
index=index+1;
}
pDC->SelectObject(&pen);
pDC->SetROP2(R2_COPYPEN);
pDC->MoveTo(8,0);
pDC->LineTo(8,50000);
pDC->MoveTo(616,0);
pDC->LineTo(616,50000);
pDC->SetROP2(R2_NOT);
pDC->MoveTo(PCusor.x, PCusor.y);
pDC->LineTo(PCusor.x, PCusor.y+50);
pDC->LineTo(PCusor.x+38, PCusor.y+50);
pDC->LineTo(PCusor.x+38, PCusor.y);
pDC->LineTo(PCusor.x, PCusor.y);
}
else if(FaceKind=='I')
{
short j=0;
char str[80],st[5];
while((j<TotalLine)&&(j<=1000))
{
sprintf(str,"%03d ",j);
switch(Instruct[j].Order)
{
case 0:{strcat(str,"NOP ");break;}
case 1:{strcat(str,"LD ");break;}
case 2:{strcat(str,"LDI ");break;}
case 3:{strcat(str,"AND ");break;}
case 4:{strcat(str,"ANI ");break;}
case 5:{strcat(str,"OR ");break;}
case 6:{strcat(str,"ORI ");break;}
case 7:{strcat(str,"ANB ");break;}
case 8:{strcat(str,"ORB ");break;}
case 9:{strcat(str,"OUT ");break;}
case 10:{strcat(str,"SET ");break;}
case 11:{strcat(str,"RST ");break;}
case 12:{strcat(str,"MPS ");break;}
case 13:{strcat(str,"MRD ");break;}
case 14:{strcat(str,"MPP ");break;}
case 15:{strcat(str,"END ");break;}
default: {strcat(str,"NOP ");break;}
}
if((Instruct[j].Order>=1)&&(Instruct[j].Order<=11)
&&(Instruct[j].Order!=7)&&(Instruct[j].Order!=8))
{
switch(Instruct[j].Name)
{
case 0:{strcat(str,"X");break;}
case 1:{strcat(str,"Y");break;}
case 2:{strcat(str,"M");break;}
case 3:{strcat(str,"T");break;}
case 4:{strcat(str,"C");break;}
}
sprintf(st,"%03d",Instruct[j].Code); strcat(str,st);
if(Instruct[j].Order==9)
{
if((Instruct[j].Name==3)||(Instruct[j].Name==4))
{strcat(str," K"); sprintf(st,"%04d",Instruct[j].Para); strcat(str,st);}
}
}
pDC->TextOut(50,25*j,str);
j=j+1;
}
pDC->PatBlt(20,25*CurrLine,500,18,DSTINVERT);
}
else if(FaceKind=='L')
{
DrawPLCtest(pDC);//逻辑测试
}
// TODO: add draw code for native data here
}
//-----------------------------------------------------------
void CPLCView::DrawPart(CDC* pDC, unsigned short hor, char ver)
{
if((hor<0)||(hor>TotalLad)) {return;}//
int m_StartX=8+38*ver;
int m_StartY=50*hor;
if(lad[hor].m_Kind[ver]==0)//空
{
if(lad[hor].m_Branch[ver]==1)
{
pDC->MoveTo(m_StartX+38,m_StartY+25);
pDC->LineTo(m_StartX+38,m_StartY+75);
}
return;
}
else if(lad[hor].m_Kind[ver]==1)//--
{
pDC->MoveTo(m_StartX,m_StartY+25);
pDC->LineTo(m_StartX+38,m_StartY+25);
}
else if(lad[hor].m_Kind[ver]==2)//-||-
{
pDC->MoveTo(m_StartX,m_StartY+25);
pDC->LineTo(m_StartX+14,m_StartY+25);
pDC->MoveTo(m_StartX+14,m_StartY+15);
pDC->LineTo(m_StartX+14,m_StartY+35);
pDC->MoveTo(m_StartX+24,m_StartY+15);
pDC->LineTo(m_StartX+24,m_StartY+35);
pDC->MoveTo(m_StartX+24,m_StartY+25);
pDC->LineTo(m_StartX+38,m_StartY+25);
}
else if(lad[hor].m_Kind[ver]==3)//-|/|-
{
pDC->MoveTo(m_StartX,m_StartY+25);
pDC->LineTo(m_StartX+14,m_StartY+25);
pDC->MoveTo(m_StartX+14,m_StartY+15);
pDC->LineTo(m_StartX+14,m_StartY+35);
pDC->MoveTo(m_StartX+16,m_StartY+35);
pDC->LineTo(m_StartX+22,m_StartY+15);
pDC->MoveTo(m_StartX+24,m_StartY+15);
pDC->LineTo(m_StartX+24,m_StartY+35);
pDC->MoveTo(m_StartX+24,m_StartY+25);
pDC->LineTo(m_StartX+38,m_StartY+25);
}
else if(lad[hor].m_Kind[ver]==4)//-[]
{
pDC->MoveTo(m_StartX,m_StartY+25);
pDC->LineTo(m_StartX+3,m_StartY+25);
pDC->Ellipse(m_StartX+3, m_StartY+15, m_StartX+38, m_StartY+35);
if((lad[hor].m_Name[ver]==3)||(lad[hor].m_Name[ver]==4))
{
char Str[6];
sprintf(Str,"K%04d",lad[hor].m_Para[ver]);
pDC->TextOut(m_StartX-5,m_StartY+33,Str,5);
}
}
else if(lad[hor].m_Kind[ver]==5)//-[S]
{
pDC->MoveTo(m_StartX,m_StartY+25);
pDC->LineTo(m_StartX+3,m_StartY+25);
pDC->Ellipse(m_StartX+3, m_StartY+15, m_StartX+38, m_StartY+35);
pDC->TextOut(m_StartX+17,m_StartY+18,"S");
}
else if(lad[hor].m_Kind[ver]==6)//-[R]
{
pDC->MoveTo(m_StartX,m_StartY+25);
pDC->LineTo(m_StartX+3,m_StartY+25);
pDC->Ellipse(m_StartX+3, m_StartY+15, m_StartX+38, m_StartY+35);
pDC->TextOut(m_StartX+17,m_StartY+18,"R");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -