该程序是一个基于Win32控制台应用程序的示例,用于配置和使用National Instruments的NI-Motion(FlexMotion)软件来控制运动轴。程序的主要功能是设置一个周期性断点,当运动轴到达预设的目标位置时,会在周期性断点位置暂停,然后继续运动直到再次到达目标位置。
程序执行逻辑如下:
-
用户输入:程序首先提示用户输入板卡ID、轴号、目标位置、断点位置和断点周期。
-
配置断点:程序使用
flex_configure_breakpoint
函数配置周期性断点,设置断点类型为周期性断点,并指定不改变任何其他参数。 -
加载断点位置:使用
flex_load_pos_bp
函数加载周期性断点的起始位置。 -
设置断点周期:使用
flex_load_bp_modulus
函数设置周期性断点的周期,即断点之间的间隔。 -
启用断点:通过
flex_enable_breakpoint
函数启用周期性断点。 -
加载目标位置:使用
flex_load_target_pos
函数加载运动轴的目标位置。 -
启动运动:调用
flex_start
函数启动运动轴。 -
循环检查:程序进入一个循环,不断读取轴的状态和当前位置。在循环中,程序检查是否到达周期性断点位置,并更新断点状态和轮廓完成状态。
-
错误处理:如果在运动过程中出现模态错误(如硬件故障或其他问题),程序会停止运动并读取错误信息,然后退出。
-
完成运动:当运动轴完成目标位置的移动后,程序打印“完成”消息并退出。
///
// 周期性断点输出.c:一个Win32控制台应用程序
//
// 需求: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
//
// 在构建任何示例应用程序时,您必须包含NIMCExample.h并将NIMCExample.c插入到您的项目中。
//
///
// 包含头文件/
#include "flexmotn.h" // 包含FlexMotion库头文件
#include "NIMCExample.h" // 包含NIMC示例头文件
#include <stdio.h> // 包含标准输入输出库头文件
//
// 主函数
void main(void)
{
u8 boardID; // 板卡标识号
u8 axis; // 轴
u16 csr = 0; // 通信状态寄存器
u8 profileStatus; // 轮廓完成状态
u8 bpStatus; // 断点找到状态
i32 bpPos; // 断点位置
i32 bpPer; // 断点周期
i32 targetPos; // 目标位置
i32 currentPos; // 当前位置
u16 axisStatus; // 轴的状态
// 用于模态错误处理的变量
u16 commandID; // 函数的commandID
u16 resourceID; // 资源ID
i32 errorCode;
// 获取板卡ID
printf("请输入板卡ID:");
scanf("%u", &boardID);
// 获取轴号
printf("请输入一个轴号:");
scanf("%u", &axis);
// 获取目标位置
printf("请输入一个目标位置:");
scanf("%ld", &targetPos);
// 获取断点位置
printf("请输入一个断点位置:");
scanf("%ld", &bpPos);
// 获取断点周期
printf("请输入一个断点周期:");
scanf("%ld", &bpPer);
// 配置断点为绝对值
err = flex_configure_breakpoint(boardID, axis, NIMC_PERIODIC_BREAKPOINT, NIMC_NO_CHANGE, 0);
CheckError;
// 加载开始断点的位置
err = flex_load_pos_bp(boardID, axis, bpPos, 0xFF);
CheckError;
// 设置周期
err = flex_load_bp_modulus(boardID, axis, bpPer, 0xFF);
CheckError;
// 启用断点
err = flex_enable_breakpoint(boardID, axis, NIMC_TRUE);
CheckError;
// 加载目标位置
err = flex_load_target_pos(boardID, axis, targetPos, 0xFF);
CheckError;
// 启动运动