Labwindows_cvi — векторный анализатор цепей с программным управлением на языке C

        Требования: Используйте программное обеспечение Labwindows_cvi для разработки всей системы калибровки машины.

        Анализ: вся система калибровки машины представляет собой интегрированную систему управления Аппаратное обеспечение, которое необходимо запрограммировать, в основном включает в себя: векторный анализатор цепей, сканирующую рамку, поворотный стол, контроллер синхронизации и т. Д. Набор процесса калибровки формируется посредством управления этим оборудованием. В настоящее время эти аппаратные средства управляются отдельно, поскольку сканирующая рамка, поворотный стол и контроллер синхронизации являются нестандартными инструментами, поэтому здесь они подробно не описываются. Поэтому в этой главе в основном описывается программно-управляемый векторный анализатор цепей 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实现效果

 

Supongo que te gusta

Origin blog.csdn.net/caimeihua5369/article/details/119581479
Recomendado
Clasificación