Files
2025-03-17 11:46:25 +08:00

222 lines
7.2 KiB
C#

using System;
using System.Diagnostics;
using NationalInstruments.Visa;
using Ivi.Visa;
using System.Runtime.InteropServices;
using Testrong.Core.Primitives.TestrongSystem.Obsolete;
using System.Threading;
using System.Linq;
namespace Testrong.User.Program
{
public class NiVisaComms
{
public enum Dmm3458AMeasureMode
{
VOLT,
CURR,
RES,
INIT,
STBY
}
private ResourceManager rm;
private MessageBasedSession mbs;
public string exceptionTrace;
private bool connected;
private bool isSetup;
private Dmm3458AMeasureMode currentMode;
public NiVisaComms()
{
exceptionTrace = string.Empty;
connected = false;
isSetup = false;
currentMode = Dmm3458AMeasureMode.STBY;
}
public bool Init(string deviceAddress)
{
ResourceOpenStatus deviceStatus;
try
{
rm = new ResourceManager();
mbs = (MessageBasedSession)rm.Open(deviceAddress, AccessModes.None, 1000, out deviceStatus);
mbs.TerminationCharacterEnabled = true;
currentMode = Dmm3458AMeasureMode.INIT;
if (deviceStatus == ResourceOpenStatus.Success)
{
mbs.FormattedIO.WriteLine("ID?");
string deviceID = mbs.FormattedIO.ReadLine();
if (deviceID.IndexOf("3458A") < 0)
{
connected = false;
return false;
}
connected = true;
return true;
}
else
{
connected = false;
return false;
}
}
catch (Exception ex)
{
exceptionTrace = ex.StackTrace;
connected = false;
return false;
}
}
public bool Setup(Dmm3458AMeasureMode mode, double range = -1, double nplc = 0.04)
{
try
{
if (!connected || currentMode == Dmm3458AMeasureMode.STBY)
{
return false;
}
if (currentMode == Dmm3458AMeasureMode.INIT || currentMode != mode)
{
string measComm;
string nplcSet = $"NPLC {nplc:F2}";
switch (mode)
{
case Dmm3458AMeasureMode.VOLT:
{
measComm = $"DCV,{range:F2}";
break;
}
case Dmm3458AMeasureMode.CURR:
{
measComm = $"DCI,{range:F2}";
break;
}
case Dmm3458AMeasureMode.RES:
{
measComm = $"OHM,{range:F2}";
break;
}
default:
{
return false;
}
}
mbs.FormattedIO.WriteLine("PRESET NORM");
mbs.FormattedIO.WriteLine("DISP OFF");
mbs.FormattedIO.WriteLine("BEEP OFF");
mbs.FormattedIO.WriteLine("TARM AUTO");
mbs.FormattedIO.WriteLine("TRIG HOLD");
mbs.FormattedIO.WriteLine("NRDGS 1,AUTO");
mbs.FormattedIO.WriteLine("MFORMAT DREAL");
mbs.FormattedIO.WriteLine("OFORMAT DREAL");
mbs.FormattedIO.WriteLine("MEM FIFO");
//mbs.FormattedIO.WriteLine("NPLC 0.04");
mbs.FormattedIO.WriteLine(nplcSet);
mbs.FormattedIO.WriteLine(measComm);
mbs.FormattedIO.WriteLine("AZERO OFF");
mbs.FormattedIO.WriteLine("ARANGE OFF");
mbs.FormattedIO.WriteLine("END ALWAYS");
}
isSetup = true;
return true;
}
catch (Exception e)
{
exceptionTrace = e.StackTrace;
return false;
}
}
public bool TriggerSingleMeasure()
{
try
{
mbs.FormattedIO.WriteLine("TRIG SGL");
}
catch (Exception e)
{
exceptionTrace = e.StackTrace;
return false;
}
return true;
}
public double SingleRead()
{
try
{
byte[] readOut = mbs.RawIO.Read(8);
Array.Reverse(readOut);
double value = BitConverter.ToDouble(readOut, 0);
//double value = mbs.FormattedIO.ReadDouble();
return value;
}
catch (Exception e)
{
exceptionTrace = e.StackTrace;
return double.MinValue;
}
}
public double[] MultiRead(int count)
{
try
{
double[] ans = new double[count];
mbs.FormattedIO.WriteLine("MCOUNT?");
int mCount = int.Parse(mbs.FormattedIO.ReadLine());
if (mCount < count)
{
count = mCount;
}
TimeSpan readDelay = new TimeSpan(20000); // 1ms
for (int i = 0; i < count; i++)
{
//ans[i] = mbs.FormattedIO.ReadDouble();
byte[] readOut = mbs.RawIO.Read(8);
while (readOut.Length < 8)
{
int readLength = 8 - readOut.Length;
byte[] nextRead = mbs.RawIO.Read(readLength);
readOut = readOut.Concat(nextRead).ToArray();
}
Array.Reverse(readOut);
ans[i] = BitConverter.ToDouble(readOut, 0);
//Thread.Sleep(1);
}
return ans;
}
catch (Exception e)
{
exceptionTrace = e.StackTrace;
return null;
}
}
public bool ClearReadingMemory()
{
try
{
mbs.FormattedIO.WriteLine("TRIG HOLD");
mbs.FormattedIO.WriteLine("MEM FIFO");
}
catch (Exception e)
{
exceptionTrace = e.StackTrace;
return false;
}
return true;
}
public bool ResetInstrument()
{
try
{
mbs.FormattedIO.WriteLine("RESET");
}
catch (Exception e)
{
exceptionTrace = e.StackTrace;
return false;
}
return true;
}
}
}