程控电源SCPI命令CAPL调用控制dll
一、前情提要
《程控电源CANoe上位机面板》这篇文章描述的上位机面板,是基于Frame帧格式写的,并且是直接使用capl编写,不方便其他语言调用,同时只能使用capl内置的rs232函数收发帧数据,以此来远程控制电源,导致只能使用rs232串口与电源进行通讯。
而itech系列电源一般有三种通讯模块:RS232 通讯电缆、USB 通讯电缆、GPIB 转接器。为了增大通讯模块的通用性,以及方便其他编程语言的调用,本文通过itech系列电源的另一种通讯协议方式即SCPI命令控制,编写一个dll,dll封装好设置电压、设置电流等控制电源的函数,并以USB通讯模块为例控制电源。
二、前期准备
1、itech系列电源的两种通讯协议方式
可以登录ITECH官网获取官方的通讯协议文档,如下图,有FRAME和SCPI两种方式,FRAME格式在《程控电源CANoe上位机面板》文章已提及,SCPI为本文使用的通讯方式。

2、SCPI命令
SCPI(Standard Commands for Programmable Instruments),也称为可编程仪器标准命令,定义了总线控制器与仪器的通讯方式。是一种基于 ASCII 的仪器命令语言,供测试和测量仪器使用。
可以简单理解为通过发送字符来控制电源。具体的SCPI命令格式可以细看通讯协议文档。许多其他系列仪器也可使用SCPI控制,因此本文编写可供CAPL调用的SCPI命令控制dll思路,也可类推用于控制其他系列仪器的dll编写。
3、VISA驱动
如图1右上角,ITECH官网会提示到NI官网搜索可下载Visa驱动。NI-VISA为使用以太网、GPIB、串口、USB和其他类型仪器的用户提供支持。可以简单理解为有了visa驱动,则程序能够通过通讯模块RS232通讯电缆、USB、GPIB 等收发SCPI命令与电源通讯。

4、DLL制作
供CAPL调用的dll制作官方有提供例程,例程路径如下:
C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 17.0.201\Programming\CAPLdll

5、VISA接口
DLL的制作使用C++语言编写。因此下载好VISA驱动后,需找到VISA提供C\C++使用的接口。
接口库以及头文件在如下路径:
C:\Program Files\IVI Foundation\VISA\Win64

VISA接口API说明可在帮助文档里找到,帮助文档所在路径如下:
C:\Users\Public\Documents\National Instruments\NI-VISA\Documentation


三、程序编写
1、导入VISA接口
用下方两个语句将即可将VISA头文件以及Lib文件中的API导入制作CAPL dll的工程中,供程序调用:
#include <C:\\Program Files\\IVI Foundation\\VISA\\Win64\\Include\\visa.h>
#pragma comment (lib,"C:\\Program Files\\IVI Foundation\\VISA\\Win64\\Lib_x64\\msc\\visa64.lib")

2、程序逻辑编写
1. 生成DLL逻辑
根据以下前辈文章进行学习,可明白如何封装CAPL函数接口:
CANoe DLL编程(一)—— Visual Studio 创建DLL以及动态调用
2. VISA控制硬件逻辑
根据以下前辈文章进行学习,可理解如何通过VISA控制硬件,明白封装什么样的CAPL dll接口函数,以及了解后续如何查找设备ID,检测SCPI命令正确性等知识:
C++/QT控制通过VISA控制硬件设备,超级容易学会的控制硬件方法
3. 根据需求编写最终逻辑
结合前两篇文章,以及使用程控电源需求,封装如下函数:

通过调用VISA接口增加逻辑实现CAPL dll接口,以Poweron打开电源函数为例:

3、生成最终DLL

四、CAPL调用示例
(1) 在生成好capldll.dll文件后,更改名为PowerCtrl.dll,创建PowerManage.cin文件导入PowerCtrl.dll。

(2) PowerManage.cin将dll导入,提供的API二次包装,方便用CAPL进行二次开发。

(3) cin文件sample_test()中为介绍如何在canoe上使用示例,include到需要的脚本(.can)下即可供CAPL使用。

五、总结
can文件通过导入cin文件,cin文件里的函数使用dll里的接口函数,dll里的接口函数使用VISA提供的API接口,API接口可实现发送SCPI等命令控制程控电源,此过程即CAPL控制程控电源的链路实现。
1617

被折叠的 条评论
为什么被折叠?



