(1)关于固高运动控制卡《编程手册-基本功能》上第12章 smart home的解释。

1,限位回原点(用于装有限位开关而未装有零点开关,精度要求不高的场景)

a,调用回原点指令

b,电机以较高速度运动到限位,

c,碰到限位后反向运动,

d,脱离限位后再以较低速度往限位方向动,

e,再次碰到限位时停止运动,所听位置即为我们要找的原点。

此种方式用的最多,很多模组类型的运控系统都是x,y,z轴,且都是只装上下限位开关而不装零点开关的。

2,限位加Home回原点

a,调用回原点指令

b,电机以较高速度运动到限位,

c,碰到限位后反向运动,开启高速硬件捕获,

d,在设定范围内搜索Home位置

e,触发Home开关,电机以较低速度运动到Home处,此即原点处。(这里触发Home开关后还是会运动一定位置,这个距离很小,我们感觉不到,但实际是运动了一段距离的)

第二种回零方式使用于既装了限位开关,又方便安装Home开关且精度要求较高的情形。

例如z轴的上下限位都安装了,但是回零时不希望轴停在限位开关处,可用这种方式进行回零操作。

3,Home回原点

a,调用回原点指令

b,电机以较高速度运动并开启告诉硬件捕获,

c,在设搜索范围内搜索home,

d,触发home开关,电机以较低速度运动到捕获的位置,此即我们要找的零点位置。

d段这里会返回去可能是因为b段这里开始是高速运动的,捕获到Home开关后可能速度过大来不及刹车,所以又要以较低速度返回去找零点,暂时这么理解吧!!!

第三种回零方式主要在转盘的运动控制上应用,比如一个水平圆盘的运动可以在360度范围内走动,圆盘上又方便安装Home开关,就用这种回零方式。

(4)index回原点

a,调用回原点指令

b,电以较高速度运动并开启高速硬件捕获,

c,捕获到index信号,

d,电机以较低速度运动到index处停止,此即我们需要找的原点位置。

第四种回原点方式主要应用在转盘的运动控制,并且不方便安装原点和限位的情形下,这种回零方式要求在硬件上把z相信号接上,这样才能捕获到index信号,不然控制器会一直转动找不到index信号。

以上四种回零方式是较常用的,其他的参考固高的编程手册,我也没有在实际项目上应用过,就不再一一说明了,以免误人子弟。

下面是限位回零方式的代码(主体是moveHomeInner 这个函数),具体内容看代码注释信息。

从LimitHome函数-》HomeInner函数

#pragma once
#include "gts.h"
#include <vector>
//这里用的是4轴卡
//为方便记录,用枚举的方式把轴与实际的连接轴关联起来,
//不然到后面自己都不知道那个轴对应的是第几轴了
enum Axis
{
    Axis_U = 1,
    Axis_V = 2,
    Axis_X = 3,
    Axis_Z = 4,
};

#define escape_distance 1000

class Motion
{
public:
    Motion();
    ~Motion();

//定义静态函数,
    static short init(); 
    //运动控制卡关闭
    static short close();

//先写几个回零函数种会用到的函数
    //轴状态获取函数,在回零过程种会用到读取轴的状态信息,比如是否触发限位,是否处于零点位置等信息
    static short axisStatus(Axis axis,long *sts);//第一个参数是需要获取状态的轴号,第二个参数是状态信息,每个为对应不同信息,后面会具体解析出来
    
    static short isMoving(Axis axis,bool *isMoving);//判断某个轴当前是否在移动

static short stop(const std::vector<Axis>& axes);//停止轴运动,入口参数是轴数组,如果是4个全停止,数组就有4个数
     //轴移动函数,这里只需要知道这个函数是控制轴移动的就可以了,后续会讲解这个函数的具体含义及实现具体实现方法
    static short moveTo(Axis axis, long pos, double vel);
    //限位回零方式
    static short LimitHome(Axis axis);

private:
    //内部调用的回零函数
    static short moveHomeInner(Axis axis);
};

#include "Motion.h"

Motion::Motion()
{
}

Motion::~Motion()
{
}
//运动控制卡初始化函数,后面在打开程序的时候把运动控制卡初始化后就可以对运控卡进行控制了
short Motion::init()
{
    //打开运动控制卡,确保运控卡已经插在电脑上
    short ret = GT_Open();
    if (ret != 0)
    {
        return ret;
    }
    //运控卡复位
    ret = GT_Reset(); //这中带有GT_开头的函数都是固高提供的编程函数,直接调用即可
    if (ret != 0)
    {
        return ret;
    }
    //加载配置文件,由固高的demo软件生成的,主要配置一些急停端口,限位端口之类的东西
    ret = GT_LoadConfig("GTS800.cfg");
    if (ret != 0)
    {
        return ret;
    }
    //清除运动报警状态,1-4代表4个轴都清楚报警状态,如果是8轴卡,则是ret = GT_ClrSts(1, 8);
    ret = GT_ClrSts(1, 4);
    if (ret != 0)
    {
        return ret;
    }
    //清除轴的输出参数,让各轴的当前位置为0
    ret = GT_ZeroPos(1, 4);
    if (ret != 0)
    {
        return ret;
    }
    //使能x轴
    ret = GT_AxisOn(short(Axis::Axis_X));
    if (ret != 0)
    {
        return ret;
    }
    //使能z轴
    ret = GT_AxisOn(short(Axis::Axis_Z));
    if (ret != 0)
    {
        return ret;
    }
    //使能u轴
    ret = GT_AxisOn(short(Axis::Axis_U));
    if (ret != 0)
    {
        return ret;
    }
    //使能v轴
    ret = GT_AxisOn(short(Axis::Axis_V));
    if (ret != 0)
    {
        return ret;
    }
    return 0;
}
//当用玩运控后需要把运控卡关掉,不然其他程序不能调用运控卡
short Motion::close()
{
    return GT_Close();
}

short Motion::axisStatus(Axis axis,long *sts)
{        
     return GT_GetSts(short(axis), sts);
}

short Motion::isMoving(Axis axis, bool * isMoving)
{
    long sts = 0;
    short ret = GT_GetSts(short(axis), &sts);//用状态位来判断
    if (ret != 0)
    {
        return ret;
    }
    *isMoving = sts & long(1L << 10);
    return ret;
}

short Motion::stop(const std::vector<Axis>& axes)
{
    long mask = 0, option = 0;
    for (auto axis : axes)
    {
        mask |= 1 << (short(axis) - 1);
        option |= 1 << (short(axis) - 1);
    }
    short ret = GT_Stop(mask, option);
    if (ret != 0)
        return ret;
    else
        return 0;
}

short Motion::moveTo(Axis axis, long pos, double vel)
{
    bool moving = false;
    short ret = isMoving(axis, &moving);
    if (ret != 0)
        return ret;
    if (moving)
    {
        ret = stop({ axis });
        if (ret != 0)
            return ret;
    }
    return 0;
}

short Motion::LimitHome(Axis axis)
{
    short ret;
    ret = moveHomeInner(axis); //直接调用限位回零函数执行操作
    if (ret != 0)
    {
        return ret;
    }
    return ret;
}

short Motion::moveHomeInner(Axis axis)
{
    short ret = GT_ClrSts(short(axis));
    if (ret != 0)
    {
        return ret;
    }
    //当前位置信息清零
    ret = GT_ZeroPos(short(axis));
    if (ret != 0)
    {
        return ret;
    }

long sts = 0;
    //获取轴状态信息
    ret = axisStatus(axis, &sts);
    if (ret != 0)
    {
        return ret;
    }
    //解析轴状态信息,每个bit对应的信息
    //从后往前数是第六位,第六位对应负限位,下面这个if语句即是判断第六位是否为1,为1则说明触发了负限位
    if (sts & 0x40)//负限位触发信号0000 0000 0000 0000 0000 0000 0100 0000 
    {

ret = moveTo(axis, escape_distance, 10);
        if (ret != 0)
        {
            return ret;
        }
    
        ret = GT_ClrSts(short(axis));
        if (ret != 0)
        {
            return ret;
        }
    }
    if (sts & 0x20)//判断是否在正限位位置上,因为如果是在正限位位置上,是不能直接调用回零函数回零的。
    {
        ret = moveTo(axis, -escape_distance, 10);//先移动一小段距离后再回零
        if (ret != 0)
        {
            return ret;
        }
        ret = GT_ClrSts(short(axis));
        if (ret != 0)
        {
            return ret;
        }
    }
    THomePrm thomePrm;//回零参数结构体
    ret = GT_GetHomePrm(short(axis), &thomePrm);//获取回零参数
    if (ret != 0)
    {
        return ret;
    }
    //对回零参数进行设置
    thomePrm.mode = HOME_MODE_LIMIT; //回零模式,即上文提到的集中回零模式,这里是限位模式回零
    thomePrm.moveDir = -1; //回零的方向,1:正方向,即往正限位方向找零点。-1:负方向 
    thomePrm.triggerIndex = -1;
    thomePrm.velHigh = 50;//回零过程中的速度,分别对应高速和低速
    thomePrm.velLow = 20;
    thomePrm.acc = 5;//回零过程中的加速度,减速度
    thomePrm.dec = 5;
    thomePrm.smoothTime = 0; // 0-50
    thomePrm.homeOffset = 10000;
    thomePrm.searchHomeDistance = 0;//一直搜索,如果不为0,即为设置的搜索距离
    thomePrm.escapeStep = escape_distance;

ret = GT_ClearCaptureStatus(short(axis));
    if (ret != 0)
    {
        return ret;
    }

GT_PrfTrap(short(axis));//设置为点位运动模式
    if (ret != 0)
    {
        return ret;
    }

THomeStatus thomeSts;//回零状态参数结构体
    ret = GT_GoHome(short(axis), &thomePrm);
    //一直在执行回零操作,直到找到零点位置才停止,这个找到零点了的话它是会自动停止的,否则一直执行找零点,直到出错
    do {
        ret = GT_GetHomeStatus(short(axis), &thomeSts);
        ret = GT_ClrSts(short(axis));//清除正限位触发状态用的
        if (ret)
        {
            return ret;
        }
    } while (thomeSts.run);

if (ret != 0)
    {
        return ret;
    }
    //清楚所有的报警状态信息
    ret = GT_ClrSts(short(axis));
    if (ret != 0)
    {
        return ret;
    }
    //将当前位置清零
    ret = GT_ZeroPos(axis, 1);
    if (ret != 0)
    {
        return ret;
    }
    //回零函数执行结束
    return 0;
}

Qt + 运动控制 (固高运动控制卡)【3】运动控制卡几种常用的回零方式相关推荐

  1. Qt开发的上位机 硬件:固高八轴运动控制卡,海康威视相机,金橙子板卡,喷码机

    Qt开发的上位机 硬件:固高八轴运动控制卡,海康威视相机,金橙子板卡,喷码机 功能:激光镭射,喷码机,光学点定位,二维码读码与等级评测,MES系统对接,多语言切换,多样式切换. 喷码机:多米诺,lin ...

  2. QT实现固高运动控制卡示波器

    目录 一.固高示波器 二.基于QCustomPlot实现示波器 三.完整源码 一.固高示波器 固高运动控制卡自带的软件有一个示波器功能,可以实时显示速度的波形,可辅助分析电机的运行状态.但是我们基于s ...

  3. 固高控制卡学习(vs2010,c++)(之二)

    现在来学习固高控制卡之二:前面讲了固高控制卡和步进电机开环控制的连线方式,这节来学习固高控制卡的点位控制模式. 一.配置控制卡: 配置控制卡可以用mct软件进行配置也可以通过程序就行配置. 1.轴配置 ...

  4. 运动控制卡课程:固高,凌华,雷赛,(单一款学习时间45天,要求有C语言基础)凭良学校

    一.雷赛运动控制卡(雷赛dmc5480.smc6480)(可单独学习,要求有C#语言基础) 简介: DMC5480是一款基于PCI总线的高档脉冲式运动控制卡,配置了512段缓冲,使得实时处理能力更强: ...

  5. 固高GTS运动控制卡,C#语言三轴点胶机样本程序源代码,使用 的是固高GTS-800 8轴运动控制卡

    固高GTS运动控制卡,C#语言三轴点胶机样本程序源代码,使用 的是固高GTS-800 8轴运动控制卡. 资料齐全,3轴点胶机样本程序,还有操作手册及各种C#事例程序,适合自己参照做二次开发,GTS-4 ...

  6. c#上位机 源码 控制固高,研华,雷赛这类的运动板卡。偏向 程序运动控制。winform+板卡+sqlite

    c#上位机 源码 控制固高,研华,雷赛这类的运动板卡.偏向 程序运动控制.winform+板卡+sqlite

  7. MFC的固高环形倒立摆GRIP2002实验平台

    固高环形倒立摆GRIP2002是基于GT-400-SV-PCI运动控制卡的一个二级环形倒立摆(摆杆和连杆两根杆的摆),固高公司提供了一个DOS环境下的Demo和MATLAB 7.0的simulink的 ...

  8. 固高机器人控制器开发笔记

    目录 VS 2008 + Qt4.7 开发环境搭建 △ 软件安装 △ 环境配置 最近又开了个新坑,因为做实验的需求,需要用到重载机器人. 但是不巧的是,实验室的500kg库卡机器人程师兄在做开发,开发 ...

  9. 【C++】基于固高驱动器的伺服电机项目调试

    基于固高驱动器的伺服电机项目调试 一.硬件系统配置 二.编程环境配置 导入dll库 三.串口Pcomm库的使用 一.硬件系统配置 DriverStudio配置固高伺服电机控制器: 电机参数:选择80电 ...

  10. 大疆教父李泽湘创办的固高科技过会:拟募资4.5亿 联想是股东

    雷递网 雷建平 8月22日报道 固高科技股份有限公司(简称:"固高科技")日前IPO过会,准备在深交所创业板上市.固高科技计划募资4.5亿元. 其中,1.2亿元用于运动控制系统产业 ...

最新文章

  1. 如何通过参数来切换图表和数据
  2. RouterOS连载3:架设PPPoE服务
  3. python基础-模块导入
  4. Java数据库连接池知识汇总(C3P0+DBCP+Druid)
  5. 《博客园精华集》Sharepoint+MOSS分册
  6. 视音频编解码学习工程:H.264分析器
  7. 粥做得好不好,全凭一个良心!
  8. 夏天面试男生穿什么_你今年夏天在做什么?
  9. control的用法及短语_九上U5(control)微课详解与精练
  10. 【C#学习笔记】单精度和双精度浮点型操作留意。
  11. 一键自动生成字幕、提取视频字幕方案的详细评测与价格对比(含免费方案)
  12. 正则表达式实现中文的大写字符
  13. swf文件转mp4视频格式的失败与成功
  14. “私域”和“会员制”有什么区别?
  15. 云栖科技评论第56期:莫忧AI泡沫 相信AI兴邦
  16. 解决方案:集团型施工企业安全生产数字化管理系统
  17. 计算机阵列的定义,磁盘阵列是什么有什么好处?怎么组成磁盘阵列呢?
  18. 前沿资讯:索尼展现裸眼3D显示技术,阿里推出图计算平台……
  19. C语言的函数讲解(一)
  20. 计算机为什么不读500g硬盘,为什么我的500g硬盘的实际容量只有46 5. 1G

热门文章

  1. 我的世界HMCL如何安装Java_Ubuntu 18.04 LTS 使用 Minecraft 我的世界第三方启动器 HMCL...
  2. Rdp报表 参数配置 (基于2.4.2版本 添加查询条件)
  3. 网络安全工程师必备浏览器插件
  4. u盘ios刻录_用UltraISO刻录U盘安装系统
  5. 2018注册测绘师各地报名时间和注意事项!莫错过哦!
  6. php 将url转成伪静态,php兑现url伪静态化,全过程详解
  7. visual studio 2019 Intel Parallel Studio XE2020下FORTRAN安装及MPI并行配置计算
  8. fabric.js自定义字体的引入
  9. 《Windows游戏编程大师技巧》 四、GDI、控件和突发奇想
  10. 50 Fast Flash MX Techniques