程序的功能是使用National Instruments的FlexMotion软件库来控制一个运动控制板,实现一个轴的基于速度的直线运动。程序分为两个主要阶段:第一段移动和第二段移动,期间还包括速度覆盖(即在运动过程中改变速度)的操作。
在这段代码中,CheckError
函数用于检查错误并处理,而flex_load_velocity_override
函数用于在轴移动过程中改变速度。程序首先设置初始速度并开始移动,然后在第一段时间结束后,通过速度覆盖功能将速度降低到初始值的80%,并继续移动直到第二段时间结束。最后,程序通过发送停止指令使轴减速至停止,并将速度覆盖重置回100%。如果在执行过程中发生错误,程序将进入错误处理部分。
执行逻辑如下:
-
初始化:设置板卡ID、轴号、两段移动的时间,并包含必要的头文件。
-
第一段移动:
- 设置轴的移动速度、加速度、减速度和急动值。
- 将操作模式设置为速度模式。
- 启动移动。
- 循环检查轴的状态,直到第一段时间过去。
-
速度覆盖:
- 在第一段时间结束后,使用速度覆盖功能将轴的速度降低到初始设置速度的80%。
-
第二段移动:
- 继续监控轴的状态,直到第二段时间结束。
-
停止移动:
- 发送停止指令使轴减速至停止。
- 将速度覆盖重置为100%。
-
错误处理:
- 如果在执行过程中发生错误,程序将捕获并处理模态错误或显示常规错误信息。
///
// 要求: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> // 标准库头文件
#include <mmsystem.h> // 用于timeGetTime()函数调用
//
// 主函数
void main(void)
{
u8 boardID; // 板卡识别号
u8 axis; // 轴号
u16 csr = 0; // 通信状态寄存器
u16 axisStatus; // 轴状态
i32 moveTime1; // 第一段移动时间
i32 moveTime2; // 第二段移动时间
i32 initialTime;
i32 currentTime;
// 模态错误处理的变量
u16 commandID; // 函数的命令ID
u16 resourceID; // 资源ID
i32 errorCode; // 错误代码
///
// 设置板卡ID
boardID = 3;
// 设置轴号
axis = 1;
// 第一段移动时间
moveTime1 = 5000; // 毫秒
// 第二段移动时间
moveTime2 = 10000; // 毫秒
//------------------------------------------------------------
// 第一段移动
//------------------------------------------------------------
// 设置移动的速度(单位:计数/秒)
err = flex_load_velocity(boardID, axis, 10000, 0xFF);
CheckError; // 检查错误
// 设置移动的加速度(单位:计数/秒^2)
err = flex_load_acceleration(boardID, axis, NIMC_ACCELERATION, 100000, 0xFF);
CheckError; // 检查错误
// 设置移动的减速度(单位:计数/秒^2)
err = flex_load_acceleration(boardID, axis, NIMC_DECELERATION, 100000, 0xFF);
CheckError; // 检查错误
// 设置移动的急动(s-curve值)(单位:采样周期)
err = flex_load_scurve_time(boardID, axis, 100, 0xFF);
CheckError; // 检查错误
// 设置操作模式为速度
err = flex_set_op_mode(boardID, axis, NIMC_VELOCITY);
CheckError; // 检查错误
// 开始移动
err = flex_start(boardID, axis, 0);
CheckError; // 检查错误
// 等待第一段时间
(initialTime = timeGetTime();
do
{
// 检查移动完成状态/跟踪错误/轴关闭状态
err = flex_read_axis_status_rtn(boardID, axis, &axisStatus);
CheckError; // 检查错误
// 读取通信状态寄存器并检查模态错误
err = flex_read_csr_rtn(boardID, &csr);
CheckError; // 检查错误
// 检查模态错误
if (csr & NIMC_MODAL_ERROR_MSG)
{
err = csr & NIMC_MODAL_ERROR_MSG;
CheckError; // 检查错误
}
// 获取当前时间并检查第一段时间是否已过
currentTime = timeGetTime();
if((currentTime - initialTime) >= moveTime1) break;
Sleep (50); // 每50毫秒检查一次
}while (!(axisStatus & NIMC_MOVE_COMPLETE_BIT) && !(axisStatus & NIMC_FOLLOWING_ERROR_BIT) && !(axisStatus & NIMC_AXIS_OFF_BIT)); // 在移动完成/跟踪错误/轴关闭时退出
//------------------------------------------------------------
// 第二段移动
//-