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

   日期:2020-11-17     浏览:349    评论:0    
核心提示:在运动控制卡开发应用中,运动顺序执行是最常见的编程问题之一,关系到设备后续控制动作能否正常运行。 下面,我们分享研控运动控制卡的编程小技巧!
微信图片_20201117090516 
       在运动控制卡开发应用中,运动顺序执行是最常见的编程问题之一,关系到设备后续控制动作能否正常运行。
下面,我们分享研控运动控制卡的编程小技巧!

        希望对你有所帮助!

运动顺序执行

编程技巧

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编程软件中在循环框中添加延时时间。

微信图片_20201117090520
 
标签: 运动控制
 
0
打赏
 
更多>同类方案
免责申明
0相关评论

推荐图文
最新方案更多>
智荐头条更多>
最新供应更多>
网站首页  |  联系方式  |  关于我们  |  问题解析  |  版权隐私  |  使用协议  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  粤ICP备1207862号

中国智能化网(zgznh®)--引领工业智能化产业发展 共享智能化+优质平台

版权所有:深圳市智控网络有限公司 学术指导:深圳市智能化学会

粤ICP备12078626号-1 | 增值电信业务经营许可证号 粤B2-20120463

深公网安备案证字第 4403101901094 号 | 粤公网安备 44030702001206号