Author Topic: Program that can log/control many multimeters and other devices.  (Read 1101886 times)

KungFuJosh, flash2b and 15 Guests are viewing this topic.

Online KungFuJosh

  • Super Contributor
  • ***
  • Posts: 5930
  • Country: us
  • TEAS is real.
Re: Program that can log/control many multimeters and other devices.
« Reply #4700 on: September 25, 2025, 02:22:55 pm »
I'd be happy to try a extra logging build to sort this out. I think there is a bug hiding when using complex unit changes.

I have made a new .jar file with extra logging, it is always on and goes to the console output (Not the log window).
There is extra logging for both mode changes and the multi control.

I downloaded it from the normal link and ran it in debug mode. Regular mode didn't show any logging. Attached is the log from the console window.

I can make a video of the behavior if that would help.

Do we have any devices in common? I could make a modified driver for testing.

Thanks,
Josh
"Experience is something you don't get until just after you need it." - Steven Wright
Best Continuity Tester Ever
 

Online KungFuJosh

  • Super Contributor
  • ***
  • Posts: 5930
  • Country: us
  • TEAS is real.
Re: Program that can log/control many multimeters and other devices.
« Reply #4701 on: September 25, 2025, 02:29:51 pm »
Quote
I changed text to a combobox, and it works as expected. It seems text is not currently an option for control multi.

This works:
Code: [Select]
#cmdSetup multi Math_CH1_Setup Math
:read: :MATH1:UNIT?;:MATH1:OFFS?;:MATH1:SCAL?
:write: :MATH1:UNIT (value);:MATH1:OFFS (value2);:MATH1:SCAL (value3)
:update: Math_CH1_Setup,Math_CH1_Scale,Math_CH1_Offset,Math_CH1_Unit
:tip: Enter desired setup values.
combobox Unit:V V Unit:A A :string:
number Offset _ 0 100
number Scale _ 0 100

Is it possible to add a label for the combobox? I'm just curious, I actually do need text to work (value can be anything, not limited to a few options).

Can you please check on / add support for text in the control multi? text fields don't appear to work.

Thanks,
Josh
"Experience is something you don't get until just after you need it." - Steven Wright
Best Continuity Tester Ever
 

Online HKJTopic starter

  • Super Contributor
  • ***
  • Posts: 3892
  • Country: dk
    • Tests
Re: Program that can log/control many multimeters and other devices.
« Reply #4702 on: September 25, 2025, 02:37:19 pm »
I downloaded it from the normal link and ran it in debug mode. Regular mode didn't show any logging. Attached is the log from the console window.

It is V2.73 and will output the extra logging even without debug mode.


Do we have any devices in common? I could make a modified driver for testing.

I do not know, on my bench and connected I have:
R&S HMC8043, Keithley DMM6500 & DMM7510, Keysight 34465A & 34470A
 
The following users thanked this post: KungFuJosh

Online HKJTopic starter

  • Super Contributor
  • ***
  • Posts: 3892
  • Country: dk
    • Tests
Re: Program that can log/control many multimeters and other devices.
« Reply #4703 on: September 25, 2025, 02:39:21 pm »
Can you please check on / add support for text in the control multi? text fields don't appear to work.

I suppose I can do that.
 
The following users thanked this post: KungFuJosh

Online KungFuJosh

  • Super Contributor
  • ***
  • Posts: 5930
  • Country: us
  • TEAS is real.
Re: Program that can log/control many multimeters and other devices.
« Reply #4704 on: September 25, 2025, 02:46:54 pm »
I downloaded it from the normal link and ran it in debug mode. Regular mode didn't show any logging. Attached is the log from the console window.

It is V2.73 and will output the extra logging even without debug mode.
Yes, V2.73. You mean it should display in the Commands tab, correct? It wasn't showing any logging there for me.


Quote
Do we have any devices in common? I could make a modified driver for testing.

I do not know, on my bench and connected I have:
R&S HMC8043, Keithley DMM6500 & DMM7510, Keysight 34465A & 34470A

I have a DAQ6510 (same analog as DMM6500) and I have a KS34465A. I'll do something for the 34465A. I think this will be the easiest way to debug.

Thanks,
Josh
"Experience is something you don't get until just after you need it." - Steven Wright
Best Continuity Tester Ever
 

Online HKJTopic starter

  • Super Contributor
  • ***
  • Posts: 3892
  • Country: dk
    • Tests
Re: Program that can log/control many multimeters and other devices.
« Reply #4705 on: September 25, 2025, 02:50:25 pm »
Yes, V2.73. You mean it should display in the Commands tab, correct? It wasn't showing any logging there for me.

With console I mean the DOS console window, not any window within TC.
TC also dumps error messages to the DOS console.
 

Online KungFuJosh

  • Super Contributor
  • ***
  • Posts: 5930
  • Country: us
  • TEAS is real.
Re: Program that can log/control many multimeters and other devices.
« Reply #4706 on: September 25, 2025, 02:56:07 pm »
Yes, V2.73. You mean it should display in the Commands tab, correct? It wasn't showing any logging there for me.

With console I mean the DOS console window, not any window within TC.
TC also dumps error messages to the DOS console.

Oh, okay. Did the log text file I shared have anything useful?

Thanks,
Josh
"Experience is something you don't get until just after you need it." - Steven Wright
Best Continuity Tester Ever
 

Online KungFuJosh

  • Super Contributor
  • ***
  • Posts: 5930
  • Country: us
  • TEAS is real.
Re: Program that can log/control many multimeters and other devices.
« Reply #4707 on: September 25, 2025, 04:15:11 pm »
Well, this is good and annoying... ;)

My super simplified variable switching test works great. I can stay on the Current Values tab, and it still updates fine. So it seems that maybe there's a delay or something related to the complex mode switching for the scope. Which is weird, because it all does what it's supposed to, but inevitably stops the mode switch from working.

I'll get an updated log soon, but in the meantime, here's the 34465A mode switch test. Even command line mode updates with the scpiCmds work to update Current Values.

Thanks,
Josh
« Last Edit: September 25, 2025, 04:25:42 pm by KungFuJosh »
"Experience is something you don't get until just after you need it." - Steven Wright
Best Continuity Tester Ever
 

Online KungFuJosh

  • Super Contributor
  • ***
  • Posts: 5930
  • Country: us
  • TEAS is real.
Re: Program that can log/control many multimeters and other devices.
« Reply #4708 on: September 25, 2025, 05:06:26 pm »
Attached is the complete log. The log took place while I made a video showing the behavior (I'll PM you the link).

These are the errors that stood out:
Code: [Select]
java.lang.NullPointerException: Cannot read field "modes" because "this.form" is null
        at dk.hkj.devices.SetupFormats.syncModeChange(SetupFormats.java:428)
        at dk.hkj.main.PopupSetupSelection.syncModeChange(PopupSetupSelection.java:189)
        at dk.hkj.main.DeviceInterface$4.run(DeviceInterface.java:496)
        at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:323)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:702)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)





processModeString input: noU1,V2,V3,V4,V5
        at dk.hkj.devices.SetupFormats.syncModeChange(SetupFormats.java:428)
        at dk.hkj.main.PopupSetupSelection.syncModeChange(PopupSetupSelection.java:189)
processModeString output: noU1,V2,V3,V4,V5
        at dk.hkj.main.DeviceInterface$4.run(DeviceInterface.java:496)
        at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:323)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:702)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)





Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot read field "modes" because "this.form" is null
        at dk.hkj.devices.SetupFormats.syncModeChange(SetupFormats.java:428)
        at dk.hkj.main.PopupSetupSelection.syncModeChange(PopupSetupSelection.java:189)
        at dk.hkj.main.DeviceInterface.initColumns(DeviceInterface.java:490)
        at dk.hkj.devices.DeviceSCPI.initColumns(DeviceSCPI.java:125)
        at dk.hkj.main.DeviceInterface.setupMode(DeviceInterface.java:830)
        at dk.hkj.main.PopupModeSelection$ButtonPressActionListener.actionPerformed(PopupModeSelection.java:226)
        at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972)
        at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2314)
        at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:407)
        at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
        at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
        at java.desktop/java.awt.Component.processMouseEvent(Component.java:6576)
        at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3404)
        at java.desktop/java.awt.Component.processEvent(Component.java:6341)
        at java.desktop/java.awt.Container.processEvent(Container.java:2260)
        at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4958)
        at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2318)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4790)
        at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4917)
        at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4560)
        at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4501)
        at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2304)
        at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2671)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4790)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:725)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:702)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Thanks,
Josh
"Experience is something you don't get until just after you need it." - Steven Wright
Best Continuity Tester Ever
 

Online HKJTopic starter

  • Super Contributor
  • ***
  • Posts: 3892
  • Country: dk
    • Tests
Re: Program that can log/control many multimeters and other devices.
« Reply #4709 on: September 25, 2025, 07:26:22 pm »

java.lang.NullPointerException: Cannot read field "modes" because "this.form" is null
        at dk.hkj.devices.SetupFormats.syncModeChange(SetupFormats.java:428)


This makes me suspect that there is a control type that is not initialized correctly (By my code).
What control is it from, it is probably the control that send a message just before this error.
And is it inside a selector?
« Last Edit: September 25, 2025, 07:29:12 pm by HKJ »
 

Online KungFuJosh

  • Super Contributor
  • ***
  • Posts: 5930
  • Country: us
  • TEAS is real.
Re: Program that can log/control many multimeters and other devices.
« Reply #4710 on: September 25, 2025, 08:02:48 pm »

java.lang.NullPointerException: Cannot read field "modes" because "this.form" is null
        at dk.hkj.devices.SetupFormats.syncModeChange(SetupFormats.java:428)


This makes me suspect that there is a control type that is not initialized correctly (By my code).
What control is it from, it is probably the control that send a message just before this error.
And is it inside a selector?

That occurs during the measurement command sequence:
Code: [Select]
;; Magnova: Tx <DynamicM1?>
;; Magnova: Script start
;; Magnova: Tx <:MEAS:VPP:CURR? CHAN1>
;; IP: Tx: <:MEAS:VPP:CURR? CHAN1.> 3A 4D 45 41 53 3A 56 50 50 3A 43 55 52 52 3F 20 43 48 41 4E 31 0A
;; IP: Rx: <0.3169375> 30 2E 33 31 36 39 33 37 35 0A
;; Magnova: Rx <0.3169375>
;; Magnova: Script end <0.3169375>
;; Magnova: Rx <0.3169375>
;; Magnova: Tx <DynamicM2?>
;; Magnova: Script start
;; Magnova: Tx <:MEAS:VAMP:CURR? CHAN1>
Exception in thread "AWT-EventQueue-0" ;; IP: Tx: <:MEAS:VAMP:CURR? CHAN1.> 3A 4D 45 41 53 3A 56 41 4D 50 3A 43 55 52 52 3F 20 43 48 41 4E 31 0A
java.lang.NullPointerException: Cannot read field "modes" because "this.form" is null

It occurs at different points:
Code: [Select]
;; Magnova: Tx <DynamicM1?>
;; Magnova: Script start
;; Magnova: Tx <:MEAS:HFReq:CURR? CHAN1>
;; IP: Tx: <:MEAS:HFReq:CURR? CHAN1.> 3A 4D 45 41 53 3A 48 46 52 65 71 3A 43 55 52 52 3F 20 43 48 41 4E 31 0A
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot read field "modes" because "this.form" isnull
        at dk.hkj.devices.SetupFormats.syncModeChange(SetupFormats.java:428)

Or:

Code: [Select]
;; Magnova: Tx <DynamicM5?>
;; Magnova: Script start
;; Magnova: Tx <:MEAS:VRMS:CURR? CHAN1>
;; IP: Tx: <:MEAS:VRMS:CURR? CHAN1.> 3A 4D 45 41 53 3A 56 52 4D 53 3A 43 55 52 52 3F 20 43 48 41 4E 31 0A
;; IP: Rx: <0.243668861816> 30 2E 32 34 33 36 36 38 38 36 31 38 31 36 0A
;; Magnova: Rx <0.243668861816>
;; Magnova: Script end <0.243668861816>
;; Magnova: Rx <0.243668861816>
;; Magnova: Rx as numbers <999160.860995648 0.3506 0.1633375 -0.1684375 0.243668861816>
Exception in thread "AWT-EventQueue-0" ;; Magnova: Tx <getallModes?>
java.lang.NullPointerException: Cannot read field "modes" because "this.form" is null
        at dk.hkj.devices.SetupFormats.syncModeChange(SetupFormats.java:428)

Again when sending getallModes?:
Code: [Select]
Exception in thread "AWT-EventQueue-0" ;; Magnova: Tx <getallModes?>
java.lang.NullPointerException: Cannot read field "modes" because "this.form" is null
        at dk.hkj.devices.SetupFormats.syncModeChange(SetupFormats.java:428)
        at dk.hkj.main.PopupSetupSelection.syncModeChange(PopupSetupSelection.java:189)
        at dk.hkj.main.DeviceInterface.initColumns(DeviceInterface.java:490)
        at dk.hkj.devices.DeviceSCPI.initColumns(DeviceSCPI.java:125)
        at dk.hkj.main.DeviceInterface$2.actionPerformed(DeviceInterface.java:453)
        at java.desktop/javax.swing.Timer.fireActionPerformed(Timer.java:289)
        at java.desktop/javax.swing.Timer$DoPostEvent.run(Timer.java:221)
        at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:323)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:702)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot read field "modes" because "this.form" isnull
        at dk.hkj.devices.SetupFormats.syncModeChange(SetupFormats.java:428)
        at dk.hkj.main.PopupSetupSelection.syncModeChange(PopupSetupSelection.java:189)
        at dk.hkj.main.DeviceInterface$4.run(DeviceInterface.java:496)
        at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:323)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:702)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

I dunno if that last one was from #askMode or when I manually hit the mode update button.

Thanks,
Josh
"Experience is something you don't get until just after you need it." - Steven Wright
Best Continuity Tester Ever
 

Online HKJTopic starter

  • Super Contributor
  • ***
  • Posts: 3892
  • Country: dk
    • Tests
Re: Program that can log/control many multimeters and other devices.
« Reply #4711 on: September 25, 2025, 08:20:06 pm »

I dunno if that last one was from #askMode or when I manually hit the mode update button.


It is probably from the first control in the definition (Maybe the first one without a page name).
Updates are used with :update: tags and on mode changes (Where TC grab the first control and ask it to update every control that has the :updateModeChange: tag).
 

Online KungFuJosh

  • Super Contributor
  • ***
  • Posts: 5930
  • Country: us
  • TEAS is real.
Re: Program that can log/control many multimeters and other devices.
« Reply #4712 on: September 25, 2025, 08:31:03 pm »
This makes me suspect that there is a control type that is not initialized correctly (By my code).
What control is it from, it is probably the control that send a message just before this error.
And is it inside a selector?

To answer your other questions...

The control types for the channel/type are both comboboxes, and none of that page/tab is using any selectors.

Each M# (measurement channel) is set as follows:
The combo boxes set the variables:
Code: [Select]
; ******** Dynamic Measurement 1 ********
#scpiCmd MeasChan1 none
:setvar: meas1Chan=inputValue
#scpiCmd getMeasChan1? none?
:readmath: meas1Chan
#cmdSetup combobox M1_Channel Measure
:read: getMeasChan1?
:write: MeasChan1 (value)
:update: M1_Channel
:string:
CH1 CHANnel1
CH2 CHANnel2
CH3 CHANnel3
CH4 CHANnel4
DO DIGital0
D1 DIGital1
D2 DIGital2
D3 DIGital3
D4 DIGital4
D5 DIGital5
D6 DIGital6
D7 DIGital7
D8 DIGital8
D9 DIGital9
D10 DIGital10
D11 DIGital11
D12 DIGital12
D13 DIGital13
D14 DIGital14
D15 DIGital15
:tip: Select measurement source
#cmdSetup combobox M1_Type Measure
:read: getMeasType1?
:write: MeasType1
:update: M1_Type
:string:
V_Min VMIN
V_Max VMAX
V_PP VPP
V_Base VBASe
V_Top VTOP
V_AMP VAMP
V_Lower VLOWer
V_Upper VUPPer
V_MID VMID
V_AVG VAVG
V_RMS VRMS
V_SD VSDeviation
Pos_Preshoot VPPReshoot
Neg_Preshoot VNPReshoot
Pos_Overshoot VPOVershoot
Neg_Overshoot VNOVershoot
Pos+ VPARea
Neg_Area VNARea
|Area| VAARea
Area VNAArea
Pos_Period_Area VPPArea
Neg_Period_Area VNPArea
|Period_Area| VAPArea
Period_Area VNAPArea
Time_Rise HRTime
Time_Fall HFTime
Period HPERiod
Frequency HFReq
Pos_Width HHWidth
Neg_Width HLWidth
Pos_Duty HHDuty
Neg_Duty HLDuty
Pos_Edge_Count RECount
Neg_Edge_Count FECount
Pos_Pulse_Count PPCount
Neg_Pulse_Count NPCount
:tip: Select measurement type

That uses this scpiCmd to set the unit variable:
Code: [Select]
; ******** MEASUREMENT TYPE 1 ********
#scpiCmd MeasType1 #pgm#
var type=value;
var meas1Type=value;
var meas1Unit="";
var fullunit1Command=meas1Chan+":UNIT?";
var unit1result=deviceRead(handle, fullunit1Command);
if (type=="VMIN" || type=="VMAX" || type=="VPP" || type=="VBASe" || type=="VTOP" ||
    type=="VAMP" || type=="VLOWer" || type=="VUPPer" || type=="VMID" || type=="VAVG" ||
    type=="VRMS" || type=="VSDeviation" || type=="VPPReshoot" || type=="VNPReshoot" ||
    type=="VPOVershoot" || type=="VNOVershoot")
    if (unit1result=="V")
    var meas1Unit="V1";
    elseif (unit1result=="A")
    var meas1Unit="A1";
endif
elseif (type=="VPARea" || type=="VNARea" || type=="VAARea" || type=="VNAArea" ||
           type=="VPPArea" || type=="VNPArea" || type=="VAPArea" || type=="VNAPArea")
    var meas1Unit="Vs1";
elseif (type=="HRTime" || type=="HFTime" || type=="HPERiod" || type=="HHWidth" ||
           type=="HLWidth")
    var meas1Unit="s1";
elseif (type=="HFReq")
    var meas1Unit="Hz1";
elseif (type=="HHDuty" || type=="HLDuty")
    var meas1Unit="Percent1";
elseif (type=="RECount" || type=="FECount" || type=="PPCount" || type=="NPCount" || type=="")
    var meas1Unit="noU1";
endif
var allModes=meas1Unit+","+meas2Unit+","+meas3Unit+","+meas4Unit+","+meas5Unit
#scpiCmd getMeasType1? none?
:readmath: meas1Type
#scpiCmd getMeasUnit1? none?
:readmath: meas1Unit

That defined all the needed variables so we can acquire the measurement:
Code: [Select]
#scpiCmd DynamicM1? #pgm#
var fullCommand=":MEAS:"+meas1Type+":CURR? ";
var result=deviceRead(handle, fullCommand+meas1Chan);
print(result);

Defaults are set with the #initcmd:
Code: [Select]
#initCmd MeasDefault

#scpiCmd MeasDefault none
:setvar: meas1Chan="CHAN1"
:setvar: meas1Type="VPP"
:setvar: meas1Unit="V1"
:setvar: meas2Chan="CHAN1"
:setvar: meas2Type="VAMP"
:setvar: meas2Unit="V2"
:setvar: meas3Chan="CHAN1"
:setvar: meas3Type="VMAX"
:setvar: meas3Unit="V3"
:setvar: meas4Chan="CHAN1"
:setvar: meas4Type="VMIN"
:setvar: meas4Unit="V4"
:setvar: meas5Chan="CHAN1"
:setvar: meas5Type="VRMS"
:setvar: meas5Unit="V5"
:setvar: allModes="V1,V2,V3,V4,V5"

Then that leaves TC to acquire the values:
Code: [Select]
#scpiCmd getallModes? none?
:readmath: allModes

; ******** #VALUE ********
#value M1_Volts V SI V1
#value M1_Amps A SI A1
#value M1_Vs V SI Vs1
#value M1_Seconds s SI s1
#value M1_Hertz Hz SI Hz1
#value M1_Percent Percent SI Percent1
#value M1_ _ SI noU1
#value M2_Volts V SI V2
#value M2_Amps A SI A2
#value M2_Vs V SI Vs2
#value M2_Seconds s SI s2
#value M2_Hertz Hz SI Hz2
#value M2_Percent Percent SI Percent2
#value M2_ _ SI noU2
#value M3_Volts V SI V3
#value M3_Amps A SI A3
#value M3_Vs V SI Vs3
#value M3_Seconds s SI s3
#value M3_Hertz Hz SI Hz3
#value M3_Percent Percent SI Percent3
#value M3_ _ SI noU3
#value M4_Volts V SI V4
#value M4_Amps A SI A4
#value M4_Vs V SI Vs4
#value M4_Seconds s SI s4
#value M4_Hertz Hz SI Hz4
#value M4_Percent Percent SI Percent4
#value M4_ _ SI noU4
#value M5_Volts V SI V5
#value M5_Amps A SI A5
#value M5_Vs V SI Vs5
#value M5_Seconds s SI s5
#value M5_Hertz Hz SI Hz5
#value M5_Percent Percent SI Percent5
#value M5_ _ SI noU5

#askMode getallModes?
#askValues DynamicM1?;DynamicM2?;DynamicM3?;DynamicM4?;DynamicM5?
#modeFromVar allModes

#readingDelay 1
#modeChangeDelay 1

#cmdModeLayout 1 1
#cmdMode Update_Modes getallModes?
getallModes?

Thanks,
Josh
"Experience is something you don't get until just after you need it." - Steven Wright
Best Continuity Tester Ever
 

Online KungFuJosh

  • Super Contributor
  • ***
  • Posts: 5930
  • Country: us
  • TEAS is real.
Re: Program that can log/control many multimeters and other devices.
« Reply #4713 on: September 25, 2025, 08:39:36 pm »

I dunno if that last one was from #askMode or when I manually hit the mode update button.


It is probably from the first control in the definition (Maybe the first one without a page name).
Updates are used with :update: tags and on mode changes (Where TC grab the first control and ask it to update every control that has the :updateModeChange: tag).

See my process for this above. I've not used :updatemodechange: in my definitions yet.

ETA: As can be seen above, getallModes? is only called by #askMode and the cmdMode button. I don't know if you watched the video I sent you a link to, but you can see I press the button manually at one point.

Thanks,
Josh
« Last Edit: September 25, 2025, 10:33:00 pm by KungFuJosh »
"Experience is something you don't get until just after you need it." - Steven Wright
Best Continuity Tester Ever
 

Offline Gertjan

  • Frequent Contributor
  • **
  • Posts: 290
  • Country: nl
Re: Program that can log/control many multimeters and other devices.
« Reply #4714 on: September 26, 2025, 07:56:36 am »
There is no hurry, for now I have found a workaround (temporary editing the device files with #askValues starting with a delay)

But the Param Sweeper is a much used pop-up. So improving it would be very worthwhile.

I have made a workaround. TC uses a extremely slow logging when synchronized to param sweeper and will then reset the wait time for next log entry, when a log entry needs to be taken.

Hi HKJ,

Thanks! I am happy to test it. Did you also implement an option for measurement delay?
Is this implemented in the latest TC test versions you made for KungFuJosh?
It will be a few days before I can do the testing. TC is busy with all day lasting measurements :-)

regards, Gertjan.
 

Online HKJTopic starter

  • Super Contributor
  • ***
  • Posts: 3892
  • Country: dk
    • Tests
Re: Program that can log/control many multimeters and other devices.
« Reply #4715 on: September 26, 2025, 09:40:50 am »
See my process for this above. I've not used :updatemodechange: in my definitions yet.

ETA: As can be seen above, getallModes? is only called by #askMode and the cmdMode button. I don't know if you watched the video I sent you a link to, but you can see I press the button manually at one point.

This do not get my anywhere, I have modified the code to list what control causes the problem and then ignore it.
The line will contain: ***error***, i.e. when you see that in the log please post the line.
I am also curious if it fixes the mode change problem.

The code contains completely untested code for a multi text control, please test it. In the definition you can optionally place a maximum length after the text.
 
The following users thanked this post: KungFuJosh

Online HKJTopic starter

  • Super Contributor
  • ***
  • Posts: 3892
  • Country: dk
    • Tests
Re: Program that can log/control many multimeters and other devices.
« Reply #4716 on: September 26, 2025, 09:42:57 am »
Thanks! I am happy to test it. Did you also implement an option for measurement delay?

No, it measures in the middle of the period, it means you will have to sweep at about half speed.

Is this implemented in the latest TC test versions you made for KungFuJosh?

Yes and probably in all future releases, both test and full.

It will be a few days before I can do the testing. TC is busy with all day lasting measurements :-)

I will have to wait  :)
 

Offline Gertjan

  • Frequent Contributor
  • **
  • Posts: 290
  • Country: nl
Re: Program that can log/control many multimeters and other devices.
« Reply #4717 on: September 26, 2025, 10:00:47 am »
Did you also implement an option for measurement delay?
No, it measures in the middle of the period, it means you will have to sweep at about half speed.

I think in the middle of the period is fine. It solves all the a-synchonous problems. And when one needs a longer delay, a slower step time will be no problem.  Then it will be a slow measurements process anyway....

regards, Gertjan.
 

Online HKJTopic starter

  • Super Contributor
  • ***
  • Posts: 3892
  • Country: dk
    • Tests
Re: Program that can log/control many multimeters and other devices.
« Reply #4718 on: September 26, 2025, 12:56:50 pm »
I think in the middle of the period is fine. It solves all the a-synchonous problems. And when one needs a longer delay, a slower step time will be no problem.  Then it will be a slow measurements process anyway....

I was in doubt about putting it in the middle of the period or place it more dynamic:
It would have to depend on the step time, something like:
Below 2 sec: At the start
Between 2-4 sec: In the middle
Above 4: 2 sec from the end (The reason for the 2 sec is to allow for slow devices).

But I decided on the middle, it is easy to explain and understand.
 

Online KungFuJosh

  • Super Contributor
  • ***
  • Posts: 5930
  • Country: us
  • TEAS is real.
Re: Program that can log/control many multimeters and other devices.
« Reply #4719 on: September 26, 2025, 02:03:09 pm »
This do not get my anywhere, I have modified the code to list what control causes the problem and then ignore it.
The line will contain: ***error***, i.e. when you see that in the log please post the line.
I am also curious if it fixes the mode change problem.

The code contains completely untested code for a multi text control, please test it. In the definition you can optionally place a maximum length after the text.

With this version I can't open the Setup dialog. This is the log when trying to open it:
Code: [Select]
Starting
WARNING: A restricted method in java.lang.System has been called
WARNING: java.lang.System::loadLibrary has been called by com.fazecast.jSerialComm.SerialPort in an unnamed module (file:/TestController/TestController.jar)
WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module
WARNING: Restricted methods will be blocked in a future release unless native access is enabled

;; jSerialComm version: 2.11.2
;; Start thread for: IP - Batronix Magnova
;; IP: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; IP: Rx: <Batronix,Magnova,001216,1.6.3> 42 61 74 72 6F 6E 69 78 2C 4D 61 67 6E 6F 76 61 2C 30 30 31 32 31 36 2C 31 2E 36 2E 33 0A
;; IP: Tx <MeasDefault>
;; IP: Tx <none>
;; Found Batronix Magnova on IP sn: 1216
PaneCurrentValues changeDevicesOrTable update
;; Magnova: Tx <getallModes?>
;; Magnova: Tx <none?>
;; Magnova: Rx <V1,V2,V3,V4,V5>
processModeString input: V1,V2,V3,V4,V5
processModeString output: V1,V2,V3,V4,V5
PaneCurrentValues setupFields: [Magnova.M1_Volts, Magnova.M2_Volts, Magnova.M3_Volts, Magnova.M4_Volts, Magnova.M5_Volts]
PaneTable changeDevicesOrTable update
PaneTable updateColumnSelection []
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "Unit"
        at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
        at java.base/java.lang.Integer.parseInt(Integer.java:565)
        at java.base/java.lang.Integer.parseInt(Integer.java:662)
        at dk.hkj.devices.SetupFormats$ControlText.<init>(SetupFormats.java:4908)
        at dk.hkj.devices.SetupFormats$ControlInfo.getControl(SetupFormats.java:4494)
        at dk.hkj.devices.SetupFormats$MultiField.addGridBag(SetupFormats.java:5041)
        at dk.hkj.main.PopupSetupSelection.makePanel(PopupSetupSelection.java:246)
        at dk.hkj.main.PopupSetupSelection.makeMainPanel(PopupSetupSelection.java:163)
        at dk.hkj.main.PopupSetupSelection.<init>(PopupSetupSelection.java:95)
        at dk.hkj.main.DeviceInterface.showSetupPopup(DeviceInterface.java:801)
        at dk.hkj.main.PaneCommand.showSetupSelectionPopup(PaneCommand.java:1985)
        at dk.hkj.main.PaneCommand$38.actionPerformed(PaneCommand.java:1048)
        at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972)
        at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2314)
        at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:407)
        at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
        at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
        at java.desktop/java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:299)
        at java.desktop/java.awt.Component.processMouseEvent(Component.java:6576)
        at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3404)
        at java.desktop/java.awt.Component.processEvent(Component.java:6341)
        at java.desktop/java.awt.Container.processEvent(Container.java:2260)
        at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4958)
        at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2318)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4790)
        at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4917)
        at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4560)
        at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4501)
        at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2304)
        at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2671)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4790)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:725)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:702)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
;; Magnova: Tx <:SYST:THER:STAT?>
;; IP: Tx: <:SYST:THER:STAT?.> 3A 53 59 53 54 3A 54 48 45 52 3A 53 54 41 54 3F 0A
;; IP: Rx: <COLD> 43 4F 4C 44 0A
;; Magnova: Rx <COLD>
;; Magnova: Rx after :readmath: replace(replace(replace(value,"COLD","Cold"),"WUP","Warming Up"),"STABle","Stable") <Cold>
;; Magnova: Tx <:ACQ:RCL?>
;; IP: Tx: <:ACQ:RCL?.> 3A 41 43 51 3A 52 43 4C 3F 0A
;; IP: Rx: <EXTernal> 45 58 54 65 72 6E 61 6C 0A
;; Magnova: Rx <EXTernal>
;; Magnova: Rx after :readmath: replace(replace(value,"INT","Int"),"EXT","Ext") <External>
;; Magnova: Tx <:ACQ:HRES?>
;; IP: Tx: <:ACQ:HRES?.> 3A 41 43 51 3A 48 52 45 53 3F 0A
;; IP: Rx: <12> 31 32 0A
;; Magnova: Rx <12>
;; Magnova: Tx <:ACQ:MDEP?>
;; IP: Tx: <:ACQ:MDEP?.> 3A 41 43 51 3A 4D 44 45 50 3F 0A
;; IP: Rx: <AFASt> 41 46 41 53 74 0A
;; Magnova: Rx <AFASt>
;; Magnova: Rx after :readmath: replace(replace(value,"AUTO","Auto"),"AFASt","Auto Fast") <Auto Fast>
;; Magnova: Tx <:ACQ:BAND?>
;; IP: Tx: <:ACQ:BAND?.> 3A 41 43 51 3A 42 41 4E 44 3F 0A
;; IP: Rx: <350000000> 33 35 30 30 30 30 30 30 30 0A
;; Magnova: Rx <350000000>
;; Magnova: Tx <:ACQ:SRAT?>
;; IP: Tx: <:ACQ:SRAT?.> 3A 41 43 51 3A 53 52 41 54 3F 0A
;; IP: Rx: <1600000000> 31 36 30 30 30 30 30 30 30 30 0A
;; Magnova: Rx <1600000000>
;; Magnova: Tx <*IDN?>
;; IP: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; IP: Rx: <Batronix,Magnova,001216,1.6.3> 42 61 74 72 6F 6E 69 78 2C 4D 61 67 6E 6F 76 61 2C 30 30 31 32 31 36 2C 31 2E 36 2E 33 0A
;; Magnova: Rx <Batronix,Magnova,001216,1.6.3>
;; Magnova: Rx after :readmath: "Current: "+getElement(value,3, ",")"; <Current: 1.6.3>
;; Magnova: Cache Tx: <*IDN?> Rx: <Batronix,Magnova,001216,1.6.3>
;; Magnova: Rx after :readmath: "Latest: "+getElement(value,3, ",")"; <Latest: 1.6.3>
;; Magnova: Cache Tx: <:ACQ:HRES?> Rx: <12>
;; Magnova: Tx <:ACQ:MODE?>
;; IP: Tx: <:ACQ:MODE?.> 3A 41 43 51 3A 4D 4F 44 45 3F 0A
;; IP: Rx: <SAMPle> 53 41 4D 50 6C 65 0A
;; Magnova: Rx <SAMPle>
;; Magnova: Rx after :readmath: getElement("SAMP,PDET,AVER",listIndex(value,"Sample,Peak_Detect,Average")); <SAMP>
;; Magnova: Cache Tx: <:ACQ:MODE?> Rx: <SAMPle>
;; Magnova: Tx <:AUTO?>
;; IP: Tx: <:AUTO?.> 3A 41 55 54 4F 3F 0A
;; IP: Rx: <OFF> 4F 46 46 0A
;; Magnova: Rx <OFF>
;; Magnova: Tx <:ACQ:ROLL?>
;; IP: Tx: <:ACQ:ROLL?.> 3A 41 43 51 3A 52 4F 4C 4C 3F 0A
;; IP: Rx: <OFF> 4F 46 46 0A
;; Magnova: Rx <OFF>
;; Magnova: Rx after :readmath: (value=="ON")?1:0 <0>
;; Magnova: Rx as number <0.0>
;; Magnova: Tx <:TIM:REF?>
;; IP: Tx: <:TIM:REF?.> 3A 54 49 4D 3A 52 45 46 3F 0A
;; IP: Rx: <CENTer> 43 45 4E 54 65 72 0A
;; Magnova: Rx <CENTer>
;; Magnova: Rx after :readmath: getElement("CENT,LEFT,RIGH,TRIG",listIndex(value,"Center,Left,Right,Trigger")); <CENT>
;; Magnova: Tx <:TIM:OFFS?>
;; IP: Tx: <:TIM:OFFS?.> 3A 54 49 4D 3A 4F 46 46 53 3F 0A
;; IP: Rx: <0> 30 0A
;; Magnova: Rx <0>
;; Magnova: Tx <:TIM:SCAL?>
;; IP: Tx: <:TIM:SCAL?.> 3A 54 49 4D 3A 53 43 41 4C 3F 0A
;; IP: Rx: <2E-07> 32 45 2D 30 37 0A
;; Magnova: Rx <2E-07>
;; Magnova: Rx as numbers <0.0 2.0E-7>
;; Magnova: Tx <:CHAN1:STAT?>
;; IP: Tx: <:CHAN1:STAT?.> 3A 43 48 41 4E 31 3A 53 54 41 54 3F 0A
;; IP: Rx: <ON> 4F 4E 0A
;; Magnova: Rx <ON>
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot invoke "javax.swing.JButton.setIcon(javax.swing.Icon)" because "this.button" is null
        at dk.hkj.devices.SetupFormats$ToggleButtonField.updateButton(SetupFormats.java:2278)
        at dk.hkj.devices.SetupFormats$ToggleButtonField.syncValueString(SetupFormats.java:2367)
        at dk.hkj.devices.SetupFormats$ToggleButtonField.syncValue(SetupFormats.java:2388)
        at dk.hkj.devices.SetupFormats$ToggleButtonsField.syncValue(SetupFormats.java:2526)
        at dk.hkj.devices.SetupFormats.syncAll(SetupFormats.java:325)
        at dk.hkj.main.PopupSetupSelection.initialSync(PopupSetupSelection.java:124)
        at dk.hkj.main.PopupSetupSelection.timerUpdate(PopupSetupSelection.java:131)
        at dk.hkj.main.PopupSetupSelection.access$3(PopupSetupSelection.java:129)
        at dk.hkj.main.PopupSetupSelection$3.actionPerformed(PopupSetupSelection.java:88)
        at java.desktop/javax.swing.Timer.fireActionPerformed(Timer.java:289)
        at java.desktop/javax.swing.Timer$DoPostEvent.run(Timer.java:221)
        at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:323)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:702)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)


Thanks,
Josh
"Experience is something you don't get until just after you need it." - Steven Wright
Best Continuity Tester Ever
 

Offline Gertjan

  • Frequent Contributor
  • **
  • Posts: 290
  • Country: nl
Re: Program that can log/control many multimeters and other devices.
« Reply #4720 on: September 26, 2025, 02:04:23 pm »
I think in the middle of the period is fine. It solves all the a-synchonous problems. And when one needs a longer delay, a slower step time will be no problem.  Then it will be a slow measurements process anyway....

I was in doubt about putting it in the middle of the period or place it more dynamic:
It would have to depend on the step time, something like:
Below 2 sec: At the start
Between 2-4 sec: In the middle
Above 4: 2 sec from the end (The reason for the 2 sec is to allow for slow devices).

But I decided on the middle, it is easy to explain and understand.

At the start would not be good, there might be the same problems as with the current original solution. A bit of delay would always be good.
"Above 4: 2 sec from the end" would not be a good solution either. There would not be enough time left for long measurement times. Think 100NLPC, or 10sec gate time.

So I think you made the right choice. Maybe on one third would be slightly more optimal: one third of the step-time for settling, two thirds for the measurement.
That way the user can choose enough delay time, and enough measurement time by setting the needed step-time.

And indeed, easy to understand documentation is important. Otherwise it won't be used...... (or not correctly...)
With all the additions lately, I do not envy your documentation tasks....

regards, Gertjan.
 

Offline ander7

  • Contributor
  • Posts: 13
  • Country: by
Re: Program that can log/control many multimeters and other devices.
« Reply #4721 on: September 26, 2025, 03:21:08 pm »
Hello HKJ,

Is it possible to support Uni-T UT61E+? It's a HID device and it's communication protocol can be checked at https://github.com/Aleks-nik-a/unit_ut61eplus/. I can help with testing if you don't have this DMM at the moment.
 

Online HKJTopic starter

  • Super Contributor
  • ***
  • Posts: 3892
  • Country: dk
    • Tests
Re: Program that can log/control many multimeters and other devices.
« Reply #4722 on: September 27, 2025, 09:47:31 am »
With this version I can't open the Setup dialog. This is the log when trying to open it:

I have uploaded a new version with the exceptions fixed.



Code: [Select]
Starting
WARNING: A restricted method in java.lang.System has been called
WARNING: java.lang.System::loadLibrary has been called by com.fazecast.jSerialComm.SerialPort in an unnamed module (file:/TestController/TestController.jar)
WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module
WARNING: Restricted methods will be blocked in a future release unless native access is enabled

I have no idea what this is, but it looks to be related to jSerialComm and that is a library I use, but do not have any control over.
 
The following users thanked this post: KungFuJosh

Online HKJTopic starter

  • Super Contributor
  • ***
  • Posts: 3892
  • Country: dk
    • Tests
Re: Program that can log/control many multimeters and other devices.
« Reply #4723 on: September 27, 2025, 09:53:04 am »
So I think you made the right choice. Maybe on one third would be slightly more optimal: one third of the step-time for settling, two thirds for the measurement.
That way the user can choose enough delay time, and enough measurement time by setting the needed step-time.

The new values are always transferred at the start of a time period. Then I have split the wait into two and call the logging there. That would be the request to log an entry, there is no guarantee that the actual logging is done in the same time slot, it depends on how fast the device is, compared to logging speed.

With all the additions lately, I do not envy your documentation tasks....

There is a bit to update in the documentation, but it is not that bad.
 

Online HKJTopic starter

  • Super Contributor
  • ***
  • Posts: 3892
  • Country: dk
    • Tests
Re: Program that can log/control many multimeters and other devices.
« Reply #4724 on: September 27, 2025, 10:07:29 am »
Is it possible to support Uni-T UT61E+? It's a HID device and it's communication protocol can be checked at https://github.com/Aleks-nik-a/unit_ut61eplus/. I can help with testing if you don't have this DMM at the moment.

The issue is HID interface, I do not have a good library for that. If somebody makes a regular serial interface it can be supported (Together with a couple of other UNI-T meters).
 


Share me

Digg  Facebook  SlashDot  Delicious  Technorati  Twitter  Google  Yahoo
Smf