NI-Motion如何设置一个周期性断点,当运动轴到达预设的目标位置时,会在周期性断点位置暂停,然后继续运动直到再次到达目标位置的C语言代码示例

该程序是一个基于Win32控制台应用程序的示例,用于配置和使用National Instruments的NI-Motion(FlexMotion)软件来控制运动轴。程序的主要功能是设置一个周期性断点,当运动轴到达预设的目标位置时,会在周期性断点位置暂停,然后继续运动直到再次到达目标位置。

程序执行逻辑如下:

  1. 用户输入:程序首先提示用户输入板卡ID、轴号、目标位置、断点位置和断点周期。

  2. 配置断点:程序使用flex_configure_breakpoint函数配置周期性断点,设置断点类型为周期性断点,并指定不改变任何其他参数。

  3. 加载断点位置:使用flex_load_pos_bp函数加载周期性断点的起始位置。

  4. 设置断点周期:使用flex_load_bp_modulus函数设置周期性断点的周期,即断点之间的间隔。

  5. 启用断点:通过flex_enable_breakpoint函数启用周期性断点。

  6. 加载目标位置:使用flex_load_target_pos函数加载运动轴的目标位置。

  7. 启动运动:调用flex_start函数启动运动轴。

  8. 循环检查:程序进入一个循环,不断读取轴的状态和当前位置。在循环中,程序检查是否到达周期性断点位置,并更新断点状态和轮廓完成状态。

  9. 错误处理:如果在运动过程中出现模态错误(如硬件故障或其他问题),程序会停止运动并读取错误信息,然后退出。

  10. 完成运动:当运动轴完成目标位置的移动后,程序打印“完成”消息并退出。

///
// 周期性断点输出.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;

	// 启动运动
  • 24
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

openwin_top

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值