这个C程序是一个用于控制运动控制器上轴速度的示例,它通过读取模拟数字转换器(ADC)的值来动态调整速度。程序的主要功能和执行逻辑如下:
-
初始化和配置:程序首先定义了一些变量,包括板卡ID、轴号、通信状态寄存器、常数乘数以及错误处理相关的变量。
-
设置板卡和轴:程序设置了板卡ID和轴号,并定义了一个常数,用于将ADC值转换为速度。
-
板上变量初始化:程序初始化了两个板上变量,一个是用于存储常数的变量1,另一个是用于存储计算结果的变量4。
-
程序存储:程序开始存储一个板上程序,设置了轴的操作模式为速度,并插入了一个标签,用于后续的跳转。
-
读取ADC值:程序读取ADC通道的值,并将其存储在变量2中。
-
计算速度:程序将变量2中的ADC值与常数相乘,得到一个新的速度值,并将这个值存储在变量3中。
-
条件设置和跳转:程序通过一个减法操作设置了一个条件,用于后续的跳转判断。如果变量3和变量4的值相等(即条件为零),程序将跳转到标签1。
-
设置和启动移动:程序使用变量3中的速度值设置轴的速度,并启动移动。
-
保存和循环:程序将变量3的值保存到变量4中,以便在下一个周期使用,并无条件跳转回标签1,形成一个循环。
-
错误处理:在整个过程中,程序会检查是否有错误发生。如果有模态错误,程序会从错误堆栈中获取错误信息并显示。如果有其他错误,程序会显示常规错误信息。
///
// 要求: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示例展示了如何基于ADC通道控制运动控制器上的轴速度
//
///
// 包含文件/
#include "flexmotn.h" // 包含FlexMotion库
#include "NIMCExample.h" // 包含NIMC示例代码
#include <stdio.h> // 包含标准输入输出库
#include <stdlib.h> // 包含标准库
//
// 主函数
void main(void)
{
u8 boardID; // 板卡识别号
u8 axis; // 轴号
u16 csr = 0; // 通信状态寄存器
i32 constant; // 常数乘数
// 模态错误处理的变量
u16 commandID; // 函数的commandID
u16 resourceID; // 资源ID
i32 errorCode; // 错误代码
///
// 设置板卡ID
boardID= 1;
// 设置轴号
axis = 1;
// 将ADC读取值乘以该常数以计算所需的速度
constant = 10;
// 将板上变量4初始化为0
err = flex_load_var(boardID, 0, 4);
CheckError;
// 将板上变量1初始化为常数乘数
err = flex_load_var(boardID, constant, 1);
CheckError;
// 开始板上程序存储 - 程序编号1
err = flex_begin_store(boardID, 1);
// 设置操作模式为速度
err = flex_set_op_mode(boardID, axis, NIMC_VELOCITY);
CheckError;
// 插入标签编号1
err = flex_insert_program_label(boardID, 1);
CheckError;
// 读取ADC通道并将ADC值存储在变量2中
err = flex_read_adc(boardID, NIMC_ADC1, 2);
CheckError;
// 将变量2(即ADC值)与变量1(即常数)相乘
// 将结果保存在变量3中
err = flex_mult_vars(boardID, 1, 2, 3);
CheckError;
// 从变量4中减去变量3的值
// 我们对结果不感兴趣 - 只是想
// 在板上设置条件。
err = flex_sub_vars(boardID, 3, 4, 0);
CheckError;
// 由于上述减法设置了条件
// 为“等于零”,这意味着变量
// 3和4的值是相同的
err = flex_jump_label_on_condition (boardID, 0, NIMC_CONDITION_EQUAL, 0, 0, NIMC_MATCH_ALL, 1/*标签编号*/);
// 通过从变量3加载值(即adc值*常数)
// 设置移动的速度(以计数/秒为单位)
err = flex_load_velocity(boardID, axis