zoukankan
html css js c++ java
DMC运动控制器
DMC_21x3控制器,Galil
连接控制器代码
void
CREBot6VDlg::OnButtonConnectController()
{
/**/
///
连接运动控制器,并作初始化
///
DCM2163 controller object
CDMCWin m_DMCWin;
CDMCWinRegistry DMCWinRegistry;
GALILREGISTRY galilregistry;
/**/
///
判断运动控制器是否注册
if
(DMCWinRegistry.GetGalilRegistryInfo(m_nController,
&
galilregistry)
!=
0
)
{
//
SetDlgItemText(IDC_EDIT_SYS_MSG,"请先使用DMC smart Terminal软件正确设置DMC2163运动控制器!");
ShowInfo(
"
请先使用DMC smart Terminal软件正确设置DMC2163运动控制器!
"
,ICON_ALERT);
return
;
}
if
(galilregistry.fControllerType
!=
ControllerTypeEthernet
||
strcmp(galilregistry.szModel,
"
DMC-21x3/2
"
)
!=
0
)
{
ShowInfo(
"
请先使用DMC smart Terminal软件正确设置DMC2163运动控制器!并且使用以太网通讯!
"
,ICON_ALERT);
//
SetDlgItemText(IDC_EDIT_SYS_MSG,"请先使用DMC smart Terminal软件正确设置DMC2163运动控制器!并且使用以太网通讯!");
return
;
}
/**/
///
初始化运动控制器,设置为在注册表中第一个运动控制器
m_DMCWin.SetController(m_nController);
m_DMCWin.SethWnd(GetSafeHwnd());
/**/
///
打开和DMC运动控制器间的连接
m_DMCWin.Open();
CString TempString;
if
(m_DMCWin.IsConnected())
{
TempString
=
"
已经连接:
"
;
if
(m_DMCWin.GetVersion(szResponse,
sizeof
(szResponse))
==
0
)
{
//
SetDlgItemText(IDC_EDIT_SYS_MSG,TempString);
TempString
+=
szResponse;
ShowInfo(TempString,ICON_INFO);
}
((CStatic
*
)GetDlgItem(IDC_STATIC_COMU_STATUS))
->
SetIcon(AfxGetApp()
->
LoadIcon(IDI_ICON_ROBOT_READY));
}
else
{
/**/
///
返回错误信息
m_DMCWin.GetErrorText(m_DMCWin.GetLastError(),szResponse,
sizeof
(szResponse));
TempString
=
"
连接运动控制器失败:
"
;
TempString
+=
szResponse;
//
SetDlgItemText(IDC_EDIT_SYS_MSG,TempString);
ShowInfo(TempString,ICON_ERROR);
return
;
}
GetDlgItem(IDC_BUTTON_CALIBRATE)
->
EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_CONNECT_CONTROLLER)
->
EnableWindow(FALSE);
}
/**/
///
获取运动控制状态线程
char
*
const
COMMAND_GET_AXIS_POS[
18
]
=
{
"
MG_TDA\r
"
,
"
MG_LFA\r
"
,
"
MG_LRA\r
"
,
"
MG_TDB\r
"
,
"
MG_LFB\r
"
,
"
MG_LRB\r
"
,
"
MG_TDC\r
"
,
"
MG_LFC\r
"
,
"
MG_LRC\r
"
,
"
MG_TDD\r
"
,
"
MG_LFD\r
"
,
"
MG_LRD\r
"
,
"
MG_TDE\r
"
,
"
MG_LFE\r
"
,
"
MG_LRE\r
"
,
"
MG_TDF\r
"
,
"
MG_LFF\r
"
,
"
MG_LRF\r
"
}
;
bool
gbGetMotionStatusThreadRunning
=
true
;
DWORD WINAPI threadProc_GetMotionStatus( LPVOID pParam )
{
//
t_Axis *axisArray=(t_Axis *)pParam;
long
rc;
char
szRepaly[
4096
];
int
axisIndex
=
0
;
int
errorOkCount
=
0
;
FILE
*
fdebug
=
fopen(
"
d.txt
"
,
"
wt
"
);
while
(gbGetMotionStatusThreadRunning)
{
::WaitForSingleObject(ghMutexVisit,INFINITE);
//
当ghMutexVisit变成有信号才返回,否则,一直等下去。
for
(axisIndex
=
0
;axisIndex
<
6
;axisIndex
++
)
{
rc
=
m_DMCWin.Command(COMMAND_GET_AXIS_POS[
3
*
axisIndex],szRepaly,
sizeof
(szRepaly));
if
(rc
==
DMCNOERROR)
gCurAxisPulse[axisIndex]
=
atol(szRepaly);
else
if
(rc
==
DMCERROR_TIMEOUT)
gDMCTimeOutCount
++
;
rc
=
m_DMCWin.Command(COMMAND_GET_AXIS_POS[
3
*
axisIndex
+
1
],szRepaly,
sizeof
(szRepaly));
if
(rc
==
DMCNOERROR)
gCurAxisForwardLimit[axisIndex]
=
atoi(szRepaly);
else
if
(rc
==
DMCERROR_TIMEOUT)
gDMCTimeOutCount
++
;
rc
=
m_DMCWin.Command(COMMAND_GET_AXIS_POS[
3
*
axisIndex
+
2
],szRepaly,
sizeof
(szRepaly));
if
(rc
==
DMCNOERROR)
gCurAxisBackwardLimit[axisIndex]
=
atoi(szRepaly);
else
if
(rc
==
DMCERROR_TIMEOUT)
gDMCTimeOutCount
++
;
}
/**/
///
rc = m_DMCWin.Command("MG_BGS\r",szRepaly,sizeof(szRepaly));
if
(gbMotionFinished
==
false
)
{
errorOkCount
=
0
;
for
(axisIndex
=
0
;axisIndex
<
6
;axisIndex
++
)
{
fprintf(fdebug,
"
%d
"
,(
int
)(fabs(gCurAxisPulse[axisIndex]
-
glLIMoveGoalPulse[axisIndex])));
if
(fabs(gCurAxisPulse[axisIndex]
-
glLIMoveGoalPulse[axisIndex])
<
CONTROL_ERROR_PULSE)
errorOkCount
++
;
}
if
(errorOkCount
==
6
)
gbMotionFinished
=
true
;
fprintf(fdebug,
"
\n
"
);
//
lVectroError+=(gCurAxisPulse[axisIndex]-glLIMoveGoalPulse[axisIndex])*(gCurAxisPulse[axisIndex]-glLIMoveGoalPulse[axisIndex]);
//
fprintf(fdebug,"%ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld\n",gCurAxisPulse[0],glLIMoveGoalPulse[0],gCurAxisPulse[1],glLIMoveGoalPulse[1],gCurAxisPulse[2],glLIMoveGoalPulse[2],gCurAxisPulse[3],glLIMoveGoalPulse[3],gCurAxisPulse[4],glLIMoveGoalPulse[4],gCurAxisPulse[5],glLIMoveGoalPulse[5],lVectroError);
//
if(lVectroError<CONTROL_ERROR_PULSE)
//
gbMotionFinished=true;
}
::ReleaseMutex(ghMutexVisit);
Sleep(
20
);
}
fclose(fdebug);
return
0
;
//
thread completed successfully
}
从绝对编码器读取值。机器人零点位置标定
/**/
///
机器人运行前必须至少进行一次标定操作!
void
CREBot6VDlg::OnButtonCalibrate()
{
/**/
///
DMC运动控制器已经设置好
/**/
/*
m_DMCWin.Command(DMC_INIT_COMMAND_SEQ[0],szResponse,sizeof(szResponse));
m_DMCWin.Command(DMC_INIT_COMMAND_SEQ[1],szResponse,sizeof(szResponse));
m_DMCWin.Command(DMC_INIT_COMMAND_SEQ[2],szResponse,sizeof(szResponse));
m_DMCWin.Command(DMC_INIT_COMMAND_SEQ[3],szResponse,sizeof(szResponse));
m_DMCWin.Command(DMC_INIT_COMMAND_SEQ[4],szResponse,sizeof(szResponse));
m_DMCWin.Command(DMC_INIT_COMMAND_SEQ[5],szResponse,sizeof(szResponse));
m_DMCWin.Command(DMC_INIT_COMMAND_SEQ[6],szResponse,sizeof(szResponse));
m_DMCWin.Command(DMC_INIT_COMMAND_SEQ[7],szResponse,sizeof(szResponse));
*/
/**/
///
打开RS232C串口读取绝对编码器值
if
(OpenCommPort(COM1,BAUDRATE_19200)
==
FALSE)
{
AfxMessageBox(
"
打开RS232C通讯端口失败! 标定没有完成!
"
);
return
;
}
int
i;
long
absPulse[
6
];
for
(i
=
1
;i
<=
6
;i
++
)
{
if
(ReadAbsPositonFromRS422(i,absPulse[i
-
1
])
!=
RS422_NOERROR)
{
AfxMessageBox(
"
绝对编码器读取数据失败!
"
);
CloseCommPort();
return
;
}
absPulse[i
-
1
]
=-
absPulse[i
-
1
];
Sleep(
50
);
}
CloseCommPort();
long
rc;
//
DPABS_1,ABS_2,ABS_3,ABS_4,ABS_5,ABS_6
/**/
///
将绝对编码器的值设置为当前运动控制器的规划值和目标值
sprintf(szCommandStr,
"
DP%d,%d,%d,%d,%d,%d\r
"
,absPulse[
0
],absPulse[
1
],absPulse[
2
],absPulse[
3
],absPulse[
4
],absPulse[
5
]);
m_DMCWin.Command(szCommandStr,szResponse,
sizeof
(szResponse));
/**/
///
for stepper mode,set TP pulse
sprintf(szCommandStr,
"
DE%d,%d,%d,%d,%d,%d\r
"
,absPulse[
0
],absPulse[
1
],absPulse[
2
],absPulse[
3
],absPulse[
4
],absPulse[
5
]);
m_DMCWin.Command(szCommandStr,szResponse,
sizeof
(szResponse));
/**/
///
///
从配置文件读取较准原点坐标数据
FILE
*
fin
=
fopen(ORG_SET_FILE_NAME,
"
rt
"
);
if
(fin
==
NULL)
{
AfxMessageBox(
"
打开原点配置文件REOrg.ini失败!\n\n请通过如下步骤执行原点校准:\n\n1.点动调整机器人各个轴位置到标定位置;\n2.点选隐含菜单--保存标定位置;\n3.退出控制程序,重新运行控制程序。
"
);
ShowInfo(
"
运行前必须对机器人绝对位置数据作校准!
"
,ICON_ALERT);
return
;
}
int
readCount
=
0
;
readCount
=
fscanf(fin,
"
%ld %ld %ld %ld %ld %ld
"
,
&
absPulse[
0
],
&
absPulse[
1
],
&
absPulse[
2
],
&
absPulse[
3
],
&
absPulse[
4
],
&
absPulse[
5
]);
if
(readCount
!=
6
)
{
AfxMessageBox(
"
打开原点配置文件REOrg.ini失败!\n\n请通过如下步骤执行原点校准:\n\n1.点动调整机器人各个轴位置到标定位置;\n2.点选隐含菜单--保存标定位置;\n3.退出控制程序,重新运行控制程序。
"
);
ShowInfo(
"
运行前必须对机器人绝对位置数据作校准!
"
,ICON_ALERT);
EnableJOGButtons(TRUE);
fclose(fin);
return
;
}
fclose(fin);
ABS_AXIS_HOME_PULSE[
0
]
=
absPulse[
0
];ABS_AXIS_HOME_PULSE[
1
]
=
absPulse[
1
];ABS_AXIS_HOME_PULSE[
2
]
=
absPulse[
2
];
ABS_AXIS_HOME_PULSE[
3
]
=
absPulse[
3
];ABS_AXIS_HOME_PULSE[
4
]
=
absPulse[
4
];ABS_AXIS_HOME_PULSE[
5
]
=
absPulse[
5
];
if
(MessageBox(
"
机器人将依次运动R,U,L,S,T,B六个轴到达标定零点位姿。\n\n在运动过程中请确保所有人员远离机器人作业范围!\n\n如果机器人运动过程不正常请立刻按下急停按钮!\n\n\n确认机器人可以安全动作了吗?
"
,
"
机器人回标定零点
"
,MB_YESNO
|
MB_ICONQUESTION)
==
IDYES)
{
sprintf(szCommandStr,
"
PA%ld,%ld,%ld,%ld,%ld,%ld\r
"
,ABS_AXIS_HOME_PULSE[
0
],ABS_AXIS_HOME_PULSE[
1
],ABS_AXIS_HOME_PULSE[
2
],ABS_AXIS_HOME_PULSE[
3
],ABS_AXIS_HOME_PULSE[
4
],ABS_AXIS_HOME_PULSE[
5
]);
m_DMCWin.Command(szCommandStr,szResponse,
sizeof
(szResponse));
sprintf(szCommandStr,
"
SP20000,30000,30000,50000,50000,50000\r
"
);
m_DMCWin.Command(szCommandStr,szResponse,
sizeof
(szResponse));
sprintf(szCommandStr,
"
AC100000,100000,100000,100000,100000,100000\r
"
);
m_DMCWin.Command(szCommandStr,szResponse,
sizeof
(szResponse));
sprintf(szCommandStr,
"
DC100000,100000,100000,100000,100000,100000\r
"
);
m_DMCWin.Command(szCommandStr,szResponse,
sizeof
(szResponse));
for
(i
=
3
;i
>=
0
;i
--
)
{
m_DMCWin.Command(AXIS_BY_AXIS_MOVE_COMMAND[i],szResponse,
sizeof
(szResponse));
/**/
///
wait motion complete
while
(
1
)
{
rc
=
m_DMCWin.Command(AXIS_BY_AXIS_MOVE_COMMAND[i
+
6
],szResponse,
sizeof
(szResponse));
//
if(atoi(szResponse)==0)
//
break;
//
if(szResponse[0]=='0')
//
break;
if
(rc
==
DMCNOERROR)
{
if
(atoi(szResponse)
==
0
)
break
;
}
else
if
(rc
==
DMCERROR_TIMEOUT)
gDMCTimeOutCount
++
;
}
}
for
(i
=
4
;i
<=
5
;i
++
)
{
m_DMCWin.Command(AXIS_BY_AXIS_MOVE_COMMAND[i],szResponse,
sizeof
(szResponse));
/**/
///
wait motion complete
while
(
1
)
{
rc
=
m_DMCWin.Command(AXIS_BY_AXIS_MOVE_COMMAND[i
+
6
],szResponse,
sizeof
(szResponse));
//
if(atoi(szResponse)==0)
//
break;
//
if(szResponse[0]=='0')
//
break;
if
(rc
==
DMCNOERROR)
{
if
(atoi(szResponse)
==
0
)
break
;
}
else
if
(rc
==
DMCERROR_TIMEOUT)
gDMCTimeOutCount
++
;
}
}
if
(MessageBox(
"
请确认机器人S,L,U,R,B,T,六个轴准确到达标定零点位姿?
"
,
"
询问
"
,MB_YESNO
|
MB_ICONQUESTION)
==
IDYES)
{
ShowInfo(
"
机器人完成标定检查过程,现在可以正常操作机器人。
"
,ICON_OK);
for
(i
=
0
;i
<
6
;i
++
)
{
sprintf(szCommandStr,
"
FL%c=%ld;BL%c=%ld;\r
"
, (
char
)(
'
A
'
+
i),(
long
)(ABS_AXIS_HOME_PULSE[i]
+
gSoftLimitDegree[
2
*
i
+
1
]
*
gPulsePerDegree[i]),(
char
)(
'
A
'
+
i),(
long
)(ABS_AXIS_HOME_PULSE[i]
+
gSoftLimitDegree[
2
*
i]
*
gPulsePerDegree[i]));
m_DMCWin.Command(szCommandStr,szResponse,
sizeof
(szResponse));
}
}
else
{
AfxMessageBox(
"
机器人绝对原点标定数据不正确!\n\n请通过如下步骤执行原点校准:\n\n1.点动调整机器人各个轴位置到标定位置;\n2.点选隐含菜单--保存标定位置;\n3.退出控制程序,重新运行控制程序。
"
);
ShowInfo(
"
运行前必须对机器人绝对位置数据作校准!
"
,ICON_ALERT);
m_DMCWin.Clear();
m_DMCWin.Close();
return
;
}
}
else
{
m_DMCWin.Clear();
//
m_DMCWin.Close();
return
;
}
GetDlgItem(IDC_BUTTON_CALIBRATE)
->
EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_GO_STOP_POSITION)
->
EnableWindow(TRUE);
EnableMotionButtons(TRUE);
EnableJOGButtons(TRUE);
/**/
///
Resume the thread
if
(m_GetStatusThreadHandle
!=
NULL)
ResumeThread(m_GetStatusThreadHandle);
SetTimer(
1
,
150
,NULL);
}
查看全文
相关阅读:
最短路径算法
XMLhelper
关于NuDaqPci 数据采集
批处理常用命令及用法大全
c#智能感知(设置)及实现
单片机串行通信全解析
Esp8266
使用NOOBS给树莓派安装系统Raspbian
命令提示符编译java
javaWeb使用POI操作Excel
原文地址:https://www.cnblogs.com/wqj1212/p/1010342.html
最新文章
libpcap详解
从网上搜索到的一些关于pcap源代码,入门级的
利用libpcap分析网络上的数据包(入门级)
int *
libpcap使用
android中的Handler
GitHub的问题
Android线程和handler
Android模拟器启动异常
Android入门
热门文章
循环调用修正sic86 2改后的(除了第一年有点诡异,其他年份可以正常修复)
循环调用修正sic86
js 易错点
js 中的cookie
触发器应用 trigger
下一个系列学习列表Spring.net+NHibernate+MVC
40多个关于人脸检测/识别的API、库和软件
Blob未完成(待优化)
C#实现ByteBuffer类 .
xy
Copyright © 2011-2022 走看看