** Примечание. Перекрестно размещено на форумах LabVIEW: http://forums.ni.com/t5/LabVIEW/C-VISA-wait-on-RQS/td-p/3122939
Я пытаюсь написать простую программу C # (.NET 4.0) для управления SMU Keithley 2400 через VISA GPIB, и у меня возникают проблемы с тем, чтобы программа ожидала запроса на обслуживание, который Keithley отправляет в конце развертки .
Развертка представляет собой простую линейную развертку напряжения, внутренне управляемую блоком Кейтли. У меня есть устройство, настроенное на отправку сигнала ServiceRequest в конце цикла или при достижении соответствия.
Я могу отправлять команды в SMU и читать буфер данных, но только если я вручную ввожу тайм-аут между командой запуска развертки и командой чтения данных.
Одна проблема, с которой я столкнулся, заключается в том, что я новичок в C # - я использую этот проект (портирую части моего LV-кода), чтобы изучить его.
Вот что у меня есть для моего кода на C #:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using NationalInstruments.VisaNS;
private void OnServiceRequest(object sender, MessageBasedSessionEventArgs e)
{
Console.WriteLine("Service Request Received!");
}
// The following code is in a class method, but
public double[,] RunSweep()
{
// Create the session and message-based session
MessageBasedSession mbSession = null;
Session mySession = null;
string responseString = null;
// open the address
Console.WriteLine("Sending Commands to Instrument");
instrAddr = "GPIB0::25::INSTR";
mySession = ResourceManager.GetLocalManager().Open(instrAddr);
// Cast to message-based session
mbSession = (MessageBasedSession)mySession;
// Here's where things get iffy for me... Enabling the event and whatnot
mbSession.ServiceRequest += new MessageBasedSessionEventHandler(OnServiceRequest);
MessageBasedSessionEventType srq = MessageBasedSessionEventType.ServiceRequest;
mbSession.EnableEvent(srq, EventMechanism.Handler);
// Start the sweep (SMU was set up earlier)
Console.WriteLine("Starting Sweep");
mbSession.Write(":OUTP ON;:INIT");
int timeout = 10000; // milliseconds
// Thread.Sleep(10000); // using this line works fine, but it means the test always takes 10s even if compliance is hit early
// This raises error saying that the event is not enabled.
mbSession.WaitOnEvent(srq, timeout);
// Turn off the SMU.
Console.WriteLine("I hope the sweep is done, cause I'm tired of waiting");
mbSession.Write(":OUTP OFF;:TRAC:FEED:CONT NEV");
// Get the data
string data = mbSession.Query(":TRAC:DATA?");
// Close session
mbSession.Dispose();
// For now, create a dummy array, 3x3, to return. The array after is the starting value.
double[,] dummyArray = new double[3, 3] {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
return dummyArray;
}
Все вышеперечисленное должно имитировать этот код LabVIEW:
Итак, есть идеи, где я ошибаюсь?
Спасибо,
Редактировать:
Немного поигравшись, я обнаружил, что функция запроса на обслуживание OnServiceRequest
действительно запускается в нужное время (на консоль выводится сообщение «Запрос на обслуживание получен!»).