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

📄 agvmonitordlg.cpp

📁 AGV小车上位机控制程序,通过TCP/IP协议来进行数据的传送
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	NewPath.Add(strItem);
	NewPath.Add(gbAGVStopMode[StopManual]);
	NewPath.Add(gbRollerRollingMode[RollingNot]);
	SourceStation=ChainStation01ID;
	m_AGVPathList.AddItem(&NewPath);
	for(i=0;i<2;i++)
	{
		NewPath.RemoveAll();
		strItem.Format("%d",SourceStation);
		NewPath.Add(strItem);
		strItem.Format("%d",SourceStation+1);
		NewPath.Add(strItem);
		NewPath.Add(gbAGVStopMode[StopManual]);
		NewPath.Add(gbRollerRollingMode[RollingNot]);
		SourceStation++;
		m_AGVPathList.AddItem(&NewPath);
	}
	NewPath.RemoveAll();
	strItem.Format("%d",SourceStation);
	NewPath.Add(strItem);
	strItem.Format("%d",SourceStation+1);
	NewPath.Add(strItem);
	NewPath.Add(gbAGVStopMode[StopEnd]);
	NewPath.Add(gbRollerRollingMode[RollingNot]);
	m_AGVPathList.AddItem(&NewPath);
}

void CAGVMonitorDlg::OnAddDestinationStation() 
{
	byte i;
	byte TotalPath;
	byte LastDestinationStationID=gbAGVNowStation;
	CStringArray NewPath;
	CString strItem;
	if(gbAGVNowStation<MinAGVStationID)
	{
		AfxMessageBox("无法获知当前AGV位置,请进行AGV初始位置设置!");
		return;
	}
	if(GetDlgItem(IDC_DestinationStation)->IsWindowEnabled()==TRUE)
		if(((CComboBox *)GetDlgItem(IDC_DestinationStation))->GetCurSel()<0)
		{
			AfxMessageBox("请选择目的站号!");
			return;
		}
	if(GetDlgItem(IDC_AGVStopMode)->IsWindowEnabled()==TRUE)
		if(((CComboBox *)GetDlgItem(IDC_AGVStopMode))->GetCurSel()<0)
		{
			AfxMessageBox("请选择停靠模式!");
			return;
		}
	if(GetDlgItem(IDC_RollerRollingMode)->IsWindowEnabled()==TRUE)
		if(((CComboBox *)GetDlgItem(IDC_RollerRollingMode))->GetCurSel()<0)
		{
			AfxMessageBox("请选择滚筒运送模式!");
			return;
		}
	TotalPath=m_AGVPathList.GetItemCount();
	if(TotalPath>=255)
	{
		AfxMessageBox("最多允许255条路线信息!");
		return;
	}
	for(i=0;i<TotalPath;i++)
		if(strcmp((char *)(LPCSTR)m_AGVPathList.GetItemText(i,2),gbAGVStopMode[StopEnd])==0)
		{
			AfxMessageBox("路线表已存在终点停靠,无法增加目的站!");
			return;
		}
	if(TotalPath>0)
		LastDestinationStationID=atoi((char *)(LPCSTR)m_AGVPathList.GetItemText(TotalPath-1,1));
	if(((CComboBox *)GetDlgItem(IDC_DestinationStation))->GetCurSel()+MinAGVStationID==LastDestinationStationID)
	{
		AfxMessageBox("目的站与起始站不能相同!");
		return;
	}
	strItem.Format("%d",LastDestinationStationID);
	NewPath.Add(strItem);
	strItem.Format("%d",((CComboBox *)GetDlgItem(IDC_DestinationStation))->GetCurSel()+MinAGVStationID);
	NewPath.Add(strItem);
	GetDlgItem(IDC_AGVStopMode)->GetWindowText(strItem);
	NewPath.Add(strItem);
	if(GetDlgItem(IDC_RollerRollingMode)->IsWindowEnabled()==TRUE)
	{
		GetDlgItem(IDC_RollerRollingMode)->GetWindowText(strItem);
		NewPath.Add(strItem);
	}
	else
		NewPath.Add(gbRollerRollingMode[RollingNot]);
	m_AGVPathList.AddItem(&NewPath);
}

void CAGVMonitorDlg::OnAGVConnect() 
{
	WORD wVersionRequested;
	WSADATA wsadata;
	SOCKADDR_IN addrSrv;
	CString AGVIP;
	CTimeCounter ConnectTimeOut;
	if(gbAGVNowStation<MinAGVStationID)
	{
		AfxMessageBox("无法获知当前AGV位置,请进行AGV初始位置设置!");
		return;
	}
	GetDlgItem(IDC_AGVIP)->GetWindowText(AGVIP);
	GetDlgItem(IDC_AGVConnect)->EnableWindow(FALSE);
	GetDlgItem(IDC_ModifyAGVIP)->EnableWindow(FALSE);
	if(AGVIP=="0.0.0.0")
	{
		MessageBox("请设置AGV网络地址","错误",MB_OK|MB_ICONWARNING);
		GetDlgItem(IDC_AGVConnect)->EnableWindow(TRUE);
		GetDlgItem(IDC_ModifyAGVIP)->EnableWindow(TRUE);
		return;
	}
	wVersionRequested=MAKEWORD(1,1);
	if(WSAStartup(wVersionRequested,&wsadata)!=0)
	{
		MessageBox("启动TCPIP连接出错","错误",MB_OK|MB_ICONWARNING);
		//AfxMessageBox("contempary",MB_OK,0);
		GetDlgItem(IDC_AGVConnect)->EnableWindow(TRUE);
		GetDlgItem(IDC_ModifyAGVIP)->EnableWindow(TRUE);
		return;
	}
	if(LOBYTE(wsadata.wVersion)!=1||HIBYTE(wsadata.wVersion)!=1)
	{
		MessageBox("启动TCPIP连接出错","错误",MB_OK|MB_ICONWARNING);
		WSACleanup();
		GetDlgItem(IDC_AGVConnect)->EnableWindow(TRUE);
		GetDlgItem(IDC_ModifyAGVIP)->EnableWindow(TRUE);
		return;
	}
	gbAGVSocket=socket(AF_INET,SOCK_STREAM,0);
	if(gbAGVSocket==INVALID_SOCKET)
	{
		MessageBox("启动TCPIP连接出错","错误",MB_OK|MB_ICONWARNING);
		WSACleanup();
		GetDlgItem(IDC_AGVConnect)->EnableWindow(TRUE);
		GetDlgItem(IDC_ModifyAGVIP)->EnableWindow(TRUE);
		return;
	}	
	addrSrv.sin_addr.S_un.S_addr=inet_addr((char *)(LPCTSTR)AGVIP);
	addrSrv.sin_family=AF_INET;
	addrSrv.sin_port=htons(AGVTCPIPPort);
 	if(WSAAsyncSelect(gbAGVSocket,m_hWnd,WM_Connected,FD_CONNECT)==SOCKET_ERROR) 
	{
  		MessageBox("套接字设置失败","错误",MB_OK|MB_ICONWARNING);
		WSACleanup();
		GetDlgItem(IDC_AGVConnect)->EnableWindow(TRUE);
		GetDlgItem(IDC_ModifyAGVIP)->EnableWindow(TRUE);
 		return;
 	}
	gbAGVConnecting=true;
	connect(gbAGVSocket,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
	ConnectTimeOut.Begin();
	for(;;)
	{
		if(gbAGVConnected==true)
			break;
		ProcessMessage();
		if(ConnectTimeOut.End()>3000)
		{
			MessageBox("连接AGV超时","提示",MB_OK|MB_ICONWARNING);
			GetDlgItem(IDC_AGVConnect)->EnableWindow(TRUE);
			GetDlgItem(IDC_ModifyAGVIP)->EnableWindow(TRUE);
			closesocket(gbAGVSocket);
			break;
		}
	}		
	gbAGVConnecting=false;
}

void CAGVMonitorDlg::ProcessMessage()
{
	MSG msg;
	if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
	{
		GetMessage(&msg,NULL,0,0); 
		TranslateMessage(&msg); 
		DispatchMessage(&msg); 
	}
}

LRESULT CAGVMonitorDlg::OnConnected(WPARAM wParam, LPARAM lParam)
{
	if(WSAGETSELECTERROR(lParam))
		return 0;
	if(WSAGETSELECTEVENT(lParam)==FD_CONNECT)
	{
		gbAGVConnected=true;
		WSAAsyncSelect(gbAGVSocket,m_hWnd,WM_ReadData,FD_READ|FD_CLOSE);
		GetDlgItem(IDC_AGVDisconnect)->EnableWindow(TRUE);
		GetDlgItem(IDC_ExecutePathList)->EnableWindow(TRUE);
		m_AGVOnline_LED.TurnOn(TRUE);
		GetDlgItem(IDC_SettingAGVNowStation)->EnableWindow(FALSE);
		GetDlgItem(IDC_AGVNowStation)->EnableWindow(FALSE);
	}
	return 0;
}

LRESULT CAGVMonitorDlg::OnReadData(WPARAM wParam, LPARAM lParam)
{
	byte Readbuf[255];
	byte ValidDataLen,i;
	if(WSAGETSELECTERROR(lParam))
		return 0;
	if(WSAGETSELECTEVENT(lParam)==FD_READ)
	{
		ValidDataLen=recv(gbAGVSocket,(char *)Readbuf,255,0);
		for(i=0;i<ValidDataLen;i++)
			gbAGVACKData.Add(Readbuf[i]);
	}
	if(WSAGETSELECTEVENT(lParam)==FD_CLOSE)
	{
		closesocket(gbAGVSocket);
		gbAGVConnected=false;
		GetDlgItem(IDC_AGVConnect)->EnableWindow(TRUE);
		GetDlgItem(IDC_ModifyAGVIP)->EnableWindow(TRUE);
		GetDlgItem(IDC_AGVDisconnect)->EnableWindow(FALSE);
		GetDlgItem(IDC_ExecutePathList)->EnableWindow(FALSE);
		m_AGVOnline_LED.TurnOn(FALSE);
		m_AGVWorking_LED.TurnOn(FALSE);
		GetDlgItem(IDC_SettingAGVNowStation)->EnableWindow(TRUE);
		GetDlgItem(IDC_AGVNowStation)->EnableWindow(TRUE);
		m_AGVPathList.DeleteAllItems();
		GetDlgItem(IDC_AddDestinationStation)->EnableWindow(TRUE);
		GetDlgItem(IDC_EmptyAGVPathList)->EnableWindow(TRUE);
		GetDlgItem(IDC_AGVOutGoodsTransport)->EnableWindow(TRUE);
		GetDlgItem(IDC_AGVInGoodsTransport)->EnableWindow(TRUE);
		GetDlgItem(IDC_AGVGoCarbarn)->EnableWindow(TRUE);
		GetDlgItem(IDC_AGVSupplyTransport)->EnableWindow(TRUE);
		GetDlgItem(IDC_ExecutePathList)->EnableWindow(TRUE);
	}
	return 0;
}

void CAGVMonitorDlg::OnAGVDisconnect() 
{
	if(m_AGVWorking_LED.IsLEDOn()==TRUE)
	{
		AfxMessageBox("AGV运送中,禁止断开AGV连接!");
		return;
	}
	closesocket(gbAGVSocket);
	gbAGVConnected=false;
	GetDlgItem(IDC_AGVConnect)->EnableWindow(TRUE);
	GetDlgItem(IDC_ModifyAGVIP)->EnableWindow(TRUE);
	GetDlgItem(IDC_AGVDisconnect)->EnableWindow(FALSE);
	GetDlgItem(IDC_ExecutePathList)->EnableWindow(FALSE);
	m_AGVOnline_LED.TurnOn(FALSE);
	m_AGVWorking_LED.TurnOn(FALSE);
	GetDlgItem(IDC_SettingAGVNowStation)->EnableWindow(TRUE);
	GetDlgItem(IDC_AGVNowStation)->EnableWindow(TRUE);
	m_AGVPathList.DeleteAllItems();
	GetDlgItem(IDC_AddDestinationStation)->EnableWindow(TRUE);
	GetDlgItem(IDC_EmptyAGVPathList)->EnableWindow(TRUE);
	GetDlgItem(IDC_AGVOutGoodsTransport)->EnableWindow(TRUE);
	GetDlgItem(IDC_AGVInGoodsTransport)->EnableWindow(TRUE);
	GetDlgItem(IDC_AGVGoCarbarn)->EnableWindow(TRUE);
	GetDlgItem(IDC_AGVSupplyTransport)->EnableWindow(TRUE);
	GetDlgItem(IDC_ExecutePathList)->EnableWindow(TRUE);
}

void CAGVMonitorDlg::OnClose() 
{
	if(gbAGVConnecting==true)
	{
		MessageBox("正在与AGV连线中","提示",MB_OK|MB_ICONWARNING);
		return;
	}
	if(MessageBox("是否退出AGVMonitor?","退出",MB_YESNO|MB_ICONQUESTION)==IDNO)
		return;
	closesocket(gbAGVSocket);
	KillTimer(1);
	CDialog::OnClose();
}

void CAGVMonitorDlg::OnTimer(UINT nIDEvent) 
{
	if(nIDEvent==1)
	{
		int AGVACKDataLen,i;
		AGVACKDataLen=gbAGVACKData.GetSize();
		if(AGVACKDataLen>0)
		{
			for(i=0;i<AGVACKDataLen;i++)//Find PACK_HEAD
				if(gbAGVACKData.GetAt(i)==PACK_HEAD)
				{
					if(i>0)
						gbAGVACKData.RemoveAt(0,i);
					break;
				}
			AGVACKDataLen=gbAGVACKData.GetSize();
			for(i=0;i<AGVACKDataLen;i++)//Find PACK_HEAD
				if(gbAGVACKData.GetAt(i)==PACK_END)
				{
					if(i<2)//Pack just contain PACK_HEAD and PACK_HEAD
						gbAGVACKData.RemoveAt(0,i+1);
					else
					{
						switch(gbAGVACKData.GetAt(1))
						{
							case ACK_STATION:
								if(i>2)
									if(gbAGVACKData.GetAt(2)>=MinAGVStationID&&gbAGVACKData.GetAt(2)<=MaxAGVStationID)
									{
										gbAGVNowStation=gbAGVACKData.GetAt(2);
										ChangeStationLED(gbAGVACKData.GetAt(2));
									}
								break;
							case ACK_ENDTASK:
								m_AGVWorking_LED.TurnOn(FALSE);
								GetDlgItem(IDC_AddDestinationStation)->EnableWindow(TRUE);
								GetDlgItem(IDC_EmptyAGVPathList)->EnableWindow(TRUE);
								GetDlgItem(IDC_AGVOutGoodsTransport)->EnableWindow(TRUE);
								GetDlgItem(IDC_AGVInGoodsTransport)->EnableWindow(TRUE);
								GetDlgItem(IDC_AGVGoCarbarn)->EnableWindow(TRUE);
								GetDlgItem(IDC_AGVSupplyTransport)->EnableWindow(TRUE);
								GetDlgItem(IDC_ExecutePathList)->EnableWindow(TRUE);
								m_AGVPathList.DeleteAllItems();
								break;
							case DisConnect:
								closesocket(gbAGVSocket);
								gbAGVConnected=false;
								GetDlgItem(IDC_AGVConnect)->EnableWindow(TRUE);
								GetDlgItem(IDC_ModifyAGVIP)->EnableWindow(TRUE);
								GetDlgItem(IDC_AGVDisconnect)->EnableWindow(FALSE);
								GetDlgItem(IDC_ExecutePathList)->EnableWindow(FALSE);
								m_AGVOnline_LED.TurnOn(FALSE);
								m_AGVWorking_LED.TurnOn(FALSE);
								GetDlgItem(IDC_SettingAGVNowStation)->EnableWindow(TRUE);
								GetDlgItem(IDC_AGVNowStation)->EnableWindow(TRUE);
								m_AGVPathList.DeleteAllItems();
								GetDlgItem(IDC_AddDestinationStation)->EnableWindow(TRUE);
								GetDlgItem(IDC_EmptyAGVPathList)->EnableWindow(TRUE);
								GetDlgItem(IDC_AGVOutGoodsTransport)->EnableWindow(TRUE);
								GetDlgItem(IDC_AGVInGoodsTransport)->EnableWindow(TRUE);
								GetDlgItem(IDC_AGVGoCarbarn)->EnableWindow(TRUE);
								GetDlgItem(IDC_AGVSupplyTransport)->EnableWindow(TRUE);
								GetDlgItem(IDC_ExecutePathList)->EnableWindow(TRUE);
								break;
							default:
								break;
						}
						gbAGVACKData.RemoveAt(0,i+1);
						break;
					}
				}
		}
	}
	CDialog::OnTimer(nIDEvent);
}

void CAGVMonitorDlg::OnExecutePathList() 
{
	byte TotalPath,i;
	_TCPIPPackType_ SendData;
	_AGVPathType_ AGVPath;
	if(m_AGVOnline_LED.IsLEDOn()==FALSE)
	{
		AfxMessageBox("AGV未联线!");
		return;
	}
	if(m_AGVWorking_LED.IsLEDOn()==TRUE)
	{
		AfxMessageBox("AGV运送中!");
		return;
	}
	TotalPath=m_AGVPathList.GetItemCount();
	if(TotalPath<=0)
	{
		AfxMessageBox("无法执行空的路线表!");
		return;
	}
	if(m_AGVPathList.GetItemText(TotalPath-1,2)!=gbAGVStopMode[StopEnd])
	{
		AfxMessageBox("最后一条路线停靠模式必须为:终点停靠!");
		return;
	}
	//Set AGV Speed
	SendData.PackHead=PACK_HEAD;
	SendData.PackType=SET_AGVSPEED;
	SendData.PackData.RemoveAll();
	SendData.PackData.Add(2);
	SendData.PackEnd=PACK_END;
	SendPack(SendData);
	//Set AGV Path
	for(i=0;i<TotalPath;i++)
	{
		AGVPath.LineID=1; //2008.02.19需要增加导引线号
		if(atoi((char *)(LPCSTR)m_AGVPathList.GetItemText(i,0))<atoi((char *)(LPCSTR)m_AGVPathList.GetItemText(i,1)))
			AGVPath.Dir=AGVMoveForward;
		else
			AGVPath.Dir=AGVMoveBack;
		AGVPath.StopStationID=(byte)atoi((char *)(LPCSTR)m_AGVPathList.GetItemText(i,1));
		if(m_AGVPathList.GetItemText(i,2)==gbAGVStopMode[StopAuto])
			AGVPath.ContinueRunningMode=StopAuto;
		if(m_AGVPathList.GetItemText(i,2)==gbAGVStopMode[StopManual])
			AGVPath.ContinueRunningMode=StopManual;
		if(m_AGVPathList.GetItemText(i,2)==gbAGVStopMode[StopEnd])
			AGVPath.ContinueRunningMode=StopEnd;
		if(m_AGVPathList.GetItemText(i,3)==gbRollerRollingMode[RollingNot])
			AGVPath.RollerRollingDir=RollingNot;
		if(m_AGVPathList.GetItemText(i,3)==gbRollerRollingMode[RollingLeft])
			AGVPath.RollerRollingDir=RollingLeft;
		if(m_AGVPathList.GetItemText(i,3)==gbRollerRollingMode[RollingRight])
			AGVPath.RollerRollingDir=RollingRight;
		SendData.PackHead=PACK_HEAD;
		SendData.PackType=SET_PATHDATA;
		SendData.PackData.RemoveAll();
		SendData.PackData.Add(AGVPath.LineID);
		SendData.PackData.Add(AGVPath.Dir);
		SendData.PackData.Add(AGVPath.StopStationID);
		SendData.PackData.Add(AGVPath.ContinueRunningMode);
		SendData.PackData.Add(AGVPath.RollerRollingDir);
		SendData.PackEnd=PACK_END;
		SendPack(SendData);
	}
	//Set AGV Runing
	SendData.PackHead=PACK_HEAD;
	SendData.PackType=SET_AGVRUNNING;
	SendData.PackData.RemoveAll();
	SendData.PackEnd=PACK_END;
	SendPack(SendData);
	m_AGVWorking_LED.TurnOn(TRUE);
	GetDlgItem(IDC_AddDestinationStation)->EnableWindow(FALSE);
	GetDlgItem(IDC_EmptyAGVPathList)->EnableWindow(FALSE);
	GetDlgItem(IDC_AGVOutGoodsTransport)->EnableWindow(FALSE);
	GetDlgItem(IDC_AGVInGoodsTransport)->EnableWindow(FALSE);
	GetDlgItem(IDC_AGVGoCarbarn)->EnableWindow(FALSE);
	GetDlgItem(IDC_AGVSupplyTransport)->EnableWindow(FALSE);
	GetDlgItem(IDC_ExecutePathList)->EnableWindow(FALSE);
}

void CAGVMonitorDlg::SendPack(_TCPIPPackType_ &SendData)
{
	int PackLen,i;
	char *PackData;
	PackLen=SendData.PackData.GetSize()+3;//PackHead,PackType,PackEnd
	PackData=new char[PackLen];
	PackData[0]=SendData.PackHead;
	PackData[1]=SendData.PackType;
	for(i=0;i<SendData.PackData.GetSize();i++)
		PackData[2+i]=SendData.PackData.GetAt(i);
	PackData[i+2]=SendData.PackEnd;
	send(gbAGVSocket,PackData,PackLen,0);
}

⌨️ 快捷键说明

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