这个程序是一个用于Windows 32位控制台的C语言应用程序,其主要功能是演示如何实现一个旋转刀片(Rotating Knife)的应用。旋转刀片通常用于需要精确同步的自动化设备中,例如印刷机或包装机械。
程序的功能和执行逻辑如下:
-
初始化变量:定义并初始化用于控制和监控运动控制器的变量。
-
配置齿轮主轴:设置从轴(slaveAxis)的齿轮主轴(master),这里是编码器4(NIMC_ENCODER4)。
-
设置齿轮比:为从轴加载齿轮比,这里设置为1:1,意味着主轴和从轴的运动是同步的。
-
设置移动参数:为从轴设置操作模式、速度(以每分钟转数RPM表示)、加速度和减速度。
-
启用齿轮和高速捕获:启用从轴的齿轮功能,并设置从轴进行高速捕获。
-
等待触发信号:程序进入一个循环,等待触发信号。这个触发信号可能是外部事件,如传感器的激活。
-
执行注册移动:一旦接收到触发信号,程序会读取捕获的位置,并计算出从同步位置到触发位置的偏移量。然后,它会将这个偏移量作为目标位置加载到从轴上,并启动移动。
-
错误处理:如果在执行过程中遇到任何错误,程序会进入错误处理部分,读取错误信息并显示。
///
// 要求: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, ¤tPosition);
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; // 退出应用程序
}
程序执行流程图: