ProCon说明   快速入门   运动控制   EtherCAT   实时程序   API函数   控件库   硬件说明   问题排查   示例代码  
  

位置比较

本节主要介绍内容如下:


       注意
        
  • 位置比较需要先设置模式,输出时间,输出IO等配置
  • 硬件缓冲区最多14个(X控制器)-32个(T控制器),比较值分别是12位和30位宽度
  • 软件缓冲区支持数量:511
  • 二维门限计算:
    例如设置触发位置 X:Y,实际触发位置X1:Y1,门限=(X-X1)² + (Y-Y1)²
    如目标位置和实际位置误差20,门限则设置20,软件内部已开平方(20²=400)
  • 需把编码器进行接线并在软件上启动


相关函数

          

YKM_SetCompareConfigPCI 位置比较设置配置参数
YKM_GetCompareConfigPCI 位置比较获取配置参数
YKM_SetCompareValuePCI 位置比较设置比较值
YKM_GetCompareStatusPCI 位置比较获取比较状态
YKM_StartComparePCI 启动位置比较
YKM_StopComparePCI 停止位置比较


       注意
        
  • 比较值顺序执行,只有当前比较值判定比较成功后,才会比较下一个值。
  • 比较器序号与轴号对应
  • 比较器配置中bit使能与比较器数据中bit使能关系为与,对应的两个ena_bit均设置为允许才会真正输出
  • 触发频率高的情况下,IO输出持续时间设长会影响触发生效次数


运动说明

        

比较值数据顺序需与轴运动时编码器的变化方向对应,比较值顺序执行,只有当前比较值判定比较成功后,才会比较下一个值。

1.固定位置模式
先写位置再启动比较器,此时位置放在软件缓冲区内,因此最多可一次写入511个比较值。

2.线性位置模式
先把间距和数量配置好,再写入一个位置作为起点,最后启动比较器(数量为0代表无限数量)。
间距值区分正负向。

3.先进先出模式
先启动比较器再写入比较值,硬件缓冲区和软件缓冲区同时利用上了,因此最多可一次写入541个比较值。

停止比较器时会将硬件、软件缓冲区,头尾指针清零 。



流程图

        



程序编写

          

//以固定位置模式为例

RetCode result;
int exit_cmd = 0;

//库加载
result = YKM_LoadLib();
YKM_BusInfo busInfo;
//等待系统初始化完成
while (!exit_cmd)
{
  result = YKM_GetBusInfo(&busInfo);
  if (busInfo.running)
    break;
  Sleep(100);
}

//位置比较设置配置参数
YKM_CompareConfig compareConfig;
memset(&compareConfig, 0, sizeof(YKM_CompareConfig));

compareConfig.ena_bit0 = 1;
compareConfig.ena_bit1 = 1;
compareConfig.ena_bit2 = 1;
compareConfig.ena_bit3 = 1;

compareConfig.enable_2d = 0;
compareConfig.mode = YKM_COMPARE_MODE::COMPARE_MODE_FIX;
compareConfig.keep_time = 1023;
compareConfig.spacing1 = 0;
compareConfig.spacing2 = 0;
compareConfig.number = 0;
result = YKM_SetCompareConfigPCI(0, chlCmpCfg, compareConfig);
print(result);

//设置比较数据
YKM_CompareItemData compareItemData;
memset(&compareItemData, 0, sizeof(YKM_CompareItemData));
compareItemData.value1 = 1;
compareItemData.value2 = 0;
compareItemData.threshold = 0;
compareItemData.out_bit0 = 1;
compareItemData.out_bit1 = 1;
compareItemData.out_bit2 = 1;
compareItemData.out_bit3 = 1;
result = YKM_SetCompareValuePCI(0, chlCmpCfg, compareItemData);

//启动位置比较
result = YKM_StartComparePCI(0, chlCmpCfg);

//判断比较是否完成
YKM_CompareStatus CompareStatus;
memset(&CompareStatus, 0, sizeof(YKM_CompareStatus));
while (!exit_cmd)
{
  YKM_GetCompareStatusPCI(0, 0, &CompareStatus);
  if (CompareStatus.hd_active == 0)
    break;

  Sleep(1);
}

//停止位置比较
YKM_StopComparePCI(0, 0);



常见问题及说明

          

 

  
Copyright © 2015 深圳市优易控软件有限公司 www.proutech.com