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

📄 plcdlg.cpp

📁 作者自己编写的应用计算机串口同三菱fx系列plc通信的源程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		m_X00.SetBitmap(IDB_NORMAL);
	else
		m_X00.SetBitmap(IDB_RED);
	if(X[1]==0)
		m_X01.SetBitmap(IDB_NORMAL);
	else
		m_X01.SetBitmap(IDB_RED);
	if(X[2]==0)
		m_X02.SetBitmap(IDB_NORMAL);
	else
		m_X02.SetBitmap(IDB_RED);
	if(X[3]==0)
		m_X03.SetBitmap(IDB_NORMAL);
	else
		m_X03.SetBitmap(IDB_RED);
	if(X[4]==0)
		m_X04.SetBitmap(IDB_NORMAL);
	else
		m_X04.SetBitmap(IDB_RED);
	if(X[5]==0)
		m_X05.SetBitmap(IDB_NORMAL);
	else
		m_X05.SetBitmap(IDB_RED);
	if(X[6]==0)
		m_X06.SetBitmap(IDB_NORMAL);
	else
		m_X06.SetBitmap(IDB_RED);
	if(X[7]==0)
		m_X07.SetBitmap(IDB_NORMAL);
	else
		m_X07.SetBitmap(IDB_RED);


	
	if(X[8]==0)
		m_X10.SetBitmap(IDB_NORMAL);
	else
		m_X10.SetBitmap(IDB_RED);
	if(X[9]==0)
		m_X11.SetBitmap(IDB_NORMAL);
	else
		m_X11.SetBitmap(IDB_RED);
	if(X[10]==0)
		m_X12.SetBitmap(IDB_NORMAL);
	else
		m_X12.SetBitmap(IDB_RED);
	if(X[11]==0)
		m_X13.SetBitmap(IDB_NORMAL);
	else
		m_X13.SetBitmap(IDB_RED);
	if(X[12]==0)
		m_X14.SetBitmap(IDB_NORMAL);
	else
		m_X14.SetBitmap(IDB_RED);
	if(X[13]==0)
		m_X15.SetBitmap(IDB_NORMAL);
	else
		m_X15.SetBitmap(IDB_RED);
	if(X[14]==0)
		m_X16.SetBitmap(IDB_NORMAL);
	else
		m_X16.SetBitmap(IDB_RED);
	if(X[15]==0)
		m_X17.SetBitmap(IDB_NORMAL);
	else
		m_X17.SetBitmap(IDB_RED);


	if(X[16]==0)
		m_X20.SetBitmap(IDB_NORMAL);
	else
		m_X20.SetBitmap(IDB_RED);
	if(X[17]==0)
		m_X21.SetBitmap(IDB_NORMAL);
	else
		m_X21.SetBitmap(IDB_RED);
	if(X[18]==0)
		m_X22.SetBitmap(IDB_NORMAL);
	else
		m_X22.SetBitmap(IDB_RED);
	if(X[19]==0)
		m_X23.SetBitmap(IDB_NORMAL);
	else
		m_X23.SetBitmap(IDB_RED);
	if(X[20]==0)
		m_X24.SetBitmap(IDB_NORMAL);
	else
		m_X24.SetBitmap(IDB_RED);
	if(X[21]==0)
		m_X25.SetBitmap(IDB_NORMAL);
	else
		m_X25.SetBitmap(IDB_RED);
	if(X[22]==0)
		m_X26.SetBitmap(IDB_NORMAL);
	else
		m_X26.SetBitmap(IDB_RED);
	if(X[23]==0)
		m_X27.SetBitmap(IDB_NORMAL);
	else
		m_X27.SetBitmap(IDB_RED);


	
	if(Y[0]==0)
		m_Y00.SetBitmap(IDB_NORMAL);
	else
		m_Y00.SetBitmap(IDB_RED);
	if(Y[1]==0)
		m_Y01.SetBitmap(IDB_NORMAL);
	else
		m_Y01.SetBitmap(IDB_RED);
	if(Y[2]==0)
		m_Y02.SetBitmap(IDB_NORMAL);
	else
		m_Y02.SetBitmap(IDB_RED);
	if(Y[3]==0)
		m_Y03.SetBitmap(IDB_NORMAL);
	else
		m_Y03.SetBitmap(IDB_RED);
	if(Y[4]==0)
		m_Y04.SetBitmap(IDB_NORMAL);
	else
		m_Y04.SetBitmap(IDB_RED);
	if(Y[5]==0)
		m_Y05.SetBitmap(IDB_NORMAL);
	else
		m_Y05.SetBitmap(IDB_RED);
	if(Y[6]==0)
		m_Y06.SetBitmap(IDB_NORMAL);
	else
		m_Y06.SetBitmap(IDB_RED);
	if(Y[7]==0)
		m_Y07.SetBitmap(IDB_NORMAL);
	else
		m_Y07.SetBitmap(IDB_RED);


	
	if(Y[8]==0)
		m_Y10.SetBitmap(IDB_NORMAL);
	else
		m_Y10.SetBitmap(IDB_RED);
	if(Y[9]==0)
		m_Y11.SetBitmap(IDB_NORMAL);
	else
		m_Y11.SetBitmap(IDB_RED);
	if(Y[10]==0)
		m_Y12.SetBitmap(IDB_NORMAL);
	else
		m_Y12.SetBitmap(IDB_RED);
	if(Y[11]==0)
		m_Y13.SetBitmap(IDB_NORMAL);
	else
		m_Y13.SetBitmap(IDB_RED);
	if(Y[12]==0)
		m_Y14.SetBitmap(IDB_NORMAL);
	else
		m_Y14.SetBitmap(IDB_RED);
	if(Y[13]==0)
		m_Y15.SetBitmap(IDB_NORMAL);
	else
		m_Y15.SetBitmap(IDB_RED);
	if(Y[14]==0)
		m_Y16.SetBitmap(IDB_NORMAL);
	else
		m_Y16.SetBitmap(IDB_RED);
	if(Y[15]==0)
		m_Y17.SetBitmap(IDB_NORMAL);
	else
		m_Y17.SetBitmap(IDB_RED);

	
/*	RECT rec;
	rec.left=122;
	rec.bottom=16;
	rec.top=365;
	rec.right=300;
	InvalidateRect(&rec,true);
*/

	Invalidate(false);
	
}

void CPLCDlg::OnLButtonDblClk(UINT nFlags, CPoint point) 
{

	CString ddd;
	ddd.Format("%d,%d",point.x,point.y);
	AfxMessageBox(ddd);
	CDialog::OnLButtonDblClk(nFlags, point);
}

void CPLCDlg::InitBtn()
{
	m_CloseAll.SetIcon(IDC_CLOSEALL);
	m_CloseAll.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
	m_CloseAll.SetRounded(TRUE);
//	m_CloseAll.SetSound(MAKEINTRESOURCE(IDR_WAVEHOVER), ::GetModuleHandle(NULL));
	m_CloseAll.SetBtnCursor(IDI_CLOSE);

	m_OpenAll.SetIcon(IDC_OPENALL);
	m_OpenAll.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
	m_OpenAll.SetRounded(TRUE);
//	m_OpenAll.SetSound(MAKEINTRESOURCE(IDR_WAVEHOVER), ::GetModuleHandle(NULL));
	m_OpenAll.SetBtnCursor(IDI_OPEN);

	m_Exit.SetIcon(IDCANCEL);
	m_Exit.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
	m_Exit.SetRounded(TRUE);
//	m_Exit.SetSound(MAKEINTRESOURCE(IDR_WAVEHOVER), ::GetModuleHandle(NULL));
	m_Exit.SetBtnCursor(IDI_QUIT);
	
	m_Run.SetIcon(IDC_RUN);
	m_Run.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
	m_Run.SetRounded(TRUE);
//	m_Exit.SetSound(MAKEINTRESOURCE(IDR_WAVEHOVER), ::GetModuleHandle(NULL));
	m_Run.SetBtnCursor(IDI_QUIT);
	
	m_ShunXu.SetIcon(IDC_RUN);
	m_ShunXu.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
	m_ShunXu.SetRounded(TRUE);
//	m_Exit.SetSound(MAKEINTRESOURCE(IDR_WAVEHOVER), ::GetModuleHandle(NULL));
	m_ShunXu.SetBtnCursor(IDI_QUIT);

}








/*


以下为命令程序


*/

//调度程序
//既有自动执行,又有手动执行的。
int CPLCDlg::AddCommand(unsigned char CommandStr[],int CommandLength,unsigned char RecDataLength,unsigned char Flag,int Style,int PortNo)
{
	int Result=1;
	//首先判断是否序列中有该项

	int leng_CommandArr=CommandArr[PortNo].GetSize();

	for(int iMain=0;iMain<leng_CommandArr;iMain++)
	{
		CString curStr=CommandArr[PortNo].GetAt(iMain);
		int leng=CommandLengthArr[PortNo].GetAt(iMain);			

		for(int itm=0;itm<CommandLength;itm++)
		{
			unsigned char a=CommandStr[itm];
			unsigned char b=curStr.GetAt(itm);
			if(a!=b)
			{
				Result=1;
				break;//有不相等的数据,马上跳出,无需检验了.
			}
			else
			{
				Result=0;
			}
		}
		if(Result==0)			//如果二者相等,则不必添加命令了。
			return Result;
	}
	

	CString tm;
	for(int itmm=0;itmm<CommandLength;itmm++)
		tm+=CommandStr[itmm];

	if(Style==1)	//顺序添加,主要采用此种方式
	{
		CommandArr[PortNo].Add(tm);
		CommandFlag[PortNo].Add(Flag);
		CommandLengthArr[PortNo].Add(CommandLength);
		RecDataLengthArr[PortNo].Add(RecDataLength);
	}
	if(Style==2)	//后来优先添加,对于启动电机等动作采用此种方式,为了节约时间
	{
		CommandArr[PortNo].InsertAt(0,tm);
		CommandFlag[PortNo].InsertAt(0,Flag);
		CommandLengthArr[PortNo].InsertAt(0,CommandLength);
		RecDataLengthArr[PortNo].InsertAt(0,RecDataLength);
	}
	return Result;
}


int CPLCDlg::DelCommand(unsigned char CommandStr[],int CommandLength,int PortNo)
{
	int Result=0;
	//首先判断是否序列中有该项
	//问题出在这里.

	int TotalLength=CommandArr[PortNo].GetSize();
	for(int iMain=0;iMain<TotalLength;iMain++)
	{
		CString curCompStr	=CommandArr[PortNo].GetAt(iMain);	//当前要比较的命令
		int leng_CompStr	=CommandLengthArr[PortNo].GetAt(iMain);
		bool Flag=false;
		//比较结果,如果CommandStr和curCompStr相等,Flag=true;

		if(CommandLength==leng_CompStr)//如果二者长度相等,才有接下来判断的必要。
		{
			for(int il=0;il<CommandLength;il++)
			{
				unsigned char a=CommandStr[il];
				unsigned char b=curCompStr.GetAt(il);
				if(a==b)//如果全部相等
				{
					Flag=false;
				}
				else
				{
					Flag=true;
					break;
				}

			}
		}
		else
		{
			Flag=true;
		}
		if(Flag==false)
		{

			CommandArr[PortNo].RemoveAt(iMain);
			CommandFlag[PortNo].RemoveAt(iMain);
			CommandLengthArr[PortNo].RemoveAt(iMain);
			RecDataLengthArr[PortNo].RemoveAt(iMain);
			Result	=	1;
			return Result;

		}
	}
	return Result;
}

//初始化命令 ,主要是做一些自检之类的工作.
int CPLCDlg::InitCommand()
{

	int Result=0;
	



	AddCommand(Plc_TT,16,14,14,2,1);
 	
	AddCommand(Command_Status_Plc_Y,15,44,16,1,0);//获取Y状态	

	AddCommand(Command_Status_Plc_X,15,42,15,1,0);//获取X状态
/**/	return Result;
}
//对要发送的数据进行预处理
//主要是把命令序列中的数据加入到当前的命令序列中。
//如果当前的命令三次无效,则将其删除。
//对于即时删除的命令,如果状态
//如何及时控制。
int CPLCDlg::DealCommandArr(int PortNo)
{
	int Result=0;

	RecData_Length=0;
	
	CommandArr_Cur[PortNo].RemoveAll();				//当前桢命令字符序列
	CommandLengthArr_Cur[PortNo].RemoveAll();		//当前桢命令长度序列
	CommandFlag_Cur[PortNo].RemoveAll();			//当前桢命令标志。
	RecDataLengthArr_Cur[PortNo].RemoveAll();		//当前桢接收到数据的应有长度

	//对错误次数进行判断
	int i;
	static int ErrorsMax=5;						//错误上限


	if(PortNo==0)
	{
		if(ErrorNum_PlcRun==ErrorsMax)
		{
			DelCommand(Plc_Run,8,PortNo);
			ErrorNum_PlcRun=0;
		}
		if(ErrorNum_PlcStp==ErrorsMax)
		{
			DelCommand(Plc_Stp,8,PortNo);
			ErrorNum_PlcStp=0;
		}

		for(i=0;i<32;i++)
		{
			if(ErrorNum_YOpen[i]==ErrorsMax)
			{
				DelCommand(YOpen[i],16,PortNo);
				ErrorNum_YOpen[i]=0;

			}
			if(ErrorNum_YClose[i]==ErrorsMax)
			{
				DelCommand(YClose[i],16,PortNo);
				ErrorNum_YClose[i]=0;
			}
		}
		if(ErrorNum_PlcTT==ErrorsMax)
		{
			DelCommand(Plc_TT,16,PortNo);
			ErrorNum_PlcTT=0;

		}

		if(ErrorNum_Status_Y==ErrorsMax)
		{
			DelCommand(Command_Status_Plc_Y,15,PortNo);
			ErrorNum_Status_Y=0;

		}

		if(ErrorNum_Status_X==ErrorsMax)
		{
			DelCommand(Command_Status_Plc_X,15,PortNo);
			ErrorNum_Status_X=0;
		}

	}


	CommandArr_Cur[PortNo].Append(CommandArr[PortNo]);
	CommandLengthArr_Cur[PortNo].Append(CommandLengthArr[PortNo]);	
	CommandFlag_Cur[PortNo].Append(	CommandFlag[PortNo]);
	RecDataLengthArr_Cur[PortNo].Append(RecDataLengthArr[PortNo]);
	
	Result=RecDataLengthArr_Cur[PortNo].GetSize();

	for(i=0;i<Result;i++)
		RecData_Length+=RecDataLengthArr_Cur[PortNo].GetAt(i);

	return Result;
}


//发送命令.用来调正数据。
//获取上一个命令
int CPLCDlg::SendCommand(int CommandNo,int PortNo)
{
	int Result=1;
	int siz=CommandArr_Cur[PortNo].GetSize();
	if(siz==0)
	{
		Result=0;
		return Result;
	}

	unsigned char tmp[128];
	CString str=CommandArr_Cur[PortNo].GetAt(CommandNo);
	int len=str.GetLength();
	memcpy(tmp,str,len);
	
	if(PortNo==0)
		port1.WriteToPort(tmp,len);
	


	int Flag=CommandFlag_Cur[PortNo].GetAt(CommandNo);//该命令的标志

	iCommand[PortNo]++;

	//发送完本帧命令,则当前帧变为上一帧。
	if(CommandNo==siz-1)
	{
		//要及时删除以前的,否则会造成内存扩大。2005.6.1/10:00改正
		CommandArr_Pre[PortNo].RemoveAll();				
		CommandLengthArr_Pre[PortNo].RemoveAll();		
		CommandFlag_Pre[PortNo].RemoveAll();			
		RecDataLengthArr_Pre[PortNo].RemoveAll();		


		CommandArr_Pre[PortNo].Append(CommandArr_Cur[PortNo]);				
		CommandLengthArr_Pre[PortNo].Append(CommandLengthArr_Cur[PortNo]);		
		CommandFlag_Pre[PortNo].Append(CommandFlag_Cur[PortNo]);			
		RecDataLengthArr_Pre[PortNo].Append(RecDataLengthArr_Cur[PortNo]);		
	}

//如果在本帧中
//如果是全部的数据的第一个命令。

	if(iFrame[PortNo]!=0)
	{
		if(CommandNo==0)//发送本帧的第一个命令,则PreCommand在前一帧中的最后一个
		{
			int max=CommandArr_Pre[PortNo].GetSize();
			PreCommand[PortNo]=CommandArr_Pre[PortNo].GetAt(max-1);
			PreFlag[PortNo]=CommandFlag_Pre[PortNo].GetAt(max-1);
		}
		else
		{
			PreCommand[PortNo]=CommandArr_Cur[PortNo].GetAt(CommandNo-1);
			PreFlag[PortNo]=CommandFlag_Cur[PortNo].GetAt(CommandNo-1);

		}
	}

	unsigned char Flag_Std[]={1,2,3,9,10,11,12,14,17,18,19,20,7,8};//即时删除的命令的标志
	bool Re=false;
	for(int i=0;i<14;i++ )
	{
		if(Flag==Flag_Std[i])
		{
			Re=true;
			break;
		}
	}

	if(Re==true)
		DelCommand(tmp,len,0);

⌨️ 快捷键说明

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