代码的功能是演示如何在运动控制器上配置模数断点,并通过RTSI线路路由该断点。模数断点是指在运动控制器的每个运动周期中,当达到特定的位置时触发的断点。RTSI(Real-Time System Interface)是National Instruments运动控制器的一个特性,允许用户将特定的控制信号(如断点)路由到控制器的物理线路上。
执行逻辑如下:
- 初始化变量,包括板卡ID、轴号、通信状态寄存器、轴状态等。
- 设置板卡ID和轴号。
- 使用
flex_select_signal
函数将断点1路由到RTSI线路1。 - 使用
flex_configure_breakpoint
函数配置模数断点。 - 使用
flex_load_bp_modulus
函数加载断点的模数,即重复周期。 - 使用
flex_load_pos_bp
函数加载断点的位置,即每个模数周期中断点应该发生的位置。 - 进入一个无限循环,在循环中启用轴上的断点。
- 在循环中检查轴的状态和通信状态寄存器,以确定是否有模态错误发生。
- 如果轴状态显示已经到达位置断点,则退出循环。
- 如果发生模态错误,从错误堆栈中获取错误信息并显示。
- 如果没有模态错误,显示常规错误信息。
- 退出应用程序。
///////////////////////////////////////////////////////////////////////
// 要求: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 示例演示了如何在运动控制器上配置模数断点
// 并通过 RTSI 线路路由该断点
///////////////////////////////////////////////////////////////////////
// 包含文件/////////////////////////
#include "flexmotn.h"
#include "NIMCExample.h"
#include <stdio.h>
#include <stdlib.h>
//////////////////////////////////////////////////////////////////////
// 主函数
void main(void)
{
u8 boardID; // 板卡标识号
u8 axis; // 轴号
u16 csr = 0; // 通信状态寄存器
u16 axisStatus; // 轴状态
// 模态错误处理的变量
u16 commandID; // 函数的 commandID
u16 resourceID; // 资源 ID
i32 errorCode; // 错误代码
///////////////////////////////
// 设置板卡 ID
boardID = 1;
// 设置轴号
axis = 1;
////////////////////////////////
// 将断点 1 路由到 RTSI 线 1
err = flex_select_signal (boardID, NIMC_RTSI1 /*目的地*/, NIMC_BREAKPOINT1/*源*/);
检查错误;
// 配置断点
err = flex_configure_breakpoint(boardID, axis, NIMC_MODULO_BREAKPOINT, NIMC_SET_BREAKPOINT, 0);
检查错误;
// 加载断点模数 - 重复周期
err = flex_load_bp_modulus(boardID, axis, 500, 0xFF);
检查错误;
// 加载断点位置 - 断点应该发生的每个模数的位置
// 每个模数
err = flex_load_pos_bp(boardID, axis, 0, 0xFF);
检查错误;
for(;;){
// 在轴 1 上启用断点
err = flex_enable_breakpoint