供稿:深圳市研控自动化科技有限公司
发布时间:2020/11/20 23:47:54
1.1问题描述
研控控制卡MCC800从位置dist_0运动到位置dist_1,程序如下:
//设定运动速度参数
rtn =YK_set_profile(mCardNo,Axis,atof(mMinVel),atof(mMaxVel),atof(mAccTime),atof(mDecTime),atof(mEndVel));
//设定S段时间
rtn =YK_set_s_profile(mCardNo,Axis,0,atof(mSmoothTime));
//启动第一段运动轨迹
rtn= YK_pmove(mCardNo, Axis, dist_0, 0);
//判断当前轴状态
status= YK_check_done(mCardNo, Axis );
//循环判断当前轴运动状态
while (status ==0)
{
// "当前状态:运动",继续循环判断;
status = YK_check_done(mCardNo,Axis );
}
//启动第二段运动轨迹
rtn= YK_pmove(mCardNo, Axis, dist_1, 0);
//指令执行完成
1.2原因分析
上述程序,在启动运动位置到dist_0过程中需不断循环判断运动是否停止,在条件不满足即运动没有停止时程序一直处于循环中,程序将会占用整个软件的进程时间资源,即进入了死循环,其它进程消息不能及时响应,导致上位机界面卡死。
软件多线程可解决上述问题,但多线程较麻烦。可以使用软件自动函数实现。
VB编程软件中有系统自动线程函数“DoEvents”。
//循环判断当前轴运动状态
while (status ==0)
{
// "当前状态:运动",继续循环判断;
status = YK_check_done(mCardNo,Axis );
// 使用VB编程中自带线程函数“DoEvents”
DoEvents
}
VC编程软件中有类似线程查询函数“PeekMessage”。
//循环定义函数名DoEvents
void CMCC800VCTestMotionDlg::DoEvents()
{
static MSG msg;
if(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE) )
{
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
}
{
// "当前状态:运动",继续循环判断;
status=MCC. YK_check_done(mCardNo, Axis );
// 使用C#编程中自带线程函数“DoEvents”
Application.DoEvents();
}
Labview编程软件中在循环框中添加延时时间。
如需了解更多信息,请访问 (深圳市研控自动化科技有限公司)官网 http://www.yankong.com
深圳市研控自动化科技有限公司
地 址:深圳市南山区高新北区新西路7号兰光科技大厦8楼A802
邮 编:518000
电 话:0755-86142288
传 真:0755-86142266
网 址:http://www.yankong.com
E-mail:yako@yankong.com
联系人:董小姐