本文档介绍用于NI-CAN驱动软件的通道API的基础知识。对于刚刚开始使用NI-CAN 2.0及更高版本的工程师非常有用。关于软件的完整概述,请查看NI-CAN硬件和软件用户手册。
NI-CAN兼容LabVIEW 2018及之前的LabVIEW版本,对于使用更高版本LabVIEW的用户,请查看将NI-CAN应用程序迁移至NI-XNET的指南。
除了在NI Measurement & Automation Explorer (MAX)中进行配置和分析的工具之外,NI-CAN驱动程序软件还提供2个功能齐全的应用程序编程接口(API)。NI-CAN API允许用户开发符合测试和仿真要求的应用程序。通过通道API,可使用易于使用的高层函数访问向量数据库(.dbc)或NI CAN数据库(.ncd)文件中定义的CAN通道。建议CAN初学者使用通道API。帧API提供对通过CAN总线传输的比特位的底层访问,建议高级用户使用。本文档主要介绍通道API。关于帧API的更多信息,见NI-CAN硬件和软件手册。
NI-CAN通道API利用预定义的CAN通道,使CAN编程与NI-DAQ编程类似。通道API的基本编程模型如图1所示。
图1 LabVIEW中的基本NI-CAN通道API编程模型
首先,必须定义或导入CAN通道。Measurement & Automation Explorer (MAX)可用于安装、测试和配置大多数NI硬件,包括CAN接口。MAX还可用于导入或创建CAN数据库文件,并包含其他工具,如CAN总线监视器和CAN通道测试面板。
图2 Measurement & Automation Explorer中的CAN通道
通常希望从数据库文件导入CAN通道。如需从向量数据库(.dbc)文件导入CAN通道,展开数据邻居树以查看CAN通道。右键单击CAN通道并选择从CANdb文件导入。这些数据库文件通常由设计CAN设备的工程师创建。现在浏览直到找到所需的数据库文件。找到并选择文件后,可选择导入文件中的所有消息,或选择要导入的特定通道。单击导入按钮,然后单击完成。消息和通道将出现在MAX的CAN通道下,如图2所示。展开消息目录树,右键单击所需的通道,选择属性,可查看和编辑这些消息和通道。通过查看通道的属性,可在消息网格中查看通道在消息中的位置。
有时可能没有可用的向量数据库文件,需要在MAX中创建通道。首先右键单击CAN通道并选择创建消息。指定名称、仲裁ID、数据字节数和默认接口,然后选择确定。现在,右键单击消息并选择创建通道可创建单个通道。必须指定通道名称、起始位、位数、换算信息和单位。请注意,指定起始位和位数后,右下角的网格将显示通道在消息中的位置。
单击确定后,通道将显示在MAX的消息下。如需创建其他通道,可再次右键单击消息并选择创建通道。此时请注意,网格已高亮显示为上一个通道保留的位。如尝试为相同位配置另一个通道,将看到红色错误显示控件。创建通道以完成消息的步骤相同。可使用模拟和数字通道组合配置消息;最多可使用64个数字通道,每个通道1位。
获得所需的通道配置后,可将其保存以用于其他计算机。右键单击CAN通道并选择保存通道配置。这将配置保存为NI CAN数据库(.ncd)文件,该文件可导入MAX或使用NI-CAN 2.0或更高版本驱动软件直接从应用程序中调用。如之前演示的向量数据库(.dbc)文件,也可将NI数据库(.ncd)文件从保存的配置导入MAX。右键单击CAN通道并选择加载通道配置,找到.ncd文件并选择所需的消息。选择加载,然后单击完成,通道将再次出现在MAX中。
基本的NI-CAN程序包括初始化、读取或写入和清除(见图1)。函数之间的联系是任务。CAN任务是具有相同定时和通信方向(读/写)的CAN通道的集合。一个任务可以包含多个消息,但消息必须位于同一个接口(端口)。无论使用LabVIEW、LabWindows/CVI、C/C++还是Visual Basic 6.0,该编程模型都是一样的。关于LabVIEW的教程,请访问ni.com/tutorials。
CAN初始化开始VI:CAN初始化开始函数将通道列表初始化为单个任务,并开始该任务的通信。CAN初始化开始函数使用下列输入参数:
通道列表-指定任务的通道列表
interface-指定任务使用的CAN接口(CAN0、CAN1等)。
模式-指定任务使用的I/O模式(数据传输方向)。
采样率-指定数据传输的采样率(每秒采样)
多种读取模式可更方便地自定义应用程序。NI-CAN有三种读取模式。我们将在以下章节讨论每个选项:
1.单点
2.连续
3.时间标识
如初始化开始的模式为输入,应用程序必须调用读取函数获取采样。应用程序通常在循环中调用读取直到完成。读取函数在LabVIEW中为CAN读取(所有类型不以Time & Dbl结尾),在其他语言中为nct读取。读取的行为取决于初始化的采样率:
CAN读取VI:
单点读取(模式 = 输入,采样率 = 0)
该读取返回从网络接收的最近消息的单个采样。初始化开始列表中的每个通道返回一个采样。如需快速访问最新的CAN消息,可使用此功能。
图3显示了采样率 = 0的读取范例。A、B和C表示初始化通道的消息。如应用程序启动后未收到任何消息,将返回MAX中的默认值(def)和警告。
连续读取(模式 = 输入,采样率 > 0)
连续模式可用于记录DAQ设备的模拟或数字数据。该读取返回初始化开始列表中每个通道的采样数组。每当指定的时间过去,最新消息的采样将被插入数组。即以指定速率在数组中重复采样,直至收到新消息。连续模式可用于记录DAQ设备的模拟或数字数据。通过NI-DAQ模拟输入通道使用相同的采样率,可比较CAN和DAQ采样随时间的变化。
图4显示了采样率>0的读取范例。A、B和C表示初始化通道的消息。Δt表示采样率指定的采样间隔时间。def表示MAX中的默认值。
时间标识读取(模式=时间标识输入)
时间标识模式适用于需要CAN/DAQ同步但无需进一步CAN数据处理的测试应用程序。如初始化开始模式为时间标识输入,应用程序必须调用读取时间标识函数获取值。应用程序通常在循环中调用读取时间标识,直到完成。“读取时间标识”函数返回对应于从网络接收的消息的采样。对于每个消息,将返回相关的采样以及指定消息到达时间的时间标识。对于InitStart列表中的每个通道,都将返回时间标识采样数组。读取时间标识函数在LabVIEW中为CAN读取(类型以Time & Dbl结尾),在其他语言中为nctReadTimestamped。
图5显示了读取时间标识的范例。A、B和C表示初始化通道的消息。At、Bt和Ct表示收到每个消息的时间。
多种写入模式可更方便地自定义应用程序。NI-CAN有三种写入模式。我们将在下一节讨论每个选项:
1.单点
2.连续
3.时间标识
如初始化开始模式为输出(或最近输出),应用程序必须调用写入函数输出值。应用程序通常在循环中调用写入,直到完成。写入函数在LabVIEW中为CAN写入,在其他语言中为nctWrite。写入的行为取决于初始化的采样率:
CAN写入VI
非周期单点写入(模式 = 输出,采样率 = 0)
写入立即在网络上传输消息。提供给写入的采样用于形成消息数据字节。初始化开始列表中的每个通道必须指定一个采样。初始化开始模式必须为“输出”,而不是“最近输出”。图6显示了采样率 = 0的写入范例。A、B、C和D表示初始化通道的消息。对于每个写入,相关的消息将尽快传输。
图6.采样率 = 0的写入范例
连续写入(模式 = 输出,采样率 > 0)
为初始化开始列表中的每个通道提供采样数组。每当指定的时间过去,就会传输下一条消息。每个消息使用数组的下一个采样组成消息的数据字节。也就是说,数组中的采样被周期性地传输到网络上。通过NI-DAQ模拟输出通道使用相同的采样率,可随时间输出同步的CAN和DAQ采样。
图7显示了采样率>0且输出模式的写入范例。A、B、C和D表示初始化通道的消息。Δt表示采样率指定的消息传输时间间隔。
单点写入(模式 = 最近输出,采样率 > 0,可为初始化开始列表中的每个通道提供单个采样。每次时钟以指定速率滴答时,将使用您提供的最新采样传输下一条消息。最近输出模式适用于多个以不同速率运行的任务,因为用户可在一个循环中为所有任务写入采样。图8显示了采样率>0且输出最近模式的写入范例。
图8.采样率>0,输出最近模式的写入范例
CAN清零VI:清除函数停止任务通信并清除配置。对于每个初始化的任务,退出应用程序前必须调用清除。清除函数在LabVIEW中为CAN清除,在其他语言中为nctClear。
下列章节提供了用于扩展基本编程模型的信息。
获取名称
如开发一个供他人使用的应用程序,则无需在应用程序中指定固定的通道列表。理想状态下,希望最终用户从用户界面控件(例如,列表框)中选择所需的通道。获取名称函数查询MAX或CAN数据库,并返回该数据库中所有通道或消息的列表。该列表可用于填充用户界面控件。然后可从这些控件中选择通道,无需使用键盘输入每个通道的名称。选择完成后,应用程序可将结果列表传递至初始化开始。获取名称函数在LabVIEW中为CAN获取名称,在其他语言中为nctGetNames。
同步
NI-CAN通道API使用RTSI同步每块卡上的特定功能单元。对于CAN卡,功能单位是接口(端口)。对于DAQ卡,功能单位是特定的测量,如模拟输入或模拟输出。每个函数通过RTSI连接传递两个信号:
· 时基-指定多个板卡共享的公共时钟,以防止时钟漂移。
· 开始触发-指定从一块板卡发送至另一块板卡的开始信号,以防止开始延迟
设置属性
该函数用于设置网络属性,包括波特率、收发器类型和滤波器模式。初始化开始函数使用MAX或CAN数据库文件中指定的接口和通道配置。如需在应用程序中更改该配置,则无法使用初始化开始,因为任务运行时无法更改大多数属性。请先使用初始化,然后设置属性并开始任务。
获取属性
该函数用于获取通道、消息或网络的属性,包括波特率、消息ID和通道缩放因子。
关于通道API或帧API的更多信息,请访问ni.com/manuals下载NI-CAN软硬件手册和产品规范。