NI-Motion如何实现一个旋转刀片(Rotating Knife)的应用的C语言示例代码

这是一个C语言程序,演示如何用NI-Motion控制旋转刀片应用,常用于自动化设备。程序包括初始化、配置齿轮主轴、设置移动参数、等待触发信号、执行移动和错误处理。通过示例代码详细阐述了各个步骤。
摘要由CSDN通过智能技术生成

这个程序是一个用于Windows 32位控制台的C语言应用程序,其主要功能是演示如何实现一个旋转刀片(Rotating Knife)的应用。旋转刀片通常用于需要精确同步的自动化设备中,例如印刷机或包装机械。

程序的功能和执行逻辑如下:

  1. 初始化变量:定义并初始化用于控制和监控运动控制器的变量。

  2. 配置齿轮主轴:设置从轴(slaveAxis)的齿轮主轴(master),这里是编码器4(NIMC_ENCODER4)。

  3. 设置齿轮比:为从轴加载齿轮比,这里设置为1:1,意味着主轴和从轴的运动是同步的。

  4. 设置移动参数:为从轴设置操作模式、速度(以每分钟转数RPM表示)、加速度和减速度。

  5. 启用齿轮和高速捕获:启用从轴的齿轮功能,并设置从轴进行高速捕获。

  6. 等待触发信号:程序进入一个循环,等待触发信号。这个触发信号可能是外部事件,如传感器的激活。

  7. 执行注册移动:一旦接收到触发信号,程序会读取捕获的位置,并计算出从同步位置到触发位置的偏移量。然后,它会将这个偏移量作为目标位置加载到从轴上,并启动移动。

  8. 错误处理:如果在执行过程中遇到任何错误,程序会进入错误处理部分,读取错误信息并显示。

///
// 要求: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"
#include "NIMCExample.h"
#include <stdio.h>
#include <stdlib.h>

//
// 主函数
void main(void)
{

	u8	boardID;								// 板卡识别号
	u8	slaveAxis;							// 从轴号
	u8 master;								// 主齿轮
	u16 csr	= 0;							// 通信状态寄存器
	i32 synchronizationPosition = 0; // 同步位置
	i32 correctionPoint = 500;			// 可以应用校正的点
	i32 cyclePosition = 2000;			// 一圈是 2000 计数
	i32 currentPosition;					// 当前从位置
	i32 capturedPosition;				// 触发发生的位置
	u16 axisStatus;

	// 模态错误处理的变量
	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;

	// 加载齿轮比 1:1
	err =  flex_load_gear_ratio(boardID, slaveAxis, NIMC_ABSOLUTE_GEARING,
										1/* 比率分子*/, 1/* 比率分母*/, 0xFF);
	CheckError;

	//--------------------------------------------------------
	// 设置要在注册时执行的叠加移动的移动参数
	//--------------------------------------------------------
	// 将操作模式设置为相对
	err = flex_set_op_mode(boardID, slaveAxis, NIMC_RELATIVE_TO_CAPTURE);
	CheckError;

	// 以 RPM 装载速度
	err = flex_load_rpm(boardID, slaveAxis, 100.00, 0xFF);
	CheckError;

	// 以 RPS/sec 装载加速度和减速度
	err = flex_load_rpsps(boardID, slaveAxis, NIMC_BOTH, 50.00, 0xFF);
	CheckError;


	//--------------------------------------------------------
	// 启用从轴上的齿轮
	//--------------------------------------------------------
	err = flex_enable_gearing_single_axis (boardID, slaveAxis, NIMC_TRUE);
	CheckError;


	//--------------------------------------------------------
	// 等待触发以执行注册移动
	//--------------------------------------------------------
	for(;;){
		// 为从轴启用高速捕获
		err = flex_enable_hs_capture(boardID, slaveAxis, NIMC_TRUE);
		CheckError;

		do
		{
			// 检查高速捕获状态/跟踪误差/轴关闭状态
			err = flex_read_axis_status_rtn(boardID, slaveAxis, &axisStatus);
			CheckError;

			// 读取通信状态寄存器并检查模态错误
			err = flex_read_csr_rtn(boardID, &csr);
			CheckError;

			// 检查模态错误
			if (csr & NIMC_MODAL_ERROR_MSG)
			{
				err = csr & NIMC_MODAL_ERROR_MSG;
				CheckError;
			}



		}while (!(axisStatus & NIMC_HIGH_SPEED_CAPTURE_BIT) && !(axisStatus & NIMC_FOLLOWING_ERROR_BIT) && !(axisStatus & NIMC_AXIS_OFF_BIT)); // 在跟踪错误/轴关闭时退出

		if((axisStatus & NIMC_FOLLOWING_ERROR_BIT) || (axisStatus & NIMC_AXIS_OFF_BIT)){
			break; // 跳出循环
		}

		// 更新此周期的变量
		synchronizationPosition += cyclePosition;
		correctionPoint += cyclePosition;

		// 读取捕获位置
		err = flex_read_cap_pos_rtn(boardID, slaveAxis, &capturedPosition);
		CheckError;

		// 装载注册(叠加)移动的目标位置
		err = flex_load_target_pos(boardID, slaveAxis, (synchronizationPosition-capturedPosition), 0xFF);
		CheckError;

		// 等待我们通过校正点后再应用校正
		currentPosition = 0;
		while (currentPosition < correctionPoint){
			err = flex_read_pos_rtn(boardID, slaveAxis, &currentPosition);
			CheckError;
		}

		// 启动从轴上的注册移动
		err = flex_start(boardID, slaveAxis, 0);
		CheckError;
	}// 循环


	return;		// 退出应用程序


	//
	// 错误处理
	//
	nimcHandleError; //NIMCCATCHTHIS:

	// 检查是否有任何模态错误
	if (csr & NIMC_MODAL_ERROR_MSG){
		do{
			//获取模态错误的命令 ID、资源和错误代码
			//从板卡上的错误堆栈
			flex_read_error_msg_rtn(boardID,&commandID,&resourceID,&errorCode);
			nimcDisplayError(errorCode,commandID,resourceID);

			//读取通信状态寄存器
			flex_read_csr_rtn(boardID,&csr);

		}while(csr & NIMC_MODAL_ERROR_MSG);
	}
	else		// 显示常规错误
		nimcDisplayError(err,0,0);
	return;		// 退出应用程序
}

程序执行流程图:

</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

openwin_top

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

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

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

打赏作者

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

抵扣说明:

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

余额充值