📄 agvmonitordlg.cpp
字号:
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 + -