• 发文
  • 评论
  • 微博
  • 空间
  • 微信

研学堂|运动控制卡编程小技巧(运动顺序执行问题)

研控科技 2020-11-21 09:07 发文

在运动控制卡开发应用中,运动顺序执行是最常见的编程问题之一,关系到设备后续控制动作能否正常运行。

下面,我们分享研控运动控制卡的编程小技巧!

希望对你有所帮助!

运动顺序执行——编程技巧

1.1

问题描述

我们使用上位机编程软件对控制卡进行点位、插补等多段轨迹运动时,轨迹间需判断上段轨迹运动停止状态(YK_check_done(CardNo,axis_no)),上段轨迹运动停止则立即启动下段轨迹运动。

如果编程时只是单独使用While循环,执行后会发现上位机界面被卡死,按键不能响应。

如以下用例程序,将出现上述问题:

研控控制卡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过程中需不断循环判断运动是否停止,在条件不满足即运动没有停止时程序一直处于循环中,程序将会占用整个软件的进程时间资源,即进入了死循环,其它进程消息不能及时响应,导致上位机界面卡死。

因此我们需要软件在循环判断运动状态的同时还需响应其它进程消息。

1.3

解决方案

软件多 线程可解决上述问题,但多线程较麻烦。可以使用软件自动函数实现。

1.3.1 VB编程

VB编程软件中有系统自动线程函数“DoEvents”。

//循环判断当前轴运动状态

while (status ==0)

// "当前状态:运动",继续循环判断;

status = YK_check_done(mCardNo,Axis );

// 使用VB编程中自带线程函数“DoEvents”

DoEvents

1.3.2 VC编程

VC编程软件中有类似线程查询函数“PeekMessage”。

//循环定义函数名DoEvents

void CMCC800VCTestMotionDlg::DoEvents()

static MSG msg;

if(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE) )

::TranslateMessage( &msg );

::DispatchMessage( &msg );

1.3.3 C# 编程

C#编程软件中有系统自动线程函数“DoEvents”。

//循环判断当前轴运动状态

while (status == 0)

// "当前状态:运动",继续循环判断;

status=MCC. YK_check_done(mCardNo, Axis );

// 使用C#编程中自带线程函数“DoEvents”

Application.DoEvents();

1.3.4 Labview 编程

Labview编程软件中在循环框中添加延时时间。

声明:本文为OFweek维科号作者发布,不代表OFweek维科号立场。如有侵权或其他问题,请及时联系我们举报。
2
评论

评论

    相关阅读

    暂无数据

    研控科技

    关注行业资讯,实时传递产品及技术...

    举报文章问题

    ×
    • 营销广告
    • 重复、旧闻
    • 格式问题
    • 低俗
    • 标题夸张
    • 与事实不符
    • 疑似抄袭
    • 我有话要说
    确定 取消

    举报评论问题

    ×
    • 淫秽色情
    • 营销广告
    • 恶意攻击谩骂
    • 我要吐槽
    确定 取消

    用户登录×

    请输入用户名/手机/邮箱

    请输入密码