08-15-2019 12:34 AM
Hi all
I'm designing ATE environment, in our lab I have test equipment from different manufactures that has same functionality for example, I have AC source Chroma 65xx (previous generation) , Chroma 61512 and Pacific Power AFX (latest generation) , each model has different SCPI commands and probably different IVI driver (for my best knowledge Chroma 65xx has no IVI driver) . My question is how I can create code that will operate test equipment of different manufactures.
Regards
Idan Shmuel
08-15-2019 01:03 AM
08-15-2019 01:09 AM
thanks GerdW
could you please explain more about how it can be done using OOP?
08-15-2019 01:36 AM
08-15-2019 05:55 AM
The most straightforward solution is to use classes, as your task is IMHO best accomplished with Factory Pattern, but is quite demanding if you're just starting up with OOP. Also if you have not yet done so, do not build your own framework, that's often a waste of time because there are free solutions already.
Do a google search for
1. LabVIEW frameworks
2. LabVIEW factory pattern
and you'll find more information on what I'm talking about.
Hope this helps.
08-15-2019 06:51 AM
Also do a search for Hardware Abstraction Layer (HAL). You should find all kinds of interesting discussions to do exactly what you are facing. And, yes, they are almost all Object Oriented (OO) in nature. So if you know nothing about OO, then I highly recommend reading The Object-Oriented Thought Process to get your head around the concepts and then mess around with LVOOP (LabVIEW OOP).
08-15-2019 10:21 AM - edited 08-15-2019 10:28 AM
Basically you need to have all of the VI's for all of the possible test equipment in your program and a way to select what VI's are used.
For instance in my case I have ac sources from California Instruments and Elgar, DC sources from Sorenson and Agilent, AC and DC loads form different vendors and three or four possible power meters in our ATE racks.
I use an XML file for system configuration that list all the instruments, VISA address, and instrument limits.
When the program is launches the user is prompted to chose the configuration file, so I can have different setting (like current limit) for different tests
Here is an example:
<?xml version="1.0" encoding="utf-8"?> <Test_Rack_Configuration> <AC_Source> <Type> <!--Valid AC_Source values are "Ci5001" "Elgar" "none"-->Ci5001</Type> <VISA> <!--VISA Resource or VISA Alias-->GPIB0::3::INSTR</VISA> <Vout> <!--Output voltage range (VAC)--> <Max>300</Max> <Min>0</Min> </Vout> <Freq> <!--Output frequency range (Hz)--> <Max>400</Max> <Min>0</Min> </Freq> </AC_Source> <AC_Load> <Type> <!--Valid AC_Load values are "Ci3091" "NHR" "none"-->Ci3091</Type> <VISA> <!--VISA Resource or VISA Alias Ignored for NHR-->GPIB0::1::INSTR</VISA> <Vin> <!--Input voltage range (Vrms)--> <Max>350</Max> <Min>50</Min> </Vin> <Freq> <!--Input frequency range (Hz)--> <Max>440</Max> <Min>45</Min> </Freq> <CC> <!--Load current range (Arms) constant current mode--> <!--To enable short circuit testing set Min to -1--> <Max>30</Max> <Min>0</Min> </CC> <CV> <!--Load voltage range (Vrms) constant voltage mode--> <Max>350</Max> <Min>50</Min> </CV> <CP> <!--Load power range (Watts) constant power mode--> <Max>3000</Max> <Min>0</Min> </CP> <CR> <!--Load resistance range (Ohms) constant resistance mode--> <Max>1000</Max> <Min>2.5</Min> </CR> </AC_Load> <DC_Source> <Type> <!--Valid DC_Source values are "DHP" "SGI" "Aglient" "none"-->DHP</Type> <VISA> <!--VISA Resource or VISA Alias-->GPIB0::2::INSTR</VISA> <Vout> <!--Output voltage range (Vdc)--> <Max>100</Max> <Min>0</Min> </Vout> <Iout> <!--Output current range (Adc)--> <Max>100</Max> <Min>0</Min> </Iout> </DC_Source> <DC_Load> <Type> <!--Valid DC_Load values are "RBL" "none"-->RBL</Type> <VISA> <!--VISA Resource or VISA Alias-->GPIB0::10::INSTR</VISA> <Vin> <!--Input voltage range (VDC)--> <Max>100</Max> <Min>0</Min> </Vin> <CC> <!--Load current range (ADC) constant current mode--> <!--To enable short circuit testing set Min to -1--> <Max>200</Max> <Min>0</Min> </CC> <CV> <!--Load voltage range (VDC) constant voltage mode--> <Max>100</Max> <Min>1</Min> </CV> <CP> <!--Load power range (Watts) constant power mode--> <Max>2000</Max> <Min>0</Min> </CP> <CR> <!--Load resistance range (Ohms) constant resistance mode--> <Max>1000000</Max> <Min>0.5</Min> </CR> </DC_Load> <Yokogawa> <Model> <!--Valid models are "WT130" "WT230" "WT500" "WT1600"-->WT1600</Model> <VISA> <!--VISA Resource or VISA Alias-->GPIB0::3::INSTR</VISA> <I_Scaling> <!--Enter mV/Amp scale factor--> <!--Note: Scaling will be ignored if a mV range is not used in I_Range--> <E1>0</E1> <E2>0</E2> <E3>1</E3> </I_Scaling> <I_Range> <!--Current Range--> <!--Enter current range for each element or Auto--> <!--WT130, WT230, WT330 Range must be the same for all three elements--> <!--Valid ranges for WT130 Auto,1A,2A,5A,10A,20A,50mV,100mV,200mV--> <!--Valid ranges for WT230 Auto,0.5A,1A,2A,5A,10A,20A,50mV,100mV,200mV--> <!--Valid Ranges for WT330 Auto,0.5A,1A,2A,5A,10A,20A,50mV,100mV,200mV,500mV,1V,2V--> <!--Valid Ranges for WT500 Auto,500mA 1A,2A,5A,10A,20A,40A,100mV,200mV,500mV--> <!--Valid Ranges for WT1600 Auto,1A,2A,5A,10A,20A,50A,50mV,100mV,250mV,500mV--> <!--Invalid entries will defalt to AUTO--> <E1>20A</E1> <E2>20A</E2> <E3>100mV</E3> </I_Range> <V_Range> <!--Enter voltage range for each element Auto or 0 for autorange--> <!--Valid ranges for WT130 Auto,15,30,60,100,150,300,600--> <!--Valid ranges for WT230 Auto,15,30,60,100,150,300,600--> <!--Valid ranges for WT330 Auto,15,30,60,100,150,300,600--> <!--Valid ranges for WT500 Auto,15,30,60,100,150,300,600,1000--> <!--Valid ranges for WT1600 Auto,1,3,6,10,15,30,60,100,150,300,600,1000--> <!--Invalid entries will defalt to AUTO--> <E1>300</E1> <E2>150</E2> <E3>60</E3> </V_Range> <V_Mode> <!--Voltage measurment mode--> <!--Valid modes are AC,DC --> <!--WT130/230 mode must be the same for all elements ONLY E1 will be used E2,E3 ignored--> <!--WT130/230 mode ***New program will switch mode to DC when measuring***--> <!--WT500/1600 mode can be set for each element--> <!--Invalid modes will default to AC (rms)--> <E1>AC</E1> <E2>AC</E2> <E3>DC</E3> </V_Mode> <Sync_Source> <!--Sync Source--> <!--Not applicable to WT130--> <!--Valid Settings for WT230 OFF, Voltage, Current--> <!--WT230 Sync Source is the same for all elements only E1 will be used E2,E3 ignored--> <!--Valid settings for WT500/WT1600 OFF U1,U2,U3,I1,I2,I3 --> <!--WT500/WT1600 sync source can be set for each element--> <!--Invalid settings will default to OFF--> <E1>U1</E1> <E2>I2</E2> <E3>OFF</E3> </Sync_Source> <Options> <!--Options will be ignored on models not applicable to--> <!--Linear Averaging--> <!--Linear Averaging valid values for WT130/230 are 0,8,16,32,64--> <!--Linear Averaging valid values for WT500/WT1600 are 0,8,16,32,64,128,256--> <!--Enter 0 for no averaging invalid values will defalt to no averaging--> <Averaging>8</Averaging> <!--Line filter and Frequency Fiter--> <!--Valid settings OFF or ON See manual for usage details--> <!--WT130 only has Frequency Fiter--> <!--WT1600 Frequency Filter turns on/off Zerocross Filter--> <Line_Filter>ON</Line_Filter> <Freq_Filter>ON</Freq_Filter> <!--Update Rate--> <!--Not applicable to WT130--> <!--Valid settings for WT230 100mS,250mS,500mS,1S,2S,5S --> <!--Valid settings for WT500/WT1600 50mS,100mS,200mS,500mS,1S,2S,5S --> <!--Invalid settings will default to 500mS --> <Update_Rate>500mS</Update_Rate> </Options> <Efficiecny> <!--Efficiency measurment Enter Yes to include efficiecny measurments--> <Measure>Yes</Measure> <!--Enter Yes to ignore the DC (battery) channel when calculating efficiency.--> <Ignore_DC>Yes</Ignore_DC> <!--Element designators for efficiency calculations (Wattmeter chanels are referd to as "Elements")--> <!--Valid designators are E1,E2,E3,None--> <Input_Element>E1</Input_Element> <Output_Element>E2</Output_Element> <Battery_Element>E3</Battery_Element> </Efficiecny> </Yokogawa> <Data_Logger> <!--This Section will define only the card used to control DC power switching relays--> <!--Measurment channels and scan setting are defined in seperate data logger config file--> <Type> <!--Type=34970A, 34972A, none-->34970A</Type> <VISA> <!--VISA Resource or VISA Alias-->GPIB0::7::INSTR</VISA> <!--DCSW = DC Switch Type "Actuator" for new switch shelf or "DIO" for old switch box Default = Actuator--> <DCSW>Actuator</DCSW> <!--Slot Enter the slot number actuator (34904A) or DIO (34907A) card is in. Valid entries are 1,2,3 Default = 3--> <Slot>3</Slot> <!--Actuator "channles" used for DC switch shelf. Ignored for DIO type DCSW--> <Battery>1</Battery> <DC_Source>2</DC_Source> <DC_Load>3</DC_Load> <Capacitor>4</Capacitor> <Diode_Bypass>5</Diode_Bypass> <!--DC Sense uses two channels per device seperate with a comma (310,311)--> <DCPS_Sense>6,7</DCPS_Sense> <DCLD_Sense>8,9</DCLD_Sense> </Data_Logger> <Therm_Chamber> <Type> <!--Enter Thermal Chamber if comunications are possible to querry ambient temperature--> <!--Enter 'none' to manually input ambient temperature--> <!--Valid Thermal Chamber types are "7800" "8800" "TestEq" "none"-->none</Type> <VISA> <!--VISA Resource VISA Alias or IP address-->192.168.1.150</VISA> </Therm_Chamber> </Test_Rack_Configuration>
Bay parsing this file I can chose the proper VI's to use, configure the power meters, and check the test script to make sure it is within the limits of all the test equipment.
10-29-2019 06:41 AM
what kind of solutions?
11-16-2019 11:16 PM
If your company is looking at a ready product that can solve multiple instruments in a unified code, please contact me.
If this concern is for your personal interest, you could look up more on Hardware Abstraction Layer using LV OOP