研华I/O板卡 API使用说明

发布时间:2023年12月28日


官方文档资料在安装目录下:
在这里插入图片描述
在这里插入图片描述

一. 类

1. 类的继承关系

DANavi的这套API充分利用了组件思想,以DeviceCtrlBase为基类,派生出模拟输入(AI)、模拟输出(AO)、数字输入或数字输出和计数器的其他功能组件。
在这里插入图片描述

2. 类说明

类名称类用途
DaqCtrlBaseDAQNavi设备组件的基类,实现设备组件通用的基本功能
AiCtrlBase模拟输入组件的基类,实现模拟输入组件通用的基本功能
InstantAiCtrl定义在即时模式下获取模拟数据的接口
WaveformAiCtrl定义在缓冲模式下获取模拟数据的接口
AiFeatures表示模拟输入函数的只读属性的集合
AiChannel表示单个模拟输入通道
CjcSetting定义管理CJC(冷接点补偿)功能的接口
AoCtrlBase模拟输出组件的基类,实现模拟输出组件通用的基本功能
InstantAoCtrl定义在即时模式下输出模拟数据的接口
BufferedAoCtrl定义在缓冲模式下输出模拟数据的接口
AoFeatures表示模拟输出函数的只读属性的集合
AoChannel表示单个模拟输出通道
DioCtrlBase数字输入/输出(缩写:DI/O)组件的基类,实现DI/O组件通用的基本功能
InstantDiCtrl定义在即时模式下获取数字数据并监视数字输入事件的接口
InstantDoCtrl定义在即时模式下输出数字数据的接口
BufferedDiCtrl定义在缓冲模式下获取数字数据的接口
BufferedDoCtrl定义在缓冲模式下输出数字数据的接口
DioFeatures表示数字输入/输出(缩写:DI/O)函数的只读属性的集合
DioPort表示一个单独的数字输入/输出端口
DiintChannel表示支持DI中断功能的单个DI通道
DiCosintPort表示支持DI状态更改中断功能的单个DI端口
DiPmintPort表示支持DI模式匹配中断功能的单个DI端口
CntrCtrlBase计数器组件的基类,实现计数器组件通用的基本功能
CntrFeatures表示计数器函数的只读属性的集合
EcChannel表示事件计数功能的单个计数器
EventCounterCtrl定义对输入信号的脉冲进行计数的接口
BufferedEventCounterCtrl定义用于检索数据的接口,该接口用于对输入信号的脉冲进行计数
FmChannel表示频率测量功能的单个计数器
FreqMeterCtrl定义测量输入信号频率的接口
OsChannel表示延迟脉冲生成(一次触发)功能的单个计数器
OneShotCtrl定义用于生成延迟脉冲输出的接口
PiChannel表示脉冲宽度测量功能的单个计数器
PwMeterCtrl定义测量输入信号脉冲宽度的接口
BufferedPwMeterCtrl定义用于检索数据的接口,该接口用于测量输入信号的频率
PoChannel表示脉冲宽度调制输出功能的单个计数器
PwModulatorCtrl定义生成脉宽调制输出的接口
BufferedPwModulatorCtrl定义通过缓冲方式生成脉宽调制输出的接口
TmrChannel表示具有定时器中断功能的脉冲输出的单个计数器
TimerPulseCtrl定义具有定时器中断功能的脉冲输出接口
UdChannel表示上下计数函数的单个计数器
UdCounterCtrl定义执行上下计数功能的接口
BufferedUdCounterCtrl定义执行缓冲递增/递减计数函数的接口
Conversion提供管理缓冲AI/AO转换参数的接口,如启动通道、通道计数等
Record提供管理数据缓冲区参数的接口,如区段长度、区段计数等
ConvertClock提供管理转换时钟的接口
ScanChannel提供管理扫描通道的接口
Trigger提供管理触发器的接口
NosFltChannel表示支持噪声滤波器功能的单个数字通道
DakException表示DAQNavi组件执行过程中发生的错误
DeviceCtrl提供访问底层硬件信息的接口
DeviceEventListener定义接收设备事件的对象的接口。仅适用于JAVA语言
DeviceEventArgs提供设备事件的数据
Array<T>提供访问DAQNavi组件返回的集合的接口。(仅限C++)
CounterIndexer<T>提供访问计数器功能的接口,计数器功能是二维矩阵
CounterCapabilityIndexer提供访问计数器功能的接口
CounterClockSourceIndexer提供访问计数器时钟源的接口
CounterGateSourceIndexer提供访问计数器门源的接口

二. 结构体

结构体名称结构体用途
BfdAiEventArgs为缓冲的AI事件提供数据
BfdAoEventArgs提供缓冲AO事件的数据
DiSnapEventArgs提供DI快照事件的数据
CntrEventArgs提供计数器事件的数据,上下计数除外
UdCntrEventArgs提供上下计数事件的数据
BfdCntrEventArgs提供缓冲计数器事件的数据
DeviceInformation通过DacctrlBase的SelectedDevice属性定义用于选择设备的设备信息
DeviceTreeNode提供设备的信息
MathInterval定义一个有效的数学值范围
PulseWidth定义脉冲宽度
DataMark定义数据标记信息

三. 枚举体

枚举体名称枚举体用途
AccessMode定义用于打开设备的有效访问模式
ActiveSignal定义有效的信号触发边缘
AiChannelType定义设备支持的AI通道的信号连接类型
AiSignalType定义AI通道的有效信号连接类型
CouplingType定义输入通道的耦合类型
ImpedanceType定义通道的阻抗类型
IepeType定义IEPE(集成电子压电励磁)传感器的励磁电流
FilterType定义输入通道的筛选器类型
BurnoutRetType定义在某些特定情况下将返回的返回值的类型
ControlState定义DAQNavi设备组件的运行状态
CounterCapability定义计数器的功能
CounterCascadeGroup定义计数器级联组类型
CounterOperationMode定义计数器操作模式
CounterValueRegister定义计数器寄存器名称
DioPortDir定义DI/O端口方向
DioPortType定义DI/O端口类型
ErrorCode定义DAQNavi设备组件使用的错误代码
FreqMeasureMethod定义频率测量的方法
MathIntervalType定义代数概念中的区间类型,如闭集、开集以及其他一些左极限和右极限组合的集合
ModuleType定义DAQ设备支持的模块类型
OutSignalType定义计数器相关功能的输出信号类型,如带定时器中断的脉冲输出、延迟脉冲生成等
EventId定义DAQ设备使用的事件ID
ProductId驱动程序中的产品ID用于表示DAQ设备型号并区分不同型号的设备。每个设备都有一个唯一的产品ID,例如:PCI1710的产品ID为BD_PCI1710,PCI1710HG的产品ID是BD_PCI171 0HG,USB4718的产品ID则是BD_USB4718
SamplingMethod定义采样方法
CountingType定义计数器在处理时钟信号时的计数模式
SignalDrop定义信号的连接点类型,该信号可能来自连接器上的引脚或由内部逻辑生成
SignalPolarity定义信号极性类型
SignalPosition定义信号的位置
TemperatureDegree定义温标类型
TerminalBoard定义端子板类型
TriggerAction定义当满足触发条件时设备将执行的操作
ValueRange定义DAQ设备支持的值范围类型
ValueUnit定义DAQ设备使用的单位

四. 研华板卡设定说明

1. 端口(port)和通道(channel)的定义

一个端口由八个通道组成,每个通道的值都是高或低,它对应于二进制的0或1,因此由0或1组成的端口值将是一个字节大小的数据。端口的宽度为8。在DAQNavi中,DI/O组件中有用于通道相关设置的接口。

  • 通道(channel):一个通道将连接一个信号,该通道的数据将为0或1。
  • 端口(port):由通道组成。八通道组成一个端口,因此端口的组宽度为8。
  • 端口宽度:由端口组成的通道总数。

以下显示了端口和通道之间的关系:

在这里插入图片描述

2. 端口类型(DioPortType)

DI/O端口类型是指所选设备支持DI/O功能的具体端口类型。DioPortType的枚举列出了这些类型,它们是PortDi、PortDo、PortDio、Port8255A、Port8255C和PortIndvdlDio。下面列出了这些类型的含义。

  • PortDi:表示仅支持DI功能的端口号。
  • PortDo:表示端口号仅支持DO功能。
  • PortDio:表示DI端口和DO端口对应的端口号。
  • 端口8255A:表示通过设置端口方向,该端口可用于运行DI(输入)或DO(输出)功能。
  • 端口8255C:表示端口可以分为两组,每组可以通过设置方向来运行DI(输入)或DO(输出)功能。
  • PortIndvdlDio:意味着端口的每个通道都可以单独设置方向以进行输入或输出。

五. 例程说明

这里以操作PCI-1751板卡为例说明
整体程序逻辑如下:
在这里插入图片描述

  1. cmake设置

    cmake_minimum_required(VERSION 3.5)
    
    project(AdvanteDAQTest LANGUAGES CXX)
    
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    
    #气阀控制板卡
    set(ADVANTECH_DIR "C:\\Advantech\\")
    set(ADVANTECH_INCLUDE_DIRS ${ADVANTECH_DIR}\\DAQNavi\\Inc)
    include_directories(${ADVANTECH_INCLUDE_DIRS})
    
    add_executable(AdvanteDAQTest main.cpp)
    
    include(GNUInstallDirs)
    install(TARGETS AdvanteDAQTest
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    )
    
    
  2. 源代码

    #include <iostream>
    
    #include <stdlib.h>
    #include <stdio.h>
    #include "bdaqctrl.h"  //引入研华SDK头文件
    
    using namespace Automation::BDaq; //引入研华SDK命名空间
    using namespace std;
    
    typedef unsigned char byte;
    
    #define  deviceDescription  L"PCI-1751,BID#0"
    const wchar_t* profilePath = L"PCI-1751DIO.xml";
    int32    startPort = 0;
    int32    portCount = 1;
    
    
    int main(int argc, char* argv[])
    {
        ErrorCode ret = Success;
    
        // 1. 创建用于控制设备的实例
        InstantDoCtrl * instantDoCtrl = InstantDoCtrl::Create();
    
        // 2. 选择硬件设备的型号,创建包含硬件信息(deviceDescription)的实例DeviceInformation,然后加载到控制设备的实例instantDoCtrl中
        DeviceInformation devInfo(deviceDescription);
        ret = instantDoCtrl->setSelectedDevice(devInfo);
        if(BioFailed(ret))
        {
            wchar_t enumString[256];
            AdxEnumToString(L"ErrorCode", (int32)ret, 256, enumString);
            printf("Some error occurred. And the last error code is 0x%X. [%ls]\n", ret, enumString);
            return 0;
        }
    
    
        // 3. 根据配置文件进行设备的初始化,配置文件可以是自己保存的,也可以是默认的(找不到的情况下就是用默认的)
        ret = instantDoCtrl->LoadProfile(profilePath);
        if(BioFailed(ret))
        {
            wchar_t enumString[256];
            AdxEnumToString(L"ErrorCode", (int32)ret, 256, enumString);
            printf("Some error occurred. And the last error code is 0x%X. [%ls]\n", ret, enumString);
            return 0;
        }
    
        // 4. 设置设备的输出模式,设置通道0为输出模式
        Array<DioPort>* dioPort = instantDoCtrl->getPorts();
        ret = dioPort->getItem(0).setDirectionMask(Output);
        if(BioFailed(ret))
        {
            wchar_t enumString[256];
            AdxEnumToString(L"ErrorCode", (int32)ret, 256, enumString);
            printf("Some error occurred. And the last error code is 0x%X. [%ls]\n", ret, enumString);
            return 0;
        }
    
        // 5. 设置端口的输出状态,端口1的1通道设置为输出1
        uint8  bufferForWriting[64] = {0x01}; //16进制格式,0x01代表 0000 0001
        ret = instantDoCtrl->Write(startPort, portCount, bufferForWriting );
        if(BioFailed(ret))
        {
            wchar_t enumString[256];
            AdxEnumToString(L"ErrorCode", (int32)ret, 256, enumString);
            printf("Some error occurred. And the last error code is 0x%X. [%ls]\n", ret, enumString);
            return 0;
        }
    
        // 6. 使用完销毁实例
        instantDoCtrl->Dispose();
    
        // 7. 检测是否有错误
        if(BioFailed(ret))
        {
            wchar_t enumString[256];
            AdxEnumToString(L"ErrorCode", (int32)ret, 256, enumString);
            printf("Some error occurred. And the last error code is 0x%X. [%ls]\n", ret, enumString);
        }
        return 0;
    }
    
    
文章来源:https://blog.csdn.net/qq_30150579/article/details/135245801
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。