这个C语言程序是一个用于存储和执行板载程序的示例,它使用了National Instruments的FlexMotion软件库。程序的主要功能是在一个运动控制器上创建并运行一个简单的板载程序,该程序使得一个轴(电机)顺时针移动特定的步数。下面是对程序功能和执行逻辑的详细解读:
-
初始化和配置:程序首先定义了一些变量,包括板卡ID、轴号和通信状态寄存器。同时,设置了错误处理的变量,如命令ID、资源ID和错误码。
-
设置板卡和轴:程序通过
boardID
和axis
变量指定了要控制的板卡和轴。 -
开始存储板载程序:使用
flex_begin_store
函数开始在控制器上存储板载程序,程序编号为1。 -
配置运动参数:程序设置了运动模式为相对位置模式,然后加载了目标位置(顺时针移动5000步),以及运动的速度(每分钟100转),加速度和减速度(每秒50弧度/秒)。
-
启动运动:通过
flex_start
函数启动轴的运动。 -
等待运动完成:程序使用
flex_wait_on_condition
函数等待轴的运动完成。这个函数会阻塞程序直到轴的运动完成或者超时(这里设置的超时时间为1000毫秒)。 -
结束存储板载程序:运动完成后,使用
flex_end_store
函数结束板载程序的存储。 -
错误处理:如果在执行过程中出现任何错误,程序会进入错误处理部分。对于模态错误,程序会从错误堆栈中获取错误信息并显示,然后继续检查其他错误。对于非模态错误,程序会直接显示错误信息。
///
// 板载程序.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
//
// 其中 <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> // 标准库头文件
//
// 主函数
void main(void)
{
u8 boardID; // 板卡标识号
u8 axis; // 轴号
u16 csr = 0; // 通信状态寄存器
// 用于模态错误处理的变量
u16 commandID; // 函数的 commandID
u16 resourceID; // 资源 ID
i32 errorCode; // 错误码
///
// 设置板卡 ID
boardID = 1;
// 设置轴号
axis = 1;
//--------------------------------------------------------
// 板载程序 1. 这个板载程序将轴一顺时针移动 5000 计数(步数)。要执行这个板载程序
// 调用 Run Program 函数
//--------------------------------------------------------
// 开始板载程序存储 - 程序编号 1
err = flex_begin_store(boardID, 1);
CheckError;
// 设置操作模式为相对
err = flex_set_op_mode(boardID, axis, NIMC_RELATIVE_POSITION);
CheckError;
// 加载目标位置以顺时针移动 5000 计数(步数)
err = flex_load_target_pos(boardID, axis, 5000, 0xFF);
CheckError;
// 加载 RPM(每分钟转数)
err = flex_load_rpm(boardID, axis, 100.00, 0xFF);
CheckError;
// 加载加速度和减速度,单位为 RPS/sec(每秒弧度/秒)
err = flex_load_rpsps(boardID, axis, NIMC_BOTH, 50.00, 0xFF);
CheckError;
// 开始移动
err = flex_start(boardID, axis, 0);
CheckError;
// 等待移动完成
err = flex_wait_on_condition(boardID,</