该程序是一个用于Windows平台的控制台应用程序,它的主要功能是通过National Instruments的FlexMotion软件库来控制运动控制板进行基于速度的直线运动。程序执行的逻辑可以分为以下几个主要部分:
-
初始化设置:程序首先定义了一些变量,包括板卡ID、轴号、通信状态寄存器、轴状态以及移动时间等。同时,设置了两段移动的时间参数。
-
第一段移动:程序通过设置轴的速度、加速度、减速度和急动(Jerk),将操作模式设置为速度模式,并启动移动。然后,程序进入一个循环,不断检查轴的状态和通信状态寄存器,以确保没有错误发生,并等待第一段时间过去。
-
第二段移动:在第一段时间过去后,程序会改变轴的速度,并再次启动移动。同样地,程序会检查轴的状态和通信状态寄存器,并等待第二段时间过去。
-
停止移动:在第二段移动完成后,程序会通过发送停止指令来使轴减速至停止。
-
错误处理:如果在执行过程中发生了模态错误(Modal Error),程序会捕获这些错误,并尝试从中恢复。如果发生常规错误,程序会显示错误信息。
///
// 要求: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> // 标准库头文件
#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; // 函数的commandID
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) &&<