这个C语言示例程序用于演示如何使用National Instruments Motion Control (NI-Motion) 软件进行缓冲高速捕获(High Speed Capture)。它展示了如何在运动控制器上配置和使用缓冲区来捕获特定轴的高速捕获数据,并将这些数据读取到内存中以供进一步处理。
执行逻辑:
- 初始化变量,包括板卡ID、轴号、通信状态寄存器、缓冲区大小、总捕获点数、捕获位置数组等。
- 配置运动控制器上的缓冲区,指定缓冲区编号、轴号、捕获类型、缓冲区大小、总点数以及请求的时间间隔。
- 配置高速捕获,设置触发类型和操作模式。
- 启用轴上的高速捕获。
- 进入循环,检查缓冲区的状态和可用数据量。
- 如果有数据可用,分配内存以读取数据,并从缓冲区中读取捕获的位置数据。
- 打印捕获的位置数据,并更新已读取点数的计数器。
- 检查通信状态寄存器,以确定是否有模态错误发生。
- 如果有模态错误,从错误堆栈中读取错误信息并显示。
- 循环直到缓冲区状态指示所有捕获点都已处理完毕。
- 清理资源,释放缓冲区内存。
- 退出应用程序。
// 需求:NI-Motion 6.0 或更高版本
//
// 使用导入库:
// <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 <stdio.h>
#include <stdlib.h>
#include "FlexMotn.h"
#include "NIMCExample.h"
#include "NIMCExampleData.h"
// 主函数
void main(void)
{
u8 boardID; // 板卡识别号
u8 axis; // 轴号
u16 csr = 0; // 通信状态寄存器
i32 bufferSize = 100; // 在运动控制器上分配的缓冲区大小
u32 totalPoints = 100; // 要获取的高速捕获点数
i32 capturedPositions[100]; // 存储捕获位置的数组
f64 actualInterval; // 控制器实际能够轮廓的间隔
u32 backlog; // 表示捕获位置的可用空间
u32 pointsDone; // 表示已消费的点数
u16 bufferState; // 表示板上缓冲区的状态
u32 currentDataPoint = 0; // 表示要从缓冲区中读取的下一个点
i32* readBuffer = NULL; // 创建的临时数组,用于读取捕获的位置
u32 i;
// 模态错误处理的变量
u16 commandID; // 函数的 commandID
u16 resourceID; // 资源 ID
i32 errorCode; // 错误代码
// 设置板卡 ID
boardID = 1;
// 设置轴号
axis = NIMC_AXIS1;
//
// 在运动控制器内存(RAM)上配置缓冲区
// 注意请求的时间间隔硬编码为 10 毫秒
err = flex_configure_buffer(boardID, 1 /*缓冲区编号*/, axis, NIMC_HS_CAPTURE_READBACK, bufferSize,
totalPoints, NIMC_TRUE, 10, &actualInterval);
CheckError;
// 配置高速捕获
err = flex_configure_hs_capture(boardID, axis, NIMC_HS_LOW_TO_HIGH_EDGE, NIMC_OPERATION_BUFFERED);
CheckError;
// 启用轴上的高速捕获
err = flex_enable_hs_capture(boardID, axis, NIMC_TRUE);
CheckError;
do
{
err = flex_check_buffer_rtn(boardID, 1/*缓冲区编号*/, &backlog