这个C语言程序是一个用于Windows 32位控制台的应用程序,它的主要功能是控制一个或多个运动控制板卡上的轴参考点的寻找操作。在这个示例中,程序专注于一个轴参考点的寻找操作,即找到并设置设备的参考位置(通常是设备的“原点”或“零点”)。程序使用National Instruments的NI-Motion软件库来与运动控制硬件进行通信。
执行逻辑:
- 用户输入板卡ID和轴号,程序将这些值存储在相应的变量中。
- 程序检查板卡是否处于上电重置状态,如果是,则提示用户初始化板卡。
- 程序读取当前的通信状态寄存器(CSR),以检查是否有任何模态错误。
- 如果没有错误,程序将继续加载指定轴的加速度和速度参数。
- 程序启动寻参考操作,通常是寻找“原点”参考。
- 程序进入一个循环,不断检查寻参考操作是否完成,同时监控轴的当前位置,并检查是否有模态错误发生。
- 如果寻参考操作完成,程序将输出轴的最终位置,并结束寻参考过程。
- 如果在寻参考过程中发生错误,程序将停止运动,并从错误堆栈中读取错误信息,然后显示这些错误信息。
///
// 要求: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语言示例展示了如何在监控位置的同时进行单轴寻参考操作。
// 寻到的参考点是原点,但你可以根据flex_find_reference()函数下面的说明轻松更改这一点。
//
///
// 包含文件/
#include "flexmotn.h"
#include "NIMCExample.h"
#include <stdio.h>
//
// 主函数
void main(void){
u8 boardID; // 板卡识别号
u8 axis; // 轴号
f64 acceleration =100; // 加速度值,单位为每秒钟转数(RPS/S)
f64 velocity =200; // 速度值,单位为每分钟转数(RPM)
u16 found, finding; // 检查参考状态
u16 axisStatus; // 轴状态
u16 csr=0; // 通信状态寄存器
i32 position; // 轴的当前位置
i32 scanVar; // 扫描变量,用于读取scanf函数不支持的值
// 模态错误处理的变量
u16 commandID; // 函数的commandID
u16 resourceID; // 资源ID
i32 errorCode; // 错误代码
// 获取板卡ID
printf("输入板卡ID: ");
scanf("%d", &scanVar);
boardID=(u8)scanVar;
// 检查板卡是否处于上电重置状态
err = flex_read_csr_rtn(boardID, &csr);
CheckError;
if (csr & NIMC_POWER_UP_RESET ){
printf("\nFlexMotion板卡处于重置状态。请在运行此示例之前初始化板卡。\n");
printf("使用\"flex_initialize_controller\"函数可以通过Measurement and Automation Explorer选择的设置来初始化板卡\n");
return;
}
// 获取轴号
printf("输入轴号: ");
scanf("%d",&scanVar);
axis=(u8)scanVar;
// 清空标准输入
fflush(stdin);
// 将加速度和减速度加载到选定的轴
err = flex_load_rpsps(boardID, axis, NIMC_BOTH, acceleration, 0xFF);
CheckError;
// 将速度加载到选定的轴
err = flex_load_rpm(boardID, axis, velocity, 0xFF);
CheckError;
// 开始寻参考移动
err = flex_find_reference(boardID, axis, 0<