基本信息
源码名称:C#安捷伦示波器编程控制
源码大小:0.09M
文件格式:.rar
开发语言:C#
更新时间:2020-11-17
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
/*
* Keysight VISA COM Example in C#
* -------------------------------------------------------------------
* This program illustrates a few commonly used programming
* features of your Keysight oscilloscope.
* -------------------------------------------------------------------
*/
using System;
using System.IO;
using System.Text;
using Ivi.Visa.Interop;
using System.Runtime.InteropServices;
namespace InfiniiVision
{
class VisaComInstrumentApp
{
private static VisaComInstrument myScope;
public static void Main(string[] args)
{
try
{
myScope = new
VisaComInstrument("USB0::0x0957::0x17A6::MY54450160::0::INSTR");
myScope.SetTimeoutSeconds(10);
// Initialize - start from a known state.
Initialize();
// Capture data.
Capture();
// Analyze the captured waveform.
Analyze();
}
catch (System.ApplicationException err)
{
Console.WriteLine("*** VISA COM Error : " err.Message);
}
catch (System.SystemException err)
{
Console.WriteLine("*** System Error Message : " err.Message);
}
catch (System.Exception err)
{
System.Diagnostics.Debug.Fail("Unexpected Error");
Console.WriteLine("*** Unexpected Error : " err.Message);
}
finally
{
myScope.Close();
}
Console.Write("按任意键退出...");
Console.ReadKey(true);
}
/*
* Initialize the oscilloscope to a known state.
* --------------------------------------------------------------
*/
private static void Initialize()
{
string strResults;
// Get and display the device's *IDN? string.
strResults = myScope.DoQueryString("*IDN?");
Console.WriteLine("*IDN? result is: {0}", strResults);
// Clear status and load the default setup.
myScope.DoCommand("*CLS");
myScope.DoCommand("*RST");
}
/*
* Capture the waveform.
* --------------------------------------------------------------
*/
private static void Capture()
{
// Use auto-scale to automatically configure oscilloscope.
myScope.DoCommand(":AUToscale");
// Set trigger mode (EDGE, PULSe, PATTern, etc., and input source.
myScope.DoCommand(":TRIGger:MODE EDGE");
Console.WriteLine("Trigger mode: {0}",myScope.DoQueryString(":TRIGger:MODE?"));
// Set EDGE trigger parameters.
myScope.DoCommand(":TRIGger:EDGE:SOURce CHANnel1");
Console.WriteLine("Trigger edge source: {0}",myScope.DoQueryString(":TRIGger:EDGE:SOURce?"));
myScope.DoCommand(":TRIGger:EDGE:LEVel 1.5");
Console.WriteLine("Trigger edge level: {0}",myScope.DoQueryString(":TRIGger:EDGE:LEVel?"));
myScope.DoCommand(":TRIGger:EDGE:SLOPe POSitive");
Console.WriteLine("Trigger edge slope: {0}",myScope.DoQueryString(":TRIGger:EDGE:SLOPe?"));
// Save oscilloscope configuration.
byte[] ResultsArray; // Results array.
int nLength; // Number of bytes returned from instrument.
string strPath;
// Query and read setup string.
ResultsArray = myScope.DoQueryIEEEBlock(":SYSTem:SETup?");
nLength = ResultsArray.Length;
// Write setup string to file.
strPath = "C:\\Users\\Will\\Desktop\\ConsoleApplication1\\setup.stp";
FileStream fStream = File.Open(strPath, FileMode.Create);
fStream.Write(ResultsArray, 0, nLength);
fStream.Close();
Console.WriteLine("Setup bytes saved: {0}", nLength);
// Change settings with individual commands:
// Set vertical scale and offset.
myScope.DoCommand(":CHANnel1:SCALe 0.05");
Console.WriteLine("Channel 1 vertical scale: {0}",myScope.DoQueryString(":CHANnel1:SCALe?"));
myScope.DoCommand(":CHANnel1:OFFSet -1.25");
Console.WriteLine("Channel 1 vertical offset: {0}",myScope.DoQueryString(":CHANnel1:OFFSet?"));
// Set horizontal scale and offset.
myScope.DoCommand(":TIMebase:SCALe 0.0002");
Console.WriteLine("Timebase scale: {0}",myScope.DoQueryString(":TIMebase:SCALe?"));
myScope.DoCommand(":TIMebase:POSition 0.0");
Console.WriteLine("Timebase position: {0}",myScope.DoQueryString(":TIMebase:POSition?"));
// Set the acquisition type (NORMal, PEAK, AVERage, or HRESolution).
myScope.DoCommand(":ACQuire:TYPE NORMal");
Console.WriteLine("Acquire type: {0}",myScope.DoQueryString(":ACQuire:TYPE?"));
// Or, configure by loading a previously saved setup.
byte[] DataArray;
int nBytesWritten;
// Read setup string from file.
strPath = "C:\\Users\\Will\\Desktop\\ConsoleApplication1\\setup.stp";
DataArray = File.ReadAllBytes(strPath);
nBytesWritten = DataArray.Length;
// Restore setup string.
myScope.DoCommandIEEEBlock(":SYSTem:SETup", DataArray);
Console.WriteLine("Setup bytes restored: {0}", nBytesWritten);
// Capture an acquisition using :DIGitize.
myScope.DoCommand(":DIGitize CHANnel1");
}
/*
* Analyze the captured waveform.
* --------------------------------------------------------------
*/
private static void Analyze()
{
byte[] ResultsArray; // Results array.
int nLength; // Number of bytes returned from instrument.
string strPath;
// Make a couple of measurements.
// -----------------------------------------------------------
myScope.DoCommand(":MEASure:SOURce CHANnel1");
Console.WriteLine("Measure source: {0}",myScope.DoQueryString(":MEASure:SOURce?"));
double fResult;
myScope.DoCommand(":MEASure:FREQuency");
fResult = myScope.DoQueryNumber(":MEASure:FREQuency?");Console.WriteLine("Frequency: {0:F4} kHz", fResult / 1000);
myScope.DoCommand(":MEASure:VAMPlitude");
fResult = myScope.DoQueryNumber(":MEASure:VAMPlitude?");
Console.WriteLine("Vertical amplitude: {0:F2} V", fResult);
// Download the screen image.
// -----------------------------------------------------------
myScope.DoCommand(":HARDcopy:INKSaver OFF");
// Get the screen data.
ResultsArray =
myScope.DoQueryIEEEBlock(":DISPlay:DATA? PNG, COLor");
nLength = ResultsArray.Length;
// Store the screen data to a file.
strPath = "C:\\Users\\Will\\Desktop\\ConsoleApplication1\\screen.png";
FileStream fStream = File.Open(strPath, FileMode.Create);
fStream.Write(ResultsArray, 0, nLength);
fStream.Close();
Console.WriteLine("Screen image ({0} bytes) written to {1}",
nLength, strPath);
// Download waveform data.
// -----------------------------------------------------------
// Set the waveform points mode.
myScope.DoCommand(":WAVeform:POINts:MODE RAW");
Console.WriteLine("Waveform points mode: {0}",myScope.DoQueryString(":WAVeform:POINts:MODE?"));
// Get the number of waveform points available.
Console.WriteLine("Waveform points available: {0}",myScope.DoQueryString(":WAVeform:POINts?"));
// Set the waveform source.
myScope.DoCommand(":WAVeform:SOURce CHANnel1");
Console.WriteLine("Waveform source: {0}",myScope.DoQueryString(":WAVeform:SOURce?"));
// Choose the format of the data returned (WORD, BYTE, ASCII):
myScope.DoCommand(":WAVeform:FORMat BYTE");
Console.WriteLine("Waveform format: {0}",myScope.DoQueryString(":WAVeform:FORMat?"));
// Display the waveform settings:
double[] fResultsArray;
fResultsArray = myScope.DoQueryNumbers(":WAVeform:PREamble?");
double fFormat = fResultsArray[0];
if (fFormat == 0.0)
{
Console.WriteLine("Waveform format: BYTE");
}
else if (fFormat == 1.0)
{
Console.WriteLine("Waveform format: WORD");
}
else if (fFormat == 2.0)
{
Console.WriteLine("Waveform format: ASCii");
}
double fType = fResultsArray[1];
if (fType == 0.0)
{
Console.WriteLine("Acquire type: NORMal");
}
else if (fType == 1.0)
{
Console.WriteLine("Acquire type: PEAK");
}
else if (fType == 2.0)
{
Console.WriteLine("Acquire type: AVERage");
}
else if (fType == 3.0)
{
Console.WriteLine("Acquire type: HRESolution");
}
double fPoints = fResultsArray[2];
Console.WriteLine("Waveform points: {0:e}", fPoints);
double fCount = fResultsArray[3];
Console.WriteLine("Waveform average count: {0:e}", fCount);
double fXincrement = fResultsArray[4];
Console.WriteLine("Waveform X increment: {0:e}", fXincrement);
double fXorigin = fResultsArray[5];
Console.WriteLine("Waveform X origin: {0:e}", fXorigin);
double fXreference = fResultsArray[6];
Console.WriteLine("Waveform X reference: {0:e}", fXreference);
double fYincrement = fResultsArray[7];
Console.WriteLine("Waveform Y increment: {0:e}", fYincrement);
double fYorigin = fResultsArray[8];
Console.WriteLine("Waveform Y origin: {0:e}", fYorigin);
double fYreference = fResultsArray[9];
Console.WriteLine("Waveform Y reference: {0:e}", fYreference);
// Read waveform data.
ResultsArray = myScope.DoQueryIEEEBlock(":WAVeform:DATA?");
nLength = ResultsArray.Length;
Console.WriteLine("Number of data values: {0}", nLength);
// Set up output file:
strPath = "C:\\Users\\Will\\Desktop\\ConsoleApplication1\\waveform_data.csv";
if (File.Exists(strPath)) File.Delete(strPath);
// Open file for output.
StreamWriter writer = File.CreateText(strPath);
// Output waveform data in CSV format.
for (int i = 0; i < nLength - 1; i )
writer.WriteLine("{0:f9}, {1:f6}",
fXorigin ((float)i * fXincrement),
(((float)ResultsArray[i] - fYreference)
* fYincrement) fYorigin);
// Close output file.
writer.Close();
Console.WriteLine("Waveform format BYTE data written to {0}",
strPath);
}
}
class VisaComInstrument
{
private ResourceManagerClass m_ResourceManager;
private FormattedIO488Class m_IoObject;
private string m_strVisaAddress;
// Constructor.
public VisaComInstrument(string strVisaAddress)
{
// Save VISA address in member variable.
m_strVisaAddress = strVisaAddress;
// Open the default VISA COM IO object.
OpenIo();
// Clear the interface.
m_IoObject.IO.Clear();
}
public void DoCommand(string strCommand)
{
// Send the command.
m_IoObject.WriteString(strCommand, true);
// Check for inst errors.
CheckInstrumentErrors(strCommand);
}
public void DoCommandIEEEBlock(string strCommand,
byte[] DataArray)
{
// Send the command to the device.
m_IoObject.WriteIEEEBlock(strCommand, DataArray, true);
// Check for inst errors.
CheckInstrumentErrors(strCommand);
}
public string DoQueryString(string strQuery)
{
// Send the query.
m_IoObject.WriteString(strQuery, true);
// Get the result string.
string strResults;
strResults = m_IoObject.ReadString();
// Check for inst errors.
CheckInstrumentErrors(strQuery);
// Return results string.
return strResults;
}
public double DoQueryNumber(string strQuery)
{
// Send the query.
m_IoObject.WriteString(strQuery, true);
// Get the result number.
double fResult;
fResult = (double)m_IoObject.ReadNumber(
IEEEASCIIType.ASCIIType_R8, true);
// Check for inst errors.
CheckInstrumentErrors(strQuery);
// Return result number.
return fResult;
}
public double[] DoQueryNumbers(string strQuery)
{
// Send the query.
m_IoObject.WriteString(strQuery, true);
// Get the result numbers.
double[] fResultsArray;
fResultsArray = (double[])m_IoObject.ReadList(
IEEEASCIIType.ASCIIType_R8, ",;");
// Check for inst errors.
CheckInstrumentErrors(strQuery);
// Return result numbers.
return fResultsArray;
}
public byte[] DoQueryIEEEBlock(string strQuery)
{
// Send the query.
m_IoObject.WriteString(strQuery, true);
// Get the results array.
System.Threading.Thread.Sleep(2000); // Delay before reading.
byte[] ResultsArray;
ResultsArray = (byte[])m_IoObject.ReadIEEEBlock(
IEEEBinaryType.BinaryType_UI1, false, true);
// Check for inst errors.
CheckInstrumentErrors(strQuery);
// Return results array.
return ResultsArray;
}
private void CheckInstrumentErrors(string strCommand)
{
// Check for instrument errors.
string strInstrumentError;
bool bFirstError = true;
do // While not "0,No error".
{
m_IoObject.WriteString(":SYSTem:ERRor?", true);
strInstrumentError = m_IoObject.ReadString();
if (!strInstrumentError.ToString().StartsWith(" 0,"))
{
if (bFirstError)
{
Console.WriteLine("ERROR(s) for command '{0}': ",
strCommand);
bFirstError = false;
}
Console.Write(strInstrumentError);
}
} while (!strInstrumentError.ToString().StartsWith(" 0,"));
}
private void OpenIo()
{
m_ResourceManager = new ResourceManagerClass();
m_IoObject = new FormattedIO488Class();
// Open the default VISA COM IO object.
try
{
m_IoObject.IO =
(IMessage)m_ResourceManager.Open(m_strVisaAddress,
AccessMode.NO_LOCK, 0, "");
}
catch (Exception e)
{
Console.WriteLine("An error occurred: {0}", e.Message);
}
}
public void SetTimeoutSeconds(int nSeconds)
{
m_IoObject.IO.Timeout = nSeconds * 1000;
}
public void Close()
{
try
{
m_IoObject.IO.Close();
}
catch { }
try
{
Marshal.ReleaseComObject(m_IoObject);
}
catch { }
try
{
Marshal.ReleaseComObject(m_ResourceManager);
}
catch { }
}
}
}