I already commented on BLF, but 34401A support would be appreciated as well!
I have been working on a program that can log from multimeters, electronic loads, power supplies and some other stuff.
It is still an alpha version, but it works fairly well. I am interested in comments, ideas and error reports.
(..)
If you want to go serious on that check sigrok code base
95% of the grunt work is done like error handling
and protocol handling including multiple paths and sessions.
https://sigrok.org/wiki/Supported_hardware
Not so hard to do but hard to jump in easily.
After the learning curve things are just on other level
of functionality (i've been there as well )
I am not that impressed with the amount of equipment they support and they uses the wrong language.
What I need is logging from all my equipment and a easy way to switch between different brands of equipment. With the current software I have been logging from 10 devices simultaneous to the same table and chart with 1 seconds intervals.
+1 for 34401a
Just testing a bit.
"Voltcraft VC-940" should read "Voltcraft VC-940 COM"
since Voltcraft VC-940 USB HID is not supported. Helps to avoid confusion as to the two different interfaces.
Sometimes a second instance of the program needs to be started to fill "Search socket" with the equipment list.
dB mode of the 34465A is not supported (yet).
I attempted to load a CSV from my own logging program just to check yours out and for some reason it truncates all readings to 2 digits. Even after setting it to 8 digits for those columns it doesn't update even when reloading the same CSV again. I'm assuming it refuses to plot those numbers since they look the same once loaded due to the truncated decimal digits.
I launched the program for DMM7510. I managed to connect. But I did not understand what I need to click next to get some kind of graph or where to find the range control, etc.
The choice of ranges and modes was not available. Does this mean that I did not connect correctly?
Got it, replaced the space with an underscore(odd limitation, usually for CSV's I pull the entire string between delimiters).
Still can't use the plotting for readings however. When I range limit to the min/max of real readings I get no plot just the scale, and obviously when I let it auto it's just a straight line at the top of the graph. Alternatively I'm not sure auto min. range and auto bottom step are meant to do. I feel the results I'm getting are a bit random.
Is there a plan to add oscilloscopes to the list of supported devices?
You can still do slow logging from an oscilloscope. I think there are more oscilloscopes on hobbyist benches than benchtop multimetersIs there a plan to add oscilloscopes to the list of supported devices?
I do not see the point in oscilloscope support for this program.
The program is designed for "slow" logging of values, oscilloscopes are designed for sampling in the MHz range (More or less).
This program will be able to log a couple of devices for weeks (At lower sampling rates or there will be memory problems).
You can still do slow logging from an oscilloscope. I think there are more oscilloscopes on hobbyist benches than benchtop multimeters
Got it, replaced the space with an underscore(odd limitation, usually for CSV's I pull the entire string between delimiters).
This is because the column names are variable names when you do math. I have modified it to accept spaces and then automatic replace them with _ when creating variables (New version will be uploaded later today).Still can't use the plotting for readings however. When I range limit to the min/max of real readings I get no plot just the scale, and obviously when I let it auto it's just a straight line at the top of the graph. Alternatively I'm not sure auto min. range and auto bottom step are meant to do. I feel the results I'm getting are a bit random.
When Auto is checked Minimum/Maximum is ignored.
These 3 setting is only active when auto is checked:
Auto includes zero means that auto scales will include a 0 value, this will block for seeing small changes in a large value.
Auto min. range defines the minium span that can be used on a chart (in auto), this is used to avoid amplifying noise to fill a full chart height.
Auto bottom step is the step size for the bottom of the scale (0 is legal), this can be used to make scales align.
I assumed when Auto was checked min/max did nothing. I'm not sure what changed but I was able to get it to plot the readings even setting full scale to 10uV. This wasn't the case yesterday. I'd still prefer values not be truncated though. For data sets I'd like to see every decimal point I type or that is recorded. When trying to set min/max I have to recall what the old value was when it rounds to 7.157 and I actually typed 7.15664 and need to change it to 7.15665.
I'd also recommend adding a UI scale slider in config, or wherever you think is best, so that you don't have to worry about the DPI issues. Or do the math and have it scale at startup(my preferred method). Mostly looks good though. Perhaps add some hover tooltips for things which may not be obvious to those that didn't write the program.
On my 17" 4k monitor scaling is good. On my 28" 4k monitor... Not so much.
Well if that's what you were going for then I guess it's not a problem.
HKJ,
You mention that you added Siglent SDM3045X but I do not see it in the device list. I have a SDM3065X and I was going to see if it works for it.
Running one instance on both puters. Loading the list on No.1 takes a bit. Pressing "reconnect" seems to nudge the search socket message. Anyway must leave things as they are for the moment, but will be watching this space. Thanks for your effort. :-+
Still at it. :palm: Relaxed the logging interval a bit
from 1 s to 10 s. Now at 40 minutes and still going strong. 8)
Pity that you could not include any of the Voltcraft meters with USB HID adapter in your list of meters. Must see if i can get a serial PCIe card going with Windows 10 and use the serial adapter.
Why not a USB serial port?
I made a config file for the HP 34401A (https://pastebin.com/0sWAgGA3) and Rigol DP811A (https://pastebin.com/4tMEyYV5) if someone wants to try them out and iron out any (all) problems.
If anybody have ideas about how to log from USB/HID connected meters, please tell. I have played with a Brymen, but it did not work (I did never get any data). Maybe there is more than one error in their documentation.
HKJ,
Attached is a config file for the Siglent SDM3065X
(Attachment Link)
This program is what I have been looking for for years! Thank you so much for your hard work, I have a Rigol dm3054e and just want to be able to data log, I've been doing a bit of reading on your page and whilst I don't fully understand it I'm going to try and have ago to make a config file. Hopefully I'm successful and can contribute it back :)
If anybody have ideas about how to log from USB/HID connected meters, please tell. I have played with a Brymen, but it did not work (I did never get any data). Maybe there is more than one error in their documentation.
I successfully wrote a test program that could log data from a BM869s which uses a USB/HID interface (no virtual COM port).
I discovered the difficulty was not with the Brymen documentation, but rather with learning how to interface to an HID device. It is nothing like as simple as interfacing to a COM port. I may be able to send you some example code if it would help. However you seem to be working in Java and I was experimenting in native Windows, so my example would only serve to illustrate the basic idea of enumerating the devices and reading data. The actual code would look quite different in Linux for example, and I don't know how it would look in Java.
I used something called HID4Java when I tried, it is supposed to handle all the low level stuff and it is also supposed to work on multiple platforms.
The Brymen documentation is wrong, they specify vendor id as 0x82, but the meter registers as 0x820.
I have also tried to enumerate devices directly i USB, but I cannot open a USB/HID device.
I do have example code running under Windows if you would like to see it. Just let me know and I can send it along.
My drop down box is empty if I click the filter box then the drop down box I get Search socket only
Its definitely there very strange, It worked once and then dissapearedI just discovered If I start a LOG 1 sec on the commands page the list becomes full. Strange maybe a little bug?
I just discovered If I start a LOG 1 sec on the commands page the list becomes full. Strange maybe a little bug?
If the device list does not appear upon starting,
clicking on "Reconnect" makes it appear each time
(at least on my old puter) :palm:
It would help to avoid loss of data if the
program would ask "Save data" upon exiting. :horse:
In the rigol software I need to have \r\n selected in the serial settings for it to respond maybe this has something to do with it? If the meter receives a command it doesn't know it just ignores it
Could it be sending *IDN? then "." that might be why the meter is not responding to it
I do have example code running under Windows if you would like to see it. Just let me know and I can send it along.
It may give me some ideas, so yes please.
Hi, did you receive my code sample and were you able to see it working?
The command used is different than the documentation:
Documentations says: 0x00 0x00 0x82 0x66
Your code uses: 0x00 0x00 0x86 0x66
That may also be a reason my tests did not work
Hmm. That either means I had a different version of the documentation, or I screwed up, or that the command doesn't actually matter as long as the meter receives something... :-\
... I do not have the SDM3055 to test it so please try it and let us know if it works...
Has anybody managed to use a "Keysight U1273A" so far? I use version 0.24.
I have no problem to use a "Fluke 289" or "Agilent U1272A" - anything works fine. The "Keysight U1273A" is also detected immediately, however, when trying to log anything, the table only shows:
index | time | minute | dateTime ...but no measured value at all?
It is not that essential, but for curiosity I would like to know the reason - any hint is appreciated.
All DMMs are also in the "Remap handles" list with their SN and there is only one DMM enabled.The remap is only needed when you do not like my handle names. This may happen if you have multiple devices of the same type.
For Fluke 87 (and i think 89) is sufficient to copy the section of the 187 on FlukeDMM18x28x.txt and change the 187 (or 189) with 87 (or 89). Tested working perfectly
Hmm. That either means I had a different version of the documentation, or I screwed up, or that the command doesn't actually matter as long as the meter receives something... :-\
I was not aware the code changes between the meters. I was working with the 525 and looking in that document, now I will have to dig out the 869 before I test more (They use the same USB interface).
#metadef
#idString Fluke,Fluke 87,
#name Fluke 87
#handle F87
#subDriver 1
#baudrate 9600
HKJ,
Any luck getting the Brymen meters working
100% working on Fluke 87. The 89 is almost the same device so i think that can work only changing to "89" like in 187/187
When I upload the next version later today try starting it in debug mode and send me the result.
Absolutely brilliant! :-+ Now, anything is perfect with the Keysight model U1273A.
Due to "TestController" the devices achieve another dimension, which the original software from Fluke for example couldn't ever reach!!!
When the quarantine is over, I will send you a paysafecard as a little "Thank you!".
Sorry for the question, but for multimeters not using scpi commands, there is the need to write a custom driver built into the program?
I was trying to understand how create a config file for a protek 506 but i not fully understand if there is a "programmable parser" for non scpi devices.
I've checked some meters on the SimpleDMM file and to me seem that no one is compatible.
I've tought that as the scheme is almost always the same (query/answer, plus some commands specific like Fluke ID) there was the ability to have a "programmable parser" (define fileds, fields positions, eventual math for have the result, measuring units, etc) so that every one can write it's own driver without bothering you. This obviously for 232 devices. Hid devices are totally a different beast.
In any case i attach the photo of the protocol. I've double checked it on actual device.
1200bps 7data bit, 2 stop bit, no parity.
The meter answer the request by a simple chr 13.
The device is a Protek 506
Whaaaat :palm: that's a very strage method of sending data. Maybe for save some processing power of the cpu to not generate the ascii character.
Those obviously require a dedicated driver. Like the hid ones...
Is it possible to have a (maybe additional) popup window for the "Commands", to put it on a second monitor while watching the "Chart" or "Histogram" on the first one?
Respectively, when having only one monitor, it is probably better to clone the "Commands" at the bottom of "Chart" and "Histogram", so that it is easier to observe the measurement without switching tabs, or even more minimalistically only an additional "Log"-Button would be very nice within the "Chart" and "Histogram" tabs, perhaps somewhere at the bottom behind the "Save" button?! ;)
I am not sure why you would want that.
If you just want to see the actual measurement, the readout function I added in the last version works fine for that. I can also be used if you are a meter or two from the computer (It can show some fairly large fonts).
I mainly use "chart" or "histogram". Therefore I have to switch to the "Commands" tab, to start logging and back again to "Chart" to see the graph. Then back to "Commands" to stop logging. When repeating this several times to watch for spikes in my measurement, it would be easier to have the "Log"-Button directly behind the "Save"-Button on "chart" and "histogram", to skip switching the tabs.
While testing the fuse test script, I noticed my DP811A definition was missing a # before the interface setOn function. Here it is fixed.
A question. Maybe I'm doing something wrong. :-\
When I use the SDM3055 (while running a temperature measurement with PT1000)
and i start this software and select "temp" using the popup button, does it always switch from PT1000 to Thermocouple at the same time.
Can you prevent this change ?
If the software changes this, can it be corrected again ?
...It it does, it must be the default behaviour of the meter...
Perhaps I do not yet understand the relationships between this software and the cooperation with the firmware. ???
In EasyDMM, the switchover of the sensor types in the software (triggered by the software) is carried out correctly by the device itself.
All three sensor types switch correctly on the SDM3055 and work perfectly.
Many thanks :-+
klausES,
I found the SCPI command that EasyDMM is using. Try the attached, the SCPI command works on my SDM3065X so it should work on the SDM3055.
(Attachment Link)
HKJ,
Hold off on using this file with your next updating. In the next day or two I will update all three files for the Siglent meters and post them when completed
If other windows are open in Win and in the foreground and you bring the task of this software to the fore,
the button frame remains in the background (must be extracted separately each time).
Could you instruct the "Buttons" frame to step into the foreground together with the main window ?
Or (better in my opinion) integrate the frame with the buttons in the main window e.g. the buttons one above the other on the right side ?
HKJ,
Attached are updates for the Siglent SDM's and a screen shoot of the modes.
I have been working on a program that can log from multimeters, electronic loads, power supplies and some other stuff.
It is still an alpha version, but it works fairly well. I am interested in comments, ideas and error reports.
(https://lygte-info.dk/pic/Projects/TestController/Screens/Load%20devices.png)
(https://lygte-info.dk/pic/Projects/TestController/Screens/Chart.png)
Read more about it and download it from here: http://lygte-info.dk/project/TestControllerIntro%20UK.html (http://lygte-info.dk/project/TestControllerIntro%20UK.html)
If anybody have ideas about how to log from USB/HID connected meters, please tell. I have played with a Brymen, but it did not work (I did never get any data). Maybe there is more than one error in their documentation.
My current list of supported devices as of V0.32 are (not all are tested):
Agilent 34401A, Agilent U1252B, Agilent U1272A, B&K Precision BK8500, B&K Precision BK8502, B&K Precision BK8510, B&K Precision BK8512, B&K Precision BK8514, B&K Precision BK8518, B&K Precision BK8520, B&K Precision BK8522, B&K Precision BK8524, B&K Precision BK8526, Brymen BM521s, Brymen BM525s, Brymen BM821s, Brymen BM822s, Brymen BM827s, Brymen BM829s, Brymen BM867s, Brymen BM869s, Elma BM525s, Elma BM821s, Elma BM829s, Elma BM869s, Fluke 187, Fluke 189, Fluke 287, Fluke 289, Fluke 87, Fluke 8846A, Fluke 89, Greenlee DM-810A, Greenlee DM-820A, Greenlee DM-830A, Greenlee DML-430A, HKJ Discharger, HKJ SS-Relay, HKJ ThermoAndMore, HKJ ThermoSensor, Hewlett-Packard 34401A, Itech IT8511+, Itech IT8511A+, Itech IT8511B+, Itech IT8512+, Itech IT8512A+, Itech IT8512B+, Itech IT8512C+, Itech IT8512H+, Itech IT8513C+, Itech IT8514B+, Itech IT8514C+, Itech IT8516C+, Keithley 2280S-32-6, Keithley DMM6500, Keithley DMM7510, Keysight 34461A, Keysight 34465A, Keysight 34470A, Keysight U1231A, Keysight U1232A, Keysight U1233A, Keysight U1251A, Keysight U1252A, Keysight U1252B, Keysight U1253A, Keysight U1271A, Keysight U1272A, Keysight U1273A, Keysight U1273AX, Keysight U1281A, Keysight U1282A, Keysight U1461A, Mastech MS8040, Mastech MS8218, Rigol DP811A, Siglent SDG2122X, Siglent SDM3045X, Siglent SDM3055, Siglent SDM3065X, TTi CPX400DP, TTi QL355P, TTi QPX1200SP, Tenma 72-7730, Tenma 72-7732, Tenma 72-9380A, UNI-T UT61E, UNI-T UT71A, UNI-T UT71B, UNI-T UT71C, UNI-T UT71D, UNI-T UT71E, Vici VC8145, VirtualRampGenerator, VirtualSinusGenerator, VirtualSquareGenerator, Voltcraft VC-920, Voltcraft VC-940 COM, Voltcraft VC-960
HKJ,
I think you can remove the below line in the fist post. Thanks for sharing this great program with us and also the great site you have. :-+
You are too modest! No manufacturer has ever made such a brilliant peace of software...and TestController is not older than a month or so! :-+
...The thread title with multimeters is misleading, but I believed "multimeters" was better heading than "devices" and writing "multimeters, power supplies, electronic loads and other devices" was way to long.
#askValues READ?
jord4231,Thanks MikeLud no joy :(
Try this file.
(Attachment Link)
jord4231,Its set to Rigol, I tried the other command sets with other files but had no luck,
What Command mode do you have the meter set at?
(Attachment Link)
Next is the configuration menu for the power supply, check "TTiCPX400DP.txt" file for an example.
You will probably also need to check my description of it: https://lygte-info.dk/project/TestControllerConfigDevice%20UK.html#Configuration_menu (https://lygte-info.dk/project/TestControllerConfigDevice%20UK.html#Configuration_menu)
EEK! This is at the moment a bit beyond my (mainly analogue oriented) abilities. However, I'll be thinking about this.
By poking around your prog I found three things.
1.) When using "Math" it is not possible to enter a unit (of measurement).
2.) When being silly in "Table" setting "dateTime" to decimals or anything offered in the drop down table there is no way back to the initial proper "dateTime" display. Except for restarting of course. Should be locked as for "index" and "time".
3.) In "Chart" the sixth colour (light brownish green? can be difficult to see). Maybe using "resistor colours" brown - red - orange - yellow - green - blue might be better, however yellow and orange could be a problem here.
Even so, I'm beginning to like your prog. more and more. Hope it will never become a black GUI. :horse: Black and dark brown are so depressing. With small displays a black background is OK for me, but not for large ones. OK rant over.
#cmdSetup comboboxHot Mode Mode
:write: FUNC
:read: FUNC?
:tip: Setup Mode
VDC "VOLT"
ADC "CURR"
Stay with me at the moment (SDM3055 is coupled, instantaneous values are available, measurement type can be switched)
the windows for chart, histrogram and range inactive ?
HKJ,
Do you think you can add two types of Setup one would not lock (#cmdSetup) and the other would lock (#cmdSetupLock) when logging.
HKJ,
Do you think you can add two types of Setup one would not lock (#cmdSetup) and the other would lock (#cmdSetupLock) when logging.
You have not convinced me there is any need for it, you can put the mode change in the cmdMode menu and all the other adjustments in cmdSetup.
The tick in the window "load device" is on enable on the SDM3055
but the SDM3055 does not appear in the "table" window.
That is what I was think at first. It would be a nice to have if everything was under the Setup and less confusing on knowing what the active mode is.
#cmdMode Volts_DC VOLT
abort;
*cls;
CONF:VOLT:DC;
[*OPC];
:update: Mode1,Mode2;
That is what I was think at first. It would be a nice to have if everything was under the Setup and less confusing on knowing what the active mode is.
You can always use a info tag to show the active mode
How can I get Setup to update when the window is open and you change modes? I tried the below code but it does not work
...If something is strange, try starting in debug mode, it may give an explanation on what is going on...
#cmdSetup info Mode Mode
:read: FUNC?
:readmath: unQuote(value)
:updatemodechange:
How can I get Setup to update when the window is open and you change modes? I tried the below code but it does not work
Oops, you cannot.
Try this version: http://lygte-info.dk/pic/Projects/TestController/TestController.jar (http://lygte-info.dk/pic/Projects/TestController/TestController.jar)
and use a :updatemodechange: tag in the info part
I see the SDG2122X in the device list.
If there is time for it, it would be nice if I could also use this for my SDG1062X. :-/O
I just tried :updatemodechange: and it does not work, am I using it correctly?
#cmdSetup info Mode Mode
:read: FUNC?
:readmath: unQuote(value)
:updatemodechange:
I just tried :updatemodechange: and it does not work, am I using it correctly?
I was a bit too fast, you can try again now.
Made.Also a dB level when in 50 Ohm load output settings. ;)
It seems that it works with the SDG1062X. :)
Limits would have to be changed (e.g. sine from max. 120 MHz to max. 60 MHz for SDG1062X).
What strikes me is that the output ON / Off on channel 2 does not respond (it works on channel 1).
If I activate Output Channel 2 manually on the device, the software even shows me that, just switch from the software, because it does not respond.
And at volt it only allows pp setting, which is missing for rms.
I just redownloaded and tested but still no luck, can you confirm if I am using :updatemodechange: correctly.
Made.
It seems that it works with the SDG1062X. :)
Limits would have to be changed (e.g. sine from max. 120 MHz to max. 60 MHz for SDG1062X).
What strikes me is that the output ON / Off on channel 2 does not respond (it works on channel 1).
If I activate Output Channel 2 manually on the device, the software even shows me that, just switch from the software, because it does not respond.
And at volt it only allows pp setting, which is missing for rms.
I just redownloaded and tested but still no luck, can you confirm if I am using :updatemodechange: correctly.
You code looks correct, I will have to make a test definition and see what goes wrong, but that will first be tomorrow.
...below is the correct code:
#cmdSetup buttons State Output_2
:write: c2:outp
...
It is documented here: file:///D:/Devlop/lygte-info/project/TestControllerConfigDevice2%20UK.html (http://file:///D:/Devlop/lygte-info/project/TestControllerConfigDevice2%20UK.html)
Oops, link is corrected.
What's happened between version 032 and 036?
V0.36 is up
It has a working :updatemodechange:
The HMC8043 is included (Thanks to Messtechniker)
And a new driver is included, it is designed to handle devices that returns a single ascii line with a value and optional a mode.
It is documented here: http://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html (http://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html)
Greetings from Italy...after starting in debug mode with my Fluke 89IV connected trough COM1 port...
";; Start thread for: COM1 - Fluke xxx
;; COM1: Set params: 9600
;; COM1: Tx: <ID.> 49 44 0D
;; COM1: Rx: timeout
MikeLud try remove "Mode" page selection after you #cmdSetup, then you will get the mode below all the pages.
With Fluke 287 (too high Baud rate for 89IV)...
Nice, thanks again.
Nice, thanks again.
You can also map the mode text, but it will be a fairly long line, let me show it as two lines first:
First you convert the received value to a number with this statement:
index=listIndex(value,"DIOD VOLT VOLT:AC ....."," ");
Then you convert the number back to a text with this statement:
getElement("Diode;VOLT DC;VOLT AC;...",index,";");
These two statement must be packed on one line in a :readmath: tag:
:readmath: getElement("Diode;VOLT DC;VOLT AC;...",listIndex(value,"DIOD VOLT VOLT:AC ....."," "),";");
Messtechniker try this definition file: http://lygte-info.dk/pic/Projects/TestController/R%26SHMC8043.txt (http://lygte-info.dk/pic/Projects/TestController/R%26SHMC8043.txt)This definition file works with ver 036.
I change column selection a bit and because you had selectors in the #value lines, the columns was not selected.
With Fluke 287 (too high Baud rate for 89IV)...
I checked the documentation and it has to use Fluke89 setting, but try opening the "FlukeDMM18x28x.txt" file and change the #baudrate setting for Fluke 89 to "#baudrate 9600n81dR" or maybe "#baudrate 9600n81Dr"
";; Start thread for: COM1
;; COM1: Set params: 9600
;; COM1: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM1: Rx: timeout
;; COM1: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM1: Rx: timeout
;; Stopping thread for: COM1
;; Use "Load devices" page for selecting devices to load. Most devices will only load if they are connected and ready.
"
But I have not yet found a way where :write: ... ;VOLT will set the voltage for both CH1 and CH2 simultaneously. VOLT will always apply to one channel only. Possibly a restriction of the SCPI command syntax. There is apparently no SCPI TRACK command here. Have thought as an alternative about invoking a saved configuration (*SAV0 and then *RCL0) but this does not work either. Perhaps someone has any ideas? Would be 8)
There seems to be a difference between 0.32 vs. 0.36 as far as Brymen detection on a Windows OS is concerned?!
0.32 - immediate detection, after adding DMM
0.36 - no detection, despite adding DMM
It is brilliant, that you have implemented a custom size-option for saving an image. You can save the chart in any width you like, to have a better reading by expanding the png format in the width.
However, this custom size is resetted to 1000x500 after the next start. Is this also possible that the "Custom Save png-format" option is kept even after next start, for example: Custom 10000x1080 for ever referring to Chart and Histogram till you change it again to your preferred setting?
Here is the Device file for a GW Instek GPP-4323 four-channel power supply. This has been tested with the LAN interface.
It also does not support the Load mode for Channels 1 and 2. Pity, but that seems tough to integrate into a single Device file (that is, if the device file also supports the normal power supply mode.) Maybe I'll do a separate device file for the GPP-4323 as an active load rather than a power supply, and then one could choose either power supply or active load instances. Though that seems a bit crude. We will see...
...After I finish the SDM3065X device file I will work on the other two Siglent DMM files...I hope this. ^-^
... and now the next HMC 8043 definition file (Ver. 0.6). Now the popup includes voltage and current tacking for channels 1 and 2. There is one minor quirk: the red light once it is on, stays on regardless of output switch ON or OFF. Everything else works as intended. i.e. I have almost flogged my three resistors to death. :)
I was doing some experiments with the HID driver, but forgot to restore it to working state, it is working now.
As i've seen other users with troubles on fluke 89iv i've done some tests of the 87iv, and it works perfectly (freshly downloaded lastest version). I'm surpised that it not work on 89iv as it's almost the same thing (need to confirm but seem only a value in an eeprom, hardware side are identical).
The only "glitch" is that it not senses the switch from *C and *F in temperature, for who uses *F.
Other thing, not work on older java versions. I have a windows xp with java 1.8.0.74 and the serial interface not work.
I've seen the new driver for "single value" multimeters. I think that is perfect for my protek 506! Tomorrow i'll play a bit
Using Ubuntu I am not able to fetch the usb port of Brymen's usb adaptor, thus it is impossible for me to debug anything within TestController...
Attached is an updated Advanced Siglent SDM3065X device file. It is 99% finished, all that is left is to update the :tip: tags. Anyone that has a Siglent SDM3065X please test it and let me know if there are any issues.
Other thing, not work on older java versions. I have a windows xp with java 1.8.0.74 and the serial interface not work.
That is strange.
Exception in thread "Thread-2" java.lang.UnsatisfiedLinkError: C:\Documents and
Settings\User\Impostazioni locali\temp\1587468243109-jSerialComm.d
ll: Impossibile trovare la procedura specificata
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.load0(Unknown Source)
at java.lang.System.load(Unknown Source)
at com.fazecast.jSerialComm.SerialPort.<clinit>(SerialPort.java:244)
at dk.hkj.comm.SerialInterface.getSerialPorts(SerialInterface.java:245)
at dk.hkj.main.InterfaceThreads$ScanPorts.run(InterfaceThreads.java:518)
This is the error:
...
Uhm, i've reset the java security options and set it to the lowest possible setting. The file exists in the temp directory. Maybe the sw try to use it before it's copied in the temp folder?
For the fluke 89iv issue, i need to specify that i'm not using a genuine fluke rs232-irda transmitter. I'm using a modified usb-irda transmitter, that works perfectly on flukeview, like the original one. The only difference is that i'm ignoring the control lines (disconnected the wires between the usb-serial prolific ic to the 232-to-irda ic, as they were causing problems disabling the output). So i think that of there is a problem witb the genuine 232-irda adapter is not with the serial communication but with control lines.
Checked, with flukeview forms pin 4 of db9 (DTR) is at -v, and pin 6 (RTS) at +v.
With testcontroller both the pin 4 and pin 6 are at +v.
That's why the fluke irda isn't working. I think that is only for 87iv and 89iv.
That is controlled with d or D and r or R after the baudrate, lower case letter will set the pin low, upper case letter will set the pin high. It is probably "#baudrate 9600N81Dr" that will work"R" and "r" works, but "d" and "D" doesn't do nothing. The pin 4 output always +V.
#idString PROTEK,Protek 506
#name Protek 506
#handle P506
#port comfixedbaud
#baudrate 1200N72
#eol \r
#driver SingleValue
#value VoltageDC V d3 DC
#interfaceType DMM
#interface readValue 0
#askValues \r
It works, in the debug i get values:;; PROTEK506: Tx <VALUE?>
;; PROTEK506: Rx <-0.001>
;; PROTEK506: Rx as numbers <-0.001>
That is controlled with d or D and r or R after the baudrate, lower case letter will set the pin low, upper case letter will set the pin high. It is probably "#baudrate 9600N81Dr" that will work"R" and "r" works, but "d" and "D" doesn't do nothing. The pin 4 output always +V.
Flukeviewforms set it correctly to -V the pin 4.
I was also playing with the SingleValue driver, this is the definition that i came up for the Protek (for now for DC mode):Code: [Select]#idString PROTEK,Protek 506
It works, in the debug i get values:
#name Protek 506
#handle P506
#port comfixedbaud
#baudrate 1200N72
#eol \r
#driver SingleValue
#value VoltageDC V d3 DC
#interfaceType DMM
#interface readValue 0
#askValues \rCode: [Select];; PROTEK506: Tx <VALUE?>
;; PROTEK506: Rx <-0.001>
;; PROTEK506: Rx as numbers <-0.001>
but in the "current values" window i not have nothing.
What i am doing wrong?
I found a typo, try this jar file: http://lygte-info.dk/pic/Projects/TestController/TestController.jar (http://lygte-info.dk/pic/Projects/TestController/TestController.jar)
#baudrate 9600N81dR
set on both Fluke 87 and 89 definitions i have the control lines set the same as the fluke software, i have not a fluke cable, but now i think that must work.
Two things:Ok for the #eol.
1) Disable #eol, it is not needed here use: #eol \_
2) You mode/selector specification is wrong, it you leave it out you will get the value. But what you really need is the correct mode, I believe it is "DCV".
The driver uses all letters on the line for mode, except SI prefixes. It is supposed to list the mode in the debug information.
DC 9.999 V(chr13)
While in AC voltageAC 9.999 V(chr13)
Perfect!
Now withCode: [Select]#baudrate 9600N81dR
set on both Fluke 87 and 89 definitions i have the control lines set the same as the fluke software, i have not a fluke cable, but now i think that must work.
Two things:Ok for the #eol.
1) Disable #eol, it is not needed here use: #eol \_
2) You mode/selector specification is wrong, it you leave it out you will get the value. But what you really need is the correct mode, I believe it is "DCV".
The driver uses all letters on the line for mode, except SI prefixes. It is supposed to list the mode in the debug information.
For the "DC" instead of the "DCV", i tought that the software was using this string for know the mode of the meter. My meter in DC voltage output the lineCode: [Select]DC 9.999 V(chr13)
While in AC voltageCode: [Select]AC 9.999 V(chr13)
RES 1.111 MOHM(chr13)
i have tried#value Resistance ohm d3 RES
#value Resistance ohm d3 RESOHM
#value Resistance ohm d3 ROHM
and also with "si" instead of "d3", but never worked. I not understand what type of search you do on the input string, in theory RESOHM had all the characters.Ok, got it!
I was testing also with si values, and get also the mv and ua ranges.
But for resistance, the string is:Code: [Select]RES 1.111 MOHM(chr13)
i have triedCode: [Select]#value Resistance ohm d3 RES
and also with "si" instead of "d3", but never worked. I not understand what type of search you do on the input string, in theory RESOHM had all the characters.
#value Resistance ohm d3 RESOHM
#value Resistance ohm d3 ROHM
Sorry to bother you so much but i understand a bit slowly |O
Perfect, resistance fixed, RESOHM working ok!
Question for continuity mode, diode mode and logic level mode... I have some text for this modes, for example in continuity can be "OPEN" or "SHORT", in diode "OPEN", "GOOD"or "SHORT", in logic "LOW", "HIGH" or "UNDET".
There are really few oppurtunity to have the need to log this modes (as continuity is covered by Resistance, diode... who need to log a diode testing?? and logic by VoltageDC), but there is no way to integrate them?
Now i play with other things (temperature, C/L and frequency) but the most is done :-+ :-+ :-+
A tag would be nice, so that any other device with this modes can be inserted simply by the definition file.Perfect, resistance fixed, RESOHM working ok!
Question for continuity mode, diode mode and logic level mode... I have some text for this modes, for example in continuity can be "OPEN" or "SHORT", in diode "OPEN", "GOOD"or "SHORT", in logic "LOW", "HIGH" or "UNDET".
There are really few oppurtunity to have the need to log this modes (as continuity is covered by Resistance, diode... who need to log a diode testing?? and logic by VoltageDC), but there is no way to integrate them?
Now i play with other things (temperature, C/L and frequency) but the most is done :-+ :-+ :-+
If have some build-in text strings, but I may need to add a tag for specifying text strings and their value. I will take a look at that tomorrow.
A matching text will have to return a numeric value or +OL or -OL.
If it matches a text string it will be removed from the input, before it checks mode.
Theoretically you will be able to show text, but it requires defining a column as "Digital" and using bits for the different text. I will not really recommend that for a multimeter.
...Attached is a new version of the Siglent SDM3065X device file. I decided to remove all of "tip" tags. I am going to start on updating the SDM3055 file...
With 040 I'm gettingSame error
Exception in thread "Thread-4" java.lang.Error: Unresolved compilation problem:
The method readFileAsListAutoCharset(File) in the type FileUtil is not applicable for the arguments (File, String, boolean, boolean)
when trying to get the list. Has to do with the changed char set. :palm:
With 040 I'm getting
Exception in thread "Thread-4" java.lang.Error: Unresolved compilation problem:
The method readFileAsListAutoCharset(File) in the type FileUtil is not applicable for the arguments (File, String, boolean, boolean)
when trying to get the list. Has to do with the changed char set. :palm:
Test now only briefly (must sleep) rest tomorrow. :)
I only noticed one mistake on the fast one.
At Temp there is an "Â" in the cell in front of the °C ?!?
On purpose ? Does it have a special meaning?
Line = #value Temperature °C D4 Temperature
V0.40 is up.
It includes some definition updates and a change to the "SingleValue" driver. I have modified the Protec506 definition to match it (It is included), but it needs some checking. The problems with the degree character was due to character sets issues, I uses a old style cp1252 format (Because my editor uses it as default), you used a more modern utf-8. TestController can handle utf-8 & utf-16 if it knows it, the file must have a BOM (May be an option in your editor). I have added a BOM to you definition.
The character set is only a problem with special characters, anything in the A-Z range and some symbols will always work (See here for a list: https://en.wikipedia.org/wiki/ASCII ).
I have not included the HMO1022 and the SDM3055
I was using windows notepad to edit the file I changed to notepad++ and added a BOM
I was using windows notepad to edit the file I changed to notepad++ and added a BOM
You say when I can update it.
Can there be problems with BOM in some of you other meter definitions?
...The attached should fix...
...The attached should fix...
Don't hit, I took the  out for test (secretly for me) this morning without asking you. ;)
Thanks for the new complete file. :)
I was using windows notepad to edit the file I changed to notepad++ and added a BOM
You say when I can update it.
Can there be problems with BOM in some of you other meter definitions?
A luxury problem:
Would it be possible to choose not only beeper on / off but also the three volume levels in diode and continuity ? :D
Otherwise I could not find anything so far that would not work. :-+
It looks like Brymen and Fluke DDMs are having the same issues with BOMs.
HKJ,
would it be possible that the main window is not centered in the middle of the desktop when the program is started,
but used the last used position saved on the desktop again ?
Even worse ... would this save the last position also for the popups ?
HKJ,
How hard is it to add a device file for the Riden RD6006? Below is a link I found with the protocol details
https://github.com/msillano/RD6006-Super-power-supply (https://github.com/msillano/RD6006-Super-power-supply)
Bug report:
VC 940 COM (Real COM on PC) Ohms values correct on VC 940
but by a factor of 10 lower as shown by your prog. :scared:
This applies to the entire range tested (from 1 Ohm to 10 Meg)
Bug report:
VC 940 COM (Real COM on PC) Ohms values correct on VC 940
but by a factor of 10 lower as shown by your prog. :scared:
This applies to the entire range tested (from 1 Ohm to 10 Meg)
I suppose this means I have to divide ohm readings by 10 and also continuity readings (It is separate from ohms).
Sorry for not being clear enough: for example, for a 1 MegOhm resistor the VC 940 COM displays 1 MegOhm as it should, but the Test Controller displays 100 kOhm. So a multiply by 10 is required.Will look at the continuity readings later since we are busy with some garden work. :-/OSame applies to the continuity readings (Still on Ver. 040).
Mikelud,
how could I change the placement of the buttons in the 3055 mode popup ?
Would e.g. like to swap places AC Current with DC Voltage and then set both Currents one column higher (instead of Capitance and Continuity).
;; P506: Tx <VALUE?>
;; P506: Rx <∞>
;; P506: Rx as numbers <Infinity>
Uhm, so now if i create more definitions i can do them with windows notepad? I think that it save in UTF.
I think that there is still something wrong with protek.
In resistance mode when i'm in OL, on the current value window i get "0".
But this is the debug:Code: [Select];; P506: Tx <VALUE?>
;; P506: Rx <∞>
;; P506: Rx as numbers <Infinity>
I've set "return infinite".
I'm checking only on the "current values" list.
On previous versions i remember that there was correctly the infinite symbol.
The saved window position, also that of the popups, is very good.
; Strings to configure device in different modes
; First parameter must match a #value (4 parameter) and second parameter must match what #askMode returns
; First parameter is also used in shortcut menu
;#cmdMode
#cmdModeLayout columns rows 3 4
#cmdMode DC_Voltage VOLT
abort;
*cls;
CONF:VOLT:DC;[*OPC]
V0.42 is up, due to KlausES (VC940 is also fixed).
Add a
#cmdModeLayout columns rows
To the device specifications, then the mode window will have the specified number of columns and rows.
When this commands has been used it is also possible to use empty
#cmdMode
for adding empty positions in the mode layout.
If changing a layout it may be a good idea to copy it to ...documents/TestController/Devices
Layouts placed there will override the definitions supplied with TestController
I could not get #cmdModeLayout columns rows to work, My understanding is you add it to the device file, code shown below.
I could not get #cmdModeLayout columns rows to work, My understanding is you add it to the device file, code shown below.
One small modification (The columns & rows text was supposed to be replaced by the numbers):
#cmdModeLayout 3 4
I tried #cmdModeLayout 3 4 also did not work.
...If changing a layout it may be a good idea to copy it to ...documents/TestController/Devices
Layouts placed there will override the definitions supplied with TestController
Which device directory is really relevant for the program?
That as a subdirectory at the location of the program or the ...documents/TestController/Devices...?
I tried #cmdModeLayout 3 4 also did not work.
Something must have been mixed up in V0.42, I have no idea how.
I have uploaded V0.43 and I checked it just before I zipped it and #cmdModeLayout works.
It do also include the fix to infinite and a update to the G&W ps and one G&W ps more from Hexley.
; Final command to meter before breaking connection
#finalCmd abort;*cls;*rst
When I have connected (and worked) the program to the SDM3055 and finished the program the 3055 remains on remote.
(Must then be manually set to local on the device).
Before that, it no longer allows remote access from other applications.
Your program in this state (your program terminated, 3055 still on remote),
but for itself it can be reconnected.
Which other applications cannot do this at this moment...
It is probably not possible that the 3055 is set to local when the program is ended ?
Wow, it works. :-+Code: [Select]; Final command to meter before breaking connection
#finalCmd abort;*cls;*rst
; Strings to configure device in different modes
; First parameter must match a #value (4 parameter) and second parameter must match what #askMode returns
; First parameter is also used in shortcut menu
;#cmdMode
#cmdModeLayout 3 5
#cmdMode DC_Voltage VOLT
abort;
*cls;
CONF:VOLT:DC;[*OPC]
#cmdMode AC_Voltage VOLT:AC
abort;
*cls;
conf:volt:ac;[*OPC]
#cmdMode 2W_Resistance RES
abort;
*cls;
conf:res;[*OPC]
#cmdMode
#cmdMode 4W_Resistance FRES
abort;
*cls;
conf:fres;[*OPC]
#cmdMode Capacitance CAP
abort;
*cls;
conf:cap;[*OPC]
#cmdMode Diode DIOD
abort;
*cls;
conf:diod;[*OPC]
#cmdMode Continuity CONT
abort;
*cls;
conf:CONT;[*OPC]
#cmdMode
#cmdMode Frequency FREQ
abort;
*cls;
conf:freq;[*OPC]
#cmdMode Period PER
abort;
*cls;
conf:per;[*OPC]
#cmdMode Temperature TEMP
abort;
*cls;
func "temp";[*OPC]
#cmdMode
#cmdMode DC_Current CURR
abort;
*cls;
conf:curr:dc;[*OPC]
#cmdMode AC_Current CURR:AC
abort;
*cls;
conf:curr:ac;[*OPC]
Does changing the 3055 mode button positions already work ?
I plan on supporting the modbus protocol, but I do not know if it will be hardcoded or with user configurable yet.
I plan on supporting the modbus protocol, but I do not know if it will be hardcoded or with user configurable yet.I think going with the user configurable would be the best route. This would allow user like me to do some of the work in helping add more devices.
What can it be if a definition file with changed content is not read by the program despite copying the new version
in both relevant directories (the old ones were definitely overwritten).
I have one question, does it matter the order of the :read: and :write: tags under #cmdSetup command. I notice on your website the samples show :read: first on some of the samples and others show :write: first.
Modbus is nearly working now and it is defined in a device file.
If somebody want to help me test it and has time today or tomorrow to try implement and test a Modbus device, please say. It is the serial RTU type I have implemented.
I am testing on a Maynou M9712C load.
I've been lurking here for a while and finally got round to downloading and running this code; it looks pretty good :D
One obvious application for this would be to test power supplies. I own an HP6060B 3-60V 0-60A DC electronic load and a HP6643A 0-35V 0-6A Power supply, these devices are old and have GPIB connectors at the back that I connect to an Aglient E5810A GPIB to LAN gateway. Can anyone steer me as to:
a. How I can make a connection from HKJ's program to my devices over the LAN?
b. How to get started writing device files that would control the above old test gear?
Thanks in advance.
a. How I can make a connection from HKJ's program to my devices over the LAN?
b. How to get started writing device files that would control the above old test gear?
I will try the RD6006, send over the new version for me to test.
COM7 23.827 vTx: values?
;; COM7: Tx: 01 03 00 05 00 01 94 0B
;; COM7: Rx: 01 03 02 00 1F F9 8C
;; COM7: Tx: 01 03 00 0A 00 01 A4 08
;; COM7: Rx: 01 03 02 01 F4 B8 53
COM7 23.953 vRx: 31 500
;; RD6006: Rx <31 500>
;; RD6006: Rx as numbers <31.0 500.0>
;; RD6006: Tx <values?>
COM7 24.033 vTx: values?
;; COM7: Tx: 01 03 00 05 00 01 94 0B
Thread for RD6006
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at dk.hkj.devices.DeviceModbus$TranslatingCommInterface.readHoldingInput(DeviceModbus.java:336)
at dk.hkj.devices.DeviceModbus$TranslatingCommInterface.write(DeviceModbus.java:176)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:102)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:155)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:192)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:237)
at dk.hkj.main.SCPICommand.readNumbers(SCPICommand.java:317)
at dk.hkj.main.DeviceInterface.getValuesFromDevices(DeviceInterface.java:301)
at dk.hkj.devices.DeviceSCPI.getValuesFromDevices(DeviceSCPI.java:38)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:905)
java.lang.NullPointerException
at dk.hkj.main.PaneCurrentValues.updateDirect(PaneCurrentValues.java:363)
at dk.hkj.main.PaneCurrentValues.timerUpdate(PaneCurrentValues.java:353)
at dk.hkj.main.PaneCurrentValues.access$6(PaneCurrentValues.java:351)
at dk.hkj.main.PaneCurrentValues$2.actionPerformed(PaneCurrentValues.java:68)
at javax.swing.Timer.fireActionPerformed(Unknown Source)
at javax.swing.Timer$DoPostEvent.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
I am able to get my RD6006 to communicate. When on the Current Values tab I get the below after about a minute or two.
I am able to get my RD6006 to communicate. When on the Current Values tab I get the below after about a minute or two.
Can it have problems with the update speed? Try log with 1 seconds intervals and see if it works without error.
Do it stop updating completely?
It is a timing issue, logging at 1 second works. When on the Current Value tab it stops updating completely. If I change tabs and go back to the Current Value it starts back up.
I also could not get /factor to work
#scpiCmd Voltage? holding? 0x0a /100
I got time to add a #cmdDelayTime
Something like:
#cmdDelayTime 50
May fix the timeout.
This is V0.46 and only a .jar file.
The below link is still V0.45
I got time to add a #cmdDelayTime
Something like:
#cmdDelayTime 50
May fix the timeout.
This is V0.46 and only a .jar file.
The issue I was having with timing out was the baud rate on the RD6006 being to high, the default was 115200, I dropped it down to 9600 and all is good with out using #cmdDelayTime.
I still can not get /factor to work
#scpiCmd Voltage? holding? 0x0a 1 /100
I still can not get /factor to work
#scpiCmd Voltage? holding? 0x0a 1 /100
I have only tested it on the command line, because the load I am using do not need it.
I.e. do "holding? 0x0a 1 /100" work on the command line?
The last version did fix the parser and you do not need the 1 anymore.
I does work on the command line :-+
;; RD6006: Rx as number <1.0>
;; RD6006: Tx <VSet?>
;; COM7: Tx: 01 03 00 08 00 01 05 C8
;; COM7: Rx: 01 03 02 01 F4 B8 53
;; RD6006: Rx <5.0>
;; RD6006: Rx as number <5.0>
;; RD6006: Tx <ISet?>
;; COM7: Tx: 01 03 00 09 00 01 54 08
;; COM7: Rx: 01 03 02 04 D2 3A D9
;; RD6006: Rx <1.234>
;; RD6006: Rx as number <1.234>
;; RD6006: Tx <VSet 5.67>
java.lang.NumberFormatException: For input string: "*100"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Long.parseLong(Unknown Source)
at java.lang.Long.parseLong(Unknown Source)
at dk.hkj.devices.DeviceModbus$TranslatingCommInterface.parseLong(DeviceModbus.java:43)
at dk.hkj.devices.DeviceModbus$TranslatingCommInterface.parseValuesLong(DeviceModbus.java:161)
at dk.hkj.devices.DeviceModbus$TranslatingCommInterface.write(DeviceModbus.java:255)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:212)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:249)
at dk.hkj.main.SCPICommand.write(SCPICommand.java:281)
at dk.hkj.devices.SetupFormats$NumberField.actionPerformed(SetupFormats.java:831)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
;; RD6006: Tx <VSet?>
;; COM7: Tx: 01 03 00 08 00 01 05 C8
;; COM7: Rx: 01 03 02 01 F4 B8 53
;; RD6006: Rx <5.0>
I have most of everything work except when trying to writing a new VSet or ISet value I get the below code.
I have most of everything work except when trying to writing a new VSet or ISet value I get the below code.
The /100 or *100 must be last on the line, you error message looks like it was not and there must be exactly one space between arguments (This will be fixed in next version).
;; RD6006: Tx <VSet 4.56>
;; RD6006: Tx: holding 0x08 455.99999999999994
java.lang.NumberFormatException: For input string: "455.99999999999994"
;; RD6006: Tx <VSet 4.5>
;; RD6006: Tx: holding 0x08 450.0
java.lang.NumberFormatException: For input string: "450.0"
;; RD6006: Tx <VSet 4.0>
;; RD6006: Tx: holding 0x08 400.0
java.lang.NumberFormatException: For input string: "400.0"
I am still have issues writing. it looks like the problem is that when the command is issued it is sending a float value when it needs to be an integer see examples below.
I am still have issues writing. it looks like the problem is that when the command is issued it is sending a float value when it needs to be an integer see examples below.
I hope it is fixed now:
http://lygte-info.dk/pic/Projects/TestController/TestController.jar (http://lygte-info.dk/pic/Projects/TestController/TestController.jar)
And when listing error dumps, please include more lines of the java exceptions
I am able to write now, but I see that holding is sending a 32 bit value when it needs to be a 16 bit value. It is using (10 Hex) Preset Multiple Regs when it need to be (06 HEX) Preset Single Register. I think you need to have the below holding commands.
I have most of everything work except when trying to writing a new VSet or ISet value I get the below code.
The /100 or *100 must be last on the line, you error message looks like it was not and there must be exactly one space between arguments (This will be fixed in next version).
#scpiCmd TEMPC? holding? 0x05
#scpiCmd VSet holding 0x08 (value) *100
#scpiCmd VSet? holding? 0x08 /100
#scpiCmd ISet holding 0x09 (value) *1000
#scpiCmd ISet? holding? 0x09 /1000
#scpiCmd Volt? holding? 0x0a /100
#scpiCmd OPC? holding? 0x12
#scpiCmd OPC holding 0x12 (value)
I got time to add a #cmdDelayTime
Something like:
#cmdDelayTime 50
May fix the timeout.
This is V0.46 and only a .jar file.
;; RD6006: Tx <values?>
;; RD6006: Tx <holding? 0x08 /100;holding? 0x09 /1000;holding? 0x0A /100;holding? 0x0B /1000;holding? 0x0D /100;holding? 0x21 /100;holding? 0x23;holdingl? 0x26 /1000;holdingl? 0x28 /1000>
;; COM7: Tx: 01 03 00 08 00 01 05 C8
;; COM7: Rx: 01 03 02 01 4A 38 23
;; COM7: Tx: 01 03 00 09 00 01 54 08
;; COM7: Rx: 01 03 02 00 FA 38 07
;; COM7: Tx: 01 03 00 0A 00 01 A4 08
;; COM7: Rx: 01 03 02 00 FD 79 C5
;; COM7: Tx: 01 03 00 0B 00 01 F5 C8
;; COM7: Rx: 01 03 02 00 FB F9 C7
;; COM7: Tx: 01 03 00 0D 00 01 15 C9
;; COM7: Rx: 01 03 02 00 3F F8 54
;; COM7: Tx: 01 03 00 21 00 01 D4 00
;; COM7: Rx: 01 03 02 00 04 B9 87
;; COM7: Tx: 01 03 00 23 00 01 75 C0
;; COM7: Rx: 01 03 02 00 1E 38 4C
;; COM7: Tx: 01 03 00 26 00 02 25 C0
;; COM7: Rx: 01 03 04 00 00 00 69 3A 1D
;; COM7: Tx: 01 03 00 28 00 02 44 03
;; COM7: Rx: 01 03 04 00 00 01 0B BA 64
;; RD6006: Rx <3.3000000000000003 0.25 2.5300000000000002 0.251 0.63 0.04 30 0.105 0.267>
;; RD6006: Delay: 100ms
;; RD6006: Rx as numbers <3.3000000000000003 0.25 2.5300000000000002 0.251 0.63 0.04 30.0 0.105 0.267>
;; RD6006: Tx <values?>
;; RD6006: Tx <holding? 0x08 /100;holding? 0x09 /1000;holding? 0x0A /100;holding? 0x0B /1000;holding? 0x0D /100;holding? 0x21 /100;holding? 0x23;holdingl? 0x26 /1000;holdingl? 0x28 /1000>
;; COM7: Tx: 01 03 00 08 00 01 05 C8
java.lang.NullPointerException
at dk.hkj.devices.DeviceModbus$TranslatingCommInterface.readHoldingInput(DeviceModbus.java:445)
at dk.hkj.devices.DeviceModbus$TranslatingCommInterface.write(DeviceModbus.java:268)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:102)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:146)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:183)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:225)
at dk.hkj.main.SCPICommand.readNumbers(SCPICommand.java:305)
at dk.hkj.main.DeviceInterface.getValuesFromDevices(DeviceInterface.java:327)
at dk.hkj.devices.DeviceSCPI.getValuesFromDevices(DeviceSCPI.java:38)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:907)
;; RD6006: Rx Timeout
;; RD6006: Delay: 100ms
;; RD6006: Rx as numbers <NaN>
;; RD6006: Tx <values?>
;; RD6006: Tx <holding? 0x08 /100;holding? 0x09 /1000;holding? 0x0A /100;holding? 0x0B /1000;holding? 0x0D /100;holding? 0x21 /100;holding? 0x23;holdingl? 0x26 /1000;holdingl? 0x28 /1000>
;; COM7: Tx: 01 03 00 08 00 01 05 C8
;; COM7: Rx: 01 03 02 01 4A 38 23
;; COM7: Tx: 01 03 00 09 00 01 54 08
;; COM7: Rx: 01 03 02 00 FA 38 07
;; COM7: Tx: 01 03 00 0A 00 01 A4 08
;; COM7: Rx: 01 03 02 00 FD 79 C5
;; COM7: Tx: 01 03 00 0B 00 01 F5 C8
;; COM7: Rx: 01 03 02 00 FB F9 C7
;; COM7: Tx: 01 03 00 0D 00 01 15 C9
;; COM7: Rx: 01 03 02 00 3F F8 54
;; COM7: Tx: 01 03 00 21 00 01 D4 00
;; COM7: Rx: 01 03 02 00 04 B9 87
;; COM7: Tx: 01 03 00 23 00 01 75 C0
;; COM7: Rx: 01 03 02 00 1E 38 4C
;; COM7: Tx: 01 03 00 26 00 02 25 C0
;; COM7: Rx: 01 03 04 00 00 00 6A 7A 1C
;; COM7: Tx: 01 03 00 28 00 02 44 03
;; COM7: Rx: 01 03 04 00 00 01 0C FB A6
;; RD6006: Rx <3.3000000000000003 0.25 2.5300000000000002 0.251 0.63 0.04 30 0.106 0.268>
;; RD6006: Delay: 100ms
;; RD6006: Rx as numbers <3.3000000000000003 0.25 2.5300000000000002 0.251 0.63 0.04 30.0 0.106 0.268>
;; RD6006: Tx <values?>
I am mostly finished with the device file for the Riden RD6006. Intermittently I am still getting Rx Timeout at the default baud rate of 115200 (see below). Do you have any suggestions that would help this issue, see attached device file for the current settings
Thanks for this useful software :-+
I have attached a settings file for Keithley 2000.
;; 22:37:34.384 COM5: Set params: 115200
;; 22:37:34.584 : Tx <holdingl? 0x01>
;; 22:37:34.584 COM5: Tx: 01 03 00 01 00 02 95 CB
;; 22:37:34.608 COM5: Tx: 01 03 00 01 00 02 95 CB
;; 22:37:34.631 COM5: Tx: 01 03 00 01 00 02 95 CB
;; 22:37:34.655 COM5: Tx: 01 03 00 01 00 02 95 CB
;; 22:37:34.677 COM5: *** Timeout ***
;; 22:37:34.677 COM5: Rx: 01 03 04 00 00 07 39 38 11
;; 22:37:34.677 : Tx <holding? 0x03 /100>
;; 22:37:34.787 COM5: Tx: 01 03 00 03 00 01 74 0A
;; 22:37:34.810 COM5: Tx: 01 03 00 03 00 01 74 0A
;; 22:37:34.834 COM5: Tx: 01 03 00 03 00 01 74 0A
;; 22:37:34.857 COM5: Tx: 01 03 00 03 00 01 74 0A
;; 22:37:34.879 COM5: *** Timeout ***
;; 22:37:34.949 COM5: Rx: 01 03 02 00 80 B9 E4
;; Found Riden RD6006 on USB2.0-Serial (COM5) sn: 1849
;; 22:57:55.746 RD6006: Tx <values?>
;; 22:57:55.747 RD6006: Tx <holding? 0x08 /100;holding? 0x09 /1000;holding? 0x0A /100;holding? 0x0B /1000;holding? 0x0D /100;holding? 0x21 /100;holding? 0x23;holdingl? 0x26 /1000;holdingl? 0x28 /1000>
;; 22:57:55.748 COM5: Tx: 01 03 00 08 00 01 05 C8
java.lang.NullPointerException
at dk.hkj.devices.DeviceModbus$TranslatingCommInterface.readHoldingInput(DeviceModbus.java:448)
at dk.hkj.devices.DeviceModbus$TranslatingCommInterface.write(DeviceModbus.java:271)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:102)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:146)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:183)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:225)
at dk.hkj.main.SCPICommand.readNumbers(SCPICommand.java:305)
at dk.hkj.main.DeviceInterface.getValuesFromDevices(DeviceInterface.java:327)
at dk.hkj.devices.DeviceSCPI.getValuesFromDevices(DeviceSCPI.java:38)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:907)
;; 22:57:56.751 RD6006: Rx Timeout
;; 22:57:56.752 RD6006: Rx as numbers <NaN>
;; 22:57:56.752 RD6006: Tx <values?>
I have uploaded a new .jar file with a answer timeout, this timeout is from the end of transmission until it receives the first byte of the answer. If nothing is received within the timeout it will retransmit the request.
The setting is:
#answerTimeout 20
The value 20 is probably a good value, you will have to check the log, and you have to that at both 115200 and 9600 baud. What you must look for is duplicate "Tx: xx xx xx xx" (i.e. when the same Tx is repeated without any Rx in between). If they occur regulary your timeout is too short.
The main 1 second message timeout is still active (#readingDelay) and if the communication time is above that the message will fail. That timeout applies to the "values?" command.
When working with timeouts it may be a good idea to change a line in the TextControllerDebug.bat file to:
java -jar TestController.jar debugTime %1 %2 %3 %4 %5 %6 %7 %8 %9
The you will get time stamps on each debug line and can see exactly how fast things are running.
;; 00:44:37.128 RD6006: Tx <values?>
;; 00:44:37.128 RD6006: Tx <holding? 0x08 /100;holding? 0x09 /1000;holding? 0x0A /100;holding? 0x0B /1000;holding? 0x0D /100;holding? 0x21 /100;holding? 0x23;holdingl? 0x26 /1000;holdingl? 0x28 /1000>
;; 00:44:37.128 COM7: Tx: 01 03 00 08 00 01 05 C8
;; 00:44:37.159 COM7: Rx: 01 03 02 01 4A 38 23
;; 00:44:37.160 COM7: Tx: 01 03 00 09 00 01 54 08
;; 00:44:37.266 COM7: Rx: 01 03 02 01 F4 B8 53
;; 00:44:37.267 COM7: Tx: 01 03 00 0A 00 01 A4 08
;; 00:44:37.372 COM7: Rx: 01 03 02 01 4A 38 23
;; 00:44:37.373 COM7: Tx: 01 03 00 0B 00 01 F5 C8
;; 00:44:37.478 COM7: Rx: 01 03 02 01 48 B9 E2
;; 00:44:37.479 COM7: Tx: 01 03 00 0D 00 01 15 C9
;; 00:44:37.584 COM7: Rx: 01 03 02 00 6C B8 69
;; 00:44:37.591 COM7: Tx: 01 03 00 21 00 01 D4 00
;; 00:44:37.691 COM7: Rx: 01 03 02 00 06 38 46
;; 00:44:37.698 COM7: Tx: 01 03 00 23 00 01 75 C0
;; 00:44:37.797 COM7: Rx: 01 03 02 00 1D 78 4D
;; 00:44:37.803 COM7: Tx: 01 03 00 26 00 02 25 C0
;; 00:44:37.899 COM7: Rx: 01 03 04 00 00 00 62 7B DA
;; 00:44:37.911 COM7: Tx: 01 03 00 28 00 02 44 03
;; 00:44:38.002 COM7: Rx: 01 03 04 00 00 01 26 7A 79
;; 00:44:38.016 RD6006: Rx <3.3000000000000003 0.5 3.3000000000000003 0.328 1.08 0.06 29 0.098 0.294>
;; 00:44:38.023 RD6006: Rx as numbers <3.3000000000000003 0.5 3.3000000000000003 0.328 1.08 0.06 29.0 0.098 0.294>
;; 00:44:38.141 RD6006: Tx <values?>
;; 00:44:38.142 RD6006: Tx <holding? 0x08 /100;holding? 0x09 /1000;holding? 0x0A /100;holding? 0x0B /1000;holding? 0x0D /100;holding? 0x21 /100;holding? 0x23;holdingl? 0x26 /1000;holdingl? 0x28 /1000>
;; 00:44:38.144 COM7: Tx: 01 03 00 08 00 01 05 C8
;; 00:44:38.219 COM7: Rx: 01 03 02 01 4A 38 23
;; 00:44:38.219 COM7: Tx: 01 03 00 09 00 01 54 08
;; 00:44:38.320 COM7: Rx: 01 03 02 01 F4 B8 53
;; 00:44:38.329 COM7: Tx: 01 03 00 0A 00 01 A4 08
;; 00:44:38.429 COM7: Rx: 01 03 02 01 4A 38 23
;; 00:44:38.429 COM7: Tx: 01 03 00 0B 00 01 F5 C8
;; 00:44:38.540 COM7: Rx: 01 03 02 01 48 B9 E2
;; 00:44:38.540 COM7: Tx: 01 03 00 0D 00 01 15 C9
;; 00:44:38.640 COM7: Rx: 01 03 02 00 6C B8 69
;; 00:44:38.654 COM7: Tx: 01 03 00 21 00 01 D4 00
;; 00:44:38.752 COM7: Rx: 01 03 02 00 07 F9 86
;; 00:44:38.759 COM7: Tx: 01 03 00 23 00 01 75 C0
;; 00:44:38.857 COM7: Rx: 01 03 02 00 1D 78 4D
;; 00:44:38.865 COM7: Tx: 01 03 00 26 00 02 25 C0
;; 00:44:38.965 COM7: Rx: 01 03 04 00 00 00 62 7B DA
;; 00:44:38.971 COM7: Tx: 01 03 00 28 00 02 44 03
;; 00:44:39.069 COM7: Rx: 01 03 04 00 00 01 27 BB B9
;; 00:44:39.078 RD6006: Rx <3.3000000000000003 0.5 3.3000000000000003 0.328 1.08 0.07 29 0.098 0.295>
;; 00:44:39.085 RD6006: Rx as numbers <3.3000000000000003 0.5 3.3000000000000003 0.328 1.08 0.07 29.0 0.098 0.295>
;; 00:44:39.162 RD6006: Tx <values?>
;; 00:44:39.162 RD6006: Tx <holding? 0x08 /100;holding? 0x09 /1000;holding? 0x0A /100;holding? 0x0B /1000;holding? 0x0D /100;holding? 0x21 /100;holding? 0x23;holdingl? 0x26 /1000;holdingl? 0x28 /1000>
;; 00:44:39.162 COM7: Tx: 01 03 00 08 00 01 05 C8
;; 00:44:39.178 COM7: Rx: 01 03 02 01 4A 38 23
;; 00:44:39.178 COM7: Tx: 01 03 00 09 00 01 54 08
;; 00:44:39.283 COM7: Rx: 01 03 02 01 F4 B8 53
;; 00:44:39.283 COM7: Tx: 01 03 00 0A 00 01 A4 08
;; 00:44:39.388 COM7: Rx: 01 03 02 01 4A 38 23
;; 00:44:39.388 COM7: Tx: 01 03 00 0B 00 01 F5 C8
;; 00:44:39.496 COM7: Rx: 01 03 02 01 48 B9 E2
;; 00:44:39.497 COM7: Tx: 01 03 00 0D 00 01 15 C9
;; 00:44:39.600 COM7: Rx: 01 03 02 00 6C B8 69
;; 00:44:39.609 COM7: Tx: 01 03 00 21 00 01 D4 00
;; 00:44:39.701 COM7: Rx: 01 03 02 00 07 F9 86
;; 00:44:39.716 COM7: Tx: 01 03 00 23 00 01 75 C0
;; 00:44:39.811 COM7: Rx: 01 03 02 00 1E 38 4C
;; 00:44:39.823 COM7: Tx: 01 03 00 26 00 02 25 C0
;; 00:44:39.922 COM7: Rx: 01 03 04 00 00 00 62 7B DA
;; 00:44:39.927 COM7: Tx: 01 03 00 28 00 02 44 03
;; 00:44:40.021 COM7: Rx: 01 03 04 00 00 01 27 BB B9
;; 00:44:40.035 RD6006: Rx <3.3000000000000003 0.5 3.3000000000000003 0.328 1.08 0.07 30 0.098 0.295>
;; 00:44:40.042 RD6006: Rx as numbers <3.3000000000000003 0.5 3.3000000000000003 0.328 1.08 0.07 30.0 0.098 0.295>
Please upload a section where everything runs smooth and with any #cmdDelayTime or #answerTimeout, I would like to see the time stamps for that.
Good morning, thanks for looking into this. Below is 3 executions of values? #cmdDelayTime and #answerTimeout are not being used. It is almost 1:00 am here in the US, after this post I am gong to get some sleep.
;; 08:43:38.141 RD6006: Tx <values?>
;; 08:43:38.148 RD6006: Tx <holding? 0x0A /100;holding? 0x0B /1000;holding? 0x0D /100;holding? 0x21 /100;holding? 0x23>
;; 08:43:38.179 COM7: Tx: 01 03 00 0A 00 01 A4 08
;; 08:43:38.333 COM7: Tx: 01 03 00 0A 00 01 A4 08
;; 08:43:38.487 COM7: Tx: 01 03 00 0A 00 01 A4 08
;; 08:43:38.640 COM7: Tx: 01 03 00 0A 00 01 A4 08
;; 08:43:38.795 COM7: *** Timeout ***
;; 08:43:38.795 COM7: Rx: 01 03 02 01 4A 38 23
;; 08:43:38.845 COM7: Tx: 01 03 00 0B 00 01 F5 C8
;; 08:43:38.998 COM7: Tx: 01 03 00 0B 00 01 F5 C8
;; 08:43:39.150 COM7: Tx: 01 03 00 0B 00 01 F5 C8
;; 08:43:39.303 COM7: Tx: 01 03 00 0B 00 01 F5 C8
;; 08:43:39.457 COM7: *** Timeout ***
;; 08:43:39.464 COM7: Rx: 01 03 02 01 48 B9 E2
;; 08:43:39.522 COM7: Tx: 01 03 00 0D 00 01 15 C9
;; 08:43:39.682 COM7: Tx: 01 03 00 0D 00 01 15 C9
;; 08:43:39.842 COM7: Tx: 01 03 00 0D 00 01 15 C9
;; 08:43:40.001 COM7: Tx: 01 03 00 0D 00 01 15 C9
;; 08:43:40.160 COM7: *** Timeout ***
;; 08:43:40.167 COM7: Rx: 01 03 02 00 6C B8 69
;; 08:43:40.225 COM7: Tx: 01 03 00 21 00 01 D4 00
;; 08:43:40.384 COM7: Tx: 01 03 00 21 00 01 D4 00
;; 08:43:40.542 COM7: Tx: 01 03 00 21 00 01 D4 00
;; 08:43:40.703 COM7: Tx: 01 03 00 21 00 01 D4 00
;; 08:43:40.862 COM7: *** Timeout ***
;; 08:43:40.869 COM7: Rx: 01 03 02 00 07 F9 86
;; 08:43:40.926 COM7: Tx: 01 03 00 23 00 01 75 C0
;; 08:43:41.085 COM7: Tx: 01 03 00 23 00 01 75 C0
;; 08:43:41.243 COM7: Tx: 01 03 00 23 00 01 75 C0
;; 08:43:41.402 COM7: Tx: 01 03 00 23 00 01 75 C0
;; 08:43:41.561 COM7: *** Timeout ***
;; 08:43:41.568 COM7: Rx: 01 03 02 00 1B F8 4F
;; 08:43:41.575 RD6006: Rx <3.3000000000000003 0.328 1.08 0.07 27>
;; 08:43:41.582 RD6006: Rx as numbers <3.3000000000000003 0.328 1.08 0.07 27.0>
;; 08:43:41.588 RD6006: Tx <values?>
;; 08:43:41.594 RD6006: Tx <holding? 0x0A /100;holding? 0x0B /1000;holding? 0x0D /100;holding? 0x21 /100;holding? 0x23>
;; 08:43:41.625 COM7: Tx: 01 03 00 0A 00 01 A4 08
;; 08:43:41.778 COM7: Tx: 01 03 00 0A 00 01 A4 08
;; 08:43:41.932 COM7: Tx: 01 03 00 0A 00 01 A4 08
;; 08:43:42.086 COM7: Tx: 01 03 00 0A 00 01 A4 08
;; 08:43:42.241 COM7: *** Timeout ***
;; 08:43:42.241 COM7: Rx: 01 03 02 01 4A 38 23
;; 08:43:42.291 COM7: Tx: 01 03 00 0B 00 01 F5 C8
;; 08:43:42.446 COM7: Tx: 01 03 00 0B 00 01 F5 C8
;; 08:43:42.601 COM7: Tx: 01 03 00 0B 00 01 F5 C8
;; 08:43:42.650 COM7: Rx: 01 03 02 01 48 B9 E2
;; 08:43:42.700 COM7: Tx: 01 03 00 0D 00 01 15 C9
;; 08:43:42.857 COM7: Tx: 01 03 00 0D 00 01 15 C9
;; 08:43:43.015 COM7: Tx: 01 03 00 0D 00 01 15 C9
;; 08:43:43.175 COM7: Tx: 01 03 00 0D 00 01 15 C9
;; 08:43:43.333 COM7: *** Timeout ***
;; 08:43:43.339 COM7: Rx: 01 03 02 00 6C B8 69
;; 08:43:43.396 COM7: Tx: 01 03 00 21 00 01 D4 00
;; 08:43:43.556 COM7: Tx: 01 03 00 21 00 01 D4 00
;; 08:43:43.715 COM7: Tx: 01 03 00 21 00 01 D4 00
;; 08:43:43.873 COM7: Tx: 01 03 00 21 00 01 D4 00
;; 08:43:44.033 COM7: *** Timeout ***
;; 08:43:44.040 COM7: Rx: 01 03 02 00 06 38 46
;; 08:43:44.096 COM7: Tx: 01 03 00 23 00 01 75 C0
;; 08:43:44.255 COM7: Tx: 01 03 00 23 00 01 75 C0
;; 08:43:44.414 COM7: Tx: 01 03 00 23 00 01 75 C0
;; 08:43:44.571 COM7: Tx: 01 03 00 23 00 01 75 C0
;; 08:43:44.730 COM7: *** Timeout ***
;; 08:43:44.737 COM7: Rx: 01 03 02 00 1B F8 4F
;; 08:43:44.743 RD6006: Rx <3.3000000000000003 0.328 1.08 0.06 27>
;; 08:43:44.750 RD6006: Rx as numbers <3.3000000000000003 0.328 1.08 0.06 27.0>
Good morning, thanks for looking into this. Below is 3 executions of values? #cmdDelayTime and #answerTimeout are not being used. It is almost 1:00 am here in the US, after this post I am gong to get some sleep.
What I can see from this is that each transaction takes slightly above 100ms and assuming that you use 115200 baud this means #answerTimeout must be at least 100 to work, maybe 120 to 150 is better.
But is also means you have to either increase #readingDelay or to collect fewer data. The total data collection is is nearly a second. For reliable 1 second logging I would prefer it below 700ms (0.7second). It may still be necessary to increase #readingDelay at that level if the power supply sometimes is slow to answer or a retransmission is needed, but a single slow collection once in a while will not affect logging.
I reduced the number of data points being collected and are used the below setting. No matter what #answerTimeout setting used every holding command has 4 Tx's before receiving a response.
And also many thanks to MikeLud.
And also many thanks to MikeLud.
He have done a fine job with the Siglent, but I have only included the 3065x with the full setup. I hope he will say ok for the 3055 soon.
And I wonder if it is possible to duplicate to support modes both with and without x (It only needs are few lines at the top of the file to enable both versions).
You can use the attached as the final version for the Siglent SDM3055, When I work on updating the SDM3045X file I will look at combining all of the Siglent SDM's into one file. Also I notice that in your download you have two files for the SDM3065X one ending with -4.
some time ago I asked you for an additional / cloned log button on the chart page...
You gave me the hint with the shortcuts. Unfortunately, this is not that effective as I have to press more buttons, instead of just using the mouse.
In order to encourage you to do so, I tried to implement my wish in a picture, as it is probably easier to get the idea behind it, when being able to see the result? ;)
In addition to this, I asked for a custom png format, which can be saved, in order to keep the resolution your pc requires, because it is much easier to handle and shorten periodic steps, to concentrate on the work itself.
I reduced the number of data points being collected and are used the below setting. No matter what #answerTimeout setting used every holding command has 4 Tx's before receiving a response.
It is very strange, with the M9712C I am testing with I can set the #answerTimeout to 13 and I will get occasionally retransmits with a higher value there is no retransmits.
I have uploaded a new jar file (V0.51) where I have switched to another time in java (From currentTimeMillis() to nanoTime()), all settings and other code is exactly the same. I wonder if this will change anything.
Technically there is no guarantee that millis will increase every millisecond, but it is a long time since I have seen it being really slow (Originally it was something like a increased by 55 every 55 millisecond on Windows)
The only problem I see with the M9712C is that I have to unplug/replug the USB interface if I power of the load or I get 100% timeout.
One question, did you try changing the baud rate on your M9712C to 115200 to see if you have the same issues I am having at this speed.
V0.52 is up
It fixes the baudrate problem and add a configuration for image sizes, now everybody can get there favorite sizes, not only me ;)
I just tried V0.52 and there is no change I still am getting timeouts at 115200 |O. I ran a test overnight at 9600 and had no timeouts
I just tried V0.52 and there is no change I still am getting timeouts at 115200 |O. I ran a test overnight at 9600 and had no timeouts
I am out of ideas for now. I have tried other baudrates?
The only issue with this is when the timeout happens it records all the data for that time as zero. Maybe a workaround can be to ignore the data if a timeout happens and use ether the previous data or the next valid data without a timeout
Have you checked the #answerTimeout setting with the new version?
Yes, I tried 150 and 200.
Another thought I have is on the Load Devices tab on each line have a read me button that will open up a popup. In the popup for this device I can have "For this device to work you must go to the setup menu on the RD6006 and change the baudrate from 115200 to 9600. Consult User Manual for directions." With this I will set the buadrate at 9600.
Let me get this right: At 115200 it mostly works, but once in a while there is a timeout. If you use the #answerTimeout it will not work at all, all calls timeout.
At the risk of asking an obtuse question, can this application also read from devices over GPIB?
Only if it is presented as a serial port or a network socket.I just checked and it seems to be just presented as a GPIB Interface. I guess I'll have to look into obtaining a handful of RS232 to USB converters. This application looks too good to pass up on.
I had the same question, I have an Agilent GPIB to network bridge and wondered what it would take to make the GPIB devices appear as serial ports.
The latest is wrong from me.
V intermediate values are nevertheless carried out.
However, it is not displayed in the mode window (the value is displayed there, e.g. when 2.5V input is reset to 0)
He have done a fine job with the Siglent, but I have only included the 3065x with the full setup. I hope he will say ok for the 3055 soon.
And I wonder if it is possible to duplicate to support modes both with and without x (It only needs are few lines at the top of the file to enable both versions).
...The only model tested is the SDM3065X so if anyone has the SDM3045X or SDM3055 please test and let me know the issues you are having so I can correct them...
V0.53 got a extra update with a fixed SDG2122X
So fast?
For the SDG1000X, only the frequency limits actually have to be changed ?!? (at least that's how I had done it successfully with the old version).
Attached is a device file for the Riden RD6006.
If, as far as the operation of the SDG in the program is concerned, only the limits of the frequencies are left
(I have not yet been able to discover any other differences when setting the values in the mode window)
you should actually have the definitions for e.g. SDG1032X and 1062X derived from 2122 already make finished ?
For the SDG1000X, only the frequency limits actually have to be changed ?!? (at least that's how I had done it successfully with the old version).
Please post the changed definition or email it to me.
MikeLud, haven't tested the new SDM3000 definition, just read it.
Could it be that in #metadef the range boundaries (up to 6 boundaries and up to 2 boundaries) were confused between the three SDMs ?
As far as I know, the ranges up to 6 were on the 3045X
(The 3055 definitely has the ... 2 as the range limits).
One thing you are missing for the modbus protocal is to have a #SlaveAddress tag
...How the #metadef for each SDM works it removes the item (range) from the setup tab
Got SDG1062X and 1032X ready.
Also adjusted period for these two.
Should now be error free.
Attached is a device file that supports Siglent SDM3000 series DMM in one file. The only model tested is the SDM3065X so if anyone has the SDM3045X or SDM3055 please test and let me know the issues you are having so I can correct them. One setting item I am not sure about is the Speed setting for the AC Current and AC Voltage on the SDM3045X , this was not fully documented. For each mode there is a corresponding setup tab giving you remote control of the soft buttons on the bottom of the screen.
So far 2 out of the 3 SDM's have been tested and are working. Do you still have the SDM3045X so you can test the last device. One setting item I am not sure about is the Speed setting for the AC Current and AC Voltage on the SDM3045X , this was not fully documented.
A purely theoretical question (since the workload would certainly be too great ...)Maybe the Equation Editor in EasyWaveX can do what you want ?
Would it be possible to operate an SDG remotely like on the control panel ?
Similar to what Siglent did with its control panel in EasyDmm for the SDMs ?
There must be no feedback to display the states, which, like EasyDMM, is the same as the device display,
a display of the states in rows, columns, radio buttons would be enough.
Why this had siglent done for the SDM but never for the SDG is a mystery to me.
Is it just me, or did the page about scripting a SCSI DMM recently lose much of its content?
I need the syntax for the ":readmath:" functions, but they seem to have vanished. :(
A purely theoretical question (since the workload would certainly be too great ...)
Would it be possible to operate an SDG remotely like on the control panel ?
So far 2 out of the 3 SDM's have been tested and are working. Do you still have the SDM3045X so you can test the last device. One setting item I am not sure about is the Speed setting for the AC Current and AC Voltage on the SDM3045X , this was not fully documented.
...but mine do not have PT1000 (I do not know if it is a old sw version or if unsupported on 3045).
The speed setting works fine on 3045, but mine do not have PT1000 (I do not know if it is a old sw version or if unsupported on 3045).
I just checked the SDM3045X Firmware History and it does not show add PT1000 support. You can try updating the firmware to see if was just undocumented. If you fine that the current firmware still does not support PT1000 I will update the device file.
I just checked the SDM3045X Firmware History and it does not show add PT1000 support. You can try updating the firmware to see if was just undocumented. If you fine that the current firmware still does not support PT1000 I will update the device file.
I am running that firmware version.
File updated
Managed to do rms (dB), frequency and phase* with my HMO 1022 scope 8)
However, there seems to be a division-by-zero error when the phase goes to/through Zero. This error does not come from the scope as it displays small phase angles correctly when queried.
Managed to do rms (dB), frequency and phase* with my HMO 1022 scope 8)
However, there seems to be a division-by-zero error when the phase goes to/through Zero. This error does not come from the scope as it displays small phase angles correctly when queried.
Can you save a CSV file with the problematic data and send to me, then I will look at it.
The values may be correct, I will see that in the CSV file, but there are definitely way to many zeros, it has to switch number format.
;; RD6006: Tx <values?>
;; RD6006: Tx <holding? 0x08 /100;holding? 0x09 /1000;holding? 0x0A /100;holding? 0x0B /1000;holding? 0x0D /100;holding? 0x21 /100;holding? 0x23;holdingl? 0x26 /1000;holding? 0x28 /1000>
;; COM3: Tx: 01 03 00 08 00 01 05 C8
;; COM3: Rx: 01 03 02 01 4A 38 23
;; COM3: Tx: 01 03 00 09 00 01 54 08
;; COM3: Rx: 01 03 02 01 F4 B8 53
;; COM3: Tx: 01 03 00 0A 00 01 A4 08
;; COM3: Rx: 01 03 02 01 4A 38 23
;; COM3: Tx: 01 03 00 0B 00 01 F5 C8
;; COM3: Rx: 01 03 02 01 47 F9 E6
;; COM3: Tx: 01 03 00 0D 00 01 15 C9
;; COM3: Rx: 01 03 02 00 6B F9 AB
;; COM3: Tx: 01 03 00 21 00 01 D4 00
;; COM3: Rx: 01 03 02 00 07 F9 86
;; COM3: Tx: 01 03 00 23 00 01 75 C0
;; COM3: Rx: 01 03 02 00 1C B9 8D
;; COM3: Tx: 01 03 00 26 00 02 25 C0
;; COM3: Rx: 01 03 04 00 00 00 93 BA 5E
;; COM3: Tx: 01 03 00 28 00 01 04 02
;; COM3: Rx: 01 03 02 00 00 B8 44
;; RD6006: Rx <3.3000000000000003 0.5 3.3000000000000003 0.327 1.07 0.07 28 0.147 0.0>
;; RD6006: Rx as numbers <3.3000000000000003 0.5 3.3000000000000003 0.327 1.07 0.07 28.0 0.147 0.0>
I see something similar when using the /factor 330 /100 should equal 3.3 not 3.3000000000000003. The data is saved correctly in the csv file. Also in the csv file when using Excel to convert the dateTime column to a true date format it cannot.
Please find enclosed a .csv file (rename .txt. to .csv) where at first I am logging along nicely followed by switching the signal source off and then on again. See corresponding Screenshots 1 and 2.
Here is an updated file for the SDG 1062X waveform generator. This adds the functions mentioned in my earlier post, plus a new one -- the ability to specify the expected load impedance.
Managed to do rms (dB), frequency and phase* with my HMO 1022 scope 8)
dB calculation is relative to 0,775 mV = 0 dBu using the math of Test Controller. :-+
like such: log((HMO1022.RMS/0.775)*(HMO1022.RMS/0.775))*10
Low dB values (below 0.0775 mV) bottom out at -20 dB. This is due to the scope.
How difficult is it to include V rms there ?
To specify the output level in RMS Volts rather than peak-to-peak volts would require math operations that depend on the waveshape.
Correct and they are build into the generator for some waveforms,
And the CSV file is mostly useless because I did not save the very high values correctly (A Java issue). I have worked a bit on it in a update, you can try this jar file: http://lygte-info.dk/pic/Projects/TestController/TestController.jar (http://httpp://lygte-info.dk/pic/Projects/TestController/TestController.jar)
Also cleaned up my quick-and-dirty dBu (i.e. dB unloaded) calculation:
It now runs: log(sqr(HMO1022.RMS/0.775))*10
Have you found out how to control the sequence of the scales?Yep. Nice and easy. :-+ 8)
The first one checked goes to the left, next one is first to the right, then second to the right. I.e. remove all checkmarks, then check them in the sequence you want the scales.
V0.55 is up
The updated Siglent SDG is included, I added 1000X, 2000X & 6000X series. I change the impedance setting to a combobox, because I want a possibility to return to HiZ (This is not the ideal solution).
I have added help to the Math page. There is now a list of support functions and description of Math types. I anybody has ideas to useful function or types, please post.
Large values is handle better now. It will switch to scientific notation when value is too high for the format. Very close to zero values will be shown as 0.
You added SiglentSDM30xxx.txt to V0.55 but did not remove the old device files. Thanks again for all the great work you have done.
...I change the impedance setting to a combobox, because I want a possibility to return to HiZ...
With the other version, I had asked myself whether the maximum possible 100k there would correspond
to the actual HiZ from the point of view of the SDG and its calculated voltage ?
(If certainly not far off).
It's good to be able to return to HiZ. The values from the list will suffice in practice.
Maybe after the free entry of the digits (version of Hexley) the return to HiZ could only have been put on an extra button ?
So yes, there is some error introduced by using 100k rather than HZ when the load is >100K, but as a practical matter it may be acceptable.
#cmdSetup indicatornum Status Main
:read: Mode?
CV 0 blue
CC 1 red
#cmdSetup indicatornum Status Main
:read: ERROR?
OK 0 blue
OVP 1 red
OCP 2 red
#cmdSetup indicatornum Status Main
:read: BattM?
Batt_Mode_Off 0 blue
Batt_Mode_On 1 red
#cmdSetup Updater update
:update: Status
1
Maybe there is a solution for both ?
Do not know if this works... if e.g. the second lowest position of the now existing values in the drop down list,
(after 100k and before the point HiZ) an entry field for numerical entry possible ?
I can not get the Updater control to work, am I using correctly? I want to update the 3 Status every 1 second.
...
2) Use a empty text field as a special value .
...
Should mean;
another extra entry field in the window for free entry ?
and still your dropdown list remains with your given values and you can still return to HiZ in the list ?
If so, I would agree :)
Just passing this along as food for thought in case it simplifies at least the transmit side of things.
...I like the combobox box because it is easy to use...
In the chart window i find it a bit annoying never to know how the first sample and the last sample relate to a specific point of time.
Would it not be better to rename "First sample to display" to something like "Display time range start" and "Display time range end" ?
Also: Sill have been caught out several times :palm: by "X" shutting down immediately without further warning thus loosing data when not setting Direct to disk.
Also: For very long term logging (incubator over 21 days or so or weather data over a month) it is not necessary to log every 3 seconds thus creating huge files. In this case logging every minute or every 10 minutes is absolutely sufficient.
Also: Does logging resume after a PC shutdown? Might be important for long term logging. Might not be so important, as for long term logging I use a laptop anyway.
Probably time to start thinking about writing a
complete user manual in which everything is described
A new jar file with the "Updater" issue fixed.
Hello HKJ,
I am new poster here on EEVblog, so I am not familiar with all the formalities here, so excuse me if I don't have a grasp of all the proper posting procedures.
I find your TestController program very interesting and am trying it out. It recognizes and works with my Brymen BM869S meter, but it won't work with my Fluke 189.
When I click on 'Commands' in the 'Type' column it says: "Serial Fixed Baudrate",
whereas with the Brymen iit says: "USBHID", also the address column is shaded in pink.
What am I doing wrong? Thank you for your time.
Thank you very much HKJ. Too late today, but I will do as you say tomorrow afternoon.
One more thing though; I know you have made many revisions, and the amount of work you and others have done is very much appreciated, but is the download version at your site the latest
edition, (0.52?)?
V0.57 is up
Bug from MikeLud is fixed.
Thank you very much HKJ. Too late today, but I will do as you say tomorrow afternoon.
One more thing though; I know you have made many revisions, and the amount of work you and others have done is very much appreciated, but is the download version at your site the latest
edition, (0.52?)?
Thanks HKJ, I did what you said and I got my Fluke 189 connected on com 3. Now the only problem is to get the program tp open reliably; I often have to make several attempts at opening/running 'Windows Batch File' before it will open. Many times it tries to open, but just flashes on the screen momentarily.
I will put your program in my tool kit and will try it from time to time to see what improvements you have made. Again, thank you and the others here that have worked to get this program to where it is. I am sure others, as well as myself, appreciate it. CIAO! :-+
Now the only problem is to get the program tp open reliably; I often have to make several attempts at opening/running 'Windows Batch File' before it will open. Many times it tries to open, but just flashes on the screen momentarily.
#scpiCmd MN? holding? 0x80
:setvar: MNS=value
#scpiCmd MN holding 0x80 (value)
#scpiCmd MV? holding? (MNS) /100
#scpiCmd MV holding (MNS) (value) *100
#scpiCmd MI? holding? (MNS+1) /1000
#scpiCmd MI holding (MNS+1) (value) *1000
#scpiCmd OVP? holding? (MNS+2) /100
#scpiCmd OVP holding (MNS+2) (value) *100
#scpiCmd OCP? holding? (MNS+3) /1000
#scpiCmd OCP holding (MNS+3) (value) *1000
#cmdSetup comboboxhot Memory Memory
:read: MN?
:write: MN
:update: V-Set I-Set OVP OCP
:updatedelayed: 0.3
M0 80
M1 84
M2 88
M3 92
M4 96
M5 100
M6 104
M7 108
M8 112
M9 116
#cmdSetup number V-Set Memory
:read: MV?
:write: MV
V 0 60
#cmdSetup number I-Set Memory
:read: MI?
:write: MI
V 0 6
#cmdSetup number OVP Memory
:read: OVP?
:write: OVP
V 0 62
#cmdSetup number OCP Memory
:read: OCP?
:write: OCP
V 0 6.2
Is there a way to set a variable and have a control make changes to that variable. I was able to get it to work by wiring to a free modbus address and reading back to set the variable see code below. I rather not do this, if there is another way please let me know.
Does anyone know if this SW can support HP3478A, E1410A, OR E1412A? Search on 3478A finds similar query post 272. Maybe it is close enough to an existing definition for an edit (which I will do, test, upload)? Read whole thread,very impressive work. Was planning on buying usb/gpib adapter using prologix commands until i found this.
Thanks, HKJ, I somehow missed SCPI requirement while also reading other threads where SCPI commands used to control GPIB bus into 3478. So maybe using HW from those threads and your SW would be MMIH (don't you just hate when someone pops in something like this w/o defining it)? MMIH=match made in heaven.
And here we go again :palm:
Since I have a few two-wire Pt 1000 temperature sensors, I would like to include this type in the popup menu for the 34465A.
There is the SCPI command RTD for this type of sensor which works and the button is there :-+.
But in the manual I cannot find a SCPI command to specify R0 (1000 Ohm in my case, 100 being the default) nor is there an SCPI command for Low Power. Have these commands been forgotten perhaps, or have they simply not been included in the manual?
However, I've just received a Brymen 869s with the USB interface, and the program now crashes as soon as I add the Brymen and try to connect. I then have to edit the settingsLoad.txt file and disable the Brymen before I can get the program to run without crashing.
Since the Keysight 344xxA meters are close to the Siglent meters and have similar SCPI commands I converted the advanced Siglent device file to a device file that supports Keysight 34461A, 34465A, and 34470A. I do not have any of the Keysight meters so I could not test if it works. I still need to complete the setup for the temperature. For now if anyone has one of the Keysight's meters please test the file and let me know if you find any issue and I will correct them in the next couple of days
Since the Keysight 344xxA meters are close to the Siglent meters and have similar SCPI commands I converted the advanced Siglent device file to a device file that supports Keysight 34461A, 34465A, and 34470A. I do not have any of the Keysight meters so I could not test if it works. I still need to complete the setup for the temperature. For now if anyone has one of the Keysight's meters please test the file and let me know if you find any issue and I will correct them in the next couple of days
The setup menus looks nice, but nothing works. The problem probably is that the meter will not accept much while running in a trigger mode.
Try this, I adjusted the #askValues and #prepareSample to match what the Siglent has.
It did not fix it, I press the setup button just after starting TestController, i.e. before look at Current values or logging. The Setup menu do not open, but the meter beeps and shows a couple of errors (The menu will open after many timeouts).
The mode you uses do not look good on the meter, each time you start the trigger it replaces all digits with dots, until it has a value. I.e. the display is flashing all the time.
This time I did what I should have done the first time around: Made a logfile.
I did one for each of you two configurations
This should fix all of the timeouts, I will look into the trigger issue later today, I have to start my normal job.
It works now, except for the trigger issue. The display flicker on the meter and logging is slow, my old definition can basically sample at 0.01s intervals, yours a 0.5s intervals.
I have not tested everything, just tried a bit in some of the modes.
The attached might fix the trigger issue.
No, the DMM do not know the *trg command.
The best is to have a continuous trigger running on the meter, then the display on the meter will show a value and data:last? will return immediately with the last converted value.
I adjusted the #askValues and #prepareSample back to the original settings you had in the single device file. I am not sure the first file that did not work was because of all the timeouts so now I have time out fixed maybe this file will work
No timeouts, but the DMM beeps and refuses the command from the setup popup.
Mt guess is that you need to start each setting with "abort" and finish with a reinitialization of triggering.
I could add a SCPI command/tag like [prepareSample] to redo the #prepareSample sequence. I believe that is a nicer way to do it, compared to add the full sequence to each setting write.
How does the #cmdMode handle reinitialization the triggering? You only have abort & *cls before the SCPI commands
Attached is a device file for Owon ODP6033 or ODP3033 or ODP3063 power supplies. All in one family and all triple supplies with various combinations of voltages and currents. I wrote the device file for all three but I only have the ODP6033 to test with. The hardest part was that the English language SCPI documentation on Owon's web site seems to be completely wrong. Fortunately the Chinese one is correct but not knowing Chinese and using Google translate is a challenge.
I have a Keithley model 2100 6.5 digit meter. It is rebranded by Keithley from Array which sells this device under their own name as an M3500a. It supports VISA SCPI but the only interface is USB TMC. From what I can see this program has limited support for USB connections that are not set up as COM ports. Is there a way to make a device file and talk to this device?
I think I fixed the trigger issue, please try the attached.
Mostly fixed. It works, but sometimes the trigger fails to initializes. Changing mode and back will fix it.
Small correction for Keysight344xxA.txt
relating to 2 wire resistance low power:
For this to work the corresponding entry should read:
:write: abort;*cls;RES:POW:LIM
Made some adjustments, increased the the delay before initializes the trigger and fixed the 2 wire resistance low power. Please test and let me know the outcome.
The above also means I could add a preview of the popups, it is found by right clicking the master device selection combobox.
(http://lygte-info.dk/pic/cpf5/PreviewMenu.png)
I have a device that communicates with Telnet on port 23 using just ASCII text. But, it is not SCPI compliant. For example using Putty to connect, typing *IDN? returns
Error: [0085] Command was not found.
I am trying to use the combobox and comboboxHot setup commands, the issue I am having is when it does a read and the value comes back in scientific notation it does not convert to a number like all of the other setup commands. Is it possible have this conversion.
The combobox control works with strings, i.e. it do not do any number conversion of the received value. A comboboxint may be useful, but for floating point I cannot see it as very useful.
How I am trying to use it is to cleanup the setup tabs (make it less busy) by changing some of the radio types to a combobox so you do not have a mile long radio control.
Quick question. How do you set the baud rate from 9600 to 19200? I tried to change the config file but it always tries 9600 baud. Also, the only option for measurement is DC Voltage. How do you pick other measurements?
I am working on a device file for Sorenson/Ametek XG series power supply and have run into an issue. On a device popup I am trying to have on/off button with "indicator light". Unfortunately the power supply SCPI code for turning output on/off and for reading the state of the output is not symmetric. Setting the state you must use "on" or "off" as the value sent. The same command as a query returns "0" or "1". If you send "0" or "1" as the value the supply ignores the command/does nothing. The code I am using is:
I am working on finishing the Temperature setup. I am using the new new selector control, can you check if I am on the right track.
#cmdSetup buttonsOn Main_Output
:read: OUTP:POW:STAT?
:readmath: getElement("Off On",value);
:write: OUTP:POW:STAT
:color: (0,255,0)
:tip: Turn Main output on or off
:updatealloff:
Off Off
On On
Testing the above the indicator is always on. Using debug mode I see the readmath is clearly taking the returned 0 or 1 value and changing it to On or Off. See cut and paste from debug showing all the lines from when I turned the popup on until it populated/was done. At the end Rx is set to Off but the indicator stays on/lit. The last line says Rx NaN which is true, but does that indicate a problem? Suggestions to clean this up/make it work? In case it helps I have attached the full work in progress device file. I tested with Ver 0.64.;; A600V1_4A: Tx <SOUR:VOLT:LEV:IMM:AMPL?>
;; A600V1_4A: Rx <625.00000>
;; A600V1_4A: Rx as number <625.0>
;; A600V1_4A: Tx <SOUR:CURR:LEV:IMM:AMPL?>
;; A600V1_4A: Rx <1.46600>
;; A600V1_4A: Rx as number <1.466>
;; A600V1_4A: Tx <SOUR:VOLT:PROT?>
;; A600V1_4A: Rx <660.00000>
;; A600V1_4A: Rx as number <660.0>
;; A600V1_4A: Tx <SOUR:CURR:PROT?>
;; A600V1_4A: Rx <1.54000>
;; A600V1_4A: Rx as number <1.54>
;; A600V1_4A: Tx <OUTP:POW:STAT?>
;; A600V1_4A: Rx <0>
;; A600V1_4A: Rx after :readmath: getElement("Off On",value); <Off>
;; A600V1_4A: Rx as number <NaN>
Testing the above the indicator is always on. Using debug mode I see the readmath is clearly taking the returned 0 or 1 value and changing it to On or Off. See cut and paste from debug showing all the lines from when I turned the popup on until it populated/was done. At the end Rx is set to Off but the indicator stays on/lit. The last line says Rx NaN which is true, but does that indicate a problem? Suggestions to clean this up/make it work? In case it helps I have attached the full work in progress device file. I tested with Ver 0.64.
I also got a timeout:
;; 20:22:59.656 K34465: Rx as number <100.0>
;; 20:22:59.656 K34465: Tx <TEMP:TRANS:FRTD:OCOM?>
;; 20:23:09.657 K34465: Rx Timeout
;; 20:23:09.662 K34465: Rx as number <NaN>
The Keysight 344xx is updated, I fixed a few bugs with temperature, but not everything:
Do not work:
;; 08:40:18.852 K34465: Tx <abort>
;; 08:40:18.852 K34465: Tx <*cls>
;; 08:40:18.852 K34465: Tx <TEMP:TRANS:RTD:OCOM 1> <- Meter report error
;; 08:40:18.852 K34465: Tx <init>
;; 08:40:18.852 K34465: Tx <TEMP:TRAN:RTD:OCOM?>
;; 08:40:19.084 K34465: Rx <0> <- value is not changed
;; 08:40:19.084 K34465: Rx as number <0.0>
Meter has a Auto zero setting in 2W and Tcouple mode
Thermistor 2.25kohm do not work on 34465 (That is the one I am using for testing), the other two values works fine:
Looks like a missing :string: tag
I also get an error from the meter when enabling "Null" in RTD 2W, RTD 4W, thermis2W, but not in thermis4W & Tcouple. There are no errors when disabling it.
The low looks fine enough, here is one fro RTD 2W:
Attached is an updated device file. I am not sure why enabling "Null" in RTD 2W, RTD 4W, thermis2W does not work, do you have any ideas.
Fix 1: Thermistor 2.25kohm had wrong value +2500 changed to +2250
Fix 2: Added :string: tag to #cmdSetup radio Offset Temperature2
Attached is an updated device file. I am not sure why enabling "Null" in RTD 2W, RTD 4W, thermis2W does not work, do you have any ideas.
Fix 1: Thermistor 2.25kohm had wrong value +2500 changed to +2250
Fix 2: Added :string: tag to #cmdSetup radio Offset Temperature2
The string tag fixed that problem, the 2.25k thermistor do not work, do the meter even support it? Maybe I have an old software version?
The beep when enabling "null" is strange, because the command works, even when I get the error message on the meter.
2.25k thermistor was added in Firmware Revision 3.00 Enhancements and Fixes. The current firmware is Revision 3.02, link below. Maybe I need to add a #notes Requires Firmware Revision 3.00 or higher.
My 34465A has the option of a 2.252 kohm thermistor, not 2.25 kohm
Thanks for the massive amount of work you put into this. :-+
RTD 2W now works on my 34465A which is great news. 8)
But a small bug remains here:
RTD 2W LP does not work. LP is not displayed and the temperature value does not change slightly as it should.
My 34465A has the option of a 2.252 kohm thermistor, not 2.25 kohm
There is a typo in the settings, the correct is:
#cmdSetup radio RTD_2w_Low-Power Temperature2
:write: abort;*cls;TEMP:TRAN:RTD:POW:LIM:STAT #;init
:read: TEMP:TRAN:RTD:POW:LIM:STAT?
:update: Null_Value
I was thinking of changing all of the Mode conf: (resets all settings to default) commands to func (keeps last settings) and add on the top of each setup a reset to default button using the conf: command. What are your thoughts, good idea?
Fluke 289 vs. TestController:
Is it possible to log VAC in "Peak" mode, which allows measuring with 100 ms response time instead of the usual 1 sec. periode?
Starting
;; Start thread for: 192.168.1.162 - Kollmorgen AKD2G Servo
;; Found Kollmorgen AKD2G Servo on 192.168.1.162
axis1.vl.fb
;; AKD2G: Tx <axis1.vl.fb>
axis1.il.fb
;; AKD2G: Tx <axis1.il.fb>
Error: [0085] Command was not found.
-->axis1.vl.fb
59.372 [rpm]
-->axis1.il.fb
-0.002 [Arms]
-->
You can select any mode you wish on the meter.
It only logs the main value and there it will log everything the meter shows. You can use a fast sample rate if you wish.
I tried to measure/log the "Peak" with 100 ms response time from +332,7 VAC till -332,4 VAC as shown in the display, but only got the average in TestController... - what do I miss?
Suggestions for next steps to start getting replies/working communication?
V0.66 is up
This version includes a new driver called "ascii", it is very similar to the Modbus driver with command definition, but this time it is plain ascii commands that is defined. This will hopefully make it possible to connect to a lot of non-scpi equipment.
I am using the new ascii driver to create a device driver for FY6800 Signal Generator and are having issues sending integers greater then 999999 it converts it to scientific notation and the Signal Generator is expecting an integer.
I am using the new ascii driver to create a device driver for FY6800 Signal Generator and are having issues sending integers greater then 999999 it converts it to scientific notation and the Signal Generator is expecting an integer.
You are supposed to be able to do something like (int(value)), but the int function has a problem in the current version (It will be fixed in next version).
Another way is to use (formatDouble(value,1,20,0,0))
You are supposed to be able to do something like (int(value)), but the int function has a problem in the current version (It will be fixed in next version).
Another way is to use (formatDouble(value,1,20,0,0))
My mistake I should have said float, the value is 0.000001 to 60000000.000000 hz
The +/- peak is not the main meter reading, I only read the main value.
The specification for formatDouble is formatDouble(value,minIntegerDigits,maxIntegerDigits,minFractionalDigits,maxFractionalDigits), i.e. you can do: formatDouble(value,1,10,0,6)
You need the bracket around everything to active the parser.
#scpiCmd RMA? txrx? RMA /1000
#cmdSetup number P-P_Amplitude Output_1
:read: RMA?
:readmath: ((value)/10000)
Thanks for the above clarification, the next issue I am having is when trying to divide the returned value by 1000. It is not work the same as it did in the modbus driver
Never mind, I was able to figure it out using :readmath:
Exactly, I did not add shortcuts for multiplying or dividing in this driver. I assumed when using ascii most devices would return non-scaled values.
And just a note: You do not need brackets around (value), but it do not do any harm. I uses two strategies for handling the parameters for readmath:
Any (value) string it directly replaced with the received value. If there are a () pair left the parser/calculator will handle it with the received value set up as a variable called value.
; A list of possible column name with unit and formatter (SI, Time, Int, D0..D6)
#value Frequency1 Hz SI
#value Amplitude1 V SI
#value Offset1 V SI
#value DutyCycle1 % D1
#value Frequency2 Hz SI
#value Amplitude2 V SI
#value Offset2 V SI
#value DutyCycle2 % D1
; How to poll for data, this is used for table and #values?
; a #askMode, #cmdMode and #prepareSample is used before this is string is used.
; This is a single line command
#askValues RMF?;RMA?;RMO?;RMD?;RFF?;RFA?;RFO?;RFD?
#askValuesMathFormat
I was able to do all of the scaling needed in the #cmdSetup but now I can not figure out how the do it with #askValuesMathFormat. I am able to get it to work if only logging one value but if I do more then one I can not get it to work.
Why do you need a #askValuesMathFormat if you already have scaled the values correctly? mathFormat is not easy to use when you have many values, because you need to process everything in one expression.
If you need to get rid of units use #askValueReadFormat.
#scpiCmd RMA? txrx? RMA
:readmath: (value/10000)
;; 01:59:28.445 FY6800: Tx <RMF?>The readmath does not work correctly under #scpiCmd see below I get NaN
The readmath does not work correctly under #scpiCmd see below I get NaNI can see the problem, it was a typo in my code. You can get a new jar file from the usual link.
#scpiCmd RMA? txrx? RMA
:readmath: (formatDouble(value/10000,1,2,4,4))
;; 08:38:54.861 FY6800: Tx <RMA?>
;; 08:38:54.865 FY6800: Tx <txrx? RMA>
;; 08:38:54.869 COM5: Tx: <RMA.> 52 4D 41 0A
;; 08:38:54.869 COM5: Rx: <121234> 31 32 31 32 33 34
;; 08:38:54.871 FY6800: Rx <12.0000>
I hate to be a pain, but now the value is only be returned as whole number.Code: [Select]#scpiCmd RMA? txrx? RMA
:readmath: (formatDouble(value/10000,1,2,4,4))
I hate to be a pain, but now the value is only be returned as whole number.Code: [Select]#scpiCmd RMA? txrx? RMA
:readmath: (formatDouble(value/10000,1,2,4,4))
That is the correct result :)
It is because you are dividing a integer with a integer, then the result will be a integer. It is very easy to fix, instead of dividing by 10000 you divide by 10000.0
Tried but no luck. I even tried *0.0001
Tried but no luck. I even tried *0.0001
Ok, I found the problem. For now you can do:
double(value)/10000
Works like a charm, thanks.
Not sure if this a bug, or intentional?
Thanks.
That is a bug, it looks like I fill the combobox twice, without clearing it in between. It will not harm anything and it will be fixed in next release.
#scpiCmd C1:RDO? txrx? RMO
#if value>10000
:readmath: double(value-4294967296)/1000
#else
:readmath: double(value)/1000
How would I write the below readmath expression.Code: [Select]#scpiCmd C1:RDO? txrx? RMO
#if value>10000
:readmath: double(value-4294967296)/1000
#else
:readmath: double(value)/1000
HKJ,
Attached are updated device files. Also I am almost finished with a device that will support FeelElec FY6600-20M, FeelElec FY6600-30M, FeelElec FY6600-50M, FeelElec FY6600-60M, FeelElec FY6800-20M, FeelElec FY6800-30M, FeelElec FY6800-50M, FeelElec FY6800-60M, FeelElec FY6900-20M, FeelElec FY6900-30M, FeelElec FY6900-50M, and FeelElec FY6900-60M.
How would I write the below readmath expression.:readmath: value>10000?double(value-4294967296)/1000:double(value)/1000Code: [Select]#scpiCmd C1:RDO? txrx? RMO
#if value>10000
:readmath: double(value-4294967296)/1000
#else
:readmath: double(value)/1000
or
:readmath: double(value>10000?value-4294967296:value)/1000
:readmath: ((value>10000)?"double(value-4294967296)/1000":"double(value)/1000")
:readmath: double(value>10000?value-4294967296:value)/1000
Thanks, I also figured it out using the below code, i know it has unnecessary () but it workedCode: [Select]:readmath: ((value>10000)?"double(value-4294967296)/1000":"double(value)/1000")
Attached is a device file that supports FeelElec FY6600-20M, FeelElec FY6600-30M, FeelElec FY6600-50M, FeelElec FY6600-60M, FeelElec FY6800-20M, FeelElec FY6800-30M, FeelElec FY6800-50M, FeelElec FY6800-60M, FeelElec FY6900-20M, FeelElec FY6900-30M, FeelElec FY6900-50M, and FeelElec FY6900-60M. I tested only the FeelElec FY6800-60M but should work on all the other models.
Attached is a device file that supports FeelElec FY6600-20M, FeelElec FY6600-30M, FeelElec FY6600-50M, FeelElec FY6600-60M, FeelElec FY6800-20M, FeelElec FY6800-30M, FeelElec FY6800-50M, FeelElec FY6800-60M, FeelElec FY6900-20M, FeelElec FY6900-30M, FeelElec FY6900-50M, and FeelElec FY6900-60M. I tested only the FeelElec FY6800-60M but should work on all the other models.
A few comments:
Try to support the #verifyDevice command, it will prevent selecting the wrong device.
Handles are best without a - in the name, because they are used as variables names also. The easiest way is to drop the "-20M" etc. from the handle.
Changes maded, added #verifyDevice and removed -xx from handles.
Thanks, it will be included in the next update.
I look at bit on the datasheets for them and it looks like the 6900 series has slightly higher output voltage.
Adjusted Max Vpp also adjusted Min/Max Offset.
Device file for Sorenson/Ametek XG 850 family of 850 W power supplies. There is also the nearly identical XG 1500 series 1500 W supplies. Each of these series have 12 different Voltage, Amperage combinations. So, if the device file supported all 24 variations via #metadef it would add 24 entries to the selections drop down. 24 entries would just make that list a bunch longer and tedious to scroll through. So, I made a device file for the one version I have, included info in the file on the others, and via #metadef supported just one other so that another user would have an example to follow if they had one of the others in this series.
The Keysight 34465A is capable of measuring its internal temperature through
SYST:TEMP? which works nicely on the command line. Since Keysight344xxA.txt has become quite complex, I do not feel up to the task of modifying it without messing something else up. :scared:
Maybe you or someone else would like to include the internal temperature sensor some day.
Device file for Sorenson/Ametek XG 850 family of 850 W power supplies.
The Keysight 34465A is capable of measuring its internal temperature through
SYST:TEMP? which works nicely on the command line. Since Keysight344xxA.txt has become quite complex, I do not feel up to the task of modifying it without messing something else up. :scared:
Maybe you or someone else would like to include the internal temperature sensor some day.
Messtechniker
I added system temperature to the bottom of each setup page please test.
It works in a way, but adding this line will improve it significantly:
:readmath: formatDouble(value,1,3,1,1)
Without that it do do something like: 3.234E+1
I will include it.
Has anyone completed a config file for the Rigol DM3068 meter?
Just got this working and found something a bit peculiar. The region in the attached file marked with arrows is unstable ... seems to be twitching a little.
;; 13:36:42.551 BM869: Rx as numbers <-4.9999999999999996E-5>
;; 13:36:42.561 BM869: Tx <VALUE?>
;; 13:36:42.731 BM869: Rx <-50u>
;; 13:36:42.741 BM869: Rx as numbers <-4.9999999999999996E-5>
;; 13:36:42.771 BM869: Tx <VALUE?>
Thread for BM869Exception in thread "Thread-31"
;;-50u
java.lang.NullPointerException
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at dk.hkj.main.PaneCurrentValues.updateDirect(PaneCurrentValues.java:396) at java.util.ArrayList.rangeCheck(Unknown Source)
at dk.hkj.main.PaneCurrentValues.access$8(PaneCurrentValues.java:392) at java.util.ArrayList.remove(Unknown Source)
at dk.hkj.main.PaneCurrentValues$AsyncUpdate.run(PaneCurrentValues.java:361) at java.util.Collections$SynchronizedList.remove(Unknown Source)
at dk.hkj.devices.DeviceUsbHidDMM$TranslatingInterface.read(DeviceUsbHidDMM.java:132)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:103)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:150)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:187)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:229)
at dk.hkj.main.SCPICommand.readNumbers(SCPICommand.java:319)
at dk.hkj.main.DeviceInterface.getValuesFromDevices(DeviceInterface.java:327)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1007)
;; 13:36:42.981 BM869: Tx <VALUE?>
;; 13:36:43.131 BM869: Rx <-50u>
;; 13:36:43.131 BM869: Rx as numbers <-4.9999999999999996E-5>
;; 13:36:43.191 BM869: Tx <VALUE?>
;; 13:36:43.331 BM869: Rx <-50u>
;; 13:36:43.331 BM869: Rx as numbers <-4.9999999999999996E-5>
;; 13:36:43.401 BM869: Tx <VALUE?>
;; 13:36:43.531 BM869: Rx <-50u>
;; 13:36:43.541 BM869: Rx as numbers <-4.9999999999999996E-5>
;; 13:36:43.611 BM869: Tx <VALUE?>
;; 13:36:43.721 BM869: Rx <-50u>
;; 13:36:43.721 BM869: Rx as numbers <-4.9999999999999996E-5>
;; 13:36:43.821 BM869: Tx <VALUE?>
;; 13:36:43.921 BM869: Rx <-50u>
;; 13:36:43.921 BM869: Rx as numbers <-4.9999999999999996E-5>
;; 13:36:44.031 BM869: Tx <VALUE?>
;; 13:36:44.128 BM869: Rx <-50u>
;; 13:36:44.128 BM869: Rx as numbers <-4.9999999999999996E-5>
;; 13:36:44.237 BM869: Tx <VALUE?>
;; 13:36:44.316 BM869: Rx <-50u>
;; 13:36:44.316 BM869: Rx as numbers <-4.9999999999999996E-5>
;; 13:36:44.440 BM869: Tx <VALUE?>
;; 13:36:44.524 BM869: Rx <-50u>
;; 13:36:44.524 BM869: Rx as numbers <-4.9999999999999996E-5>
;; 13:36:44.643 BM869: Tx <VALUE?>
;; 13:36:44.704 BM869: Rx <-50u>
;; 13:36:44.704 BM869: Rx as numbers <-4.9999999999999996E-5>
;; 13:36:44.852 BM869: Tx <VALUE?>
;; 13:36:44.902 BM869: Rx <-50u>
;; 13:36:44.902 BM869: Rx as numbers <-4.9999999999999996E-5>
;; 13:36:45.068 BM869: Tx <VALUE?>
;; 13:36:45.296 BM869: Rx <-50u>
;; 13:36:45.296 BM869: Rx as numbers <-4.9999999999999996E-5>
;; 13:36:45.481 BM869: Tx <VALUE?>
;; 13:36:45.690 BM869: Rx <-50u>
;; 13:36:45.690 BM869: Rx as numbers <-4.9999999999999996E-5>
;; 13:36:45.900 BM869: Tx <VALUE?>
;; 13:36:46.076 BM869: Rx <-50u>
;; 13:36:46.076 BM869: Rx as numbers <-4.9999999999999996E-5>
;; 13:36:46.106 BM869: Tx <VALUE?>
;;-50uException in thread "Thread-47"
java.lang.NullPointerException
Thread for BM869 at dk.hkj.main.PaneCurrentValues.updateDirect(PaneCurrentValues.java:396)
at dk.hkj.main.PaneCurrentValues.access$8(PaneCurrentValues.java:392)
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at dk.hkj.main.PaneCurrentValues$AsyncUpdate.run(PaneCurrentValues.java:361)
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.remove(Unknown Source)
at java.util.Collections$SynchronizedList.remove(Unknown Source)
at dk.hkj.devices.DeviceUsbHidDMM$TranslatingInterface.read(DeviceUsbHidDMM.java:132)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:103)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:150)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:187)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:229)
at dk.hkj.main.SCPICommand.readNumbers(SCPICommand.java:319)
at dk.hkj.main.DeviceInterface.getValuesFromDevices(DeviceInterface.java:327)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1007)
;; 13:36:46.313 BM869: Tx <VALUE?>
;; 13:36:46.476 BM869: Rx <-50u>
;; 13:36:46.478 BM869: Rx as numbers <-4.9999999999999996E-5>
;; 13:44:25.424 FY6800: Rx <50.0>
;; 13:44:25.424 FY6800: Tx <C2:RDF?>
;; 13:44:25.424 FY6800: Tx <txrx? RFF>
;; 13:44:25.426 COM5: Tx: <RFF.> 52 46 46 0A
;; 13:44:25.428 COM5: Rx: <00010000.000000> 30 30 30 31 30 30 30 30 2E 30 30 30 30 30 30
Thread for FY6800Exception in thread "Thread-24"
java.lang.NullPointerException
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at dk.hkj.main.PaneCurrentValues.updateDirect(PaneCurrentValues.java:396)
at dk.hkj.main.PaneCurrentValues.access$8(PaneCurrentValues.java:392) at java.util.ArrayList.rangeCheck(Unknown Source)
at dk.hkj.main.PaneCurrentValues$AsyncUpdate.run(PaneCurrentValues.java:361) at java.util.ArrayList.remove(Unknown Source)
at java.util.Collections$SynchronizedList.remove(Unknown Source)
at dk.hkj.comm.TranslatingInterface.read(TranslatingInterface.java:30)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:103)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:150)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:187)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:229)
at dk.hkj.main.SCPICommand.readNumbers(SCPICommand.java:319)
at dk.hkj.main.DeviceInterface.getValuesFromDevices(DeviceInterface.java:327)
at dk.hkj.devices.DeviceSCPI.getValuesFromDevices(DeviceSCPI.java:38)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1007)
;;00010000.000000
;; 13:44:25.570 FY6800: Tx <C1:RDF?>
;; 13:44:25.570 FY6800: Tx <txrx? RMF>
;; 13:44:25.573 COM5: Tx: <RMF.> 52 4D 46 0A
;; 13:44:25.574 COM5: Rx: <00010000.000000> 30 30 30 31 30 30 30 30 2E 30 30 30 30 30 30
;; 13:44:25.575 FY6800: Rx <00010000.000000>
;; 13:44:25.575 FY6800: Tx <C1:RDA?>
;; 13:44:25.575 FY6800: Tx <txrx? RMA>
;; 13:44:25.577 COM5: Tx: <RMA.> 52 4D 41 0A
;; 13:44:25.578 COM5: Rx: <50000> 35 30 30 30 30
;; 13:55:09.243 F289: Rx <0.0000E0>
;; 13:55:09.243 F289: Rx as numbers <0.0>
;; 13:55:09.433 F289: Tx <VALUE?>
;; 13:55:09.436 COM4: Tx: <QM.> 51 4D 0D
;; 13:55:09.455 COM4: Rx: <0> 30
;; 13:55:09.455 COM4: Rx: <0.0000E0,VDC,NORMAL,NONE> 30 2E 30 30 30 30 45 30 2C 56 44 43 2C 4E 4F 52 4D 41 4C 2C 4E 4F 4E 45
Thread for F289
Exception in thread "Thread-33" ;;0.0000E0
java.lang.NullPointerException
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at dk.hkj.main.PaneCurrentValues.updateDirect(PaneCurrentValues.java:396)
at dk.hkj.main.PaneCurrentValues.access$8(PaneCurrentValues.java:392) at java.util.ArrayList.rangeCheck(Unknown Source)
at dk.hkj.main.PaneCurrentValues$AsyncUpdate.run(PaneCurrentValues.java:361) at java.util.ArrayList.remove(Unknown Source)
at java.util.Collections$SynchronizedList.remove(Unknown Source)
at dk.hkj.comm.TranslatingInterface.read(TranslatingInterface.java:30)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:103)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:150)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:187)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:229)
at dk.hkj.main.SCPICommand.readNumbers(SCPICommand.java:319)
at dk.hkj.main.DeviceInterface.getValuesFromDevices(DeviceInterface.java:327)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1007)
;; 13:55:09.634 F289: Tx <VALUE?>
;; 13:55:09.637 COM4: Tx: <QM.> 51 4D 0D
;; 13:55:09.646 COM4: Rx: <0> 30
;; 13:55:09.646 COM4: Rx: <0.0000E0,VDC,NORMAL,NONE> 30 2E 30 30 30 30 45 30 2C 56 44 43 2C 4E 4F 52 4D 41 4C 2C 4E 4F 4E 45
;; 13:55:09.646 F289: Rx <0.0000E0>
;; 13:55:09.648 F289: Rx as numbers <0.0>
;; 13:55:09.835 F289: Tx <VALUE?>
;; 13:55:09.837 COM4: Tx: <QM.> 51 4D 0D
;; 13:55:09.855 COM4: Rx: <0> 30
;; 13:55:09.856 COM4: Rx: <0.0000E0,VDC,NORMAL,NONE> 30 2E 30 30 30 30 45 30 2C 56 44 43 2C 4E 4F 52 4D 41 4C 2C 4E 4F 4E 45
It looks like there is a bug when using a device with COM/USB ports in V0.70, when on the Current Values tab you get the below errors
It looks like there is a bug when using a device with COM/USB ports in V0.70, when on the Current Values tab you get the below errors
That is the part I have worked on to avoid slow downs, but it looks like I am missing some locks (I do not see the problems on my machine).
I have modified the code slight here:
http://lygte-info.dk/pic/Projects/TestController/TestController.jar (http://lygte-info.dk/pic/Projects/TestController/TestController.jar)
;; 14:44:03.719 BM869: Tx <VALUE?>
;; 14:44:03.911 BM869: Rx <24.4>
;; 14:44:03.911 BM869: Rx as numbers <24.4>
;; 14:44:03.921 BM869: Tx <VALUE?>
Thread for BM869
Exception in thread "Thread-60" ;;24.4java.lang.NullPointerException
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source) at dk.hkj.main.PaneCurrentValues.updateDirect(PaneCurrentValues.java:396)
at java.util.ArrayList.remove(Unknown Source) at dk.hkj.main.PaneCurrentValues.access$8(PaneCurrentValues.java:392)
at java.util.Collections$SynchronizedList.remove(Unknown Source) at dk.hkj.main.PaneCurrentValues$AsyncUpdate.run(PaneCurrentValues.java:376)
at dk.hkj.devices.DeviceUsbHidDMM$TranslatingInterface.read(DeviceUsbHidDMM.java:132)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:103)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:150)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:187)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:229)
at dk.hkj.main.SCPICommand.readNumbers(SCPICommand.java:319)
at dk.hkj.main.DeviceInterface.getValuesFromDevices(DeviceInterface.java:327)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1007)
;; 14:44:04.123 BM869: Tx <VALUE?>
;; 14:44:04.301 BM869: Rx <24.4>
;; 14:44:04.301 BM869: Rx as numbers <24.4>
;; 14:44:04.320 BM869: Tx <VALUE?>
;; 14:44:04.501 BM869: Rx <24.4>
;; 14:44:04.501 BM869: Rx as numbers <24.4>
;; 14:44:04.520 BM869: Tx <VALUE?>
;; 14:44:04.692 BM869: Rx <24.4>
;; 14:44:04.692 BM869: Rx as numbers <24.4>
;; 14:44:04.721 BM869: Tx <VALUE?>
;; 14:44:04.891 BM869: Rx <24.4>
;; 14:44:04.891 BM869: Rx as numbers <24.4>
;; 14:44:04.922 BM869: Tx <VALUE?>
;;24.4Exception in thread "Thread-65" java.lang.NullPointerException
at dk.hkj.main.PaneCurrentValues.updateDirect(PaneCurrentValues.java:396)
Thread for BM869
at dk.hkj.main.PaneCurrentValues.access$8(PaneCurrentValues.java:392)java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at dk.hkj.main.PaneCurrentValues$AsyncUpdate.run(PaneCurrentValues.java:376) at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.remove(Unknown Source)
at java.util.Collections$SynchronizedList.remove(Unknown Source)
at dk.hkj.devices.DeviceUsbHidDMM$TranslatingInterface.read(DeviceUsbHidDMM.java:132)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:103)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:150)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:187)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:229)
at dk.hkj.main.SCPICommand.readNumbers(SCPICommand.java:319)
at dk.hkj.main.DeviceInterface.getValuesFromDevices(DeviceInterface.java:327)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1007)
;; 14:44:05.124 BM869: Tx <VALUE?>
;; 14:44:05.282 BM869: Rx <24.4>
;; 14:44:05.282 BM869: Rx as numbers <24.4>
;; 14:44:05.323 BM869: Tx <VALUE?>
;; 14:44:05.482 BM869: Rx <24.4>
;; 14:44:05.482 BM869: Rx as numbers <24.4>
Still looks like there is an issue. With Bryman BM869s only enabled I get the below errors. With Fluke 289 only enabled it works fine. If I have both the
Still looks like there is an issue. With Bryman BM869s only enabled I get the below errors. With Fluke 289 only enabled it works fine. If I have both the
I have added a lock to the Brymen, same link as before.
It works in a way, but adding this line will improve it significantly:
:readmath: formatDouble(value,1,3,1,1)
Without that it do do something like: 3.234E+1
I will include it.
HKJ,
Readmath added.
(Attachment Link)
It looks to be fixed, back to normal. Also are you going to add the Keysight344xxA device file that has system temperature to V0.70.
Thanks for testing.
I have updated the .zip file and added the Keysight with temperature to it, i.e. it is V0.72 now.
The .zip file is still V0.70.
Still .70
(Attachment Link)
Now seeing 0.72 :-+
Good idea about the LPF ... but not able to get it working. No values are being recorded. I have tried it with Source formula cleared (blank) and also without the Math: portion and also with (sum*(samples-1)+lastValue/samples entered under Source formula.
Any ideas about doing X/Y graphing?
Could be useful in connection with temperature coefficient
measurements on resistors among others.
Can someone do a description for SDL1000X loads because I wouldn't know where to start ? :palm:
https://int.siglent.com/upload_file/user/SDL1000X/SDL1000X_Programming_Guide_V1.0.pdf
OK, thanks much but it's getting late here and rainy day forecast tomorrow so maybe a better time for a play.Can someone do a description for SDL1000X loads because I wouldn't know where to start ? :palm:
https://int.siglent.com/upload_file/user/SDL1000X/SDL1000X_Programming_Guide_V1.0.pdf
I can get your started. Connect the load to the computer, the select the "Load devices" page and right click on the combo box. Select "Create new SCPI..."
Run through the four buttons on that page, if you uses a network connection you need to fill in the IP address.
Then add to the new device file:
#value Voltage V D3
#value Current A D3
#askValues MEAS:VOLT?;MEAS:CURR?
This ought to get your two columns with values from the load.
Next is setting up the load in some mode, we can talk about that if the above works.
Can someone do a description for SDL1000X loads because I wouldn't know where to start ? :palm:
https://int.siglent.com/upload_file/user/SDL1000X/SDL1000X_Programming_Guide_V1.0.pdf
I can get your started. Connect the load to the computer, the select the "Load devices" page and right click on the combo box. Select "Create new SCPI..."
Run through the four buttons on that page, if you uses a network connection you need to fill in the IP address.
Then add to the new device file:
#value Voltage V D3
#value Current A D3
#askValues MEAS:VOLT?;MEAS:CURR?
This ought to get your two columns with values from the load.
Next is setting up the load in some mode, we can talk about that if the above works.
Worked for me , thank you, I was wondering where to start with this :)
You can add these lines to the file:
#finalCmd :INP 0
#cmdSetup number Current
:read: :CURR?
:write: :CURR
Amps 0 30
#cmdsetup buttonsOn Status
:write: :INP
:read: :INP?
off 0
on 1
There need to many more #cmdSetup entries for a full definition, but it is hard to do without the load to test on.
I'll work on this and also a Siglent SPD3303X-E, and hopefully make some contribution to the project.
With the SPD3303X and X-E, the supplied SW package EasyPower already supports 1mV/mA resolution by default which is only available in the X model UI vs 10mV/mA in the UI of X-E models.I'll work on this and also a Siglent SPD3303X-E, and hopefully make some contribution to the project.
Sounds good.
When finished with a definition, check the manufacturer model range, you may be able to support multiple models with only a little extra work by using #meta and #metadef and some edit instruction.
With the SPD3303X and X-E, the supplied SW package EasyPower already supports 1mV/mA resolution by default which is only available in the X model UI vs 10mV/mA in the UI of X-E models.
Hope that makes sense.
The SDL1000X range consists of 4 models, X and X-E in 200 and 300W versions and again X versions have the 10x higher resolution of 0.1mV/mA.
We do have a beta version of EasySDL SW made available by a member that provided a link to an ISO of the factory shipped CD however it's never been released publically and apparently is back having rework to fix bugs.
Not for SDP3303X and X-E models, both get the same setting resolution when driving them with the EasyPower SW.With the SPD3303X and X-E, the supplied SW package EasyPower already supports 1mV/mA resolution by default which is only available in the X model UI vs 10mV/mA in the UI of X-E models.
Hope that makes sense.
The SDL1000X range consists of 4 models, X and X-E in 200 and 300W versions and again X versions have the 10x higher resolution of 0.1mV/mA.
We do have a beta version of EasySDL SW made available by a member that provided a link to an ISO of the factory shipped CD however it's never been released publically and apparently is back having rework to fix bugs.
They probably returns different answers to the *IDN? request and that must match for the software to work.
A new 60V/12A Riden Power Supply (RD6012) was released the other day. Attached is an updated device file that supports both RD6006 and RD6012 (RD6012 not tested).
Thanks for adding standard deviation ... a nice feature!
Is it possible to popup the "values from chart" window a bit more to the left or even in the middle? Any time I click into the chart graph, in order to see the values, the window is outside of my display - see my attachment.
I assume, that you wanted to have a clear view to the graph, however, even in the same session, you need to pick the window to the readable place on the display, when clicking a 2nd time into the graph (after it disappeared), which is a little awkward in my opinion, to drag and drop the window with the mouse again and again. Do I have an option to tweak it? :-/O
One Linux-Question:
Has anybody managed to use a Brymen with TestController so far?
Has anybody managed to use a Brymen with TestController so far?
I am trying to work with a device using the ascii driver and I am trying to have the end of line be carriage return line feed. My device file has:
#port 23
#eol \r\n
#driver ascii
Running TestController in debug mode no matter what I do with the #eol line in the device file debug output shows what I type plus 0x0A at the end which is line feed. Am I using the syntax/order wrong or does the ascii driver not use the #eol command? Simply asked, how do I use the ascii driver with end of line being CRLF (\r\n)?
HKJ, thanks for the quick answer. I tried adding "\r" in the commands before and I tried again just now adding to #scpiCmd lines. TestController just adds those characters and does not change \r to 0x0F. That is, I get 5C 72 0A instead of 0F 0A at end of line.
Pardon my ignorance, but I am not sure what "put the \r in brackets and quotes" exactly means. Below are variations I tried and all of them ended up just sending the added character and none added the \r (0x0D).
Hi @HKJ, I have a HP 34401A connected to my PC via CH340 RS232 to USB adapter. I tried to connect to TestController with no success.
I have used this setup with Agilent DMM Utility so I know it works.
Any advice?
Not sure what you mean by debug mode.
is this what you need?
This is what my PC reports
How do I get in touch with "maukka"
I can talk to my 34401A using Keysight connection expert and log using Agilent dmm utility so the r3232/usb interface works.
My Com port setting is the same on my PC and TestController but I note that you use different com port in TestController (Com8) compared to your PC (Com3).
Looks like the program finds the meter just fine automatically even when the com port settings are wrong.
I can talk to my 34401A using Keysight connection expert and log using Agilent dmm utility so the r3232/usb interface works.
Are you sure the Agilent tool uses the PC parameters and not its own?
The best way is to check the baud settings directly on the meter.
@HKJ, yes my 34401A reports 9600 baud when queried through its front panel menu.
Given that @maukka can use his 34401A with TestController program and I cannot, there must be a difference in the way my CH340 RS232/USB interface works compared to the Keyspan USB Serial interface.
@HKJ, yes my 34401A reports 9600 baud when queried through its front panel menu.
What about parity and bits?
Meanwhile, how do I re-scale the Y-axis on the Chart window?
Meanwhile, how do I re-scale the Y-axis on the Chart window?
Depends:
You can always type start and end samples/times in the two boxes.
When using "Time" as axis you can click on the chart to get a cursor, then right click to get a zoom menu.
When using other scales you have to adjust it in "Scales for chart"
X-axis is always adjusted in "Scales for chart"
I am now setting up a Keysight 34461A DMM which is connected via USB to my PC (USB 2.0 TMC488 & MTP protocol).
How do I set the port ID for this meter?
One thing I plan on implementing is support GPIB interface.
...
Any comments or ideas?
2. The National Instruments GPIB controllers are also popular. One that is frequently mentioned is the NI-GPIB-USB-HS. I have one that you are welcome to use for development, though shipping from the States to Denmark is not ideal.
3. The Prologix and NI adapters for GPIB-USB would have to be plugged into the machine running TestController in order to access the USB port. Any plans to support **remote** GPIB adapters? That is, having TestController run on a network machine rather than on the machine with the controller itself?
2. The National Instruments GPIB controllers are also popular. One that is frequently mentioned is the NI-GPIB-USB-HS. I have one that you are welcome to use for development, though shipping from the States to Denmark is not ideal.
With USB interfaces I can only handle the types that uses a virtual serial port. What do this interface do?
I suppose with the PrologixEthernet it may be possible to do some remote interface. I could also make a version of AR488 that uses a network connection (That would be fairly easy).
Then you only need a small driver that copies data directly between USB and a socket. I do not know if something like this already exists, but it would be easy to do in Java.
Hi all...i've got a 61B version that it's recognized as "61E" but still in timing out conditions (physical RS232C port derived from Intel ICH7R).
Hi all...i've got a 61B version that it's recognized as "61E" but still in timing out conditions (physical RS232C port derived from Intel ICH7R).
I supposed you mean UNI-T 61B, the meter is not support and it is nothing like the UNI-T 61E.
The data is a encoding of the segments on the display, this means I need a meter with this chip to make a decoder for it.
If you want I could test your code.
If you want I could test your code.
I do not know if that will work, but lets try:
Replace you current .jar file with this one:
http://lygte-info.dk/pic/Projects/TestController/TestController.jar (http://lygte-info.dk/pic/Projects/TestController/TestController.jar)
Add these lines to the top of "SimpleDMM.txt":
#metadef
#idString UNI-T,UT61B,
#name UNI-T UT61B
#handle UT61B
#subDriver 5
#baudrate 2400N81Dr
Connect UT61B to PC and enable computer connection.
Start test controller, preferable in debug mode.
Clear log window, select UT61B as only loaded device, specify serial port and press reconnect.
I hope it will recognize the meter and work in some ranges.
I feel dumb, were can I find SimpleDMM.txt ?
I feel dumb, were can I find SimpleDMM.txt ?
In the "Devices" subdir, there is files for all supported devices in that directory (May files defines multiple devices).
Here: TestController.jar\dk\hkj\devices I have a whole bunch of .class files, no .txt
btw, I've opened the .jar with winrar because that is what I have. :-//
I have tried to fix the problem Marco1971 saw. There is a new version (0.79) at the above link.
Both versions are working with my hacked Ohmeron mt488e (fs9922dmm3). :-+
Some functions/ranges need some work.a
Do I need to report them all or are you still writing to complete the code?
With new 0.79 file all ranges are correctly displayed, excluding temperature in °C/°F and all current ranges (a.c and d.c).
Displayed -4.4 °C versus actually 24 ambient temperature in °C.
New jar file up (V0.80)
It fixes the temperature problem and hopefully the decimal placement and adds permanent hex dump (Will be removed when the ranges works).
It may also fix OL in ohm ranges, if not I need the hex dump.
Please post the a line of hex dump for the ranges that shows NaN or other wrong values.
First check in V0.80 shows the DCV 400mv still doesn't work, were can I find the HEX dumps? |O
First check in V0.80 shows the DCV 400mv still doesn't work, were can I find the HEX dumps? |O
It is something like this:
;; COM11: Rx: 1.234 2B 31 32 33 34 20 30 78 78 78 78 78 0D 0A
;; COM11: Rx: 1.234 2B 31 32 33 34 20 30 78 78 78 78 78 0D 0A
;; COM11: Rx: 1.234 2B 31 32 33 34 20 30 78 78 78 78 78 0D 0A
In the log window.
Ok, on the 400mV range it doesn't show hex, neither in the cmd.exe.
On working ranges it does.
The meter does work on this range with other software.
Ok, on the 400mV range it doesn't show hex, neither in the cmd.exe.
On working ranges it does.
The meter does work on this range with other software.
I have modified the start of message detection, I hope this helps (V0.81).
Its not really a question about what software the meter works on, the problem is that I need to get the decoder correct for the meter. It is not difficult, but it is slow when somebody else do the testing. As long as some people do test and post results I will get the meter working.
I have programmed a Arduino to simulate the meter (more or less), it will repeat any hex dump I put into it. This means any hex dump that do not decode correctly I can easily simulate and fix.
If getting either LXI or GPIB to work on a existing device, please post a line here with the device filename and the #port line used, then I can update the original.
#port 5024 LXI
;; 15:26:48.437 SDM3065X: Tx <DATA:LAST?>
;; 15:26:48.516 SDM3065X: Rx <+2.25545080E+01 C
>
;; 15:26:48.566 SDM3065X: *OPC waited: 32ms
;; 15:26:48.566 SDM3065X: Rx as numbers <22.554508>
;; 15:26:48.638 SDM3065X: Tx <DATA:LAST?>
;; 15:26:48.758 SDM3065X: Rx <+2.25566770E+01 C
>
;; 15:26:48.808 SDM3065X: *OPC waited: 33ms
;; 15:26:48.808 SDM3065X: Rx as numbers <22.556677>
098,3mV = 0A 2B 30 39 38 33 20 34 11 00 40 80 09 0D
LXI works for the Siglent SDM's line shown below. I notes that when using LXI the Rx line has the > on the next line. I am making some changes to the device file. I will send an update file in the next day or two including LXI.Code: [Select]#port 5024 LXI
098,3mV = 0A 2B 30 39 38 33 20 34 11 00 40 80 09 0D
My start of block detection was still faulty, I hope it is fixed now.
The decimal placement that is specified to be 0, 1, 2, 3 was 4
For now I have just put a 1 factor in, but it will probably have to be adjusted.
I took a short log session to .csv and then in Excel plotted the time stamp versus index number. That graph clearly shows a glitch followed by the sample interval time increasing by almost exactly 2x. What is going on here??? Is this a bug in the code or is the code trying to be smart and adjust the sample time slower when the sampling does not keep up?
Second issue with logging at 0.01 sec intervals: In the Table tab the time column only shows up to 0.1 sec resolution. Certainly when sampling at the 0.03 second or the 0.01 second interval you want to see two digits after the decimal. I get that for slower sampling it may not be needed to show the extra digit, but would it hurt?
dcV:
40mV OK
400mV meter: 198.1mV software: 1,981V
400mV meter: 198.1mV software: 1,981V
4V OK
40V OK
400V meter: 046,8V software: 468V
1000V OK
jar file V0.83 where the extra factor is 0.1
dcV:
40mV OK
400mV meter: 198.1mV software: 1,981V
400mV meter: 198.1mV software: 1,981V
4V OK
40V OK
400V meter: 046,8V software: 468V
1000V OK
I was missing the hex dump to confirm it was the extra decimal location.
;; COM6: Rx: 0.0 2B 3F 30 3A 3F 20 32 21 00 10 20 29 0D 0A
A minor imperfection is that on all ranges that I've noticed OL is displayed as 0, for instance MOhm range:Code: [Select];; COM6: Rx: 0.0 2B 3F 30 3A 3F 20 32 21 00 10 20 29 0D 0A
How many meters is covered by this definition? Uni-T UT61B, UT61C, UT61D, but what other brands and models?
I will wait for your update. The > on the next line means I am not stripping the LF character, I may add that.
After searching the Sigrok website I've came up with these:
Attached is an updated device file for the Siglent SDM's
V0.84 is up, it is mostly about the meters added above.
Added Uni-t UT61B, UT61C, UT61D (Fortune FS9922-DMM3 & FS9922-DMM4 DMM chips) with help from "The Soulman"
Added a lot of other similar meters, thanks to "The Soulman" from EEVBlog forum
Updated Siglent bench meter definitions , thanks to "MikeLud" from EEVBlog forum
Added manual/help pages for Histogram, Scales, Range and Math.
V0.84 shows V0.76 in about
Perhaps it would help to avoid this, but in any case it would clarify if the uploaded zip name ends with Vx.xx
What about keeping the file on something like GitHub, I was going to say what about attaching the file to the post but the size is past the 5,000 KB limit
In some of my old equipment I found a PrologixEthernet interface, with this as test I expect to make PrologixUSB, PrologicEthernet and AR488 interfaces. I will first be able to test the AR488 interface when I get a cable.2. The National Instruments GPIB controllers are also popular. One that is frequently mentioned is the NI-GPIB-USB-HS. I have one that you are welcome to use for development, though shipping from the States to Denmark is not ideal.
With USB interfaces I can only handle the types that uses a virtual serial port. What do this interface do?3. The Prologix and NI adapters for GPIB-USB would have to be plugged into the machine running TestController in order to access the USB port. Any plans to support **remote** GPIB adapters? That is, having TestController run on a network machine rather than on the machine with the controller itself?
I suppose with the PrologixEthernet it may be possible to do some remote interface. I could also make a version of AR488 that uses a network connection (That would be fairly easy).
Then you only need a small driver that copies data directly between USB and a socket. I do not know if something like this already exists, but it would be easy to do in Java.
There are also National Instruments serial to GPIB adapters, like GPIB-232CT and GPIB-232CT-A.
Manual of the GPIB-232CT:
https://www.ni.com/pdf/manuals/320114.pdf (https://www.ni.com/pdf/manuals/320114.pdf)
and manual of the GPIB-232CT-A:
https://www.ni.com/pdf/manuals/370898a.pdf (https://www.ni.com/pdf/manuals/370898a.pdf)
At best, a configurable byte count for every gpib address (as the same serial comm port can serve multiple gpib devices), so that if you have a device that output at max 15 byte, and the other 200 byte, the first one isn't slowed down.
#idString SOLARTRON,7150PLUS,
#name Solartron 7150Plus
#handle 7150PLUS
#driver SingleValue
#port GPIB
#gpibReadCount 15
; A list of possible column name with unit and formatter (SI, Time, Int, D0..D6)
#value VoltageDC V si V DC
#askValues G
#interfaceType DMM
#interface readValue 0
; Initial commands to meter when establishing connection
#initCmd T0
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; Stopping thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
I'm sure to have made a mistake |O
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; COM9: Tx: <.> 0A
;; COM9: Tx: <TMO 1.0.> 54 4D 4F 20 31 2E 30 0A
;; COM9: Tx: <RD 15,1.> 52 44 20 31 35 2C 31 0A
;; COM9: Rx: timeout
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD 15,1.> 52 44 20 31 35 2C 31 0A
;; 150PLUS: Tx <T0>
;; Found Solartron 7150Plus on National Instruments GPIB-232CT A:1
;; COM9: Rx: timeout
;; COM9: Tx: <RD 15,1.> 52 44 20 31 35 2C 31 0A
;; Mode reported: <>
;; COM9: Rx: timeout
;; COM9: Tx: <RD 15,1.> 52 44 20 31 35 2C 31 0A
;; COM9: Rx: timeout
;; COM9: Tx: <RD 15,1.> 52 44 20 31 35 2C 31 0A
;; COM9: Rx: timeout
;; COM9: Tx: <RD 15,1.> 52 44 20 31 35 2C 31 0A
;; COM9: Rx: timeout
;; COM9: Tx: <RD 15,1.> 52 44 20 31 35 2C 31 0A
;; COM9: Rx: timeout
;; COM9: Tx: <RD 15,1.> 52 44 20 31 35 2C 31 0A
;; COM9: Rx: timeout
;; COM9: Tx: <RD 15,1.> 52 44 20 31 35 2C 31 0A
;; COM9: Rx: timeout
;; COM9: Tx: <RD 15,1.> 52 44 20 31 35 2C 31 0A
;; COM9: Tx: <.> 0A
at startup is a bit strange
#idString SOLARTRON,7150PLUS,
#name Solartron 7150Plus
#handle 7150PLUS
#driver Ascii
#port GPIB
#gpibReadCount 15
; A list of possible column name with unit and formatter (SI, Time, Int, D0..D6)
#value VoltageDC V si V DC
#initCmd init
#interfaceType DMM
#interface readValue 0
#cmdMode VDC M0
*cls;
:SENSE:FUNCTION:ON "M0"
sense:voltage:dc:nplc 1;
#askMode mode?
#scpiCmd values? txrx? G
#scpiCmd init tx T0
#scpiCmd mode? txrx? M?
#askValues values?
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; COM9: Tx: <.> 0A
;; National Instruments GPIB-232CT A:1: Tx <init>
;; National Instruments GPIB-232CT A:1: Tx <tx T0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <T0.> 54 30 0A
;; Found Solartron 7150Plus on National Instruments GPIB-232CT A:1
;; 50PLUS: Tx <mode?>
;; 50PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <TMO 1.0.> 54 4D 4F 20 31 2E 30 0A
;; COM9: Tx: <RD #15,1.> 52 44 20 23 31 35 2C 31 0A
;; COM9: Rx: timeout
;; 50PLUS: Rx Timeout
I always see this:;; COM9: Tx: <.> 0A
That is strange;; COM9: Tx: <WRT 1.>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <TMO 1.0.> 54 4D 4F 20 31 2E 30 0A
Whoa, the language in the definition files is a true programming language :scared: :scared:
#initCmd init
;; COM9: Tx: <T0.> 54 30 0A
Then, why after:Code: [Select];; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
(Excluding the dot..) It do:Code: [Select];; COM9: Tx: <TMO 1.0.> 54 4D 4F 20 31 2E 30 0A
And not an rd for read the device mode?
#initCmd init
The ascii driver only understands tx/txrx/txrx?, anything else must be defined with #scpiCmd
#initCmd init
#scpiCmd init tx T0
#askMode mode?
#scpiCmd mode? txrx? M?
#askValues values?
#scpiCmd values? txrx? G
Got it, so at startup is sent an LF.;; COM9: Tx: <T0.> 54 30 0A
The dot is used to show non-printable characters, here it is a LF or 0A code, as can be see in the hex part.
Then, why after:Code: [Select];; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
(Excluding the dot..) It do:Code: [Select];; COM9: Tx: <TMO 1.0.> 54 4D 4F 20 31 2E 30 0A
And not an rd for read the device mode?
The driver keeps track of timeout setting and when it is changed it will send a new timeout command to the gpib device. As long as the gpib controller is only handling one device you will probably only see the TMO command once.
To do a read you do a txrx? (txrx works the same way, but you will not get the result) and then you are supposed to see:
WRT deviceAddress
The actual string you want to write
Optional a TMO
A RD #chars,deviceAddress
And then the result, it can either be a timeout or a string.
A write is done with tx and you will see:
WRT deviceAddress
The actual string you want to write
For a more simple definition use:
#value VoltageDC V si
and put a ; before #askmode:
;#askMode
This means TestController will always show one data value for the device called "VoltageDC"
Then you can work with #askValues to get the readings from the meter.
Probably something like:
#scpiCmd value? txrx? G
#askValues value?
And you need to init the meter for single shot measurements:
#scpiCmd sampleMode tx T(value)
#initCmd sampleMode 0
When you have this working, you can implement the different modes and maybe also add range and sample time selections.
#scpiCmd must be specified BEFORE using it? Or the order of the commands doesn't matter?
Just to show what Test Controller can do (in X/Y mode) some Bode plots. :-+
Just to show what Test Controller can do (in X/Y mode) some Bode plots. :-+Sooo nice!
Ok, this evening that i go home i try! Thanks!#scpiCmd must be specified BEFORE using it? Or the order of the commands doesn't matter?
The order do not matter, all # commands are read and sorted before the definition is used.
I will suggest try using the tx/txrx/txrx? commands from the command line in debug mode, this way you can try commands and see answers very easily.
Ok, this evening that i go home i try! Thanks!
You need a generator you can control from TestController. The you could automate the sweeps very easily.
Just to show what Test Controller can do (in X/Y mode) some Bode plots. :-+
Since I do not own/need a proper signal generator (yet), I simply used the sweep function of Audio Tester driving my PC sound card. Flat enough for most purposes.Just to show what Test Controller can do (in X/Y mode) some Bode plots. :-+Sooo nice!
What have you used for read back the values? Need something that have a flat curve in frequency response.
You need a generator you can control from TestController. The you could automate the sweeps very easily.I gather we could we add oscilloscopes too? I've been meaning to write a bode program for my oscilloscope, but if we can do it in TestController, that'd be even better.
Question: Can't be done simply with a (qood quality) DMM?Look at the name of his axis, 34465 is a Keysight bench meter.
DMM True RMS converters have a quite wide bandwidth with flat curve.
I will suggest try using the tx/txrx/txrx? commands from the command line in debug mode, this way you can try commands and see answers very easily.
;; 50PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #15,1.> 52 44 20 23 31 35 2C 31 0A
;; COM9: Rx: timeout
java.lang.NullPointerException
at dk.hkj.shared.SharedInterfaceNSGPIB232CT.read(SharedInterfaceNSGPIB232CT.java:58)
at dk.hkj.shared.SharedInterface.writeRead(SharedInterface.java:258)
at dk.hkj.comm.GpibInterface.writeRead(GpibInterface.java:63)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:95)
at dk.hkj.devices.DeviceAscii$TranslatingCommInterface.write(DeviceAscii.java:153)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:100)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:151)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:188)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:230)
at dk.hkj.main.DeviceInterface.doCommand(DeviceInterface.java:70)
at dk.hkj.main.CommandProcessor.processCommands(CommandProcessor.java:675)
at dk.hkj.main.PaneCommand.processCommand(PaneCommand.java:1140)
at dk.hkj.main.PaneCommand.access$20(PaneCommand.java:1138)
at dk.hkj.main.PaneCommand$15.keyTyped(PaneCommand.java:632)
at java.awt.AWTEventMulticaster.keyTyped(Unknown Source)
at java.awt.Component.processKeyEvent(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
;; 50PLUS: Rx Timeout
;; 50PLUS: Tx <tx M1>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M1.> 4D 31 0A
;; COM9: Tx: <CLR 1.> 43 4C 52 20 31 0A
But the meter had not reset
Tried to send a txrx? G and i've got:
Tried to send also a "CLR 1" GPIB Command in the gpib window, he sent it:Code: [Select];; COM9: Tx: <CLR 1.> 43 4C 52 20 31 0A
But the meter had not reset
Found it. In the GPIB configuration page i've set as baudrate 19200, but actually the data is output at 9600bps
;; 22:12:36.326 SDS1204XE: Tx <C1-C2:PHA?>
;; 22:12:36.327 SDS1204XE: Tx <txrx? C1-C2:MEAD? PHA>
;; 22:12:36.329 192.168.1.212: Tx: <C1-C2:MEAD? PHA.> 43 31 2D 43 32 3A 4D 45 41 44 3F 20 50 48 41 0A
;; 22:12:37.329 192.168.1.212: Rx timeout 1000ms In buffer: C1-C2:MEAD PHA,0.06degree
;; 22:12:43.833 SDS1204XE: Rx Timeout
;; 22:12:43.833 SDS1204XE: Tx <C1:RMS?>
;; 22:12:43.833 SDS1204XE: Tx <txrx? C1:PAVA? RMS>
;; 22:12:43.834 192.168.1.212: Tx: <C1:PAVA? RMS.> 43 31 3A 50 41 56 41 3F 20 52 4D 53 0A
;; 22:12:43.862 192.168.1.212: Rx: <C1:PAVA RMS,1.80E+00V> 43 31 3A 50 41 56 41 20 52 4D 53 2C 31 2E 38 30 45 2B 30 30 56 0A
;; 22:12:43.862 SDS1204XE: Rx <1.80E+00V>
;; 22:12:43.862 SDS1204XE: Tx <C2:RMS?>
;; 22:12:43.863 SDS1204XE: Tx <txrx? C2:PAVA? RMS>
;; 22:12:43.863 192.168.1.212: Tx: <C2:PAVA? RMS.> 43 32 3A 50 41 56 41 3F 20 52 4D 53 0A
;; 22:12:43.888 192.168.1.212: Rx: <C2:PAVA RMS,1.80E+00V> 43 32 3A 50 41 56 41 20 52 4D 53 2C 31 2E 38 30 45 2B 30 30 56 0A
;; 22:12:43.889 SDS1204XE: Rx <1.80E+00V>
;; 22:12:43.890 SDS1204XE: Rx as numbers <1.8 1.8>
#author MikeLud
#idString Siglent Technologies,SDS1204X-E,
#name Siglent SDS1204X-E
#handle SDS1204X-E
#driver Ascii
#port 5024
#scpiCmd C1-C2:PHA? txrx? C1-C2:MEAD? PHA
:readmath: getElement(value,1,",")
#scpiCmd C1:RMS? txrx? C1:PAVA? RMS
:readmath: getElement(value,1,",")
#scpiCmd C2:RMS? txrx? C2:PAVA? RMS
:readmath: getElement(value,1,",")
; A list of possible column name with unit and formatter (SI, Time, Int, D0..D6)
#value Delay Degree D2
#value C1:RMS V si
#value C2:RMS V si
; How to poll for data, this is used for table and #values?
; a #askMode, #cmdMode and #prepareSample is used before this is string is used.
; This is a single line command
#askValues C1-C2:PHA?;C1:RMS?;C2:RMS?
; Format of answer: f=float, u=remove trailing letters, x=skip, *=Zero upper case values if this value is 0
#askValuesReadFormat uuu
;Accept this delay when reading values (seconds)
#readingDelay 5
; Initial commands to meter when establishing connection
#initCmd MEAD PHA,C1-C2;PACU RMS,C1;PACU RMS,C2
; Prepare the meter to response to #askValues
#prepareSample
abort
sample:count 1
trig:source imm
trig:count inf
init
I am creating a device file for my Siglent SDS1204X-E and I am having issues reading the first value, I am getting "Rx timeout 1000ms In buffer: C1-C2:MEAD PHA,0.06degree". I looks like it is reading the value but it is stuck in the buffer.
Also to do a :readmath: on each value I am using the ASCII driver.
Found it. In the GPIB configuration page i've set as baudrate 19200, but actually the data is output at 9600bps
Thanks, I will take a look at it tomorrow.
I am creating a device file for my Siglent SDS1204X-E and I am having issues reading the first value, I am getting "Rx timeout 1000ms In buffer: C1-C2:MEAD PHA,0.06degree". I looks like it is reading the value but it is stuck in the buffer.This means TestController is missing a CR or LF character (Either one will do).
Where do I add \n or is this a scope bug that I can't fix.
;; COM9: Set params: 19200
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; COM9: Tx: <.> 0A
;; National Instruments GPIB-232CT A:1: Tx <init>
;; National Instruments GPIB-232CT A:1: Tx <tx T0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <T0.> 54 30 0A
;; Found Solartron 7150Plus on National Instruments GPIB-232CT A:1
;; 50PLUS: Tx <mode?>
;; 50PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <TMO 1.0.> 54 4D 4F 20 31 2E 30 0A
;; COM9: Tx: <RD #15,1.> 52 44 20 23 31 35 2C 31 0A
;; COM9: Rx: <M0> 4D 30
;; 50PLUS: Rx <M0>
Seem perfect! It also return the correct mode (M0)txrx? G
;; 50PLUS: Tx <txr (i've set 15 bytex? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #15,1.> 52 44 20 23 31 35 2C 31 0A
;; COM9: Rx: <+.0000330 V DC15> 2B 2E 30 30 30 30 33 33 30 20 20 56 20 44 43 31 35
;; 50PLUS: Rx <+.0000330 V DC15>
;; +.0000330 V DC15
It return 17 bytes instead of 15 (I've set 15 byte return value), witht that strange "15" at the end.Where do I add \n or is this a scope bug that I can't fix.
It is something to do with the scope. Some ideas:
1) Longer timeout, maybe the timeout is too short.
2) Because you are using ascii driver, you can do a trick: Send this command with "tx", then send another command that will answer. You are now supposed to get both answers on the same line.
It return 17 bytes instead of 15 (I've set 15 byte return value), witht that strange "15" at the end.
And if i do a second time the "txrx? G" it goes in timeout
Tried idea 2, no luck, the scope only accepts one SCPI command at a time. I checked with Wireshark and the scope is definitely not send "0A" at the end of the string as the others responses do.
send:
rd #100,1<cr>
72 64 20 23 31 30 30 2C 31 0D
receive:
37 31 35 30 2B 20 56 41 43 2E 41 43 0D 0A * 2B 2E 30 30 30 30 33 34 30 20
20 56 20 44 43 0D 0A 2B 2E 30 30 30 30 33 34 30 20 20 56 20 44 43 0D 0A
2B 2E 30 30 30 30 33 34 30 20 20 56 20 44 43 0D 0A 2B 2E 30 30 30 30 33
34 30 20 20 56 20 44 43 0D 0A 2B 2E 30 30 30 30 33 34 30 20 20 56 20 44
43 0D 0A 2B 31 30 30 0D 0A
7150+ VAC.AC<cr><lf>
+.0000340 V DC<cr><lf>
+.0000340 V DC<cr><lf>
+.0000340 V DC<cr><lf>
+.0000340 V DC<cr><lf>
+.0000340 V DC<cr><lf>
+100<cr><lf>
Where is an * means that there was a little pause.You might want to add error checking when entering Minimum and Maximum values in the Scales for chart tab. If you enter a Max value less then the Min value or a Min value greater then the Max value and you enable that value on the Chat tab it cause the program to lockup.
So, now seem all correct. At power on i get:Hi! Yes tested it but as you see the returned byte count cause problemsCode: [Select];; COM9: Set params: 19200
Seem perfect! It also return the correct mode (M0)
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; COM9: Tx: <.> 0A
;; National Instruments GPIB-232CT A:1: Tx <init>
;; National Instruments GPIB-232CT A:1: Tx <tx T0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <T0.> 54 30 0A
;; Found Solartron 7150Plus on National Instruments GPIB-232CT A:1
;; 50PLUS: Tx <mode?>
;; 50PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <TMO 1.0.> 54 4D 4F 20 31 2E 30 0A
;; COM9: Tx: <RD #15,1.> 52 44 20 23 31 35 2C 31 0A
;; COM9: Rx: <M0> 4D 30
;; 50PLUS: Rx <M0>
If i do, from the command window, a "txrx? G" for getting a single shot value, this is the result:Code: [Select]txrx? G
It return 17 bytes instead of 15 (I've set 15 byte return value), witht that strange "15" at the end.
;; 50PLUS: Tx <txr (i've set 15 bytex? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #15,1.> 52 44 20 23 31 35 2C 31 0A
;; COM9: Rx: <+.0000330 V DC15> 2B 2E 30 30 30 30 33 33 30 20 20 56 20 44 43 31 35
;; 50PLUS: Rx <+.0000330 V DC15>
;; +.0000330 V DC15
And if i do a second time the "txrx? G" it goes in timeout
Trying to understand what's going on, i've played with realterm.And here there are some thoughts
First of all, if before doing anything i do a read (at poweron or after a "clr 1" - that reset the gpib device at address 1) i getCode: [Select]send:
Where is an * means that there was a little pause.
rd #100,1<cr>
72 64 20 23 31 30 30 2C 31 0D
receive:
37 31 35 30 2B 20 56 41 43 2E 41 43 0D 0A * 2B 2E 30 30 30 30 33 34 30 20
20 56 20 44 43 0D 0A 2B 2E 30 30 30 30 33 34 30 20 20 56 20 44 43 0D 0A
2B 2E 30 30 30 30 33 34 30 20 20 56 20 44 43 0D 0A 2B 2E 30 30 30 30 33
34 30 20 20 56 20 44 43 0D 0A 2B 2E 30 30 30 30 33 34 30 20 20 56 20 44
43 0D 0A 2B 31 30 30 0D 0A
7150+ VAC.AC<cr><lf>
+.0000340 V DC<cr><lf>
+.0000340 V DC<cr><lf>
+.0000340 V DC<cr><lf>
+.0000340 V DC<cr><lf>
+.0000340 V DC<cr><lf>
+100<cr><lf>
Here i can see that the solartron after every command send a <cr><lf>.
Maybe we can use a parameter like #gpibReadCount, eventually #gpibReadStopChar to stop the read also if the buffer isn't all received, but i've received the "end of data"? So we don't read any garbage.
It can be also seen that at the first read the meter output the model name, can this be useful?
It send the model name only if i not send anything before.
If for example i send an M? for asking the actual mode, it return the mode followed by cr lf
Other thing that can be noticed is that at the end of the 100byte buffer the gpib interface send the total bytes received, followed by <cr><lf>
Maybe this can be useful?
Hi! Yes tested it but as you see the returned byte count cause problems
;; COM9: Set params: 19200
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; COM9: Tx: <.> 0A
;; National Instruments GPIB-232CT A:1: Tx <init>
;; National Instruments GPIB-232CT A:1: Tx <tx T0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <T0.> 54 30 0A
;; Found Solartron 7150Plus on National Instruments GPIB-232CT A:1
;; 50PLUS: Tx <mode?>
;; 50PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <TMO 1.0.> 54 4D 4F 20 31 2E 30 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <M0> 4D 30
;; 50PLUS: Rx <M0>
txrx? M?
;; 50PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <M0> 4D 30
;; 50PLUS: Rx <M0>
;; M0
txrx? M?
;; 50PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <M0> 4D 30
;; 50PLUS: Rx <M0>
;; M0
txrx? M?
;; 50PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <4> 34
;; 50PLUS: Rx <4>
;; 4
txrx? M?
;; 50PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <4> 34
;; 50PLUS: Rx <4>
;; 4
I've repeated several times the M? command and after some tries it goes crazy. If sending manually the txrx? G for read the current value, after smoe tries it return timeout
The "4" returned now seem the received byte count (M0 CR LF)
can't the bytecount be used to do a basic "error checking" of the transmission?
1. Start, pause,stop buttons would be nice addtion.
2. Automatic triggering would be very usefull, e.g. start logging if measured value is 'bigger/equal/less than'You can do that with scripting. Write something like this in the log window:
3. Clear button for content of table /chart, now I have to leve program and run it againThe table/chart will automatic clear when you start a new log.
4. I see that quite often at first run program is hanging, I have to kill it and start it again, killing in Windows 10 sometimes has trouble to kill this appI have never seen this and due to that it is a bit hard to fix.
Uh, ok, obviously if the driver is a cr/lf line based, it's quite difficult.can't the bytecount be used to do a basic "error checking" of the transmission?
Yes and no, the driver I am using is the line based driver, i.e. it will terminate reception on a CR or LF character. This basically means that if I get a answer like M0<CR><LF>4 the driver will return M0 and next read will return 4. Because I flush the receive buffer I am not supposed to ever see the 4.
If the answer is like: M0<00><00><00>4<CR><LF> the driver will return the full line, but the NI interface will spot the zeroes and strip them together with anything after them.
If i read a 4 byte with a 10 byte buffer (like M 0 CR LF) in realterm i read "M 0 CR LF 0x00 0x00 0x00 0x00 0x00 0x00 1 0 CR LF"
>You have start and stop buttons.
Where they are ? I can see Start/Stop in timer , but this actually is not stopping grabing data, e.g in Chart tab
Pause is usefull e.g. if you will pause DUT to bring a cup of tee or you will know that next hour nothing usefull will not happened or no need to capture useless data just waiting for event to restart capturing data.
I think Pause can be scripted as well - I could net find a description for commands other in exaples, but I think with some experiments I can learn myself how to use it, anyway that would be bit wired setup for Pause :)Commands are documented in the help window, type a # in the command line.
>The table/chart will automatic clear when you start a new log.
OK, but I think it will be still usefull, like cleanning chart , but lesving table, or the other way, or both.
OK, clear. Java is wired/not very reliable framework. There is something happening with connections , in my setup I have UT61E to grab current and BM869s to temperature. This is requireing to add/remodve/reconnect a few times before they will work at the same time, sometim it will stick to UT61E hard that even if I remove it Current valuse will show UT61E as DC volatege , no matter that UT61E is on AC Amp range. I think that may be something close to Java framework used for communication.
Where do I add \n or is this a scope bug that I can't fix.
It is something to do with the scope. Some ideas:
1) Longer timeout, maybe the timeout is too short.
2) Because you are using ascii driver, you can do a trick: Send this command with "tx", then send another command that will answer. You are now supposed to get both answers on the same line.
Where do I add \n or is this a scope bug that I can't fix.
It is something to do with the scope. Some ideas:
1) Longer timeout, maybe the timeout is too short.
2) Because you are using ascii driver, you can do a trick: Send this command with "tx", then send another command that will answer. You are now supposed to get both answers on the same line.
;; 17:50:14.852 SDS1204XE: Tx <C1:PAVA? RMS>
;; 17:50:15.187 SDS1204XE: Rx <RMS,6.22E-01
>
;; 17:50:15.189 SDS1204XE: Tx <C2:PAVA? RMS>
;; 17:50:15.524 SDS1204XE: Rx <RMS,7.09E-01
>
;; 17:50:15.526 SDS1204XE: Tx <C1-C2:MEAD? FRR>
;; 17:50:16.541 SDS1204XE: Rx <FRR,9.21E-05>
;; 17:50:16.542 SDS1204XE: Rx after :readmath: getElement(value,1,",") <6.22E-01 RMS>
;; 17:50:16.543 SDS1204XE: Rx as numbers <0.622 0.0>
tx c63 l6C r72 20 131 0D
tx W57 R52 T54 20 131 0D 0A
tx T54 030 0D 0A
tx W57 R52 T54 20 131 0D 0A
tx M4D ?3F 0D 0A
tx T54 M4D O4F 20 131 .2E 030 0D 0A
tx R52 D44 20 #23 232 030 ,2C 131 0D 0A
rx M4D 030 0D 0A
rx (after timeout) 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 434 0D 0A
tx W57 R52 T54 20 131 0D 0A
tx M4D ?3F 0D 0A
tx R52 D44 20 #23 232 030 ,2C 131 0D 0A
rx M4D 030 0D 0A
rx (after timeout) 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 434 0D 0A
tx W57 R52 T54 20 131 0D 0A
tx M4D ?3F 0D 0A
tx R52 D44 20 #23 232 030 ,2C 131 0D 0A
rx M4D 030 0D 0A
rx (after timeout)00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 434 0D 0A
tx W57 R52 T54 20 131 0D 0A
tx M4D ?3F 0D 0A
tx R52 D44 20 #23 232 030 ,2C 131 0D 0A
rx M4D 030 0D 0A
rx (after timeout)00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 434 0D 0A
tx W57 R52 T54 20 131 0D 0A
tx M4D ?3F 0D 0A
tx R52 D44 20 #23 232 030 ,2C 131 0D 0A
rx M4D 030 0D 0A
rx (after timeout)00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 434 0D 0A
tx W57 R52 T54 20 131 0D 0A
tx M4D ?3F 0D 0A
tx R52 D44 20 #23 232 030 ,2C 131 0D 0A
rx M4D 030 0D 0A
rx (after timeout)00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 434 0D 0A
tx W57 R52 T54 20 131 0D 0A
tx M4D ?3F 0D 0A
tx R52 D44 20 #23 232 030 ,2C 131 0D 0A
rx M4D 030 0D 0A
rx (after timeout)00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 434 0D 0A
all work as it should... The only difference that i see is that using copy paste from notepad it paste a cr lftx W57 R52 T54 20 131 0D 0A
tx M4D ?3F 0D 0A
R52 D44 20 #23 232 030 ,2C 131 0D 0A
rx M4D 030 0D 0A
rx (after timeout) 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 434 0D 0A
New version, nothing changed.
Sorry, I've not included them. But i've not notice any difference from the logs of the Previous versions. I not used the zip from the site as was missing the ni gpib driver, so i'm using the last jar file
Starting
;; COM9: Set params: 19200
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; COM9: Tx: <.> 0A
;; National Instruments GPIB-232CT A:1: Tx <init>
;; National Instruments GPIB-232CT A:1: Tx <tx T0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <T0.> 54 30 0A
;; Found Solartron 7150Plus on National Instruments GPIB-232CT A:1
;; 50PLUS: Tx <mode?>
;; 50PLUS: Tx <txrx? M?>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <TMO 1.0.> 54 4D 4F 20 31 2E 30 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <M0> 4D 30
Raw: 4D 30
;; 50PLUS: Rx <M0>
txrx? m?
;; 50PLUS: Tx <txrx? m?>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <m?.> 6D 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <M0> 4D 30
Raw: 4D 30
;; 50PLUS: Rx <M0>
;; M0
txrx? m?
;; 50PLUS: Tx <txrx? m?>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <m?.> 6D 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <M0> 4D 30
Raw: 4D 30
;; 50PLUS: Rx <M0>
;; M0
txrx? m?
;; 50PLUS: Tx <txrx? m?>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <m?.> 6D 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <4> 34
Raw: 34
;; 50PLUS: Rx <4>
;; 4
txrx? m?
;; 50PLUS: Tx <txrx? m?>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <m?.> 6D 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <4> 34
Raw: 34
;; 50PLUS: Rx <4>
;; 4
txrx? m?
;; 50PLUS: Tx <txrx? m?>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <m?.> 6D 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <M0> 4D 30
Raw: 4D 30
;; 50PLUS: Rx <M0>
;; M0
Got the problem. with TMO set at 1.0 i can read values at max 1hz rate. if i do it faster, it give the problems. I've tried to send manually a tmo .1,.1 but not seem better.
I've seen the end gpib command, that must flush the buffer immediately. Can't be used to speed up things?
Starting
;; COM9: Set params: 19200
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; COM9: Tx: <.> 0A
;; National Instruments GPIB-232CT A:1: Tx <init>
;; National Instruments GPIB-232CT A:1: Tx <tx T0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <T0.> 54 30 0A
;; Found Solartron 7150Plus on National Instruments GPIB-232CT A:1
;; 50PLUS: Tx <mode?>
;; 50PLUS: Tx <txrx? M?>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <TMO 0.95.> 54 4D 4F 20 30 2E 39 35 0A
;; COM9: Tx: <EOS R,49.> 45 4F 53 20 52 2C 34 39 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <M0> 4D 30
Raw: 4D 30
;; 50PLUS: Rx <M0>
Starting
;; COM9: Set params: 19200
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; COM9: Tx: <.> 0A
;; National Instruments GPIB-232CT A:1: Tx <init>
;; National Instruments GPIB-232CT A:1: Tx <tx T0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <T0.> 54 30 0A
;; Found Solartron 7150Plus on National Instruments GPIB-232CT A:1
;; 50PLUS: Tx <mode?>
;; 50PLUS: Tx <txrx? M?>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <TMO 0.95.> 54 4D 4F 20 30 2E 39 35 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <M0> 4D 30
Raw: 4D 30
;; 50PLUS: Rx <M0>
Uhm, in the definition file i've specified
#gpibReadEol 10
but i get an
EOS R,49
;; 08:43:49.193 SDS1204XE: Tx <C1-C2:MEAD? PHA>
;; 08:43:49.586 SDS1204XE: Rx <PHA,-30.38>
;; 08:43:49.586 SDS1204XE: Tx <C1:PAVA? RMS>
;; 08:43:49.651 SDS1204XE: Rx <RMS,1.51E+00
>
;; 08:43:49.652 SDS1204XE: Tx <C2:PAVA? RMS>
;; 08:43:49.735 SDS1204XE: Rx <RMS,1.76E+00
>
;; 08:43:49.736 SDS1204XE: Rx as numbers <NaN -30.38 NaN 1.51 NaN 1.76>
HKJ,
How do I write the #askValuesMathFormat to remove the NaN. I tried getElement(value,1,",") but this did not work.
;; 08:43:49.736 SDS1204XE: Rx as numbers <NaN -30.38 NaN 1.51 NaN 1.76>
HKJ,
How do I write the #askValuesMathFormat to remove the NaN. I tried getElement(value,1,",") but this did not work.
;; 08:43:49.736 SDS1204XE: Rx as numbers <NaN -30.38 NaN 1.51 NaN 1.76>
The easiest way is to use #askValuesReadFormat instead, it is designed to handle this type of format:
#askValuesReadFormat xfxf
Will skip 1 and 3 item and return 2 and 4 item as numbers.
Starting
;; COM9: Set params: 19200
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; COM9: Tx: <.> 0A
;; National Instruments GPIB-232CT A:1: Tx <init>
;; National Instruments GPIB-232CT A:1: Tx <tx A; tx T0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <A; tx T0.> 41 3B 20 74 78 20 54 30 0A
;; Found Solartron 7150Plus on National Instruments GPIB-232CT A:1
;; 50PLUS: Tx <mode?>
;; 50PLUS: Tx <txrx? M?>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <TMO 0.95.> 54 4D 4F 20 30 2E 39 35 0A
;; COM9: Tx: <EOS R,10.> 45 4F 53 20 52 2C 31 30 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <7150+ VAC.AC> 37 31 35 30 2B 20 56 41 43 2E 41 43
Raw: 37 31 35 30 2B 20 56 41 43 2E 41 43
;; 50PLUS: Rx <7150+ VAC.AC>
Unknown mode: 7150+ VAC.AC
Known modes: M0,
I think that the TMO and EOS commands are better to be placed before the wrt for asking the mode. Starting
;; COM9: Set params: 19200
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; COM9: Tx: <.> 0A
;; National Instruments GPIB-232CT A:1: Tx <init>
;; National Instruments GPIB-232CT A:1: Tx <tx AT0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <AT0.> 41 54 30 0A
;; Found Solartron 7150Plus on National Instruments GPIB-232CT A:1
;; 50PLUS: Tx <mode?>
;; 50PLUS: Tx <txrx? M?>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <TMO 0.95.> 54 4D 4F 20 30 2E 39 35 0A
;; COM9: Tx: <EOS R,10.> 45 4F 53 20 52 2C 31 30 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <7150+ VAC.AC> 37 31 35 30 2B 20 56 41 43 2E 41 43
Raw: 37 31 35 30 2B 20 56 41 43 2E 41 43
;; 50PLUS: Rx <7150+ VAC.AC>
Unknown mode: 7150+ VAC.AC
Known modes: M0,
;; 50PLUS: Tx <values?>
;; 50PLUS: Tx <txrx? G>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
Raw: 30
;; 50PLUS: Rx <0>
;; 50PLUS: Rx as numbers <0.0>
;; 50PLUS: Tx <values?>
;; 50PLUS: Tx <txrx? G>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+.0000300 V DC> 2B 2E 30 30 30 30 33 30 30 20 20 56 20 44 43
Raw: 2B 2E 30 30 30 30 33 30 30 20 20 56 20 44 43
;; 50PLUS: Rx <+.0000300 V DC>
;; 50PLUS: Rx as numbers <3.0E-5 NaN NaN>
Starting
;; COM9: Set params: 19200
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; COM9: Tx: <.> 0A
;; National Instruments GPIB-232CT A:1: Tx <init>
;; National Instruments GPIB-232CT A:1: Tx <tx AT0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <AT0.> 41 54 30 0A
;; Found Solartron 7150Plus on National Instruments GPIB-232CT A:1
;; 50PLUS: Tx <mode?>
;; 50PLUS: Tx <txrx? M?>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <TMO 0.95.> 54 4D 4F 20 30 2E 39 35 0A
;; COM9: Tx: <EOS R,10.> 45 4F 53 20 52 2C 31 30 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <7150+ VAC.AC> 37 31 35 30 2B 20 56 41 43 2E 41 43
Raw: 37 31 35 30 2B 20 56 41 43 2E 41 43
;; 50PLUS: Rx <7150+ VAC.AC>
Unknown mode: 7150+ VAC.AC
Known modes: M0,
txrx? G
;; 50PLUS: Tx <txrx? G>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
Raw: 30
;; 50PLUS: Rx <0>
;; 0
txrx? G
;; 50PLUS: Tx <txrx? G>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+.+.0000300 V DC> 2B 2E 2B 2E 30 30 30 30 33 30 30 20 20 56 20 44 43
Raw: 2B 2E 2B 2E 30 30 30 30 33 30 30 20 20 56 20 44 43
;; 50PLUS: Rx <+.+.0000300 V DC>
;; +.+.0000300 V DC
txrx? G
;; 50PLUS: Tx <txrx? G>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
Raw: 30
;; 50PLUS: Rx <0>
;; 0
txrx? G
;; 50PLUS: Tx <txrx? G>
Flush
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+.2> 2B 2E 32
Raw: 2B 2E 32
;; 50PLUS: Rx <+.2>
;; +.2
A few comments:I think that you are referring to the try to send A (reset) and after the T0 command, to be sure to reset any previous setting set on the meter (and on exit i do the same)
With Ascii devices a ; in tx/txrx/txrx? definition is transmitted, not used to split commands. You can still use ; on the SCPI level to split commands.
The reason I do all the settings before the RD command is to support multiple devices on the same GPIB bus with different settings. The code keeps track of the actual setting and will only use a command if a setting have to be changed, i.e. with one device you will usually only see them once.With only the TMO was all ok, but after adding the EOS, the device seem to reset the M? request, and output the model (like it has not received the "M?" request)
SCPI & ASCII drivers can only handle a command and optional answer scheme, they are not designed for devices that stream values. That is the reason you have to use the T0 mode. A driver like SingleValue is designed to handle streaming devices, but cannot do any control.Yeah, do know that, was only a thing that i've noticed, when the program read in sequence it's absolutely not a problem.
The SI format (like the other formats) is only a formatter, it do not have anything to do with reading the value from the device.Yes, do know that, i've only noticed that the SI format wasn't handling the "+.0000000" format
I think that you are referring to the try to send A (reset) and after the T0 command, to be sure to reset any previous setting set on the meter (and on exit i do the same)
With only the TMO was all ok, but after adding the EOS, the device seem to reset the M? request, and output the model (like it has not received the "M?" request)
Yes, do know that, i've only noticed that the SI format wasn't handling the "+.0000000" format
Name Unit Current Minimum Maximum Range Average Slope
BM829.VoltageDC V -∞ 0 0 0 0 -
Name Unit Current Minimum Maximum Range Average Slope
BM829.VoltageDC V 9 6.17 9 2.83 8.21965 30.1767m
I'm using a Brymen BM829s. I'm getting inconsistent behavior measuring DC volts.
Am I doing something wrong with my settings or how I'm using the application, or is something else going on?
Starting
;; Start thread for: HIDv0820p0001 - Brymen BM829s
;; HIDv0820p0001: Found usb device: \\?\hid#vid_0820&pid_0001#7&2ea69c6a&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
;; Found Brymen BM829s on HIDv0820p0001
;; BM829: Tx <VALUE?>
;; BM829: Rx <>
;; BM829: Rx as numbers <NaN>
;; BM829: Tx <VALUE?>
;; BM829: Rx <>
;; BM829: Rx as numbers <NaN>
;; BM829: Tx <VALUE?>
;; BM829: Rx <>
;; BM829: Rx as numbers <NaN>
;; BM829: Tx <VALUE?>
;; BM829: Rx <-?>
;; BM829: Rx as numbers <-Infinity>
;; BM829: Tx <VALUE?>
;; BM829: Rx <-?>
;; BM829: Rx as numbers <-Infinity>
;; BM829: Tx <VALUE?>
;; BM829: Rx <-?>
;; BM829: Rx as numbers <-Infinity>
Starting
;; Start thread for: HIDv0820p0001 - Brymen BM829s
;; HIDv0820p0001: Found usb device: \\?\hid#vid_0820&pid_0001#7&2ea69c6a&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
;; Found Brymen BM829s on HIDv0820p0001
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <-?>
;; BM829: Rx as numbers <-Infinity>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
;; BM829: Tx <VALUE?>
;; BM829: Rx <9>
;; BM829: Rx as numbers <9.0>
I ran the debug mode and logged the output to a text file. While on the DCV dial setting, it starts with a few NaN and then just loops over and over with -Infinity:Code: [Select]Starting
;; BM829: Tx <VALUE?>
;; BM829: Rx <>
;; BM829: Rx as numbers <NaN>
;; BM829: Tx <VALUE?>
;; BM829: Rx <>
;; BM829: Rx as numbers <NaN>
Starting
;; COM9: Set params: 19200
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; COM9: Tx: <EOS R,10.> 45 4F 53 20 52 2C 31 30 0A
;; COM9: Tx: <.> 0A
;; National Instruments GPIB-232CT A:1: Tx <init>
;; National Instruments GPIB-232CT A:1: Tx <tx AT0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <AT0.> 41 54 30 0A
;; Found Solartron 7150Plus on National Instruments GPIB-232CT A:1
;; 50PLUS: Tx <mode?>
;; 50PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <TMO 0.95.> 54 4D 4F 20 30 2E 39 35 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <7150+ VAC.AC> 37 31 35 30 2B 20 56 41 43 2E 41 43
;; 50PLUS: Rx <7150+ VAC.AC>
Unknown mode: 7150+ VAC.AC
Known modes: M0,
;; 50PLUS: Tx <values?>
;; 50PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: timeout
;; 50PLUS: Rx <null>
;; 50PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <null>
;; 50PLUS: Rx as numbers <0.0>
;; 50PLUS: Tx <values?>
;; 50PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+14.16130 V DC> 2B 31 34 2E 31 36 31 33 30 20 20 56 20 44 43
;; 50PLUS: Rx <+14.16130 V DC>
;; 50PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <+14.16130 V DC>
;; 50PLUS: Rx as numbers <14.1613>
;; 50PLUS: Tx <values?>
;; 50PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+14.16160 V DC> 2B 31 34 2E 31 36 31 36 30 20 20 56 20 44 43
;; 50PLUS: Rx <+14.16160 V DC>
;; 50PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <+14.16160 V DC>
;; 50PLUS: Rx as numbers <14.1616>
;; 50PLUS: Tx <values?>
;; 50PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+14.16170 V DC> 2B 31 34 2E 31 36 31 37 30 20 20 56 20 44 43
;; 50PLUS: Rx <+14.16170 V DC>
;; 50PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <+14.16170 V DC>
;; 50PLUS: Rx as numbers <14.1617>
;; 50PLUS: Tx <values?>
;; 50PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+14.16170 V DC> 2B 31 34 2E 31 36 31 37 30 20 20 56 20 44 43
;; 50PLUS: Rx <+14.16170 V DC>
;; 50PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <+14.16170 V DC>
;; 50PLUS: Rx as numbers <14.1617>
;; 50PLUS: Tx <values?>
;; 50PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+14.16170 V DC> 2B 31 34 2E 31 36 31 37 30 20 20 56 20 44 43
;; 50PLUS: Rx <+14.16170 V DC>
;; 50PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <+14.16170 V DC>
;; 50PLUS: Rx as numbers <14.1617>
;; 50PLUS: Tx <values?>
;; 50PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+14.16180 V DC> 2B 31 34 2E 31 36 31 38 30 20 20 56 20 44 43
;; 50PLUS: Rx <+14.16180 V DC>
;; 50PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <+14.16180 V DC>
;; 50PLUS: Rx as numbers <14.1618>
;; 50PLUS: Tx <values?>
;; 50PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+14.16180 V DC> 2B 31 34 2E 31 36 31 38 30 20 20 56 20 44 43
;; 50PLUS: Rx <+14.16180 V DC>
;; 50PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <+14.16180 V DC>
;; 50PLUS: Rx as numbers <14.1618>
;; 50PLUS: Tx <values?>
;; 50PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+14.16190 V DC> 2B 31 34 2E 31 36 31 39 30 20 20 56 20 44 43
;; 50PLUS: Rx <+14.16190 V DC>
;; 50PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <+14.16190 V DC>
;; 50PLUS: Rx as numbers <14.1619>
;; 50PLUS: Tx <values?>
;; 50PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+14.16190 V DC> 2B 31 34 2E 31 36 31 39 30 20 20 56 20 44 43
;; 50PLUS: Rx <+14.16190 V DC>
;; 50PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <+14.16190 V DC>
;; 50PLUS: Rx as numbers <14.1619>
;; 50PLUS: Tx <values?>
;; 50PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+14.16190 V DC> 2B 31 34 2E 31 36 31 39 30 20 20 56 20 44 43
;; 50PLUS: Rx <+14.16190 V DC>
;; 50PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <+14.16190 V DC>
;; 50PLUS: Rx as numbers <14.1619>
;; 50PLUS: Tx <values?>
;; 50PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+14.16200 V DC> 2B 31 34 2E 31 36 32 30 30 20 20 56 20 44 43
;; 50PLUS: Rx <+14.16200 V DC>
;; 50PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <+14.16200 V DC>
;; 50PLUS: Rx as numbers <14.162>
#verifyDevice 7150+ Model?
#scpiCmd Model? txrx?
Starting
;; COM9: Set params: 19200
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; COM9: Tx: <EOS R,10.> 45 4F 53 20 52 2C 31 30 0A
;; COM9: Tx: <.> 0A
;; : Tx <txrx?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <.> 0A
;; COM9: Tx: <TMO 0.95.> 54 4D 4F 20 30 2E 39 35 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
;; National Instruments GPIB-232CT A:1: **Device do not match** <0>
What I notice is the missing answers (Rx <>), I will try checking tomorrow, but most likely my computer works. This means I cannot solve it (I do not want to get into low level cross platform programming).
Attached is a device file that supports the below Siglent Scopes, the only scope tested is the SDS1204X-E. The file is still a work in progress. The file is setup to log C1-C4 V RMS and C1-C4 V Pk-Pk. Please let me know if you find any issues with the file or any suggestions
Can i, in the definition, do a read of this value at init for get the model number?
UsingCode: [Select]#verifyDevice 7150+ Model?
#scpiCmd Model? txrx?
One question, i've tried "#verifyDevice 7150+ VAC.AC Model?" but it crashes, i need "7150+ VAC.AC" between '' or ""?
Sounds good, thank you.
#verifyDevice 7150+_VAC.AC Reset;Model?
#scpiCmd Reset tx A
#scpiCmd Model? txrx?
Starting
;; COM9: Set params: 19200
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; COM9: Tx: <EOS R,10.> 45 4F 53 20 52 2C 31 30 0A
;; COM9: Tx: <.> 0A
;; National Instruments GPIB-232CT A:1: Tx <SingleValue>
;; National Instruments GPIB-232CT A:1: Tx <tx T0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <T0.> 54 30 0A
;; Found Solartron 7150Plus on National Instruments GPIB-232CT A:1
;; SOL7150PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <TMO 0.95.> 54 4D 4F 20 30 2E 39 35 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+.M1> 2B 2E 4D 31
;; SOL7150PLUS: Rx <+.M1>
Unknown mode: +.M1
Known modes: M0, M1,
Starting
;; COM9: Set params: 19200
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; COM9: Tx: <EOS R,10.> 45 4F 53 20 52 2C 31 30 0A
;; COM9: Tx: <.> 0A
;; National Instruments GPIB-232CT A:1: Tx <SingleValue>
;; National Instruments GPIB-232CT A:1: Tx <tx T0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <T0.> 54 30 0A
;; Found Solartron 7150Plus on National Instruments GPIB-232CT A:1
;; SOL7150PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <TMO 0.95.> 54 4D 4F 20 30 2E 39 35 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <M0> 4D 30
;; SOL7150PLUS: Rx <M0>
;; SOL7150PLUS: Tx <tx M1>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M1.> 4D 31 0A
;; SOL7150PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <M1> 4D 31
;; SOL7150PLUS: Rx <M1>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
;; SOL7150PLUS: Rx <0>
;; SOL7150PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <0>
;; SOL7150PLUS: Rx as numbers <0.0>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
;; SOL7150PLUS: Rx <0>
;; SOL7150PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <0>
;; SOL7150PLUS: Rx as numbers <0.0>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
;; SOL7150PLUS: Rx <0>
;; SOL7150PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <0>
;; SOL7150PLUS: Rx as numbers <0.0>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+.+.0002990 V AC> 2B 2E 2B 2E 30 30 30 32 39 39 30 20 20 56 20 41 43
;; SOL7150PLUS: Rx <+.+.0002990 V AC>
;; SOL7150PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <0.0.0002990 V AC>
;; SOL7150PLUS: Rx as numbers <0.0>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+.0002990 V AC> 2B 2E 30 30 30 32 39 39 30 20 20 56 20 41 43
;; SOL7150PLUS: Rx <+.0002990 V AC>
;; SOL7150PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <0.0002990 V AC>
;; SOL7150PLUS: Rx as numbers <2.99E-4>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+.0003000 V AC> 2B 2E 30 30 30 33 30 30 30 20 20 56 20 41 43
;; SOL7150PLUS: Rx <+.0003000 V AC>
;; SOL7150PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <0.0003000 V AC>
;; SOL7150PLUS: Rx as numbers <3.0E-4>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+.0003010 V AC> 2B 2E 30 30 30 33 30 31 30 20 20 56 20 41 43
;; SOL7150PLUS: Rx <+.0003010 V AC>
;; SOL7150PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <0.0003010 V AC>
;; SOL7150PLUS: Rx as numbers <3.01E-4>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+.0003010 V AC> 2B 2E 30 30 30 33 30 31 30 20 20 56 20 41 43
;; SOL7150PLUS: Rx <+.0003010 V AC>
;; SOL7150PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <0.0003010 V AC>
;; SOL7150PLUS: Rx as numbers <3.01E-4>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
;; SOL7150PLUS: Rx <0>
;; SOL7150PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <0>
;; SOL7150PLUS: Rx as numbers <0.0>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
;; SOL7150PLUS: Rx <0>
;; SOL7150PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <0>
;; SOL7150PLUS: Rx as numbers <0.0>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+.0003010 V AC> 2B 2E 30 30 30 33 30 31 30 20 20 56 20 41 43
;; SOL7150PLUS: Rx <+.0003010 V AC>
;; SOL7150PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <0.0003010 V AC>
;; SOL7150PLUS: Rx as numbers <3.01E-4>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+.0003000 V AC> 2B 2E 30 30 30 33 30 30 30 20 20 56 20 41 43
;; SOL7150PLUS: Rx <+.0003000 V AC>
;; SOL7150PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <0.0003000 V AC>
;; SOL7150PLUS: Rx as numbers <3.0E-4>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+.0003000 V AC> 2B 2E 30 30 30 33 30 30 30 20 20 56 20 41 43
;; SOL7150PLUS: Rx <+.0003000 V AC>
;; SOL7150PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <0.0003000 V AC>
;; SOL7150PLUS: Rx as numbers <3.0E-4>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+.0003010 V AC> 2B 2E 30 30 30 33 30 31 30 20 20 56 20 41 43
;; SOL7150PLUS: Rx <+.0003010 V AC>
;; SOL7150PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <0.0003010 V AC>
;; SOL7150PLUS: Rx as numbers <3.01E-4>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+.0002980 V AC> 2B 2E 30 30 30 32 39 38 30 20 20 56 20 41 43
;; SOL7150PLUS: Rx <+.0002980 V AC>
;; SOL7150PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <0.0002980 V AC>
;; SOL7150PLUS: Rx as numbers <2.98E-4>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+.0002990 V AC> 2B 2E 30 30 30 32 39 39 30 20 20 56 20 41 43
;; SOL7150PLUS: Rx <+.0002990 V AC>
;; SOL7150PLUS: Rx after :readmath: replace(replace(value,"+.","0."),"-.","-0."); <0.0002990 V AC>
;; SOL7150PLUS: Rx as numbers <2.99E-4>
#askValues txrx? G
#askValuesReadFormat u
#askValuesMathFormat replace(replace(value,"+.","0."),"-.","-0.");
Seem that i can't switch from remote to local. In remote it goes as soon as the meter receive a GPIB command, but at disconnect i can only do a reset (or manually press the local button on the front panel. Seem that there is a GTL command to do that, but doing a "tx GTL" does nothing. I think that is a command at GPIB level.
Then, while in VDC i can always get a coorect value, every sample taken,in VAC sometimes the meter return nothing.
You cannot do commands to the GPIB interface, the idea is the different GPIB interfaces all works with the same device definition (There will probably be a few exceptions) and also that the same device definitions can handle multiple interfaces on the same device.And adding an option on the gpib setup window to send the commands REN and GTL to the gpib address so that can be done separately for every device?
You may need a longer timeout value (It is called #readingDelay).I'll try it, thanks!
You may also want to play with #cmdSetup, that way you can change range and mode of the meter.Ok, i'll do it
I was convinced I had checked the BM829 multiple times, but the segment definitions was wrong, it works now.
The "#readingDelay" seem to not do nothing, i've tried values from 1 to 10000, and nothing change.
I was playing with cmdsetup, using as template one made by Mikelud... :scared: :scared: Really complex! First it's better that i get all modes working.
I was searching on the other definitions but i've not found, how to apply a math only to one mode (the meters return kohm, and i want to multiply by 1000 for have ohm).
On the other driver i used the SI decoding (in the protek) and the testcontroller was handling it ok.
I will have to think a bit about this, the software do not have an easy to way to apply scale factors to some modes. Depending on parser used for the value it may handle a trailing k as a factor 1000.
#cmdSetup button Range_AUTO VDC
:write: R0
#cmdSetup comboboxHot Range VDC
:write: #
:read: Range?
200mV R01
2V R02
20V R03
200V R04
2000V R05
:updatemodechange:
As i can't find another way to do it.Sent from the combobox change:
;; SOL7150PLUS: Tx <R02>
;; SOL7150PLUS: Tx <Range?>
;; SOL7150PLUS: Tx <txrx? R?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <R?.> 52 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <R01> 52 30 31
;; SOL7150PLUS: Rx <R01>
Sent manually:
tx R02
;; SOL7150PLUS: Tx <tx R02>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <R02.> 52 30 32 0A
txrx? R?
;; SOL7150PLUS: Tx <txrx? R?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <R?.> 52 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <R02> 52 30 32
;; SOL7150PLUS: Rx <R02>
;; R02
Why it has not sent the R02 code?Sorry but in #value command, the "data type" isn't related to the format of the input string?
And, i've seen that the d type have only 6 decimal digits, but my meter can output also 7 digits...
In any case, now, when the meter output the 7 number after decimal point, isn't recognized as a valid number anymore.
#askValues txrx? G
#askValuesReadFormat s
#askValuesMathFormat replace(replace(replace(value,"+.","0."),"-.","-0.")," ","");
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+0.000340 KOHM> 2B 30 2E 30 30 30 33 34 30 20 20 4B 4F 48 4D
;; SOL7150PLUS: Rx <+0.000340 KOHM>
;; SOL7150PLUS: Rx after :readmath: replace(replace(replace(value,"+.","0."),"-.","-0.")," ",""); <+0.000340KOHM>
;; SOL7150PLUS: Rx as numbers <NaN>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <+.0000290 V DC> 2B 2E 30 30 30 30 32 39 30 20 20 56 20 44 43
;; SOL7150PLUS: Rx <+.0000290 V DC>
;; SOL7150PLUS: Rx after :readmath: replace(replace(replace(value,"+.","0."),"-.","-0.")," ",""); <0.0000290VDC>
;; SOL7150PLUS: Rx as numbers <NaN>
;; SOL7150PLUS: Tx <txrx? G>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <G.> 47 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
;; SOL7150PLUS: Rx <0>
;; SOL7150PLUS: Rx after :readmath: replace(replace(replace(value,"+.","0."),"-.","-0.")," ",""); <0>
;; SOL7150PLUS: Rx as numbers <0.0>
Tried to increase the #gpibWriteReadDelay up to 1000 without success.w77 r72 t74 20 131 0D
g67 0D
r72 d64 20 #23 232 030 ,2C 131 0D
+2B .2E 030 030 030 030 333 030 838 20 20 V56 20 D44 C43 0D 0A
00 00 00 131 737 0D 0A
;Mode-------------------------------------------------------------------------------------------
#cmdSetup info ActiveMode
:read: Mode?
:readmath: getElement("VDC;VAC;OHM",listIndex(unQuote(value),"M0 M1 M2"," "),";")
:updatemodechange:
;VDC-------------------------------------------------------------------------------------
#cmdSetup comboboxHot Range VDC
:write: tx #
:read: Range?
:enable: ActiveMode=="VDC"
AUTO R0
200mV R01
2V R02
20V R03
200V R04
2000V R05
:updatemodechange:
Exception in thread "AWT-EventQueue-0" dk.hkj.script.ProgramExceptions$UnknownException: Variable not found ActiveMode
ActiveMode==____<----____"VDC"
#idString SOLARTRON,7150PLUS,
#name Solartron 7150Plus
#handle SOL7150PLUS
#driver Ascii
#port GPIB
#gpibReadCount 20
#gpibReadEol 10
;#gpibReadEol eoi
#gpibWriteReadDelay 500
;#verifyDevice 7150+_VAC.AC Reset;Model?
;#scpiCmd Reset tx A
;#scpiCmd Model? txrx?
; A list of possible column name with unit and formatter (SI, Time, Int, D0..D6)
#value VoltageDC V si VDC
#value VoltageAC V si VAC
#value Resistance ohm si OHM
#initCmd SingleValue
;#scpiCmd RemoteEnable tx REN
#scpiCmd SingleValue tx T0
#finalCmd tx T1
#interfaceType DMM BMM
#interface readValue 0
#cmdModeLayout 3 5
#cmdMode VDC M0
tx M0
#cmdMode VAC M1
tx M1
#cmdMode OHM M2
tx M2
;Mode-------------------------------------------------------------------------------------------
#cmdSetup info ActiveMode
:read: Mode?
:readmath: getElement("VDC;VAC;OHM",listIndex(unQuote(value),"M0 M1 M2"," "),";")
:updatemodechange:
;VDC-------------------------------------------------------------------------------------
#cmdSetup comboboxHot Range VDC
:write: tx #
:read: Range?
;:enable: inList(ActiveMode,"VDC");
AUTO R0
200mV R01
2V R02
20V R03
200V R04
2000V R05
:updatemodechange:
#cmdSetup comboboxHot Integration_Time VDC
:write: tx #
:read: txrx? I?
6.66ms(3x9's) I0
40.0ms(4x9's,50Hz) I1
50.0ms(4x9's,60Hz) I2
100ms(4x9's) I6
400ms(5x9's) I3
10x400ms(6x9's) I4
:updatemodechange:
;VAC-------------------------------------------------------------------------------------
#cmdSetup comboboxHot Range VAC
:write: tx #
:read: Range?
AUTO R0
200mV R01
2V R02
20V R03
200V R04
2000V R05
:updatemodechange:
#cmdSetup comboboxHot Integration_Time VAC
:write: tx #
:read: txrx? I?
6.66ms(3x9's) I0
40.0ms(4x9's,50Hz) I1
50.0ms(4x9's,60Hz) I2
100ms(4x9's) I6
400ms(5x9's) I3
:updatemodechange:
;OHM-------------------------------------------------------------------------------------
#cmdSetup comboboxHot Range OHM
:write: tx #
:read: Range?
AUTO R0
20KOhm R03
200KOhm R04
2Mohm R05
20Mohm R06
:updatemodechange:
#cmdSetup comboboxHot Integration_Time OHM
:write: tx #
:read: txrx? I?
6.66ms(3x9's) I0
40.0ms(4x9's,50Hz) I1
50.0ms(4x9's,60Hz) I2
100ms(4x9's) I6
400ms(5x9's) I3
10x400ms(6x9's) I4
:updatemodechange:
#askMode Mode?
#scpiCmd Mode? txrx? M?
#scpiCmd Range? txrx? R?
#askValues txrx? G
#askValuesReadFormat s
#askValuesMathFormat replace(replace(replace(value,"+.","0."),"-.","-0.")," ","");
The strings "+0.000340KOHM" and "0.0000290VDC" seem correct. Tried also to remove the DC and OHM part without success
One more question, how i can enable (or made visible) a control only based on the selected mode?
One more question, how i can enable (or made visible) a control only based on the selected mode?
#cmdSetup selector Mode_settings
:read: Mode?
:updatemodechange:
M0 VDC.
M1 VAC.
M2 OHM.
masterx81It did exactly what i was trying to do :-+ :-+ Thanks!
You can try the belowCode: [Select]#cmdSetup selector Mode_settings
:read: Mode?
:updatemodechange:
M0 VDC.
M1 VAC.
M2 OHM.
The parser duo not know what ohm or vdc is, it only knows "k" and it must be a lower case kMissed that was case sensitive |O
That was the reason for the way I wrote this:
#askValuesMathFormat replace(replace(replace(value,"+.","0."),"-.","-0.")," KOHM","k ohm");
You use the selector control: #cmdSetup selector Mode_settingsYes, done!
It is used at the bottom of the Keysight344xxA and SiglentSDM30xxx definitions.
#cmdSetup buttonsOn Null
:read: txrx? Z?
:write: tx #
:tip: Set or Cancel Null
:string:
Cancel Z0
Set Z1
;; COM9: Set params: 19200
;; Start thread for: National Instruments GPIB-232CT A:1 - Solartron 7150Plus
;; COM9: Tx: <EOS R,10.> 45 4F 53 20 52 2C 31 30 0A
;; COM9: Tx: <.> 0A
;; National Instruments GPIB-232CT A:1: Tx <SingleValue>
;; National Instruments GPIB-232CT A:1: Tx <tx T0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <T0.> 54 30 0A
;; Found Solartron 7150Plus on National Instruments GPIB-232CT A:1
;; SOL7150PLUS: Tx <Mode?>
;; SOL7150PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <TMO 0.95.> 54 4D 4F 20 30 2E 39 35 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <M0> 4D 30
;; SOL7150PLUS: Rx <M0>
;; SOL7150PLUS: Tx <Mode?>
;; SOL7150PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <M0> 4D 30
;; SOL7150PLUS: Rx <M0>
;; SOL7150PLUS: Rx after :readmath: getElement("VDC;VAC;OHM",listIndex(unQuote(value),"M0 M1 M2"," "),";") <VDC>
;; SOL7150PLUS: Cache Tx: <Mode?> Rx: <M0>
;; SOL7150PLUS: Tx <Range?>
;; SOL7150PLUS: Tx <txrx? R?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <R?.> 52 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <R11> 52 31 31
;; SOL7150PLUS: Rx <R11>
;; SOL7150PLUS: Tx <txrx? I?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <I?.> 49 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <I3> 49 33
;; SOL7150PLUS: Rx <I3>
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <Z0> 5A 30
;; SOL7150PLUS: Rx <Z0>
;; SOL7150PLUS: Tx <tx M1>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M1.> 4D 31 0A
;; SOL7150PLUS: Tx <Mode?>
;; SOL7150PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <M1> 4D 31
;; SOL7150PLUS: Rx <M1>
;; SOL7150PLUS: Rx after :readmath: getElement("VDC;VAC;OHM",listIndex(unQuote(value),"M0 M1 M2"," "),";") <VAC>
;; SOL7150PLUS: Cache Tx: <Mode?> Rx: <M1>
;; SOL7150PLUS: Tx <Range?>
;; SOL7150PLUS: Tx <txrx? R?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <R?.> 52 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <R11> 52 31 31
;; SOL7150PLUS: Rx <R11>
;; SOL7150PLUS: Tx <txrx? I?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <I?.> 49 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <I3> 49 33
;; SOL7150PLUS: Rx <I3>
;; SOL7150PLUS: Cache Tx: <Mode?> Rx: <M1>
;; SOL7150PLUS: Tx <tx M0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M0.> 4D 30 0A
;; SOL7150PLUS: Tx <Mode?>
;; SOL7150PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <M0> 4D 30
;; SOL7150PLUS: Rx <M0>
;; SOL7150PLUS: Rx after :readmath: getElement("VDC;VAC;OHM",listIndex(unQuote(value),"M0 M1 M2"," "),";") <VDC>
;; SOL7150PLUS: Cache Tx: <Mode?> Rx: <M0>
;; SOL7150PLUS: Tx <Range?>
;; SOL7150PLUS: Tx <txrx? R?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <R?.> 52 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <R11> 52 31 31
;; SOL7150PLUS: Rx <R11>
;; SOL7150PLUS: Tx <txrx? I?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <I?.> 49 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <I3> 49 33
;; SOL7150PLUS: Rx <I3>
;; SOL7150PLUS: Cache Tx: <Mode?> Rx: <M0>
;; SOL7150PLUS: Tx <tx Z0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z0.> 5A 30 0A
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <Z0> 5A 30
;; SOL7150PLUS: Rx <Z0>
;; SOL7150PLUS: Tx <tx Z1>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z1.> 5A 31 0A
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
;; SOL7150PLUS: Rx <0>
---First Timeout, sending Z1
;; SOL7150PLUS: Tx <tx Z1>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z1.> 5A 31 0A
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: timeout
;; SOL7150PLUS: Rx <null>
;; SOL7150PLUS: Tx <tx Z1>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z1.> 5A 31 0A
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
;; SOL7150PLUS: Rx <0>
;; SOL7150PLUS: Tx <tx Z0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z0.> 5A 30 0A
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
;; SOL7150PLUS: Rx <0>
;; SOL7150PLUS: Tx <tx Z0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z0.> 5A 30 0A
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
;; SOL7150PLUS: Rx <0>
;; SOL7150PLUS: Tx <tx Z0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z0.> 5A 30 0A
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
----Unblocked itself, return previous buffer + new one.
;; COM9: Rx: <Z1Z0> 5A 31 5A 30
;; SOL7150PLUS: Rx <Z1Z0>
;; SOL7150PLUS: Tx <tx Z0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z0.> 5A 30 0A
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <Z0> 5A 30
;; SOL7150PLUS: Rx <Z0>
;; SOL7150PLUS: Tx <Mode?>
;; SOL7150PLUS: Tx <txrx? M?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <M?.> 4D 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <M0> 4D 30
;; SOL7150PLUS: Rx <M0>
;; SOL7150PLUS: Rx after :readmath: getElement("VDC;VAC;OHM",listIndex(unQuote(value),"M0 M1 M2"," "),";") <VDC>
;; SOL7150PLUS: Cache Tx: <Mode?> Rx: <M0>
;; SOL7150PLUS: Tx <Range?>
;; SOL7150PLUS: Tx <txrx? R?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <R?.> 52 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <R15> 52 31 35
;; SOL7150PLUS: Rx <R15>
;; SOL7150PLUS: Tx <txrx? I?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <I?.> 49 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <I3> 49 33
;; SOL7150PLUS: Rx <I3>
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <Z0> 5A 30
;; SOL7150PLUS: Rx <Z0>
;; SOL7150PLUS: Tx <tx Z0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z0.> 5A 30 0A
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <Z0> 5A 30
;; SOL7150PLUS: Rx <Z0>
----I force a Z1:
;; SOL7150PLUS: Tx <tx Z1>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z1.> 5A 31 0A
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
---And also this time problem with the answer
;; COM9: Rx: <0> 30
;; SOL7150PLUS: Rx <0>
;; SOL7150PLUS: Tx <tx Z0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z0.> 5A 30 0A
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: timeout
;; SOL7150PLUS: Rx <null>
;; SOL7150PLUS: Tx <tx Z0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z0.> 5A 30 0A
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
;; SOL7150PLUS: Rx <0>
;; SOL7150PLUS: Tx <tx Z0>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z0.> 5A 30 0A
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
;; SOL7150PLUS: Rx <0>
---I send manually the txrx? z?, and it work and "unblock"
txrx? z?
;; SOL7150PLUS: Tx <txrx? z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <z?.> 7A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <Z1Z1> 5A 31 5A 31
;; SOL7150PLUS: Rx <Z1Z1>
;; Z1Z1
I was playing for try to figure out what cause the timeout in 6.5digit mode, and i've noticed that the #readingDelay with gpib NI pause the read after the RD command. Would'nt be more correct to do the pause before sending the rd command?
Another one:
I'm playing with the null command (for zeroing any offset), the Z command.
I've tried with:
#gpibWriteReadDelay 1000
#readingDelay 1
But it's always the same.
The #readingDelay is a maximum time, this means if the answer arrives before the specified time, the processing will continue. To do that is must be where the software waits for the answer.Ok, so in case of the NI gpib interface isn't much useful, as i need some time between the wrt and the rd.
#gpibWriteReadDelay is always added, i.e. even if the device answers faster it will wait the specified delay.
I would expect it is a timeout because the meter needs some time to do the zeroing, try adding a wait after the command:Nice! In this way i can set a pause only for specific commands, and leave the other commands that answer fast untouched!
:write: tx #;[3000]
The #readingDelay is a maximum time, this means if the answer arrives before the specified time, the processing will continue. To do that is must be where the software waits for the answer.Ok, so in case of the NI gpib interface isn't much useful, as i need some time between the wrt and the rd.
#gpibWriteReadDelay is always added, i.e. even if the device answers faster it will wait the specified delay.
I would expect it is a timeout because the meter needs some time to do the zeroing, try adding a wait after the command:set the 3000ms pause, it pause correctly after the write, but the command go in timeout. If i send it manually, it works:
:write: tx #;[3000]
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <Z0> 5A 30
;; SOL7150PLUS: Rx <Z0>
;; SOL7150PLUS: Tx <tx Z1>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z1.> 5A 31 0A
;; SOL7150PLUS: Delay: 3000ms
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
;; SOL7150PLUS: Rx <0>
;; SOL7150PLUS: Tx <tx Z1>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z1.> 5A 31 0A
;; SOL7150PLUS: Delay: 3000ms
;; SOL7150PLUS: Tx <txrx? Z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <Z?.> 5A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <0> 30
;; SOL7150PLUS: Rx <0>
txrx? z?
;; SOL7150PLUS: Tx <txrx? z?>
;; COM9: Tx: <WRT 1.> 57 52 54 20 31 0A
;; COM9: Tx: <z?.> 7A 3F 0A
;; COM9: Tx: <RD #20,1.> 52 44 20 23 32 30 2C 31 0A
;; COM9: Rx: <Z1> 5A 31
;; SOL7150PLUS: Rx <Z1>
;; Z1
set the 3000ms pause, it pause correctly after the write, but the command go in timeout. If i send it manually, it works:
For the 6.5 digit mode, or in general, it's possible that, if after a request i get a 0byte answer, redo the read (rd command) until i get a value?I could add a command to do that, but is it really necessary?
Attached is a device file that supports the below Siglent Scopes, the only scope tested is the SDS1204X-E. The file is still a work in progress. The file is setup to log C1-C4 V RMS and C1-C4 V Pk-Pk. Please let me know if you find any issues with the file or any suggestions
Siglent SDS1052A, Siglent SDS1052DL+, Siglent SDS1072A, Siglent SDS1072CFL, Siglent SDS1072X-E, Siglent SDS1074CFL, Siglent SDS1074X-E, Siglent SDS1102A, Siglent SDS1102CFL, Siglent SDS1102CML+, Siglent SDS1102X, Siglent SDS1102X+, Siglent SDS1102X-C, Siglent SDS1102X-E, Siglent SDS1104CFL, Siglent SDS1104X-C, Siglent SDS1104X-E, Siglent SDS1122E+, Siglent SDS1152A, Siglent SDS1152CML+, Siglent SDS1202CFL, Siglent SDS1202F+, Siglent SDS1202X, Siglent SDS1202X+, Siglent SDS1202X-C, Siglent SDS1202X-E, Siglent SDS1204CFL, Siglent SDS1204X-C, Siglent SDS1204X-E, Siglent SDS1302CFL, Siglent SDS1304CFL, Siglent SDS2072, Siglent SDS2072X, Siglent SDS2074, Siglent SDS2074X, Siglent SDS2102, Siglent SDS2102X, Siglent SDS2102X-E, Siglent SDS2104, Siglent SDS2104X, Siglent SDS2202, Siglent SDS2202X, Siglent SDS2202X-E, Siglent SDS2204, Siglent SDS2204X, Siglent SDS2302, Siglent SDS2302X, Siglent SDS2304, Siglent SDS2304X, Siglent SDS2352X-E
(Attachment Link)
Wouldn't it be possible to allow a more generic definition for a range of equipments in one setting only? Instead of having to define them to allow all BW model definitions. Something with generic chars (ex.: ** or xx).
V0.94 is up
It has some improvement to charting and scales as shown above:
Option for SI prefixes on chart scales
Option for logarithmic chart scales
Settings for chart overload handling
I just tried using the SI prefixes and logarithmic chart scales, when both are checked the SI does not work see below. Si work without logarithmic.
I just tried using the SI prefixes and logarithmic chart scales, when both are checked the SI does not work see below. Si work without logarithmic.
Strange, as you can see above it worked fine for me.
Can you post the CSV file of your data, I would like to try with the same data.
See attached.
1. When using the #remove tag to remove the last section in the device file the device file will not load
2. #replacetext does not work with #askValuesReadFormat, it does work with #askValues
Recently discovered this program which is just about the PERFECT thing for my networked hardware in the loop testing and general debugging rack. Only instruments I'd like to see added are the Korad KA3005P type power supplies and the Kunkin KP184 programmable load. Took a crack at adding the Korad since I have that on hand to no avail, not 100% sure what I'm doing wrong yet
There are a couple of issues. First, this device is not SCPI but Telnet ascii based. That means that TestController doesn't get an answer to the *IDN? query and I can't use #metadef statements to customize the result. The main issue is that AKD2G devices come as single motor or dual motor capable.
Good idea to at least have a simple interface popup. I am trying to create a simple ON/OFF interface but I am stuck. The device indicates status with AXIS1.ACTIVE, you turn it on with AXIS1.EN and you turn it off with AXIS.DIS. I thought to use control buttonOn but I can't see a way to use one command for the ON button and a different command for the OFF button. Any suggsetions?
#cmdSetup buttonsOn Output
:read: AXIS1.ACTIVE?
:readmath: getElement("AXIS1.DIS AXIS1.EN",value)
:write: txrx #
:tip: Disable (Off) or Enable (On)
:color: (0,255,0)
:updatealloff:
Off AXIS1.DIS
On AXIS1.EN
Starting
;; Start thread for: 192.168.1.178 - Kollmorgen AKD2G Servo
;; Found Kollmorgen AKD2G Servo on 192.168.1.178
;; AKD2G: Tx <AXIS1.ACTIVE?>
;; AKD2G: Tx <txrx? AXIS1.ACTIVE>
;; 192.168.1.178: Tx: <AXIS1.ACTIVE..> 41 58 49 53 31 2E 41 43 54 49 56 45 0D 0A
;; 192.168.1.178: Rx: <0> 30 0D
;; AKD2G: Rx <0>
;; AKD2G: Rx after :readmath: getElement("AXIS1.DIS AXIS1.EN",value) <AXIS1.DIS>
;; AKD2G: Rx as number <NaN>
If I do the exact same sequence but have the output already On the result is the same except the :read: gives "1" back which selects "AXIS1.DIS". Even though the read state is opposite the other the indicator light is still on.Starting
;; Start thread for: 192.168.1.178 - Kollmorgen AKD2G Servo
;; Found Kollmorgen AKD2G Servo on 192.168.1.178
;; AKD2G: Tx <AXIS1.ACTIVE?>
;; AKD2G: Tx <txrx? AXIS1.ACTIVE>
;; 192.168.1.178: Tx: <AXIS1.ACTIVE..> 41 58 49 53 31 2E 41 43 54 49 56 45 0D 0A
;; 192.168.1.178: Rx: <1> 31 0D
;; AKD2G: Rx <1>
;; AKD2G: Rx after :readmath: getElement("AXIS1.DIS AXIS1.EN",value) <AXIS1.EN>
;; AKD2G: Rx as number <NaN>
So, what is used to decide the indicator light being on/off? Or, better yet, how to make it work?
#cmdSetup buttonsOn Axis_1_Enable
:read: AXIS1.ACTIVE?
:write: txrx #
:tip: Disable (Off) or Enable (On)
:color: (0,255,0)
:updatealloff:
Off AXIS1.DIS
On AXIS1.EN
Starting
;; Start thread for: 192.168.1.178 - Kollmorgen AKD2G Servo
;; Found Kollmorgen AKD2G Servo on 192.168.1.178
;; AKD2G: Tx <AXIS1.ACTIVE?>
;; AKD2G: Tx <txrx? AXIS1.ACTIVE>
;; 192.168.1.178: Tx: <AXIS1.ACTIVE..> 41 58 49 53 31 2E 41 43 54 49 56 45 0D 0A
;; 192.168.1.178: Rx: <1> 31 0D
;; AKD2G: Rx <1>
;; AKD2G: Rx as number <1.0>
Note that the last debug line now shows 1.0 instead of just 1 with the readmath line. Based on the web site doc saying "indicator, it will be on if the read value matches second parameter line" I tried the last two lines at 0.0 AXIS1.DIS and 1.0 AXIS1.EN. Same thing buttonsOn indicator always off.So far nothing I have tried has the buttonsOn indicator changing. So, what am I missing?? :scared:
#cmdSetup buttonsOn Axis1_Enable
:string:
:read: AXIS1.ACTIVE?
:readmath: getElement("AXIS1.DIS AXIS1.EN",value)
:write: txrx #
:tip: Disable (Off) or Enable (On)
:color: (0,255,0)
:updatedelayed: 0.1
:updatealloff:
Off AXIS1.DIS
On AXIS1.EN
HKJ,
I am following your suggestion to use #verifyDevice given this device does not accept *IDN?. I can get it to work inserting an exact string in for value for a specific model device. However, there are multiple model numbers that need to match. So, I tried putting expressions in for #verifyDevice value and adding :readmath: after the #verifyDevice line. All these tries led to Java null pointer errors.
Is it possible to use #verifyDevice with an expression manipulating the returned value from the command such as match(<returned value>,regEx)?
The only problem I had was all kinds of Java exceptions when using the :readmath: match(value,regEx). Whatever regEx I put there just did not work. Then I tried putting the regEx in quotes and that worked fine. You might want to update the doc for the match(value,regEx) string function to mention using ""'s or have an example like what I ended up with:
I will be working some more tomorrow, over the weekend. I have plenty to do without an updated version and new features. But, if it is ready I can start taking a look at it.
Is it cross platform?
It sounds like you've put a lot of effort into this! I can't even imagine how to do something like you've accomplished. At my school we can use visual studio. Do you use that?
Have you changed something with the USBHID within 0.96?
When using my Brymen 867 (haven't checked my Elma 829s so far) it is not recognized with version 0.96 anymore.
However, versions 0.94 and 0.95 are still fine?!
Have you changed something with the USBHID within 0.96?
When using my Brymen 867 (haven't checked my Elma 829s so far) it is not recognized with version 0.96 anymore.
My Win7 is always offline, having no network connection at all, but TestController always shows "New Version", when using it? Is there a way to change it?
After trying a bunch of variants on the file I cannot get it to even get a hello from the Korad power supply :|
#idString Kollmorgen,AKD1G,Modbus
#name Kollmorgen AKD1G Servo
#handle AKD1GModbus
#port 502
#driver Modbus
Using Version 0.97 the result when trying to connect is just Java runtime errors.Starting
Exception in thread "Thread-2" java.lang.ClassCastException: dk.hkj.comm.SocketInterface cannot be cast to dk.hkj.comm.SerialInterface
at dk.hkj.devices.DeviceModbus.getCommInterface(DeviceModbus.java:496)
at dk.hkj.main.InterfaceThreads$DeviceThread.<init>(InterfaceThreads.java:899)
at dk.hkj.main.InterfaceThreads$ScanPorts.addDevicesSocket(InterfaceThreads.java:500)
at dk.hkj.main.InterfaceThreads$ScanPorts.run(InterfaceThreads.java:613)
Does TestController support Modbus over TCP? If it does what is a proper header definition?
If it doesn't, then how hard would it be to support Modbus TCP?
Ah, not having a device to test with does make development hard. If you want to try I could be your test case.
I also have one question for the triggering modes: The onCommand is designed to control logging from a script, but they could also be controlled from a popupWindow, do anybody see any usage for that? (I.e. starting/stopping logging from a small popup window, it will add to the same table).
What would be a nice to have if you can make the scripts as a device file like the VirtualxxxxxGenerators, we can then make a button to do the triggers manually.
Also one of the new versions broke the RD60xx device file, attached is the fix.
Please specify what the problem is, I had to compare files to find the change.
I wonder. I had a problem that I did not set the baudrate in some cases, could that be the issue and it now works at 115200.
Please check.
#scpiCmd MN? holding? 0x80
:setvar: MNS=int(value)
Just a question @ HKJ:
TestController vs. Clamp Meter with Linux-Capability?
As the "Keysight Handheld Clamp Meter Series U1210" has the same pc connectivity, e.g. IR to USB U1173B, as the Keysight DMMs, would it be the easiest manufacturer being able to integrate into TestController...or are there other/better solutions already ready to use?
Just a little brainstorming as far as Clamp Meters are concerned - this time no matter if Linux is usable...
As Brymen is cheaper and offers quite a variety of well equipped Clamp Meters (unfortunately with two different USB-Interfaces BRUA-19X & BRUA-13X), I would like to know, whether your USBHID-Driver immediately/mainly includes those Brymen Clamp Meters or do you also have to invest time and brain in order to adjust/renew the USBHID-Driver(s)?
V0.98 is up
This version is about triggers.
Added triggers to logging, can be used from script, manually or check sample values.
Sometimes setup popup was not filled with values, this is fixed.
Increased readout speed when not logging and devices delivers data fast.
That is nice :clap: I kinldy sugets to add interface to Octave and Python in math and add Arduino firmata as measuring device. That would open completely new world for this program.
Absolutely delighted to see this extremely useful operating mode. :-+
Added a analog scale, it is called "Adjust scale" and is designed to help when doing adjustments.
With all this rapid progress you are dangerously close to a V1.0 release :clap:
Absolutely delighted to see this extremely useful operating mode. :-+
Found a minor quirk. See pic.
And a second one
@ HKJ: As you post your pix directly into the message, not at the bottom as an attachement, do you use your own/external file/picture hoster or do you use the forum integration for uploading pictures?
Currently only real instruments can be selected for "Adjust scale".
Would it be too difficult to include the math channels? :phew:
There is bug in COM port, once you will start your Java first all COM ports are locked.
If you willl start the other way, first the other software than your program all works as expected, but not the other way.
Just learned that the same with HID devices, tested with BM869s.
There is bug in COM port, once you will start your Java first all COM ports are locked.
If you willl start the other way, first the other software than your program all works as expected, but not the other way.
Only if "Scan serial ports" are checked or you have enabled a device on that port.
It is fixed in next release.Just learned that the same with HID devices, tested with BM869s.
With USBHID I only open one device. The above fix may also help here if you have selected a wrong Brymen meter.
Maybe - if not too difficult - you would like to follow these general rules in your prog. Depending if and how you implement this, I will correct the popup for my HMC 8043 with respect to this aspect.
Moreover, in some places you use "sec" as the unit for seconds whereas it should be "s".
Could you use the Adjust scale min/max for anything?Have so far not found a use case for this. And can't imagine anything for it either.
Could you use the Adjust scale min/max for anything?Have so far not found a use case for this. And can't imagine anything for it either.
Maybe someone else has an idea here.
Being fan of decibels I'd prefer to see in "Adjust scale"
for example instead of 600m 0.6 and so on. But that's only a very minor point
you should, in my opinion, not waste too much time to change this.
Love the autoranging when leaving the in-tolerance range. :-+
;Nested loops test
=var n=1
=var p=1
#while (n<10)
=n=n+1
=p=1
#while (p<10)
=p=p+1
#endwhile
#endwhile
Is there a way to write a TestController script with nested loops? If not, would that be an easy feature to add?
=var n=1
=var p=1
#while (n<10)
=p=p+1
#if (p>=10)
=n=n+1
=p=1
#endif
#endwhile
=var n=1
=var p=1
=p=1
#if (p<=10)
=p=p+1
#delay 1
#endif
I get the following output from the console. Note that even though logging is off that TestController is polling the device once to get the #askValues data values. With longer test scripts I see this polling happening regularly. To be clear, logging was never turned on. Without turning on logging and just running a script why does TestController poll the device?=var n=1
=var p=1
=p=1
#if (p<=10)
;; AKD1G: Tx <Drv.Flt?>
;; AKD1G: Tx <txrx? DRV.FAULTS>
;; 192.168.1.173: Tx: <DRV.FAULTS..> 44 52 56 2E 46 41 55 4C 54 53 0D 0A
;; 192.168.1.173: Rx: <No faults active> 4E 6F 20 66 61 75 6C 74 73 20 61 63 74 69 76 65 0D
;; AKD1G: Rx <0>
;; AKD1G: Tx <FB1.REGRDSineOffset?>
;; AKD1G: Tx <txrx? FB1.REG 2>
;; 192.168.1.173: Tx: <FB1.REG 2..> 46 42 31 2E 52 45 47 20 32 0D 0A
;; 192.168.1.173: Rx: <184> 31 38 34 0D
;; AKD1G: Rx <184>
;; AKD1G: Tx <FB1.REGFtLow?>
;; AKD1G: Tx <txrx? FB1.REG 27>
;; 192.168.1.173: Tx: <FB1.REG 27..> 46 42 31 2E 52 45 47 20 32 37 0D 0A
;; 192.168.1.173: Rx: <62> 36 32 0D
;; AKD1G: Rx <62>
;; AKD1G: Rx as numbers <0.0 184.0 62.0>
=p=p+1
#delay 1
#endif
Using #if, #endif with the #while, #endwhile to indirectly do nested loop iteration is tricky. I have to think further about how to use that idea to do what is needed...so far I haven't been able to get it to do what is needed. But, I continue working on it.
With longer test scripts I see this polling happening regularly. To be clear, logging was never turned on. Without turning on logging and just running a script why does TestController poll the device?
Last question. What are legal values for the #delay command? When I try #delay integer values or 0.5 or 0.1 in the above test code things work. When I try #delay 0.51 or 0.01 the script runs forever and I have to use the Abort button. When stuck/not finishing the debug window showed no errors. I know that 0.01 sec resolution is probably not needed but it seems like a bug for the script to freeze with no error message.
Im fairly new into this but I would like to test the capacity of the battery pack (36v) for my electric bike. I really like the graphs of the program @HKJ made. Which multimeter (looking for a bang for buck) would be best suited to meassure the capacity (amp hours) for the battery pack I have?
;Nested loops test
=var set=2
=var inc=3
=set=1
#while (set<2)
#delay 1
=set=set+1
=inc=1
#while (inc<3)
=inc=inc+1
#endwhile
#endwhile
To make the script easier to read I tried leading spaces in the lines inside a nested loop. See code example below. Running this code example yields an infinite loop and ";; Invalid device <>" lines in the command window output. If you remove the spaces in front of "=inc=inc+1" the code works as expected. Just be aware TestController seems to interpret leading spaces as a device name.
I was just on your website and notice that the last part of page https://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html (https://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html) has half of the page in a code box
New bug - if Arduino is connected before BM869s , BM869s is recognized , but not connected until I remove Arduino from USB port.
New bug - if Arduino is connected before BM869s , BM869s is recognized , but not connected until I remove Arduino from USB port.
Just tried a Nano together with BM869s and did not see any problem.
If you are using a ATmega32U4 in USB mode you must not use the same vendor & product id.
Are you using a hub or directly connected to the computer?
Directly , no hub; ATmega32U4 in USB plus BM869s over Brymen cable.
Any chance to add the Kunkin KP184 electronic load ?
... i don`t have it yet (is on the road) but i think it works with an RS232 converted to usb with the help of a dongle interface, if that can help you...
I was just on your website and notice that the last part of page https://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html (https://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html) has half of the page in a code box
Page is back to normal again.
Modbus serial & network and Non-SCPI ascii devices part is missing from the web page. When I was working on the device file for the Kunkin KP184 I went to lookup something and it was not there.
Modbus serial & network and Non-SCPI ascii devices part is missing from the web page. When I was working on the device file for the Kunkin KP184 I went to lookup something and it was not there.
Fixed, but it may be some time before the cache is updated.
Fixed, but it may be some time before the cache is updated.Thanks
Fixed, but it may be some time before the cache is updated.Thanks
It will most likely happen again when I do some simple updates and skip checking the final result. I fix the problems as soon as I become award of them.
Anytime I can help, since you did so much work on this program and continuing to do so.
Since you asked for user input I have some questions, suggestions for TestController.
Attached is a device file fo the Kunkin KP184. I do not have a Kunkin KP184 so it is untested. Please let me know if there are any issues and I will try to fix them.
(Attachment Link)
I am willing to try, but I am having difficulty finding documentation on deviceRead(). I even went so far as to Google search your site for deviceRead via
site:lygte-info.dk/ deviceRead
and no pages came up. I need a little help with what you meant by the deviceRead() function.
Did you mean create a Math channel that uses a script variable in it?
I am working on trying your Math channel suggestion. At first I could not get it to work at all because of errors. Most of the returned values from device AKD2G are number followed by the units in []'s. For example, motor speed variable AXIS1.VL.FB? returns "123 [rpm]". Returns in this format for deviceRead() cause Java errors like:
dk.hkj.vars.VarExceptions$ConversionException: -0.079 [V] could not be converted to double
and caused TestController to turn that Math Channel off and only report 0 for value's. Using AKD2G device variables that returned numeric values only (no units) seemed to work.
For the #askValues line I had to use #askValuesReadFormat fxfxfx to get the numbers to work for logging. What would be the equivalent for the deviceRead() command? Hopefully I don't have to add readMath to each SCPI command for this device to remove the asci units characters and always only return the number. Having units come back should be useful somehow.
If this Math channels device(Read) method ends up working that will be a great solution to my suggestion. The only extra step would be a way to specify the Math channels in a script. Can that be done?
Just out of curiosity, where is the "Test interface" popup that has info on deviceRead? The popup on the Math tab provides info on functions that can be used in the formula but I did not see deviceRead() there.
Using the #math statement in a script sounds great. However, I can't seem to get any variation of the syntax to work. I tried a number of variations of the syntax and all of them yielded failed error messages. Below are some example attempts cut and pasted from the log window on the Commands tab.
Also, in the Math tab does the "Samples" column have any significance/purpose for the Formula Type? I am guessing it does nothing.
Silly me. I should have thought to try 0 for samples. I agree it would be a good idea to accept "-" since that is what shows for Formulas in the Math tab.
I noticed that you can't delete a Math if it is enabled. Is that necessary or could you implicitly disable it and then Remove when the user requests Remove?
If defining Math logging channels a lot in scripts it would be good to be able to clear all the Math channels with a script statement. I know that #math with no argument will disable the ones there, but I am concerned about accumulating a large number of Math logging channels.
Based on learning how to use Math channels to log I think the first item in my list was already covered. Next comes the question of how to add script variables into the logging channels. Can Math formulas reference script variables?
; File test creating specific Math log channels via script
; #MATH {name {unit type samples sourceFormula}}
=var stepTime=0.5
=globalvar FtLow=50
; First disable existing Math channels by calling #math with no arguments
#math
#math FtLow - Formula 0 FtLow
#log (stepTime)
#while (FtLow<100)
#delay (3*stepTime)
=FtLow=FtLow+1
#endwhile
#log 0
="Done"
#math FtLow - Formula 0 FtLow works as desired: log shows incrementing values for script variable
#math FtLow - Formula 0 (FtLow) converted the statement to #math FtLow - Formula 0 50 which is a fixed number
In scripts for # commands like #delay you now need ()'s around a variable but for this #math statement you don't. I don't think it is a big inconsistency, but should be documented.
I am finding it amazing that TestController had the capability that I suggested already. Just needed to know how :)
Code: [Select]; File test creating specific Math log channels via script
; #MATH {name {unit type samples sourceFormula}}
=var stepTime=0.5
=globalvar FtLow=50
; First disable existing Math channels by calling #math with no arguments
#math
#math FtLow - Formula 0 FtLow
...
I'm not super familiar with SCPI as, like many others I presume, I get so far each time and give up because I can't find any program that works/is easy enough.
This looks great. I've tested it with my U1282A and it works just fine.
I have a small issue though. I'm trying to use with an "East Tester" ET5410 Electronic Load.
I keep getting "<Invalid device>".
From what I can tell, TestController is looking for the #idString to match the first two fields of the response to the *IDN command - is that correct?
Unfortunately, this ET5410 responds to the *IDN command with space-delimited fields, rather than comma-delimited. I suspect that is rendering TestController unable to match the strings to that in the definition.
I have tried changing the #idString in the definition text file to the entire *IDN response, followed by two commas, but that hasn't worked either.
Is there a simple work-around that I'm not seeing?
Is there any way to view the release notes other than rolling back to a previous version of the software? Could not see a readme file or anything on the website.
The device file for the Owon ODP6033 is for IP communication. The address would be the IP address of the ODP6033.
Ah, makes sense thanks for the quick reply. When I have time I may try to read into HKJ's documentation to see about a usb configuration.
If the Owon uses a virtual serial power for USB communication you only need to add the word "com" after the port number in the device definition file.
I have not yet had the chance to test if it works at all, but...
At my work we have a KP284 which more or less is just two separate KP184 in one cabinet, but with just the RS-485 interface. Is there any chance the TestController Java program could be made working for both channels at the same time, like eg. expanding the address range to include 1 & 2 ?
Since I now own a Siglent SDG 2042X, I am now upgrading may home grown measurement amplifiers and precision rectifiers to 1 MHz and producing a reasonably fast F/V converter. My VC940 is pretty slow in this area and the Keysight 34465A is only good up to around 400 kHz. The Siglent can, while sweeping, not be queried as to the momentary frequency.
While doing so, I was wondering on a different track why the sound card output can not be used with "Test Controller". Has nothing to do with my 1 MHz drive, but having 16+ bit AD/DA capability to measure voltages and frequencies is in my opinion an opportunity which should not be lost, if not too difficult to implement.I do not have any experience in sound analysis, not that it would be that hard to search a recorded curve for zero crossings and calculate frequency and rms values. This will, of course, only work for a fairly clean tone. The level will, of course, be relative, as far as I remember sound cards to not have any well defined calibrations.
Any ideas? :palm:
Why not control the Siglent directly from TestController? It already contains script for doing a logarithmic frequency sweep. As for measuring voltage, it is possible to use the voltage measurement from a oscilloscope, TestController has a few (The dynamic range may be too low without changing input range on the scope).
I do not have any experience in sound analysis, not that it would be that hard to search a recorded curve for zero crossings and calculate frequency and rms values. This will, of course, only work for a fairly clean tone. The level will, of course, be relative, as far as I remember sound cards to not have any well defined calibrations.
Will look into that script thing. My abilities are certainly not the best in this area :palm:.
Thanks for the hint. 8) Will try as soon as I get up in the morning. 7 hours or so from now.
OK. The log generator script worked to an extent. Script controlled generator sweeping worked. :-+
But experienced bad freezes before the graph completion. :-- Had to restart windows and the Siglent in each case. :palm:
What's also been bugging me is that upon starting to log and when changing to Chart,
the X-axis is always set to time and I will then have to change the X-axis type each time. I.e. the X-axis setting is not retained. By the time I have done that, a sweep, for example, has already finished.
Just one further idea: Why can't the generator which is to be controlled be selected through the VLG popup?
Starting
;; Start thread for: 192.168.1.173 - Kollmorgen AKD1G Servo
;; : Tx <txrx? DRV.INFO>
;; 192.168.1.173: Tx: <DRV.INFO..> 44 52 56 2E 49 4E 46 4F 0D 0A
;; 192.168.1.173: Rx: <Drive model : AKD-P00606-NBEC-0000> 44 72 69 76 65 20 6D 6F 64 65 6C 20 20 20 20 20 20 20 20 20 20 20 3A 20 41 4B 44 2D 50 30 30 36 30 36 2D 4E 42 45 43 2D 30 30 30 30 0D
;; Found Kollmorgen AKD1G Servo on 192.168.1.173
;; Start thread for: 192.168.1.173 - Kollmorgen AKD1G Servo
;; : Tx <txrx? DRV.INFO>
;; 192.168.1.173: Tx: <DRV.INFO..> 44 52 56 2E 49 4E 46 4F 0D 0A
;; 192.168.1.173: Rx timeout 1000ms In buffer:
;; 192.168.1.173: **Device do not match** <Unknown>
;; : Tx <txrx? DRV.INFO>
;; 192.168.1.173: Tx: <DRV.INFO..> 44 52 56 2E 49 4E 46 4F 0D 0A
;; 192.168.1.173: Rx timeout 1000ms In buffer:
;; 192.168.1.173: **Device do not match** <Unknown>
;; Stopping thread for: 192.168.1.173 - Kollmorgen AKD1G Servo
I just updated to V1.09 and I think I found an obscure debug mode bug.
I am working to start writing scripts using the #math script statement to record extra data from the device. Inside the script I need to refer to the logged value. Before, for values defined in the device file with #value and polled in #askValues, I used <Device name>.<signal name>. For example, like AKD2G.A1_Current. When using #math with formulaNU for extra log data how do you refer to the value in a script?
I tried math.<signal name> but got errors.
I just updated to V1.09 and I think I found an obscure debug mode bug.
Please check on the dos window if there are some Java error messages.
Can you think of anything else I could do to help get debug information on this issue?
I do not have any good ides, maybe it is because I close the communication port very fast after the last command.
Try replacing the .jar file with this one: http://lygte-info.dk/pic/Projects/TestController/TestController.jar (http://lygte-info.dk/pic/Projects/TestController/TestController.jar)
It has a short delay from the last command until it closes the port.
Messtechniker may also like this version, it has a small charge to the chart.
I tried this .jar version and got the same result. In normal mode clicking reconnect works every time. Clicking reconnect in debug mode fails every time. dos window debug result was the same as before. On the reconnect attempt the receive times out and nothing is gotten from the device query.
So, the reconnect function is doing something different in debug mode than in regular mode. Or the communications buffer works slightly differently and debug mode remembers something it shouldn't from the first activity?
Also, I have a question. In a script you can use the #Device <name> <IP address> command to connect to a device. Can you do #Device <name> and leave out the IP address? My thought is that if the device is already in the Load devices tab with an address it would default to that address. But, it doesn't seem to work that way. My challenge is that I am developing a test script in lab one and sending it to lab two to also use. The IP addresses will be different. You can edit the script, but I thought if the devices were in the Load devices tab why not leave the IP addresses out of the script to simplify use?
I will have to look a bit more at it.
Just a note: You are aware when I say DOS window, I do not mean the log window. The Java error messages do not go into the log window, but only to the DOS/console window. They also do this without debug mode, but because there usually is no visible DOS/console window they are not seen.
It is supposed to work without the address and I can see it check marks the device on my machine.
I wonder if it is timing issues, try a script with:
#CloseAll
#Device
#Reconnect
#WaitReady
#delay 5
#Device "Kollmorgen AKD1G Servo"
#Reconnect
#WaitReady
It will unload all devices, wait 5 seconds and then load the selected device.
If this fails it is probably not a timing issue, but something else.
When manually sweeping the Siglent I get those nasty
steps in my graphs instead of completely smooth curves.
What can I do to get rid of those?
I wonder if it is timing issues, try a script with:
#CloseAll
#Device
#Reconnect
#WaitReady
#delay 5
#Device "Kollmorgen AKD1G Servo"
#Reconnect
#WaitReady
It will unload all devices, wait 5 seconds and then load the selected device.
If this fails it is probably not a timing issue, but something else.
Using the .jar version you linked a couple of post ago (says V1.10) I did the following:
0. Started TestController and made sure nothing is checked in Load devices tab. Closed TestController.
1. Started TestController in debug mode.
2. Loaded a script with only the contents you list above.
3. Ran the script and everything worked.
4. Waited like 30 seconds doing nothing.
5. Ran the script again and it did not connect.
Attached is the complete contents of the debug DOS window from the above sequence. Please note that even with the #delay commented out this script connects properly the first time.
I hope I found the problem.
Try using the above link again, it is supposed to give V1.11 (I may take a bit time due to caching at my hosting service).
But I have two usability problems when sweeping in chart doing frequency response graphs.
Because the sweep is continuous, sweeping at the end needs to stop at the highest frequency as otherwise the chart is messed up by the frequency returning to the start frequency or logging needs to be stopped manually just before reaching the highest frequency. Difficult in Chart because one has to return to "Command" to prevent this frequency flashback messing up the graph.
#log 0.1
#while (FtLow<50)
=FtLow=FtLow+2
#delay 1
#endwhile
#log 0
#SaveChart "myfile"
which generated the attached myfile.png showing only 0.0s on the x-ais. I would expect all 6 sec on time axis but it only seems to get the first logged data point or none.I played with the #SaveChart script command in V1.12. When I do something like:
#SaveChart "myfile"
I get the file myfile.png with a picture of the chart saved in the ...\Documents\TestController directory. But, I also get a second file named myfile.txt that seems to be a copy of the TestController log window up to the #SaveChart command in the script but not after. Was it your intention that #SaveChart saves the .png picture as well as the log window with the one command?
What sets the picture size for the #SaveChart command? I looked on the web site for some documentation on possible arguments for the #SaveChart command and was not able to find it. I seem to always get 500 x 250 pixel.
Lastly, I don't seem to get the full chart in the saved picture. My script does:
...just brainstorming...
Is it a good idea, being able to add an event into the chart like a small flag, which opens a text box when touching with the mouse? For example, you measure something, than change a parameter and you want to add this info into your chart, so that you have an explanation for the different outcome, being directly connected to your saved csv-file, for later use?
As far as saving "csv" is concerned:
When I want to save the content from "Table" into a csv-file, the format "csv" is already chosen at the bottom of the window, but you have to add "csv" manually to your file name; not a big deal, but I have the impression, that this was not necessary in early versions? But maybe I am wrong or it is a linux issue?!
You can easily clean the chart by typing the sweep time in the "Last sample to display" field.
You can easily clean the chart by typing the sweep time in the "Last sample to display" field.
8) Really cleans up the chart nicely.
By the way: got a HO732 LAN/USB Interface for my HMO1022.
No dropouts any more when querying via LAN now:-+
My definitions for the HMO1022 scope (USB-virtual comport/RS232 i.e HO720 interface plug-in module) and (USB-virtual com port/LAN i.e. HO732 interface plug-in module) are quite rudimentary and need a bit of polishing and testing at the moment. :palm:
The definitions currently only cover Level and Frequency on channel 1. No popups yet. :scared: If still interested, I would provide the definitions in a couple of days or so. :phew:
My definitions for the HMO1022 scope (USB-virtual comport/RS232 i.e HO720 interface plug-in module) and (USB-virtual com port/LAN i.e. HO732 interface plug-in module) are quite rudimentary and need a bit of polishing and testing at the moment. :palm:
The definitions currently only cover Level and Frequency on channel 1. No popups yet. :scared: If still interested, I would provide the definitions in a couple of days or so. :phew:
#math
#math RDSineOff - FormulaNU 0 getMatch(deviceRead("AKD1G","FB1.REGRDSineOffset?"),"[-.0-9]+")
#math FtLow - Formula 0 FtLow
#math FB1MPos - FormulaNU 0 getMatch(deviceRead("AKD1G","FB1.MECHPOS?"),"[-.0-9]+")
While running this test script I have to regularly clear a fault in the device. Unfortunately clearing faults take a long time and blocks communications until the fault clear is done. For normal #askValues log channels missed points are marked with a ? and keeps on logging. Unfortunately this short time blocked communications turns the #math extra logging channels off. Specifically, looking at the Math tab while the script runs the two FormulaNU channels have the enable un-checked and the Source formula turns red. At that point those channels enter just 0 for the rest of the log. Having the FormulaNU channels stop means I can't use them. Can TestController treat the interrupted communications like normal logging channels and enter ? into the log for missed points but continue working?
After the above happens with the #math channels un-checked and formula turned red if I run the script again, which runs the definitions in the script snippet again, TestController does not re-enable the turned off #math channels. They still have a red indication in the Source Formula column. If I just click inside the Source Formula and hit return manually they work. Why doesn't the script #math re-defining them fix and re-enable them?
Lastly, I noticed a minor bug in deleting math channels. If you have multiple math channels in the Math tab and select the first/top one, then when you click the delete button the first one disappears. You can then click delete to remove the second one and so on. Unfortunately the last one never disappears. If you start logging it does not log any math channels but the Math tab shows shows the last one that did not delete. If you close TestController and re-open the Math tab would be empty. Seems to be an index issue in the display of the math channels after deleting them.
Here we go again with a problem right from the start :palm:
After the above happens with the #math channels un-checked and formula turned red if I run the script again, which runs the definitions in the script snippet again, TestController does not re-enable the turned off #math channels. They still have a red indication in the Source Formula column. If I just click inside the Source Formula and hit return manually they work. Why doesn't the script #math re-defining them fix and re-enable them?
The general assumption is that you need to edit the math to fix the error.
6. Run the script to define the #math channel again.
7. Click Math tab and see it is still red.
TestController in the above sequence makes perfect sense to me except at step 6. I would have thought that step 6 would count as editing the #math channel and would clear the red. It does not.
#saveTable foo ,;
#saveTable foo .,
#saveTable foo tab
#saveTable foo ,
HKJ,
I just downloaded Test Controller from the web page like normal and in Configuration About it says Ver 1.13. However, if I file compare this testcontroller.zip to the previous 1.13 download the .zip files are different. The .zip file I just got has the new R&SHMO1022.txt device file.
Testing the .jar file in the new download it does not seem to have the Ver 1.14 fixes so I don't think it is 1.14 with the old version number either.
Per forum post time stamps it has been 6+ hours since your Ver 1.14 post so I would think caching should be done but I don't know???
Attached is a device file fo the Kunkin KP184. I do not have a Kunkin KP184 so it is untested. Please let me know if there are any issues and I will try to fix them.
(Attachment Link)
I finally got some time to play with my Kunkin KP184 and Mike's device file. On my PC with a real COM1 port (not via a USB serial adapter) it connected. The *idn? command manually typed in gives a response as expected. Unfortunately none of the other query commands seems to give a reply.
Instruction example:
The following instances suppose the communication be 01, data is hexadecimal
format.
1.Set up load current:
Send instruction: 01 06 01 16 00 01 04 00 00 07 D0 0C 9D
The meaning of each byte is:
01: equipment address.
06: instruction number written in the single register.
01 16: address written in the target register (load current register).
00 01: the number written in the target register
04: the byte number of data written in the target register. If the target register
is 4-byte register, the value is 4.
00 00 07 D0 : data, if it is 07D0, the current is set up as 2000mA.
0C 9D: check code. The high order is before the low order.
Load return data: 01 06 01 16 00 01 04 00 00 07 D0 0C 9D
When operating single register of the load, the load return data is returning the
instruction as original.
The Kunkin manual says it uses Modbus RTU communications. The below is a snip from the manual. This is an example message to set/write to the load current value. It is writing a 32 bit unsigned integer 0x000007D0 = 2000 decimal to address 0x0116. Doing holdingL 0x0116 2000 in TestController generates a slightly different resulting message:
TestController: 01 10 01 16 00 02 04 00 00 07 D0 7C B5
Kunkin Manual: 01 06 01 16 00 01 04 00 00 07 D0 0C 9D
The device file contained the below commented out so I would expect TestController to be able to use 06 on writes.
;#disableWriteSingle 1
How to get TestController to use 06 instead of 10 for 32 bit value read/write and how to get TestController to put 00 01 instead of 00 02 after the address? I assume the last two bytes are proper CRC's in each case.
Looking a bit more on the format, it looks like it is not modbus, but their own variant of it.
The format of a 06 is:
Slave Address 01
Function 06
Register Address Hi 00
Register Address Lo 01
Preset Data Hi 00
Preset Data Lo 03
Error Check (LRC or CRC)––
As can be seen there is no data count included.
This mean I will have to add a variant of modbus to handle this.
;; Found Kunkin KP184 on Serial0 (COM1)
*idn?
;; KP184: Tx <*idn?>
;; KP184: Rx <Kunkin,Kunkin KP184, , >
;; Kunkin,Kunkin KP184, ,
What also is weird it excepted a SCPI command.
Ver. 0.3 of the HMO1022 definition file. Now includes phase measurement. :-+
Useful for aligning tape heads - should anybody sill be doing this. :palm:
Working a bit on Kunkin, but it far from finished:
Try with this .jar file, it will get the correct transmit message:
http://lygte-info.dk/pic/Projects/TestController/TestController.jar (http://lygte-info.dk/pic/Projects/TestController/TestController.jar) (V1.15)
The definition file must contain:
#driver Modbus
#subDriver Kunkin
Using a "holdingL 0x116 2000" message matches manual with this subDriver
What I need to know now is (Logs from using debug mode):
Do TC handle the answer and what is the answer.
Do a "holding 0x10c 1" set the load in short mode.
Answering messages from:
holding? 0x10c
holdingL? 0x116
holdingL? 0x300
Initial test results with Kunkin KP184 using the below in the device file:
Thanks, it helped. I have updated the .jar file (Same link as before).
The problem is that it do not use modbus, but some modified (and not very well documented) version of it. I have to experiment with the messages.
Please run the same tests as before.
Try changing all the holdingF to holdingL in the definition file, you will probably be able to set parameters on the load then.
What is missing now is reading and writing 1 byte values (0x10c) and the long message (Maybe it is 0x3000 instead of 0x300).
Do it work with a 32 bit read?
holdingL? 0x10c
There is some model and version info here:
holdingL? 0x0001
Any suggested next steps to try?
HKJ, could you please explain the basics of how the IP communication between your software and the devices work?
To get the ESP8266 chip to communicate, it needs to be joined to WiFi, which I successfully did with an Android app. But the app apparently set a "server IP", which is the IP of the Android device. Once the ESP8266 obtained a real IP, I port scanned it and found nothing open. Which suggests the RD6006W would connect to your software? :o
Do on/off work?
Any it needs a verifications:
#scpiCmd model? holdingL? 0x0001
#verifyDevice 1840 model?
This will basically prevent the definition from loading without a KP184 connected, i.e. the *idn? will not answer.
With this there is not much to do, maybe try if reading/writing two bytes at a time work. I have uploaded a new version where holding without the final L will read/write 2 byte entries, you can try that with 0x10c
;; Start thread for: COM1 - Kunkin KP184
;; COM1: Set params: 9600
;; : Tx <holdingL? 0x0001>
;; COM1: Tx: 01 03 00 01 00 04 C9 15
;; COM1: Rx: 01 03 04 00 00 07 30 17 F8
;; COM1: Tx <mode?>
;; COM1: Tx <holdingL? 0x0110>
;; COM1: Tx: 01 03 01 10 00 04 30 44
;; COM1: Rx: 01 03 04 00 00 00 01 F3 3B
;; COM1: Rx <1>
;; Found Kunkin KP184 on Serial0 (COM1)
On/Off is working. Indicator in device popup does not work. Not sure why.
Using the new V1.17:
holding? 0x10c
yields Java errors and Rx Timeout. On the other hand,
holdingL? 0x10c
yields 0 as the response when device is off and 234881024 = 0xE0000000 when the device is on. I am guessing that holdingL would work if combined with masking to get at the bits. My Kunkin manual has no documentation on 0x10c so I can't suggest what masking.
Attached is the latest Kunkin 184 device file. Perhaps it is good enough to publish now?
Standard client-server with the device being server.
On/Off is working. Indicator in device popup does not work. Not sure why.Because on must return a 1 value with the current definition. This is easily fixed.
Instead of "on 1" use "on 0xE0000000" or add a :readmath: expression to convert it on the line below #scpiCmd: :readmath: value?1:0
But, I'm getting a very strong impression that the RD6006W acts as the client, and the software (Riden's PC software and mobile apps) act as the server.
I suggest going ahead and publishing it.
Ver. 0.4 of the HMO1022 definition file. Now includes
Position read/write,Volts/Division read and Mode buttons :phew:
Yep. I was also thinking about this 2 buttons in row thing, but initially did not succeed.
But, I'm getting a very strong impression that the RD6006W acts as the client, and the software (Riden's PC software and mobile apps) act as the server.
I believe that is the case and it is not support in TestController.
I have several home-grown networked BME 280 sensors which spit out continuously temperature, humidity and atmospheric pressure through a virtual com interface. Example of a single full sequence below. Is there in principle a way to acquire, then split the data string and finally display the data, for example only temperature and humidity in Test Controller? Of all the supported instruments is there already one doing something like this?
Since you changed the script expression evaluation process I find that for #delay and #log commands using a variable I need to put ()'s around it. For example,
Big Oops. I hope it is fixed now (The script library is downloaded from my website, this means I can update easily).
Thank was quick...
I don't have found installation procedure, so I just have installed latest Java version, and run the bat file of your program folder.
Does It require others things to work ?
I am using a HP33401 multi-meter (as many others here!) and it is connected to my computer
using original (I guess) Agilent IEE488 to USB interface.
It work great when I use Agilent software.
Anyway, I must say that I'm a little bit confused when trying to connect my instrument with your software.
I tried to load 34401 (in the list) and select the address, but that seem to do nothing. I probably miss something..
Is there a step by step "tuto" already made to explain how to configure our instrument ?
I have also a question about the operation of your software :The software do not as such handle triggers, but you can do some tricks with advanced logging and some scripting.
Does it allow to work with a trigger initiated by the instrument itself ?
The HP34401 measurement can be triggered by external signal from rear BNC,
I would like to record data each time this input is triggered.
The purpose is to make an external multichannel MUX box.
It would switch "N" measurements channels at programmable speed.
The box will provide trig pulses to the 34401 each time channel is changed.
Question: "Benchtop DMM with AC+DC true RMS value vs. TestController"
Another question: The Fluke 8808A probably does not have this feature, but as the Fluke 8846A is already part of the device list by TestController, I would like to know, whether this file can also be switched to a working one for the Fluke 8808A or does the RS-232 behave in a different way?
Starting
;; Start thread for: 192.168.10.37 - APLA800
;; 192.168.10.37: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; 192.168.10.37: Rx: <AMREL,EL-NFP,0,CF:92.1CT,FV:2.41> 41 4D 52 45 4C 2C 45 4C 2D 4E 46 50 2C 30 2C 43 46 3A 39 32 2E 31 43 54 2C 46 56 3A 32 2E 34 31 0D
;; Found APLA800 on 192.168.10.37
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at dk.hkj.devices.SetupFormats$IndicatorField.getLabel(SetupFormats.java:2600)
at dk.hkj.devices.SetupFormats$IndicatorsField.addGridBag(SetupFormats.java:2761)
at dk.hkj.main.PopupSetupSelection.makePanel(PopupSetupSelection.java:206)
at dk.hkj.main.PopupSetupSelection.makeMainPanel(PopupSetupSelection.java:136)
at dk.hkj.main.PopupSetupSelection.<init>(PopupSetupSelection.java:79)
at dk.hkj.main.DeviceInterface.showSetupPopup(DeviceInterface.java:613)
at dk.hkj.main.PaneCommand.showSetupSelectionPopup(PaneCommand.java:1589)
at dk.hkj.main.PaneCommand$24.actionPerformed(PaneCommand.java:828)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
;; ALOAD: Tx <:inp?>
;; ALOAD: Rx <0>
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at dk.hkj.devices.SetupFormats$IndicatorField.syncValue(SetupFormats.java:2672)
at dk.hkj.devices.SetupFormats$IndicatorsField.syncValue(SetupFormats.java:2787)
at dk.hkj.devices.SetupFormats.syncAll(SetupFormats.java:237)
at dk.hkj.main.PopupSetupSelection.initialSync(PopupSetupSelection.java:97)
at dk.hkj.main.PopupSetupSelection.timerUpdate(PopupSetupSelection.java:105)
at dk.hkj.main.PopupSetupSelection.access$3(PopupSetupSelection.java:103)
at dk.hkj.main.PopupSetupSelection$2.actionPerformed(PopupSetupSelection.java:72)
at javax.swing.Timer.fireActionPerformed(Unknown Source)
at javax.swing.Timer$DoPostEvent.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
;; Found APLA800 on 192.168.10.37
#logcmds 0
;; Discharge with 5A to 13V
;; ALOAD: Tx <:CURR 5>
;; ALOAD: Tx <:meas:volt?>
;; ALOAD: Rx <OK>
;; ALOAD: Tx <:meas:curr?>
;; ALOAD: Rx <13.2121>
;; ALOAD: Tx <:meas:pow?>
;; ALOAD: Rx <0.0000>
;; ALOAD: Rx as numbers <0.0 13.2121 0.0>
;; ALOAD: Tx <:INP 1>
;;0.0000
;; ALOAD: Tx <:meas:volt?>
;; ALOAD: Rx <OK>
;; ALOAD: Tx <:meas:curr?>
;; ALOAD: Rx <13.2111>
;; ALOAD: Tx <:meas:pow?>
;; ALOAD: Rx <0.0000>
;; ALOAD: Rx as numbers <0.0 13.2111 0.0>
;; ALOAD: Tx <:INP 0>
;; Discharge terminated
;;0.0000
;;OK
I'm looking through the thread now to see if I can find the answer but when I click setup i get this error
at dk.hkj.devices.SetupFormats$IndicatorField.getLabel(SetupFormats.java:2600)
at dk.hkj.devices.SetupFormats$IndicatorsField.addGridBag(SetupFormats.java:2761)
I'm having another problem that has been hounding me with this load since I got it. It is returning an OK after set commands and it is messing up my scripts.
You can see here where I ran the battery discharge script how the OK messed up things. It pushed all the reading down 1 (volts is 13 not current)
Any suggestions?
Please find enclosed the latest definition file for the R&S HMO1022 scope. :)
Minor bug with #math functions. I deleted all #math functions on the Math tab. In re-starting TC and running a script that does not have any #math statements sometimes the last #math channel defined re-appears. I have tried a number of times to find a repeatable way to replicate the issue but have failed so far. Just thought I would mention it to you so you can watch for it also. I will continue to try and find a method to repeatedly show the issue.
I also have a question about chart auto scaling. I have a dc current being logged that is between 20 and 50 mA always positive and never actually 0. Why does the chart auto scale go from -1 to a small positive value like 0.06? I would have thought it would pick something like 0 to 0.06 or maybe -0.06 to +0.06. Not -1.0 to +0.06. Using -1 to small positive means the chart trace appears flat and you see no details. Perhaps it would be an improvement to pick -small to +small in this case when the Scales for chart has "Auto includes zero" checked?
I'm having another problem that has been hounding me with this load since I got it. It is returning an OK after set commands and it is messing up my scripts.
You can see here where I ran the battery discharge script how the OK messed up things. It pushed all the reading down 1 (volts is 13 not current)
Any suggestions?
This basically means you cannot use the SCPI definition format, but has to use the Ascii format (SCPIx may also work) where you redefine the commands.
Has anybody written one for the 3710A loads?
Check your "Auto bottom step" and "Auto min. range"
Bottom is the step size that is used for the bottom of the chart
min range is the minimum difference between top and bottom of the chart.
You can put them both to zero, then it will match the scaling very exactly to the data.
Ah, that is what those columns in the Scales for chart tab do. Sorry to bother you to explain the features already there.
Suggestion for a future version:
I use #SaveTable command at the end of scripts to save data. Sometimes I forget to close the data file when I run the script. TC then silently executes the #SaveTable command by doing nothing since the file is open/blocked from writing by Windows. It would be good if TC put an error message in the log screen when it can't do the write to remind the user to save the data manually.
I'll try and have a play adding the RTB2004 scope too (should be similar to the HMO), but will have to wait a few weeks until I'm back in the UKPlease find enclosed the latest definition file for the R&S HMO1022 scope. :)
I will include it in the next release
#cmdSetup number Voltage
:read: volt?
:write: volt
:update: mode
:tip: Load voltage for voltage mode
:buttontext: CV
Volt 0 60.000
So I got a file that seems to be working for my Amrel load. Of course I copied a lot of other config files.
2 questions
I can seem to get :update: to work am I missing something, or does in not work in ASCII mode? (example line 123 in file)
I am defining the scpi commands, but does every single iteration of a command need to be spelled out? I can define 2 commands say :meas and :volt? and they will both work individually, but when I do :meas:volt? it fails
#idString AMREL,EL-NFP
#name AMREL PLA
#handle PLA800-60-300
Please find enclosed the latest definition file for the R&S HMO1022 scope. :)
I connect the Kunkin KP184 direct to Serial (RS232) at COM1, 9600, Addr. 1 or the same combination with USB interface (via CH340 chipset) and nothing happens! Program does not recognize the device! Both setups are checked in 32bit and 64bit WIN10 system and i use the latest 1.19 Version. Do i miss or i make something false?
By the way the same connections works fine with other programs.
And another thing.
In your example photo i see the Max values in Amps is 30A and the Max power is 250W. The device as i know is capable for 40A and 400W. Is there any reason for that?
Something you can try is to open the file: "Kunkin KP184.txt" in the devices directory and place a semicolon ; before the line "#verifyDevice 1840 model?"
Thanks! Unfortunately that doesn't help.
By the way, what is the form of the number i have to enter for the address? I mean 1 or 001 or #1 or something else?
Is there anyone who have try with this device successful ?
Yes the com port is com1 in RS232 and com3 in the rs232 to USB interface.The string has to be "com1" or "com3" not only 1 or 3
Yes the com port is com1 in RS232 and com3 in the rs232 to USB interface.The string has to be "com1" or "com3" not only 1 or 3
I have try to test that to. Still doesn't work ... :-X
HKJ, please include updated Kunkin KP184.txt device file in the next version.
And a proposal. What about to add the Remote sense function as in KEL103 interface? I think is a must specially in high current values . (I'm talking to program experts!)
Exactly this function i mean but for the KP184!Sorry, I misread your post and believed your where asking for it in the KEL103.
I think I got the file for AMREL loads mostly done. It seems to be working for me and I think most of the typos are out.
#logcmds 0
; Sweep the output of a waveform generator, both up and down will work
=var amplitude=2
=var startFrequency=2000
=var endFrequency=15000
=var stepTime=0.1
=var steps=40
; --------------------------------------------------------------
="Sweep from "+startFrequency+"Hz to "+endFrequency+"Hz in "+steps+" steps, estimated time: "+formatDouble((stepTime*steps)/60.0,1,6,0,1)+" minutes";
#delay (stepTime)
#log (stepTime)
=var n=1;
="Steps = "+steps+"; endFrequency ="+endFrequency+"; startFrequency = "+startFrequency+"; ratio = "+(pow(endFrequency/startFrequency,1.0/steps))
#while (n<=steps);
#delay (stepTime)
=freq=startFrequency*pow(pow(endFrequency/startFrequency,1.0/steps),n)
="n = "+n+"; freq = "+freq+" Hz"
=n=n+1;
#endwhile
#log 0
="Done"
Is there a better way to fix this or is there a bug in the expression evaluator that causes the endFrequency/startFrequency to be truncated to an integer instead of being float?
One small observation. The Red like LED indicator of ON / OFF state works only once.
And a proposal. What about to add the Remote sense function as in KEL103 interface? I think is a must specially in high current values . (I'm talking to program experts!)
Thanks again
Simon
HKJ, please include in the next release.
By default TestController puts the logged data in columns in alphabetical order based on <deveice>.<signal> names for the logged data. I am working on a test device file for Tektronix oscilloscopes and a test script using them. When I use Tektronix MDO3000 scope and Siglent generator I get the oscilloscope data listed first in the log. But, when I switch to a Tektronix TDS3000C scope I get the Siglent data listed first.
When I import the logged data for analysis it is tedious to have to correct the column data order depending on which oscilloscope instrument I am using.
Are there script commands that can be used to set the order of the logged data columns?
Also, since there is no interface type for oscilloscopes I have to search and replace oscilloscope device name in the script depending on which instrument is in use. Would this be a good use for Remap handles function to have one name used in the script? If so, does remap handles have any script commands to automate that?
Not script commands, but you can export and then import the data to change the sequence.
The export menu allows you to change the column sequence (Use Ctrl-up/down arrow).
You can save a export format, making it fairly easy to reuse it.
I plan on adding script command to configure the export menu.
What about using Osc?
Remap is outside script control, but you can remap on device serial number. The disadvantage with remap is that TestController may loose tracking of column format and units.
You might want to add some text on the screen to tell the user you can move selected with ctrl arrow.
If I save a format with data from scope number one and then later load the format with scope number two connected how would TestController format know what order to put things in?
Do you mean create an interface for the oscilloscope device? In reading the web site documentation it only lists PS, DMM, BMM, ARB, Load as possible interface types. Are you saying there is an Osc interface type now for oscilloscopes?
There is a hint or tool tip (Java name) that says it.I like the idea of and try to use tool tips. But I must admit nothing I had done before had ever popped that specific tool tip up before. Thanks for pointing it out. Now the I know it is there along the side of the table I can find it easily now.
The interface name is not coded anywhere in the Java code, it is only in the device definitions, i.e. there is nothing preventing using other names, but to get the full benefit from the interface the names has to be coordinated.
This means I have added "Osc" to the official list (Will be published with next update) and will add other when needed.
TestController has a internal list of preferred function names and string or numeric parameter and will show them with green background in the interface test popup.
I like the idea of and try to use tool tips. But I must admit nothing I had done before had ever popped that specific tool tip up before. Thanks for pointing it out. Now the I know it is there along the side of the table I can find it easily now.
Okay, I will try that. But, I do have a general interface usage question. Sometimes you want to refer to a logged value in a script. If I have a script working with Siglent SDG2042X and I use SDG2042X.Frequency1 in a script expression that works fine. But, if I next connect to a Siglent SDG2122X I have to change the script to use SDG2122X.Frequency1.
If you are trying to use the interface method like:
=var arb=getDevice("ARB")
it would be great if somehow you could use the variable arb pointing to the "ARB" device to refer to a logged value like say arb.<signal name>. Is this already possible or something simple to add?
Could it be that too much latency in connection attempts times out for him?
My LXI code is not perfect and you are probably correct that is the problem. The LXI works with the devices where I have tested it and it is rather difficult to debug it without the problematic device.
For testing I have included some hard coded debug output to the console in this version:
http://lygte-info.dk/pic/Projects/TestController/TestController.jar (http://lygte-info.dk/pic/Projects/TestController/TestController.jar)
Could it be that too much latency in connection attempts times out for him?
That could very well be the reason, for most devices there is a 1 second timeout (It can be adjusted in the definition file).
I have never thought about using the program from a remote location. You can, of course, remote control a computer running TestController at the location, that would work.
If you want to see how fast communication is, start a log and use "#COMMANDTIME?"
I'm also using the program under Linux remoting through SSH with X11 forwarding. Working pretty good with my devices.
gby: I have done a change to LXI and added a bit more logging, please try again.Great progress! Here are the details of my testing:
Just a potential issue with miss-typed commands hanging the communications.
Just a potential issue with miss-typed commands hanging the communications.
This was a easy fix.
I will not post a new version just yet, I got started on LXI discovery. When it is working it is possible to leave the address field empty (i.e. no IP address) and it will find the device if it is on and on the local network. This will work with both socket and LXI connections, as long as the device support LXI.
I got started on LXI discovery. When it is working it is possible to leave the address field empty (i.e. no IP address) and it will find the device if it is on and on the local network. This will work with both socket and LXI connections, as long as the device support LXI.
First part of discovery is working:
#discover?
;; 10.0.0.57 KEITHLEY INSTRUMENTS,MODEL 2460,04077759,1.6.4c
;; 10.0.0.59 Keysight Technologies,34470A,MY54700281,A.03.02-02.40-03.02-00.52-02-01
;; 10.0.0.60 KEITHLEY INSTRUMENTS,MODEL DMM7510,04076557,1.6.7c
;; 10.0.0.62 KEITHLEY INSTRUMENTS,MODEL 2280S-32-6,4083473,01.06g
;; 10.0.0.66 Keysight Technologies,34461A,MY53214390,A.03.02-02.40-03.02-00.52-01-01
;; 10.0.0.67 Keysight Technologies,34461A,MY53214418,A.02.09-02.37-02.09-00.49-01-01
;; 10.0.0.68 THURLBY-THANDAR, QL355P, 427628, 2.05 - 1.07
;; 10.0.0.69 THURLBY THANDAR, QL355P, 445308, 2.05-2.02
;; 10.0.0.75 Siglent Technologies,SDG2122X,SDG2XCAC1R0010,2.01.01.22R5
;; 10.0.0.76 Keysight Technologies,34465A,MY57502236,A.03.02-02.40-03.02-00.52-03-01
;; 10.0.0.79 KEITHLEY INSTRUMENTS,MODEL DMM6500,04395798,1.7.2b
Do I add a indicator to show what devices is supported?
And some answer to gby:
The LXI Discovery screen looks great. It seems limiting to only run it when the device list is empty. When working on a multi-device setup and having trouble with one device connecting it would be good to be able to run LXI Discovery manually.
I am working on a device file for Keithley 2260B series of power supplies. But, I am having a problem to get all the model numbers to show up. I have stared at this device file for a while now and I can't figure out why only 11 of the 12 defined devices show up in the Load devices Search socket drop down. Specifically the last device (Keithley 2260B-250-13) at the end of the #metadef list after the #meta statement does not show up. :-//
Can anyone spot what I am doing wrong in the attached work in progress device file?
Hate to ask but I am a total non programmer at this point, trying to learn
I have a riden power supply and I would like to charge some lifepo batteries and log the results. Can someone point me in the right direction to get started?
Sorry for basic question.
I would like to write a script, similar to you battery discharge test, but for charging. I have many of these 280ah 3.65v cells I need to charge and then discharge test, for solar forum info. CC charge is best I beleive.
That is awesome, gives me a start. Debugging is learning. I think :)
Also please change the charge voltage to suit your LiFePO4 cells. HKJ defaulted to lithium ion in the script.
How could I create an #interface line that takes the string "CH1-CH2" as an argument and sends it to the scope with the quotes?
How could I create an #interface line that takes the string "CH1-CH2" as an argument and sends it to the scope with the quotes?
It must be something like ("\""+value+"\"")
=deviceRead("OscTek_4","SELECT:MATH?")
=deviceWrite("OscTek_4","SELECT:MATH 1")
=deviceRead("OscTek_4","SELECT:MATH?")
OscTek_4:SELECT:MATH 1
=deviceRead("OscTek_4","SELECT:MATH?")
which uses deviceRead to check a value for 0 or 1 and uses deviceWrite to try and set the value. Below is the output from the dos debug window from Ver 1.25:=deviceRead("OscTek_4","SELECT:MATH?")
;; OscTek_4: Tx <SELECT:MATH?>
;; OscTek_4: Rx <:SELECT:MATH 0>
;; :SELECT:MATH 0
=deviceWrite("OscTek_4","SELECT:MATH 1")
;; OscTek_4: Tx <="OscTek 4"="SELECT:MATH 1">
=deviceRead("OscTek_4","SELECT:MATH?")
;; OscTek_4: Tx <SELECT:MATH?>
;; OscTek_4: Rx <:SELECT:MATH 0>
;; :SELECT:MATH 0
OscTek_4:SELECT:MATH 1
;; OscTek_4: Tx <SELECT:MATH 1>
=deviceRead("OscTek_4","SELECT:MATH?")
;; OscTek_4: Tx <SELECT:MATH?>
;; OscTek_4: Rx <:SELECT:MATH 1>
;; :SELECT:MATH 1
Am I using the deviceWrite command incorrectly or is there a bug in the deviceWrite function?
#cmdSetup comboboxhot Termination CH_4
:read: CH4:TERMINATION?
:readmath: getMatch(value, "( |^)[-+.0-9].*")
:write: CH4:TERMINATION
1M 1e6
50 50
75 75
Setting worked fine. But, it would not register 1M as 1 MegOhm setting when the read returned 1.0000E6. So the value when opening the popup was not necessarily correct. Changing the "1M" text to "1e6" got it to work. It would be nice to get 1M to work since it reads nicer to people but not really necessary.In other words: Is there any handheld DMM, which is able to log faster than 1 second interval, without skipping measurements in TestController?
Setting worked fine. But, it would not register 1M as 1 MegOhm setting when the read returned 1.0000E6. So the value when opening the popup was not necessarily correct. Changing the "1M" text to "1e6" got it to work. It would be nice to get 1M to work since it reads nicer to people but not really necessary.
Updated "Tektronix MDO MSO DPO TDS.txt" device file attached. Please use this one.
Setting worked fine. But, it would not register 1M as 1 MegOhm setting when the read returned 1.0000E6. So the value when opening the popup was not necessarily correct. Changing the "1M" text to "1e6" got it to work. It would be nice to get 1M to work since it reads nicer to people but not really necessary.
From next version try formatSI() in readmath
Attached is the updated Tektronix scope file with the above update and another small fix for TDS3000C scopes.
txrxn? 2 rec.retrievedata 0
;; 01
2325.793,-12.163,152423176,65532
*idn?
;; Kollmorgen,AKD1G, ,
Clicking the Clean button leaves the extra returned lines behind.;; AKD1G last: 15.35 ms average: 16.30 ms slowest: 38.45 ms
#commandtime?
;; AKD1G last: 14.34 ms average: 16.29 ms slowest: 34.31 ms
#commandtime?
;; AKD1G last: 15.27 ms average: 16.33 ms slowest: 33.59 ms
#commandtime?
;; AKD1G last: 15.32 ms average: 16.29 ms slowest: 31.92 ms
#commandtime?
;; AKD1G last: 16.12 ms average: 16.16 ms slowest: 30.22 ms
Does #commandtime? reset and start over on a regular basis?#commandtime?
;; AKD1G last: 0.01 ms average: 0.01 ms slowest: 0.01 ms
Does #commandtime? reset and start over on a regular basis?
Before this test version #commandtime? seemed to always make sense. Does multi-line txrxn? somehow confuse #commandtime?
These Java errors don't seem to prevent any functionality but I thought it would be good to point them out.
Looking at the error:
at dk.hkj.main.Mathematics$MathEntry.calcDirect(Mathematics.java:394)
I can see it includes Mathematics, that means it is related to the Math page. The reason you only get it once is because the expression is disabled at first error.
It is probably easier for me to stick to my handheld DMMs, but I am tooooo... curious to ask, whether it could be used with TestController, at least via the easiest way "USB VCP" at the beginning?
I tried to do some progress with TestController - actually it is just the detection of the device, because I am neither a programmer, nor a JavaScript expert... :(
"Not always seeing the unit in "Popups > Readout":
No matter how many "decimals" and/or "Auto min. range" I choose, for example "6" or "4", I don't see the unit for labeling the values continuously on the "Readout":
Is it possible, to force outputting a unit, for example always "A", to get a shorter number/value or giving a little bit more space, as "11" is shorter than "23" for example?
"Is it advisable to always uncheck not used devices, to not get a "NullPointerException"?
I saw this on my Pi, where I always start TestController via Terminal. When all connected devices are "ON", there is no message. When the devices are connected, but "OFF", I get this terminal information:
There is of course no interference with the usability of TestController, I just want to know, how to deal with it?
My little interim report as far as my "Rohde & Schwarz HMC8012-G.txt" is concerned:
It is only a first stage and in the end any user has to tweak the file for his own needs. I mainly want to use ACI measurements with TestController to see the Chart while logging with the HMC8012 without paying attention to batteries. At the moment I am satisfied with the result:
I will post my result and hurdles to solve a bit later, in order not to make this post too messy. ;)
#cmdSetup buttonsOn Axis_Enable
:string:
:read: DRV.ACTIVE?
:readmath: getElement("DRV.DIS DRV.EN",value)
:write: txrx #
:tip: Disable (Off) or Enable (On)
:color: (0,255,0)
:updatedelayed: 0.1
:updatealloff:
:update: Faults
Off DRV.DIS
On DRV.EN
#cmdSetup info Faults
:string:
:read: DRV.FAULTS?
:readmath: formatLeft("value",25)
:tip: You can clear faults with DRV.CLRFAULTS command.
;; AKD1G: Tx <DRV.FAULTS?>
;; AKD1G: Tx <txrx? DRV.FAULTS>
;; 192.168.1.173: Tx: <DRV.FAULTS..> 44 52 56 2E 46 41 55 4C 54 53 0D 0A
;; 192.168.1.173: Rx: <502: Bus under voltage.> 35 30 32 3A 20 42 75 73 20 75 6E 64 65 72 20 76 6F 6C 74 61 67 65 2E 0D
;; AKD1G: Rx <502: Bus under voltage.>
Exception in thread "AWT-EventQueue-0" dk.hkj.script.ProgramExceptions$UnknownException:
formatLeft("value",25)____<----____
at dk.hkj.script.Script.expression(Script.java:1193)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:228)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:244)
at dk.hkj.devices.SetupFormats$InfoField.syncValue(SetupFormats.java:2446)
at dk.hkj.devices.SetupFormats.syncAll(SetupFormats.java:239)
at dk.hkj.main.PopupSetupSelection.initialSync(PopupSetupSelection.java:97)
at dk.hkj.main.PopupSetupSelection.timerUpdate(PopupSetupSelection.java:105)
at dk.hkj.main.PopupSetupSelection.access$3(PopupSetupSelection.java:103)
at dk.hkj.main.PopupSetupSelection$2.actionPerformed(PopupSetupSelection.java:72)
at javax.swing.Timer.fireActionPerformed(Unknown Source)
at javax.swing.Timer$DoPostEvent.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: dk.hkj.vars.VarExceptions$ValueException: A struct can not contain a value
at dk.hkj.vars.VarValueStruct.asString(VarValueStruct.java:75)
at dk.hkj.vars.VarValue$6.execute(VarValue.java:267)
at dk.hkj.script.Functions$FuncVarValue.execute(Functions.java:113)
at dk.hkj.script.Script.parseValue(Script.java:265)
at dk.hkj.script.Script.parseBitOp(Script.java:312)
at dk.hkj.script.Script.parseProduct(Script.java:384)
at dk.hkj.script.Script.parseSum(Script.java:444)
at dk.hkj.script.Script.parseCompare(Script.java:486)
at dk.hkj.script.Script.parseLogical(Script.java:522)
at dk.hkj.script.Script.parseQuestionMark(Script.java:548)
at dk.hkj.script.Script.parseExpression(Script.java:573)
at dk.hkj.script.Script.expression(Script.java:1181)
... 24 more
;; AKD1G: Tx <DRV.FAULTS?>
;; AKD1G: Tx <txrx? DRV.FAULTS>
;; 192.168.1.173: Tx: <DRV.FAULTS..> 44 52 56 2E 46 41 55 4C 54 53 0D 0A
;; 192.168.1.173: Rx: <502: Bus under voltage.> 35 30 32 3A 20 42 75 73 20 75 6E 64 65 72 20 76 6F 6C 74 61 67 65 2E 0D
;; AKD1G: Rx <502: Bus under voltage.>
;; AKD1G: Rx after :readmath: substring("value",4) <e>
I have created TestController GitLab group to store Devices files.
3. parameter in substring is column after last to include, this matches the Java format, except I do not fail when columns are outside actual string.
For the resizing try adding a :layout: tag
I have created TestController GitLab group to store Devices files.
I will include the AKD1G in the next release.
All the bugs you have found will also be fixed in next release.
I am not sure if it will work at a faster sample rate, the OS or Java system may have something to do that prevents it from being reliable. Even logging from the internal generators cannot maintain 0.01 second sample rate over longer time.
I have reduced the internal limit to 0.005, but it can only be started from the command line with "#log 0.005", for now I will keep the 0.01 limit in the menus and in formatting.
Please report your experience with it.
Thanks for the update. Just a little time to play right now. I tried:
#log 0.007
and TestController started logging at 0.005 sec intervals which surprised me. I am guessing you set the min quanta to 5 mSec and it rounded the request from 7 mSec to 5 mSec???
After 25 minutes of logging at 5 mSec interval with my fast device it seems fine. Here are some info from this quick test:
Name Unit First Last Minimum Maximum Range Average Slope
Math.DeltaTime 0.0000 6.0000 0.0000 53.0000 53.0000 5.0988 -0.0000
#commandtime? returns:
;; AKD2GS last: 2.79 ms average: 3.80 ms slowest: 56.98 ms
I then tried out some of the tableCalc functions on the Math channel Type change with 2 samples (basically delta time on log samples):
=tableCalcMax(10)
;; 57.0
=tableCalcMin(10,1)
;; 1.9999999998835847
=tableCalcAvg(10)
;; 5.073882801777281
=tableCalcRMS(10)
;; 5.293048934219226
=tableCalcStdDev(10)
;; 1.5073280563632954
All the above calculations look correct and show the logging timing seems stable at 5 mSec per sample. Pretty impressive sampling!
I tried to execute your hint of getting a better presentation of the Chart.
PS: While doing so I have finally become aware of the tab with the description "Current values".
Due to the double meaning: "current" vs. voltage and "actual or up-to-date" you may consider taking another word for this tab - not a big deal for me, but if someone is new to TestController, it maybe helps to assign the meaning of the tab by just reading and immediately knowing, what it stands for, perhaps: "Up-to-date values"...I don't know... :)
Do I have the possibility, to match the values of both y-axis, when using at least two DMM?
...just brainstorming...
Does TestController already have something like an "AutoHoldFeature" like the Fluke 179, 87 or 289, which could be used via "Popups > Readout" when having both testleads in your hands, and not being able to reach the instrument, to press the "Hold"-button?
As probably hardly any benchtop DMM or a cheaper handheld DMM does have this feature, it could be an advantage/gain in usability?! ???
dk.hkj.script.ProgramExceptions$UnknownException:
getMatchGroup(value, "[^,]+",2)____<----____
at dk.hkj.script.Script.expression(Script.java:1193)
at dk.hkj.devices.DeviceAscii$TranslatingCommInterface.write(DeviceAscii.java:297)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:106)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:156)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:199)
I then tried various combinations of RegEx espression and getMatchGroup command and could not get the second or third, etc. I could only ever get getMatchGroup(value, "RegEx", 1) to work giving the first match "PL.FB [Counts]".;; AKD2GS: Tx <getunitsch2?>
;; AKD2GS: Tx <txrxn? 3 REC.RETRIEVEHDR>
;; 192.168.1.193: Tx: <REC.RETRIEVEHDR..> 52 45 43 2E 52 45 54 52 49 45 56 45 48 44 52 0D 0A
;; 192.168.1.193: Rx: <Recording> 52 65 63 6F 72 64 69 6E 67 0D
;; 192.168.1.193: Rx: <1,1> 31 2C 31 0D
;; 192.168.1.193: Rx: <axis1.pl.fb [Counts16Bit],axis1.vl.fb [rpm],axis1.il.fb [Arms],vbus.value [Vdc],fb3.mechpos [Counts],ain1.value [V]> 61 78 69 73 31 2E 70 6C 2E 66 62 20 5B 43 6F 75 6E 74 73 31 36 42 69 74 5D 2C 61 78 69 73 31 2E 76 6C 2E 66 62 20 5B 72 70 6D 5D 2C 61 78 69 73 31 2E 69 6C 2E 66 62 20 5B 41 72 6D 73 5D 2C 76 62 75 73 2E 76 61 6C 75 65 20 5B 56 64 63 5D 2C 66 62 33 2E 6D 65 63 68 70 6F 73 20 5B 43 6F 75 6E 74 73 5D 2C 61 69 6E 31 2E 76 61 6C 75 65 20 5B 56 5D 0D
;; AKD2GS: Rx Timeout
Good, remember if you have ideas for other table... functions, please say.
Now that I have the units I wonder if there is a way to make the units of the logged items dynamic? In other words, the device file presently has
=tableCalcMax(AKD2GS.CH1)
On a related topic, I have been using the nice Histogram tab. Very useful. How about adding a cursor readout like on the Chart tab? Click the Histogram graph and read out the bin range and the height of the bin in a side window like for the Chart?
=tableCalcStdDev(5)
;; 1.8172911569598222
=tableCalcStdDev("AKD2GS.CH2")
;; AKD2GS: Tx <REC.TRIG>
;; AKD2GS: Tx <txrx REC.TRIG>
;; 192.168.1.193: Tx: <REC.TRIG..> 52 45 43 2E 54 52 49 47 0D 0A
;; 192.168.1.193: Rx: <> 0D
;; AKD2GS: Tx <REC.DATA?>
;; AKD2GS: Tx <txrxn? 2 REC.RETRIEVEDATA 0>
;; 192.168.1.193: Tx: <REC.RETRIEVEDATA 0..> 52 45 43 2E 52 45 54 52 49 45 56 45 44 41 54 41 20 30 0D 0A
;; 192.168.1.193: Rx: <1> 31 0D
;; 192.168.1.193: Rx: <2.442,1.506,-0.002,0.504,3747273272,0.000> 32 2E 34 34 32 2C 31 2E 35 30 36 2C 2D 30 2E 30 30 32 2C 30 2E 35 30 34 2C 33 37 34 37 32 37 33 32 37 32 2C 30 2E 30 30 30 0D
;; AKD2GS: Rx <2.442,1.506,-0.002,0.504,3747273272,0.000>
;; AKD2GS: Rx as numbers <2.442 1.506 -0.002 0.504 3.747273272E9 0.0>
;; 1.8172911569598222
But, the operations are still not identical. Using a column number just gives the calculation result. Using the column name queries the device for a set of values before giving the result of the calculation from the table. Still gives the right number, just has extra communications traffic. See below debug log.
Thank you very much for TestController 1.33, HKJ! :-+
By the way...I asked Brymen, whether they have any idea or hint to help me out with USBHID vs. Raspberry OS - this is, what I got:
We have no experience in raspberry pi and thus have no idea how to
help you. Sorry. The communication protocol of BM867s+BC-86X interface
cable conforms to USB HID 1.1. You will need to study how to have it
work with your raspberry pi.
Best Regards,
Gary/Brymen
I will keep trying - not giving up... :-/O
the concept of sigrock is different, anyway I see sigrok as much, much more powerfull.
You do not have to do any scripting or programming to do this, just unpack the program and run it on Window, Linux or Mac, then you have a GUI. It is possible to automate a lot with scripting, but it is never required.
I thought that using the #sections, #metaSection commands would help with this task. But, I must admit I can't figure out how to use those commands properly.
Could you provide an example file of using these commands?
One question: while testing the oscilloscope interface definition I used the Popups | Test interface. When I check all of the gets all the numeric returned values are green. But anything returning a string is red. See attached screen shot of that window. In the device file I have listed :string: on the line after the get like:
#interface setCH1Coupling CH1:COUPLING (value)
#interface getCH1Coupling CH1:COUPLING?
:string:
but still get a red box. Is the Test interface screen hard coded to put red for anything not a number or am I doing something wrong in the device file?
Using
#interfaceType OSC OSC:2 OSC:3 OSC:4
is an interesting idea and maybe a better way than I did it. But, how to handle 2 versus 4 channel in the device file? The way I have it now the interface commands for CH3 and CH4 are removed from dual channel scopes. How to remove OSC:3 and OSC:4 from the interface for dual channel with the above idea?
Also, how to handle the 4 oscilloscope measurements which are logged separate from the CH1-4 commands that are for just setting up the oscilloscope inputs? Do the measurements also become OSC:1, OSC:2, etc? Lastly, how to handle the fith measurement which is labeled "I" and not by a number in the scope scpi language?
Ive got this cheap load tester from aliexpress, named DL24P. Would this program be able to get the readings from this device? It uses a CH340/341 chip . So probably it's a no go , but maybe someone know a way to get the log into a excel file :)
I've installed Termite but don't know if Im doing it right to obtain the hexdata. I see stuff like this refreshing every second:
35: ÿU[01][02][00][00][0C][00][00][00][00][00][15][00][00][00][00][00][00][00][00][00][00][00][00][12][00][00][19]
<[00][00][00][00]ÜÿU[01][02][00][00][0C][00][00][00][00][00][15][00][00][00][00][00][00][00][00][00][00][00][00][12][00][00][19]
<[00]
I've installed Termite but don't know if Im doing it right to obtain the hexdata. I see stuff like this refreshing every second:
35: ÿU[01][02][00][00][0C][00][00][00][00][00][15][00][00][00][00][00][00][00][00][00][00][00][00][12][00][00][19]
<[00][00][00][00]ÜÿU[01][02][00][00][0C][00][00][00][00][00][15][00][00][00][00][00][00][00][00][00][00][00][00][12][00][00][19]
<[00]
You need to open Settings and check mark "Hex view" in the "Plug-ins" section.
The output I see is:
ff 55 01 02 00 00 0c 00 00 00 00 00 00 00 00 00 ÿU..............
00 00 00 00 00 00 00 00 00 15 00 00 00 28 3c 00 .............(<.
00 00 00 cc ...Ì
It's repeating the above message. I think I Need to figure out how I can get an unique message for different parts of data.
Edit: I found an article where someone else analysed the hex output of this device https://auto-scripting.com/2020/05/03/atorch-dl24-hack-1/
below in the article he posts some hex codes. Is this some data what is usefull?
Luckily I found this software last Friday. It works from beginning with my HP34401A and my SDG2122 and I got also my SDS2504X+ connected but this needs further investigations.
So I tried to setup a config for my old but reliable Fluke 45, with a very simple config. The Fluke 45 is from the time before SCPI but the interface is well documented and the commands are comparable.
#1 How can the content of the console be saved? I did it in this case with a screenshot.
Thanks for any help!
What about the java error message from my screenshot?
I have the dl24p, should I use the termite program to get the ascci info? But for some reason I don't see any changes in data when running a load/batterytest
After getting the Fluke45 connected and running I can see the measurements in the log window and also the by
TC calculated numbers but nothing is shown in the table/chart, only the time stamp. (log attached)
Can I get some advice what can be wrong here?
Thanks in advance!
If the numbers are recognized by TC, how are they than transferred to the table/chart??
I have done a Hex-Terminal.
The prompt is always finished with 0DH 0AH (CR/LF). So I try your advice during the next days.
I have done a Hex-Terminal.
The prompt is always finished with 0DH 0AH (CR/LF). So I try your advice during the next days.
With the SCPIx driver you can now use #removePromptChars
Using "#removePromptChars 4" will remove 4 characters, i.e. it will include CR LF.
And then you do not need to redefine anything and it will probably also work with GPIB.
#metaSection DC_DEVICE
#subDriver DC
#value Voltage V D1
#value Current A D3
#value Power W D1
#value Energy Wh D2
#askValues values?
; Format of answer: f=float, u=remove trailing letters, x=skip, *=Zero upper case values if this value is 0
#askValuesReadFormat ffffxxxx
#interfacetype Power
#interface readVoltage 0
#interface readCurrent 1
#interface readPower 2
#interface readEnergy 3
#cmdSetup buttons Reset
:write: tx
Wh 1
Ah 2
Time 3
All 5
#cmdSetup numberInt Backlight
:read: backlightTimer?
:write: tx 0x21
sec 0 255
#value Voltage V D1
#value Current A D3
#value Power W D1
#value Energy Wh D2
#askValuesReadFormat ffffxxxxThis line control what to include, each f is a value and x is a ignored part. If you add more f you must also and more #value lines, they must match.
two questions. I've posted you hex data, is that something I also could translate to figure out what data it contain?
and I editied the atarch txt file but the changes are not applied. Does test-controller store it's settings in register? I already tried removing the program and installing again but no change
But how does your program translate the hex data FF551103310000000001 to #askValuesReadFormat ffffxffxx
Sorry for so many questions :) but how could I edit the driver? I've already extracted testcontroller.jar but now the challenge is to find the file. And which program should I need for editing? I have a bit of programlanguage understanding so maybe Im able to edit some
DC Meter Report Offset Field Block size Note 03 Device Type 1 byte 01 Device Type 04 Voltage 3 byte 24 bit BE (divide by 10) 07 Amp 3 byte 24 bit BE (divide by 1000) 0A Watt 3 byte 24 bit BE (divide by 10) 0D W·h 4 byte 32 bit BE (divide by 100) 11 Price (per kW·h) 3 byte 24 bit BE (divide by 100) 14 4 byte unknown value 18 Temperature 2 byte 16 bit BE 1A Hour 2 byte 16 bit BE 1C Minute 1 byte 1D Second 1 byte 1E Backlight 1 byte |
This page https://github.com/NiceLabs/atorch-console/blob/master/docs/protocol-design.md shows the following data.
Could it be that the definitions are a bit off?
Mmh, then I think I cant help any further. Can send more hex codes from this device but I think we need information from the maker of the software behind this device
;; Found Tektronix MDO3024 TekScope on 192.168.1.46 sn: C021804
;; Found Tektronix DPO3034 TekScope on 192.168.1.181 sn: C013387
;; OscTek_4: Tx <MEASUREMENT:MEAS1:VALUE?>
;; OscTek_87: Tx <MEASUREMENT:MEAS1:VALUE?>
;; OscTek_4: Rx <:MEASUREMENT:MEAS1:VALUE 38.7249E-3>
;; OscTek_4: Tx <MEASUREMENT:MEAS2:VALUE?>
;; OscTek_4: Rx <:MEASUREMENT:MEAS2:VALUE -126.2936>
;; OscTek_4: Tx <MEASUREMENT:MEAS3:VALUE?>
;; OscTek_4: Rx <:MEASUREMENT:MEAS3:VALUE 165.7627>
;; OscTek_4: Tx <MEASUREMENT:MEAS4:VALUE?>
;; OscTek_4: Rx <:MEASUREMENT:MEAS4:VALUE 7.0186E-3>
;; OscTek_4: Tx <MEASURE:IMMED:VALUE?>
;; OscTek_4: Rx <:MEASUREMENT:IMMED:VALUE 5.6271E-3>
;; OscTek_4: Rx as numbers <0.0387249 -126.2936 165.7627 0.0070186 0.0056271>
;; OscTek_87: Rx <1.0204E-3
>
;; OscTek_87: Tx <MEASUREMENT:MEAS2:VALUE?>
;; OscTek_87: Rx <57.3830
>
;; OscTek_87: Tx <MEASUREMENT:MEAS3:VALUE?>
;; OscTek_87: Rx <-43.9564
>
;; OscTek_87: Tx <MEASUREMENT:MEAS4:VALUE?>
;; OscTek_87: Rx <2.0977E-3
>
;; OscTek_87: Tx <MEASURE:IMMED:VALUE?>
;; OscTek_87: Rx <1.4246E-3
>
;; OscTek_87: Rx as numbers <57.383 0.0020977>
;; OscTek_87: Tx <MEASUREMENT:MEAS2:VALUE?>
;; OscTek_87: Rx <57.3830
>
;; OscTek_87: Tx <MEASUREMENT:MEAS3:VALUE?>
;; OscTek_87: Rx <-43.9564
>
I did a further experiment where I changed the read format line. The above is the result if the read format line is
#askValuesReadFormat xFxFxFxFxF
If I change the read format to
#askValuesReadFormat uFuFuFuFuF
the error switches around. Now the previously working OscTek_4 does not work and the previously not working OscTek_87 does work.
Should I change the device file to use two different #askValuesRead lines depending on scope model number? If so, then what is the simple way to do this?
Hereby a picture and the last minute of the log https://justpaste.it/6g9lj (https://justpaste.it/6g9lj) from the dl24p device. If you need a longer log please let me know:)
You can rid of the extra CR LF with some :readmath:
replace(replace(value,"\r",""),"\n","");
A shorter version may be enough:
replace(value,"\r\n","");
I did a further experiment where I changed the read format line. The above is the result if the read format line is
#askValuesReadFormat xFxFxFxFxF
If I change the read format to
#askValuesReadFormat uFuFuFuFuF
the error switches around. Now the previously working OscTek_4 does not work and the previously not working OscTek_87 does work.
What are you doing? x=ignore value, F=parse number, u=parse number with unit after it (like 5V)
Mostly upper and lower case works the same way, only exception is when a * is present in the line.
Are you saying that it is possible to have :readmath: just after this line to remove the 5 extra "\n" and "\r"? I don't think that would work since the error happens inside the #askValues in that #askValues just returns two numbers like:
thanks,
btw, now I've used my android phone to scan the DL24 device an it outputs a bit more info. In termite I only saw the FF-55 but with my mobile I also see 00-00
like this:
A 16:05:51.408 "(0x) FF-55-01-02-00-00-0B-00-00-64-00-00-67-00-00-00-01-00-00-00" received
A 16:05:51.430 "(0x) 00-00-00-00-00-13-00-00-22-32-3C-00-00-00-00-39" received
https://justpaste.it/3lbp0
One question: while testing the oscilloscope interface definition I used the Popups | Test interface. When I check all of the gets all the numeric returned values are green. But anything returning a string is red. See attached screen shot of that window. In the device file I have listed :string: on the line after the get like:
#interface setCH1Coupling CH1:COUPLING (value)
#interface getCH1Coupling CH1:COUPLING?
:string:
but still get a red box. Is the Test interface screen hard coded to put red for anything not a number or am I doing something wrong in the device file?
By default all parameters are supposed to be numeric, I have a build in list of functions that accept string parameters.
And please get rid of the channel no in the name, instead use:
#interfaceType OSC OSC:2 OSC:3 OSC:4
#interface setCoupling CH(channel):COUPLING (value)
Then I will add Coupling & MathDefinition on the list for string parameters
HKJ,
I was experimenting with doing a frequency sweep from low to high frequency with the chart X-axis set to frequency rather than time. After the script started logging I had the line:
#CHARTX (arb+".Frequency1")
which correctly made the X-axis frequency. Very nice to be able to have X-Y graph.
But, while logging data the chart stops/the X-axis becomes static and no longer auto scales. If you click to a different tab and come back to the Chart tab the X-axis auto scales to the data acquired up to that point and then remains static. This means you can't see the logged data plotted while being acquired.
I am using latest V140 and the channel mapped to the X-axis was set for auto scaling and not Auto include 0 in the Scales for chart tab.
Is this behavior expected or a bug or have I set something up wrong?
I also note that when the X-axis is not time that the cursor does not work. I suspect that is because the cursor mechanism only understands Y versus time and doesn't understand X-Y charts. Is that correct?
Please use the attached Tektronix device file in your next release.
In XY mode I cannot always map from X to a single Y value. I may improve this at a later date and allow cursor if the axis has increasing or decreasing values.
Is there a way to do some thing like the above or should I just go ahead and define more #replaceText values?
You could just take the numerically lowest Y-value at the cursor X-position. For single value functions you get what you want and for multi-value functions you get one well defined value.
Just a thought.
Attached is a device file for the Keithley 2260B series of power supplies. Since these Keithely supplies are just a re-brand of the GW Instek PSW series the file includes those which , by documentation, should work but I don't have any GW Instek version to test with.
Please include in the next TC release.
How about environmental test devices. Airflow HVAC, particle counter (wildfires) CO2, etc, etc?
I really, really like an all-in-one app. pain logging multiple devices, sorting out on computer to make comprehensive presentation
Thanks, I have done one modification to the source resistance setting.
I do miss the radio buttons for fast selection of some common voltages & currents, but I have not added them.
If did also fix some Min/Max text replacements.
It looks like the USB interface is serial, this means you can do: "#port 2268 com" to support both, there must also be a baudrate for the com port.
Attached is a Keithley 2260B file with all the above updates to include with the next TC release.
#scpiCmd getDefCH6? txrxn? 3 REC.RETRIEVEHDR
:readmath: getMatch(value,"(?<=1,1\\s).*")
:readmath: getElement(value,5)
For this device if CH6 is not in use the above getElement returns nothing/empty string which TestController sees and no Rx value and then waits for a timeout. See below debug window sequence.;; AKD2GS: Tx <getDefCH6?>
;; AKD2GS: Tx <txrxn? 3 REC.RETRIEVEHDR>
;; 192.168.1.193: Tx: <REC.RETRIEVEHDR..> 52 45 43 2E 52 45 54 52 49 45 56 45 48 44 52 0D 0A
;; 192.168.1.193: Rx: <Recording> 52 65 63 6F 72 64 69 6E 67 0D
;; 192.168.1.193: Rx: <1,1> 31 2C 31 0D
;; 192.168.1.193: Rx: <AXIS1.IL.FB [Arms],AXIS1.VL.CMD [rpm],AXIS1.VL.FB [rpm],vbus.value [Vdc],AXIS1.TEMP [degC]> 41 58 49 53 31 2E 49 4C 2E 46 42 20 5B 41 72 6D 73 5D 2C 41 58 49 53 31 2E 56 4C 2E 43 4D 44 20 5B 72 70 6D 5D 2C 41 58 49 53 31 2E 56 4C 2E 46 42 20 5B 72 70 6D 5D 2C 76 62 75 73 2E 76 61 6C 75 65 20 5B 56 64 63 5D 2C 41 58 49 53 31 2E 54 45 4D 50 20 5B 64 65 67 43 5D 0D
;; AKD2GS: Rx Timeout
Because this sequence returns nothing and because TC sees that as no Rx value, then execution of TC halts for 5 seconds or so while it waits through the Rx timeout period.Quick question, for a SCPI command how can you do an IF statement in follow on :readmath:?
Please replace the current device file with this one in the next release, thanks. (Attachment Link)
=var foo=5
#popupshowquestion "User input" foo "One" "Two" "Three"
="User input was "+foo
When I run the above with V142 I get the pop up with the three buttons. But, no matter what button I push the last line shows variable foo un-modified at its original value of 5. In debug mode DOS window I see no errors.Once again some great new functionality added, thanks. I am trying to use the #POPUPSHOWQUESTION and having trouble understanding it. I tried the following short script:Code: [Select]=var foo=5
When I run the above with V142 I get the pop up with the three buttons. But, no matter what button I push the last line shows variable foo un-modified at its original value of 5. In debug mode DOS window I see no errors.
#popupshowquestion "User input" foo "One" "Two" "Three"
="User input was "+foo
I had assumed that #POPUPSHOWQUESTION second argument varName meant pushing the buttons would assign one of 0, 1, or 2 to varName. Why doesn't this script's #POPUPSHOWQUESTION change variable foo?
V1.43 is up
Not sure what macOS Big Sur has broken, but the graphics on the selected tab have gone a bit odd?
Tried it on 2019 27" iMac and 2020 13" MacBook Pro
With the program SignalAnalyzer you can easy view measurements in the time and frequency domain (fft). Also a histogram and a post process filter exists. It has the possibility to easy connect it with a small program to realize live measurements. www.signalanalyzer.de (http://www.signalanalyzer.de)
With the program SignalAnalyzer you can easy view measurements in the time and frequency domain (fft). Also a histogram and a post process filter exists. It has the possibility to easy connect it with a small program to realize live measurements. www.signalanalyzer.de (http://www.signalanalyzer.de)
I could easily add FFT to TestController, but I do not believe that it is very useful at the low frequencies that it is designed for. If SignalAnalyzer can read CSV files and do FFT at low frequencies, it can be used on the log files from TestController.
The low frequencies I am talking about is sample rates at maximum 100Hz often around 1Hz.
Can you please share a csv file, I will trie to import in SignalAnalyzer.
With the program SignalAnalyzer you can easy view measurements in the time and frequency domain (fft). Also a histogram and a post process filter exists. It has the possibility to easy connect it with a small program to realize live measurements. www.signalanalyzer.de (http://www.signalanalyzer.de)
I could easily add FFT to TestController, but I do not believe that it is very useful at the low frequencies that it is designed for. If SignalAnalyzer can read CSV files and do FFT at low frequencies, it can be used on the log files from TestController.
The low frequencies I am talking about is sample rates at maximum 100Hz often around 1Hz.
The Dataset you send is not very good. You need many periods of the signal of interest in you dataset. Maybe you record for a longer time, or decrease the sample rate. Your dataset is a lot over sampled. So the frequency range of interest is only a very small band. Record for low frequency over a much longer time.
Can you please share a csv file, I will trie to import in SignalAnalyzer.
The Dataset you send is not very good. You need many periods of the signal of interest in you dataset. Maybe you record for a longer time, or decrease the sample rate. Your dataset is a lot over sampled. So the frequency range of interest is only a very small band. Record for low frequency over a much longer time.
#verifyDevice txrx? &
:readmath: "S200"
#idString "S200"
#name Kollmorgen S200 Servo
#handle S200
#port com
#eol \_
#comfixedbaud
; 19200 baud, Odd parity, 8 data bits, 1 stop bit
#baudrate 19200O81
#driver SingleValue
But I don't really know what the "SingleValue" driver means/does.I am trying to make a device file for a device with a very low level serial protocol. It is pure binary. It does not use ascii. The PC always sends two binary bytes and gets one binary byte in return. No hand shaking and no end of line characters. When reading the first byte is the address with lsb = 0 for read and the second byte is just a null. The device replies with a single binary byte with the value. When writing the first byte is the address with lsb = 1 for write and the second value is the binary data value to store at the requested address.
How to specify binary values in the writes? While in debug mode when I try txrx? 0x04 0x00 the DOS debug window implies TC sends 0x04 0x00 as 9 ascii characters and does not convert to two binary bytes.
I am trying to make a device file for a device with a very low level serial protocol. It is pure binary. It does not use ascii.
V1.44 contains a new driver called "Block" for this purpose, the driver is NOT finished yet, but can be used.
#verifyDevice txrx1? \0x26 \0x00
:readmath: "S200"
#idString "S200"
#name Kollmorgen S200 Servo
#handle S200
#port com
#comfixedbaud
; 19200 baud, Odd parity, 8 data bits, 1 stop bit
#baudrate 19200O81
;#eol \_
;#driver ascii
;#driver SingleValue
#driver Block
#author gby
Starting
;; Start thread for: COM1 - Kollmorgen S200 Servo
;; COM1: Set params: 19200
java.lang.NullPointerException
at dk.hkj.devices.DeviceBlock$TranslatingCommInterface.cmdIdn(DeviceBlock.java:64)
at dk.hkj.devices.DeviceBlock$TranslatingCommInterface.write(DeviceBlock.java:201)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:106)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:101)
at dk.hkj.main.InterfaceThreads$DeviceThread.initDevice(InterfaceThreads.java:1340)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1413)
java.lang.NullPointerException
at dk.hkj.devices.DeviceBlock$TranslatingCommInterface.cmdIdn(DeviceBlock.java:64)
at dk.hkj.devices.DeviceBlock$TranslatingCommInterface.write(DeviceBlock.java:201)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:106)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:101)
at dk.hkj.main.InterfaceThreads$DeviceThread.initDevice(InterfaceThreads.java:1343)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1413)
;; Stopping thread for: COM1 - Kollmorgen S200 Servo
;; COM1: Close
The above happens with the device's serial cable plugged in or not plugged in. So, you should be able to duplicate without any device.Got a chance to start working with V144 with #driver Block and ran into Java errors and would not connect. Below is the stub driver file I started with.Code: [Select]#verifyDevice txrx1? \0x26 \0x00
#idString "S200"
#name Kollmorgen S200 Servo
#handle S200
#port com
#comfixedbaud
; 19200 baud, Odd parity, 8 data bits, 1 stop bit
#baudrate 19200O81
#driver Block
#author gby
#scpiCmd HsTemp? txrx1? 0x4c 0x00
;:readmath: poly(value,-50.0,1.4775)
#scpiCmd Model? txrx1? 0x04 0x00
;:readmath: (0xF8&value)
;; S200: Tx <HsTemp?>
;; S200: Tx <txrx1? 0x4c 0x00
:readmath: poly>
java.lang.NumberFormatException: For input string: "00
:readmath:"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at dk.hkj.util.StringUtil.parseInt(StringUtil.java:531)
plus a bunch more java error lines. The Model? command gives a slightly different java error:;; S200: Tx <Model?>
dk.hkj.script.ProgramExceptions$OperationNotSupportedForDataTypeException: BitAnd
0xF8&value____<----____
at dk.hkj.script.Script.parseBitOp(Script.java:351)
=var temp=0
=temp = deviceRead("S200", "HsTemp?")
=temp = poly(temp,-50, 1.4775)
=temp
But, I can't seem to do any :readmath" on the returned value.
Is there any way to view the release notes other than rolling back to a previous version of the software? Could not see a readme file or anything on the website.
I have not posted the release notes on my website, but you can find them in this thread and here they usually contains more explanation.
I hope you post the definition when you get it working (Remember the #author tag).
I haven't covered much of the ET5410's functionality, but I spent a lot of time correcting the formatting of its SCPI responses so that TestController can work with it.
There's probably still plenty of things that don't work quite right, but at least it's a starting point should anyone need it.
File attached.
1. I have tried both using #popupFileName, and declaring a var with the use of #popupText - I can not seem to get the #log function to use this filename as the argument it asks for is the literal filename - I do not appear to be able to pass it a variable to use as a filename for the log.
2. I suspect it is more an issue with the Java environment than with your program, but when I enter a string of text into the above prompt, I can not hit Enter on the keyboard to "OK" it - the OK button has to be clicked. This is not a massive issue, but I am planning to use this in conjunction with a QR code reading program that outputs keyboard emulation with a text string and then the carriage return key. The more I can automate, the more confident I can be about leaving the task in the hands of someone else! ;)
But, I can't seem to do any :readmath" on the returned value.
1. #verifyDevice in the device file leads to lots of java errors:
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(Unknown Source)
at dk.hkj.devices.DeviceBlock$TranslatingCommInterface.cmdIdn(DeviceBlock.java:57)
at dk.hkj.devices.DeviceBlock$TranslatingCommInterface.write(DeviceBlock.java:328) ....and bunches more
Changing to #VerifyDevice with capital "V" and it works. Should TC really care about the capitalization??
2. When doing the model determination I need to match 8 possible 5 bit codes to the corresponding ascii text names. I could do getElement with 32 entries but for only 8 possible valid values is there a simpler way to do the enumeration from the code number to the ascii text?
3. I am trying to read a 16 bit value by querying the device for the two bytes and combining them. If I individually read each byte and combine them in a script it works. I then tried to do it with one device serial command:
txrx2? 0x5e 0x00 0x5c 0x00 / 0u2
and got lots of Java errors:
java.lang.NullPointerException
at java.util.Arrays.copyOfRange(Unknown Source)
at dk.hkj.devices.DeviceBlock$TranslatingCommInterface.parseFormat(DeviceBlock.java:216)
at dk.hkj.devices.DeviceBlock$TranslatingCommInterface.writeRead(DeviceBlock.java:270)
at dk.hkj.devices.DeviceBlock$TranslatingCommInterface.write(DeviceBlock.java:349)
.... more Java errors ending in Rx Timeout.
I then tried variations on this command with/without format specifier and other variations all with Java errors and ending in Rx Timeout.
How would you suggest I read two consecutive locations (sending two bytes for each request) to make one 16 bit word? Or, 24 bit word, etc.
4. This device uses 1 start bit, 8 data bits, odd parity, and 1 stop bit. I have not seen a way to specify a start bit on the driver. How to do that? I have the line #baudrate 19200O81 in the device file which I assume tells TC to do Odd parity, 8 data bits, and 1 stop bit.
By the way, when using parity what does TC do when there is a receive parity error?
5. On the Load Devices tab when I enter the Baudrate manually for this device as 19200O81 it takes it. But the next time I restart TC it comes back as just 19200. So, in the Load Devices tab how do you set parity, data bits, stop bits and get it to stick? If the device file has #comfixedbaud does TC use the #baudrate command in the device file and ignore the value listed in the Load Devices tab?
2. I looked at the suggested matchBitsList. It seems to use a mask to see if a bit sequence is set. The required function is match a number. I originally asked because the web page for getElement says "This is used to convert a index (From 0 and up to about 10 or 20) to a text." and I was worried 32 entries might not work. 32 entries works fine so this step is done with getElement.
3. Still experimenting with ways to read two bytes to form 16 bit word. I can get it to work in a script if I put a #delay between the two individual byte read requests. However, in #scpiCmd's I can't seem to replicate the result. If I put two read requests in a row in a script the second read errors and Rx Timeouts. So, if there are two lines in a row like
=templ = deviceRead("S200", "txrx1? 0x5E 0x00")
=tempm = deviceRead("S200", "txrx1? 0x5C 0x00")
the first read works and the second one doesn't. For #driver Block with two commands in a row does TC wait for the first response before sending the second request? The device expects to receive byte, byte then sends reply and after reply is done is ready for next receive byte. This simple device has no receive buffer to que commands. Suggestions for #scpiCmd to retrieve multiple bytes and have delays between byte requests?
6. How to set/clear individual status bits within a byte? For example, there is a byte with individual bits and want to set one bit and not change the others. The standard way to do that is to read the location, set the one bit, and then write the modified value back. In a device file how to read, modify value, and write it back?
Been using the Calculator popup quite extensively. 8) :)
Occasionally it would have been nice to copy and
paste some of the results.
1.) parallel resistor calculations
2.) frequency from R and C
3.) R from f and C.
Please see attached my driver for a HSPY 400V/1A power supply, controlled via RS232/Modbus.
A question about driver implementation - for a PSU, should #askValues be set to fetch only current values (output V, I and power in this case), or should it also fetch the setpoints as well? (V and I in this case - there is a power setting mode but it's not very usable so I've skipped it).
I have provided two versions of the values command in the driver, with the one with setpoints included commented out - if I've made the wrong choice in your opinion then please fix it!
I will also contribute a driver for the DCL6104A Dingchen electronic load once I have finished it (hopefully this weekend).
I have also fixed up the interfaces thing - I hadn't read the docs fully and misinterpreted the get/set/read definitions. Should be OK now.
OK, that will teach me to do things in a rush!
Should I have a third go? Or have you already fixed my errors? (If the latter, I'll just wait for the next release, as I won't be using the interface bit myself).
#scpiCmd IOut? holding? 0x1003 /1000
Other than that it seems OK, thanks for the correction (I did a quick check with the interface function too).Found a bug in my HSPY script - missed a zero on the IOut? query so it's 10x larger than it should be. Correct line below:Code: [Select]#scpiCmd IOut? holding? 0x1003 /1000
Other than that it seems OK, thanks for the correction (I did a quick check with the interface function too).
Another quick question - is there a recommended way to deal with a SCPI command that changes what units are returned depending on another setting?
In the other device I'm trying to write a driver for (a DCL6104A electronic load), the same SCPI command returns battery capacity as as either Wh or Ah depending on another setting (CC/CP/CR discharge mode), and I'm not sure what the best way to handle this is. You _can_ query the CC/CP/CR discharge mode setting to determine what the units are (CP is Wh, others Ah).
txrxn? 2 0x8a 0x00 0x88 0x00
;; S200: Tx <txrxn? 2 0x8a 0x00 0x88 0x00>
;; COM1: Tx: 8A 00 88 00
;; COM1: Rx: FF
;; S200: Rx <255>
;; 255
Using an oscilloscope on serial transmit and receive I can see the 4 transmit bytes and see 0xFF returns after Tx 0x8a and then 0x08 returns after Tx 0x88. I found some time to continue working on the low level binary serial interface. I (think) I found a couple of TC 2.48 issues:
txrx1Bin? \x4c
;; S200: Tx <txrx1Bin? \x4c>
;; COM1: TxBin: <L> 4C
;; COM1: RxBin: 34
;; S200: Rx <52>
;; 52
txrx1Bin? \x4c\x00
;; S200: Tx <txrx1Bin? \x4c\x00>
;; COM1: TxBin: <L.> 4C 00
;; COM1: RxBin: 34
;; S200: Rx <52>
;; 52
txrx1Bin? \x8a
;; S200: Tx <txrx1Bin? \x8a>
;; COM1: TxBin: <?> 3F
;; COM1: RxBin: 00
;; S200: Rx <0>
;; 0
txrx1Bin? \x90
;; S200: Tx <txrx1Bin? \x90>
;; COM1: TxBin: <?> 3F
;; COM1: RxBin: 00
;; S200: Rx <0>
;; 0
txrx1Bin? \xa0
;; S200: Tx <txrx1Bin? \xa0>
;; COM1: TxBin: < > A0
;; COM1: RxBin: 88
;; S200: Rx <136>
;; 136
txrx1Bin? \xd8
;; S200: Tx <txrx1Bin? \xd8>
;; COM1: TxBin: <?> D8
;; COM1: RxBin: ED
;; S200: Rx <237>
;; 237
So, how to get TC to correctly send binary values between 0x80 and 0x9f with txrx1Bin? ??
temp 1114
;; S200: Tx <temp 1114>
;; S200: Tx <txrx1Bin? \x20\x50>
;; COM1: TxBin: <!P> 20 50
;; COM1: RxBin: 95
;;149
I was using #driver Block in my device file. With that driver the txrx1Bin? and txrxnBin? commands send nothing over the serial port and the txrx1? and txrxn? commands do send characters over the serial port. I changed to #driver ascii and now the txrx1Bin? and txrxnBin? commands do send. Sorry for my confusion.
Unfortunately, using #driver ascii with txrx1Bin? does not always send the correct character. From 0x00 up to 0x7f and from 0xa0 to 0xff all seems to work. But any value from 0x80 to 0x9f seems to always incorrectly send value 0x3F or character "?". See below from the DOS debug window showing selected values working and values 0x8a and 0x90 not working with 0x3F incorrectly sent.
So, how to get TC to correctly send binary values between 0x80 and 0x9f??
On the question for signed versus un-signed and on byte order this device does have signed integers and will receive ms byte first and ls byte second. So, commands to help with that natively would be convenient. For now using "readmath" will do.
Another question. If a device had a register in counts that needs to be scaled and offset to convert to real units, then for the read #scpiCmd it is a simple matter of :readmath:. But, if this register is read/write how to do a #scpiCmd for the write that takes the user/real units in and coverts to a single byte in counts before sending?
Can someone hint me the settings for the RD6012?
Tried al sort of settings on Riden en on the Port settings on the PC,
but always ended up with RX-timeout.
Searched a lot in this topic, but didn't find a solution.
Man this program is fantastic!!!!
Thanks to everyone helping on the project.
Can someone hint me the settings for the RD6012?
Tried al sort of settings on Riden en on the Port settings on the PC,
but always ended up with RX-timeout.
Searched a lot in this topic, but didn't find a solution.
As far as I know the only setting is baudrate on the RD6012, it must be 9600.
In TestController you must add the RD6012 to the loaded devices and specify correct serial port.
I hope that more people will make definitions for test equipment this year.I've got one outstanding for an electronic load that I promised to write last year, got a bit busy but will do it once I'm back on plague island.
Thanks HKJ for reply, I tried all the options, but not working for me.
Have to tell that I use the modified software by Unisoft, which is great.
The Ruideng original software works OK with this modified version.
But that software is a little bit ......
Installed latest Oracle Java.
I will try another laptop later.
I've got one outstanding for an electronic load that I promised to write last year, got a bit busy but will do it once I'm back on plague island.
On another topic, it appears from your website that you have both a Keysight 34461A and a Keithley DMM6500 - do you have any comments on which is better for
a) day to day interactive use as a bench meter or
b) use for logging etc (I see the Keithley has a driver, I assume the Keysight would need to be used in 34401A compatibility mode or with a newly written driver).
Am looking at investing in one of those two and the DMM6500 appears to be somewhat better value.
Thanks, very useful to have that viewpoint from someone with both available for handy bench use.
My primary use would be interactive, and I'm not so worried about the AC ranges so it sounds like the DMM6500 is the way to go, especially as it's a little cheaper. Has certainly escalated from the original plan to get a 34401A though!
If I do go get a DMM6500 I'll see if I can contribute to a better driver. Will also have a look at scanner card option - someone has made an open source clone for the 2000-SCAN card.
Unfortunately, using #driver ascii with txrx1Bin? does not always send the correct character. From 0x00 up to 0x7f and from 0xa0 to 0xff all seems to work. But any value from 0x80 to 0x9f seems to always incorrectly send value 0x3F or character "?". 9f??
Oops, it is fixed in the interim release below.
New function:
binConv(value,offset,count{,signed{,swap}})
=var foo=0xEFFF
=foo=binConv(foo,0,2,1,1)
=foo
;; -17
But, the exact same EF FF data from the serial port using the same binConv in the device file scpi command does not work. idfb?
;; S200: Tx <idfb?>
;; S200: Tx <txrxnBin? 2 \x8E\x00\x8C\x00>
;; COM1: TxBin: <?.?.> 8E 00 8C 00
;; COM1: RxBin: FF EF
;; S200: Rx <13873>
;; 13873
I have no idea how 13873 decimal could come from the received FF EF two hex bytes and just don't see it. Suggestions on how to get device file :readmath: to get the same results as running a script? Some sort of conversion function on the value inside the binConv?#scpiCmd IdFB? txrxnBin? 2 \x8E\x00\x8C\x00
:readmath: binConv(value,0,2,1,1)
I have no idea how 13873 decimal could come from the received FF EF two hex bytes and just don't see it. Suggestions on how to get device file :readmath: to get the same results as running a script? Some sort of conversion function on the value inside the binConv?
samplepvi?
;; S200: Tx <samplepvi?>
;; S200: Tx <txrxnBin? 7 \x5E\x00\x5C\x00\x5A\x00\x3A\x00\x38\x00\x8A\x00\x88\x00>
;; COM1: TxBin: <^.\.Z.:.8...> 5E 00 5C 00 5A 00 3A 00 38 00 8A 00 88 00
;; COM1: RxBin: A4 A6 47 00 00 FF 98
;; S200: Rx < 42150.27734375, 0.0, -0.10426148117501034>
;; 42150.27734375, 0.0, -0.10426148117501034
But, using #askValues samplePVI? ends up with ";; S200: Rx as number <>" in the DOS debug log.Is there a way to format the three numbers so that serial ascii #askValues can get the three numbers from the single combined command?
Is there a way to format the three numbers so that serial ascii #askValues can get the three numbers from the single combined command?
I found a bug in the evaluation sequence (I have been doing some modification to that including adding a bug), a new interim version is up.
Also try without a leading space.
samplePVI?
;; S200: Tx <samplePVI?>
;; S200: Tx <txrxnBin? 7 \x5E\x00\x5C\x00\x5A\x00\x3A\x00\x38\x00\x8A\x00\x88\x00>
;; COM1: TxBin: <^.\.Z.:.8...> 5E 00 5C 00 5A 00 3A 00 38 00 8A 00 88 00
;; COM1: RxBin: A4 A6 6A 00 08 FF D8
;; S200: Rx <42150.4140625, 4.4703483584, -0.04468349193214729>
;; 42150.4140625, 4.4703483584, -0.04468349193214729
[quote author=gby link=topic=234726.msg3398954#msg3398954 date=1609697631]
;; S200: Tx <samplePVI?>
;; S200: Tx <txrxnBin? 7 \x5E\x00\x5C\x00\x5A\x00\x3A\x00\x38\x00\x8A\x00\x88\x00>
;; COM1: TxBin: <^.\.Z.:.8...> 5E 00 5C 00 5A 00 3A 00 38 00 8A 00 88 00
;; COM1: RxBin: A4 A6 6A 00 08 FF D8
;; S200: Rx <42150.4140625, 4.4703483584, -0.04468349193214729>
;; 42150.4140625, 4.4703483584, -0.04468349193214729
[/quote]Edit: Sorry for asking, replaced in RD60XX.txt:
#replacetext RD60xx 60122 with #replacetext RD60xx 60121
Now it works. Happy me.
Thanks HKJ and Mike Lud for the software and RD60XX file.
I have one question: Is there one or two ID's for the 6012 supply?, i.e. did Riden change the ID at some time?HKJ,
I.e. if anybody reading here has a RD6012 working with the current software, please say.
I have one question: Is there one or two ID's for the 6012 supply?, i.e. did Riden change the ID at some time?HKJ,
I.e. if anybody reading here has a RD6012 working with the current software, please say.
I am not sure, I only have a 6006.
Increasing ;#readingDelay does not make difference. Tested from 2 to 10
#cmdSetup radio Discharge_Mode BATTERY
:read: BATT:MODE?
:write: BATT:MODE #;[300];CH:MODE BATT;[300]
:update: Discharge_Mode; ; CCCV99
:tip: Set the discharge mode of the battery test
:string:
CC CC
CR CR
:updatemodechange:
#cmdSetup multi Battery_I BATTERY
:read: CURR:BCC1?;CURR:BCC2?;CURR:BCC3?
:readmath: value.replace("R","")
:write: CURR:BCC1 #;[300];CURR:BCC2 #;[300];CURR:BCC3 #;[300]
:update: Battery_I;Discharge_Mode
:tip: Set the constant current current value
Number 1_ I 0 42
Number 2_ I 0 42
Number 3_ I 0 42
:enable: 1
#cmdSetup multi Battery_V BATTERY
:read: VOLT:BCC1?;VOLT:BCC2?;VOLT:BCC3?
:readmath: value.replace("R","")
:write: VOLT:BCC1 #;[300];VOLT:BCC2 #;[300];VOLT:BCC3 #;[300]
:update: Battery_V
:tip: Set the constant current cut-off voltage value
Number 1_ V 0 155
Number 2_ V 0 155
Number 3_ V 0 155
:enable: 1
#cmdSetup multi Battery_R BATTERY
:read: RESI:BCR?;VOLT:BCR?
:readmath: value.replace("R","")
:write: RESI:BCR #;[300];VOLT:BCR #;[300]
:update: Battery_R
:tip: Set the constant resistance cut-off voltage value of battery test mode
Number R_ Om 0 500
Number V_ V 0 155
:enable: 0
HKJ, I have an ET5410 electronic load. SCPI control. I can fully control the instrument interface. I had some difficulties in drawing up the menu. Is it possible to make the behavior of "multi Battery_ *" look like the picture. Manage "radio Discharge_Mode"?
The radio button creates a variable you can test on:HKJ, thanks, it helped.
:enable: BATTERY.Discharge_Mode=="CC"
Remember that programming is case sensitive.
Tell me, is there an event that handles a click on bookmarks?
I would like to make sure that when navigating through the tabs, the interface on the device changes.
:write: CH:MODE **
where ** are interface switching commands, for example:write: CH:MODE {CC|CV|CP|CR|CCCV|CRCV|TRAN|LIST|SCAN|SHOR|BATT|LED}
the display switches.#cmdMode 11.Battery: write: CH:MODE BATT; [300]
#cmdMode 12.LED: write: CH:MODE LED; [300]
#cmdMode 11.Battery: write: CH:MODE BATT; [300]
#cmdMode 12.LED: write: CH:MODE LED; [300][/code]
#cmdMode VDC VOLT
abort
[500]
*cls
#askMode CH:MODE?
Got an answerStarting
;; Start thread for: COM10 - East Tester ET5410
;; COM10: Set params: 115200
;; : Tx <*IDN?>
;; COM10: Tx: <*IDN?. |..> 2A 49 44 4E 3F 0A 20 7C 2E 0A
;; COM10: Rx: <ET5410 09411912032 V1.02.1901.023 V1.10.1810.018> 45 54 35 34 31
30 20 30 39 34 31 31 39 31 32 30 33 32 20 56 31 2E 30 32 2E 31 39 30 31 2E 30 32
33 20 56 31 2E 31 30 2E 31 38 31 30 2E 30 31 38
;; COM10: Tx <*TRG>
;; COM10: Tx: <*TRG. |..> 2A 54 52 47 0A 20 7C 2E 0A
;; Found East Tester ET5410 on CP2102 USB to UART Bridge Controller (COM10) sn:
9411912032
;; ET5410: Tx <CH:MODE?>
;; COM10: Tx: <CH:MODE?. |..> 43 48 3A 4D 4F 44 45 3F 0A 20 7C 2E 0A
;; COM10: Rx: <CC> 43 43
;; ET5410: Rx <CC>
In the #cmdMode section#cmdMode 01.CC CC CH:MODE CC;
#cmdMode 02.CV CV CH:MODE CV;
This option works and switches modes.;; ET5410: Tx <CH:MODE CV>
;; COM10: Tx: <CH:MODE CV. |..> 43 48 3A 4D 4F 44 45 20 43 56 0A 20 7C 2E 0A
But then he writes that the CC mode, although in fact CV.;; ET5410: Tx <CH:MODE?>
;; COM10: Tx: <CH:MODE?. |..> 43 48 3A 4D 4F 44 45 3F 0A 20 7C 2E 0A
;; COM10: Rx: <CC> 43 43
;; ET5410: Rx <CC>
CH:MODE?
;; ET5410: Tx <CH:MODE?>
;; COM10: Tx: <CH:MODE?. |..> 43 48 3A 4D 4F 44 45 3F 0A 20 7C 2E 0A
;; COM10: Rx: <CV> 43 56
;; ET5410: Rx <CV>
;; CV
For some reason, after switching, it shows the previous mode.But then he writes that the CC mode, although in fact CV.
For some reason, after switching, it shows the previous mode.
#cmdMode 01.CC CC CH:MODE CC
abort
[500]
*cls
#cmdMode 02.CV CV CH:MODE CV
abort
[500]
*cls
answerStarting
;; Start thread for: COM10 - East Tester ET5410
;; COM10: Set params: 115200
;; : Tx <*IDN?>
;; COM10: Tx: <*IDN?. |..> 2A 49 44 4E 3F 0A 20 7C 2E 0A
;; COM10: Rx: <ET5410 09411912032 V1.02.1901.023 V1.10.1810.018> 45 54 35 34 31
30 20 30 39 34 31 31 39 31 32 30 33 32 20 56 31 2E 30 32 2E 31 39 30 31 2E 30 32
33 20 56 31 2E 31 30 2E 31 38 31 30 2E 30 31 38
;; Found East Tester ET5410 on CP2102 USB to UART Bridge Controller (COM10) sn:
9411912032
;; ET5410: Tx <CH:MODE?>
;; COM10: Tx: <CH:MODE?. |..> 43 48 3A 4D 4F 44 45 3F 0A 20 7C 2E 0A
;; COM10: Rx: <CV> 43 56
;; ET5410: Rx <CV>
;; ET5410: Tx <CH:MODE CC>
;; COM10: Tx: <CH:MODE CC. |..> 43 48 3A 4D 4F 44 45 20 43 43 0A 20 7C 2E 0A
;; ET5410: Tx <abort>
;; COM10: Tx: <abort. |..> 61 62 6F 72 74 0A 20 7C 2E 0A
;; ET5410: Delay: 500ms
;; ET5410: Tx <*cls>
;; COM10: Tx: <*cls. |..> 2A 63 6C 73 0A 20 7C 2E 0A
;; ET5410: Tx <CH:MODE?>
;; COM10: Tx: <CH:MODE?. |..> 43 48 3A 4D 4F 44 45 3F 0A 20 7C 2E 0A
;; COM10: Rx: <CC> 43 43
;; ET5410: Rx <CC>
now the answer to the command "CH:MODE?" right
That's right?
#cmdMode 01.CC CC
CH:MODE CC
[500]
#cmdMode 02.CV CV
CH:MODE CV
[500]
The error appears if the delay is less than [200]
I think I understood the ideology of the Mode button and the Selector. But I got new problems. I am using Selector and multi does not fill when switching Mode. If multi is omitted below selector, then they start working. What could be the mistake?
You might be able to use numberDual instead for some of the cases.Also unreadable :(
You might be able to use numberDual instead for some of the cases.Also unreadable :(
That sounds like a bug in my code, I will have to look at it, probably tomorrow.On version 1.51 multi everything works correctly
You might be able to use numberDual instead for some of the cases.
How can I turn off the automatic conversion of 0.1 to 100m?
Artifacts during Selector operation and interface redrawing.
#cmdSetup multi Level_A_C
:read: CURR:TA?;TIME:WA?;
:readmath: value.replace("R","")
:write: CURR:TA #;[300];TIME:WA #;[300];
:enable: Tran_State=="CC"
:tip: Set the dynamic test A value
Number I A 0 40
Number T s 0 60000
:updatemodechange:
Help me figure out the timer.
To write the value I need to write the value in seconds
TIME: WA 59.999
TIME: WA? the answer is obtained in microseconds
TIME: WA 59999
How to format a response or record in the MULTI control?
You need to use :readmath: to scale the value.In control Number is working correctly. There seems to be an error in Multi.
#cmdSetup number Timer test
:read: TIME:WA?;
:readmath: (value.replace("R",""))/1000
:write: TIME:WA #;[300];
:update: Level_A_C
:tip: Set the delay shutdown time to query the current delay shutdown time value
Seconds 0 60
:updatemodechange:
#cmdSetup multi Level_A_C
:read: CURR:TA?;TIME:WA?;
:readmath: value.replace("R","");(value.replace("R",""))/1000
:write: CURR:TA #;[300];TIME:WA #;[300];
:enable: Tran_State=="CC"
:update: Timer
:tip: Set the dynamic test A value
Number Curr A 0 40
Number Width s 0 60
:updatemodechange:
In control Number is working correctly. There seems to be an error in Multi.
;; #math EnergyCh Wh SumTimeHour 0 (nameVoltage(load) * nameValue(bmm)) failed due to *
nameVoltage(load) * nameValue(bmm)____<----____
The problem is that you are getting a string with both values, you need to add code to split the string and then scale each value according and then return a string with the correct values. This is not a simple operation, but not that hard either.Syntactically correct?
#cmdSetup multi Level_A_C
:read: CURR:TA?;TIME:WA?;
:readmath: getElement(value,0).replace("R","")+" "+ (getElement(value,1).replace("R",""))/1000
:write: CURR:TA #;[300];TIME:WA #;[300];
:enable: Tran_State=="CC"
:update: Timer
:tip: Set the dynamic test A value
Number Curr A 0 40
Number Width s 0 60
:updatemodechange:
Are there any plans to support VISA drivers
or Agilent 82357B USB GPIB interfaces?
Syntactically correct?
;; ET5410: Tx <MEAS:CURR?>
;; ET5410: Rx <R 0.000>
;; ET5410: Tx <MEAS:VOLT?>
;; ET5410: Rx <R15.833>
;; ET5410: Tx <MEAS:POWE?>
;; ET5410: Rx <R 0.00>
;; ET5410: Tx <MEAS:RESI?>
;; ET5410: Rx <R 0.000>
;; ET5410: Tx <BATT:CAPA?>
;; ET5410: Rx <R 0.000>
;; ET5410: Rx after :readmath: replace(value,"R","") < 0.000 15.833 0.00 0.000 0.000>
;; ET5410: Rx as numbers <0.0 0.0 15.833 0.0 0.0>
The load is on, current =15A;; ET5410: Tx <MEAS:CURR?>
;; ET5410: Rx <R15.001>
;; ET5410: Tx <MEAS:VOLT?>
;; ET5410: Rx <R14.462>
;; ET5410: Tx <MEAS:POWE?>
;; ET5410: Rx <R216.60>
;; ET5410: Tx <MEAS:RESI?>
;; ET5410: Rx <R 0.96>
;; ET5410: Tx <BATT:CAPA?>
;; ET5410: Rx <R 0.006>
;; ET5410: Rx after :readmath: replace(value,"R","") <15.001 14.462 216.60 0.96 0.006>
;; ET5410: Rx as numbers <15.001 14.462 216.6 0.96 0.006>
The load is on, current =2.2A;; ET5410: Tx <MEAS:CURR?>
;; ET5410: Rx <R 2.208>
;; ET5410: Tx <MEAS:VOLT?>
;; ET5410: Rx <R15.346>
;; ET5410: Tx <MEAS:POWE?>
;; ET5410: Rx <R 0.00>
;; ET5410: Tx <MEAS:RESI?>
;; ET5410: Rx <R 0.000>
;; ET5410: Tx <BATT:CAPA?>
;; ET5410: Rx <R 0.066>
;; ET5410: Rx after :readmath: replace(value,"R","") < 2.208 15.346 0.00 0.000 0.066>
;; ET5410: Rx as numbers <0.0 2.208 15.346 0.0 0.0>
Is there any other troubleshooting I can do?
HKJ, I have a problem again. String formatting happens in a strange way. I don’t know how to solve this issue.
An extra section is added at the beginning and the last one is cut off.
I would like to log from an arduino project, multiple datas that are sent over USB serial every 1 second or so.
I do not see an good example of how to parse ascii text, could you point me to one? I can surely format the text in any convenient manner the tool needs,, but my micro does not have enough space to impement SCPI.
const int BUF_SIZE=100;
char cmdBuf[BUF_SIZE];
double s1=0;
void setup() {
Serial.begin(9600);
unsigned long t = millis();
while (!Serial && millis() - t < 3000); // Wait for USB connection to get ready, but do not hang when running without USB
}
void loop() {
if (Serial.available() > 0) {
int n = Serial.readBytesUntil('\n', cmdBuf, BUF_SIZE-1);
if (n > 0) {
*(cmdBuf + n) = 0;
strlwr(cmdBuf);
char* cmd = strtok(cmdBuf, " ");
if (strcmp(cmd, "*idn?") == 0) {
// Device name
Serial.print("HKJ,Test,1,1\n");
} else if (strcmp(cmd, "values?") == 0) {
// Measured values
Serial.print("1 2 3\n");
} else if (strcmp(cmd, "set?") == 0) {
// Read setting
Serial.print(s1);
Serial.print("\n");
} else if (strcmp(cmd, "set") == 0) {
// Set setting
char *p = strtok(NULL, " ");
if (p != NULL) {
s1 = atof(p);
}
}
}
}
}
; TestController must be restarted before any changes in this file will be used.
; Manual is here: https://lygte-info.dk/project/TestControllerConfigDevice%20UK.html
#idString HKJ,Test,
#name HKJ Test
#handle Test
#port comfixedbaud
;#port com
; Alternate port types: comnobaud or com, com lets the user define baudrate on the "Load devices" page
#baudrate 115200
; A list of possible column name with unit and formatter (SI, Time, Int, D0..D6)
; Format: #value ColumnName Unit Format {Selector}
; Selector is only used when column layout varies with mode, this often require the use of #cmdMode
#value Voltage1 V X8
#value Voltage2 V X8
#value Voltage3 V X8
; How to poll for data, this is used for table and #values?
; a #askMode, #cmdMode and #prepareSample is used before this is string is used.
; Number of returned values must match number of columns defined with #value
; This is a single line command
#askValues values?
#cmdSetup number Set
:read: set?
:write: set #
V 0 500 t1
Look like you have problems with a leading space, try adding a trim(replace(...))Thanks HKJ. This is the right decision.
#cmdSetup radio Range_I_
:read: LOAD:CRANge?;
:write: LOAD:CRANge #;[300]; <<--here
:string:
Low_(3.100A) LOW
High_(42.00A) HIGH
Something like that Something like that
if LOAD:CRANge?=="HIGH" then :write: LOAD:CRANge #;[300];CURR:IMAX 42 else :write: LOAD:CRANge #;[300];CURR:IMAX 3.1
:write: LOAD:CRANge (value);[300];CURR:IMAX (value=="HIGH"?32:3.1)Thanks HKJ.
Hello HKJ,
Thanks for creating and maintaining a very useful program. I have been using TestController with Atorch DL24P successfully. It connects to DL24P right away every time. However, I recently added another Atorch device called JL24, but Test Controller is not working with it reliably. Test Controller can connect to JL24, but it doesn't always start reading values from it.
:write: LOAD:CRANge (value);[300];CURR:IMAX (value=="HIGH"?32:3.1)Thanks HKJ.
How can you dynamically change the limit values? For example in the photo.
Perhaps via a global variable or is there another way?
Thank you for the code and definition. I am seriously considering changing over my software, but I am reluctant to tear up my already working command interpreter. Maybe I will clean up and finish this version and switch it over to SCPI in the next revision.
So am I correct in thinking there is not an easy way for testcontroller to parse my output without querying?
What will be the problem? ChartT, Histogram, ramge tabs are disabled when I connect the ut61c Unit, not when it runs in demo mode.
=var drive=getDevice("Servo")
="Found servo drive "+drive+"."
= deviceWrite((drive),"Command "+2)
= deviceRead((drive),"Command "+2)
=var drive=getDevice("Servo")
="Found servo drive "+drive+"."
;; Found servo drive S200.
= deviceWrite((drive),"Command "+2)
;; S200: Tx <S200Command 2>
= deviceRead((drive),"Command "+2)
;; S200: Tx <Command 2>
;; S200: Tx <txrxnBin? 2 \x13\x64\x15\x08>
;; COM1: TxBin: <.d..> 13 64 15 08
;; COM1: RxBin: 64 08
;;2148
Hello jk2017,
You have succes with DL24P.
Please can you share your device file for it.
I have faulty readings. Some values are correct,
some not all digits and some complete wrong.
I couldn't fix it myself.
Thanks anyway.
putting the device name "S200" inside the command. Since the device file has no SCPI "S200Command" command, then nothing is transmitted. So, either the deviceWrite command is not symmetric in syntax to the deviceRead or there is a bug with deviceWrite. I am running Ver 1.51.
No hurry since I can use the deviceRead command for now.
PS Thanks for the updates in Ver 1.51. I really appreciate the fix, functionality enhancement for the serial interface. The the binConv() function is handy too.
My problem is, Test Controller does not always start reading values from JL24. It recognizes JL24 (as AT3010) but does not start reading values. I wait for a few minutes, but it will not read values. So, I shutdown Test Controller, restart it, and I repeat the process. Then, once in 20 times or so, Test Controller starts reading values from JL24. Once it starts reading values, it will keep reading correct values from JL24.
:-// :-//
Hello jk2017,
You have succes with DL24P.
Please can you share your device file for it.
I have faulty readings. Some values are correct,
some not all digits and some complete wrong.
I couldn't fix it myself.
Thanks anyway.
I just use the device that came with TC. I didn't change anything, and it works flawlessly for my DL24P.
I am getting wrong values with DL24.
I tested the PX100 logging software from:
https://github.com/misdoro/Electronic_load_px100 (https://github.com/misdoro/Electronic_load_px100)
and have good values then.
Interesting, according to the documentation for the px100 software it uses a completely different protocol.
If somebody could capture some of it (I need something to test with) I will try to implement it.
I prefer to get hex dumps and not binary files of protocols.
I need both transmitted and received messages, this can be done with Termite in forward mode and hex enabled (Link: https://www.compuphase.com/software_termite.htm (https://www.compuphase.com/software_termite.htm)). Note: It requires 3 serial ports.
V1.52 is up
This is a minor update with a new driver for ATorch electronic loads
Added: ATorch PX100 protocol for electronic loads.
Changed: Timeout for connecting to Atorch protocol changed from 1.5s to 2.5s
Fixed: deviceWrite, it included the device handle in the string.
V1.52 is up
This is a minor update with a new driver for ATorch electronic loads
Added: ATorch PX100 protocol for electronic loads.
Changed: Timeout for connecting to Atorch protocol changed from 1.5s to 2.5s
Fixed: deviceWrite, it included the device handle in the string.
Thanks to Pukker for the hex dumps.
The new driver is in the file ATorchPX100Devices and it contains a PX100 device.
The limits is probably wrong and must be adjusted.
For other ATorch devices duplicate the #metadef section and adjust the name and parameters accordingly.
Also remember to remove duplicate devices from AtorchDevices file.
Please post the updates here and I will include them in the next release.
Hi HKJ.
You have an example of how to add calculated values to a chart. For example energy or capacitance based on current and voltage.
I have modified the PX100 definition to include DL24 and DL24P, I have also changed a D3 to D1, but I have not included the time & temperature.
Pukker and everybody else that wants them are, of course, welcome to add them again to their version.
I am facing a strange problem when using two units at the same time.
DL24 and RD6012. When I connect one of them they work perfect.
When starting both of them I have dropouts in the readings from the DL24.
Voltage, current, capacity reading jumps from correct to zero and back.
Only when I connect to the two units. See pictures.
The RD6012 as source and DL24 as load. Readings from RD6012 are stable.
Experimented with Readdelays, but no improvement.
I am facing a strange problem when using two units at the same time.
DL24 and RD6012. When I connect one of them they work perfect.
When starting both of them I have dropouts in the readings from the DL24.
Voltage, current, capacity reading jumps from correct to zero and back.
Only when I connect to the two units. See pictures.
The RD6012 as source and DL24 as load. Readings from RD6012 are stable.
Experimented with Readdelays, but no improvement.
I have no good idea, in TestController the two devices runs in separate threads, i.e. they are not supposed to affect each other in any way.
I am facing a strange problem when using two units at the same time........
I have no good idea, in TestController the two devices runs in separate threads, i.e. they are not supposed to affect each other in any way.
One idea, but probably not very good.
Try adding a:
#readingDelay 2
After the #askValues line.
With the JL24 I do not have any good ideas. Do it connect more often now or is it the same?
It seems about the same. But I noticed a difference between DL24P and JL24. DL24P sends data once every second regularly. On the other hand, JL24 sends data 3 to 5 times every second. It's continuous and fast. I recorded short movies of Termite outputs for both.
Does this give you any clue?
#metadef
#idString S-LS-60
#name Stamos S-LS-60
#handle Stamos S-LS-60
#replaceText MaxPower 150
Yes, the Name itself contains dashes, and at least they did the rebadging up to the point where in the *IDN? string the device identifies itself correctly as a S-LS-60 containing dashes, followed by version and serial...
Could you do it again with the JL24 and post the hex dump from Termite (for a couple of seconds), together with the readout.
V1.53 is up
JL24 needs to be tested and see what parameters is transfers. I did not get any energy values with the test data, but I can calculate that locally if I have power.
If I use SumTimeHour on JL24.Power, I should be able to calculate the energy in Wh, correct?
Will it be possible to add in the Hameg HM7044 quad power supply to the supported devices list?
I am facing a strange problem when using two units at the same time.
DL24 and RD6012. When I connect one of them they work perfect.
When starting both of them I have dropouts in the readings from the DL24.
Voltage, current, capacity reading jumps from correct to zero and back.
Only when I connect to the two units. See pictures.
; Accept this delay when reading values (seconds)
#readingDelay 60
#math VoltageFiltered A DropOutFilter 30 (nameValue(bmm))
I am facing a strange problem when using two units at the same time.
DL24 and RD6012. When I connect one of them they work perfect.
When starting both of them I have dropouts in the readings from the DL24.
Voltage, current, capacity reading jumps from correct to zero and back.
Only when I connect to the two units. See pictures.
I found same problem using multimeter and dc load together
BMM values sometimes drop to zero, DC Load are always correct.
Swapped switch, cables, no change
The dropout is not an big problem for reading, it also aborts the load.
A simple demo project showing how to use a Arduino with TestController:Some basic function like relay on / off for controling end of charge of LiIon battery with non programmable PS would be nice.
(https://lygte-info.dk/pic/Projects/TestController/Arduino1/DSC_4211.jpg)
[url=http://lygte-info.dk/project/TestControllerArduino1%20UK.html]http://lygte-info.dk/project/TestControllerArduino1%20UK.html (http://lygte-info.dk/project/TestControllerArduino1%20UK.html)[/url]
If there is interest I can make a article about more advanced interfacing with Arduino or show some examples on simple applications.
Some basic function like relay on / off for controling end of charge of LiIon battery with non programmable PS would be nice.
Try running TC from a DOS box and post if there are any error messages when the load fails. Do not run in debug mode, just normal, some errors will be shown outside debug mode.
You can also do it from debug mode, but I still want the messages from the DOS window.
The DL24 protocol is not supposed to fail or dropout, it will automatic retry, but it may die on a program error.
I have tested DL24 with testcontroller from Command prompt.
Works as normal, with Dropouts, and NO errors in Dos box.
Ok so updates: My Korad KA3005P isn't responding due to the test controller sending the "0A" character appended to the end of the "*IDN?", couldn't get tinkering with the #eol to fix it either, really getting a headscratcher here.
Second, the Hameg power supply arrived and I'm hilariously lost again on the control interface writing, can't quite figure out how to enable 8n2 and just a carriage return. Further the readout and separation into vars isn't super well documented in the files and I'm not sure of the difference between the ASCII/Modbus/SCPI drivers?
Here's the Hameg manual, the important stuff is on page 24/25. https://cdn.rohde-schwarz.com/hameg-archive/HM7044_D_E_F_S.pdf
Any help would REALLY be appreciated, Thanks!
Ok so updates: My Korad KA3005P isn't responding due to the test controller sending the "0A" character appended to the end of the "*IDN?", couldn't get tinkering with the #eol to fix it either, really getting a headscratcher here.
No CR or LF:
#eol \_
Use CR
#eol \r
But the standard driver needs a CR or LF at the end of each received message or it will not work.
The #eol setting only works for selected drivers, the "Scan serial ports" setting do not now the devices and always uses LF
I realy appreciate your Arduino efforts. I was away from this board for a while. In this time I played a little bit with ESPEasy and
found it very handy. But I have no clue how to connect it's serial output which reports the measurements of the available sensors
with TC :-//
I was looking for a simple solution for temperature measurements with DS1820 sensors. Since I'm a little bit rusty with programming it would be great if one of your (coming) examples brings this popular and cheap temperature sensor into TC! Thanks in advance!
Any possibility of integrating modified capability into the SCPIx driver to allow arbitrary EOL commands? May help down the line with integrating different cheaper weird comms protocol chinese instruments or older units.
I've adapted the HMC8043 config file to use my Hameg HMP2020 power supply. I really like what you've done with Test Controller and from now on I plan to stop using Excel and use TC instead for data acquisition - so thank you!
In the attached PDF I detail a minor connection/addressing issue and I also inquire about the implementation of the APPLy command.
About GridPanel; Googling GridPanel brings up quite a variety of results but I'm guessing you're referring to the Java GridPanel class so all I need to do now is learn to write Java
:palm: Just learning to use scripting and figuring out how to include temperature data in Test Controller will keep me busy for a while.
Is there a method to perform such a test using Test Controller?
Has by chance anyone had any success using either an Agilent u1272a or a Hioki DT4282 under linux with test controller?
Thanks very much for your feedback. For the Hioki, that should be simple, as it's remote commands are somewhat well documented and it claims to use a virtual com port.
There is a remote operation manual able for download:
https://www.hioki.com/en/support/versionup/detail/?downloadid=235 (https://www.hioki.com/en/support/versionup/detail/?downloadid=235)
So I am sowhat positive, if I go that route.
For the U1272A the question is, wether Linux is able to detect the IR-USB adapter with the attached DMM correctly. Something that is of course outside the scope of your software.
The meter uses a virtual com port.
Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException: The BROWSE action is not supported on the current platform!
at java.awt.Desktop.checkActionSupport(Desktop.java:221)
at java.awt.Desktop.browse(Desktop.java:380)
at dk.hkj.main.Main.setupDemo(Main.java:432)
at dk.hkj.main.Main.update(Main.java:375)
at dk.hkj.main.Main.access$4(Main.java:373)
at dk.hkj.main.Main$4.actionPerformed(Main.java:197)
at javax.swing.Timer.fireActionPerformed(Timer.java:313)
at javax.swing.Timer$DoPostEvent.run(Timer.java:245)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
# java -version
openjdk version "1.8.0_282"
OpenJDK Runtime Environment (build 1.8.0_282-b08)
OpenJDK 64-Bit Server VM (build 25.282-b08, mixed mode)
On your installation page, right at the bottom, there is a screenshot of the "Create a new SCPI definition" menu. Somehow I am not able to locate this menu?
Probably not related, but I do get an AWT nullpointer exception:Code: [Select]Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException: The BROWSE action is not supported on the current platform!
at java.awt.Desktop.checkActionSupport(Desktop.java:221)
at java.awt.Desktop.browse(Desktop.java:380)
I am missing something obvious?
changing the line from #port COM to #port GPIB and then specifying the address as A:23 (thanks Hydron) on the Devices tab it loaded no problem.
The problem I have now is that when both are enabled at the same time I get an exception and neither device loads, debug details attached.
I have spare (Artag) boards and connectors and can throw in a Pro Micro and I’m happy to make one up for you or send as a kit if you prefer? The only issues with mine are that I have no support between the PCB and the connector and it’s hard to avoid stressing the pins - I plan to get some M3 nuts and screws to clamp them apart and also, I don’t have an enclosure.
Offer still stands for an interface – I don’t plan to use all 10 connectors.
TestController doesn't work with RIDEN RD60xx over WIFI?
#author meandeev
#idString PREMA 6048
#name Prema_6048
#handle P6048
#port comfixedbaud
; using a AR488 so the DTR has to be set correctly:
#baudrate 115200N81Rd
#driver Ascii
; A list of possible column name with unit and formatter (SI, Time, Int, D0..D6)
#value VoltageDC V X9 DC_Voltage
; Simulated SCPI command definitions for the Prema 6048
; Function
#scpiCmd VD tx VD
; Synthetic Commands
#scpiCmd READ:DATA? txrx? ++read
:readmath: (strlen(value)==0)? oldvar : value
:setvar: oldvar=(strlen(value)==0)?oldvar:value
#cmdMode DC_Voltage VD
VD
; String to ask about actual meter mode,
; This is a single line command
#askMode READ:DATA?
#askModeMathFormat substring(value,16,18)
; How to poll for data, this is used for table and #values?
; a #askMode, #cmdMode and #prepareSample is used before this string is used.
; This is a single line command
#askValues READ:DATA?
#readingDelay 3
#askValuesMathFormat substring(value,0,14)
#initCmd
:setvar: oldvar=""
#finalCmd tx ++loc
; Setup menu functions
;Mode-------------------------------------------------------------------------------------------
#cmdSetup info Active_Mode
:read: READ:DATA?
:readmath: substring(value,16,18)
:updatemodechange:
;DC_Voltage-------------------------------------------------------------------------------------
#cmdSetup checkbox AutoRange DC_Voltage
:write: (getElement("A0 A1",value))
:read: READ:DATA?
:readmath: substring(value,22,23)
On 0 1
:updatemodechange:
;; 22:50:39.022 P6048: Tx <READ:DATA?>
;; 22:50:39.022 P6048: Tx <txrx? ++read>
;; 22:50:39.039 COM23: Tx: <++read.> 2B 2B 72 65 61 64 0A
;; 22:50:39.039 COM23: Rx: <+007.497929E+0MRVDP00A1R3F1T7D0S0Q1M02B06> 2B 30 30 37 2E 34 39 37 39 32 39 45 2B 30 4D 52 56 44 50 30 30 41 31 52 33 46 31 54 37 44 30 53 30 51 31 4D 30 32 42 30 36
;; 22:50:39.046 P6048: Rx <+007.497929E+0MRVDP00A1R3F1T7D0S0Q1M02B06>
;; 22:50:39.048 P6048: Rx after :readmath: substring(value,0,14) <+007.497929E+0>
;; 22:50:39.048 P6048: Rx as numbers <7.497929>
;; 22:50:40.022 P6048: Tx <READ:DATA?>
;; 22:50:40.022 P6048: Tx <txrx? ++read>
;; 22:50:40.024 COM23: Tx: <++read.> 2B 2B 72 65 61 64 0A
;; 22:50:41.027 COM23: Rx: timeout
;; 22:50:41.027 P6048: Rx <null>
;; 22:50:41.027 P6048: Rx after :readmath: substring(value,0,14) <null>
;; 22:50:41.027 P6048: Rx as numbers <NaN>
;; 22:50:41.027 P6048: Tx <READ:DATA?>
;; 22:50:41.027 P6048: Tx <txrx? ++read>
;; 22:50:41.030 COM23: Tx: <++read.> 2B 2B 72 65 61 64 0A
;; 22:50:41.164 COM23: Rx: <+007.497929E+0MRVDP00A1R3F1T7D0S0Q1M02B00> 2B 30 30 37 2E 34 39 37 39 32 39 45 2B 30 4D 52 56 44 50 30 30 41 31 52 33 46 31 54 37 44 30 53 30 51 31 4D 30 32 42 30 30
;; 22:50:41.180 P6048: Rx <+007.497929E+0MRVDP00A1R3F1T7D0S0Q1M02B00>
;; 22:50:41.180 P6048: Rx after :readmath: substring(value,0,14) <+007.497929E+0>
;; 22:50:41.180 P6048: Rx as numbers <7.497929>
;; 22:50:42.035 P6048: Tx <READ:DATA?>
;; 22:50:42.035 P6048: Tx <txrx? ++read>
;; 22:50:42.038 COM23: Tx: <++read.> 2B 2B 72 65 61 64 0A
;; 22:50:43.050 COM23: Rx: timeout
;; 22:50:43.050 P6048: Rx <null>
;; 22:50:43.050 P6048: Rx after :readmath: substring(value,0,14) <null>
;; 22:50:43.050 P6048: Rx as numbers <NaN>
;; 22:50:43.050 P6048: Tx <READ:DATA?>
;; 22:50:43.050 P6048: Tx <txrx? ++read>
;; 22:50:43.055 COM23: Tx: <++read.> 2B 2B 72 65 61 64 0A
;; 22:50:44.065 COM23: Rx: timeout
;; 22:50:44.065 P6048: Rx <null>
;; 22:50:44.065 P6048: Rx after :readmath: substring(value,0,14) <null>
;; 22:50:44.065 P6048: Rx as numbers <NaN>
;; 22:50:44.065 P6048: Tx <READ:DATA?>
;; 22:50:44.065 P6048: Tx <txrx? ++read>
;; 22:50:44.071 COM23: Tx: <++read.> 2B 2B 72 65 61 64 0A
;; 22:50:45.090 COM23: Rx: timeout
;; 22:50:45.090 P6048: Rx <null>
;; 22:50:45.090 P6048: Rx after :readmath: substring(value,0,14) <null>
;; 22:50:45.090 P6048: Rx as numbers <NaN>
;; 22:50:45.090 P6048: Tx <READ:DATA?>
;; 22:50:45.090 P6048: Tx <txrx? ++read>
;; 22:50:45.096 COM23: Tx: <++read.> 2B 2B 72 65 61 64 0A
;; 22:50:45.174 COM23: Rx: <+007.497929E+0MRVDP00A1R3F1T7D0S0Q1M02B00> 2B 30 30 37 2E 34 39 37 39 32 39 45 2B 30 4D 52 56 44 50 30 30 41 31 52 33 46 31 54 37 44 30 53 30 51 31 4D 30 32 42 30 30
;; 22:50:45.174 P6048: Rx <+007.497929E+0MRVDP00A1R3F1T7D0S0Q1M02B00>
;; 22:50:45.174 P6048: Rx after :readmath: substring(value,0,14) <+007.497929E+0>
;; 22:50:45.174 P6048: Rx as numbers <7.497929>
;; 22:50:46.023 P6048: Tx <READ:DATA?>
;; 22:50:46.023 P6048: Tx <txrx? ++read>
;; 22:50:46.027 COM23: Tx: <++read.> 2B 2B 72 65 61 64 0A
;; 22:50:47.041 COM23: Rx: timeout
;; 22:50:47.041 P6048: Rx <null>
;; 22:50:47.041 P6048: Rx after :readmath: substring(value,0,14) <null>
;; 22:50:47.041 P6048: Rx as numbers <NaN>
;; 22:50:47.041 P6048: Tx <READ:DATA?>
;; 22:50:47.041 P6048: Tx <txrx? ++read>
;; 22:50:47.046 COM23: Tx: <++read.> 2B 2B 72 65 61 64 0A
;; 22:50:48.060 COM23: Rx: timeout
;; 22:50:48.060 P6048: Rx <null>
;; 22:50:48.060 P6048: Rx after :readmath: substring(value,0,14) <null>
;; 22:50:48.060 P6048: Rx as numbers <NaN>
Thank you very much for your DS1820 example! Works perfect!
After rejecting my wish last week I tried myself to program a Uno.
(I used time interrupt all seconds to get the sensors values - 2 sensors attached, but interrupt handling is different from model to model)
but I'm ashamed by your perfect solution.
I tried to write a definition-file for a Prema 6048. This is a non-scpi Device, but with GPIB. I use a ar488-GPIB adapter. The problem is, that the Prema replies to a ++read with the full measurement value and the status in one single line only after the integration time is finished. The integration time can be very long: up to 80sec, in this time the device doesn´t answers to any ++read and there is no possibility to ask for the status or the last measurement value of the device. Thats why I tried the following approach:
buffer the output to a variable and when a rx-timeout occurs, then use this buffer, but I need help for that. What I have so far (and it doesn´t work completely):
Does it support HP3457A ?
Attached my working definition for the FLUKE 45.
May be some one will benefit from it. Unfortunately I own only a Agilent GPIB-adaptor and I learned that this is not supported by TC.
So the device only works with serial connection.
- 2nd Display can be set but not read
- dBm reading not implemented since no SCPI device
Would it be possible to model such two-display DMM in a way to set up separate handlers for them, or will that conflict with the serial port locking/concurrent use to that port?
Especially for using a DMM to control discharging of a battery, the Fluke 45 offers 3-wire measurement so it would be an ideal candidate to measure voltage and current in the same circuit naturally ;-)
...I can think of several possibilities where it could be nice to let a single device do measurements, like in debugging small circuits and voltage drops under load, not only doing discharging of batteries- and as a happy Fluke 45 owner, some good must come from that 2nd display 8)
...what kind of changes i need to make to 3478A config file to make it workable with my 3457A
Ok -- figured out the load --
now for the E3640A power supply...
I added the following to the Korad 103.txt file
Is there a way to use such a command line program with TC??? Thanks in advance!
for #askValues I have MEAS:VOLT?; MEAS:CURR?
The causes the E3640A to issue error 410 -- The second meas is performed while there is still unread data in the output buffer.
How do I control range for the supply (it has a low and high range)
suggestions?
Hello,
I tried to write a definition-file for a Prema 6048.
:
Can somebody help me with this? Thanks!
Using same DMM to do both measurement will cost a bit of precision due to cable resistance, the best solution for battery testing is a electronic load with remote sense. TC supports a couple of models, even a cheap ATorch model, but I do not believe it has remote sense, you can get around that by using the Fluke directly over the battery terminals and only use the current from the load.
Ok -- one last try -- ":meas:volt?;[2];:MEAS:CURR?" works.
Hello,I thought 6048 could raise an SRQ on completion of a reading, can this not be used as the means to tell the programme to get the now available data?
I tried to write a definition-file for a Prema 6048.
:
Can somebody help me with this? Thanks!
after inserting ":updatedelayed: 0.5" for each cmdSetup it is working fine.
Made an personal modification to the Accu discharge script as follows:
Question: I like to add a line at start of the script, for resetting the load,
so the capacity and energy starts at zero. Who can explain me? Thanks.
Like to start with Math function to filter out the misreadings,
but was not able yet to figure that out,
when sombody can point me the right way to do that, Thanks.
Error DL24
When running Testcontroller in Debug mode,with only DL24 connected,
I get Java errors.
How do I replace "ATDL24.Voltage" with the filtered value?
Don't know how to call the filtered value instead of the original value
What is it named?
Sorry last try, I don't get it working.
Math is working fine.
VoltageFilter "V" DropOutFilter 10 ATDL24.Voltage
In the Table page Math.VoltageFilter is correct value when ATDL24.Voltage has dropout.
But then I want to use Math.VoltageFinder value in my script in the Commands page,
I do not get that working
In my script:
=var StoreValue
=globalvar Math.VoltageFilter
=StoreValue=Math.VoltageFilter -> StoreValue stays empty
or
=Math.VoltageFilter -> No value return.
while program is logging.
so
=ATDL24.Voltage returns a good value.
Sorry for asking again, I like to get it working, usefull for me. Thanks.
Another idea:
You do not need the filter to avoid stopping due to a sample or two missing, you could also use the table functions:
tableCalcMax("Voltage",tableRows()-4)
I’ve made a definition file that enables control of the output voltage but I’m a bit stuck now. The main problem is extracting the numbers from the data string when reading the “set values”. Are there any examples of how to use mathFormat & readmath?
Another goal I have is to be able to turn the outputs off - the manual says to send either “selected device clear” or “device clear” but I’ve tried every syntax I can think of but can’t get them to switch off.
It would also be nice if the outputs get set to zero and turned off when TC is closed.
Another idea:
You do not need the filter to avoid stopping due to a sample or two missing, you could also use the table functions:
tableCalcMax("Voltage",tableRows()-4)
A little confusion about table column numbers:
for example 22 Columns,
=tableColumns() Returns 22
Last 3 columns 20, 21 and 22 are Math. VoltageFilter.Filter, Math.Current.Filter, Math.Temp.Filter
(see Picture
=tableColumnName(19) Returns Math.VoltageFilter
So have to use the real column-number minus 1
Not an big problem, just for your information.
But why use the filtered column, why not use the original data column?
A small message for information.
When logging and discharging without doing anything,
I had a few dropouts in 3 hours.
When opening setup Popups for Riden6012 and ATDL24 a lot of dropouts..
Also a lot dropouts after eachother.
Okay I deleted it because I figured out that your prior response had already answered the question.
I don’t see a change with the new jar - maybe my syntax?
CLR
;; NGPS: Tx <CLR>
I don’t think the device supports [LLO] – I don’t see it in the manual.
No response from the device, just a blink from the address light.
TRG
;; NGPS: Tx <TRG>
;; NGPS: Tx <tx [TRG]>
;; COM9: Tx: <[TRG].> 5B 54 52 47 5D 0A
Sorry, I added it to SCPI/SCPIx driver code, now I have also added it to the ASCII driver code. It is still untested!
Two battery test functions have been added, they will discharge a battery with specified current, until voltage drops below minimum. The load sweep will also add some annotations and color to the chart.
As usually it is possible to view and reuse the code for home designed scripts.
I've seached, but how do I use the Battery discharge function with own made script?
In other words, I like to use the discharge popup in my own script.
Looks good for quick making settings.
Thanks in advance.
For the owners of the DL24 or PX100 I like to share my own script for Battery discharge test with Atorch DL24 and PX100.
Just wondering... has anyone used this program to log a frequency / time interval counter?
Nice script, would it be ok if I make a webpage with user scripts and put your script and explanation on it?
Just wondering... has anyone used this program to log a frequency / time interval counter?Nice!!!
#math Energy Wh SumTimeHour 0 (nameCurrent(load)+"*"+nameVoltage(load))
Aim TTi CPX series power supplies New, has setup popup and script interface
Ametek XP series power supplies Minor update on #value statement per HKJ input
Owon OPD series power supplies Updated to log faster, tweaked setup popup, added script interface
Kollmorgen AKD1G servo Updated to log much faster, added script interface
Kollmorgen AKD2G servo Updated to log much faster, added script interface
Tektronix MDO,MSO,DPO,TDS Scopes Minor bug fix update
I have a feature suggestion. I often have a test setup that has power supplies and instrumentation. For the power supplies the scripts just need to set voltages, current limits and turn them on/off. For the real test log data is only needed from the instrumentation and not needed from the power supplies. It is a minor nuisance to have a lot of extra data logged making the files much larger. But, the real issue is that some of my supplies are very slow to log and limit the log interval to 1 sec while the desire is more like 0.1 sec interval which the instrumentation can easily do.
Could you add a way to turn logging off for a device via script? Perhaps even add a check box on the Load Devices tab next to the Enable check box that would manually allow turning logging on/off for each device individually. This way you could have a bench full of equipment all connected but only log from the devices that you need data from.
V1.61 is up, the program has now been out for more than a year with lots of update.
It is mostly about new devices, with a few minor tweaks to the code:
Added: Gossen MetraHit Energy DMM
Changed: Large values (>=1e36) will be mapped to +/-infinite when reading from devices
Fixed: Settings in GridPanel will update setupPopup
Added: Support for direct GPIB control of some devices: CLR, LLO, LOC, TRG
Added: RND 320 (KEL103) electronic load, thanks Calvin
Fixed: Serial binary communication buffer will not overflow at fast data rates.
Added: Multicomp Pro MP710258 & MP710259, thanks ian.ameline
Added: Fluke 45, thanks Bad_driver
The Energy meter is the most complicated handheld meter to date.
(http://lygte-info.dk/pic/Projects/TestController/DeviceExamples/GossenMatraHitEnergy/Mode.png)
(http://lygte-info.dk/pic/Projects/TestController/DeviceExamples/GossenMatraHitEnergy/Setup1.png) (http://lygte-info.dk/pic/Projects/TestController/DeviceExamples/GossenMatraHitEnergy/Setup2.png)
In Power mode with Energy checked a lot of values are read from the meter:
(http://lygte-info.dk/pic/Projects/TestController/DeviceExamples/GossenMatraHitEnergy/Values.png)
It is a very good meter for checking standby power, the current range goes down to uA and the fuse will not blow as long as current is below 10A.
Do you have the full changelog for TestController?
Do you have the full changelog for TestController?
This thread is the best changelog. You can find a shorter text only version here: http://lygte-info.dk/pic/Projects/TestController/DeviceHelp/Versions.dat (http://lygte-info.dk/pic/Projects/TestController/DeviceHelp/Versions.dat), it is the same list that TestController uses when it says a new version is ready.
The changelog do not include the first couple of months and do include test versions (These changes are listen for the next released version).
When I try to launch the software, I get the error message: "Windows cannot find 'javaw'. Make sure you typed the name correctly, and then try again".
Am I missing some java software on my computer or whats the problem here?
Thanks, I managed to open the software after installing Java :-+
My next problem is to connect my UNI-T UT61D multimeter. I got it delivered with a RS232 serial cable and a direct USB cable, and I am using the latter one to connect to the computer. The problem is, when using the usb cable, the device does not show up as a COM-port but a normal usb device, so Im a bit confused as to what address to type in the address field. Can't find any suitable address info in the device manager on Windows. The multimeter does connect with the official UNI-T software, so I have confirmed that the connection works with a PC, but I don't have any address info about the connection interface.
Does anyone have any good feedback on how to tackle this?
Edit: I have ordered a RS232 to USB adapter and will try this as an alternative when it arrives together with the UNI-T RS232 cable. Hopefully this combination will show up as a COM port on the PC, just like Arduino boards usually do for example.
Yes, it's a pity with Uni-T. As mentioned some weeks ago I would be very happy to see my Uni-T UT181A working with TC
but it also suffers from this proprietary HID based interface |O
1. It would be nice if we could resize the selection areas on the right side of the Chart and Histogram tabs (and even nicer if the app remembered the resize setting). Currently they can be only scrolled left/right if the entries are too long (easy for that to happen), but that's a bit of a hassle and makes the check boxes scroll out of view as well so I'm not sure which are enabled/disabled without scrolling back.
2. The popup window for 'Values from chart' could be slightly wider by default (or remember resize settings). Currently it truncates some of the names and values of the cursor position because it lacks space to display them.
3. If the number of Decimals in the 'Scales for chart' tab are low, the tick mark values are duplicated (truncated) as the same value for multiple vertical tick marks. It gets more disorienting the larger the window is resized vertically. *See screenshots below.
Is it possible to enhance the Chart to not display the tick values that have more decimals than the settings limit?
a very short (and maybe dumb) question. How can I change Time to DayTime in the diagram view?
Thanks in advance!
is there any source about protocols?
What do you mean?
What do you mean?
C source code, I need to recompile for non-x86 and non arm machine, also there are a couple of MASTECH multimeters listed for which I cannot find any information about the protocol.
#scpiCmd samplePVIT? txrxnBin? 7 \x5E\x00\x5C\x00\x5A\x00\x3A\x00\x38\x00\x8A\x00\x88\x00\x4c\x00
:readmath: binConv(int(value),0,3,0,1)/256.0+", "+binConv(int(value),3,2,1,1)*0.5587935448+", "+binConv(int(0xF0FFFFFFFFFFFF&value),5,2,1,1)*DIpeak/9668+", "+binConv(int(value),7,1,0,0)
This device is using #driver ascii. Below is the output from the DOS debug window:samplePVIT?
;; S200: Tx <samplePVIT?>
;; S200: Tx <txrxnBin? 7 \x5E\x00\x5C\x00\x5A\x00\x3A\x00\x38\x00\x8A\x00\x88\x00\x4c\x00>
;; COM1: TxBin: <^.\.Z.:.8.?.?.L.> 5E 00 5C 00 5A 00 3A 00 38 00 8A 00 88 00 4C 00
;; COM1: RxBin: 9A D1 05 00 01 00 18 36
;; S200: Rx <39633.01953125, 0.5587935448, 0.029788994621431527, 0>
;; 39633.01953125, 0.5587935448, 0.029788994621431527, 0
Note that the last byte received is 36 hex but the last number in the received value after the readmath is 0. Nothing I do seems to get that last byte to be anything other than 0. Using the same code in a script:Thoughts on what I might be doing wrong or what might be going wrong inside TC? Suggestions to try?
TestController do not support HID (Except for Brymen on Windows), but the RS232 and USB to RS232 will work. I have coded UT61D interface from a datasheet, i.e. if you find any problems please post it and I will look at it.
I have now done some initial tests of my UNI-T UT61D using the RS323 cable + usb adapter interface and it works fine. Haven’t encountered any issue yet.
2a 69 64 6e 3f 0d *idn?.
43 2e 41 35 32 39 33 2d 42 54 2c 20 48 56 20 41 C.A5293-BT, HV A
2c 20 46 56 20 31 2e 30 32 0a 0d , FV 1.02..
KP184 changed the protocol in V4, one part was swapping the checksum bytes, but there is something more that I have not found out.I'm ready to help.
The checksum bytes can be swapping by using "#subDriver Kunkinx", but something else is preventing it from working (May be handshake signals). I need somebody with a newer KP184 to help me finding out.
Hello HKJ. I purchased a new Kunkin KP184 (2021.02.27). When I try to establish a connection, I get a message:
I'm ready to help.
.....
Press Reconnect to try each setting
Starting
;; Start thread for: COM11 - Kunkin KP184
;; COM11: Set params: 9600
;; COM11: Tx <mode?>
;; COM11: Tx <holdingL? 0x0110>
;; COM11: Tx: 01 03 01 10 00 04 44 30
java.lang.NullPointerException: Cannot load from byte/boolean array because "ans
wer" is null
at dk.hkj.devices.DeviceModbus$TranslatingCommInterface$ModbusRTUInterfa
ceKunkin.readHoldingInputL(DeviceModbus.java:396)
at dk.hkj.devices.DeviceModbus$TranslatingCommInterface.write(DeviceModb
us.java:874)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:106)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:162)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:211)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:256)
at dk.hkj.main.DeviceInterface.doCommand(DeviceInterface.java:77)
at dk.hkj.main.DeviceInterface.threadStarted(DeviceInterface.java:244)
at dk.hkj.devices.DeviceSCPI.threadStarted(DeviceSCPI.java:28)
at dk.hkj.main.InterfaceThreads$DeviceThread.initDevice(InterfaceThreads
.java:1380)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1
428)
;; COM11: Rx Timeout
;; Found Kunkin KP184 on USB2.0-Ser! (COM11)
Try changing the subdriver to:
#subDriver RTU
And try the different handshake combinations again (Remember to restart TestController).
StartingI installed the program from a nearby thread. Without the "CRC LSB First - 2020 FW and above" checkbox, there is no connection at all.
;; Start thread for: COM11 - Kunkin KP184
;; COM11: Set params: 115200
;; COM11: Tx <mode?>
;; COM11: Tx <holdingL? 0x0110>
;; COM11: Tx: 01 03 01 10 00 02 C4 32
java.lang.NullPointerException: Cannot load from byte/boolean array because "ans
wer" is null
at dk.hkj.devices.DeviceModbus$TranslatingCommInterface$ModbusRTUInterfa
ce.readHoldingInputL(DeviceModbus.java:259)
at dk.hkj.devices.DeviceModbus$TranslatingCommInterface.write(DeviceModb
us.java:874)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:106)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:162)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:211)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:256)
at dk.hkj.main.DeviceInterface.doCommand(DeviceInterface.java:77)
at dk.hkj.main.DeviceInterface.threadStarted(DeviceInterface.java:244)
at dk.hkj.devices.DeviceSCPI.threadStarted(DeviceSCPI.java:28)
at dk.hkj.main.InterfaceThreads$DeviceThread.initDevice(InterfaceThreads
.java:1380)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1
428)
;; COM11: Rx Timeout
;; Found Kunkin KP184 on USB2.0-Ser! (COM11)
I installed the program from a nearby thread. Without the "CRC LSB First - 2020 FW and above" checkbox, there is no connection at all.
Define current: "current 5"
Ask for defined current: "current?"
current 5
;; KP184: Tx <current 5>
;; KP184: Tx <holdingL 0x0116 5 *1000>
;; COM11: Tx: 01 10 01 16 00 02 04 00 00 13 88 72 4F
current?
;; KP184: Tx <current?>
;; KP184: Tx <holdingL? 0x0116 /1000>
;; COM11: Tx: 01 03 01 16 00 02 24 33
java.lang.NullPointerException: Cannot load from byte/boolean array because "ans
wer" is null
at dk.hkj.devices.DeviceModbus$TranslatingCommInterface$ModbusRTUInterfa
ce.readHoldingInputL(DeviceModbus.java:259)
at dk.hkj.devices.DeviceModbus$TranslatingCommInterface.write(DeviceModb
us.java:874)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:106)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:162)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:211)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:256)
at dk.hkj.main.DeviceInterface.doCommand(DeviceInterface.java:77)
at dk.hkj.main.CommandProcessor.processCommands(CommandProcessor.java:28
34)
at dk.hkj.main.PaneCommand.processCommand(PaneCommand.java:1437)
at dk.hkj.main.PaneCommand.access$20(PaneCommand.java:1435)
at dk.hkj.main.PaneCommand$31.keyTyped(PaneCommand.java:893)
at java.desktop/java.awt.AWTEventMulticaster.keyTyped(AWTEventMulticaste
r.java:248)
at java.desktop/java.awt.Component.processKeyEvent(Component.java:6569)
at java.desktop/javax.swing.JComponent.processKeyEvent(JComponent.java:2
849)
at java.desktop/java.awt.Component.processEvent(Component.java:6391)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4990
)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321
)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4822)
at java.desktop/java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFo
cusManager.java:1950)
at java.desktop/java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(De
faultKeyboardFocusManager.java:870)
at java.desktop/java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent
(DefaultKeyboardFocusManager.java:1139)
at java.desktop/java.awt.DefaultKeyboardFocusManager.typeAheadAssertions
(DefaultKeyboardFocusManager.java:1009)
at java.desktop/java.awt.DefaultKeyboardFocusManager.dispatchEvent(Defau
ltKeyboardFocusManager.java:835)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4871
)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321
)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2769)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4822)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:77
2)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessControlle
r.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doInt
ersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doInt
ersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(AccessControlle
r.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doInt
ersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(Even
tDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDi
spatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(Even
tDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThr
ead.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThr
ead.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.jav
a:90)
;; KP184: Rx Timeout
Instruction example:;; COM11: Tx: 01 10 01 16 00 02 04 00 00 13 88 72 4F
The following instances suppose the communication be 01, data is hexadecimal
format.
1.Set up load current:
Send instruction: 01 06 01 16 00 01 04 00 00 07 D0 0C 9D
The meaning of each byte is:
01: equipment address.
06: instruction number written in the single register.
01 16: address written in the target register (load current register).
00 01: the number written in the target register
04: the byte number of data written in the target register. If the target register
is 4-byte register, the value is 4.
00 00 07 D0 : data, if it is 07D0, the current is set up as 2000mA.
0C 9D: check code. The high order is before the low order.
Load return data: 01 06 01 16 00 01 04 00 00 07 D0 0C 9D
When operating single register of the load, the load return data is returning the
instruction as original
Define current: "current 5"
Ask for defined current: "current?"Quotecurrent 5Ask for defined current: "current?" does not work
;; KP184: Tx <current 5>
;; KP184: Tx <holdingL 0x0116 5 *1000>
;; COM11: Tx: 01 10 01 16 00 02 04 00 00 13 88 72 4F
current?
;; KP184: Tx <current?>
;; KP184: Tx <holdingL? 0x0116 /1000>
;; COM11: Tx: 01 03 01 16 00 02 24 33
java.lang.NullPointerException: Cannot load from byte/boolean array because "ans
wer" is null
I don't understand anything about it. Here is an excerpt from the instructions:
I can only write the contents of the TC window, not the DOS window.
I only have this manual (Ver1.0 2017.09)
I do not know how to find out the firmware version.
Do you have another software you can try setting and reading current, while capturing the messages?What software can do this?
Do you have another software you can try setting and reading current, while capturing the messages?What software can do this?
I can install a com port sniffer. There is data from a running program. Will such data be suitable?
------ write 2000mA ------------------
01 06 01 16 00 01 04 00 00 07 D0 9D 0C - sniffer
01 06 01 16 00 01 04 00 00 07 D0 0C 9D - manual
------ write 20V ---------------------
01 06 01 12 00 01 04 00 00 4E 20 AB 2B - sniffer
01 06 01 12 00 01 04 00 00 4E 20 2B AB - manual
------ ON ---------------------------
01 06 01 0E 00 01 04 00 00 00 01 5F CA - sniffer
01 06 01 0E 00 01 04 00 00 00 01 CA 5F - manual
------ mode CV -----------------------
01 06 01 10 00 01 04 00 00 00 00 1E 8A
------ mode CC -----------------------
01 06 01 10 00 01 04 00 00 00 01 DF 4A
------ mode CR -----------------------
01 06 01 10 00 01 04 00 00 00 02 9F 4B
------ mode CW -----------------------
01 06 01 10 00 01 04 00 00 00 03 5E 8B
Maybe this will somehow help to understand the problem.
This means the most likely reason is the handshake settings that I asked you to try before.I tried both #subDriver Kunkinx and #subDriver RTU. Also ;#verifyDevice 1840 model? commented out. Without this, the connection is not established. I didn't notice the difference. No data is received from KP184. Did another data acquisition from KP184:
01 03 03 01 00 00 14 4E
01 03 1F 02 05 00 00 00 00 00 00 00 00 00 00 FA 00 FA 00 03 E8 00 00 00 00 4E 20 00 00 00 00 00 00 00 00 E9 91 - 0v
01 03 1F 02 05 00 10 63 00 00 00 00 00 00 00 FA 00 FA 00 03 E8 00 00 00 00 4E 20 00 00 00 00 00 00 00 00 0E 8D - 4.195v
| volt |current|
01 03 30 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17 D18 CRCH CRCL - manual
This means the most likely reason is the handshake settings that I asked you to try before.I tried both #subDriver Kunkinx and #subDriver RTU. Also ;#verifyDevice 1840 model? commented out. Without this, the connection is not established. I didn't notice the difference. No data is received from KP184. Did another data acquisition from KP184:
;; Start thread for: COM11 - Kunkin KP184
;; COM11: Set params: 115200
;; COM11: Tx <mode?>
;; COM11: Tx <holdingL? 0x0110>
;; COM11: Tx: 01 03 01 10 00 04 30 44
;; COM11: Rx Timeout
;; Found Kunkin KP184 on USB2.0-Ser! (COM11)
;; KP184: Tx <on?>
;; KP184: Tx <holdingL? 0x010E>
;; COM11: Tx: 01 03 01 0E 00 04 36 24
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <mode?>
;; KP184: Tx <holdingL? 0x0110>
;; COM11: Tx: 01 03 01 10 00 04 30 44
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <current?>
;; KP184: Tx <holdingL? 0x0116 /1000>
;; COM11: Tx: 01 03 01 16 00 04 31 A4
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <current?>
;; KP184: Tx <holdingL? 0x0116 /1000>
;; COM11: Tx: 01 03 01 16 00 04 31 A4
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <voltage?>
;; KP184: Tx <holdingL? 0x0112 /1000>
;; COM11: Tx: 01 03 01 12 00 04 F0 E5
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <resistance?>
;; KP184: Tx <holdingL? 0x011A>
;; COM11: Tx: 01 03 01 1A 00 04 32 64
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <power?>
;; KP184: Tx <holdingL? 0x011E /10>
;; COM11: Tx: 01 03 01 1E 00 04 F3 25
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <remote?>
;; KP184: Tx <holdingL? 0x10a>
;; COM11: Tx: 01 03 01 0A 00 04 F7 65
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
Pressing the "Setup" buttonCode: [Select];; Start thread for: COM11 - Kunkin KP184
;; COM11: Set params: 115200
;; COM11: Tx <mode?>
;; COM11: Tx <holdingL? 0x0110>
;; COM11: Tx: 01 03 01 10 00 04 30 44
;; Start thread for: COM11 - Kunkin KP184
;; COM11: Set params: 115200
;; COM11: Tx <mode?>
;; COM11: Tx <holdingL? 0x0110>
;; COM11: Tx: 01 03 01 10 00 04 44 30
;; COM11: Rx Timeout
;; Found Kunkin KP184 on USB2.0-Ser! (COM11)
;; KP184: Tx <on?>
;; KP184: Tx <holdingL? 0x010E>
;; COM11: Tx: 01 03 01 0E 00 04 24 36
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <mode?>
;; KP184: Tx <holdingL? 0x0110>
;; COM11: Tx: 01 03 01 10 00 04 44 30
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <current?>
;; KP184: Tx <holdingL? 0x0116 /1000>
;; COM11: Tx: 01 03 01 16 00 04 A4 31
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <current?>
;; KP184: Tx <holdingL? 0x0116 /1000>
;; COM11: Tx: 01 03 01 16 00 04 A4 31
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <voltage?>
;; KP184: Tx <holdingL? 0x0112 /1000>
;; COM11: Tx: 01 03 01 12 00 04 E5 F0
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <resistance?>
;; KP184: Tx <holdingL? 0x011A>
;; COM11: Tx: 01 03 01 1A 00 04 64 32
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <power?>
;; KP184: Tx <holdingL? 0x011E /10>
;; COM11: Tx: 01 03 01 1E 00 04 25 F3
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <remote?>
;; KP184: Tx <holdingL? 0x10a>
;; COM11: Tx: 01 03 01 0A 00 04 65 F7
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <current 2.0>
;; KP184: Tx <holdingL 0x0116 2.0 *1000>
;; COM11: Tx: 01 06 01 16 00 01 04 00 00 07 D0 9D 0C
;; KP184: Tx <current?>
;; KP184: Tx <holdingL? 0x0116 /1000>
;; COM11: Tx: 01 03 01 16 00 04 A4 31
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <current?>
;; KP184: Tx <holdingL? 0x0116 /1000>
;; COM11: Tx: 01 03 01 16 00 04 A4 31
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
;; KP184: Tx <mode?>
;; KP184: Tx <holdingL? 0x0110>
;; COM11: Tx: 01 03 01 10 00 04 44 30
;; KP184: Rx Timeout
;; KP184: Rx as number <NaN>
If you set #subDriver Kunkinx, then the current value is recorded.
KP184 accept the current value. Sorry, Google TranslateIf you set #subDriver Kunkinx, then the current value is recorded.
What do you mean by recorder? That the load see it?
KP184 accept the current value. Sorry, Google Translate
Where should I configure this?
I tried all four options. I did not notice any changes. Data from KP184 does not come.
Yes, ENTER.
Can I make a full dump from the moment of connection and before pressing the "Setup" button?
01030110000444300103040E000001391B0103010E000424360103040E000000F8DB01030110000444300103040E000001391B010301160004A431010304000007D0F99F010301160004A431010304000007D0F99F010301120004E5F001030400004E20CE4B0103011A0004643201030400000000FA330103011E000425F301030400000000FA330103010A000465F701030400000000FA33
I have checked all the #subDriver options. KP184 only responds if #subDriver Kunkinx is installed. If the driver is #subDriver Kunkin or #subDriver RTU, the KP184 does not respond to commands.
Bitrate (9600N81dr, 9600N81Dr, 9600N81dR, 9600N81DR) has no effect. The same data is always sent and returned. I posted the dump in the previous post. TestConrtoller does not process the response from KP184.
You probably don't understand me.
With the #subDriver Kunkinx protocol, the TC controls KP184 (switches modes, changes current and voltage) and KP184 sends a response. But the answer is not accepted by TC and is not displayed on the "Setup" panel and in the "Current values" section.
Yesterday I ran tests with different values of 9600N81DR and 9600N81dr. Where can I see the changes from 9600N81DR and 9600N81dr?
The control for the electronic load is executed at any of their values. And also commands are sent on and off.
Today I ran comparison tests using a com port monitor for different programs (Kunkin, KP184 Modbus, TC). Can this data somehow help? For change mode CV>CC.
Question why can't TestController use one command to get all the data (for example: 0103030000204456) instead of 0x0122 and 0x0126.
It is only necessary to test with Kunkinx, what is needed now is to get data back from the KP184 and I am a bit low on ideas.Data from KP184 does not come back. It would be more correct to say KP184 sends data (I see it in the com-port monitor), but TC does not understand this data.
It is only necessary to test with Kunkinx, what is needed now is to get data back from the KP184 and I am a bit low on ideas.Data from KP184 does not come back. It would be more correct to say KP184 sends data (I see it in the com-port monitor), but TC does not understand this data.
Handflow: ControlHandShake=(DTR_CONTROL), FlowReplace=(TRANSMIT_TOGGLE, RTS_CONTROL, XOFF_CONTINUE), XonLimit=2048, XoffLimit=512
Set timeouts: ReadInterval=-1, ReadTotalTimeoutMultiplier=-1, ReadTotalTimeoutConstant=1000, WriteTotalTimeoutMultiplier=0, WriteTotalTimeoutConstant=0
Kunkin software has this parameter:Handflow: ControlHandShake=(DTR_CONTROL), FlowReplace=(TRANSMIT_TOGGLE, RTS_CONTROL), XonLimit=64, XoffLimit=64
Set timeouts: ReadInterval=-1, ReadTotalTimeoutMultiplier=0, ReadTotalTimeoutConstant=0, WriteTotalTimeoutMultiplier=0, WriteTotalTimeoutConstant=500
There are no external changes. Data is still not being received by TC. (((
HKJ, i will ask you about these parameters again. They change several times during the boot process. First they coincide with kunkinsw, then they become different. Maybe they are the problem?
ReadTotalTimeoutMultiplier=-1
ReadTotalTimeoutConstant=1000
I have no more ideas. But I can see the difference in the parameters in the working connection of kunkinsw and TC |O
The old version (1.62) is downloaded from the official address. I installed from here https://www.eevblog.com/forum/testgear/program-that-can-log-from-many-multimeters/msg3566608/#msg3566608 (https://www.eevblog.com/forum/testgear/program-that-can-log-from-many-multimeters/msg3566608/#msg3566608)
Works!!!!
model?
;; COM11: Flush:
;; COM11: Tx: 01 03 00 01 00 04 15 C9
;; COM11: Rx: 01 03 04 00 00 07 30 F8 17
;; 1840
HKJ, today I'm doing my first full battery test. I notice a difference in the voltage and capacitance readings on the device and in the TC. This is apparently due to the difference in requests.
It is better to receive all data in one request, and not in separate ones (0x0122, 0x0126). Is it possible to implement this?
5.Read actual voltage and current:
Send instruction: 01 03 03 00 00 00 8E 45
It is a special instruction, which facilitates reading the common data register bank at one time.
01: equipment address.
03: read the instruction number of register.
03 00 : read the special defined address of the common register bank.
00 00 : it can be any value, because it is senseless in this special instruction.
8E 45: check code. The high order is before the low order.
Load return data: 01 03 30 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17 D18 CRCH CRCL
Hereinto, D1 to D18 are valid data.
D1.0 is ON/OFF bit, D1.1-D1.2 is mode bit
D3-D5 is the actual voltage value (unit mV), which is three bytes 24 bit data with the high order is before the low order.
D6-D8 is the actual current value, which is three bytes 24 bit data with the high order is before the low order..
This is an excerpt from the user manual. Just take into account the change in CRC. Perhaps it would be more correct.
Another reason for small differences can be number of digits, the device may use more digits internally that can be read from the interface or the other way around (It depends on the device).The difference in the data is likely due to ripple and mismatched sampling times.
Looking on the some documentation I have found for the Kunkin, it looks like it is possible to read it power, you can try with the command:Yes, I can do it a little later.
holdingL? 0x0122 /1000
The difference in the data is likely due to ripple and mismatched sampling times.
I understand.
The display shows 000.40
holdingL? 0x0122 /1000
;; COM11: Flush:
;; COM11: Tx: 01 03 01 22 00 04 E5 FF
;; COM11: Rx: 01 03 04 00 00 0F A4 FE 78
;; 4.0040000000000004
Sorry, I was wrong. This is the display capacity.
The display shows 03.985
holdingL? 0x0122 /1000
;; COM11: Flush:
;; COM11: Tx: 01 03 01 22 00 04 E5 FF
;; COM11: Rx: 01 03 04 00 00 0F 91 3E 6F
;; 3.985
For power data, another command.Code: [Select]VA MEASURE 0x0124 4 R 0-40000 电压测量值,单位mV,量程40V
I'm a little confused. What command should I execute?
Another question. Can TC be done with other languages?
In general, I figured out how what works. Basic commands for reading all parameters:
holding? 0x0300
holding? 0x0301
The point is that TC does not form them very correctly. Should accordingly be:
holding? 0x0300 >>> 01 03 03 00 00 20 44 56
holding? 0x0301 >>> 01 03 03 01 00 0C 14 4B
Because of this, everything has slowed down so far. Is there a way to fix it?
Read actual voltage and current (0x0300):
Send instruction:
01 03 03 00 00 20 44 56
It is a special instruction, which facilitates reading the common data register bank at one time.
01: equipment address.
03: read the instruction number of register.
03 00 : read the special defined address of the common register bank.
00 00 : it can be any value, because it is senseless in this special instruction.
8E 45: check code. The high order is before the low order.
Load return data:
01 03 30 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17 D18 CRCH CRCL
D1 to D18 are valid data.
D1.0 is ON/OFF bit, D1.1-D1.2 is mode bit
D3-D5 is the actual voltage value (unit mV), which is three bytes 24 bit data with the high order is before the low order.
D6-D8 is the actual current value, which is three bytes 24 bit data with the high order is before the low order..
D9-D11 Dynamic A load current value, unit mA
D12-D13 Dynamic A load maintenance time, unit mS
D14-D16 Dynamic B load current value, unit mA
D17-D18 Dynamic B load maintenance time, unit mS
--------------------------
Read actual parameters when testing the battery (0x0301):
Send instruction:
01 03 03 01 00 0C 14 4B
Load return data:
(01 03 1F D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17 D18) D19 D20 D21 D22 D23 D24 D25 D26 D27 D28 D29 D30 D31 D32 CRCH CRCL
|-- -- --|--|--|voltage |current |-- -- -- |-- -- |-- -- -- |-- -- |-- |-- |-- |voltage end|-- Ah -- |-- Wh -- |-- |-- |
D19 When the discharge reaches the termination voltage, whether the current drops to half to continue discharging, 0 is no, 1 is yes
D20 The discharge capacity calculation unit is 0 for AH and 1 for WH
D21 Discharge end output signal: 0 beeps once, 1 always beeps, 2 output level
D22-D24 Battery discharge end voltage, unit mV
D25-D28 Battery discharge capacity test result, the unit is AH
D29-D32 Battery discharge capacity test result, the unit is WH
It remains to figure out how to translate capacity and power into normal decimal digits. Simple translation HEX> DEC doesn't work.
Ok. Besides the answer to the holding team? 0x0301 should return 37 bytes and now returns 36 bytes. This is how I see it in TC.
TC do not support that messageIn general, this is not a disaster. Only the end of the CRC is truncated, the data seems to arrive intact
I get the following data from KunkinSW
01 03 1F 03 05 00 0D C1 00 07 D0 00 07 D0 00 FA 00 FA 00 07 D0 00 00 00 00 0A F0 00 09 C4 00 00 22 A3 C8 A6 1B
Where
00 09 C4 00 = ~ 0.178Ah
00 22 A3 C8 = ~ 0.63Wh
How are these values obtained? Normal HEX> DEC doesn't work. (I tried in windows calculator)
Now I remember. I was making a config file for East Tester ET5410.txt. Unfortunately this device is now damaged and it will probably be repaired. I haven't done all the functions, but the basic settings are fine. You can edit who wants.
Do you mean that everything in the file works or only some of the stuff in the file works?The file is working. The "LIST" mode is not implemented
I did not find examples of how to split the resulting string of 36 bytes and take the desired values and convert to dec. Can you write an example?
Okay. In outgoing packets from the com-port, I see packets bytes, that's why I named it that way.
All the other messages uses long integers in a scaled format, this means I would expect something like 178mAh or 1780*0.1mAh or 17800*0.01mAhDear interflexo helped.
But it do not match the message.
You can fairly easy check for this by opening the calculator popup, select hex format and then type in the number, it will show the expected hex string:
Why doesn't this command work?
HALF CURR 0x014A 1 R/W 0,1
holdingL 0x014A 1
This variation also does not work, or I am writing the wrong syntax.
This similar command "holdingL 0x0144 (value)" works great.
BATT ONOFF 0x0144 1 R/W 0,1
Probably a bug in the firmware
;; KP184: Tx <VoltageEnd 5.6>
;; KP184: Tx <holdingL 0x0146 5.6 *1000 ;0-150>
;; COM11: Flush:
;; COM11: Tx: 01 06 01 46 00 01 04 00 00 15 E0 94 84
;; KP184: Tx <VoltageEnd?>
;; KP184: Tx <holdingL? 0x0146 /1000>
;; COM11: Flush: 01 06 01 46 00 01 04 23 7D
;; COM11: Tx: 01 03 01 46 00 04 A4 20
;; COM11: Rx: 01 03 04 00 00 15 E0 F5 2B
;; KP184: Rx <5.6000000000000005>
;; KP184: Cache Tx: <VoltageEnd?> Rx: <5.6000000000000005>
;; KP184: Rx as number <5.6000000000000005>
HKJ, What is the best way to make this value appear in a comboboxhot or radio?HKJ, What is the best way to make this value appear in a comboboxhot or radio?
Need to convert <5.6000000000000005> to <5.6>
;; KP184: Tx <VoltageEnd 5.6>
;; KP184: Tx <holdingL 0x0146 5.6 *1000 ;0-150>
;; COM11: Flush:
;; COM11: Tx: 01 06 01 46 00 01 04 00 00 15 E0 94 84
;; KP184: Tx <VoltageEnd?>
;; KP184: Tx <holdingL? 0x0146 /1000>
;; COM11: Flush: 01 06 01 46 00 01 04 23 7D
;; COM11: Tx: 01 03 01 46 00 04 A4 20
;; COM11: Rx: 01 03 04 00 00 15 E0 F5 2B
;; KP184: Rx <5.6000000000000005>
;; KP184: Rx after :readmath: formatDouble(value,1,3,3,3) <5.600>
;; KP184: Cache Tx: <VoltageEnd?> Rx: <5.6000000000000005>
;; KP184: Rx after :readmath: formatDouble(value,1,3,3,3) <5.600>
;; KP184: Rx as number <5.6>
It did not help.It did not help.
I think the problem is in the comboboxhot and radio components.
There is no such problem with the Number component. Thank you.
It is necessary to round up to 3 digits and discard the final 0. But I don't know what the syntax will be.
HKJ, can you add a directory selection for saving reports to the settings?
Default directory.
My directory is C:/18650_test. TC opens every time C:/Users/User/Documents/TestController
Used the new screen shot feature. Works great. Except for date and time which which are wrong. See pics.
I tested several batteries, now I'm thinking how to superimpose the comparison results on each other like here. Can this be done with TC?
Does not work. The abscissa axis contains the time parameter.
Can you make a short video on how to do this?
; Login in command
#scpiCmd loginy? txrxnBin? 8 \x80\x00\x00\x09\x61\x6e\x6f\x6e\x79\x6d\x6f\x75\x73
; Empty password
#scpiCmd pwdy? txrxnBin? 8 \x80\x00\x00\x00
But, this method only gives 8 char of the reply at a time and you have to wait between sending the user name and then password. See the attached file which includes Python code for logging in if that helps with details.I am working to try and connect a Yokogawa WT3000 Power Analyzer into Test Controller. The WT3000 is a SCPI interfaced device but it uses what Yokogawa calls a Legacy Protocol. Working with a Yokogawa app engineer I received the attached description and Python coding example for that protocol. (I was told no interface spec document could be shared with me.)
Sorry to hear about your computer HW issues. Hopefully it won't be too time consuming or expensive to get back up and running. My son's desktop motherboard stopped booting over the weekend so I feel you pain.
No problem waiting until your computer is back to normal for some assistance. In the meantime I am working on some ideas within existing TC functionality to talk to the Yokogawa.
sendy? "*IDN?"
;; WT3000: Tx <sendy? "*IDN?">
dk.hkj.script.ProgramExceptions$UnknownException: Variable not found strlen
hex(2147483648 + strlen"*IDN?"____<----____) + value
at dk.hkj.script.Script.getVar(Script.java:73)
+ many more Java error lines.
=var temp = "*IDN?"
=temp = (hex(2147483648 + strlen(temp)) + temp)
= temp
;; 80000005*IDN?
It is as if the interpreter/evaluator used by the driver file for #scpiCmd's does not allow the string operator strlen and it thinks it is a variable name rather than a function. Does the syntax need to change to use the strlen function in a #scpiCmd inside an instrument driver file?
0260.60e03 Ohms\r\n
#askValues read?
; Format of answer: f=float, u=remove trailing letters, x=skip, *=Zero upper case values if this value is 0
#askValuesReadFormat fx
OVLOAD\r\n
Test Controller has Configuration option for Overload Handling (return 0, 1e99, infinite). How can I handle OVLOAD such that this config setting is used?
#askValues read?
#askValuesReadFormat fxx
#askValuesMathFormat value=="OVLOAD"?1e100:value
I will be able to try the AsciiBin driver with the Yokogawa tomorrow. Fully booked today. Will let you know how it goes.
txrx? *idn?
;; WT3000: Tx <txrx? *idn?>
;; 10.8.37.94: Tx: 80 00 00 05 2A 69 64 6E 3F
;; 10.8.37.94: Rx: 80 00 00 00
;; WT3000: Rx Timeout
txrx?
;; WT3000: Tx <txrx?>
;; 10.8.37.94: Tx: 80 00 00 00
;; 10.8.37.94: Rx: 80 00 00 00
;; WT3000: Rx Timeout
txrx?
;; WT3000: Tx <txrx?>
;; 10.8.37.94: Tx: 80 00 00 00
;; 10.8.37.94: Rx: 80 00 00 00
;; WT3000: Rx Timeout
txrx?
;; WT3000: Tx <txrx?>
;; 10.8.37.94: Tx: 80 00 00 00
;; 10.8.37.94: Rx: 80 00 00 00
;; WT3000: Rx Timeout
txrx?
;; WT3000: Tx <txrx?>
;; 10.8.37.94: Tx: 80 00 00 00
;; 10.8.37.94: Rx: 80 00 00 20 59 4F 4B 4F 47 41 57 41 2C 37 36 30 33 30 34 2D 30 34 2D 4D 56 2C 30 2C 46 36 2E 33 31 41 44 0A
;; WT3000: Rx <YOKOGAWA,760304-04-MV,0,F6.31AD>
;; YOKOGAWA,760304-04-MV,0,F6.31AD
Thank you very much for adding asciiBin and thanks for the documentation reference.
;; 15:45:02.536 Start thread for: 10.8.37.94 - Yokogawa WT3000
;; Found Yokogawa WT3000 on 10.8.37.94
txrx? anonymous
;; 15:45:21.181 WT3000: Tx <txrx? anonymous>
;; 15:45:21.181 10.8.37.94: Tx: 80 00 00 09 61 6E 6F 6E 79 6D 6F 75 73
;; 15:45:21.181 10.8.37.94: Rx: 80 00 00 09 75 73 65 72 6E 61 6D 65 3A
;; 15:45:21.181 WT3000: Rx <username:>
;; username:
txrx?
;; 15:45:31.245 WT3000: Tx <txrx?>
;; 15:45:31.245 10.8.37.94: Tx: 80 00 00 00
;; 15:45:31.245 10.8.37.94: Rx: 80 00 00 00
;; 15:45:33.495 WT3000: Rx Timeout
txrx?
;; 15:45:40.802 WT3000: Tx <txrx?>
;; 15:45:40.802 10.8.37.94: Tx: 80 00 00 00
;; 15:45:40.802 10.8.37.94: Rx: 80 00 00 09 70 61 73 73 77 6F 72 64 3A
;; 15:45:40.802 WT3000: Rx <password:>
;; password:
txrx?
;; 15:45:44.316 WT3000: Tx <txrx?>
;; 15:45:44.316 10.8.37.94: Tx: 80 00 00 00
;; 15:45:44.316 10.8.37.94: Rx: 80 00 00 00
;; 15:45:46.522 WT3000: Rx Timeout
txrx?
;; 15:45:49.382 WT3000: Tx <txrx?>
;; 15:45:49.382 10.8.37.94: Tx: 80 00 00 00
;; 15:45:49.382 10.8.37.94: Rx: 80 00 00 14 43 74 6C 20 73 65 72 76 65 72 20 69 73 20 72 65 61 64 79 2E
;; 15:45:49.382 WT3000: Rx <Ctl server is ready.>
;; Ctl server is ready.
txrx? *idn?
;; 15:46:03.435 WT3000: Tx <txrx? *idn?>
;; 15:46:03.435 10.8.37.94: Tx: 80 00 00 05 2A 69 64 6E 3F
;; 15:46:03.435 10.8.37.94: Rx: 80 00 00 00
;; 15:46:05.652 WT3000: Rx Timeout
txrx? :MEAS:AVER?
;; 15:46:22.802 WT3000: Tx <txrx? :MEAS:AVER?>
;; 15:46:22.802 10.8.37.94: Tx: 80 00 00 0B 3A 4D 45 41 53 3A 41 56 45 52 3F
;; 15:46:22.803 10.8.37.94: Rx: 80 00 00 00
;; 15:46:24.996 WT3000: Rx Timeout
txrx?
;; 15:46:33.523 WT3000: Tx <txrx?>
;; 15:46:33.523 10.8.37.94: Tx: 80 00 00 00
;; 15:46:33.523 10.8.37.94: Rx: 80 00 00 00
;; 15:46:35.747 WT3000: Rx Timeout
txrx?
;; 15:46:37.289 WT3000: Tx <txrx?>
;; 15:46:37.289 10.8.37.94: Tx: 80 00 00 00
;; 15:46:37.289 10.8.37.94: Rx: 80 00 00 20 59 4F 4B 4F 47 41 57 41 2C 37 36 30 33 30 34 2D 30 34 2D 4D 56 2C 30 2C 46 36 2E 33 31 41 44 0A
;; 15:46:37.289 WT3000: Rx <YOKOGAWA,760304-04-MV,0,F6.31AD>
;; YOKOGAWA,760304-04-MV,0,F6.31AD
txrx?
;; 15:46:41.925 WT3000: Tx <txrx?>
;; 15:46:41.940 10.8.37.94: Tx: 80 00 00 00
;; 15:46:41.940 10.8.37.94: Rx: 80 00 00 31 3A 4D 45 41 53 55 52 45 3A 41 56 45 52 41 47 49 4E 47 3A 53 54 41 54 45 20 30 3B 54 59 50 45 20 45 58 50 4F 4E 45 4E 54 3B 43 4F 55 4E 54 20 32 0A
;; 15:46:41.940 WT3000: Rx <:MEASURE:AVERAGING:STATE 0;TYPE EXPONENT;COUNT 2>
;; :MEASURE:AVERAGING:STATE 0;TYPE EXPONENT;COUNT 2
txrx?
;; 15:46:46.523 WT3000: Tx <txrx?>
;; 15:46:46.523 10.8.37.94: Tx: 80 00 00 00
;; 15:46:46.523 10.8.37.94: Rx: 80 00 00 00
;; 15:46:48.726 WT3000: Rx Timeout
Edit 1:
Made an quick start run.
When starting batterytest, (with powersupply as source) I get the following message
in the log window:
;; COM4: Zero answer for 12: CA CB 00 00 00 CE
Edit 2:
In debug window when dropout:
java.lang.NullPointerException
at dk.hkj.devices.DeviceATorchPX100$TranslatingCommInterface.getValue(DeviceATorchPX100.java:63)
Starting
;; 12:37:03.608 Start thread for: 10.8.37.94 - Yokogawa WT3000
;; Found Yokogawa WT3000 on 10.8.37.94
txrx? anonymous
;; 12:37:19.457 WT3000: Tx <txrx? anonymous>
;; 12:37:19.457 10.8.37.94: Tx: 80 00 00 09 61 6E 6F 6E 79 6D 6F 75 73
;; 12:37:19.457 10.8.37.94: Rx: 80 00 00 09 75 73 65 72 6E 61 6D 65 3A
;; 12:37:19.457 WT3000: Rx <username:>
;; username:
txrx
;; 12:37:35.151 WT3000: Tx <txrx>
;; 12:37:35.151 10.8.37.94: Tx: 80 00 00 00
;; 12:37:35.151 10.8.37.94: Rx: 80 00 00 00
txrx
;; 12:37:37.671 WT3000: Tx <txrx>
;; 12:37:37.671 10.8.37.94: Tx: 80 00 00 00
;; 12:37:37.671 10.8.37.94: Rx: 80 00 00 09 70 61 73 73 77 6F 72 64 3A
txrx
;; 12:37:40.995 WT3000: Tx <txrx>
;; 12:37:40.995 10.8.37.94: Tx: 80 00 00 00
;; 12:37:40.995 10.8.37.94: Rx: 80 00 00 00
txrx?
;; 12:37:49.193 WT3000: Tx <txrx?>
;; 12:37:49.193 10.8.37.94: Tx: 80 00 00 00
;; 12:37:49.193 10.8.37.94: Rx: 80 00 00 14 43 74 6C 20 73 65 72 76 65 72 20 69 73 20 72 65 61 64 79 2E
;; 12:37:49.193 WT3000: Rx <Ctl server is ready.>
;; Ctl server is ready.
Starting
;; 12:39:16.759 Start thread for: 10.8.37.94 - Yokogawa WT3000
;; Found Yokogawa WT3000 on 10.8.37.94
loginy?
;; 12:39:28.096 WT3000: Tx <loginy?>
;; 12:39:28.096 WT3000: Tx <txrx? anonymous
txrx
txrx
txrx
txrx?>
;; 12:39:28.096 10.8.37.94: Tx: 80 00 00 09 61 6E 6F 6E 79 6D 6F 75 73
;; 12:39:28.096 10.8.37.94: Rx: 80 00 00 09 75 73 65 72 6E 61 6D 65 3A
;; 12:39:28.096 10.8.37.94: Tx: 80 00 00 00
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at dk.hkj.comm.SocketPacketInterface.readData(SocketPacketInterface.java:92)
at dk.hkj.comm.SocketPacketInterface.writeReadData(SocketPacketInterface.java:233)
at dk.hkj.comm.SocketPacketInterface.writeReadData(SocketPacketInterface.java:227)
at dk.hkj.devices.DeviceAsciiBin$TranslatingCommDataInterface.oWriteRead(DeviceAsciiBin.java:61)
at dk.hkj.devices.DeviceAscii$TranslatingCommInterface.write(DeviceAscii.java:247)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:141)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:162)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:211)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:256)
at dk.hkj.main.DeviceInterface.doCommand(DeviceInterface.java:81)
at dk.hkj.main.CommandProcessor.processCommands(CommandProcessor.java:2834)
at dk.hkj.main.PaneCommand.processCommand(PaneCommand.java:1463)
at dk.hkj.main.PaneCommand.access$20(PaneCommand.java:1461)
at dk.hkj.main.PaneCommand$31.keyTyped(PaneCommand.java:897)
at java.awt.AWTEventMulticaster.keyTyped(Unknown Source)
at java.awt.Component.processKeyEvent(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
;; 12:39:28.150 10.8.37.94: Rx timeout 1000ms In buffer:
java.lang.NullPointerException
at dk.hkj.devices.DeviceAsciiBin$TranslatingCommDataInterface.decode(DeviceAsciiBin.java:76)
at dk.hkj.devices.DeviceAsciiBin$TranslatingCommDataInterface.oWriteRead(DeviceAsciiBin.java:61)
at dk.hkj.devices.DeviceAscii$TranslatingCommInterface.write(DeviceAscii.java:247)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:141)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:162)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:211)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:256)
at dk.hkj.main.DeviceInterface.doCommand(DeviceInterface.java:81)
at dk.hkj.main.CommandProcessor.processCommands(CommandProcessor.java:2834)
at dk.hkj.main.PaneCommand.processCommand(PaneCommand.java:1463)
at dk.hkj.main.PaneCommand.access$20(PaneCommand.java:1461)
at dk.hkj.main.PaneCommand$31.keyTyped(PaneCommand.java:897)
at java.awt.AWTEventMulticaster.keyTyped(Unknown Source)
at java.awt.Component.processKeyEvent(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
;; 12:39:28.197 WT3000: Rx Timeout
Using the below #scpiCmd I had hoped to get the same result.
#scpiCmd loginy? txrx? anonymous
txrx
txrx
txrx
txrx?
#scpiCmd <next command>
But the result is very different including some Java errors.
...
Thoughts on why the multi-line #scpiCmd yields such different results?
Also, after logging in still see a 3 transaction delay before the reply shows up. I thought maybe it needed a line feed at the end of the message. I put
#eol \_
It turns out that #cmdDelayTime 1 allowed the automated login sequence to run. Seems odd that only 1 mSec of additional delay makes it work but 1 mSec between commands is not going to limit performance enough to matter.
As for the issue of getting replies to queries three communications transactions later I am still at a loss. I did try #eol \r, #eol \n but with those settings I could not log in to the instrument and thus could not try sending queries with new line or carriage return as end of line.
Any thoughts on next steps to debug what is going on? Is there another debug option in Test Controller that might help get more information? Do I really need to fire up WireShark and get complete traces of raw messages going back and forth?
Starting
;; 13:52:52.539 Start thread for: 10.8.37.94 - Yokogawa WT3000
;; Found Yokogawa WT3000 on 10.8.37.94
loginy?
;; 13:52:58.838 WT3000: Tx <loginy?>
;; 13:52:58.838 WT3000: Tx <txrx anonymous
txrx
txrx
txrx
txrx?>
;; 13:52:58.838 10.8.37.94: Tx: 80 00 00 09 61 6E 6F 6E 79 6D 6F 75 73
;; 13:52:58.838 10.8.37.94: Rx: 80 00 00 09 75 73 65 72 6E 61 6D 65 3A
;; 13:52:58.854 10.8.37.94: Tx: 80 00 00 00
;; 13:52:58.876 10.8.37.94: Rx: 80 00 00 00
;; 13:52:58.881 10.8.37.94: Tx: 80 00 00 00
;; 13:52:58.897 10.8.37.94: Rx: 80 00 00 09 70 61 73 73 77 6F 72 64 3A
;; 13:52:58.913 10.8.37.94: Tx: 80 00 00 00
;; 13:52:58.928 10.8.37.94: Rx: 80 00 00 00
;; 13:52:58.943 10.8.37.94: Tx: 80 00 00 00
;; 13:52:58.948 10.8.37.94: Rx: 80 00 00 14 43 74 6C 20 73 65 72 76 65 72 20 69 73 20 72 65 61 64 79 2E
;; 13:52:58.954 WT3000: Rx <Ctl server is ready.>
;; Ctl server is ready.
Starting
;; 14:08:05.739 Start thread for: 10.8.37.94 - Yokogawa WT3000
;; 14:08:05.993 : Tx <txrx anonymous
txrx
txrx
txrx
txrx?>
;; 14:08:05.993 10.8.37.94: Tx: 80 00 00 09 61 6E 6F 6E 79 6D 6F 75 73
;; 14:08:05.993 10.8.37.94: Rx: 80 00 00 09 75 73 65 72 6E 61 6D 65 3A
;; 14:08:06.008 10.8.37.94: Tx: 80 00 00 00
;; 14:08:06.023 10.8.37.94: Rx: 80 00 00 00
;; 14:08:06.032 10.8.37.94: Tx: 80 00 00 00
;; 14:08:06.048 10.8.37.94: Rx: 80 00 00 09 70 61 73 73 77 6F 72 64 3A
;; 14:08:06.061 10.8.37.94: Tx: 80 00 00 00
;; 14:08:06.078 10.8.37.94: Rx: 80 00 00 00
;; 14:08:06.095 10.8.37.94: Tx: 80 00 00 00
;; 14:08:06.100 10.8.37.94: Rx: 80 00 00 14 43 74 6C 20 73 65 72 76 65 72 20 69 73 20 72 65 61 64 79 2E
;; 14:08:06.105 10.8.37.94: **Device do not match** <Ctl_server_is_ready.>
;; 10.8.37.94 Device Ctl server is ready. do not match: **Device do not match** <Ctl_server_is_ready.>
;; 14:08:06.147 Stopping thread for: 10.8.37.94 - Yokogawa WT3000
What do I need to put on the #verifyDevice first argument and for the #idString to get them to match given what the multi-line log in command loginy? will return the ascii text "Ctl server is ready.".
loginy?
;; 16:17:33.794 WT3000: Tx <loginy?>
;; 16:17:33.794 WT3000: Tx <txrx anonymous
txrx
txrx
txrx
txrx?
:readmath: "Yes">
;; 16:17:33.794 10.8.37.94: Tx: 80 00 00 09 61 6E 6F 6E 79 6D 6F 75 73
;; 16:17:33.794 10.8.37.94: Rx: 80 00 00 09 75 73 65 72 6E 61 6D 65 3A
;; 16:17:33.803 10.8.37.94: Tx: 80 00 00 00
;; 16:17:33.822 10.8.37.94: Rx: 80 00 00 00
;; 16:17:33.828 10.8.37.94: Tx: 80 00 00 00
;; 16:17:33.847 10.8.37.94: Rx: 80 00 00 09 70 61 73 73 77 6F 72 64 3A
;; 16:17:33.856 10.8.37.94: Tx: 80 00 00 00
;; 16:17:33.871 10.8.37.94: Rx: 80 00 00 00
;; 16:17:33.884 10.8.37.94: Tx: 80 00 00 00
;; 16:17:33.890 10.8.37.94: Rx: 80 00 00 14 43 74 6C 20 73 65 72 76 65 72 20 69 73 20 72 65 61 64 79 2E
;; 16:17:33.898 WT3000: Rx <Ctl server is ready.>
;; Ctl server is ready.
Unfortunately the combination of latest beta Ver 1.68, using asciiBin driver does not seem to ever execute the :readmath:. See below debug window.
Pukker: I have removed the debug messages and also tinkered a bit with the RD60xx protocol, to hopefully reduce dropouts on it.
;; 09:43:15.710 Start thread for: 10.8.37.94 - Yokogawa WT3000
;; 09:43:15.964 : Tx <txrx anonymous
txrx
txrx
txrx
txrx?
:readmath: "Yes works">
;; 09:43:15.964 10.8.37.94: Tx: 80 00 00 09 61 6E 6F 6E 79 6D 6F 75 73
;; 09:43:15.964 10.8.37.94: Rx: 80 00 00 09 75 73 65 72 6E 61 6D 65 3A
;; 09:43:15.979 10.8.37.94: Tx: 80 00 00 00
;; 09:43:15.979 10.8.37.94: Rx: 80 00 00 00
;; 09:43:15.995 10.8.37.94: Tx: 80 00 00 00
;; 09:43:16.010 10.8.37.94: Rx: 80 00 00 09 70 61 73 73 77 6F 72 64 3A
;; 09:43:16.026 10.8.37.94: Tx: 80 00 00 00
;; 09:43:16.042 10.8.37.94: Rx: 80 00 00 00
;; 09:43:16.064 10.8.37.94: Tx: 80 00 00 00
;; 09:43:16.069 10.8.37.94: Rx: 80 00 00 14 43 74 6C 20 73 65 72 76 65 72 20 69 73 20 72 65 61 64 79 2E
;; 09:43:16.091 10.8.37.94: **Device do not match** <Yes_works>
;; 10.8.37.94 Device Yes works do not match: **Device do not match** <Yes_works>
;; 09:43:16.133 Stopping thread for: 10.8.37.94 - Yokogawa WT3000
So, how to set the argument string in #verifyDevice and the value for #idString so that returned strings like "Ctl server is ready." with spaces in it will be properly recognized as a match?
Starting
;; 12:13:07.786 Start thread for: 10.8.37.94 - Yokogawa WT3000
;; 12:13:08.033 : Tx <txrx anonymous
txrx
txrx
txrx
txrx?
:readmath: "Ctl server is ready.">
;; 12:13:08.033 10.8.37.94: Tx: 80 00 00 09 61 6E 6F 6E 79 6D 6F 75 73
;; 12:13:08.033 10.8.37.94: Rx: 80 00 00 09 75 73 65 72 6E 61 6D 65 3A
;; 12:13:08.049 10.8.37.94: Tx: 80 00 00 00
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at dk.hkj.comm.SocketPacketInterface.readData(SocketPacketInterface.java:92)
Does txrx (no question mark) with asciiBin driver expect a reply? I thought it would just send and not expect a reply and if not expecting a reply that would mean you should not be able to get an RX receive timeout error like shown in the below DOS debug record.
Attached driver adds support for the TTi 1908 over USB (using CDC comport).
This DMM has a 500 datapoint memory (not a typo, only 500 datapoints unfortunately!) but I haven't had time to add support for that in the driver.
Attached a driver for Rigol DG800/DG900 series.
Only tested through ethernet connection and on 2 channel enabled hardware.
Most of the on-device Main screen UI is duplicated.
TODO (one day...):
* Arb waveform upload
* many small functions like output invert, align, sweep, trigger, ....
* counter reading
(edit 09:13 CET: new version of the file)
#metadef
#author MikeLud
#idString Riden,Riden RD6006
#name Riden RD6006
#handle RD6006
#replacetext RD60xx 60062
#removeline 12A
#replaceText MaxCurrent 6.000
#replaceText MaxOCP 6.200
#replaceText CurrentScaleFactor 100
#replaceText VoltageScaleFactor 100
#metadef
#author DuckDuck
#idString Riden,Riden RD6006P
#name Riden RD6006P
#handle RD6006P
#replacetext RD60xx 60065
#removeline 12A
#replaceText MaxCurrent 6.000
#replaceText MaxOCP 6.200
#replaceText CurrentScaleFactor 10000
#replaceText VoltageScaleFactor 1000
#metadef
#author MikeLud
#idString Riden,Riden RD6012
#name Riden RD6012
#handle RD6012
#replacetext RD60xx 60121
#replaceText MaxCurrent 12.000
#replaceText MaxOCP 12.100
#replaceText CurrentScaleFactor 1000
#replaceText VoltageScaleFactor 100
#meta
#author MikeLud
#idString Riden,Riden RD60xx
#name Riden RD60xx
#handle RD60xx
#port comfixedbaud
#baudrate 115200
#driver Modbus
#verifyDevice RD60xx Model?
#notes RD6006/12 baud rate must be changed from 115200 to 9600 for this to work. RD6006P will not work at 9600. Consult User Manual for directions.
#scpiCmd SysTC? holding? 0x05
#scpiCmd VSet holding 0x08 (value) *VoltageScaleFactor
#scpiCmd VSet? holding? 0x08 /VoltageScaleFactor
#scpiCmd ISet holding 0x09 (value) *CurrentScaleFactor
#scpiCmd ISet? holding? 0x09 /CurrentScaleFactor
#scpiCmd VOut? holding? 0x0a /VoltageScaleFactor
#scpiCmd OVP? holding? (MNS+2) /100
#scpiCmd OVP holding (MNS+2) (value) *100
#scpiCmd OCP? holding? (MNS+3) /1000
#scpiCmd OCP holding (MNS+3) (value) *1000
Hello. I just got a RD6006P (the "P" version has more precise V & I settings and lower noise). I noticed that the V & I settings were off so I made the following changes (in red):
Hello. I just got a RD6006P (the "P" version has more precise V & I settings and lower noise). I noticed that the V & I settings were off so I made the following changes (in red):
I would prefer you did it directly in definition file and posted a updated file, of course you would have to define the supply as a RD6006P.
The *100 and /100 etc. is the scaling and will change the values, but you may have to check the definition for where to change it.
It would be nice if you could do a perfect working implementation for the P version. You are welcome to post questions here or mail me directly with questions.
<SNIP>
#scpiCmd OVP? holding? (MNS+2) /100
#scpiCmd OVP holding (MNS+2) (value) *100
#scpiCmd OCP? holding? (MNS+3) /1000
#scpiCmd OCP holding (MNS+3) (value) *1000
txrx? expect a reply and passes it on to the driver
txrx expect a reply and do not pass it on.
tx do not expect a reply.
Starting
;; 14:13:40.029 Start thread for: 10.8.37.94 - Yokogawa WT3000
;; 14:13:40.283 : Tx <txrx anonymous
txrx
txrx
txrx
txrx?
:readmath: "Ctl server is ready.">
;; 14:13:40.283 10.8.37.94: Tx: 80 00 00 09 61 6E 6F 6E 79 6D 6F 75 73
;; 14:13:40.283 10.8.37.94: Rx: 80 00 00 09 75 73 65 72 6E 61 6D 65 3A
;; 14:13:40.346 10.8.37.94: Tx: 80 00 00 00
;; 14:13:40.346 10.8.37.94: Rx: 80 00 00 00
;; 14:13:40.398 10.8.37.94: Tx: 80 00 00 00
;; 14:13:40.398 10.8.37.94: Rx: 80 00 00 09 70 61 73 73 77 6F 72 64 3A
;; 14:13:40.455 10.8.37.94: Tx: 80 00 00 00
;; 14:13:40.456 10.8.37.94: Rx: 80 00 00 00
;; 14:13:40.517 10.8.37.94: Tx: 80 00 00 00
;; 14:13:40.529 10.8.37.94: Rx: 80 00 00 14 43 74 6C 20 73 65 72 76 65 72 20 69 73 20 72 65 61 64 79 2E
;; Found Yokogawa WT3000 on 10.8.37.94
tx *idn?
;; 14:13:55.465 WT3000: Tx <tx *idn?>
;; 14:13:55.465 10.8.37.94: Tx: 80 00 00 05 2A 69 64 6E 3F
;; 14:13:57.666 WT3000: Rx Timeout
query? num:norm:val? 30
;; 14:45:37.770 WT3000: Tx <query? num:norm:val? 30>
;; 14:45:37.770 WT3000: Tx <txrx (value)
txrx
txrx
txrx?>
;; 14:45:37.770 10.8.37.94: Tx: 80 00 00 10 6E 75 6D 3A 6E 6F 72 6D 3A 76 61 6C 3F 20 33 30
;; 14:45:37.770 10.8.37.94: Rx: 80 00 00 00
;; 14:45:37.838 10.8.37.94: Tx: 80 00 00 00
;; 14:45:37.838 10.8.37.94: Rx: 80 00 00 00
;; 14:45:37.907 10.8.37.94: Tx: 80 00 00 00
;; 14:45:37.907 10.8.37.94: Rx: 80 00 00 00
;; 14:45:37.969 10.8.37.94: Tx: 80 00 00 00
;; 14:45:37.969 10.8.37.94: Rx: 80 00 00 04 49 4E 46 0A
;; 14:45:37.978 WT3000: Rx <INF>
;; INF
query? num:norm:val?
;; 14:46:02.350 WT3000: Tx <query? num:norm:val?>
;; 14:46:02.350 WT3000: Tx <txrx (value)
txrx
txrx
txrx?>
;; 14:46:02.350 10.8.37.94: Tx: 80 00 00 0D 6E 75 6D 3A 6E 6F 72 6D 3A 76 61 6C 3F
;; 14:46:02.350 10.8.37.94: Rx: 80 00 00 00
;; 14:46:02.403 10.8.37.94: Tx: 80 00 00 00
;; 14:46:02.403 10.8.37.94: Rx: 80 00 00 00
;; 14:46:02.465 10.8.37.94: Tx: 80 00 00 00
;; 14:46:02.465 10.8.37.94: Rx: 80 00 00 00
;; 14:46:02.518 10.8.37.94: Tx: 80 00 00 00
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at dk.hkj.comm.SocketPacketInterface.readData(SocketPacketInterface.java:92)
at dk.hkj.comm.SocketPacketInterface.writeReadData(SocketPacketInterface.java:233)
at dk.hkj.comm.SocketPacketInterface.writeReadData(SocketPacketInterface.java:227)
at dk.hkj.devices.DeviceAsciiBin$TranslatingCommDataInterface.oWriteRead(DeviceAsciiBin.java:61)
at dk.hkj.devices.DeviceAscii$TranslatingCommInterface.write(DeviceAscii.java:286)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:141)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:162)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:211)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:256)
at dk.hkj.main.DeviceInterface.doCommand(DeviceInterface.java:81)
at dk.hkj.main.CommandProcessor.processCommands(CommandProcessor.java:2834)
at dk.hkj.main.PaneCommand.processCommand(PaneCommand.java:1463)
at dk.hkj.main.PaneCommand.access$20(PaneCommand.java:1461)
at dk.hkj.main.PaneCommand$31.keyTyped(PaneCommand.java:897)
at java.awt.AWTEventMulticaster.keyTyped(Unknown Source)
at java.awt.Component.processKeyEvent(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
;; 14:46:02.618 10.8.37.94: Rx timeout 1000ms In buffer: 80 00 08 D2 80 80 80
java.lang.NullPointerException
at dk.hkj.devices.DeviceAsciiBin$TranslatingCommDataInterface.decode(DeviceAsciiBin.java:76)
at dk.hkj.devices.DeviceAsciiBin$TranslatingCommDataInterface.oWriteRead(DeviceAsciiBin.java:61)
at dk.hkj.devices.DeviceAscii$TranslatingCommInterface.write(DeviceAscii.java:286)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:141)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:162)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:211)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:256)
at dk.hkj.main.DeviceInterface.doCommand(DeviceInterface.java:81)
at dk.hkj.main.CommandProcessor.processCommands(CommandProcessor.java:2834)
at dk.hkj.main.PaneCommand.processCommand(PaneCommand.java:1463)
at dk.hkj.main.PaneCommand.access$20(PaneCommand.java:1461)
at dk.hkj.main.PaneCommand$31.keyTyped(PaneCommand.java:897)
at java.awt.AWTEventMulticaster.keyTyped(Unknown Source)
at java.awt.Component.processKeyEvent(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
;; 14:46:02.663 WT3000: Rx Timeout
It is my intention to do a perfectly working implementation of the Riden RD6006P and also the East Tester ET5411.
So these lines (below) control reading and setting of OCP and OVP (see attached image)?
Still struggling to make the interface to the Yokogawa behave. Based on the above I would expect using TX would not give an Rx Timeout error but it does.
I think I understand the idea of com level and SCPI level. Thanks for that explanation.
However, how is #readingDelay used? From my testing it seems that the SCPI level uses this time and the communications level uses a different Rx time out value. The example error printed 1000 mSec for the Rx timeout in the DOS box but the DOS debug times stamps said only 168 mSec before the "SocketTimeoutException read timed out" error.
For the socket connection and for the communications level in general what sets the Rx timeout value?
Also, the example query that always fails is returning around 2260 characters. Does that over flow the communications buffer?
... if you suspect that please state the driver you are using and I will check.
Also, the example query that always fails is returning around 2260 characters. Does that over flow the communications buffer?
Generally there is not supposed to be any buffer overflows, but some messages queues are limited in length to avoid long delays. This only affects complete messages, a single message is not limited in length, but a timeout may cut it short.
From the above I conclude somewhere Test Controller has a 127 character max buffer/limit of some kind.
So, whatever you did to fix the buffer length seems to have made communications more stable also. I will keep testing it but so far so good and thanks a lot.
Just out of curiosity on a completely different subject, what sets the sample interval when on the "Current values" tab?
txrx? expect a reply and passes it on to the driver
txrx expect a reply and do not pass it on.
tx do not expect a reply.
The device is using ascii driver over a serial port and since it is a raw interface it uses txrx1Bin? and txrxnBin? communications commands. But there is no corresponding txrx1Bin without the question mark.
Wow, that was really fast. Quick check shows that txrx1Bin with no question mark is there and using it does solve the script problem that was happening.
We are still working on polishing the Yokogawa power analyzer file and when polished and tested will share with you to include in the next release.
see attached
I have gotten the files for the Riden RD6006P DC power supply and the East Tester ET5411 high voltage DC electronic load to a 90% working state.
To get the last bit for the RD6006P I think that I need a modbus sniffer / analyzer. Are there freeware or open-source modbus sniffers? I think I'll ask UniSoft to help with the RD6006P since he is writing PC software for this device.
To get the last bit for the ET5411 I think that I need a USB or SCPI sniffer. What are people using for this (Windows or Linux)? Also is there PC software for the ET5411 (so I have something to sniff)?
@HKJ,
Question about the Current Values tab.
Could it be possible to have minimum, maximum, average values etc.
not only over an selected (30, 100, 300, 1000) number of values,
but over the whole logging session. Interesting when you log for
an long time and want to observe that values over the complete log.
Just an idea what I was looking for.
Attached is a working Yokogawa WT3000 power analyzer driver file to include in the next release.
Am I doing something wrong? Why do I have such outliers on my graph?
kunkin kp184, TCv1.70
Maybe there is an instruction on how to overlay several graphs. I'm doing something wrong.
#metadef
#idstring S20330
#replaceText DIpeak 9.0
#replaceText VBusScale 0.25
#metadef
#idstring S20630
#replaceText DIpeak 18.0
#replaceText VBusScale 0.23
#metadef
#replaceText DIpeak 18.0
#replaceText VBusScale 1
#meta
;S200 does not reply to SCPI *IDN. Need a #verifyDevice command that is the same for S200's.
; S200 Model read only variable replies with a code to identify the model.
#verifyDevice "S20360" ModelQ?
#idString S20660
#name Kollmorgen S200 Servo
#handle S200
#port com
As I understand it with no *idn? command you use the #verifyDevice command which I am. From my understanding of the documentation the #verifyDevice command has to match a fixed value on the command line. So, how do I write the device file so that the different #idstring value needed to determine which #metadef section to use works?
I see in the web documentation #modifyIDN command. But I could not find how to use/where to put #modifyIDN command in the device driver file? I did define a #scpiCmd getDeviceSW? command and that works. Is there something like #scpiCmd getDeviceModel? that I should define to get #metadef sections to work?
Hi HKJ,
On KUNKIN KP184 there is a problem of strong voltage deviation (like a saw) if you receive data with a command to read one register. At the same time, no deviation is observed on the front panel. Such features of circuitry. I contacted the manufacturer and he said that it is recommended to get all the data in one command. Average data will be transmitted. This is how the front panel works.
How can you implement reading with one command?
The returned data should be 5, 6 and 7. These 3 bytes represent the average voltage value, which is the same as the value displayed on the front panel.
;; Found Kunkin KP184 on USB2.0-Ser! (COM12)
holdingL? 0x0300
;; 1
holdingL? 0x0122
;; 12039
Code: [Select];; Found Kunkin KP184 on USB2.0-Ser! (COM12)
holdingL? 0x0300
;; 1
holdingL? 0x0122
;; 12039
The hexadecimal code of the command to read all basic registers is: 01 03 03 00 00 20 44 56
;; Start thread for: COM12 - Kunkin KP184
;; COM12: Set params: 115200
;; : Tx <holdingL? 0x0001>
;; COM12: Tx: 01 03 00 01 00 04 15 C9
;; COM12: Rx: 01 03 04 00 00 07 30 F8 17
;; COM12: Tx <Mode?>
;; COM12: Tx <holdingL? 0x0110>
;; COM12: Tx: 01 03 01 10 00 04 44 30
;; COM12: Rx: 01 03 04 00 00 00 01 3B F3
;; COM12: Rx <1>
;; Found Kunkin KP184 on USB2.0-Ser! (COM12)
holdingL? 0x0300
;; KP184: Tx <holdingL? 0x0300>
;; COM12: Tx: 01 03 03 00 00 04 44 4D
;; COM12: Rx: 01 03 04 00 00 00 01 3B F3
;; KP184: Rx <1>
;; 1
holdingL? 0x0122
;; KP184: Tx <holdingL? 0x0122>
;; COM12: Tx: 01 03 01 22 00 04 E5 FF
;; COM12: Rx: 01 03 04 00 00 2E C6 67 C1
;; KP184: Rx <11974>
;; 11974
holding? 0x0300
;; KP184: Tx <holding? 0x0300>
;; COM12: Tx: 01 03 03 00 00 02 C4 4F
;; COM12: Flush: 01 03 1E 0B 04 00 2E 2E 00 03 E8 00 03 E8 00 FA 00 FA 00 00 00 17 3D
;; COM12: Tx: 01 03 03 00 00 02 C4 4F
;; KP184: Rx Timeout
holdingL? 0x0300
;; KP184: Tx <holdingL? 0x0300>
;; COM12: Tx: 01 03 03 00 00 04 44 4D
;; COM12: Rx: 01 03 04 00 00 00 01 3B F3
;; KP184: Rx <1>
;; 1
Try this command:holdingL? 0x0300 8
holdingL? 0x0300 8
Try this command:holdingL? 0x0300 8
holdingL? 0x0300 8
;; KP184: Tx <holdingL? 0x0300 8>
;; COM12: Tx: 01 03 03 00 00 20 44 56
;; COM12: Flush: 01 03 1E 0B 04 00 2E 64 00 03 E8 00 03 E8 00 FA 00 FA 00 00 00 5C B7
;; COM12: Tx: 01 03 03 00 00 20 44 56
;; KP184: Rx Timeout
holdingL? 0x0300 8 /1000;; Found Kunkin KP184 on USB2.0-Ser! (COM12)
Voltage and current match. No capacity.
holding? 0x0301
;; KP184: Tx <holding? 0x0301>
;; COM12: Tx: 01 03 03 01 00 02 95 8F
;; COM12: Rx: 01 03 1F 0B 04 00 2A CA 00 19 64 00 19 64 00 FA 00 FA 00 00 00 00 00 00 00 0A 8C 00 0C A0 6C 00 8A 00 A8 46
;; KP184: Rx Timeout
holding? 0x0301
01 03 03 01 00 0C 14 4B
Load return data:
01 03 1F 0B 04 00 2A CA 00 19 64 00 19 64 00 FA 00 FA 00 00 00 00 00 00 00 0A 8C 00 0C A0 6C 00 8A 00 A8 46 ????
(01 03 1F D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17 D18) D19 D20 D21 D22 D23 D24 D25 D26 D27 D28 D29 D30 D31 D32 CRCH CRCL
|-- -- --|--|--|voltage-|current-|-- -- -- |-- -- |-- -- -- |-- -- |-- |-- |-- |voltage end|--- -- mAs ---|--- --mWs-- ---|-- |-- |
|-- -- --|--|--|10954mV-|6500mA--|-- -- -- |-- -- |-- -- -- |-- -- |-- |-- |-- |--2700mV---|---827500mAs---|---9044136mWs--|-- |-- |
It seems that there is no capacity data in (holdingL? 0x0300 8 /1000)
Code: [Select]holding? 0x0301
;; KP184: Tx <holding? 0x0301>
;; COM12: Tx: 01 03 03 01 00 02 95 8F
;; COM12: Rx: 01 03 1F 0B 04 00 2A CA 00 19 64 00 19 64 00 FA 00 FA 00 00 00 00 00 00 00 0A 8C 00 0C A0 6C 00 8A 00 A8 46
;; KP184: Rx Timeout
Better to do this:Code: [Select]holding? 0x0301
01 03 03 01 00 0C 14 4B
Load return data:
01 03 1F 0B 04 00 2A CA 00 19 64 00 19 64 00 FA 00 FA 00 00 00 00 00 00 00 0A 8C 00 0C A0 6C 00 8A 00 A8 46 ????
(01 03 1F D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17 D18) D19 D20 D21 D22 D23 D24 D25 D26 D27 D28 D29 D30 D31 D32 CRCH CRCL
|-- -- --|--|--|voltage-|current-|-- -- -- |-- -- |-- -- -- |-- -- |-- |-- |-- |voltage end|--- -- mAs ---|--- --mWs-- ---|-- |-- |
|-- -- --|--|--|10954mV-|6500mA--|-- -- -- |-- -- |-- -- -- |-- -- |-- |-- |-- |--2700mV---|---827500mAs---|---9044136mWs--|-- |-- |
holdingL? 0x0301 /1000No data, is this normal?
holdingL? 0x0301 /1000No data, is this normal?
holdingL? 0x0301 /1000
;; KP184: Tx <holdingL? 0x0301 /1000>
;; COM12: Tx: 01 03 03 01 00 04 15 8D
;; COM12: Rx: 01 03 04 00 00 00 01 3B F3
;; KP184: Rx Timeout
holdingL? 0x0301 8 /1000
;; KP184: Tx <holdingL? 0x0301 8 /1000>
;; COM12: Tx: 01 03 03 01 00 20 15 96
;; COM12: Rx: 01 03 1F 0A 04 00 2D 07 00 00 00 00 19 64 00 FA 00 FA 00 00 00 00 00 00 00 0A 8C 00 0F 0D FD 00 A4 77 5E C6 31
;; KP184: Rx <11.527000000000001 0.0 986.621 10778.462>
;; 11.527000000000001 0.0 986.621 10778.462
Values are correct. To obtain As> Ah, divide 3600
I have also starting working on multiple divisors, but I have not tested any of it. If it works you can do:Multiple dividers don't work
holding? 0x0301 /1000 /1000 /3600000 /3600000
;; Found Kunkin KP184 on USB2.0-Ser! (COM12)
;; KP184: Tx <holdingL? 0x0301 8 /1000 /1000 /3600000 /3600000>
;; COM12: Tx: 01 03 03 01 00 20 15 96
;; COM12: Rx: 01 03 1F 0A 04 00 2D 02 00 00 00 00 19 64 00 FA 00 FA 00 00 00 00 00 00 00 0A 8C 00 10 3E AD 00 B1 65 D5 B9 3C
;; KP184: Rx <11.522 0.0 1064.621 11625.941>
;; KP184: Rx as numbers <11.522 0.0 1064.621 11625.941>
I have also starting working on multiple divisors, but I have not tested any of it. If it works you can do:Multiple dividers don't work
holding? 0x0301 /1000 /1000 /3600000 /3600000Code: [Select];; Found Kunkin KP184 on USB2.0-Ser! (COM12)
;; KP184: Tx <holdingL? 0x0301 8 /1000 /1000 /3600000 /3600000>
;; COM12: Tx: 01 03 03 01 00 20 15 96
;; COM12: Rx: 01 03 1F 0A 04 00 2D 02 00 00 00 00 19 64 00 FA 00 FA 00 00 00 00 00 00 00 0A 8C 00 10 3E AD 00 B1 65 D5 B9 3C
;; KP184: Rx <11.522 0.0 1064.621 11625.941>
;; KP184: Rx as numbers <11.522 0.0 1064.621 11625.941>
Sorry, I can't download 1.75. 1.73 is downloaded.
;; KP184: Tx <holdingL? 0x0301 8 /1000 /1000 /3600000 /3600000>
;; COM12: Tx: 01 03 03 01 00 20 15 96
;; COM12: Rx: 01 03 1F 0B 04 00 2A 3B 00 19 64 00 19 64 00 FA 00 FA 00 00 00 00 00 00 00 0A 8C 00 11 3C 95 00 BC 2B EE C6 27
;; KP184: Rx <10.811 6.5 0.3137836111111111 3.425559444444444>
;; KP184: Rx as numbers <10.811 6.5 0.3137836111111111 3.425559444444444>
Everything works perfectly! Thank you.Now I would very much like to know if this message exist on all versions of the load or only on the newest.https://www.eevblog.com/forum/testgear/an-investigation-about-ripple-current-of-kunkin-kp184/msg3611151/#msg3611151 (https://www.eevblog.com/forum/testgear/an-investigation-about-ripple-current-of-kunkin-kp184/msg3611151/#msg3611151)
When I load the table data (LOAD button), the values of all fields are reset to two decimal places. Although in the settings on the "Scales for chart" tab, "Decimals" equal to 3 is set for these columns.
The same goes for "Import".
For example, such a file. All values have 3 decimal places, but only 2 are loaded. All columns are registered in the "Scales for chart" tab.
#valueformat V d3
#valueformat Ah d3
#valueformat 1a d3
#valueformat 2a d3
#valueformat 3a d3
#valueformat 5a d3
#valueformat 7a d3
#valueformat 10a d3
#valueformat 15a d3
#valueformat 20a d3
Second question. This is export. If you select "First sample to export" equal to 3 and "Last ..." equal to 100, in fact 2-98 are selected inclusive. These are the index numbers.
Item 1:
:enable: seems not to disable #cmdSetup button. The other controls are OK.
Item 2:
#cmdSetup buttonsOn works well when On is represented by 1 in the #cndSetup definition. In my case the read returns FFT.
I tried to use the if statement, but the indicator did not turn on.
It would be nice to have a thing like :onvalue: FFT to signal the read result for the indicator to turn on.
Item 3:
Some controls create a variable. They work with :enable: and :update:, but I could not get them to work with :read:, :readmath: and :write:
I got a Java exception for an unknown variable. I would really like to use them with those statements. Is that possible?
Example of their use for Siglent SDG modulation SCPI commands:
Current setup: Separate #cmdSetup for AM and FM modulation due to SCPI write requirements
Requires #cmdSetup statements to be repeated and additional :update: controls
1) The selector control displays the name of the selector control in the output window if a entry is selected with no control names attached (e.g. only OFF). I was expecting to see no text.
2) It seems, that you can only use control variables for :enable: defined on the same page of the setup window. Variables from other pages seem to be invalid.
Unfortunately not everything goes according to plan:
Siglent uses some SCPI commands with an underscore in it like: MARK_STATE
This underscore is however removed in the request sent to the device.
I tested your new version and the command is now sent correctly, but I get a "NullPointerException" error in the debug console.Is this an X model SDG ? SiglentSDGxxxx.txt
The debug console output is attached, with result for opening Setup and send the command.
I also attached the current state of the config file for reference.
I tested your new version and the command is now sent correctly, but I get a "NullPointerException" error in the debug console.
The debug console output is attached, with result for opening Setup and sending the command.
Please have a look at my next challenge. I am stuck with the match() statement to solve my problem.
I need to switch between channel tracking and channel coupling. There are three possible responses of the device:
Tracking off and coupling off : COUP TRACE,OFF,FCOUP,OFF
Tracking off and coupling on : COUP TRACE,OFF,FCOUP,ON
Tracking on and coupling off : COUP TRACE,ON
In both examples the return message contain FCOUP.
What I want is to get an answer of OFF when FCOUP is not in the message e.g. with COUP TRACE,ON
What I did not realize was, that match() has to match the WHOLE string to be TRUE and not partially. So you have to specify ".*SUBSTRING.*" for a substring in the middle of a response.
On the other hand getMatch() only requires to match the requested substring. In other languages you use brackets to identify the intended items you search for.
Hey guys,
Does the Test Controller software have the capabilities (or it is planned for them) to automate things with equipment? Or it is meant to be used so that it only manually interacts with the equipment connected to it?
What I have in mind - would it be possible to automate charging and discharging of batteries (while logging curves such as current, voltage, capacity) by using one power supply and one DC load?
Thanks a lot for the reply! After my holidays I will try to play around with it and explore the options of using it to interface with a SM15K 70V/450A power supply from Delta Elektronika. The power supply natively speaks SCPI via Ethernet, and from what I can gather, it wouldn't be too difficult to interface with it.
Do Readout popups not work with Math items or is this a bug?
I set DL24 or DL24P device as /dev/ttyUSB0, and the result of 'reconnect' is:
;; Start thread for: ttyUSB0
;; ttyUSB0: Set params: 9600
;; ttyUSB0: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; ttyUSB0: Rx: timeout
;; ttyUSB0: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; ttyUSB0: Rx: timeout
;; Stopping thread for: ttyUSB0
;; ttyUSB0: Close
I tried to connect during pushin' any button, of a mesurement cycle, but no success. Tried to search this forum, but could not find similar issues.
Please help, what do I miss?
Do Readout popups not work with Math items or is this a bug?
They are supposed to work, but only the "Current values" are synchronized to the table, i.e. readout uses their own instance to do the calculations.
Do Readout popups not work with Math items or is this a bug?
They are supposed to work, but only the "Current values" are synchronized to the table, i.e. readout uses their own instance to do the calculations.
While logging with interval 0.03 sec comparing the Math Readout popup to the Current Values tab again gives around 30 mSec from the Current Values tab and shows around 200 mSec in the Readout popup. I guess for some Math formulas based on history (like Type Change) just don't work in a Readout popup. Not a real problem, but needed to know.
Well, thanks for details to uncheck 'Scan serial ports'.
Fiddling with address - ttyUSB0 instead of /dev/ttyUSB0 gave the connection!
Thanks HKJ for a very useful piece of software. I have attached a device file for the dual channel East Tester 5420 DC Load that I created by modifying the device file for the single channel East Tester 5410. To anyone who wishes to use this, note that the operating mode is set from the Setup popup instead of the Mode popup used for the single channel version.
Hi HKJ,
I am still busy with the new config for my Siglent SDG2122X and I have some new questions.
Q1: The #cmdsetup info seems not to support the tag :readformat:, see "info_error" attachment.
Q2: #cmdsetup controls, which are in a selector, will sometimes not be displayed; see "coupling_error" attachments.
Q3: What to specify on :update: tag?
Q4: Which logical operators and/or combinations can be specified on :enable: tag?
Q5: Is it possible to implement a variable on the #cmdsetup checkbox like on buttonsOn?
It do, check the DOS output, there any errors in :readmath: will be listed.
?Yes, this is very strange. It only happens with more than 2 concatenated selectors. It is only the display of the item the rest seems to work. I think this is a bug.
Generally the #cmdSetup do not support variables, you have to use the SCPIx or ascii driver and #scpiCmd to get that.I was not thinking of user defined :setvar: but the normal variable set by some controls as documented:
QuoteIt do, check the DOS output, there any errors in :readmath: will be listed.
I downloaded the latest version (to be sure). The debug DOS gives no errors.
This is with a number control:
;; SDG2122X: Rx after :readmath: getElement(getMatch(value,"LLEV,[^,]*(,|$)"),1,",") <-2V>
;; SDG2122X: Rx as number <-2.0>
This is with the info control:
;; SDG2122X: Cache Tx: <FCNT?> Rx: <FCNT STATE,ON,FRQ,0HZ,DUTY,0,REFQ,1e+07HZ,TRG,0V,PW,0S,NW,0S,FRQDEV,0ppm,MODE,AC,HFR,OFF
>
;; SDG2122X: Rx after :readmath: getElement(getMatch(value,"FRQDEV,[^,]*(,|$)"),1,",") <0ppm>
With info I don't see ";; SDG2122X: Rx as number <0.0>" assuming this is the trace of :readformat: u
Has somebody else tried this?
Quote?Yes, this is very strange. It only happens with more than 2 concatenated selectors. It is only the display of the item the rest seems to work. I think this is a bug.
QuoteGenerally the #cmdSetup do not support variables, you have to use the SCPIx or ascii driver and #scpiCmd to get that.I was not thinking of user defined :setvar: but the normal variable set by some controls as documented:
*Some controls will create variables with their name or pageName.name if pages are used, they are:
Number, NumberInt, NumberDual (Adds 1 & 2 to the names), buttonsOn, radio, combobox, comboboxhot
and add checkBox.
Hi,
To learn more about my new Siglent ARB genenrator ( SDG2122X) I tried to expand the current configuration file of Testcontroller with SCPI available functions like modulation, sweep, harmonics and burst. Added the function generator and utility functions. A lot seems to work, but no guarantees. I did not expect his ARB to be so complex, so here will be mistakes in this file, take care!
Additionally I made a documentation file based on my experience while creating the config file. Especially the selector control has helped a lot and I hope you have a look to improve your config files.
For "those playing along at home" I added a python script to clean and report on the config file. This is handy with large configs to keep in control.
IMPORTANT: the name of the config file has changed to SiglentSDGxxxxX.txt so you have to remove the old SiglentSDGxxxx.txt to work with this new file.
Has anyone made a tutorial for this for the purpose of testing cells using an electronic load?
My load(KP184) is recognized and the values on the front panel are visible in the "current values" tab. I just don't know where to go from there. The commands page seems like the place to start, but this is way over my head. I know I need to enter the current I'd like to draw and the cut-off voltage and then have a go button to press. I was able to set the current by typing in the desired value in the setup popup and pressing the CC button.
Hello.
I'm a new user on DL24. That works.
Could you let me know how to chart, in real time, not from 0 to the last value, but from 0 to 2 hours (fixed time, progressing chart)?
"Batteries, test, discharge" option doesn't show up. With your prompting, I was able to get started manually.
Can I make the bottom of the graph for voltage to be the cut-off voltage? And get amp hours instead of time?
#otherFunc
if (popupShowQuestion("Recall internally stored Instrument State","ok","Load","Cancel"))
deviceWrite(handle,"VKEY_VALUE,4,STATE,1;[*OPC];VKEY_VALUE,70,STATE,1;[*OPC]");
deviceWrite(handle,"VKEY_VALUE,175,STATE,1;[*OPC]");
deviceWrite(handle,"VKEY_VALUE,13,STATE,1;[*OPC]");
syncPopups();
endif
;; SDG2122X: Tx <VKEY VALUE,4,STATE,1>
;; SDG2122X: *OPC waited: 44ms
;; SDG2122X: Tx <VKEY VALUE,70,STATE,1>
;; SDG2122X: *OPC waited: 158ms
;; SDG2122X: Tx <VKEY VALUE,175,STATE,1>
;; SDG2122X: *OPC waited: 75ms
;; SDG2122X: Tx <VKEY VALUE,13,STATE,1>
;; SDG2122X: *OPC waited: 191ms
dk.hkj.script.ProgramExceptions$UnknownException: Function not found syncPopups
;
deviceWrite(handle,"VKEY_VALUE,175,STATE,1;[*OPC]");
deviceWrite(handle,"VKEY_VALUE,13,STATE,1;[*OPC]");
syncPopups();____<----____
endif
at dk.hkj.script.Script.getFunc(Script.java:93)
at dk.hkj.script.Script.parseValue(Script.java:268)
at dk.hkj.script.Script.parseBitOp(Script.java:316)
at dk.hkj.script.Script.parseProduct(Script.java:388)
at dk.hkj.script.Script.parseSum(Script.java:470)
at dk.hkj.script.Script.parseCompare(Script.java:525)
at dk.hkj.script.Script.parseLogical(Script.java:561)
at dk.hkj.script.Script.parseQuestionMark(Script.java:587)
at dk.hkj.script.Script.parseExpression(Script.java:612)
at dk.hkj.script.Script.statement(Script.java:1099)
at dk.hkj.script.Script.doExecute(Script.java:1250)
at dk.hkj.script.Script.execute(Script.java:1270)
at dk.hkj.script.Script.execute(Script.java:1276)
at dk.hkj.main.DeviceInterface.otherActionsBackground(DeviceInterface.java:943)
at dk.hkj.main.DeviceInterface.access$5(DeviceInterface.java:923)
at dk.hkj.main.DeviceInterface$10.run(DeviceInterface.java:917)
#otherFunc
var instrumentState = "STATE01";
popupCombo("Recall internally stored Instrument State", instrumentState, "STATE01, STATE02, STATE03", "Recall pre-stored C:STATExx.XML files");
var clicks = listIndex(instrumentState,"STATE01 STATE02 STATE03"," ");
deviceWrite(handle,"VKEY_VALUE,4,STATE,1;[*OPC];VKEY_VALUE,70,STATE,1;[*OPC]");
for i=1 to clicks do
deviceWrite(handle,"VKEY_VALUE,175,STATE,1;[*OPC]");
endfor
deviceWrite(handle,"VKEY_VALUE,13,STATE,1;[*OPC]");
syncPopups;
dk.hkj.script.ProgramExceptions$UnknownException: null
rnally stored Instrument State", instrumentState, "STATE01, STATE02, STATE03", "Recall pre-stored C:STATExx.XML files");____<----____
var clicks = listIndex(instrumentState,"STATE01 STATE02 STATE03"," ");
deviceWrite(handle,"VKEY_VALUE,4,STATE,1;[*OPC];
at dk.hkj.script.Script.doExecute(Script.java:1265)
at dk.hkj.script.Script.execute(Script.java:1270)
at dk.hkj.script.Script.execute(Script.java:1276)
at dk.hkj.main.DeviceInterface.otherActionsBackground(DeviceInterface.java:943)
at dk.hkj.main.DeviceInterface.access$5(DeviceInterface.java:923)
at dk.hkj.main.DeviceInterface$10.run(DeviceInterface.java:917)
Caused by: java.lang.NullPointerException
at dk.hkj.script.FunctionsPopup$15.execute(FunctionsPopup.java:455)
at dk.hkj.script.Script.parseValue(Script.java:269)
at dk.hkj.script.Script.parseBitOp(Script.java:316)
at dk.hkj.script.Script.parseProduct(Script.java:388)
at dk.hkj.script.Script.parseSum(Script.java:470)
at dk.hkj.script.Script.parseCompare(Script.java:525)
at dk.hkj.script.Script.parseLogical(Script.java:561)
at dk.hkj.script.Script.parseQuestionMark(Script.java:587)
at dk.hkj.script.Script.parseExpression(Script.java:612)
at dk.hkj.script.Script.statement(Script.java:1099)
at dk.hkj.script.Script.doExecute(Script.java:1250)
... 5 more
I found a bug in your selector processing.
When the selector switches to another entry AND this entry has THE SAME NUMBER of displayed items then an error occurs:
the text fields of the LAST ITEM in the active entry are not cleared before the new text is written.
This gives overlapping text in the Setup window for these items; see attached pictures.
My last question for the moment; I had a look at the devices with #otherFunc implementations and tried to make one myself.
However Java was not very happy with me :-//
Modifying the statements from the KeysightU1461A gave me a response, but any addition ended in Java errors
I use syncPopups and syncPopups() with no luck.
I finished my exercise with the Testcontroller Setup function for the Siglent SDGxxxxX.
Nearly all SCPI commands have been implemented and are as best as possible tested on the SDG2041/SDG2122.
I also had a look at the scripting interface and the settings for the different models in the #metadefs.
The build-in frequency counter had been configured, but can at this moment not be used in conjunction with the current scripting interface.
In the file you find the explanation how to switch between the two modes manually.
I wanted to make a solution with different MODES, but that is not possible because the SDG does not support a mode indicator variable.
I hope HKJ has look at it and makes a solution.
@HKJ, has the fix for the underscore in read/write been released yet?
Note I get two errors when reading the file:
dk.hkj.devices.SetupFormats$RadioField - Ampl_Coupling_Type - Line do not contain 2 parameters: _
dk.hkj.devices.SetupFormats$RadioField - Phase_Coupling_Type - Line do not contain 2 parameters: _
Can't you check if the frequency counter is on?
#scriptMenu Siglent ARB; Frequency counter test
#scriptInterface ARB setOn setOnCounter setCounterFreqRef
#logcmds 0
="Start counting"
=var arb=getDevice("ARB")
=setOn(arb,1);
=setCounterFreqRef(arb, 55k)
=setOnCounter(arb,1);
#log 2
#delay 40
#log 0
=setOnCounter(arb,0);
=setOn(arb,0);
="Done"
; A list of column name with unit and formatter
#value Frequency Hz SI
#value RefDeviation ppm D2
#value DutyCycle % D1
; How to poll for data, this is used for table and #values?
#askValues FCNT?
#askValuesMathFormat getMatchGroup(value,"FRQ,(.*?)HZ",1) + " " + getMatchGroup(value,"FRQDEV,(.*?)ppm",1) + " " + getElement(getMatch(value,"DUTY,[^,]*(,|$)"),1,",")
No, but it can be downloaded from the test link
It may be a good idea to say what version is required and include a link to the test version in the post when the definition use a test version.
#syncPopups is a command, not a function.
You can get around that by using runScript() or runScriptAsync() functions.
I will try that, but I still get a Java null error on my comboBox function and I have no idea what is wrong. Please have a look at it.
I looked for an import method and have come up short.
At the moment, my pressing concern is how to move the alarm popup that was accidentally launched while full screen. It's insisting on being on top of everything! lol
edit: Ok, I was able to click on the very bottom edge of the popup when the double-sided arrow appears to resize a window. Just a single click on that brought the top of the window down so I could then move it. Whew! I had a long test started and didn't want to reset everything!
I'm going to have to play around with the import option more. I seem to have a propensity to display things in a way doesn't show what I'm after.
I'm not sure what key press closes the alarm window. Tried escape, but I was afraid to get too adventurous with the key pressing because I didn't want to have to restart the test.
The problem was the alarm title bar spawns 100 pixels above the main Test Controller title bar. So depending on the position of Test Controller when the alarm is opened, or if Test Controller is full-screen, the alarm title bar(and X) may end up where the user can not click on it. But clicking on the bottom of the alarm window(when the resize cursor appeared) brought it down.
It would still be nice to be able to close the alarm window once set because it's always on top. And I don't really need an alarm, I just want to set the low-voltage cut-off. One thing I discovered by accident is the cut-off in the load still works if I forget the alarm window altogether.
I thought what I was using was called the Alarm popup. To get whatever it is I've been using, I go to the Commands tab, then click Popups, then click Alarm.
There's a "regular" alarm window? In hopes of finding something that doesn't require an always-on-top popup to be open to have low-voltage cut-off, I searched google for "test controller" "alarm" site:lygte-info.dk, but the only reference I'm seeing is to the alarm popup I've been using. If I Ctrl+F on the intro page, the alarm popup is the only thing I'm finding reference to.
I decided to do a test with a 2.5V cut-off, but it didn't get that far before it got worse than ever.
[snip]
I did another test with a 2.8V cut-off and everything was perfect. So I guess if I see weird current at the end of a test, I know to up the cut-off voltage.
I decided to do a test with a 2.5V cut-off, but it didn't get that far before it got worse than ever.
I noticed if I put "2.8V" in my chart filename, it wouldn't add the .CSV extension.
Is there a way to enter just a starting sample number and not a time index?
In the Chart, Histogram, and Range tabs at the bottom there are entry boxes for "First sample to display". I get entering 1.5s for starting at 1.5 seconds or 1.5m for starting at 1.5 minutes. But, I thought in the early versions of Test Controller that entering just a bare number/no units would start at that sample number. However with all the recent versions entering just a number selects that number of seconds for the first point. Is there a way to enter just a starting sample number and not a time index?
When using the ascii driver to send/receive binary values over a serial port is it possible to define a scpiCmd that uses another scpiCmd?
So maybe a future version of Test Controller would set the voltage threshold to a 0V setting if it can detect it being higher than the selected minimum voltage. Now that I know about it, I don't think it's going to be a problem for me.
I'll certainly help if I can. I'm not a computer programmer like apparently everyone else on this site! lol
Tried a program called Virtual Serial Port Emulator and a Russian program called Port Sniffer. VSPE creates two virtual ports and Port Sniffer bridges the gap between one of the virtual ports and the device, while the program connects to the other virtual port. I couldn't seem to get everything connected, although once I did see TC sending the *IDN? command. Looking back at the Russian author's page, it was mentioned that only text was captured. Looking at the KP184 manual it looks like both text and hex is key, here.
I’m writing a driver for the Fluke 8840A DMM using GPIB and have a question:
To read function, range and some more info i need to send a command that reads string back.
The format is four digits and each position needs to be decoded separatly.
For example in a reply like 1300, 1 means DCV, 3 means 20V range and the zeroes are rate and trigger settings.
How do i decide this?
1) Depending on firmware version a command to read device info is implemented or not, is there a preferd way to handle this (I will get back an error if not implemented in the instrument)?
2) I’m using th AR488 interface, but sometimes I have to connect multiple times before the instrument is detected, any suggestions?
3) There are a Fluke 8842A also and the only added funktionality is a 20 mv/20 ohm range, what is the preferd way to handle this (and not write a slightly modified driver)?
I will look at the definitions
The issues with the instrument not detected, was only a problem when I have a error (exception) in the code.
Without errors the instrument already responds:)
Hi HKJ,
I'm trying to use V1.82 with Atorch JL44. I can connect to the device, but nothing is in Current Values page. How can I troubleshoot this?
There was a bluetooth issue, so I resolved it. Now, TC can find the JL44. But Current Value page is still empty.
I tried it, but it's the same. I see the message "Found ATorch JL44 on BthModem0 (COM5)", but the Current Values page is still blank.
I tried it, but it's the same. I see the message "Found ATorch JL44 on BthModem0 (COM5)", but the Current Values page is still blank.
And I suppose it is also missing in the debug window. Try deleting it from the "Load devices" page, restart program and add it again.
I did exactly what you said, and it's working! Thank you! I'll remember to do that first if I have a problem in future.
how to add support for 34970A and 33120A ?
#cmdSetup combobox Ch_1
:write: CONF:VOLT:DC #,DEF,(@101)
;:read: CONF? (@101)
DC_Voltage_auto AUTO
DC_Voltage_0.1V 0.1
DC_Voltage_1V 1
DC_Voltage_10V 10
DC_Voltage_100V 100
DC_Voltage_300V 300
:tip: Set channel function
CONF:VOLT:DC #,DEF,(@101) is the channel configuration.
The code below works but what i would like is a couple of combo-boxes. One for unit one for scale one for resolution and so on and use the value's from all those in sending this one command.
Here VOLT DC # DEF and (@101) are all variables.
How might i go about this?
CONF:VOLT:DC #,DEF,(@101) is the channel configuration.
The code below works but what i would like is a couple of combo-boxes. One for unit one for scale one for resolution and so on and use the value's from all those in sending this one command.
Here VOLT DC # DEF and (@101) are all variables.
How might i go about this?
You need to use the multi control, but it lacks a combobox at least for now.
So there is no way to put a combobox value in a variable or use the contents of several combo boxes when hitting the set button?
I apologize if these issues have been mentioned before, but I ran into two problems today in my first attempt to actually use this program. First, for the Fluke 8846A, the value column always shows "F8846.VoltageDC" regardless of what range is selected. The numbers are correct. Second, when I try to save a chart, it goes through all the motions--I press save, a dialog box comes up that lets me give it a name and specify where to save it, I press save and the dialog box disappears--but no file has been saved.
I don't see any way to determine the version number here, but I downloaded this on 5 SEP 2021.
Edit: Using the MODE button from within TestController to set the 8846A modes causes the value label to read correctly, but unlike the F289, changing it from the meter does not--so not a significant issue.
I tried the debug batch file, but when I look at the now-verbose command window in the program, I don't see anything at all in response to my pressing the save button (in the CHART window), entering a filename and location and then pressing ENTER or SAVE. I don't know if this is related, but the data files that the program put in the Documents folder are all completely empty except for a file called ScriptLibrary.dat. My loaded devices are not remembered from one session to the next either, I hadn't gotten that far. I do not see a log file saved anywhere.
Any ideas?
a) updated Java (I had disabled updates a while back so it was ~2 years old)
b) installed v1.82
c) restarted Windows 10 with an update
and I now have at least the nominal ability to save the chart as a .png. So that's all good. :-+
I started looking at editing the device configuration .txt file and just as an exercise, I was able to change it so that when I select 4W Ohms it also selects 100NPLC instead of 10, which I want. However, I cannot get the program to display the proper resolution in the 'Current Values' or 'Table' windows. It simply displays "1K" when the meter is reading 1000.002 ohms. v1.80 was displaying more digits, but not enough--there should be 8 digits. When I open the Chart or Histogram windows, provided I have set values correctly in the 'Scales for Chart' window, I can see intermediate values that reflect the 8 digits. IOW, I have ticks at 1000, 1000.002, 1000.004, etc and there are multiple data points in between those. So all 8 available digits are being transmitted, but they don't show up.
Also, the program still does not remember the meter if I exit and start a new session--I have to go to Load, select the Fluke 8846A from the menu, select 'Scan Serial Ports', then 'Reconnect'. Is that normal or is something still amiss?
These settings are supposed to be saved in ...\Documents\TestController\Settings\ in a couple of files called Settings something.txt
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 5, Size: 5
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at dk.hkj.devices.LoadDeviceConfig.getIndex(LoadDeviceConfig.java:122)
at dk.hkj.main.PopupScriptList$3.prepareRenderer(PopupScriptList.java:118)
at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
at javax.swing.plaf.ComponentUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JViewport.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JLayeredPane.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at java.awt.Window.paint(Unknown Source)
at javax.swing.RepaintManager$4.run(Unknown Source)
at javax.swing.RepaintManager$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$1200(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
To check the type of a variable use type(v), the normal types will be long/double/string, but there are also complex/dateTime/array/struct/...
=var my_array = array("some value", "another value", "and so on")
#foreach item my_array
#echo (item)
#endforeach
;; my_array
;; some value
;; another value
;; and so on
First, a bug: The "Script List" popup fails to list any of the scripts I created (and, in fact, is completely blank except for when I sweep the mouse cursor over the dialog box buttons, which individually reappear when I do so). Here's what the dialog box looks like after I've painted the mouse cursor all over it:
Next, the documentation states:Code: [Select]To check the type of a variable use type(v), the normal types will be long/double/string, but there are also complex/dateTime/array/struct/...
This seems to suggest that it's possible to declare a variable as a struct; how do we go about doing so? Is such a thing possible right now? (Being able to do so would be amazing...and being able to declare arrays of structs would be even more so!)
var a;
a.x=4
will make a a struct with the element xFinally, I'm not clear on how the iterator variable works in the #FOREACH command. I tried doing something like this, using #FOREACH to iterate through an array of arbitrary size:Code: [Select]=var my_array = array("some value", "another value", "and so on")
#foreach item my_array
#echo (item)
#endforeach
This code results in this output:Code: [Select];; my_array
...but I was hoping for something like this output:Code: [Select];; some value
;; another value
;; and so on
Clearly I am misunderstanding the command's usage. Could you clarify it?
=var my_array = array("some value", "another value", "and so on")
=var item;
#foreach item (my_array)
#echo (item)
#endforeach
Does the "Readout" popup support multiple readouts from the same device? I have found I can do it with a grid panel, but I think I might want multiple popups, I'm just wondering if it can do it already ?
I am in the process of writing the definition for a Siglent SDL1030X, I have the app reading the loads values and I am able to control the modes etc. I still have a lot to do, such as the various mode settings etc. but I am making good progress I think.
FYI I also added this to the Siglent SDM30xxxx file so that it returns back to local mode when quitting the app: #finalCmd abort;*cls;*rst
Is there a button type that toggles states ?
What I am wanting is a button for On/Off without having to use two buttons, much like the ButtonsOn version that has the indicator but a single button that can toggle between two states, change its button text, and change its activated output to toggle commands, so you can send a 0 or 1 just like a checkbox etc.
I wanted to use a button like this for the SDL1030X definition I am making, to have features such as Load On/Off, Short On/Off, Remote Sensing On/Off etc.
and to explore Test Controller's scripting capabilities.
V1.84 is up
Fixed: (I hope) A problem showing script list popup
Not all scripting is documented, you can switch into programming mode with #calc .
<snip>
You can find some examples in KeysightU1461A.txt and Keysight344xxA.txt
I've noticed in that popup that the "Lines" column is highlighted in red for some of my scripts--what does that signify?
The examples prompt another question: I've noticed that end-of-statement semicolons are inconsistently applied in various examples, and my experimentation with it suggests that the script interpreter doesn't really much care about requiring a semicolon as a statement delimiter (but, obviously, it requires a semicolon to signify a comment). What is the scripting language's grammar for the end-of-statement semicolon? Is this something I should pay attention to?
I noticed that if my internet connection is being crap that the app doesn't launch, the TC window opens but stays blank, until the internet is available.
Internet where I am is pretty bad, sometimes it is fine, other times it is so slow it cant even load an email.
Why does the app not load until the internet is OK ? is this something that can be improved / removed?
#cmdSetup info Voltage
:read: :SOUR:VOLT:LEV:IMM?
Volts
Another question..
I am using this (and similar) in the setup window to get the present settings to give an overview, is there a way I can control the number of decimal places it shows using this ? I would like to reduce it to 3 or 4 places for this display.Code: [Select]#cmdSetup info Voltage
:read: :SOUR:VOLT:LEV:IMM?
Volts
So basically what I would want is a selector that is based upon the last mode button that was pressed to track the last chosen mode, so it doesn't rely on what is returned from a SCPI query.
I had a tinker with it but couldn't figure out how to make the SCPIx work to track the modes, I don't understand it well enough yet.
#cmdMode Constant_Current CURRENT
:SOUR:FUNC CURR;[*OPC]
:setvar: myMode="Current"
#cmdMode Constant_Current CURRENT
:SOUR:FUNC CURR;[*OPC];ModeCC
#scpiCmd ModeCC none?
:setvar: myMode="CC"
#cmdSetup info Present_Mode
:readmath: myMode
:updatemodechange:
#cmdSetup info Present_Mode
:read: myMode?
:updatemodechange:
#cmdSetup selector Mode_settings
:read: myMode?
:updatemodechange:
CC CC.
CV CV.
CR CR.
CP CP.
LED LED.
Dyn_CC Dyn_CC.
Dyn_CV Dyn_CV.
Dyn_CR Dyn_CR.
Dyn_CP Dyn_CP.
;Batt Batt.
;OCPT OCPT.
;OPPT OPPT.
Is there a way of creating a whitespace or a solid line in the Setup window?
I would like to add some spacing/seperation between some sections on the Setup window above the Load off/on buttons (see attached pic)
I was also wondering if there is a way to add text like "info" to the Mode window, I was thinking the currently selected mode would be best displayed in the mode window as a header to the buttons, or is there a way of highlighting a button for the current mode ?
I also noticed that the auto width isn't handling the text below the buttons, it is pushing the contents wider... but if I can move that text to the Mode window instead that doesn't matter.
Is there a way of creating a whitespace or a solid line in the Setup window?
I would like to add some spacing/seperation between some sections on the Setup window above the Load off/on buttons (see attached pic)
No, generally it is best to keep the window as compact as possible, user may need to have multiple windows open.
I have pretty much finished the definition file, I’m just cleaning up and tweaking bits here and there now, adding the separator will be part of it.
; Item formatting: Menu Item Display Text, SCPI Command
#cmdSetup scpicomboboxHot Mode
CC :SOUR:FUNC CURR;[*OPC]
CV :SOUR:FUNC VOLT;[*OPC]
CP :SOUR:FUNC POW;[*OPC]
CR :SOUR:FUNC RES;[*OPC]
Batt :SOUR:BATT:MODE 1;[*OPC]
Dyn_CC :SOUR:FUNC:TRAN CURR;[*OPC]
I just had another idea (sorry!)
For the cmdMode window, can you add something SIMILAR to the comboboxHot?
What I had in mind is a menu that appears like comboboxHot but has a different function, instead of handling a value with :read: :write: etc it sends the SCPI command, this could then replace a stack of buttons in the mode window making it a lot smaller, and would also have the advantage of showing you the active mode as well.
Something like this:Code: [Select]; Item formatting: Menu Item Display Text, SCPI Command
#cmdSetup scpicomboboxHot Mode
CC :SOUR:FUNC CURR;[*OPC]
CV :SOUR:FUNC VOLT;[*OPC]
CP :SOUR:FUNC POW;[*OPC]
CR :SOUR:FUNC RES;[*OPC]
Batt :SOUR:BATT:MODE 1;[*OPC]
Dyn_CC :SOUR:FUNC:TRAN CURR;[*OPC]
In fact thinking about it, you could make this a more generalised control and use it in both the cmdMode and cmdSetup window too as I can see potential uses there as well.
The difference with what I suggest is that it can send a completely different type of SCPI command for each menu item selection, which is different to the existing menu when sends different values to the same command.
Doing it this way would off a different kind of control to its functionality, there is nothing wrong with the existing menu types, this one would just work in a different way.
;; Found Zc ET4401 on STM32 Virtual COM Port (cu.usbmodem5D11) sn: V1.00.1942.009
fetc?
;; Cs,0pF,ESR,--OL--
fetc?
;; Cs,-8pF,ESR,-539.8M¦¸
fetc?
;; Ls,-5.369MH,ESR,--OL--
fetc?
;; Zs,--OL--,ESR,--OL--
fetc?
;; Rp,--OL--,X,--OL--
fetc?
;; Rs,--OL--,ESR,-943.3M¦¸
fetc?
;; Cp,0pF,X,58.64M¦¸
fetc?
;; Cp,-1pF,D,3.7414
fetc?
;; Cp,-1pF,Q,0.3193
fetc?
;; Cp,-1pF,¦È,163.35deg
fetc?
;; Cp,-1pF,ESR,-547.6M¦¸
fetc?
;; DCR,--OL--,-,------
fetc?
;; ECs,-97.22F,ESR,-0.0018¦¸
fetc?
;; DCR,0.000¦¸,-,------
Auto AUTO
Inductance L
Capacitance C
Elecrolytic_Capacitance ECAP
AC_Resistance R
DC_Resistance DCR
Impedance Z
ESR ESR
Dissipation D
Reactance X
Quality_Factor Q
Angle THR
I have a control interface built, but I am having trouble trying to read values from it, examples of the SCPI query are shown below, it returns two sets of values at once with a single query.
I don't know how to split out the individual data segments from the response and allocate them to values, obviously this is made more complicated by the changing dual modes as well.
Attached is my (hopefully) finished Rev 1.0 Siglent SDL1030X definition, which should work with the SDL1020X-E, SDL1020X, SDL1030X-E, SDL1030X
File is named "Siglent SDL10xxXxx.txt" to reflect that it should work on the entire series.
I am now working to try and make a definition for the East Tester ET4401 (and similar) LCR meters.
Is there a way of passing through a raw string with the #askValuesReadFormat function? I'm currently using uuuu, I am trying to grab all 4 fields to see both of the modes as a row value (can it even do that?)
I am able to now at least see MOST of the returned values, but anything with a symbol is failing, IE values with Ω (or some mangled up version of it) are failing.
Can you add (or does it already have an undocumented) a regex filter to #askValuesReadFormat so it will only return [0-9], commas, and the decimal place (and maybe any SI units)?, so it can remove any other junk chars and fix the formatting.
#value data SI
#askValuesReadFormat s
#askModeMathFormat getMatch(getElement(value,0),"[0-9.+-]+")
is at least giving me value for all modes now, hopefully I can now get the rest done now LOL.
#cmdMode Ls Ls
FUNC:IMP:A L;FUNC:IMP:EQU SERial;
#cmdMode Lp Lp
FUNC:IMP:A L;FUNC:IMP:EQU PALlel;
#cmdMode Cs Cs
FUNC:IMP:A C;FUNC:IMP:EQU SERial;
#cmdMode Cp Cp
FUNC:IMP:A C;FUNC:IMP:EQU PALlel;
#cmdMode ECs ECs
FUNC:IMP:A ECAP;FUNC:IMP:EQU SERial;
#cmdMode Rs Rs
FUNC:IMP:A R;FUNC:IMP:EQU SERial;
#cmdMode Rp Rp
FUNC:IMP:A R;FUNC:IMP:EQU PALlel;
#cmdMode Zs Zs
FUNC:IMP:A Z;FUNC:IMP:EQU SERial;
#cmdMode Zp Zp
FUNC:IMP:A Z;FUNC:IMP:EQU PALlel;
#cmdMode DCR DCR
FUNC:IMP:A DCR
#cmdMode ESR ESR
FUNC:IMP:B ESR;[400];
#cmdMode D D
FUNC:IMP:B D;[400];
#cmdMode X X
FUNC:IMP:B X;[400];
#cmdMode Q Q
FUNC:IMP:B Q;[400];
; this one might need the handle changing, as the meter returns this: ¦È for the phase symbol
#cmdMode Angle Deg
FUNC:IMP:B THR;[400];
#value Capacity_P F SI Cp
#value Capacity_S F SI Cs,ECs
#value Inductance H SI Ls,Lp
#value Impedance ohm SI Zs,Zp,Rs,Rp
#value ESR ohm SI ESR
#value Impedance ohm SI X
#askValuesReadFormat xsxs
#askModeMathFormat getMatch(getElement(value,1),"[0-9.+-FH]+")+getMatch(getElement(value,3),"[0-9.+-FH]+")
Well, for whatever reason the selectors on the values are not working (it was like this the entire time, so it didn't break)
#askModeMathFormat getMatch(getElement(value,1),"[0-9.+-FH]+")+getMatch(getElement(value,3),"[0-9.+-FH]+")
I tried using #modeFromValue getElement(value,0)+";"+getElement(value,2) but for whatever reason on a couple of mode it resulted in the returned readings flickering on/off a few times a second, as thought it was only seeing every other reading, I have commented that back out for the time being, as my current issue is the selector for #value not working.
; THIS ONE WORKS
#askModeMathFormat getMatch(getElement(value,1),"[a-zA-Z0-9.+-]")+getMatch(getElement(value,3),"[a-zA-Z0-9.+-]")
Maybe take a look and try to work out what stupid thing I am doing wrong! This file is returning values in the current format, although I'm not sure they are exactly correct as things like the F of uF and H in uH in the values is missing, so they just show as u or m.
Attached is my initial release for the ET4401, ET4402, ET4410, ET4501, ET4502 and ET4510, it has only been tested on the ET4401 but should work on all the others too.
It isn't perfect, but it is 99% there.
It shows the primary function OK, but the 2nd function is not being linked to a mode, it is readable however, it just isn't flagged as to what it is doing, IE ESR,D,Q,X,Angle.
File is named: East Tester ET4xxx to reflect that it should work on the entire series.
#askMode :FETC?
#askModeMathFormat getElement(value,0)+";"+getElement(value,2)
#modeFromValue getElement(value,0)+";"+getElement(value,2)
It is replacing the first mode name with the 2nd function name (but still showing the first functions readings), commenting out #modefromvalue (leaving #askmodemathformat on) has no effect on how this is working, in case that is s clue.
If I comment out the fallback #value 2nd I don't get a 2nd reading at all, so its not that causing a clash.
#idString ZC,ET4401
#name Zc ET4401
#handle ET4401
#port comfixedbaud
#baudrate 115200
#value Capacity_P F SI Cp
#value Capacity_S F SI Cs
#value Inductance H SI Ls,Lp
#value ESR ohm SI ESR
#value Impedance ohm SI X
#value Impedance ohm SI Zs
#askValues :FETC?
#askValuesReadFormat xsxs
#askMode :FETC?
#askModeMathFormat getElement(value,0)+";"+getElement(value,2)
#modeFromValue getElement(value,0)+";"+getElement(value,2)
fetc?
;; Ls,-816.80uH,¦È,-81.61deg
When in the phase/angle 2nd mode the symbol is not being handled, I think the vertical bar is a representation of a shift/alt keybress, followed by the special E char, I haven't been able to figure out how to detect that.
That (I think) would be the last problem to solve.Code: [Select]fetc?
;; Ls,-816.80uH,¦È,-81.61deg
getElement(value,0)+";"+replace(getElement(value,2),"¦È","phi");
I don't know what the char actually is, I have tried copying and pasting it from the command window after doing a fetc? but that didn't help.
I have this set as the last selector (apart from the fallback one), none of those are matching (THR is the 2nd mode selection flag)
#value Angle Deg D2 phi THR ¦È È
I pasted the letter into google, heres the wiki page: https://en.wikipedia.org/wiki/È
I updated to last file I uploaded a few posts ago, that is the latest version with everything apart from the angle working (I kept the same Rev number)
Nice one, that worked.
Everything is now working correctly.
Final version for the East Tester ET4401, ET4402, ET4410, ET4501, ET4502, ET4510 is attached.
Good point.
I have just fixed the file, download the file from the last post again.
;; Start thread for: COM3 - East Tester ET4410
;; COM3: Set params: 115200
;; COM3: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM3: Rx: <ELEC,RuoShui 4090C ,V1.01.2026.016,V1.12.2035.007,098465905 > 45 4C 45 43 2C 52 75 6F 53 68 75 69 20 34 30 39 30 43 20 20 2C 56 31 2E 30 31 2E 32 30 32 36 2E 30 31 36 2C 56 31 2E 31 32 2E 32 30 33 35 2E 30 30 37 2C 30 39 38 34 36 35 39 30 35 20 20 20 20 20 20
;; STM32 Virtual COM Port (COM3) Device ZC,ET4410 do not match: ELEC,RuoShui 4090C ,V1.01.2026.016,V1.12.2035.007,098465905
;; COM3: Close
;; Stopping thread for: COM3 - East Tester ET4410
;; COM3: Close
So the id string of my RuoShui is "ELEC,RuoShui 4090C" instead of "ZC,ET4410" of the corresponding East Tester ET4410 device.
What is the best way to make a configuration file for the 3 RuoShui LCR meters mentioned above? Should I just copy the "East Tester ET4xxx.txt" config file and change the id strings and device names to the coresponding strings/names of the RuoShui devices? Or should a new config file be made in which somehow (how?) aliases for the East Tester devices are defined? Can someone please explain or point me to the relevant documentation?
As the brand and model are completely different I would have thought duplicating the file and replacing those parts would be the better way to go.
Just add notes in the file stating it is based on the east tester.
HKJ I am glad that you added the tracking readouts, I was just about to ask you if you had something for that as changing modes on the LCR meter was requiring multiple displays to be present, I have tried the new tracking display out and it works well, great improvement.
I have modified the original file to include that meter, which I have attached, please try it.
If it works then the new file can be used instead.
;; Start thread for: COM5 - Ruoshui 4090C
;; COM5: Set params: 115200
;; COM5: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM5: Rx: <ELEC,RuoShui 4090C ,V1.01.2026.016,V1.12.2035.007,098465905 > 45 4C 45 43 2C 52 75 6F 53 68 75 69 20 34 30 39 30 43 20 20 2C 56 31 2E 30 31 2E 32 30 32 36 2E 30 31 36 2C 56 31 2E 31 32 2E 32 30 33 35 2E 30 30 37 2C 30 39 38 34 36 35 39 30 35 20 20 20 20 20 20
;; Found Ruoshui 4090C on STM32 Virtual COM Port (COM5) sn: V1.01.2026.016
;; 90C: Tx <:FETC?>
;; COM5: Tx: <:FETC?.> 3A 46 45 54 43 3F 0A
;; COM5: Rx: <2.14122e-07,0.107718> 32 2E 31 34 31 32 32 65 2D 30 37 2C 30 2E 31 30 37 37 31 38
;; 90C: Rx <2.14122e-07,0.107718>
;; 90C: Rx after :readmath: getElement(value,0)+";"+replace(getElement(value,2),"\xa6\xc8","PHI"); <2.14122e-07;>
Unknown mode: 2.14122e-07
Known modes: ECAP, C, L, Z, R, DCR, ESR, D, X, Q, Deg, AUTO,
;; 90C: Rx <2.14122e-07,0.107718>
2.14122e-07 is the capacitor value, and 0.107718 is the ESR value. These are the exact values that are shown on the screen of the LCR meter.Unknown mode: 2.14122e-07
It seems that TestController expects a mode when reading the capacitance value?I just looked a bit closer at your Debug info, the modes are not returned with the response so it is not exactly the same as the ET4xxx series, as those return the mode at the same time which is how TC knows how to display the data.
The ET4xxx response is: Mode1,Value1,Mode2,Value2 which is different.
Here is a ROUGH definition for your meter, it may or may not work!
It will not show modes, only the values, but will be a good basis to write the proper definition file.
Make sure you remove the modified East Tester ET4xxx file and return it to original to avoid possible clashes.
So we can conclude that unfortunately the firmware of the ET4xxx and Ruoshui 4090x is not exactly the same.
The response of the ET4xxxx is more convenient, since it shows immediately the names of the two parameters that are displayed.
@ Defpom and HKJ, thank you very much for your time, it is much appreciated. I will have a closer look at the 4090x definition file and do some further testing, and see if with my limited coding skills I can find a way to show the parameter (mode) names for the two values that are displayed. The coming few days however I have other things to take care of. I expect to come back after the weekend.
To make a definition you need to know the commands!For your information, I found a PDF document that describes SCPI commands for the RuoShui 4090x LCR meters. I have attached the PDF at the bottom of this message.
For TestController it does not really matter if it has to use one or two commands to get the information, the important part is to get it.
;; Found Ruoshui 4090C on STM32 Virtual COM Port (COM5) sn: V1.01.2026.016
FETCh?
;; 2.14287e-07,0.146838
FUNCtion:IMPedance:A?
;; C
FUNCtion:IMPedance:B?
;; ESR
FUNCtion:IMPedance:EQUivalent?
;; SERial
:FUNC:IMP:A?
;; C
:FUNC:IMP:B?
;; ESR
:FUNC:IMP:EQU?
;; SERial
:FUNC:IMP:B?
;; THR
I will now try your latest config and after that it is bedtime for me :)
OK try this version, it probably won't work but its worth a shot LOL.
I have a couple of "fallback" values, Primary and 2nd, if those show up then it isn't working properly.
Only the readout values for Capacitance and ESR are now fast blinking. To illustrate this I made a short recording of the TestController window. The recording can be found in attached zip file. This fast blinking was actually introduced in the last version posted by Scott. The versions before that one did not show this fast blinking behavior.
I talked about "fast blinking" of the readout values, but a better description would be "fast switching of measurement values on the "Current values" tab between the actual measured value and zero". Anyway, for the moment I will still call this issue "fast blinking".
I figured out that this fast blinking was introduced after Scott modified and uncommented the line that starts with #modeFromValue.
After I figured this out I took the last device file that you posted, and commented out line #173:
;#modeFromValue getElement(value,2)+";"+getElement(value,3);
After this modification the fast blinking was gone, and the presentation of the measurement values on the Current values tab looks OK.
Btw, I noticed that you modified this line in the file that you posted, but the function of this line is not clear to. As said, commenting out this line fixes the fast blinking issue, but other than that I did not notice any change in the way that the measurement values are presented. FYI, also commenting out line #172 that starts with #askModeMathFormat does not seem to have any effect, but since this line does not influence the blinking issue I left this line untouched.
This line is important when you are in auto mode. TC will not issue a mode check automatically, but this line is used to extract mode information from the #askValues command. This is also the reason for the flashing, the string returned by #modeFromValue and #askMode must match or you get flashing.
#askMode :FUNC:IMP:A?; :FUNC:IMP:B?
#askModeMathFormat getElement(value,0)+";"+getElement(value,1);
;#modeFromValue getElement(value,2)+";"+getElement(value,3);
And try using the "Device (tracking readout, Dual device readout"Sorry, I don't understand. How do I do this?
The 3rd line was commented out by me to avoid the flashing. You say the string returned by #modeFromValue and #askMode must match or you get flashing.
Is there a way to see the strings returned by system commands #modeFromValue and #askMode ?
I have looked at help page https://lygte-info.dk/project/TestControllerCommands%20UK.html, but could not find the answer. So far, for every command starting with # that I enter on the command line of the selected device, I get an "Invalid command" error message in the "Log and program editor window". Also it is stated that "The help window will show help for the command line, it has help for all commands that starts with # and for most non-SCPI devices". How do I for example get help for commands #askMode and #modeFromValue ?
QuoteAnd try using the "Device (tracking readout, Dual device readout"Sorry, I don't understand. How do I do this?
I have updated the file a little from the last one supplied by CJS.
I did a quick search and found that there are other models in the range (basically the same as the ET versions), so I have added those to the definition, and tidied up a few bits here and there.
I think it is complicated a bit by the meter not responding with the active modes when it sends the readings with the FETC?, unlike the ET4xxx version.
It can only get the modes from :FUNC:IMP:A?; and :FUNC:IMP:B? and if it is like the ET series it may not respond to a string of commands like that, it may need seperate commands to be sent after it has responded to each.
java.lang.NullPointerException
at dk.hkj.main.InterfaceThreads$LoggingSample.run(InterfaceThreads.java:1192)
I've made significant progress with my little scripting project involving Test Controller, but I've run into a problem. I intermittently receive the following error:
You can easily list many commands on the #askValues line and get whatever you wish. It do not matter if the meter can handle a line with multiple commands, TC will split them into single commands (This can be seen in log mode).@Defpom, this is an illustration of what HKJ says. When I enter the following SCPI command on the VC4090C commandline:
FETC?;:FUNC:IMP:A?;:FUNC:IMP:B?
, I get following response in the Commands & Log window:FETC?
;; 2.14313e-07,0.133632
:FUNC:IMP:A?
;; C
:FUNC:IMP:B?
;; ESR
Good, now it just needs to get the #modeFromValue working, i.e. support of AUTO mode. I wonder what exactly goes wrong, one possible fix is to swap the parameters to #askValues, i.e. place mode first (This will work if the problem is due to something in the :FETC? command). This would also require adjustment in the #askValuesReadFormat and #modeFromValue commands. I hope CJS will work a bit on it when he have time.
:FUNC:IMP:A?; :FUNC:IMP:B?
is:FUNC:IMP:A?
;; C
:FUNC:IMP:B?
;; ESR
FETC?;:FUNC:IMP:A?;:FUNC:IMP:B?
is:;; 2.1432e-07,0.00012804
:FUNC:IMP:A?
;; AUTO
:FUNC:IMP:B?
;; ESR
So the measurement values that are returned are for C and D (dissipation factor), but the modes that are returned are AUTO and ESR.I've made significant progress with my little scripting project involving Test Controller, but I've run into a problem. I intermittently receive the following error:
Do you #RECONNECT devices in your script? If you do remember to use a #WAITREADY
The error happens when TC tries to put data into the table
************************* Logging slow *****************************
;; SDM3055_1: Rx <+5.00001406E+05 HZ
>
;; SDM3055_1: *OPC waited: 720ms
************************* Logging slow *****************************
;; SDM3055_1: Rx as numbers <500001.406>
;; SDM3055_1: Tx <DATA:LAST?>
;; SDM3055_2: Tx <DATA:LAST?>
;; SDG2122X: Tx <C1:BSWV?>
************************* Logging slow *****************************
************************* Logging slow *****************************
************************* Logging slow *****************************
;; SDM3055_1: Rx <+5.00001328E+05 HZ
>
************************* Logging slow *****************************
;; SDG2122X: Rx <C1:BSWV WVTP,SINE,FRQ,500000HZ,PERI,2e-06S,AMP,0.169731V,AMPVRMS,0.06Vrms,MAX_OUTPUT_AMP,20V,OFST,0V,HLEV,0.0848656V,LLEV,-0.0848656V,PHSE,0
>
;; SDM3055_2: Rx <+0.00000000E+00 HZ
>
************************* Logging slow *****************************
************************* Logging slow *****************************
;; SDG2122X: Tx <C2:BSWV?>
************************* Logging slow *****************************
;; SDM3055_1: *OPC waited: 1304ms
;; SDM3055_2: *OPC waited: 1289ms
************************* Logging slow *****************************
;; SDG2122X: Rx <C2:BSWV WVTP,SINE,FRQ,20HZ,PERI,0.05S,AMP,0.8487V,AMPVRMS,0.300015Vrms,MAX_OUTPUT_AMP,20V,OFST,0V,HLEV,0.42435V,LLEV,-0.42435V,PHSE,0
>
;; SDM3055_1: Rx as numbers <500001.328>
************************* Logging slow *****************************
************************* Logging slow *****************************
************************* Logging slow *****************************
;; SDM3055_2: Rx as numbers <0.0>
;; SDG2122X: Rx after internal processor <500000 0.169731 0 0 20 0.8487 0 0 >
************************* Logging slow *****************************
************************* Logging slow *****************************
;; SDG2122X: Rx as numbers <500000.0 0.169731 0.0 0.0 20.0 0.8487 0.0 0.0>
************************* Logging slow *****************************
Exception in thread "AWT-EventQueue-0" Exception in thread "AWT-EventQueue-0"
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "AWT-EventQueue-0"
Exception in thread "LoggerSample" ;; SDM3055_2: Tx <:SENSE:FUNCTION?>java.lang.OutOfMemoryError: Java heap space
;; SDM3055_2: Rx <"FREQ"
>
************************* Logging slow *****************************
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Input to log mover"
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "TimerQueue"
Exception in thread "Device: SDM3055" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Device: SDM3055" Exception in thread "Device: SDG2122X" java.lang.OutOfMemoryError: Java heap space
Exception in thread "BackgroundCommands" java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Code: [Select]Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
...
Given Test Controller's debug excerpt and my descriptions of the script--and assuming that I'm probably doing something wrong on my end--do you have have suggestions for how to proceed with troubleshooting?
The "Out of memory error" is probably the reason for it running slow. My best guess is that you call some scripts recursively.
Try using #runscript without parameters, this is possible as long as you run your main script in background (#RUNSCRIPTASYNC).
#scriptScript MyParentScript
=var i = 0;
; iterate through an array using i...
#runScript MyChildScript1
; do some other things...
#runScript MyChildScript2
#return
;-------------------------------------------------------------
#scriptScript MyChildScript1
=i = 0;
; iterate through some other array using i...
; note that I failed to actually declare "i" here using "=var i = 0;" and TC doesn't complain about it,
; so MyChildScript must be using the "i" declared in MyParentScript above and, consequently,
; this script merely redefines "i" here.
#return
;-------------------------------------------------------------
#scriptScript MyChildScript2
=i = 0;
; iterate through yet another array using i...
; note the same issue with variable scoping as in MyChildScript1
#return
Once I corrected my variable scoping mistakes in a couple scripts, everything suddenly behaves properly and the whole script runs flawlessly. Cheers!
It is easy enough to add a AUTO column, but it cannot show what mode is selected.
In the attached file I have done that and also swapped the command sequence in the #askValues command.
But unfortunately with the following line active:
#modeFromValue getElement(value,0)+";"+getElement(value,1);
, the measurement values on the "Current values" tab are flashing again, as shown in the video that I posted on October 22nd. So I have commented out this line again.
I need a debug log to fix that.
OK, I have attached 2 debug log files. The text is copied from the command line window after starting TestController with testControllerDebug.bat.
Now I found the issue or issues.Thanks HKJ,
#scpiCmd *idn? txrx? *idn?
:readmath: getElement(value,0)+","+getElement(value,1)+","+getElement(value,4)+","+getElement(value,2)+" "+getElement(value,3)
I decided to add these lines to the definition:Code: [Select]#scpiCmd *idn? txrx? *idn?
:readmath: getElement(value,0)+","+getElement(value,1)+","+getElement(value,4)+","+getElement(value,2)+" "+getElement(value,3)
I bought ET3240. Good multimeter, but I can't connect it. TestController sees him, but refuses to work with him.
If someone has already connected it, please tell me how to set up the work.
Thanks for the quick response!
The program is fresh. There is little information in the dos window. If I understand correctly, TestController turns it off and closes the com-port. But on the multimeter itself, the status is "Remote."
I tried to change the port number, but nothing depends on it
I think it's a multimeter problem.
;; 880.22ms Start thread for: COM20 - East Tester ET3240
;; 3286.88ms COM20: Tx: <*IDN? |.> 2A 49 44 4E 3F 20 7C 0A
;; 3301.14ms COM20: Rx: <ZC,ET3240,08202008008,V2.04.1941.000> 5A 43 2C 45 54 33 32 34 30 2C 30 38 32 30 32 30 30 38 30 30 38 2C 56 32 2E 30 34 2E 31 39 34 31 2E 30 30 30
;; 3311.14ms COM20: Tx <trig auto>
;; 3313.41ms COM20: Tx: <trig auto |.> 74 72 69 67 20 61 75 74 6F 20 7C 0A
;; Found East Tester ET3240 on STM32 Virtual COM Port (COM20) sn: 8202008008
=globalvar ntc1=ntcCoef(22k,5,10k,25,4k,45)
;; 3383.29ms ET3240: Tx <CONF?>
;; 3394.22ms ET3240: Rx <DCV,D,D,A>
;; 3398.75ms ET3240: Rx after :readmath: getElement(value,0); <DCV>
Thank you very much! I already texted the seller.
I've updated this file, but I can't figure out what the problem is.Just double checking. Did you download the TestController.zip file that includes the device definitions?
http://lygte-info.dk/pic/Projects/TestController/TestController.jar (http://lygte-info.dk/pic/Projects/TestController/TestController.jar)
Thank you! But what do you say about OWON XDM2041 if you chose between him and ET3240 now? Will you not support him in your program?
And on installation - I will check everything again. Thank you!
I just downloaded the portable version of the TestController, and then replaced the file TestController.jar with a new one, from the archive. Was that the right thing to do?
I just downloaded the portable version of the TestController, and then replaced the file TestController.jar with a new one, from the archive. Was that the right thing to do?
"Adress" - specified port number
I tried to choose different numbers - nothing changes (((
I accidentally ran not * .bat, but jar - it worked! Now starts and * .bat
I don't know what happened, but thanks for your patience! If possible, I will write an addendum to my ET3240 article with a link to your program and how to configure it. Do you mind?
Thanks for the help! When I complete my note about the multimeter (https://delta-f.ru/et3240), I will definitely inform about it.Nice review. In your note you say that only little information can be found about this meter on the internet. Did you know that HKJ also did a review of the ET3240 (https://lygte-info.dk/review/DMMEastTester%20ET3240%20UK.html)? Apart from that there are also a few reviews on YouTube.
I believe there is not yet any way to use the NI USB GPIB adapter with Testcontroller.
Does anyone have a link to a specific cable that is known to work well as a USB/RS232 connector with Testcontroller? The one I got from Fluke works, but I'd like another eBay special or whatever--is there a $15 solution?
OUTP CH1,ON
OUTP CH1,OFF
OUTP CH1, ON
OUTP CH1, OFF
SYST:STAT?
1) The required SCPI commands for switching ON or OFF an output of this PSU are as follows (example for channel 1):Code: [Select]OUTP CH1,ON
OUTP CH1,OFF
Unfortunately the SCPI code that is generated by control "ButtonsOn" (used for CH1 and CH2) and control "Buttons" (used for CH3) is as follows:Code: [Select]OUTP CH1, ON
OUTP CH1, OFF
The space between the comma and ON or OFF causes the generated SCPI command not to work.
=> Can somebody (HKJ?) advise me how to get rid of this space?
2) Proper operation of the colored indicator of Control "ButtonsOn" (used for CH1 and CH2) requires correct readout of the ON or OFF state of channels CH1 and CH2. The output state of CH1 and CH2 can be checked by reading a 10-bit status word by means of following SCPI command:Code: [Select]SYST:STAT?
This SCPI command returns the hexadecimal value of the 10-bit status word. The hex value of this word can vary between 0 and 3FF. The output state of CH1 and CH2 is indicated by bits 4 and 5 of this status word, see attached picture. I am not sure but I think that I need to use function "binConvBit" to extract the value of the two status bits from the returned hex value.
=> Can somebody suggest which is the proper syntax for the :read: tag inside the definition of the two "ButtonsOn" control buttons (taking into account the definition of the status word)?
My not working attempt ( :read: binConvBit(SYST:STAT?,4,1) ) can be found at the end of attached SPD3303X definition file.
For reference I have attached the SCPI chapter from the SPD3303X user manual, as well as the definition file for the SPD3303X (work in progress) below.
Thanks in advance for your assistance!
I believe this has been bought up a couple of times. I recently acquired a used NI GPIB-USB-HS controller that I want to use with the Test Controller software and saw that only the RS232 version of the NI-GPIB controller is supported. Does anyone know of wrapper software that would allow the USB version of the controller to emulate the RS232 version? I've looked and couldn't find a solution. Any other solutions to using the USB controller versions?
Isolating the bit is done with :readmath:
The main question is how the value is returned from the power supply, if it is a binary value you need to use "#driver SCPIx" and a txrxbin command. If it is a number (hex or decimal) in ascii format you can work directly with it (You may need to add a 0x before a hex value).
#cmdSetup buttonsOn CH1_Output
:read: SYST:STAT?
:readmath: binConvBit(value,4,1)
:write: OUTP CH1,#
:updatealloff:
:tip: Turn CH1 output On or Off
:color: (0,240,0)
Off OFF
On ON
;; SPD33: Tx <OUTP CH1,OFF>
;; SPD33: Tx <SYST:STAT?>
;; SPD33: Rx <0x4>
;; SPD33: Rx after :readmath: binConvBit(value,4,1) <0>
;; SPD33: Rx as number <0.0>
;; SPD33: Tx <OUTP CH1,ON>
;; SPD33: Tx <SYST:STAT?>
;; SPD33: Rx <0x14>
;; SPD33: Rx after :readmath: binConvBit(value,4,1) <1>
;; SPD33: Rx as number <1.0>
buttonsOn
One or more buttons on a line with a indicator last on the line. A :read: tag is needed to get the status for the indicator, it will be on if the read value matches second parameter line. The rest is similar to buttons.
The read result is supposed to be a numeric result, use a :string: tag for a non-numeric result.
The value of the status word that is returned is a hex number, and I am now able to isolate the CH1 and CH2 status bits from the returned hex value.
Do I somehow need to translate numerical value "1" to text string "ON" or vice versa for a correct comparison?
Can you advise?
#cmdSetup buttonsOn CH1_Output
:string:
:read: SYST:STAT?
:readmath: (binConvBit(value,4,1) == "1") ? "ON" : "OFF"
:write: OUTP CH1,#
:updatemodechange:
:update: CH2_Output
:updatealloff:
:tip: Turn CH1 output On or Off
:color: (0,240,0)
:bgcolor: (128,128,128)
OFF OFF
ON ON
@HKJ, if you want you can include this definition file in the next release of Test Controller.
#interface setVoltage CH(channel):VOLT (value)
#interface getVoltage CH(channel):VOLT?
:readmath: getMatch(value, "( |^)[-+.0-9].*")
#interface setCurrent CH(channel):CURR (value)
#interface getCurrent CH(channel):CURR?
:readmath: getMatch(value, "( |^)[-+.0-9].*")
#interface readVoltage 0 3
#interface readCurrent 1 4
I have changed the interface definitions slightly:
<snip>
The idea is to have the same names for ALL power supplies, i.e. a script using these function can work with any power supply without modification.
OK, that is fine. Then you may also want to update a few #interface lines in the "Owon ODP6033.txt" definition file, since I copied the lines with setCHVoltage and setCHCurrent from that file.
@ HKJ, FYI I have attached an updated version v1.0.1 of the Siglent SPD3303X definition file to reply #2094 above. Today I found that the definition works well with the latest firmware version of the SPD3303X/X-E, but not with earlier firmware versions. For this reason I have added a remark to the #notes section about the firmware version that is required.
v1.0.1 release notes:
- Updated #interface section per recommendation of HKJ.
- Removed leading colons from SCPI commands in #askValues (just for consistency).
- Added a remark about required firmware version to the #notes section.
Correction for R&SHMC8043.txt
Remove line
:enable: Output_3.Overload.Turn_off
since Output 3 currently cannot be switched ON and OFF via the popup.
Now the definition for output 3 corresponds to the definitions for output 1 and 2 resp 1/2.
SystemCommands.txt versions issue: one of 14Kb, one of 46Kb !!
While using the help function for reading system commands information, some times for example "#STOPSCRIPT" shows this command, sometimes not.
I have found that there are 2 versions of SystemCommands.txt , one of 14Kb, one of 46Kb
After deleting the file and restarting the program, some times the 46Kb version is downloaded, but sometimes (the majority) the 14kb one is downloaded
I have the last version of test controller
;; Found Brymen BM867s on HIDv0820p0001
#DEBUG BM867 +modeComm +valueComm +otherComm +commHex
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
;; BM867: Rx as numbers <-Infinity>
;; BM867: Tx <VALUE?> 56 41 4C 55 45 3F
;; BM867: Rx <-∞> 2D 3F
I have played a bit with my Brymen vs. Linux and this is what I have got so far:
I have played a bit with my Brymen vs. Linux and this is what I have got so far:
I only support HID interfaces on windows at the current time.
Yes, I know.
However, over a year ago I couldn't manage that a Brymen with its USBHID was detected by TestController using Linux:
https://www.eevblog.com/forum/testgear/program-that-can-log-from-many-multimeters/msg3019724/?PHPSESSID=e8ja7i0ragru6auspt39agp3m1#msg3019724 (https://www.eevblog.com/forum/testgear/program-that-can-log-from-many-multimeters/msg3019724/?PHPSESSID=e8ja7i0ragru6auspt39agp3m1#msg3019724)
..., but now it works. Therefore I thought you "only" need to implement the missing "definitions" and it could be a step forward, trying to use a cheap Brymen with an even cheaper Pi with Linux?
As Brymen works with SmuView under Linux, there is probably only a "piece" missing?
It is only a question, as I am not able to judge the required deal of work! ;)
I also need a new look on the Windows part.
I could help with testing once the framework is up and running.
There is an error in the RidenRD60xx file.
It is not possible to set the current to more than 1A. If you choose 1A, then in fact the current is set to 10A.
There is an error in the RidenRD60xx file.
It is not possible to set the current to more than 1A. If you choose 1A, then in fact the current is set to 10A.
Yes, that is true.
Look in devicefile RidenRD60xx.txt and replace
#metadef
#idString FeelElec,FeelElec FY6900-40M
#name FeelElec FY6900-40M
#handle FY6900
#replacetext FY6x00-xxM FY6900-40M
#replaceText MaxFrequency 40M
#replaceText MaxVpp 24
#replaceText MinOffset -12
#replaceText MaxOffset 12
#replaceText >CAL >12000
#sections WAVE2
Thanks for this really useful software.
I'm working on an instrument definition file for the OWON BT35-41 series multimeters and may attempt my OWON XDS3014 CRO after that (as the manufacturer's Windows app for it is truly woeful!)
All going well, except I can't see a way to get the available commands to display in the help window on the Commands tab. It works for all the virtual instruments, but not
I've found the help file folder \documents\TestController\Settings but it only seems to have help files for the Virtual instruments. I'm using version 1.98 on Win 10-64 bit.
Quote
Thanks for this really useful software.
I'm working on an instrument definition file for the OWON BT35-41 series multimeters and may attempt my OWON XDS3014 CRO after that (as the manufacturer's Windows app for it is truly woeful!)
All going well, except I can't see a way to get the available commands to display in the help window on the Commands tab. It works for all the virtual instruments, but not
I've found the help file folder \documents\TestController\Settings but it only seems to have help files for the Virtual instruments. I'm using version 1.98 on Win 10-64 bit.
I think I've solved my own problem #scpCmd tags in the definition file seem to provide the help/
I have a FY6900-40M
The following needs to be added to the FeelElecFY6x00-xxM.txt definition file around line 132.
That answer is wrong! The #help tag does the trick.
Hi, realy nice tool, thank's.
But I have a problem with East Tester ET3240, maybe I need somewhere to change something, but can't figure it out.
All works, but in TestController measured values is displayed and logged without taking in to account multiplier.
As example if ET3240 measures 18.05mV on PC it is displayed as 18.05V.
Can You help me?
Adding
#askValuesReadFormat s
din't help.
Adding
#askValuesReadFormat s
din't help.
Ok, I will dig out the meter tomorrow (Usually it is not on my bench) and look at it.
I didn't know what response is expected on read? command, but maybe problem is in ET3240.
I noticed that at least my ET3240 on read? command returns exactly same string that is displayed on screen (not a measured value).
For 18.50mV it returns <18.50>.
Exception in thread "Scan ports" java.lang.NoClassDefFoundError: Could not initialize class com.fazecast.jSerialComm.SerialPort
at dk.hkj.comm.SerialInterface.getSerialPorts(SerialInterface.java:271)
at dk.hkj.main.InterfaceThreads$ScanPorts.run(InterfaceThreads.java:736)
(my config has one GPIB interface, id 'A', at address '/dev/ttyACM0' , and an hp3478a on A:23)
Hi,
not sure if you prefer debug questions here or via email, but : is there a way to get slightly more detailed debug info ? I'm on linux and trying to connect with a prologix-USB clone (i.e. serial port), gives the followingCode: [Select]Exception in thread "Scan ports" java.lang.NoClassDefFoundError: Could not initialize class com.fazecast.jSerialComm.SerialPort
(my config has one GPIB interface, id 'A', at address '/dev/ttyACM0' , and an hp3478a on A:23)
at dk.hkj.comm.SerialInterface.getSerialPorts(SerialInterface.java:271)
at dk.hkj.main.InterfaceThreads$ScanPorts.run(InterfaceThreads.java:736)
You get the most detailed debug when starting with a debug on the command line
Exception in thread "Scan ports" java.lang.UnsatisfiedLinkError: /tmp/jSerialComm/1640091629552-libjSerialComm.so: /tmp/jSerialComm/1640091629552-libjSerialComm.so: failed to map segment from shared object
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1817)
at java.lang.Runtime.load0(Runtime.java:810)
at java.lang.System.load(System.java:1088)
at com.fazecast.jSerialComm.SerialPort.<clinit>(SerialPort.java:252)
at dk.hkj.comm.SerialInterface.getSerialPorts(SerialInterface.java:271)
at dk.hkj.main.InterfaceThreads$ScanPorts.run(InterfaceThreads.java:736)
-Djava.io.tmpdir=/home/...tmpdir/
See https://github.com/Fazecast/jSerialComm/issues/387 for details.
But my theory may be wrong : I just found this issue with similar symptoms,
https://github.com/Fazecast/jSerialComm/issues/277
I will not update the current TestController with a old version of the library, the current version uses jSerialComm V2.70 and I will update when a new is published.
1- fastjar -xvf TestController.jar
2- jar -xvf jSerialComm-2.5.3
3- restore the original META-INF/MANIFEST file that jSerialComm just overwrote
4- jar cmvf META-INF/MANIFEST.MF ../testcontroller_repack.jar *
Of course, I understand.
I tried to re-pack your .jar and replace jserialComm with a few different versions (2.5.3, 2.6.1, 2.6.2), but I wasn't able to eliminate the issue. Perhaps my method is flawed, I don't really java :
Regarding the tti QL355P, I have two questions :
There is two entries for it in the add menu; is there a difference between them ?
It seems that Ihere is no possibility to choose a serial USB connexion for it (only socket or GPIB), is it a mistake from me ?
There is an error in the RidenRD60xx file.
It is not possible to set the current to more than 1A. If you choose 1A, then in fact the current is set to 10A.
Yes, that is true.
Look in devicefile RidenRD60xx.txt and replace
This will be fixed in the next release.
I only have definitions for RD6006 & RD6012, if anybody makes definitions for other models I am very interested in getting them.
Note: A definition is probably not more than the 10 lines Pukker has posted, just with other values.
There are also more values where 1000 must be replaced with 100.
Done in the attached RD60xx.txt file.
Only tested with RD6012, the only one I have. Firmware is the latest version from Unisoft, which is great.
Two problems I've seen and I don't know how to solve.
1. in RD6012 popup, tab settings, the Buzzer function was inverted, corrected that, but to select On I have to click Off and vv.
2. in the tab Memory M4 is selected by default and selecting another, (M0 to M9), always returns to M4
Making settings to M4 works OK, but only M4 is selectable. Don't know how to solve.
BTW. Making settings from Testcontroller is not the main function, logging (core business) works fine.
After reading your documentation this configuratio is working :
#idString THURLBY-THANDAR,QL355P,D,1.6
#name dumy_QL335
#handle QL335
#port comFixedBaud
#baudrate 19200
result in your Commands windows :
;; Found TTI QL355P on QL355P Power Supply (COM54)
*IDN?
;; THURLBY-THANDAR,QL355P,D,1.6
@HKJ :
regarding the defintion file of the SDL "siglent SDL10xxXxx.txt" i had to change some "#interface" in order to be able to pass the parameter :
#interface setOn :SOUR:INP:STAT (value) instead of #interface setOn :SOUR:INP:STAT value (I don't kow why)
I added #interface readPower 2 just after #interface readCurrent 1 in order to get the power
=globalvar sVal=0.01
=sVal=0.05
PlatyLoad::SOUR:CURR (sVal)
=sVal=(sVal*1.1)
PlatyLoad::SOUR:CURR (sVal)
It sends the following commands to the device::SOUR:CURR 0.05
:SOUR:CURR 0.05500000000000001
#logcmds 0
#log 2
=globalvar sVal=0.01
=sVal=0.005
#while (sVal<3.5)
#echo (sVal)
#hasLogged
=sVal=(sVal*1.1)
#endwhile
Maybe someone else has come across this and knows of a fix, or has one of these supplies and a bit of time to figure it out, I may even dig into it further if I can get a network sniffer for the PC so I can see what the official software is sending the power supply (I haven't even looked yet), I use a Mac and my software couldn't sniff the entire network, again I haven't looked for something better.
Have I missed something in the little script or my definitions file that would trim the values to 3 decimal places?
PlatyLoad::SOUR:CURR (formatDouble(sVal,1,6,0,3))
Can you explain again how to log a control variable.
I have been working on another definition file, this time for the Siglent SPD1168X and SPD1305X power supplies.
On a side note, the TC software doesn't open a window or anything on Mac when clicking the About button... and doesn't fetch updates, I have to download manually off the website.
The current definition at least allows setting of the voltage and current, and gives readings for both as well as power, so it is pretty useful as it is, but I agree that the ability to turn the output on and off etc is important.
Do we have a scripting command to hide a column in the Table page during the acquisiton (i'm not speaking about the #exportcolumn during the export) ?
=globalvar sVal=0
#log 2
=sVal=0.01
#while (sVal<3.5)
#echo (sVal)
#hasLogged
=sVal=(sVal*1.1)
#endwhile
After a few hours of frustration and instal, uninstall, reinstall I managed to get wireshark to run on the PC, see the network and not crash... I hate PC's.
I saw that the Agilent/Keysight 34410A is not supported, is there a way to add it to the list of supported devices?
It is a LXI device, but I do not have it in a network... it is only connected with a USB to my workshop PC, that is a Win10 machine.
How can I connect it? I do already have it working with Agilent DMM application.
BTW, I installed the program and it seems to work - but no joy in connecting said 34410.
I've created an ESP-32 dongle and a device file for Owon B series multimeters (all variants of the B31, B35 and B41). The code for the dongle and a TestController definition file for the B41T+ in my github repo. https://github.com/palmerr23/Owon_B41T
There are also more values where 1000 must be replaced with 100.
Done in the attached RD60xx.txt file.
Only tested with RD6012, the only one I have. Firmware is the latest version from Unisoft, which is great.
Two problems I've seen and I don't know how to solve.
1. in RD6012 popup, tab settings, the Buzzer function was inverted, corrected that, but to select On I have to click Off and vv.
2. in the tab Memory M4 is selected by default and selecting another, (M0 to M9), always returns to M4
Making settings to M4 works OK, but only M4 is selectable. Don't know how to solve.
BTW. Making settings from Testcontroller is not the main function, logging (core business) works fine.
I am a bit worried about if 6006 and 6012 uses the same factors, can anybody with a 6006 confirm that this file works correctly (The original Riden file must be replaced to test it).
Thanks
It seems that the globalvar's name and the Name used in the Math tab (attached) need to be the same for the value to update in the Current values tab.
Even after moving the declaration to the top, the value didn't become available until I made the names the same.
Now everything works!
It seems that the globalvar's name and the Name used in the Math tab (attached) need to be the same for the value to update in the Current values tab.
Even after moving the declaration to the top, the value didn't become available until I made the names the same.
Now everything works!
=globalvar sVal=0
#log 2
=sVal=0.01
#while (sVal<3.5)
#echo (sVal)
#hasLogged
=sVal=(sVal*1.1)
#endwhile
I have 6018 and 6006P, I started to modify original definition. With 6006P we need other factors for voltage too.
Currently my job takes over my free time, but I hope in next week I will have more time.
It seems that the globalvar's name and the Name used in the Math tab (attached) need to be the same for the value to update in the Current values tab.
;initialisation math calculation
=globalvar effi=0
#math Efficiency % FormulaNU 0 effi
#TRIG
#log 0.1
#WHILE
....
=effi=formatDouble(100*readPower(load)/(readVoltage(ps)*readCurrent(ps)),1,3,0,3);
#ENDWHILE
-> effi is updated in "realtime". I don't catch your remark
One idea to try is using:
#port 5024
or
#port LXI
If both works you can also use
#port 5024 LXI
The above is not supposed to change anything, at least if Siglent has done a good SCPI implementation.
I have 6018 and 6006P, I started to modify original definition. With 6006P we need other factors for voltage too.
Currently my job takes over my free time, but I hope in next week I will have more time.
That sounds good, I hope you do it the with text replacement like the "CurrentScaleFactor"
I'm trying to import multiples .csv file directly into the table page under Test Controller or by scripting but i wasn't able to achieve one of them. I'm doing something wrong or I don't understand the process.
I played with the import function again folowing your answer and i notice (i guess) that my issue is more related to the number of raw within the file loaded/imported into the table. It doesn't have matter with the number of column nor the synchronization with the index or time.
I have an other question, as we are able with the mouse under the table page to move to a specific line (min/max/..), do you have some dedicated math function available by scripting as finding automatically the minimum or maximum of a raw/column in the chart or table page ?
What is the license for the software?
Is the source code available?
HKJ is it possible to send commands without TC automatically adding the \n terminator? It appears that the issue I’ve been having with the SPD1168X is due to a firmware bug as it expects those commands (only) to not have a terminator, Siglent are now aware of the issue but I don’t know if or when they will issue a firmware update, so for the time being I want to work around it.
Concerning the #chartCurves, i understand and tested ok the name as for example :
#chartCurves Name1 Name2
or used a variable
#chartcurves (VarName1) (VarName2),
but if my names are into a list i didn't find a way to be able to use well #charcurve in my use case
I triedfor example (but not only) :
ListName=array("Name1", "Name2", "Name3")
#chartCurves (ListName[0]) -> graph curv name1
#chartCurves (ListName[1]) -> no graph, only index 0 is working
#chartCurves (ListName[0]) (ListName[1]) -> only the curv with index 0 is plot
---
CNames="Name1 Name2 Name3"
#chartCurves (CNames) -> not working if I had more than one Name in CNames
---
Do you have a command which "adds" plot without erasing the existing curv(s) on the graph or is there a way to pass the list by scripting ?
the screen Current Values, i assume the avarage is a result of the selected sample number in Direct ?
the field Slope time is what value/time, i tried to change the input, but the value it display
dont really help me understand what it is ?
on main menu : the pop ups, WOW genius idea really love it.. how ever, how to select the configured avarage value ?
I can only make it display the readout , actual live value, however it jumps alot, and I need avarage filter on it,
to reveal the interesting parts of it,
i have the same "challenge" with chart, i like to use the avarage, as input to chart
log using 1 sec, i set chart to show the last 20 sec, removing the voltage input, dont update the chart
I had the idea chart will just continue ? for ever ? to be a roll of last 20 sec
if i stop log, and start log, and go into chart again, i again get the last live 20 sec, and can now see it is zero volts, as i removed the input.
Starting
;; jSerialComm version: 2.7.0
;; Start thread for: COM10 - Metex 3850D
;; Found Metex 3850D on CP2102 USB to UART Bridge Controller (COM10)
;; Mode reported: <DCV>
; -------- Current values tab here ----------
;; M3850D: Tx <VALUE?>
;; M3850D: Rx Timeout
;; M3850D: Rx as numbers <NaN>
;; M3850D: Tx <VALUE?>
;; M3850D: Rx Timeout
;; M3850D: Rx as numbers <NaN>
;; M3850D: Tx <VALUE?>
;; M3850D: Rx Timeout
;; M3850D: Rx as numbers <NaN>
;; M3850D: Tx <VALUE?>
;; M3850D: Rx Timeout
;; M3850D: Rx as numbers <NaN>
;;---- reconnect here ---------------
dk.hkj.devices.SetupFormats$ButtonsOnField - Load - Line do not contain 2 parameters: _
dk.hkj.devices.SetupFormats$ButtonsOnField - Load - Line do not contain 2 parameters: _
;; jSerialComm version: 2.7.0
;; Start thread for: COM10 - Metex 3850D
;; COM10: Set params: 1200N72
;; Found Metex 3850D on CP2102 USB to UART Bridge Controller (COM10)
;; Mode reported: <>
;; Mode reported: <DCV>
I try to figure out how to configure math, dont see any examples on the web page ?
i try search in this thread and see if this is explained here. i guess i need to define readout and math feature somehow
I tried to connect a lot of other siglent Equipment, all fails to connect, I am sure dhcp is on, and the units do say their ip number
but so far only my SDM 3055 show up, and works stable
one problem, math average result is missing two digits, by default,
right click select format SI and ask for more digits, got it
but now if last digit is a zero, it is not displayed, and all digits move :-)
I've confirmed that the comms should be 1200 No parity 7 bits, 2 stop (1200N72) (see TTerm2 attachment.)
It returns a reading every time a "D" (no CR or LF required) is sent from teraterm, and the reading is of the format "DC -x.xxx V" for DCV. (see Tterm1 attachment).
this feature is so usefull and smart, i recommend you explain about this, top line, in the about / help
since I did not find access to this page from the normal webpage
Siglent SPD3303X connects, in tab current values, beep beep like 10 times, no data
then it gives up, and resume all other units with correct read data.
now i will try to dig deeper into the math tap, this is where the magic happens.
I can still open the same port in different software... Any suggestions ?
do you use the correct name for the serial port?
Ah ! good idea - it seems this (or more likely the jSerialport layer ?) needs only the last part, e.g. "ttyACM0". This is very unusual; devices are almost always fully-specified on linux. I would suggest at least, if the name starts with "/dev/", to use it as-is... Let me know if that's jSerialport behaviour, I can open a ticket with them.
That right-click feature would be awesome, but sadly doesn't work here; nothing is shown (neither in the GPIB page, or if I add e.g. a 34401 with direct serial connection).
Quote from: palmerr23 on Today at 02:01:01 am
I've confirmed that the comms should be 1200 No parity 7 bits, 2 stop (1200N72) (see TTerm2 attachment.)
This means your use this definition for the port:
#port comfixedbaud
#baudrate 1200N81
Quote from: palmerr23 on Today at 02:01:01 am
It returns a reading every time a "D" (no CR or LF required) is sent from teraterm, and the reading is of the format "DC -x.xxx V" for DCV. (see Tterm1 attachment).
That sounds like you need the:
#driver SingleValue
Definition file attached this time. I used the Protek 506 definition as a template - commenting out almost most of the ranges until I get DCV working.
Are there any plans to support USBTMC? I could of course connect my Siglent on TCPIP but I preferably would have evrything through USB since my scope (GW_Instek) does'nt have a TCPIP port.
if it is just a COM port ? with added serial protocol on top ?
Is there a trick to delete a row in the table (in order to suppress a glitch from the acquisition but after log 0)
just added two I2C temperature sensors TMP275, Via arduino
modifyed the good example code and TC driver allready provided my HKJ (see homepage links)
This is maybe a good starting point?
https://github.com/javatmc/javatmc-core
the problem is ONLY related to MEGA i tried one original brand new,
and an older china clone, both lock up after the com connect reset pulse, and is only released running again
when TC time out its connections..
Attached pictures of the two, (the cure right now, is to use other boards, or if you insist on using mega, tie its cpu reset to +5, easy access via jumper)
i am sorry for jumping back and forward in the topics :-)
when we add temperature sensors, using whatever external hardware like arduino or what not,
people use DS18B20 or other sensors like LM75 to TMP275, for high accuracy , and high resolution.
i love to see a bunch of DS sensors on the same temp and same curve, zoomed in to only show +/- 1C
do they track ? to halve of one lsb ?
time:
conversion time pr sensor is multiplied by number of sensors,
this total will limit the TC program loop speed of all your instruments,
i tried to add reply delays in my arduino, TC runs fine and stable, no matter how long and crasy i try to be,
it just limit the max log speed, so that is nice to know.
see the attached pictures,
i like to be able to attach 1-8 sensors to a unit, that is serial or ethernet connected to TC,
and i like to be able to run TC in 1sec log mode,
all other instruments i got, are ethernet connected, so i assume the com time is close to zero,
at least in the mS range we talk about here.
conversion time pr sensor is multiplied by number of sensors,
HELP.....
I'm sure this must be documented somewhere, it's just not obvious where.
I'm trying to setup logging from 3x 34401A meters using GPIB
Under load devices I added a 34401A, however it defaults to Type "Serial" and I would like to use GPIB. I'm using what I'm guessing is a clone Agilent 82357B USB to GPIB adapter, that is recognized by Windows7 device manager as a Keysight 82357B. I have successfully used this adapter in the past so I know it works.
When I click on GPIB the GPIB interfaces pops up as type AR488 id A connection serial and the Address and baudrate are blank and red in color.
It's not obvious how I configure the program to use GPIB with my 34401A meters.
i just went out and got a brand new china clone mega, i dont give up on research that easy ha ha..
YES that one works with TC
But both my genuine original arduino Mega, dont
if you like to solve this ? I am ready to help, my suggestion : we live quite close, i dont mind meeting,
we could simply swap a clone mega of yours, for one of my original,
then i am curious to hear how this works out your place :-)
Since my C-programing knowledge is not existing I started a small ESP32 interface project using Micropython.
For first testing I used 2 DS18b20 sensors. Everything works with a serial terminal as expected. See screen shot of terminal. So far so good.
I modified the DS18b20 definition of HKJ (attached) but the response of the device is unexpected strange and I have no idea why and how to overcome this problem:
Thanks for this hint, I will search for a „non-echo-setting“.
Edit:
Isn't that simple in (mirco)python as I thought. If I'll got it running I post it as example for others.
I am now done with my 4 channel Temperature logger for Test Controller
I use I2C sensors TMP275, all the sensors i got, track within 1 LSB in 12 bit mode = 0.0625C initial
so i dont see any need for calibration yet.
if any one like to know more, i plan to share all files for free, and they can be used for non commercial purpose.
you need : arduino uno with socket or atmega328pu with arduino bootloader
3D printer, PCB CNC, or etching, or order the pcb's from jlc,
so i plan to give away all gerber files too,
arduino sw is a combo of HKJ demo and I2C temperature demo,
and a modified HKJ serial config file, if any one like to know more, PM me..
And it seems that TestController allows „only“ 6 graphs at the same time. (what is really enough!)
if TC could allow me to lock ? or fix ? or assign ? 6-12 inputs of same type, voltage or current or temperature ?
to use SAME scale settings, it will make my work more easy, as it is now, it is a little bit of a hazzle to change many min-max values, at the same time.
wow nice.. please explain a total noob how to execute this ?
i am still very erly in the process of learning how to use TC
it looks like it can do so much more, than is seen at first glance
I got it again running after some rework tonight. 6 graphs are enough because you can easily switch between with the help of the switch boxes. Since I use a 4k monitor I have enough space for many many axis but I understand the reason for the limit.
I noticed it only since I connected all my 7 sensors at the same time. Regarding the ongoing discussion in another thread at EEVBLOG (siglent DMM) I think, the digital sensors are much handier as all this thermocouples, you have no connection issues etc.
Attached you find the recording of last night with 7x DS18b20, 6 shown in the diagram.
Yes, of course!
I try to get a socket connection via WiFi instead of all the UART/RX/TX/USB-wiring. This can be helpful for all serial connected devices but it will take some time.
Here's a file for the Keysight DSOX2014A. Modified gby's Tektronix file.
It's a work in progress but at least it doesn't crash or freeze.
I am now done with my 4 channel Temperature logger for Test Controller
The current file has a few customizations that suited my project. I should probably take them out before you add to a release. For instance, the current values for tables and charts are ch1 peak-peak, ch2 peak-peak, ch3 peak-peak (but shows A) and ch4 is used for phase between ch1 and ch2. I haven't figured out how to make this not hard coded or better yet be able to switch between functions for each channel and only show the desired in current values.Here's a file for the Keysight DSOX2014A. Modified gby's Tektronix file.
It's a work in progress but at least it doesn't crash or freeze.
I can see you added a few other models.
The definition will be included in the next release of TC
The current file has a few customizations that suited my project. I should probably take them out before you add to a release. For instance, the current values for tables and charts are ch1 peak-peak, ch2 peak-peak, ch3 peak-peak (but shows A) and ch4 is used for phase between ch1 and ch2. I haven't figured out how to make this not hard coded or better yet be able to switch between functions for each channel and only show the desired in current values.
Any idea when the next release?
A note to the code: It would work better if you can use the RTOS (i.e. multitasking OS) and split the gathering of sensor data and the command loop into two separate threads (I have no idea if it is possible in python). Only responding to command every few seconds makes TC very sluggish when using the "Current values" tab.
Here's a new file for the Keysight DSOX2014A.
You are right. 1 year ago I made a Arduino-C version for 2 sensors which used time interrupts. But I'm not so familiar with C, that's why I started this Micropython project.
But I'm still learning....
My oscilloscope serves a built in SCPI reference page at ://LOCAL_ADDRESS/InfiniiVision_Quick_Reference.html#measure
The below works nicely using keyboard F1:
#helpurl ://192.168.1.94/InfiniiVision_Quick_Reference.html#measure
Is there a way to get #helpurl to automatically put the LOCAL_ADDRESS in?
Also how is the #help file accessed?
It is fetched from my server and a local copy is stored in ...\Documents\TestController\Settings
As long as the file do not exist on my server, you can make on in the above directory and it will be used.
I guess I mean how is that file used? ie what do I do in TC that causes it to do something.
Also the settings that TC seems to use by default on the mac are in ~/TestController/Settings not ~/Documents/TestController/Settings. This caused problems when I first installed. Things didn't wok right until I moved the downloaded TestController directory into ~.
multi-threading is not the same as interrupts. In can be very simple to use, but also has some serious caveats if you do not know what you are doing.
It looks like there may be some support with a _thread module https://techtutorialsx.com/2017/10/02/esp32-micropython-creating-a-thread/ (https://techtutorialsx.com/2017/10/02/esp32-micropython-creating-a-thread/)
here you go
all files are free to use
http://webx.dk/oz2cpu/TemperatureSensorTC/TempLogger.htm (http://webx.dk/oz2cpu/TemperatureSensorTC/TempLogger.htm)
Thanks again, I will do some home work but suffer from a shortage of hobby time nowadays :-//
def testThread():
sensors = ds_sensor.scan()
while True:
ds_sensor.convert_temp()
time.sleep_ms(700)
index=0
for sensor in sensors:
temp_list[index]=(ds_sensor.read_temp(sensor))
index=index+1
sensor_numbers = index
_thread.start_new_thread(testThread, ())
while True:
if uart.any() > 0:
line = uart.read()
...
sweeps works perfectly, we have still not been able to trig the curve and data collection to the param sweeper,
so we just manually start and stop them both, for this experiment it does not matter much,
but this is next move to figure out.
then we wanted to get more familiar with the math features, if the data collection run at 0.1 sec, and the param sweep at 0.3 sec,
it is fair to use 3 times average, to get more smooth curves on the calculated resistance,
this dont work, it seems like we can create new variables for outputs of calculations,
BUT we are not able to use the created variables as input to new math, as seen on the picture.
we see your time axis is frequency, and the multimeter read, must be synced to each new stimulus from the signal generator,
Do you also have interruptions while logging with the Metrahit Energy?
By the way:
Does your USB-IR-Interface look like this with this wide "opening":
(https://i.postimg.cc/jjBC09VZ/Bildschirmfoto-vom-2022-02-01-01-00-37.png) (https://postimg.cc/f3jMY8R9)
Hi @HKJ, you've clearly done a great job supporting such a wide range of hardware!
Is the project on github? Sorry if its in the thread somewhere.
Also, I was wondering why you didn't build upon Sigrok, say a new UI and/or adding drivers for missing hardware?
I was hoping to find remote control/logging in a client-server design: backend interfacing with the h/w, say on a R-Pi (which could even be built into test equipment) and the client web / mobile...
A KS 34465A can sample every 40us (0.001PLC, manual range), but TC can only log every 10ms for now. And of course I want those 40us.
Has anyone tried to bridge that gap? I have ideas on how to do it, but didn't want to waste my time if people tell me it it will not work, or if it is possible already.
i also see those rare, random dropouts, first i had the idea it was a loose connection,
then i tribble checked all, and taped all cables, but it still happens,
maybe some of our internet routers are old crap ?
none of my internet connectivity stuff is new, i go thru 3 switches to access all my lab equipment,
it seems like:
usb DIY arduino: newer seen dropouts
ethernet (siglent equipment) yes, rarely
ethernet keysight, newer seen it.
the more i think about this, the more complex it gets :-)
Hi @HKJ, you've clearly done a great job supporting such a wide range of hardware!
It is not me alone, I got a lot of help from people here (You can see a list on the About page).Is the project on github? Sorry if its in the thread somewhere.
No.
Sigrok says it has cross platform build, still, it looks a bit rough at the edges and has plenty of nasty use of macros in the code (just took a quick look), I guess to make it cross platform.Also, I was wondering why you didn't build upon Sigrok, say a new UI and/or adding drivers for missing hardware?I wanted the program simple to install and use. The program is in Java and works on multiple platforms with one executable file, you could not do that with Sigrok.
What I meant was making it a server, say running Apache and communicating over http and having the UI/front end on another device. Perhaps easier to do so with the Java codebase than C, if it was open sourced!I was hoping to find remote control/logging in a client-server design: backend interfacing with the h/w, say on a R-Pi (which could even be built into test equipment) and the client web / mobile...
I may at some time in the future make it possible to use remote serial ports.
If you want to design your own test equipment, there is documentation on how to interface it to TestController.
maybe a bold question, but would it be possible to add a Manson HCS-3300? I've already found some protocol info on: https://sigrok.org/wiki/Manson_HCS-3xxx_series
I presume that means it isn't open source licenced. You'd get a lot more help from others if it was Open Source rather the proprietary. For instance, what happens if you become too busy with other things in your life to support it, or if it becomes really popular the amount of support, bug fixing etc will become too much of a burden?
Sigrok says it has cross platform build, still, it looks a bit rough at the edges and has plenty of nasty use of macros in the code (just took a quick look), I guess to make it cross platform.
maybe a bold question, but would it be possible to add a Manson HCS-3300? I've already found some protocol info on: https://sigrok.org/wiki/Manson_HCS-3xxx_series
Anybody with a bit of time can add that supply using a ascii driver.
Documentation: https://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html#Non-SCPI_ascii_devices_(Ascii) (https://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html#Non-SCPI_ascii_devices_(Ascii))
Ok, I just had a look into that, but I need more info on the subject to be able to implement this. I've looked at the Ascii Skeleton and a lot of questions. For example, I know the results of a GETD command (VVVVCCCCS\rOK\r) are in mV and mA. There is a definition value Voltage V ... which could handle this, but what does D0..D6 mean?
I do generally maintain my software for a long time and even if I stop maintaining it, it will still continue to work.
Could you cut it in two, and have the device files in git?
Most additions are about that.
Ok, I just had a look into that, but I need more info on the subject to be able to implement this. I've looked at the Ascii Skeleton and a lot of questions. For example, I know the results of a GETD command (VVVVCCCCS\rOK\r) are in mV and mA. There is a definition value Voltage V ... which could handle this, but what does D0..D6 mean?
D0..D6 is 0 to 6 decimal places when showing the value, you will usually use the number that match the display on the device.
To adjust the input values you usually uses a :readmath: function. It is called #askValuesMathFormat for #askValues, but :readmath: nearly everywhere else.
You may also want to look at the SCPI configuration page, it contains a lot of common stuff for all configuration files: https://lygte-info.dk/project/TestControllerConfigDevice%20UK.html (https://lygte-info.dk/project/TestControllerConfigDevice%20UK.html)
The general idea is to get a connection to the device, then you can try/test commands from the command line.
I'm starting to grasp a vague idea... One practical question. With one ASCII command I get the complete status in one string with numbers. First 4 are V, then 4 for A and then a 0 or 1 for CC or CV.. How would I split this into the different values?
To me it looks you need to use askValues to configure which values to get en use scpiCmd to define how to get those values. But in this case I only need one command to get all the values in one go
Any of you wise testcontrol stars out there who could help to make, or even come with suggestions on how to make the device file?
Is it possible that this program doesn't work with the Brymen BM869S in 500k mode?
I can get it to read and log in 50k mode fine, and about 5 times per second, so according to the screen refresh, but when I switch the meter in 500k mode the readings are very slow, irratic (and if logged, in 50k mode) and it also won't reconnect in 500k mode.
I plan to push for using it at work,
and at the same time looking for a donate / paypal info ?
how about you add a little about, donate-ware info, so if people feel this help their work, save time, add value to their work,
they can express their gratitude by paying a few $ your way
I cant find any such menu in the program ?
1. I first tried #fftView 3 for the third column and the the console complains "failed due to null" but the window pops up anyway. I (now) get that the argument should be the table column name, but since the fft window actually pops up it is confusing to have the error say "failed". I then tried just #fftView with no arguments and the console gives no error message and the window does not pop up. I would think there should be a console error if the window does not pop up. For me it would be more convenient if it did pop up and then I could manipulate it manually to get what I want.
2. How does this fft work? Normally fft code assumes a constant sampling period. But TC sampling period varies. So, does the fft assume constant sample period at the log interval set point?
3. What would the fft do if the logging starts at one log interval and then TC adjusts the log interval slower due to slow responses? In other words what doe this fft do with a Table record with two or more different set points for the log interval?
4. Is there a limit to the number of points in the Table that the fft can be taken for? Related question, does this FFT always use all the points or is it an fft that always truncates the data to the first 2^n points for a binary number of sample points?
4. I suggest adding a button on the Chart view to open the fftView. It is a little awkward to have to go to the console and type in #fftView + arguments. Great for scripts, not so much for user actively working on the data.
Generally you place all the tx/rx commands in scpiCmds and then you use the commands you have defined there in the rest of the definition.
You will also want to add commands to set voltage, current, on/off. Adding interface function can be useful for automatic testing.
1. The device responses with 2 lines first line contains the data (almost always numbers) then a <cr> then "OK". At the moment i use txrx? which seems to ignore the second line, but I'm not sure that's the correct way.
2. On/Off is reversed on the device 0=on 1=off. This works for the buttons on the 'Setup' page, but the red square does not work anymore.
3. Is it possible to calculate for example the Ah and/or Wh in the driver ander report that as Current Values as the device doesn't report those by itself.
I tried that, but how to get rid of the <cr>OK ?1. The device responses with 2 lines first line contains the data (almost always numbers) then a <cr> then "OK". At the moment i use txrx? which seems to ignore the second line, but I'm not sure that's the correct way.Use txrx2? instead
I tried that, but how to get rid of the <cr>OK ?1. The device responses with 2 lines first line contains the data (almost always numbers) then a <cr> then "OK". At the moment i use txrx? which seems to ignore the second line, but I'm not sure that's the correct way.Use txrx2? instead
I tried that, but how to get rid of the <cr>OK ?1. The device responses with 2 lines first line contains the data (almost always numbers) then a <cr> then "OK". At the moment i use txrx? which seems to ignore the second line, but I'm not sure that's the correct way.Use txrx2? instead
There are a lot of functions to edit the answer, see https://lygte-info.dk/project/TestControllerFunctions%20UK.html#String_functions (https://lygte-info.dk/project/TestControllerFunctions%20UK.html#String_functions) they are used after a :readmath: tag.
Let me rephrase my question ;-) If I only need the first line of the response, is it ok to use txrx? or in your experience will things go wrong later on and should I really use txrx2? and process the results to get rid of the second line.
HERE you go HKJ, one more for your collection :-)
by the way, how do i make param sweeper remember the settings ?
;; Found Gossen MetraHit PM XTRA on FT232R USB UART (COM8) sn:
#DEBUG GME +modeComm +valueComm +otherComm +commHex
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Urror 01:Not implemented command:VAL:L?> 55 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
;; GME: Tx <VAL:L?> 56 41 4C 3A 4C 3F
;; GME: Rx <Error 01:Not implemented command:VAL:L?> 45 72 72 6F 72 20 30 31 3A 4E 6F 74 20 69 6D 70 6C 65 6D 65 6E 74 65 64 20 63 6F 6D 6D 61 6E 64 3A 56 41 4C 3A 4C 3F
;; GME: Rx as numbers <0.0 0.0 0.0 0.0>
Is your software proprietary or are you going to put it on GitHub for us to contribute to?
Like a lot of people here are pro electronics, I myself is pro software and can certainly lend a hand.
Well, in order to use it with TestController I took your script from the Metrahit Energy and modified the IDs...
(https://i.postimg.cc/7PGmgqPd/Bildschirmfoto-vom-2022-02-18-05-10-38.png) (https://postimg.cc/c6WRWynB)
... and started the debugging mode...
This is what I got...
;; GME: Rx <Error 01:Not implemented command:VAL:L?>
When I change the measurement it is always shown correctly, but I don't get a reading. Is there something I can do? Do I have to modify your Energy-Script any further, to get a correct reading? Is it better to rename "GME" (= GossenMetrawattEnergy?) into something else, in order to have a distinction between both DMMs?
As you have a "PM Prime", which may be integrated in the future, how do you want to name the Gossen Metrawatt DMMs in TestController, so that it has a certain pattern?
Metrahit Energy: "GME" = GossenMetrawattEnergy
Metrahit PM Prime: "GMP" with P for PRIME?
Metrahit PM XTRA: "GMX" with X for XTRA?
IDN? gives GMC???
I only know, that a short term is useful, in case you wanna add a math function, but what would you prefer?
Position 0 = 4 functions
set?
;; VAC,0.6E+1
set?
;; FREQ_VAC,0.6E+3
set?
;; VAC_F,0.6E+1
set?
;; dB,0.6E+0
Position 1 = 3 functions
set?
;; VAC,0.6E+1
set?
;; VAC_F,0.6E+1
set?
;; FREQ_VAC,0.6E+3
Position 2 = 2 functions
set?
;; VDC,0.6E+0
set?
;; VACDC,0.6E+1
Position 3 = 2 functions
set?
;; FREQ_TTL,0.6E+3
set?
;; DUTY,0.1E+3
Position 4 = 1 Funktion
set?
;; RES,0.6E+8
Position 5 = 2 functions
set?
;; BUZ,0.6E+3
set?
;; DIO,0.6E+1
Position 6 = 3 functions
set?
;; TEMP_U,K
set?
;; TEMP_R,PT100
set?
;; TEMP_R,PT1000
Position 7 = 1 Funktion
set?
;; CAP,0.6E-7
Position 8 = 2 functions
set?
;; IDC,0.6E-3
set?
;; IACDC,0.6E-3
Position 9 = 2 functions
set?
;; IAC,0.6E-3
set?
;; FREQ_IAC,0.6E+3
#idString GMC,METRAHIT PM XTRA,
#name Gossen MetraHit PM XTRA
#handle PMXTRA
#port comFixedBaud
#baudrate 38400
#driver SCPIx
#eol \r\n
; A list of possible column name with unit and formatter (SI, Time, Int, D0..D6)
#value VoltageDC V si VDC,DIO,Diode
#value CurrentDC A si IDC,ADC
#value VoltageAC V d4 VAC,VAC_F
#value CurrentAC A si IAC,AAC
#value VoltageACDC V d4 VACDC
#value CurrentACDC A si IACDC,AACDC
#value Resistance ohm si RES,BUZ,Resistance,Continuity
#value Capacitance F si CAP,Capacitance
#value Temperature °C d4 TEMP,TEMP_U,TEMP_R,Temperature_K,Temperature_PT100,Temperature_PT1000
#value Frequency Hz si Frequence_AC,FREQ_IAC,Frequence_TTL,FREQ_TTL
#value DutyCycle % d3 DUTY,Duty_cycle
#value Decibel dB d2 dB,Decibel
#scpiCmd *idn? txrx? idn?
:readmath: var v=split(value,"[,]");v[0]+","+v[1]+","+trim(replace(v[3],"SERIAL NO.:",""))+","+trim(replace(v[4],"SW:",""));
; How to poll for data, this is used for table and #values?
; a #askMode, #cmdMode and #prepareSample is used before this is string is used.
; This is a single line command
#askValues VAL?
#askValuesReadFormat uuuuuuxxxx
; Accept this delay when reading values (seconds), auto range can be very slow on this meter
#readingDelay 5
; Mode change have a longer delay on reading values (seconds)
#modeChangeDelay 10
; Switch meter to this mode during start, leave empty to avoid any switching
#initialMode
; String to ask about actual meter mode,
; This is a single line command
#askMode set?
#askModeMathFormat getElement(value,0,",");
#interfaceType DMM
#interface readValue 0
; Strings to configure device in different modes
; First parameter must match a #value (4 parameter) and second parameter must match what #askMode returns
; First parameter is also used in shortcut menu
; Prepare the meter to response to #askValues
#prepareSample
; Initial commands to meter when establishing connection
#initCmd txrx NOFF
#readingDelay 3
; Final command to meter before breaking connection
#finalCmd SET:APOFF 5
;#cmdModeLayout 4 10 ...is too big!
#cmdModeLayout 4 7
; Strings to configure device in different modes
; First parameter must match a #value (4 parameter) and second parameter must match what #askMode returns
; First parameter is also used in shortcut menu
#cmdMode VAC VAC
txrx sens:volt:ac:auto
#cmdMode Frequence_AC FREQ_VAC
txrx sens:freq:vac:auto,volt:rang 1000
; Does not work!
#cmdMode NoFilterFunction VAC_F
txrx sens:volt:ac:auto
#cmdMode Decibel dB
txrx sens:db
#cmdMode VAC VAC
txrx sens:volt:ac:auto
; Does not work!
#cmdMode NoFilterFunction VAC_F
txrx sens:volt:ac:auto
#cmdMode Frequence_AC FREQ_VAC
txrx sens:freq:vac:auto,volt:rang 1000
#cmdMode
#cmdMode VDC VDC
txrx sens:volt:dc:auto
#cmdMode VACDC VACDC
txrx sens:volt:acdc:auto
#cmdMode
#cmdMode
#cmdMode Frequence_TTL FREQ_TTL
txrx sens:freq_ttl:auto
#cmdMode Duty_cycle DUTY
txrx sens:duty:auto
#cmdMode
#cmdMode
#cmdMode Resistance RES
txrx sens:res:auto
#cmdMode
#cmdMode Continuity BUZ
txrx sens:short
#cmdMode Diode DIO
txrx sens:diode
#cmdMode Temperature_K TEMP
txrx sens:temp:tc k
#cmdMode Temperature_PT100 TEMP
txrx sens:temp:rtd pt100
#cmdMode Temperature_PT1000 TEMP
txrx sens:temp:rtd pt1000
#cmdMode Capacitance CAP
txrx sens:cap:auto
#cmdMode ADC IDC
txrx sens:curr:dc:auto
#cmdMode AACDC IACDC
txrx sens:curr:acdc:auto
#cmdMode AAC IAC
txrx sens:curr:ac:auto
; Does not work!
#cmdMode NoHzFunction FREQ_IAC
txrx sens:freq_iac
; For later use: I want to have a SetUp for some settings like "rate?" and "SET:RATE 00:01.0" and so on...
; Setup menu functions
; The parameters on the first line is: type name page
; Settings on the following lines are:
; read: SCPI to read value from device, is used to synchronize when opening setup page or setting equal named fields. Not always used
; readformat: Parse read value.
; write: Send the value to device, this field is used in combination with data fields in the details to send updates to device.
; tip: Add this tip to all components for this input field.
;Mode-------------------------------------------------------------------------------------------
I think there are some points, where I need some help/hints, please... ;)
lsusb:
Bus 002 Device 006: ID 1a86:e008 QinHeng Electronics HID-based serial adapater
anddmesg:
[ 4606.473388] usb 2-1.1: USB disconnect, device number 6
[ 4612.118722] usb 2-1.1: new full-speed USB device number 7 using ehci-pci
[ 4612.232755] usb 2-1.1: New USB device found, idVendor=1a86, idProduct=e008, bcdDevice=14.00
[ 4612.232766] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 4612.232770] usb 2-1.1: Product: USB to Serial
[ 4612.232772] usb 2-1.1: Manufacturer: WCH.CN
[ 4612.238214] hid-generic 0003:1A86:E008.0005: hiddev0,hidraw0: USB HID v1.00 Device [WCH.CN USB to Serial] on usb-0000:00:1d.0-1.1/input0
I putted /dev/hidraw0 into the address but it doesn't. Meanwhile I am at page 50 of this longely thread but couldn't find a guess.
But no luck with the USB Serial Adaptor on the Voltcraft VC830. Made a copy inside SimpleDMM.txt and plugged in the cable.
Can you tell me, what you placed into the address entry for the Brymen under Windows.
As I understood the identification for HID are Vendor and Product ID's.
#metadef
#idString Victor,Victor 86C,
#name Victor 86C
#handle V86C
#subDriver 5
#baudrate 2400N81Dr
#metadef
#idString Voltcraft,Voltcraft VC830,
#name Voltcraft VC830
#handle VC830
#port usbhid
#usbVendor 0x1a86
#usbProduct 0xe008
#driver usbhiddmm
#subDriver 869
#usbpoll 0 0 0x86 0x66
#metadef
#idString Voltcraft,Voltcraft VC850,
#name Voltcraft VC850
#handle VC850
#subDriver 5
#baudrate 2400N81Dr
;; jSerialComm version: 2.9.0
;; Start thread for: HIDv0000p0000 - Voltcraft VC830
;; HIDv0000p0000: Found HID: 044E 1212
;; HIDv0000p0000: Found HID: 044E 120C 39 39 39 39
;; HIDv0000p0000: Found HID: 044E 120C 39 39 39 39
;; HIDv0000p0000: Found HID: 046D C52F
;; HIDv0000p0000: Found HID: 044E 1212
;; HIDv0000p0000: Found HID: 046D C52F
;; HIDv0000p0000: Found HID: 046D C52F
;; HIDv0000p0000: Found HID: 046D C52F
;; HIDv0000p0000: Found HID: 044E 1212
;; HIDv0000p0000: Found HID: 0001 0001
;; HIDv0000p0000: Found HID: 044E 1212
;; HIDv0000p0000: Found HID: 1A86 E008
;; Stopping thread for: HIDv0000p0000 - Voltcraft VC830
But there are no actual value shown and logging is only the time stamp.
Did not understood what you said about binary DMM protocol. How can I activate this?The binary DMM is described here: https://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html#Binary_DMM_protocol (https://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html#Binary_DMM_protocol)
#metadef
; VC830
#meta
#idString Voltcraft,Voltcraft VC830,
#name Voltcraft VC830
#handle VC830
#port usbhid
#usbVendor 0x1a86
#usbProduct 0xe008
#driver usbhiddmm
#subDriver 869
#readingDelay 1
#usbpoll 0 0 0x86 0x66
#interfaceType DMM
#interface readValue 0
#dataFormat 14 0x30 0xf0
#digits 1 5
I checked the interface with other Software https://github.com/thomasf/uni-trend-ut61d (https://github.com/thomasf/uni-trend-ut61d) and see that the VC830 is compatible with UT61B/D/C, seems they have same Fortune controller.There are special code for 869 in your java code?
Any of you wise testcontrol stars out there who could help to make, or even come with suggestions on how to make the device file?
It need a specially coded protocol to work fully, but just reading the values looks to be possible:
Use Ascii protocol with #scpiCmds
To read the data you can use the txrxnBin? command
And then a :readmath: with two binConv() function to extract the bits.
You need to return the two values as number with one space between (Like "12.3 45.7").
Something like this:
#scpiCmd values? txrxnBin? 13 #0A0000NA2
:readmath: (binConv(value,5,2)/10.0)+" "+(binConv(value,10,2)/10.0)
First thanks for awesome software! I got it to work with quite some of my test equipment
I am still trying to get this thermometer to work. Seems I do not get any response from the meter when sending #0A0000NA2.
I do get a response when using a terminal program.
Some questions that could help me in the right direction:
What is best way to test if the serial connection is actually open?
Is there a way to send text (in ASCII) over serial from the command line to the device in hex? When I type #0A0000NA2, this is extra problematic starting with #, as then seen as a command.
For baudrate confirguraiton is 19200E81 correct for 19200 baud, even parity, 8 data bit, 1 stopbit, no flow control? if not, how to type?
Is CR and LF added for each command sent over serial or need to be explicitly added?
Starting
;; jSerialComm version: 2.9.0
;; Start thread for: COM5 - ATorch DL24
;; COM5: Set params: 9600
;; COM5: Tx: B1 B2 11 00 00 B6
java.lang.NullPointerException
at dk.hkj.devices.DeviceATorchPX100$TranslatingCommInterface.cmdIdn(DeviceATorchPX100.java:81)
at dk.hkj.devices.DeviceATorchPX100$TranslatingCommInterface.write(DeviceATorchPX100.java:130)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:141)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:136)
at dk.hkj.main.InterfaceThreads$DeviceThread.initDevice(InterfaceThreads.java:1394)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1467)
;; COM5: Tx: B1 B2 11 00 00 B6
java.lang.NullPointerException
at dk.hkj.devices.DeviceATorchPX100$TranslatingCommInterface.cmdIdn(DeviceATorchPX100.java:81)
at dk.hkj.devices.DeviceATorchPX100$TranslatingCommInterface.write(DeviceATorchPX100.java:130)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:141)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:136)
at dk.hkj.main.InterfaceThreads$DeviceThread.initDevice(InterfaceThreads.java:1397)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1467)
;; Stopping thread for: COM5 - ATorch DL24
;; COM5: Close
Hey, i'm trying to get a Atorch DL24 to work with this software, but have some issues with it. Other programs are able to read it out, so it defenitly is connected to the pc properly.
Under "Load devices" the DL24 is correctly setup, upon starting the debug version i get the following error:
How can i resolve the issue?
Is there any way to troubleshoot the issue more?
;; jSerialComm version: 2.9.1
;; Start thread for: COM4 - ATorch DL24
;; COM4: Set params: 9600
;; COM4: Tx: B1 B2 11 00 00 B6
java.lang.NullPointerException: Cannot read the array length because "bb" is null
at dk.hkj.devices.DeviceATorchPX100$TranslatingCommInterface.cmdIdn(DeviceATorchPX100.java:81)
at dk.hkj.devices.DeviceATorchPX100$TranslatingCommInterface.write(DeviceATorchPX100.java:130)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:141)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:136)
at dk.hkj.main.InterfaceThreads$DeviceThread.initDevice(InterfaceThreads.java:1420)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1493)
;; COM4: Tx: B1 B2 11 00 00 B6
java.lang.NullPointerException: Cannot read the array length because "bb" is null
at dk.hkj.devices.DeviceATorchPX100$TranslatingCommInterface.cmdIdn(DeviceATorchPX100.java:81)
at dk.hkj.devices.DeviceATorchPX100$TranslatingCommInterface.write(DeviceATorchPX100.java:130)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:141)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:136)
at dk.hkj.main.InterfaceThreads$DeviceThread.initDevice(InterfaceThreads.java:1423)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1493)
;; Stopping thread for: COM4 - ATorch DL24
;; COM4: Close
I've tried it on a different computer, it gives out a slightly different error this time:
Still no clues, what could be wrong?
Is it possible to pin the blue line to the point, where you get the newest readouts, having an easier and clear "Readout-Popup" so to speak?
I know, that the colour depends on your display settings, but do I have the possibility to change the yellow colour internally to a more orange one or to make it outlined with black for example? Especially old displays are not that bright any more thus especially yellow becomes blurred on a white surface.
groups
sudo usermod -a -G dialout <user>
and reboot (absolutely necessary!)I have installed TestController and connected the Atorch DL24P electronic load device under Ubuntu
20.04.1 in VirtualBox. It worked straight out of the box...I could not believe it. Well, that's the beginning
of the story!
It's an old PC with a GPIB board. I have a few old equipments I would like to make a definition file; would be nice to get rid of these cumbersome Visa drivers.
Ok, thanks
Would such a board be supported?
PCI-GPIB IEEE 488.2 188513E-01L
I have an old Hameg HM7044 Powersupply with RS232 Port.
Can anybody help me with configuring this PS in TC?
I Have the Command Reference attached.
Thank you very much for your help.
I will try it tomorrow.
In the meantime I found a Video and Viewlab drivers, maybe it can help about the commands.
Here can we see the idn? Command maybe work.
Can i use a .txt file from another Powersupply and change it?
I have absolute no Idea which Commanmds i must use.
#scpiCmd select txrx? SEL (value)
#scpiCmd setVoltage txrx? SET (value) V
#scpiCmd setCurrent txrx? SET (value) A
#scpiCmd getVoltage txrx? READ
:readmath: replace(getElement(value,inputValue-1,"[; ]"),"V","");
#scpiCmd getCurrent txrx? READ
:readmath: replace(getElement(value,inputValue+3,"[; ]"),"A","");
Thank you for the infos.
The only way to readout V and A from the Channels ist the Command READ
READ output always all Channels in one String:
21.00V 22.00V 23.00V 24.00V ;1.100A 1.200A 1.300A 1.400A ;OFF F1 OFF F2 OFF F3 OFF F4
I need only the first 8 values.
Your Code for reading V and A dont work:
#scpiCmd getVoltage txrx? READ
:readmath: replace(getElement(value,inputValue-1,"[; ]"),"V","");
#scpiCmd getCurrent txrx? READ
:readmath: replace(getElement(value,inputValue+3,"[; ]"),"A","");
If i change inputValue+3 to inputValue+2, the output of getCurrent is 23V
Iam not a programmer, so i dont know what is wrong with the Code.
txrx? FREQ A
;; FREQ 001.038546E+3
Hello
Sorry to come back in the middle of this discussion. I finally managed to connect to my device with an AR488. It works pretty well.
I have the following problem. This device returns ASCII strings and I need to "extract" numbers. I am sending this command:Code: [Select]txrx? FREQ A
and it returns this:Code: [Select];; FREQ 001.038546E+3
1) How do I get the number out of this string?
2) Can I multiply this value by 1000 and convert it to an integer?
Can I send the resulting command on the command line to verify its behaviour?
#scpiCmd getFreqA? txrx? FREQ A
:readmath: getElement(value",1)
Two details:
You have to add a ? on the getCurrent and getVoltage commands
When using them you have to specify channel after the command, i.e. getCurrent? 1
Code: [Select]
#scpiCmd getFreqA? txrx? FREQ A
:readmath: getElement(value",1)
#value getVmaxA? V D1
#value getVminA? V D1
#value getFreqA? Hz D0
#scpiCmd getVmaxA? txrx? VMAX A
:readmath: getElement(value,1)
#scpiCmd getVminA? txrx? VMIN A
:readmath: getElement(value,1)
#scpiCmd getFreqA? txrx? FREQ A
:readmath: getElement(value,1)
#askValues getVmaxA?; getVminA?; getFreqA?;
#readingDelay 3
Now, I need to send 3 commands. Only the first one displays a result and then it gets stuck. These commands do work within Putty. I don't know if a terminator has to be sent in between.
Anyway, this is what I have:Code: [Select]#value getVmaxA? V D1
#value getVminA? V D1
#value getFreqA? Hz D0
Code: [Select]#askValues getVmaxA?; getVminA?; getFreqA?;
#askValues getFreqA?;[100];getVmaxA?;[100];getVminA?;[100];
Still no success.
Starting
;; jSerialComm version: 2.9.1
;; COM5: Set params: 115200
;; Start thread for: AR488 A:6 - Philips PM6666
;; COM5: Tx: <++default.> 2B 2B 64 65 66 61 75 6C 74 0A
;; Found Philips PM6666 on AR488 A:6
;; PM6666: Tx <getFreqA?>
;; PM6666: Tx <txrx? FREQ A
:readmath: getElement(value,1)>
;; COM5: Tx: <++addr 6.> 2B 2B 61 64 64 72 20 36 0A
;; COM5: Tx: <FREQ A.> 46 52 45 51 20 41 0A
;; COM5: Tx: <++read_tmo_ms 2950.> 2B 2B 72 65 61 64 5F 74 6D 6F 5F 6D 73 20 32 39 35 30 0A
;; COM5: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM5: Rx: <FREQ 001.183061E+4> 46 52 45 51 20 20 20 30 30 31 2E 31 38 33 30 36 31 45 2B
34
;; PM6666: Rx <001.183061E+4>
;; PM6666: Delay: 100ms
;; PM6666: Tx <getVmaxA?>
;; PM6666: Tx <txrx? VMAX A
:readmath: getElement(value,1)>
;; COM5: Tx: <VMAX A.> 56 4D 41 58 20 41 0A
;; COM5: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM5: Rx: <FREQ 001.183048E+4> 46 52 45 51 20 20 20 30 30 31 2E 31 38 33 30 34 38 45 2B
34
;; PM6666: Rx <001.183048E+4>
;; PM6666: Delay: 100ms
;; PM6666: Tx <getVminA?>
;; PM6666: Tx <txrx? VMIN A
:readmath: getElement(value,1)>
;; COM5: Tx: <VMIN A.> 56 4D 49 4E 20 41 0A
;; COM5: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM5: Rx: <FREQ 001.183052E+4> 46 52 45 51 20 20 20 30 30 31 2E 31 38 33 30 35 32 45 2B
34
++addr 6
++auto 1
freq a
FREQ 001.181477E+4
vmax a
VMAX 0000000.28E+0
vmin a
VMIN -000000.26E+0
I fired the debug mode under windows and I got the following:
I think the only way to do this is programming the Grid Panel
I Read and search in the Manual but I have no idea for the following problems:
1. I need On/Off Buttons for every channel, I can make them but they give no reaction with right mouse click
2. how I can switch channel on with one Command? (I must send 2 Commands „sel 1“ and „enable“)
3. The Math readouts in Grid Panel give output „0.0000AH“ but I need „0.00 AH“
4. I need Digital font in Grid Panel, is it possible to use other fonts?
5. what basic interface commands can I use with the Hameg 7044?
Another point: In putty it looks like your are using a GPIB interface, but not in TestController, why?
#idString PM6666/016/32,,
#name Philips PM6666
#handle PM6666
#port GPIB
#driver ascii
#eol \r\n
#value FreqA Hz D0
#value VmaxA V D2
#value VminA V D2
#scpiCmd getID? txrx? id?
#scpiCmd getFreqA? txrx? FREQ A
:readmath: getElement(value,1)
#scpiCmd getVmaxA? txrx? VMAX A
:readmath: getElement(value,1)
#scpiCmd getVminA? txrx? VMIN A
:readmath: getElement(value,1)
#askValues getFreqA?;[100];getVmaxA?;[100];getVminA?;[100];
#readingDelay 3
Current def. file (still no success, same as before)
;; COM5: Tx: <++read_tmo_ms 2950.> 2B 2B 72 65 61 64 5F 74 6D 6F 5F 6D 73 20 32 39 35 30 0A
;; COM5: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
++auto 1
Is there a way to not send these 2 commands:Code: [Select];; COM5: Tx: <++read_tmo_ms 2950.> 2B 2B 72 65 61 64 5F 74 6D 6F 5F 6D 73 20 32 39 35 30 0A
;; COM5: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
To me, that the ones that creates the problems.
And can we send this command instead:Code: [Select]++auto 1
Quote++read eoi is controlled with #gpibReadEol
++read_tmo_ms is controlled with #readingDelay
On the GPIB tab you can add direct commands to the GPIB interface in the "Settings" column
++auto 1
to the GPIB settings and use this file:#idString PM6666/016/32,,
#name Philips PM6666
#handle PM6666
#port GPIB
#driver ascii
;#eol \r\n
#value FreqA Hz D0
#value VmaxA V D2
#value VminA V D2
#scpiCmd getID? txrx? id?
#scpiCmd getFreqA? txrx? FREQ A
:readmath: getElement(value,1)
#scpiCmd getVmaxA? txrx? VMAX A
:readmath: getElement(value,1)
#scpiCmd getVminA? txrx? VMIN A
:readmath: getElement(value,1)
;#askValues getFreqA?;[100];getVmaxA?;[100];getVminA?;[100];
#askValues getFreqA?;getVmaxA?;getVminA?;
;++read_tmo_ms is controlled with #readingDelay
#readingDelay 3
;++read eoi is controlled with #gpibReadEol
#gpibReadEol 10
How can i seperate the Volt and Current Output from PS:
;getting Volt & Current Setting value from PS
;in this Case 14.4V and 03.0A
GETS
144030
Iam working on Ascii-Driver for a HCS3004
Thank you for your help.
Your Program is so extensive, i must learn all Commands to use it but iam an old Guy, to old :)
Sorry i made a Mistake, the PS called HCS 3404 from China. In Germany is called Voltcraft DPPS-60-10
https://www.manson.com.hk/product/hcs-3404-usb/ (https://www.manson.com.hk/product/hcs-3404-usb/)
Ok, one Problem:
#scpiCmd getON? txrx? GETD
:readmath: (substring(value,8,9))
Here is the result "0" or "1" but i need ON and OFF
Can i add an Formula in the readmath to do this?
I will post the final definition but i think i can only make standart txt for read and set the values.
I will do much more but my old Brain doesnt understand the many formulas :(
The readout Voltage is switching sometimes from 15V to 1V, see Picture attached.
#scpiCmd setV tx VOLT(value)
#scpiCmd setC tx CURR(value)
#interface setOn outON
#interface setOff outOFF
#interface readVoltage 0
#interface readCurrent 0
#idString Manson,HCS-3404
#name HCS 3404
#handle HCS3404
#driver Ascii
#port comfixedbaud
#baudrate 9600N81
#eol \r
;-----------------------------
#scpiCmd setV tx VOLT(formatDouble(value*10,3,3,0,0))
#scpiCmd setC tx CURR(formatDouble(value*10,3,3,0,0))
#scpiCmd getVS? txrx? GETS
:readmath: (substring(value,0,3)/10.0)
#scpiCmd getCS? txrx? GETS
:readmath: (substring(value,3,6)/10.0)
#scpiCmd getV? txrx? GETD
:readmath: (substring(value,0,4)/100.0)
#scpiCmd getC? txrx? GETD
:readmath: (substring(value,4,8)/100.0)
#scpiCmd getCVCC? txrx? GETD
:readmath: (substring(value,8,9))
#scpiCmd kbON tx ENDS
#scpiCmd outON tx SOUT0
#scpiCmd outOFF tx SOUT1
;-----------------------------
#value VSet V D2
#value VGet V D2
#value CSet A D2
#value CGet A D2
#value CVCCget CVCC SI
#askValues getVS?;[10];getV?;[10];getCS?;[10];getC?;[10];getCVCC;[10];kbON
;-----------------------------
#interfaceType PS
#interface setVoltage setV (value)
#interface setCurrent setC (value)
#interface setOn outON:outOFF
#interface getVoltage getV?
#interface getCurrent getC?
#interface readVoltage 1
#interface readCurrent 3
;-----------------------------
#cmdDelayTime 50
#cmdSetup radio Voltage
:read: getV?
:write: setV (value)
:readformat: u
:tip: Setup this voltage, turn output on
16.5V 16.5
5V 5
12V 12
20V 20
30V 30
60V 60
#cmdSetup radio Current
:read: getC?
:write: setC (value)
:readFormat: u
:tip: Output will current limit at this current
2.5A 2.5
500mA 0.5
1A 1
2A 2
3A 3
10A 10
#cmdSetup buttonsOn Output
:tip: Turn output on or off
:updatealloff:
Off outOFF
On outON
#cmdSetup number Voltage
:read: getV?
:readformat: u
:write: setV (Value)
:tip: Setup this voltage, do not turn output on/off
Volt 0 60
#cmdSetup number Current
:read: getC?
:readformat: u
:write: setC (Value)
:tip: Setup this current, do not turn output on/off
Amps 001 10
1. the drop to 1V was eliminatet after i set eol\r without the "\n"
3. The Radio Buttons dont marked when i klick on it but the Command work ok.
4. I cant set any V or C value with the Set Button
...but many formulas i dont understand so i ask many Times here, sorry for this.
#idString Riden,Riden DPH5005
#name Riden DPH5005
#handle DPH5005
#port comfixedbaud
#baudrate 9600
#driver Modbus
#scpiCmd VSet holding 0x00 500
#scpiCmd VSet? holding? 0x00 /100
#scpiCmd ISet? holding? 0x01 /1000
#scpiCmd ISet holding 0x01 2000
#scpiCmd OUTPUTOn holding 0x09 1
#scpiCmd OUTPUTOFF holding 0x09 0
#scpiCmd model? holding? 0x0B
#scpiCmd version? holding? 0x0C
#scpiCmd SOVP? holding? 0x52 /100
#scpiCmd SOVP holding 0x52 4000
Question: has this module been already defined?
#scpiCmd VSet holding 0x00 500
#scpiCmd VSet? holding? 0x00 /100
#idString Manson,HCS-3404
#name HCS 3404
#handle HCS3404
#driver Ascii
#port comfixedbaud
#baudrate 9600N81
#eol \r
;-----------------------------
#scpiCmd setV tx VOLT(formatDouble(value*10,3,3,0,0))
#scpiCmd setC tx CURR(formatDouble(value*10,3,3,0,0))
#scpiCmd getVS? txrx? GETS
:readmath: (substring(value,0,3)/10.0)
#scpiCmd getCS? txrx? GETS
:readmath: (substring(value,3,6)/10.0)
#scpiCmd getV? txrx? GETD
:readmath: (substring(value,0,4)/100.0)
#scpiCmd getC? txrx? GETD
:readmath: (substring(value,4,8)/100.0)
#scpiCmd getCVCC? txrx? GETD
:readmath: (substring(value,8,9))
#scpiCmd kbON tx ENDS
#scpiCmd outON tx SOUT0
#scpiCmd outOFF tx SOUT1
#outputOff outOff
;-----------------------------
#value VSet V D2
#value VGet V D2
#value CSet A D2
#value CGet A D2
#value CVCCget CVCC SI
#askValues getVS?;[10];getV?;[10];getCS?;[10];getC?;[10];getCVCC;[10];kbON;[90]
;-----------------------------
#interfaceType PS
#interface setVoltage setV (value)
#interface setCurrent setC (value)
#interface setOn outON
#interface setOff outOFF
#interface getVoltage getV?
#interface getCurrent getC?
#interface readVoltage 1
#interface readCurrent 3
;-----------------------------
#cmdDelayTime 50
#cmdSetup radio Voltage
:read: getVS?
:write: setV (value)
:readformat: u
:tip: Setup this voltage, turn output on
16.5V 16.5
5V 5
12V 12
20V 20
30V 30
60V 60
#cmdSetup radio Current
:read: getCS?
:write: setC (value)
:readFormat: u
:tip: Output will current limit at this current
2.5A 2.5
500mA 0.5
1A 1
2A 2
3A 3
10A 10
11A 11
#cmdSetup buttonsOn Output
:tip: Turn output on or off
:updatealloff:
Off outOFF
On outON
#cmdSetup number Voltage
:read: getVS?
:readformat: u
:write: setV (value)
:tip: Setup this voltage, do not turn output on/off
Volt 0 60.5
#cmdSetup number Current
:read: getCS?
:readformat: u
:write: setC (value)
:tip: Setup this current, do not turn output on/off
Amps 001 11
In Grid Panel/General Device setting the On/Off and Multi On/Off dont work.
...
#interface setOn outON
#interface setOff outOFF
(http://lygte-info.dk/pic/cpf6/Screenshot%202022-04-24%20221528.png)
Unfortunately the program reads and logs a zero-value every few measurements for voltage and current (nothing more tested by now). Please see the attached chart. Is there anything that can be done to avoid this?
I dont understand anything with the Verifycommand.
What is the holding parameter for?
I try this:
#scpiCmd Model? txrx? GMOD (GMOD give Output: HCS-3404)
#verifyDevice HCS-3404 Model
But TC dont start then.
There can be a couple reasons, some stuff you can try is:
Adjusting the #eol character
#eol \n |.\n
to#eol \n
and it is working fine now. Attached you can find the new file.:readmath: replace(value,"ON","1");replace(value,"OFF","0");
which is not working.That did the Trick. Thank you so much! I have changed the lineCode: [Select]#eol \n |.\n
What does the |. even mean?
And another question:
I tried adding buttons for switching the input on an off. The buttons work fine but when requesting the status (sending CH:SW? to the device), it is returning the value ON or OFF. As far as I am understanding it, the status indicator is expecting the values 0 or 1. Is there a way for converting it? So something likeCode: [Select]:readmath: replace(value,"ON","1");replace(value,"OFF","0");
which is not working.
Yes i like Gridpanel very much and i make all gridpanels for Fun yesterday so i can see what Panel is best for me.
This is often needed and there is a special function for it:
:readmath: listIndex(value,"OFF ON");
#cmdSetup buttonsOn Output
:read: CH:SW?;
:readmath: listIndex(value,"OFF ON");
:write: CH:SW #;[300];
:tip: Turn output on or off
:updatealloff:
Off OFF
On ON
The indicator is unfortunately not working. You wrote in the documentation: The read result is supposed to be a numeric result, use a :string: tag for a non-numeric result.
I did not find any example of how to use the :string: tag on your site. How do I use it in my case?
#cmdSetup buttonsOn Output
:read: CH:SW?;
:string:
:write: CH:SW #;[300];
:tip: Turn output on or off
:updatealloff:
Off OFF
On ON
Attached is the new file in case you might want to integrate it. I have send you a little donation.
#idString Manson,HCS-3404
#name HCS 3404
#handle HCS3404
#driver Ascii
#port comfixedbaud
#baudrate 9600N81
#eol \r
#author Scheppo, with many Help from HJK thx
;-----------------------------
#scpiCmd setV tx VOLT(formatDouble(value*10,3,3,0,0))
#scpiCmd setC tx CURR(formatDouble(value*10,3,3,0,0))
#scpiCmd getVS? txrx? GETS
:readmath: (substring(value,0,3)/10.0)
#scpiCmd getCS? txrx? GETS
:readmath: (substring(value,3,6)/10.0)
#scpiCmd getV? txrx? GETD
:readmath: (substring(value,0,4)/100.0)
#scpiCmd getC? txrx? GETD
:readmath: (substring(value,4,8)/100.0)
#scpiCmd getCVCC? txrx? GETD
:readmath: (substring(value,8,9))
#scpiCmd kbON tx ENDS
#scpiCmd outON tx SOUT0
#scpiCmd outOFF tx SOUT1
#scpiCmd Model? txrx? GMOD
#outputOff outOff
#verifyDevice HCS-3404 Model?
;-----------------------------
#value VSet V D2
#value VGet V D2
#value CSet A D2
#value CGet A D2
#value CVCCget CVCC SI
#askValues getVS?;[10];getV?;[10];getCS?;[10];getC?;[10];getCVCC;[10];kbON;[90]
;-----------------------------
#interfaceType PS
#interface setVoltage setV (value)
#interface setCurrent setC (value)
#interface setOn (value?"outON":"outOFF")
#interface getVoltage getV?
#interface getCurrent getC?
#interface readVoltage 1
#interface readCurrent 3
;-----------------------------
#cmdDelayTime 50
#cmdSetup radio Voltage
:read: getVS?
:write: setV (value)
:readformat: u
:tip: Setup this voltage, turn output on
16.5V 16.5
5V 5
12V 12
20V 20
30V 30
60V 60
#cmdSetup radio Current
:read: getCS?
:write: setC (value)
:readFormat: u
:tip: Output will current limit at this current
2.5A 2.5
500mA 0.5
1A 1
2A 2
3A 3
10A 10
11A 11
#cmdSetup buttonsOn Output
:tip: Turn output on or off
:updatealloff:
Off outOFF
On outON
#cmdSetup number Voltage
:read: getVS?
:readformat: u
:write: setV (value)
:tip: Setup this voltage, do not turn output on/off
Volt 0 60.5
#cmdSetup number Current
:read: getCS?
:readformat: u
:write: setC (value)
:tip: Setup this current, do not turn output on/off
Amps 001 11
Here is the final code for the Manson HCS-3xxx Series and German Voltcraft DPPS Series.
Thank you HJK for your Help.
Is it possible to add the Riden RD6018?
I don`t understand the config file, otherwise i had added it to the RidenRD60xx config....
I have created a def file for the Riden DPH5005. Most of the work was about changing the register addresses.
#value Capacity Ah D3
#value Capacity mAh D3
I believe there should be a correction to the Siglent SDL10xxXxx.txt file?
Change line 120 from:Code: [Select]#value Capacity Ah D3
To:Code: [Select]#value Capacity mAh D3
#cmdSetup number Cutoff_Capacity Batt
:read: :SOUR:BATT:CAP?
:write: :SOUR:BATT:CAP
:buttontext: Set
mAh 0 999999
The only other reference to mAh is in the 'Cutoff' section, it is not defined elsewhere.
The displayed value on the actual device is in mAh.Code: [Select]#cmdSetup number Cutoff_Capacity Batt
:read: :SOUR:BATT:CAP?
:write: :SOUR:BATT:CAP
:buttontext: Set
mAh 0 999999
If not, it may need Defpom to have a look ( I don't fully understand the definition, only that changing line 120 fixes the display within Testcontroller correctly)
I have created a def file for the Riden DPH5005. Most of the work was about changing the register addresses.
Thanks, it will be included in the next release.
Is it possible to add the Riden RD6018?
I don`t understand the config file, otherwise i had added it to the RidenRD60xx config....
Yes, try start TestController in debug mode (There is a batch file to do it) and load another Riden supply on the correct COM port.
You will get a line starting with: **Device do not match**
Post that line.
COM6: **Device do not match** <60181>
; USB Serial (COM6) Device Riden,Riden RD6012 do not match: **Device do not match** <60181>
#metadef
#idString Riden,Riden RD6018
#name Riden RD6018
#handle RD6018
#replacetext RD60xx 60181
#replaceText MaxCurrent 18.100
#replaceText MaxOCP 18.200
#replaceText CurrentScaleFactor 1000
Another topic: I wonder if a device like the Hyperion 1420i would be of interest. It's a charger/discharger battery analyzer and it works through a USB serial interface or bluetooth if
you are ready to make a mod. Mine is about 10 years old.
There are different types on the market (EOS 0720i, etc).
COM6: **Device do not match** <60181>
; USB Serial (COM6) Device Riden,Riden RD6012 do not match: **Device do not match** <60181>
Try placing these lines in the top of the "RidenRD60xx.txt" text file, this will give you the 6018
Please test if it works correctly.Code: [Select]#metadef
#idString Riden,Riden RD6018
#name Riden RD6018
#handle RD6018
#replacetext RD60xx 60181
#replaceText MaxCurrent 18.100
#replaceText MaxOCP 18.200
#replaceText CurrentScaleFactor 1000
You are the best ! :-)
It works
Found Riden RD6018 on USB Serial (COM6) sn......
Thanks so much !
You are the best ! :-)
It works
Found Riden RD6018 on USB Serial (COM6) sn......
Thanks so much !
Check if the current readout is correct and is the maximums correct?
You are right, current max set to 13A shown --> 1.3A
actual current 0,9A , in reality it is 9,9A
so at the moment it is divided by 10, I tried set CurrentScaleFactor to 100 but changed nothing ...
You are right, current max set to 13A shown --> 1.3A
actual current 0,9A , in reality it is 9,9A
so at the moment it is divided by 10, I tried set CurrentScaleFactor to 100 but changed nothing ...
The CurrentScaleFactor was not used everywhere, I have changed that in the attached file. Use it to replace the same file in the devices directory.
And please report back if it works correctly now.
The Result from internal READ Command is: 05.00V 05.00V 30.00V 30.00V ;1.000A 1.758A 1.968A 3.000A ;OFF -1 OFF -2 OFF -3 OFF -4
The Status from the 4 Channels are: OFF -1 OFF -2 OFF -3 OFF -4
The following Combinations for Channel 1 are possible:
OFF -1
OFF F1
CV -1
CV F1
CC -1
CC F1
-------------------------------------------------------------
CV=Constant Voltage, CC=Constant Current, OFF=Channel off, F=Fuse on, 1=Channel Number
I need all 6 Status in a readmath, but i dont know how can i make it.
Maybe:
#scpiCmd status? txrx? READ
:readmath: ?????????????????
Now it works 100%
;; HAMEG7044: Rx <OFF>
;; HAMEG7044: Rx as number <NaN>
Iwill use these values for LED or Light Buttons to Show the status in Setup or Gridpanel (my Favorit).
Next Problem:
#cmdSetup buttonsOn CH-1
:read:
:updatealloff:
Off off
On on
This Buttons works ok, but i dont know which :read: Command i must use for the Red/Green Light?
But my Problem is understanding of the most Commands, because i need a little Example for better understanding.
For Example: replace(string,from,to)
Maybe i can replace string with value but what for is from,to?
I do never programming but iam lucky to ask Question here in Forum :)
Another topic: I wonder if a device like the Hyperion 1420i would be of interest. It's a charger/discharger battery analyzer and it works through a USB serial interface or bluetooth if
you are ready to make a mod. Mine is about 10 years old.
There are different types on the market (EOS 0720i, etc).
I do not personally have any use for that, but if there is a lot of them around it might be useful and I have no problem including a definition for it.
Anyway, I have the following questions:
Suppose I have that Suite working with my device. How would that help to find out what protocol is in use and more importantly I think, which registers
to address to get for example the device ID, software version and the likes?
Is TC able to help right now?
Can the Agilent L4411A be added, but i think its the same command set as the 34401a ??
May get my hand on one at my job finger crossed
First off, thank you HKJ for creating such a widespread useful program with such a large instrument data base :-+
We have a Tonghui TH2830 and Hioki IM3536 LRC meters. Could someone with very limited computer/software skills such as myself be able to create an interface with these instruments to plot impedance, capacitance, inductance vs. frequency that use your programs "built-in" plotting features? These instruments have RS232, USB and/or LAN interfaces, so believe the hardware interface is acceptable to remotely communicate with them.
Anyway, just trying to get an idea of the expected level of effort if possible to interface these instruments and create the mentioned plots.
#value V1 V D2
#value V2 V D2
#value V3 V D2
#value V4 V D2
#value A1 A D3
#value A2 A D3
#value A3 A D3
#value A4 A D3
#value Status - DIGITAL(OFF,CV,CC)
#askValues getV? 1;getV? 2;getV? 3;getv? 4;getC? 1;getC? 2;getC? 3;getC? 4;[50];status? 1;[50];status? 2;[50];status? 3;[50];status? 4
#readingdelay 1
;; HAMEG7044: Delay: 50ms
;; HAMEG7044: Tx <status? 4>
;; HAMEG7044: Tx <txrx? READ
:readmath: getElement(value,2,";")
:readmath: getElement(value,0)
:string:>
;; COM3: Tx: <READ.> 52 45 41 44 0D
;; COM3: Rx: <12.00V 05.00V 30.00V 30.00V ;1.000A 1.758A 1.968A 3.000A ;OFF F1 OFF F2 OFF F3 OFF F4 > 31 32 2E 30 30 56 20 30 35 2E 30 30 56 20 33 30 2E 30 30 56 20 33 30 2E 30 30 56 20 3B 31 2E 30 30 30 41 20 31 2E 37 35 38 41 20 31 2E 39 36 38 41 20 33 2E 30 30 30 41 20 3B 4F 46 46 20 46 31 20 4F 46 46 20 46 32 20 4F 46 46 20 46 33 20 4F 46 46 20 46 34 20
;; HAMEG7044: Rx <OFF>
;; HAMEG7044: Rx as numbers <12.0 5.0 30.0 30.0 1.0 1.758 1.968 3.0 NaN NaN NaN NaN>
For using the last Output string the NaN must be a 0,1 or 2 (OFF, CV or CC)
So how can i change the OFF, CV and CC in 0,1 and 2?
I hoped the DIGITAL Parameter do this.
Next Problem:
#cmdSetup buttonsOn CH-1
:read:
:updatealloff:
Off off
On on
This Buttons works ok, but i dont know which :read: Command i must use for the Red/Green Light?
The result from :read: must match the "on" value, then the indicator will turn on.
The only way is to read out the status?
When Answer is "OFF" then output is off.
When Answer is "CC" or "CV" then Output is on.
But i am not able to make a Command for this :(
The only way is to read out the status?
When Answer is "OFF" then output is off.
When Answer is "CC" or "CV" then Output is on.
But i am not able to make a Command for this :(
:readmath: value=="CC" || value=="CV"?"on":"off"
And if you change the status? to numeric output you can use:
:readmath: value>0?"on":"off"
You basically have to add a spy on the communication and then manually decode the protocol.
I often uses this terminal program for it: https://www.compuphase.com/software_termite.htm (https://www.compuphase.com/software_termite.htm) it has a pass-through mode that can be used.
It requires 3 serial ports on the computer to do this: One for the original program and two for the terminal program (one in and one out). All can be done with usb adapters.
is it possible to put more than one replace in one line?
Original value = OFF -1 CV -2 CC -3 CV -4
Code:
#scpiCmd getStat? txrx? READ
:readmath: getElement(value,2,";")
:readmath: replace(value,"OFF","0")
:readmath: replace(value," -1","")
:readmath: replace(value," -2","")
:readmath: replace(value," -3","")
:readmath: replace(value," -4","")
Result = 0 CV CC CV
Is it possible to make replace(value," -*","") and all channel from 1-4 replaced by ""?
Same question for "getElement"
:readmath: getElement(value,2,";")
:readmath: getElement(value,0)
:readmath: listIndex(value,"OFF CV CC")
Is this possible in one Line? and is this then faster or same speed?
is it possible to put more than one replace in one line?
Original value = OFF -1 CV -2 CC -3 CV -4
Code:
#scpiCmd getStat? txrx? READ
:readmath: getElement(value,2,";")
:readmath: replace(value,"OFF","0")
:readmath: replace(value," -1","")
:readmath: replace(value," -2","")
:readmath: replace(value," -3","")
:readmath: replace(value," -4","")
Result = 0 CV CC CV
Is it possible to make replace(value," -*","") and all channel from 1-4 replaced by ""?
There is no replace with wildcards, but it is a good idea and I will include it in the next release (replaceRX where the from can be regEx, i.e. replaceRX("OFF -1 CV -2 CC -3 CV -4"," -[1234]","") -> OFF CV CC CV
)
You can put stuff on one line, you basically have to replace value with the expression from the line above:
replace(replace(replace(replace(replace(getElement(value,2,";"),"OFF","0")," -1","")," -2","")," -3","")" -4","")
It gets a bit messy if you do it too much.
QuoteYou basically have to add a spy on the communication and then manually decode the protocol.
I often uses this terminal program for it: https://www.compuphase.com/software_termite.htm (https://www.compuphase.com/software_termite.htm) it has a pass-through mode that can be used.
It requires 3 serial ports on the computer to do this: One for the original program and two for the terminal program (one in and one out). All can be done with usb adapters.
Thanks for the info. I will have a look in a few weeks.
I have installed Termite and com0com (pass-through). It works pretty well with most of my devices ...except with the Hyperion EOS Suite.
The Suite does work with my device. I can change any parameters. However, as soon as I put the sniffer in between, the Suite doesn't recognized the device :-//
I am kind of stuck. Do you have any suggestions?
QuoteYou basically have to add a spy on the communication and then manually decode the protocol.
I often uses this terminal program for it: https://www.compuphase.com/software_termite.htm (https://www.compuphase.com/software_termite.htm) it has a pass-through mode that can be used.
It requires 3 serial ports on the computer to do this: One for the original program and two for the terminal program (one in and one out). All can be done with usb adapters.
Thanks for the info. I will have a look in a few weeks.
I have installed Termite and com0com (pass-through). It works pretty well with most of my devices ...except with the Hyperion EOS Suite.
The Suite does work with my device. I can change any parameters. However, as soon as I put the sniffer in between, the Suite doesn't recognized the device :-//
I am kind of stuck. Do you have any suggestions?
Thanks
Instead of using the com0com software make up a passive spy/tap cable
https://www.compuphase.com/electronics/rs232split.htm (https://www.compuphase.com/electronics/rs232split.htm)
.000A8A0000020A
.0186CA0000003B000800004BD900000000000000000000F154000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049C3..000A8A0000020A
.0186CA0000003B000800004BDA00000000000000000000F144000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049CA..000A8A0000020A
.0186CA0000003B000800004BD900000000000000000000F134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049C1..000A8A0000020A
.0186CA0000003B000800004BD900000000000000000000F13C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049D0..000A8A0000020A
.0186CA0000003B000800004BD900000000000000000000F148000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049C6..000A8A0000020A
.0186CA0000003B000800004BD900000000000000000000F136000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049C3..000A8A0000020A
.0186CA0000003B000800004BC200000000000000000000F148000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0036030000000000010006000100010001000201180190000927100A5F
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049BE...000A8A0000020A
.0186CA0000003B000800004BD500000000000000000000F140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049BA..000A8A0000020A
.0186CA0000003B000800004BD800000000000000000000F148000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049C5..000A8A0000020A
.0186CA0000003B000800004BA200000000000000000000F14E000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049C9..000A8A0000020A
.0186CA0000003B000800004B8F00000000000000000000F14E000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0036030000000000010006000000010001000201180190000927100A5E
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049D4...000A8A0000020A
.0186CA0000003B000800004B8F00000000000000000000F144000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049C3..000A8A0000020A
.0186CA0000003B000800004BAD00000000000000000000F14A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049D7..000A8A0000020A
.0186CA0000003B000800004BD800000000000000000000F13C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049CF..000A8A0000020A
.0186CA0000003B000800004B8A00000000000000000000F13C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049CC.
5333 IRP_MJ_WRITE - Request transfers data from a client to a COM port (COM23) - 60 bytes of 60
STATUS_SUCCESS
0c 30 30 33 36 30 33 30 30 30 30 30 30 30 30 30 .003603000000000
30 30 31 30 30 30 36 30 30 30 31 30 30 30 31 30 0010006000100010
30 30 31 30 30 30 32 30 31 31 38 30 31 39 30 30 0010002011801900
30 30 39 32 37 31 30 30 41 35 46 0d 00927100A5F.
5567 IRP_MJ_WRITE - Request transfers data from a client to a COM port (COM23) - 16 bytes of 16
STATUS_SUCCESS
0c 30 30 30 41 38 41 30 30 30 30 30 32 30 41 0d .000A8A0000020A.
8507 IRP_MJ_WRITE - Request transfers data from a client to a COM port (COM23) - 60 bytes of 60
STATUS_SUCCESS
0c 30 30 33 36 30 33 30 30 30 30 30 30 30 30 30 .003603000000000
30 30 31 30 30 30 36 30 30 30 30 30 30 30 31 30 0010006000000010
30 30 31 30 30 30 32 30 31 31 38 30 31 39 30 30 0010002011801900
30 30 39 32 37 31 30 30 41 35 45 0d 00927100A5E.
10333 IRP_MJ_WRITE - Request transfers data from a client to a COM port (COM23) - 16 bytes of 16
STATUS_SUCCESS
0c 30 30 30 41 38 41 30 30 30 30 30 32 30 41 0d .000A8A0000020A.
Before we go further, is that possible with this info to make a test with TC, create a dialog box and enable/disable the Button sound?
Hello HKJ and thanks for your effort and change for us to use your sw
I can see that you have support for UNIT UT61E (serial connection old type)
I have UNIT UT61E+ for USB connection and I cant find that it uses usb2serial.
Do you support this new type and if not do you think you will ?
I cant tell you verison of your sw because I cant find it (files since july of 2020)
I've crafted a basic configuration for an HP 6624A (four channel power supply) which is attached.
I feel like there should be some way that I can simplify things so I don't need SCPI commands for each channel, but I haven't been able to figure out how to pass the channel as a parameter. Any suggestions?
Thanks, it will be included in the next release.
It is missing the #interface definitions, they are used for some functions in TestController.
Thanks. I've attached a newer version that includes the #interface definitions. I had them in there originally, but took them out as removing them didn't seem to affect anything (to be honest I'm not sure what Test Controller uses them for).
I recently purchased a Gossen Metrahit Energy with the USB IR interface cable and was excited to run across this software. Unfortunately, the cable doesn't seem to work with my MacBook running 10.15 Catalina or MacMini running Monterey. Normally, a device shows up in the /dev folder with the names cu.usbserial-xxxxx and tty.usbserial-xxxxx. I assume that is the address that the Test Controller program wants. At first I thought it was a FTDI driver problem but other FTDI devices I have do work. I did install the FTDI beta VCP driver 1.4.7 for MacOS 10.15 from their website but no luck.
Has anyone got the Metrahit USB X-Tra cable working with their Mac? I'm looking forward to trying out Test Controller. It looks pretty impressive. Thank you.
Edit:
I am beginning to think that the Gossen cable only works with the supplied driver in Windows. That would be a shame. I have asked Gossen about this and will let you know what they say.
Attached is a updated version of the Siglent SDL10xxXxx definition to fix the mAh vs Ah display and logging table, and incorrect label of the CR mode resistance setting.
I don't suppose there is a chance of getting an old Fluke 8502a with AR488 working with this excellent software ?
Hi,
I recently purchased a Gossen Metrahit Energy with the USB IR interface cable and was excited to run across this software. Unfortunately, the cable doesn't seem to work with my MacBook running 10.15 Catalina or MacMini running Monterey. Normally, a device shows up in the /dev folder with the names cu.usbserial-xxxxx and tty.usbserial-xxxxx. I assume that is the address that the Test Controller program wants. At first I thought it was a FTDI driver problem but other FTDI devices I have do work. I did install the FTDI beta VCP driver 1.4.7 for MacOS 10.15 from their website but no luck.
Has anyone got the Metrahit USB X-Tra cable working with their Mac? I'm looking forward to trying out Test Controller. It looks pretty impressive. Thank you.
Edit:
I am beginning to think that the Gossen cable only works with the supplied driver in Windows. That would be a shame. I have asked Gossen about this and will let you know what they say.
Michael
Tonghui TH2830 LRC meter was mentionened before in this thread,
did anyone solve a driver ?
what i want to achieve is to perform frequency versus the two measured values, it displays in any selected mode combination
Attached is a driver file supporting the GW Instek AC supply for you to include in the next release. It is fully tested with ASR-2100 over LAN but supports ASR-2000 and ASR-3000 families.
1. It has a RANGE setting the is either base voltage/twice voltage and correspondingly base current/half current. How would you suggest handling that in the Setup popup #cmdSetup entries for legal numeric range? Right now this file is fixed at twice voltage range values for the #metadef #replaceText values.
2. This device outputs either ac to simulate ac line, or dc with a symmetric negative to positive range, or the sum of both. It also includes a rudimentary arbitrary function generator. So, I don't think it really fits in the
#interfaceType PS
dc power supply instrument category. What do you think of using "ACPS" as the category/instrument type when/if I get around to adding #interface commands to this instrument driver file?
>This can be done with TestController, but because frequency is not defined as output parameter for a typical LCR meter, it can be a bit tricky to setup.
oh.. did not know it was so special :-)
yes the TH2830 do support user input of test frequency, even to the last Hz
so this means if this can be used for a sweep, we can make very sexy curves with this instrument
test controller is mentioned in my latest video:
https://youtu.be/UpAvgAQBId4
here it is used to reveal temperature regulation loop, by creating a curve of power usage via a power supply
Super smart and easy to use, this test controller sw.
I am having difficulty getting TC working with my Fluke 8502a and AR488
I am having difficulty getting TC working with my Fluke 8502a and AR488
You are not supposed to use ++auto, TC will use the ++read command
When using a ascii device there is no free answer, you have to use txrx? or similar commands to get an answer.
And remove the checkmark in "Scan serial ports", this will remove the scan of all the serial ports from the log (This function is only useful if you have a couple of serial devices that responds to the *idn? command, I typically uses it with my homemade Arduino devices).
You have to load the 8502 into the device list and specify it uses port A:5
The "#port GPIB" do not use a baudrate setting, but you can use: "#port GPIB com" and then it will be possible to select serial port.
A fairly similar device would probably be the "HP3478A.txt"
Thanks but unfortunately none of those suggestions seem to make a difference. I only used ++auto 1 as one other user indicated that is what he needed to to to get his device working. Seem to always get no data timeout?
#scpiCmd values? txrx? ?
#askValues txrx? ?
; Initial commands to meter when establishing connection
;#initCmd tx V?
>This can be done with TestController, but because frequency is not defined as output parameter for a typical LCR meter, it can be a bit tricky to setup.
oh.. did not know it was so special :-)
yes the TH2830 do support user input of test frequency, even to the last Hz
so this means if this can be used for a sweep, we can make very sexy curves with this instrument
For now it can be done two ways:
1) Modify definition of LCR meter to include frequency
2) Use a generator that can sweep (External AVG or Soundcard output) and a script to sync the LCR meter to it.
Actual question: Is there a cheap temperature sensor that works over USB that Test controller can read so I can all it to the logs?
I've some wonderfully tiny 10k B3950 NTCs here that would be far better suited to the job.
I'm just about to start this project, is there a reason I'd try and calculate resistance and pass it back instead of making ardunio code that simply lets you define the sensor there?
I still think passing the temperature back so it can work with the same DS1820 project makes the most sense to me?
The reason I have put the different temperature sensor calculations in TestController is multimeters, i.e. you can basically use any standard temperature sensor with a multimeter and TestController can convert from ohms or volts to the actual temperature.
Had an old NI1000 temperature sensor lying
around unused due to a mispurchase :palm:.
Got it going again thanks to Test Controller with its
built-in math for such sensors. :-+
Something even my 34465A does not have.
Rx <4B94 1E99 0012 0000 0000 0000 0000 0000 0000 1E9B 0000 0000 0000 0000 0000 019E 0000 0000 0000 0000>
Rx as numbers <NaN Infinity 12.0 0.0 0.0 0.0 0.0 0.0 0.0 NaN 0.0 0.0 0.0 0.0 0.0 1.9E19 0.0 0.0 0.0 0.0>
.0036030000000000010006000100010001000201180190000927100A5F.
0x0c 0x30 0x30 0x33 0x36 0x30 0x33 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x31 0x30 0x30 0x30 0x36 0x30 0x30 0x30 0x31 0x30 0x30 0x30 0x31 0x30 0x30 0x30 0x31 0x30 0x30 0x30 0x32 0x30 0x31 0x31 0x38 0x30 0x31 0x39 0x30 0x30 0x30 0x30 0x39 0x32 0x37 0x31 0x30 0x30 0x41 0x35 0x46 0x0d
Made an (simple) script for testing several
type of power-supplies.
Hello
I have decoded a sentence that contains 20 variables in HEX format:Code: [Select]Rx <4B94 1E99 0012 0000 0000 0000 0000 0000 0000 1E9B 0000 0000 0000 0000 0000 019E 0000 0000 0000 0000>
#askValues values? returns the following:Code: [Select]Rx as numbers <NaN Infinity 12.0 0.0 0.0 0.0 0.0 0.0 0.0 NaN 0.0 0.0 0.0 0.0 0.0 1.9E19 0.0 0.0 0.0 0.0>
Question: how do I convert each of these variables to decimal values?
Another question: I need to send different commands to a device in ASCII format with a CRC/Checksum.
How do I calculate that CRC?
As an example, this command generates the following CRC: (0A5F)Code: [Select].0036030000000000010006000100010001000201180190000927100A5F.
Same command, in ASCII:Code: [Select]0x0c 0x30 0x30 0x33 0x36 0x30 0x33 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x31 0x30 0x30 0x30 0x36 0x30 0x30 0x30 0x31 0x30 0x30 0x30 0x31 0x30 0x30 0x30 0x31 0x30 0x30 0x30 0x32 0x30 0x31 0x31 0x38 0x30 0x31 0x39 0x30 0x30 0x30 0x30 0x39 0x32 0x37 0x31 0x30 0x30 0x41 0x35 0x46 0x0d
There is no easy way to make a CRC. What driver do you use? Maybe I can add it to the driver, another option is a function to calculate crc.This is the block driver.
QuoteThere is no easy way to make a CRC. What driver do you use? Maybe I can add it to the driver, another option is a function to calculate crc.This is the block driver.
Thanks HKJ,Made an (simple) script for testing several
type of power-supplies.
Interesting, I have a few comments:
1) End the filename with "Script" and save it in ..\TestController\ScriptLibrary , then it will be accessible in the right click menu.
2) Add a #autorun after the #scriptMenu line, then it will auto start.
3) Add #scriptInterface Load setCurrent SetVoltage setOn then the menu entry will only show if a load is loaded and has the listen functions in the interface
4) Clean it up, there is some unused code and lines in it.
When using SetVoltage on a load it will switch to constant voltage mode and may ignore the setCurrent value.
I bought an electronic load Atorch DL24M-H.
I bought an electronic load Atorch DL24M-H. After the first start, I connected to your program without any problems. Everything worked, only there were occasional drops in the recorded voltage. The program offered me an upgrade, so I implemented it. Everything works when controlled from the display. Even when installing the original application from Atorch, the load is connected and everything works. However, this is unsatisfactory for me. I want to use your program for recording and it can no longer connect.
I also have a 150W version of the Atorch DL24P, this one works very well for me with your program. I don't know what happened to the DL24M-H upgrade, but it can't connect to TestController (ver.2.6). Don't have any idea how to liven it up?
DL24M-H is not listed in the "ATorchPX100Devices.txt" device file.
Maybe you can ad the DL24M-H metadef?
I watched the file, but I dare not modify it.
3 When I do that, script is not listed in the right click menu. In List and Manage Scripts it is marked with an IF.
even when load is ready and connected.?
4 Done (as far as possible for an programmer with low programming skills. (Trial and Error programmer)
I watched the file, but I dare not modify it.
If you add an section like this, and make name and handle according your device,
no serious problems can happen.
#metadef
; 180Watt discharge power
#idString ATorch,ATorch DL24P,
#name ATorch DL24P
#handle ATDL24P
#replaceText MinCurrent 0.2
#replaceText MinVoltage 0
#replaceText MaxCurrent 10
#replaceText MaxVoltage 200
If the values are wrong only wrong measurement can happen.
But when you can make connection, you know what to do.
I bought an electronic load Atorch DL24M-H.
DL24M-H is not listed in the "ATorchPX100Devices.txt" device file.
Maybe you can ad the DL24M-H metadef?
I bought an electronic load Atorch DL24M-H.
DL24M-H is not listed in the "ATorchPX100Devices.txt" device file.
Maybe you can ad the DL24M-H metadef?
If you could advise me where to assign a new device name, I would be very grateful. I will make the change at my own risk. Well thank you.
I paired the new DL24M-H device on COM7 and the old DL24 on COM8. Only the old device was connected via DL24, DL24P and PX100. I also tried to connect with the program "Battery Tester PX100" and the results were the same.
I paired the new DL24M-H device on COM7 and the old DL24 on COM8. Only the old device was connected via DL24, DL24P and PX100. I also tried to connect with the program "Battery Tester PX100" and the results were the same.
It looks like it may have changed protocol. You can try running TestController in debug mode and see if there are any data.
First I have to study how TC starts in debug mode ... When I can do that I will publish the results. Well thank you. :)
I moved to a desktop PC. I connected to COM5 and ran the debug.
Great! I have connected, but I do not have voltage, current values ... But it is possible to switch the load on and off, set the end voltage, set the test time and reset the values. The current setting does not work properly. Sets about 4x smaller value. I set 5A, the fact is 1,280A. You are very handy.
"For current & voltage check the logged values. You can use "voltage?" and "current?" on the command line to only check that value and isolate the log for that."
I'm not a programmer. I don't understand what to do ...
Next
QuoteThere is no easy way to make a CRC. What driver do you use? Maybe I can add it to the driver, another option is a function to calculate crc.This is the block driver.
In next version you can change you "s" specified to "h" and get the hex converted to integers.
There will also be a optional crc/checksum calculation you can activate.
000A8A0000020A
Next
Update .jar file with http://lygte-info.dk/pic/Projects/TestController/TestController.jar (http://lygte-info.dk/pic/Projects/TestController/TestController.jar) and try again.
Note: It may take up to an hour before you can download the new version (V2.10), please check About on the configuration page to be sure you have the updated version.
It's not working yet.
I have a Li-Ion battery connected to the load, so it should show about 4.1V
The minutes of Ah and Wh looked fine. Therefore, I upgraded the firmware in good faith and since then I have exchanged minor problems for larger ... |O
CRC: Thanks for adding that function. I have tried to get a CRC using the linked website (https://crccalc.com/)
Could not get my expected value (020A) .Code: [Select]000A8A0000020A
Do I have to enter the control chars ? (start with 0x0c and end with 0x0d)
The minutes of Ah and Wh looked fine. Therefore, I upgraded the firmware in good faith and since then I have exchanged minor problems for larger ... |O
Sort of, the protocol has changed. I hope we can fix it together, i.e. I make modifications and you test.
It's not working yet.
I have a Li-Ion battery connected to the load, so it should show about 4.1V
Please post a log with the "voltage?" command and that 4.1V battery.
Is this a known limitation of TestController or something that can be fixed?
It's not working yet.
I have a Li-Ion battery connected to the load, so it should show about 4.1V
Please post a log with the "voltage?" command and that 4.1V battery.
I don't understand what to do. Even with the battery connected, when I have a 4.1V electronic load on the display, the TestController shows zero values.
I don't understand what to do. Even with the battery connected, when I have a 4.1V electronic load on the display, the TestController shows zero values.
Specifying current setting error: The set current 4A is actually 1.024A. And it writes 10.24A in the setup window.
I noticed my MASTECH 6514 thermometer will connect under one of the profiles that are listed in devices. Mastech 8218!!
The IDN command returns "Mastech,MS8218".
I cannot find this in the device folder! Can someone tell me why? Since it must be using the same/similar setup to the 8218 multi-meter , I'm hoping I can use it to modify and make a profile to show the temperatures.
VALUE? - Returns nothing.
MODE? - This is returning either VAC or VDC. I'm guessing it's checking a bit that's related to temperature on the thermometer.
RATE? - Returns 1214
Since I know the bytes of the protocol, presumably if I knew where the device profile was, I could copy and edit it to create a new file that reads the temperature from the correct place.
Where is the device profile?!
Specifying current setting error: The set current 4A is actually 1.024A. And it writes 10.24A in the setup window.
Try replacing the attached file. You will have to select DL24M-H to get the adjusted values.
The scale factor is controlled with these two lines in the file:
#scpiCmd setCurrent tx 2 (value/0.256) *dd
#scpiCmd setCurrent? rx? 0x17 /1000
You did not have any software version for the new software you programmed the load with?
This built in driver, is there another meter that has a device protocol that's similar that I could try that might work on it since we know some basics about it now?
It's so irritating I find this so hard to get my head around, especially since I already know the protocol. I could write code in python to decrypt it in a few minutes...
This is off topic, but this is what I done to mine :D
(https://i.ibb.co/ncXjYKz/1655114106146.jpg)
All cooled by a quad fan AIO PC water cooler.
While on the topic, I have to say I'm really surprised at how accurate the device is with final totals.
Specifying current setting error: The set current 4A is actually 1.024A. And it writes 10.24A in the setup window.
Try replacing the attached file. You will have to select DL24M-H to get the adjusted values.
The scale factor is controlled with these two lines in the file:
#scpiCmd setCurrent tx 2 (value/0.256) *dd
#scpiCmd setCurrent? rx? 0x17 /1000
You did not have any software version for the new software you programmed the load with?
I think it's a program bug I can't fix. (If this cannot be corrected by changing the program, I can work with it, because the required current can be set with the buttons on the load display). Everything else can be set up correctly in the Setup window. The load goes through the Setup window on and off, as well as reset all measured values.
I'm sorry, I'm not a programmer, I don't know how to do it ...
We probably don't understand. I don't have the "ATorchDevices.txt" and / or "ATorchPX100Devices.txt" file modified. I dare not. TC 2.11 (which you sent me) therefore does not offer me a connection to the Atorch DL24M-H. I connect via DL24P and that's how it works for me. I can't do the current recalculation either.
I don't understand these things ... :-//
;; MS6514B: Tx <values?>
;; MS6514B: Rx Timeout
Thread for MS6514B
dk.hkj.script.ProgramExceptions$UnknownException: Function not found makeDouble
makeDouble(0,1,3,2,value)+____<----____" "+makeDouble(4,5,7,6,value)
at dk.hkj.script.Script.getFunc(Script.java:93)
at dk.hkj.script.Script.parseValue(Script.java:268)
at dk.hkj.script.Script.parseBitOp(Script.java:316)
at dk.hkj.script.Script.parseProduct(Script.java:388)
at dk.hkj.script.Script.parseSum(Script.java:470)
at dk.hkj.script.Script.parseCompare(Script.java:525)
at dk.hkj.script.Script.parseLogical(Script.java:561)
at dk.hkj.script.Script.parseQuestionMark(Script.java:587)
at dk.hkj.script.Script.parseExpression(Script.java:612)
at dk.hkj.script.Script.expression(Script.java:1220)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:283)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:299)
at dk.hkj.main.SCPICommand.readNumbers(SCPICommand.java:404)
at dk.hkj.main.DeviceInterface.getValuesFromDevices(DeviceInterface.java:399)
at dk.hkj.devices.DeviceSCPI.getValuesFromDevices(DeviceSCPI.java:44)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1523)
I found the debug mode and here's what my current issue seems to be:
I clicked on the link for makeDouble on your site and it 404s, so I'm lost now....
Excellent! I wouldn't have thought to update it since I only downloaded it less than a week ago!
New error though unfortunately:
Is it possible to send these 3 parameters with one "Set" button?
I only discharged a few 18650s through it at 15Amps, temperatures where really good, MOSFETs barely heating up. I was making some alterations to the serial comms on the board and blew the main processor, so didn't get a chance to do the high power test before I fried it :< .I have ordered another and it will be here next week. The swap over shouldn't be too hard, so I'll find out then!
I haven't got the calculations here with me, but I think I worked out electrically it could easily do 1.5KW under the right conditions.
Obviously my water cooler would never dump that heat, I am hoping it can sustain 500W though. I have a few 20A 24V PSUs I'd love to stress test with it :)
makeDouble(value,minus,pointAdjust)
makeDouble(value,minus,pointAdjust,overload)
makeDouble(valueIndex,minusIndex,pointAdjustIndex,overloadIndex,valueString)
makeDouble(123,0,1);
makeDouble(123,0,1,0);
makeDouble(0,1,2,3,"123 0 1 0");
So I bought the DL24M-H 600W.
The power is divided into 16 Mosfets with 4 fans
I can't believe I'm still at this....Code: [Select]makeDouble(value,minus,pointAdjust)
makeDouble(value,minus,pointAdjust,overload)
makeDouble(valueIndex,minusIndex,pointAdjustIndex,overloadIndex,valueString)
makeDouble(123,0,1);
makeDouble(123,0,1,0);
makeDouble(0,1,2,3,"123 0 1 0");
Yes, so these examples all work. How the hell do I get the values sfter RX format into it....
for example #askValuesMathFormat makeDouble(123,0,0) will work fine as 123 as the value and displays something like 1.23°C as the value, however I need to get the output from RX into this, which I can see from the debug tab is working fine: Rx <214 0 0 1> (21.4 degrees)
makeDouble(0,1,3,2,value)
makeDouble(value,minus,pointAdjust,overload)
value: Any numeric value, will usually be a unsigned integer.
minus: When non-zero the sign on the value will be changed.
pointAdjust: A integer specifying how many places to move the decimal point, positive value is to the right (i.e. 2==/100)
overload: Return a overload value, 1=Infinite, -1:NaN
Quote from: HKJmakeDouble(0,1,3,2,value)
This completely contradicts the documentation for makedouble....
You need to put a note that they last part only refers to the five variable command. From the way it is in the documentation, you'd assume it's the same for them all.....
1. Is there an initialisation command option, like one that only sends when it detects the device?
2. Is it possible to read the values without the askvalue command being transmittedt? This device sends them as a stream, so the ask values command does nothing except clog up the logs. (I see you answered this already and it appears the answer is no?)
3. For "65 14 00 00 00 00 D6 00 D1 07 81 08 08 09 21 0F 0D 0A" I am able to read 'D6' with '6u1'. This is now giving me the correct temperature with the changes we just made to math format. This is great, but limits us to 0-255 (so over 25 degrees, it basically rolls around). I cannot get the other bytes in to allow me to read the full range...
EDIT: Additional on question three, for the byte position is 65 14 ignored as we defined it earlier as rxStart, and so I'd actually reading D1 in the above example?
: Tx <Values?>
;; M6514F: Rx <204 0 0 1 207 0 0 1>
;; M6514F: Rx after :readmath: makeDouble(0,1,3,2,value) +" "+makeDouble(4,5,7,6,value) <20.4 20.7>
;; M6514F: Rx as numbers <20.4 20.7>
Exception in thread "LoggerSample" java.lang.NullPointerException: Cannot read field "format" because the return value of "dk.hkj.database.Format.get(int)" is null
at dk.hkj.database.Format.formatFile(Format.java:46)
at dk.hkj.database.DataRow.getDataRowLine(DataRow.java:53)
at dk.hkj.main.InterfaceThreads$LoggingSample.run(InterfaceThreads.java:1251)
The #askValues is not being transmitted when using a async device, it is processed internally in the driver.
OK, I think we're nearly done, I just hit a bug when I tried to log the data to test:Quote: Tx <Values?>
;; M6514F: Rx <204 0 0 1 207 0 0 1>
;; M6514F: Rx after :readmath: makeDouble(0,1,3,2,value) +" "+makeDouble(4,5,7,6,value) <20.4 20.7>
;; M6514F: Rx as numbers <20.4 20.7>
Exception in thread "LoggerSample" java.lang.NullPointerException: Cannot read field "format" because the return value of "dk.hkj.database.Format.get(int)" is null
at dk.hkj.database.Format.formatFile(Format.java:46)
at dk.hkj.database.DataRow.getDataRowLine(DataRow.java:53)
at dk.hkj.main.InterfaceThreads$LoggingSample.run(InterfaceThreads.java:1251)
What would you like me to do?
You can see above what is happening.
You've been a fantastic help to me so far, so I have no issue returning the favour :)
Here's the current setup file if it is of any use.
I'm going to test the temperatures with the hot air gun and also put it in the freezer to make sure the negative sign is working. Assuming that's all good, please include this with your devices in you next release so no one has to go through the torture I did :D
Is it possible to include a tip/help line that shows up when the device connects? I've notes in the device file, but their's two important things a user might miss if they don't check the device file.
Is it possible to send these 3 parameters with one "Set" button?
No, but check the multi control: https://lygte-info.dk/project/TestControllerConfigDevice%20UK.html#Control_multi (https://lygte-info.dk/project/TestControllerConfigDevice%20UK.html#Control_multi)
So far so good. Thanks :-+
I am adding more parameters. Is there a way to put the other values on a second line in the same tab?
Now for the write function: I need to "build" this function based on the values entered in the different fields before sending it to the device in ASCII, together with the CRC/checksum (still don't know how to get the right value).
Which function(s) should I use ?
All looks good.
I can load the meter in Test Controller and in the device address space I am using the device name from the /dev directory, in this case, /dev/tty.usbserial-14340. This is the address I would use with the screen program. Maybe the Test Controller program expects a different address form?
Hi! I've tested the new version with the ATorch DL24M-H and I have a few observations regarding the setup commands behaviour.
The "USBTMC" Protocol has come up in the past. I've an OWON SDS1192 which uses the "PC" setting to log to its own propreiety software. However, it does support "USBTMC" mode as well.
Any chance of this being updated? I know very little about it at the moment, but it appears it would allow Test Controller to nearly immediately add a bunch of equipment to its list of supported devices.
So far so good. Thanks :-+
I am adding more parameters. Is there a way to put the other values on a second line in the same tab?
Each message can only contain values from one line, I have not seen a need for many parameters in one command before.Now for the write function: I need to "build" this function based on the values entered in the different fields before sending it to the device in ASCII, together with the CRC/checksum (still don't know how to get the right value).
Which function(s) should I use ?
You get a "value" variable that contains each value in ascii format and you can get a single one with getElement() function.
But converting that to a couple of hex values can be a bit hard.
You can use hex(getElement(value,4)) to convert a single number to hex, but for it to work you need to use () around it and "\"" for the driver to accept it as a text string, i.e. ("\""+hex(getElement(value,4))+"\""), except you need many more conversions inside the ()
#cmdSetup multi Battery Parameters
:read: BatteryType?;
:write: mytest ("\""+hex(getElement(value,4))+"\"")
;:write: mytest ("\""+ hex(0x0c,1) +hex(0,4)+hex(1,4)+hex(2,4)+hex(3,4)+hex(4,4)+hex(5,4)+"\"")
; cannot get the control char 0c right!
:tip: Enter battery parameters
combobox NiCd 0 NiMh 1 LiIo 2 LiPo 3 LiFe 4 Pb 5
Hi! I've tested the new version with the ATorch DL24M-H and I have a few observations regarding the setup commands behaviour.
The voltage setting works just fine.
The current setting is a different story. It is always off by a fixed value multiplier, an example: in TC I set it to 1000m, the load beeps and sets itself to 3.9A while in the setting field TC shows 390m. So there is a factor of 10 error in the feedback part but also there is a factor of 2.56something when you command the load. I hope its clear enough...
The time setting works but it rounds DOWN to the nearest minute. An example: setting to 119 yields in 00:01 on the display, 185 becomes 00:03 and so on. The load itself only has one minute resolution anyway so its not a big deal.. It is also different a bit from the cutoff voltage setting because you manually have to turn on this feature on the load to any number before it actually works. The cutoff voltage works fine even if its in "off" mode when you set up the voltage.
The value readings are good, they don't have this weird multiplier problem, they all come in with correct decimals and stuff.., however the current reading is very glitchy and drops to close to zero quite often. See the attached picture, it is a constant 1A load and even after I've turned off the load there was a glitch.
Hope this helps and thank you very much for all this massive effort to make this software. Let me know if I can do some more tests with this specific load.
Yes, it seems hard. This is my multi box (simplified for this test)Code: [Select]#cmdSetup multi Battery Parameters
:read: BatteryType?;
:write: mytest ("\""+hex(getElement(value,4))+"\"")
;:write: mytest ("\""+ hex(0x0c,1) +hex(0,4)+hex(1,4)+hex(2,4)+hex(3,4)+hex(4,4)+hex(5,4)+"\"")
; cannot get the control char 0c right!
:tip: Enter battery parameters
combobox NiCd 0 NiMh 1 LiIo 2 LiPo 3 LiFe 4 Pb 5
Where should I put the function to read the different battery types based on my selection how can I parse the different values??
Hi! I've tested the new version with the ATorch DL24M-H and I have a few observations regarding the setup commands behaviour.
Try this version and see if it fixes dropout: http://lygte-info.dk/pic/Projects/TestController/TestController.jar (http://lygte-info.dk/pic/Projects/TestController/TestController.jar)
Maybe your load is the old software version, try running it as a DL24P
Please report back on both results.
I've tried it with booth DL24P and DL24M-H, both have the same issue with the dropouts. If I'm using the DL24P the current setting works properly though, no weird multiplier problems as with the M-H one...
@aszasza,
Reading Dropouts is an known problem with DL24***
In post 1568 discussed about that.
HKJ helped me with making some mathfunctions to reduce the errors.
Better said is to filter them out.
Strange you have them only in Current reading, that is i.m.o. not always the case,
other DL24 readings have also dropouts when you log for a long time.
As Example: Dropouts are very bad when you need to check Cut-off voltage.
This is used in my Battery Test script which HKJ has published here:
https://lygte-info.dk/project/TestControllerUserScripts1%20UK.html
Maybe you can use parts from code from that.
Succes.
BTW. I have not as much dropouts as you have.
When logging for a short time I have almost no dropouts.
See attached picture form the Powersupply test.
#scriptMenu Discharge
;; Battery discharging with DL24 / PX100
;; Loaddevice = ATDL24P
;; Max. Discharge time = 120.0 Seconds
;; Discharge with 1.0A to 7.0V
;; Start Voltage = 9.997 Volt
;; Discharge Current = 0.987 Ampere
;; #wait (tableCalcMax((load+".Voltage"),tableRows()-6)>endVoltage) and (tableCalcMax((load+".Current"),tableRows()-6)>(0.5*testCurrent)) and timeendVoltage) and (tableCalcMax((load+".Current"),tableRows()-6)>(0.5*testCurrent)) failed due to Variable not found timeendVoltage
e"),tableRows()-6)>endVoltage) and (tableCalcMax((load+".Current"),tableRows()-6)>(0.5*testCurrent)) and timeendVoltage)____<----____ and (tableCalcMax((load+".Current"),tableRows()-6)>(0.5*testCurrent))
;; Discharge stopped by TestController
;; End Voltage = 9.984 Volt
;; Discharged with Current = 1.0 Ampere
;; Capacity = 0.001Ah
;; Energy = 0.015Wh
I've tried it with booth DL24P and DL24M-H, both have the same issue with the dropouts. If I'm using the DL24P the current setting works properly though, no weird multiplier problems as with the M-H one...
Try running TestController in logging mode, I would like a log segment that includes a dropout.
Hi! I've tested the new version with the ATorch DL24M-H and I have a few observations regarding the setup commands behaviour.
Try this version and see if it fixes dropout: http://lygte-info.dk/pic/Projects/TestController/TestController.jar (http://lygte-info.dk/pic/Projects/TestController/TestController.jar)
Maybe your load is the old software version, try running it as a DL24P
Please report back on both results.
I've tried it with booth DL24P and DL24M-H, both have the same issue with the dropouts. If I'm using the DL24P the current setting works properly though, no weird multiplier problems as with the M-H one...
vladobac: I don't want to update the firmware unless we know it works for sure, this way at least we can provide info for HKJ, you with the new fw and I with the original one.
Try running TestController in logging mode, I would like a log segment that includes a dropout.
Here you go, this is the log:
https://pastebin.com/LmD2BSPB (https://pastebin.com/LmD2BSPB)
and this is the table:
https://pastebin.com/fZmGe6hY (https://pastebin.com/fZmGe6hY)
A minor problem is only when entering the discharge current via the keypad via the setup menu TC 2.12. It only accepts divisible values or multiples of 1024. (anything with the format of the entered data?).
Before and after the upgrade
Before and after the upgrade
I am a bit sorry you upgraded, now you cannot test the new TestController where I try to filter a bit (By reading a extra time when value changes).
The filter works on both new and old protocol but the filter is only active on the current (I can add other values if needed).
http://lygte-info.dk/pic/Projects/TestController/TestController.jar (http://lygte-info.dk/pic/Projects/TestController/TestController.jar)
Don't worry, that is why I did not do the upgrade yet so we can test it all out before I do it. I can only do tests after work though, I only have the load at home...
Other: I've tried my Ridden DPS5005 PSU with TC (I just horribly bodged one of the other definitions because I still don't quite understand how it all works) and it worked just fine, so please, if you can add that to the list would be awesome. Thanks!
I need to know what definition and what you did to it.
I've changed the Riden DPH5005 file, and there is this line where I think it checks for the correct model number: "#verifyDevice 5205 Model?" I just replaced the 5205 to 5005 and it worked :D
They have a whole range of PSU-s they all look the same and more than likely they are all using the same comm. protocol so it would be nice just to add them all and mark the untested ones. I only have the DPS5005 but I'm pretty sure that here in the forum we can cover pretty much the whole range of them, they are very common PSUs.
By the way it is confusing that the filename is DPH5005 and the device that is listed in the file is 5205, is this a mistake or why this is so?
The DPH is buck-boost the DPS is buck only.
I can try to collect all the model numbers with communication option (not all have this feature enabled) for you from this range of PSUs, so you can add them.
Yes, it seems hard. This is my multi box (simplified for this test)Code: [Select]#cmdSetup multi Battery Parameters
:read: BatteryType?;
:write: mytest ("\""+hex(getElement(value,4))+"\"")
;:write: mytest ("\""+ hex(0x0c,1) +hex(0,4)+hex(1,4)+hex(2,4)+hex(3,4)+hex(4,4)+hex(5,4)+"\"")
; cannot get the control char 0c right!
:tip: Enter battery parameters
combobox NiCd 0 NiMh 1 LiIo 2 LiPo 3 LiFe 4 Pb 5
Where should I put the function to read the different battery types based on my selection how can I parse the different values??
I am not exactly sure what you are asking about.
You can use :readmath: to process read values. They can be used both in the #cmdSetup and the #scpiCmd tags.
#cmdSetup multi Battery Parameters
;:write: mytest ("\""+hex(getElement(#,4))+hex(getElement(#,4))+"\"")
:write: mytest ("\""+hex(getElement(value,4))+hex(getElement(value,4))+"\"")
combobox NiCd 0 NiMh 1 LiIo 2 LiPo 3 LiFe 4 Pb 5
combobox 1Cell 1 2cell 2 3cell 3 4cell 4 5cell 5 6cell 6 7cell 7
Tx <tx ("\""+hex(getElement(1,4))+hex(getElement(7,4))+"\"")>
Exception in thread "AWT-EventQueue-0" dk.hkj.script.ProgramExceptions$UnknownEx
ception: No digits in number <>
"\""+hex(getElement(value,4))+____<----____hex(getElement(value,4))+"\""
at dk.hkj.script.Script.expression(Script.java:1232)
at dk.hkj.main.Support.processScriptInBrackets(Support.java:1173)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:346)
at dk.hkj.main.SCPICommand.write(SCPICommand.java:366)
at dk.hkj.devices.SetupFormats$MultiField.actionPerformed(SetupFormats.j
ava:4066)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour
ce)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
rivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
rivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
rivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: dk.hkj.vars.VarExceptions$ConversionException: No digits in number <>
at dk.hkj.vars.Support.stringToLong(Support.java:54)
at dk.hkj.vars.VarValueString.asLong(VarValueString.java:86)
at dk.hkj.vars.Var.asLong(Var.java:214)
at dk.hkj.script.FunctionsString$35.execute(FunctionsString.java:614)
at dk.hkj.script.Script.parseValue(Script.java:269)
at dk.hkj.script.Script.parseBitOp(Script.java:316)
at dk.hkj.script.Script.parseProduct(Script.java:388)
at dk.hkj.script.Script.parseSum(Script.java:475)
at dk.hkj.script.Script.parseCompare(Script.java:525)
at dk.hkj.script.Script.parseLogical(Script.java:561)
at dk.hkj.script.Script.parseQuestionMark(Script.java:587)
at dk.hkj.script.Script.parseExpression(Script.java:612)
at dk.hkj.script.Script.expression(Script.java:1220)
... 41 more
In the attached file I have moved the model definitions to #metadef.
To add a new copy one of the #metadef sections and change the values according, test it and if it works, post the #metadef section here and I will include it.
Note: Remove the RidenDPH5005.txt file, it will interfere with this definition.
#metadef
#idString Riden,Riden DPS5005
#name Riden DPS5005
#handle DPS5005
#author aszasza + rachdatu
#replacetext ModelId 5005
#removeline 12A
#replaceText MaxCurrent 5.0
#replaceText MaxVoltage 50.00
#replaceText MaxOPP 265
#replaceText MaxOCP 5.2
#replaceText MaxOCV 51
With the second write, it's crashing:
For the DL24M-H:
With your new version the current glitches are gone, it works pretty well but the current lags by like 1-2 seconds, this is expected because of the filtering you do. I think this is a win! BUT, If I use the DL24M-H definition, setting the current still isn't working properly , but if I use the DL24P definition its all good. So my theory is that they have changed the protocol with the new firmvare, we need someone to confirm this. I'm looking at you vladobac :D
There is not supposed to be any lag, the retry is much less than a second.
The protocol is changed with the firmware and I know most of it, except I am not sure if I have the current setting correct yet.
I'm not sure about others but mine is certainly quite slow to respond. Also, and this is interesting, if I run TC in debug mode the lag seems to be much less :-// not that this is a problem its just interesting...
I don't want to update mine unless you ask me to, so I can't comment on the protocol...
Try logging at fast speed (0.01s) and then check the end of the table after a few minutes: What is the actual logging speed?
My bad, sorry. So, it turned out that the DPS5005 can only do 1 respond/2 seconds or so, while the DL24M-H (with DL24P config) does like 3-4 replies every second. I had both of them connected so the DPS slowed down TC.
The lag is just there when I have both of them running and reporting current values, on the chart the DPS values are coming in quicker for some reason that is why I thought that there is a lag...
Is there some kind of documentation how scripting works because I really like the battery test user script by Pukker (altough its not working for me for some reason), but I'd like to extend it so it can do n full cycle tests together with the DPS PSU and the DL24 load.
I mean, charge the battery fully with the PSU properly, full CC/CV cycle, wait some time, discharge the battery fully with the load, wait some time and charge it again and so on. All configurable of course. What do you think?
I think a LOT of people would find this very useful but I'm just too noob to be able to pull this off yet, but willing to learn. :)
A minor problem is only when entering the discharge current via the keypad via the setup menu TC 2.12. It only accepts divisible values or multiples of 1024. (anything with the format of the entered data?).
I wonder if the format of the data is changed.
Try attached device definition.
You can see what I have changed just below: #metaSection Protocol2
If it do not work correctly you are welcome to experiment with the next few lines, they are the ones used to set and read current (Anything starting with ; is ignored)
It works correctly with the DL25P, but the DL24M-H (updated) does not.
No adjustment can be made by adjusting this value (by dividing or multiplying by any coefficient). It is a nonlinear dependence. The problem is on the Chinese software. Only the creator of the Chinese program would be able to help.
But for me, this is a negligible problem. Most often I use one value of the discharge current, which I can easily set with the buttons on the display.
Before and after the upgrade
I am a bit sorry you upgraded, now you cannot test the new TestController where I try to filter a bit (By reading a extra time when value changes).
The filter works on both new and old protocol but the filter is only active on the current (I can add other values if needed).
http://lygte-info.dk/pic/Projects/TestController/TestController.jar (http://lygte-info.dk/pic/Projects/TestController/TestController.jar)
Try logging at fast speed (0.01s) and then check the end of the table after a few minutes: What is the actual logging speed?
My bad, sorry. So, it turned out that the DPS5005 can only do 1 respond/2 seconds or so, while the DL24M-H (with DL24P config) does like 3-4 replies every second. I had both of them connected so the DPS slowed down TC.
The lag is just there when I have both of them running and reporting current values, on the chart the DPS values are coming in quicker for some reason that is why I thought that there is a lag...
Other:
Is there some kind of documentation how scripting works because I really like the battery test user script by Pukker (altough its not working for me for some reason), but I'd like to extend it so it can do n full cycle tests together with the DPS PSU and the DL24 load.
I mean, charge the battery fully with the PSU properly, full CC/CV cycle, wait some time, discharge the battery fully with the load, wait some time and charge it again and so on. All configurable of course. What do you think?
I think a LOT of people would find this very useful but I'm just too noob to be able to pull this off yet, but willing to learn. :)
In the attached file I have moved the model definitions to #metadef.
To add a new copy one of the #metadef sections and change the values according, test it and if it works, post the #metadef section here and I will include it.
Note: Remove the RidenDPH5005.txt file, it will interfere with this definition.Code: [Select]#metadef
#idString Riden,Riden DPS5005
#name Riden DPS5005
#handle DPS5005
#author aszasza + rachdatu
#replacetext ModelId 5005
#removeline 12A
#replaceText MaxCurrent 5.0
#replaceText MaxVoltage 50.00
#replaceText MaxOPP 265
#replaceText MaxOCP 5.2
#replaceText MaxOCV 51
It works like this, all settings and voltage, current ect values are okay.
For the DL24M-H:
With your new version the current glitches are gone, it works pretty well but the current lags by like 1-2 seconds, this is expected because of the filtering you do. I think this is a win! BUT, If I use the DL24M-H definition, setting the current still isn't working properly , but if I use the DL24P definition its all good. So my theory is that they have changed the protocol with the new firmvare, we need someone to confirm this. I'm looking at you vladobac :D
With the second write, it's crashing:
You can get multiple "tx" for a single message, they are from different stages of the processing, the latest stage is from the COM port.
When using getElement() the input must be a string with a couple of values like: "34 45 67" then you select what number you need with getElement().
#cmdSetup multi Battery Parameters
:write: mytest ("\""+hex(getElement("0 1 2 3 4 5 6 7 8 9 10 11 12",value," "),4)+"\"")
combobox NiCd 0 NiMh 1 LiIo 2 LiPo 3 LiFe 4 Pb 5
combobox 1Cell 6 2cell 7 3cell 8 4cell 9 5cell 10 6cell 11 7cell 12
How do I read the second value of the multi combo with one (value) parameter?
Is there a second implicite value like value1 or something similar?
With the updated DL24M-H, I have so few outages that it's irrelevant to me.
And does it also filter voltage, capacity and energy?
Hi, do you plan to include the Owon BT35/41 handhelds?
Hi, do you plan to include the Owon BT35/41 handhelds?
No, but check my notes here: http://lygte-info.dk/project/TestControllerSupportedEquipment%20UK.html (http://lygte-info.dk/project/TestControllerSupportedEquipment%20UK.html)
Somebody else has made it possible to use the Owen meters in TestController.
I've found this Win10 based for any BLE controller, as they claim: https://github.com/jtcash/OwonB41T
PS: the question is whether those support several multimeters connected..
I fried the original DL24P board I have (my fault, shorted a serial line to 5V). I had to order a new one. The new one has a different arrangement for the bluetooth module (which I don't use anyway) but apart from that according to ATorch they should be identical.
Test Controller won't connect to it.
I can see from RealTerm the device is constantly sending:
> FF55010200000000000000000000000000000000000000000018000000003C0000000013
However no matter what I select in test controller, test controller doesn't attempt to ID it or respond to this signal. This seems to be another internal driver so I can't figure out what's happening?
Leave this with me though. I think it may have been more a user error problem.
Thanks though for your prompt response.
Added metadef for the DPS5015. Working.
Had wrong current setting (10 times to low)
Added metadef for the DPS5015. Working.
Had wrong current setting (10 times to low)
I included your definition and I have added CurrentScaleFactor to all current settings. That is reading the actual values, ISET, SCPICmd ISet & MI.
Please check the modified definition
Checked as you ordered sir. ;D
I also added CurrentScaleFactor to some settings left behind like OCP setting etc.
i.m.o. everything now correct.
Don't have one, but the definition for DPH5205? Should that be DPH3205? 32V / 5A
Couldn't find them on the internet, Riden official store also does not offer DPH5205
Was so crude to make that changes in the defenition file.
Made also some #removelines according the different specifications.
I will user your definition file, but I believe that some of the CurrentScaleFactor has to 1000
You also restored the values? command to use /1000, that cannot be correct when the iset and iout command uses the scale.
I wonder about the DPH5205, maybe it is a never version of the DPH5005 (The original filename). If the original author sees our discussion here he can chime in.
Tested all as far I know, works fine (DPS5015) exept the tab for Memory settings.
Settings made there working fine, exept when you call an desired Memory number from drop-down menu, then the actual voltage setting on the DPS goes wrong.
Stored memory settings are fine. In the main tab you can recall them perfect.
Checked as you ordered sir. ;D
I also added CurrentScaleFactor to some settings left behind like OCP setting etc.
i.m.o. everything now correct.
Don't have one, but the definition for DPH5205? Should that be DPH3205? 32V / 5A
Couldn't find them on the internet, Riden official store also does not offer DPH5205
Was so crude to make that changes in the defenition file.
Made also some #removelines according the different specifications.
I will user your definition file, but I believe that some of the CurrentScaleFactor has to 1000
You also restored the values? command to use /1000, that cannot be correct when the iset and iout command uses the scale.
I wonder about the DPH5205, maybe it is a never version of the DPH5005 (The original filename). If the original author sees our discussion here he can chime in.
Is this a known limitation of TestController or something that can be fixed?
It is a known bug and I will fix it when I get a couple of GPIB devices connected to TC.
For now you will have to use a AR488 for each device.
It's a DPH5005...probably I made a typo. There are so many different models.
As a suggestion, to allow you to debug your code, couldn't you trick TC into thinking you have multiple GPIB instruments in your personal lab by creating duplicate device entries? This would allow you to test the AR488/GPIB communications code without actually needing to have more than one instrument connected. Basically, something like the below. TC shouldn't know the difference - from it's perspective it's just alternately polling two devices - they just happen to have the same GPIB address. And the instrument itself shouldn't care (it doesn't know where the commands are coming from).
Thoughts - would this help you out?
I have decided to put in standby the definition file for my Hyperion charger. My main issue is to decode the CRC algorithm for this device.
I have decided to put in standby the definition file for my Hyperion charger. My main issue is to decode the CRC algorithm for this device.
Are you sure it is a CRC and not a simple checksum?
Got myself a brand new spanking Peaktech 2025A.
Operating it with TCs Peaktech 2025 driver displays
the selected range but no output data.
So it basically connects.
Putty output is (for 969 Ohms):
+0969 3!H
Repeated continuously.
CRLF is being used.
What needs to be done?
Here the codes for resistance:
Must stop for now. More tomorrow in hex mode
@HKJ
The settings screen that allows you to set current etc, when you select a DL24, is that hard coded or is it possible to customise one for a controller?
I'm trying to build my own electronic load and want to integrate it with test controller. I'm just wondering what the best way to do that is.
It seems the simplest way would be to emulate a DL24 and just add my controller as a meta.
Thanks for all your work.
SD
Earlier, I hadn't slept or eaten and probably made a balls of the setup which is why it didn't work with the standard DLP24 setup, it's working now.
Did you get your DL24P to work using the standard (PX100) protocol? How did you do it please?
This is for a frequency counter (Fluke PM6685). When I am in FREQ1 (frequency mode) or PER1 (period mode) I need to use Read? But when in TOT1 (count mode) need to use FETC:ARR? –1.
I tried below, but did not work.
#askValues [mode:FREQ1]Read?;[mode:TOT1]FETC:ARR?–1;
If you open the ATorchPX100Devices.txt file for the newest version of TestController you will see that each device has a Protocol1 or Protocol2 definition, changing the name will switch the protocol.
This is for a frequency counter (Fluke PM6685). When I am in FREQ1 (frequency mode) or PER1 (period mode) I need to use Read? But when in TOT1 (count mode) need to use FETC:ARR? –1.
I tried below, but did not work.
#askValues [mode:FREQ1]Read?;[mode:TOT1]FETC:ARR?–1;
It looks mostly correct, I believe you are missing a space before -1
Try checking you mode using:
=deviceMode(handle_in_quotes)
You can also use debug mode to see if the correct inquiry is sent to the device.
When the meter is asked for mode with FUNC?, it returns FREQ 1 for frequency and TOT 1 for counting. I then use #askModeMathFormat replace(value," ","") to remove the space so I can make it match with modes for #cmdMode.
Debug window then respond:
;; Found Fluke PM6685 on USB Serial Device (COM3) (COM3)
;; PM6685: Tx <FUNC?>
;; PM6685: Rx <"FREQ 1">
;; PM6685: Rx after :readmath: replace(value," ","") <"FREQ1">
So all good.
Also a related questions, if 3 modes use READ? to get the data and 1 mode use FETC:ARR? –1 to fetch data, how is this best written? Can more than one mode be covered by one Mode= statement or use one mode= for each mode?
Still try the
=deviceMode("PM6685")
command to check the internal TC value is correct.
You can list more modes with a comma between.
From Gossen Energy definition: #askValues VAL:L?[mode:Energy,Power];VAL:E?[mode:Power_Quality];mains:num?
As I do now, I measure frequency, period, pulse width, duty factor and count as different multimeter modes. Is there any way to do two or more modes at one time, so the meter swap between modes? Reading the Goosen Energy meter defintion I got some hint about this. Any more suggestions on where I can see more examples?
There is this more elegant way of doing by covering multiple devices in one file, but I did not figure that out, so just made a new file. Anyway one more device covered.
V1.0.2 This software is more advanced and it appears to allow the program to remotely set the device parameters such as current, cut of voltage, time etc. It also supports choosing the device type, and choosing protocol1/2. Using protocol1 reads data from the device but it does not control of the device. Using protocol2 does not read any data from the device or control the device. Reading the release notes of this software, it says: "This software is suitable for all DL24 DL24P DL24M series electronic load products before December 2021.", maybe after December 2021 they removed the more fully featured protocol1/protocol2 from the DL24 series of devices?
V2.0.1 This software is more basic and only allows sending remote button presses to the "+" "-" "Setup" "Start/Stop" buttons similar to the mobile app. This app displays the device data such as voltage/current, but it does not appear to correclty send button presses to the device.
Around December 2021 ATorch made a revision to the DL24 which incorporated the Bluetooth into the main PCB, instead of a soldered on module. Maybe when they did this, they removed all the older (more featured) protocols from the firmware to make space in the MCU for the Bluetooth stack?
Can anyone else tell us if they have a DL24P with integrated bluetooth module which they have found can be controlled from TestController?
Even a Bluetooth device must support a protocol behind the Bluetooth. If somebody finds the protocol I can work with them to implement it in TestController.
I am working to create a driver file for the Owon TAO3000 series of tablet oscilloscopes. Basically be able to log the measurements the scope does such as cycle rms, frequency, etc. This instrument supports SCPI so I though it would be simple. But, when returning values this instrument puts a characters before, after the number and includes units with no space after the number. Using Test Controller in Debug mode the below is a query, result showing the query returned format:
;; TAO3104: Tx <:measurement:ch4:squaresum?>
;; TAO3104: Rx <Vr : 959.3mA->>
CH4 on this scope is configured for a current probe hence the "mA" units for milliamps. Just putting the query in #askValues like
#askValues :measurement:ch4:squaresum?
Gives NaN NaN NaN Java errors. I then tried #askValueReadFormat
#askValuesReadFormat xu
and that got rid of all the Java Errors but always returns 0 for the value.
Can you suggest an #askValuesReadFormat that could work with this query returned format?
Also, how to handle the "m" as in milli to get the power of 10 correct? Would that be something in #value other than "D4"?
I'm working on the Keysight 34970A datalogger (via serial) as we speak :)
Asking a stupid question. I have installed your app but it seems it only wants to work with old school COM ports. I have Agilent 34461a which has usb2 out and goes to my pc usb2 in. I can read the port its a Keysight USB - Test and Measurement thing. It shows the DMM internal memory DATA1.csv and thats all. OBTW the note on your app says I need a FW update to 3.0 or more. (I am on 2.17 and I havent done this yet being wary of FW updates)
But some posts refer to a VCP virtual com port + s/w - these offerings look expensive $100
Can your app work with usb instruments - if so how?
Ive gpt an old XP laptop Acer still going strong after 20 years btw. it has a com printer port, would a physical USB to RS232 Serial Port 9 Pin DB9 Cable Serial COM Port Adapter Convertor £2.39 work? assuming your app is ok with XP (life was so much simpler back then)
When I download the latest from your website, I get v.2.12 instead of 2.19--you may want to update your download link.
Hi HJK
followed your info
connected LAN from 34461a (switched on LAN etc) to my modem router 192.168.0.1 Virgin hub 3
I find my dmm at 192.168.0.25 - and DMM reports link ok.
have I set up your app properly?
btw THIS IS WHAT DEBUG.BAT SAID
;; jSerialComm version: 2.9.1
;; Start thread for: COM3
;; Stopping thread for: COM3
;; COM3: Close
;; Start thread for: - Keysight 34461A
;; Start thread for: 192.168.0.25 - Keysight 34461A
;; Start thread for: 192.168.1.41 - Keysight 34461A
;; Stopping thread for: 192.168.1.41 - Keysight 34461A
;; Use "Load devices" page for selecting devices to load. Most devices will only load if they are connected and ready.
;; Stopping thread for: 192.168.0.25 - Keysight 34461A
;; Stopping thread for: - Keysight 34461A
Some notes to add to the Peaktech 2025A definition file "Peaktech2025A.txt"
Should fit nicely in the Notes window :):
Well thnx for trying and i followed your tips. I tried a direct lan link to my laptop no luck then I concluded that the lan on my dmm is not responding to dhcp from ny laptop and it wont accept manual IP setting. So this is too nerdy for me and would need a skilled it wizard who could check it properly. Sadly I cant go any further with this and will live with dl the internal mem csv via my usb and just squirt that inti an excel sheet. Bit clumsy and prone to blunders but I can live with it for now. Maybe an Arduino nerd will have dabbled here. I was surprised what you could do on a breadboard.
Is there a control in TC that would allow
Does nothing until you push the button
When you push the button it sends just :SYST:ERR?
After sending the query it displays the returned text string
Next time you hit the button it sends just :SYST:ERR? with no other text including not the previous text string
If there is no standardized way to do this we can work around it.
So, any suggestions on how to get TestController to send no argument on the write from the Set button click and still display the returned text?
Good suggestion. Really only want to do the read when clicking the button so the :write: really should be a no operation. I changed the write to
:write: *IDN? ("")
and all seems working now. I chose *IDN? since I did not know of a no opearation command to send and this one should have no side effects.
Not sure why the instrument did not like it before since sending
:SYST:ERR?;:SYST:ERR?
in TC's command line seems to work.
Thanks for your help.
Attached is the updated GW Instek ASR2000 device file to include in the next Test Controller release.
I have sometimes seen odd behavior before with TC when a write returns a value. Normally a write does not return a value but this instrument does not recognize :SYST:ERR without the "?"
I have a query:
One of our devices is an Itech IT8514C+ electronic load. While the included driver and definition file for this are reasonably comprehensive, there are a couple of functions I have found missing (specifically, set/read Von).
While I can implement this from SCPI, it would require me to write a whole new definition for the device, as the existing IT85xx driver uses frame/block communication. As far as I can understand, this is an "internal" driver - built into the .jar file - is that correct?
Is there any way for such drivers to be branched out into a separate directory structure or similar in future releases, so that they may be modified by end users? Or perhaps you could add these functions when you have the time?
I didn't have a copy of the ITech frame protocol handy, but have just downloaded it from their website (after registering etc).
I have attached page 31 which lists the Von frame codes for the IT8500 series. They appear to match the frame commands for the BK.
I have this 10 Channel 12 bit "ADC_10_F103C".
...
Maybe you want to include this item in TC.
When things cool down a bit, I will try to make a definition
based on the block driver.
Which definition might be a useful starting point for a modification?
Next I'll probably need your ascii floating point parser
(together with a few hints on how to configure it).
OK. Now running V2.23. But still in trouble :)
#rxStart 1 Reading should start with char 1
Got it! ADC10F103C now works with TC.
Definition file enclosed
@HKJ:Thanks formaking this happen.
You may either include this definition file in the mainstream definition file folder
or on your DIY page.
I found a small bug in the Siglent SDM3065X device profile, one of the resistance ranges were not correctly specified, it was setup as a 2MOhm range, when it is actually a 1MOhm, I have corrected the issue in the definition file, the updated file is attached.
Got it! ADC10F103C now works with TC.
Definition file enclosed
@HKJ:Thanks formaking this happen.
You may either include this definition file in the mainstream definition file folder
or on your DIY page.
I will include it.
One note about the chart:
Right click and select layout.
The select "Sync" page
Here you can combine all scales, to avoid using all the space on scales. Only caveat is that it messes up auto scaling (auto scaling works only on the master curve), use manual scaling to get around that.
(Attachment Link) Now to TC integration of the processor output for the BME 280 sensor:
Here the output:
Why does TC stop at this
;; COM5: Rx: <Ut:524288 Up:524288 Uh:32768> 55 74 3A 35 32 34 32 38 38 20 55 70 3A 35 32 34 32 38 38 20 55 68 3A 33 32 37 36 38
;; (COM5) Did not find any match for: Ut:524288 Up:524288 Uh:32768
;; COM5: Close
before it can go on reading?
Here a hex dump of the BME 280 output:
Definition file Ver 0.2 for ADC10F103C.
Added in "Notes" alternative designations for the ADC10F103C pcb.
Here a hex dump of the BME 280 output:
#idString BME280
#name BME280
#handle BME280
#port comfixedbaud
#baudrate 9600
#driver asciiblock
#rxStart Ut:
#rxEnd \r\n\r\n
#rxFormat .*?([0-9.E+-]+).*?([0-9.E+-]+).*?([0-9.E+-]+).*?([0-9.E+-]+).*?([0-9.E+-]+).*?([0-9.E+-]+).*?([0-9.E+-]+).*?([0-9.E+-]+).*?([0-9.E+-]+).*?([0-9.E+-]+)
#askValues Values?
#askValuesReadFormat xxxfxfxxfx
#value Temperature °C D2
#value Pressure hPa D3
#value Humidity % D3
Thanks for looking into this. However in debug (Test Controller V2.23) I still get:
The errors for ports other than COM3 and COM5 to which one each BME 280 sensor is connected are OK,
since these are not connected at the moment.
;; 676.97ms jSerialComm version: 2.9.1
;; 779.97ms Start thread for: COM3 - HKJ Test
;; 1389.23ms COM3: Set params: 9600
;; 1985.27ms COM3: Rx: 55 74 3A 35 32 34 32 38 38 20 55 70 3A 35 32 34 32 38 38 20 55 68 3A 33 32 37 36 38 0D 0A 54 65 6D 70 65 72 61 74 75 72 3A 20 20 20 20 20 20 20 20 32 30 2E 37 34 B0 43 0D 0A 4C 75 66 74 64 72 75 63 6B 20 36 34 62 69 74 3A 20 20 20 36 37 34 2E 39 38 36 68 50 61 0D 0A 4C 75 66 74 64 72 75 63 6B 20 33 32 62 69 74 3A 20 20 20 36 37 35 2E 32 34 68 50 61 0D 0A 4C 75 66 74 66 65 75 63 68 74 69 67 6B 65 69 74 3A 20 20 32 35 2E 39 35 31 25 0D 0A 48 F6 68 65 20 FC 62 65 72 20 4D 65 65 72 3A 20 20 33 32 39 37 2E 37 38 6D 0D 0A 0D 0A
;; 5096.99ms COM3: Rx: 55 74 3A 35 32 34 32 38 38 20 55 70 3A 35 32 34 32 38 38 20 55 68 3A 33 32 37 36 38 0D 0A 54 65 6D 70 65 72 61 74 75 72 3A 20 20 20 20 20 20 20 20 32 30 2E 37 34 B0 43 0D 0A 4C 75 66 74 64 72 75 63 6B 20 36 34 62 69 74 3A 20 20 20 36 37 34 2E 39 38 36 68 50 61 0D 0A 4C 75 66 74 64 72 75 63 6B 20 33 32 62 69 74 3A 20 20 20 36 37 35 2E 32 34 68 50 61 0D 0A 4C 75 66 74 66 65 75 63 68 74 69 67 6B 65 69 74 3A 20 20 32 35 2E 39 35 31 25 0D 0A 48 F6 68 65 20 FC 62 65 72 20 4D 65 65 72 3A 20 20 33 32 39 37 2E 37 38 6D 0D 0A 0D 0A
;; 5097.27ms COM3: Rx: 55 74 3A 35 32 34 32 38 38 20 55 70 3A 35 32 34 32 38 38 20 55 68 3A 33 32 37 36 38 0D 0A 54 65 6D 70 65 72 61 74 75 72 3A 20 20 20 20 20 20 20 20 32 30 2E 37 34 B0 43 0D 0A 4C 75 66 74 64 72 75 63 6B 20 36 34 62 69 74 3A 20 20 20 36 37 34 2E 39 38 36 68 50 61 0D 0A 4C 75 66 74 64 72 75 63 6B 20 33 32 62 69 74 3A 20 20 20 36 37 35 2E 32 34 68 50 61 0D 0A 4C 75 66 74 66 65 75 63 68 74 69 67 6B 65 69 74 3A 20 20 32 35 2E 39 35 31 25 0D 0A 48 F6 68 65 20 FC 62 65 72 20 4D 65 65 72 3A 20 20 33 32 39 37 2E 37 38 6D 0D 0A 0D 0A
;; 5097.49ms COM3: Rx: 55 74 3A 35 32 34 32 38 38 20 55 70 3A 35 32 34 32 38 38 20 55 68 3A 33 32 37 36 38 0D 0A 54 65 6D 70 65 72 61 74 75 72 3A 20 20 20 20 20 20 20 20 32 30 2E 37 34 B0 43 0D 0A 4C 75 66 74 64 72 75 63 6B 20 36 34 62 69 74 3A 20 20 20 36 37 34 2E 39 38 36 68 50 61 0D 0A 4C 75 66 74 64 72 75 63 6B 20 33 32 62 69 74 3A 20 20 20 36 37 35 2E 32 34 68 50 61 0D 0A 4C 75 66 74 66 65 75 63 68 74 69 67 6B 65 69 74 3A 20 20 32 35 2E 39 35 31 25 0D 0A 48 F6 68 65 20 FC 62 65 72 20 4D 65 65 72 3A 20 20 33 32 39 37 2E 37 38 6D 0D 0A 0D 0A
;; Found HKJ Test on Arduino Leonardo (COM3)
;; 5997.19ms COM3: Rx: 55 74 3A 35 32 34 32 38 38 20 55 70 3A 35 32 34 32 38 38 20 55 68 3A 33 32 37 36 38 0D 0A 54 65 6D 70 65 72 61 74 75 72 3A 20 20 20 20 20 20 20 20 32 30 2E 37 34 B0 43 0D 0A 4C 75 66 74 64 72 75 63 6B 20 36 34 62 69 74 3A 20 20 20 36 37 34 2E 39 38 36 68 50 61 0D 0A 4C 75 66 74 64 72 75 63 6B 20 33 32 62 69 74 3A 20 20 20 36 37 35 2E 32 34 68 50 61 0D 0A 4C 75 66 74 66 65 75 63 68 74 69 67 6B 65 69 74 3A 20 20 32 35 2E 39 35 31 25 0D 0A 48 F6 68 65 20 FC 62 65 72 20 4D 65 65 72 3A 20 20 33 32 39 37 2E 37 38 6D 0D 0A 0D 0A
;; 7001.15ms COM3: Rx: 55 74 3A 35 32 34 32 38 38 20 55 70 3A 35 32 34 32 38 38 20 55 68 3A 33 32 37 36 38 0D 0A 54 65 6D 70 65 72 61 74 75 72 3A 20 20 20 20 20 20 20 20 32 30 2E 37 34 B0 43 0D 0A 4C 75 66 74 64 72 75 63 6B 20 36 34 62 69 74 3A 20 20 20 36 37 34 2E 39 38 36 68 50 61 0D 0A 4C 75 66 74 64 72 75 63 6B 20 33 32 62 69 74 3A 20 20 20 36 37 35 2E 32 34 68 50 61 0D 0A 4C 75 66 74 66 65 75 63 68 74 69 67 6B 65 69 74 3A 20 20 32 35 2E 39 35 31 25 0D 0A 48 F6 68 65 20 FC 62 65 72 20 4D 65 65 72 3A 20 20 33 32 39 37 2E 37 38 6D 0D 0A 0D 0A
I now get in debug:
The problem in my case seems to be the unasked for IDN? request. I causes the BME 280 to
respond in a way TC cannot handle. Thus TC closes the COM port down. I suspect this automatic IDN?
query needs to be prevented in some way.
Dunno where this A preceding the C comes from.
Anyway. In the next few days I will send you by mail info on the
BME 280 sensor processing hardware schematic for your DIY page.
#rxFormat .*?([0-9.E+-]+)
Some documentation of this please.
#askValuesReadFormat xxxfxfxxfx
Some documentation of this please.
Dunno where this A preceding the C comes from.
The definition file must be in unicode with a BOM or TestController cannot select the correct character set for it. If you remind me when you send the stuff I can add it.Anyway. In the next few days I will send you by mail info on the
BME 280 sensor processing hardware schematic for your DIY page.
I look forward to it.
Sent files today (Aug. 14, 2022) via PM :)
Any chance of a dark theme? or the ability to customise GUI colours (other than the graph) my eyes don't do well with bright things :(
Fantastic program by the way. Especially now I've got a DMM6500 thank you for all your hard work!
Do I need to set a specific #driver value to talk to this device? Or, is there something else I am missing in the device driver file?
Hi, this is a follow up from message #2644.
I have spent some time with this Hyperion device. I have now the process to generate the checksum. This is what we suspected.
It is a SUM of the ASCII chars and the result is converted to HEX and appended to the data stream. You then have to add a leading 0x0c and a trailing 0x0d.
I have an idea about a dialog box; will start with something easy and short.
All the parameters must be sent in one command, even those that are not being modified. We just send default values.
That means we have to convert and concatenate the variables and calculate the checksum on the fly. I don't know if we have a function for that.
We have in some cases to apply multiplication/division factors but I know which parameters need a special process.
That's it for the moment. I have attached 2 screenshots for explanation. Hope that helps.
Thanks for the quick update.
Question: I understand that the unique Set button will send and update the different values to the device.
Will that be possible to add 2 or more buttons with different type of values (from the same dialog box) being sent to the device? See image.
I tried to setup my devices with TC most of them worked out of the box but I had a few issues with my Rigol DM3058E. This device has only serial connection and with my old firmware 02.03.01 you need to add the #eol \r\n to the Rigol DM30xx.txt then it worked. It seems to be accepted only in the global context not just for the 3058E.
Changing modes took very long (like 7 seconds) I could fix that by using a delay e.g. FUNC:VOLT:DC;[50] instead of [opc*].
Changing speeds although took very long and the read back does not work. I could fix this by changing the read rate e.g :read: [50];RATE:VOLT:DC?
Now everything works. Can you somehow include this to the generic Rigol DM30xx.txt file or should I make a seperate one and you delete metadef in the generic one?
I also added my Owon power supply P4603 and Owon Multimeter XDM3051 I used an existing file and created a new one. The files are attached.
Is there a reason why the #help tag loads files from the internet in your user directory, would it be a better to include the help in the device file directly?
If Java = JDK, and that's what TestController requires, then any reason to use OPEN JDK vs. Oracle Java?
;; jSerialComm version: 2.9.1
;; COM5: Set params: 115200
;; Start thread for: AR488 B:2 - Test 007
;; COM5: Tx: <++default.> 2B 2B 64 65 66 61 75 6C 74 0A
;; Found Test 007 on AR488 B:2
;; JB007: Tx <txrx? RD1>
;; COM5: Tx: <++addr 2.> 2B 2B 61 64 64 72 20 32 0A
;; COM5: Tx: <RD1.> 52 44 31 0A
;; COM5: Tx: <++read_tmo_ms 950.> 2B 2B 72 65 61 64 5F 74 6D 6F 5F 6D 73 20 39 35 30 0A
;; COM5: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM5: Rx: <NULL> 4E 55 4C 4C
;; JB007: Rx <NULL>
;; JB007: Delay: 500ms
;; JB007: Tx <txrx? RD2>
;; COM5: Tx: <RD2.> 52 44 32 0A
;; COM5: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM5: Rx: <NULL> 4E 55 4C 4C
;; JB007: Rx <NULL>
;; JB007: Delay: 500ms
;; JB007: Tx <txrx? RD3>
;; COM5: Tx: <RD3.> 52 44 33 0A
;; COM5: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM5: Rx: <19.888kHz> 31 39 2E 38 38 38 6B 48 7A
;; JB007: Rx <19.888kHz>
;; JB007: Delay: 500ms
;; JB007: Tx <txrx? RD4>
;; COM5: Tx: <RD4.> 52 44 34 0A
;; COM5: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM5: Rx: <NULL> 4E 55 4C 4C
;; JB007: Rx <NULL>
;; JB007: Delay: 500ms
;; JB007: Tx <txrx? RD5>
;; COM5: Tx: <RD5.> 52 44 35 0A
;; COM5: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM5: Rx: <19.889kHz> 31 39 2E 38 38 39 6B 48 7A
;; JB007: Rx <19.889kHz>
;; JB007: Delay: 500ms
;; JB007: Tx <txrx? RD6>
;; COM5: Tx: <RD6.> 52 44 36 0A
;; COM5: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM5: Rx: <219mV> 32 31 39 6D 56
;; JB007: Rx <219mV>
;; JB007: Delay: 500ms
;; JB007: Tx <txrx? RD7>
;; COM5: Tx: <RD7.> 52 44 37 0A
;; COM5: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM5: Rx: <NULL> 4E 55 4C 4C
;; JB007: Rx <NULL>
;; JB007: Delay: 500ms
;; JB007: Tx <txrx? RD8>
;; COM5: Tx: <RD8.> 52 44 38 0A
;; COM5: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM5: Rx: <NULL> 4E 55 4C 4C
;; JB007: Rx <NULL>
;; JB007: Delay: 500ms
;; JB007: Rx after :readmath: value=="whatever"?whatever:value <NULL NULL 19.888kHz NULL 19.889kHz 219mV NULL NULL>
;; JB007: Rx as numbers <0.0 0.0 19.888 0.0 19.889 219.0 0.0 0.0>
I have a test equipment where its units change according to their values. For example, mV becomes V above 300 mV, same for Hz becoming kHz, etc.
I need to apply a factor (1000 in this particular case) to be able to work with kHz and V before the values are displayed on the same line.
How can I solve this?
#askValuesReadFormat a list of what value to use and what value to remove
#askValuesMathFormat expression, input is called value
I know it may be too much to ask given what the program does already, but does it have some sort of scan feature for external scan cards?
I'm designing a scan card which will work with rs232 scpi and simple up-down-reset signals, is there any way to control this scan scard and ask the dmm for a measurement?
Even a simple "send a command on COM port before next measurement" would be extremely handy for me. Is there any way to do it?
I have a test equipment where its units change according to their values. For example, mV becomes V above 300 mV, same for Hz becoming kHz, etc.
I need to apply a factor (1000 in this particular case) to be able to work with kHz and V before the values are displayed on the same line.
How can I solve this?
There are two ways.Quote#askValuesReadFormat a list of what value to use and what value to remove
#askValuesMathFormat expression, input is called value
For ReadFormat see here: https://lygte-info.dk/project/TestControllerConfigDevice%20UK.html#readFormat (https://lygte-info.dk/project/TestControllerConfigDevice%20UK.html#readFormat)
MathFormat is the same as :readMath: for #scpiCmds, i.e. you can use any expression including parseSI() see here: https://lygte-info.dk/project/TestControllerFunctions%20UK.html#parseSI (https://lygte-info.dk/project/TestControllerFunctions%20UK.html#parseSI)
For performance reason (Mostly relevant if you are logging fast with many devices) it is best to use ReadFormat when it can do it.
I have uploaded a def. file for the Marconi 2955 radio communications test set. Some features have not been implemented.
You can look at the file for more info.
#scpiCmd SetParameterTest tx (value)
#cmdSetup combobox Battery_type Memory_Editor
:read:
:write: (hex(value))
NiCd 0
NiMh 1
LiIo 2
LiPo,LiMn 3
LiFe 4
Pb 5
#cmdSetup combobox Number_Cells Memory_Editor
:read:
:write: (hex(value))
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
#cmdSetup numberInt Capacity Memory_Editor
:read:
:write: (hex(((round(value/100))*100)))
mAh 0.1 5000
#cmdSetup set Update Memory_Editor
:write: SetParameterTest
Memory_Editor.Battery_type Memory_Editor.Number_Cells Memory_Editor.Capacity
;\x20
;; Hyperion: Tx <SetParameterTest 0000000B01F4>
java.lang.NumberFormatException: For input string: "0000000B01F4"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at dk.hkj.util.StringUtil.parseInt(StringUtil.java:584)
at dk.hkj.devices.DeviceBlock$TranslatingCommInterface.parseWriteString(
DeviceBlock.java:209)
at dk.hkj.devices.DeviceBlock$TranslatingCommInterface.writeRead(DeviceB
lock.java:471)
at dk.hkj.devices.DeviceBlock$TranslatingCommInterface.write(DeviceBlock
.java:554)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:316)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:365)
at dk.hkj.main.SCPICommand.write(SCPICommand.java:413)
at dk.hkj.devices.SetupFormats$SetField.localWrite(SetupFormats.java:511
3)
at dk.hkj.devices.SetupFormats$SetField.actionPerformed(SetupFormats.jav
a:5130)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour
ce)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
rivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
rivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
rivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
How to convert these strings (0000000B01F4) to something like this:
0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x42 0x30 0x31 0x46 0x34
How to convert these strings (0000000B01F4) to something like this:
0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x42 0x30 0x31 0x46 0x34
You need to do it for each item, but it is a bit hard.
To make it easier I have added this function:
bytesAsHex(item);
bytesAsHex(item,digits);
bytesAsHex(item,digits,reverse);
item: is any variable that is cast to bytes and then converted to 0xnn items in a string result.
digits: is number of bytes to show in the final string, when not present it will show the actual number of bytes.
reverse: reverse the byte sequence in the output string.
bytesAsHex(formatInt(a,8,8)); -> 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x31
bytesAsHex(a); -> 0x01
bytesAsHex(a,8); -> 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
bytesAsHex(a,8,1); 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01
You can get a new .jar file from here (It is version 2.27):
http://lygte-info.dk/customers/5/d/1/lygte-info.dk/httpd.www/pic/Projects/TestController/TestController.jar (http://lygte-info.dk/customers/5/d/1/lygte-info.dk/httpd.www/pic/Projects/TestController/TestController.jar)
You will need to use the delimiter option in the "Set" control.
Is it the usual location for downloading the new binaries because link seems to be broken.
It looks like the "cache is back" :)
Still getting the previous version, no matter if I clean my cache. By the way, if you own your web site, there are options to set the cache but that depends on your traffic...
Still version of yesterday
Now about the #checksum parameter. Do you have an example how I should use it?
#idString Test,006,
#name Test 006
#handle JB006
#port comfixedbaud
#baudrate 9600
#driver Block
#eol \r
#checksum sum16 hexhl 0 0
#scpiCmd updatetest tx (value)
; #### Memory_Editor tab ####
#cmdSetup combobox Store_in_Memory_# Memory_Editor
:read:
:write: ((hex(value)))
:buttontext: Store
1 1
2 2
3 3
4 4
5 5
#cmdSetup combobox Battery_type Memory_Editor
:write: ((hex(value)))
NiCd 0
NiMh 1
LiIo 2
LiPo,LiMn 3
LiFe 4
Pb 5
#cmdSetup combobox Number_Cells Memory_Editor
:write: ((hex(value)))
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
#cmdSetup number PB_Bat_Float_Voltage Memory_Editor
:read:
:write: (hex((round((value*100.0-442.0)/2.0)*2.0+442.0)/100.0))
:enable: (Memory_Editor.Battery_type !="0000") && (Memory_Editor.Battery_type !="0001") && (Memory_Editor.Battery_type !="0002") && (Memory_Editor.Battery_type !="0003") && (Memory_Editor.Battery_type !="0004")
V 4.42 4.60
;#cmdSetup set Update Memory_Editor
;:write: updatetest ((bytesAsHex("004E01",6,0))+" "+(bytesAsHex(value)))
;Memory_Editor.Store_in_Memory_# Memory_Editor.Battery_type Memory_Editor.Number_Cells Memory_Editor.PB_Bat_Float_Voltage
;\x20 not used
Do you have another solution to solve this issue?
Do you have another solution to solve this issue?
Because you do not have any :read: the values are empty at the start and that value is definitely different from all your specified values (It will probably match a empty string, i.e. "").
Do you mean reading data from the device? I think this is not going to help. The device doesn't know what type of battery is connected.
Maybe I didn't get what you meant.
Another possible solution is to create a tab for each chemistry with just a few parameters differing with different batteries. A lot of work and a lot of similar entries.
What do you think?
Do you mean reading data from the device? I think this is not going to help. The device doesn't know what type of battery is connected.
Maybe I didn't get what you meant.
Another possible solution is to create a tab for each chemistry with just a few parameters differing with different batteries. A lot of work and a lot of similar entries.
What do you think?
The missing :read: is not a problem, it just means that no initial value is obtained.
You need to include that option in your tests. Check out the displayVar function: https://lygte-info.dk/project/TestControllerFunctions%20UK.html#displayVar (https://lygte-info.dk/project/TestControllerFunctions%20UK.html#displayVar) it can be used in any expression and will show the current value of a variable. It will also make TestController fairly slow when using it, but that is usually acceptable when doing these test.
#idString Test,006,
#name Test 006
#handle JB006
#port comfixedbaud
#baudrate 9600
#driver Block
#eol \r
#checksum sum16 hexhl 0 0
#scpiCmd updatetest tx (value)
; #### Memory_Editor tab ####
#cmdSetup combobox Store_in_Memory_# Memory_Editor
:read:
:write: ((hex(value)))
:buttontext: Store
1 1
2 2
3 3
4 4
5 5
#cmdSetup combobox Battery_type Memory_Editor
:read:
:write: (displayVar((hex(value))))
;:write: (hex(value))
NiCd 0
NiMh 1
LiIo 2
LiPo,LiMn 3
LiFe 4
Pb 5
#cmdSetup combobox Number_Cells Memory_Editor
:read:
:write: ((hex(value)))
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
#cmdSetup number PB_Bat_Float_Voltage Memory_Editor
:read:
:write: (hex((round((value*100.0-442.0)/2.0)*2.0+442.0)/100.0))
:enable: (Memory_Editor.Battery_type !="0") && (Memory_Editor.Battery_type !="1") && (Memory_Editor.Battery_type !="2") && (Memory_Editor.Battery_type !="3") && (Memory_Editor.Battery_type !="4")
V 4.42 4.60
#cmdSetup set UPDATE Memory_Editor
:write: updatetest ((bytesAsHex("004E01",6,0))+" "+(bytesAsHex(value)))
Memory_Editor.Store_in_Memory_# Memory_Editor.Battery_type Memory_Editor.Number_Cells Memory_Editor.PB_Bat_Float_Voltage
;\x20 not used
However, I am still not getting what I have explained above: selecting "Pb" should unlock "PB_Bat_Float_Voltage" before doing anything with the "Set" button.
#port comfixedbaud GPIB
.....
if (port=="comfixedbaud")
#initCmd *RST;SYST:REM
else
#initCmd *RST
endif
Is something like this possible?
Is something like this possible?
Here is an updated file for the AgilentHP 663xB series. Additions:
- Can you use the software to log data from the Arduino serial port? If so, great! 8)
- Is it documented somewhere on which format you need to send the serial data from the Arduino?
- Can the software create time stamps of the data based on when it’s received, preferably in the sub-second (millisecond) region? That would be pretty helpful as you wouldn’t need to fiddle with an RTC on your device, and those libraries usually don’t report less than second resolution.
EDIT: Nevermind my questions, I found the Arduino documentation on the website :) I will look into it and play around. I guess the only thing that is still unclear is if there is sub second time stamp resolution, but I will find out by trying around.
#cmdSetup combobox Relay_Board Main
; This is used for activating the relay board option #760.
; Neither checkbox nor comboboxhot seem to work here
; Something has to be sent in order to call :update:, but it confuses the device so I do a *CLS afterwards.
: I have not found a way to persist that user choice. So you will have to select it every time you open the Setup popup.
:write: #;*CLS
:update: No_Relay_Board
:tip: Output Relay Board (#760) present?
Absent Absent
Installed Installed
#cmdSetup selector No_Relay_Board Main
Main.Relay_Board
; The name is like this because the name of this selector only shows up when disabled.
Absent
Installed Main.Output_Relay;Main.Output_Polarity_Reversed
What I can't figure out is how to setup TC to use the E5810A, so that TC can then talk to the devices.
1) is there a way to debug the what value is interpreted by a #cmdSetup selector?
I managed to feed a selector from a #cmdSetup combobox, but haven't managed to feed it from a #cmdSetup checkbox or #cmdSetup comboboxhot. But a combobox requires 2 clicks, and the two others don't.
2) is there a way to do a :write: with a fixed string? So without sending the value? I need to fire :update: from a control, which needs a write to function, but in reality I don't want to write, so a fixed string is better than "random" text which confuses the device, requiring me to do a *CLS afterwards.
3) is there a way to persist user choices between invocations of the setup popup? Is Mode the only way?
vxi_ip = "192.168.5.150"
instruments["R6581T"]=R6581T(ip=vxi_ip, gpib_address=22, lock=gpiblock, title="R6581T")
self.instr = vxi11.Instrument(self.ip, "gpib0,"+str(self.gpib_address))
self.instr.clear()
print("*IDN? -> "+self.instr.ask("*IDN?"))
print("TEMP? -> "+str(float(self.instr.ask(":SENSe:ITEMperature?")))+"˚C")
self.close_instr_conn()
[000] does not seem to work. Tried various forms.
About a cmd control driving a selector:
* one can debug the value sent to the selector but entering displayVar({page}.{control name}) instead of {page}.{control name}, on the "expression" line, the line just under the #cmdSetup.
* other functions like getExpression or match do not work there. They work in other situations, but cannot read from another control.
* :readmath: on the next line does not work
About the types of controls that drive the selector:
* combobox works as it should. Unfortunately for my use case, it is 3 clicks.
* checkbox sends "{text behind the checkbox}:{undefined number of spaces}{selected value}" to the selector, but that cannot be exploited since I do not have access to functions like match. No matter if :string: is added. The control does send the selected data via :write:
* comboboxhot sends "0" to the selector, no matter the selection. Otherwise, same as checkbox.
* radio sends "0" to the selector, no matter the selection. Otherwise, same as checkbox.
* slider sends nothing or empty string to the selector, no matter the selection Otherwise, same as checkbox.
* buttons sends nothing or empty string to the selector, no matter the selection. Otherwise, same as checkbox.
Can you look into this? It is not a blocker since combobox works, but it reeks like a (series of) bug(s) to me.
I have been playing around with it the past couple of days, I can talk to instruments using Python making use of the vxi11 system to specify the device by GPIB address, so if you can support vxi11 (if you don't already) that might mean that it can be used for a bunch of GPIB adaptors, as it seems pretty common.
It is not really bugs, but I will guess you are missing a :read: on the control. On most controls the variable will be updated when a value is returned from the device.
Changing the driver looks like a major enterprise, when I look at the files that use SCPIx. So I'm putting improving this (be it Mode or SCPIx) on my TODO list with "nice to have" priority.
Attached is the improved file, and I'll leave it to that for now. For me it is good to publish.
One remark: One cannot use #forceUpperCase with SCPIx, as then "none" will be translated to "NONE" and sent to the device, and then one must wait until a timeout. That looks like a bug, since #forceUpperCase is explicitly noted as something to use with SCPIx.
I downloaded the 2.28 version and see the E5810 option there, BUT it won't let me enter something like A:0 or A:22 in the ID field, it is not accepting the colon and stripping that out. so it ends up being A0 or A22.
I am keen to help you get this E5810A device up and running in TC.
It just occurred to me that when sending commands from python it included the GPIB interface and Device ids in its comms, such as “gpib0,22”, I didn’t see that in the comms from TC
Something is working, but I cant communicate with the DMM properly, I likely dont have the definition right as I have never done a GPIB def file.
using wireshark I can see TC is sending some commands to the E5810A, but im not getting a reply from the DMM, interestingly if I send a *IDN? from the command line in TC that doesn't get sent to the DMM, but I see a result in the window which matches the def file name, if I send READ? the DMM doesn't see it but I see it sent to the E5810A in wireshark.
I tried reading the info on the site relating to GPIB but there wasn't much said about it.
Attached is the file I am working on right now, most of it is commented out until I can get the basic comms working, maybe you can take a look and tell me what stupid mistakes I am making.
UPDATE:
It just occurred to me that when sending commands from python it included the GPIB interface and Device ids in its comms, such as “gpib0,22”, I didn’t see that in the comms from TC
#cmdSetup text Voc_List SAS_List
:write: LIST:SAS:VOC
:read: LIST:SAS:VOC?
:textwidth: 18
:tip: Enter comma-separated list of up to 512 Voc values
1000
LIST:SAS:VOC 64,63,62,61
;; E4360A: Tx <LIST:SAS:VOC 64,63,62,61>
LIST:SAS:VOC?
;; E4360A: Tx <LIST:SAS:VOC?>
;; E4360A: Rx <+6.400000E+01,+6.300000E+01,+6.200000E+01,+6.100000E+01>
;; +6.400000E+01,+6.300000E+01,+6.200000E+01,+6.100000E+01
LIST:SAS:VOC 64,63,62,61
;; E4360A: Tx <LIST:SAS:VOC 64,63,62,61>
LIST:SAS:VOC?
;; E4360A: Tx <LIST:SAS:VOC?>
;; E4360A: Rx <+6.400000E+01,+6.300000E+01,+6.200000E+01,+6.100000E+01>
;; +6.400000E+01,+6.300000E+01,+6.200000E+01,+6.100000E+01
Are there any known bugs with the text controls for device definitions?
Also, any suggestions on how best to tidy up the readback with :readFormat: or :readmath: ?
It returns each number in the comma-separated list in scientific notation, which isn't particularly human-readable. This would be straight-forward with a number field,
but I'm concerned I might have to try and shoehorn some standard java into the definition file to operate on an array or something!
#otherList
menuItem[0] = "Pull_DAC_Table.csv";
#otherData
var samples = 0;
var cmd = "CURR:DTAB:SAS?";
var currentTable = array(deviceRead(handle,cmd));
cmd = "VOLT:DTAB:SAS?";
var tempString = deviceRead(handle,cmd);
var voltageTable = array(tempString);
samples = countMatch(tempString,",");
tableInitHeader("index,Voltage,Current,Power");
var i;
for i = 0 to samples do
var v = voltageTable[i];
var c = currentTable[i];
var p = voltageTable[i] * currentTable[i];
tableAddRow(i,v,c,p);
i=i+1;
endfor;
chartx("Voltage");
chartCurves("Current","Power");
I'm trying to build all the necessary scripting/GUI so that my colleagues don't have to be fully versed in operating the software.
Below is the snippet that I'm working with - it all works except for the last two lines:Code: [Select]...
chartx("Voltage");
chartCurves("Current","Power");
Generally I will not recommend doing that from the device driver, but instead from a menu item.
If you really insist on putting it in the device driver you need to use, it uses the same #... commands as above:
runScript("#cmd");
or
runScript("#cmd1\n#cmd2\n#cmd3");
It was the runScript syntax that I was struggling with. Works really well now.
I still haven't gotten to working on the comma separated lists I mentioned previously. Trying my best to understand the use of #scpiCmd and #pgm#.
- On that note, is metadef limited to IDN? responses? *IDN returns the mainframe model number, but the module model numbers are returned by SYST:CHAN:MOD? (and then there's the option list which is another sub-set)!
Hi HKJ.
I ordered a replacement Atorch DL24M-H electronic load from China. However, the Chinese sent me an upgraded version of the DL24MP, which works on its own, but does not connect to the TC. I wrote to the Chinese that it wasn't working for me, so they sent me a communication protocol full of Chinese characters that mean nothing to me as a layman. You probably know from the last time you helped me that I don't know how to program, so I'm asking for your help again. I am connecting Chinese communication protocol. Thank you, Vladimir.
I tried adding it to ATorchPX100Devices and it didn't help. And that's probably the maximum of my programming skills.
Setting the cut-off voltage via the PC does not work well. For example, when I require a cut-off voltage of 1V, 25.6V is set on the load. It always sets to 25.6 times the set point on the load and I can't do anything about it.
There is a non-linear error when setting the current with Protocol1. For example, I require 200mA, the load is set to 20mA. But when 1000mA is required, 256mA is set on the load. When 10A is requested, 2.56A is set on the load. Up to 1A, 0.1 times the desired value is set on the load, and from 1A it is 0.256 times. With Protocol2, the error is 10x larger, but the nonlinearity remains.
The load should also be able to be switched on, off and reset the measured values via the PC. Reset and shutdown work (discharge of the load occurs when any On/Off button is pressed). Switching on the load via PC does not work with any button.
I am still in contact with the Chinese store Atorch. I have something to ask them that would help us eliminate the mentioned problems. Well thank you.
If you have time, incorporate it into your program, because after modification with #PXVersion 3, it is not backwards compatible. I have 3 versions of Atorch loads at home, DL24P, DL24M-H with updated software and now also DL24M. I can then try it with all three.
Next maybe to add FFT and THD ?
For slow multimeters - equivalent sampling may do the job
That is, except for one detail. The ON button does not yet work on the DL24M. The load must be turned on manually with the button on the load display. I can't solve that yet.
Please incorporate these changes into your program and I hope this helps someone. I am very satisfied with your TC so far.
I am trying to communicate with your program the UD24 (https://pl.aliexpress.com/item/1005001468417961.html?spm=a2g0o.store_pc_promotion.promotePruductList_2003982463021.10)device from ATORCH.
As it is not listed I selected ATORCH USB and it looks like some communication is taking place. The "Current values" tab shows the parameters I am interested in, but there is a problem reading the values.
The "Commands" tab still displays -> ATUSB: Rx as numbers <No data (timeout?)>
What should I check/change in order to be able to read the values in real time?
Removing *dd made no change. Insert #scpiCmd on tx 1 (value?0xffffffff:0)
will cause the On button to be completely disabled. It worked before, but incorrectly, because it turned off the load instead of turning it on. We don't want that. So the change is having an impact, but we still need it to kick in.
None of the following will help you:
;; jSerialComm version: 2.9.1
;; Start thread for: COM59 - ATorch USB
;; Start thread for: COM1
;; Start thread for: COM2
;; Start thread for: COM60
;; Stopping thread for: COM59 - ATorch USB
;; COM59: Close
;; Stopping thread for: COM60
;; COM60: Close
;; COM1: Set params: 9600
;; COM2: Set params: 9600
;; COM59: Rx: FF 55 01 03 00 02 07 00 00 00 01 4B D1 00 00 00 45 00 00 00 00 00 14 00 AD 09 2B 14 00 00 00 00 00 00 00 3C
;; COM1: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM2: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM59: Rx: FF 55 01 03 00 02 07 00 00 00 01 4B D1 00 00 00 45 00 00 00 00 00 14 00 AD 09 2B 14 00 00 00 00 00 00 00 3C
;; COM1: Rx: timeout
;; COM2: Rx: timeout
;; COM1: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM2: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM59: Rx: FF 55 01 03 00 02 07 00 00 00 01 4B D1 00 00 00 45 00 00 00 00 00 13 00 AD 09 2B 14 00 00 00 00 00 00 00 33
;; COM1: Rx: timeout
;; Stopping thread for: COM1
;; COM1: Close
;; COM2: Rx: timeout
;; Stopping thread for: COM2
;; COM2: Close
;; COM59: Rx: FF 55 01 03 00 02 07 00 00 00 01 4B D1 00 00 00 45 00 00 00 00 00 14 00 AD 09 2B 14 00 00 00 00 00 00 00 3C
;; COM59: Rx: FF 55 01 03 00 02 07 00 00 00 01 4B D1 00 00 00 45 00 00 00 00 00 14 00 AD 09 2B 14 00 00 00 00 00 00 00 3C
;; COM59: Rx: FF 55 01 03 00 02 07 00 00 00 01 4B D1 00 00 00 45 00 00 00 00 00 14 00 AD 09 2B 14 00 00 00 00 00 00 00 3C
I don't know if I understood correctly, in debug mode it is currently as below.
Then RX responds in the same way over and over again
Nothing appears in the mentioned page.
Bingo, it looks like the values have started to display :)
By the way, some tabs are inactive with me (Chart, Histogram, Range). What does this depend on?
What should I do to log the change in e.g. current values over time?
I think I already see -> Log button :)
You found it and that also enabled the other tabs (You either need to log some data or load a CSV file to enable these tabs).I will ask about one more aspect.
Currently, readings of voltage and current values are limited to two decimal places but UD24 displays data to 5 decimal places.
Can the accuracy of the reading be easily extended?
#metaSection USB_DEVICE
#subDriver USB
#value Voltage V D4
#value Current A D4
#value Capacity Ah D4
#value Energy Wh D4
#value D_Minus V D4
#value D_Plus V D4
#value Power W D4
#askValues values?
; Format of answer: f=float, u=remove trailing letters, x=skip, *=Zero upper case values if this value is 0
#askValuesReadFormat ffffffxxf
Do zero values on the last two positions mean that the TC is not getting the right data from the device?
Or is it enough to change the format of answer?
However, I am still not getting what I have explained above: selecting "Pb" should unlock "PB_Bat_Float_Voltage" before doing anything with the "Set" button.
Use the debug mode (I.e. start the program with "testControllerDebug.bat" and watch the DOS windows for any error messages.
A easy way to check for a couple of string values in to use the function inList() https://lygte-info.dk/project/TestControllerFunctions%20UK.html#inList (https://lygte-info.dk/project/TestControllerFunctions%20UK.html#inList) it is shorter than a bunch of equal or not equal tests and easier to read.
;; JB002: Tx <GetTest? 0x0C 0x30 0x30 0x30 0x41 0x38 0x31 0x30 0x30 0x31 0x34>
;; COM43: Tx: 0C 30 30 30 41 38 31 30 30 31 34 30 31 46 46 0D
;; COM43: Rx: 0C 30 30 34 45 43 31 30 30 31 34 30 30 30 32 30 30 30 33 30 30 44 32 30 38 33 34 30 38 33 34 30 45 37 34 30 30 30 30 30 30 33 32 30 30 36 34 30 31 32 43 30 30 30 30 30 30 30 30 30 30 30 30 30 34 36 35 30 30 30 30 30 30 30 30 30 30 33 43 30 46 37 35 0D
;; Rx 20 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
;; JB002: Rx <20 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4>
What am I doing wrong?
What am I doing wrong?
Only use / once to start format specifications:
/7h4 /11h4 /15h4 /19h4 /23h4 /27h4 /31h4 /35h4 /39h4 /43h4 /47h4 /51h4 /55h4 /59h4 /63h4 /67h4 /71h4 /75h4
/ 7h4 11h4 15h4 19h4 23h4 27h4 31h4 35h4 39h4 43h4 47h4 51h4 55h4 59h4 63h4 67h4 71h4 75h4
Starting
;; jSerialComm version: 2.9.1
;; Start thread for: COM43 - Test 003
;; COM43: Set params: 9600
;; Found Test 003 on Toshiba Bluetooth (COM43)
;; JB003: Tx <GetTestA?>
;; JB003: Rx Timeout
Exception in thread "AWT-EventQueue-0" dk.hkj.script.ProgramExceptions$UnknownEx
ception: Variable not found CurrentValueA
(getElement(CurrentValueA,____<----____0,"[ ]"))
at dk.hkj.script.Script.getVar(Script.java:73)
at dk.hkj.script.Script.parseValue(Script.java:281)
at dk.hkj.script.Script.parseBitOp(Script.java:316)
at dk.hkj.script.Script.parseProduct(Script.java:388)
at dk.hkj.script.Script.parseSum(Script.java:470)
at dk.hkj.script.Script.parseCompare(Script.java:525)
at dk.hkj.script.Script.parseLogical(Script.java:561)
at dk.hkj.script.Script.parseQuestionMark(Script.java:587)
at dk.hkj.script.Script.parseExpression(Script.java:612)
at dk.hkj.script.Script.parseParamList(Script.java:123)
at dk.hkj.script.Script.parseValue(Script.java:267)
at dk.hkj.script.Script.parseBitOp(Script.java:316)
at dk.hkj.script.Script.parseProduct(Script.java:388)
at dk.hkj.script.Script.parseSum(Script.java:470)
at dk.hkj.script.Script.parseCompare(Script.java:525)
at dk.hkj.script.Script.parseLogical(Script.java:561)
at dk.hkj.script.Script.parseQuestionMark(Script.java:587)
at dk.hkj.script.Script.parseExpression(Script.java:612)
at dk.hkj.script.Script.parseValue(Script.java:239)
at dk.hkj.script.Script.parseBitOp(Script.java:316)
at dk.hkj.script.Script.parseProduct(Script.java:388)
at dk.hkj.script.Script.parseSum(Script.java:470)
at dk.hkj.script.Script.parseCompare(Script.java:525)
at dk.hkj.script.Script.parseLogical(Script.java:561)
at dk.hkj.script.Script.parseQuestionMark(Script.java:587)
at dk.hkj.script.Script.parseExpression(Script.java:612)
at dk.hkj.script.Script.expression(Script.java:1220)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:323)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:339)
at dk.hkj.devices.SetupFormats$ComboboxField.syncValue(SetupFormats.java
:3483)
at dk.hkj.devices.SetupFormats.syncAll(SetupFormats.java:308)
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 javax.swing.Timer.fireActionPerformed(Unknown Source)
at javax.swing.Timer$DoPostEvent.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
rivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
How to get rid of it?
Another question: these parameters are read by sending the memory address (ex: 1 ; can go up to 20) together with a command (always the same).
It would be much faster to update the different fields if I could concatenate the command and the address like this:
:read: GetTestA? ((bytesAsHex("\x0c",1,0))+" "+(bytesAsHex("000A81",6,0))+" "+ The memory address here /7h4
:read: GetTestB? ((bytesAsHex("\x0c",1,0))+" "+(bytesAsHex("000A81",6,0))+" "+ The memory address here /11h4
:read: GetTestC? ((bytesAsHex("\x0c",1,0))+" "+(bytesAsHex("000A81",6,0))+" "+ The memory address here /15h4
Etc.
Possible?
Hi HKJ,
Are there any quirks I need to be aware of when designating custom directories in the batch testController.bat file?
I seem to be able to define a custom directory for data and charts, but have not had any success designating a supplemental directory for devices.
It seems as though some custom directories work, and some don't.
I built Sairus cable for my BM869S and it works well with his software.
Is there any way to make this TestController software work with that cable? It Works only with RX through a USB-Serial adaptor. Includes a 12F683 pic that implements the protocol inside of it. Was checking the TestController software but for BM869S it uses USBHID per default.
I can no longer reach GPIB devices connected to a Prologix Ethernet interface with Test Controller. The debug window shows ";; jSerialComm version: 2.9.1" but nothing else.Have you listen the correct serial port in the address column, try pressing F2 to enter edit mode of the address column, then right click the mouse, it will list available serial ports.
Since I recently moved to a new computer, I am wondering if something is missing from the new set up. TestController works as expected on the new computer when talking to LXI and Socket connected devices; the problem is only with the Prologix Ethernet connected devices.
FWIW, I can telnet into the Prologix controller and verify that it is responding at the expected IP address, and also that it can talk to my 3 GPIB instruments. So things look OK at a hardware level.
What am I missing?
Hello,
Another solution is if you can post the hex (hex in ascii format, bot a binary hex dump) output for a couple of readings and list the actual range and values. Then I will see if I can adapt the existing driver to handle it.
I deleted the Prologix GPIB controller in the Load Devices page and re-installed it. Now it works as expected.I can no longer reach GPIB devices connected to a Prologix Ethernet interface with Test Controller. The debug window shows ";; jSerialComm version: 2.9.1" but nothing else.Have you listen the correct serial port in the address column, try pressing F2 to enter edit mode of the address column, then right click the mouse, it will list available serial ports.
Since I recently moved to a new computer, I am wondering if something is missing from the new set up. TestController works as expected on the new computer when talking to LXI and Socket connected devices; the problem is only with the Prologix Ethernet connected devices.
FWIW, I can telnet into the Prologix controller and verify that it is responding at the expected IP address, and also that it can talk to my 3 GPIB instruments. So things look OK at a hardware level.
What am I missing?
If it is on Linux the issue may also be access to the serial port.
This is HTML but had to rename extension to TXT.
I can provide other readings if this is the right methode.
It is nice to view, but not that easy to test. I wonder why byte 10 is missing?
Can you post a list of hex bytes, like: "33 44 55 66"
I can put that directly into a Arduino and use it for testing.
Below the Hex captures from the debug, and captured screens from the App from Sairus.
This interface cable is handy as with few euros one can implement the cable. I spent around 3 euros in Aliexpress plus programing pic plus soldering time. All done fits on well compacted form, even with through-holes. :)
From the other thread I believe multiple people implemented the same.
It would be great if it could work in your software as well.
Is it possible to modify the "indicator" control so that its state can be queried by other controls?
I am working on a new device file and this would be very useful for enabling some of the downstream controls.
V2.31 is up.
V2.31 is up.
...
Added: Support for Brymen BM869 with user made serial interface
...
This will probably be the last release in 2022.
There are some unexpected things on the debug screen:
- Even with all devices deselected, the Brymen info shows up.
- The five error lines at the bottom show up if I click "About" in the configuration page.
Now need to understand how to add secondary measurements. Seems only presenting primary ones.
Also need to understand how do display the scale with full resolution. :) As example I can only see 11 on the chart, but I am sure can be somehow changed to something related to the range of the values. -> (found it. Is just change the decimals in the scales).
If Not :
How easy I can be added, I know Java so I can participate in this if needed
V2.31 is up.
Fix of a some bugs and some additions.
Added: Variable for control indicator & indicatorInt
#cmdSetup indicator Trigger Ch2Setup
:read: :FUNC?
:string:
Coupled_to_Channel_1 match(unQuote(value),"TINT") green
:updatemodechange:
#cmdSetup radio Trigger_Level Ch2Setup
:read: :EVEN2:LEV:ABS?
:write: :EVEN2:LEV:ABS #
Auto 1
Manual 0
:enable: Ch2Setup.Trigger!=1
:updatemodechange:
I'm not having much luck with the indicator state variable.
A code snippet is below. While the indicator itself turns on and off as expected, the radio control below the indicator -- which should be enabled only when the indicator is off -- does not track the state of the indicator variable.
What am I missing?
Two points:Thanks for the tip about the "::" statement placement. I fixed that.
All :...: must be place before other parameters.
Use :enable: displayVar(split(getVarList(1),"\n"));" to see the actual value of the variables, it is not 1
:enable: Ch2Setup.Trigger!={string}match(unQuote(value),\x22TINT\x22)
But that triggered an error from Java, that looked like this:Exception in thread "AWT-EventQueue-0" dk.hkj.script.ProgramExceptions$InvalidException: <{> is not a valid token
Ch2Setup.Trigger!={____<----____string}match(unQuote(value),\x22TINT\x22)
at dk.hkj.script.Program.nextTokenWhiteSpace(Program.java:646)
at dk.hkj.script.Program.nextToken(Program.java:673)
at dk.hkj.script.Script.next(Script.java:102)
at dk.hkj.script.Script.parseCompare(Script.java:531)
at dk.hkj.script.Script.parseLogical(Script.java:561)
at dk.hkj.script.Script.parseQuestionMark(Script.java:587)
at dk.hkj.script.Script.parseExpression(Script.java:612)
at dk.hkj.script.Script.expression(Script.java:1220)
at dk.hkj.devices.SetupFormats.calcEnable(SetupFormats.java:344)
at dk.hkj.devices.SetupFormats.enableItems(SetupFormats.java:332)
at dk.hkj.main.PopupSetupSelection.initialSync(PopupSetupSelection.java:125)
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 javax.swing.Timer.fireActionPerformed(Unknown Source)
at javax.swing.Timer$DoPostEvent.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
:enable: Ch2Setup.Trigger!=match(unQuote(value),\x22TINT\x22)
Exception in thread "AWT-EventQueue-0" dk.hkj.script.ProgramExceptions$UnknownException: Variable not found value
Ch2Setup.Trigger!=match(unQuote(value)____<----____,\x22TINT\x22)
at dk.hkj.script.Script.getVar(Script.java:73)
at dk.hkj.script.Script.parseValue(Script.java:281)
at dk.hkj.script.Script.parseBitOp(Script.java:316)
at dk.hkj.script.Script.parseProduct(Script.java:388)
at dk.hkj.script.Script.parseSum(Script.java:470)
at dk.hkj.script.Script.parseCompare(Script.java:525)
at dk.hkj.script.Script.parseLogical(Script.java:561)
at dk.hkj.script.Script.parseQuestionMark(Script.java:587)
at dk.hkj.script.Script.parseExpression(Script.java:612)
at dk.hkj.script.Script.parseParamList(Script.java:123)
at dk.hkj.script.Script.parseValue(Script.java:267)
at dk.hkj.script.Script.parseBitOp(Script.java:316)
at dk.hkj.script.Script.parseProduct(Script.java:388)
at dk.hkj.script.Script.parseSum(Script.java:470)
at dk.hkj.script.Script.parseCompare(Script.java:525)
at dk.hkj.script.Script.parseLogical(Script.java:561)
at dk.hkj.script.Script.parseQuestionMark(Script.java:587)
at dk.hkj.script.Script.parseExpression(Script.java:612)
at dk.hkj.script.Script.parseParamList(Script.java:123)
at dk.hkj.script.Script.parseValue(Script.java:267)
at dk.hkj.script.Script.parseBitOp(Script.java:316)
at dk.hkj.script.Script.parseProduct(Script.java:388)
at dk.hkj.script.Script.parseSum(Script.java:470)
at dk.hkj.script.Script.parseCompare(Script.java:532)
at dk.hkj.script.Script.parseLogical(Script.java:561)
at dk.hkj.script.Script.parseQuestionMark(Script.java:587)
at dk.hkj.script.Script.parseExpression(Script.java:612)
at dk.hkj.script.Script.expression(Script.java:1220)
at dk.hkj.devices.SetupFormats.calcEnable(SetupFormats.java:344)
at dk.hkj.devices.SetupFormats.enableItems(SetupFormats.java:332)
at dk.hkj.main.PopupSetupSelection.initialSync(PopupSetupSelection.java:125)
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 javax.swing.Timer.fireActionPerformed(Unknown Source)
at javax.swing.Timer$DoPostEvent.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
:enable: Ch2Setup.Trigger!="TINT"
That gave no Java error, but the :enable: does not change states.]
But still no luck with the :enable: logic.
.on for color turned on.
#cmdSetup indicator Trigger Ch2Setup
:read: :FUNC?
:string:
:updatemodechange:
:update: Ch2Setup.Trigger_Level
Coupled_to_Channel_1 match(unQuote(value),"TINT") green
#cmdSetup radio Trigger_Level Ch2Setup
:read: :EVEN2:LEV:ABS?
:write: :EVEN2:LEV:ABS #
:enable: Ch2Setup.Trigger.on!=1
Auto 1
Manual 0
Any suggestions to try?
Thanks, HKJ.Sounds like a good solution.
No hurry, so I'll just wait until you resume updating TC after the New Year.
I hope this updated jar file fixes your problem (It is V2.33):
One last question about the indicator control: is it possible to suppress the display of either the control label or the parameter text field?
May I recommend for the "Current values" display, user definable background colours.
Might help readability in the case shown below where it would be of advantage to highlight every third line.
I'm working on a Mac platform. I've downloaded the app and Java. The app seems to open properly though I can't load any test device. I've also connected the ET5410 to the Mac using a USB cable but am failing at adding a device. I see that there is a folder full of devices in the Test Controller app folder, but I'm unsure what to do with these. I tried loading the ET5410A.txt file in the first page but that doesn't do much. In the "Load Devices" section, I tried following the instructions on the App's website but I can't seem to find out how to load the device. The Load Device page stay blank/empty and the little pull-down menu in the lower left corner never shows any option.
May I recommend for the "Current values" display, user definable background colours.
Might help readability in the case shown below where it would be of advantage to highlight every third line.
I do not really understand you. Every fourth line is a different color to make it easier when many lines are shown, I use that on most table displays.
tty.usbserial-1410
When I connect the device to the other USB port, the terminal command returns tty.usbserial-1420
. So I imagine my USB serial port numbers are either 1410 or 1420 depending on the USB port I chose. Neither seem to work on the Test Controller App and I keep getting this message when trying to reconnect the device:;; USB Serial (Dial-In) (tty.usbserial-1410) Device ET5420 do not match: ET5410A+,V1.00.2213.016,09702232111,V1.00.2213.016
;; Dummy Device ET5420 do not match: null,,,
I'm going to keep digging and see if I can find out more on USB serial number or device IP addresses on Mac. Thanks again for the help!
To clarify: I mean in this case highlighting each line beginning with "Temperature".
That would be every third line in this particular case.
Ok! made some progress, thanks!
Looks like the .JAR file I was using just wasn't fishing the .TXT files from the right folder. I copied the .TXT file for the ET5410A+ device in the device folder and it showed up in the pull down menu!
However, now I'm stuck at the serial port or IP address. I've done some research on pulling such info using Terminal (on Mac) and the closest I got to getting serial port information is something that resembles this:Code: [Select]tty.usbserial-1410
When I connect the device to the other USB port, the terminal command returnsCode: [Select]tty.usbserial-1420
. So I imagine my USB serial port numbers are either 1410 or 1420 depending on the USB port I chose. Neither seem to work on the Test Controller App and I keep getting this message when trying to reconnect the device:Code: [Select];; USB Serial (Dial-In) (tty.usbserial-1410) Device ET5420 do not match: ET5410A+,V1.00.2213.016,09702232111,V1.00.2213.016
I'm going to keep digging and see if I can find out more on USB serial number or device IP addresses on Mac. Thanks again for the help!
;; Dummy Device ET5420 do not match: null,,,
Hi I was curious how you amassed so many supported meters?
Is there a central repository of specs that you scanned but not physically tested each one?
TC looks for the device files in two locations:
1) A subfolder to Jave working directory (This is supposed to be the directory where the .jar file is placed), called "Devices"
2) A subfolder to your home folder called TestController/Devices
When you are finished with troubleshooting I would be thankful if you can write a short text I can add to my install page:
lygte-info.dk/project/TestControllerInstalling UK.html (http://lygte-info.dk/project/TestControllerInstalling UK.html)
Try right clicking the mouse when you are editing the address field (You must be in edit mode, just selecting the field is not enough), this is supposed to show a list of serial ports.
I tried both USB options on both USB ports, I also checked and unchecked the "Scan serial port" just for the heck of it. Same issue...
Looks like both ports work, but you have selected the wrong device. Select a "ET5410A+" and try again.
The "Scan serial ports" is mostly for Arduino stuff, it will only work for devices at 9600 baud or without baud (Like ATMega32U4).
The ET5410A+ is the only .TXT file I copied into the device folder... There is a "note" about it that mentions the ET5410A+ identifies itself as an ET5420 (see attached screenshot).
In any case, I copied the "East Tester ET5420.txt" and "East Tester ET5410.txt" files into the device folder and they now show up in the pull-down list (thanks again for that tip by the way). I tried the same approach with the 2 additional devices and am getting the same messages.
I don't know why it says ";; Dummy Device ET5420 do not match: null,,,"
I have never been able to load a virtual device either by the way.
Now I remember, I got the ET5410A file from somebody where the ET5410A+ identified itself as ET5420. This bug has obvious been fixed in yours.
Try editing the ET5410A file and change:
#idString ET5420
to
#idString ET5410A+
Now I just have to learn how to create a load test of continuous 300W or so and have it plot the voltage graph.
Thanks for all the help.
The get anything on the chart you have to use the "Log" button.
You can use the "Setup" button to control the load.
For automatic tests (i.e. vary a parameter or stop on some condition) there are two entries in the "Popups" list.
Ok, I've played with many of the options within the "Setup" field, as well as "Popups" and I see things change on the screen of the load (including measuring the 14.142V on the battery), but I'm not able to make it start...
So far I've only clicked buttons and haven't done any sort of code/script.
The only thing I'm trying to do is to set a constant power load, start it and log a voltage/amperage chart until the battery is dead. I can get the logging to start, but the load doesn't seem to want to start pulling amps from the connected battery.
Press the "Input on" button at the bottom of the form is supposed to do it.
When doing it manually you setup the load to the desired power/current, start logging and then press the on button.
You might also be able to control the load directly on it, but in most devices this is disabled when using remote control.
The popup "Log Event" can do it automatic and stop at a specified voltage.
I have no idea if this specific device works correctly for all functions, the definition (That is the .txt file) is made and tested by another user, I do not have the load. And there may be other changes to the protocol than just the *idn? string.
If a command is changed you can type the new command to the load on the command line in TestController and later on modify the definition .txt file.
55 aa 01 0b f7 00 4c 01 11 01 ec 00 4d
24.7 33.2 27.3 23.6
55 aa 01 0b ef 00 e0 00 02 01 eb 00 c8
23.9 22.4 25.8 23.5
55 aa 01 0b 60 6d dd 00 ff 00 ee 00 a2
null 22.1 25.5 23.8
55 aa 01 0b 62 03 60 6d 60 6d 60 6d d7
86.6 null null null
55 aa 01 0b 2d 06 60 6d 60 6d 60 6d a5
158.1 null null null
p.s. so, "60 6d" -> 28000 -> 2800.0 C. Kind of max/impossible temperature and should be classified as NULL.If you could suggest me an example of an existing supported similar device for Test Controller, it would help me to develop/replicate support for my Tasi device.
Can this program be connected to SkyRC MC3000 ?
;; jSerialComm version: 2.9.1
;; Start thread for: COM4 - Agilent 34401A
;; COM4: Set params: 9600
;; COM4: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM4: Rx: <HEWLETT-PACKARD,34401A,0,10-5-2> 48 45 57 4C 45 54 54 2D 50 41 43 4B 41 52 44 2C 33 34 34 30 31 41 2C 30 2C 31 30 2D 35 2D 32
;; COM4: Tx <SYST:REM>
;; COM4: Tx: <SYST:REM.> 53 59 53 54 3A 52 45 4D 0A
;; COM4: Delay: 500ms
;; Found Agilent 34401A on USB-Serial Controller (COM4)
;; HP34401A: Tx <FUNC?>
;; HP34401A: Rx <"VOLT">
;; HP34401A: Tx <READ?>
;; HP34401A: Rx Timeout
;; HP34401A: Rx as numbers <No data (timeout?)>
;;+9.99999900E+00
;; HP34401A: Tx <READ?>
;; HP34401A: Rx Timeout
;; HP34401A: Rx as numbers <No data (timeout?)>
It does not read the data into Current values, it stops with Trig and Error, looks like something is wrongly set, any hint, plz?It does not read the data into Current values, it stops with Trig and Error, looks like something is wrongly set, any hint, plz?
When messing with Auto/Man/Trig on the meter it returns the correct voltage once in the debug window but with timeout/error and beep.
;; HP34401A: Rx Timeout
READ?
;; HP34401A: Tx <READ?>
;; HP34401A: Rx Timeout
READ?
;; HP34401A: Tx <READ?>
;; HP34401A: Rx Timeout
READ?
;; HP34401A: Tx <READ?>
;; HP34401A: Rx Timeout
;; jSerialComm version: 2.9.1
;; Start thread for: COM4 - Agilent 34401A
;; COM4: Set params: 9600
;; COM4: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM4: Rx: <+1.00000280E+01> 2B 31 2E 30 30 30 30 30 32 38 30 45 2B 30 31
;; USB-Serial Controller (COM4) Device HEWLETT-PACKARD,34401A, do not match: +1.00000280E+01
;; COM4: Close
;; Stopping thread for: COM4 - Agilent 34401A
;; COM4: Close
My meter is set for 100PLC, it means it sends the value back in 4secs.
When I power on the meter it is set to default 100PLC and 10V range and sends the voltage automatically (repeatedly) out with 4secs period.
It seems the meter has to be put in some specific state before the TC starts communication.. Or something like that..
I get the correct identification when I manually stop the meter with AUTO/MAN button on front panel (it lights Man Trig on the display), and then the TC init goes ok, but with subsequent voltage reading issues as described above.
With READ? I get Rx Timeout in about 10secs..
PS: it looks to me the DTR/DSR does not work here properly.. I know from past the DTR must be set to a value in order to send the data repeatedly..
e) when I power-on the meter, it sends data automatically out and the TC has problem to identify it, so several tries are needed..
What would help is to add some more retries during the initial phase or longer timeouts, such it gets the right answer.
No idea how to switch off the sending data via default set rs232 i/o in the meter, I have to investigate..
If it is related to the 100NPLC setting then other users may not have seen it often (you'd have to set the meter to 100NPLC before trying to connect, though that is a totally valid setting with a stock meter!).
Note that TestController also gets confused when it asks a 34401A what mode it's in and gets "TEMP" as a reply :P
Might need to make some additions to the definition for the "enhanced" 34401A, maybe call it 34401A+ or something?
(for those who didn't see the thread, later 34401A FW revisions support a few hidden features such as settings-recall on boot and temperature measurement, with razvan784 finally finding the magic incantations for closed-case unlock here: https://www.eevblog.com/forum/testgear/hp-agilent-34401a-hidden-menu/msg4559242/#msg4559242 (https://www.eevblog.com/forum/testgear/hp-agilent-34401a-hidden-menu/msg4559242/#msg4559242) - ONLY try these on FW 07-xx-yy and later though, at least until you have an EEPROM backup or read the rest of the thread!)
..After power-on the meter does 100NPLC here (I changed that from 10NPLC via hidden menu), and when the HP-IB address is set to 31 "Talk only" it sends results via RS232 continuously out (i/o set to rs232). This "talk only mode" I've been using with my stm32 interface.No idea how to switch off the sending data via default set rs232 i/o in the meter, I have to investigate..Maybe some of the people that uses TC with 34401A see this and can chime in.
After power-on the meter does 100NPLC here (I changed that from 10NPLC via hidden menu), and when the HP-IB address is set to 31 "Talk only" it sends results via RS232 continuously out (i/o set to rs232). This "talk only mode" I've been using with my stm32 interface.
With a different HP-IB address set in the rs232 mode it does not send results out without requesting the data via a command.
#askValues value?
#askValuesReadFormat sxx
;; +.0000000 V STBY
; " -2.00000mV STBY"
; "-2.000000 V STBY"
; " +0.00 C KSTBY"
; " -1.00 C JSTBY"
; " +829.40 C J "
However, I can use the program, I do it like this:
1. (the application is closed) I set the parameters manually in the electric load machine (not through the application)
2. I initialize the discharge or consumption process, manually, right at this moment I open the application and log the data, in this way I capture the data.
The bad thing is that in this way I lose about 1-3 seconds of data, while the application is open.
With the application I can configure the parameters of the discharge, but I don't know how to initialize the test, since the machine is blocked.
My electric load machine East Tester ET5410A+
HKJ, I'm amazed at your patience for answering question after question : )
If I too can impose on your time : I'm working on adding support for Xitron 2000 calibrators (output V or I; measure V/thermocouple). Protocol is ascii; basic manual commands in a serial terminal work well.
I pasted my current device file here : https://bpa.st/UPAG6
The only thing that works is the Mode popup (V/I/T selector). Starting a log records empty readings (missing column), probably because my #askValuesReadFormat is broken.Code: [Select]#askValues value?
#askValuesReadFormat sxx
Testing the 'value' command manually does get a response from the unit :Code: [Select];; +.0000000 V STBY
Returned string has sometimes leading whitespace, sometims a m/u prefix, sometimes 'STBY'. Not sure how to handle all that. Examples (inside double-quotes)Code: [Select]; " -2.00000mV STBY"
; "-2.000000 V STBY"
; " +0.00 C KSTBY"
; " -1.00 C JSTBY"
; " +829.40 C J "
Next, I will need to send commands like "K00-12.1mVS" , where a float value is concatenated without spaces or separators between 2 strings.
To get columns you need something like:
#value VoltageDC V D6
If you add a parameter more it will only be shown when TC knows the device is in that mode and for that the #askMode command must work and return a string with the mode name.
I will recommend that you start TC in debug mode
The simple method is to use a # for the value, but to get SI prefix you need to use scripting:
("command"+formatSI(value)+"unit")
; this works :
#scpiCmd SET:TCtype tx ....
; this doesn't work :
#scpiCmd set_tctype tx ...
Understood. I already had a few lines like "#value VoltageSet V si V_generate" , but I have no "#askMode" because there is no way to query the current mode with this instrument... Unless maybe parsing the display string and look for the units character. But it's impossible to guess if it's Measure vs Generate.
QuoteI will recommend that you start TC in debug mode
I tried, but the tc.log file only contains "Starting" and nothing else, no matter what I do. Even running without the stderr redirect ">tc.log 2>&1" , I get nothing after that "Starting" entry.
QuoteThe simple method is to use a # for the value, but to get SI prefix you need to use scripting:
("command"+formatSI(value)+"unit")
Thanks, I got it working with " #scpiCmd SET:V tx ("K00"+formatSI((value))+"VS") " , for some reason it needed the double (( )) around value.
I also realized that defining a #scpiCmd needs to be in "XX:YY" format ?Code: [Select]; this works :
#scpiCmd SET:TCtype tx ....
; this doesn't work :
#scpiCmd set_tctype tx ...
Underscore has special meaning, it is replaced with a space.
:readmath: countMatch(value, "STBY")==1? "S":"O"
With your pointers I've been able to cobble up a functional implemention, published here :
https://github.com/fenugrec/xitron_tools/blob/master/hkj_testcontroller/Xitron2000.txt (https://github.com/fenugrec/xitron_tools/blob/master/hkj_testcontroller/Xitron2000.txt)
Have you considered maintaining a git repo just for device files, to make it easier to track changes / contribute ?
E.g. the file I made could be included as-is in your distribution, but I will change some minor things as I being using it... and others may want to add features I haven't needed yet, etc.
Other topic : I just learned indirectly that you can do conditionals likeCode: [Select]:readmath: countMatch(value, "STBY")==1? "S":"O"
I had previously looked for such a thing in the docs but couldn't find anything, is it documented somewhere?
we would like something like a regex [ ]?(.*)[ um][VACF].*
See attached updated definition, I've called it "HP/Agilent 34401A Enhanced", added some notes (for that option only) and a lot of stuff into the Temperature setup page.If it is related to the 100NPLC setting then other users may not have seen it often (you'd have to set the meter to 100NPLC before trying to connect, though that is a totally valid setting with a stock meter!).
Note that TestController also gets confused when it asks a 34401A what mode it's in and gets "TEMP" as a reply :P
Might need to make some additions to the definition for the "enhanced" 34401A, maybe call it 34401A+ or something?
(for those who didn't see the thread, later 34401A FW revisions support a few hidden features such as settings-recall on boot and temperature measurement, with razvan784 finally finding the magic incantations for closed-case unlock here: https://www.eevblog.com/forum/testgear/hp-agilent-34401a-hidden-menu/msg4559242/#msg4559242 (https://www.eevblog.com/forum/testgear/hp-agilent-34401a-hidden-menu/msg4559242/#msg4559242) - ONLY try these on FW 07-xx-yy and later though, at least until you have an EEPROM backup or read the rest of the thread!)
You are welcome to extend the definition and add a enhanced meter to it, please post the result here.
To add temperature you need to add these two lines to the definition:
#value Temperature C d1 Temperature
#cmdMode Temperature TEMP
CONF:TEMP;[500]
And
#remove #cmdMode Temperature
to the two existing #metadef sections, to avoid a temperature selection in the current meters.
and make a copy if one of the current #metadef section and change the name to the enhanced model.
I do not know if CONF:TEMP; if correct.
Note: Two people has worked on this definition and neither has said anything about connect problems due to meter outputting data.
The "Out of memory error" is probably the reason for it running slow. My best guess is that you call some scripts recursively.
Try using #runscript without parameters, this is possible as long as you run your main script in background (#RUNSCRIPTASYNC).
None of my scripts are called recursively, but your suggestion did give me the idea to investigate potential variable scoping issues. Sure enough, a couple of my "child" scripts implicitly used a parent script's iterator variable instead of defining their own locally scoped iterator variable. It looks something like this:Code: [Select]#scriptScript MyParentScript
=var i = 0;
; iterate through an array using i...
#runScript MyChildScript1
; do some other things...
#runScript MyChildScript2
#return
;-------------------------------------------------------------
#scriptScript MyChildScript1
=i = 0;
; iterate through some other array using i...
; note that I failed to actually declare "i" here using "=var i = 0;" and TC doesn't complain about it,
; so MyChildScript must be using the "i" declared in MyParentScript above and, consequently,
; this script merely redefines "i" here.
#return
;-------------------------------------------------------------
#scriptScript MyChildScript2
=i = 0;
; iterate through yet another array using i...
; note the same issue with variable scoping as in MyChildScript1
#return
Once I corrected my variable scoping mistakes in a couple scripts, everything suddenly behaves properly and the whole script runs flawlessly. Cheers!
See attached updated definition, I've called it "HP/Agilent 34401A Enhanced", added some notes (for that option only) and a lot of stuff into the Temperature setup page.
Finally I'm having problems with text rendering, both in general (very poor text quality on graph axes - note this is with 125% hidpi mode in windows which might not help) and specifically when using "special" characters like the Omega for Ohms and the degrees symbol for Celcius. Weirdly it seems to work for the DMM6500 device but not the 34401A, and I can't see any reason for the difference. See attached screenshot of the Chart showing both problems (the "°C" thing happens also in the current values section and popup dialogues).
@HKJ
Is there a way to declare and call subroutines within a script, or is saving them as external scripts the best method?
=date(2023,02,01,16,05,00)
;; 20230401160500
FYI I found a bug in the date() function.
When providing a date to be encoded, it adds two months to the date.Code: [Select]=date(2023,02,01,16,05,00)
;; 20230401160500
Quick question about the Tenma 72-13210 (aka Korad KEL103) UDP network connection option - it doesn't seem to work on my Windows 10 machine (gives up connecting immediately, says "starting thread" and then "stopping thread" in the debug console), but does on a Linux laptop I tried. I tried running wireshark and nothing seems to be sent to the device at all by TestController when I tell it to try and connect. Is there anything I need to do to get it going on Windows? Cheers!
Great! Thanks.
A revised device file for the GW Instek GPP-4323 is available.Anything worthwhile changed in the new FW? Looks like you need a login to download it >:(.
This is compatible with the response to "*idn?", which changed in the latest firmware for the GPP-4323 (1.19).
No visible difference that I could see. For some reason Instek does not provide release notes, so there is no way to know what the changes were.A revised device file for the GW Instek GPP-4323 is available.Anything worthwhile changed in the new FW? Looks like you need a login to download it >:(.
This is compatible with the response to "*idn?", which changed in the latest firmware for the GPP-4323 (1.19).
Do you plan to add support for the HP 82357A USB to GPIB Converter?
;; Found Brymen BM869s on HIDv0820p0001
;; BM869: Rx as numbers <No data (timeout?)>
;; BM869: Rx as numbers <No data (timeout?)>
;; BM869: Rx as numbers <No data (timeout?)>
tom% java -jar TestController.jar
Starting
Mode not found
First off, thank you HKJ for making TC available to the community.
I am new to the forum and to this generation of logging multimeters. Still wrapping my head around TC scripting and configuration options.
macOS 12.6, x86_64. Brymen 869s, 869-PA firmware, USB.
We've finally got our Tonghui TH2830 to respond to serial RS-232 and return measurement readings (was returning all zeros) after numerous email exchanges with CS, turns out the NULL FIXTURE in the TOOLS menu needs to be OFF.
Now the task ahead is to try and include this LCR meter within so we can generate Impedance vs Frequency Plots for various components. Has anyone been successful getting the TH2830 or other Tonghui product working, or maybe other LCR meters?
Thank you. Unfortunate to need the resources of an entire OS or VM for one app, but I also completely understand.
I see in the About section "Uses hid4Jave to scan for HID devices (Could not get reading to work)," so sounds like the "can't read" behavior is not entirely unexpected. If I can find/make time, maybe I can dig into why hid4java won't work, or maybe look into http://usb4java.org/ (http://usb4java.org/)
Anyone have luck attempting to run TC on Mac using Wine? I made a quick effort to run the Brymen app in Wine, but it didn't even get to the point of recognizing the device.
I might be missing something: Is it possible to use the matchBitsList function as a formula on the math page? I've tried a few variations and it keeps getting disabled and highlighted in red.
I'm trying to return different short strings based on the bit specification to make it easier to write a script.
Practicing usage, I started with Parameter sweeping (in Constant Current mode) current set point from 0-1.0 amps in 100 steps while recording a battery voltage. I'm having a strange problem running parameter sweeps while logging..randomly TC reports Current and voltage dropping to precisely 0.00, then recovering to actual values. Please see attached Chart image, as well as Parameter Sweep popup windows images. The ET5410 LCD display does NOT show 0volts, 0amps but actual values. Any idea why TC is randomly recording 0, 0? I'm guessing there might be a USB communications collision, since log sampling interval >=10 seconds seems to mostly resolves the problem, but takes much time.
#cmdSetup number Set_I_
:read: CURR:CC?;
:readmath: trim(replace(value,"R",""))
:write: CURR:CC #;[300];
:tip: Set CC mode current value
Amps 0 40
:updatemodechange:
You might be able to ignore the problem by using the configuration "Delay timeout by x samples" and use a value of 1 or 2 for x.Looks like "delay timeout by x samples" was defaulted to 1 samples. Increasing to 2 samples seems to have reduced the 0.00 samples somewhat.
The actual problem may very well be a communication problem where the load has trouble with the intermixing of settings and readouts.does this mean 300ms delay until any other command is sent or received? For example, does this mean to receive the next log sample must wait a minimum of 300ms? I've been trying to avoid learning the scripting, is there to change [300] to [400] without running a script?
A check in the definition:Quote#cmdSetup number Set_I_Shows a 300ms [300] delay after setting a new current value, you can try increase that value and see if it helps
:read: CURR:CC?;
:readmath: trim(replace(value,"R",""))
:write: CURR:CC #;[300];
:tip: Set CC mode current value
Amps 0 40
:updatemodechange:
When looking for communication issues using debug mode may help show it, but be aware that debug mode may slow down the communication and this by itself can fix the issue (The code is written so debug in itself do not slow down the code by any significant amount, but the increased workload on the computer may).I'll wait on this approach for now. Thanks!
Looks like "delay timeout by x samples" was defaulted to 1 samples. Increasing to 2 samples seems to have reduced the 0.00 samples somewhat.
To see if I understand the expected behavior, does "Delay timeout by x samples" mean IF the ET5410 does not respond when values requested, then the previously received value will be recorded again? Does this configuration setting also apply when sending current (I) setting to ET5410?
If the requested value is not received, is the index incremented anyway? I'm asking because the 0.00 values can occur every other sample, even though Delay timeout = 3samples. Pls see attached chart, zoomed into timeout samples. I don't see any indication that the log skipped 3 samples (3 seconds at 1 sample/sec).
QuoteThe actual problem may very well be a communication problem where the load has trouble with the intermixing of settings and readouts.does this mean 300ms delay until any other command is sent or received? For example, does this mean to receive the next log sample must wait a minimum of 300ms? I've been trying to avoid learning the scripting, is there to change [300] to [400] without running a script?
A check in the definition:Quote#cmdSetup number Set_I_Shows a 300ms [300] delay after setting a new current value, you can try increase that value and see if it helps
:read: CURR:CC?;
:readmath: trim(replace(value,"R",""))
:write: CURR:CC #;[300];
:tip: Set CC mode current value
Amps 0 40
:updatemodechange:
QuoteWhen looking for communication issues using debug mode may help show it, but be aware that debug mode may slow down the communication and this by itself can fix the issue (The code is written so debug in itself do not slow down the code by any significant amount, but the increased workload on the computer may).I'll wait on this approach for now. Thanks!
The Block https://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html#Binary_with_fixed_communication_blocks_(Block) (https://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html#Binary_with_fixed_communication_blocks_(Block)) driver is perfect for this.
This driver is used for: "Devices\Mastech 6514.txt" and "Devices\ADC10F103C.txt"
But in both cases it is in is in streaming mode and you need to use polled mode, this means the configuration is slightly different.
socat PTY,link=/dev/ttyACM1,mode=777,group=dialout,unlink-close=0 TCP:localhost:23000,forever,interval=3
socat TCP-LISTEN:23000,reuseaddr,fork file:/dev/ttyUSB0,echo=0,b9600,raw
$ java -jar TestController.jar debugTime=2
Starting
;; 2326.15ms jSerialComm version: 2.9.1
;; 3286.83ms Start thread for: ttyUSB0 - Tasi TA612C
;; 4008.81ms ttyUSB0: Tx: AA 55 01 03 03
;; 4008.81ms ttyUSB0: Set params: 9600
;; 5060.36ms ttyUSB0: Tx: AA 55 01 03 03
;; 7336.41ms ttyUSB0: Tx: AA 55 01 03 03
;; 11048.25ms Stopping thread for: ttyUSB0 - Tasi TA612C
;; 11363.91ms ttyUSB0: Close
#idString TA612C
#name Tasi TA612C
#handle TA612C
#port comfixedbaud
#baudrate 9600
#driver block
#author Zalex
; Version 0.1 23-03-2023
#notes Other names: 4 Channels K/J Thermometer
#value Temperature C SI
#rxStart 0x55 0xAA 0x01 0x0B
#rxLength 13
#rxFormat 3u2 5u2
#poll 0xAA 0x55 0x01 0x03 0x03
#askValues values?
I'm not sure that "block" driver is working correctly in "pool" mode.
I need to get at least some sign that it's reading data or so, to be sure that I can work further with Values definitions and numbers parsing.
#rxStart \x55
If I define the value as "\x55\xAA" or "\x55 \xAA" or "0x55 0xAA" - neither does work.#idString TA612C
#name Tasi TA612C
#handle Tasi
#port comfixedbaud
#baudrate 9600
#driver block
#author Zalex
; Version 0.2 26-03-2023
#notes 4 Channels K/J Thermometer
#rxStart \x55
#rxLength 13
#rxFormat 4i2/10 6i2/10 8i2/10 10i2/10
#poll 0xAA 0x55 0x01 0x03 0x03
#value CH1 C D1
#value CH2 C D1
#value CH3 C D1
#value CH4 C D1
#askValues values?
;; Found Tasi TA612C on USB-Based Serial Port (ttyACM1)
;; 4228.94ms ttyACM1: Tx: AA 55 01 03 03
;; 4252.12ms ttyACM1: Rx: 55 AA 01 0B D5 00 D4 00 D4 00 D6 00 5E
;; 4302.34ms ttyACM1: Tx: AA 55 01 03 03
;; 4325.49ms ttyACM1: Rx: 55 AA 01 0B D5 00 D4 00 D4 00 D6 00 5E
;; 4375.71ms ttyACM1: Tx: AA 55 01 03 03
;; 4399.14ms ttyACM1: Rx: 55 AA 01 0B D5 00 D4 00 D4 00 D6 00 5E
A feature request - "Adjustable pool interval for Block driver".
Well, I'm using Block driver with poll mode. Request: 5 bytes, reply: 13 bytes.
TC does ~14 pools in a seconds: 20-25ms delay of device reply, 50 ms delay before next pool.
My Tasi device updates state with 2Hz frequency, so polling it with ~75ms interval is basically ~7 times more redundant that it makes sense. Also, TC is more busy by doing unnecessary work.
#rxStart do support multiple bytes, the Mastech would not work if it didn't.
I might add a adjustable delay with a default of 50ms (as it is now), but I do not see it as very important and slower poll has one minor disadvantage: The logged data may be slightly older.
I don't know how value "\x65\x14" for rxStart works for Mastech.
I've described cleanly that I've tried value as "\x55\xAA" or "\x55 \xAA" or "\x55\xaa" - any of these does NOT work in my case.
I've tried that carefully and twice, so I'm sure than 2 (or more) bytes does not work for me, while I'm sure what second byte is - 0xAA.
Maybe Mastech is sending those bytes with delay, so they being read and processes separately or so.
Also, rxStart accepts the byte only in format \x55, and does not work if specify it as 0x55.
"poll" is opposite - it accepts bytes only if format 0xAA 0x55, which is confusing why bytes in HEX have different format requirements for different params.
Hi Is there any chance that the ET5420+ Will be added in this software? (the New model, the ET5420, does not seem to be aviable any more :-(
How hard is it to do it by myself? What skills are needed?
How hard is it to do it by myself? What skills are needed?
Exception in thread "Scan ports" java.lang.ClassCastException: class dk.hkj.comm.SocketInterface cannot be cast to class dk.hkj.comm.SerialInterface (dk.hkj.comm.SocketInterface and dk.hkj.comm.SerialInterface are in unnamed module of loader 'app')
at dk.hkj.devices.DeviceBlock.getCommInterface(DeviceBlock.java:619)
at dk.hkj.main.InterfaceThreads$DeviceThread.<init>(InterfaceThreads.java:1391)
at dk.hkj.main.InterfaceThreads$ScanPorts.addDevicesSocket(InterfaceThreads.java:630)
at dk.hkj.main.InterfaceThreads$ScanPorts.run(InterfaceThreads.java:765)
Hi HKJ,
I'm hoping to use the Block driver to write a definition for an appliance that uses RS485. However I'm looking to use an RS485 to ethernet adaptor.
From what I can see in the debug window, it looks as though SocketInterface can't be used with the Block driver - is this the case?
Hmm...I must say that did not encourage me :-[
I think I skip the ET-4520.
Dont believe I have the skills, nor the time :(
But thanks for your (and others) reply!
For a SCPI LXI device I need to send the ascii text
C1:SWWV DIR,UP_DOWN
Note the underscore in the above is needed. Sent as shown the "_" is replaced by a space as expected.
So, I added an escape "\" before it. Unfortunately that did not work. Working in debug mode I got the following:
C1:SWWV DIR,UP\_DOWN
;; SDG2122X: Tx <C1:SWWV DIR,UPDOWN>
Note that in the actual transmitted message the sequence "\_" was reduced to no character instead of keeping the underscore.
Based on Test Controller documentation I was pretty sure \_ should work. That sequence is used in the SiglentSDGxxxxX.txt driver for the Siglent SDG2042X device I am talking to in the line
:write: C1:SWWV MARK\_STATE,#
So, what escape syntax do I need to use to get the underscore to actually be sent?
#cmdSetup radio Sweep_Direction Channel_1
:read: C1:SWWV?
:readmath: getElement(getMatch(value,"DIR,[^,]*(,|$)"),1,",")
:readformat: u
:write: C1:SWWV DIR,#
:string:
Up UP
Down DOWN
Up_Down UP\x5fDOWN
So, for a setup radio button how to get Test Controller to send actual text "UP_DOWN" and how to get the radio button to recognize this third state and populate the dot on the radio button properly?
I am trying to add a driver for a R&S NGU401, but can't figure out how to make it pick up my driver. It seems to be ignoring it.
What is the procedure to add new drivers/devices?
1. How do I use "emptyfield" ? I tried to use it with cmdSetup number, but it seems java crashes every time I try to use that
2. How can I read (float) numbers from text fields in the GUI to pass them along to the SMU ? I am trying to use:
cmdSetup multi Sweep_Range
number Vmin _ -20 +20
number Vmax _ -20 +20
number Points _ 0 100000000
I would like to assign default values to all those text (number)
fields (as float).
Has anyone had success to get GPIB to Lan gateway like Agilent E5810A to work with testcontroller?
There was some old mentions in the thread but nothing conclusive on how to get it work. Ideally I would want to add 2 multimeters and one frequency counter, which I all got to work with a Prologix GPIB to USB clone on testcontroller, but instead thought the E5810A so I can access them via lan and wifi in testcontroller.
txrx1 @0103
;; GTH225: Tx <txrx1 @0103>
;; COM10: Tx: 40 30 31 30 33 34 32 2A 0D
java.lang.NullPointerException
at java.lang.String.<init>(Unknown Source)
at dk.hkj.devices.DeviceAsciiBlock$TranslatingCommInterface.writeRead(DeviceAsciiBlock.java:277)
at dk.hkj.devices.DeviceAsciiBlock$TranslatingCommInterface.write(DeviceAsciiBlock.java:377)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:316)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:339)
at dk.hkj.main.DeviceInterface.doCommand(DeviceInterface.java:83)
at dk.hkj.main.CommandProcessor.processCommands(CommandProcessor.java:3039)
at dk.hkj.main.PaneCommand.processCommand(PaneCommand.java:1573)
at dk.hkj.main.PaneCommand.access$20(PaneCommand.java:1571)
at dk.hkj.main.PaneCommand$31.keyTyped(PaneCommand.java:904)
at java.awt.AWTEventMulticaster.keyTyped(Unknown Source)
at java.awt.Component.processKeyEvent(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
txrxn? 28 @0103
;; GTH225: Tx <txrxn? 28 @0103>
;; COM10: Tx: 40 30 31 30 33 34 32 2A 0D
java.lang.NullPointerException
at java.lang.String.<init>(Unknown Source)
at dk.hkj.devices.DeviceAsciiBlock$TranslatingCommInterface.writeRead(DeviceAsciiBlock.java:277)
at dk.hkj.devices.DeviceAsciiBlock$TranslatingCommInterface.write(DeviceAsciiBlock.java:407)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:144)
at dk.hkj.main.SCPICommand.writeReadDelay(SCPICommand.java:182)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:293)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:339)
at dk.hkj.main.DeviceInterface.doCommand(DeviceInterface.java:83)
at dk.hkj.main.CommandProcessor.processCommands(CommandProcessor.java:3039)
at dk.hkj.main.PaneCommand.processCommand(PaneCommand.java:1573)
at dk.hkj.main.PaneCommand.access$20(PaneCommand.java:1571)
at dk.hkj.main.PaneCommand$31.keyTyped(PaneCommand.java:904)
at java.awt.AWTEventMulticaster.keyTyped(Unknown Source)
at java.awt.Component.processKeyEvent(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
;; GTH225: Rx Timeout
Are there any known issues with the AsciiBlock driver at the moment? I'm able to send commands without issue, but as soon as I try to receive a response I get java exceptions.
The reason for the exception is a null answer, this probably is due to a timeout (i.e. no answer from the device).
The actual communication routine handles it, but the handling after the communication fails due to the null answer. In this instance it is the debug output that trips on the null answer, but it would have tripped a few lines later on the decoding, if you had not been in debug mode.
The reason for not seeing the answer may be a wrong end of line/packet format specification.
#idString GTH225
#name Giant Force GTH-225-20-CP-AR
#handle GTH225
#port comfixedbaud
#baudrate 9600
#driver AsciiBlock
#readingDelay 3
#rxEol *\r\n
#eol *\r
#checksum xor8 hexhl 0 0 0 0
#scpiCmd CLOCK? txrx1? @0103
I must be missing something really obvious. Any thoughts?
Try adding
#rxStart @
#rxEnd *\r\n
With this protocol Block may be a better driver than AsciiBlock, because you can easily pick values at specific positions in the message.
With Block you need these 3 commands:
#rxStart
#rxLength
#rxFormat
If we could get the Block/AsciiBlock drivers working with SocketInterface, that would be great!
Really truly appreciate this software and will be leaving a donation.
Just picked up a handful of the BM827s for our lab to use with TestController but am having difficultly getting TestController to see these meters. Have installed the drivers that came with the BU-86X interface kits and can confirm the meters can be read by the Brymen software. There seems to be something I'm missing for TestController. Have done a search but not found any troubleshooting information.
I have the type set to USBHID.
Is anyone able to lend some input?
Many thanks. Have some UT71As coming in that will hopefully get us up and running. Donation inbound!
Hi,
This is a copy of this thread https://www.eevblog.com/forum/testgear/why-testcontroller-software-can-not-find-my-gpp-4323-power-supply/?topicseen (https://www.eevblog.com/forum/testgear/why-testcontroller-software-can-not-find-my-gpp-4323-power-supply/?topicseen) since eevblog users suggest to post in here
My GPP-4323 has no Ethernet option, only USB and RS232, I have connected it with USB to my PC, and I can Detect it with a normal terminal program, like bray terminal, But Test Controller software can not detect and find it, what am I doing wrong?
I can detect and send commands to GPP-4323 with a normal termianl program
I bought an ET5410A+ instead as that was in the supported list.
Unfortunately it does not work with the program. It does not connect, instead theres a fault-message
with says that it does not math. (strangely it says that "ET5420 does not Match" even that I choosed the correct
model Et5410A+ Anybody else with a ET5410A+ with has sucess?
Hej,
your program is really awesome and works well with with the Metrahit "ENERGY" and Atorch "DL24P"
Did your plans progress to include the Metrahit "PM PRIME BT (ULTRA BT)"?
I do own a "PM PRIME BT" alongside with a "USB X-TRA".
If you need seomeone to test or some information, I am happy to help.
It looks like the USBHID interface has stopped working. I have not modified any code in the HID interface. there must be some other reason.
I will be looking at it, but it might take some time. If you can find a older version of TC try using that.
I have attached the start, i.e. the energy, but with the name changed. It is not a working Prime definition
Thanks for the template! :-+
I'll try to dig into it (if I can grasp it & find some spare time).
It looks like the USBHID interface has stopped working. I have not modified any code in the HID interface. there must be some other reason.
I will be looking at it, but it might take some time. If you can find a older version of TC try using that.
I've some experience in HID with Windows. So i remember that the HID data exchange can be implemented in the application in the two ways. You can parse the HID report received from the device entirely by your code, or you can use the system-provided helper APIs to parse the report to extract the data from the desired fields in the report. Each the way has its pros and contras. Just curious, which way you took with the TC.
By the way, your app seems well suited for drawing energy profile charts using the data from utility electricity meters. There are lots of vendor-specific protocols, but they're being replaced with the common framework, which is known as DLMS/COSEM. It's not officially public, and it can be looking a bit complex initially, but an open source implementations exists. What is your vision in that regard?
I have no idea why it does not work, I use a library for serial ports (See About page in TC) it works on multiple OS's and is generally stable.
Maybe one idea: Do the device echo the commands? TC do not like that.
Thanks HJK for the feedback, It would not echo back the commands, The device anser to *IDN? cokmmand is like this GW Instek,GPP-4323,SN:GEW895373,V1.19
So does TC search for a specific string? maybe this response has some additional charachters or info?
@ HKJ:
Do you also have interruptions while logging with the Metrahit Energy?
No matter how many data or period of time I choose I always have breakdowns, which are obviously not there in reality, as other meters like Brymen, Keysight or Fluke work just fine at the same usb port / setup...
(https://postimg.cc/rdgKMZTJ)
...and also METRAwin10 does not show these unforeseen interruptions?
(https://postimg.cc/NyTvx5Jr)
I would prefer using TestController, but I can live with METRAwin10, so that I don't have any expectancy, just asking as I have no other Metrahit DMM to compare, as it is probably more like this Brymen USBHID-thingy, because the Gossen USB-IR-Interface also does not run under linux itself in contrast to Keysight or Fluke, which are the best brands for linux users...
I have tested different setups with Win7, Win10, Linux with VirtualBox so far and always have this problem with TestController. As there is a "serial fixed baudrate" there is also no difference whether I keep the 9600 or change it to 38400 in the "settingsLoad.ini".
Does anyone else have similar issues?
[...]
ThanX & Cheers!
Interestingly I see the same dropouts (and spikes) as well - but only when I use the "USB X-Tra"
When I use the "IrDroid transceiver" (https://irdroid.eu/product/irdroid-usb-irda-transceiver-2/), I don't see any of these.
I verified this using the "MetraHit Energy" and "MetraHit PM Prime BT" and by swapping USB-Ports.
It is always the original "USB X-Tra" which creates those outliers.
Those outliers are not present in "MetraWIN 10"
Thanks HKJ for the update, would you please share some picture on how to use TC with serial port,so I can chekc If I made something worng, as I say before, I can send commands with a simple teriman by hand and the device would responde back.
Interestingly I see the same dropouts (and spikes) as well - but only when I use the "USB X-Tra"
When I use the "IrDroid transceiver" (https://irdroid.eu/product/irdroid-usb-irda-transceiver-2/), I don't see any of these.
I verified this using the "MetraHit Energy" and "MetraHit PM Prime BT" and by swapping USB-Ports.
It is always the original "USB X-Tra" which creates those outliers.
Those outliers are not present in "MetraWIN 10"
I have no explanation on why TC do it for that interface.
You can try adjust the "Delay timeout" setting on the configuration page, it might help:
(https://lygte-info.dk/pic/Projects/TestController/DocConfig/TimeoutHandling.png)
The fact that TC does not see your serial port in its scan seems suggestive.Thanks HKJ for the update, would you please share some picture on how to use TC with serial port,so I can chekc If I made something worng, as I say before, I can send commands with a simple teriman by hand and the device would responde back.
I do not know what to show picture of.
There is a few tricks in the baudrate setting:
- The baudrate can be any baudrate, but can also contain more parameters line: 19200O71Dr
- The D or d sets DTR high or low and R or r sets RTS high or low.
- The last letter can be H for DTR flow control (Windows only) or h or RTS flow control.
When working on getting a connection there are two ways to simplify getting a connection:
1) Let TC try settings and make a skeleton driver (Right click in the Filter field on the "Load devices" page and select "Create new SCPI device definition"
2) Use a ASCII device definition, it do not need any confirmation string on startup and this makes the command line into a serial terminal (You can switch to SCPI or SCPIx a bit later when the connection works).
I am using the counter in the single-shot mode, it takes one measurement in each logging interval.
I am using mouse-over tips (using the :tip: tag ) in the menu’s. For a few tips, I would like to divide a long line of text into 2 short lines (in other words, add a CR/LF halfway the line). I searched your documentation, but could not find the solution. How can I achieve this?
:tip: <html>Line 1<br>Line 2<br>Line 3
A couple of other html tags are supported (it is a very old version of html Java supports).The Racal-Dana 1998 has a twin model, the 1999. Only difference is that the Racal-Dana 1999 does not have the “Ratio B/A” function. And of course it returns “1999” when asked for the model name, instead of “1998”. So I added meta definitions, to make this configuration file also work for the Racal-Dana 1999.
But I do not have a Racal-Dana 1999 for testing, so I can not check if I did the #meta and #metadef statements right. Could you have a look if I did the meta definitions right?
Please find the preliminary version of the device configuration file below:
Racal1998-1999BETA.zip (https://www.miedema.dyndns.org/co/2023/racal1998/Racal1998-1999BETA.zip)
Is there a way to "pause" and "resume" logging?
When I "stop log" and then start again, the graph is cleaned - can this be avoided in some simple way?
With "enabled" you mean the checkbox in the "load devices" tab?
I tried to your suggestion with the "Delay timeout" setting in the configuration page to get rid of the dropouts, but it didn't do anything:
I am using the counter in the single-shot mode, it takes one measurement in each logging interval.
I do not believe that is a good idea, but if it is the only way, you have to use it.
Test controller can have multiple threads fetching data from a device (mostly they will coordinate the reading).
I am using mouse-over tips (using the :tip: tag ) in the menu’s. For a few tips, I would like to divide a long line of text into 2 short lines (in other words, add a CR/LF halfway the line). I searched your documentation, but could not find the solution. How can I achieve this?
I have not really done anything to support it, but Java has a trick to make multiline:Code: [Select]:tip: <html>Line 1<br>Line 2<br>Line 3
A couple of other html tags are supported (it is a very old version of html Java supports).
The Racal-Dana 1998 has a twin model, the 1999. Only difference is that the Racal-Dana 1999 does not have the “Ratio B/A” function. And of course it returns “1999” when asked for the model name, instead of “1998”. So I added meta definitions, to make this configuration file also work for the Racal-Dana 1999.
But I do not have a Racal-Dana 1999 for testing, so I can not check if I did the #meta and #metadef statements right. Could you have a look if I did the meta definitions right?
At first glance it looks correct.
If you want to see the final definition you can put this line:
#metaDebug save
below the #metadef tag, this will write the processed definition to disk.
Works perfectly! Thanks for your guidance!With "enabled" you mean the checkbox in the "load devices" tab?
With log enabled I mean you use the popup or a command to start it.
I tried to your suggestion with the "Delay timeout" setting in the configuration page to get rid of the dropouts, but it didn't do anything:
I have no idea why you have problems with this, have you tried reinstalling the serial driver. I have no idea if it will help, but it might be worth a try.
There is one issue remaining, a “beauty flaw”… (meaning: not essential, but would be nice to solve...)
The Racal-Dana 1998 puts the value of a finished measurement in a read-out buffer. This buffer is cleared when it is read out, or when a new measurement is started.
So, one has to first read-out the result of the previous measurement, and then trigger a new measurement. This is what the configuration file is doing with #askValues , and it works fine.
However, when something else reads out the buffer, (the “Current values” tab, or the “Readout” popup), this readout clears the buffer, so the buffer is empty when the logging routine tries to read out the buffer. This results in missing values in the logging table….
This is especially a problem because the counter is often used with long gate-times of 1 or 20 sec. (To get high resolution). And of course the logging interval has to be a bit longer than the gate-time.
With short gate times, there is time to take an extra measurement, but with these long gate-times there is not…..
First I tried to solve this by storing the measured value in a variable, which is subsequently read out by TestController. However, the problem is that TestController uses the same read-out command (#askValues) for the logging and the other read-out functions. And for the logging it is necessary to trigger the next measurement after the read-out with this command, which of course spoils it when used for the other read-out functions….
Is there a way around this?
A solution could be to use the values in the table for the other TestController read-outs (At the moment this only works when the table is updated rather fast, not with these slow logging intervals)
Hi HKJ,
I think I have found the problem with your program that does not detect my GPP-4323 Power supply over serial port, I have used Device Monitoring Studio to monitor the ongoing traffic from your TC software and the GPP-4323 and found that you first send these characters to detect the Power supply, *IDN? with a 0x0A character at the end, but you need to send 0x0A 0x0D so that the GPP-4323 would respond back, since I just do that in my terminal program and it would respond back, so How should we fix this? Does this mean you should update your TC program?
There is one issue remaining, a “beauty flaw”…I do not have a good solution to it.
Add a
#eol \r\n
to the definition
Thanks HKJ for the feedback,QuoteAdd a
#eol \r\n
to the definition
I'm new to your software, where should I add this, would you explain more?
Somewhere in the definition file.Would you please tell me exactly where in GPP4323 Definition file? thanks
Some results from the bench on how I established a serial connection to the GPP-4323 just now:QuoteSomewhere in the definition file.Would you please tell me exactly where in GPP4323 Definition file? thanks
;; jSerialComm version: 2.9.1
;; Start thread for: COM6 - GWInstek GPP-4323
;; COM6: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM6: Rx: <GW Instek,GPP-4323,SN:GET852000,V1.19> 47 57 20 49 6E 73 74 65 6B 2C 47 50 50 2D 34 33 32 33 2C 53 4E 3A 47 45 54 38 35 32 30 30 30 2C 56 31 2E 31 39
;; Found GWInstek GPP-4323 on USB-Serial Controller D (COM6) sn: SN:GET852000
Some results from the bench on how I established a serial connection to the GPP-4323 just now:QuoteSomewhere in the definition file.Would you please tell me exactly where in GPP4323 Definition file? thanks
First, configure the GPP-4323 for the desired serial parameters, using pp 99-100 of the manual for reference:Then perform the following steps:
- System->F1->F1->Fn. This selects the serial interface and brings you to the baud rate choice.
- I used 9600 baud, which was "F1" for the "Fn" shown above.
- F6-->F6->F6 to return to the home screen..
- Connect an RS-232-to-USB adapter to the PC.
- Connect a null modem between the two male 9-pin connectors.
- Start TestController with the Scan Serial Ports box checked. (Put COM3 in the list of ports to skip, as this is an internal management interface of the PC itself.)
- TC should discover the GPP-4323 and display something like this:
Code: [Select];; jSerialComm version: 2.9.1
;; Start thread for: COM6 - GWInstek GPP-4323
;; COM6: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM6: Rx: <GW Instek,GPP-4323,SN:GET852000,V1.19> 47 57 20 49 6E 73 74 65 6B 2C 47 50 50 2D 34 33 32 33 2C 53 4E 3A 47 45 54 38 35 32 30 30 30 2C 56 31 2E 31 39
;; Found GWInstek GPP-4323 on USB-Serial Controller D (COM6) sn: SN:GET852000
- You may need to change the baud rate of the GPP-4323 to match the serial port, or vice versa.
No need to add anything about #eol to the Device file; it works fine as is, as can be seen in the code listing above.
I hope this helps.
No need to add anything about #eol to the Device file; it works fine as is, as can be seen in the code listing above.Let me try to help one more time.
I hope this helps.
;; jSerialComm version: 2.9.1
;; Start thread for: COM7
;; COM7: Set params: 9600
;; COM7: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM7: Rx: <GW Instek,GPP-4323,SN:GET852000,V1.19> 47 57 20 49 6E 73 74 65 6B 2C 47 50 50 2D 34 33 32 33 2C 53 4E 3A 47 45 54 38 35 32 30 30 30 2C 56 31 2E 31 39
;; Found GWInstek GPP-4323 on USB2.0-Serial (COM7) sn: SN:GET852000
Thanks Hexley for the update, I have changed the USB baud rate to 9600 and it works, every other baud rate it does not work, But I can still use a separate terminal program to control it with higher baud rates by inputting SCPI commands by hand, also I have to modify the GWInstek GPP-4323.txt to be able to connect to TC program :palm:
I have changed #idString GW INSTEK,GPP-4323, to #idString GW Instek,GPP-4323,SN:GEW895373,V1.19
Can you test your USB connection with other baud rates?
Thanks HJK, Why it does not work with other baud rates? (maybe because it does not send \r\n) Also I have connected my Signal gen SDG2042X, But TC software only would allow to use one of the products? Is there a way to use my GPP4323 power supply and SDG2042X function gen both at the same time with TC software? if the answer is yes how?
A revised device file for the GW Instek GPP-4323 is available.HKJ - It appears that the modified Device File for the GPP-4323 that was submitted back in February was accidentally not included in the current release of TestController. The updated file supported the change to the ID string of the GPP-4323 that Instek made with their latest firmware release.
This is compatible with the response to "*idn?", which changed in the latest firmware for the GPP-4323 (1.19).
A revised device file for the GW Instek GPP-4323 is available.HKJ - It appears that the modified Device File for the GPP-4323 that was submitted back in February was accidentally not included in the current release of TestController. The updated file supported the change to the ID string of the GPP-4323 that Instek made with their latest firmware release.
This is compatible with the response to "*idn?", which changed in the latest firmware for the GPP-4323 (1.19).
Usually there is no problems running multiple devices from TC, it is designed to do that.How can I do that? Because the when TC connects to more than one equipment the setup button only shows on instrument controls. also the chart and histogram panels are always disabled, Can they be used with a power supply and Function gen too?
QuoteUsually there is no problems running multiple devices from TC, it is designed to do that.How can I do that? Because the when TC connects to more than one equipment the setup button only shows on instrument controls. also the chart and histogram panels are always disabled, Can they be used with a power supply and Function gen too?
The setup button is only for the selected device, use the button on the left to select another device.There is no button on the left? which one do you mean?
That would explain it. :)A revised device file for the GW Instek GPP-4323 is available.HKJ - It appears that the modified Device File for the GPP-4323 that was submitted back in February was accidentally not included in the current release of TestController. The updated file supported the change to the ID string of the GPP-4323 that Instek made with their latest firmware release.
This is compatible with the response to "*idn?", which changed in the latest firmware for the GPP-4323 (1.19).
Probably because there has not been any new releases of TC since. :)
QuoteThe setup button is only for the selected device, use the button on the left to select another device.There is no button on the left? which one do you mean?
I imagine there must be a few other new or updated device files in the queue as well, since there has been no release of TC for a while. It looks like it would be helpful to allow updating the Device File collection independently of new releases of TC itself.
:enable: inList(deviceRead(handle,"readOperationState?"), "STOP PAUSE")
#scpiCmd OPER:SET txrxn 13 "@0153" (value)
#scpiCmd OPER:STAT? txrxn? 22 "@0151" / 7h2
:readmath: matchBitsList(value,"00000000","STOP","00000001","RUN","00000011","READY","00000101","WAIT","00010001","HOLD","00100000","END","10000000","PAUSE")
:setvar: Operation_State=value
#scpiCmd readOperationState? none?
:readmath: getVar("Operation_State")
#scpiCmd READ:FIX? txrxn? 37 "@0125" / 5h4 9h4 13h4 17h4 21h4 25h2 27h1 28h1 29h1 30h1 31h1
:readmath: binConv(int(getElement(value,0)),0,2,1)/10.0+" "+binConv(int(getElement(value,1)),0,2,1)/10.0+" "+binConv(int(getElement(value,2)),0,2,1)/10.0+" "+binConv(int(getElement(value,3)),0,2,1)/10.0+" "+getElement(value,4)+" "+getElement(value,5)+" "+getElement(value,6)+" "+getElement(value,7)+" "+getElement(value,8)+" "+getElement(value,9)+" "+getElement(value,10)
#scpiCmd SET:FIX? txrxn? 12 "@0115" (value) / 5h2
:setvar: response=value
#cmdSetup number Temperature
:read: READ:FIX?
:readformat: fxxxxxxxxxx
:write: (bytesAsHex(hex(value*10)))
°C -20 110
#cmdSetup number Humidity
:read: READ:FIX?
:readformat: xfxxxxxxxxx
:write: (bytesAsHex(hex(value*10)))
%RH 0 99.9
#cmdSetup number Temperature_Slope
:read: READ:FIX?
:readformat: xxfxxxxxxxx
:write: (bytesAsHex(hex(value*10)))
°C/min 0 99.9
#cmdSetup number Humidity_Slope
:read: READ:FIX?
:readformat: xxxfxxxxxxx
:write: (bytesAsHex(hex(value*10)))
%RH/min 0 99.9
#cmdSetup number Run_Hours
:read: READ:FIX?
:readformat: xxxxfxxxxxx
:write: (bytesAsHex(hex(round(value),4)))
hrs 0 9999
#cmdSetup number Run_Minutes
:read: READ:FIX?
:readformat: xxxxxfxxxxx
:write: (bytesAsHex(hex(round(value),2)))
mins 0 59
#cmdSetup combobox Time_Mode
:read: READ:FIX?
:readformat: xxxxxxfxxxx
:write: (bytesAsHex(hex(round(value),1)))
Continuous 0
Timer 1
#cmdSetup combobox Wait
:read: READ:FIX?
:readformat: xxxxxxxfxxx
:write: (bytesAsHex(hex(round(value),1)))
Off 0
On 1
#cmdSetup number Time_Signal_1
:read: READ:FIX?
:readformat: xxxxxxxxfxx
:write: (bytesAsHex(hex(round(value),1)))
_ 0 9
#cmdSetup number Time_Signal_2
:read: READ:FIX?
:readformat: xxxxxxxxxfx
:write: (bytesAsHex(hex(round(value),1)))
_ 0 9
#cmdSetup number Time_Signal_3
:read: READ:FIX?
:readformat: xxxxxxxxxxf
:write: (bytesAsHex(hex(round(value),1)))
_ 0 9
#cmdSetup set Fixed_Settings
:write: SET:FIX?
:update: Fix_Settings
Temperature Humidity Temperature_Slope Humidity_Slope Run_Hours Run_Minutes Time_Mode Wait Time_Signal_1 Time_Signal_2 Time_Signal_3
\x20
#cmdSetup info Operation_State
:read: OPER:STAT?
#cmdSetup button Run
:write: OPER:SET "011"
:update: Operation_State
:enable: inList(deviceRead(handle,"readOperationState?"), "STOP PAUSE")
#cmdSetup button Pause
:write: OPER:SET "051"
:update: Operation_State
:enable: deviceRead(handle,"readOperationState?")=="RUN"
#cmdSetup button Stop
:write: OPER:SET "021"
:update: Operation_State
:enable: inList(deviceRead(handle,"readOperationState?"), "PAUSE BREAK END")
Because a "#cmdSetup info" control does not create a variable with its name, I have made its defined #scpiCmd save the result to a variable.
My :enable: tags for the buttons read like this:Code: [Select]:enable: inList(deviceRead(handle,"readOperationState?"), "STOP PAUSE")
This works, however for some reason the use of the deviceRead function in the :enable: tag means that when I update the parameters in the "#cmdSetup set", it issues the defined :read: #scpiCmd for each parameter, resulting in the same command/response occuring 11 times over serial, instead of once and caching the response. This appears to visibly slow down the debug output as the last few command/response instances occur.
It still works, but it just seems a bit clunky and would prefer to keep it fast and clean so I can share the finished definition and minimise the chances of any timing issues between instruments.
DeviceRead clears the cache, this is necessary or it could not be used to get a real time status from the device.
Have you tried if you can access the variable directly (I do not remember if that is possible)?
:enable: inList(Operation_State, "STOP PAUSE")
in order to read the variable that the #scpiCmd set, but it throws an exception pointing out that the variable (Operation_State) does not exist. Local variable (i.e. var declared) have priority over globally declared variables. If the script is called from another script there may exist variables between global and local from the calling script.
DeviceRead clears the cache, this is necessary or it could not be used to get a real time status from the device.
Have you tried if you can access the variable directly (I do not remember if that is possible)?
Ah, that makes sense.
I don't believe it's possible, but there might be a way that I'm unware of.
I've tried setting the :enable: tag as:Code: [Select]:enable: inList(Operation_State, "STOP PAUSE")
in order to read the variable that the #scpiCmd set, but it throws an exception pointing out that the variable (Operation_State) does not exist.
Presumably variables declared in the definition are a separate local scope to variables within #cmdSetup dialogue. I'm not aware if there is a way to define it as a global variable and read it, but I did see on your Calculator page (http://lygte-info.dk/project/Calculator%20UK.html#Variables) that:QuoteLocal variable (i.e. var declared) have priority over globally declared variables. If the script is called from another script there may exist variables between global and local from the calling script.
I presume that is only relevant in the event that there is a local and global variable with the same name, the function will refer to the local one.
On a whim I tried to :setglobalvar: instead of :setvar:, but that didn't appear to make any difference.
I checked the code and you are correct, it is not possible.
The documentation only descibes local and global vars, but there is a third option: A script can be declared (in my code, not in scripting) as a child of another script and this means it will have access to the variables. The variable names is seached with local first, then parent scripts, then global and stops on first match. This is used in TC, but not everywhere.
To create a global variable it must be declared with globalvar, that works in the same way as var.
Generally globalvar is not supposed to be used in any device definition, because then only one instance of that device can be connected at a time.
;----- OPERATION STATE CONTROLS (RUN/PAUSE/STOP)
#cmdSetup info Operation_State
:read: OPER:STAT?
#cmdSetup selector Operation_State
:read: OPER:STAT?
:string:
STOP Run_Allow. Pause_NAllow. Stop_NAllow.
RUN Run_NAllow. Pause_Allow. Stop_NAllow.
PAUSE Run_Allow. Pause_NAllow. Stop_Allow.
#cmdSetup button Run Run_Allow
:write: OPER:SET "011"
:update: Operation_State
:enable 1
#cmdSetup button Run Run_NAllow
:write: OPER:SET "011"
:update: Operation_State
:enable: 0
#cmdSetup button Pause Pause_Allow
:write: OPER:SET "051"
:update: Operation_State
:enable: 1
#cmdSetup button Pause Pause_NAllow
:write: OPER:SET "051"
:update: Operation_State
:enable: 0
#cmdSetup button Stop Stop_Allow
:write: OPER:SET "021"
:update: Operation_State
:enable: 1
#cmdSetup button Stop Stop_NAllow
:write: OPER:SET "021"
:update: Operation_State
:enable: 0
I accepted defeat and resorted to using a selector with controls that are always enabled or always disabled. It's probably not as elegant but it solves the problem.
I'm having a separate issue with #cmdSetup combobox as well unfortunately.
I can see in the debug output that the defined combobox controls are outputting the correct values, and the correct values are being read by TC, but the combobox always displays the first option in the list after reading back, even if the value shows something else in the debug output.
Is this because I'm using them to set/read a numeric value?
If I replace the combobox with a #cmdSetup number control, that reads back correctly without issue.
Not as elegant when you want the controls shown.
I am working on adding vars for the info control.
A combobox will compare strings, i.e. 1 1. and 1.0 are 3 different values, a number control will see then as the same value.
Just before you replied I had devised the formulas to convert from number to display as string, and then to take the displayed string and convert back to number, which was a challenging but nonetheless interesting exercise!
#scpiCmd SET:MODE? txrxn? 31 "@0122" / 5h2 7h1 8h2 10h2 12h2 14h2 16h1 17h2/10 19h2/10 21h2/10 23h2/10 25h1
#scpiCmd SET:MODE txrxn 12 "@0112" (value) / 5h2
#cmdSetup multi Start_Time Mode_Settings
:read: SET:MODE?
:readmath: getElement(value,2) + " " + getElement(value,3) + " " + getElement(value,4) + " " + getElement(value,5)
:write: ("(bytesAsHex(hex(round(#),2))) (bytesAsHex(hex(round(#),2))) (bytesAsHex(hex(round(#),2))) (bytesAsHex(hex(round(#),2)))")
number hrs _ 0 23
number mins _ 0 59
number Month _ 1 12
number Date _ 1 31
#cmdSetup set Update_Mode_Settings Mode_Settings
:write: SET:MODE
:update: Mode_Settings.Operation_Mode_Test
Mode_Settings.Link/Pattern_Number_Execution Mode_Settings.Operation_Mode Mode_Settings.Start_Time Mode_Settings.Power_Recovery_Mode Mode_Settings.Wait_Temperature_Neg Mode_Settings.Wait_Temperature_Pos Mode_Settings.Wait_Humidity_Neg Mode_Settings.Wait_Humidity_Pos Mode_Settings.Running_At_End
\x20
Tx <SET:MODE 0x30 0x39 0x30 ("(bytesAsHex(hex(round(9),2))) (bytesAsHex(hex(round(54),2))) (bytesAsHex(hex(round(12),2))) (bytesAsHex(hex(round(5),2)))") 0x30 0x30 0x41 0x30 0x41 0x31 0x39 0x31 0x39 0x30>
I've tried to use the #cmdSetup multi as part of a #cmdSetup set. Reading values in works fine with suitable :readmath: or :readformat: tags, but when I transmit the values with the #cmdSetup set, it always transmits the :write: parameter for the multi as a literal string - my :write: tags contain formulas to convert values into suitable data packets.
I've tried wrapping it with brackets, quotes, and combinations of, but it always transmits the :write: tag as a literal string. Can this be done or am I pushing the limits?
:write: ("(bytesAsHex(hex(round(#),2))) (bytesAsHex(hex(round(#),2))) (bytesAsHex(hex(round(#),2))) (bytesAsHex(hex(round(#),2)))")
I was able to test the Racal-Dana 1998-1999 definition fie I submitted here, two pages back (https://www.eevblog.com/forum/testgear/program-that-can-log-from-many-multimeters/msg4831730/#msg4831730) with an original Prologix GPIB-USB adapter.
I made some minor adjustments to the definition file, so could you please re-download it?
Of coarse the definition file also worked with the Prologix. But I was surprised to find that there were differences in speed, With the Prologix I could log a bit faster.
The most surprising thing was that when I registered the AR488 in TestController as a Prologix it also worked a bit faster. (But not as much as the original Prologix.)
You are correct that Vitrek Hipot tester is only communications. I am not sure it makes sense to log data from this device??? The intent is that it would be automated via a script which only requires communications working.
However, it should have a Setup popup. I will also re-think what data might be worth logging beyond Pass/Fail. I will re-submit once I have that complete.
Does the Modbus driver support streaming data, in the same manner as the Block and AsciiBlock drivers?
Hi HKJ,
Please find attached a device definition file to suit B&K Precision 9115, 9116, and 9117 DC power supplies.
I have a handful of other, much more complicated definitions in the works but would like to make sure they are a bit more polished before submitting.
#metadef
#author MikeLud
#idString Siglent Technologies,SDS2104X Plus,
#name Siglent SDS2104X
#handle SDS2104X
#replaceText AV C1:PAVA? RMS;C2:PAVA? RMS;C3:PAVA? RMS;C4:PAVA? RMS;C1:PAVA? PKPK;C2:PAVA? PKPK;C3:PAVA? PKPK;C4:PAVA? PKPK
HKJ is there any detention for SDS2104X plus scope, There is SiglentSDSxxxxxx.txt file, it did not support the scope, So I have just added these lines to itQuote#metadef
#author MikeLud
#idString Siglent Technologies,SDS2104X Plus,
#name Siglent SDS2104X
#handle SDS2104X
#replaceText AV C1:PAVA? RMS;C2:PAVA? RMS;C3:PAVA? RMS;C4:PAVA? RMS;C1:PAVA? PKPK;C2:PAVA? PKPK;C3:PAVA? PKPK;C4:PAVA? PKPK
But it seems it makes the software very lagy and also some times it freezes the software.
Thanks HKJ, Do you have a config file for SDS2104X plus scopes?
"Hello, I would also like to control the old DMM Advantest R6551. Does anyone happen to have a configuration file for it? If not, could someone at least recommend a suitable template from the existing ones? The device has only GPIB interface, and the link to its manual is provided here:The command structure of the HP3478A is roughly similar to that of the Advantest R6551, so you might find some general ideas in the Device File for the HP3478A, which uses the "ASCII" driver of TestController.
Ivo
Thank you! I am planning to connect the Advantest with AR488 interface. Do you expect any troubles?The "ASCII" driver mentioned above does not refer to the connection type, but rather to the command format used by the device in question. So you can have an "ASCII" device with a GPIB connection like the AR488 or Prologix and that works fine.
Thank you for reply!
I have partial success in controlling my Advantest R6551 over AR488. In the manual, I found that the R6551 device can be switched to the HP3478A mode. So I hoped the Test Controller will work with HP3478A.txt setting file directly. But it does not work and I have no response.
But when I send the Test Controller startup sequence
++default<LF>++addr 6<LF>B<LF>++read_tmo_ms 950<LF>++read eoi<LF>
to R6551 directly from the terminal application, everytjing is OK and the device responds and returns the measured value correctly. I suspect that the startup sequence is being sent by the Test Controller too early, before the serial port has a chance to initialize. That corresponds to my research on the terminal as well. Is it good idea? If yes is there some possibility to delay the startup sequence?
A definition can add extra startup delay see here: https://lygte-info.dk/project/TestControllerConfigDevice%20UK.html#Arduino_startup_reset (https://lygte-info.dk/project/TestControllerConfigDevice%20UK.html#Arduino_startup_reset)
If you want the delay for your computer and not a single device, there is a command line option for it.
I have created the first configuration file (It is not cleaned yet, but is functional) for Advantech R6551 (attached). Everything is working as I expected, except for an issue with refreshing the setup screen in relation to the "Autorange" checkbox. When Autorange is set to off, everything is O.K..
1. However, if I set "Autorange On", the "comboboxHot Range DC_Voltage" becomes grayed out. That is correct. But, if I close the Setup window and reopen it, the "comboboxHot Range DC_Voltage" is no longer grayed out. This is incorrect.
2. If I gradually enable and disable "Autorange" in the opened Setup window using the command: (write: getElement("RANGE:1000V RANGE:AUTO", value)), the instrument correctly switches Range to "Auto" (On) and then to 1000V(off), but the change of the Range (to 1000V) is not indicated in the comboboxHot Range DC_Voltage.
Do you have some idea how to correct it? For better understanding I attached a printscreen of the setup window.
Here is my code for DC_Voltage setup screen definition:
#cmdSetup info Active_Mode
:read: READ:FUNCTION?
:readmath: getElement("?; DC Voltage;AC Voltage;2W Resistance;4W Resistance;DC Current;AC Current", value)
:updatemodechange:
;DC_Voltage-------------------------------------------------------------------------------------
#cmdSetup checkbox AutoRange DC_Voltage
:write: (getElement("RANGE:1000V RANGE:AUTO",value))
:read: READ:RANGE?
:readmath: matchList(value,"0",1,"3",0,"4",0,"5",0,"6",0,"7",0)
On 0 1
:updatemodechange:
#cmdSetup comboboxHot Range DC_Voltage
:enable: !DC_Voltage.AutoRange.On
:write: (getElement("? RANGE:300MVI RANGE:3VI RANGE:30VR RANGE:300VR RANGE:1000V",value))
:read: READ:RANGE?
:readmath: matchList(value,"3",1,"4",2,"5",3,"6",4,"7",5)
300mV 1
3V 2
30V 3
300V 4
1000V 5
:updatemodechange:
Has anyone used the UT171 B/C meters with Test Controller? Hoping for compatibility given the support from so many other UT meters.
V2.35 is upThe Racal-Dana 1998 & Racal-Dana 1999 (note the small typo) are fully functional in TC.
Added: Racal-Dana 1998 & Racal-Dana 1998 Counter only config and logging
Added: :enable: / :visible: var to info control.
Added: Block driver will support socket interface.
;; COM14: Tx: 40 30 31 32 35 34 36 2A 0D
;; COM14: Rx: 40 30 31 32 35 30 30 43 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 44 2A 0D 0A
;; 192.168.0.80: Tx: 40 30 31 32 35 34 36 2A 0D
;; 192.168.0.80: Rx timeout 1000ms In buffer:
dk.hkj.script.ProgramExceptions$UnknownException: No digits in number <>
Thanks HKJ, I hope we see more update more frequently, also if you have any updates on siglent SDS2104X Plus series scopes, it would be very nice to add them. :-+
Hi HKJ,
A bit (too) late to the party, but here is a configuration file for the Racal-Dana 1991 and 1992 Universal Nanosecond Counters.
These counters are sister models to the 1998 and 1999, but targeted at another use profile. While the 1998/1999 are optimized for frequency counting, the 1991 and 1992 are universal counters, with scientific display, and much more functions.
Added: Block driver will support socket interface.
Block driver on socket does not appear to be reading response packets into Test Controller.Code: (Tx/Rx via serial) [Select];; COM14: Tx: 40 30 31 32 35 34 36 2A 0D
;; COM14: Rx: 40 30 31 32 35 30 30 43 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 44 2A 0D 0ACode: (Tx/Rx via socket) [Select];; 192.168.0.80: Tx: 40 30 31 32 35 34 36 2A 0D
;; 192.168.0.80: Rx timeout 1000ms In buffer:
dk.hkj.script.ProgramExceptions$UnknownException: No digits in number <>
Monitoring the lines with a terminal window I can see the responses to Test Controller's commands.
When using socket, the response does not appear to be read into Test Controller so it keeps sending the same command.
Just to note that I did a how-to article for TestController in April's Silicon Chip magazine.
https://www.siliconchip.com.au/Issue/2023/April (https://www.siliconchip.com.au/Issue/2023/April)
The article is in support of a test bench automation hardware project in the same issue.
I hope it brings more users to TestController.
Thanks for the update - I wrote the article nearly a year ago (the publishing process takes quite a while), so I'm unsurprised that there have been multiple improvements since that time.
I've sent a copy of the proof to the email address on your website.
Hi HKJ,
At the moment I am using Testcontroller a lot. Usually logging with 3 to 6 traces on the Chart.
It gets annoying pretty fast that every time I stop logging (for example to fine-tune the measurement set-up), and starting the logging again, I have to re-select the traces to get them in the preferred order again...
It would be nice if the curve selection could be remembered... Maybe until other devices are loaded? Or an extra checkbox: remember trace selection?
Hi HKJ,
Thank you for the explanation. I tried it immediately.
When I click right on the log window and select "Generate scripts" and then "Chart/Hist/Range script", indeed something is running in the log & program editor window. I save the script.
When I stop, and restart the logging, I click "load and run", open the script, and click "run". Indeed the right traces are now selected, but unfortunately NOT in the right order....
So I must be missing something....
Anyway, this work-around seems like more work then just manually click the traces in the right order....
Hi, any config file here for ET5420A+?
Hi HKJ,
I wrote a configuration file for the HP / Agilent 3458A 8,5 digit multimeter.
Quote from: HKJ on 12 December 2022, 10:56:09
I generally do not decode secondary displays on multimeters, there are a couple of reasons for that.
Not very useful information (This is mostly about the frequency in AC).
Logging rate goes down (Depends on multimeter).
TC will automatic track range changes for devices with one value, not for devices with multiple values. This is not about the main pages, but on the popups (A lot of TC's functionality are in the popups).
Here is a device configuration file for Fluke 863, 865 and 867B Graphical Multimeters.
Just for fun, and for your Multimeter frequency response page, here is the frequency response of the 867B:
The "USBTMC" Protocol has come up in the past. I've an OWON SDS1192 which uses the "PC" setting to log to its own propreiety software. However, it does support "USBTMC" mode as well.
Any chance of this being updated? I know very little about it at the moment, but it appears it would allow Test Controller to nearly immediately add a bunch of equipment to its list of supported devices.
The problem is that USBTMC requires native code and cannot be done in Java and native code requires separate code for each OS and cpu architecture.
OK, back to my question.
Wouldn't python-usbtmc make all this happen?
https://github.com/python-ivi/python-usbtmc
At least I could connect to a Siglent DSG1025 AWG on the command line using pyvisa after installing python-usbtmc
I'm trying for a device to convert in NR3 a number. For example 0.123 -> 123E-03 (and not 123m as si). Is there a trick to do it ?
@HJK, @Gertjan,Hi HKJ,
Thank you for the explanation. I tried it immediately.
When I click right on the log window and select "Generate scripts" and then "Chart/Hist/Range script", indeed something is running in the log & program editor window. I save the script.
When I stop, and restart the logging, I click "load and run", open the script, and click "run". Indeed the right traces are now selected, but unfortunately NOT in the right order....
So I must be missing something....
Anyway, this work-around seems like more work then just manually click the traces in the right order....
I think I see the problem, I have not really seen the selection sequence as a important parameter, just that the right tracks are selected.
The script do more than just select the traces as you can see on the script commands.
If you email me a datafile and screen shoots of your selection, the restored selection and the generated script. I will take a look and if I agree you are right about selection is important and it is not too hard to fix it I will.
When doing this it might be best to generate a menu entry, it makes future selection very easy.
V2.35 is up
Added: Block driver will support socket interface.
Added: Poll delay setting in Block driver (#pollPause)
Fixed: A charset issue with #rxStart in Block driver
2. I also confirm that #pollPause does its job well, provided value should be in milliseconds.
Unfortunately I do not see it mentioned in documentation for the driver https://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html#Binary_with_fixed_communication_blocks_(Block)
3. I wonder where to read about "socket interface" ?
Is this about possibility to communicate over a TCP socket in network instead of a serial interface?
Yes, socket is using TCP. There is no special documentation about it, but see here: https://lygte-info.dk/project/TestControllerConfigDevice%20UK.html#The_device_identification_and_connection_parametes (https://lygte-info.dk/project/TestControllerConfigDevice%20UK.html#The_device_identification_and_connection_parametes). It will be selected if you write a socket port number after the #port tag.Thanks, I was able to get it working with my Tasi device (originally with serial port), when I made a COM<->TCP bridge, so TC communicated over a TCP socket.
I did not test it when adding the code and somebody says it do not work, it will be tested (and fixed) before next version.
...@jmurray, FYI, it works for me. Something is incorrect on your side.
Monitoring the lines with a terminal window I can see the responses to Test Controller's commands.
When using socket, the response does not appear to be read into Test Controller so it keeps sending the same command.
I made a minor change to the definition file for the Siglent SDL10xxXxx to do with how the instrument changes modes to CC on connection and locks its front panel, it now won't do that.
V3.26 is up.
Changed: #ChartCurves will select curves in the sequence listed in the command
"V3.26 is up."
I guess this should be - V2.36 is up.
At least the is what the About box says. ;)
There is something changed?
I have used this program before, but today when I try to save the log, buttons "Save" or "Export" does nothing. They are supposed to show a dialog where I can choose to save the log, as I remember ...
There is something changed?
I have used this program before, but today when I try to save the log, buttons "Save" or "Export" does nothing. They are supposed to show a dialog where I can choose to save the log, as I remember ...
Strange, I just tried here and it works as it is supposed to.
Note: Save and Export only works when there are data in the table. They will also be disabled if you are active logging to disk, but will be enabled when you stop logging.
There is something changed?
I have used this program before, but today when I try to save the log, buttons "Save" or "Export" does nothing. They are supposed to show a dialog where I can choose to save the log, as I remember ...
Strange, I just tried here and it works as it is supposed to.
Note: Save and Export only works when there are data in the table. They will also be disabled if you are active logging to disk, but will be enabled when you stop logging.
I know, I have used it many times before. It has data, just wasted 4 hours of logging. After stopping can't save ... I have downloaded last version do a test log, same problem. If you say that should work, maybe is something from Java ...
There is something changed?
I have used this program before, but today when I try to save the log, buttons "Save" or "Export" does nothing. They are supposed to show a dialog where I can choose to save the log, as I remember ...
Strange, I just tried here and it works as it is supposed to.
Note: Save and Export only works when there are data in the table. They will also be disabled if you are active logging to disk, but will be enabled when you stop logging.
I know, I have used it many times before. It has data, just wasted 4 hours of logging. After stopping can't save ... I have downloaded last version do a test log, same problem. If you say that should work, maybe is something from Java ...
The Java I tested with is:
C:\Users\hkj>java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
Try running TC from a DOS prompt, it will output error messages to the DOS window. Error messages are always output, debug messages only in debug mode and both to DOS window and to TC log window.
The output at export command is in file attached.
Hi,
Thank you for your help. I have tested modified program.
Now it show me a dialog for saving the file, but I cant choose another folder, can't browse, but when try to create a director I can browse. At this moment the log record: "Failed to set director: C:\Users\Robert\Documents\TestController".
I am running the program from "c:\TestController"
In a second attempt to save the same log, again does nothing and so on. Only on first attempt it show a dialog.
I attached a full output with a short log included.
It is there. Is where it save the log at first attempt with new program.
I don't know what can be.
This is the only program that make this problem.
It is a win 11 and maybe they set some security setting, I don't know.
It show Documents and can't browse as I said. It is a strange behaviour on that save dialog. At least I can save with that version ... Then if I will need to log again I need to close the program a nd start again.
Try to set datadir path but no change. What is the syntax? Just a separate line or as option to main line?
Hi HKJ,
This might be a stupid question, but what would be the recommended way to implement a delay within a #scpiCmd #pgm# routine?
I've tried runScript("#delay 1") but it does not appear to work.
TestController also doesn't like it being called more than once, for example as part of a "for" loop, as it reports: "A background job is already running, this request is ignored".
Preferably a delay in milliseconds: I know the standard #delay can do fractions of a second, but whatever method I need to employ in this case would need to work in milliseconds.
Should I be using an expression to compare the results from the seconds() function?
Or is there a simpler function I could call?
Hi HKJ,
This might be a stupid question, but what would be the recommended way to implement a delay within a #scpiCmd #pgm# routine?
I've tried runScript("#delay 1") but it does not appear to work.
TestController also doesn't like it being called more than once, for example as part of a "for" loop, as it reports: "A background job is already running, this request is ignored".
Preferably a delay in milliseconds: I know the standard #delay can do fractions of a second, but whatever method I need to employ in this case would need to work in milliseconds.
Should I be using an expression to compare the results from the seconds() function?
Or is there a simpler function I could call?
You can directly include delay in SCPI commands by using [123] (123ms) or [*OPC] that will use a special SCPI function to wait until the device is done processing commands (This do not work on all SCPI devices).
You can find it here in the documentation: https://lygte-info.dk/project/TestControllerConfigDevice%20UK.html#Timing_issues (https://lygte-info.dk/project/TestControllerConfigDevice%20UK.html#Timing_issues)
With some drivers you can also add a fixed delay between commands.
In programming you can use sleep(123) (123ms) and #delay 0.123 in scripting.
In all cases caching can throw you delay off a little bit.
Also be aware that TC is multithreaded, it will generally not affect delays, but a delay may open up for another thread to use the device during the delay (this will not happen with the [...] delays). With standard use of TC there will usually only be two threads accessing a device: The one fetching measurements and the one doing configuration (There are exceptions to this), but with scripting this can easily be increased.
"A background job is already running, this request is ignored"
Only one regular script can run at a time, use runScriptAsync() to start a independent background job. With this you can also crash TC, because there is no limit on background jobs and even the fastest computer will have trouble running a few million background jobs. :)
sleep(123) is what I was needing! Thanks!
sleep(123) is what I was needing! Thanks!
I expected that, but I like to explain a bit more (when I have time). I hope a few people can learn a bit more about TC that way.
I recently added a Mecmesin BFG1000 Basic Force Gauge to my inventory - so here's a new definition file you may include with TC.
I've done my best to accommodate every function and compensate any lacking features within the definition file.
I've also pre-filled everything to accommodate all other models in the BFG range - it will require some minor corrections for the lower capacity models but otherwise everything is there.
EDIT: There's always another bug once you hit submit! Corrected some readformat issues with the streaming mode implementation.
I've updated the attachment.
Philips PM2811 30V / 10A: PHILIPS,PM2811/01 Philips PM2811 60V / 5A : PHILIPS,PM2811/11 |
; Meta definition for PM2811 30V/10A version
#metadef
#idString PHILIPS,PM2811/01
....
; Meta definition for PM2811 60V/5A version
#metadef
#idString PHILIPS,PM2811/11
.....
; Meta definition for Philips PM2811 Power Supply
#metadef
#idString PHILIPS,PM2811/01
#name Philips PM2811
#handle PM2811
....
; Meta definition for Fluke PM2811 Power Supply
; As far as known the later Fluke versions kept "PHILIPS" in de *IDN? answer string
#metadef
#idString PHILIPS,PM2811/01
#name Fluke PM2811
#handle PM2811
....
1. Obviously the 30V/10A and 60V/5A versions need a bit different definition.
Would this work:Code: [Select]; Meta definition for PM2811 30V/10A version
#metadef
#idString PHILIPS,PM2811/01
....
; Meta definition for PM2811 60V/5A version
#metadef
#idString PHILIPS,PM2811/11
.....
Would TC automatically pick the right #metadef, depending on the *IDN? Answer?
I suppose the easy way would be to create just two model names: “Philips PM2811 30V/10” and “Philips PM2811 60V/5A”. But that seems to be a less elegant solution.
2. The second digit after the slash can change too…
Probably it means "front- or back panel connectors". But it could also be "Country Version" (In the full Type Number there are 3 digits after the slash…)
Anyway, the value of this last digit is not important for the definition. (No changes in the definition are needed when this digit changes)
But with a different *IDN? Answer TestController will not recognize the device…
So, is it possible to “mask” this last digit when TC does the device recognition with *IDN? Or is there another solution?
3. These power supplies were sold by Philips, but after the Fluke/Philips T&M alliance, they were sold under the Fluke brand. (In practice, I see more Fluke PM2811 than Philips PM2811)
However, also with the Fluke version, the *IDN? Answer remained PHILIPS,PM2811/xx
So, would you like to have both the Fluke and Philips version in your supported list?
And would coding like this work, as both #metadef’s are having the same #idstring:Code: [Select]; Meta definition for Philips PM2811 Power Supply
#metadef
#idString PHILIPS,PM2811/01
#name Philips PM2811
#handle PM2811
....
; Meta definition for Fluke PM2811 Power Supply
; As far as known the later Fluke versions kept "PHILIPS" in de *IDN? answer string
#metadef
#idString PHILIPS,PM2811/01
#name Fluke PM2811
#handle PM2811
....
; Meta definition for PM2811 30V/10A version
#metadef
#idString PHILIPS,PM2811/0
#name Philips PM2811
#handle PM2811
....
; Meta definition for PM2811 60V/5A version
#metadef
#idString PHILIPS,PM2811/1
#name Philips PM2811
#handle PM2811
.....
Code: [Select]; Meta definition for PM2811 30V/10A version
...
#name Philips PM2811
....
; Meta definition for PM2811 60V/5A version
...
#name Philips PM2811
.....
So there is only only one device name, but this device can return 2 different *IDN? answers, depending on whether it is a 30V/10A or 60V/5A version. (I adapted the #idstring already to your answer on the second question :) )
Will TestController, with the above code, select the correct #metadef depending on the *IDN? answer?
If not, is there an other solution?
;; 00:54:43.342 jSerialComm version: 2.10.3
;; 00:54:43.344 Start thread for: ttyBLE - ATorch DL24P
;; 00:54:43.344 ttyBLE: Set params: 9600
;; 00:54:43.544 ttyBLE: Tx: B1 B2 11 00 00 B6
Exception in thread "Device Pseudo-Terminal Device (ttyBLE)" java.lang.NoSuchMethodError: 'int com.fazecast.jSerialComm.SerialPort.writeBytes(byte[], long, long)'
at dk.hkj.comm.SerialPacketInterface.writeDataInternal(SerialPacketInterface.java:114)
at dk.hkj.comm.SerialPacketInterface.writeData(SerialPacketInterface.java:134)
at dk.hkj.comm.SerialPacketInterface.writeReadData(SerialPacketInterface.java:180)
at dk.hkj.devices.DeviceATorchPX100$TranslatingCommInterface.communicate(DeviceATorchPX100.java:73)
at dk.hkj.devices.DeviceATorchPX100$TranslatingCommInterface.cmdIdn(DeviceATorchPX100.java:139)
at dk.hkj.devices.DeviceATorchPX100$TranslatingCommInterface.write(DeviceATorchPX100.java:188)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:144)
at dk.hkj.comm.CommInterface.writeRead(CommInterface.java:139)
at dk.hkj.main.InterfaceThreads$DeviceThread.initDevice(InterfaceThreads.java:1507)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1590)
IMPORTANT NOTE: The bytesToRead and offset parameters in both readBytes() and writeBytes() have been changed from type long to int so that there is no mismatch between the parameters and the return type. Any code specifically passing a long to these functions will need to be updated.
Thinking about getting an UNI-T UT622 LCR meter after a tax return.
Anybody already doing a definition file? It has a Virtual COM interface 8),
no HID >:D thank God. So I might be able to produce a definition file myself
once I have it. :phew:
I wrote a device configuration file for the Fluke / Philips PM2811 programmable power supplies.
It is based on the R&S HMC8043 definition.
Request to bump jSerialComm to recent release v2.10.3 and adopt TC code.
; Possible modes for Channel 1: CH1_VPP, CH1_VRMS, CH1_DBM
; Possible modes for Channel 2: CH2_VPP, CH2_VRMS, CH2_DBM
#value Freq1 Hz SI
#value Ampl1_pp Vpp SI CH1_VPP
#value Ampl1_rms Vrms SI CH1_VRMS
#value Ampl1_dB dBm D3 CH1_DBM
#value Offset1 V SI
#value Freq2 Hz SI
#value Ampl2_pp Vpp SI CH2_VPP
#value Ampl2_rms Vrms SI CH2_VRMS
#value Ampl2_dB dBm D3 CH2_DBM
#value Offset2 V SI
; :SOUR1:FREQ? Query the waveform frequency of CH1
; :SOUR1:VOLT? Query the waveform amplitude of CH1
; :SOUR1:VOLT:OFFS? Query the offset voltage of CH1
; :SOUR1:VOLT:UNIT? Query the amplitude unit of CH1 (VPP|VRMS|DBM)
#askValues :SOUR1:VOLT:UNIT?;:SOUR2:VOLT:UNIT?;:SOUR1:FREQ?;:SOUR1:VOLT?;:SOUR1:VOLT:OFFS?;:SOUR2:FREQ?;:SOUR2:VOLT?;:SOUR2:VOLT:OFFS?;
#askValuesReadFormat xxffffff
#askMode :SOUR1:VOLT:UNIT?;:SOUR2:VOLT:UNIT?
#askModeMathFormat "CH1_"+getElement(value,0)+" CH2_"+getElement(value,1)
#modeFromValue "CH1_"+getElement(value,0)+" CH2_"+getElement(value,1)
; ---Setup Menu---
#cmdSetup combobox Amplitude_unit AMPL_1
:read: :SOUR1:VOLT:UNIT?
:write: :SOUR1:VOLT:UNIT #
Vpp VPP
Vrms VRMS
dBm DBM
When using "block" driver I have some issues, a few questions:
1. I need to send first a specific byteSequence to force device to respond on a pool byteSequence.
How can I do that?
#initCmd works only after device Found, which is a result of the pool definition, so it does not help.
2. If I need to perform a fixed delay after the specific byteSequence, before starting the pool, how is it possible?
#cmdDelayTime and #readingDelay are not related here - do not give me a result.
3. If I need to make a few different pools (with different byteSequences) and then parse them all to have all variables to parse their values.
How this can be made?
- Is it possible to set a mode from the Setup Menu?
- Is there a better way to accomplish the same thing that I have overlooked?
One more thing I noticed: Changing the devices after program start and pressing the reconnect renders the application in an unusable state. After shutdown and restart, the program works with the new parameters/devices.
One more thing I noticed: Changing the devices after program start and pressing the reconnect renders the application in an unusable state. After shutdown and restart, the program works with the new parameters/devices.
I have not seen this, can you specify exactly how you get that unstable state?
I might be something I forget to shut down when doing a reconnect, but I need some pointers to find it.
I found the difference between serial and GPIB to be these commands that are sent to the 34401A:
; Initial commands to meter when establishing connection
#initCmd SYST:REM;[500]
; Final command to meter before breaking connection
#finalCmd system:local
In serial mode this is required, in GPIB this is an unrecognized command. How can I omit/include these commands with respect to the chosen interface?
c:\g\TestController\2.36>testControllerDebug.bat
Starting
;; jSerialComm version: 2.9.1
;; COM20: Set params: 115200
;; Start thread for: AR488 A:22 - Hewlett-Packard 34401A
;; COM20: Tx: <++default.> 2B 2B 64 65 66 61 75 6C 74 0A
;; COM20: Tx: <++addr 22.> 2B 2B 61 64 64 72 20 32 32 0A
;; COM20: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM20: Tx: <++read_tmo_ms 9950.> 2B 2B 72 65 61 64 5F 74 6D 6F 5F 6D 73 20 39 39 35 30 0A
;; COM20: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM20: Rx: <HEWLETT-PACKARD,34401A,0,11-5-3> 48 45 57 4C 45 54 54 2D 50 41 43 4B 41 52 44 2C 33 34 34 30 31 41 2C 30 2C 31 31 2D 35 2D 33
;; AR488 A:22: Tx <SerialInit>
;; AR488 A:22: Script start
;; AR488 A:22: Script end <>
;; Found Hewlett-Packard 34401A on AR488 A:22
;; HP34401A: Tx <FUNC?>
;; COM20: Tx: <FUNC?.> 46 55 4E 43 3F 0A
;; COM20: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM20: Rx: <"VOLT"> 22 56 4F 4C 54 22
;; HP34401A: Rx <"VOLT">
DISP:TEXT "WORKING"
;; HP34401A: Tx <DISP:TEXT "WORKING">
;; COM20: Tx: <DISP:TEXT "WORKING".> 44 49 53 50 3A 54 45 58 54 20 22 57 4F 52 4B 49 4E 47 22 0A
;; COM20: Close
;; HP34401A: Tx <SerialExit>
java.lang.NullPointerException
at dk.hkj.shared.SharedInterface.isOpen(SharedInterface.java:272)
at dk.hkj.comm.GpibInterface.isOpen(GpibInterface.java:89)
at dk.hkj.devices.DeviceSCPIx$TranslatingCommInterface.write(DeviceSCPIx.java:95)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:316)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:339)
at dk.hkj.main.DeviceInterface.doCommand(DeviceInterface.java:83)
at dk.hkj.devices.DeviceSCPI.close(DeviceSCPI.java:154)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1638)
Thread for HP34401A
;; jSerialComm version: 2.9.1
java.lang.NullPointerException
at dk.hkj.shared.SharedInterface.close(SharedInterface.java:238)
at dk.hkj.comm.GpibInterface.close(GpibInterface.java:38)
at dk.hkj.comm.LayerInterface.close(LayerInterface.java:40)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1639)
;; COM20: Set params: 115200
;; Start thread for: AR488 A:22 - Hewlett-Packard 34401A
;; COM20: Tx: <++default.> 2B 2B 64 65 66 61 75 6C 74 0A
;; COM20: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM20: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM20: Rx: timeout
;; AR488 A:22 Device HEWLETT-PACKARD,34401A, do not match: null
;; COM20: Close
;; Stopping thread for: AR488 A:22 - Hewlett-Packard 34401A
;; COM20: Close
I could retest the strange behaviour and with debug I found some errors.
Here is the expanded file for the 34401A with either serial or GPIB.
I am trying to use a testcontroller to log readings of two multimeters, Fluke 8845A and HP3455A over GPIB. The interface is an AR488 (works and communicates with all my instruments).
I can't use the Fluke 8845A with GPIB. Using a socket works but stops logging readings after 3 minutes and happens independently of the logging interval. Also the values in the table don’t align with the values in the display (See photo).
My question is why is that happening? How difficult would it be to add support for GPIB for the fluke multimeter, and is there a driver for the HP3455A or can one be developed easily (I appreciate it is quite old, but I am older)?
I would appreciate any suggestions or solutions.
In case you want to try the 8840A emulation using GPIB, I have attached my 8840A definition below. This is not a release version. It is fully functional, but needs more testing & debugging.
Fluke8840A.zip (https://www.miedema.dyndns.org/co/2023/fluke8840a/Fluke8840A.zip)
"; How to poll for data, this is used for table and #values?
; a #askMode, #cmdMode and #prepareSample is used before this is string is used.
; This is a single line command
#askValues FETCH1?"
I have no idea what to add there, but the FETCH3? command didn't work, with FETCH1? I get hundred of readings.
I have attached the the log file of the initialization screen and the log screen, you may have a better idea of what is happening.
The log is quite different to the log screen of Gertjan 8840 emulation in my post before.
Fixed (I hope): A bug in GPIB when reconnecting.
Added: HP/Agilent 34401A support for GPIB (Thanks dl6lr)
c:\g\TestController\2.38>testControllerDebug.bat
Starting
;; jSerialComm version: 2.10.3
;; COM20: Set params: 115200
;; Start thread for: AR488 A:22 - Hewlett-Packard 34401A
;; COM20: Tx: <++default.> 2B 2B 64 65 66 61 75 6C 74 0A
;; COM20: Tx: <++addr 22.> 2B 2B 61 64 64 72 20 32 32 0A
;; COM20: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM20: Tx: <++read_tmo_ms 9950.> 2B 2B 72 65 61 64 5F 74 6D 6F 5F 6D 73 20 39 39 35 30 0A
;; COM20: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM20: Rx: <HEWLETT-PACKARD,34401A,0,11-5-3> 48 45 57 4C 45 54 54 2D 50 41 43 4B 41 52 44 2C 33 34 34 30 31 41 2C 30 2C 31 31 2D 35 2D 33
;; AR488 A:22: Tx <SerialInit>
;; AR488 A:22: Script start
;; AR488 A:22: Script end <>
;; Found Hewlett-Packard 34401A on AR488 A:22
;; HP34401A: Tx <FUNC?>
;; COM20: Tx: <FUNC?.> 46 55 4E 43 3F 0A
;; COM20: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM20: Rx: <"VOLT"> 22 56 4F 4C 54 22
;; HP34401A: Rx <"VOLT">
*CLS
;; HP34401A: Tx <*CLS>
;; COM20: Tx: <*CLS.> 2A 43 4C 53 0A
;; COM20: Close
;; HP34401A: Tx <SerialExit>
;; jSerialComm version: 2.10.3
;; COM20: Set params: 115200
;; Start thread for: AR488 A:22 - Hewlett-Packard 34401A
;; COM20: Tx: <++default.> 2B 2B 64 65 66 61 75 6C 74 0A
;; COM20: Tx: <*IDN?.> 2A 49 44 4E 3F 0A
;; COM20: Tx: <++read eoi.> 2B 2B 72 65 61 64 20 65 6F 69 0A
;; COM20: Rx: timeout
;; AR488 A:22 Device HEWLETT-PACKARD,34401A, do not match: null
;; COM20: Close
;; Stopping thread for: AR488 A:22 - Hewlett-Packard 34401A
;; COM20: Close
It does not switch back to local mode, I have tried with [LOC] in exitCmd, but this seems to be ignored in SCPIx driver.
It does not switch back to local mode, I have tried with [LOC] in exitCmd, but this seems to be ignored in SCPIx driver.
I encountered the same problem while writing other definitions, also connecting over GPIB. Solution was to add a pause to the #finalCmd.
In your definition this would would look like: #finalCmd SerialExit;[1000];
My explanation is that otherwise the connection is broken before the meter had the time to receive the last command.
Do try to use [LOC], as it is the standard GPIB command for "Go to Local". But use it in the #finalCmd line, not in a #cmdSetup line
(Everything in the #cmdSetup command will be sent directly to the meter, everything in the #finalCmd line is interpreted by TestController)
Regards, Gertjan.
This must've been covered before, but how do I find out what the "address" should be for the HP?... I'd really appreciate some guidance. Thank you!
With serial devices you use the com port as address.True, but I had no clear indication which one (of like five) is being used. This until I figured to watch them in Device Manager while connecting the meter via USB. When it also became evident it was easier to identify it than I thought, as "COM7" - the culprit - also had "USB" attached to it...
Can these commands only be used with the ASCII driver, or is something broken? I was testing with a AR488.
I think disconnect shouldn't be part of the definition.
This must've been covered before, but how do I find out what the "address" should be for the HP?... I'd really appreciate some guidance.
These command are only supported by the ASCII driver, I will look at adding them SCPIx.
With serial devices you can right click with the mouse when editing the address field and all defined serial ports will be listed. Depending on the actual serial port more information may also be listed.
I have just started trying this software and I am mostly looking at using existing AimTTi power supplies and loads. I have managed to adapt the QPX1200P to use with a QPX600DP, and after a few tweaks, it appears to be working (for now).
I am not having as much luck with the AimTTi LD400P. I have the very basics, but it isn't pretty. Has anyone used that kit with this software?
The biggest issue is that I can do a parameter sweep on the QPX600DP output voltage, but if I try to configure the LD400P for a sweep, the "idle" box is red no matter what value I enter.
Is there something I need to put in the device file for the LD400P to get it to accept an "idle" value?
Lets say that I would like to do a continuous logging for a long time, let’s say one year. Is it possible for the software to automatically do backup saves of the log file to the disc with a predefined interval, let’s say every day or every week? This would be very useful in case you want to secure the data in case of computer malfunctions.
Moreover, a nice tweak to this would be to log and being able to automatically save the log after a predefined interval, let’s say after a week, and then immediately start another fresh log automatically with the same settings, and have it saved after another week again, and continue like that. In this way the data would be saved in chunks of weekly basis instead of having a continuously growing file size over the full year. It would be nice to be able to save the files with the starting date, or with a running number, eg w01, w02, w03, and so on.
I just thought I'd interject that MS Excel can do all the logging, formatting and charting. It also has a nice set of statistical, algebraic and arithematical capabilities.
#metadef
#meta
#idString Voltcraft, VC870,
#name Voltcraft VC870
#handle VC870
#driver AsciiBlock
#port 23
#readingDelay 5
#rxStart
#rxLength 23
#rxEnd \r\n
#rxFormat ([0-9]{1})([0-9]{1})([0-9]{1})([0-9]{5})([0-9]{5})([0-9]{1})([0-9]{1})([0-9]{1})([0-9]{1})([0-9]{1})
#askValues Values?
#askValuesMathFormat makeDouble(getElement(value, 3),0,3)
#value Voltage V D1
I am trying to write a definition for my Voltcraft VC870.
Because the original cable was a HID cable and did not work with test controller (using the brymen example), i quickly hacked a esp8266 based serial to wifi bridge for it.
So i used the AsciiBlock driver to read data from it, and it is working fine.
I just thought I'd interject that MS Excel can do all the logging, formatting and charting. It also has a nice set of statistical, algebraic and arithematical capabilities.
Indeed, but it cant do this live, you have to load a datalog from a usb or some other data file. If only it would take data live through usb or socket
Anyone know?
I am trying to write a definition for my Voltcraft VC870.
Because the original cable was a HID cable and did not work with test controller (using the brymen example), i quickly hacked a esp8266 based serial to wifi bridge for it.
When everything works I would like to add it to my projects page: https://lygte-info.dk/project/TestControllerUserProjects1%20UK.html (https://lygte-info.dk/project/TestControllerUserProjects1%20UK.html)So i used the AsciiBlock driver to read data from it, and it is working fine.
It is not the best driver for it. Try https://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html#Binary_DMM_protocol (https://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html#Binary_DMM_protocol)
It may be a bit more complicated to get into, but it is designed to handle DMM's and their quirks, only issue is that it only support the readout of one value.
My general opinion on dual display DMM's is that they are great, but for logging I prefer only to use one value, this gets the fastest logging speed. I you need to log two values, use two DMM's.
Starting
;; jSerialComm version: 2.10.3
thanks for the fast reply.
Does DMM2 support TCP communication?
Because when i change the driver to DMM2 i lose all debug information.
The only thing written in the debug window is:Code: [Select]Starting
;; jSerialComm version: 2.10.3
Thats why i used AsciiBlock in the first place.
#metadef
#idstring RIGOL TECHNOLOGIES,MSO5104
#name Rigol MSO5104
#replaceText MaxCH 4
#replaceText MaxBW 350M
#replaceText MaxSample 8..0G
#replaceText :MEAS:VAV? :MEAS:VAVG?
#sections QuadMode QuadSetup QuadInterface ReadStandard
By the way, i also added my Rigol MSO5104 to the Keysight DSOX.txt file.
Is it possible to grab a complete waveform from the Scope by any chance?
I wrote a definition for the Fluke 8840A Digital Multimeter.
The same frequency response in the standard format for your Multimeter frequency response (https://lygte-info.dk/info/DMMFrequencyResponse%20UK.html) web page:
I'm fairly confident, that the scales are correct for all the modes except for °C and %, which i can not test.
Is there a possibility to read two values with the DMM2 driver?
V : -9.757mV->.
56 20 3A 20 2D 39 2E 37 35 37 6D 56 2D 3E 0A
how I can extract the number using #askValuesReadFormat ?Help please.
If for a SCPI command I get this reply (ASCII and as hex in next line):Code: [Select]V : -9.757mV->.
how I can extract the number using #askValuesReadFormat ?
56 20 3A 20 2D 39 2E 37 35 37 6D 56 2D 3E 0A
I've tried multiple ways and I'm getting 0.0 or NaN.
How to clean up configuration?
Delete some file in the ..\Documents\TestController\Settings folder. You can delete all files if you want, they will automatic be recreated. TestController will return to a "just installed" state if you do that. You can also check the individual settings.... files and only delete some of them. Other files in that directory will be downloaded from my server when needed (Except autorun.txt if it exist).
All the settings.... files are ascii files, i.e. you can edit them with a editor. This is perfectly legal, but if you damage the format too much you might have to delete the file to get TestController working again.
You need to strip the other characters away, this is done in a #askModeMathFormat statement. Something like:
#askModeMathFormat substring(value,4,11)
might do in if the answer always is the same length https://lygte-info.dk/project/TestControllerFunctions%20UK.html#substring (https://lygte-info.dk/project/TestControllerFunctions%20UK.html#substring) else a getMatch(value,"[-1234567890.m]+") can be used.
Then you use
#askValuesReadFormat s
This will handle the m.
a6 05 00 00 7b 22 43 48 31 22 3a 7b 22 4d 41 58
{ " C H 1 " : { " M A X
<trim here>
" ? , O F F " } }
22 09 3f 2c 4f 46 46 22 7d 7d
{"CH1":{"MAX":"35.00mV,OFF","MIN":"-50.00mV,OFF","PKPK":"85.00mV,OFF","VTOP":" ?,OFF","VBASe":" ?,OFF","VAMP":" ?,OFF","AVERage":"-6.740mV,ON","SQUAresum":"18.04mV,OFF","CYCRms":" ?,OFF","CURSorrms":"18.03mV,OFF","OVERShoot":" ?,OFF","PREShoot":" ?,OFF","PERiod":" ?,OFF","FREQuency":" ?,OFF","RTime":" ?,OFF","FTime":" ?,OFF","PWIDth":" ?,OFF","NWIDth":" ?,OFF","PDUTy":" ?,OFF","NDUTy":" ?,OFF","SCREenduty":" ?,OFF","FRR":" ?,OFF","FRF":" ?,OFF","FFR":" ?,OFF","FFF":" ?,OFF","LRR":" ?,OFF","LRF":" ?,OFF","LFR":" ?,OFF","LFF":" ?,OFF","RDELay":" ?,OFF","FDELay":" ?,OFF","RPHAse":" ?,OFF","PPULsenum":" ?,OFF","NPULsenum":" ?,OFF","RISEedgenum":" ?,OFF","FALLedgenum":" ?,OFF","AREA":" ?,OFF","CYCLearea":" ?,OFF"},"CH2":{"MAX":"25.00mA,OFF","MIN":"-60.00mA,OFF","PKPK":"85.00mA,OFF","VTOP":" ?,OFF","VBASe":" ?,OFF","VAMP":" ?,OFF","AVERage":"-15.94mA,ON","SQUAresum":"23.18mA,OFF","CYCRms":" ?,OFF","CURSorrms":"22.91mA,OFF","OVERShoot":" ?,OFF","PREShoot":" ?,OFF","PERiod":" ?,OFF","FREQuency":" ?,OFF","RTime":" ?,OFF","FTime":" ?,OFF","PWIDth":" ?,OFF","NWIDth":" ?,OFF","PDUTy":" ?,OFF","NDUTy":" ?,OFF","SCREenduty":" ?,OFF","FRR":" ?,OFF","FRF":" ?,OFF","FFR":" ?,OFF","FFF":" ?,OFF","LRR":" ?,OFF","LRF":" ?,OFF","LFR":" ?,OFF","LFF":" ?,OFF","RDELay":" ?,OFF","FDELay":" ?,OFF","RPHAse":" ?,OFF","PPULsenum":" ?,OFF","NPULsenum":" ?,OFF","RISEedgenum":" ?,OFF","FALLedgenum":" ?,OFF","AREA":" ?,OFF","CYCLearea":" ?,OFF"}}
But for a manual command "MEASUrement:ALL?\n" does respond in a specific way.
It returns single TCP packet with 1450 bytes payload, which consists of binary data header and then JSON data in ASCII
Here is beginning and end of the packet. HEX bytes and then ASCII shifted for readability.
It would be perfect if you gave me correct definition name - #askValuesMathFormat, instead of looking very similar, but wrong #askModeMathFormat ;)
I've spent extra 1 hour before spot it during troubleshooting.
Can you send the data to me in a ascii hex format, then I can dump it in a Arduino to test with.That's ok to not wish to install Wireshark.
With ascii hex format I mean something like this: "a6 05 00 00 7b 22 43 48 31 22 3a 7b 22 4d 41 58" but including all the 1450 bytes. Using multiple lines is fine.
a60500007b22434831223a7b224d4158223a2233352e30306d562c4f4646222c224d494e223a222d35302e30306d562c4f4646222c22504b504b223a2238352e30306d562c4f4646222c2256544f50223a22093f2c4f4646222c225642415365223a22093f2c4f4646222c2256414d50223a22093f2c4f4646222c2241564552616765223a222d362e3734306d562c4f4e222c2253515541726573756d223a2231382e30346d562c4f4646222c22435943526d73223a22093f2c4f4646222c22435552536f72726d73223a2231382e30336d562c4f4646222c224f56455253686f6f74223a22093f2c4f4646222c2250524553686f6f74223a22093f2c4f4646222c22504552696f64223a2220203f2c4f4646222c224652455175656e6379223a22093f2c4f4646222c225254696d65223a22093f2c4f4646222c224654696d65223a22093f2c4f4646222c22505749447468223a22093f2c4f4646222c224e5749447468223a22093f2c4f4646222c225044555479223a22093f2c4f4646222c224e44555479223a22093f2c4f4646222c2253435245656e64757479223a22093f2c4f4646222c22465252223a22093f2c4f4646222c22465246223a22093f2c4f4646222c22464652223a22093f2c4f4646222c22464646223a22093f2c4f4646222c224c5252223a22093f2c4f4646222c224c5246223a22093f2c4f4646222c224c4652223a22093f2c4f4646222c224c4646223a22093f2c4f4646222c225244454c6179223a22093f2c4f4646222c224644454c6179223a22093f2c4f4646222c22525048417365223a22093f2c4f4646222c225050554c73656e756d223a22093f2c4f4646222c224e50554c73656e756d223a22093f2c4f4646222c2252495345656467656e756d223a22093f2c4f4646222c2246414c4c656467656e756d223a22093f2c4f4646222c2241524541223a22093f2c4f4646222c224359434c6561726561223a22093f2c4f4646227d2c22434832223a7b224d4158223a2232352e30306d412c4f4646222c224d494e223a222d36302e30306d412c4f4646222c22504b504b223a2238352e30306d412c4f4646222c2256544f50223a222020203f2c4f4646222c225642415365223a222020203f2c4f4646222c2256414d50223a222020203f2c4f4646222c2241564552616765223a222d31352e39346d412c4f4e222c2253515541726573756d223a2232332e31386d412c4f4646222c22435943526d73223a222020203f2c4f4646222c22435552536f72726d73223a2232322e39316d412c4f4646222c224f56455253686f6f74223a22093f2c4f4646222c2250524553686f6f74223a22093f2c4f4646222c22504552696f64223a22093f2c4f4646222c224652455175656e6379223a22093f2c4f4646222c225254696d65223a22093f2c4f4646222c224654696d65223a22093f2c4f4646222c22505749447468223a22093f2c4f4646222c224e5749447468223a22093f2c4f4646222c225044555479223a22093f2c4f4646222c224e44555479223a22093f2c4f4646222c2253435245656e64757479223a22093f2c4f4646222c22465252223a22093f2c4f4646222c22465246223a22093f2c4f4646222c22464652223a22093f2c4f4646222c22464646223a22093f2c4f4646222c224c5252223a22093f2c4f4646222c224c5246223a22093f2c4f4646222c224c4652223a22093f2c4f4646222c224c4646223a22093f2c4f4646222c225244454c6179223a22093f2c4f4646222c224644454c6179223a22093f2c4f4646222c22525048417365223a22093f2c4f4646222c225050554c73656e756d223a22093f2c4f4646222c224e50554c73656e756d223a22093f2c4f4646222c2252495345656467656e756d223a22093f2c4f4646222c2246414c4c656467656e756d223a22093f2c4f4646222c2241524541223a22093f2c4f4646222c224359434c6561726561223a22093f2c4f4646227d7d
Is there a way to add some text to the readout popup? In front or behind the shown value.
Example use cases:
- Several voltmeters at ones and would like to see the value on the screen but never remember what value comes from what meter.
This idea is good if there is nothing else on the screen already. The 'always on top' feature is so handy. I also move these things to different places sometimes, that would impose changing the wallpaper too.
Is there a way to add some text to the readout popup? In front or behind the shown value.
If this is not yet possible I would like to suggest it as an improvement.
I know the grid popup allows to identify the device on screen, but it is not as esthetic as the readout.
I want to test this software, but also I have a raspberry pi 3 wondering around and I'm thinking on running the software there, and leave the Raspberry for that task exclusively. Do you think it will work or maybe the RPI desktop environment is too slow?
But I want to ask for the help with adding to Test Controller support for Tenma 72-7715 dual channel thermometer.
First I want to know if it is even possible to add support for this thermometer.
I can use soldering iron with both hands and even legs, but have no idea about how communication protocols and similar stuff works.
So if anyone can help with this I would be very grateful.
But I want to ask for the help with adding to Test Controller support for Tenma 72-7715 dual channel thermometer.
First I want to know if it is even possible to add support for this thermometer.
I can use soldering iron with both hands and even legs, but have no idea about how communication protocols and similar stuff works.
So if anyone can help with this I would be very grateful.
TestController can work with serial and network connections. If the Tenma uses a virtual serial port it is possible to include it (But many newer devices use USB HID and TC do not support that).
Somebody has been working on a temperature measuring devices before, you can try searching this thread for it.
TC has Mastech MS6514
Somebody has been working on a temperature measuring devices before, you can try searching this thread for it.That was me. It was for Tasi device, different one. Likely it's not compatible with this Tenma.
Somebody has been working on a temperature measuring devices before, you can try searching this thread for it.That was me. It was for Tasi device, different one. Likely it's not compatible with this Tenma.
But I want to ask for the help with adding to Test Controller support for Tenma 72-7715 dual channel thermometer.
First I want to know if it is even possible to add support for this thermometer.
I can use soldering iron with both hands and even legs, but have no idea about how communication protocols and similar stuff works.
So if anyone can help with this I would be very grateful.
TestController can work with serial and network connections. If the Tenma uses a virtual serial port it is possible to include it (But many newer devices use USB HID and TC do not support that).
For communication with PC it uses "WCH CH9325" USB interface chip, which is UART - USB HID bidirectional converter.
Please let me know if it is possible or not possible to connect this device to TC.
It cannot be connected with that chip, the data before that chip is standard serial data. This means you can buy a TTL-serial to USB cable and solder it on to the input of the chip and get serial data that TC can handle.
Thank you for the answer.
I still would like to connect Tenma with thermocouples.
You mean cable like this: https://www.elextra.dk/da-DK/p/H45438?utm_source=GoogleAds&utm_medium=cpc&gclid=Cj0KCQiAmNeqBhD4ARIsADsYfTf0jr8N7nDCWD04vZST6gKz1QTX5yax7coI7ZEuXYDEHOmy3KRoV2UaAgUjEALw_wcB (https://www.elextra.dk/da-DK/p/H45438?utm_source=GoogleAds&utm_medium=cpc&gclid=Cj0KCQiAmNeqBhD4ARIsADsYfTf0jr8N7nDCWD04vZST6gKz1QTX5yax7coI7ZEuXYDEHOmy3KRoV2UaAgUjEALw_wcB)
If it is correct cable, I just can go to the shop and pick it up, they have two of them in stock at CPH shop.
Yes, but you have to check if it is 5V or 3.3V for both cable and device.
Update:
I think I got serial adapter working, it was some problems with the logic levels, I took apart adapter and desolder pull up resistor from RX input, now levels are ok.
About the functionality:
All functions, like start transmitting data and which data to transmit I can set on the thermometer itself, so thermometer not even need to receive any data (only commands it can receive is to start/stop transmitting).
What is needed is to somehow make TC to receive transmitted temperature values and correctly interpreter them.
Thermometer software recognize when thermometer is sending T1 temperature (probe 1 or channel 1), T2 temperature (probe 2 or channel 2), T1 minus T2 and Hi/Lo limits set on the devise for T1 and T2.
But thermometer can send only one temperature at the time, only T1 or T2 or T1 - T2.
So the thermometer is sending temperature values and designation of what channel it is T1, T2, or T1 - T2, plus Lo/Hi limit signals when in T1 or T2 mode (it also sending thermocouple type and probably the time H:M, which is counting at incorrect speed, but that is completely unimportant).
What you need is a terminal program that can show hex codes.
I usually use Termite for that: https://www.compuphase.com/software_termite.htm (https://www.compuphase.com/software_termite.htm)
You can probably use N81 is format, but will have to guess the correct baudrate.
The idea is to write down (Or copy to notepad) the message and write what the display shows beside it. It is important to have samples with a couple of different temperatures including negative.
Then see if you can figure out the meaning of the different hex codes, or you can post it here and somebody may help your with it.
I got the data from comport and I can see transmitted temperature values. I will figure out all the things and then will post the results, will compile it to be easy to understand.
When it works with TC I would like to include it, this means a picture (That I can publish on my website) of how your soldered the adapter to the meter would be useful.
Also note that it is best only to connect the TX data to the USB adapter, with the RX pin you may get two output pins connected together (This is only a minor detail, they will probably stay at same level all the time).
I will start describing transmitted data:
For me to do a definition I need some hex data in ascii format, not as a image (I am lazy and don't want to type the data myself).
For me to do a definition I need some hex data in ascii format, not as a image (I am lazy and don't want to type the data myself).
How I get you data in ascii format? Can I capture it like that, I need to figure it out...
For me to do a definition I need some hex data in ascii format, not as a image (I am lazy and don't want to type the data myself).
How I get you data in ascii format? Can I capture it like that, I need to figure it out...
How I get you data in ascii format? Can I capture it like that, I need to figure it out...
Like the hex in your first image, just not in a image, but directly as text in the post. I do need all the different temperatures from your second example.
I may have to modify some code in TC to handle negative temperature.
I am not going to look at it today.
This is how to solder serial adapter to the thermometer.
In my case logic level 0 was to high, to solve that I desolder pull up resistor from adapters RX input.
(Attachment Link)
This looks like a job for the block driver (AsciiBlock can also be used): https://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html#Binary_with_fixed_communication_blocks_(Block) (https://lygte-info.dk/project/TestControllerConfigDevice2%20UK.html#Binary_with_fixed_communication_blocks_(Block))
When you have posted a bit more I can do a initial definition for you or you can check the included definitions for some examples and make it yourself.
For me to do a definition I need some hex data in ascii format, not as a image (I am lazy and don't want to type the data myself).
The way TC works you will have one column with temperature and you may add another column with channel. Input data has to be numeric, you can not throw in a text string (Except if you play with bits).
I understand that now we in the stage, when it is clear, that Tenma could be connected to the TC.
But I live in an analog world (audio equipment, power supplies, etc.), yesterday first time in my life I had captured data from COM port, so I am learning while doing it.
I do not even know what "definitions" means in this case. So, I will need some hep with simple explanations of some things at the beginning.
Ok, I had looked a bit at "Test Controller, Configuration of non SCPI devices" page. Then find out what is SCPI.
If I understood correctly, the working principle of the TC is based on SCPI and Tenma is not SCPI device, so it needs translation layer, like AsciiBlock.
I have attached a definition, I have only tested with a few of your supplied data, i.e. I will recommend you do a full test.
You can place the file in TestController/Devices, either the one in the TC directory or better in the one in documents.
Awesome! It works.
I could not connect in the beginning, then I changed Baud rate in the definition text file to 2400 and it started to work.
I will do full test and let you know if it is any problems, right now it seems to work fine.
I definitely need to buy you a coffee for helping me with this and for making very awesome test software. If you have MobilePay, send me number to PM.
I have never gotten around to get MobilePay, they only way to send me money is paypal.
I have added a little bit more to the definition, with the new one there is a "View" button on the "Load devices" page.
It do also add the UNI-T device name
In TestController, I expect when using [LOC], that a ++loc is sent to the meter (and intercepted by the GPIB controller). But this is not the case. Nothing is sent. And nothing appears in the debug log...
I wrote a as small as possible definition for testing, and it seems that none of the TC GPIB commands are working. (I tried [CLR], [LLO] and [LOC] ). Example: #finalCmd [LOC]; or #finalCmd [LOC];[500];
So these findings are in line with the post of dl6lr above...
Can these commands only be used with the ASCII driver, or is something broken? I was testing with a AR488.
Yep, I see picture in "View", If you want I have picture of my device with soldered serial adapter and removed HID chip.
I have added the second picture and written a bit more in the notes.
Everything works as expected:
P.S. One more thing: After connecting thermometer to the PC, you need to press "SEND" button on the device to start sending data, then start TC or press "Reconnect", otherwise TC will not initialize the device.
Out of curiosity: How do you test the different temperature?
Do you have a thermocoupler simulator (I often use that) or do you use a reference/power supply with a voltage divider (Or do you use another way).
Thermocouple simulator would be needed for calibration, for this testing iron and torch is perfect.
I planned to use reference voltage source, but thermocouple and temperature controlled soldering iron and torch is much faster.
For negative temps same thing (iron and torch), but if you will set T1 - T2 temperature, then if one thermocouple is heated - thermometer shows negative temp, if another - positive. Oh, forgot to mention refrigerator.
Thermocouple simulator would be needed for calibration, for this testing iron and torch is perfect.
You hit about 400 degrees in your chart, that is not from a solder iron (Or you mistreat your iron ;) ), but a flame makes sense.
If you work a lot with thermocouplers a simulator (Process calibrator) is a good investment, but there are some caveats with them.
I looked at the good thermocouplers simulators, the price is something I can not justify. If I will needed for the work, then it is no problem, but for mostly hobby, it is no no.
______how well they adhere to the curve.
Also be aware that a termocoupler measures temperature differences and that can give some issues.
You hit about 400 degrees in your chart, that is not from a solder iron (Or you mistreat your iron ;) ), but a flame makes sense.
Yes, how well they adhere to the curve, that is programmable thing, on factory made thermometers not possible to change, they will have hard-coded look up table for that.
Temperature differences will make some troubles too, internal thermo sensor for ambient temperature compensation should also be working properly by it self and in soft.
But I will look at places like Aliexpress. Recently I bought Yaorea YR1035+ battery impedance meter from Aliexpress, 0-200 ohm, 0-100V. Was little bit impressed, turns out it is not crappy device. They even send instructions in English, and device menu was in English already.
Tenma Time Test
Now I am editing this post at 6:20 AM, Tenma was running with TC all evening and all night without connection drop or other problems, I think it is stable.
So, I stetted Weller to max 450 °C and when it heated up I blasted soldering iron tip with the blow torch to heated up it even much more,
The main problem with that sensor is placement, I have a Fluke thermocoupler meter where it is basically glued to the connector, but all the other thermocoupler meters I have it is far from the connector, i.e. you may need to let the meter stabilize for a few hours before it is precise.
Tenma Time Test
Now I am editing this post at 6:20 AM, Tenma was running with TC all evening and all night without connection drop or other problems, I think it is stable.
Nice to hear. I would expect it to be stable, TC do not have any issues running and logging for days and can handle millions of samples.
You can get high power hand pieces, I have a WP120 (120Watt) with a thick tip for that kind of work and a WP80 with a thin tip for more normal work.
Yes, Tenma 72-7715 has thermosensor between connectors:
But I have Brymen 869S (which also supports two thermocoupless), not sure if it even has compensation sensor, or where it is?
I tested for data transmission drop, TC just records zeros and when transmission begins again, TC continues to record data:
Only if I physically disconnect and reconnect serial to USB atapter from the PC, TC continues work and logging is running, but it not reconnects thermometer, and "Reconnect" button is disabled:
I tested for data transmission drop, TC just records zeros and when transmission begins again, TC continues to record data:You may be able to change that on the configuration page with the "Timeout handling" (Not all drivers uses it and I do not remember if Block does).
Only if I physically disconnect and reconnect serial to USB atapter from the PC, TC continues work and logging is running, but it not reconnects thermometer, and "Reconnect" button is disabled:
Reconnect is always disabled when logging. You have to stop logging first, then you can reconnect and start over.
TC do not know what devices will respond to a reconnect and for that reason it need to reinitialize with the devices connected after the reconnect.
Somebody asked about how to save and restart logging, because he wanted to log over very long time. I posted a script that can be used for that and adding a #RECONNECT and #WAITREADY statement to it would do a reconnect each time and maybe recover any lost devices.
You may be able to change that on the configuration page with the "Timeout handling" (Not all drivers uses it and I do not remember if Block does).
But I will look at places like Aliexpress. Recently I bought Yaorea YR1035+ battery impedance meter from Aliexpress, 0-200 ohm, 0-100V. Was little bit impressed, turns out it is not crappy device. They even send instructions in English, and device menu was in English already.I have looked at the version without the +: https://lygte-info.dk/review/InternalResistanceMeterYR1035%20UK.html (https://lygte-info.dk/review/InternalResistanceMeterYR1035%20UK.html)
In TestController, I expect when using [LOC], that a ++loc is sent to the meter (and intercepted by the GPIB controller). But this is not the case. Nothing is sent. And nothing appears in the debug log...
I wrote a as small as possible definition for testing, and it seems that none of the TC GPIB commands are working. (I tried [CLR], [LLO] and [LOC] ). Example: #finalCmd [LOC]; or #finalCmd [LOC];[500];
So these findings are in line with the post of dl6lr above...
Can these commands only be used with the ASCII driver, or is something broken? I was testing with a AR488.
The beta version I posted a link to above (Post #3220) has added these commands to the SCPIx driver, but it is not tested.
with original Prologix
=============
;; K199: Tx <clear>
;; K199: Tx <tx [CLR]>
;; COM27: Tx: <++CLR.> 2B 2B 43 4C 52 0A <--- UPPERCASE, is not a valid command
;; K199: Delay: 1000ms
;; K199: Tx <goLocal>
;; K199: Tx <tx [LOC]>
;; COM27: Tx: <++LOC.> 2B 2B 4C 4F 43 0A <--- UPPERCASE, is not a valid command
Using a AR488
=========
;; K199: Tx <clear>
;; K199: Tx <tx [CLR]>
;; COM15: Tx: <++CLR.> 2B 2B 43 4C 52 0A <--- UPPERCASE, but is executed by AR488
;; K199: Delay: 1000ms
;; K199: Tx <goLocal>
;; K199: Tx <tx [LOC]>
;; COM15: Tx: <++LOC.> 2B 2B 4C 4F 43 0A <--- UPPERCASE, but is executed by AR488
;; K199: Delay: 1000ms
;; COM15: Close
- With the Prologix the ++CLR and ++LOC are not executed, the meter stays in remote.++ver
Prologix GPIB-USB Controller version 6.107
++VER
Unrecognized command
++CLR
Unrecognized command
++LOC
Unrecognized command
It turns out that the commands in the Prologix command language should be in lowercase. The AR488 is tolerant for CAPITAL LETTERS, and executes the command just the same. But the original Prologix is not tolerant! A command in CAPITAL LETTERS is NOT executed, and the Prologix returns an error message.
By the way, do you still test batteries?
When i try to add an AR488Lan Interface from the GPIB Menu, Test Controller adds a normal AR488 interface where i can not set the ip adress and just the serial port.
I think this is a bug.
TC do not have that function, but it can easily be done with scripting in TC, including naming the files with a sequence number or a date.
This example will save every 10 seconds and then restart the log:
#while 1
#log 1
#delay 10
#log 0
#savetable ("c:\\data\\log"+date())
#endwhile
Place it in the "log" window and press "Run", it will log from all connected devices
If I will use this script, then by automatically saving partial logs and restarting the table each time, TC will not use a lot of RAM on the PC, when logging very long time?
And please explain me one thing, when I import CSV to Open Office spreadsheet, "minutes" and "date" are presented in strange way. Can not figure out how to convert it in to actual minutes and date:
In this scripting example above to start a log from the command prompt, is it possible to add a line to set the logging frequency as well? I.e. can I define that I want data to be logged e.g. every third second by script?
Easily, the number after the #log command is the logging interval in seconds. You need to use #log 3 for every third second, values like #log 0.1 is also possible (10 times a second).
I answered most of it above, the actual format of dateTime is Unix, i.e. seconds since Jan 01 1970.
Is there any way to have a dedicated button, which starts logging by single click with predefined interval?
I find it complicated and annoying that I need to do extra steps than just a single click:
- one click on Log button;
- move mouse down to X seconds option;
- click one more time on desired interval.
Also, one more feature request - clean up current collected values by a singe button.
This would allow to avoid stop/start again steps, which I should perform each time for such cleanup.
I'd love to see such button everywhere where we have buttons Save/Export. First of all its on Chart and Historgram tabs.
What do you mean bu clean up?
What do you mean bu clean up?
Imagine when I had Log running and want to start it as a new logging, to forget min/max/avg values and have a new/fresh only values on Graph, Table, Chart tabs
And I want to perform it easily, preferably by single click on a dedicated button on those tabs in TC.
Can you add a note on your website about the release date so we know if it's been updated recently?
Hi Everyone
managed to "fix" my issue... not nice, but it works....
#idString ID HP6033A
Been busy doing a device file for my new UNI-T UT622 LCR meter.
Works quite well with Test Controller. Except for the fact that it will log only ESR and not Capacitance. But the values are being logged in Table. Strange.
Also the supplied software apparently uses some commands not detailed in the manual.
Like "Clear", "Parallel", "Serial" and "REC", for example. Will probably have to sniff these.
The values from the UT622 are to be found for both Capacitance and ESR in the Table. But only the values for ESR are to be found in the graph. Strange. Will look into this tomorrow.
Setting the range for the graph manually works for UT 622 Capacitance.
For some reason "Auto" will not set the range properly. See piccies
I made some modifications to my Battery Test Script.
I'm having trouble connecting my Fluke 8846A to TestController and I'm not seeing why.
The definition only support network connection, you can easily change that:
Find the line:
#port 3490
in the definition and change it to:
#port 3490 com
After restarting TestController, removing 8846A from the loaded list and adding it again, you can click on the "Socket" text and select serial instead.
OK, I did that and I now get the error message:
;;FT232R USB UART (COM3) Device FLUKE,8846A, do not match. *IDN?
When I successfully connected way back when, I did need to use "Scan Serial Ports", so I assume it was finding it that way. Now it will find my attached 34401A just fine by scanning serial ports even if I don't have it specifically loaded, so that much is working. However, even with the Fluke 8846A loaded, I get this error. The 8846A does have newer firmware than when I used it previously.
I also am connecting an HP 34401A and that seems to be working reliably. I have two identical Fluke-branded RS232 to USB cables and if I swap them between the two meters, TestController finds the 34401A right away just by scanning the serial ports. I used the terminal program to look at the 34401A, and *IDN? returns the exact string (up to the second comma) as shown in the #idstring entry of the configuration file.
Made an new script for testing Power Supplies with an Electronic Load.
Start with giving up the parameters off the supply and starting from Zero current
to maximum current in number of steps you want.
Stops when the supply is overloaded.
Do you have any echo enabled? You get the answer "*IDN?", not the device id (The text if do not match: is the actual answer TC tries to match to the device id).
Starting TC in debug mode may help a bit.
So I got it to nominally work at this point, but I'm still not 100% sure of the real issue and I'll test more later. What I did was add the line #baudrate 9600N81 to the Fluke8846A.txt file, and then in the meter's RS232 menu I changed the EOL setting from "CRLF" to "LF". I tried using the line #eol CRLF in the TestController config file, but that didn't work.
I was looking in the documentation for a complete list or explanation of the appropriate arguments to go after #baudrate and #eol, but I didn't find it. Is it there?
I will add that to the user script, but I do not have the time today.
Just a note: TC do not use {} in its language, they are obvious ignored (That may change at a later date) or your script would not work.
OK, I will remove them and update the script as soon as posible. Maybe better to wait a while before adding.
Done. Replaced script files in both posts with scripts for Battery- and Powersupply test.
Added it, but you did not change both scripts for the first one.
I had not added the line:
#scriptInterface Load setCurrent setOn readVoltage setVoltage
OK now.
{} were removed allready.
Just for information PX100 owners. I get reading errors when make settings during running.
On / Off buttons in Device PopUp for Atorch PX100 devices is not working.
Replacing with:
#cmdSetup buttonsOn On/Off
:read: on?
:write: on
:updatedelayed: 0.5
Off 0
On 1
:tip: Turn load On or Off
works OK.
Did not attach my devicefile because I enabled Temperature etc.
Made some modifications in the Riden 60xx device file.
In PopUp in the tab for memory settings itow was not working, wrong register adresses.
Working now. Tested with RD6012
I am not sure what the difference is to the existing definition?
Updated my Powersupply test.
Once I bought an ADC10F103C and didn't nothing with it.
3.3 volt max. input makes it not always useful for me.
I liked to have an universal voltage logger,
so I made an resistor interface and so it is an usefull voltage logger to max. 60v.
I'm starting out on TestController the hard (?) way: by defining a new device (Fluke 8808A).
I'm not sure if the following is normal or unusual... but in any case it doesn't seem to be documented that I see... nor have I seen it discussed.
Measurements returned by this device may be either of these formats:
Tx <meas?>
; F8808: Rx <+28.399E-3 VDC>
;; F8808: Rx as numbers <0.028399 NaN>
or (if doing two simultaneous measures)
Tx <meas?>
;; F8808: Rx <+1.192E-3 VDC,-0.001E-6 ADC>
;; F8808: Rx as numbers <0.001192 NaN -1.0E-9 NaN>
(I *may* be able to disable the unit info, although that seems valuable for auto-changing the measurement mode???)
1) Units
Clearly this DMM provides measurements using engineering units (ie powers of ten scaled by multiples of 3)
This is not documented in the #value setup. What am I supposed to use for #value here?
2) Measurement type
Are there examples of reading from DMM's that supply the type of measurement?
3) Single / Double measures
I see two types of double-measure documented lightly:
DMM and DMM:2 (for in essence two whole meters)
vs a more complex setup supporting primary/secondary measures (haven't figured that out yet.)
Any recommendations on which path to take?
I have added the update to my webpage: https://lygte-info.dk/project/TestControllerUserScripts1%20UK.html#Power_supply_load_sweep_by_Pukker (https://lygte-info.dk/project/TestControllerUserScripts1%20UK.html#Power_supply_load_sweep_by_Pukker)
This is also added to my webpage: https://lygte-info.dk/project/TestControllerUserProjects1%20UK.html#10_channel_12bit_ADC_module_addition_by_Pukker (https://lygte-info.dk/project/TestControllerUserProjects1%20UK.html#10_channel_12bit_ADC_module_addition_by_Pukker)
It is a nice way to make the module more practical, now it just need a 3D printed box (This would required a USB extension cable).
It is a nice way to make the module more practical, now it just need a 3D printed box (This would required a USB extension cable).
Nice, but the 3D printer is missing here.
but will take an box, drilling, sawing etc.
Noob question: is there a way to reliably reload the definition file for a device from within TC? "Reconnect" doesn't do that. :(
Sure would be handy while I am working up my device definition!
USB-Serial Driver for Win 10/11
I have a USB-Serial dongle, marked Eminent 1016 but actually is Prolific 2303 GC aka Prolific 2303HXA
Here's the latest best driver. Do NOT use the most recent from Prolific. https://github.com/johnstevenson/pl2303-legacy/releases
Without this driver (or 3.3.2.102 but that version has other issues), I got "Error 433" from any serial/terminal app, and TC didn't think the COM port existed at all.
If you're having serious issues, running a free trial of "Free Device Monitoring Studio" from HHD Software may be very helpful. It traces 100% of all signals on the serial port!
Correction for ID String Definition
The documentation says:
- #idString first two parts of *idn? answer
- The idstring is the brand name and the device name
The correct answer: The idstring must exactly match the first portion of the *idn? answer, including any blanks etc.
Example: if *idn? returns "BRAND, MODEL,..." then this line must be "#idString BRAND, MODEL," (and not "#idstring BRAND,MODEL,")
I have a ET5420 and I'm making progress getting it to talk with Test Controller (under linux) - it can pull the version number - but the model number is where it fails. If I look under system info on the 5420 there are 4 entries:
PRODUCT MODEL
S/N
Software Version
Hardware Version
There is no entry under PRODUCT MODEL - and this is a read only section - no way to enter one. When I run Test Controller it comes back with this:
Device ET5420 do not match: ÿÿÿÿÿÿÿ,V1.02.2127.002,09422132071,V1.03.2136.003
EDIT: I edited the Device file for the 5420 and replaced the idString name with ÿÿÿÿÿÿÿ. Got by the "do not match" error anyway...
1) What causes the expected # of values to change, in #askValues, in the current values list, in the table, regular table, in the chart? It's not clear.
(I see something about "mode based" but stil not clear)
2) Is there a way to modify the number of values returned by #askValues based on a condition?
My example: if I request two but only have one value being measured, the meter returns "!>" as an error string as a result!)
I'm thinking I need to generate some kind of return string with <1st value>, then if value2 is NOT "!>" then append (separator?) and <2nd value>
*The number of expected and shown values is directly controlled by the number of enabled columns (#value statement)
* The #value statement can optionally have one or more mode names listed (DMM's always has this).
* This mode is read from the device (#askMode ...).
* It is possible to have multiple modes active simultaneous.
...
* It is possible to adjust #askValues based on mode
What I did NOT hear is any way to directly tweak the number of values produced from data returned by the DMM.
If the mode on/off commands contain [localmode] the state of the mode is handled by TestController and need not be included in the #askMode. With local mode it may not be necessary to send commands to the device, but only to add more columns and modify the #askValues command with the [mode:xxx] tag.
...
"Changing number of columns, device mode is not used (Note: m2 test is not used, but must be present)."
#cmdModeCheck modeLabel deviceModeString defaultState
mode on commands
mode off commands
modes where this mode is valid, use ! to invert mode. (This line is optional)
* In the example, "deviceModeString" is always "m2" and is present in #cmdMode and #cmdModeCheck#askValues FETC?[mode:Frequency_Voltage,Frequency_Current,DCV_Power,DCI_Power,dB,dBm];FETCH2?[mode:DCV_Power,DCI_Power];CALC:POW?[mode:Limit];STAT:QUES:COND?[mode:Statistics];CALC:AVER:COUN?;CALC:AVER:MAX?;CALC:AVER:AVER?;CALC:AVER:MIN?;CALC:AVER:SDEV?;CALC:AVER:PTP?
; Format of answer: f=float, u=remove trailing letters, x=skip, *=Zero upper case values if this value is 0
#askValuesReadFormat FFFFFFFFFF
Does this mean that if I want to incorporate some calculated values...
* That too is one of these major hiccups requiring reconfiguration?
* And, do I therefore need to invent a mode for that?
My Interpretation of the above
- Each #cmdModeCheck defines an independent additional mode that can potentially be active simultaneously.
- Best to always use [localmode] for multi-mode devices. We have no instructions or examples of non-local (ie where the device returns good multi-mode data on its own)
- The third line ("modes where this is valid"...) defines how this mode interacts with all other modes, in the sense of a filter. (?? By default this mode is available with all other modes. If not, then some combination of positive inclusion and/or negative removal must be used. ?? )
- For multi-mode value reading, #askValues and #askValuesNumberFormat is used to define and limit the number of values to be read. See below.
Here's an example from R&SHMC8012.txt:Code: [Select]#askValues FETC?[mode:Frequency_Voltage,Frequency_Current,DCV_Power,DCI_Power,dB,dBm];FETCH2?[mode:DCV_Power,DCI_Power];CALC:POW?[mode:Limit];STAT:QUES:COND?[mode:Statistics];CALC:AVER:COUN?;CALC:AVER:MAX?;CALC:AVER:AVER?;CALC:AVER:MIN?;CALC:AVER:SDEV?;CALC:AVER:PTP?
; Format of answer: f=float, u=remove trailing letters, x=skip, *=Zero upper case values if this value is 0
#askValuesReadFormat FFFFFFFFFF
- Counting in #askValues, one sees up to ten values returned depending on the combination of active modes. Thus, #askValuesReadFormat specifies ten floating point numbers.
- Sometimes a single mode produces more than one value (eg Statistics); sometimes a single mode is present in more than one list, which is another way to produce multiple values (eg DCV_Power).
- In #askValues, the modes listed in a group [mode:Mode1,Mode2...] are "OR'd" together: the following associated values are expected if any of the listed modes are active.
One more question that's slightly related:
In defining #cmdMode, the docs say:
- All defined modes are shown in a popup window, where they are sorted in alphabetically order.
- It is also possible to add empty positions with #cmdMode (on a line by itself)
Normally, a sorted list puts all empty records at the start or end. QUESTION: By any chance, does adding #cmdMode as a blank, cause a separate alphabetical sort before and after the blank?
The empty definitions are only valid when you take over the design by specifying a
#cmdModeLayout columns row
Then you are using the empty #cmdMode to get the best layout
Depend on the device, if you can read the mode from the device it is a more reliable way to track the modes
@HKJQuoteThe empty definitions are only valid when you take over the design by specifying a
#cmdModeLayout columns row
Then you are using the empty #cmdMode to get the best layout
Ahh! So #cmdModeLayout also turns off the auto-sort!
QuoteDepend on the device, if you can read the mode from the device it is a more reliable way to track the modes
I didn't find any example of using #cmdModeCheck to define a device-readable mode. Is there one I missed?
#interface read... column
#interface read... column column...
The definition of read is very easy, because it uses the same reading as "current values" and logging, i.e. the "#askValues" command and only the actual index of the value must be specified. For multichannel devices multiple indexes must be listed, one for each channel. The first value the device returns is numbered 0.
The read definitions also defines a name... command that can be used to get the column name for the value from the actual device.
;Rigol DM30xx, Fluke8846A
#interfaceType DMM BMM
#interface readValue 0
;Fluke8845A
#interfaceType DMM BMM
#interface readValue 1
;R&SHMC8012
#interfaceType DMM BMM
#interface readValue 0
#interface readValue2 1
#interface readPower 2
;MTX328x
#interfaceType BMM
#interface readValue 0
#interface readValue2 1
#interface readValue3 2
#interface readValue4 3
Documentation says:Quote#interface read... column
#interface read... column column...
The definition of read is very easy, because it uses the same reading as "current values" and logging, i.e. the "#askValues" command and only the actual index of the value must be specified. For multichannel devices multiple indexes must be listed, one for each channel. The first value the device returns is numbered 0.
The read definitions also defines a name... command that can be used to get the column name for the value from the actual device.
QUESTIONS:
1) Given that the parameter to these is a zero-based column number, is it a bug to have only "#interface readValue 1" ?
2) The document suggests using "readValue column column..." but nobody does that. Instead they have separate "readValue 0" "readValue2 1"... WHY?
3) What's the meaning of readValue, readValue2, readValue3...? Not documented.
4) In NO case do I see any of these used anywhere else in the device files, nor the auto-generated nameValue* that's described. Do these definitions set up something inside TC?
5) One device has "BMM" without "DMM". I have not yet found an explanation of what these interfaceTypes actually accomplish. Is there a table somewhere of perhaps variables or controls that are defined or enabled through use of these?
... I have keitley2000 and 2001 TSC scan multiplex card. It works with SPI protocol. Any simple way to use the multiplex channel wit Testcontroller? I would like to use it to monitor 3 different voltage reference signals from some boards I am setting up. :)(Search at top-right... "multiplex" has not been said before ;) )
Just a minor UI request: when importing a log file into the table to quickly review the charts, it would be nice to have a "Select All" checkbox for the listed parameters that have been logged, instead of having to check each individual box.
I'm working on the definition for a BMM with primary and secondary modes/measures (Fluke 8808A). As is common, some functions are only available on primary, and there are limitations on which functions can be used on secondary.
I've got all the primaries working ok. Secondary has me a bit confused. I have two questions, both relating (I think!) to #cmdModeCheck:
Background: I'm using #cmdModeCheck for the secondary measurements, and for the modifiers (Rel, MinMax, etc) particularly because it allows defining which (primary) modes are allowed. (In general: any combination of DC/AC Volts/Amps can be on either one; can do ohms on P or P+S (and select 2/4 wire on P), Freq with select other things, and Modifiers go with almost every Primary mode.)
1) Modes Where This Mode Is Valid
I am not understanding how this line functions.
If I define the valid modes, and the invalid modes (with !Mode)... OR just define the valid modes... The result is that I get grayed-out result no matter what I do, unless I remove this line completely??!
2) How to do interlocking secondary modes?
If I choose Secondary AC Volts, by definition any other Secondary mode is no longer active. So that's not exactly a check-uncheck item... more like a second set of mode radio buttons.
It's pretty clear to me that the Mode Off Commands in #cmdModeCheck can't be used in this case. Those appear to ONLY work well when thinking of a single #cmdModeCheck as an isolated item that can be turned on/off.
So... how would you suggest handling a secondary set of modes that interlock? It almost feels like a radio button version of #cmdSetup??
This can't be the first device that has such a setup...
Hello,
Not sure if already addressed in the 129 pages. :) I have keitley2000 and 2001 TSC scan multiplex card. It works with SPI protocol. Any simple way to use the multiplex channel wit Testcontroller? I would like to use it to monitor 3 different voltage reference signals from some boards I am setting up. :)
Thanks, Jorge
Test controller do not have the concept of multichannel device only returning one channel value at a time, it always needs all channels simultaneous. If you can setup a couple of commands to return all values, you are on (That may mean a low log rate).To say the same thing in a perhaps overly optimistic way ;)... many BMM devices pull multiple values sequentially in their #askValues command. The R&S8012.txt device uses 3-5 commands in a row to accomplish that. The Fluke 8808A I'm working with now does that. Depending on the specific measurements involved, yes the log rate can vary from dozens per second to one log every two seconds worst case :)
@HKJ a seemingly dumb question, but not actually documented (four items are listed but not documented at the bottom of https://lygte-info.dk/project/TestControllerPopupLog%20UK.html )
What does #haslogged actually do? I see in one of your scripts that you have two of those in a row. This indicates it does more than simply "sync" with the log file... ;)
Q1) deviceMode(handle) and isDeviceMode(handle,mode) are great for testing modes. Is there a function that lets me set/clear a mode?
Q2) Is there a way to do some math in #cmdModeCheck so I can code the interactions between #cmdModeCheck items? :)
Q3) If not Q2 (and maybe anyway ;) ) ... is there a way to set/clear Modes within the UI of #cmdSetup?
(Something that *appears* to approach this is the fancy mode capture code in devices like Siglent SDL10xxXxx... yet (I could easily be wrong on this as a noob ;) ... it appears to be capturing, not changing modes.?)
Is there a global or system variable that can be queried to determine whether logging is currently running?
I have Test Controller executing a batch file that launches putty and logs the output to a filename, but would like to be able to leave a script running in the background that can execute my "close putty" script if I stop logging in Test Controller.
Not vital and if need by I'll come up with a work-around, but thought it worth asking the question.
All the #cmdMode stuff is static definitions, they get parsed once when the device is loaded. The #cmdModeCheck get enabled/disable by parsing the mode names, the parser assumes enabled and if any of the listed mode check fails it will be disabled.
So my question relates to how could one feed dynamic information into (or within) the system so that #cmdModeCheck modes are correctly turned on and off? I guess enable/disable was the wrong way to ask it ;)
TC do not have that function, but it can easily be done with scripting in TC, including naming the files with a sequence number or a date.
This example will save every 10 seconds and then restart the log:
#while 1
#log 1
#delay 10
#log 0
#savetable ("c:\\data\\log"+date())
#endwhile
Place it in the "log" window and press "Run", it will log from all connected devices
If you want to format the date different check here: https://lygte-info.dk/project/TestControllerFunctions%20UK.html#Date_&_time_functions (https://lygte-info.dk/project/TestControllerFunctions%20UK.html#Date_&_time_functions)
This is great, thanks a lot. One question though, the CVS file that is automatically saved with this script has the default dateTime format in Unix time, i.e. just a long number in seconds. Is there a way to change the log format of the date by script? Im not talking about the date in the file name, but the actually logged time stamps.
#cmdModeCheck with [localMode] is another way.Ahh! So #cmdModeCheck without [localMode] isn't fully implemented yet?
#cmdModeCheck modeLabel deviceModeString defaultState
#cmdModeCheck secVDC VDC2 0
VDC2
*CLS
!pFREQ,!pDIODE,!pCONT
#cmdModeCheck secCLR CLR2 0
CLR2
*CLS
!pFREQ,!pDIODE,!pCONT
Anyway... shouldn't TC see the secondary modes in #askMode and cause the other #askModeCheck checkboxes to clear? I.e. the ones that don't have [localMode]?
When you say "two way control" do you mean the ability to set both primary and secondary measures? Or something else?Anyway... shouldn't TC see the secondary modes in #askMode and cause the other #askModeCheck checkboxes to clear? I.e. the ones that don't have [localMode]?
That is correct, TC do not in any way control the checkboxes, that may not be ideal and I probably have to fix it in a future version. There is one issue with two way control: It can get into a loop
The reason is that not all devices changes immediately, but may take up to a few seconds.
When you say "two way control" do you mean the ability to set both primary and secondary measures? Or something else?
It seems this potential issue is there for any device that has multiple channels or simultaneous modes (ie multiple values read.)
Having a secondary set of modes seems pretty common, both in bench meters and multi channel devices.
Further info for understanding:
- #AskValues is simply "MEAS?" which returns one or two values
- #AskMode is a little trickier, but not hard: I pass through the primary mode, and append "2" to the secondary mode if it exists.
- Modifiers and (Fixed vs Auto) ranging apply only to the Primary mode; Secondary does something appropriate ;)
FWIW, I am noodling over what it would take to treat the secondary modes as a second channel. The hard part there (maybe) is that there are interactions in terms of what is allowed. Plus, I don't actually see any examples of #askMode being applied in a multi-channel sense.
- Could I format a second incoming mode as "VDC2:2" and have the ":2" treated as channel 2???
- How would channels be defined in mode definitions? Maybe #cmdMode secVDC VDC2:2 (ie on channel 2 (":2"), send string "VDC2" to set this mode)
I'm probably being creatively stupid here LOL
;; OwonXDS: Tx <:MEASU:CH1:VAMP?>
;; OwonXDS: Rx <Va : 1.829V->>
;; OwonXDS: Tx <:MEASU:CH1:FREQ?>
;; OwonXDS: Rx <F : 1.759KHz->>
I did some extra searching and found a previous answer:
#askValuesReadFormat xxs
;; COM4: Tx: <READ?.> 52 45 41 44 3F 0A
;; HP34401A: Tx <system:local>
Thread for HP34401A
java.lang.NullPointerException: Cannot invoke "dk.hkj.comm.CommInterface.write(String)" because "this.ci" is null
at dk.hkj.shared.SharedInterface.writeWithDelay(SharedInterface.java:114)
at dk.hkj.shared.SharedInterfaceAR488.write(SharedInterfaceAR488.java:68)
at dk.hkj.comm.GpibInterface.write(GpibInterface.java:59)
at dk.hkj.main.SCPICommand.writeReadInternal(SCPICommand.java:316)
at dk.hkj.main.SCPICommand.writeRead(SCPICommand.java:339)
at dk.hkj.main.DeviceInterface.doCommand(DeviceInterface.java:83)
at dk.hkj.devices.DeviceSCPI.close(DeviceSCPI.java:154)
at dk.hkj.main.InterfaceThreads$DeviceThread.run(InterfaceThreads.java:1638)
;; jSerialComm version: 2.10.3
;; COM4: Set params: 115200
Exception in thread "Scan ports" java.lang.ClassCastException: class dk.hkj.comm.DummyInterface cannot be cast to class dk.hkj.comm.SerialInterface (dk.hkj.comm.DummyInterface and dk.hkj.comm.SerialInterface are in unnamed module of loader 'app')
;; Start thread for: AR488 A:14 - Agilent 34401A Enhanced
at dk.hkj.main.InterfaceThreads$ScanPorts.addDevicesShared(InterfaceThreads.java:643)
at dk.hkj.main.InterfaceThreads$ScanPorts.run(InterfaceThreads.java:791)
;; Stopping thread for: AR488 A:14 - Agilent 34401A Enhanced
You can have multiple commands after #askMode (Like #askValues), TC will look at the full answer and split it on spaces/commas, each item will be a mode. You can also do math (#askModeMathFormat ) on the result to split it into multiple modes.
when i use an AR488 with test controller only one device at a time works, as soon as i enable 2 devices in "Load Devices" i get
It works independently with both devices, but not both together.
And when does the new version with the fixed AR488Lan gets released?
The bug that the AR488Lan adds a normal AR488 is still in the current version.
I tried Prologix LAN also had no luck with it.
Thank you for your hard work!
SO... Is the following a ridiculous idea, or potentially useful?
;; jSerialComm version: 2.10.3
;; Start thread for: AR488Lan A:2 - HP 66311B
;; Stopping thread for: AR488Lan A:2 - HP 66311B
Thank you,
i can configure an AR488Lan now, but i still its trying to use some local port:Code: [Select];; jSerialComm version: 2.10.3
;; Start thread for: AR488Lan A:2 - HP 66311B
;; Stopping thread for: AR488Lan A:2 - HP 66311B
The local com port its still working and the AR488 is also working via telnet.
If you dont have time for TestController, have you thought about hosting the sourcecode an github?
You put a lot of effort into this awesome software, it would be sad if the development stops.
I am not really sure what the problem is here.
I added an AR488Lan with the ip, but it seems like it TestController is not trying to connect via a the TCP/IP connection.
When i use the normal AR488 with it plugged into a USB Port its still working.
I can address the AR488Lan via Telnet from my pc, so there should be any connection.
Can you maybe add more debug messages in the jar file, for me it seems like its tying a local port in the AR488Lan mode because if the jSerialComm message.
In addition for my ADC10F103C resistor interface in Post 3299
like to share an option for Current measurement with an ACS712 interface.
I have added it to the page.
These modules are nice, I did a DMM adapter with one of these modules a long time ago: https://lygte-info.dk/info/CurrentAdapter%20UK.html (https://lygte-info.dk/info/CurrentAdapter%20UK.html)
Don't like high currents in my DMM. :bullshit:
I added an AR488Lan with the ip, but it seems like it TestController is not trying to connect via a the TCP/IP connection.
When i use the normal AR488 with it plugged into a USB Port its still working.
I can address the AR488Lan via Telnet from my pc, so there should be any connection.
Can you maybe add more debug messages in the jar file, for me it seems like its tying a local port in the AR488Lan mode because if the jSerialComm message.
If is not tested, but is a copy of the Prologix Ethernet that I know works.
I found the problem.
The port of the prologix TCP/IP socket is 1234, while the AR488Lan is 23.
I edited the firmware of the AR488Lan and recompiled it to host the socket on 1234, and it works now with all my devices simultaneously.
So it would be great, if you could change the port for AR488Lan to 23 in a future release.
thanks for the fast reply.
Does DMM2 support TCP communication?
Because when i change the driver to DMM2 i lose all debug information.
The only thing written in the debug window is:Code: [Select]Starting
;; jSerialComm version: 2.10.3
Thats why i used AsciiBlock in the first place.
DMM2 do not support socket, but I will look at adding it.
In the meantime you can reprogram your micro for serial interface and work on the definition.
;; jSerialComm version: 2.10.3
Exception in thread "Scan ports" java.lang.ClassCastException: dk.hkj.comm.SocketInterface cannot be cast to dk.hkj.comm.SerialInterface
at dk.hkj.devices.DeviceDMM2.getCommInterface(DeviceDMM2.java:288)
at dk.hkj.main.InterfaceThreads$DeviceThread.<init>(InterfaceThreads.java:1432)
at dk.hkj.main.InterfaceThreads$ScanPorts.addDevicesSocket(InterfaceThreads.java:671)
at dk.hkj.main.InterfaceThreads$ScanPorts.run(InterfaceThreads.java:806)
It there any progress in this matter?
With the test version you uploaded, the output is different from the version from november, but its still not working.
I also attached the schematic, sourcecode and 3D printable case files i used for the adapter.
I noticed there's an :update: line missing from the Itech IT85xx definition file for the constant resistance mode. I've added it in to the attached file.
Try download TC again
If you have a picture or two of the finished adapter and how it fits on the meter, I may add it to the project page.
To turn on the load DL24M command line:That is, except for one detail. The ON button does not yet work on the DL24M. The load must be turned on manually with the button on the load display. I can't solve that yet.
Please incorporate these changes into your program and I hope this helps someone. I am very satisfied with your TC so far.
This line controls on:
#scpiCmd on tx 1 (value) *dd
Maybe you have to get rid of the *dd?
if that doesn't work you can try:
#scpiCmd on tx 1 (value?0xffffff:0)
#idString Voltcraft, VC870,
#name Voltcraft VC870
#handle VC870
#driver DMM2
#port comfixedbaud 23
#baudrate 9600
#subDriver Definition
...
;; COM2: Rx: 30 30 30 30 31 39 36 32 30 30 30 30 30 30 32 30 30 30 35 30 30 0D 0A
;; VC870: Tx <VALUE?>
;; VC870: Rx <0.1962>
;; VC870: Rx as numbers <0.1962>
;; jSerialComm version: 2.10.3
;; jSerialComm version: 2.10.3
Exception in thread "Scan ports" java.lang.ClassCastException: dk.hkj.comm.SerialPacketInterface cannot be cast to dk.hkj.comm.SocketInterface
at dk.hkj.devices.DeviceDMM2$DriverInterface.<init>(DeviceDMM2.java:33)
at dk.hkj.devices.DeviceDMM2.getCommInterface(DeviceDMM2.java:317)
at dk.hkj.main.InterfaceThreads$DeviceThread.<init>(InterfaceThreads.java:1432)
at dk.hkj.main.InterfaceThreads$ScanPorts.addDevicesSerial(InterfaceThreads.java:659)
at dk.hkj.main.InterfaceThreads$ScanPorts.run(InterfaceThreads.java:792)
Starting
;; jSerialComm version: 2.10.3
;; Start thread for: 192.168.2.43 - Voltcraft VC870
java.lang.ClassCastException: dk.hkj.comm.SocketPacketInterface cannot be cast to dk.hkj.comm.SerialPacketInterface
at dk.hkj.devices.DeviceDMM2$DriverInterface.readFromSerialPort(DeviceDMM2.java:71)
at dk.hkj.devices.DeviceDMM2$DriverInterface$1.run(DeviceDMM2.java:46)
at java.lang.Thread.run(Unknown Source)
;; Found Voltcraft VC870 on 192.168.2.43
java.lang.ClassCastException: dk.hkj.comm.SocketPacketInterface cannot be cast to dk.hkj.comm.SerialPacketInterface
at dk.hkj.devices.DeviceDMM2$DriverInterface.readFromSerialPort(DeviceDMM2.java:71)
at dk.hkj.devices.DeviceDMM2$DriverInterface$1.run(DeviceDMM2.java:46)
at java.lang.Thread.run(Unknown Source)
;; VC870: Tx <VALUE?>
;; VC870: Rx <0.0>
;; VC870: Rx as numbers <0.0>
java.lang.ClassCastException: dk.hkj.comm.SocketPacketInterface cannot be cast to dk.hkj.comm.SerialPacketInterface
at dk.hkj.devices.DeviceDMM2$DriverInterface.readFromSerialPort(DeviceDMM2.java:71)
at dk.hkj.devices.DeviceDMM2$DriverInterface$1.run(DeviceDMM2.java:46)
at java.lang.Thread.run(Unknown Source)
...
...
and no dataSo i tested the VC870 with the old version from the normal download menu from you webite.
So its not working at all with the version from this link "http://lygte-info.dk/pic/Projects/TestController/TestController.jar"
too funny - I just got done designing my own opto plugin (open-scad) for the ut61e (and similar) series.
tc = tinkercad (?)
I think openscad only exports its own source and stl as an object. no step. it seems to bug people.
I developed my own framework and so it will probably be quite different in approach and implementation and even goals. some may overlap, naturally.
so yet another independent toolsuite being designed and built. oh well.
So i tested the VC870 with the old version from the normal download menu from you webite.
So its not working at all with the version from this link "http://lygte-info.dk/pic/Projects/TestController/TestController.jar"
Try downloading again, I hope I have fixed the typecasts.
Unfortunatly i still get exactly the same error as soon as the socket is connected.
Recently, I acquired a Hioki DM7275 Precision DC Voltmeter and made a DIY temperature probe for it.
(https://lajtronix.eu/2024/02/21/diy-hioki-dm7275-76-temp-probe-z2001/ (https://lajtronix.eu/2024/02/21/diy-hioki-dm7275-76-temp-probe-z2001/))
Wanted to use TC for logging but DM7275 doesn't seem to be supported so I made a device file (attached).
Device file is as simple as it gets. Connection is only through LAN (since I have a basic model).
It will recognize DM7275 & DM7276 in all configurations.
Unfortunatly i still get exactly the same error as soon as the socket is connected.
I doubt it was the exact same error, but I have fixed a bit more.
java.lang.ClassCastException: dk.hkj.comm.SocketPacketInterface cannot be cast to dk.hkj.comm.SerialPacketInterface
at dk.hkj.devices.DeviceDMM2$DriverInterface.readFromSerialPort(DeviceDMM2.java:71)
at dk.hkj.devices.DeviceDMM2$DriverInterface$1.run(DeviceDMM2.java:46)
at java.lang.Thread.run(Unknown Source)
;; VC870: Tx <VALUE?>
;; VC870: Rx <0.0>
;; VC870: Rx as numbers <0.0>
java.lang.ClassCastException: dk.hkj.comm.SocketPacketInterface cannot be cast to dk.hkj.comm.SerialPacketInterface
at dk.hkj.devices.DeviceDMM2$DriverInterface.readFromSerialPort(DeviceDMM2.java:71)
at dk.hkj.devices.DeviceDMM2$DriverInterface$1.run(DeviceDMM2.java:46)
at java.lang.Thread.run(Unknown Source)
Thanks, but still...
Hello,
Not sure if already addressed in the 129 pages. :) I have keitley2000 and 2001 TSC scan multiplex card. It works with SPI protocol. Any simple way to use the multiplex channel wit Testcontroller? I would like to use it to monitor 3 different voltage reference signals from some boards I am setting up. :)
Thanks, Jorge
Test controller do not have the concept of multichannel device only returning one channel value at a time, it always needs all channels simultaneous. If you can setup a couple of commands to return all values, you are on (That may mean a low log rate).
If you do not require high precision, you can make a alternate solution very cheaply, that works with TC: https://lygte-info.dk/project/TestControllerUserProjects1%20UK.html#10_channel_12bit_ADC_module_addition_by_Pukker (https://lygte-info.dk/project/TestControllerUserProjects1%20UK.html#10_channel_12bit_ADC_module_addition_by_Pukker)
For opening the different channels on the keithley2000 multiplex card it requires these specific SPCI commands (IEEE-488 bus):
*RST; :rout:close (@2); :rout:open (@2); :rout:scan:int:func (@2), ‘volt:dc’ // example for Channel #2
How can I send such commands through TestController? It identifies it as Java Exception whenever pipes () are open.
For opening the different channels on the keithley2000 multiplex card it requires these specific SPCI commands (IEEE-488 bus):
*RST; :rout:close (@2); :rout:open (@2); :rout:scan:int:func (@2), ‘volt:dc’ // example for Channel #2
How can I send such commands through TestController? It identifies it as Java Exception whenever pipes () are open.
Anything in () are processes as expressions, there are two ways to get around that:
Use quotes: ":rout:close (@2);"
or use a expression: (":rout:close (@2);")
The first way the equipment gets as error as " " is sent in the stream.
The second way works. :) Thanks HKJ.
Does TestController take care of the serial port configuration under Linux?
";; Physical Port S1 (ttyS1) Device HEWLETT-PACKARD,34401A, do not match: null" without the device going into REMote mode or anything, not even an error.
However, If I change the parity on the device intentionally from NONE (8 Data Bits) to EVEN (7 Data Bits), I can provoke ERROR 513 on the device when TestController tries to connect, followed again by TestController outputting ";; Physical Port S1 (ttyS1) Device HEWLETT-PACKARD,34401A, do not match: null".
Can I expect an E3632A to work as well considering what I saw on the 34401A? Both device config files of TC show an identical RS232 configuration.
I noticed that 34401A is using the SCPIx protocoll whereas the E3632A is set to use Std. SCPI. Is that intentionally? The SCPIx is described as originally intended for being used in combination with chinese device implementations.
Hey,
I've spent the last few days putting together a device definition file for the Array 372xA line of electronic loads. I've only tested it with the 3720A which works perfectly. It allows all standard operations as well as transient operations. Hopefully this if of use to others :popcorn:
I'll attach the file + a repo for it :-+
EDIT: Added trigger subsystem for transient operation. Sorry if it's a bit complex looking, the way the device deals with ranges is a huge pain :scared:
https://github.com/FinnKrass/Array-372xA-TC
Sorry if this has been discussed already but on the installation notes I read tha you should download some files/libraries.
I have a PC that it's offline and I'm wondering whether it's possible to use the program on this PC and if so, whether there would be any limitation in terms of functionality/ libraries/ etc...
Edit2: Single commands do indeed work as Ian found out. I also noticed, in addition to his findings, that finishing the current request with a semicolon seems to update voltage and current successfully, albeit still with an error and an accompanied beep.
I did not have the time to test his alternative suggestion before I had to leave for work so I will do it afterwards (https://www.eevblog.com/forum/testgear/program-that-can-log-from-many-multimeters/msg3503440/#msg3503440 (https://www.eevblog.com/forum/testgear/program-that-can-log-from-many-multimeters/msg3503440/#msg3503440)) However, transmitting a number in square brackets doesn't seem to make sense in relation to SCPI protocol.
Greetings!
I've encountered a strange problem while using this software together with my good old Fluke 45 (Serial-USB-Adapter). During power on, the Fluke 45 goes into VDC mode and the TestController Software shows "Fluke 45.Voltage DC" and "Fluke 45.Frequency" under "Current Values"-Tab. But if i switch to e.g. Ohms or Diode via "Modes"-Panel, the Fluke 45 itself does switch to the correct mode but in the "Current Values"-Tab it always shows "Fluke 45.Frequency" with the Unit "Hz" :D And nothing else.
VDC, VAC, ADC and AAC seem to work. Diode and Ohms does not in Software (it sure does with the actual unit/display).
I tested the "command" ability like typing "Ohms" and the Fluke 45 does switch to Ohms. Sending "Func1?" to the Fluke 45 returns the currently selected Mode ... Ohms. So the communication seems to work?
Any advice?
Thanks and best wishes from germany!
Hello again!
It seems to work now, thanks! I modded the already existing file and added a changelog. Continuity is now an option too (strangely the meter returns values in volts rather than ohms).
Best wishes!
Found a bit of annoyance.
In the window "Scales for chart" and in "Maximum", the entered value there is only visibly retained provided 8 digits after the decimal point is not exceeded.
When entering more than 8 digits after the decimal point "0" is always displayed. But even so, an entered value having 11 digits after the decimal, for example, is honoured in the "Chart" window.
This came to light when measuring small capacitances of around 4 pF. Here "Auto" scaling does not work, so that the maximum chart value needs to be entered manually. 11 digits after the decimal points are needed in my case (UT622E) to display the 1 to 10 pF range, for example.
Multiplying such a small value - 4 pF - by 1000, for example, won't work.
Averaging will obviously not work too. But the graph can be readied to show averaged values in the pF range.
Does anyone have a Fluke 45 working properly with TestController? I'm trying to connect one now and not having any luck.
I set the meter for 9600 N 8 1 and connected to a terminal program and in response to *IDN? I get "Fluke, 45, (and them more stuff)". When I try to load it in TestController, I get the response that there isn't a match to ID Fluke, 45, . The response I get is exactly as specified in the ID string in the configuration file supplied, written by author Bad Drive in Nov 2020.
Any clues appreciated.
Edit: Got it! In case anyone else has this issue I'll leave the post. The issue was that you have to set the meter configuration to Echo = OFF. :)
With the 34401A attached via RS232, starting TC normally and opening the setup causes an ERROR 101 on the Agilent and the setup dialog box to remain unfilled.
However, starting TC via debug mode and opening the setup causes no error and the dialog box to be filled successfully.
Could this behavior be timing related?
This is currently on Windows 7 32-bit using a full-handshake serial cable as I wanted to exclude any causes by serial handshake errors.
Found a bit of annoyance.
In the window "Scales for chart" and in "Maximum", the entered value there is only visibly retained provided 8 digits after the decimal point is not exceeded.
When entering more than 8 digits after the decimal point "0" is always displayed. But even so, an entered value having 11 digits after the decimal, for example, is honoured in the "Chart" window.
This came to light when measuring small capacitances of around 4 pF. Here "Auto" scaling does not work, so that the maximum chart value needs to be entered manually. 11 digits after the decimal points are needed in my case (UT622E) to display the 1 to 10 pF range, for example.
Multiplying such a small value - 4 pF - by 1000, for example, won't work.
Averaging will obviously not work too. But the graph can be readied to show averaged values in the pF range.
I have been thinking about it, I may consider lowering the clamp level a bit. It is used to avoid near zero values where a null is supposed to show.
Maybe leave the default at 8 decimal places. But with the option of say 12 decimal places selectable for a specific case.
Original: Does not work: Right way: | ":write: OUTP" ":write: OUTP;[20]" ":write: OUTP (value);[20]" |
The 34401A and E3632A are finally working flawless via RS232.
2. Some commands defined in the device files are transmitted with a trailing value. In cases where these commands are defined as single commands (i.e. without a second command in direct sequence), the definition contains just the command without any further trailing addition. In cases of a definition that contains two commands in one single sequence in which at least the first requires a value to be inserted, there is a placeholder in-between for the position of the value within the sequence. The placeholder is called "(value)". If one now adds a delay in form of [20] to a single command, is necessary to insert the "(value)" placeholder after the command before finishing it with "," and adding the delay [20] afterwards. Otherwise, TC will transmit the command without a value and then transmit the delay as a second sequence via RS232, leading to errors on the device.
Example for case No. 2:
Original:
Does not work:
Right way:":write: OUTP"
":write: OUTP;[20]"
":write: OUTP (value);[20]"
One should be aware that the debug mode slows the operation of TC down so that seemingly working delay timings found while testing them in debug mode can cause errors in non-debug mode.