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

📄 plcview.cpp

📁 可以编辑PLC梯形图
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// 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 + -