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

📄 plcdlg.cpp

📁 作者自己编写的应用计算机串口同三菱fx系列plc通信的源程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	return Result;
}

//拷贝字符
int CPLCDlg::CopyData(unsigned char Des[], unsigned char Src[], int Pos, int length)
{
	int Result=0;
	for(int i=0;i<length;i++)
		Des[i]=Src[Pos+i];
	return Result;

}

//处理接收到的数据。非常关键
//按照帧处理
//防错的处理?
//目标:如果出现错误,不会影响下一帧。已实现
//及时显示警告信息等
int CPLCDlg::DisposeData(unsigned char Org_Data[],int length,CString str_Command,unsigned char Flag)
{
	
	int Rslt=0;
	{
		int iFlag=Flag;				//判断标志
		unsigned char tmp[256];
		memset(tmp,0,256);
		CopyData(tmp,Org_Data,0,length);			//当前收到的数据

		switch(iFlag)
		{
				case 9:			//运行plc
					{
						int Result=DetectPlcRun(tmp,length);
						if(Result==0)//如果出现错误
						{
							ErrorNum_PlcRun++;
							Status_Plc=false;

						}
						if(Result==1)
						{
							Status_Plc=true;
							ErrorNum_PlcRun=0;
						}
						break;
					}
				case 10://停止plc
					{

						int Result=GetPlc_Data(tmp,length);

						if(Result==0)//如果出现错误
						{
							//报警
							ErrorNum_PlcStp++;
							Status_Plc=false;
							
//							CString Name;
//							if(ErrorNum_PlcStp>1)
//							Name.Format("停止命令错误,连续错误%d次",ErrorNum_PlcStp);

						}
						else
						{
							Status_Plc=true;
							ErrorNum_PlcStp=0;

						}
						break;
					}
				case 11:				//Y输出
					{
						char tm[2];
						tm[0]=str_Command.GetAt(11);
						tm[1]=str_Command.GetAt(12);
						unsigned short Num=atoi(tm);
						unsigned short Num_Dis=Num;
						if(Num>=10)
							Num-=2;

						int Result=GetPlc_Data(tmp,length);
						if(Result==0)//如果出现错误
						{
							//报警
							ErrorNum_YOpen[Num]++;
							Status_Plc=false;


						}
						else
						{
							Status_Plc=true;
							ErrorNum_YOpen[Num]=0;
						}
						break;
					}
				case 12:			//Y关闭
					{
						char tm[2];
						tm[0]=str_Command.GetAt(11);
						tm[1]=str_Command.GetAt(12);
						unsigned short Num=atoi(tm);
						unsigned short Num_Dis=Num;
						if(Num>=10)
							Num-=2;

						int Result=GetPlc_Data(tmp,length);
						if(Result==0)//如果出现错误
						{		
							ErrorNum_YClose[Num]++;
							Status_Plc=false;

						}
						else
						{
							Status_Plc=true;
							ErrorNum_YClose[Num]=0;
						}
						break;
					}


				case 14://测试plc通信是否正常
					{
						int Result=TestPlc(tmp,length);
						if(Result==0)
						{
							Status_Plc=false;
							ErrorNum_PlcTT++;
						}
						else 
						{
							ErrorNum_PlcTT=0;
							Status_Plc=true;
						}
						break;
					}
				case 15://获取X的状态
					{
						int Result=GetPlc_Status_X(tmp,length);
						
						if(Result==0)
						{
							Status_Plc=false;
							ErrorNum_Status_X++;



						}
						else 
						{
							Status_Plc=true;
							ErrorNum_Status_X=0;//重新归零
						}
						
						break;
					}
				case 16://获取Y的状态
					{
						int Result=GetPlc_Status_Y(tmp,length);

						if(Result==0)
						{
							Status_Plc=false;
							ErrorNum_Status_Y++;
							
						}
						else 
						{
							Status_Plc=true;
							ErrorNum_Status_Y=0;
						}
						
						break;
					}

				default:
						break;

		}
	}

	return Rslt;
}

//得到Plc的值
int CPLCDlg::GetPlc_Data(unsigned char data[],int length)
{
	int Result=0;
	unsigned char RecStdData[5]={0X06,0X30,0X31,0X46,0X46};

	if(length!=5)
		return Result;

	for(int i=0;i<length;i++)
	{
		unsigned char a=data[i];
		unsigned char b=RecStdData[i];
		if(a!=b)
			return Result;
	}

	Result=1;
	return Result;
}

//监测plc是否运行
//0-------没有成功运行
//1-------成功执行了运行命令
//2-------plc已经在运行了.
int CPLCDlg::DetectPlcRun(unsigned char data[], int length)
{
	int Result=0;
	unsigned char RecStdData[5]={0X06,0X30,0X31,0X46,0X46};
	if(length<5)
		return Result;

	if(length==7)
	{
		Result=2;//已经运行了.
		return Result;
	}


	for(int i=0;i<length;i++)
	{
		unsigned char a=data[i];
		unsigned char b=RecStdData[i];
		if(a!=b)
			return Result;//没有运行
	}

	Result=1;//执行了运行命令
	return Result;

}


int CPLCDlg::TestPlc(unsigned char data[],int length)
{
	int Result=0;

	for(int i=0;i<6;i++)
	{
		unsigned char RecD=data[7+i];
		unsigned char StdD=Plc_TT[10+i];
		if(RecD!=StdD)
		{
			return Result;
			break;
		}
	}
	Result=1;
	return Result;
}


int CPLCDlg::GetPlc_Status_X(unsigned char data[], int length)
{
	int Result=0;

	if(length!=42)
		return Result;

/*
好像没有多大必要逐位判断
	unsigned char RecStdData[5]={0X02,0X30,0X31,0X46,0X46};
    for(int i=0;i<5;i++)
	{
		unsigned char RecD=data[i];
		unsigned char StdD=RecStdData[i];
		if(RecD!=StdD)
		{
			return Result;
			break;
		}
	}
*/

	for(int i=0;i<24;i++)
		Status_Plc_X[i]=data[i+5]-0X30;




	Result=1;
	return Result;
}
int CPLCDlg::GetPlc_Status_Y(unsigned char data[], int length)
{
	int Result=0;
	unsigned char RecStdData[5]={0X02,0X30,0X31,0X46,0X46};

	
    for(int i=0;i<5;i++)
    {
		unsigned char RecD=data[i];
		unsigned char StdD=RecStdData[i];
		if(RecD!=StdD)
		{
			return Result;
			break;
		}
	}

	for(i=0;i<32;i++)
	{
		Status_Plc_Y[i]=data[i+5]-0X30;
		Status_PLCY.Insert(i,Status_Plc_Y[i]);
	}
	
	

	Result=1;
	return Result;
}







/*

以下为按钮事件





*/





//运行
void CPLCDlg::OnRun() 
{
	iRun = !iRun; 
	
	if(iRun == FALSE)	
	{ 
//		m_Run.SetIcon(IDI_DOBYMAN);
		SetDlgItemText(IDC_RUN,_T("运行"));
		AddCommand(Plc_Run,8,5,9,1,0);//plc运行
	} 
	else						
	{ 
		SetDlgItemText(IDC_RUN,_T("停止"));
//		m_AutoRun.SetIcon(IDI_AUTO);

		AddCommand(Plc_Stp,8,5,10,1,0);
	} 
	
}
//顺序执行,先开后关
void CPLCDlg::OnShunxu() 
{
/*	for(int No=0;No<16;No++)
	{
		AddCommand(YOpen[No],16,5,11,1,0);
		AddCommand(YClose[No],16,5,12,1,0);
	}
*/
	InitCommand();

	
}


//全关
void CPLCDlg::OnCloseall() 
{

	AddCommand(Command_CloseAll,31,5,18,1,0);

}

//全开
void CPLCDlg::OnOpenall() 
{
	AddCommand(Command_OpenAll,31,5,17,1,0);
	
}



		




void CPLCDlg::OnBtnY00() 
{
	if(Status_Plc_Y[0]==0)
		AddCommand(YOpen[0],16,5,11,1,0);
	else
		AddCommand(YClose[0],16,5,12,1,0);

}
void CPLCDlg::OnBtnY01() 
{
	if(Status_Plc_Y[1]==0)
		AddCommand(YOpen[1],16,5,11,1,0);
	else
		AddCommand(YClose[1],16,5,12,1,0);
	
}
void CPLCDlg::OnBtnY02() 
{
	if(Status_Plc_Y[2]==0)
		AddCommand(YOpen[2],16,5,11,1,0);
	else
		AddCommand(YClose[2],16,5,12,1,0);
	
}
void CPLCDlg::OnBtnY03() 
{
	if(Status_Plc_Y[3]==0)
		AddCommand(YOpen[3],16,5,11,1,0);
	else
		AddCommand(YClose[3],16,5,12,1,0);
	
}
void CPLCDlg::OnBtnY04() 
{
	if(Status_Plc_Y[4]==0)
		AddCommand(YOpen[4],16,5,11,1,0);
	else
		AddCommand(YClose[4],16,5,12,1,0);
	
}
void CPLCDlg::OnBtnY05() 
{
	if(Status_Plc_Y[5]==0)
		AddCommand(YOpen[5],16,5,11,1,0);
	else
		AddCommand(YClose[5],16,5,12,1,0);
	
}
void CPLCDlg::OnBtnY06() 
{
	if(Status_Plc_Y[6]==0)
		AddCommand(YOpen[6],16,5,11,1,0);
	else
		AddCommand(YClose[6],16,5,12,1,0);
	
}
void CPLCDlg::OnBtnY07() 
{
	if(Status_Plc_Y[7]==0)
		AddCommand(YOpen[7],16,5,11,1,0);
	else
		AddCommand(YClose[7],16,5,12,1,0);
}

void CPLCDlg::OnBtnY10() 
{
	if(Status_Plc_Y[8]==0)
		AddCommand(YOpen[8],16,5,11,1,0);
	else
		AddCommand(YClose[8],16,5,12,1,0);
	
}
void CPLCDlg::OnBtnY11() 
{
	if(Status_Plc_Y[9]==0)
		AddCommand(YOpen[9],16,5,11,1,0);
	else
		AddCommand(YClose[9],16,5,12,1,0);
	
}
void CPLCDlg::OnBtnY12() 
{
	if(Status_Plc_Y[10]==0)
		AddCommand(YOpen[10],16,5,11,1,0);
	else
		AddCommand(YClose[10],16,5,12,1,0);
	
}
void CPLCDlg::OnBtnY13() 
{
	if(Status_Plc_Y[11]==0)
		AddCommand(YOpen[11],16,5,11,1,0);
	else
		AddCommand(YClose[11],16,5,12,1,0);
	
}
void CPLCDlg::OnBtnY14() 
{
	if(Status_Plc_Y[12]==0)
		AddCommand(YOpen[12],16,5,11,1,0);
	else
		AddCommand(YClose[12],16,5,12,1,0);
	
}
void CPLCDlg::OnBtnY15() 
{
	if(Status_Plc_Y[13]==0)
		AddCommand(YOpen[13],16,5,11,1,0);
	else
		AddCommand(YClose[13],16,5,12,1,0);
	
}
void CPLCDlg::OnBtnY16() 
{
	if(Status_Plc_Y[14]==0)
		AddCommand(YOpen[14],16,5,11,1,0);
	else
		AddCommand(YClose[14],16,5,12,1,0);
	
}
void CPLCDlg::OnBtnY17() 
{
	if(Status_Plc_Y[15]==0)
		AddCommand(YOpen[15],16,5,11,1,0);
	else
		AddCommand(YClose[15],16,5,12,1,0);
	
}

⌨️ 快捷键说明

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