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

📄 mainfrm.cpp

📁 可以编辑PLC梯形图
💻 CPP
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "PLC.h"

#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern char FileName[168];//当前文件名
extern char IsLadModi;//'Y'表梯形图被修改了
extern char IsPlcModi;//'Y'表指令表被修改了
extern unsigned short TotalLine;//指令表总行数
extern unsigned short TotalLad;//梯形图总行数
extern 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];
extern 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];
/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_BN_CLICKED(IDC_EXIT, OnExit)
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
	// Global help commands
	ON_COMMAND(ID_HELP_FINDER, CFrameWnd::OnHelpFinder)
	ON_COMMAND(ID_HELP, CFrameWnd::OnHelp)
	ON_COMMAND(ID_CONTEXT_HELP, CFrameWnd::OnContextHelp)
	ON_COMMAND(ID_DEFAULT_HELP, CFrameWnd::OnHelpFinder)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
	
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);

	m_WndDlgBar.Create(this, IDD_MYDIALOG, CBRS_BOTTOM, AFX_IDW_DIALOGBAR);

	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
		| WS_THICKFRAME | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_MAXIMIZE;

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnExit() 
{
	 CMainFrame::OnClose();	
}
//----------------------------------------------------------------------
void CMainFrame::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	
    if(IsLadModi=='Y')//'Y'表梯形图被修改了
	{
		IsLadModi='N';
		if(AfxMessageBox("当前梯形图没保存,是否保存梯形图文件?", MB_YESNO, 0)==IDYES)
		{//@@@@1
			if(strcmp(FileName,"")==0)
			{
				CFileDialog dlg( FALSE, _T("LAD"), NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,	                 
								 _T("梯形图文件 (*.LAD)|*.LAD|"));
				if(IDOK==dlg.DoModal())
				{	
					//SetfileName(dlg.GetPathName());//获取文件名				
					char tempFileName[168];//文件名
				    strcpy(tempFileName, dlg.GetPathName());
				    unsigned short sb=0;
				    strcpy(FileName, "");
				    while((sb<160)&&(tempFileName[sb]!='.')&&(tempFileName[sb]!='\0'))
					{
					  FileName[sb]=tempFileName[sb];
					  FileName[sb+1]='\0';
					  sb=sb+1;
					}
					if(strcmp(FileName,"")==0) {IsLadModi='Y'; return;}
				}
				else {IsLadModi='Y'; return;}
			}
			
			char TotalFileName[171];
			strcpy(TotalFileName, FileName);
			strcat(TotalFileName, ".lad");
			FILE *stream; 
			if((stream=fopen(TotalFileName, "wb"))==NULL)
				{AfxMessageBox("不能打开PLC梯形图文件");}        
			char nul=0;//辅助变量			
			unsigned short CuLi=0;
			char VorInd=0;  
			while(CuLi<TotalLad)
			{
				 VorInd=0;
				 while(VorInd<16)
				 {
					fwrite(&lad[CuLi].m_Kind[VorInd],sizeof(char),1,stream);
					fwrite(&lad[CuLi].m_Name[VorInd],sizeof(char),1,stream);
					fwrite(&lad[CuLi].m_Code[VorInd],sizeof(unsigned short),1,stream);
					fwrite(&lad[CuLi].m_Para[VorInd],sizeof(unsigned short),1,stream);
					fwrite(&lad[CuLi].m_Branch[VorInd],sizeof(char),1,stream);
					fwrite(&nul,sizeof(char),1,stream);
					VorInd=VorInd+1;
				 }			  
				 CuLi=CuLi+1;
			}   
			fclose(stream);
//			CPLCDoc* pDoc = GetDocument();
//			pDoc->SetPathName(FileName,TRUE);
		}//@@@@1
	}

	if(IsPlcModi=='Y')//'Y'表指令表被修改了
	{
		IsPlcModi='N';
		if(AfxMessageBox("当前指令表没保存,是否保存指令表文件?", MB_YESNO, 0)==IDYES)
		{//@@@@2		
			if(strcmp(FileName,"")==0)
			{
				CFileDialog dlg( FALSE, _T("PLC"), NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,	                 
								 _T("指令表文件 (*.PLC)|*.PLC|"));
				if(IDOK==dlg.DoModal())
				{				
					//SetfileName(dlg.GetPathName());//获取文件名					
					char tempFileName[168];//文件名
				    strcpy(tempFileName, dlg.GetPathName());
				    unsigned short sb=0;
				    strcpy(FileName, "");
				    while((sb<160)&&(tempFileName[sb]!='.')&&(tempFileName[sb]!='\0'))
					{
					  FileName[sb]=tempFileName[sb];
					  FileName[sb+1]='\0';
					  sb=sb+1;
					}
					if(strcmp(FileName,"")==0) {IsPlcModi='Y'; return;}
				}
				else {IsPlcModi='Y'; return;}
			}
			
			char TotalFileName[171];
			strcpy(TotalFileName, FileName);
			strcat(TotalFileName, ".plc");
			FILE *stream; 
			if((stream=fopen(TotalFileName, "wb"))==NULL)
				{AfxMessageBox("不能打开PLC指令表文件");}        
			char nul=0;//辅助变量		
			unsigned short CuLi=0;
			while(CuLi<TotalLine)
			{		  	
				fwrite(&Instruct[CuLi],sizeof(struct INSTRUCTION),1,stream);
				fwrite(&nul,sizeof(char),20,stream);
				CuLi=CuLi+1;
			}   
			fclose(stream);	
//			CPLCDoc* pDoc = GetDocument();
//			pDoc->SetPathName(FileName,TRUE);					
		}//@@@@2
	}

	CFrameWnd::OnClose();
}
//-----------------------------------------------------------------------

⌨️ 快捷键说明

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