这段程序是一个用于NI-Motion控制系统的C语言示例,其主要功能是在运动控制应用中实现缓冲位置断点。程序通过National Instruments的运动控制API(FlexMotn.h)来与硬件进行交互,具体来说,它执行以下步骤:
-
初始化和配置:程序首先定义了与NI-Motion硬件通信所需的资源变量,包括板卡ID、轴号和缓冲区编号。
-
缓冲区配置:程序配置了一个缓冲区,用于存储一系列的断点位置。这些位置是轴在运动过程中需要暂停的特定位置。
-
写入断点位置:程序将预定义的断点位置数组写入到配置好的缓冲区中。
-
配置断点:程序设置了轴的断点类型为绝对断点,并且指定断点的操作模式为缓冲模式。
-
启用断点:程序启用了之前配置的断点,这样当轴运动到缓冲区中的断点位置时,它会暂停。
-
轮询缓冲区状态:程序进入一个循环,不断检查缓冲区的状态,直到所有的断点都被处理(即轴已经到达了所有的断点位置)。
-
清除缓冲区:一旦所有的断点都被处理,程序清除缓冲区,准备下一次操作。
-
错误处理:在整个过程中,程序会检查并处理可能出现的错误,包括模态错误和常规错误。
// 要求:NI-Motion 6.0 或更高版本
//
// 使用导入库:
// <NI-Motion 安装位置>\FlexMotion\lib\Microsoft\FlexMS32.lib
// for MS 编译器,和
// <NI-Motion 安装位置>\FlexMotion\lib\Borland\FlexBC32.lib
// for 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
// for 32位 Windows
// <驱动器>\Program Files (x86)\National Instruments\NI-Motion
// for 64位 Windows
//
// 描述:
// 这个 C 示例展示了执行缓冲位置断点在轴资源上的基本算法或步骤。
//
// 包含
#include <stdio.h>
#include <stdlib.h>
#include "FlexMotn.h"
#include "NIMCExample.h"
#include "NIMCExampleData.h"
// 主函数
void main (void)
{
// 资源变量
u8 boardID = 1; // 板卡识别号
u8 axis = NIMC_AXIS1; // 轴号
u8 buffer = 1; // 缓冲区编号
// 模态错误处理变量
u16 commandID; // 函数的 commandID
u16 resourceID; // 资源 ID
i32 errorCode; // 错误代码
u16 csr = 0; // 通信状态
// 缓冲资源
i32 breakpointPositions[] = {
1000, 1100, 1200, 1300, 1400, 1500, 1600};
u16 numberOfPoints = 7; // 断点数量
f64 actualInterval; // 函数调用中需要但未使用
f64 requestedInterval = 10.0; // 函数调用中需要但未使用
u32 backLog; // 缓冲区中可用空间的数量
u16 bufferState; // 缓冲区状态
u32 pointsDone; // 完成或消耗的断点数量
// 为缓冲断点配置缓冲区
err = flex_configure_buffer(boardID, buffer, axis, NIMC_BREAKPOINT_DATA,
numberOfPoints, numberOfPoints, NIMC_TRUE,
requestedInterval, &actualInterval);
CheckError;
// 将断点位置写入缓冲区
err = flex_write_buffer(boardID, buffer, numberOfPoints,
NIMC_REGENERATION_NO_CHANGE, breakpointPositions, 0xFF);
CheckError;
// 配置断点为缓冲断点
err = flex_configure_breakpoint(boardID, axis, NIMC_ABSOLUTE_BREAKPOINT,
NIMC_PULSE_BREAKPOINT