这个C程序示例展示了如何使用电子齿轮(electronic gearing)功能来控制运动控制器上的从轴(slave axis)以匹配主轴(master axis)的运动。程序的主要功能和执行逻辑如下:
-
初始化和配置:程序首先定义了一些变量,包括板卡ID、从轴号、主轴号、通信状态寄存器、移动完成标志以及错误处理相关的变量。
-
设置板卡和轴:程序设置了板卡ID、从轴号,并将主轴设置为编码器4。
-
配置电子齿轮:程序配置了从轴的电子齿轮,设置了齿轮比为3:2,启用了从轴的电子齿轮功能,并等待了5秒钟。
-
设置移动参数:程序设置了从轴的操作模式为相对于捕获位置的移动,加载了速度、加速度和减速度参数,并设置了注册(叠加)移动的目标位置。
-
启动移动:程序启动了从轴的注册移动,并等待移动完成。
-
禁用电子齿轮:移动完成后,程序禁用了从轴的电子齿轮功能。
-
错误处理:在整个过程中,程序会检查是否有错误发生。如果有模态错误,程序会从错误堆栈中获取错误信息并显示。如果有其他错误,程序会显示常规错误信息。
///
// 要求:FlexMotion软件版本5或更高版本。
//
// 使用导入库:
// <NI-Motion安装位置>\FlexMotion\lib\Microsoft\FlexMS32.lib
// 对于MS编译器,以及
// <NI-Motion安装位置>\FlexMotion\lib\Borland\FlexBC32.lib
// 对于BC编译器
//
// 在您的项目包含目录中添加包含路径:
// <NI-Motion安装位置>\FlexMotion\Include
// <NI-Motion安装位置>\FlexMotion\Examples\C\Includes
//
// 将常见源代码添加到您的项目中:
// <NI-Motion安装位置>\FlexMotion\Examples\C\Includes\NIMCExample.c
//
// 其中<NI-Motion安装位置>默认为
// <驱动器>\Program Files\National Instruments\NI-Motion
// 对于32位Windows
// <驱动器>\Program Files (x86)\National Instruments\NI-Motion
// 对于64位Windows
//
// 描述:
// 这个C示例展示了运动控制器的电子齿轮功能
//
///
// 包含文件/
#include "flexmotn.h" // 包含FlexMotion库
#include "NIMCExample.h" // 包含NIMC示例代码
#include <stdio.h> // 包含标准输入输出库
#include <stdlib.h> // 包含标准库
//
// 主函数
void main(void)
{
u8 boardID; // 板卡识别号
u8 slaveAxis; // 从轴号
u8 master; // 主轴(编码器)
u16 csr = 0; // 通信状态寄存器
u16 moveComplete; // 移动完成标志
// 模态错误处理的变量
u16 commandID; // 函数的commandID
u16 resourceID; // 资源ID
i32 errorCode; // 错误代码
///
// 设置板卡ID
boardID= 1;
// 设置从轴号
slaveAxis = 1;
// 主轴是编码器4
master = NIMC_ENCODER4;
// 配置从轴的电子齿轮
err = flex_config_gear_master(boardID, slaveAxis, master);
CheckError;
// 加载齿轮比3:2
err = flex_load_gear_ratio(boardID, slaveAxis, NIMC_RELATIVE_GEARING,
3/* 比的分子*/, 2/* 比的分母*/, 0xFF);
CheckError;
// 启用从轴的电子齿轮功能
err = flex_enable_gearing_single_axis (boardID, slaveAxis, NIMC_TRUE);
CheckError;
// 等待5秒钟
Sleep(5000);
// 设置叠加移动的移动参数
// 设置操作模式为相对于捕获位置
err = flex_set_op_mode(boardID, slaveAxis, NIMC_RELATIVE_TO_CAPTURE);
CheckError;
// 加载速度,单位为计数/秒
err = flex_load_velocity(boardID, slaveAxis, 10000, 0xFF);
CheckError;
// 加载加速度和减速度,单位为计数^2/秒^2
err = flex_load_acceleration(boardID, slaveAxis, NIMC_BOTH, 100000, 0xFF);
CheckError;
// 加载注册(