1 AGV系统概述
AGV原理
AGV行走控制系统由控制面板、导向传感器、方向电位器、状态指示灯、避障传感器、光电控制信号传感器、驱动单元、导引磁条、电源组成。
AGV的导引(Guidance)是指根据AGV导向传感器(Navigation)所得到的位置信息,按AGV的路径所提供的目标值计算出AGV的实际控制命令值,即给出AGV的设定速度和转向角,这是AGV 控制技术的关键。简而言之,AGV的导引控制就是AGV轨迹跟踪。
AGV导引有多种方法,比如说利用导向传感器的中心点作为参考点,追踪引导磁条上的虚拟点就是其中的一种。AGV的控制目标就是通过检测参考点与虚拟点的相对位置,修正驱动轮的转速以改变AGV的行进方向,尽力让参考点位于虚拟点的上方。这样AGV就能始终跟踪引导线运行。
AGV大体上用于以下三个方面:
1.物料搬运
在工业现场AGV常用于工位间或自动仓库与工位间的物料搬运作业。例如在组装线上,AGV从自动仓库取出机器零件并送到相应的组装工位。又如在柔性加工系统中,AGV依照加工工序顺次将被加工工件送到相应自动机床进行加工,加工好的零件由AGV送到质检站测,最后合格品送到半成品库。
2.移动工作台
在组装或柔性加工系统中AGV常作为移动工作台使用。以欧美一些汽车厂为例,在轿车组装过程中从汽车底盘焊装组立、安装悬挂系统、车轮和制动系统、安装发动机、变速箱、离合器、安装转向系统、安装汽车外壳、安装风档玻璃和座椅到整车配电等一系列组装过程都是在一台AGV上进行的。又如在欧美一些柴油机厂中,柴油机一系列的组装过程也都是在一台AGV上完成的。
3.与机器人或机器手配合在特殊工作环境下代替人工作业
在AGV上可以安装机器人或机器手,在特殊工作环境下代替人工作业。例如在核电站中代替人在具有放射线的工作环境下进行遥控作业。
2、AGV上位机部分
以C++代码编写,通过RS232与AGV网关通讯,内置AGV调度控制逻辑以及算法,通过以太网连接至MES系统,达到对AGV定点控制,路径规划监控。
AGV的系统拓扑图大致如下:
3、AGV控制代码的编写和分析
串口通讯代码编写设置串口号,并选择波特率为115200
void CMainDlg::OnBtnSerialPort() // 左上角icon按钮
{
if (simpleCom->IsOpen())
{
simpleCom->Close();
}
else
{
SComboBox* pComboBox = FindChildByName2<SComboBox>(L"cbx_test");
int nItem = pComboBox->GetCurSel();
if (nItem == -1)
return;
int data = pComboBox->GetItemData(nItem);
simpleCom->Open(data, 115200);
}
bool bOpen = simpleCom->IsOpen();
SWindow *pButton = FindChildByName(L"btn_serialport");
if (bOpen)
{
pButton->SetWindowTextW(L"已连接");
}
else
{
pButton->SetWindowTextW(L"连接");
}
}
/**************************/
//判断串口是否连接
bool bOpen = simpleCom->IsOpen();
SWindow *pButton = FindChildByName(L"btn_serialport");
if (bOpen)
{
pButton->SetWindowTextW(L"已连接");
}
else
{
pButton->SetWindowTextW(L"连接");
}
m_bLayoutInited = TRUE;
return 0;
}
按键相应控制
/**************************/
//AGV前进响应函数
void CMainDlg::OnBtnMoveFront()
{
//判断串口是否已连接
bool bOpen = simpleCom->IsOpen();
if (bOpen == false)
{
ShowMessageBox(L"请连接串口");
return;
}
int flag = 1;
SEdit* pComboBox = FindChildByName2<SEdit>(L"edt_agvinfo");//找到控件
int agvid = _ttoi(pComboBox->GetWindowTextW());//转换为ID号
SSliderBar* pSliderBar = FindChildByName2<SSliderBar>(L"slider_test");//找到控件
int value = pSliderBar->GetValue();
int left = 0;
int right = 0;
switch (flag)
{
case 1:
left = right = value;
break;
case 2:
left = value;
break;
case 3:
right = value;
break;
case 4:
left = right = (value*-1);
break;
default:
break;
}
simpleRobot->cmdRemoteMode(agvid, left, right);
}