LabVIEW

cancel
Showing results for 
Search instead for 
Did you mean: 

how to integrate diffrent manufactores test equipment in one code

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

0 Kudos
Message 1 of 9
(2,197 Views)

Hi idans,

 

simple answer: use more subVIs…

Practical answer: use OOP…

Best regards,
GerdW


using LV2016/2019/2021 on Win10/11+cRIO, TestStand2016/2019
0 Kudos
Message 2 of 9
(2,168 Views)

thanks GerdW

could you please explain more about how it can be done using OOP?

0 Kudos
Message 3 of 9
(2,159 Views)

Hi idans,

 

please take the beginner courses for LV-OOP. Their basic example is to define classes/inheritance to use several (similar) DAQ hardware like in your request…

Best regards,
GerdW


using LV2016/2019/2021 on Win10/11+cRIO, TestStand2016/2019
0 Kudos
Message 4 of 9
(2,154 Views)

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.

0 Kudos
Message 5 of 9
(2,111 Views)

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).


GCentral
There are only two ways to tell somebody thanks: Kudos and Marked Solutions
Unofficial Forum Rules and Guidelines
"Not that we are sufficient in ourselves to claim anything as coming from us, but our sufficiency is from God" - 2 Corinthians 3:5
0 Kudos
Message 6 of 9
(2,097 Views)

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.

========================
=== Engineer Ambiguously ===
========================
0 Kudos
Message 7 of 9
(2,060 Views)

what kind of solutions? 

0 Kudos
Message 8 of 9
(1,942 Views)

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

 

Santhosh
Soliton Technologies

New to the forum? Please read community guidelines and how to ask smart questions

Only two ways to appreciate someone who spent their free time to reply/answer your question - give them Kudos or mark their reply as the answer/solution.

Finding it hard to source NI hardware? Try NI Trading Post
0 Kudos
Message 9 of 9
(1,875 Views)