Требования: Используйте программное обеспечение Labwindows_cvi для разработки всей системы калибровки машины.
Анализ: вся система калибровки машины представляет собой интегрированную систему управления Аппаратное обеспечение, которое необходимо запрограммировать, в основном включает в себя: векторный анализатор цепей, сканирующую рамку, поворотный стол, контроллер синхронизации и т. Д. Набор процесса калибровки формируется посредством управления этим оборудованием. В настоящее время эти аппаратные средства управляются отдельно, поскольку сканирующая рамка, поворотный стол и контроллер синхронизации являются нестандартными инструментами, поэтому здесь они подробно не описываются. Поэтому в этой главе в основном описывается программно-управляемый векторный анализатор цепей Labwindows_cvi, основанный на языке c.
Эта глава в основном состоит из нескольких частей: подключение прибора, отправка команд прибора и получение данных прибора.
Оглавление
1 Использование библиотеки функций VISA в Labwindows_cvi
1.3 Конкретные операции с ресурсами
2 Программирование Labwindows_cvi на языке c
1 Использование библиотеки функций VISA в Labwindows_cvi
Библиотека функций VISA, представленная в Labwindows_cvi, является реализацией стандартной VISA.Откройте окно выбора панели функций библиотеки функций VISA, и вы увидите, что она содержит 3 подкласса.
● управление ресурсами;
● шаблон ресурса;
• Операции над конкретными ресурсами.
Подкласс управления ресурсами реализует управление расположением ресурсов и жизненным циклом связи интерфейса в стандарте VISA; подкласс шаблонов ресурсов реализует управление атрибутами, службу блокировки ресурсов и механизм событий в стандарте VISA; подкласс конкретных операций с ресурсами реализует стандарт VISA Medium I. /О контроль.
1.1 Управление ресурсами
Управление ресурсами включает в себя определение местонахождения ресурсов и управление жизненным циклом связи. Расположение ресурса — это функция viOpenDefaultRM, которая реализует расположение всех ресурсов VISA на машине и возвращает дескриптор ресурса типа ViSession через указатель. Через этот дескриптор реализуется управление жизненным циклом связи для всех конкретных ресурсов. Управление жизненным циклом связи включает в себя открытие ресурсов, поиск ресурсов и закрытие ресурсов.
1.2 Шаблон ресурса
Подкласс шаблонов ресурсов обеспечивает управление атрибутами VISA, службу блокировки ресурсов и механизм событий. Эта часть содержания не отражена в данной статье, поэтому подробно описываться не будет.
1.3 Конкретные операции с ресурсами
Операции, специфичные для ресурсов, включают функции связи на основе сообщений и функции связи на основе регистров.
1.3.1 Функции связи на основе сообщений
Инструменты на основе сообщений имеют отдельные процессоры, которые интерпретируют полученную информацию и интерпретируют информацию в инструкции или данные. VISA обеспечивает форматированный ввод-вывод и базовые функции ввода-вывода для обмена сообщениями.
(1) Функция форматирования ввода/вывода
Очень похожая на стандартные функции форматирования C, она может отправлять или получать форматированные данные, включая: viPrintf(), viScanf(), viQueryf(), viFlush().
(2) Основные функции ввода/вывода
Базовый ввод-вывод поддерживает синхронную и асинхронную передачу данных двумя способами.
Функция синхронной передачи завершает выполнение других программ во время вызывающего процесса и не возвращается до тех пор, пока данные не будут получены или отправлены.К функциям, поддерживающим синхронную передачу, относятся viWrite, viRead, viClear, viAssertTrigger и viReadSTB.
Функция асинхронной передачи возвращается сразу после вызова, а событие завершения асинхронного чтения и записи (VI_EVENT_IO_COMPLETION) генерируется после завершения передачи данных, а событие VI_EVENT_IO_COMPLETION может быть обработано с помощью очереди событий или функции обратного вызова.
1.3.2 Коммуникационные функции на основе регистров
Не уточняйте здесь.
1.4 Общие функции VISA
1.4.1 Позиционирование менеджера ресурсов VISA - viOpenDefaultRM
原型:ViStatus viOpenDefaultRM ( ViSession sesn);
Описание: Эта функция используется для инициализации менеджера ресурсов VISA, эта функция должна вызываться перед любыми другими функциями VISA.
Таблица 1-1 Параметры функции viOpenDefaultRM
параметр |
описывать |
звук |
Возвращает индивидуальный идентификатор менеджера ресурсов VISA. |
Таблица 1-2 возвращаемое значение функции viOpenDefaultRM
идентификатор |
ценить |
описывать |
VI_SUCCESS |
0 |
VISA Explorer успешно инициализирован. |
VI_ERROR_ALLOC |
Недостаточно системных ресурсов. |
|
VI_ERROR_INV_SETUP |
Файл конфигурации недействителен или не существует. |
|
VI_ERROR_SYSTEM_ERROR |
Ошибка инициализации системы VISA. |
1.4.2 Подключение инструментов ——viOpen
原型:ViStatus viOpen ( сеанс ViSession , имя ViRsrc , режим ViAccessMode , время ожидания ViUInt32 , ViSession vi);
Описание: подключиться к указанному устройству и вернуть идентификатор подключения, который можно использовать для вызова других функций.
Таблица 1-3 Параметры функции viOpen
параметр |
направление |
описывать |
звук |
В |
Логический идентификатор VISA Explorer |
имя |
В |
адрес |
режим |
В |
Метод открытия соединения, который может принимать следующие значения: VI_EXCLUSIVE_LOCK открыт монопольно; VI_LOAD_CONFIG открывается в соответствии с внешним файлом конфигурации VI_NULL обычный открытый множественный доступ |
тайм-аут |
В |
Если он открыт исключительно, параметр представляет собой абсолютное время (в мс), и по истечении времени ожидания будет возвращена ошибка. Другие методы подключения игнорируют это значение. |
ви |
ВНЕ |
Возвращает логический идентификатор открытого соединения |
Таблица 1-4 возвращаемое значение функции viOpen
идентификатор |
ценить |
описывать |
VI_SUCCESS |
0 |
подключение удалось. |
VI_SUCCESS_DEV_NPRESENT |
Соединение прошло успешно, но ответа с указанного адреса нет. |
|
VI_WARN_CONFIG_NLOADED |
Указанный адрес не существует или формат адреса неверен. |
|
VI_ERROR_ALLOC |
Недостаточно системных ресурсов. |
|
VI_ERROR_INTF_NUM_NCONFIG |
Указанный адрес действителен, но не может быть использован. |
|
VI_ERROR_INV_ACC_MODE |
Незаконный режим доступа. |
|
VI_ERROR__INV_RSRC_NAME |
Ошибка синтаксиса имени адреса. |
|
VI_ERROR__INV_SESSION VI_ERROR__INV_OBJECT |
недействительный ви. |
|
VI_ERROR_LIBRARY_NFOUND |
Библиотека VISA загружена не полностью. |
|
VI_ERROR_NSUP_OPER |
Видно Проводник не поддерживает эту функцию. |
|
VI_ERROR_RSRC_BUSY |
увиденный действителен, но в настоящее время недоступен. |
|
VI_ERROR_RSRC_LOCKED |
видно монополизировано. |
|
VI_ERROR_RSRC_NFOUND |
Недостаточно информации или ресурсов не существует. |
|
VI_ERROR_TMO |
0Xbfff0015 |
Время операции вышло. |
1.4.3 Отправка команд прибора — viPrintf и viWrite
(1)випринтф
Пример: ViStatus viPrintf ( ViSession vi, ViString writeFmt, ...);
Описание: форматирование строки и отправка отформатированной строки на устройство. (Форматирование строк может относиться к функции Format в классе CString в MFC.)
Функции viWrite и viPrintf нельзя использовать одновременно на одном и том же ресурсе.
Параметры некоторых функций VISA являются переменными (такими как viPrintf, viScanf и viQueryf), из-за чего VB не может выполнить вызов. Вместо этого пользователи могут использовать функции, эквивалентные этим функциям.
Параметр writeFmt может содержать обычные символы, общие символы форматирования и специальные символы. Обычные символы (включая пробелы) записываются как обычно без каких-либо изменений. Обратная косая черта (\) должна быть добавлена перед специальным символом; символ формата состоит из знака процента (%) и флага операции, который будет введен позже.
Таблица 1-5 Специальные символы
\n |
Отправляет символ новой строки ASCII, и вместе с ним автоматически отправляется флаг END. |
\р |
Отправить возврат каретки ASCII. |
\т |
Отправить символ табуляции ASCII. |
\### |
Отправить указанное восьмеричное число. |
\” |
Отправьте двойную кавычку ASCII. |
\\ |
Отправить обратную косую черту ASCII. |
Таблица 1-6 Параметры функции viPrintf
параметр |
направление |
описывать |
ви |
В |
идентификатор объекта |
написатьFmt |
В |
строка формата |
表1-7 viPrintf函数返回值
标识符 |
值 |
描述 |
VI_SUCCESS |
0 |
参数成功格式化。 |
VI_ERROR_ALLOC |
内存不足。 |
|
VI_ERROR_INV_FMT |
writeFmt包含无效格式化说明符。 |
|
VI_ERROR__INV_SESSION VI_ERROR__INV_OBJECT |
vi不能标志正确的连接。 |
|
VI_ERROR_IO |
位置IO错误。 |
|
VI_ERROR_NSUP_FMT |
writeFmt有不支持的格式说明符。 |
|
VI_ERROR_RSRC_LOCKED |
vi被独占。 |
|
VI_ERROR_TMO |
操作超时。 |
(2)viWrite
原型:ViStatus viWrite (ViSession vi, ViBuf buf, ViUInt32 cnt, ViPUInt32 retCnt);
描述:同步写入数据。写入的数据存储在buf中。当数据写入完毕函数才返回。任何时间都只能存在一个同步写入。
如果retCnt的值为VI_NULL,将不返回写入数据长度值。
表1-8 viWrite函数参数
参数 |
方向 |
描述 |
vi |
IN |
对象标识符 |
buf |
IN |
写入数据存放地址。 |
cnt |
IN |
指定写入长度。 |
retCnt |
OUT |
实际写入长度,如果为VI_NULL表示不关心该值。 |
表1-9 viWrite函数返回值
标识符 |
值 |
描述 |
VI_SUCCESS |
0 |
成功读取,读取到END指示器结束。 |
VI_SUCCESS_MAX_CNT |
成功读取,已经达到最大长度cnt。 |
|
VI_SUCCESS_TERM_CHAR |
成功读取,读取到特定终止符。 |
|
VI_ERROR_ASRL_FRAMING |
格式错误。 |
|
VI_ERROR_ASRL_OVERRUN |
溢出错误。 |
|
VI_ERROR_ASRL_PARITY |
同步错误。 |
|
VI_ERROR_BERR |
总线错误。 |
|
VI_ERROR_CONN_LOST |
连接丢失。 |
|
VI_ERROR_INV_SESSION VI_ERROR_INV_OBJECT |
vi不能标志正确的连接。 |
|
VI_ERROR_INV_SETUP |
设置无效,不能执行操作。 |
|
VI_ERROR_IO |
位置I/O是错误。 |
|
VI_ERROR_NCIC |
非法控制器。 |
|
VI_ERROR_NLISTENERS |
没有检测到听者。 |
|
VI_ERROR_NSUP_OPER |
vi不支持此函数。 |
|
VI_ERROR_OUTP_PROT_VIOL |
设备报告输出协议错误。 |
|
VI_ERROR_RAW_RD_PROT_VIOL |
传输时读协议被破坏。 |
|
VI_ERROR_RAW_WD_PROT_VIOL |
传输时写协议被破坏。 |
|
VI_ERROR_RSRC_LOCKED |
vi被独占。 |
|
VI_ERROR_TMO |
操作超时。 |
1.4.4 接收仪器数据——viScanf或viRead
(1)viScanf
原型:ViStatus viScanf (ViSession vi, ViString readFmt,arg1,arg2, ...);
描述:这操作从设备读取一个字符串,然后格式化后保存值arg变量中。格式化字符串包含说明符、空格字符和普通字符。
VISA中参数不确定的函数(viPrintf,viScanf,和viQueryf)不能被 VB调用。可以用功能相似的viVPrintf,viVScanf,和viVQueryf代替。
表1-10 viScanf函数参数
参数 |
方向 |
描述 |
vi |
IN |
对象标识符 |
readFmt |
IN |
格式化字符串。 |
表1-11 viScanf函数返回值
标识符 |
值 |
描述 |
VI_SUCCESS |
0 |
成功读到数据并且格式化到arg参数里。 |
VI_ERROR_ALLOC |
内存不足。 |
|
VI_ERROR_INV_FMT |
readFmt包含无效格式化说明符。 |
|
VI_ERROR__INV_SESSION VI_ERROR__INV_OBJECT |
vi不能标志正确的连接。 |
|
VI_ERROR_IO |
位置IO错误。 |
|
VI_ERROR_NSUP_FMT |
readFmt有不支持的格式说明符。 |
|
VI_ERROR_RSRC_LOCKED |
vi被独占。 |
|
VI_ERROR_TMO |
操作超时。 |
(2)viRead
原型:ViStatus viRead (ViSession vi, ViPBuf buf, ViUInt32 cnt, ViPUInt32 retCnt);
描述:同步读取数据。读取的数据存在buf中,当数据读取完毕函数才返回。任何时间都只能存在一个同步读取。遇到以下情况同步读取结束:
1)收到END指示器;
2)读取到终止符;
3)读取的数据大小达到cnt的值。
注意:必须设置读取终止符。
表1-12 viRead函数参数
参数 |
方向 |
描述 |
vi |
IN |
对象标识符 |
buf |
OUT |
返回数据存取地址。 |
cnt |
IN |
指定读取长度。 |
retCnt |
OUT |
实际读取长度,如果为VI_NULL表示不关心该值。 |
表1-13 viRead函数返回值
标识符 |
值 |
描述 |
VI_SUCCESS |
0 |
成功读取,读取到END指示器结束。 |
VI_SUCCESS_MAX_CNT |
成功读取,已经达到最大长度cnt。 |
|
VI_SUCCESS_TERM_CHAR |
成功读取,读取到特定终止符。 |
|
VI_ERROR_ASRL_FRAMING |
构架错误。 |
|
VI_ERROR_ASRL_OVERRUN |
溢出错误。 |
|
VI_ERROR_ASRL_PARITY |
同步错误。 |
|
VI_ERROR_BERR |
总线错误。 |
|
VI_ERROR_CONN_LOST |
连接丢失。 |
|
VI_ERROR_INV_SESSION VI_ERROR_INV_OBJECT |
vi不能标志正确的连接。 |
|
VI_ERROR_INV_SETUP |
设置无效,不能执行操作。 |
|
VI_ERROR_IO |
位置I/O是错误。 |
|
VI_ERROR_NCIC |
非法控制器。 |
|
VI_ERROR_NLISTENERS |
没有检测到听者。 |
|
VI_ERROR_NSUP_OPER |
vi不支持此函数。 |
|
VI_ERROR_OUTP_PROT_VIOL |
设备记录一个输出协议错误。 |
|
VI_ERROR_RAW_RD_PROT_VIOL |
传输时读协议被破坏。 |
|
VI_ERROR_RAW_WD_PROT_VIOL |
传输时写协议被破坏。 |
|
VI_ERROR_RSRC_LOCKED |
vi被独占。 |
|
VI_ERROR_TMO |
操作超时。 |
1.4.5关闭资源管理器和设备连接——viClose
原型:ViStatus viClose (ViObject vi);
描述:关闭一个资源管理器或者设备连接,并释放内存。
表1-14 viClose函数参数
参数 |
方向 |
描述 |
vi |
IN |
需要关闭的对象。 |
表1-15 viClose函数返回值
标识符 |
值 |
描述 |
VI_SUCCESS |
0 |
关闭成功。 |
VI_WARN_NULL_OBJECT |
要关闭的对象时空对象。 |
|
VI_ERROR_CLOSING_FAILED |
vi不能标识正当对话通道。 |
|
VI_ERROR__INV_SESSION VI_ERROR__INV_OBJECT |
无法释放与该对话通道相关联的内存数据结构。 |
2 Labwindows_cvi基于c语言编程
案例:以3672系列的矢量网络分析仪为例,实现矢网连接,发送命令到矢网,接收矢网数据,关闭矢网连接等功能。
2.1界面设计
界面主要包含矢网连接、发送矢网重置命令、接收矢网数据、断开矢网连接、消息提示框等功能。
图2-1 demo界面
2.2实现代码
所有功能实现代码如下:
#include <utility.h>
#include <ansi_c.h>
#include <cvirte.h>
#include <userint.h>
#include <visa.h>
#include "PNA_CONECT.h"
static int pnaConect;
ViSession defaultRM ,vi;
unsigned char Data_Mag[5000]; // 幅度测试数据
char c_currentMessage[300]; // 提示消息
void GetDateTime(void);
/*==========VISA资源管理器定位==========*/
int RMConnect(void);
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((pnaConect = LoadPanel (0, "PNA_CONECT.uir", PNA_CONECT)) < 0)
return -1;
DisplayPanel (pnaConect);
RunUserInterface ();
DiscardPanel (pnaConect);
return 0;
}
int CVICALLBACK PNA_CONECT_CALLBACK (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
switch (event)
{
case EVENT_GOT_FOCUS:
break;
case EVENT_LOST_FOCUS:
break;
case EVENT_CLOSE:
QuitUserInterface (0);
break;
}
return 0;
}
/*==========VISA资源管理器定位==========*/
int RMConnect()
{
int error,result;
error= viOpenDefaultRM(&defaultRM);
while(error)
{
result = GenericMessagePopup("Error", "VISA资源管理器定位失败!", "重试", "忽略", "", 0, 0, 0, VAL_GENERIC_POPUP_BTN1, VAL_GENERIC_POPUP_BTN1, VAL_GENERIC_POPUP_NO_CTRL);
if(result==1)
{
error= viOpenDefaultRM(&defaultRM);
}
else
break;
}
return defaultRM;
}
/* 连接矢网 */
int CVICALLBACK ConnectPna_CALLBACK (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int error, select;
switch (event)
{
case EVENT_COMMIT:
RMConnect();
error = viOpen(defaultRM, "TCPIP0::192.168.1.41::5025::SOCKET", VI_NULL,VI_NULL, &vi); //3672B
if(error==0)
{
GetDateTime() ;
strcat(c_currentMessage," 矢网连接成功!\n");
SetCtrlVal (panel, PNA_CONECT_TEXTBOX, c_currentMessage);
}
while ( error )
{
select= GenericMessagePopup ("Error", "矢网连接错误,请重试或检查连接状态", "重试", "忽略", "", 0, 0, 0, VAL_GENERIC_POPUP_BTN1, VAL_GENERIC_POPUP_BTN1, VAL_GENERIC_POPUP_NO_CTRL);
if ( select == 1 )
{
error = viOpen(defaultRM, "TCPIP0::192.168.1.41::1024::SOCKET", VI_NULL,VI_NULL, &vi);
}
else
{
GetDateTime() ;
strcat(c_currentMessage," 矢网连接错误,请重试或检查连接状态!\n");
SetCtrlVal (panel, PNA_CONECT_TEXTBOX, c_currentMessage);
}
break;
}
}
return vi;
}
//发送矢网命令
int CVICALLBACK SEND_RST_CALLBACK (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
// 矢网重置
viPrintf(vi,"*RST\n");
// 删除所有测试设置
viPrintf(vi,"CALC:PAR:DEL:ALL\n");
// 关闭所有窗口
viPrintf(vi,"DISPlay:WIND OFF\n");
// 打开新建窗口
viPrintf(vi,"DISPlay:WIND1 ON\n");
// 定义测试内容
// 定义测试内容
viPrintf(vi,"CALC1:PAR:DEF:EXT 'mytrace','S21'\n");
// 显示测试迹线
viPrintf(vi,"DISPlay:WIND1:TRAC1:FEED 'mytrace'\n");
// 选定测试迹线
viPrintf(vi,"CALC1:PAR:SEL 'mytrace'\n");
// 设置测试类型(对数幅度)
viPrintf(vi,"CALC1:FORM MLOG\n");
// 设置扫描类型为段扫描 */
viPrintf(vi,"SENS1:SWE:TYPE SEGM\n");
// 段扫描开始频率 */
viPrintf(vi,"SENS1:SEGM:FREQ:STAR 12GHz\n");
// 段扫描终止频率 */
viPrintf(vi, "SENS1:SEGM:FREQ:STOP 12GHz\n");
// 段扫描频率点数 */
viPrintf(vi,"SENS1:SEGM:SWE:POIN 1\n");
GetDateTime();
strcat(c_currentMessage," 矢网命令已发送!\n");
SetCtrlVal (panel, PNA_CONECT_TEXTBOX, c_currentMessage);
break;
}
return 0;
}
//接收矢网数据
int CVICALLBACK RECEIVE_DATA_CALLBACK (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
// 频点个数
int length=1;
switch (event)
{
case EVENT_COMMIT:
// 从通道 1 所选测量轨迹中读取格式化数据。
viPrintf(vi,"CALC1:DATA? FDATA\n");
// 读取矢网测试数据 length:频点个数
viRead (vi,Data_Mag ,length*20,VI_NULL);
GetDateTime();
strcat(c_currentMessage," ");
strcat(c_currentMessage,Data_Mag);
//将读取的数据显示
SetCtrlVal (panel, PNA_CONECT_TEXTBOX, c_currentMessage);
GetDateTime();
strcat(c_currentMessage," 数据读取完成!\n");
SetCtrlVal (panel, PNA_CONECT_TEXTBOX, c_currentMessage);
break;
}
return 0;
}
//释放矢网资源
int CVICALLBACK DISCONNECT_CALLBACK (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
viClose(vi);
viClose(defaultRM);
GetDateTime();
strcat(c_currentMessage," 已经释放矢网资源并关闭!\n");
SetCtrlVal (panel, PNA_CONECT_TEXTBOX, c_currentMessage);
break;
}
return 0;
}
//获取系统日期时间
void GetDateTime()
{
int i_hour, i_minute , i_second ;
int i_month , i_day , i_year;
char c_hour[9], c_minute[3], c_second[3];
char c_year[10], c_month[3], c_day[3];
char c_diagonal[2]="/", c_colon[2]=":",c_space[2]=" ";
char c_date[19], c_currenttime[9];
//获取系统时间
GetSystemTime(&i_hour,&i_minute , &i_second );
//获取系统日期
GetSystemDate(&i_month,&i_day, &i_year);
//将int类型数据转为字符串数据
sprintf(c_hour,"%d",i_hour);
sprintf(c_minute,"%d",i_minute);
sprintf(c_second,"%d",i_second);
sprintf(c_year,"%d",i_year);
sprintf(c_month,"%d",i_month);
sprintf(c_day,"%d",i_day);
//拼接字符串
strcpy(c_date,strcat(strcat(strcat(strcat(c_year,c_diagonal),c_month),c_diagonal),c_day));
strcpy(c_currenttime,strcat(strcat(strcat(strcat(c_hour,c_colon),c_minute),c_colon),c_second));
strcpy(c_currentMessage,strcat(strcat(c_date,c_space),c_currenttime));
}
2.3功能显示
连接的矢量网络分析仪型号时AV3672B矢量网络分析仪,展示功能如下:
图2-2 demo实现效果