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);
}
查看全文
相关阅读:
YII 项目部署时, 显示空白内容
github上传项目(使用git)、删除项目、添加协作者
Mysql 报错:#1067
解决:500 Internal Privoxy Error
解决bcp导出CSV文件没有表头
asp.net 获取当前,相对,绝对路径
BCP 运行错误
cmd 运行bcp 提示:'bcp' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
Android--数据持久化之SQLite
Android--JUnit单元测试
原文地址:https://www.cnblogs.com/wqj1212/p/1010342.html
最新文章
atitit.日期,星期,时候的显示方法ISO 8601标准
Atitit.gui api自动化调用技术原理与实践
Atitit.gui api自动化调用技术原理与实践
Atitit 解决Unhandled event loop exception错误的办法
Atitit 解决Unhandled event loop exception错误的办法
Atitit 判断判断一张图片是否包含另一张小图片
atitit.细节决定成败的适合情形与缺点
Atitit 判断判断一张图片是否包含另一张小图片
atitit.细节决定成败的适合情形与缺点
Atitit.会员卡(包括银行卡)api的设计
热门文章
Atitit.现在的常用gui技术与gui技术趋势评价总结
Atitit.会员卡(包括银行卡)api的设计
Atitit.现在的常用gui技术与gui技术趋势评价总结
Atitit.如何选择技术职业方向
Atitit.如何选择技术职业方向
Atitit.mvc的趋势与未来attilax总结
Atitit.mvc的趋势与未来attilax总结
Atitit.java eval功能的实现 Compiler API
Atitit.java eval功能的实现 Compiler API
YII2数据库操作出现类似Database Exception – yiidbException SQLSTATE[HY000] [2002] No such file or director
Copyright © 2011-2022 走看看