﻿<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type=\'text/xsl\' href=\'rss.xsl\'?><rss version="2.0"><channel><title>Marvin Test Solutions - Knowledge Base Articles</title><link>https://www.marvintest.com/KnowledgeBase/default.aspx</link><description>Articles compiled by Marvin Test Solutions answering the most frequently asked questions.</description><item><title>How to Create a Support Incident, Request an RMA or Instrument Calibration - Published on 6/19/2025</title><description>&lt;h3&gt;Overview&lt;/h3&gt;This article will guide you through the process of creating a support incident using MTS’s M@GIC online support portal. The portal is a secure site that is using Multi Factor Authentication (MFA) to log in and can be used for Support, RMA, Licensing, or File Sharing between designated MTS users and/or customers. The example provided here will show incident creation for the purposes of requesting calibration on your MTS instruments or to request an RMA. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Login To M@GIC - MTS Support Portal&lt;/h3&gt;When you first login to your M@GIC account, you will see the home page shown above, if you don't have an account, you can create one. &lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200331\\Magic_LoginRegister.jpg" alt="Support Login/Register" title="Support Login/Register" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Create a Support Incident&lt;/h3&gt;To request an RMA or calibration you must create a support incident. This is done by selecting the link outlined in red (above), labeled “Create a new incident”. Once you have done this you will see the screen shown below.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200331\\Magic_incidentscreen00.png" alt="Create a Support Incident" title="Create a Support Incident" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Enter New Incident Details&lt;/h3&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200331\\Magic_incidentscreen11.png" alt="New Incident" title="New Incident" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Example&lt;/h3&gt;For this example, you will be requesting calibration on a GX2065 with a serial number of 000250.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;blockquote&gt;Starting with the drop-down box labeled “Support Type” (outlined in red box #1 above), you will select “Calibration”. (Note: if we wanted to request an RMA, we would simply select “RMA” instead of “Calibration”)&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;blockquote&gt;Next, you will select the product you would like to calibrate\RMA from the “Product” drop-down box. Again, in this specific example we are going to select “GX2065” from the list.&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;blockquote&gt;Now that you’ve selected the product you wish to calibrate\RMA, you will enter the serial number of that instrument. If you are requesting calibration\RMA for a quantity of more than one (of the same instrument\product) simply enter the corresponding serial numbers separated by a semicolon, eg 000250; 000280; 000222; 000301. In this way, it is more straight forward to open an incident for each different instrument (part number) that you’d like to calibrate or RMA.&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;blockquote&gt;In box 4 shown above, you can select your operating system. For the purposes of calibration or RMA, this detail is not critical however it is a required field so please select an operating system from the drop-down list.&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;blockquote&gt;Next, in the field labeled “Short description” (Box 5 on the prior page) you might enter something like “Calibration” or “RMA Request”,..something to this effect will suffice.&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;blockquote&gt;The last field is box 6, “Detailed description”, where you will expand upon whatever you entered into box 5. This is also where you can note anything you feel is relevant for us to know. For instance, say that you want to have seven instruments calibrated all on one PO; Four GX7400A’s, two GX1120’s and one GX2065… You could simply list the corresponding part numbers and their serial numbers here. If there is any ambiguity in your request, an applications engineer will contact you shortly to be certain we understand exactly what it is you are requesting.&lt;br /&gt;Completing the above six steps you should have the page filled out similar to the screen below:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200331\\Magic_incidentscreen22.png" alt="Support Incident Detailed Description" title="Support Incident Detailed Description" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;blockquote&gt;Finally, select the “Submit” button at the bottom right of the screen. (red box shown above)&lt;br /&gt;After you’ve selected the “Submit” button, you should see the screen below, indicating that the incident has been created.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200331\\Magic_incidentscreen33.png" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;At this point an email is automatically sent out to all the M@GIC support engineers and one of us will be along shortly to process your request and help you with any questions you might have.</description><link>https://www.MarvinTest.com/KB/Q200331/How-to-Create-a-Support-Incident-Request-an-RMA-or-Instrument-Calibration</link><pubDate>6/19/2025</pubDate></item><item><title>Terminate an ATEasy or Other MTS Software License - Published on 6/17/2025</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;To terminate software license *:&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt; Open the &lt;b&gt;About dialog&lt;/b&gt;: For ATEasy/CalEasy or other MTS software, open the software (ATEasy IDE, CalEasy, etc.) and open the &lt;b&gt;About dialog&lt;/b&gt;, for the ATEasy License Server About dialog can be opened from the Windows task bar at the server (network license).&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;For older Software - press:&lt;b&gt; CTRL+ALT+SHFT+K&lt;/b&gt; from the About dialog (be sure to press and hold the first three keys before pressing the K key) to terminate the license, for newer software - click on &lt;b&gt;License...&lt;/b&gt; or &lt;b&gt;Set License...&lt;/b&gt; button and select &lt;b&gt;Terminate License&lt;/b&gt; (if license was installed manually), or &lt;b&gt;Terminate License Online&lt;/b&gt; (if you activate the license online) as shown here:&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200060\LicenseDialog-TerminateALicense.jpg" alt="License Dialog - Terminate a License" title="License Dialog - Terminate a License" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt;&lt;li&gt;For &lt;b&gt;offline termination&lt;/b&gt; select &lt;b&gt;Terminate License&lt;/b&gt;, the&lt;b&gt; license termination code&lt;/b&gt; will be displayed, write down the termination code, or copy to the clipboard (Ctrl+C), or take a screen capture and save to an image file (Alt+Prt SC keys, paste to MS Paint, Save).&amp;nbsp;&amp;nbsp;Log into Magic and, create an incident and paste the code or the screen capture file to notify MTS that the license was terminated.&amp;nbsp;&amp;nbsp;&lt;b&gt;Note: &lt;/b&gt;If you don't have the termination code, the user Windows temporary folder (type %temp% in the Windows File Explorer) should have a file that start with "ALicK", attach that file to the incident.&lt;br /&gt;&lt;br /&gt;For &lt;b&gt;online termination&lt;/b&gt;, select the T&lt;b&gt;erminate License Online&lt;/b&gt;, no additional steps are required.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;b&gt;* NOTE:&lt;/b&gt; After terminating the license, a new license will only be issued for a license that have current ATEasy subscription. &lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;See Also&lt;/h3&gt;&lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=26' target='_blank'&gt;ATEasy Licensing Q&amp;A&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200060/Terminate-an-ATEasy-or-Other-MTS-Software-License</link><pubDate>6/17/2025</pubDate></item><item><title>Creating an RS170 Video Signal with WaveEasy - Published on 5/22/2025</title><description>&lt;h3&gt;Overview&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;WaveEasy simplifies entry of complex analog signals by allowing the user to break the signal up into smaller, easier to define segments and sub-segments, which can easily be replicated in the pattern memory to create a complex signal.&lt;br /&gt;&lt;br /&gt;This is especially true for signals that are of a repetitive nature, such as RS170 video.&amp;nbsp;&amp;nbsp;The RS170 signal will be discussed in a general sense during this article, but a full discussion of the characteristics of an RS170 signal is beyond the scope of this article, so knowledge of the RS170 signal format and timing is assumed.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;It should also be noted that examples presented within this article were designed for download to the Geotest &lt;b&gt;GX1110 Function Generator/Arbitrary Waveform Generator &lt;/b&gt;operating at 40 Ms/S (25 nS period).&lt;br /&gt;&lt;br /&gt;For additional information about how to define waveforms in WaveEasy and load them to the &lt;b&gt;GX1110 Arbitrary Waveform Generator&lt;/b&gt;, refer to Knowledge Base Article &lt;a href='http://www.geotestinc.com/KnowledgeBase/KBArticle.aspx?ID=138' target='_blank'&gt;Q200138&lt;/a&gt;.&lt;/td&gt;&lt;td&gt;[:+[+GX1110+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;The RS170 standard transmits a full image at a 29.99Hz rate.&amp;nbsp;&amp;nbsp;The image is transmitted in an interlaced format, with one half of the image being “painted” on the screen after each vertical retrace in an alternating Even/Odd frame format.&amp;nbsp;&amp;nbsp;The half-frames are transmitted at ~ 60Hz rate.&amp;nbsp;&amp;nbsp;A typical horizontal trace signal is shown in figure 1 using common nomenclature.&amp;nbsp;&amp;nbsp;The Even and Odd vertical retrace signals, represented in WaveEasy, are shown in figures 2 and 3.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\RS170.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 1 - RS170 Horizontal Trace Signal (Black &amp; White)&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\Even VSync All_75.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 2 - Even Vertical Synchronization&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\Odd VSync Segment_75.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 3 - Odd Vertical Synchronization&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Waveform Segments and Sub-Segments&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;To simplify their definition within WaveEasy, the even/odd vertical retrace synchronization signals are divided into 21 &lt;b&gt;Segments&lt;/b&gt; (labeled "Fields"), each representing the time duration of one horizontal trace.&amp;nbsp;&amp;nbsp;These segments share many common characteristics that facilitate using standard copy/paste functions to build up similar, but slightly different wave components. &lt;br /&gt;&lt;br /&gt;In between the even/odd vertical retrace signals are the 241 horizontal trace signals that represent the interlaced image.&amp;nbsp;&amp;nbsp;In addition, the even vertical synchronization signal has an added one-half horizontal trace field at its beginning (labeled field 263) and its end to accommodate the one-half horizontal scan line of each image frame.&lt;br /&gt;&lt;br /&gt;The full image is composed of 21 even vertical retrace fields, plus 241 even horizontal trace fields, plus 21 odd vertical retrace fields, plus 241 odd horizontal trace fields, plus the 263rd horizontal trace tacked on to the even vertical retrace signal.&amp;nbsp;&amp;nbsp;This is a total of 21+241+21+241+½+½=525 horizontal scan lines – one full video frame.&lt;/td&gt;&lt;td&gt;[:+[+waveeasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Each of the field segments making up the vertical retrace and horizontal trace waveforms are further divided into &lt;b&gt;Sub-Segments&lt;/b&gt;, where individual wave components of each field can be defined.&amp;nbsp;&amp;nbsp;Figure 3 demonstrates this concept by defining the “Front Porch” of field #263's synchronization pulse as a 0V signal for a duration of 1.5uS (60 samples at 25 nS [40 MHz] sample rate).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\Even VSync Sub-Segment 263.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 3 - Sub-Segments of Field #263 - Even Vertical Sync Waveform&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The composite overlay of multiple WaveEasy screen captures in figure 4a illustrates how each sub-segment of field #263, as represented by a change in voltage levels, can be defined.&amp;nbsp;&amp;nbsp;When arranged sequentially they produce the segment pulses of Field #263 within the even vertical synchronization waveform - figure 4b.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\Even VSync Sub-Segment 263_50.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 4a - Sequential Sub-Segments of Field #263 - Even Vertical Sync Waveform&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\Even VSync Segment 263.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 4b - Field #263 Segment - Even Vertical Sync Waveform&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The same process is used to define the remaining frames in the vertical sync waveforms.&amp;nbsp;&amp;nbsp;Where fields are identical to those already defined, copy and paste functions can be used to easily replicate those component waveforms.&amp;nbsp;&amp;nbsp;And where new pulse streams are required, sub-segments of existing fields can be copied and pasted where applicable into the new field (figure 5).&amp;nbsp;&amp;nbsp;The &lt;b&gt;Preview Window&lt;/b&gt; (bottom of figure 5) displays all segments and sub-segments of the active waveform document with the hashed lines identifying the selected segment or sub-segment.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\Preview_75.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 5 - Field #6 of the Even Vertical Sync Waveform&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Waveform Functions&lt;/h3&gt;Similar processes can be used to define the horizontal trace waveform.&amp;nbsp;&amp;nbsp;However, the video content – the waveform that actually defines the intensity of the image as it is painted horizontally across the screen, is defined using canned &lt;b&gt;Functions&lt;/b&gt; built in to WaveEasy.&amp;nbsp;&amp;nbsp;Figure 6a shows a single horizontal trace signal consisting of a black-to-white gradient.&amp;nbsp;&amp;nbsp;The horizontal sync signal can be seen at the beginning of the waveform, and was created using the same process that was used to create the vertical sync waveforms.&amp;nbsp;&amp;nbsp;But the video content (sub-segment Video 14+) was generated using the built-in WaveEasy &lt;b&gt;SawTooth&lt;/b&gt; function (figure 6b).&amp;nbsp;&amp;nbsp;The formula for defining the SawTooth waveform is:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;(0.55 + 0.45 * SawTooth(1.0005 * x))&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\HScan_01.jpg" alt`=&amp;quot; border='0' /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\HScan_02.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figures 6a and 6b - Single horizontal trace signal using the SawTooth function to generate the video content&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If the same waveform were used for all of the 442 interlaced horizontal traces, this sawtooth waveform will generate a dark-to-white gradient across the screen from left to right.&amp;nbsp;&amp;nbsp;Many other simple built in WaveEasy functions can be used to create novel or useful test patterns (figures 7a and 7b).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\Triangle_01.jpg" alt`=&amp;quot; border='0' /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\Triangle_02.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 7a - Triangle Function video signal and formula&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\Sine_01.jpg" alt`=&amp;quot; border='0' /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\Sine_02.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 7b - Sine Function video signal and formula&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;You also have access to complex functions such as &lt;b&gt;Noise&lt;/b&gt; (figure 8a), or combinations of functions such as &lt;b&gt;Square Pulses&lt;/b&gt; with &lt;b&gt;Sine Modulation&lt;/b&gt; (figure 8b).&amp;nbsp;&amp;nbsp;The latter will generate vertical lines across the screen of varying white intensity.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\Noise_01.jpg" alt`=&amp;quot; border='0' /&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\Noise_02.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figures 8a - Noise Function video signal and formula&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\VLines_01.jpg" alt`=&amp;quot; border='0' /&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\VLines_02.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figures 8b - Sine-Modulated Square Wave video signal and formula&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Combining Waveform Segments&lt;/h3&gt;All of these component waveforms can be assembled to produce one full video frame.&amp;nbsp;&amp;nbsp;Figure 9 depicts an abbreviated video frame showing the full even/odd vertical sync pulses, each bracketing three horizontal traces (preview waveform image).&amp;nbsp;&amp;nbsp;Normally there would be 241 horizontal traces in between each even or odd vertical retrace.&amp;nbsp;&amp;nbsp;The large waveform occupying the center of the WaveEasy screen shows a magnified section of the preview waveform (hashed lines) where the signal transitions from blank horizontal traces (dark) to active video (represented by sine waves).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200158\\Composite Video_75.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 9 - Abbreviated full-interlace video frame&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The process of assembling (loading) these waveforms into a full video frame within the GX1110 is easily done via software using the supplied GX1110 driver functions.&amp;nbsp;&amp;nbsp;The sequence would be to load the even vertical synchronization waveform (55,880 samples), followed by 241 copies of the horizontal trace waveform (2540 samples each), followed by the odd vertical synchronization waveform (53,340 samples), followed by the remaining 241 copies of the horizontal trace waveform.&amp;nbsp;&amp;nbsp;The total pattern size is 1333500 samples in duration – which when output at a 40 MHz sample rate, generates a video signal with a 29.99 Hz refresh rate – exactly as defined for RS170 video.&amp;nbsp;&amp;nbsp;Sample &lt;b&gt;ATEasy&lt;/b&gt; code to demonstrate this concept is provided below and sample WaveEasy pattern files can be downloaded &lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/.\\Q200158\\WaveEasy Files.Zip' target='_blank'&gt;&lt;b&gt;HERE&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;GTWAVE Set OperationMode ArbitraryWaveformGenerator()&lt;br /&gt;GTWAVE Set OutputState(aChannelA,aOutputDisabled)&lt;br /&gt;GTWAVE Stop(aChannelA)&lt;br /&gt;&lt;br /&gt;dwStart=0&lt;br /&gt;! Load fields 1 to 21 of even vertical sync, pluse field 263 for one-half horizontal traces&lt;br /&gt;GTWAVE Arb Waveform FileLoad(aChannelA,"Even VSync.WaveEasy",0,dwStart,-1)&lt;br /&gt;dwStart=dwStart+55880&lt;br /&gt;&lt;br /&gt;For i=22 to 262 ! Load horizontal trace fields 22 to 262 - Completes even interlace frame&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GTWAVE Arb Waveform FileLoad(aChannelA,"Sine.WaveEasy",0,dwStart,-1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwStart=dwStart+2540&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;! Load fields 1 to 21 of odd vertical sync&lt;br /&gt;GTWAVE Arb Waveform FileLoad(aChannelA,"Odd VSync.WaveEasy",0,dwStart,-1)&lt;br /&gt;dwStart=dwStart+53340&lt;br /&gt;&lt;br /&gt;For i=22&amp;nbsp;&amp;nbsp;to 262 ! Load horizontal trace fields 22 to 262 - Completes odd interlace frame AND full video frame&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GTWAVE Arb Waveform FileLoad(aChannelA,"Sine.WaveEasy",0,dwStart,-1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwStart=dwStart+2540&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;GTWAVE Set Amplitude(aChannelA,1.2)&lt;br /&gt;GTWAVE Set Offset(aChannelA,0)&lt;br /&gt;GTWAVE Arb Set SampleRate(aChannelA,40e+06)&lt;br /&gt;GTWAVE Arb Set Waveform Length(aChannelA,0,dwStart)&lt;br /&gt;GTWAVE Run(aChannelA)&lt;br /&gt;GTWAVE Set OutputState(aChannelA,aOutputEnabled)&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200158/Creating-an-RS170-Video-Signal-with-WaveEasy</link><pubDate>5/22/2025</pubDate></item><item><title>Accessing RESTful services, using OAuth and Rational DOORS Web services from ATEasy - Published on 3/27/2025</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;&lt;br /&gt;This article discusses three separate methods to contact, request information, and parse the data returned by a RESTful web services.&amp;nbsp;&amp;nbsp;There are several source code highlights within this document and the complete ATEasy project is attached at the end of the article.&amp;nbsp;&amp;nbsp;The example project consists of three tasks demonstrating various methods of access.&lt;br /&gt;&lt;br /&gt;The first task in the example retrieves data from demo services in both JSON and XML formats.&amp;nbsp;&amp;nbsp;The second task in the example implements the OAuth protocol to contact a commercial website.&amp;nbsp;&amp;nbsp;And the final task in the example specifies a method to access OSLC Requirements Management V2 Services provided by the Rational DOORS Web service from ATEasy.&lt;br /&gt;&lt;br /&gt;The code examples discussed are located within the example program (see link below).&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Making an HTTP Request&lt;/h3&gt;In the first example, we will use the .Net &lt;a href='https://learn.microsoft.com/en-us/dotnet/api/system.net.webrequest' target='_blank'&gt;WebRequest&lt;/a&gt; class that is included in the System.Net namespace.&amp;nbsp;&amp;nbsp;This class allows ATEasy to programmatically access web services similar to the way a web browser accesses them and is the basis for the more advanced service requests found later in this article.&amp;nbsp;&amp;nbsp;The simplest, default HTTP method is &lt;a href='https://www.w3schools.com/tags/ref_httpmethods.asp' target='_blank'&gt;GET&lt;/a&gt; where the client application requests that a server provide the data at a specified URL.&amp;nbsp;&amp;nbsp;In the example below, an request which acts as a client is created using the Create() method and and then immediately sent with the GetResponse() method.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;request : System.WebRequest&lt;br /&gt;ws : System.WebResponse&lt;br /&gt;&lt;br /&gt;! Send an HTTP GET request to the JSON test server&lt;br /&gt;request=WebRequest.Create("https://jsonplaceholder.typicode.com/todos/1")&lt;br /&gt;ws = request.GetResponse()&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;By default, GetResponse() is synchronous and will report certain failures such as a timeout; in case of a timeout, the requested URL doesn't respond and there is no meaningful data in the ResponseStream.&amp;nbsp;&amp;nbsp;If the request was successful, the response from the server is recorded in the WebResponse object as well as in the ResponseStream property of the WebRequest object.&amp;nbsp;&amp;nbsp;The next step is to read the response data.&amp;nbsp;&amp;nbsp;The exact method would depend of the service requested and the formatting of the content.&amp;nbsp;&amp;nbsp;In this example, the server will respond with JSON-formatted text.&amp;nbsp;&amp;nbsp;HTML and XML are also covered in this article.&amp;nbsp;&amp;nbsp;This example reads the JSON and appends it to the log after the test has completed.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;!Using StreamReader to read entire chunk &lt;br /&gt;streamReader = new mscorlib.StreamReader(ws.GetResponseStream()) &lt;br /&gt;! Read line by line and print to log&lt;br /&gt;repeat&lt;br /&gt;&amp;nbsp;&amp;nbsp;sLine=streamReader.ReadLine()&lt;br /&gt;&amp;nbsp;&amp;nbsp;Append sLine&lt;br /&gt;until sLine=""&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;NOTE: If HTML is printed to the ATEasy test log, the text may be interpreted as HTML.&amp;nbsp;&amp;nbsp;This could have unexpected consequences such as causing some data to appear missing or may change the format of the test log.&amp;nbsp;&amp;nbsp;Avoid this by printing the HTML contents to a file for review, or by changing the Log's PlainText property to True, or replacing HTML tags as demonstrated in Test 1.4 of the included example.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Anything beyond a simple GET request requires the user to modify the WebRequest client object before sending it off.&amp;nbsp;&amp;nbsp;Once the object is created, all of the properties of the request are assigned to their default values and can be changed if they are read-write properties.&amp;nbsp;&amp;nbsp;Test 1.3 of the example demonstrates changing the request to a POST.&amp;nbsp;&amp;nbsp;After Create(), the ContentType is specified as JSON, the Method is changed to POST to update the items specified in the body, and the Timeout is extended.&amp;nbsp;&amp;nbsp;Immediately after this, the body of the request is populated with the values on the web server I am try to change&amp;nbsp;&amp;nbsp;This is done by write my JSON values to the RequestStream of my WebRequest.&amp;nbsp;&amp;nbsp;It is not demonstrated but a header can be added in a similar manner.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;! Modify the header/body and make a POST request&lt;br /&gt;request=WebRequest.Create("https://jsonplaceholder.typicode.com/posts")&lt;br /&gt;request.ContentType="application/json; charset=UTF-8"&lt;br /&gt;request.Method="POST"&lt;br /&gt;request.Timeout=20000&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;streamWriter=new mscorlib.StreamWriter(request.GetRequestStream())&lt;br /&gt;&amp;nbsp;&amp;nbsp;sLine="{\"title\": \"Marvin\", \"body\": \"Test\", \"userId\": 1}"&lt;br /&gt;&amp;nbsp;&amp;nbsp;streamWriter.Write(sLine)&lt;br /&gt;&amp;nbsp;&amp;nbsp;streamWriter.Flush()&lt;br /&gt;catch&lt;br /&gt;endtry&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;After this, GetResponse() can be used to send the request to the server.&amp;nbsp;&amp;nbsp;This code shown above is the equivalent of the following HTTP request.&amp;nbsp;&amp;nbsp;You can try this out by putting the following code into the DevTools console of your favorite browser.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;fetch('https://jsonplaceholder.typicode.com/posts', {&lt;br /&gt;&amp;nbsp;&amp;nbsp;method: 'POST',&lt;br /&gt;&amp;nbsp;&amp;nbsp;body: JSON.stringify({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title: 'Marvin',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body: 'Test',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;userId: 1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;}),&lt;br /&gt;&amp;nbsp;&amp;nbsp;headers: {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Content-type': 'application/json; charset=UTF-8',&lt;br /&gt;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;.then((response) =&gt; response.json())&lt;br /&gt;&amp;nbsp;&amp;nbsp;.then((json) =&gt; console.log(json));&lt;br /&gt;Promise {&lt;pending&gt;}&lt;br /&gt;VM288:13 {title: 'Marvin', body: 'Test', userId: 1, id: 101}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;These are the basics of HttpClient web requests and responses.&amp;nbsp;&amp;nbsp;The example includes additional examples of reading HTML and XML as these have generic data parsing tools available.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The Root services document&lt;/h3&gt;The root services document contains information about your organization's specific DOORS instance.&amp;nbsp;&amp;nbsp;ATEasy uses the information contained within this document to negotiate authentication to access the protected requirements as well as primary service catalog which all sub-catalogs and services are contained within.&lt;br /&gt;&lt;br /&gt;The first Test in the "Accessing Rational DOORS" task, "Access RTN DOORS from Sample File", reads through a root services document that has been saved locally as an XML file.&amp;nbsp;&amp;nbsp;Because this root services document is not located on a web server, no special authentication is required to access and read it.&amp;nbsp;&amp;nbsp;We use a System.Xml.XmlReader to parse through the document.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;xmlReader = XmlReader.Create("public_rootservices_copy.xml", settings, context)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Once the file is open, the example parses it node to node from beginning to end using a while loop.&amp;nbsp;&amp;nbsp;This example looks specifically with a node named oslc:ServiceProviderCatalog.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;while (xmlReader.Read()) &lt;br /&gt;&amp;nbsp;&amp;nbsp;select (xmlReader.Name) &lt;br /&gt;&amp;nbsp;&amp;nbsp;case "oslc:ServiceProviderCatalog" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if xmlReader.HasAttributes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sCatalogLocation=xmlReader.GetAttribute(iAttributes)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;&amp;nbsp;&amp;nbsp;endselect &lt;br /&gt;endwhile&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This test proves the ability to parse through a root services document and is built upon in subsequent tests.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;ServiceProviderCatalog and ServiceProvider&lt;/h3&gt;In the previous section, we searched a root services document for a node named olsc:ServiceProviderCatalog.&amp;nbsp;&amp;nbsp;This node is the entry point for discovering services within the DOORS webservice.&amp;nbsp;&amp;nbsp;The olsc:ServiceProviderCatalog node in the root services document has an attribute which specifies the URL to the primary service provider catalog.&amp;nbsp;&amp;nbsp;This primary service provider catalog and all other catalogs contains a listing of Service Providers and/or child Service Provider Catalogs.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200271\ServicesHierarchy.PNG" alt="This image depicts the relationship between the root services document, service provider catalogs and service providers" title="This image depicts the relationship between the root services document, service provider catalogs and service providers" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;See also: &lt;a href='http://www.ibm.com/developerworks/rational/library/oslc-services-rational-doors/index.html' target='_blank'&gt;IBM, Access OSLC services from IBM Rational DOORS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;OAuth Credentials and Tokens&lt;/h3&gt;To access any services beyond the root services document, transaction requests must be authenticated with OAuth, an open authorization protocol&amp;nbsp;&amp;nbsp;(see also: &lt;a href='http://tools.ietf.org/html/rfc5849' target='_blank'&gt;IETF, The OAuth 1.0 Protocol&lt;/a&gt;).&amp;nbsp;&amp;nbsp;In addition to the location of the primary service provider catalog, the root services document contains information required for access with OAuth.&lt;br /&gt;&lt;br /&gt;In the second Test of the example, Access RTN DOORS from RootService w/ OAuth, we retrieve the OAuth URLs from the root services document, provide our credentials and retrieve an access identifier.&amp;nbsp;&amp;nbsp;This exercise requires a functional DOORS Web service which has been configured for web / automated access.&amp;nbsp;&amp;nbsp;Your DOORS administrator will need to provide you with a consumer key and consumer secret.&amp;nbsp;&amp;nbsp;The second Test has a header section which the end user must fill with their own implementation-specific information:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;!============================================================================&lt;br /&gt;!This data is generic, configure the server and port before running this demo &lt;br /&gt;sDwaServer="doors9501.com" &lt;br /&gt;lPort=8443 &lt;br /&gt;sConsumerKey=""&lt;br /&gt;sConsumerSecret=""&lt;br /&gt;sRootservices="http://"+sDwaServer+":"+Str(lPort)+"/dwa/public/rootservices" &lt;br /&gt;!============================================================================&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sDwaServer is the URL of your DOORS web service&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;lPort is the port of the DOORS web service&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;sConsumerKey is provided by your DOORS administrator&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;sConsumerSecret is provided by your DOORS administrator&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;sRootservices is the address of the root services document.&amp;nbsp;&amp;nbsp;I assumed Rational DOORS Web Access version 1.4.0.2 or later.&lt;/li&gt;&lt;/ul&gt;With the correct information, the Test will retrieve the jfs:oauthRequestTokenUrl, jfs:oauthUserAuthorizationUrl, jfs:oauthAccessTokenUrl and use these URLs along with the user-provided information to load a log-in screen (via a pop-up Internet browser).&amp;nbsp;&amp;nbsp;After the user has put is his or her DOORS credentials, the Internet browser will respond with an identifier: a six digit query string value.&amp;nbsp;&amp;nbsp;This identifier is the access token required for access to documents beyond the root services document.&lt;br /&gt;&lt;br /&gt;Depending on your organization's needs, the log-in process described can be optimized.&amp;nbsp;&amp;nbsp;For instance, instead of an external browser an ATEasy form can launch the log-in screen and automatically record and store the identifier.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;An example: Crawling through your Database&lt;/h3&gt;All access attempts beyond the root services document must make use of the OAuth access token (identifier).&amp;nbsp;&amp;nbsp;The final Test in the example demonstrates an algorithm for crawling through the DOORS web service.&amp;nbsp;&amp;nbsp;The purpose of the crawler is to record the URL of all service provider catalogs and service providers within the database.&lt;br /&gt;&lt;br /&gt;ATEasy keeps track of a list of to-be-searched URLs and already-searched URLS. Each URL in the to-be-searched list is accessed and parsed for service provider catalogs and service providers.&amp;nbsp;&amp;nbsp;The URLs of these provider entities are added to the to-be-searched list as long as they do not already exist in either of the lists.&amp;nbsp;&amp;nbsp;As URLs are searched, they are moved to the already-searched list.&lt;br /&gt;&lt;br /&gt;Initially, the root services documents is the only URL in the to-be-searched list.&lt;br /&gt;&lt;br /&gt;When the Test completes, the user can examine the already-searched list to see all of the service provider catalogs and service provider URLs.&amp;nbsp;&amp;nbsp;While this Test is not particularly functional in itself, it demonstrates how a user may programmatically search for and locate a specific requirement with no previous knowledge of the database architecture.&lt;br /&gt;&lt;br /&gt;&lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/Q200271\ConsumingRESTfulServices.zip' target='_blank'&gt;ATEasy Example Code&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200271/Accessing-RESTful-services-using-OAuth-and-Rational-DOORS-Web-services-from-ATEasy</link><pubDate>3/27/2025</pubDate></item><item><title>"Unable to open HW.SYS/VXD" or "Unable to open HW Device Driver" error when opening ATEasy - Published on 3/7/2025</title><description>&lt;h3&gt;Overview&lt;/h3&gt;ATEasy and other Marvin Test Solutions software used HW device driver to access hardware. This article explain how to solve and error message &lt;b&gt;"Unable to open HW.SYS/VXD"&lt;/b&gt; or &lt;b&gt;"Unable to open HW Device Driver..."&lt;/b&gt; that appear when starting ATEasy or other software. This error usally occurs when HW was not installed properly with Administrator privileges, or because of&amp;nbsp;&amp;nbsp;the HW driver is not the latest driver (see &lt;a href='https://www.marvintest.com/KB/Q200362/' target='_blank'&gt;KB Q200362&lt;/a&gt;). To learn more about HW, see &lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=192' target='_blank'&gt;What is HW?&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200266\ATEasy Error.PNG" alt="Unable to Open HW Error" title="Unable to Open HW Error" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1: ATEasy Error&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Solution&lt;/h3&gt;Download and install the latest HW driver: &lt;br /&gt; &lt;a href='https://www.marvintest.com/Search.aspx?Category=Download&amp;SearchType=AllWords&amp;kw=hw.exe' target='_blank'&gt;Download HW.exe setup&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If that does not work, you can try the following steps (after upgrading to the latest HW version):&lt;br /&gt;&lt;br /&gt;Start the current HW driver manually using the command prompt as explained here:&lt;br /&gt;&lt;br /&gt;1. Open the command prompt in Administrator mode: Open Windows Explorer, select the Windows, System 32 folder, Right-click cmd.exe and click on &lt;b&gt;Run as Administrator&lt;/b&gt;r command. The Command Prompt window will open.&lt;br /&gt;&lt;br /&gt;2. Type: &lt;b&gt;cd\&lt;/b&gt; and hit the Enter key. &lt;br /&gt;&lt;br /&gt;3. Type: &lt;b&gt;cd \Program Files\Marvin Test Solutions\HW&lt;/b&gt;, use &lt;b&gt;Program Files (x86)&lt;/b&gt; when using a 64-bit machine. If that folder does not exist, you need to install HW from Marvin Test website HW product, downloads tab: &lt;a href='http://www.marvintest.com/Product.aspx?Model=HW' target='_blank'&gt;Download HW&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4. Now that we are in the file directory we can run the HWSetup.exe. Type: &lt;b&gt;HWSetup install start&lt;/b&gt;&amp;nbsp;&amp;nbsp;and hit enter. This will begin the install process. When it finishes running you should receive confirmation of completion and some notes.&lt;br /&gt;&lt;br /&gt;5. We can also check the status of HW by typing the command: &lt;b&gt;HWSetup status&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200266\CommandLineMain.PNG" alt="Installing HW" title="Installing HW" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2: Command Prompt&lt;/b&gt;&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200266/Unable-to-open-HW-SYS-VXD-or-Unable-to-open-HW-Device-Driver-error-when-opening-ATEasy</link><pubDate>3/7/2025</pubDate></item><item><title>GT95015 Differential Digital I/O Breakout Adapter Board Product Information - Published on 3/1/2025</title><description>The GT95015 is a breakout adapter that can be used with all MTS Digital I/O products that provide differential I/O signals. For ease of access to the digital signals, the GT95015 breaks out the 68-pin SCSI-2 connector (J1) pins to a dual row connector with 100 mil spaced pins, designated J2 on the board. In addition, the GT95015 provides three methods of terminating all of the I/O signals in order to best match the requirements of the UUT and the DIO instrument.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200135\GT95015.JPG" alt`=&amp;quot; border='0' /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The basic connection between the GT95015 and the DIO instrument is accomplished using a SCSI-2 cable with 68-pin connectors on each end. The cable can be of any practical length as determined by the systems needs, however, consideration should be given to how signal or system timing might be affected as cable lengths are increased. The best approach would be to use the shortest cable practical (MTS part numbers for various length SCSI-2 cables are provided at the end of this document). &lt;br /&gt;Cables connecting to the J2 100 mil pins may be individual wires, mass terminated connectors, or combinations thereof. Care should be taken to provide adequate ground returns for the signals used, again, giving consideration to how UUT loading, signal quality or system timing might be affected as cable lengths are increased.&lt;br /&gt;&lt;br /&gt;The GT95015 supports three basic termination configurations; unterminated, bus termination and isolated termination, using SIP resistor packs in the locations provided. Refer to Figure 1 and Figure 2. Locations UR1, UR2, UR3, UR4, UR9, UR10, UR11 and UR12 are used for bus termination, along with jumpers JP1 – JP6. Locations UR5, UR6, UR7, UR8, UR13, UR14, UR15 and UR16 are used for isolated termination.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200135\GT95015 Layout.JPG" alt`=&amp;quot; border='0' /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 1: GT95015 Differential DIO Adapter&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Isolated Termination&lt;/b&gt;&lt;br /&gt;Isolated termination places a termination resistor across the differential signals using an eight pin single inline resistor package (SIP). The value of the SIP resistors is selected to match the characteristic impedance of the logic device and the cable and each SIP provides four resistors connected across four differential signals(see figure 2, UR5 – UR8 and UR13 – UR16). For example, if LVDS is being used, then the SIP’s should provide 100 ohm resistors. Care should be taken to orient the SIP’s so that pin 1 of the SIP is matched to pin 1 on the GT95015.&lt;br /&gt;&lt;b&gt;Bus Termination&lt;/b&gt;&lt;br /&gt;Bus termination places a termination resistor from each of the differential signals to a reference termination voltage (see figure 2, UR1 – UR4 and UR9 – UR12), as determined by jumpers JP1 to JP6. The SIP’s used in the bus termination scheme are ten pin devices and provide nine resistors (one is unused) connected to a reference termination voltage. Care should be taken to orient the SIP’s correctly so that pin 1 of the SIP is matched to pin 1 on the GT95015.&lt;br /&gt;The termination voltage is selected using jumpers JP1 to JP6 and can be configured to provide a single reference voltage for all signals, or split into two sixteen pin groups each with their own single or dual voltage references. Termination voltages can be applied to Connector J1 pins 33, 34, 67 and 68 or to connector J2 pins 65, 66, 67 and 68. This allows either the DIO instrument or the UUT to provide the termination voltage to the GT95015. However, caution should be exercised that termination voltages are not applied to both J1 and J2 pins simultaneously – especially if the voltages are of different levels or polarities, as damage may result to the GT95105, the DIO instrument, the UUT or all three.&lt;br /&gt;Care should also be taken that if V+1 and V-1 are used, that JP5 is removed if they are different values or different polarities. Similar care should be taken that if V+2 and V-2 are used, that JP6 is removed if they are different values or different polarities&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200135\GT95015 Schematic.JPG" alt`=&amp;quot; border='0' /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 2: GT95015 Schematic&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/Q200135\GT95015 schematic.pdf' target='_blank'&gt;Click Here&lt;/a&gt; to View Large Schematic&lt;br /&gt;&lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/Q200135\gt95015.pdf' target='_blank'&gt;Click Here&lt;/a&gt; to View Mechanical Drawing&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MTS SCSI-2 Cable Part Numbers&lt;/b&gt;. &lt;br /&gt;GT95021&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2' shielded cable for GT5xxx/GX5xxx/GC5xxx (68pin SCSI-2 connectors on both ends)&lt;br /&gt;GT95022&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3' shielded cable for GT5xxx/GX5xxx/GC5xxx (68pin SCSI-2 connectors on both ends) &lt;br /&gt;GT95028&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10' shielded cable for GT5xxx/GX5xxx/GC5xxx (68pin SCSI-2 connectors on both ends)&lt;br /&gt;GT95031&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6' shielded cable for GT5xxx/GX5xxx/GC5xxx (68pin SCSI-2 connectors on both ends)&lt;br /&gt;GT95032&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6" shielded cable for GT5xxx/GX5xxx/GC5xxx (68pin SCSI-2 connectors on both ends)&lt;br /&gt;GT95032-8 8" shielded cable for GT5xxx/GX5xxx/GC5xxx (68pin SCSI-2 connectors on both ends)</description><link>https://www.MarvinTest.com/KB/Q200135/GT95015-Differential-Digital-I-O-Breakout-Adapter-Board-Product-Information</link><pubDate>3/1/2025</pubDate></item><item><title>GT95014 Digital I/O Single-ended Beakout Adapter Board Product Information - Published on 2/25/2025</title><description>The GT95014 is a breakout adapter for all MTS Digital I/O products with single-ended I/O signals. The GT95014 provides an interface between the 68-pin SCSI-2 connectors used on the MTS DIO cards and 100 mil spaced pins. In addition, the GT95014 provides the option of terminating all of the I/O signals to match the impedance requirements of the UUT and the DIO instrument.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200133\GT95014.JPG" alt`=&amp;quot; border='0' /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Cabling&lt;/h3&gt;The basic connection between the GT95014 and the DIO card is accomplished using a SCSI-2 cable with 68-pin connectors on each end. The cable can be of any practical length as determined by the systems needs, however, consideration should be given to how signal or system timing might be affected as cable lengths are increased. The best approach would be to use the shortest cable practical.&lt;br /&gt;The GT95014 is connected to the UUT via a 68-pin, 100 mil pin grid. Cables connecting to the 100 mil pins may be individual wires, mass terminated connectors, or combinations thereof. Care should be taken to provide adequate ground returns for the signals used, again, giving consideration to how UUT loading, signal quality or system timing might be affected as cable lengths are increased.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Configuration&lt;/h3&gt;The GT95014 supports two basic termination configurations, unterminated and parallel termination, using SIP resistor packs in the locations UR1, UR2, UR3 and UR4. Refer to Figure 1 and Figure 2.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Parallel Termination&lt;/h3&gt;Parallel termination places termination resistors in parallel from VCC and GND to the I/O signal using a ten pin single inline resistor package (SIP). The value of the SIP resistors are selected to match the characteristic impedance of the logic device and the cable, with each SIP providing eight pairs of resistors connected to eight separate signals (see Figure 2, UR1 – UR4). For example, if LVTTL signals are being used to drive a 100 ohm cable, then the SIP’s should provide the Thevenin-equivalent of 100 ohm termination resistors. Be careful to orient the SIP’s so that pin 1 of the SIP is matched to pin 1 on the GT95014.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200133\GT95014 Layout.JPG" alt`=&amp;quot; border='0' /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 1: GT95014 Single-Ended DIO Adapter&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;The VCC termination voltage is provided via pins 33 and 67 on connector J1, and pins 33 and 34 on connector J2. This allows either the DIO instrument or the UUT to provide the termination voltage to the GT95014. However, caution should be exercised so that termination voltages are not applied to both the J1 and J2 pins simultaneously – especially if the voltages are of different values, as damage may result to the GT95104, the DIO instrument, the UUT or all of the above.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200133\GT95014 schematic.JPG" alt`=&amp;quot; border='0' /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 2: GT95014 Single-Ended DIO Adapter Schematic&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/Q200133\gt95014.pdf' target='_blank'&gt;Click Here&lt;/a&gt; to View Mechanical Drawing</description><link>https://www.MarvinTest.com/KB/Q200133/GT95014-Digital-I-O-Single-ended-Beakout-Adapter-Board-Product-Information</link><pubDate>2/25/2025</pubDate></item><item><title>Instruments Installation on NI Linux Real-Time OS - Published on 2/13/2025</title><description>This article details the process involved in using Marvin Test Solutions instrumentation when using an NI Real-Time target from a Windows host PC which superseded the deprecated Phar Lap OS.&amp;nbsp;&amp;nbsp;This includes the process to adding our instruments to the manifest and overcoming commonly encountered issues when installing the GtLinux software and adding MTS instruments.&amp;nbsp;&amp;nbsp;This process was most recently tested against Linux RT System Image 2024 Q3 and LabVIEW 2024 Q3 on the host computer.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;First time installation: NI Linux Real-Time&lt;/h3&gt;GtLinux software package contains the shared libraries for all MTS instruments, but some NI Linux Real-Time OS specific modifications were be made to install this software.&lt;br /&gt;&lt;br /&gt;Before starting installation of Marvin Test Solutions software, make sure that you are able to establish a connection to the remote target using NI-MAX software and then ensure the NI-VISA software is installed on the real-time target. &lt;a href='https://knowledge.ni.com/KnowledgeArticleDetails?id=kA03q000000x2jQCAQ&amp;l=en-US' target='_blank'&gt;Installing Software on NI Linux Real-Time&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1. Download the GtLinux software package from the MTS website.&lt;br /&gt;&lt;a href='https://www.marvintest.com/Search.aspx?Category=Download&amp;SearchType=AllWords&amp;kw=GtLinux.tar' target='_blank'&gt;Download: GtLinux.tar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Follow the GtLinux instructions per GtLinuxReadMe.txt to deploy the software to the install directory by unpacking the tarball.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;div class='fixedFont'&gt;/usr/share/MarvinTestSolutions# tar -xvf ./GtLinux.tar&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;3. Using the -nirt option, finish installation per GtLinuxReadMe.txt&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;div class='fixedFont'&gt;/usr/share/MarvinTestSolutions# sh ./install.sh -nirt&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;4. At this point, an optional verification can be performed.&amp;nbsp;&amp;nbsp;The command "ls -l /dev/HW*" should show the HWMTS driver.&amp;nbsp;&amp;nbsp;If this library is missing, the most likely cause if NI-VISA not being present on the Real-Time target.&amp;nbsp;&amp;nbsp;In this case, confirm step 1 was completed and retry installation of the GtLinux's install shell script.&lt;br /&gt;&lt;br /&gt;If the HWMTS software is present, restart the target and confirm the instrument's presence in NI-MAX.&amp;nbsp;&amp;nbsp;Congratulations!&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Troubleshooting&lt;/h3&gt;If an MTS device driver is not recognized and the chassis slot in known to be good, it is possible that the version of GtLinux was released before the instrument you are attempting to integrate.&amp;nbsp;&amp;nbsp;If this is the case, the system installer could upgrade to the latest version of GtLinux or manually create an INF file using the NI-VISA Driver Wizard:&lt;br /&gt;&lt;br /&gt;- Open the NI-VISA Driver Wizard.&amp;nbsp;&amp;nbsp;This application is included with the NI-VISA software&lt;br /&gt;- Select the PXI/PCI as the bus interface.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200360\Q200360_NIVISA_0_Selection.png" alt="NI-VISA Driver Wizard - Hardware Bus Selection Window - Select PXI/PCI" title="NI-VISA Driver Wizard - Hardware Bus Selection Window - Select PXI/PCI" border='0' &gt;&lt;br /&gt;- In the "PXI/PCI - Device Information" wage, deselect 'This device has a subsystem ID' checkbox and fill out the VID, PID, Manufacturer Name, and Model Name.&amp;nbsp;&amp;nbsp;This example is for the GX3500 FPGA PXI instrument&lt;br /&gt;&lt;br /&gt;Manufacturer ID / VID is always &lt;b&gt;0x16E2&lt;/b&gt; for Marvin Test instruments.&lt;br /&gt;Product ID / PID usually matches the model number of the instrument.&amp;nbsp;&amp;nbsp;In this example &lt;b&gt;0x3500&lt;/b&gt;&lt;br /&gt;Manufacturer Name is always &lt;b&gt;Marvin Test Solutions, Inc.&lt;/b&gt; for Marvin Test instruments.&lt;br /&gt;Model Name should match the model name with the GX prefix.&amp;nbsp;&amp;nbsp;A full description can be found in HW.inf.&amp;nbsp;&amp;nbsp;In this example &lt;b&gt;GX3500 Digital I/O FLEX FPGA Board&lt;/b&gt;&lt;br /&gt;If the instrument is an express instrument, the 'This device is PXI Express' checkbox should be clicked.&lt;br /&gt;&lt;br /&gt;This information can be found in the HW.inf file, usually located at C:\Program Files (x86)\Marvin Test Solutions\HW&lt;br /&gt;&lt;br /&gt;%HW.GX3500DriverDesc%=HW, PCI\VEN_16E2&amp;DEV_3500&lt;br /&gt;HW.GX3500DriverDesc="GX3500 Digital I/O FLEX FPGA Board"&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200360\Q200360_NIVISA_1_DeviceInformation.png" alt="NI-VISA Driver Wizard - Device Information - Add Device Information to describe the target device" title="NI-VISA Driver Wizard - Device Information - Add Device Information to describe the target device" border='0' &gt;&lt;br /&gt;&lt;br /&gt;-Instrument prefix should match the model number (i.e. GX3500).&amp;nbsp;&amp;nbsp;This should create an INF and INI to control the instrument.&amp;nbsp;&amp;nbsp;These will need to be moved to the Real-Time target.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200360\Q200360_NIVISA_2_OutputFileGeneration.png" alt="NI-VISA Driver Wizard - Output File Generation Window - Enter the model number as it appears of the lexan of the instrument you are using" title="NI-VISA Driver Wizard - Output File Generation Window - Enter the model number as it appears of the lexan of the instrument you are using" border='0' &gt;&lt;br /&gt;&lt;br /&gt;Install the instrument-specific INF&lt;br /&gt;- Copy GX3500.inf created in the previous steps into /etc/nipal/devinit.d&lt;br /&gt;- Copy libMtsIviVisaPlugIn.so to /usr/lib/x86_64-linux-gnu/MarvinTestSolutions/&lt;br /&gt;- At this point, an optional verification can be performed.&amp;nbsp;&amp;nbsp;The command "ls -l /dev/HW*" should show the HWMTS driver.&amp;nbsp;&amp;nbsp;If this library is missing, the most likely cause if NI-VISA not being present of the Real-Time target.&amp;nbsp;&amp;nbsp;In this case, install the software and rerun GtLinux's install shell script.&lt;br /&gt;- Restart the system and verify the instrument's presence in NI-MAX as depicted below.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200360\Q200360_NIVISA_3_MAXVerification.png" alt="NI-MAX - Image depicts a correctly configured device recognized by NI-MAX" title="NI-MAX - Image depicts a correctly configured device recognized by NI-MAX" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Related files&lt;/h3&gt;&lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/Q200360\GX3500.tar' target='_blank'&gt;Sample GX3500 Configuration Files&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200360/Instruments-Installation-on-NI-Linux-Real-Time-OS</link><pubDate>2/13/2025</pubDate></item><item><title>National Instruments BIOS Compatibility software and MXI-Express - Published on 2/12/2025</title><description>When using the National Instruments (NI) MXI Express interface (PCIe or ExpressCard) with a PXI or PXIe chassis, you may encounter problems with recognizing PXI/PXIe devices installed in the chassis (code 12 or 31 in Device Manager), with your computer locking up at boot, or with Windows crashes (blue screen). This is caused by the controller's (either a Desktop or Laptop) inability to enumerate these devices and allocate the appropriate resources through the MXI Express interface. &lt;br /&gt;&lt;br /&gt;The following figure shows an example of the code 12 error in Device Manager.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q2000132-Code12.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;Installing the NI BIOS Compatibility software and configuring your PCIe MXI Express card for compatibility mode, will force the BIOS not to allocate resources upon boot up. Resource allocation is done strictly through software.&lt;br /&gt;&lt;br /&gt;Verify that your MXI Express PCIe board is supported in BIOS compatibility mode. Note that only the newer board revisions are capable of this. You can find a list of the supported part and revision values at &lt;a href='http://digital.ni.com/public.nsf/allkb/87154113AD441BE6862575FC0077D854' target='_blank'&gt;Supported Boards&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To resolve the issue, follow these steps:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Download and install the NI BIOS Compatibility software for Windows XP/Vista available at &lt;a href='http://joule.ni.com/nidu/cds/view/p/id/1422/lang/en' target='_blank'&gt;NI Compatibility Download&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Once the software has been installed, shut down the computer and chassis.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Physically set the MXI PCIe card to compatibility mode by setting the correct jumper.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;You can find instructions on how to switch your MXI PCIe card to compatibility mode at &lt;a href='http://ftp.ni.com/support/softlib/PXI/MXIe%20Compatibility%20Software/readme.html' target='_blank'&gt;Switching MXIe Modes&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note that the laptop ExpressCard does not have any physical jumpers. Instead, it is switched through software control as per the instructions in the above link.&lt;br /&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Start the chassis first, and then the computer. Any PXI/PXIe devices should now be found by Windows without errors.&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200185/National-Instruments-BIOS-Compatibility-software-and-MXI-Express</link><pubDate>2/12/2025</pubDate></item><item><title>Calling and Using Python Code from ATEasy - Published on 2/12/2025</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;&lt;div class='GB'&gt;&lt;b&gt;NOTE:&lt;/b&gt; This article assumes knowledge of ATEasy and Python.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Overview&lt;/h3&gt;This article introduce the Python ATEasy driver that enables you to call Python scripts from ATEasy, The ATEasy Python Driver is a wrapper of the Python/C API that allows you to use and call Python modules (.py files) in ATEasy. ATEasy 2024 comes with ATEasy Python project that includes the following:&amp;nbsp;&amp;nbsp;&lt;ul&gt;&lt;li&gt;Python.prj - ATEasy Python example project file&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Python.drv - ATEasy Python driver file&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Python.prg - ATEasy Python example program file&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Python.sys - ATEasy Python example program system file&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Python.py - Python example program script file used by the ATEasy example program&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Python/C API (Dynamic Link Library)&lt;/h3&gt;In order to use the ATEasy Python program you will need first to download &lt;a href='https://www.python.org/downloads/windows/' target='_blank'&gt;Python&lt;/a&gt; and install it on your system. The Python installation package gives you access to the Python/C API's Dynamic Link Library (python.dll). &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Open the Python Example project&lt;/h3&gt;The Python example project can be open from the the ATEasy Drivers folder, For ATEasy 2024 use following path: C:\Program Files (x86)\Marvin Test Solutions\ATEasy\2024\Drivers.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200341\Open ATEasy Python Example project.jpg" alt="Figure 1: Open Python Example project" title="Figure 1: Open Python Example project" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1: Open Python Example project&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='left'&gt;&lt;h3&gt;Example Project&lt;/h3&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='left'&gt;The provided example gives an overview of how to access Classes, Methods, and Variables of a Python Module. &lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200341\ATEasy Python Example project.jpg" alt="Figure 2: Python Example Project" title="Figure 2: Python Example Project" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2: View of the Python Example Project&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='left'&gt;&lt;h3&gt;ATEasy Python Driver Operation&lt;/h3&gt;Below is the ATEasy Python Driver tree command:&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200341\Commands.jpg" alt="Figure 3: Driver Commands" title="Figure 3: Driver Commands" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3: Driver Commands&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Initializing and Closing the Python Interpreter&lt;/b&gt; &lt;br /&gt;Initializing the Python Interpreter is done automatically by the driver &lt;b&gt;OnInit()&lt;/b&gt; event, it calls the &lt;b&gt;Py_Initialize()&lt;/b&gt; DLL API&amp;nbsp;&amp;nbsp;(user can use the driver PYTHON Initialize() command to explicitly initialize the Python Interpreter). &lt;br /&gt;Closing the Python Interpreter is done automatically by the driver &lt;b&gt;OnEnd()&lt;/b&gt; event, it calls the&lt;b&gt; Py_Finalize()&lt;/b&gt; DLL API which closes the Python Interpreter (user can also use the driver PYTHON Finalize() command to explicitly close the Python Interpreter).&lt;br /&gt;&lt;br /&gt;Variables and Data Types - we use the following global variables:&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;Variable name &lt;/th&gt;&lt;th&gt;Variable Type&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;avArray&lt;/td&gt;&lt;td&gt;Variant[1]&lt;/td&gt;&lt;td&gt;Array of variants&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;aucStrBytes&lt;/td&gt;&lt;td&gt;Byte[1]&lt;/td&gt;&lt;td&gt;Array of bytes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;avArgv&lt;/td&gt;&lt;td&gt;Variant[2]&lt;/td&gt;&lt;td&gt;Array of Variants&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;hClientSocket&lt;/td&gt;&lt;td&gt;ASocket&lt;/td&gt;&lt;td&gt;A Winsock socket handle&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;hpyArgs&lt;/td&gt;&lt;td&gt;hpyObject&lt;/td&gt;&lt;td&gt;Pointer to a Python object representing the tuple array&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;hpyClass&lt;/td&gt;&lt;td&gt;hpyObject&lt;/td&gt;&lt;td&gt;Pointer to a Python object returned from PYTHON Get Object FromAttribute() driver command&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;hpyClassInstance&lt;/td&gt;&lt;td&gt;hpyObject&lt;/td&gt;&lt;td&gt;Returned pointer to a Python object &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;hpyClientSocket&lt;/td&gt;&lt;td&gt;hpyObject&lt;/td&gt;&lt;td&gt;Pointer to a Python Class instance class variable&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;hpyList&lt;/td&gt;&lt;td&gt;hpyObject&lt;/td&gt;&lt;td&gt;Pointer to a Python list object&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;hpyModule&lt;/td&gt;&lt;td&gt;hpyObject&lt;/td&gt;&lt;td&gt;Pointer to a Python object returned from calling the import example Python module script file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;hpyReturn&lt;/td&gt;&lt;td&gt;hpyObject&lt;/td&gt;&lt;td&gt;Returned Pointer to a Python object &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example Code: Instantiate Python Class With Initializer From ATEasy&lt;/b&gt;&lt;br /&gt;The following example Instantiate Python Class With Initializer From ATEasy, fills an array, and returns the first item of the array&lt;br /&gt;&lt;div class='GB'&gt;&lt;div class='fixedFont'&gt;hpyModule=PYTHON Module Import("Python")&lt;br /&gt;if hpyModule&lt;&gt;0&lt;br /&gt;&lt;blockquote&gt;TestStatus=PASS&lt;/blockquote&gt;else&lt;br /&gt;&lt;blockquote&gt;	TestStatus=FAIL&lt;br /&gt;&lt;/blockquote&gt;endif&lt;br /&gt;! nInitNumber is a const short = 21&lt;br /&gt;hpyObject=PYTHON Get Object FromAttribute(hpyModule, "PythonClass")&lt;br /&gt;hpyArgs=PYTHON Set Args Tuple({nInitNumber})&lt;br /&gt;&lt;br /&gt;! Reference and retrieve PythonClass instance class_variable&lt;br /&gt;hpyClassInstance=PYTHON Call Object(hpyObject, hpyArgs)&lt;br /&gt;hpyReturn=PYTHON Get Object FromAttribute(hpyClassInstance, "class_variable")&lt;br /&gt;TestResult=PYTHON Get Long(hpyReturn)&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Code Explanation:&lt;/b&gt;&lt;br /&gt;hpyModule=PYTHON Module Import("Python"): Import the module named "Python.py": This function returns a Python Object pointer to the imported module, or NULL if an error occurs.&lt;br /&gt;hpyObject=PYTHON Get Object FromAttribute(hpyModule, "PythonClass"): This function passed the hpyModule object, representing the attribute name instead of a C string&lt;br /&gt;hpyArgs=PYTHON Set Args Tuple({nInitNumber}): Create a new tuple of length =21&lt;br /&gt;hpyClassInstance=PYTHON Call Object(hpyObject, hpyArgs): Reference and retrieve PythonClass instance class_variable&lt;br /&gt;hpyReturn=PYTHON Get Object FromAttribute(hpyClassInstance, "class_variable"): Reference hpyObject from attribute name.&lt;br /&gt;TestResult=PYTHON Get Long(hpyReturn): set TestResult to the first long value in the tuple array&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example Code: Return a Struct&lt;/b&gt;&lt;br /&gt;The following example reads a structure from the Python.py file, and verify the values of the structure members. &lt;br /&gt;&lt;div class='GB'&gt;&lt;div class='fixedFont'&gt;!Python.py file module&amp;nbsp;&amp;nbsp;section&lt;br /&gt;def GetStruct():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;volt=3.64&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cur=3.1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res=3.64/0.0031&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myStruct=struct.pack('@3d',volt,cur,res)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return myStruct&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;ATEasy code&lt;/b&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;div class='fixedFont'&gt;hpyModule=PYTHON Module Import("Python")&lt;br /&gt;if hpyModule&lt;&gt;0&lt;br /&gt;&lt;blockquote&gt;	TestStatus=PASS&lt;br /&gt;&lt;/blockquote&gt;else&lt;br /&gt;&lt;blockquote&gt;	TestStatus=FAIL&lt;br /&gt;&lt;/blockquote&gt;endif&lt;br /&gt;&lt;br /&gt;hpyObject=PYTHON Get Object FromAttribute(hpyModule, "GetStruct")&lt;br /&gt;TestResult=PYTHON Get Data(PYTHON call Object NoArg(hpyObject), &amp;stMeasurement)&lt;br /&gt;if stMeasurement.dVoltage=3.64&lt;br /&gt;&lt;blockquote&gt;	TestStatus=PASS&lt;br /&gt;&lt;/blockquote&gt;else&lt;br /&gt;&lt;blockquote&gt;	TestStatus=FAIL&lt;br /&gt;	exittest&lt;br /&gt;&lt;/blockquote&gt;endif&lt;br /&gt;&lt;br /&gt;if stMeasurement.dCurrent=3.1&lt;br /&gt;&lt;blockquote&gt;	TestStatus=PASS&lt;br /&gt;&lt;/blockquote&gt;else&lt;br /&gt;&lt;blockquote&gt;	TestStatus=FAIL&lt;br /&gt;	exittest&lt;br /&gt;&lt;/blockquote&gt;endif&lt;br /&gt;&lt;br /&gt;if stMeasurement.dResistance=(stMeasurement.dVoltage/0.0031)&lt;br /&gt;&lt;blockquote&gt;	TestStatus=PASS&lt;br /&gt;&lt;/blockquote&gt;else&lt;br /&gt;&lt;blockquote&gt;	TestStatus=FAIL&lt;br /&gt;	exittest&lt;br /&gt;&lt;/blockquote&gt;endif&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Code Explanation:&lt;/b&gt;&lt;br /&gt;hpyModule=PYTHON Module Import("Python"): Import the module named "Python.py": This function returns a Python Object pointer to the imported module, or NULL if an error occurs.&lt;br /&gt;hpyObject=PYTHON Get Object FromAttribute(hpyModule, "GetStruct"): returns the python object named "GetStruct" form the file&lt;br /&gt;TestResult=PYTHON Get Data(PYTHON call Object NoArg(hpyObject), &amp;stMeasurement): fill the ATEasy declared structure named stMeasurement with the data form the module.&lt;br /&gt;if stMeasurement.dVoltage=3.64: verifying that the dVoltage structure member is equal to 3.64&lt;br /&gt;if stMeasurement.dCurrent=3.1: verifying that the dCurrent structure&amp;nbsp;&amp;nbsp;member is equal to 3.1&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;Embedding the Python interpreter using the ATEasy Python driver allowing users to utilize Python's new and exiting code, and python libraries to enhance and expand ATEasy application.</description><link>https://www.MarvinTest.com/KB/Q200341/Calling-and-Using-Python-Code-from-ATEasy</link><pubDate>2/12/2025</pubDate></item><item><title>How to Save an ATEasy Test Log to a PDF file - Published on 12/10/2024</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;When saving an ATEasy Log, the Test Executive supports the following formats: Log Files (.log), HTML Files (.htm, .html), Text Files (.txt), and HTML Web Archive Files (.mht).&amp;nbsp;&amp;nbsp;From the Test Executive, the Save As selection can be accessed from the Log Menu (Figure 1).&amp;nbsp;&amp;nbsp;HTML is set as the default option, but the user can scroll through the format list to view and select other available options (Figure 2). &lt;br /&gt;&lt;br /&gt;This article will demonstrate the process for implementing ATEasy Test Executive options for saving PDF Test Log files.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200332\\LogSaveAs.png" alt="Log Menu Save As " title="Log Menu Save As " border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1 – Log Menu Save As&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200332\\LogSaveAs_Options.png" alt="Log Menu Save As Options" title="Log Menu Save As Options" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2 – Log Menu Save As Options&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Overview&lt;/h3&gt;For the Test Executive to support saving a test log as a PDF file, a Procedure needs to be created that will perform the task.&amp;nbsp;&amp;nbsp;And the Test Executive needs to be customized to allow the operator a means to execute the new procedure.&amp;nbsp;&amp;nbsp;Since the Test Executive driver is included as part of the ATEasy installation, any modifications made directly to the driver risk being over-written when updating your ATEasy installation or applying patches.&amp;nbsp;&amp;nbsp;For this reason, the method presented in this article will avoid directly changing the Test Executive code, and instead will use the Test Executive &lt;b&gt;Tools:Customize&lt;/b&gt; utility built into the Test Executive to add the functionality as an extension to the Test Executive.&amp;nbsp;&amp;nbsp;The Test Executive extensions are saved in the ATEasy USR file and become a permanent extension to the Test Executive - without the need to modify the Test Executive directly.&amp;nbsp;&amp;nbsp;Future versions of the ATEasy Test Executive released by Marvin Test Solutions can continue to take advantage of the added functionality.&lt;br /&gt;&lt;br /&gt;The process for adding the PDF save function is:&lt;br /&gt;&lt;blockquote&gt; -&amp;nbsp;&amp;nbsp;Create "&lt;b&gt;LogSavePdf&lt;/b&gt;" Procedure in the System module&lt;br /&gt; -&amp;nbsp;&amp;nbsp;Customize the ATEasyTest Executive to add a new &lt;b&gt;Log Menu&lt;/b&gt; selection and a new &lt;b&gt;Toolbar Button&lt;/b&gt; to call the PDF save procedure&lt;br /&gt; -&amp;nbsp;&amp;nbsp;Test the new procedure and Test Executive customizations&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='GB'&gt;&lt;b&gt;NOTE:&lt;/b&gt; The save as PDF function utilizes the Print-to-PDF functionality built into the Microsoft Edge® browser that is installed with Windows®.&amp;nbsp;&amp;nbsp;While there are many other applications that provide similar functionality, they would only be available to systems where those applications have been installed.&amp;nbsp;&amp;nbsp;Since Edge is installed with all later versions of Windows, the functionality described in this article is available without the need to install, or purchase, any other applications.&lt;br /&gt;&lt;br /&gt;For details of how this process works, see:&amp;nbsp;&amp;nbsp;&lt;a href='https://github.com/adriancs2/HTML-PDF-Edge' target='_blank'&gt;&lt;b&gt;Convert HTML to PDF by Using Microsoft Edge&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;Create New Save PDF Procedure&lt;/h3&gt;A new procedure, &lt;b&gt;LogSavePdf&lt;/b&gt;, is inserted in the System module, Procedures submodule.&amp;nbsp;&amp;nbsp;The procedure could be inserted into a driver, but this would require the driver to be installed in every ATEasy application where the functionality is desired.&amp;nbsp;&amp;nbsp;Placing it in the System module and using that module as the standard System configuration going forward, allows all future ATEasy applications the ability of saving PDF test logs.&lt;br /&gt;&lt;br /&gt;The procedure is self-contained; it does not require any parameters, and variables used within the procedure are local to the procedure to support the save PDF process.&amp;nbsp;&amp;nbsp;The full variable list for the procedure is shown below.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;blockquote&gt;logToSave: ALog&lt;br /&gt;sPdfFile: String&lt;br /&gt;sWinExecCmd: String&lt;br /&gt;lFlagSignal: Long&lt;br /&gt;hWinExecHandle: AHandle&lt;br /&gt;sHtmlFile: String&lt;br /&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The LogSavePdf() procedure uses existing ATEasy Test Executive controls and methods - specifically, the formTestExec.cdlg &lt;b&gt;Common Dialog&lt;/b&gt; control and it's &lt;b&gt;ShowSaveAs()&lt;/b&gt; method.&amp;nbsp;&amp;nbsp;The Common Dialog control is used to enter/select the PDF file to use for saving the test log, and has various properties associated with it that govern the look and operation of the dialog.&amp;nbsp;&amp;nbsp;The code below configures certain dialog properties before calling the ShowSaveAs() method, which then launches the file navigation dialog.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;blockquote&gt;!&amp;nbsp;&amp;nbsp;Set Test Executive ShowSaveAs dialog properties&lt;br /&gt;TestExec.m_frmMain.cdlg.DialogTitle = "Save Log As PDF"&lt;br /&gt;TestExec.m_frmMain.cdlg.Filter = "PDF Log Files (*.pdf)|*.pdf"&lt;br /&gt;TestExec.m_frmMain.cdlg.InitialDir = GetDir() + "\\"&lt;br /&gt;&lt;br /&gt;!&amp;nbsp;&amp;nbsp;Call the Test Executive ShowSaveAs method/dialog&lt;br /&gt;if TestExec.m_frmMain.cdlg.ShowSaveAs() = acdlgRetValCancel then return&lt;br /&gt;TestExec.m_frmMain.cdlg.FilterIndex = 2 ! Reset the control filter to HTML (2)&lt;br /&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A successful return of the ShowSaveAs() dialog will contain the PDF file name and path in the &lt;b&gt;FileName&lt;/b&gt; property.&amp;nbsp;&amp;nbsp;This is used for saving both a PDF version of the test log, as well as a temporary HTML version of the log.&amp;nbsp;&amp;nbsp;The Edge Print-to-PDF function uses an HTML file as the print source, so a temporary HTML file is created using the same file name and path as the PDF file, substituting the ".HTM" extension in place of ".PDF".&amp;nbsp;&amp;nbsp;Previous versions of the HTML file, if any exist, are removed before saving the new HTML formatted test log.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;blockquote&gt;! create HTML path/file - temporary&lt;br /&gt;sHtmlFile = Replace(TestExec.m_frmMain.cdlg.FileName, ".pdf", ".htm")&lt;br /&gt;lWinExecSignal = FileRemove(sHtmlFile) ! Remove old HTML file - if exists&lt;br /&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;As ATEasy's Test Executive supports Multiple UUT testing, where each UUT is provided its own test log tab, it is necessary to select the Active Log for the PDF conversion.&amp;nbsp;&amp;nbsp;This is done using the public Test Executive GetLog() procedure.&amp;nbsp;&amp;nbsp;This procedure will return the ALog object of the current active test log selected using the UUT tabs located above the test log results.&amp;nbsp;&amp;nbsp;The log object is saved to an ALog-type variable &lt;b&gt;logToSave&lt;/b&gt;.&amp;nbsp;&amp;nbsp;The SaveAs() method for the ALog object is called, resulting in an HTML file for the active test log being saved.&amp;nbsp;&amp;nbsp;If there is an error during the save, an error message is displayed.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;blockquote&gt;! get log object for active UUT&lt;br /&gt;logToSave = GetLog(ateLogActive, - 1)&lt;br /&gt;&lt;br /&gt;if logToSave.SaveAs(sHtmlFile, False) = alogSaveFailed&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MsgBox("Unable to save log file: '" + sHtmlFile + "'", aMsgOk, "Save PDF Error") ! Note the single quote usage '&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;br /&gt;endif&lt;br /&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The Edge Print-to-PDF command line script for printing an HTML file to a PDF file requires that the PDF file path and name to be surrounded by quotes.&amp;nbsp;&amp;nbsp;These quotes are added as prefix and suffix escape characters ("\"").&amp;nbsp;&amp;nbsp;The old PDF file is removed, and an Edge command line script is created as outlined in the article linked above.&amp;nbsp;&amp;nbsp;The command line is executed using ATEasy's WinExec() command to launch Edge in silent mode (headless) and print the temporary HTML file as a PDF file.&amp;nbsp;&amp;nbsp;After WinExec() completes, the temporary HTML file is removed.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;blockquote&gt;! Create PDF path/file&lt;br /&gt;sPdfFile = "\"" + TestExec.m_frmMain.cdlg.FileName + "\""&lt;br /&gt;&lt;br /&gt;! Remove old PDF file - if exists&lt;br /&gt;lFlagSignal = FileRemove(TestExec.m_frmMain.cdlg.FileName) ! remove old PDF&lt;br /&gt;&lt;br /&gt;! create WinExec() command using Edge --print-to-pdf function&lt;br /&gt;sWinExecCmd = "msedge.exe --headless --disable-gpu --run-all-compositor-stages-before-draw " + sHtmlFile + " --print-to-pdf=" + sPdfFile&lt;br /&gt;&lt;br /&gt;! Execute WinExec command&lt;br /&gt;hWinExecHandle = WinExec(sWinExecCmd)&lt;br /&gt;lFlagSignal = WaitForSingleObject(hWinExecHandle, 10000) ! wait for WinExec signal&lt;br /&gt;&lt;br /&gt;! Remove temporary HTML file&lt;br /&gt;FileRemove(sHtmlFile)&lt;br /&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Add Test Executive Hooks (Extension)&lt;/h3&gt;For the following section, refer to the Knowledge-Base article &lt;a href='https://www.marvintest.com/KB/Q200329/Adding-Custom-Commands-to-ATEasy-Test-Executive' target='_blank'&gt;&lt;b&gt;Adding Custom Commands to ATEasy Test Executive&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To call the LogSavePdf() procedure we need to customize the Test Executive to add hooks to the LogSavePdf() procedure.&amp;nbsp;&amp;nbsp;We do this by defining a new Test Executive command, and linking that command to new menu selections, toolbar buttons, or form selections.&amp;nbsp;&amp;nbsp;From the Test Executive Tools:Customize menu, create a new User Command similar to the "&lt;b&gt;SavePdf&lt;/b&gt;" command shown in Figure 3.&amp;nbsp;&amp;nbsp;Fill in the Name, Captions and Description, and enter the System Procedure created above in "&lt;b&gt;Procedure&lt;/b&gt;" and click the &lt;b&gt;Check Box&lt;/b&gt;.&amp;nbsp;&amp;nbsp;An error message will be displayed if the procedure cannot be found.&amp;nbsp;&amp;nbsp;Finally, link an image that you would like associated with the new command.&amp;nbsp;&amp;nbsp;This image can be BMP, JPG or PNG, and should be sized approximately 150 x 150 pixels.&lt;br /&gt;&lt;br /&gt;This example used the following PNG image:&amp;nbsp;&amp;nbsp;&lt;img src="https://www.MarvinTest.com/images/support/\Q200332\PdfIcon-Small.png" alt="PdfIcon.png Image" title="PdfIcon.png Image" border='0' &gt;&lt;br /&gt;&lt;br /&gt;To add the PDF save function to the Test Executive menu and to the Test Executive toolbar, follow the examples shown in Figure 4 and Figure 5.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200332\ToolCustomizeCommand.png" alt="Custom User Defined Command" title="Custom User Defined Command" border='0' &gt;&amp;nbsp;&amp;nbsp; &lt;img src="https://www.MarvinTest.com/images/support/\Q200332\ToolCustomizeMenu.png" alt="Configure Menu Save PDF Log Selection" title="Configure Menu Save PDF Log Selection" border='0' &gt;&amp;nbsp;&amp;nbsp; &lt;img src="https://www.MarvinTest.com/images/support/\Q200332\ToolCustomizeToolbar.png" alt="Configure Toolbar Save PDF Log Button" title="Configure Toolbar Save PDF Log Button" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3 - Customize Command&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Figure 4 - Customize Menu Selection&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Figure 5 - Customize Toolbar&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Testing The New Functions&lt;/h3&gt;To test the Save to PDF functions we added, we need a test program to generate a test log to save.&amp;nbsp;&amp;nbsp;Since the PDF save is designed to work with multiple UUTs, it would be helpful to generate a test log the uniquely identifies the UUT number in the PDF log.&amp;nbsp;&amp;nbsp;The Task/Test structure in Figure 6 below will simply display the UUT number as the Result value in the test log.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200332\SavePdfProgram.png" alt="Program Task/Test Structure" title="Program Task/Test Structure" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6 - Program Task/Test Structure&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Running the project will open the Test Executive as normal, but new menu options and toolbar buttons are available that allow saving the test log as a PDF file, see Figure 7.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200332\SavePdf.png" alt="Menu and Toolbar Save PDF Log Options" title="Menu and Toolbar Save PDF Log Options" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 7 - Save PDF Menu and Toolbar Options&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If the newly created System LogSavePdf() procedure is not copied to future projects, the Save PDF Log option in the Menu and Toolbar will be grayed-out - see Figure 8.&amp;nbsp;&amp;nbsp;This is a reminder to copy the procedure to any new project where the ability to save a PDF test log is desired.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200332\LogSavePdfDisabled.png" alt="Menu and Toolbar Save PDF Log Options Disabled" title="Menu and Toolbar Save PDF Log Options Disabled" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 8 - Save PDF Menu and Toolbar Options Disabled&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;This article demonstrated the process for adding a System procedure that uses the Edge Print-to-PDF capability to save an ATEasy Test Log to a PDF file.&amp;nbsp;&amp;nbsp;Also demonstrated were the steps to add Save As PDF options to the ATEasy Test Executive Log Menu and Toolbar.&lt;br /&gt;&lt;br /&gt;A copy of the ATEasy &lt;a href='/GetFile.aspx?Type=File&amp;Name=\KnowledgeBase\Q200332\SavsAsPdf.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;&lt;b&gt;SaveAsPdf Project&lt;/b&gt;&lt;/a&gt; can be downloaded here.&lt;br /&gt;&lt;br /&gt;See also:&amp;nbsp;&amp;nbsp;&lt;a href='https://learn.microsoft.com/en-us/office/vba/api/overview/word' target='_blank'&gt;&lt;b&gt;Word VBA reference&lt;/b&gt;©&lt;/a&gt; and &lt;a href='https://learn.microsoft.com/en-us/office/vba/api/word.document.exportasfixedformat' target='_blank'&gt;&lt;b&gt;Document.ExportAsFixedFormat Method&lt;/b&gt;©&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200332/How-to-Save-an-ATEasy-Test-Log-to-a-PDF-file</link><pubDate>12/10/2024</pubDate></item><item><title>Using an ATEasy Exported DLL in LabView - Published on 11/22/2024</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;ATEasy provides means to create a DLL to export functions written in ATEasy. The DLL can be used within other ATEasy projects, bringing the functionality of the DLL into new ATEasy applications, or they can be used in applications written in different programming languages, such as 'C/C++', C#, Visual Basic®, LabVIEW® and others.&amp;nbsp;&amp;nbsp;This application note demonstrates how to export a simple set of ATEasy procedures to a DLL and use those procedures in a LabVIEW application.&amp;nbsp;&amp;nbsp;It will also address areas where special attention needs to be given.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Creating a DLL Project&lt;/h3&gt;ATEasy can create a DLL from any &lt;b&gt;Procedure&lt;/b&gt; defined in the &lt;b&gt;System&lt;/b&gt; module, or any &lt;b&gt;Procedure&lt;/b&gt; or &lt;b&gt;IO Table&lt;/b&gt; defined in an ATEasy &lt;b&gt;Driver&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;b&gt;Note&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Program module procedures cannot be exported, only driver or system modules can export procedures.&lt;/div&gt;&lt;br /&gt;Going forward, the term "Procedure" will be used synonymously to represent either an ATEasy Procedure or an IO Table.&amp;nbsp;&amp;nbsp;When intending to generate a DLL, an ATEasy project needs to specify if the "&lt;b&gt;Build&lt;/b&gt;" will produce an application (&lt;b&gt;EXE&lt;/b&gt;) or a Dynamic Link Library (&lt;b&gt;DLL&lt;/b&gt;).&amp;nbsp;&amp;nbsp;The process to build an EXE or a DLL is the same, the difference is whether the project has been configured to produce a DLL.&amp;nbsp;&amp;nbsp;This can be done either by creating the project using the &lt;b&gt;Startup:Library Wizard&lt;/b&gt; (Figure 1), or by setting the project property &lt;b&gt;Target Type&lt;/b&gt; to "Dynamic Link Library (DLL)" (Figure 2).&lt;td&gt; &lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;[:+[+ateasy+]+:]&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200365\Library_Wizard.png" alt="ToolTip" title="ToolTip" border='0' &gt;&amp;nbsp;&amp;nbsp;&lt;img src="https://www.MarvinTest.com/images/support/\Q200365\Project_Property.png" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1:&amp;nbsp;&amp;nbsp;Startup Library Wizard&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Figure 2:&amp;nbsp;&amp;nbsp;Project Properties&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;b&gt;Note&lt;/b&gt;:&amp;nbsp;&amp;nbsp;When creating a project for DLL export, it is not necessary to include a Program module or a Driver module.&amp;nbsp;&amp;nbsp;However, both may be included without creating any adverse effects.&lt;/div&gt;&lt;br /&gt;It is necessary to also flag which procedure to include in the exported DLL.&amp;nbsp;&amp;nbsp;This is done by opening the properties dialog for the selected procedure and checking the &lt;b&gt;Export &lt;/b&gt;check box.&amp;nbsp;&amp;nbsp;This is an indication that, when the project is built, to include that procedure, and all procedures with the export check box checked, in the exported DLL.&lt;br /&gt;&lt;br /&gt;For this discussion, an ATEasy project was created, and the project target type was set to produce a DLL.&amp;nbsp;&amp;nbsp;A driver named &lt;b&gt;MyExample&lt;/b&gt; was created and four simple procedures were defined to add, subtract, multiply or divide two double precision floating point values, and return the results.&amp;nbsp;&amp;nbsp;Each of the procedures checked the export check box (Figure 3) in their respective properties.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200365\Procedure_Properties.png" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3:&amp;nbsp;&amp;nbsp;Procedure Properties&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;b&gt;Note&lt;/b&gt;:&amp;nbsp;&amp;nbsp;When installing ATEasy, two IDE bit-wise versions are included with the installation; ATEasy IDE 32-bit for 32-bit applications (running on 32 or 64- bit Windows), and ATEasy for 64-bit IDE for 64-bit application running on 64-bit Windows. The bit-version version of ATEasy IDE determine the bit-wise of the DLL that is created using the Build command. The generated DLL bit-wise &lt;b&gt;must match&lt;/b&gt; the Bit-wise of the LabVIEW - 32-bit or LabVIEW 64-bit.&amp;nbsp;&amp;nbsp;If you are uncertain which version of ATEasy you are currently using, the "&lt;b&gt;Help:About ATEasy&lt;/b&gt;" will identify whether you are running the 32-bit (x86), or 64-bit (x64) ATEasy, as shown in Figure 4.&lt;/div&gt;&lt;td&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200365\ATEasy_Help_2Xa.png" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4a:&amp;nbsp;&amp;nbsp;ATEasy 32-Bit (x86)&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200365\ATEasy_Help_2Xb.png" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4b:&amp;nbsp;&amp;nbsp;ATEasy 64-Bit (x64)&lt;/b&gt;&lt;/td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Building the DLL and Exporting Header File&lt;/h3&gt;To compile the DLL, use the same commands from the &lt;b&gt;Build &lt;/b&gt;menu that you would use to compile your EXE.&amp;nbsp;&amp;nbsp;Pay special attention to the &lt;b&gt;Build Log&lt;/b&gt; for any errors or warnings.&amp;nbsp;&amp;nbsp;A clean build should produce a log similar to that shown in Figure 5.&amp;nbsp;&amp;nbsp;It will list all of the procedures included in the DLL, as well as the DLL name and path.&amp;nbsp;&amp;nbsp;A good idea is to place the resulting DLL in the appropriate Windows folder for 64-bit DLL's (System32), or 32-bit DLL's (SysWOW64) to avoid potential conflicts.&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;b&gt;Note&lt;/b&gt;:&amp;nbsp;&amp;nbsp;When ATEasy builds a DLL, it's possible for some functions to be excluded in the header file.&amp;nbsp;&amp;nbsp;Excluding functions can occur if some aspect of the procedure you want to export is not supported in the export process.&amp;nbsp;&amp;nbsp;A common discrepancy is that ATEasy DLL's cannot export arrays to external applications.&amp;nbsp;&amp;nbsp;If you encounter such error messages, consider using a &lt;b&gt;Variant&lt;/b&gt; in your function instead of an array.&amp;nbsp;&amp;nbsp;Variants can contain arrays, structures, arrays of structures or any other data type defined in ATEasy&lt;/div&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;b&gt;Note&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Trial versions of ATEasy cannot compile a project to either an EXE, or to a DLL.&amp;nbsp;&amp;nbsp;These functions are reserved only for paid license subscriptions.&lt;/div&gt;&lt;br /&gt;With a clean DLL compile, the next step is to export a header file (.H) for your DLL so it can be used in applications written in other programming languages.&amp;nbsp;&amp;nbsp;Select the &lt;b&gt;Active Project&lt;/b&gt; you just compiled and select "&lt;b&gt;Export&lt;/b&gt;" from the &lt;b&gt;File Menu&lt;/b&gt;.&amp;nbsp;&amp;nbsp;There are two export formats, "&lt;b&gt;ATEasy DLL to C&lt;/b&gt;" or "&lt;b&gt;ATEasy DLL to Visual Basic .NET&lt;/b&gt;" (Figure 5).&amp;nbsp;&amp;nbsp;While referring specifically to 'C' and Visual Basic programming environments, that is not to imply that these are the only two languages outside of ATEasy that the DLL or the exported header files can be used with.&amp;nbsp;&amp;nbsp;This example will use the 'C' header file to facilitate using the DLL within LabVIEW.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200365\Export_Header.png" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5:&amp;nbsp;&amp;nbsp;DLL Build Log and Export Header File&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Importing the DLL Into LabVIEW&lt;/h3&gt;To use the ATEasy DLL in LabVIEW, open your LabVIEW application (32-bit or 64-Bit depending on your ATEasy build) and then use LabVIEW’s &lt;b&gt;Import Shared Library Wizard&lt;/b&gt; to import your DLL functions. Please see this ni article &lt;a href='https://knowledge.ni.com/KnowledgeArticleDetails?id=kA03q000000YGggCAG&amp;l=en-US' target='_blank'&gt;Call a Dynamic Link Library (DLL) From LabVIEW&lt;/a&gt;© for more details.&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;b&gt;Note&lt;/b&gt;:&amp;nbsp;&amp;nbsp;The LabVIEW Import Shared Library Wizard expects a procedure declaration for each procedure you want imported as a vi.&amp;nbsp;&amp;nbsp;ATEasy v2024 and later include this declaration in the exported header file, while ATEasy v2023 and earlier do not include the declaration.&amp;nbsp;&amp;nbsp;However, a simple modification to your header file will facilitate the LabVIEW wizard importing your ATEasy 2023 and earlier DLL functions.&amp;nbsp;&amp;nbsp;Find each of your ATEasy procedure calls in the header file, and for each, copy the procedure call and past a copy of it above the call, appending a semicolon ';' to the end, as shown in the example below:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;double MyAdd(double dValue1, double dValue2);&lt;/b&gt;&lt;br /&gt;double MyAdd(double dValue1, double dValue2)&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;The following figures outline the process of using the LabVIEW Import Shared Library Wizard.&amp;nbsp;&amp;nbsp;These screens were capture from importing the ATEasy DLL created above, using LabVIEW 32-bit.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200365\Shared Library Wizard_1.png" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200365\Shared Library Wizard_2.png" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200365\Shared Library Wizard_3.png" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;br /&gt;As an alternative, if your version of LabVIEW does not support the Import Shared Library Wizard, or if you want to use a subset of the functions in your DLL, you can manually import DLL functions into LabVIEW using the "&lt;b&gt;Call Library Function&lt;/b&gt;" Node.&amp;nbsp;&amp;nbsp;Add the Call Library Function Node vi to your LabVIEW wiring diagram and configure it for the return type (if any), and the number and types of parameters in the functions (Figure 6).&amp;nbsp;&amp;nbsp;The resulting vi's can then be used in your LabVIEW application, extending the functionality of ATEasy into the LabVIEW realm (Figure 7).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200365\Call_Library_Function.png" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6:&amp;nbsp;&amp;nbsp;Configuring the LabVIEW Call Library Function Node&lt;/b&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200365\LabVIEW_Example.png" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 7:&amp;nbsp;&amp;nbsp;LabVIEW VI's Calling ATEasy Procedures&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;The process creating a DLL to facilitate exporting procedures from ATEasy to other programming languages is both straight forward and simple.&amp;nbsp;&amp;nbsp;Once exported by the DLL, the functionality of the procedure is available outside of the ATEasy.&amp;nbsp;&amp;nbsp;This includes any resources used by the exported procedure, such as other procedures, variables, forms and instrumentation.&amp;nbsp;&amp;nbsp;All resources used by the called procedure are embedded in the DLL providing maximum flexibility and utility.&lt;br /&gt;&lt;br /&gt;A link to the ATEasy project and resulting DLL's and header file described in this article can be found here: &lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200365\MyExample.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;MyExample Project&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200365/Using-an-ATEasy-Exported-DLL-in-LabView</link><pubDate>11/22/2024</pubDate></item><item><title>Configuring an ATEasy Instrument Driver with an LXI Interface - Published on 11/22/2024</title><description>&lt;h3&gt;Overview&lt;/h3&gt;LXI provides a convenient interface for communicating with and controlling benchtop ATE instrumentation.&amp;nbsp;&amp;nbsp;This article demonstrates how to use an LXI interface to access an instrument's internal web services, use the Telnet application for instrument communication, and how to create a simple, yet useful driver for controlling LXI instruments within ATEasy®.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Basic LXI Guidelines&lt;/h3&gt;To communicate with an instrument using LXI, you will need to know two essential interface parameters: the IP address and the remote port.&lt;br /&gt;&lt;br /&gt;In this article, the Agilent (Keysight) model 53220A Universal Frequency Counter will serve as a representative instrument.&amp;nbsp;&amp;nbsp;The 53220A provides multiple remote interfaces, and the front panel can be used to obtain the interface parameters used for remote communication.&amp;nbsp;&amp;nbsp;The instrument is configured with an IEEE 488 (GPIB) interface, a USB interface, and an LXI (LAN) interface.&amp;nbsp;&amp;nbsp;From the front panel (Figure 1), the configuration parameters can be viewed to assist the operator in setting up remote operations.&amp;nbsp;&amp;nbsp;The GPIB primary address is "3", the VISA resource descriptor for the USB port is "USB::2391::6151::MY50005754::0::INSTR", and the LAN/LXI IP address is "169.254.4.32".&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200338\Instrument Parameters-Small.png" alt="53220A Remote Communications Parameters" title="53220A Remote Communications Parameters" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 1:&amp;nbsp;&amp;nbsp;Agilent 53220A GPIB, USB and LAN or TCP/IP Remote Communications Parameters&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;For LXI/LAN instruments, a web server is typically hosted on the instrument as a component of the instrument's operating system, and it can be opened and viewed from any browser (Figure 2).&amp;nbsp;&amp;nbsp;This web panel provides additional information beyond that displayed on the instrument's front panel, and can be used to configure the instrument's various remote parameters.&amp;nbsp;&amp;nbsp;In addition to the LAN information shown on the front panel in Figure 1 above, the web panel shows the VISA TCP/IP resource descriptor and both the TCP/IP socket port and the Telnet port.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200338\KS53220A web 00a.png" alt="Agilent 53220A Web Panel" title="Agilent 53220A Web Panel" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 2:&amp;nbsp;&amp;nbsp;Agilent 53220A Web Panel.&amp;nbsp;&amp;nbsp;LXI IP Address and TCP/IP Port Parameters are Highlighted&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;A quick and easy method to test for LXI communication is using the &lt;b&gt;Telnet &lt;/b&gt;application that is provided with Windows®. Telnet provides bidirectional communication between a computer operating as a terminal, and a remote peripheral - in this case the Agilent 53220A.&amp;nbsp;&amp;nbsp;Communication is achieved by sending text commands to, and receiving text responses from, the peripheral device.&amp;nbsp;&amp;nbsp;To use Telnet on a Windows platform, the Telnet application needs to be installed.&amp;nbsp;&amp;nbsp;Type "Windows Features" in the Windows search box and select the &lt;b&gt;Turn Windows features on or off&lt;/b&gt; option.&amp;nbsp;&amp;nbsp;Enable Telnet by checking the check box for &lt;b&gt;Telnet Client&lt;/b&gt; as shown in Figure 3 below.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200338\Telnet Install.png" alt="Enabling the Windows Telnet Application" title="Enabling the Windows Telnet Application" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 3:&amp;nbsp;&amp;nbsp;Enabling the Windows Telnet Client Application&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Telnet has a few simple commands that can be viewed by typing "?/H" at the command prompt.&amp;nbsp;&amp;nbsp;To use Telnet as a terminal for the 53220A, open a socket for the device using the "O" command, provide the IP Address or mDNS Hostname, and include the Telnet Remote Port parameter shown in the 53220A web panel.&amp;nbsp;&amp;nbsp;The example as shown in Figure 4 is "&lt;b&gt;O A-53220A-05754 5024&lt;/b&gt;".&amp;nbsp;&amp;nbsp;This command opens a port to the Telnet application.&amp;nbsp;&amp;nbsp;Simply type a valid command to set up the instrument or query a parameter.&amp;nbsp;&amp;nbsp;Shown in Figure 4 is the "*IDN?" identification query command.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200338\Telnet.png" alt="Telnet Terminal Application" title="Telnet Terminal Application" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 4:&amp;nbsp;&amp;nbsp;Remote Communication Using the Telnet Terminal Application&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;Note:&amp;nbsp;&amp;nbsp;If your instrument does not provide the Telnet remote port information, a common default port used with Telnet is 5024.&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;ATEasy LXI Control&lt;/h3&gt;Once basic LAN communication has been established, controlling an LXI instrument from ATEasy is very simple.&amp;nbsp;&amp;nbsp;As is typical with most test solutions, there are several methods that can be used within ATEasy to communicate with external instruments.&amp;nbsp;&amp;nbsp;Knowledge Base Article &lt;a href='https://www.marvintest.com/KB/Q200194/How-to-set-up-and-control-an-LXI-instrument-from-ATEasy' target='_blank'&gt;# Q200194&lt;/a&gt; discusses how to import an LXI function panel (a DLL based driver) into ATEasy.&amp;nbsp;&amp;nbsp;This produces a robust, high level interface targeted for the specific instrument that the driver was written for.&amp;nbsp;&amp;nbsp;But it falls short as a general purpose interface, such as when you need to communicate with a different device.&amp;nbsp;&amp;nbsp;Since LXI uses text communication, a generic text based IO approach covers virtually all LXI instruments.&amp;nbsp;&amp;nbsp;The following section describes an overview of how to create a generic LXI driver for instrument control using ATEasy IO Tables.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;Note:&amp;nbsp;&amp;nbsp;Familiarity with creating and using ATEasy IO Tables is assumed.&lt;/div&gt;&lt;br /&gt;Begin by creating a new ATEasy Project.&amp;nbsp;&amp;nbsp;Add a new Driver to the project (Figure 5).&amp;nbsp;&amp;nbsp;From the Driver Properties, select the General tab and give the new driver the default name of "LXI" (Figure 6).&amp;nbsp;&amp;nbsp;Select the Interface tab and scroll down the Interface list and select Winsock (Figure 7).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200338\New Driver.png" alt="Add a new driver to the LXI project" title="Add a new driver to the LXI project" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 5:&amp;nbsp;&amp;nbsp;Adding a New Driver to the ATEasy LXI Project&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200338\Default Driver Name and Interface.png" alt="Default Driver Name and Interface" title="Default Driver Name and Interface" border='0' &gt;&lt;/div&gt; &lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 6:&amp;nbsp;&amp;nbsp;Defining the Default Driver Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Figure 7:&amp;nbsp;&amp;nbsp;Defining the Driver Interface&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Open the driver shortcut, select the Interface tab, and set the Interface to Winsock.&amp;nbsp;&amp;nbsp;Selecting the WinSock interface populates the tab with additional parameters.&amp;nbsp;&amp;nbsp;For the Remote Port parameter, enter the TCP/IP Socket Port value from the instrument web panel (5025).&amp;nbsp;&amp;nbsp;Enter the IP Address value from the web panel in the driver shortcut Address field (169.254.4.32).&amp;nbsp;&amp;nbsp;The driver is now configured to communicate with IP address 169.254.4.32 on remote port 5025.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200338\ATEasy Driver Shortcut.png" alt="ATEasy Driver Shortcut for the Agilent 53220A LXI Interface" title="ATEasy Driver Shortcut for the Agilent 53220A LXI Interface" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 8:&amp;nbsp;&amp;nbsp;Setting the LXI Driver Shortcut WinSock Interface Parameters&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Referring to figure 9, create two IO Table procedures, one for sending commands to the LXI instrument (Send) and one to receive responses from the LXI instrument (Receive).&amp;nbsp;&amp;nbsp;The ATEasy online "&lt;b&gt;Getting Started&lt;/b&gt;" manual has a section in the Drivers and Interfaces chapter that goes into detail of how to create IO Table procedures.&amp;nbsp;&amp;nbsp;Following that process, create a new IO Table procedure, and name it "Send".&amp;nbsp;&amp;nbsp;Insert an IO table "Output" operation, and define it as a "Parameter to ASCII" type operation.&amp;nbsp;&amp;nbsp;Insert another operation and configure it as a "Send" operation.&amp;nbsp;&amp;nbsp;The Send IO Table procedure will accept ASCII text as input, and write the text to the instrument specified by the driver shortcut's interface parameters - remote port 5025, address 169.254.4.32 in this example.&lt;br /&gt;&lt;br /&gt;Create another new IO Table procedure, and name it "Receive".&amp;nbsp;&amp;nbsp;Insert an IO table "Receive" operation.&amp;nbsp;&amp;nbsp;Add another operation and configure it as an "Input", "ASCII to Parameter" type operation.&amp;nbsp;&amp;nbsp;The Receive IO Table procedure will receive ASCII text from the LXI instrument at the specified address, and save the text into the variable referenced in the procedure.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200338\IOTables.png" alt="Generic Send/Receive IO Table Procedures" title="Generic Send/Receive IO Table Procedures" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 9:&amp;nbsp;&amp;nbsp;Generic IO Table Send/Receive Procedures&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To utilize the ATEasy command completion feature, you can create ATEasy &lt;b&gt;Commands&lt;/b&gt;.&amp;nbsp;&amp;nbsp;Commands are user defined statements that call associated procedures defined within the ATEasy application.&amp;nbsp;&amp;nbsp;Once defined, typing the command's name, LXI in this instance, pops up the ATEasy code completion window, allowing you to navigate the various syntax options of the command tree.&amp;nbsp;&amp;nbsp;Here, in Figure 10, two commands are defined, "&lt;b&gt;Send&lt;/b&gt;" and "&lt;b&gt;Receive&lt;/b&gt;", and attached to the IO Table Send and Receive procedures, respectively.&amp;nbsp;&amp;nbsp;The syntax to send a text command using the newly created ATEasy Command is "&lt;b&gt;LXI Send("text String")&lt;/b&gt;"&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200338\LXI Commands.png" alt="Attaching Command to the Send/Receive IO Table Procedures" title="Attaching Command to the Send/Receive IO Table Procedures" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 10:&amp;nbsp;&amp;nbsp;Attaching Command to the IO Table Send/Receive Procedures&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;One of the more common problem areas experienced with text-based communication is correctly setting the I/O termination parameters.&amp;nbsp;&amp;nbsp;ATEasy supports a variety of I/O termination options.&amp;nbsp;&amp;nbsp;The Interfaces tab of the Driver properties provides a drop list of defined termination options - see Figure 11.&amp;nbsp;&amp;nbsp;The 53220A instrument this article was based on uses a line feed character (ASCII(10)), or escape sequence "\n") for both input and output termination.&amp;nbsp;&amp;nbsp;Other options are carriage return (ASCII(13), escape sequence "\r"), both carriage return and line feed, period (".") and None.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;Note:&amp;nbsp;&amp;nbsp;For the 53220A, experimentation demonstrated that the text communication would hang or time out if the wrong termination was selected.&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200338\LXI IO Termination.png" alt="Setting IO Table Termination" title="Setting IO Table Termination" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 11:&amp;nbsp;&amp;nbsp;Setting IO Table Send/Receive Termination&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A useful tool for verifying communication using IO Tables is the ATEasy Monitor.&amp;nbsp;&amp;nbsp;This built-in ATEasy utility will capture and display the text strings sent and received between ATEasy IO Table procedures and the instruments utilizing the IO Table driver.&amp;nbsp;&amp;nbsp;If, for example, you can verify text commands are being sent to an instrument, but queries go unanswered, it's a good indication that the termination character may be set incorrectly.&amp;nbsp;&amp;nbsp;If there is no communication at all, then perhaps the interface parameters, such as the Remote Port or the IP Address may be invalid.&amp;nbsp;&amp;nbsp;To enable the ATEasy Monitor, select it from the view menu, right-click within the Monitor window and select &lt;b&gt;"Start Logging"&lt;/b&gt; from the list.&lt;div align='right'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200338\Monitor Setup.png" alt="Right-Click to Start logging" title="Right-Click to Start logging" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The SCPI commands below were taken from the "&lt;b&gt;Scaling Example&lt;/b&gt;" on page 213 of the "&lt;b&gt;Keysight 53220A/53230A 350 MHz Universal Frequency Counter/Timer&lt;/b&gt;" manual.&amp;nbsp;&amp;nbsp;A test was configured to send out the commands provided in the manual, and the exchange was captured and displayed in the Monitor window.&amp;nbsp;&amp;nbsp;Note that all SCPI communication was captured, including the "&lt;b&gt;*IDN?&lt;/b&gt;" query/response and the "&lt;b&gt;Syst:Err?&lt;/b&gt;" query/response, not just the scaling commands.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200338\Monitor Window.png" alt="IO Table Monitor" title="IO Table Monitor" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 12:&amp;nbsp;&amp;nbsp;Monitored IO Table Send/Receive Communication&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If you have problems using ATEasy or the LXI instrument panel with your LXI instrument, you may be having an issue with Windows Defender firewall.&amp;nbsp;&amp;nbsp;It may be necessary to change your firewall setting to allow blocked applications through the firewall, or to enable the Telnet or TCP/IP port.&amp;nbsp;&amp;nbsp;Below is a link that explains the process for allowing select applications through your firewall.&amp;nbsp;&amp;nbsp;The basic process is to open the Windows firewall settings, and select "Allow an app through Windows Firewall".&amp;nbsp;&amp;nbsp;A dialog will show information about apps that currently are allowed through the firewall.&amp;nbsp;&amp;nbsp;If you want to change app settings or add apps to the list, select "Change Settings".&amp;nbsp;&amp;nbsp;See Figures 13 and 14.&lt;br /&gt;&lt;br /&gt;&lt;a href='https://pureinfotech.com/allow-apps-firewall-windows-10/' target='_blank'&gt;How to allow apps through firewall on Windows 10&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Set Firewall to Allow ATEasy Through the Firewall&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200338\WIndows Firewall_1.png" alt="Windows firewall " title="Windows firewall " border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 13:&amp;nbsp;&amp;nbsp;Opening Windows Firewall&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200338\WIndows Firewall_2.png" alt="Allow apps through Windows firewall" title="Allow apps through Windows firewall" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 14:&amp;nbsp;&amp;nbsp;Define Rules to Allow an Applications Through Windows Firewall&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200338\WIndows Firewall_3.png" alt="Enable TCP/IP port in Windows firewall" title="Enable TCP/IP port in Windows firewall" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 15:&amp;nbsp;&amp;nbsp;Define TCP/IP Port Allowed Through Windows Firewall&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;Note:&amp;nbsp;&amp;nbsp;You should check with your company's security policy before making changes to your firewall settings.&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;LXI provides a convenient interface for communicating with benchtop ATE instrumentation.&amp;nbsp;&amp;nbsp;This article demonstrated multiple processes for working with an LXI instrument over a TCP/IP interface, Web Panel, Telnet and an ATEasy driver.&amp;nbsp;&amp;nbsp;Topics also covered in the article are how to create an IO Table driver, how to configure the LAN driver interface, and how to use the ATEasy Monitor utility to monitor IO Table text communication.&lt;br /&gt;&lt;br /&gt;Controlling LXI instruments with ATEasy, Telnet or the built-in web services is not difficult, but a little knowledge can help smooth the process.&lt;br /&gt;&lt;br /&gt;The ATEasy project discussed in this article is provided via the link below.&lt;br /&gt;&lt;br /&gt;&lt;a href='\\mtsweb\downloads\KnowledgeBase\Q200338\LXI Project' target='_blank'&gt;LXI Project&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200338/Configuring-an-ATEasy-Instrument-Driver-with-an-LXI-Interface</link><pubDate>11/22/2024</pubDate></item><item><title>Installing and Using ATEasy Network License - Published on 9/27/2024</title><description>&lt;b&gt;Note:&lt;/b&gt; This article was modified to reflect the latest ATEasy version (v10 156d, added Online activation). Please follow this even if the ATEasy clients are older version of ATEasy.&lt;br /&gt;&lt;br /&gt;The server application, License Server (ALicenseServer.exe), must be installed in a computer that will be the ATEasy license server. The License Server computer must be a 32/64 bit Windows Operating System (Windows XP (sp3), Windows 7, 10, 11, or Windows Server 2003, 2008, 2012 or 2016, 2022, or newer, Virtual Machine installation is supported but only with online activation). The computer must be turned ON and connected to the network while the clients are running. Clients must be authenticated to the server to be able to retrieve licenses. We recommend to install it on one of the company servers (typically Windows Server) since it always turned on. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Setup the License Server&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Download the latest ATEasy from &lt;a href='http://www.marvintest.com/ATEasy' target='_blank'&gt;ATEasy Product Page&lt;/a&gt;, it always best to use the latest ATEasy even if your license applicable to older ATEasy versions.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Run the &lt;b&gt;ATEasy Setup &lt;/b&gt;program at the server computer as an administrator privileges user. Select &lt;b&gt;Custom setup type&lt;/b&gt;. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select the &lt;b&gt;License Server option&lt;/b&gt;, un-check all the other options (unless you intend to run ATEasy on that machine). &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;After the setup is complete, the License Server icon will appear in the Windows Taskbar and will be added to the server services. You can verify the service being installed by right clicking &lt;b&gt;My Computer &lt;/b&gt;&amp;nbsp;&amp;nbsp;icon on the server and selecting &lt;b&gt;Manage &lt;/b&gt;and then followed by &lt;b&gt;Services &lt;/b&gt; under &lt;b&gt;Services and Application&lt;/b&gt;. The ATEasy License Server should be displayed in the list.&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200064\ALicenseServerTaskBar.jpg" alt="License Server -Taskbar" title="License Server -Taskbar" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Install the License Key in the server&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Stop License Server: Open &lt;b&gt;Windows Services&lt;/b&gt; (Start, Run, Services.msc), Right Click on &lt;b&gt;ATEasyLicenseServer&lt;/b&gt; and select &lt;b&gt;Stop&lt;/b&gt;.&lt;img src="https://www.MarvinTest.com/images/support/Q200064\ALicenseServerStopService.jpg" alt="License Server - Stop Service" title="License Server - Stop Service" border='0' &gt;&lt;br /&gt;Verify that no ALicenceServer.exe instances are running by other users logged in to the machine using the &lt;b&gt;Windows Task Manager&lt;/b&gt; Details page, if there are, you can safely close their instance using the &lt;b&gt;End Task&lt;/b&gt; button.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Open &lt;b&gt;Windows File Explorer&lt;/b&gt; and change the folder to ATEasy folder (i.e., C:\Program Files (x86)\ATEasy 9.0\), right click on &lt;b&gt;ALicenseServer.exe&lt;/b&gt; and select &lt;b&gt;Run as Administrator&lt;/b&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200064\ALicenseServerRunAsAdmin.jpg" alt="License Server - Run As Administrator to Setup the License" title="License Server - Run As Administrator to Setup the License" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click on the ATEasy icon in the Task Bar and select &lt;b&gt;About ATEasy License Server&lt;/b&gt;. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click the &lt;b&gt;Set License &lt;/b&gt;button to display the &lt;b&gt;License Setup dialog box&lt;/b&gt;. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;For Offline activation (computer have no internet access)&lt;/b&gt;: Select &lt;b&gt;Install Network License&lt;/b&gt;, an ATEasy &lt;b&gt;Computer ID &lt;/b&gt;is displayed in the bottom field. The ATEasy Computer ID is used to identify the machine where the license is installed. With the ATEasy &lt;b&gt;Computer ID&lt;/b&gt; and &lt;b&gt;Serial Number &lt;/b&gt;printed on your ATEasy CD or purchase order, create a Magic support incident using your existing or create an account if you don't have one &lt;a href='https://www.marvintest.com/magic/' target='_blank'&gt;https://www.marvintest.com/magic/&lt;/a&gt; to obtain a license string. Once you receive the license string, open the License Setup dialog box again as explain the prior steps. Paste the &lt;b&gt;License String or File&lt;/b&gt;. Click &lt;b&gt;OK&lt;/b&gt;. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;For Online activation (computer have internet access)&lt;/b&gt;: Select &lt;b&gt;Activate License Online&lt;/b&gt;, Enter your marvintest.com account email, password and the ATEasy Serial Number. Click &lt;b&gt;OK&lt;/b&gt;. Note: Server must have access to https://www.marvintest.com/* at all time in order to operate correctly.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The About dialog should display the # of license installed. It also shows the connected users and computers names they were connected from, the ATEasy version, and the remaining timeout period as shown here:&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200064\ALicenseServerAbout.jpg" alt="ATEasy License Server - Users and Licenses" title="ATEasy License Server - Users and Licenses" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Close the license server and Start the service again.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Setup the Client&lt;/h3&gt;Perform these steps only after you have obtained and installed the license string or file on the server. &lt;br /&gt;Client must be authenticated to the server (usually member of the domain).&lt;ul&gt;&lt;li&gt;Install ATEasy at the client workstation, using the ATEasy Setup program. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Start ATEasy. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Open the License Setup dialog box from the &lt;b&gt;Help&lt;/b&gt;, &lt;b&gt;About &lt;/b&gt;menu or if no license is found the dialog box should show.&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200064\ALicenseServerClient.jpg" alt="ATEasy Network License Setup" title="ATEasy Network License Setup" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select &lt;b&gt;Use Network License&lt;/b&gt; from the License Type list. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select the server name from the License Location list. If the server is not displayed leave the dialog open for a few minutes to the server list to populate or type the server name &lt;b&gt;(DomainName/ServerName&lt;/b&gt; for example: GEOTEST/SERVER1). If the name does not work, you can also type the &lt;b&gt;Server IP&lt;/b&gt; address directly (requires ATEasy v148c or newer)&amp;nbsp;&amp;nbsp;instead of the name, for example &lt;b&gt;10.10.1.6/10.10.1.6&lt;/b&gt; where 10.10.1.6 is the server IP.&lt;br /&gt;&lt;b&gt;Note: &lt;/b&gt;ATEasy v8 148b or older requires that the server name will be shorter than 15 characters, if it longer, create a DNS alias entry with smaller name. The client/server communicate using &lt;b&gt;Windows Named Pipes protocol&lt;/b&gt; that uses &lt;b&gt;ports 137 and 139 UDP&lt;/b&gt; and potentially &lt;b&gt;445 TCP&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select the &lt;b&gt;Timeout &lt;/b&gt;that your client can borrow a license from the server when no or bad connection to the server or you are traveling out of the office (available on ATEasy v9 152c or newer). &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click &lt;b&gt;OK&lt;/b&gt; to complete the setup.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Viewing Usage History&lt;/h3&gt;At any time, you can view the license usage history by opening the license log file. The file, ALicenseServer.log, is a text file that resides in %ProgramData%\MarvinTest Solutions\ATEasy (C:\ProgramData\Marvin Test Solutions\ATEasy) folder. You can open the file by right click on the ATEasy License Server icon in the task bar or using Windows Explorer. Here is an example for license usage records:&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;- Authorize License,Wed May&amp;nbsp;&amp;nbsp;6 09:33:08 2020,Success,Client=Tester@DESKTOP-VMRP0HL/DESKTOP-VMRP0HL	ATEasy 10.0 (Build 156d) (Timeout 4 hours 0 minutes) Copies=50 Used=11&lt;br /&gt;- Release License,Wed May&amp;nbsp;&amp;nbsp;6 09:37:10 2020,Success,Client=JohnX@DOMAIN1/UNIT291-2	ATEasy 9.0 (Build 154c) (Timeout 3 hours 57 minutes) Copies=50 Used=10&lt;br /&gt;- Authorize License,Wed May&amp;nbsp;&amp;nbsp;6 09:37:48 2020,Success,Client=JoeM@DOMAIN1/UNIT291-2	ATEasy 9.0 (Build 154c) (Timeout 4 hours 0 minutes) Copies=50 Used=11&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Removing the License Server&lt;/h3&gt;Perform these steps to terminate the ATEasy license and remove the license server from a system that was previously serving licenses.&lt;ul&gt;&lt;li&gt;Terminate the license using the steps found in the &lt;b&gt;Terminate an ATEasy Software License&lt;/b&gt; article found linked at the bottom of this article&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Close all ALicenceServer.exe instances using the &lt;b&gt;Windows Task Manager&lt;/b&gt; Details page by selecting instances and clicking the &lt;b&gt;End Task&lt;/b&gt; button. &lt;/li&gt;&lt;/ul&gt;To uninstall all ATEasy elements:&lt;ul&gt;&lt;li&gt;Open the &lt;b&gt;Uninstall a Program&lt;/b&gt; or &lt;b&gt;Add or Remove a Program&lt;/b&gt; app, locate your version of ATEasy and select &lt;b&gt;Uninstall&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Follow the ATEasy Setup Dialog prompts to remove ATEasy and the License Server&lt;/li&gt;&lt;/ul&gt;To uninstall only the License Server:&lt;ul&gt;&lt;li&gt;Open the &lt;b&gt;Uninstall a Program&lt;/b&gt; or &lt;b&gt;Add or Remove a Program&lt;/b&gt; app, locate your version of ATEasy and select &lt;b&gt;Modify&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;In the ATEasy Setup Dialog, select &lt;b&gt;Modify&lt;/b&gt;, and Uncheck &lt;b&gt;License Server&lt;/b&gt; &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Hit &lt;b&gt;Next&lt;/b&gt; to complete the modification&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;See Also&lt;/h3&gt;&lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=26' target='_blank'&gt;ATEasy Licensing Q&amp;A&lt;/a&gt;. &lt;br /&gt;&lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=60' target='_blank'&gt;Terminate an ATEasy software License&lt;/a&gt;. &lt;br /&gt;&lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=256' target='_blank'&gt;Installing, Upgrading and Acquiring ATEasy Software Licenses&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200064/Installing-and-Using-ATEasy-Network-License</link><pubDate>9/27/2024</pubDate></item><item><title>White Paper: Signal Switching Transparency in High Channel Count Test Systems - Published on 9/24/2024</title><description>Signal switching subsystems are arguably the heart of all automatic test systems. Instrumentation is typically selected through careful analysis of test requirements and the associated levels of accuracy needed to accomplish successful unit under test (UUT) evaluation and qualification. While this approach will provide a solid starting point, and may even be suitable as-is for small test system implementations, actual test results may prove disappointing in larger configurations where numerous sources of measurement error are compounded in the signal routing / measurement path.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2024\Signal_Switching_Transparency_In_High_Channel_Count_Test_Systems.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt; to learn about maintaining signal switching transparency in high channel count test systems.</description><link>https://www.MarvinTest.com/KB/Q200364/White-Paper-Signal-Switching-Transparency-in-High-Channel-Count-Test-Systems</link><pubDate>9/24/2024</pubDate></item><item><title>Security Notification: Marvin Test Solutions HW driver Security Advisory for CVE-2024-26054, CVE-2024-26055, CVE-2024-26056 - Published on 5/20/2024</title><description>We were recently notified of a potential security vulnerability in the &lt;b&gt;HW Driver&lt;/b&gt; that applies to all versions (1.0 - 5.0.4.0).&lt;br /&gt;&lt;br /&gt;To date, we have not received any report of any bad actors that exploited the vulnerability but we have taken an action to address it and improve the cyber-protection of the HW Driver.&lt;br /&gt;&lt;br /&gt;The vulnerability was fixed and a new and improved &lt;b&gt;HW Driver software package v5.0.5.0&lt;/b&gt; is now available to replace the existing HW driver. The new version is backward compatible with all prior versions and you should not see any issues with using your other MTS software such as HW, GXDMM, GTDIO, GXFPGA, etc.). More details about the vulnerability is available in the HW ReadMe.txt found in the HW download area, list below.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Addressed CVEs&lt;/h3&gt;The following are the CVEs issued:&lt;ul&gt;&lt;li&gt;&lt;b&gt;CVE-2024-36054&lt;/b&gt; Description-- Hw64.sys in Marvin Test HW.exe before 5.0.5.0 allows unprivileged user-mode processes to arbitrarily read kernel memory (and consequently gain all privileges) via IOCTL 0x9c4064b8 (via MmMapIoSpace) and IOCTL 0x9c406490 (via ZwMapViewOfSection).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;CVE-2024-36055&lt;/b&gt;&amp;nbsp;&amp;nbsp;Description-- Hw64.sys in Marvin Test HW.exe before 5.0.5.0 allows unprivileged user-mode processes to arbitrarily map physical memory with read/write access via the MmMapIoSpace API (IOCTL 0x9c40a4f8, 0x9c40a4e8, &lt;br /&gt;0x9c40a4c0, 0x9c40a4c4, 0x9c40a4ec, and seven others), leading to a denial of service (BSOD).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;CVE-2024-36056&lt;/b&gt; Description-- Hw64.sys in Marvin Test HW.exe before 5.0.5.0 allows unprivileged user-mode processes to arbitrarily map physical memory via IOCTL 0x9c406490 (for IoAllocateMdl, MmBuildMdlForNonPagedPool, and MmMapLockedPages), leading to NT AUTHORITY\SYSTEM privilege escalation.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Affected Products&lt;/h3&gt;The HW driver is bundled with many of our products including ATEasy and other software driver packages such as: GXDMM, GTDIO, GXFPGA, GXPIO, and more. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Solution&lt;/h3&gt;Update you HW and install HW v5.0.5.0 or newer. Download HW.exe and install it using the following link:&lt;br /&gt;&lt;a href='https://www.MarvinTest.com/Product/HW/Downloads' target='_blank'&gt;HW download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt; See Also&lt;/h3&gt;To learn more about the new HW driver, please use the following links:&lt;ul&gt;&lt;li&gt;&lt;a href='https://www.marvintest.com/Product/HW' target='_blank'&gt;HW Product Page&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='https://www.marvintest.com/KB/Q200273/Using-HW-PXI-PCI-Explorer-Applet' target='_blank'&gt;Using-HW-PXI-PCI-Explorer-Applet&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;If you have any questions, please use &lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/https://www.marvintest.com/Magic/' target='_blank'&gt;Marvin Test Solutions Support Portal - Magic&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200362/Security-Notification-Marvin-Test-Solutions-HW-driver-Security-Advisory-for-CVE-2024-26054-CVE-2024-26055-CVE-2024-26056</link><pubDate>5/20/2024</pubDate></item><item><title>Testing Multiple UUTs in ATEasy - Published on 5/20/2024</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;ATEasy 8.0 adds &lt;b&gt;Multiple UUT Testing&lt;/b&gt; feature – the ability to test Multiple UUT’s in Sequential, Parallel or Mixed mode, using common test processes.&amp;nbsp;&amp;nbsp;This article provide an introduction to Multiple UUT testing, illustrating the capability with a simple test example that can be download and run on any Windows©&amp;nbsp;&amp;nbsp;platform.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;ATEasy Structure Overview&lt;/h3&gt;When developing test application using ATEasy, the test processes are organized into easy to read sequences of measurements.&amp;nbsp;&amp;nbsp;This is possible because of the structured development environment provided by ATEasy.&amp;nbsp;&amp;nbsp;The structure is achieved by using different &lt;b&gt;Modules&lt;/b&gt; to organize code and test objects specific to the processes designed for the modules.&amp;nbsp;&amp;nbsp;The three modules used for holding the test objects are the &lt;b&gt;Driver&lt;/b&gt; module, the &lt;b&gt;System&lt;/b&gt; module and the &lt;b&gt;Program&lt;/b&gt; module.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Driver modules are used to hold any reusable code; for example, instrument drivers (collection of API functions specific to a particular instrument), application drivers (like the Excel® driver) and commonly used procedures and utilities, such as the ATEasy Test Executive.&amp;nbsp;&amp;nbsp;The System module contains hardware configuration objects; i.e., objects used to control the configuration of the system.&amp;nbsp;&amp;nbsp;Common System module objects are procedures that initialize instruments as part of a power-up or shut-down sequence, or in this example, procedures for opening and closing the Excel spreadsheet for data collection.&amp;nbsp;&amp;nbsp;The Program module contains objects for making measurement and testing or validating the Unit Under Test (UUT), or Device Under Test (DUT) - the two terms are used interchangeably in this article.&amp;nbsp;&amp;nbsp;Additional information about the ATEasy modules can be found in the ATEasy On-Line documentation.&lt;br /&gt;&lt;br /&gt;The example presented here uses two drivers, one for the ATEasy Test Executive and an Excel spreadsheet driver based on the Excel ActiveX library.&amp;nbsp;&amp;nbsp;The drivers are installed in the Driver folder under the System module.&amp;nbsp;&amp;nbsp;The System module itself contains the code for opening and closing an Excel spreadsheet - not explicitly part of the test or measurement process, but used for collecting the test results for each of the DUT's being tested.&amp;nbsp;&amp;nbsp;The Program module contains the actual test code, or more accurately, the measurement code and pass/fail evaluation parameters.&amp;nbsp;&amp;nbsp;It is the System and Program modules that we will focus on for code development in the example.&amp;nbsp;&amp;nbsp;We will also focus on how to use the ATEasy Test Executive to enable testing multiple devices - without additional code development.&lt;br /&gt;&lt;br /&gt;Figure 1 below shows the ATEasy Workspace window, which highlights the structure of the ATEasy application discussed above.&amp;nbsp;&amp;nbsp;Easily identifiable are the Program module - called &lt;b&gt;Multi_Uut&lt;/b&gt;, the System module, and the Excel and Test Executive drivers installed in the Driver folder under the System module.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200242\Workspace.JPG" alt="ATEasy Workspace and application structure" title="ATEasy Workspace and application structure" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1:&amp;nbsp;&amp;nbsp;ATEasy Application Structure&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;System Module&lt;/h3&gt;Before discussing the System module code, we need to insert the drivers mentioned above.&amp;nbsp;&amp;nbsp;These are the Test Executive driver and the Excel driver.&amp;nbsp;&amp;nbsp;The Test Executive driver is included with the ATEasy installation and is located in the "Drivers" folder under the ATEasy folder.&amp;nbsp;&amp;nbsp;The Excel driver is also included with the ATEasy installation, but is located in the "Examples" folder under the ATEasy folder.&amp;nbsp;&amp;nbsp;The Excel driver utilizes the Excel Active-X library that comes installed with the Microsoft Excel application - implying that this example will not run without Excel having been installed in the system.&amp;nbsp;&amp;nbsp;A copy of the Excel driver is included with this article as additional functions specific to the example program were added to the driver.&lt;br /&gt;&lt;br /&gt;Another aspect of ATEasy's embedded structure are &lt;b&gt;Module Events&lt;/b&gt;.&amp;nbsp;&amp;nbsp;While a detailed discussion of module events is well beyond the scope of this article (refer to the ATEasy On-Line help), the general definition of a module event is a container for code that will be executed in a deterministic order within the application.&amp;nbsp;&amp;nbsp;The primary &lt;b&gt;System Events &lt;/b&gt;used are the &lt;b&gt;OnInitProgram&lt;/b&gt; event (executed whenever a Program Module starts), and the &lt;b&gt;OnEndProgram&lt;/b&gt; event (executed whenever a Program module ends).&lt;br /&gt;&lt;br /&gt;The System.OnInitProgram event opens an Excel spreadsheet (&lt;b&gt;Workbook&lt;/b&gt;) called &lt;b&gt;"MultiUUT.xlsx"&lt;/b&gt;, and creates a &lt;b&gt;Worksheet &lt;/b&gt;for each UUT being tested.&amp;nbsp;&amp;nbsp;Each worksheet is renamed with the UUT number associated with the worksheet.&amp;nbsp;&amp;nbsp;The System.OnInitProgram event also initializes a System variable to the number of devices being tested.&amp;nbsp;&amp;nbsp;As testing for each device initiates a unique thread, i.e., a copy of the Program module, for executing test code, the variable is called &lt;b&gt;m_nThreadCount&lt;/b&gt;.&amp;nbsp;&amp;nbsp;The System.OnInitProgram event code is shown below:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure OnInitProgram(): Void Public ! Occurs when a program has started.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;sPath: String: 256 &lt;br /&gt;nRow: Short&lt;br /&gt;nColumn: Short&lt;br /&gt;nSheet: Short&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;blockquote&gt;If m_nThreadCount=0&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;m_nThreadCount=App.UutCount ! The number of devices being tested&lt;br /&gt;&amp;nbsp;&amp;nbsp;sPath=GetDir(aGetDirCurrent)+"\\MultiUUT.xlsx"&lt;br /&gt;&amp;nbsp;&amp;nbsp;FileRemove(sPath) ! Delete old versions of the Workbook file&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Excel File Open New(, App.UutCount, xlwb) ! Create a new Workbook file&lt;br /&gt;&amp;nbsp;&amp;nbsp;Excel Show Application(True) ! Show the Workbook - comment to hide the Workbook&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;For nSheet=1 to App.UutCount ! Repeat for each device - rename the Worksheet to UUT #&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Excel Set Worksheet Name(xlwb,nSheet,"UUT "+Str(nSheet)) ! New function added to Excel driver&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For nColumn=1 to 2 ! Repeat for each Task - add Worksheet column headers&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Excel Set Value(xlwb,nSheet,Chr('A'+nColumn)+"1","Task "+Str(nColumn))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For nRow=1 to 16 ! Repeat for each device pin - add Worksheet row headers&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Excel Set Value(xlwb,nSheet,"A"+Str(nRow+1),"Pin "+Str(nRow))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Excel File SaveAs(xlwb,sPath) ! Save the Workbook&lt;br /&gt;EndIf&lt;br /&gt;&lt;/blockquote&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;System.OnEndProgram&lt;/b&gt; event counts down the m_nThreadCount variable as each Program module thread completes.&amp;nbsp;&amp;nbsp;When the last thread closes, the System.OnEndProgram event saves the Workbook and closes the Excel application.&amp;nbsp;&amp;nbsp;There is also a &lt;b&gt;System.OnAbort&lt;/b&gt; event that is executed in the event that the operator aborts the test process.&amp;nbsp;&amp;nbsp;As the code performs the same function as the System.OnEndProgram event, only the System.OnEndProgram event code is shown below:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure OnEndProgram(): Void Public	! Occurs when a program has completed.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;{&lt;br /&gt;&lt;blockquote&gt;m_nThreadCount=m_nThreadCount-1 ! Decrement the thread count by 1&lt;br /&gt;&lt;br /&gt;If m_nThreadCount=0 ! If the last Program thread is complete, save the workbook and close Excel&lt;br /&gt;&amp;nbsp;&amp;nbsp;Excel File Save(xlwb)&lt;br /&gt;&amp;nbsp;&amp;nbsp;Excel File Close(xlwb,True)&lt;br /&gt;EndIf&lt;br /&gt;&lt;/blockquote&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In addition to the m_nThreadCount System variable, another System variable, &lt;b&gt;"xlwb"&lt;/b&gt; is defined to hold the Excel Workbook object.&amp;nbsp;&amp;nbsp;For completeness, the definition for both System variables is shown below:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Variables&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;xlwb: EXCEL.Workbook Public&lt;br /&gt;m_nThreadCount: Short Public&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Program Module&lt;/h3&gt;The Program module executes code for controlling instruments in order to make a measurement.&amp;nbsp;&amp;nbsp;Each measurement is compared against a pass/fail parameters to determine is the measured value is within defined limits.&amp;nbsp;&amp;nbsp;For this reason, each measurement is contained in an object called a &lt;b&gt;Test&lt;/b&gt;.&amp;nbsp;&amp;nbsp;The Test object contains the code for controlling source and measurements and the pass/fail parameters.&amp;nbsp;&amp;nbsp;This example simulates performing a continuity test on a 16-pin IC.&amp;nbsp;&amp;nbsp;The measurement is simulated using a random number generator that produces mostly pass results, with some fail results thrown in for completeness.&amp;nbsp;&amp;nbsp;As in a real test case, continuity is checked against the Vcc and Gnd power pins, which produce positive voltage in the range of 0.6V to 0.7V, or negative voltage in the range of -0.7V to -0.6V, respectively.&amp;nbsp;&amp;nbsp;The code for the simulated measurements for Pin 1 are shown below:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;!"Task 1 : "Continuity Vcc"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Test 1.1 : "Pin 1"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Min = 0.6&lt;br /&gt;Max = 0.7&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestResult=0.599+(Rnd()/321254.9)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Task 2 : "Continuity Gnd"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Test 2.1 : "Pin 1"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Min = -0.7&lt;br /&gt;Max = -0.6&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestResult=-0.701+(Rnd()/321254.9)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The Vcc and Gnd continuity measurements are organized into another structure called a &lt;b&gt;Task&lt;/b&gt;.&amp;nbsp;&amp;nbsp;A Task is a collection of measurements that are organized by some common theme - in this case, the tests are organized by the power pin the continuity is being measured against - Vcc and Gnd.&amp;nbsp;&amp;nbsp;Figure 2 below shows the example Program Module Task/Test structure.&amp;nbsp;&amp;nbsp;The tasks are "Continuity Vcc" and "Continuity Gnd", while the tests are Pin 1 to Pin 16.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200242\Program Module.JPG" alt="Program module Task/Test structures organize tests according to a common test process" title="Program module Task/Test structures organize tests according to a common test process" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2:&amp;nbsp;&amp;nbsp;Program Module Task/Test Structure&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Like the System module, the Program module also supports module events.&amp;nbsp;&amp;nbsp;The Program.OnEndTest event will execute at to conclusion of each and every test in the task/test sequence.&amp;nbsp;&amp;nbsp;This is a logical place to collect the results of each test and write them to the Excel workbook.&amp;nbsp;&amp;nbsp;The data is organized in the workbook by UUT number (worksheets), the task (columns) and the UUT pin number (rows).&lt;br /&gt;&lt;br /&gt;Three properties within the application facilitate this organizational capability.&amp;nbsp;&amp;nbsp;They are the &lt;b&gt;App.UutIndex&lt;/b&gt;, &lt;b&gt;Task.Index&lt;/b&gt; and &lt;b&gt;Test.Index&lt;/b&gt; properties.&amp;nbsp;&amp;nbsp;The App.UutIndex keeps track of which UUT is being tested.&amp;nbsp;&amp;nbsp;Using the value of this property, you can point to the worksheet associated with the UUT currently being tested.&amp;nbsp;&amp;nbsp;The Task.Index keeps track of which Task is currently being executed.&amp;nbsp;&amp;nbsp;You can use this property, with some minimal conversion, to point the worksheet column to store the test results in.&amp;nbsp;&amp;nbsp;And, likewise, the Test.Index can be used to point to the worksheet row to store the test results to.&amp;nbsp;&amp;nbsp;The Program.OnEndTest code is shown below:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure OnEndTest(): Void Public	! Occurs when a program test has completed.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;sRow: String: 8 &lt;br /&gt;sColumn: String: 8 &lt;br /&gt;{&lt;br /&gt;&lt;blockquote&gt;sColumn=Chr('B'+Task.Index) ! Convert the Task.Index to Excel column characters - works up to "Z" columns&lt;br /&gt;sRow=Str(Test.Index+2) ! Convert the Test.Index to Excel row string&lt;br /&gt;&lt;br /&gt;! Write TestResult to worksheet referenced by App.UutIndex, column sColumn, row sRow&lt;br /&gt;Excel Set Value(System.xlwb,App.UutIndex+1,sColumn+sRow,TestResult) &lt;br /&gt;&lt;/blockquote&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Program modules, by default, run tasks and tests in sequential mode, and will run the task/test in the same thread.&amp;nbsp;&amp;nbsp;ATEasy supports two types of sequencing for Multiple UUT testing, &lt;b&gt;sequential &lt;/b&gt;and &lt;b&gt;parallel&lt;/b&gt;.&amp;nbsp;&amp;nbsp;Sequential sequencing is as described above and runs the task/test in a common thread, while parallel sequencing runs tasks and tests in different threads.&amp;nbsp;&amp;nbsp;For Multiple UUT testing, ATEasy supports these test methods using a combination of special module events, synchronization classes, and application properties.&amp;nbsp;&amp;nbsp;These synchronization classes and events are described in the ATEasy on-line documentation, and are beyond the scope of this introductory article.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Test Executive&lt;/h3&gt;In this simple application, Multiple UUT synchronization is handled by the ATEasy Test Executive.&amp;nbsp;&amp;nbsp;The ATEasy Test Executive must be properly configured in order to test multiple UUT's.&amp;nbsp;&amp;nbsp;First, you must make sure to include the ATEasy Test Executive driver in the drivers list, run the application - typically it is the last driver in the list of drivers included in the System:Driver folder.&amp;nbsp;&amp;nbsp;When an ATEasy application is run with the Test Executive included, the Test Executive user interface will be displayed, allowing control of the test process and a test log report of the test results - as shown in figure 3 below.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200242\TestExec01a.bmp" alt="Standard Test Executive showing a single UUT test sequence" title="Standard Test Executive showing a single UUT test sequence" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3:&amp;nbsp;&amp;nbsp;Standard Test Executive&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For the following instructions, refer to figure 4 below.&amp;nbsp;&amp;nbsp;To configure the Test Executive for Multiple UUT support, while the Test Executive is visible, then from the Test Executive toolbar or menu list, open the &lt;b&gt;Tools:Customize:Options&lt;/b&gt; menu, and from the list of parameters, select and set the &lt;b&gt;Enable Multiple UUT's&lt;/b&gt; parameter &lt;b&gt;True&lt;/b&gt;.&amp;nbsp;&amp;nbsp;The default number of UUT's is 4, although the default can be changed and saved, so may not be the same as in this example. Also set &lt;b&gt;Default UUT Switch Level&lt;/b&gt; to &lt;b&gt;Test&lt;/b&gt; .&amp;nbsp;&amp;nbsp;After closing the Customize dialog, the Test Executive user interface will update to show a tab for each UUT.&amp;nbsp;&amp;nbsp;Each UUT's tab shows the test log test results and a tree of the UUT program tests, the tab caption shows the UUT index number, the program name and an icon that will show whether the UUT is running (right box), stopped (box). The icon is colored by the UUT status: green for PASS red for FAIL, black for None as shown in figure 5 and 6 below.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200242\P06_08.bmp" alt="Test Executive Multi-UUT configuration parameters" title="Test Executive Multi-UUT configuration parameters" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4:&amp;nbsp;&amp;nbsp;Test Executive Configuration&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200242\TestExec02a.bmp" alt="Modified Test Executive showing multiple UUT test sequences" title="Modified Test Executive showing multiple UUT test sequences" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5:&amp;nbsp;&amp;nbsp;Multi-UUT Test Executive&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Running the tests using the default sequential test mode will run all of the Tests and Tasks for each UUT in sequence.&amp;nbsp;&amp;nbsp;You may notice an Excel workbook was opened when the ATEasy tests were started.&amp;nbsp;&amp;nbsp;If you click on the Excel workbook to give it focus, you will see the test results being populated in sequential worksheets in Task/Test sequential order.&amp;nbsp;&amp;nbsp;Figures 6 and 7 illustrate this process.&lt;br /&gt;&lt;br /&gt;When all of the tests have completed for each UUT, the Excel workbook is saved and closed.&amp;nbsp;&amp;nbsp;You can open the workbook to review the test results.&amp;nbsp;&amp;nbsp;By design, each time the tests are run, the old workbook is deleted and a new workbook created, so if you want to keep the old test results, make sure to create a backup of the file before running the Test Executive again.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200242\TestExec03aa.bmp" alt="Test Executive results for multiple UUT test sequences are shown in their own tabbed window" title="Test Executive results for multiple UUT test sequences are shown in their own tabbed window" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6:&amp;nbsp;&amp;nbsp;Multi-UUT Test Executive&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200242\Excel01a.bmp" alt="Excel workbook showing a worksheet for each UUT, with Task/Test results in the respective worksheet columns and rows" title="Excel workbook showing a worksheet for each UUT, with Task/Test results in the respective worksheet columns and rows" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 7:&amp;nbsp;&amp;nbsp;Excel Workbook with Captured Test Results&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The test mode can be changed from sequential to parallel, and and UUT count can be changed from 4 to up to 10 in the Tools:Controls:Option, as shown in figure 8.&amp;nbsp;&amp;nbsp;Observing the Excel workbook while running in parallel mode shown the worksheets being updated in a scattered appearing manner. Each UUT's tasks/tests are being run in their own thread, and update their respective worksheet when a measurement is completed.&amp;nbsp;&amp;nbsp;As this happens very rapidly, the worksheet updates appear scattered, but are actually following a the processes defined.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200242\UUT Count.bmp" alt="Select different UUT counts and/or Parallel sequencing modifies the behavior of the Test Executive without writing additional code" title="Select different UUT counts and/or Parallel sequencing modifies the behavior of the Test Executive without writing additional code" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 8:&amp;nbsp;&amp;nbsp;Changing UUT Count and Test Sequencing&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;You can also change the UUT count and the program associated to each UUT can be different (if your project have multiple programs). This can be done from the Test Executive &lt;b&gt;Select Program &lt;/b&gt;dialog (see the Test Executive on-line help). In addition, you can set the UUT count and the program associated with each index programmatically, See the ATEasy &lt;b&gt;TestExecMultipleUuts.prj &lt;/b&gt;example located in the ATEasy Examples folder..&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;This example can be run on any system with Microsoft Office (ATEasy EXCEL driver) installed and running a licensed or evaluation version of ATEasy.&amp;nbsp;&amp;nbsp;Additional information about ATEasy's Multiple UUT testing capabilities and synchronization objects can be found in the ATEasy on-line documentation. &lt;br /&gt;&lt;br /&gt;Download the &lt;b&gt;Multi-UUT.zip&lt;/b&gt; Example Files:&amp;nbsp;&amp;nbsp;&lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/Q200242\Multi-UUT.zip' target='_blank'&gt;Click Here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;More articles on Multi-Site/Multi-UUT Testing&lt;br /&gt;&lt;a href='https://www.marvintest.com/KB/Q200340/' target='_blank'&gt;KB Article #Q200340 - Multisite Digital Test System Design&lt;/a&gt;&lt;br /&gt;&lt;a href='https://www.marvintest.com/KB/Q200356/' target='_blank'&gt;KB Article #Q200356 - Multi-site-Production-Test-Development-in-ATEasy&lt;/a&gt;&lt;br /&gt;&lt;a href='https://www.marvintest.com/KB/Q200239/' target='_blank'&gt;KB Article #Q200239 - Synchronizing-Resources-for-Multiple-UUT-Testing&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200242/Testing-Multiple-UUTs-in-ATEasy</link><pubDate>5/20/2024</pubDate></item><item><title>Multi-site Production Test Development in ATEasy - Published on 5/20/2024</title><description>This article discusses the test development architecture and features available in the TS-900e and TS-960e series semiconductor test stations when creating a test program for multiple site parallel testing.&amp;nbsp;&amp;nbsp;It covers built-in ATEasy tools for semiconductor testing, ICEasy abstraction layer drivers for model independence and scalable test program development, as well as some considerations for measuring performance.&lt;br /&gt;&lt;br /&gt;Single site testing is use of a test station, test equipment and software to evaluate a single die.&amp;nbsp;&amp;nbsp;The necessary stimulus and measurement channels are routed to a test socket mounted on a device interface board (&lt;b&gt;DIB&lt;/b&gt;) attached to the test station.&amp;nbsp;&amp;nbsp;When testing completes, the device-under-test (&lt;b&gt;DUT&lt;/b&gt;) is classified and binned according to the test results.&amp;nbsp;&amp;nbsp;After the test is complete, a new DUT is tested by moving the IC out of the test socket manually or with an automated handler, or by moving the test head to the location of the next die in queue.&lt;br /&gt;&lt;br /&gt;Multiple site testing involves testing multiple dies in parallel on the same test station, which is achieved by using duplicate test sockets or test heads, sharing instrument resources or augmenting the test station with duplicate test instruments to operate in parallel.&amp;nbsp;&amp;nbsp;Coordination of these instruments and any shared resources is regulated by the test program's underlying software.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Software Considerations when Designing for Multi-Site Testing&lt;/h3&gt;ATEasy’s approach to multi-site testing is to design a single Test Program file (.PRG) from which multiple identical instances can be created and executed against a physical DUT.&amp;nbsp;&amp;nbsp;Since identical copies of test software are run against various ICs, the test program should be written is a way which allows it to scale up to the amount of DUTs the load board and instrumentation is capable of supporting.&lt;br /&gt;&lt;br /&gt;When multiple instance of a Program are started, an identical instance of the test program is created for each configured DUT based upon the configured value of App.UutCount, as described below. These programs can be executed sequentially or in parallel based on user configuration.&amp;nbsp;&amp;nbsp;Usually, both tests sites will use an identical test program to test DUTs of the same series although it is possible to configure the test program to test different ICs in parallel.&lt;br /&gt;&lt;br /&gt;Since the test code is identical, a method to differentiate the Program instances and sockets was devised.&amp;nbsp;&amp;nbsp;During test execution, the ATEasy reserved project variable App.UutIndex is automatically set to reflect the active Program instance at the moment the test code is executing.&lt;br /&gt;&lt;br /&gt;When enabling multi-site testing, an ATEasy reserved property, App.UutIndex, is used by the test program instance to differentiate between test programs and to determine which instruments should be used for stimulus and measurement.&amp;nbsp;&amp;nbsp;During test program execution, App.UutIndex will update to report a value between 0 and App.UutCount-1 where App.UutCount is the value configured by the user via the Select Program/Profile dialog or SetUutCount() command.&lt;br /&gt;&lt;br /&gt;See the ATEasy help article for more information on using "App.UutIndex".&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Design Efficiency&lt;/h3&gt;Efficiency can be quantified by comparing the multisite test time with single-time test time as follows:&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200356\IMG200356_4.png" alt="Equation: Efficiency for Multisite Testing (Non-Math)" title="Equation: Efficiency for Multisite Testing (Non-Math)" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This can also be represented mathematically as follows:&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200356\IMG200356_3.png" alt="Equation: Efficiency for Multisite Testing (Equation)" title="Equation: Efficiency for Multisite Testing (Equation)" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Where:&lt;ul&gt;&lt;li&gt;N is the number of sites&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;t&lt;sub&gt;N&lt;/sub&gt; is the test time for N sites&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;t&lt;sub&gt;1&lt;/sub&gt;&amp;nbsp;&amp;nbsp;is the test time for a single site&lt;/li&gt;&lt;/ul&gt;In the best case scenario: a single site takes 100 mSec and two sites in parallel also 100 mSec to test, t&lt;sub&gt;N&lt;/sub&gt; and t&lt;sub&gt;1&lt;/sub&gt; are equal and the equation simplifies to 1 or 100% efficiency.&amp;nbsp;&amp;nbsp;This example is truly parallel.&amp;nbsp;&amp;nbsp;Conversely and a worse scenario, if a single site takes 100 mSec and two sites take 200 mSec, t&lt;sub&gt;N &lt;/sub&gt; - t&lt;sub&gt;1&lt;/sub&gt; is equal to (N-1) * t&lt;sub&gt;1&lt;/sub&gt; and the efficiency equation simplifies to 0 or 0% efficiency, which is more representative of serial operation.&amp;nbsp;&amp;nbsp;A more realistic example would be converting a single site test of 100 mSec to a quad site test which takes 130 mSec to complete all 4 dies.&amp;nbsp;&amp;nbsp;Test time growth would be 30 mSec and 3 sites were added to the system resulting in a 90% efficiency.&lt;br /&gt;&lt;br /&gt;To evaluate this in another way, we define a simplified cost-to-test formula as the cost of the test station plus operational costs divided by the parts produced. &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200356\IMG200356_5.png" alt="Equation: Efficiency for Cost Per Part" title="Equation: Efficiency for Cost Per Part" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In the previous example, 1 unit was tested in 100 mSec.&amp;nbsp;&amp;nbsp;The parallel testing paradigm improved this to 4 units in 130 mSec.&amp;nbsp;&amp;nbsp;Let's assume that operational costs for the single unit amounts to 0.50 cost units.&lt;br /&gt;&lt;br /&gt;Evaluating multi-site testing improvement is a matter of find the ratio between the original cost-to-test and the multisite cost-to-test.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200356\IMG200356_6.png" alt="Equation: Ratio of Multisite to Single" title="Equation: Ratio of Multisite to Single" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The cost-to-test improvement is 0.5 / 0.165 or approximately 3 times (i.e 3 parts tested for the price of 1 part).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Configuring Multi-Site Domains Using Driver Shortcuts&lt;/h3&gt;All ATEasy drivers, including drivers such as the GX5296.drv for digital input/output (DIO) and AgNA.drv for vector network analyzer (VNA) are designed to initialize instruments when the system module is initialized and store the driver handle for each initialized instrument. During initialization, test sites are separated in the Driver shortcut parameters using a ‘;’ delimiter. For instance, a VNA driver shortcut with the ResourceName of “PXI17::0::INSTR;PXI18::0::INSTR” will use PXI17::0::INSTR for the first site in which App.UutIndex=0 and PXI18::0::INSTR will be used for second site in which App.UutIndex=1.&lt;br /&gt;&lt;br /&gt;Calls to these instruments will have a parameter nDomainIndex or nHandleIndex which will route the command to the appropriate instrument.&amp;nbsp;&amp;nbsp;The default index value is 0, which is the App.UutIndex when only one instrument exists.&amp;nbsp;&amp;nbsp;If developing for multi-site testing, the usual input argument will be App.UutIndex.&lt;br /&gt;&lt;br /&gt;In addition to setting the Driver Shortcut parameters through the Properties Editor, the configuration can be done dynamically during system initialization.&amp;nbsp;&amp;nbsp;Dynamic configuration is not required in most cases as the slot number and resource string will not change unless a PXI instrument is inserted or removed.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;ICEasy Structure for Multi-Site Testing&lt;/h3&gt;The ICEasy driver resolves the problem of resource allocation and App.UutIndex value allowing the user to write a test program which scales to the number of test sites automatically.&amp;nbsp;&amp;nbsp;A top-level command of a test program written by a test engineer using ICEasy does not reference the App.UutIndex property.&amp;nbsp;&amp;nbsp;The reference to App.UutIndex occurs in the abstraction layer of the driver.&lt;br /&gt;&lt;br /&gt;The command written by the test engineer would look like this:&lt;br /&gt;&lt;div class='fixedFont'&gt;! Measure nChannel at a rate of 60 Hz and assign to TestResult&lt;br /&gt;TestResult=ICEasy DIO Measure Voltage(nChannel, 60)&lt;/div&gt;&lt;br /&gt;If this command were written using low-level or direct instrument commands, each command would need to be written to pass the App.UutIndex in the nDomainIndex parameter.&amp;nbsp;&amp;nbsp;The same test code in a test program using direct driver commands would be written like this GX5296-specific example:&lt;br /&gt;&lt;div class='fixedFont'&gt;DIO Measure Voltage (nChannel, TestResult, 60, , , , App.UutIndex)&lt;/div&gt;&lt;br /&gt;In either scenario, the test program would support both single-site and multi-site testing as App.UutIndex value would remain at its default value of 0 for a single DUT.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Configuring a Single Instrument to Service Multiple Test Sites&lt;/h3&gt;If an instrument has multiple independently operating channels, the instrument may be configured to support expansion to multiple test sites.&amp;nbsp;&amp;nbsp;As an example, consider a test station which includes two Source Measure Units (SMUs), each with four channels.&amp;nbsp;&amp;nbsp;If these cards are initialized using the method suggested in the Driver Shortcuts section, they could support two test sites with the first test program instance sending all commands to the first board and the second test program instance routing all commands to the second board.&amp;nbsp;&amp;nbsp;If the test program only utilizes two channels per site, then a total of four channels would be unused.&lt;br /&gt;To remove this inefficiency, ICEasy can be configured with some instrument classes to specify the number of channels to be used per site (the domain size).&lt;br /&gt;&lt;div class='fixedFont'&gt;! Configure the SMU to use 2 channels per DUT&lt;br /&gt;ICEasy SMU Set DomainSize(2)&lt;/div&gt;&lt;br /&gt;In this example, the two SMU test station will direct commands from the first site to channels 1 and 2 of the first SMU and the second program will control channels 3 and 4 of the first SMU.&amp;nbsp;&amp;nbsp;The second SMU would not be needed for this test configuration, but would automatically be used if up to two more test sites were added to the system.&lt;br /&gt;&lt;br /&gt;Because the model of the instrument is unknown by the ICEasy driver, the board’s maximum channel count must be written into the ICEasy interface driver (e.g. ICEasy_GX3104.drv).&amp;nbsp;&amp;nbsp;This value will be used to determine if the specific model is capable of supporting a split domain and how many channels are supported.&amp;nbsp;&amp;nbsp;The test program will notify via exception if the domain size requested is beyond the capacity of the selected instrument model.&amp;nbsp;&amp;nbsp;For backwards compatibility, the default domain size is equal to the maximum channel count of the board.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;System, Program and Test Variables&lt;/h3&gt;Each instance of the Program module has unique instances of all the Program and Test variables which are independent from the Program instances from the other DUTs.&amp;nbsp;&amp;nbsp;These variables can be accessed from the test code and procedures without any modifications or concerns.&amp;nbsp;&amp;nbsp;Variables in the System module and Drivers are not duplicated and are shared by all Program instances.&amp;nbsp;&amp;nbsp;This means that multiple Program modules could attempt to write to or read from the same data in parallel.&amp;nbsp;&amp;nbsp;This behavior could lead to one thread accessing stale data or data intended for another Program or overwriting data which another thread intends to access.&amp;nbsp;&amp;nbsp;To mitigate this potential issue, the test developer should avoid the use of System variables in the Program modules.&amp;nbsp;&amp;nbsp;If System variables are used, access to these variables should be protected with a synchronization object and each thread should have a copy of the variable that is independent from the other instances.&lt;br /&gt;&lt;br /&gt;See the following ATEasy help article for more information on multithreading and synchronization "Multithreading Considerations", "Procedure Properties"&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Configuring your Test Application to Support Multiple UUTs&lt;/h3&gt;The default state of ATEasy and the Test Executive is to use single-site testing.&amp;nbsp;&amp;nbsp;To configure for multi-site testing, multiple UUTs must be enabled and test programs must be assigned to each site.&amp;nbsp;&amp;nbsp;Enabling multiple UUTs can be done manually or programmatically.&lt;br /&gt;Manual configuration&lt;ul&gt;&lt;li&gt;Launch a single-site application which utilizes the Test Executive.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;From the Test Executive menu, open the Customize dialog by clicking the menu item Tools | Customize&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Navigate to the Options tab and switch the ‘Enable Multiple UUTs’ value to True.&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200356\IMG200356_0.png" alt="Customize Dialog from Test Executive" title="Customize Dialog from Test Executive" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;After multiple UUTs is enabled, the DUT count can be set to a value greater than 1 and test programs can be assigned to the DUTs.&lt;ul&gt;&lt;li&gt;From the Test Executive menu, open the Select Program/Profile dialog.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Change the UUT Count to the desired number of test sites.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Enable Run Parallel.&amp;nbsp;&amp;nbsp;The default option is to execute the test programs sequentially.&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200356\IMG200356_1.png" alt="Select Program / Profile" title="Select Program / Profile" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Programmatic configuration&lt;ul&gt;&lt;li&gt;In a system or driver module, call the following command to enable execution of multiple test programs&lt;/li&gt;&lt;/ul&gt;&lt;div class='fixedFont'&gt;TestExec Customize Options Set (ateOptionsEnableMultipleUUTs, True)&lt;/div&gt;&lt;ul&gt;&lt;li&gt;In a system or driver module, call the following command to set the DUT count to match the number of parallel test sockets available&lt;/li&gt;&lt;/ul&gt;&lt;div class='fixedFont'&gt;! Configure for two DUTs&lt;br /&gt;TestExec Execution SetUutCount(2)&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Assign the test program to the test sockets, making sure to set the test mode to parallel&lt;/li&gt;&lt;/ul&gt;&lt;div class='fixedFont'&gt;! Assign programs, setting sites 0 and 1 run the same test program in parallel&lt;br /&gt;TestExec Execution LoadProgram("DualSiteExample", , aUutRunModeParallel, 0)&lt;br /&gt;TestExec Execution LoadProgram("DualSiteExample", , aUutRunModeParallel, 1) &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Final Considerations&lt;/h3&gt;When designing for multi-site applications:&lt;ul&gt;&lt;li&gt;Modify the Driver Shortcut parameters to add the extra domain using the ‘;’ delimiter so instruments are initialized into different domains and can be called using a single driver&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;At the Test level of your code, avoid the use of commands which target a specific instrument driver.&amp;nbsp;&amp;nbsp;Instead of calling DIO directly, use an abstraction layer like ICEasy.drv which can handle the task of directing the command to the correct instrument domain and supports instrument replacement&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Only Program variables are duplicated in a multi-site application.&amp;nbsp;&amp;nbsp;If a System or driver variable is used, check to ensure that access is protected with a synchronization object and the variable can support access from multiple-threads without impacting other Test Programs&lt;/li&gt;&lt;/ul&gt;More articles on Multi-Site/Multi-UUT Testing&lt;br /&gt;&lt;a href='https://www.marvintest.com/KB/Q200340/' target='_blank'&gt;KB Article #Q200340 - Multisite Digital Test System Design&lt;/a&gt;&lt;br /&gt;&lt;a href='https://www.marvintest.com/KB/Q200242/' target='_blank'&gt;KB Article #Q200242 - Testing Multiple UUTs in ATEasy&lt;/a&gt;&lt;br /&gt;&lt;a href='https://www.marvintest.com/KB/Q200239/' target='_blank'&gt;KB Article #Q200239 - Synchronizing-Resources-for-Multiple-UUT-Testing&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200356/Multi-site-Production-Test-Development-in-ATEasy</link><pubDate>5/20/2024</pubDate></item><item><title>Synchronizing Resources for Multiple UUT Testing - Published on 5/20/2024</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;h3&gt;Introduction&lt;/h3&gt;With the introduction of &lt;b&gt;ATEasy v8&lt;/b&gt;, Multi-UUT testing was added. It is the ability to test Multiple UUTs in &lt;b&gt;Sequential or Parallel&lt;/b&gt; mode.&amp;nbsp;&amp;nbsp;Program modules running tasks and tests in sequential mode will run in the same thread, while parallel tasks and tests will run in different threads.&amp;nbsp;&amp;nbsp;ATEasy® supports multi-UUT test using a combination of special module events, synchronization classes, and application properties.&amp;nbsp;&amp;nbsp;This article provides an overview on what these items are and how to use them to create ATEasy programs with the capability to test multiple UUTs within a single test application. This article also presents an &lt;b&gt;example use-case&lt;/b&gt; which will show how to use some built-in synchronization features of the Test Executive available in ATEasy v10.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Synchronization Classes&lt;/h3&gt;For multi-threaded tests, it is necessary to synchronize control of your test resources.&amp;nbsp;&amp;nbsp;This is done using &lt;b&gt;Synchronization Classes&lt;/b&gt;.&amp;nbsp;&amp;nbsp;Synchronization classes are used when access to a resource must be controlled to ensure integrity of the resource. The synchronization classes available in ATEasy are &lt;b&gt;AEvent, ASemaphore, AMutex, and ACriticalSection&lt;/b&gt;. &lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Here are summaries for each synchronization class.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200239\SyncObjectsTable.png" alt="ATEasy Synchronization Objects" title="ATEasy Synchronization Objects" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1:&amp;nbsp;&amp;nbsp;ATEasy Synchronization Objects.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For more information on each synchronization class and example code, search "&lt;b&gt;Synchronization Objects&lt;/b&gt;" in the ATEasy Help document.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Events and Properties&lt;/h3&gt;There are two &lt;b&gt;Module Events &lt;/b&gt;and several &lt;b&gt;Application Properties&lt;/b&gt; and &lt;b&gt;Procedure Properties&lt;/b&gt; to support synchronizing resource control when testing multiple UUTs and managing test execution.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;The module events are supported in each ATEasy module (System, Driver and Program), and are used when running in sequential mode:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;OnInitSwitchUut&lt;/b&gt;:&amp;nbsp;&amp;nbsp;The OnInitSwitchUut event occurs just after ATEasy switches from one UUT to another.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;OnEndSwitchUut&lt;/b&gt;:&amp;nbsp;&amp;nbsp;The OnEndSwitchUut event occurs just before ATEasy from one UUT to another.&lt;/li&gt;&lt;/ul&gt;The application object properties (i.e. App.UutCount) supporting multi-UUT test are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;UutCount&lt;/b&gt;:&amp;nbsp;&amp;nbsp;The UutCcount defines the number of devices to test when testing multiple UUTs at the same time, either in sequential, parallel, or both.&amp;nbsp;&amp;nbsp;This number is 1 for single UUT (default) or greater for multiple UUTs.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;UutIndex&lt;/b&gt;:&amp;nbsp;&amp;nbsp;The UUT index returns the current index of the UUT running. This number is in the range of 0 to&amp;nbsp;&amp;nbsp;&lt;b&gt;App.UutCount-1&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;UutRunMode&lt;/b&gt;:&amp;nbsp;&amp;nbsp;The UutRunMode defines how the UUT tests are run (parallel or sequential). All UUTs running in sequential run mode will run on the same thread. UUTs running in parallel mode will each run in separate threads.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;UutSwitchLevel&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Sequential test mode only, the UutSwitchLevel property is used to define when ATEasy switches between sequential UUTs. You can set the switch level to program, task, or test.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;UutLog&lt;/b&gt;:&amp;nbsp;&amp;nbsp;The UutLog property is used to set or retrieve the log control of the specified UUT index.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;UutNextIndex&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Sequential test mode only, the UutNextIndex property can be used to skip or redirect ATEasy to run specific UUTs.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;UutProgram&lt;/b&gt;:&amp;nbsp;&amp;nbsp;A Program object that is used to store the UUT test results and hold the UUT test requirements for each test in that program.&lt;/li&gt;&lt;/ul&gt;Procedures have two properties, a &lt;b&gt;Synchronize Resource Name&lt;/b&gt; and a &lt;b&gt;Synchronize Checkbox&lt;/b&gt; that are used for multi-threading or Multiple UUTs with parallel run mode applications – see Figure 2 below.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200239\ProcedureProperties.png" alt="ATEasy Synchronization Properties" title="ATEasy Synchronization Properties" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2:&amp;nbsp;&amp;nbsp;ATEasy Synchronization Properties.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Synchronize Checkbox&lt;/b&gt;:&amp;nbsp;&amp;nbsp;When Synchronize is checked, it allows only one thread to execute the procedure with the specified (optional) Synchronize Resource Name.&amp;nbsp;&amp;nbsp;Other threads executing Tasks, Tests, or Procedures with the same name will be suspended until the procedure is complete.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Synchronize Resource Name&lt;/b&gt;:&amp;nbsp;&amp;nbsp;The Synchronize Resource Name text box is only enabled if Synchronize is checked. Any series of characters/string can be used for the name.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Example Use-Case: Multiple UUT Test For Various Temperatures&lt;/h3&gt;The following example explains how to set up&amp;nbsp;&amp;nbsp;a multi-UUT application where the same program in running repeatedly for various temperatures in parallel mode and each iteration executed with different temperature set. Since the UUT programs are running in parallel, for each iteration we must wait until all UUTs are completed for the next iteration with different temperature to be set, and then resume all UUTs to run the program again (OnEndTask for the last task).&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;In ATEasy v10 the &lt;b&gt;Test Executive&lt;/b&gt; has two commands, &lt;b&gt;WaitAll&lt;/b&gt; and &lt;b&gt;ResumeAll&lt;/b&gt;, which help test programmers with multi-UUT synchronization. The WaitAll and ResumeAll commands were created to aid test programmers in testing multiple UUTs by providing a framework to handle the synchronization. The WaitAll and ResumeAll commands take care of implementing the synchronization objects presented above so the test programmer does not have to.&lt;br /&gt;&lt;br /&gt;To demonstrate how to use these functions, we will imagine a possible use-case scenario. In this example we have a test system that does a variety of tests for a UUT. The system is capable of testing multiple UUTs at once. The goal of the tests is to gather data on the UUTs at different temperature levels. &lt;br /&gt;&lt;br /&gt;To accomplish this, we need to do the following:&lt;br /&gt;&lt;blockquote&gt;1. Add the TestExec driver to the System Module.&lt;br /&gt;2. Add variables to the System Module to keep track of the temperature.&lt;br /&gt;3. Write tests and supporting procedures for the UUT in the Program Module.&lt;br /&gt;4. Add logic to the Program Module's Events to increase temperature and re-run the tests.&lt;br /&gt;5. Configure the Test Executive for multiple UUTs. &lt;br /&gt;6. Run and verify the application.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;System Module&lt;/h3&gt;First we will add the TestExec driver to the project. This should be done in the System Module, as shown in Figure 3.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200239\AddTestExec.png" alt="Add the TextExec driver to the project" title="Add the TextExec driver to the project" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3:&amp;nbsp;&amp;nbsp;Add the TestExec driver to the project.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Next we add the variables shown below which will be used to handle the temperature of the system.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Variables&lt;br /&gt;================================================================================&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nEndTemp: Short Public = 80&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Last temperature to test.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nIncrementTemp: Short Public = 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Amount to increment temperature each iteration.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nStartTemp: Short Public = 50&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Starting temperature.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nTestTemp: Short Public&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Current temperature.&lt;/div&gt;&lt;br /&gt;	&lt;br /&gt;&lt;h3&gt;Program Module&lt;/h3&gt;The program module is used to execute code for making measurements/testing the UUT. We will add some dummy tasks and tests for the purpose of this example. The first task is some voltage tests for the UUT. The second task is some current tests for the UUT. &lt;br /&gt;&lt;br /&gt;The following step is optional - in the first test of each Task we add a print statement to show the temperature. These print statements appear on the test log and provide a way to document the temperature before the tests run.&lt;br /&gt;&lt;br /&gt;Below is a snippet of the Program module that shows the tasks, tests, and the code within.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Tests&lt;br /&gt;================================================================================&lt;br /&gt;&lt;br /&gt;Task 1 : "Voltage Tests"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Id = Task_1&lt;br /&gt;&lt;br /&gt;Test 1.1 : "3v Test"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Id = _3vTest&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pin = "1"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Unit = "V"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type = Other&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print "[Task 1] UUT: "+str(app.UutIndex)+" - Temp: "+str(nTestTemp)&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestStatus=PASS&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Test 1.2 : "5v Test"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Id = _5vTest&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pin = "1"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Unit = "V"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type = Other&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestStatus=PASS&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Task 2 : "Current Tests"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Id = Task_2&lt;br /&gt;&lt;br /&gt;Test 2.1 : "100mA Test"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Id = _100mATest&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pin = "1"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Unit = "mA"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type = Other&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print "[Task 2] UUT: "+str(app.UutIndex)+" - Temp: "+str(nTestTemp)&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestStatus=PASS&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Test 2.2 : "500mA Test"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Id = _500mATest&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pin = "1"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Unit = "mA"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type = Other&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestStatus=PASS&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In the Program module's Procedures we add a procedure to change the oven temperature. For the purpose of this example, we place a &lt;b&gt;trace&lt;/b&gt; statement in the procedure to simulate a temperature change. The trace statement is different from the print statements used above. &lt;b&gt;Print&lt;/b&gt; statements go to the &lt;b&gt;test log&lt;/b&gt;, while &lt;b&gt;trace&lt;/b&gt; statements go to the &lt;b&gt;debug log&lt;/b&gt;. In our trace statement, we output the new oven temperature that was set and the controlling UUT. The code snippet below shows the procedure &lt;b&gt;SetOverTemp()&lt;/b&gt; that was created for changing the oven temperature.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure SetOvenTemp(dNewTemp): Void&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dNewTemp: Val Double&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Enter code to set oven temperature&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trace "\r\n[Temperature Change] Oven Temperature: "+Str(dNewTemp,10)+" - Controlling UUT: "+Str(App.UutIndex)&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Figure 4 below is what the project looks like in the workspace-view after adding the tests and procedure.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200239\WorkspaceView.png" alt="The workspace view after adding tests and procedure" title="The workspace view after adding tests and procedure" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4:&amp;nbsp;&amp;nbsp;The workspace view after adding tests and procedure.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Program Module Events&lt;/h3&gt;In the &lt;b&gt;Program Module's Events&lt;/b&gt; we add code that changes the temperature after all tests have completed, and then re-run the tests. We repeat until we reach the user-defined limit (This was set using the variables we created in the System Module Variables).&lt;br /&gt;&lt;br /&gt;First we start in the &lt;b&gt;Program Module's Event&lt;/b&gt; called &lt;b&gt;OnInit()&lt;/b&gt;. This event occurs when a program has started. In this event we set the starting temp of the oven. Here we will be using &lt;b&gt;TestExec's functions, WaitAll and ResumeAll&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure OnInit(): Void Public! Occurs when a program has started.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Set the oven's starting temp.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if TestExec Execution WaitAll(ateUutsSyncFirstCallerReturnsFirst)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nTestTemp=nStartTemp&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetOvenTemp(nTestTemp)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestExec Execution ResumeAll()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;br /&gt;&lt;b&gt;TestExec Execution WaitAll&lt;/b&gt;: &lt;br /&gt;This command is used to synchronize all UUTs when running in parallel mode. &lt;br /&gt;after all UUTs called the function the last one will return and call call cmdResumeAll to release them from waiting.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;b&gt;TestExec Execution ResumeAll&lt;/b&gt;:&lt;br /&gt;This command is used to resume all UUTs that were suspended by the WaitAll command.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In this event (Program.OnInit), we want to set the initial temperature at the very beginning before any UUT has ran their tests. Therefore, we will input &lt;b&gt;ateUutsSyncFirstCallerReturnsFirst&lt;/b&gt; as the input for the enUutsSyncReturns parameter.&lt;br /&gt;&lt;br /&gt;Next we move to the &lt;b&gt;Program Module's Event&lt;/b&gt; called &lt;b&gt;OnInitTask()&lt;/b&gt;. This event occurs when a program task has started. This is an optional step - we add a trace statement here to output the task number, UUT index, and the current temperature. We will use these trace statements later to verify that our program worked correctly.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure OnInitTask(): Void Public	! Occurs when a program task has started.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;{&lt;br /&gt;trace "[Program.OnInitTask() Event] Task "+Task.Number+" UUT Index: "+Str(App.UutIndex)+" - Current temp: "+str(nTestTemp)&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In the &lt;b&gt;Program Module's Event called OnEndTask()&lt;/b&gt; we handle changing the oven's temperature and re-running the tests. Here we will be using the functions &lt;b&gt;WaitAll()&lt;/b&gt; and &lt;b&gt;ResumeAll()&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure OnEndTask(): Void Public	! Occurs after a program task has completed.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! if this is the last task in the program&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if task.Index = program.TestsCount-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! check if we reached the temperature limit&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (nTestTemp &lt; nEndTemp)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! one UUT will increment the temperature&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if TestExec Execution WaitAll()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nTestTemp=nTestTemp+nIncrementTemp&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetOvenTemp(nTestTemp)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestExec Execution ResumeAll()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! go back to first task of the program to begin the next iteration&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Task endevents 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EndIf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In our application, we want to increment the temperature after all UUTs have finished testing. &lt;br /&gt;&lt;br /&gt;Finally, we move on to the &lt;b&gt;Program Module's Event&lt;/b&gt; called &lt;b&gt;OnEnd()&lt;/b&gt;. This event occurs when a program has been completed. After the program has ended (the temperature limitation has been reached), we will create a trace statement telling us that the UUT has ended. This trace statement will be used later to verify that the program worked correctly. In this event we also reset the testing temperature variable (nTestTemp) back to the initial temperature so we can press Run again without having to close and reopen Test Executive.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure OnEnd(): Void Public ! Occurs when a program has completed.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trace "[Program.OnEnd() Event] UUT "+str(app.UutIndex)+" has ended."&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if TestExec Execution WaitAll()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nTestTemp=nStartTemp&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestExec Execution ResumeAll()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Test Executive&lt;/h3&gt;Multiple UUTs can be added in the Test Executive user interface. But before we can begin using multiple UUTs, we need to verify that the option is enabled. Start by running the project and Test Executive will open. We can check the multi-UUT option by navigating to &lt;b&gt;Test Executive's menu bar&lt;/b&gt; and going to Tools &gt; Customize. In the Options tab locate the option called "Enable Multiple UUTs" and set the value to &lt;b&gt;True&lt;/b&gt;. Then click OK to go back to Test Executive.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200239\EnableMultiUUT.png" alt="Enable Multiple UUTs" title="Enable Multiple UUTs" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5:&amp;nbsp;&amp;nbsp;Enable Multiple UUTs.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;We are going to add multiple UUTs to our test. Click on the folder icon on the top left labeled "Select..."&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200239\MouseOverSelectProgramDialog.png" alt="Click to display the Select Program Dialog" title="Click to display the Select Program Dialog" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6:&amp;nbsp;&amp;nbsp;Click to Display the Select Program Dialog.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The Select Program Dialog screen will pop up. Change the UUT Count value to 4 and make sure the Run Parallel check box is &lt;b&gt;unchecked&lt;/b&gt;. We will first test our application with 4 UUTs running in &lt;b&gt;sequential mode&lt;/b&gt;. After you have finished setting up the UUTs as shown in &lt;b&gt;Figure 5&lt;/b&gt;, press OK. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200239\4UUTs_Sequential.png" alt="4 UUTs running in sequential mode" title="4 UUTs running in sequential mode" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 7:&amp;nbsp;&amp;nbsp;4 UUTs running in sequential mode.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;You'll notice that there are now 4 tabs, one for each UUT we created. Press "Start" or the F5 hotkey to run the program. After the program has finished, you can see the test logs for each UUT by switching through the tabs. The &lt;b&gt;print statements&lt;/b&gt; from our tests appear in these logs. The print statements show the task number, UUT index, as well as the temperature. We can see that the tests start at a temperature of 50 degrees, increment by 10 degrees each iteration, and end at 80 degrees.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200239\TestExecFinishedRunning.png" alt="Test Executive finished running" title="Test Executive finished running" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 8:&amp;nbsp;&amp;nbsp;Test Executive finished running.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Next we'll check out the &lt;b&gt;trace statements&lt;/b&gt; we created in the Program Module Events. The debug log is found in the ATEasy IDE; see &lt;b&gt;Figure 9&lt;/b&gt;. We are able to verify that the order of execution in our application is correct.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200239\SequentialDebugLog.png" alt="Debug log for sequential mode" title="Debug log for sequential mode" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 9:&amp;nbsp;&amp;nbsp;Debug log for sequential mode.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Now we can verify our project is working for &lt;b&gt;parallel run mode&lt;/b&gt;. There are no code modifications needed; just launch Test Executive again and go back to the Select Program Dialog. This time we are going to do 4 UUTs running in &lt;b&gt;parallel run mode&lt;/b&gt;. Check the "&lt;b&gt;Run Parallel&lt;/b&gt;" check box and press OK.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200239\4UUTs_Parallel.png" alt="4 UUTs running in parallel mode" title="4 UUTs running in parallel mode" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 10:&amp;nbsp;&amp;nbsp;4 UUTs running in parallel mode.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Press "Start" or F5 to run the program again. This time the UUTs are run in &lt;b&gt;parallel&lt;/b&gt;. As with the sequential mode, we can go to the debug log to read our trace statements and verify the order of execution is correct.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200239\ParallelDebugLog.png" alt="Debug log for parallel mode" title="Debug log for parallel mode" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 11:&amp;nbsp;&amp;nbsp;Debug log for parallel mode.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/Q200239\Multi-UUT-Sync.zip' target='_blank'&gt;Click here to download the Multi-UUT-Sync.zip example files.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; The example contains also the test executive driver that was used at the time the example was written , make sure to update the TestExec shortcut to point to that file.&lt;br /&gt;&lt;br /&gt;More articles on Multi-Site/Multi-UUT Testing&lt;br /&gt;&lt;a href='https://www.marvintest.com/KB/Q200340/' target='_blank'&gt;KB Article #Q200340 - Multisite Digital Test System Design&lt;/a&gt;&lt;br /&gt;&lt;a href='https://www.marvintest.com/KB/Q200242/' target='_blank'&gt;KB Article #Q200242 - Testing Multiple UUTs in ATEasy&lt;/a&gt;&lt;br /&gt;&lt;a href='https://www.marvintest.com/KB/Q200356/' target='_blank'&gt;KB Article #Q200356 - Multi-site-Production-Test-Development-in-ATEasy&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200239/Synchronizing-Resources-for-Multiple-UUT-Testing</link><pubDate>5/20/2024</pubDate></item><item><title>White Paper: The Future Direction of Test, Maintenance, and Instrumentation - A Supplier’s Perspective - Published on 5/10/2024</title><description>The Future Direction of Test, Maintenance, and Instrumentation - A Supplier’s Perspective &lt;br /&gt;&lt;br /&gt;This presentation focuses on current and future ATE trends and challenges for military and aerospace test applications. Originally presented at AUTOTESTCON 2016.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2016\ATC_2016_Keynote_Panel.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the presentation&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200300/White-Paper-The-Future-Direction-of-Test-Maintenance-and-Instrumentation-A-Supplier-s-Perspective</link><pubDate>5/10/2024</pubDate></item><item><title>SemiEasy Semiconductor Production Test User Interface and Features - Published on 4/12/2024</title><description>SemiEasy is a drop-in software drivers that includes a suite of add-on features to the ATEasy Test Executive designed to streamline the transition from test development to production test.&amp;nbsp;&amp;nbsp;It is intended to be added to a finished test program but can be used in the test engineering lifecycle from the beginning of test design through test closure as it augments ATEasy test design features rather than replacing them.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;SemiEasy Main Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Simplified user interface for Production Testing&lt;/b&gt;&amp;nbsp;&amp;nbsp;ATEasy's default log output displays test numbers, names, limits and results for each test performed on the device-under-test (DUT).&amp;nbsp;&amp;nbsp;This information is most valuable when developing the test program, but is not useful in a Production environment where the goal is to quickly evaluate DUT performance, bin the device, record findings, and ready the next DUT for testing.&amp;nbsp;&amp;nbsp;SemiEasy displays information useful for bulk testing such as average test times, parts per lot, and binning results for the current lot.&amp;nbsp;&amp;nbsp;The SemiEasy User Interface is examined in greater detail later in this article.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;STDF Automated Logging&lt;/b&gt;&amp;nbsp;&amp;nbsp;SemiEasy's UI is modelled after STDF's record fields and provides recognizable elements to users who are familiar with STDF record format.&amp;nbsp;&amp;nbsp;To improve efficiency, test results are recorded quickly during test execution and append to the file when the die is changed or the test head is moving.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Handler Integration&lt;/b&gt;&amp;nbsp;&amp;nbsp;SemiEasy includes access points at the beginning and end of each program run to let the user inject automated handler instructions to prepare the next die for testing and to bin dispositioned dies.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ICEasy programming interface&lt;/b&gt;&amp;nbsp;&amp;nbsp;ICEasy driver provides a way to operate the instrument in order to write tests an easy to use programming interface. The ICEasy contains commands to map pins,&amp;nbsp;&amp;nbsp;simplified commands to operate DIO, SMU SWITCH and the VNA instruments, pre-defined tests (e.g., continuity, force current/voltage-measure voltage/current, etc.).&lt;/li&gt;&lt;/ul&gt;ICEasy IDD Test Example:&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200357\ICEasy Test Example.jpg" alt="ICEasy IDD Test" title="ICEasy IDD Test" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;SemiEasy User Interface Features&lt;/h3&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200357\IMG200357_2.png" alt="SemiEasy User Interface" title="SemiEasy User Interface" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Simple interface&lt;/b&gt;The features most important for Production test are prominent immediately after program launch.&amp;nbsp;&amp;nbsp;Features which are useful in development such as Loop on Test and Pause on Failure are available through the Test Executive menu.&amp;nbsp;&amp;nbsp;Test results information is maintained in separate tabs provided for quick analysis.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Test Statistics&lt;/b&gt;&amp;nbsp;&amp;nbsp;At a glance job statistics such as record information, test time statistics, STDF file location, and job status.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Binning Information&lt;/b&gt;&amp;nbsp;&amp;nbsp;Sortable binning information which updates as parts complete testing.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Job Information&lt;/b&gt;&amp;nbsp;&amp;nbsp;Test Program auto-fills Job Information (Handler type, Operators, IDs, image of the DUT, etc.) after the first job is completed.&amp;nbsp;&amp;nbsp;Future jobs require minimal or no configuration.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;SemiEasy and other System Drivers&lt;/h3&gt;The source for SemiEasy (&lt;b&gt;SemiEasy.drv&lt;/b&gt;) is stored in the SemiEasy.drv and is distributed with ATEasy.&amp;nbsp;&amp;nbsp;It takes advantage of the STDF automated logging driver for the recording of test data (&lt;b&gt;STDF.drv&lt;/b&gt;) as well as the Handler interface driver (&lt;b&gt;Handler.drv&lt;/b&gt;) which can be used to initialize an automated test handler, wait for a ready signal from the handler and inform the handler of binning information when testing has concluded.&amp;nbsp;&amp;nbsp;The SemiEasy driver also operates as an add-on to the Test Executive (&lt;b&gt;TestExec.drv&lt;/b&gt;) allowing users to leverage Test Executive features if they require it for test applications.&amp;nbsp;&amp;nbsp;All of these drivers must be included to use SemiEasy. &lt;br /&gt;&lt;br /&gt;To add these drivers to your system:&lt;ul&gt;&lt;li&gt;Right click on the System Drivers sub-module and select Insert Driver command.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select the SemiEasy.drv, TestExec.drv, STDF.drv or SemiEasyHandler.drv file from ATEasy Drivers folder and select Open in the Insert dialog to insert.&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200357\TS960e-5G-Workspace.jpg" alt="TS-960e-5G Workspace Project" title="TS-960e-5G Workspace Project" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Handler Interface Driver&lt;/h3&gt;The handler adapter provides locations within the SemiEasy job cycle where optional code can be executed.&amp;nbsp;&amp;nbsp;The purpose of this is to provide a means for communication with an automated test handler which will load, unload and bin DUTs. At the beginning of the job &lt;b&gt;SemiHandlerInitialize()&lt;/b&gt; will be called once to establish communication with the handler.&amp;nbsp;&amp;nbsp;When the test program starts, SemiEasy makes a call to &lt;b&gt;SemiHandlerGetSites()&lt;/b&gt; to both notify the handler that test execution software is ready to begin testing and to get information about available test sites.&amp;nbsp;&amp;nbsp;This command should return a status of 0 when the handler has loaded the DUT or an error code if the handler is unable to comply.&amp;nbsp;&amp;nbsp;Error code are reported to the test operator.&amp;nbsp;&amp;nbsp;After the test execution has completed, SemiEasy makes a call to &lt;b&gt;SemiHandlerSetBins()&lt;/b&gt; to notify the handler that testing has completed and to inform the handler of any relevant binning information.&lt;br /&gt;When a physical handler is being used to place and bin parts, SemiEasy should be set to run continuously by selecting Repeat Run.&amp;nbsp;&amp;nbsp;In this mode, SemiEasy will automatically contact the handler when it is ready for the next part and execution is determined by a ‘ready to start’ signal.&lt;br /&gt;&lt;br /&gt;By default, and for cases where a physical handler does not exist, SemiEasy will use the provided &lt;b&gt;SemiEasyHandlerManual.dll&lt;/b&gt; which receives API calls and generates positive responses but does not attempt communication or impede the test execution is any way.&amp;nbsp;&amp;nbsp;When using this manual control driver, the operate will have to set up and activate each test run by manually interacting with the control buttons. You can replace the handler DLL with you actual handle. SemiEasy comes with few drivers (along with their source code, for example Epson NS6000). &lt;br /&gt;&lt;br /&gt;The following diagram provide overview of the handler interface architecture:&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200357\IMG200357_0.png" alt="Flow chart of Handler function calls" title="Flow chart of Handler function calls" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For more information on the SemiEasy Handler Adapter, visit the SemiEasy chapter in the TS-9xx-5G User's Guide.&lt;br /&gt;&lt;br /&gt;Related Documents&lt;br /&gt;&lt;a href='https://www.marvintest.com/Downloads.aspx?Type=Manual&amp;keywords=&amp;filename=ts-9xx&amp;search=download' target='_blank'&gt;TS-900e-5G/TS-960e-5G User's Guide&lt;/a&gt;&lt;br /&gt;&lt;a href='https://www.marvintest.com/KB/Q200356/Multisite-Digital-Test-System-Design' target='_blank'&gt;KB Article #Q200356 - Multi-site Production Test Development in ATEasy&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200357/SemiEasy-Semiconductor-Production-Test-User-Interface-and-Features</link><pubDate>4/12/2024</pubDate></item><item><title>How to Configure CalEasy Standard Interfaces Using ATEasy Panel and Control Applet - Published on 3/26/2024</title><description>&lt;b&gt;&lt;h3&gt;Steps to Configure CalEasy Standard Instruments Using the ATEasy Panel and Control Applet&lt;/h3&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The following steps will show you how to configure a GPIB or PXI Standard instrument for use in CalEasy, a common and necessary step for calibration of instruments.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;b&gt;&lt;li&gt;Configuring a GPIB Interface&lt;/li&gt;&lt;/b&gt;&lt;ul&gt;&lt;li&gt;Open the ATEasy Interfaces: &lt;b&gt;Tools-&gt;ATEasy Interfaces...&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200358\CalEasyMain.png" alt="CalEasy" title="CalEasy" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Click on 'National Instruments GPIB boards' and Click the 'Change...' button (for this example we are using NI GPIB interface)&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200358\ATEasy Run-Time Configuration.png" alt="ATEasy Run-Time Configuration Applet" title="ATEasy Run-Time Configuration Applet" border='0' &gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Click the 'Settings...' button to set the National Instrument GPIB Board&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200358\GPIB Interface.png" alt="GPIB" title="GPIB" border='0' &gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Configure the ATEasy Board Address&lt;/li&gt;&lt;/ul&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;ATEasy Board Settings&lt;/th&gt;&lt;th&gt;NI MAX&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200358\GPIB Board Settings.png" alt="Board Settings" title="Board Settings" border='0' &gt;&lt;br /&gt;Interface Number is Configured by NI-MAX.&lt;br /&gt;0 for GPIB0, 1 for GPIB1, etc.&lt;br /&gt;The Primary address is the device's GPIB address that ATEasy uses to access the board. &lt;br /&gt;Typically, it is set to 0, unless you have a device already using that address&lt;/td&gt;&lt;td&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200358\NIMax.png" alt="NIMax" title="NIMax" border='0' &gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Click 'Ok' once the Interface Number and Primary Address are set. Then close the ATEasy Run Time Configuration.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Add the Standard Instrument by clicking on &lt;b&gt;Tools-&gt;Standards/Instruments&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200358\Standard Instrument 1.png" alt="Standard Instrument" title="Standard Instrument" border='0' &gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Select&amp;nbsp;&amp;nbsp;the Standard and fill-in the Information&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200358\Standards Instrument.png" alt="Standard Instrument" title="Standard Instrument" border='0' &gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Select GPIB for Interface Type and Click 'Set' to setup the GPIB Address&lt;/li&gt;&lt;/ul&gt;The Board and Primary Address should be identical to what is configured in NI-Max. Click 'OK' and Click 'Add'. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;li&gt;Configuring a PXI Interface&lt;/li&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Click &lt;b&gt;Tools-&gt;Standards/Instruments&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200358\PXI Standard.png" alt="PXI" title="PXI" border='0' &gt;&lt;ul&gt;&lt;li&gt;Select Standard and fill up the information&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select Interface PXI for Interface Type &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Set Address using 0xabb format &lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;a - represents the chassis number (e.g. 1 for chassis 1)&lt;br /&gt;bb - represents the slot number (e.g. 01 for slot 1)&lt;br /&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Click 'Add' and to start using in CalEasy&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;CalEasy allows you to conveniently and reliably calibrate many of MTS's instruments without having to send the instrument out of the building. Using the steps outlined above, you should be well on your way to performing your calibration in-house and minimize down time.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;[:+[+CalEasy+]+:]&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200358/How-to-Configure-CalEasy-Standard-Interfaces-Using-ATEasy-Panel-and-Control-Applet</link><pubDate>3/26/2024</pubDate></item><item><title>ATEasy Drivers Configuration - Published on 1/11/2024</title><description>&lt;h3&gt;ATEasy (.drv) Drivers&lt;/h3&gt;An ATEasy driver provides a way for ATEasy application to communicate with a device or an instrument. The driver can provide command statements and&amp;nbsp;&amp;nbsp;that are used by the application to program the device or instrument. It can also provide procedures, librarries, forms, libraries, variables, types if they defined as public. Once the driver is inserted to the ATEasy system, it must be configured before using it. ATEasy drivers can be implemented using ATEasy code that comprise by procedures or IO Tables, or using an external library such as DLL, ActiveX or .NET. You can also create a driver by importing a function panel driver (.fp), the import will create a DLL based driver. Once the driver is created and inserted to the system, it must be configured. The configuration depends on the driver implementation and there are two main types:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Interface Based Drivers&lt;/b&gt; - Includes GPIB, VXI, COM (RS232), USB, File and more. These driver are implemented using IO Table. A interface based driver can support multiple interfaces, for example if the instrument supports GPIB and USB, the driver properties will show:&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200304\ATEasyDriverPropertiesInterfaces.png" alt="ATEasy Driver Properties Interfaces" title="ATEasy Driver Properties Interfaces" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1: ATEasy Driver Interfaces property page supporting multiple interfaces&lt;/b&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;None Interface Drivers&lt;/b&gt; - based on ATEasy code functions &lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Interface Based Drivers&lt;/h3&gt;Interface based drivers are implemented using an IO Table or the internal API built into ATEasy. &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200304\1.png" alt="In this procedure, GetFrequency(), the IO Tables for Send and Receive are used." title="In this procedure, GetFrequency(), the IO Tables for Send and Receive are used." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2: Gp155x ATEasy driver, the procedure GetFrequency() was created using the IO Tables for Send and Receive.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Drivers for interface based drivers can also be made using the Internal library. ATEasy has built-in support for hardware interfaces such as COM, GPIB, VXI, USB, and WinSock(TCP/IP).&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200304\ATEasyWinSockProcedures.png" alt="ATEasy WinSock Procedures." title="ATEasy WinSock Procedures." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3: The ATEasy Internal library showing WinSock (TCP/IP) functions&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Configuring an Interface Based Driver&lt;/h3&gt;In this example, we will configure the Ag9xxxx driver for Agilent’s Infiniium Series Oscilloscopes that is provided with ATEasy. &lt;br /&gt;&lt;b&gt;1.&lt;/b&gt; Find out what the device's interface is. This can be found in the instrument description:&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200304\3.png" alt="The VISA resource name found above was used as the argument for sResounceName in the Initialize function." title="The VISA resource name found above was used as the argument for sResounceName in the Initialize function." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4: The description states the interface type is Winsock, USB, or GPIB.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt; Go to the driver's module (not the shortcut!), right click, and go to Properties.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200304\4.png" alt="Right click the driver module and select Properties." title="Right click the driver module and select Properties." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5: Right click the driver module and select Properties.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt; Click on the Interfaces tab and check-off the interfaces used.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200304\5.png" alt="Enable the interfaces supported by the driver." title="Enable the interfaces supported by the driver." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6: Enable the interfaces supported by the driver.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.&lt;/b&gt; Then go to the driver’s shortcut, right click, and go to Properties.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200304\6.png" alt="The driver’s shortcut can be found in the workspace view on the right-hand side." title="The driver’s shortcut can be found in the workspace view on the right-hand side." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 7: The driver’s shortcut can be found in the workspace view on the right-hand side.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5.&lt;/b&gt; In the Interfaces tab choose the interface to be used and fill in the required information.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200304\7.png" alt="The driver’s shortcut can be found in the workspace view on the right-hand side." title="The driver’s shortcut can be found in the workspace view on the right-hand side." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 8: The three interfaces that were checked-off can be chosen here.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Non-Interface Based&lt;/h3&gt;Non-interface based drivers are implemented by inserting libraries/DLLs, importing function panels, or inserting IVI drivers. Non-interface based drivers communicate via a low level abstraction layer, HW or VISA. To configure the driver for communication, the Slot Number or the VISA Resource must be specified.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Configuring a Non-Interface Based Driver&lt;/h3&gt;Marvin Test Solution's PXI/PCI Explorer can be used to find the slot number or VISA resource of an instrument. That slot number or VISA resource can then be plugged into the driver properties to allow the driver to communicate with the instrument. Below is an example of identifying the slot number of an instrument and then entering it into the driver properties under the Misc tab.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200304\HW-Slot3-PIO.png" alt="PXI/PCI Explorer - slot number." title="PXI/PCI Explorer - slot number." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 9: PXI/PCI Explorer - Instrument is in slot 3.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Slot number 3 is now placed in the Driver shortcut's Properties, Misc tab as shown below.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200304\Slot-num-properties.png" alt="The driver" title="The driver"s Properties - Misc tab.' border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 10: The driver's Properties - Instrument is identified by slot number.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Alternatively, you can also identify the instrument by it's VISA resource, as shown below.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200304\HW-VISA-VNA.png" alt="PXI/PCI Explorer - VISA resource." title="PXI/PCI Explorer - VISA resource." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 11: PXI/PCI Explorer - Instrument is VISA resource PXI17::0::0::INSTR.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This VISA resource is then entered into the ResourceName field in the Misc tab of the driver properties window. Shown in figure 12 below.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200304\visa-VNA-properties.png" alt="The driver" title="The driver"s Properties - Misc tab.' border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 12: The driver's Properties - Instrument identified by VISA resource.&lt;/b&gt;&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200304/ATEasy-Drivers-Configuration</link><pubDate>1/11/2024</pubDate></item><item><title>TS-9XXe-5G Blind Mate Interface Repeatability - Published on 9/8/2023</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;The increase in operating frequency of RF semiconductor devices presents challenges when interfacing to the device under test (DUT) through automated test equipment (ATE). One of the critical challenges in testing large volume, mmWave RF semiconductors is maintaining repeatable measurements through many cycles of docking/undocking test fixtures.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;mmWave Uniqueness&lt;/h3&gt;Higher frequencies (shorter wavelengths) mean that the electromagnetic wave will travel more on the surface of the transmission line (skin effect) . For any material, the losses increase as the frequency increases. Connectors/Interfaces used in mmWave test must be fabricated from materials that support the shorter wavelengths, and the geometry of the interface internal structures must also be smaller. In short, extreme mechanical precision is required in all fabricated parts of the RF interface to ensure repeatable, accurate measurements.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Common Issues With ATE RF Interfaces&lt;/h3&gt;In the context of ATE, blind mate interfaces often suffer because of misalignment or incorrect mating force. Either misalignment or incorrect mating force can contribute to a resonance at certain frequencies, creating a loss of energy through the transmission line. This is known in the industry as a "suck out". For the case of incorrect mating force, this is illustrated in the figure below. For misalignment a similar phenomenon is observed.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200352\\MatingForceGraph.png" alt="Mating force plot" title="Mating force plot" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 1 - Mating Force Plot&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Below is an example of a real world "suck out". You notice that at around 30GHz, unexpected loss of energy can clearly be observed. In this particular case, a manufacturing defect of five thousandths of an inch (5 mils) in the blind mate interface connector cavity is the cause.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200352\\position6without-washer.png" alt="30GHz "Suck out"" title="30GHz "Suck out"" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 2 - 30GHz "Suck Out"&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;TS-9XXe-5G 1.85mm Blindmate Solution&lt;/h3&gt;The RF blindmate interface on the TS-9XXe-5G:&lt;ul&gt;&lt;li&gt;1.85mm (67GHz) geometry (usable up to 53GHz, Keysight VNA limit).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Sexed design with floating interface.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Keyed fixture, using both coarse and fine alignment pins.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Single locking cam, dual release mechanism.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;All mechanical tolerances are held at +/- 0.001".&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200352\\bm.jpg" alt="TS-9xx-5G Blind-mate interface" title="TS-9xx-5G Blind-mate interface" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 3 - ATE Side of Blindmate Interface&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200352\\BM_top.jpg" alt="TS-9xx-5G Blind-mate interface" title="TS-9xx-5G Blind-mate interface" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 4 - Fixture Side of Blindmate Interface&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Materials used in TS-9XXe-5G RF Blindmate Interface:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Outer conductor (housing) is 303 stainless steel per ASTM A582 and passivated per AMS 2700 Method 1 type 2.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The material used meets the requirements of DFARS (Defense Federal Acquisition Regulation Supplement); DFARS requires that the steel must be smelted in the US or EU.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Center conductor is BeCu Alloy UNS C17300 per ASTM B196, heat treated to condition TH04.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Center conductor plating is gold per MIL-DTL-45204, Type II, Grade C, .000100”-.000150” thick over electro-plated Nickel per QQ-N-290A, .000150” - .000300” thick.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Plastic Bead is Neoflon per ASTM D1430 or AMS 3650.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;TS-9XXe-5G 1.85mm Blindmate Repeatability Demonstrated&lt;/h3&gt;Below is a composite (overlay) of the S21 (insertion loss) and S11 (return loss) measurements of our 1.85mm blindmate interface over 100 mating cycles. You will notice the marker values in the top right corner of the measurement window stays almost entirely within one tenth of a dB throughout the 100 mating cycles.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200352\\repeatability.png" alt="repeatability plot" title="repeatability plot" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;Marvin Test Solutions TS-9XXe-5G blindmate RF interface offers a robust, reliable and repeatable RF blindmate solution that allows users to utilize the full bandwidth of the system's 53 GHz Keysight VNAs.</description><link>https://www.MarvinTest.com/KB/Q200352/TS-9XXe-5G-Blind-Mate-Interface-Repeatability</link><pubDate>9/8/2023</pubDate></item><item><title>Accessing the Windows Registry using the WinReg.h DLL API from ATEasy - Published on 7/31/2023</title><description>&lt;h3&gt;Overview&lt;/h3&gt;The Windows® Registry is a database that stores information and settings used by the Windows Operating System kernel, device drivers, and applications.&amp;nbsp;&amp;nbsp;You can access the registry information using the APIs that are included in the &lt;b&gt;ADVAPI.dll&lt;/b&gt; installed with Windows.&amp;nbsp;&amp;nbsp;This article demonstrates how to access the registry within an ATEasy® application using these APIs.&amp;nbsp;&amp;nbsp;You will learn how to find the DLL API functions declaration in the WinReg.h header file and how to declare them in your ATEasy application.&amp;nbsp;&amp;nbsp;An example will demonstrate how to query the number of COM ports by using the declared API functions to access the registry key &lt;b&gt;HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM&lt;/b&gt;. &lt;br /&gt;Similar examples can be implemented using .Net assembly (&lt;b&gt;System.Microsoft.Win32&lt;/b&gt;, &lt;b&gt;Registry &lt;/b&gt;and &lt;b&gt;RegistryKey &lt;/b&gt;classes); however in this example we show how to access the registry using DLL APIs.&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;b&gt;Note:&lt;/b&gt;&amp;nbsp;&amp;nbsp;Familiarity with ATEasy and the ATEasy IDE is assumed.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Adding ADVAPI32.dll Library to an ATEasy Module&lt;/h3&gt;The ADVAPI32.dll library is part of the Windows OS and contains &lt;b&gt;ADV&lt;/b&gt;anced &lt;b&gt;API&lt;/b&gt; services.&amp;nbsp;&amp;nbsp;It provides access to functionality beyond that available with the Windows kernel, such as restarting/shutting down the system, managing services, managing user accounts and access to the Windows registry.&amp;nbsp;&amp;nbsp;The DLL covers a broad range of functions, but those we are interested in - the registry APIs - are defined in the header file WinReg.h.&amp;nbsp;&amp;nbsp;Definitions for the registry functions can be found in this &lt;a href='https://learn.microsoft.com/en-us/windows/win32/api/winreg/' target='_blank'&gt;&lt;b&gt;WinReg&lt;/b&gt;&lt;/a&gt; link.&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;Working with External Libraries&lt;/b&gt; chapter in the ATEasy &lt;b&gt;Getting Started&lt;/b&gt; manual explains how to link a DLL to your ATEasy application.&amp;nbsp;&amp;nbsp;The Getting Started manual is also accessible from ATEasy &lt;b&gt;Help&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;You must determine which ATEasy module makes the most sense to have or use the ADVAPI library: as a Driver, within the System module, or within the Program module.&amp;nbsp;&amp;nbsp;Since it's likely these functions could be used in many applications, the most logical place for them to reside would be within an ATEasy driver.&amp;nbsp;&amp;nbsp;In fact, the &lt;b&gt;ATEasy Test Executive&lt;/b&gt; includes the ADVAPI.dll as a component of that driver.&amp;nbsp;&amp;nbsp;In this example, the DLL will be placed in the System module.&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;b&gt;Note:&lt;/b&gt;&amp;nbsp;&amp;nbsp;The functionality discussed in this article can also be achieved by simply including the ATEasy Test Executive driver in your application instead of adding the advapi.dll and declaring the needed functions.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;With ATEasy open, double-click the System icon in the Workspace to open the System document.&amp;nbsp;&amp;nbsp;Right-click on the &lt;b&gt;Libraries&lt;/b&gt; submodule within the System document and select &lt;b&gt;Insert Libraries Below&lt;/b&gt;.&amp;nbsp;&amp;nbsp;Hit enter.&amp;nbsp;&amp;nbsp;From the Insert Library dialog that pops up, select the &lt;b&gt;DLL&lt;/b&gt; tab and click on the navigation tool to select the &lt;b&gt;DLL File Name&lt;/b&gt;, and navigate to the advapi32.dll file.&amp;nbsp;&amp;nbsp;Click on &lt;b&gt;Insert&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;b&gt;Note&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Advapi32.dll is available in 32 or 64-bit DLL and is located under your Windows, System32 folder for 32 or 64-bit Windows respectively.&amp;nbsp;&amp;nbsp;For 64-bit Windows, the 32-bit DLL will be located in the C:\Windows\SysWOW64 folder.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200354\KB354-01small.png" alt="Install The Advapi32.dll" title="Install The Advapi32.dll" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 1:&amp;nbsp;&amp;nbsp;Install the Advapi32.dll&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Declaring Registry Functions&lt;/h3&gt;After adding the DLL, the procedures list is empty (Figure 2).&amp;nbsp;&amp;nbsp;Unlike a COM/ActiveX or .NET library, a DLL does not contain information that would allow ATEasy to automatically declare the functions residing within the library.&amp;nbsp;&amp;nbsp;To use the API functions, you need to first declare them in the application.&amp;nbsp;&amp;nbsp;For each function you intend to use, you must define its name, define the number and the types of parameters, define how parameters are passed (as a value or a pointer), and define the return data type, if any (void if none).&amp;nbsp;&amp;nbsp;To save time, and to avoid possible errors when declaring DLL functions, ATEasy has a utility that will import DLL functions from a properly constructed header file (Figure 3).&amp;nbsp;&amp;nbsp;The procedure for declaring DLL functions from a header file is to right-click on the advapi32 DLL icon that you just installed and select &lt;b&gt;Import C Header File (.h)&lt;/b&gt;.&amp;nbsp;&amp;nbsp;After resolving any data type ambiguities, ATEasy will declare all of the functions defined in the header, as well as their data types, and any variables defined in the header file.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200354\KB354-02small.png" alt="Empty Procedure List" title="Empty Procedure List" border='0' &gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200354\KB354-03small.png" alt="Import Header File" title="Import Header File" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;blockquote&gt;&lt;blockquote&gt;&lt;blockquote&gt;&lt;blockquote&gt;Figure 2:&amp;nbsp;&amp;nbsp;Empty ADVAPI32 Procedure List&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Figure 3:&amp;nbsp;&amp;nbsp;Import C Header File&lt;br /&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;/b&gt;&lt;br /&gt;There are many more functions defined in the ADVAPI DLL than we need.&amp;nbsp;&amp;nbsp;To keep the scope of this article focused on only what is needed, we will manually declare only the three functions we will use.&amp;nbsp;&amp;nbsp;They are &lt;b&gt;RegOpenKeyEx&lt;/b&gt;, &lt;b&gt;RegCloseKey&lt;/b&gt;, and &lt;b&gt;RegEnumValue&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;To declare the functions, the process is identical to adding any procedure in ATEasy.&amp;nbsp;&amp;nbsp;Right-click in the empty procedure list and select &lt;b&gt;Insert Procedure Below&lt;/b&gt;.&amp;nbsp;&amp;nbsp;Enter &lt;b&gt;RegOpenKeyEx&lt;/b&gt; and hit enter.&amp;nbsp;&amp;nbsp;Right-click on the &lt;b&gt;RegOpenKeyEx&lt;/b&gt; procedure we just created and select &lt;b&gt;Insert Parameter Below&lt;/b&gt;.&amp;nbsp;&amp;nbsp;Enter &lt;b&gt;hKey&lt;/b&gt; as the parameter name and define the type as &lt;b&gt;Val AHandle&lt;/b&gt;.&amp;nbsp;&amp;nbsp;Hit enter.&amp;nbsp;&amp;nbsp;Continue the same process to add additional parameters "&lt;b&gt;after&lt;/b&gt;" hKey, entering the appropriate name and parameter type as shown in figure 4.&amp;nbsp;&amp;nbsp;Repeat the same process to declare the &lt;b&gt;RegCloseKey&lt;/b&gt; and &lt;b&gt;RegEnumValue&lt;/b&gt; functions.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200354\KB354-04.png" alt="Function list" title="Function list" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4:&amp;nbsp;&amp;nbsp;Function (Procedure) List&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The declared functions and parameters require some additional modifications in order to be used in our example.&amp;nbsp;&amp;nbsp;Refer to Figure 5 for the following.&amp;nbsp;&amp;nbsp;Right-click on the &lt;b&gt;RegOpenKeyEx&lt;/b&gt; function and select &lt;b&gt;Properties&lt;/b&gt;.&amp;nbsp;&amp;nbsp;This will open the Properties page for the selected object.&amp;nbsp;&amp;nbsp;Set each of the functions to &lt;b&gt;Public&lt;/b&gt;, &lt;b&gt;Type Stdcall&lt;/b&gt; and &lt;b&gt;Returns a Long value&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Windows APIs with string parameters have 2 flavors supporting ASCII and Wide/Unicode versions.&amp;nbsp;&amp;nbsp;For the &lt;b&gt;RegOpenKeyEx&lt;/b&gt; and &lt;b&gt;RegEnumValue&lt;/b&gt; we will define an Alias for the ASCII version of the function, &lt;b&gt;RegOpenKeyExA&lt;/b&gt; and &lt;b&gt;RegEnumValueA&lt;/b&gt;, respectively.&lt;br /&gt;&lt;br /&gt;When passing parameters into an ATEasy procedure, you may pass the parameter by reference pointer (Var), or by value (Val).&amp;nbsp;&amp;nbsp;The &lt;b&gt;Optional&lt;/b&gt; modifier defines whether the parameter is required or is optional.&amp;nbsp;&amp;nbsp;For optional Val type parameters, you may also define a default value that the procedure will use if the parameter is omitted.&amp;nbsp;&amp;nbsp;The example in Figure 5 shows that parameter &lt;b&gt;dwSamDesired&lt;/b&gt; is an optional DWord parameter, passed by value, and the default value is 0x20019&lt;sub&gt;16&lt;/sub&gt;&lt;br /&gt;&lt;br /&gt;When complete, the function list and associated parameters should look like those shown in figure 4.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200354\KB354-05.png" alt="Function and Parameter Properties" title="Function and Parameter Properties" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5:&amp;nbsp;&amp;nbsp;Function and Parameter Properties&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Query COM Ports Procedure&lt;/h3&gt;With the registry API functions declared it is now possible to open the registry and query the number and name(s) of the COM ports available to the system.&amp;nbsp;&amp;nbsp;The COM port information is stored in the HKEY_LOCAL_MACHINE registry key, under the HARDWARE\DEVICEMAP\SERIALCOMM subkey.&amp;nbsp;&amp;nbsp;Figure 6 shows an example of Windows &lt;b&gt;RegEdit&lt;/b&gt; application opened to the Serial COM Port subkey.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200354\KB354-06.png" alt="RegEdit" title="RegEdit" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6:&amp;nbsp;&amp;nbsp;Registry Access Using RegEdit&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Use the function &lt;b&gt;RegOpenKeyEx&lt;/b&gt; to open the registry.&amp;nbsp;&amp;nbsp;Parameters for this function include the registry key and subkey, and it returns a handle to the specified subkey.&amp;nbsp;&amp;nbsp;The key HKEY_LOCAL_MACHINE contains information about the local computer system.&amp;nbsp;&amp;nbsp;It is a predefined registry key and its handle is a constant value of 0x80000002&lt;sub&gt;16&lt;/sub&gt;.&amp;nbsp;&amp;nbsp;You can use this value for the &lt;b&gt;RegOpenKeyEx&lt;/b&gt; hKey parameter, or you can define an ATEasy constant variable as part of the ADVAPI link and reference the key by the descriptive variable name instead.&amp;nbsp;&amp;nbsp;Figure 7 shows constant variables for HKEY_LOCAL_MACHINE and several other registry constants.&amp;nbsp;&amp;nbsp;Note that these constant variables are defined in the &lt;b&gt;Constants&lt;/b&gt; submodule under the ADVAPI DLL and are declared as Public.&amp;nbsp;&amp;nbsp;The values for these keys and subkeys can be found in the WinReg.h header file.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200354\KB354-07.png" alt="Registry Constants" title="Registry Constants" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 7:&amp;nbsp;&amp;nbsp;Registry Key/Subkey Constants&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The serial ports are enumerated in the HARDWARE\DEVICEMAP\SERIALCOMM subkey.&amp;nbsp;&amp;nbsp;This parameter is passed as a literal string, but could also be replaced by a constant string variable.&amp;nbsp;&amp;nbsp;Once the key/subkey is open, use &lt;b&gt;RegEnumValue&lt;/b&gt; to return parameters stored there.&amp;nbsp;&amp;nbsp;The function returns one indexed value name for the key each time it is called, until no more entries are available.&amp;nbsp;&amp;nbsp;Checking the status returned indicates whether a valid entry was returned or not.&amp;nbsp;&amp;nbsp;After the last call to the &lt;b&gt;RegEnumValue&lt;/b&gt;, you must close the subkey using &lt;b&gt;RegCloseKey&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;The code in the &lt;b&gt;QueryComPorts()&lt;/b&gt; procedure demonstrates the full process of opening the SERIALCOMM subkey, returning the name for each serial port enumerated in the system, and closing the subkey.&amp;nbsp;&amp;nbsp;Reading the enumerated serial ports is an iterative process returning each port name sequentially until the returned status indicates there are no more entries, up to 100 serial ports.&lt;br /&gt;&lt;br /&gt;The commented Print statements were used for diagnostics during development and were left commented to provide an opportunity to learn more about the operation of these API calls.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200354\KB354-08.png" alt="QueryComPorts() " title="QueryComPorts() " border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 8:&amp;nbsp;&amp;nbsp;QueryComPorts Procedure&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Testing The Registry Access&lt;/h3&gt;The final step to demonstrate the registry query is to call the QueryComPorts() procedure from the Program module.&amp;nbsp;&amp;nbsp;The code calls the procedure and iteratively displays the COM port name for each serial port found in the register using the Append statement.&amp;nbsp;&amp;nbsp;Figure 9 shows the Program code.&amp;nbsp;&amp;nbsp;The full example can be downloaded &lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/Q200354\KB354 Example.zip' target='_blank'&gt;&lt;b&gt;here&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200354\KB354-09.png" alt="Calling Registry API" title="Calling Registry API"s' border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 9:&amp;nbsp;&amp;nbsp;Calling Registry APIs&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;This article demonstrates how to access the Windows Registry using the Windows advapi.dll APIs.&amp;nbsp;&amp;nbsp;We manually declared three APIs to open, read and close a registry key.&amp;nbsp;&amp;nbsp;The Public System procedure &lt;b&gt;QueryComPorts()&lt;/b&gt; was created to perform the register access, which was called from the Program module.&amp;nbsp;&amp;nbsp;The result listed each COM port found in the Registry Key/Subkey HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM, and returns a count of the number of COM port entries found - see Figure 10.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200354\KB354-10.png" alt="COM4 Port Found" title="COM4 Port Found" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 10:&amp;nbsp;&amp;nbsp;One COM Port, COM4 Found&lt;/b&gt;&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200354/Accessing-the-Windows-Registry-using-the-WinReg-h-DLL-API-from-ATEasy</link><pubDate>7/31/2023</pubDate></item><item><title>Appending Multiple Digital Test Patterns to Reduce Test Time - Published on 7/28/2023</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;Digital test programs, especially semiconductor test programs generated from multiple simulation files such as STIL, WGL, VCD, EVCD or ATP normally encompass a large number of test vectors. This number of digital test vectors is compounded by the required number of digital tests. This greatly reduces the overall test throughput as the digital instrument is required to load and reload these digital patterns for each test. The large memory capacity and the direct memory access of the Marvin Test Solutions &lt;a href='https://www.marvintest.com/Product/GX5296' target='_blank'&gt;GX5296&lt;/a&gt; allows these digital test vectors to be loaded once at program load time and directly accessed for each test.&lt;br /&gt;&lt;br /&gt;The following article describes how to streamline a digital application by merging digital test patterns using the provided driver function &lt;b&gt;GtDio6xFileAppend &lt;/b&gt;to generate a single compressed file that can be loaded once at program load time. &lt;br /&gt;&lt;br /&gt;This article assumes that the reader has some basic knowledge of the &lt;a href='https://www.marvintest.com/Product/GX5296' target='_blank'&gt;GX5296&lt;/a&gt; or &lt;a href='https://www.marvintest.com/Product/GX5961' target='_blank'&gt;GX5960 series&lt;/a&gt; of dynamic digital instruments. As the GX5296 uses the GtDio6x driver, this example can also be easily applied to any of the GX5960 series of digital instruments. For a complete example of using this functionality, refer to the GX5296TestsUsingOneFile program included at the end of this article. &lt;/td&gt;&lt;td&gt;[:+[+gx5296+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;The benefits of using the appended file approach are as follows:&lt;br /&gt;&lt;div align='left'&gt;&lt;ul&gt;&lt;li&gt;Provides a group of digital test sequences that can be quickly accessed without reloading the digital file&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Designed to easily run using the appended file or the existing digital files&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Appended file is created in a nondestructive manner that does not change existing files&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Easily sustainable to update and/or add additional test functionality&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Provides a location for a preamble step that runs prior to the test to set up the device under test (DUT) prior to running a test&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Tests can be placed in any order as test identity is located within the appended file&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The Preamble Step&lt;/h3&gt;Often digital tests require some sort of preamble to set up the DUT to a certain state prior to running a test. Each test in an appended file can be described as a block of one or more Steps. The first block of steps is reserved to provide a preamble for DUT setup and a launch point to jump to the desired test (Refer to Figure 1).&lt;br /&gt;&lt;br /&gt;If the timing of the preamble step requires a different timing than the preceding tests, then the timing set used in the preamble step can be programmed to a unique timing set and or Clock Per Vector (CPV) setting.&lt;br /&gt;&lt;br /&gt;If no preamble step is necessary to setup the DUT then the Preamble Step 0 should be at least 10 vectors in length with all used channels set to dynamic and all vectors set to tristate. This can easily be created using Dio6xEasy and saved to a file. The Preamble step used in this example is one step in length.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt; &lt;img src="https://www.MarvinTest.com/images/support/.\\Q200333\\Gx5296 Appended Steps.jpg " alt=" Organizing Merged Files " title=" Organizing Merged Files " border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1 – The Preamble Step and Step Sequencing&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;GtDio6xFileAppend Driver Function&lt;/h3&gt;The &lt;b&gt;GtDio6xFileAppend &lt;/b&gt;function has several options that allow the user to customize appending files as follows. The &lt;b&gt;GtDio6xFileAppend &lt;/b&gt;function is nondestructive, meaning that it will retain the original files while creating a new appended file. Also, the procedure does not require any hardware to run.&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;&lt;b&gt;Parameters&lt;/b&gt;&lt;/th&gt;&lt;th&gt;&lt;b&gt;Comment&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;sFirstFileName&lt;/td&gt;&lt;td&gt;The first or main file name to append to the destination file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;sAppendedFileName&lt;/td&gt;&lt;td&gt;File name to add after the first file to the destination file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;sDestinationFileName&lt;/td&gt;&lt;td&gt;Appended or destination file name&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;dwStartStep&lt;/td&gt;&lt;td&gt;Starting step to append at, use -1 to append at after the last step&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;dwNumberOfStepsToAppend&lt;/td&gt;&lt;td&gt;The number of steps to append, use -1 to append all steps&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;dwVectorOffset&lt;/td&gt;&lt;td&gt;Vector memory offset to begin appending at, use -1 to append after last vector&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;dwNumberOfVectors&lt;/td&gt;&lt;td&gt;The number of vectors to append, use -1 to append all vectors&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;dwFlags&lt;/td&gt;&lt;td&gt;Allows the user to control which sections of the file to append. See flag definition below&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;nStatus&lt;/td&gt;&lt;td&gt;Return status 0 if success negative if failure&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;The dwFlags parameter allows the user to control which sections of the file to append. Each bit represents a section of the file as follows:&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;&lt;b&gt;Flags&lt;/b&gt;&lt;/th&gt;&lt;th&gt;&lt;b&gt;Definition&lt;/b&gt;&lt;/th&gt;&lt;th&gt;&lt;b&gt;Comment&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0x0000&lt;/td&gt;&lt;td&gt;File Append All&lt;/td&gt;&lt;td&gt;Append all, this is the default&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0x0001&lt;/td&gt;&lt;td&gt;Ignore number of channels&lt;/td&gt;&lt;td&gt;Don't error if the number of channels in each file is not equal&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0x0002&lt;/td&gt;&lt;td&gt;Remove Last Step Flag&lt;/td&gt;&lt;td&gt;Removes all last step flags from the appended file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0x0004&lt;/td&gt;&lt;td&gt;Remove first file last Step Flag&lt;/td&gt;&lt;td&gt;Removes all last step flags from the first or main file&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;h3&gt;File Append Procedure&lt;/h3&gt;The &lt;b&gt;GX5296TestsUsingOneFile&lt;/b&gt; ATEasy test program &lt;b&gt;FileAppend&lt;/b&gt; Procedure (shown below) is used to create the appended test file. As previously stated, each merged file is separated by its last step flag. To further identify the location of each test, this procedure marks the first step of each appended test file with its filename (without extension). To simplify programming, this procedure adds the file path and extension (.Dio6x) to each filename string.&amp;nbsp;&amp;nbsp;The the main goal of this procedure is to combine all digital test files into a single file. The default (-1) is used for all &lt;b&gt;GtDio6xFileAppend&lt;/b&gt; options. The dwFlag parameter is set to zero.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure FileAppend (sFirstFile, sAppendedFile, sDestinationFile) : Void&lt;br /&gt;&amp;nbsp;&amp;nbsp;sFirstFile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Val String&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; First file used to apppend&lt;br /&gt;&amp;nbsp;&amp;nbsp;sAppendedFile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Val String&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; File to append to the first&lt;br /&gt;&amp;nbsp;&amp;nbsp;sDestinationFile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Val String&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Appended file destination&lt;br /&gt;&amp;nbsp;&amp;nbsp;StepCount&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Step count of test files&lt;br /&gt;&amp;nbsp;&amp;nbsp;nFileHandle&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;File Handle&lt;br /&gt;&amp;nbsp;&amp;nbsp;sFirst&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Saved base first file name&lt;br /&gt;&amp;nbsp;&amp;nbsp;sAppend&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Saved base Append file name&lt;br /&gt;&amp;nbsp;&amp;nbsp;sDestination&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Saved base Destination file name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Save basic file names to set the step names&lt;br /&gt;&amp;nbsp;&amp;nbsp;sFirst = sFirstFile&lt;br /&gt;&amp;nbsp;&amp;nbsp;sAppend = sAppendedFile&lt;br /&gt;&amp;nbsp;&amp;nbsp;sDestination = sDestinationFile &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Add the file path to each file name files are stored in the directory DioFiles&lt;br /&gt;&amp;nbsp;&amp;nbsp;sFirstFile = GetDir(aGetDirCurrent)+sFirstFile+".dio6x"&lt;br /&gt;&amp;nbsp;&amp;nbsp;sAppendedFile = GetDir(aGetDirCurrent)+sAppendedFile+".dio6x"&lt;br /&gt;&amp;nbsp;&amp;nbsp;sDestinationFile = GetDir(aGetDirCurrent)+sDestinationFile+".dio6x"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Append the files to the destination file&lt;br /&gt;&amp;nbsp;&amp;nbsp;Dio File Append(sFirstFile, sAppendedFile,sDestinationFile,-1,-1 ,-1 ,-1,0)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Open the first file to get the Step size&lt;br /&gt;&amp;nbsp;&amp;nbsp;if sFirst &lt;&gt; sDestination&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Don't mofify existing files&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dio File Open(sFirstFile,adio6xFileOpenModeRead, adio6xFileBoardTypeGx5296)&lt;br /&gt;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dio File Open(sFirstFile,adio6xFileOpenModeReadWrite, adio6xFileBoardTypeGx5296)&lt;br /&gt;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Dio File Get Handle(nFileHandle)&lt;br /&gt;&amp;nbsp;&amp;nbsp;Dio Get Step Count(lStepCount,nFileHandle)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Determine if destination file is already open&lt;br /&gt;&amp;nbsp;&amp;nbsp;if sFirst &lt;&gt; sDestination&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Close first file and open destination&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dio File Close(nFileHandle)	&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dio File Open(sDestinationFile,adio6xFileOpenModeReadWrite,adio6xFileBoardTypeGx5296)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dio File Get Handle(nFileHandle)&lt;br /&gt;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Name the appended step&lt;br /&gt;&amp;nbsp;&amp;nbsp;Dio Set Step Name(lStepCount,sAppend,nFileHandle)&lt;br /&gt;&amp;nbsp;&amp;nbsp;if sFirst &lt;&gt; sDestination&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Name the preamble step&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dio Set Step Name(0,sFirst,nFileHandle)&lt;br /&gt;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;&amp;nbsp;&amp;nbsp;Dio File Close(nFileHandle)&lt;br /&gt;}&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Loading the Appended File from an ATEasy Test Program&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;In order to use the appended file, the programmer must find a method to load the file only once. This is best performed by creating a new driver to place the &lt;b&gt;FileAppend &lt;/b&gt; procedures and other routines. The load file command used to load the appended file could then be placed in the driver's &lt;b&gt;OnInitProgram &lt;/b&gt;event. The advantage of using a separate driver to load the file is that it will be loaded prior to the start of the main program and therefore will not affect the test time. To simplify this example, the appended file is loaded on the first run of a DUT. This means that the test time of the first DUT test run will be increased by the load time of the appended file. The test time of all other runs will be unaffected. &lt;br /&gt;&lt;br /&gt;In either case, two system level global variables are required to use appended files in a program. The first is a flag to determine the appended file load state, and the second is an array of structures that contains each appended file name, location and T0 Clock. A program local variable &lt;b&gt;bUseAppendFile&lt;/b&gt; is used to allow the programmer to easily switch from using the appended file to using the original digital files.&amp;nbsp;&amp;nbsp;Recall that the &lt;b&gt;FileAppend&lt;/b&gt; function is nondestructive and therefore the original files remain unchanged. When using an appended digital file, the user must be careful not to use any DIO reset commands after loading the file.&lt;/td&gt;&lt;td&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;The ATEasy program &lt;b&gt;OnInit &lt;/b&gt; event contains the code to selectively load the appended file. The user only needs to change the &lt;b&gt;bUseAppendFile &lt;/b&gt;variable to &lt;b&gt;False &lt;/b&gt; to switch modes and bypass loading the appended file and use the original digital files. When the appended file is enabled, the &lt;b&gt;PrepareDioFile&lt;/b&gt; procedure determines if the appended file needs to be created. If no appended file exists, the program will create the appended file as shown.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure PrepareDioFile(sAppendFileName, nTotalTests, asTestNames): Void&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;	sAppendFileName: Val String&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Name of appended file&lt;br /&gt;	nTotalTests: Val Short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! Number of tests to append&lt;br /&gt;	asTestNames: Val String[]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! List of file names to append&lt;br /&gt;	nCntr: Short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! Counter&lt;br /&gt;	pstFileStatus: structFileStatus! Get file status structure&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; !Create the appended file if it does not exist&lt;br /&gt;&amp;nbsp;&amp;nbsp; sAppendFileName=GetDir(aGetDirCurrent)+"\\"+sAppendFileName+".dio6x"&lt;br /&gt;&amp;nbsp;&amp;nbsp; if FileGetStatus(sAppendFileName,pstFileStatus) &lt;&gt; True&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Append Preamble to first Scan test and create the appended file&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asTestNames[0]=GetDir(aGetDirCurrent)+asTestNames[0]+".dio6x"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asTestNames[1]=GetDir(aGetDirCurrent)+asTestNames[1]+".dio6x"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileAppend(asTestNames[0],asTestNames[1],sAppendFileName)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For nCntr=2 to nTotalTests-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Append all other test files to the appended file&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asTestNames[nCntr]=GetDir(aGetDirCurrent)+asTestNames[nCntr]+".dio6x"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileAppend(sAppendFileName,asTestNames[nCntr],sAppendFileName)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; next&lt;br /&gt;&amp;nbsp;&amp;nbsp; endif&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;/div&gt;Once the appended file has been loaded, the last step flag of the Preamble step is set to False. This is required, as a Jump instruction cannot be placed on a last step. The procedure &lt;b&gt;GetAllStartingStepInfo &lt;/b&gt;gets the location of each named step from the passed &lt;b&gt;asTestList &lt;/b&gt;variable array and sets test name, step address and T0 clock information for each test name. An error will occur if the test name is not found. The test name is not case sensitive. For more information regarding the &lt;b&gt;GetAllStartingStepInfo &lt;/b&gt;procedure refer to the GX5296TestsUsingOneFile example.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure OnInit(): Void Public! Occurs when a program has started.&lt;br /&gt;&amp;nbsp;&amp;nbsp;sFileName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Filename of appended string&lt;br /&gt;&amp;nbsp;&amp;nbsp;nTotalTests&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Total number of test in appended file&lt;br /&gt;&amp;nbsp;&amp;nbsp;asTestList&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String[1]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Array of test names in appended file&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Log Total test time in OnEnd event&lt;br /&gt;&amp;nbsp;&amp;nbsp;dTstTimer=Tick()&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Set to false to use original digital files&lt;br /&gt;&amp;nbsp;&amp;nbsp;bUseAppendFile=True&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Set the name of the append file&lt;br /&gt;&amp;nbsp;&amp;nbsp;sFileName="GX5296TestsUsingOneFile"&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Set the total tests in appended file including preamble step&lt;br /&gt;&amp;nbsp;&amp;nbsp;nTotalTests=3&lt;br /&gt;&amp;nbsp;&amp;nbsp;!List all test names, &lt;br /&gt;&amp;nbsp;&amp;nbsp;redim asTestList[nTotalTests]&lt;br /&gt;&amp;nbsp;&amp;nbsp;asTestList = {"GX5296TestsUsingOneFilePreamble","GX5296TestsUsingOneFileScan1",\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"GX5296TestsUsingOneFileScan2,GX5296TestsUsingOneFileScan3"} &lt;br /&gt;&amp;nbsp;&amp;nbsp;!Load appended file if enabled and not loaded&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (bUseAppendFile=True) AND (m_bAppendFileLoaded&lt;&gt;True)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Create appended file if necessary&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrepareDioFile(sFileName,nTotalTests,asTestList)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Add file path and extention	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sFileName=GetDir(aGetDirCurrent)+sFileName+".dio6x"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Load the Appended file&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dio File Load(sFileName,0,0,0,0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!The preamble step cannot have its last step flag set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dio Set Step Last(0,False)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Creates the m_aStep array of starting steps and clocks&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetAllStartingStepInfo(nTotalTests,asTestList)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Prevent the file from being reloaded&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_bAppendFileLoaded=True&lt;br /&gt;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;GtDio6xFileLoad Driver Function Flags&lt;/h3&gt;The &lt;b&gt;GtDio6xFileLoad&lt;/b&gt;(nHandle, pszFileName, dwFileStartStepOrVector, dwStartStepOrVector, dwNumOfStepsOrVectors, dwFlags, pnStatus) function provides a simple method to load only the portions of the digital file that are required to run a test. The definitions of the dwFlags are as follows:&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;&lt;b&gt;Flag&lt;/b&gt;&lt;/th&gt;&lt;th&gt;&lt;b&gt;Definition&lt;/b&gt;&lt;/th&gt;&lt;th&gt;&lt;b&gt;Comment&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0x0000&lt;/td&gt;&lt;td&gt;File Load All&lt;/td&gt;&lt;td&gt;Load the complete file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0x0001&lt;/td&gt;&lt;td&gt;File Load Vectors&lt;/td&gt;&lt;td&gt;Load the file Vector memory&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0x0002&lt;/td&gt;&lt;td&gt;File Load Record&lt;/td&gt;&lt;td&gt;Load the Record memory &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0x0004&lt;/td&gt;&lt;td&gt;File Load Channel Settings&lt;/td&gt;&lt;td&gt;Load the Channel settings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0x0008&lt;/td&gt;&lt;td&gt;File Load Step Settings&lt;/td&gt;&lt;td&gt;Load the step settings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0x0010&lt;/td&gt;&lt;td&gt;File Load Timing Settings&lt;/td&gt;&lt;td&gt;Load the timing setting&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0x0020&lt;/td&gt;&lt;td&gt;File Load General Settings&lt;/td&gt;&lt;td&gt;Load the General settings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0x0040&lt;/td&gt;&lt;td&gt;File Load Disable Unused Channels&lt;/td&gt;&lt;td&gt;Unused channels will be set to disabled&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0x0080&lt;/td&gt;&lt;td&gt;File Load Reset Domain&lt;/td&gt;&lt;td&gt;Reset Domain performed prior to load&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0x0100&lt;/td&gt;&lt;td&gt;File Load Reset Unused Channels Data&lt;/td&gt;&lt;td&gt;Vector memory of Unused channels will be 'Z'&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0x1000&lt;/td&gt;&lt;td&gt;File Load File Load Range Of Vectors&lt;/td&gt;&lt;td&gt; Load a range of vectors specified StartStep and NumSepsOrVectors&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Using the Appended Files in a ATEasy Test Program&lt;/h3&gt;A typical test program normally contain some sort of shorts and opens testing, some digital only tests and maybe some mixed digital/analog tests. As the shorts and opens test alone changes the channel mode of the DIO, clearly the channel state of the DIO must be restored prior to any digital testing. Also the timing of one or more of the appended files may need to be changed to restore the DIO to the same state as the original file. If the test requirements do not require any changes in the channel settings, sequencer or the timing, then the file load step can be omitted since the digital resources would already be loaded. This example assumes that the channel timing and general settings would need to be reloaded for each test run. &lt;br /&gt;&lt;br /&gt;The System Global flag &lt;b&gt;bUseAppendFile&lt;/b&gt; determines if the test will use the original or appended file. When using the appended file, the same load file command is executed with the flags set to only load the Channel, Timing and General settings. The program also calls the procedure &lt;b&gt;GetStartingStepInfo &lt;/b&gt;to get the clock and starting step for the test. Recall that during the appended file load, the last step flag of the last preamble step is cleared. &lt;br /&gt;&lt;br /&gt;To match the timing of each test, the &lt;b&gt;GtDio6xSetClock&lt;/b&gt; function sets the T0 clock and CPV of the preamble step (Step 0) to match the test file. The test file is then load with the indicated flags. &lt;br /&gt;&lt;br /&gt;Unless the start address precedes the Preamble step address, the starting step is programmed as a jump location on the preamble last step (Refer back to Figure 1).&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;RunBurst&lt;/b&gt; procedure simply executes the digital burst and waits for its completion with a programmed timeout. When the burst has been completed, the Real Time Compare error counter of each board is queried and the total number of failures is reported. For more information regarding the &lt;b&gt;GetStartingStepInfo&lt;/b&gt; and the &lt;b&gt;RunBurst&lt;/b&gt; procedures, refer to the GX5296TestsUsingOneFile example. &lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure RunDigitalTest(sfileName): Void&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Runs test sequence from test or appended file&lt;br /&gt;&amp;nbsp;&amp;nbsp;sfileName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Var String&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Input File Name&lt;br /&gt;&amp;nbsp;&amp;nbsp;dClock&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Double&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;T0 Clock from test file&lt;br /&gt;&amp;nbsp;&amp;nbsp;lCpv&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Clocks Per Vector from append file&lt;br /&gt;&amp;nbsp;&amp;nbsp;lErrorAddressCount&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTC Error Address count per board&lt;br /&gt;&amp;nbsp;&amp;nbsp;lFailures&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTC Fail count per board&lt;br /&gt;&amp;nbsp;&amp;nbsp;lStartStep&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Starting step of test in appended file &lt;br /&gt;&amp;nbsp;&amp;nbsp;lTotFailures&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTC Totlal Failures found&lt;br /&gt;&amp;nbsp;&amp;nbsp;nBrdCnt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Number of found boards&lt;br /&gt;&amp;nbsp;&amp;nbsp;nCntr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Board counter&lt;br /&gt;&amp;nbsp;&amp;nbsp;nFileLoadFlags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flags used to load file&lt;br /&gt;&amp;nbsp;&amp;nbsp;nHandle&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Handle of each board to get RTC data&lt;br /&gt;&amp;nbsp;&amp;nbsp;sTestFile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Modified file name with path and extention&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;sTestFile = GetDir(aGetDirCurrent)+sfileName+".dio6x"&lt;br /&gt;&amp;nbsp;&amp;nbsp;if bUseAppendFile = True&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Get the Preamble step CPV value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dio Get Step Clock(0,dClock, lCpv)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Search appended file for the test name and get the starting Step and Clock&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetStartingStepInfo(sFileName,lStartStep,dClock)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Set the preamble step to dClock&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dio Set Step Clock(0,dClock, lCpv)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Only Load Channel, Timing and General Settings&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nFileLoadFlags = 0x20+0x10+0x4 &lt;br /&gt;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nFileLoadFlags = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;Dio File Load(sTestFile,0,0,0,nFileLoadFlags)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;if bUseAppendFile = True&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Set Jump address for burst&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if lStartStep=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Remove any Step 0 jump command&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dio Set Step Control(0,adio6xControlActionNone, lStartStep, \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;adio6xControlConditionUnconditional, 1,0,0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else			&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Set the jump command	&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dio Set Step Control(0,adio6xControlActionJump, lStartStep, \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;adio6xControlConditionUnconditional, 1,0,0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Run the digital burst and wait for completion with timeout&lt;br /&gt;&amp;nbsp;&amp;nbsp;RunBurst()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Get the total number of boards in the domain&lt;br /&gt;&amp;nbsp;&amp;nbsp;Dio Get Board Count(nBrdCnt)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Find the total error count of all boards in domain&lt;br /&gt;&amp;nbsp;&amp;nbsp;nCntr=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;lTotFailures=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;repeat&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if nCntr=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dio Get MasterHandle(nHandle)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dio Get SlaveHandle(1,nCntr,nHandle)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Get board Error Count&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dio Get RealTimeCompare ErrorCount(lErrorAddressCount,lFailures,nHandle)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lTotFailures = lTotFailures+lFailures&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nCntr=nCntr+1&lt;br /&gt;&amp;nbsp;&amp;nbsp;until nCntr=nBrdCnt&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;TestResult = lTotFailures&lt;br /&gt;&amp;nbsp;&amp;nbsp;Test.Type=atestTypePrecise&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Expected value&lt;br /&gt;&amp;nbsp;&amp;nbsp;Test.Value=0&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Calling Digital Tests&lt;/h3&gt;The ATEasy test program includes three examples of &lt;b&gt;SCAN&lt;/b&gt; files generated using provided &lt;b&gt;STL&lt;/b&gt; files and converted using &lt;b&gt;Dio6xFIT&lt;/b&gt;. For an example of file conversion see &lt;a href='https://www.marvintest.com/KB/Q200330/Translating-STIL-WGL-VCD-EVCD-and-Teradyne-ATP-files-to-DIO-DIO6x-Files' target='_blank'&gt;Knowledge Base article #200330&lt;/a&gt;. The calls to the following tests assume that DUT power has already been applied to the unit. The Test Type used for these tests is Precise and the expected value is 0, for zero errors for a pass condition. Recall that the &lt;b&gt;RunDigitalTest&lt;/b&gt; procedure shown above sets the &lt;b&gt;TestResult&lt;/b&gt; variable to the total number of Real Time Compare errors found.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Test 1.1 : "Scan Test 1"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;Id = Test3&lt;br /&gt;&amp;nbsp;&amp;nbsp;Type = Precise&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Execute Scan chain 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;RunDigitalTest("GX5296TestsUsingOneFileScan1")&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Test 1.2 : "Scan Test 2"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;Id = Test7&lt;br /&gt;&amp;nbsp;&amp;nbsp;Type = MinMax&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Execute Scan chain 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;RunDigitalTest("GX5296TestsUsingOneFileScan2")&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Test 1.3 : "Scan Test 3"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;Id = Test6&lt;br /&gt;&amp;nbsp;&amp;nbsp;Type = MinMax&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Execute Scan chain 3&lt;br /&gt;&amp;nbsp;&amp;nbsp;RunDigitalTest("GX5296TestsUsingOneFileScan3")&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;GX5296 File Append Example&lt;/h3&gt;The following is a link to the &lt;b&gt;GX5296TestsUsingOneFile.Zip&lt;/b&gt; ATEasy test program. Download this file and extract the files onto your hard drive. The contents of the compressed ZIP file are as follows:&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;&lt;b&gt;Gx5296 Append Example Files&lt;/b&gt;&lt;/th&gt;&lt;th&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;GX5296TestsUsingOneFile.wsp&lt;/td&gt;&lt;td&gt;ATEasy Workspace file&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;GX5296TestsUsingOneFile.prg&lt;/td&gt;&lt;td&gt;ATEasy Program file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;GX5296TestsUsingOneFile.sys&lt;/td&gt;&lt;td&gt;ATEasy System file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;GX5296TestsUsingOneFile.prj&lt;/td&gt;&lt;td&gt;ATEasy Project file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;GX5296TestsUsingOneFileScan1.dio6x&lt;/td&gt;&lt;td&gt;Scan Test 1 digital file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;GX5296TestsUsingOneFileScan2.dio6x&lt;/td&gt;&lt;td&gt;Scan Test 2 digital file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;GX5296TestsUsingOneFileScan3.dio6x&lt;/td&gt;&lt;td&gt;Scan Test 1 digital file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;GX5296TestsUsingOneFilePreamble.dio6x&lt;/td&gt;&lt;td&gt;Preamble digital file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;GX5296TestsUsingOneFile.dio6x&lt;/td&gt;&lt;td&gt;Appended Test file&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/\Q200333\GX5296TestsUsingOneFile.zip' target='_blank'&gt;GX5296TestsUsingOneFile.zip&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200333/Appending-Multiple-Digital-Test-Patterns-to-Reduce-Test-Time</link><pubDate>7/28/2023</pubDate></item><item><title>Installing, Upgrading and Acquiring ATEasy Software Licenses - Published on 6/1/2023</title><description>The ATEasy® Test Executive And Development Studio provides several types of licenses to end users. This article will focus on installing or upgrading a&amp;nbsp;&amp;nbsp;&lt;b&gt;Single License&lt;/b&gt;, or installing or extending the &lt;b&gt;30-Day Trial License&lt;/b&gt;. Article was updated to ATEasy 10 156d to include Online activation.&lt;br /&gt;&lt;br /&gt;ATEasy includes one 30-day license which can be used after first running the installation. During the 30-day license, ATEasy is fully functional with minimal limitation (the ability to create executables). After the 30-day license has expired, ATEasy will no longer be functional. A single software license or a 30-day license extension must be installed in order to continue using ATEasy. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Using the 30-days Trial/Evaluation License&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Start ATEasy&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;If no license is currently installed, ATEasy will automatically bring up the &lt;b&gt;License Setup dialog box&lt;/b&gt; when first started. The 30-day license can be selected.&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200256\LicenseSetup30Day.PNG" alt="ATEasy Trial 30 day License" title="ATEasy Trial 30 day License" border='0' &gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;If a license is currently installed (such as a 30 day license) and you need to extend the trial period or upgrade to a newer ATEasy version, then go to the Help File Menu and click on &lt;b&gt;About ATEasy...&lt;/b&gt;. Proceed to the offline activation to request a 30 days extension trial license.&lt;/li&gt;&lt;/ul&gt; &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Opening the License Setup Dialog&lt;/h3&gt;The dialog is automatically opened when you start ATEasy with no license installed, or from the Tools, About ATEasy menu when you click on &lt;b&gt; Set License&lt;/b&gt; button as shown here.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200256\ATEasyAbout.PNG" alt="ATEasy About Dialog" title="ATEasy About Dialog" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Installation of a single software license using Online Activation&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Open the License Setup dialog&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select &lt;b&gt;Activate License Online&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Enter your marvintest.com account information: &lt;b&gt;email&lt;/b&gt; and &lt;b&gt;password &lt;/b&gt;and the ATEasy &lt;b&gt;Serial Number&lt;/b&gt; (displayed on your Sales Order or product DVD&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200256\LicenseOnlineActivation.jpg" alt="ATEasy License Online Activation" title="ATEasy License Online Activation" border='0' &gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Click &lt;b&gt;OK&lt;/b&gt; to Activate. Note: the client must have access to https://www.marvintest.com/* at all time on order to operate correctly.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Installation of a Single Software License Using Offline Activation&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Open the License Setup dialog&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select &lt;b&gt;Install Single License&lt;/b&gt;, Retrieve the 10 character &lt;b&gt;ATEasy Computer ID&lt;/b&gt;. &lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200256\LicenseSetup.PNG" alt="ATEasy License Setup" title="ATEasy License Setup" border='0' &gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Go to &lt;a href='https://www.marvintest.com/magic' target='_blank'&gt;https://www.marvintest.com/magic&lt;/a&gt;&amp;nbsp;&amp;nbsp; and create a M@GIC incident to request the License String. If you need a 30-day extension license, include this request in the M@GIC incident post. Include the &lt;b&gt;ATEasy Computer ID&lt;/b&gt; and your &lt;b&gt;ATEasy Serial Number&lt;/b&gt; (printed on your Sale Order or CD) in the incident. A M@GIC account must be created before an incident can be created.&lt;br /&gt;&lt;br /&gt;The same process can be done If you need an &lt;b&gt;upgrade &lt;/b&gt; to your current license, for example a license to upgrade from ATEasy version 8 to 9. The upgrade license is normally displayed under your M@GIC account under the licensing tab (so no incident needs to be created - just install the new version and type in the license displayed in M@GIC); however, if you can't see the license in your M@GIC account you will need to create an incident and request it.&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200256\ATEasyMagic.PNG" alt="Marvin Test Solutions MAGIC" title="Marvin Test Solutions MAGIC" border='0' &gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Fill in the &lt;b&gt;Licensed To&lt;/b&gt; and &lt;b&gt;Organization&lt;/b&gt; fields with your name and company name.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Enter the License String received in the MAGIC incident into the &lt;b&gt;License String/File&lt;/b&gt; field and click OK.&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200256\LicenseSetupString.PNG" alt="ATEasy License String" title="ATEasy License String" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Note : &lt;/b&gt; The same offline activation process described above can be used when installing a single software license for other Marvin Test Solutions products such as &lt;b&gt;CalEasy&lt;/b&gt;, &lt;b&gt;WaveEasy&lt;/b&gt;, and &lt;b&gt;GTDIO-FIT&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;See Also&lt;/h3&gt;&lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=26' target='_blank'&gt;ATEasy Licensing Q&amp;A&lt;/a&gt;. &lt;br /&gt;&lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=60' target='_blank'&gt;Terminate an ATEasy software License&lt;/a&gt;. &lt;br /&gt;&lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=64' target='_blank'&gt;Installing and Using ATEasy Network License&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200256/Installing-Upgrading-and-Acquiring-ATEasy-Software-Licenses</link><pubDate>6/1/2023</pubDate></item><item><title>Understanding Switching Used in Automated Test Equipment - Published on 5/10/2023</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;The switching employed in Automated Test Equipment (ATE) can be as complex as any other component of a test system. The ultimate specifications of the test system directly depend on the integrity of the switching used. In order to design an ATE system the designer must understand the best components to design a switching system capable to perform the required tests. The following article describes typical switching components used in today's modern test systems. For more information about PXI products, services and support options visit our web site at &lt;a href='http://www.marvintest.com' target='_blank'&gt;http://www.marvintest.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Basic Test System&lt;/h3&gt;To test a device, component, or subassembly effectively, a test system must set up prescribed input conditions and monitor its responses. Testing generally means applying a stimulus to a unit under test and checking the response, as shown in Figure 1:&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\SimpleTestSystem.png" alt="Simple Test System Block Diagram" title="Simple Test System Block Diagram" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1: A Simple Test System&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Almost all stimulus and response signals are electrical, but they could be non-electrical, such as heat, light, or motion. Non-electrical signals are usually converted to, or from, electrical signals to permit computer control or data analysis. Electrical signals are measured, or sourced, by the following common test instruments:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Measure - Oscilloscope, voltmeter, frequency counter, spectrum analyzer, waveform analyzer&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Source - Power supply, current source, pattern generator, pulse generator, frequency synthesizer&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Source/Measure - Ohmmeter, capacitance meter, network analyzer, signature analyzer&lt;/li&gt;&lt;/ul&gt;Measure and source functions can be combined in the same instrument and even in the same leads, for example, an Ohmmeter that measures voltage and source current on two leads. In basic test systems, the source and measure instruments are connected to the unit under test (UUT) by direct interface wiring. A better test system makes these connections via switching. The purpose of employing a switching system is to:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Test several UUTs during one test session&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Test multiple points on a UUT&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Connect many measure or source instruments&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The various configurations are shown in Figures 2 - 4. These basic configurations may be combined to form systems that are more complex. In most systems, it is best to measure the output of the source instruments directly. This feature may require additional switching.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\MultipleTestPoints.png" alt="Multiple Test Points" title="Multiple Test Points" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2: Multiple Test Points&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\MultipleInstruments.png" alt="Multiple Instruments" title="Multiple Instruments" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3: Multiple Instruments&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\MultipleUUTs.png" alt="Multiple UUTs" title="Multiple UUTs" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4: Multiple UUTs&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Switch Types&lt;/h3&gt;When designing the switching portion of a given test system, it is important to define the configuration and implementation of the individual switches that connect the instrumentation to the unit under test (UUT). There are three terms used to describe switch configurations:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Number of poles (e.g., single/double/triple pole) &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Single/double throw &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Contact form &lt;/li&gt;&lt;/ul&gt;The term "pole" refers to the number of common terminals contained within a given switch. Figure 5A shows a single-pole switch in the open position. The term "throw" refers to the number of positions in which the switch may be placed that create a signal path or connection. A complete description of Figure 5A is single-pole, single-throw, normally open (SPST-NO).&lt;br /&gt;&lt;br /&gt;Figure 5B shows a single-pole, double-throw (SPDT) switch. One terminal is normally open (NO) and the other is normally closed (NC). The third terminal is the common terminal such that only one terminal can be connected, depending on the state of the switch. A complete description of Figure 5B is single-pole, double-throw (SPDT).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\SinglePoleSwitching.png" alt="Single Pole Switch " title="Single Pole Switch " border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5:&amp;nbsp;&amp;nbsp;Single Pole Switch&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Figure 6 shows a double-pole, double-throw (DPDT) switch. Both poles are actuated simultaneously when the relay is energized.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\DoublePoleSwitching.png" alt="Double Pole Switch " title="Double Pole Switch " border='0' &gt;&lt;br /&gt; &lt;b&gt;Figure 6:&amp;nbsp;&amp;nbsp;Double Pole Switch&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;The “form”, or “contact form”, is a term used by relay manufacturers to describe the contact configuration of a relay. “Form A” refers to a single-throw, normally open switch. “Form B” refers to a single-throw,&amp;nbsp;&amp;nbsp;normally closed switch, and “Form C” indicates a double-throw switch. An alternate designation for a double-throw switch is a Change Over (CO). Using this nomenclature scheme, virtually any contact configuration may be described. &lt;br /&gt;&lt;br /&gt; &lt;h3&gt;Automated Test Systems&lt;/h3&gt;Simple semi-automated test systems have been designed in the past using the required instrumentation as part of a test fixture. This type of test system is normally designed to test a single module or circuit card. Any automation for this type of system uses the built-in capability of the instruments to run the required tests. The test results for these types of systems are manually recorded on a data sheet. The switching included in this type of system is manual and the test fixtures are usually built in-house.&lt;br /&gt; &lt;br /&gt;As the need for testing increases or as test requirements become more complex, a computer controlled test system is usually the best choice. Advantages to automated test systems include:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;As operator intervention is less, there are fewer chances for test errors&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Test results are more often more accurate and more consistent&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Data can be more effectively analyzed since they are compiled into a database&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Complex calculations are possible&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Throughput of units under test is higher&lt;/li&gt;&lt;/ul&gt;When automating the test system, switching functions must also be automated. In systems where the signals are electrical, a programmable instrument called a scanner, matrix, programmable switch, multiplexer, or switching network is employed.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Designing Automated Test Systems&lt;/h3&gt;Designing switching systems for an automated test system requires knowledge of the input/output signals to be switched and the test routine to perform the test. Automated test systems are usually designed with the flexibility to handle a variety of signals because test requirements change frequently.&lt;br /&gt;&lt;br /&gt;The first step in designing a test system is to produce a Test Requirements Document (TRD), which outlines the system configuration and switching needs. Given that versatility is of utmost importance, designing the switching function may be one of the most difficult parts. To help design a switching system, one of the following switching topologies may be used, alone or in combinations. Figure 7 shows the basic topology.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\SwitchTopologyBlockDiagram.png" alt="Switch Topology Block Diagram" title="Switch Topology Block Diagram" border='0' &gt;&lt;br /&gt; &lt;b&gt;Figure 7: Switch Topology Block Diagram&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Basic Switch Topology&lt;/h3&gt;This basic switch topology connects one input to one output. It is generally used in control applications to:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Connect a UUT to a load&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Connect a power supply or control signal to the UUT separate from other source-measure-interface circuitry&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Initiate an independent element of the system, for example, a device with non-electrical input or output, such as a motor or transducer&lt;/li&gt;&lt;/ul&gt;Marvin Test Solutions' GX6315 provides 3x15 independent single-pole, double-throw (SPDT) relays that may be used for power switching in the basic switch topology. The GX6338 provides 3x38 independent single-pole, single-throw (SPST) relays that may be used for low current switching in the basic switch topology. For more information about the SPDT and SPST configurations, refer to the section on “Switch Types”.&lt;br /&gt;&lt;br /&gt; &lt;h3&gt;Multiplex or Scan Topology&lt;/h3&gt;The multiplex or scan topology is used to connect one instrument to multiple UUTs or multiple instruments to a single UUT. The connections can be sequential (such as scan in Figure 8) or non-sequential (such as multiplex in Figure 9). In addition, multiplexing permits more than one simultaneous connection - for example, routing the UUT output to an AC voltmeter and to a frequency counter.&lt;br /&gt;&lt;br /&gt;The 1:X configuration is sometimes used to connect a source to many points or a single point to many measure instruments. The X:1 configuration is used to connect several sources to a single point or many points to a single instrument. To synchronize source and measurement connections, a 1:X/X:1 pair can be switched together.&lt;br /&gt;&lt;br /&gt;As shown in Figure 8, the scan topology is equivalent to a rotary selector switch. With this type of topology, there are two common versions:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Make-Before-Break, which makes the new connection before breaking the existing connection&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Break-Before-Make, which breaks the existing connection before making the new connection&lt;/li&gt;&lt;/ul&gt;Either of these types can be implemented in a test system. Unless otherwise indicated, the non-shorting type is assumed.&lt;br /&gt;&lt;br /&gt; &lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\ScanTopology.png" alt="Scan Topology" title="Scan Topology" border='0' &gt;&lt;br /&gt; &lt;b&gt;Figure 8: Scan Topology&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Marvin Test Solutions' GX6264 is Multiplexer/Scanner that can be used for the scan topology. All products are of the Break-Before-Make version, although it is possible to switch multiple points simultaneously using different Scan Groups.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\MultiplexTopologyDiagram.png" alt=" Multiplex Topology Diagram " title=" Multiplex Topology Diagram " border='0' &gt;&lt;br /&gt; &lt;b&gt;Figure 9: Multiplex Topology Diagram&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Switch Matrix Topology&lt;/h3&gt;The switch matrix topology connects multiple inputs to multiple outputs. With this configuration, multiple instruments are often connected to multiple points on a UUT. Though the switch matrix topology is the most complex, it certainly is the most versatile. Figure 10 illustrates the switch matrix topology in simple terms.&lt;br /&gt;&lt;br /&gt;The switch matrix topology provides the most flexible switching method. However, the following issues must be addressed when using a switch matrix: stubs (unused relays) may generate electrical noise if the frequency is above 10 MHz. If you are using a switch matrix to switch high frequency signals, use the "cleaner" switch paths with shorter stubs. For example, the bottom-left switch shown in Figure 10 is the “cleanest” path since it has the shortest stubs. The top-right switch in the same figure is the “noisiest” path as it has the longest stubs.&lt;br /&gt;&lt;br /&gt;The flexibility provided by the switch matrix means that any point could be connected to any other point. Extreme care should be taken when developing the control software to prevent shorts between low impedance sources (such as power supplies). A typical method to prevent such shorts is to use a resistor in series between the power supplies and the switch matrix if these signals are for measurement purposes only.&lt;br /&gt; &lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\SwitchMatrixTopologyDiagram.png" alt="Switch Matrix Topology Diagram" title="Switch Matrix Topology Diagram" border='0' &gt;&lt;br /&gt; &lt;b&gt;Figure 10: Switch Matrix Topology Diagram&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Marvin Test Solutions' GX6616 is a true switch matrix that can be used when the switch matrix topology is selected. This product has 6 groups of 2x16 and offers multiple configurations from 2x96 to 6x16 (any of the 6 points may be connected to any of the 16 points).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Switching Instrument Criteria&lt;/h3&gt;Every time a signal passes through a connecting cable or switch point, errors may be introduced. It is important to select the correct switching elements and proper topology carefully in order to maintain the integrity of the signal.&lt;br /&gt;&lt;br /&gt;Newer switching elements come very close to the ideal switch. The ideal switch is:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;An open circuit (zero capacitance, infinite ohms) when open&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A short circuit when closed (zero ohms)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Completely isolated from the other switches&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A discrete channel completely isolated from the others&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;All of these factors are critical in high accuracy and low level signal applications. In many systems, different types of switches must be included to balance the technical and economic limitations. &lt;br /&gt;&lt;br /&gt;The following is a list of important factors when choosing a switching instrument:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Cost&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Cost of expansion/adding more boards&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Switching topologies available&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Minimum/maximum number of switch points&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Variety of switching elements available&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Electrical specifications&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Ability to upgrade as the system requirements change&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Switching System Topologies&lt;/h3&gt;In a typical Automated Test System one or all of the three switching topologies can exist: Switch, Scanner/Multiplexer, and/or a Switch Matrix. These various topologies with some additional specialized information are shown below. The various switching topologies can be combined to meet the requirements of the test system.&lt;br /&gt;&lt;br /&gt;As illustrated in block diagram form, the basic switch topology connects one input to one output. This input can be one or more signal lines, connected through Form A, B, or C switching elements. One pole is required for each signal line, with all poles controlled together. Figure 11 shows an example using each switch topology.&lt;br /&gt; &lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\SwitchTopology.png" alt="Switch Topology" title="Switch Topology" border='0' &gt;&lt;br /&gt; &lt;b&gt;Figure 11:&amp;nbsp;&amp;nbsp;Basic Switch Topology (Form A, B, C)&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Typical applications for this switch topology are power and control applications. Because each switch is independent and isolated, more than one switch can be closed at the same time.&lt;br /&gt;&lt;br /&gt;Hardware that implements the basic switch topology often provides the flexibility to select Form A, B, or C switching and the number of poles controlled together. If the test system designer is willing to do external wiring, then any topology can be built from the basic switch topology.&lt;br /&gt;&lt;br /&gt;The Marvin Test Solutions GX6315 can be used to perform all switching functions shown in Figure 11. As this product contains 45 individually controlled high current single-pole double-throw (SPDT) form C relays with a contact rating of 7A per channel it is an ideal candidate for power supply switching. The COM and NO poles of the relay will be used in the first example, the COM and NC poles will be used in the second, and two relays (COM, NO, and NC) will be used in the third.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Scanner/Multiplexer Topologies&lt;/h3&gt;Most scanner and multiplexer topologies connect one input to “n” outputs or “n” inputs to one output. These are the most commonly used topologies in signal switching for small systems. The simplest scanner is a Form C contact as shown in Figure 12A, switching a supply to either of two loads. Implementing this with two Form A contacts creates a simple multiplexer. The supply can now be connected to either one or both loads as seen in Figure 12B.&lt;br /&gt;&lt;br /&gt;The major advantages of multiplexing over scanning are:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Multiplexing permits an all-open state&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Multiplexing permits any order; scanning is sequential&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Multiplexing allows simultaneous connections; scanning does not&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\BasicScannerMultiplexer.png" alt="Basic Scanner Multiplexer" title="Basic Scanner Multiplexer" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 12:&amp;nbsp;&amp;nbsp;Basic Scanner Multiplexer&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The multiplexing method is the most used because it provides the most flexibility. In addition, sequencing of multiplex connections can be programmed in any order. Scanning is most often used in stand-alone systems without computer control. When designing a multiplex test system, the designer must consider the consequences of simultaneous connections in the system in case of software error or hardware failure (stuck relay). Various strategies can be used to handle this, from reconfiguring the switching or adding protection circuitry to adding software checks in the test program.&lt;br /&gt;&lt;br /&gt;Multiplexing and scanning are used in a test system to connect one instrument to multiple UUTs or multiple instruments to one UUT. Sample configurations are shown in Figures 13 and 14. Figure 13 shows 2-pole multiplexing of high and low connections to the UUT. The same hardware can be used as both the 1:N and N:1 blocks. Figure 14 shows a ground-referenced system with 1-pole switching. Two additional multiplexers are used to connect the same instruments to a second UUT.&lt;br /&gt;&lt;br /&gt;Marvin Test Solutions' GX6264, GX6315, and GX6338 may be used in the examples shown in Figures 12, 13 and 14. The GX6264 offers programmable configuration of differential (2 wire) and single-ended (one wire).&lt;br /&gt; &lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\TwoPoleMultiplexing.png" alt="Two Pole Multiplexing" title="Two Pole Multiplexing" border='0' &gt;&lt;br /&gt; &lt;b&gt;Figure 13:&amp;nbsp;&amp;nbsp;Two Pole Multiplexing&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;For multiplexed switching, Form A SPST-NO contacts are used almost exclusively. One- and two-pole configurations are common, with more poles used in special situations (i.e. guarding). &lt;br /&gt;&lt;br /&gt;Configurations equivalent to multiple pole configurations can be built from single-pole multiplexers controlled together. However, proper shielding, guarding, and noise cancellation are often more difficult. Control can also be synchronized to implement a 1:N/N:1 switched pair.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\OnePoleMultiplexing.png" alt="One Pole Multiplexing" title="One Pole Multiplexing" border='0' &gt;&lt;br /&gt; &lt;b&gt;Figure 14:&amp;nbsp;&amp;nbsp;Switch Topology (Form A, B, C)&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Matrix Topology&lt;/h3&gt;The matrix topology is used to connect any input to any output. Simultaneous connections are possible with one input driving many outputs or, less often, several inputs driving one output. The most common terminology to describe matrix size is by rows and columns. As shown in Figure 15, any row can be connected to any column by closure of the relay at the intersection or crosspoint of a row and column. The main advantage of a matrix switching system is the flexibility of the connections allowed. The matrix topology connects multiple instruments to multiple points on a UUT, or multiple instruments to multiple UUTs. Direct connections between source and measure instruments are also possible.&lt;br /&gt;&lt;br /&gt;Figure 15 (exploded view) illustrates a crosspoint implementing a 3-pole, Form A, switching of high, low, and guard signals. This type of structure permits maximum flexibility when connecting instruments and the UUT to the matrix. When designing the matrix, the number of poles per crosspoint is related to how the instruments are connected to the matrix. Single-pole matrix switching is the most common type. &lt;br /&gt;&lt;br /&gt;Marvin Test Solutions' GX6616 is true switch matrix that may be used in the examples shown in figures 15, 16 and 17. These products offer a single-ended configuration of up to 6 rows by 16 columns or 2 rows by 96 columns. In the differential (2-wire) configuration, these products may be used to switch 3 rows by 16 columns or 2 rows by 48 columns. Using several boards, these products may be used to create unlimited switch matrices.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\MatrixTopology.png" alt="Matrix Topology" title="Matrix Topology" border='0' &gt;&lt;br /&gt; &lt;b&gt;Figure 15:&amp;nbsp;&amp;nbsp;Matrix Topology&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In switching matrices, two connection methods can be used, as shown in Figure 16. The common ground system is used in high frequency systems where low impedance returns and coaxial cabling are required. The switched low configuration is used in low frequency or DC applications where floating measurements are required.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\SinglePoleMatrix.png" alt="Single Pole Matrix" title="Single Pole Matrix" border='0' &gt;&lt;br /&gt; &lt;b&gt;Figure 16:&amp;nbsp;&amp;nbsp;Single Pole Matrix&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Two-pole matrix switching is used for differential (balanced) systems or to create 4-wire measurements. An example is shown in Figure 17A where a digital multimeter (DMM) instrument makes a 4-wire measurement using two 2-pole rows of the matrix. &lt;br /&gt;&lt;br /&gt;The 2-pole configuration can also used for guarded source or measure connections involving high impedance or low level signals as shown in Figure 17B. Since guarding isolates sensitive lines from adjacent circuitry, the construction and wiring of hardware for guarded systems differs from that used in a general-purpose 2-wire matrix.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\TwoPoleMatrix.png" alt="Two-Pole Matrix" title="Two-Pole Matrix" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 17: Two-Pole Matrix&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;For sensitive measuring applications, the 3-pole matrix switching method is useful. The 3-pole method isolates the high and low signals from the other signals. This is done by additional shielding which is not at circuit low or earth potential. The 3-pole configuration is also used for isolating source/measure signal pairs with a driven shield (guard). &lt;br /&gt;&lt;br /&gt;Switching matrices may be used as building blocks for larger matrices by interconnecting them along the columns or rows. Matrix blocks can be connected to form a long narrow matrix. This is useful when a large number of instruments and UUT connections are required, but only a few signals are used for each test step.&lt;br /&gt;&lt;br /&gt;As the following points illustrate, the matrix topology is the most efficient method because it offers:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Reduced hardware and cost &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Straightforward programming &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Maximum switching flexibility via software control &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Maximum test flexibility to run different devices or different test programs &lt;/li&gt;&lt;/ul&gt;However, there are several of the drawbacks to matrix switching:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Safety considerations as it is difficult to confine hazardous signals to certain paths &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Increased crosstalk between paths &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Shunt loading and impedance matching limits bandwidth &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Additional cost of switches for every possible signal path &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Lower reliability due to more switches and increased possibility of misconnection &lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;Switching Elements&lt;/h3&gt;When a switch turns on, it behaves according to the characteristics and properties of the switching element. Therefore, any element chosen for use in a switching system should approach the ideal switch model.&lt;br /&gt;&lt;br /&gt;Figure 18 illustrates the schematic representations of the four types of electrically controllable switching elements. Because of the advancement of relay designs, the relay family of switching elements offers the best overall performance at a reasonable cost.&lt;br /&gt; &lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\SwitchingElements.png" alt="Switching Elements" title="Switching Elements" border='0' &gt;&lt;br /&gt; &lt;b&gt;Figure 18: Switching Elements&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Each of the four types shown above has advantages and disadvantages. For Automated Testing purposes however, the Relay offers the best performance. A FET switch is the fastest switch of the group, although it has a high ON resistance and the switchable signal level is typically limited. The Triac is a good solution for high current, high voltage switching but is rarely being used in ATE. The same holds true for the Solenoid Switch, although some applications require its use. Since the relay is the most common switching type used in ATE systems, the rest of this section will focus on types of relays and their advantages.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Types of Relays&lt;/h3&gt;Of the many types of relays, only a few are suitable for ATE applications. Among the more common types are electromechanical (armature) and dry reed. Table 1 compares some key parameters of these two relays.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\RelayKeyParameters.png" alt="Relay Comparison Typical Specifications" title="Relay Comparison Typical Specifications" border='0' &gt;&lt;br /&gt; &lt;b&gt;Table 1: Relay Comparison Typical Specifications&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Maximum Relay Voltage&lt;/h3&gt;The maximum voltage that a relay can reliably switch at is determined by:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The gap (spacing) between the contacts&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The dielectric of the gas inside the relay&lt;/li&gt;&lt;/ul&gt;An arc will develop if the gap is too small between the two contacts. Arcing is common when switching high voltage, but if the relay has the proper gap, arcing is reduced. &lt;br /&gt;&lt;br /&gt;In addition, the environment affects the degree of arcing. A humid or highly oxygenated environment promotes arcing and a dry climate reduces arcing. Open relays allow ambient air into the switching area while sealed relays contain a controlled internal environment from the relay manufacturer. Mechanical type relays are made as open or sealed units. Reed relays, by virtue of their construction, are always sealed.&lt;br /&gt;&lt;br /&gt;When the voltage across the relay contacts exceeds the maximum switching voltage specified for the relay, arcing is usually present. An arc due to an AC signal is usually reduced as soon as the voltage level drops to zero.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Maximum Relay Current&lt;/h3&gt;Typical relay specifications break down maximum current into maximum carry current and maximum switched current. &lt;br /&gt;Carry current is defined as the current that can be passed by previously closed contacts. The cross-sectional area of the path from pin to pin through the switch limits carry current. &lt;br /&gt;&lt;br /&gt;Switched current is the maximum current that can be interrupted by the relay. Contact plating and material are the primary factors in the switched current specification. If a high current is switched constantly across the contacts, the heat rises and arcing at the contacts degrades them at a rapid rate. In extreme cases, the contacts may “weld” together. If the specified life of the relay is to be attained, the power rating of the relay must also comply with the current and voltage values.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Maximum Relay Power&lt;/h3&gt;The maximum power that a relay can switch relates to the temperature rise in relation to reasonable contact life. An over-power condition dramatically shortens relay life. Signal handling relays have their power rating specified in either volt-amps (VA) or watts. Relays that have their power rating given in watts are DC relays. If the relay is a DC type, the relay’s power must be used to rate the relay’s power handling capability.&lt;br /&gt;&lt;br /&gt;AC type relays are designed to handle AC loads and are usually rated in volt-amps. When power is rated in VA, the power factor is not a consideration and volts switched times amperes switched or carried is the calculation used.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Contact Potential&lt;/h3&gt;EMF (Electromotive Force) is generated when two dissimilar metals come into contact. Because a relay contact is typically a plated alloy, even the two supposedly similar halves of the contact are not the same. There are differences due to alloy composition and the working of the metal as well as the thermal EMFs generated by the plating to the alloy junction.&lt;br /&gt;&lt;br /&gt;In addition, EMF is generated when heat is conducted along the leads of the switch. The difference in the heat flow between the different leads causes a thermal EMF. A secondary source of thermal EMF is from winding inconsistencies and variations in coil wire diameter. In a reed relay, these radiate heat, which causes temperature variations in the switch. &lt;br /&gt;&lt;br /&gt;In a test system, these thermal EMFs add a voltage error to the measurement system. Depending on the relay, this error may range from less than a microvolt to tens of millivolts. If the error is significant with respect to the sourced or measured reading, the thermal EMF must be known and compensated.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Relay Operating Speed&lt;/h3&gt;The rate at which the contacts may be cycled for reliable operation is known as the operating speed. It is limited by the actuation and release times. Actuation time is measured from when power is applied to the coil until the contacts have settled. Release time is the opposite of actuation time. It is measured from the time power is removed from the coil until the contacts have settled again (including bounce).&lt;br /&gt;&lt;br /&gt;An operating frequency, or repetition rate, lower than that allowed by the switching times is often specified for a relay. This is done to limit temperature rise and allow for contact settling. Of these two, temperature rise is more critical. When a relay is used near its power or voltage rating, the duty cycle must be adjusted to allow for cooling time. A lower operating frequency or altered duty cycle produces cooler temperatures.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Relay Contact Resistance Versus Life&lt;/h3&gt;Contact resistance is the resistance across a closed set of contacts. This parameter is typically measured using a four-wire configuration with nominal voltage applied to the coil. Unless otherwise specified, a contact resistance specification is for new conditions.&lt;br /&gt;&lt;br /&gt;For dry switches, the contact resistance is inversely related to the contact area. Electromechanical relays with large contacts have a lower contact resistance than a reed switch with relatively small contacts.&lt;br /&gt;&lt;br /&gt;Life, or the number of operations for which a relay is expected to perform, is typically limited by mechanical operations and by the number of operations under a certain load until a specified resistance across closed contacts is reached. Without an end-of-life contact resistance specification, the life under load specification is meaningless. Dry switches typically have a life specified to a contact resistance less than 1 or 2 Ohms.&lt;br /&gt;&lt;br /&gt;A relay may fail in one of several modes, including mechanical (actuation) failure and contact failure. A coil wire break, a glass seal fracture or reed fatigue in reed switches, or an armature mechanism failure in electromechanical relays can cause mechanical failure. A relay contact failure can occur when excessive heat or a high current or voltage pulse causes the contacts to weld. Oxidation, excessive charring and pitting, or insulating deposits on the contacts can cause an open circuit.&lt;br /&gt;&lt;br /&gt;Because actual contact life is important, much effort has gone into finding and choosing “good” contact materials. Gold, silver, and palladium have traditionally been used for their good electrical conductivity and relatively low susceptibility to oxidation. Increasingly, rhodium and ruthenium are being plated over more traditional contact materials to increase the contact life. Rhodium’s structure is cubic, which is more stable than that of earlier contact plating. For even greater stability, the hexagonal structure of ruthenium is used.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Relay Inductance&lt;/h3&gt;A relay coil also produces inductance because it is a coil of wire. As an inductor, the current in the coil cannot be changed instantaneously, since V=L(di/dt), without generating an excessive voltage spike. A diode is often used across the coil with the cathode at the positive voltage end of the coil. The suppression or “back” diode will conduct the coil current when the relay drive is removed. See Figure 19.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200294\SuppressionDiode.png" alt="Suppression Diode" title="Suppression Diode" border='0' &gt;&lt;br /&gt; &lt;b&gt;Figure 19: Suppression Diode&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt; &lt;h3&gt;Insulation Resistance&lt;/h3&gt;Insulation resistance (IR) is a measure of the resistance between two isolated pins on the relay. Available insulator materials provide a wide range of insulation resistance (105-1014 K Ohm) in various environments. The primary factor to limiting IR is bulk leakage and surface leakage. Bulk leakage is through an insulating material, usually after it has absorbed moisture from the environment. Surface leakage is across the surface of the material, usually due to contamination such as salts or flux and/or other chemicals from fingers. The properties of some insulators change with applied voltage, so it is important to evaluate IR at or above the expected operating voltage.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Relay Capacitance&lt;/h3&gt;All the components of a relay have inherent capacitances that are determined by the materials and physical configuration of the relay. &lt;br /&gt;&lt;br /&gt;The typical capacitance from switch contacts to the coil is 0.2 - 15 pF. This capacitance can couple noise or other signals from the contacts to the control lines, and vice versa. Noise can also be coupled to a different switch through its contact-coil capacitance if it is driven by the same coil supply. An electrostatic shield between the switch and the coil can reduce noise by as much as a factor of 110. In addition, there is also capacitance across open contacts. This type of capacitance depends on the contact area and the gap of the switch and is typically less than 2 pF. These inherent capacitances, due to physical characteristics of the relay, are one factor in limiting the frequency of the signal the relay switches.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Signal Frequency&lt;/h3&gt;To obtain higher switching rates and good RF performance, specialized contacts and relay architectures are used. Operating frequencies greater than 50 MHz are possible with these types of relays. Inter-contact capacitance and contact circuit loss are factors that determine how well a relay is suited to high frequency applications. In addition, the design of the printed circuit board (PCB) also contributes to the selection of RF relays. Beveled etched signal paths and ground-guards are integrated into newer switch matrix PCB designs.</description><link>https://www.MarvinTest.com/KB/Q200294/Understanding-Switching-Used-in-Automated-Test-Equipment</link><pubDate>5/10/2023</pubDate></item><item><title>Alignment of Card Slots at Assembly Level - Published on 5/2/2023</title><description>Taken from Paul Shklanko email dated 10/20/2019:&lt;br /&gt;&lt;br /&gt;Hi Paul,&lt;br /&gt;&lt;br /&gt;There is an issue with a GX7210 returned by a customer under RMA 18266. There appears to be a backplane alignment within the chassis. Please review my evaluation notes below and work with Roger on the disassembly of the chassis addressing the following.&lt;br /&gt;&lt;br /&gt;1. Confirm the conclusion.&lt;br /&gt;&lt;br /&gt;2. Determine the root cause for this failure. Note that the customer purchased 18 of this chassis model at one time and may have a stockpile of unpacked units. &lt;br /&gt;&lt;br /&gt;I have copied QA to this message to keep them in the loop. I also copied Tero as the incident has been assigned to him.&lt;br /&gt;&lt;br /&gt;Reported Problem: &lt;br /&gt;- The customer reported that the GX1632e Prototype board (PXIe) did not fit in a chassis slot.&lt;br /&gt;- The customer unpacked another new GX7210 and had no issues with that chassis.&lt;br /&gt;&lt;br /&gt;Evaluation Results of Returned Chassis:&lt;br /&gt;- Confirmed that I was not able to install a PXIe instrument in slots 2 (PXIe) and slots 3 through 8 (PXI-H).&lt;br /&gt;- Confirmed that I was able to install a PXIe instrument in slots 19 and 20 (PXI-H).&lt;br /&gt;- Confirmed that I was able to install a PXI-H Instrument in slots 3 through 8 (PXI-H).&lt;br /&gt;&lt;br /&gt;Instruments used For Evaluation:&lt;br /&gt;- PXIe: Used GX1632e and GX3800e.&lt;br /&gt;- PXI-H: GX6384.&lt;br /&gt;&lt;br /&gt;Conclusion:&lt;br /&gt;- Upon examination it was noted that the P4 connector of the PXIe instrument is hitting the shroud of the backplane XP4 connector. This is the case for slots 2 through 8 (PXIe and PXI-H). This is shown in the photograph below.&lt;br /&gt;- The PXIe P3 connector (keying) constrains the P4 connector causing the clearance issue.&lt;br /&gt;- This was not caught by Production test as the PXI-H card fits all hybrid slots. This is what is used by Production test. There is no P3 connector therefore there is room for tolerance of a misalignment.&lt;br /&gt;- Gap analysis – Production must add a step in the process for all GX72x0 chassis configurations assembly to use a PXIe instrument in slots 2 and 21. The same should be added for GX76x0 chassis assembly.&lt;br /&gt;&lt;br /&gt;From Paul Lipert 10/29/2019:&lt;br /&gt;Rejection steps performed:&lt;br /&gt;Paul Shklanko confirmed customer rejection and determined preliminary cause 10/20/2019. It was believed that there was a misalignment occurring at the Backplane level relating to connectors (PN’s 214443 and 973028).&lt;br /&gt;Evaluated the structure of the Backplane (2524-300-000-ASSY) and the horizontal extrusions (PN 131799) as to how they interconnect to each other. With the (40) screws that attach the back plane to the extrusions, it seemed improbable that any misalignment would be allowed.&lt;br /&gt;Researched the (2) connectors (PN’s 214443 and 973028) with relation to the Backplane itself. Found no inconsistencies outside of what the PCB drawings allow.&lt;br /&gt;Continued research into the potential conditions of extrusions (bow from manufacturing) and if they could cause the PCB cards to not properly align into the Backplane components. By loosening the top (20) screws and providing an offset of the extrusion in the middle section enabled the sample PCB Express card to have proper fitment. Slot 10 demonstrated the greatest visible fitment interference.&lt;br /&gt;&lt;br /&gt;Actual Findings:&lt;br /&gt;CN: EZ-A1-AA-00 – From MTS Inventory – SN: 00012 – Fit slot 10 perfectly prior to adjustment.&lt;br /&gt;CN: EZ-A1-AA-00 - From MTS Inventory – SN: 00017 – Fit with slight interference prior to adjustment.&lt;br /&gt;CN: PZ-AA-AA-000 Express - From An Thai – SN: 00016 – Did not fit prior to adjustment.&lt;br /&gt;&lt;br /&gt;Described and demonstrated findings to assembly supervisor and technician. Instructions were relayed as to how the backplane is to be assembled through evaluation steps alignment. Chassis assembly was reassembled per instruction, passing fitment check of all slots. &lt;br /&gt;Cause: Installation of Express Cards were not used for alignment / validation of fitment steps at extrusion / backplane assembly level.&lt;br /&gt;&lt;br /&gt;Corrective Action:&lt;br /&gt;MAI instructions shall be updated to include fitment verification of Hybrid, Legacy and Express Cards as follows:&lt;br /&gt;IS: Install backplane (item 4) using screws (item 17). Verify backplane and card guide alignment by inserting Hybrid, Legacy and Express Cards. Adjust alignment of upper and lower extrusions as required for proper fitment of all cards below:&lt;br /&gt;•	Hybrid: Slots 1 thru 10, 19-21.&lt;br /&gt;•	Legacy: Slots 11-18.&lt;br /&gt;•	Express: Slots 1 thru 10, 19-21.&lt;br /&gt;WAS: Install backplane (item 4) using screws (item 17). Verify backplane and card guide alignment by inserting a 3U card into 3 slots (2, 10 and 20) and align backplane prior to tightening screws. Loctite/Torque per drawing.&lt;br /&gt;Video and photo link: K:\PaulLi\RMA 18266</description><link>https://www.MarvinTest.com/KB/Q200326/Alignment-of-Card-Slots-at-Assembly-Level</link><pubDate>5/2/2023</pubDate></item><item><title>How to Display an Animated GIF File in an ATEasy Form - Published on 4/26/2023</title><description>In ATEasy form's, animated GIF files are supported by the &lt;b&gt;ALog control&lt;/b&gt;. To display an animated GIF in a log control, set the control to HTML mode (PlainText property set to False), and then append an image tag with the GIF file.&lt;br /&gt;The image file is defined using the HTML &lt;b&gt;IMG tag&lt;/b&gt; and can then be inserted into the ALog control using the &lt;b&gt;Append &lt;/b&gt;method. &lt;br /&gt;&lt;br /&gt;The height and width of the image can be specified using the &lt;b&gt;height&lt;/b&gt; and &lt;b&gt;width &lt;/b&gt;attributes.&lt;br /&gt;For example, the following line links the image to the "C:\geotest.gif" file and sets the image height and width to 42.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&amp;nbsp;&amp;nbsp;&lt;img src="c:\\geotest.gif" height="42" width="42" /&gt;&lt;/div&gt; &lt;br /&gt;&lt;br /&gt;The image is then appended to the ALog control using the Append control as follows:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&amp;nbsp;&amp;nbsp;log1.Append("&lt;img src=\"c:\\geotest.gif\" height=\"42\" width=\"42\" /&gt;")&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To hide the ALog's scrollbar, which is displayed by default, insert the following into ALog's OnLoad event:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&amp;nbsp;&amp;nbsp;log1.Document.body.setAttribute("scroll", "no") &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The image can be positioned in the ALog control by setting the ALog control margins. For example, inserting the following settings into AForm's OnLoad event will align the image in the Top-Left corner of ALog control : &lt;br /&gt;&lt;br /&gt; &lt;div class='fixedFont'&gt;&amp;nbsp;&amp;nbsp;log1.Document.Body.LeftMargin=0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;log1.Document.Body.TopMargin=0 &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Here is the complete code for displaying the animated GIF in a log control:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Sleep(1)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Wait for Form objects to complete loading&lt;br /&gt;&lt;br /&gt;frmHGForm.Visible=True 	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Make the form visible &lt;br /&gt;sImageDir=GetDir(aGetDirCurrent)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Get the current directory location&lt;br /&gt;sImageName=sImageDir+"\\Logo.jpg"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Logo file name. Put the Logo on the top of the form&lt;br /&gt;imgLogo.LoadFromFile(sImageName)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Load the logo&lt;br /&gt;imgLogo.Visible=True 	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Make it visible&lt;br /&gt;&lt;br /&gt;!Set the ALog Window to HTML mode to display the animated image file&lt;br /&gt;logHGWid.PlainText=False&lt;br /&gt;!Remove the Scroll bar&lt;br /&gt;logHGWid.Document.body.setAttribute("scroll", "no")&lt;br /&gt;!Position the image in the Top-Left corner of the ALog control&lt;br /&gt;logHGWid.Document.Body.LeftMargin=0&lt;br /&gt;logHGWid.Document.Body.TopMargin=0&lt;br /&gt;!Clear the ALog window&lt;br /&gt;logHGWid.Clear()&lt;br /&gt;!Get the dimensions of the ALog control for the image height and width settings&lt;br /&gt;fHeight=logHGWid.Height-4&lt;br /&gt;fWidth=logHGWid.Width-4&lt;br /&gt;&lt;br /&gt;!HTML Image string&lt;br /&gt;sImageName="&lt;IMG SRC=\"File:"+sImageDir+"\\Hourglass_icon.gif"+"\""+" width=\""+Str(fWidth)+"\" height=\""+Str(fHeight)+"\"&gt;"&lt;br /&gt;!Place the image in the ALog window&lt;br /&gt;logHGWid.Append(sImageName)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;An ATEasy application that demonstrates how to load an animated GIF file into a form can be downloaded by clicking on this link &lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/\Q200225\KB Animated Hourglass.zip' target='_blank'&gt;Q200225 Example&lt;/a&gt;. The application opens a window that displays a spinning hourglass. The main section of code can be found in the OnLoad event for the program form.</description><link>https://www.MarvinTest.com/KB/Q200225/How-to-Display-an-Animated-GIF-File-in-an-ATEasy-Form</link><pubDate>4/26/2023</pubDate></item><item><title>Simulation with ATEasy - Published on 4/13/2023</title><description>&lt;h3&gt;Overview&lt;/h3&gt;Simulation is the emulation or imitation of one or more components of a test system during code development or operation of the system.&amp;nbsp;&amp;nbsp;This includes simulation of:&lt;ul&gt;&lt;li&gt;Test system instruments&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Test system software&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Unit Under Test&lt;/li&gt;&lt;/ul&gt;Often while developing test programs, an engineer is face with the challenge of writing test code for missing instrumentation.&amp;nbsp;&amp;nbsp;Typically, compiling and running test programs with missing or malfunctioning hardware will result in run-time communication errors.&amp;nbsp;&amp;nbsp;Simulating the missing or malfunctioning hardware allows the code developer to compile and run programs without producing error conditions that can be a nuisance to work around, allowing code flow to be tested sooner and optimized more efficiently.&lt;br /&gt;&lt;br /&gt;Where test development is divided among multiple engineers, simulation allows concurrent code development among a team of software developers.&amp;nbsp;&amp;nbsp;In this instance, the system hardware is often a limited resource (i.e., one system but many programmers), but need not be a development limitation.&amp;nbsp;&amp;nbsp;Linking code development to system access creates an unnecessary bottle-neck that can dramatically reduce productivity and lengthen time to deployment.&amp;nbsp;&amp;nbsp;Developing, debugging and running an application on a desktop, sans the hardware, frees up system time, provides better resource utilization and speeds up development and debugging times.&amp;nbsp;&amp;nbsp;Then, when hardware becomes accessible, the time spent with the hardware can be more focused, allowing this limited resource to be used more efficiently.&lt;br /&gt;&lt;br /&gt;A further benefit of simulation within the ATEasy environment is the ability to trace and analyze the performance of your code, and the performance of the instruments when running in the system.&amp;nbsp;&amp;nbsp;ATEasy allows combined use of instrument simulation and instrument control simultaneously.&amp;nbsp;&amp;nbsp;A simulation routine can place timing structures around the instrument commands to measure performance of the instrument while in operation.&amp;nbsp;&amp;nbsp;This is accomplished without modifying the instrument driver or otherwise impacting the test program.&amp;nbsp;&amp;nbsp;Once performance parameters have been established, the simulation can simply be disabled, allowing the program to run normally.&amp;nbsp;&amp;nbsp;No code changes are required.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Implementation&lt;/h3&gt;To support a full, robust simulation, ATEasy v9.0 introduces several new &lt;b&gt;Simulation Procedures &lt;/b&gt;and&lt;b&gt; Simulation Properties&lt;/b&gt;, as listed below:&lt;ul&gt;&lt;li&gt;&lt;b&gt;AApp.Simulate Property&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Set or return the application’s &lt;b&gt;Simulation Mode&lt;/b&gt; property; True - simulation is turned on, False - simulation turned off. Default is False.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;SetSimulateProcedures (sProcedureOrSubModule)&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Defines the procedure, IO table, or module to be simulated. You can pass in a module shortcut name, sub-module name or a procedure included within the sub-module.&amp;nbsp;&amp;nbsp;Note, SetSimulateProcedures() should occur before any ATEasy calls of an instrument API procedure or IO Table.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;OnSimulate (obModule, procCallee, penSimulateStatus) Event&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Occurs when a defined procedure or IOTable is called while in simulation mode (App.Simulate=True), where:&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;obModule&lt;/b&gt;:&amp;nbsp;&amp;nbsp;The module object that initiated the OnSimulate event.&amp;nbsp;&amp;nbsp;The module has various properties associated with it, one of which is &lt;b&gt;obModule.Name&lt;/b&gt;.&amp;nbsp;&amp;nbsp;The property obModule.Name refers to the name of the module object that initiated the OnSimulate event.&amp;nbsp;&amp;nbsp;Example obModule.Name=“DMM” implies the name of a DMM driver module.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;procCallee&lt;/b&gt;:&amp;nbsp;&amp;nbsp;The name of the Procedure within the module object that initiated the OnSimulate event.&amp;nbsp;&amp;nbsp;Example "DMM.SetFunction" indicates that the OnSimulate event was initiated by the “SetFunction” procedure contained within the “DMM” driver module.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;penSimulateStatus&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Enumerated status indicating how to proceed with the simulation handling, where:&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;enSimulateDone&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Simulation handled, return to caller&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;enSimulateCallNext&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Simulation not done, call next handler&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;enSimulateCallSimulated&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Call original simulated callee&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;GetSimulateParameter (sParameterName )&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Returns a pointer to the parameter referenced in the intercepted API procedure, allowing you to set or return the parameter value of the callee procedure.&amp;nbsp;&amp;nbsp;Example, “p=GetSimulateParameter("pdMeasurement")” returns a pointer to the pdMeasurement parameter referenced in the API procedure that initiated the OnSimulate event.&lt;/li&gt;&lt;/ul&gt;As with all structured processes within ATEasy, simulation uses events to control the simulation process – specifically, &lt;b&gt;OnSimulate Events&lt;/b&gt;.&amp;nbsp;&amp;nbsp;Runtime access to the instrument API’s is accomplished by redirecting procedure calls to the simulation code contained in the OnSimulate event.&amp;nbsp;&amp;nbsp;The redirection is selective by identifying, or registering which instrument API’s to redirect.&amp;nbsp;&amp;nbsp;This is done using &lt;b&gt;SetSimulateProcedures()&lt;/b&gt;, and is typically done very early in the applications execution.&amp;nbsp;&amp;nbsp;The redirected procedure can be any type of procedure within the ATEasy application, including IO tables, user defined procedures or DLL procedures linked to the ATEasy application.&amp;nbsp;&amp;nbsp;Also supported are redirecting all procedures within a sub-module name or module shortcut.&lt;br /&gt;&lt;br /&gt;To activate the redirection (enable simulation), the application property “Simulate” must be enabled (set to True).&amp;nbsp;&amp;nbsp;This can be done from the Conditions menu, or programmatically using the App.Simulate property.&amp;nbsp;&amp;nbsp;When a simulated API procedure is called, ATEasy redirects control to the OnSimulate event.&amp;nbsp;&amp;nbsp;Here, the programmer has access to the name of the module containing the calling API procedure (obModule), the name of the procedure itself (procCallee), and the procedure’s parameter list (using GetSimulateParameter).&amp;nbsp;&amp;nbsp;The programmer is free to define any level of procedure simulation, from very simplistic, to very complex, depending on what is required.&amp;nbsp;&amp;nbsp;The process for simulating an instrument is:&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp;Set the project requiring simulation as the &lt;b&gt;Active Project&lt;/b&gt;.&lt;br /&gt;2.&amp;nbsp;&amp;nbsp;Add code to select the procedures, IO Tables or modules that are simulated.&amp;nbsp;&amp;nbsp;Recommendation; Add a driver to your system that takes care of the simulation processes.&amp;nbsp;&amp;nbsp;This simplifies adding or removing simulation to a project.&lt;br /&gt;3.&amp;nbsp;&amp;nbsp;Implement the OnSimulate() event to handle simulation.&lt;ul&gt;&lt;li&gt;Use the GetSimulateParameter() function to retrieve the pointer to the simulated procedure parameter(s). This can be used to set or access the value for parameters.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Before returning from the OnSimulate() event, set the penSimulateStatus parameter to let ATEasy know what to do next.&lt;/li&gt;&lt;/ul&gt;Optionally, you can also:&lt;ul&gt;&lt;li&gt;Use the GetCallerName() to determine where the call was made from and what procedure called your simulated procedure.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Use the Program, Task and Test internal variables to determine the location of the call within your program. This will allows you to return different values for different tests.&lt;/li&gt;&lt;/ul&gt;4.&amp;nbsp;&amp;nbsp;Turn ON Simulation and run/debug your application:&lt;ul&gt;&lt;li&gt;Turn on Simulation by Checking the &lt;b&gt;Simulate &lt;/b&gt;from the&lt;b&gt; Conditions menu&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Run your application with&lt;b&gt; /simulate command -line&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Set the &lt;b&gt;App.Simulate&lt;/b&gt; property to TRUE (in code),&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Examples&lt;/h3&gt;&lt;b&gt;Basic Simulation&lt;/b&gt;&lt;br /&gt;This example demonstrates creating a driver to implement the instrument simulation.&amp;nbsp;&amp;nbsp;The first step after creating the new driver, is to define the instrument procedures that will be simulated.&amp;nbsp;&amp;nbsp;Figure 1 below defines that all of the Digital Multi-Meter (DMM) driver procedures and all of the Power Supply (PS) driver procedures will be simulated.&amp;nbsp;&amp;nbsp;Other simulation options for the DMM and PS drivers can be used, as shown in the commented code of figure 1.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200252\OnInit_b.JPG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;/div&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 1&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Defining simulated procedures in the driver OnInit event&lt;/div&gt;&lt;br /&gt;The OnSimulate event contains code to simulate the procedures that initiated the simulation event.&amp;nbsp;&amp;nbsp;In the example shown in Figure 2, the name of the calling module and the calling procedure are used to select the type of simulation response.&amp;nbsp;&amp;nbsp;Here, the &lt;b&gt;DMM.Measure&lt;/b&gt; procedure is simulated to return the value “6.0” to the pdResult parameter, and the &lt;b&gt;DMM.GetSystemIdentification&lt;/b&gt; procedure is simulated to return the string “34401A” to the psID parameter, masking the DMM Initialization Instrument ID Query error.&amp;nbsp;&amp;nbsp;Every different procedure in an instrument driver could potentially have a unique simulation process.&amp;nbsp;&amp;nbsp;At the conclusion of the simulated response, the simulation status is set to done, indicating no further action will be taken and control will return to the caller (&lt;b&gt;penSimulateStatus=enSimulateDone&lt;/b&gt;).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200252\OnSimulate Event.JPG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2&lt;/b&gt;:&amp;nbsp;&amp;nbsp;OnSimulate event in the simulation driver&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To test the simulation, the simulation mode must be enabled (Figure 3) and a call to the DMM driver is required.&amp;nbsp;&amp;nbsp;In the ATEasy “DMM Test” (Figure 4), the test calls the DMM SetFunction and Measure functions.&amp;nbsp;&amp;nbsp;ATEasy will intercept both API calls, but specifically traps the measure function and returns the value “6.0” to TestResult via the “pdResult” parameter, as illustrated in the images provided (Figure 5).&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200252\Conditions-Simulate.JPG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Enabling simulations from the Conditions menu&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200252\Simulate Test.JPG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Testing the simulation&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200252\OnSimulate Event CloseUp.JPG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Simulating the Dmm.Measure function&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To avoid confusing simulated tests from real tests, the simulation function in ATEasy has been further enhanced to indicate if a test run used simulated processes.&amp;nbsp;&amp;nbsp;The Test Executive report shown in figure 6 clearly identifies that the simulation mode was enable and operating during the tests.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200252\TestExec Simulate.JPG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Test Executive showing simulated test results&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Performance Measurement Simulation&lt;/b&gt;&lt;br /&gt;This example demonstrates how to measure the performance of an instruments API.&amp;nbsp;&amp;nbsp;Calls to the instrument driver are maintained and communication with the instrument still takes place.&amp;nbsp;&amp;nbsp;The core of the performance measurement is achieved by surrounding the instrument's API call with the Tick() function.&amp;nbsp;&amp;nbsp;this provides a timestamp of the duration of the instrument procedure.&amp;nbsp;&amp;nbsp;The full performance simulation example is provide here:&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;div class='fixedFont'&gt;Procedure OnSimulate(obModule, procCallee, penSimulateStatus): Variant Public	! Occurs when a simulated procedure or IOTable is called in simulation mode.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;obModule: Val Object&lt;br /&gt;procCallee: Val Procedure&lt;br /&gt;penSimulateStatus: Var Internal.enumASimulateStatus&lt;br /&gt;pParm2: Any&lt;br /&gt;pParm1: Any&lt;br /&gt;lStart: Long&lt;br /&gt;sProc: String: 32 &lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;blockquote&gt;	If bIgnoreSimulate&lt;br /&gt;&lt;blockquote&gt;		penSimulateStatus=aSimulateCallSimulated&lt;br /&gt;		return 0 &lt;/blockquote&gt;	endif&lt;br /&gt;	sProc=procCallee &lt;br /&gt;	&lt;br /&gt;	Select sProc&lt;br /&gt;	Case "GTDEMO.GtDemoRelaySwitch"&lt;br /&gt;&lt;blockquote&gt;		bIgnoreSimulate=TRUE&lt;br /&gt;		pParm1=GetSimulateParameter("enRelay")&lt;br /&gt;		pParm2=GetSimulateParameter("enRelayState")&lt;br /&gt;		lStart=Tick()&lt;br /&gt;		procCallee(pPArm1,pParm2)&lt;br /&gt;		lCountTime=lCountTime+Tick()-lStart ! total time&lt;br /&gt;		lCount=lCount+1&amp;nbsp;&amp;nbsp;! total calls&lt;br /&gt;		bIgnoreSimulate=FALSE &lt;/blockquote&gt;	Case "GTDEMO.GtDemoBuzzerSetState"&lt;br /&gt;&lt;blockquote&gt;		bIgnoreSimulate=TRUE&lt;br /&gt;		pParm1=GetSimulateParameter("enBuzzerState")&lt;br /&gt;		lStart=Tick()&lt;br /&gt;		procCallee(pPArm1)&lt;br /&gt;		lCountTime=lCountTime+Tick()-lStart ! total time&lt;br /&gt;		lCount=lCount+1&amp;nbsp;&amp;nbsp;! total calls&lt;br /&gt;		bIgnoreSimulate=FALSE &lt;/blockquote&gt;	EndSelect&lt;br /&gt;	&lt;br /&gt;	Append sProc+" Time (mS): "+Str(lCountTime)&lt;br /&gt;	penSimulateStatus=aSimulateDone&lt;br /&gt;	&lt;br /&gt;	Return 0 &lt;/blockquote&gt;}&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The program module that contains the Tasks and Tests that are used to call the instrument functions, and resulting test report are shown below:&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200252\Performance_PRG_1.JPG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 7&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Calling the instrument functions from within a test&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200252\Performance_1.JPG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 8&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Performance measurements test results&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Other Simulation Technologies&lt;/h3&gt;IVI provides simulation that is configured using VISA resource manager (NI-MAX or Agilent VISA). To support simulation, you need to configure the resource manager with a different driver that was written especially to support simulation, only some vendors offers it. IVI simulation is designed to simulate drivers, to ignore errors, provide range checking for parameters and inject errors..When using an ATEasy IVI based driver that support simulation, ATEasy supports IVI simulation as well the same way as other development tools, ATEasy simulation is not specific to a technology (i.e. IVI) and can simulate any call including program, system, driver and UUT. It also does not require any external driver to be written, it provides additional benefits such as testing your application logic at any level, measuring performance and program flow, debugging tool . ATEasy simulation can also be injected to your application without changing any of your application exiting code.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;ATEasy v9 simulation is a powerful feature and offers users the following benefits &amp; capabilities:&lt;ul&gt;&lt;li&gt;Develop and verify test programs without needing valuable time on the tester or needing access to a UUT.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Compile and run the test program without any hardware or UUT&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Supports concurrent test program development from multiple developers&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Trace and analyze test program performance &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Provides test engineering with a consistent way to characterize and validate test programs logic including parameters range checking, error injecting, return&amp;nbsp;&amp;nbsp;value and parameters, and more &lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200252/Simulation-with-ATEasy</link><pubDate>4/13/2023</pubDate></item><item><title>Calling Unmanaged DLLs Functions from Powershell - Published on 4/5/2023</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;All Marvin Test Solutions (MTS) driver packages, like GxDMM, comes with a Windows DLL and accessible from PowerShell (PS).&amp;nbsp;&amp;nbsp;This article demonstrates how PS can access MTS unmanaged libraries, like GxDmm.DLL, to interface and control the Gx2065 instrument. &lt;br /&gt;&lt;br /&gt;PS is a cross-platform task automation solution built on the .NET Common Language Runtime (CLR) is made up of command-line shell, a scripting language, and a configuration management framework that runs on Windows, Linux, and macOS. All modern versions of Windows operating systems ship with PowerShell installed, allowing access to a readily available tool where we can create scripts for automating tasks without the need of additional IDE (Integrated Development Environment). See resource [1] to learn more about PowerShell. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PowerShell DLL Support&lt;/h3&gt;It may be of value to discuss what are unmanaged and managed codes. Unmanaged codes are NOT developed in .NET environment such as Win32 API or C/C++, or COM components, while managed codes like C# are developed in .NET. Managed code execution is managed by CLR. Since MTS DLLs are unmanaged, bridging the gap between the unmanaged code in the DLL and the managed code is necessary. This is done through the concept called Marshalling where the unmanaged data types are converted to managed. See KB article [2] from resources section for more information. MTS software packages include the C# class that takes care of this step. Figure 1 illustrates how PowerShell access the functions in the DLL.&lt;td&gt;[:+[+Gx2065+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200351\DLLCsharpStructure.png" alt="Figure 1: Overview of DLL, C# Class, and PowerShell Interface" title="Figure 1: Overview of DLL, C# Class, and PowerShell Interface" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 1: Overview of DLL, C# Class, and PowerShell Interface&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Process&lt;/h3&gt;The simplest way to find PowerShell is through the Windows search bar. The PowerShell ISE (Integrated Scripting Environment) is used to demonstrate interfacing and controlling the Gx2065 instrument. PowerShell ISE provides the environment to develop the script as well as the command line to interact with the instrument. &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200351\PowerShell.png" alt="Figure 2: Launching PowerShell" title="Figure 2: Launching PowerShell" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 2: Launching PowerShell&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200351\PowerShellISE.jpg" alt="Figure 3: PowerShell ISE Editor" title="Figure 3: PowerShell ISE Editor" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 3: PowerShell ISE Editor&lt;/b&gt;&lt;/div&gt;&lt;ol&gt;&lt;br /&gt;&lt;b&gt;&lt;li&gt;Import C# Class and Assign to a new Type&lt;/li&gt;&lt;/b&gt;&lt;br /&gt;Find the folder where GxDMM software is installed and open the GxDmm.cs file. &lt;br /&gt;&lt;div class='GB'&gt; C:\Program Files (x86)\Marvin Test Solutions\GxDmm&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200351\CSClass folder.png" alt`=&amp;quot; border='0' &gt;&lt;br /&gt;&lt;/div&gt;Copy the code from the &lt;b&gt;GxDmm.cs&lt;/b&gt;. In PowerShell, use the cmdlet &lt;b&gt; Add-Type -TypeDefinition @"paste C# code here"@&lt;/b&gt; , and paste the copied code in between double quotes &lt;b&gt;" "&lt;/b&gt;. Make sure to make the class public so it can be accessed from the PowerShell script. We can omit from defining the class in the namespace GxDmmNamespace by removing lines 19, 20, and 382. The example provided in this article have the namespace definition omitted.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200351\ImportClassP1.png" alt`=&amp;quot; border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 4: Importing C# Class&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;li&gt;Members access&lt;/li&gt;&lt;/b&gt;&lt;br /&gt;After the class is imported, we need to run the script by pressing (F5) to define the class in the current session. This will allow us to access member functions and variables as we normally would in any managed method from the command-line. &lt;br /&gt;We can start by declaring some symbols and call &lt;b&gt;GxDmmGetDriverSummary&lt;/b&gt; to get the driver summary. &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200351\PSCommand Line.png" alt`=&amp;quot; border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;li&gt;Considerations&lt;/li&gt;&lt;/b&gt;&lt;br /&gt;The following are considerations to keep in mind when declaring and accessing variables in PS script. &lt;br /&gt;&lt;blockquote&gt;&lt;ol type='a'&gt;&lt;li&gt;Conversion from C++&lt;/li&gt;&lt;br /&gt;Since DLLs could be originating from C++, this may impose a problem in the .NET environment. See resource [3] for reference when converting data types from C++ to C# to ensure compatibilities. &lt;br /&gt;&lt;br /&gt;&lt;li&gt;Symbol Declaration&lt;/li&gt;&lt;br /&gt;The default for integers is Int32. Uint16, Int16, and others must be explicitly declared. The following are examples of how to declare symbols.&lt;br /&gt;&lt;div class='GB'&gt;[Uint16] $unsign16 - unsigned integer16&lt;br /&gt;[Int16] $sing16 - signed integer16&lt;br /&gt;[Uint32] $unsign32 - unsigned integer32&lt;br /&gt;[UInt64] $sing64 - unsigned integer64&lt;br /&gt;[Int64] $sing64&amp;nbsp;&amp;nbsp;- signed integer64&lt;br /&gt;&lt;br /&gt;$count = 10&lt;br /&gt;$arrayMeasurements = New-Object double [] $count - declares an array of double with 10 elements.&lt;br /&gt;$Summary=[System.Text.StringBuilder]::new()&lt;br /&gt;$Summary.Length=256&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;li&gt;Var Access/[ref]&lt;/li&gt;&lt;br /&gt;To access by reference, use &lt;b&gt;[ref]&lt;/b&gt; before the symbol when passing it as a parameter.&lt;br /&gt;$Version and $Status are passed by reference on [GxDmm]::GxDmmGetDriverSummary($Summary, 256, &lt;b&gt;[ref] $Version&lt;/b&gt;, &lt;b&gt;[ref] $Status&lt;/b&gt;)&lt;br /&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;Calling MTS DLLs from PS is fairly straightforward process. The software packages include the C# classes and ready for implementing in PS script. &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Find out the functions in DLL&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Create a class to contain prototype functions that are linked to the DLL functions &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Import the class in PowerShell using Add-Type -TypeDefinition cmdlet (COPY/PASTE)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Call the method in the class as you would in any other managed method&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Example&lt;/h3&gt;&lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/\Q200351\2065 Test.ps1' target='_blank'&gt;Gx2065 Example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Resource&lt;/h3&gt;&lt;b&gt;[1]&lt;/b&gt;&lt;br /&gt;PowerShell Overview&lt;br /&gt;&lt;a href='https://learn.microsoft.com/en-us/powershell/utility-modules/overview?view=ps-modules' target='_blank'&gt;PowerShell&lt;/a&gt;&lt;br /&gt;&lt;b&gt;[2]&lt;/b&gt;&lt;br /&gt;Using DLL in .NET environment&lt;br /&gt;&lt;a href='https://www.marvintest.com/KB/Q200191/Calling-Marvin-Test-Solutions-DLL-functions-from-a-C-Visual-Studio-NET-Project' target='_blank'&gt;KB Article #Q200191&lt;/a&gt;&lt;br /&gt;&lt;b&gt;[3]&lt;/b&gt;&lt;br /&gt;Data type Conversion&lt;br /&gt;&lt;a href='https://www.marvintest.com/KB/Q200210/Comparing-C-C-plus-plus-C-VB-and-ATEasy-Basic-Data-Types' target='_blank'&gt;KB Article #Q200210 - Data type Reference table&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200351/Calling-Unmanaged-DLLs-Functions-from-Powershell</link><pubDate>4/5/2023</pubDate></item><item><title>2022 Air &amp; Space Forces Assn. Air, Space &amp; Cyber Conference - Weapons and Munitions Panel - Published on 10/13/2022</title><description>The Air Force has adopted the mantra of CSAF Gen. C.Q. Brown, Jr. to “Accelerate Change or Lose”, and the operational concept of Agile Combat Employment (ACE), which demands innovative approaches such as agile, tailored force packages, dispersed deployments, and multi-capable Airmen to respond quickly to threats.&lt;br /&gt;&lt;br /&gt;This panel discussion addresses the challenges of this new CONOPS and solutions to realize its potential, including commonality, interoperability, and streamlined logistics to provide resilience and ensure warfighter readiness and effectiveness.&lt;br /&gt;&lt;br /&gt;Of note is a discussion led by Marvin Test Solutions’ CEO, Major General Stephen T. Sargeant, USAF (Ret.) summarizing years of Armament Maintainers’ “desirements” and how they have evolved to requirements under ACE. Focusing on those “desirements”, Marvin Test Solutions has been working for a decade to design and develop test equipment to meet the requirements needed to enable Multi-capable Airmen — innovative armament test solutions that are ready to deploy today.&lt;br /&gt;&lt;br /&gt;&lt;a href='https://www.youtube.com/embed/w8bVhSI4eHc' target='frameVideo' border='0' onclick='return MoveFocustoVideo();'&gt;&lt;img src='/Images/icons/ico_play.gif' border='0'&gt;Click Here to View the recorded session&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200350/2022-Air-Space-Forces-Assn-Air-Space-Cyber-Conference-Weapons-and-Munitions-Panel</link><pubDate>10/13/2022</pubDate></item><item><title>Getting Started with ICEasy - Published on 9/26/2022</title><description>ICEasy is an ATEasy add-on module that is used to facilitate the programming of Marvin Test Solutions’ Dynamic Digital IO (DIO) boards for semiconductor test applications. This article provides an overview of how to use ICEasy for creating and executing test programs.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Pin Mapping between DIO channels and UUT pin names&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Creation of&amp;nbsp;&amp;nbsp;Pin Groups and nested groups as well as providing the&amp;nbsp;&amp;nbsp;ability to perform various test functions on a group&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Simplified programming&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Faster creation of predefined tests (Continuity, IDD, IDDQ, Voltage Threshold, Leakage, etc.)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Sweeping functions and Plots (Shmoo, I/V Curve, etc.)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Virtualization of the digital subsystem, allowing&amp;nbsp;&amp;nbsp;reuse of&amp;nbsp;&amp;nbsp;ICEasy based code with future MTS boards &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Simulation of your test program, allowing you to test and run your program with no hardware using the simulation mode.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Configuration ICEasy System&lt;/h3&gt;To use ICEasy, You must have ATEasy v9 (or newer). Your ATEasy Project System files should first have the DIO driver (in this example, GX5295.drv) followed by ICEasy (ICEasy.drv) and the ICEasy_GX5295 board driver (ICEasy_GX5295.drv). The SIM driver is an application custom driver and is used for simulation if simulation is needed.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200261\TS900-System.jpg" alt="TS-900 ATEasy System" title="TS-900 ATEasy System" border='0' &gt;&lt;/div&gt;&lt;br /&gt;Once the drivers are inserted you need to configure the DIO driver shortcut. This requires setting the driver parameters as required, usually setting the &lt;b&gt;MasterNumber &lt;/b&gt;to 1. You also need to set the &lt;b&gt;INIFileInitialization &lt;/b&gt;parameter to 1 if the DIO is configured using the INI file or it is set to the Master/Slave slot number in your DIO domain. We recommend using the INI file initialization versus setting the Master/Slave boards since it ensures that information displayed in the panel matches the ICEasy board and channel numbers. Since the DIO driver is inserted prior to the ICEasy driver, the DIO driver will be initialized prior to ICEasy, ensuring that initialization of the ICEasy driver will succeed. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Pin Mapping&lt;/h3&gt;Prior to using ICEasy, you will need to map the DIO channels to the DUT/UUT (Device/Unit Under Test) pin names. DIO Channels are 0 based, so if the first board is a GX5295, the channel numbers will be 0-31, the second card’s channels will be 32-63, etc. The order of the DIO cards can be set from the GTDIO Panel’s (installed with the GX5295) Configuration page and this setup will be saved to the INI file.&lt;br /&gt;&lt;br /&gt;The following command is used to map a DIO channel to a UUT pin:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;b&gt;ICEasy Map Add&lt;/b&gt; (sPinName, vPinNumberOrPinList, enPinType, vInstrumentName, \ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iInstrumentChannel)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To create a pin group, use the following:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;b&gt;ICEasy Map Add Group&lt;/b&gt; (sGroup, asGroupOrPinList)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Other available mapping commands reside under ICEasy Map group of commands.&lt;br /&gt;&lt;br /&gt;To map channels you usually place the code in the &lt;b&gt;Program.OnInit()&lt;/b&gt; event as shown here:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;ICEasy Map Add("CLR", 1, enPinTypeDigitalInput, "ICEasy_GX5295", 0) &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In this example we mapped the UUT CLR pin (has a unique index or id of 1) to the DIO channel 0 (last argument). &lt;br /&gt;&lt;br /&gt;You can also specify the Pin type as a digital Input/output, and assign the board driver’s shortcut name used to control the pin (ICEasy_GX5295). Additional examples of mapping other UUT pin channels are shown here: &lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;ICEasy Map Add("CLK", 11, enPinTypeDigitalInput, "ICEasy_GX5295", 17)&lt;br /&gt;ICEasy Map Add("D1", 3, enPinTypeDigitalInput, "ICEasy_GX5295", 2) &lt;br /&gt;ICEasy Map Add("D2", 4, enPinTypeDigitalInput, "ICEasy_GX5295", 7) &lt;br /&gt;ICEasy Map Add("D3", 7, enPinTypeDigitalInput, "ICEasy_GX5295", 6) &lt;br /&gt;ICEasy Map Add("D4", 8, enPinTypeDigitalInput, "ICEasy_GX5295", 3) &lt;br /&gt;ICEasy Map Add("D5", 13, enPinTypeDigitalInput, "ICEasy_GX5295", 10) &lt;br /&gt;ICEasy Map Add("D6", 14, enPinTypeDigitalInput, "ICEasy_GX5295", 13) &lt;br /&gt;ICEasy Map Add("D7", 17, enPinTypeDigitalInput, "ICEasy_GX5295", 14) &lt;br /&gt;ICEasy Map Add("D8", 18, enPinTypeDigitalInput, "ICEasy_GX5295", 9) &lt;br /&gt;ICEasy Map Add("Q1", 2, enPinTypeDigitalOutput, "ICEasy_GX5295", 1) &lt;br /&gt;ICEasy Map Add("Q2", 5, enPinTypeDigitalOutput, "ICEasy_GX5295", 4) &lt;br /&gt;ICEasy Map Add("Q3", 6, enPinTypeDigitalOutput, "ICEasy_GX5295", 5) &lt;br /&gt;ICEasy Map Add("Q4", 9, enPinTypeDigitalOutput, "ICEasy_GX5295", 8) &lt;br /&gt;ICEasy Map Add("Q5", 12, enPinTypeDigitalOutput, "ICEasy_GX5295", 15) &lt;br /&gt;ICEasy Map Add("Q6", 15, enPinTypeDigitalOutput, "ICEasy_GX5295", 12) &lt;br /&gt;ICEasy Map Add("Q7", 16, enPinTypeDigitalOutput, "ICEasy_GX5295", 11) &lt;br /&gt;ICEasy Map Add("Q8", 19, enPinTypeDigitalOutput, "ICEasy_GX5295", 16) &lt;br /&gt;ICEasy Map Add("VCC", 20, enPinTypeVcc, "ICEasy_GX5295", 31) &lt;br /&gt;ICEasy Map Add("GND", 10, enPinTypeGnd)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Note that some pins are marked as VCC and some as GND. The available pin types are displayed when you type the argument for this parameter. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Pin Group Mapping&lt;/h3&gt;Addressing UUT pins individually can be cumbersome. When a repetitive function is needed for controlling / accessing or measurement that involve many pins you can create a Pin Group. The following example demonstrates pin group definitions:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;ICEasy Map Add Group("Reset Pins", {"CLR"})&lt;br /&gt;ICEasy Map Add Group("Clock Pins", {"CLK"}) &lt;br /&gt;ICEasy Map Add Group("Input Pins", {"D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8"}) &lt;br /&gt;ICEasy Map Add Group("Output Pins", {"Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "Q7", "Q8"})&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In this example the Input Pins group contains 8 pins D1-D8.&lt;br /&gt;You can also define nested groups. A nested group can combine groups and pins with a name assigned to a new group.&amp;nbsp;&amp;nbsp;The following example shows the use of a nested group:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;ICEasy Map Add Group("IO Pins", {"Reset Pins", "Clock Pins", "Input Pins", \ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Output Pins"}) &lt;br /&gt;ICEasy Map Add Group("Power Pins", {"GND", "VCC"}) &lt;br /&gt;ICEasy Map Add Group("All Pins", {"IO Pins", "VCC"})&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In this example IO Pins is comprised of 4 groups and has a total of 18 pins.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Using the Digital Instrument’s PMU Capabilities&lt;/h3&gt;ICEasy has several commands that facilitate parametric testing using the digital instrument’s PMU (Parametric Measurement Unit). The commands work on a single pin or on a group. For a single pin the returned variant will contain a single double precision value. When a group is passed in, the measurement command will return a variant containing an array of measurements. The following commands are available:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Measurement Commands:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;b&gt;ICEasy Measure Voltage&lt;/b&gt; (vGroupOrPinNameOrIndex, iMeasureRate): Variant&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ICEasy Measure Current&lt;/b&gt; (vGroupOrPinNameOrIndex, iMeasureRate, iMaxDigits): Variant&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Stimuli Commands:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;b&gt;ICEasy Set Voltage&lt;/b&gt; (vGroupOrPinNameOrIndex, dVoltage, dMaxCurrent)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ICEasy Set Current &lt;/b&gt;(vGroupOrPinNameOrIndex, dCurrent, dVCommHigh, dVCommLow)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Stimuli and Measurement Commands:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;b&gt;ICEasy Set Voltage MeasureCurrent&lt;/b&gt; (vGroupOrPinNameOrIndex, dVoltage, dCurrentLimit, \ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vMeasurePinNameOrIndex, iMeasureRate, iMaxDigit, iDelayMeasure): Variant&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ICEasy Set Voltage MeasureVoltage&lt;/b&gt; (vGroupOrPinNameOrIndex, dVoltage, dCurrentLimit, \ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vMeasurePinNameOrIndex, iMeasureRate, iDelayMeasure) : Variant&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ICEasy Set Current MeasureCurrent&lt;/b&gt; (vGroupOrPinNameOrIndex, dCurrent, dVoltageHighLimit, \ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dVoltageLowLimit vMeasurePinNameOrIndex, iMeasureRate, iMaxDigit, iDelayMeasure) \ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;: Variant&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ICEasy Set Current MeasureVoltage&lt;/b&gt; (vGroupOrPinNameOrIndex, dCurrent, dVoltageHighLimit, \ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dVoltageLowLimit vMeasurePinNameOrIndex, iMeasureRate, iDelayMeasure): Variant&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The stimuli and measurements commands can be used to perform parametric tests such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Continuity, Short, Open tests&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Power Consumption (IDD, IDDQ)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Input Voltage Threshold (VIH, VIL)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Input Leakage (IIH, IIL)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Output Voltage Level (VOH, VOL)&lt;/li&gt;&lt;/ul&gt;These commands can also be used to perform other device characterization procedures such as Functional Tests, IV Curve, and Shmoo Plots.&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Example – Performing a Shorts Test&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The following code shows how to perform a shorts test by checking for a shorted protection diode or checking for a short to other pins. &lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;! set all pins to 0V &lt;br /&gt;ICEasy Set Voltage("All Pins", 0) &lt;br /&gt;! force sink a small current of -500 uAmp and then measure voltage &lt;br /&gt;TestResult=Abs(ICEasy Set Current MeasureVoltage(“D1”, -0.5))&lt;br /&gt;! restore pin setting &lt;br /&gt;ICEasy Set Voltage(“D1”, 0) &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example – IDD Test&lt;/b&gt;&lt;br /&gt;The following code shows how to test for IDD, standby current. &lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;! turn on Vcc and then measure IDD &lt;br /&gt;TestResult=ICEasy Set Voltage MeasureCurrent("Vcc", 4.50) &lt;br /&gt; ! turn off Vcc &lt;br /&gt;ICEasy Set Voltage("Vcc", 0)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Vector Commands&lt;/h3&gt;ICEasy provides the ability to write (and read) vectors to the digital subsystem, execute them, and return an error count.&amp;nbsp;&amp;nbsp;The following are some of Vector commands:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;b&gt;ICEasy Set Vectors &lt;/b&gt;(vGroupOrPinNameOrIndex, vVectors, iVectorStart, iVectorsCount, \ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iRepeatCount)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ICEasy Run Vectors &lt;/b&gt;(vGroupOrPinNameOrIndex, iVectorStart, iVectorsCount, iFrequency, \ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iStrobeDelay): Long&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The first command &lt;b&gt;Set Vector &lt;/b&gt;writes vectors to a group or pin, starting at the DIO vector memory &lt;b&gt;iVectorStart&lt;/b&gt;, and repeating the array of strings passed using the &lt;b&gt;vVectors iRepeatCount &lt;/b&gt;value. The number of vectors is defined by&lt;b&gt; iVectorsCount. vVectors &lt;/b&gt;are the written vectors. Vectors are an array of strings where the first element corresponds to the first vector etc.&amp;nbsp;&amp;nbsp;Each string character op-code corresponds to a digital subsystem channel. &lt;br /&gt;... &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200261\ICEasy.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Click Here to continue to read and download the rest of this article&lt;/a&gt;&lt;/b&gt;</description><link>https://www.MarvinTest.com/KB/Q200261/Getting-Started-with-ICEasy</link><pubDate>9/26/2022</pubDate></item><item><title>PXI Bus expander configuration - Published on 9/16/2022</title><description>It is often necessary to join two or more PXI buses, or a PXI and a PCI bus together in order to control more than one chassis concurrently. This can be accomplished by the use of a PXI bus expander that introduces a PCI to PCI bridge between the two adjoining systems (either PC to Chassis, Laptop to Chassis, or Chassis to Chassis). Several vendors offer solutions with a diverse set of configurations. This article will list the devices that Marvin Test Solutions offers, along with their respective configurations.&lt;br /&gt;&lt;br /&gt;When choosing the PXI Bus Expander that is right for your application, make note of the configuration type and the bus types that will be bridged.&lt;br /&gt;&lt;br /&gt;The following is a list of possible configurations and solutions that Marvin Test Solutions offers:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Desktop PC to Chassis&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;For example Desktop to &lt;a href='http://www.marvintest.com/Product.aspx?model=GX7600+Series' target='_blank'&gt;GX7600&lt;/a&gt; PXI Express Chassis&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200168\DesktopToChassis.bmp" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;PCI to PXI (&lt;a href='http://www.marvintest.com/Product.aspx?model=GX7000A+Series' target='_blank'&gt;GX7000A&lt;/a&gt;, &lt;a href='http://www.marvintest.com/Product.aspx?model=GX7100A+Series' target='_blank'&gt;GX7100A&lt;/a&gt;, and &lt;a href='http://www.marvintest.com/Product.aspx?model=GX7300+Series' target='_blank'&gt;GX7300&lt;/a&gt; chassis only)&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;a href='http://www.marvintest.com/Product.aspx?model=GX7990+Series' target='_blank'&gt;GX7990&lt;/a&gt; - 132 MB/s with a copper parallel type connector&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;a href='http://www.marvintest.com/Product.aspx?model=GX7990+Series' target='_blank'&gt;GX7992&lt;/a&gt; - Star Fabric type connector&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;a href='http://www.marvintest.com/Product.aspx?model=MXI-4+Series' target='_blank'&gt;MXI-4-C&lt;/a&gt; - 132 MB/s with copper serial type connector&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;a href='http://www.marvintest.com/Product.aspx?model=MXI-4+Series' target='_blank'&gt;MXI-4-F&lt;/a&gt; - 132 MB/s with fiber optic connection allowing a long cable length up to 200 meters&lt;br /&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;PCI Express to PXI (&lt;a href='http://www.marvintest.com/Product.aspx?model=GX7000A+Series' target='_blank'&gt;GX7000A&lt;/a&gt;, &lt;a href='http://www.marvintest.com/Product.aspx?model=GX7100A+Series' target='_blank'&gt;GX7100A&lt;/a&gt;, and &lt;a href='http://www.geotestinc.com/Product.aspx?model=GX7300+Series' target='_blank'&gt;GX7300&lt;/a&gt; chassis only)&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;a href='http://www.marvintest.com/Product.aspx?model=MXIe-Express+Series' target='_blank'&gt;MXI-EXPRESS&lt;/a&gt; - x1 lane, single port (one chassis)&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;a href='http://www.marvintest.com/Product.aspx?model=MXIe-Express+Series' target='_blank'&gt;MXI-EXPRESS&lt;/a&gt; - x1 lane, dual port (two chassis)&lt;br /&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;PCI Express to PXI Express (&lt;a href='http://www.marvintest.com/Product.aspx?model=GX7100E+Series' target='_blank'&gt;GX7100E&lt;/a&gt;, &lt;a href='http://www.marvintest.com/Product.aspx?model=GX7200+Series' target='_blank'&gt;GX7200&lt;/a&gt;, &lt;a href='http://www.marvintest.com/Product.aspx?model=GX7600+Series' target='_blank'&gt;GX7600&lt;/a&gt;) Chassis only&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;a href='http://www.marvintest.com/Product.aspx?model=MXIe-Express+Series' target='_blank'&gt;MXIe1-EXPRESS&lt;/a&gt; - 192 MB/s Express x1 connection&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;a href='http://www.marvintest.com/Product.aspx?model=MXIe-Express+Series' target='_blank'&gt;MXIe4-EXPRESS&lt;/a&gt; - 798 MB/s Express x4 connection&lt;br /&gt;&lt;/blockquote&gt;&lt;b&gt;Laptop to Chassis&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ExpressCard to PXI (&lt;a href='http://www.marvintest.com/Product.aspx?model=GX7000A+Series' target='_blank'&gt;GX7000A&lt;/a&gt;, &lt;a href='http://www.marvintest.com/Product.aspx?model=GX7100A+Series' target='_blank'&gt;GX7100A&lt;/a&gt;, and &lt;a href='http://www.marvintest.com/Product.aspx?model=GX7300+Series' target='_blank'&gt;GX7300&lt;/a&gt; chassis only)&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;a href='http://www.marvintest.com/Product.aspx?model=MXIe-Express+Series' target='_blank'&gt;MXIe1-PXI-L&lt;/a&gt; - ExpressCard Laptop Interface&lt;br /&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;ExpressCard to PXI Express (&lt;a href='http://www.marvintest.com/Product.aspx?model=GX7100E+Series' target='_blank'&gt;GX7100E&lt;/a&gt;, &lt;a href='http://www.marvintest.com/Product.aspx?model=GX7200+Series' target='_blank'&gt;GX7200&lt;/a&gt;, &lt;a href='http://www.marvintest.com/Product.aspx?model=GX7600+Series' target='_blank'&gt;GX7600&lt;/a&gt;) Chassis only&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;a href='http://www.marvintest.com/Product.aspx?model=MXIe-Express+Series' target='_blank'&gt;MXIe1-EXPRESS-L&lt;/a&gt; - ExpressCard Laptop Interface&lt;br /&gt;&lt;/blockquote&gt;&lt;b&gt;Thunderbolt to Chassis&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Thunderbolt to PXI Express (&lt;a href='http://www.marvintest.com/Product.aspx?model=GX7100E+Series' target='_blank'&gt;GX7100E&lt;/a&gt;, &lt;a href='http://www.marvintest.com/Product.aspx?model=GX7200+Series' target='_blank'&gt;GX7200&lt;/a&gt;, &lt;a href='http://www.marvintest.com/Product.aspx?model=GX7600+Series' target='_blank'&gt;GX7600&lt;/a&gt;) Chassis only&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;a href='https://www.marvintest.com/Product/MXI-E-Thunderbolt' target='_blank'&gt;MXI-E Thunderbolt&lt;/a&gt; - Thunderbolt 3 Interface&lt;br /&gt;&lt;/blockquote&gt;&lt;b&gt;Chassis to Chassis&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200168\ChassisToChassis.bmp" alt`=&amp;quot; border='0' /&gt;&lt;ul&gt;&lt;li&gt;PXI to PXI (All chassis &lt;a href='http://www.marvintest.com/Product.aspx?model=GX7000A+Series' target='_blank'&gt;GX7000A&lt;/a&gt;, &lt;a href='http://www.marvintest.com/Product.aspx?model=GX7100A+Series' target='_blank'&gt;GX7100A&lt;/a&gt;, &lt;a href='http://www.marvintest.com/Product.aspx?model=GX7300+Series' target='_blank'&gt;GX7300&lt;/a&gt;, and &lt;a href='http://www.marvintest.com/Product.aspx?model=GX7600+Series' target='_blank'&gt;GX7600&lt;/a&gt; )&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;a href='http://www.marvintest.com/Product.aspx?model=GX7990+Series' target='_blank'&gt;GX7990-1&lt;/a&gt; - 132 MB/s with a copper parallel type connector&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;a href='http://www.marvintest.com/Product.aspx?model=GX7990+Series' target='_blank'&gt;GX7992-1&lt;/a&gt; - Star Fabric type connector&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;a href='http://www.marvintest.com/Product.aspx?model=MXI-4+Series' target='_blank'&gt;MXI-4-C&lt;/a&gt; - 132 MB/s with copper serial type connector&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;a href='http://www.marvintest.com/Product.aspx?model=MXI-4+Series' target='_blank'&gt;MXI-4-F&lt;/a&gt; - 132 MB/s with fiber optic connection allowing a long cable length up to 200 meters&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;The above mentioned part numbers represent a kit, that includes two devices, each attached to its respective bus, and a cable that connects them. Each part in this kit can also be ordered separately upon request.</description><link>https://www.MarvinTest.com/KB/Q200168/PXI-Bus-expander-configuration</link><pubDate>9/16/2022</pubDate></item><item><title>White Paper: Sustainment Challenges and Approaches for  Legacy ATE Systems - Published on 9/14/2022</title><description>Lifecycle management is the bane of existence for many test engineers.&amp;nbsp;&amp;nbsp;Opportunities to transition to that next new exciting project can be hampered by the need to keep deployed automatic test equipment (ATE) operational, especially as these systems continue to be pushed beyond their initial life projections. &lt;br /&gt;&lt;br /&gt;Multiple alternatives for legacy ATE sustainment are available and range from the stockpiling of spares to leveraging the secondary market to acquiring COTS instrumentation to the development of exact FFF replacements with each having its own set of advantages and disadvantages; timeline, budget, future support projections, engineering resources and the size of the deployed ATE and TPS footprint must all be considered during the evaluation.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Download this white paper to learn how to analyze the available alternatives and choose the best approach.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2022\Legacy_ATE_Challenges.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200348/White-Paper-Sustainment-Challenges-and-Approaches-for-Legacy-ATE-Systems</link><pubDate>9/14/2022</pubDate></item><item><title>Calling DLL functions from MATLAB using C Header Files - Published on 9/14/2022</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;MATLAB® support using and calling DLL Windows libraries, This article shows how to use a library &lt;b&gt;GXAO.DLL&lt;/b&gt; and the C Header file to call and control the &lt;b&gt;GX1648&lt;/b&gt; instrument. The GXAO.dll and the &lt;b&gt;GxAo.h&lt;/b&gt; are provided with the &lt;b&gt;GXAO software package&lt;/b&gt;. The example was written with MATLAB® 2020b.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;MATLAB® DLL Support&lt;/h3&gt;It is useful to note that after MATLAB® release 2015b, 32-bit DLL are no longer supported. Currently, the required tools are provided in a core installation of MATLAB® 9.9 without the addition of toolboxes[1]. Once a library is loaded, you can view[2] and call its C-compatible functions. More information about troubleshooting, limitations, data types etc. regarding MATLAB®'s C -interface is available on MathWorks' website[4], all of which is a recommended read when preparing to use driver libraries from MATLAB®.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Method&lt;/h3&gt;Firstly, the shared library needs to be loaded. This can be achieved by using the MATLAB® function &lt;b&gt; loadlibrary(libname, hfile)&lt;/b&gt;. In the included example, we are modifying the GxAo.h to simplify and remove the included using modified GxAo.h named m_GxAo.h for hfile argument. It includes Windows.h before GxAo.h. There are also other ways to include the needed Windows.h using overrides like loadlibrary(libname,hfile,Name,Value), master headers and so on. Different methods were tested to load libraries. The one used in the provided example was deemed the most stable out of the ones that were experimented with. Once library is loaded successfully, you can inspect the callable functions using another tool libfunctionsview[2].&lt;br /&gt;Calling loaded functions is done using the MATLAB®&amp;nbsp;&amp;nbsp;function &lt;b&gt;[x1,...,xN] = calllib(libname,funcname,arg1,...,argN) &lt;/b&gt;. The function accepts loaded libname, funcname and funcname's arguments[1]. The return values are ordered and correspond to the function prototypes, which are easy to view for example with MATLAB® function &lt;b&gt;libfunctionsview&lt;/b&gt;, header file or by following the instrument's function reference available in its user's guide. Using libfunctionsview has the added benefit of mapping data types to Matlab. Please refer to MatlabGxAoExample for examples on how to load, initialize variables and call library functions.&lt;br /&gt;Note that when working with MATLAB® data types and especially when passing pointers, it is not uncommon to crash MATLAB® if not declaring the DLL function parameters properly, using for example libfunctionsview will help with this problem. &lt;br /&gt;he example provided includes a modified header file, m -file as well as a published run of the script using GX1648 that is supported by the GXAO software package. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;Calling Marvin Test Solution DLL functions used to control instruments from MATLAB® is fairly straightforward. MATLAB®&amp;nbsp;&amp;nbsp;loadlibrary and calllib functions and the DLL C header are used to perform&amp;nbsp;&amp;nbsp;this task. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;References&lt;/h3&gt;&lt;b&gt;[1]&lt;/b&gt;&lt;br /&gt;Matlab provides functions loadlibrary and calllib to load and call library functions:&lt;ul&gt;&lt;li&gt;&lt;a href='https://www.mathworks.com/help/matlab/ref/loadlibrary.html?searchHighlight=loadlibrary&amp;s_tid=srchtitle' target='_blank'&gt;Mathworks:loadlibr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='https://www.mathworks.com/help/matlab/ref/calllib.html?searchHighlight=calllib&amp;s_tid=srchtitle' target='_blank'&gt;Mathworks:calllib&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;[2]&lt;/b&gt;&lt;br /&gt;Reading library function signatures gives an easy way of initializing MATLAB® variables correctly. A GUI is provided for reading library functions signatures:&lt;ul&gt;&lt;li&gt;&lt;a href='https://www.mathworks.com/help/matlab/ref/libfunctionsview.html?searchHighlight=libfunctionsview&amp;s_tid=srchtitle' target='_blank'&gt;Mathworks:libfunctionsview&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;[3]&lt;/b&gt;&lt;br /&gt;A MATLAB® example was written and published using the above knowledge and is available to download:&lt;ul&gt;&lt;li&gt;Example files&lt;ul&gt;&lt;li&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200339\MatlabGxAoExample.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;MatlabGxAoExample.zip&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Published run&lt;ul&gt;&lt;li&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200339\MatlabGxAoExample.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;MatlabGxAoExample.pdf&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;[4]&lt;/b&gt;&lt;br /&gt;MATLAB® external language interface for C libraries:&lt;ul&gt;&lt;li&gt;&lt;a href='https://www.mathworks.com/help/matlab/call-c-library-functions.html' target='_blank'&gt;Mathworks:C Libraries in MATLAB&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200339/Calling-DLL-functions-from-MATLAB-using-C-Header-Files</link><pubDate>9/14/2022</pubDate></item><item><title>ATEasy Crash Analysis Tool - Published on 9/14/2022</title><description>&lt;h3&gt;What is the ATEasy crash analysis tool?&lt;/h3&gt;The ATEasy Crash Analysis Tool replaces the default exception window generated by Windows when any application crashes. It is designed to provide the user with additional support when developing and debugging ATEasy applications. The &lt;b&gt;ATEasy Exception Window&lt;/b&gt; created provides a snapshot of your information at the moment the exception was generated. It displays the exception as reported by Windows and a listing of the ATEasy procedure call stack organized by the user running threads. More information regarding the ATEasy internal libraries is logged to the&lt;b&gt; Windows Application Events Log&lt;/b&gt; to be used for user bug tracking and application debugging by Marvin Test Solutions engineers.&lt;br /&gt;&lt;br /&gt;The crash analysis tool is available in ATEasy version 8 and later.&lt;br /&gt;&lt;br /&gt;The following window shows the generic exception as displayed by Windows when it traps the application exception:&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200213\kb_WindowsExceptionDialog.bmp" alt="An application without crash analysis" title="An application without crash analysis" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;The Windows Generic Exception Dialog&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The following window shows the ATEasy Exception window:&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200213\ATEasyExceptionWindow.jpg" alt="ATEasy using crash analysis" title="ATEasy using crash analysis" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;The ATEasy Exception Dialog&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Exit&lt;/b&gt; will close the ATEasy Exception window and the ATEasy application without saving any information.&lt;br /&gt;&lt;b&gt;Save...&lt;/b&gt; will prompt the user to select a file location to save the event log with ATEasy events including the currently reported error and other events related to the most recent ATEasy session.&lt;br /&gt;&lt;b&gt;Save All...&lt;/b&gt; will prompt the user to select a file location to save the event log with all ATEasy events currently in the Windows Event log including time-stamped exceptions that may have occurred in previous sessions.&lt;br /&gt;&lt;br /&gt;If the Dump (.dmp) checkbox is checked, a dump file will be created and zipped. The zip file will be placed in the same directory as the event log created during a &lt;b&gt;Save...&lt;/b&gt; or &lt;b&gt;Save All...&lt;/b&gt; button press.&amp;nbsp;&amp;nbsp;The dump file contains a memory snapshot of the ATEasy or ATEasy application at the time of the crash.&lt;br /&gt;&lt;br /&gt;The event file and dump file can be uploaded to a Magic incident for further analysis by Marvin Test Solutions engineers to debug and possibly fix the issue caused by the application or by internal ATEasy error.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Breakdown: What does the log information mean?&lt;/h3&gt;Sample Exception Log Window Information:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Unhandled exception at 0x1051b628 (Base address = 0xfdd0000) in C:\Program Files (x86)\Marvin Test Solutions\ATEasy\2021\ATEasy.exe : Memory access violation 0xc0000005&lt;br /&gt;Thread (Current) Index=0, ID=0x4164, Handle=0x1430, UUT=-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;ATEasy Call Stack&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ATEasyExceptionProcedure (Program=Language, Type=Procedure) Line 6&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Parameters&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;astNested=??????&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;al={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Local Variables&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dw=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Internal PCode&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;Internal Call Stack&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;Thread Index=1, ID=0x2464, Handle=0x0, UUT=-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;Thread Index=2, ID=0x940, Handle=0x0, UUT=-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;Thread Index=3, ID=0x46e4, Handle=0x0, UUT=-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The Threads Call Stack tree view displays the following information:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Thread.&lt;/b&gt; The first line always displays the thread where the crash occurred. This could be a user thread running ATEasy code or a thread created by the ATEasy development environment or the ATEasy run-time. If your application is multi-threaded, additional user threads are also displayed at the time of the crash as top level items of the tree view.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Call Stack and PCODE.&lt;/b&gt; The items below each of the threads are the call stack followed by PCODE (pseudo code) information (only for the current thread). The current thread top item is the position in the code where the crash occurred. The position can be a procedure or test followed by a line number in the ATEasy code. For the current thread the next line shows the position in the PCODE followed by a PCODE memory dump of the procedure or test that caused the exception&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Getting more information with the Windows Application Event Log&lt;/h3&gt;The ATEasy call stack will help you pinpoint where the error occurred.&amp;nbsp;&amp;nbsp;If you still require assistance with analyzing the crash, you can send Marvin Test Solutions the Windows Application Event Log filtered for ATEasy events from the Windows Events Viewer.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;How to access the Windows Application Event Log for ATEasy events?&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Open the Event Viewer application.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Navigate the tree view to Event Viewer | Applications and Service Logs | ATEasy&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Each entry in the Event Log corresponds to a documented crash.&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200213\EventViewerATEasyException.PNG" alt="The Windows Event Viewer filtered to show ATEasy Exceptions" title="The Windows Event Viewer filtered to show ATEasy Exceptions" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Saving the log&lt;/h3&gt;After clicking on an entry in the Event View, the Actions panel on the right will be updated with additional options, including "Save Log File As..."&amp;nbsp;&amp;nbsp;The Event Viewer allows you to save to a file with different file formats, select the the &lt;b&gt;EVT log for Windows XP (EVTX for Windows Vista+)&lt;/b&gt; and submit to Marvin Test Solutions by uploading the file to your support incident.&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='2' border=0 class='border'&gt;&lt;tr&gt;&lt;th&gt;&lt;div align='center'&gt;The ATEasy Crash Analysis Tool.&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200213\WindowsATEasyEventLog.jpg" alt="The Windows Application Event Viewer" title="The Windows Application Event Viewer" border='0' &gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;What causes these exceptions?&lt;/h3&gt;ATEasy catches several common exceptions and attempts to notify the user without allowing the application to crash. This protection does not generally extend to external libraries such as DLLs, COM/ActiveX or .NET assemblies that are called by your ATEasy application. Common cause of these exceptions are:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Buffer Overrun&lt;/b&gt;: Error occurs when more data is given to an array than it was allocated.&amp;nbsp;&amp;nbsp;For example calling a DLL function passing in a string that was not&amp;nbsp;&amp;nbsp;sized properly prior to the call, than the DLL function write to the buffer and corrupts the memory which later on cause a crash when accessing the corrupted memory. Generally this shows as memory access violation (0xC0000005) but could also shows as unexpected behavior since memory is corrupted.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Buffer Not Allocated&lt;/b&gt;: Similar to buffer overrun, however the crash will show exactly the location of the problem. Usually memory access as well (0xC0000005). Most likely passing a NULL string to a DLL that does not check for that. The crash occurs when the DLL attempt to write to address 0.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;DLL Parameter Mismatch&lt;/b&gt;: Parameter expected by DLL are not configured properly: wrong number of parameters or wrong data type.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Exception Thrown from an External Library&lt;/b&gt;: Exceptions generated from DLL/ActiveX or .NET will be passed up to ATEasy for reporting.&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200213/ATEasy-Crash-Analysis-Tool</link><pubDate>9/14/2022</pubDate></item><item><title>White Paper: Organizational Level Armament Test Reimagined - Published on 9/14/2022</title><description>Armament testing is challenging, and problematic on good days, but when the aircraft and munitions advance exponentially faster than the test equipment it quickly becomes a daunting task.&amp;nbsp;&amp;nbsp;Challenges such as numerous testers to utilize and master, along with outdated test equipment, have taken a toll on many maintainers over the years, and prevent full realization of Agile Combat Employment (ACE).&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Download this white paper to learn how innovative solutions such as the SmartCan have the potential to rewrite armament testing models, finally advancing the required test equipment into the digital era.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2022\O_Level_Armament_Test_Reimagined.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200349/White-Paper-Organizational-Level-Armament-Test-Reimagined</link><pubDate>9/14/2022</pubDate></item><item><title>Using HW PXI/PCI Explorer Applet - Published on 8/16/2022</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;The &lt;b&gt;PXI/PCI Explorer&lt;/b&gt; is a PXI/PCI based VISA compatible resource manager control panel applet that provides the following features: &lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Compatible with VISA standard for PXI/PCI cards (see &lt;a href='http://www.ivifoundation.org/specifications/default.aspx' target='_blank'&gt;VISA, IVI Foundation&lt;/a&gt; for more information)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Generates or maintain VISA PXI configuration files: PXISys.ini, PXIeSYS.ini&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Supports PXI specification's chassis, controller, and peripheral module ini files&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Displays device resources: IRQ, DMA, Memory, IO&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Displays device information: Slot, Device and Manufacturer ID, Alias&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Supports name or numeric alias for devices&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Allows dynamic scan of system devices (see &lt;a href='http://www.MarvinTest.com/KnowledgeBase/KBArticle.aspx?ID=182' target='_blank'&gt;Scanning a PXI system to learn about system resources&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Displays PCI bus, bridges, slots and more&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Displays PXI slots with PXI symbols&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Displays and provides a way to change the current VISA status, resource and PXI trigger manager&lt;/li&gt;&lt;/ul&gt; &lt;ul&gt;&lt;li&gt;Notifies of available MTS software updates&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Exports PC/PXI system information for MTS diagnostics/troubleshooting&lt;/li&gt;&lt;/ul&gt; &lt;/blockquote&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;PXI/PCI Explorer&lt;/b&gt; is provided with the MTS (Marvin Test Solutions) &lt;b&gt;HW&lt;/b&gt; driver - Hardware Access Software package that provides the services: &lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Programming API used by instrument drivers to provide access to instrument configuration, memory, IO registers, DMA and interrupts resources&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Access to PCI/PXI instruments PC PCI / PXI bus devices and resources such as memory, IO registers, DMA and interrupts&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Windows device driver for PCI/PXI instruments. Supported Marvin Test Solutions instruments are listed in the HW.inf file&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;The MTS &lt;b&gt;HW&lt;/b&gt; driver is included within all MTS software packages, including ATEasy and instrument drivers such as GxDmm, GxCnt, GtDio, etc. It is also available as a stand alone package.&lt;br /&gt;&lt;br /&gt;To download the current &lt;b&gt;HW&lt;/b&gt; software &lt;a href='https://www.marvintest.com/Product.aspx?Model=HW' target='_blank'&gt;click here&lt;/a&gt;. &lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+ATEasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PXI/PCI Explorer&lt;/h3&gt;To open the Explorer application, click on the Windows &lt;b&gt;Start&lt;/b&gt; button, &lt;b&gt;Marvin Test Solutions&lt;/b&gt;,&amp;nbsp;&amp;nbsp; or double click on the desktop icon as shown below:&lt;br /&gt;&lt;blockquote&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200273\PXIExplorerIcon.JPG" alt="PXI/PCI Explorer Windows Icon" title="PXI/PCI Explorer Windows Icon" border='0' &gt;&lt;/blockquote&gt; &lt;br /&gt;The MTS &lt;b&gt;PXI/PCI Explorer&lt;/b&gt; contains three tabs: Slots, VISA and Status. The Slots tab displays the current hardware including chassis, buses, controllers and cards. The VISA tab displays the current installed version of VISA and allows the user to change the active resource and trigger managers. The Status tab contains a listing of the current PXI and PCI files needed to communicate with the installed hardware.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Slots Tab&lt;/h3&gt;The Slots tab displays the current hardware, including all found chassis, buses, controllers and cards. The tab page consists of a tree view that opens to display the PXI System, Chassis and Slots contained in the system. The following is an example of the Slots tab on a Gx7600 chassis using the Gx7944 embedded controller. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200273\HW Slots.JPG" alt="PXI/PCI Explorer Embedded Controller" title="PXI/PCI Explorer Embedded Controller" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1: PXI/PCI Explorer Embedded Controller&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PXI System Context Menu and Slots Tab Buttons&lt;/h3&gt;The PXI System Context Menu is available by right clicking on the PXI system and selecting the desired option as shown below. There are 4 Buttons on the PXI/PCI Explorer Slots Tab: Display Options, Reset Chassis List, Scan for New Devices and Save. In addition is an Identify Controller As pull down menu. These buttons and pull down menu provide an alternate selection method to the PXI System Context Menu and are described below,&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200273\HW Context Menu.JPG" alt="PXI System Context Menu" title="PXI System Context Menu" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2: PXI System Context Menu&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Display Options:&lt;/b&gt; When selected brings up a list of options that can be selected to change the Slots page view. These devices include third party PXI devices as well as MTS devices, and any peripherals on the PCI bus. Any or all of these options can be selected. By default all PXI devices initially detected during panel startup are displayed.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200273\HW Display Options.JPG" alt="HW Display Options" title="HW Display Options" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3: HW Display Options&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reset Chassis List:&lt;/b&gt; When selected forces the PXI/PCI Explorer to re-scan the PXI / PCI bus and displays the current devices and or new chassis found in the system. Pressing this button can also trigger an alignment of the cards below a chassis. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scan for New Devices:&lt;/b&gt; When selected forces the PXI/PCI Explorer to re-scan the bus for any new PXI or PCI devices, but does not check for a new chassis. If new cards have been installed in the chassis or a device driver was just installed and the card still displays PCI device, pressing Scan for New Devices will reload the device list to show the current names of the installed instruments.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Save:&lt;/b&gt; After making any changes to the PXI/PCI Explorer, when selected settings are saved to the PXISys.ini file. If the settings are not saved to the PXISys.ini file, devices may not initialize or function properly when used.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Identify Controller As:&lt;/b&gt; The Controller is normally identified when the PXI/PCI Explorer is scanned however if this is in error the controller type can be selected manually using the pull down menu.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Populated PXI/PXIe Slots &lt;/h3&gt;The Slots display information about the PXI/PXIe hardware found in the system. When expanded it displays the slot type, the current VISA status (If installed) and other board specific resources. This includes the slot number of the module, legacy slot, alias and folders that contain the current device and PXI settings. These resources can be displayed or in some cases edited as detailed below. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;VISA Resource:&lt;/b&gt; The VISA resource is displayed along with its current status. The VISA resource number is comprised of the bus and device number of the module. In the case of the GX5295 installed in slot 9, the bus number is 4 and the device number is 12. The VISA resource name is normally used to initialize third party instruments that only support VISA however this name can also be used to initialize an MTS module using the MTS driver GxXXXInitialize function, where XXX is the mnemonic of the instrument such as DIO, CNT, DMM, etc. For example, Dio Initialize Master(1, 0, "PXI4::12::INSTR") initializes the GX5295 located in Slot 9. The VISA resource number is not editable.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;nSlot:&lt;/b&gt; The nSlot number is comprised of the chassis (0x100) and the slot number (0x9). The value is displayed in hexadecimal. The nSlot number 0x109 indicates that the instrument is installed chassis 1 slot 9 and can be used to initialize the instrument using the MTS GxXXXInitialize function. The nSlot number is especially useful to initialize instruments in multiple chassis. For example, Dio Initialize Master(1,0x109) initializes the GX5295 located in chassis 1, Slot 9.The nSlot value is not editable. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200273\HW Visa Resource.JPG" alt="HW Visa Resource and nSlot" title="HW Visa Resource and nSlot" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4: HW Visa Resource and nSlot&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Legacy nSlot:&lt;/b&gt; This number is by default the same as the nSlot number minus the chassis number (0x100) and is displayed in decimal. It can have a value of 2 - 255 or can be unassigned. This number provides a shortcut to initializing an instrument using only the Legacy slot number as apposed to using the nSlot number above, i.e. 9 instead of 0x109. For example, Dio Initialize Master(1,9) initializes the GX5295 located in slot 9. The Legacy nSlot number can be used to initialize any Marvin Test Solutions instruments using the MTS GxXXXInitialize function. &lt;br /&gt;&lt;br /&gt;Since slot numbers are virtual constructs in PCI, it sometimes happens that when installing the instrument drivers, Windows resolves the slot number incorrectly.&amp;nbsp;&amp;nbsp;If this happens, the slot number can be edited by selecting the Legacy nSlot field and choosing the correct slot number from the combo box that appears below the buttons. &lt;br /&gt;&lt;br /&gt;Using the Legacy nSlot number to initialize a module is also useful if an instrument is moved in the system causing the system configuration to change. Since the Legacy nSlot is virtual it can simply be remapped in &lt;b&gt;PCI/PXI Explorer&lt;/b&gt; to match the existing test program and thus avoiding changes and or recertification. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200273\HW Legacy Slot.JPG" alt="Select Legacy nSlot" title="Select Legacy nSlot" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5: Select Legacy nSlot&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Alias&lt;/b&gt;: An Alias can be used to identify an instrument using a name without having to define the location of the instrument. To add or change the Alias name, select the Alias field and type the desired name into the text box that appears below the buttons of the Slots tab. For example two Alias names DUT1 and DUT2 are defined in &lt;b&gt;PXI/PCI Explorer&lt;/b&gt; below to be used as an example to initialize two GX5295's without specifying a device slot or VISA resource name.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200273\HW Alias 2.JPG" alt="Modifying Alias in PXI/PCI Explorer" title="Modifying Alias in PXI/PCI Explorer" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6: Using Alias Names in PXI/PCI Explorer&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To use the Alias names in an application the &lt;b&gt;HW&lt;/b&gt; driver must be installed along with all other instrument drivers. If using ATEasy the &lt;b&gt;HW&lt;/b&gt; driver is automatically initialized. If using third party software tools the user must call HwOpen() to initialize the &lt;b&gt;HW&lt;/b&gt; driver. After adding the GX5295 driver be sure to set the Skip On Init variable to 1 to skip automatic initialization of the instrument. The following ATEasy procedure can be used to initialize two GX5295's using Aliases "DUT1" and "DUT2" as defined in &lt;b&gt;PXI/PCI Explorer&lt;/b&gt; detailed above:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;ATEasy Procedure DioAliasInit(): Void&lt;br /&gt;-------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;lSlot: Long&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Using an PXI-PCI Explorer Alias to Initalize the GX5295&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Use "Skip On Init" to disable automatic initialization of the GX5295&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;!The following procedure uses the HW and GX5295 driver functions,&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Long HwPciGetAliasChassisSlot(sAlias) Returns nSlot used by GXXXInitialize&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Void InitializeMaster(nMasterNumber,nSlot,sVisaResource) Master board Init&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Void HwOpen() is automatically called by ATEasy&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Initialization for GX5295 Master 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;lSlot = HW Pci Get AliasChassisSlot("DUT1") &lt;br /&gt;&amp;nbsp;&amp;nbsp;Dio Initialize Master(1,lSlot,"") &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Initialization for GX5295 Master 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;lSlot = HW Pci Get AliasChassisSlot("DUT2") &lt;br /&gt;&amp;nbsp;&amp;nbsp;Dio Initialize Master(2,lSlot,"") &lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For a detailed explanation of using Alias's to initialize MTS instrumentation refer to Knowledge Base article &lt;a href='http://www.MarvinTest.com/KnowledgeBase/KBArticle.aspx?ID=187' target='_blank'&gt;Using an Alias to address PXI instruments&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Device Settings:&lt;/b&gt; To view the Device Settings open the folder under the desired module. This folder displays the Bus, Device, Function, Device ID, Vendor ID and the memory allocated for the module. The information described in the Device Settings can be useful in finding specific modules in a chassis using the Device ID and the Vendor ID and the supplied &lt;b&gt;HW&lt;/b&gt; driver. &lt;br /&gt;&lt;br /&gt;The Device Settings can help to determine if the module has the correct resources allocated. For example, if no Memory is displayed, then the module was not allocated memory resources on system boot-up. In this case the device driver may need to be installed prior to installing the hardware to allow these resources to be allocated. A module may also have interrupts enabled, this would also be indicated in the Device Settings. The device settings are not editable.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200273\HW Device Settings.JPG" alt="Device Settings" title="Device Settings" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 7: Device Settings&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;The Device Settings can also be obtained programmatically using &lt;b&gt;HW&lt;/b&gt; driver functions such as PciGetSlotDevice. The PciGetSlotDevice function can be used to not only provide information on all devices in a system but allow the user to write a driver using the information returned in the HWPCIDEVICE structure. The following is an ATEasy procedure that displays the Device Settings of all devices found in the chassis.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure DisplayDeviceInfo(): Void&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;lSlot: Long&lt;br /&gt;nCntr: Short&lt;br /&gt;stPciDevice: structHWPCIDEVICE&lt;br /&gt;{&lt;br /&gt;!DisplayDeviceInfo&lt;br /&gt;!This example demonstrates using the HW driver library function HwPciGetSlotDevice&lt;br /&gt;!to obtain PCI/PXI device configuration of each slot of a system. The variable&lt;br /&gt;!stPciDevice is defined as a HWPCIDEVICE structure. The for-next loop prints &lt;br /&gt;!the information found in each populated slot&lt;br /&gt;	&lt;br /&gt;Log.PlainText=True&lt;br /&gt;ClearLog()&lt;br /&gt;	&lt;br /&gt;HW Initialize()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! Must be called before any HW call&lt;br /&gt;HW Pci AssignDeviceSlot()&amp;nbsp;&amp;nbsp; ! Assign slots to all devices&lt;br /&gt;	&lt;br /&gt;for lSlot=0 to HW_MAX_SLOTS-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HW Pci Get SlotDevice(lSlot, stPciDevice)	 ! Get the device in the specified slot&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if stPciDevice.dwVendorId&lt;&gt;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! if populated slot, print the device info&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; append "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Slot ";lSlot;" - Bus ";stPciDevice.dwBus;", Device ";\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stPciDevice.stPciSn.dwAsUlong and 0x1F;\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;", Function ";(stPciDevice.stPciSn.dwAsUlong shr 5) and 0x7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; append "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - VendorID 0x";ucase(str(stPciDevice.stPciCfg.wVendorId, 16));\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;", SubVendorID 0x";ucase(Str(stPciDevice.stPciCfg.stType0.dwSubVendorID, 16))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; append "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - DeviceID 0x";ucase(str(stPciDevice.stPciCfg.wDeviceId, 16));\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;", SubSystem 0x";ucase(Str(stPciDevice.stPciCfg.stType0.dwSubSystem, 16))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for nCntr=0 to 7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select stPciDevice.aResDesc[nCntr].ucType&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;append "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Port:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0x";\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ucase(Str(stPciDevice.aResDesc[nCntr].Address1, 16));\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; " Length 0x";ucase(str(stPciDevice.aResDesc[nCntr].Address3, 16))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;append "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Interrupt: 0x";\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ucase(Str(stPciDevice.aResDesc[nCntr].Address1, 16))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;append "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Memory:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0x";\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ucase(Str(stPciDevice.aResDesc[nCntr].Address1, 16));\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; " Length 0x";ucase(str(stPciDevice.aResDesc[nCntr].Address3, 16))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; endselect&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;next&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;For more information on using the &lt;b&gt;HW&lt;/b&gt; driver PciGetSlotDevice function and the HWPCIDEVICE structure refer to HW.h and Hw.drv files included on your system. In addition refer to Knowledge Base articles &lt;a href='http://www.MarvinTest.com/KnowledgeBase/KBArticle.aspx?ID=182' target='_blank'&gt;Scanning a PXI system to learn about system resources&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt; and &lt;a href='http://www.MarvinTest.com/KnowledgeBase/KBArticle.aspx?ID=187' target='_blank'&gt;What is HW driver?&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PXI Settings:&lt;/b&gt; To view the PXI Settings open the folder under the desired module. This folder displays the Bus, Device, Slot Path, Local Bus Left and Local Bus Right and any External Backplane Interface.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200273\HW PXI Settings.JPG" alt="PXI Settings" title="PXI Settings" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 8: PXI Settings&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;VISA Tab&lt;/h3&gt;The VISA tab allows the user to view the current VISA status as well as display or control the Active Resource Manager and the PXI Default Trigger manager, as detailed below.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200273\HW VISA.JPG" alt="VISA page of PXI/PCI Explorer" title="VISA page of PXI/PCI Explorer" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 9: VISA Tab of PXI/PCI Explorer&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;VISA Status&lt;/b&gt; Displays the current status of VISA on the system. This includes whether it is installed, working properly and the current VISA version.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Active Resource Manager&lt;/b&gt; When using strictly 3rd party tools to control hardware it is recommended to select the 3rd party as the Active Resource Manager. When using Marvin Test Solutions software tools or 3rd party tools that are not listed in the drop-down menu it is recommended to select Marvin Test Solutions as the Active Resource Manager. This setting can be changed using the pull down menu to select the desired manager. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;PXI Default Trigger Manager&lt;/b&gt; When using strictly 3rd party tools to control hardware it is recommended to select the 3rd party as the PXI Default Trigger Manager. When using Marvin Test Solutions software tools or 3rd party tools that are not listed in the drop-down menu it is recommended to select&amp;nbsp;&amp;nbsp;Marvin Test Solutions as the PXI Default Trigger Manager. This setting can be changed using the pull down menu to select the desired manager. If an application does not require triggering then this setting can be ignored. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Software Tab&lt;/h3&gt;The Software tab allows the user to see all registered MTS software as well as the currently installed and latest available software versions.&amp;nbsp;&amp;nbsp;The user can also access upgrade links and configure how often they would like to check for upgrades.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200273\HW Software.JPG" alt="Software page of PXI/PCI Explorer" title="Software page of PXI/PCI Explorer" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 10: Software Tab of PXI/PCI Explorer&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Marvin Test Solutions Installed Software&lt;/b&gt;&lt;br /&gt;This grid displays the list of all software currently registered on this PC alongside the installed version.&amp;nbsp;&amp;nbsp;The information is pulled from the local Windows registry.&amp;nbsp;&amp;nbsp;The latest available software version is also displayed if the computer has access to the Internet.&amp;nbsp;&amp;nbsp;If the latest version is newer than the current version, a link will be displayed which will open the default web browser and open the product's software page where the user can download a setup installer.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Check for Updates&lt;/b&gt;&lt;br /&gt;This button checks immediately for updates and provides feedback in the form of a pop-up message.&amp;nbsp;&amp;nbsp;PXI/PCI Explorer will check for updates once when the software is first launched and will perform automatic update checks if this feature is enabled.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Automatic update checking&lt;/b&gt;&lt;br /&gt;If enabled, PXI/PCI Explorer will check for updates every X days as long as the PXI/PCI Explorer is open.&amp;nbsp;&amp;nbsp;To facilitate this, clicking the X button on the PXI/PCI Explorer main form will close the window but the software will continue to run in the Windows notification area.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Status Tab&lt;/h3&gt;The Status tab displays the required PXI/PCI files. The files listed on this tab are used to provide communication to the hardware connected to the PXI, PXIe, PCI and PCIe slots instrumentation included in the system. An installation problem may exist if a named file is displayed and the file size and modified fields of that file name are empty. In that case it is recommended to reinstall the &lt;b&gt;HW driver&lt;/b&gt;. The Status tab also displays the &lt;b&gt;HW driver&lt;/b&gt; version number as well as the Driver / Service status. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200273\HW Status.JPG" alt="Status page of PXI/PCI Explorer" title="Status page of PXI/PCI Explorer" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 11: Status Tab of PXI/PCI Explorer&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Status Tab Buttons&lt;/h3&gt;There are 4 Buttons on the PXI/PCI Explorer status tab: About This PC, Device Manager, System Information, and Export Information as described below.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;About This PC&lt;/b&gt; This button opens the About PC Windows settings page. This allows users to view and or edit Windows Security settings, Device settings and Windows Specifications. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Device Manager&lt;/b&gt; This button opens Windows Device Manager utility. This utility allows users to view and or edit the hardware connected to the computer. This utility will highlight specific nonfunctional hardware and allows the user to install the proper hardware drivers. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;System Information&lt;/b&gt; This button opens Windows System Information utility. This utility allows users to view or edit advanced information about Hardware Resources, System Components and the Software Environment. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Export Information&lt;/b&gt; This button opens a 'Save File' dialog when the user can specify the location of a zip file.&amp;nbsp;&amp;nbsp;This file will be created and filled with system information generated by the Microsoft System Information tool as well as all information that is presenting within the PXI-PCI Explorer Utility.&amp;nbsp;&amp;nbsp;This zip file can be used to provide valuable diagnostic information to MTS customer support engineers when troubleshooting an issue with MTS hardware and software.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Notification Icon&lt;/h3&gt;When the PXI/PCI Explorer is closed by clicking the X button in the top-right corner, it will minimize to the Windows Notification area.&amp;nbsp;&amp;nbsp;From here, it can continue to perform periodic checks for software updates if this feature is enabled.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200273\HW Notification Icon.JPG" alt="PXI/PCI Explorer Notification Icon and menu" title="PXI/PCI Explorer Notification Icon and menu" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 12: PXI/PCI Explorer Notification Icon and menu&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;When the notification icon is right clicked, a context menu will provide three options:&lt;ul&gt;&lt;li&gt;Open: Opens the PXI/PCI Explorer main form.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Update: Initiates an immediate update check, re-opens the PXI/PCI Explorer main form and switches to the software page.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Exit: Closes PXI/PCI Explorer.&amp;nbsp;&amp;nbsp;Automatic update checks will stop until the next time the application is launched.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;b&gt;PXI/PCI Explorer&lt;/b&gt; is an application that is used to view and modify PXI and PCI bus configurations. This application is also a tool to help users easily identify, troubleshoot and correct issues with the hardware in a system. For more information on the &lt;b&gt;HW&lt;/b&gt; driver refer to Knowledge Base articles, &lt;a href='http://www.MarvinTest.com/KnowledgeBase/KBArticle.aspx?ID=182' target='_blank'&gt;Scanning a PXI system to learn about system resources&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;,&amp;nbsp;&amp;nbsp;&lt;a href='http://www.MarvinTest.com/KnowledgeBase/KBArticle.aspx?ID=187' target='_blank'&gt;Using an Alias to address PXI instruments&lt;/a&gt; and &lt;a href='http://www.MarvinTest.com/KnowledgeBase/KBArticle.aspx?ID=187' target='_blank'&gt;What is HW driver?&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200273/Using-HW-PXI-PCI-Explorer-Applet</link><pubDate>8/16/2022</pubDate></item><item><title>ATEasy Licensing Q&amp;A - Published on 7/13/2022</title><description>&lt;h3&gt;General&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;Q.&lt;/b&gt; &lt;b&gt;What kind of licensing does ATEasy have?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A.&lt;/b&gt; ATEasy® has two types of licenses: Single-User and Network.&lt;br /&gt;&lt;br /&gt;A Single-User license is installed on one computer and allows you to use ATEasy on that computer. A Network license is installed at a network server and allows users to work from any computer connected to that network, limited to the number of licenses that have been purchased (concurrent license).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Q. &lt;/b&gt; &lt;b&gt;Can I distribute my ATEasy application?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A. &lt;/b&gt;Yes. ATEasy applications compiled to EXE file are Royalty-Free. You will have to install the ATEasy run-time on each machine that the executable will run.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Q.&lt;/b&gt; &lt;b&gt;Will my license work with any version of ATEasy?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A.&lt;/b&gt; Licenses are purchased for a specific version of ATEasy only and will not work with newer versions of that product.&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;Q.&lt;/b&gt; &lt;b&gt;I installed a license for version 9.0. Can I use version 10.0 with that license?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A.&lt;/b&gt; No, You cannot. If you have an active subscription plan, You can request a&amp;nbsp;&amp;nbsp;license that will work with all the ATEasy versions including 10.0 and 9.0. Contact our support using Marvin Test Solutions website (&lt;a href='https://www.marvintest.com/Magic/MGLogin.aspx' target='_blank'&gt;M@GIC&lt;/a&gt; portal) and request a license upgrade.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Q.&lt;/b&gt; &lt;b&gt;I bought a license for version 6.0. Can I use version 4.0 with that license?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A.&lt;/b&gt; Yes, You can. A license for specific version support ATEasy v3.0 and newer up to the version of the license purchased. For example if your network license server have a 7.0 license, client can run version 3.x-7.x.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Q. &lt;/b&gt; &lt;b&gt;What does a one year subscription provide?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A.&lt;/b&gt; The one year subscription &amp; support provide one full year of free technical support as well as one full year of free upgrades and unlimited access to ATEasy downloads. With subscriptions you will get a new license if an upgrade to the product is released during that year. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Q.&lt;/b&gt; &lt;b&gt;If I did not buy a subscription and a new version has been released. Can I buy a subscription to upgrade my license?&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;A.&lt;/b&gt; You can renew your subscription if your subscription has expired less then two years ago. This renewal cost most than normal renewal. Check with our sales representative for special pricing .&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Q.&lt;/b&gt; &lt;b&gt;If I did not buy a subscription, can I still use ATEasy?&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;A.&lt;/b&gt; Yes, You can still use ATEasy with the version that you have purchased with no subscription.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Q.&lt;/b&gt; &lt;b&gt;Can I buy an ATEasy upgrade if I did not renew my subscription?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A.&lt;/b&gt; No, upgrades are provided only for current subscribers. You will have to buy a new license. Please check with our sales representatives to learn how to renew your subscription.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Q.&lt;/b&gt; &lt;b&gt;Can I use Single License or Network License on a VM (Virtual Machine)?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A.&lt;/b&gt; You can install ATEasy on a VM, Only Network license (as a client) can be used. Single license (software or USB based) will not work on a VM. Network License Server can be install on a VM provided it uses online activation and provides licenses to ATEasy clients. Running ATEasy on a VM have limited access to instruments; hardware and common instrument such as PXI cannot be controlled from a VM. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Single License&lt;/h3&gt;&lt;b&gt;Q.&lt;/b&gt; &lt;b&gt;What kind of single-user license is available for ATEasy?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A.&lt;/b&gt; ATEasy is offered with either a Hardware Key, or a Software Key License. Hardware licenses use a device that plugs into the computer's Parallel or USB port to provide the license. Software Licenses use a string of characters that are entered into the ATEasy License dialog box (located under the About ATEasy dialog). Software licenses can be activated on-line for computers that are connected to the internet or offline using a license string.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Q.&lt;/b&gt; &lt;b&gt;Can I move the key or transfer the license from one machine to another?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A.&lt;/b&gt; Yes you can. Hardware keys can be moved from one computer to another by unplugging the device and plugging it into another computer. Software keys can be transferred to another machine (up to three times) by requesting a license transfer from Marvin Test Solutions (by requesting it using your &lt;a href='https://www.marvintest.com/Magic/MGLogin.aspx' target='_blank'&gt;M@GIC&lt;/a&gt;/support account). This process involves terminating the license (see &lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=60' target='_blank'&gt;Q200060&lt;/a&gt;) and installing a new license obtained from Marvin Test Solutions (see &lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=89' target='_blank'&gt;Q200089&lt;/a&gt;) .&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Q.&lt;/b&gt; &lt;b&gt;I've purchased several copies of single-user license. Can I buy subscriptions for part of my single-user licenses&lt;/b&gt;?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A.&lt;/b&gt; Yes you can. However, only the licenses with subscriptions can be upgraded when a new release is available as the upgrade is by serial number.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Network License&lt;/h3&gt;&lt;b&gt;Q.&lt;/b&gt; &lt;b&gt;What is the minimum number of licenses allowed with network license?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A.&lt;/b&gt; 3 or more. You cannot purchase a network license with one or two licenses.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Q.&lt;/b&gt; &lt;b&gt;Can I buy subscription for part of my Network licenses?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A.&lt;/b&gt; No you cannot. Subscriptions for network licenses must be purchased for all licenses that are included in that network license.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;See Also&lt;/h3&gt;Network License - &lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=64' target='_blank'&gt;Installing and Using ATEasy Network License&lt;/a&gt;. &lt;br /&gt;Trial License, Single License - &lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=256' target='_blank'&gt;Installing, Upgrading and Acquiring ATEasy Software License&lt;/a&gt;,&amp;nbsp;&amp;nbsp;&lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=89' target='_blank'&gt;How to obtain ATEasy Single License or a Trial License Extension&lt;/a&gt;.&lt;br /&gt;Upgrading ATEasy USB License Key -&amp;nbsp;&amp;nbsp;&lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=345' target='_blank'&gt;Upgrading ATEasy USB License Key&lt;/a&gt;.&lt;br /&gt;Single or Network License Termination -&amp;nbsp;&amp;nbsp;&lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=60' target='_blank'&gt;Terminate an ATEasy software License&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200026/ATEasy-Licensing-Q-A</link><pubDate>7/13/2022</pubDate></item><item><title>ATEasy Drivers - Quick Guide to finding or creating an ATEasy Driver - Published on 7/8/2022</title><description>Given an instrument, how do you find or create an ATEasy® driver for it?&amp;nbsp;&amp;nbsp;In this article we will cover the ways to find/create an ATEasy instrument driver.&lt;br /&gt;&lt;br /&gt;The following diagrams present a quick guide for finding or creating an instrument driver. Follow the steps from top to bottom.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;If the driver exists in the ATEasy Drivers folder or user forums&amp;nbsp;&amp;nbsp;- use it. Otherwise, look for a &lt;b&gt;function panel (.fp file) driver &lt;/b&gt; using &lt;b&gt;ATEasy Insert Function Panel driver command&lt;/b&gt;. The function panels that are imported conform to the Plug and Play Instrument standard or IVI-C standards . &lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200347\FindATEasyDriver.jpg" alt="Finding an ATEasy Driver" title="Finding an ATEasy Driver" border='0' &gt;&lt;br /&gt;Once you download it, it can can be automatically converted to an ATEasy driver using the ATEasy command: &lt;b&gt;Insert, Import Function Panel&lt;/b&gt;. The import command creates a full driver including libraries (DLL function declarations), wrapper procedures to provide exception and error handling and handle hiding, and the driver commands used by the application to access and interface with the driver. &lt;br /&gt;&lt;br /&gt;Function Panel drivers are also called VXI Plug and Play drivers; see &lt;a href='https://ivifoundation.org/VXIPlug_Play/default.aspx' target='_blank'&gt;https://ivifoundation.org/VXIPlug_Play/default.aspx&lt;/a&gt; for a description of these drivers. There are thousands of these around, including all of the NI LabWindows/CVI drivers. Here are some examples of websites from the instrument manufacturers or companies that publish these drivers that you can use:&lt;ul&gt;&lt;li&gt;&lt;a href='https://www.ni.com/docs/en-US/bundle/teststand/page/tsref/infotopics/plug_play_drivers.html' target='_blank'&gt;https://www.ni.com/docs/en-US/bundle/teststand/page/tsref/infotopics/plug_play_drivers.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='https://www.keysight.com/us/en/lib/resources/miscellaneous/vxi-plug--play-drivers-1441449.html' target='_blank'&gt;https://www.keysight.com/us/en/lib/resources/miscellaneous/vxi-plug--play-drivers-1441449.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='https://downloads.pickeringtest.info/downloads/drivers/Sys30/' target='_blank'&gt;https://downloads.pickeringtest.info/downloads/drivers/Sys30/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;If none of the drivers described in step 1 is available, &lt;b&gt;create a driver&lt;/b&gt; from scratch. Three methods to create a driver can be used as shown in the diagram.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200347\CreateATEasyDriver.jpg" alt="Creating an ATEasy Driver" title="Creating an ATEasy Driver" border='0' &gt;&lt;br /&gt;For the first method, if the instrument manufacturer published a library in one of these formats: Dynamic Link Library, ActiveX or .Net assembly, we insert the library under the driver Libraries sub-module. If you are inserting a DLL you will need to define the DLL functions or if you have C .h header file, you can import it. Next, you create ATEasy procedures to hide handles, provide error handling and offer easier initialization. Once the wrapper procedures are written, you can create commands and attach the procedure to these commands. The commands will serve as the main method for using your driver.&lt;br /&gt;&lt;br /&gt;If the instruments use a &lt;b&gt;standard interface&lt;/b&gt; (i.e. GPIB, COM, VXI or USB, TCP/IP/LXI), we create an IO Table to send or receive data from the instruments or we use the ATEasy internal library to communicate with the instruments. ATEasy offers a rich set of functions to communicate with these standard busses.&lt;br /&gt;&lt;br /&gt;The third method will use the ATEasy internal library to write the procedures and the driver commands used to interface with the driver.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;</description><link>https://www.MarvinTest.com/KB/Q200347/ATEasy-Drivers-Quick-Guide-to-finding-or-creating-an-ATEasy-Driver</link><pubDate>7/8/2022</pubDate></item><item><title>White Paper: 21st Century Test Equipment for 21st Century Maintainers - Published on 4/26/2022</title><description>Agile Combat Employment (ACE) is a USAF operational concept that enhances warfighters’ resiliency and survivability through the use of a streamlined and reduced logistics footprint to support small, lethal, and survivable force packages via highly-maneuverable deployments. &lt;br /&gt;&lt;br /&gt;Currently deployed O-Level armament test equipment is unable to test multiple aircraft with a single system — handheld or otherwise — limiting the successful execution of the ACE CONOPS.&lt;br /&gt;&lt;br /&gt;Download this white paper to learn how the handheld SmartCan enables ACE, providing faster setup and test times, comprehensive test coverage, and data capture for predictive maintenance, replacing heavy big-box test sets with no compromise in performance.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2022\21st_Century_Maintainer.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200346/White-Paper-21st-Century-Test-Equipment-for-21st-Century-Maintainers</link><pubDate>4/26/2022</pubDate></item><item><title>Integrating ATEasy with the WATS Manufacturing Intelligence platform - Published on 3/17/2022</title><description>Eiger Design GmbH has developed an&lt;b&gt; &lt;a href='http://www.marvintest.com/product/ateasy' target='_blank'&gt;ATEasy®&lt;/a&gt;&lt;/b&gt; driver that provides an interface to the WATS Manufacturing Intelligence platform. The driver supports all of the ATEasy Test Types (eg MinMax, Tolerance, String etc) and has support for uploading graphs to WATS, as well as test results. &lt;br /&gt;&lt;br /&gt;WATS gives access to all test and repair data collected during manufacturing. Through high level dashboards and reports you can drill into data to find root cause for failures. WATS is either hosted as a cloud instance or installed on premise. All reporting and analysis are done through your web browser but there are also APIs that you can use to programmatically interact with, for integrating with your own enterprise software solutions. Below is a typical dashboard showing yield and failures for your products:&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200342\Dashboard.png" alt="Dashboard" title="Dashboard" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Here is an example showing the actual measurements with limits during investigation of a failure:&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200342\Measurement.png" alt="Actual Measurements" title="Actual Measurements" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The driver provides all the required setup and features needed to configure an ATEasy test and transfer data to WATS for further analysis. The driver requires very little code; in fact, in many cases, only two code lines are required as the driver heavily utilizes events to make all the required connections in the background. This will allow logging to be added quickly to existing programs. &lt;br /&gt;&lt;br /&gt;A simple Initialization line configures the required WATS parameters such as ‘Process’, ‘Part Number’, ‘Revision’, ‘Serial Number’, etc for each set of Tests. In the example, this is called from the Test Program’s OnInit Event.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200342\Initialization.png" alt="Initialization" title="Initialization" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A second procedure call informs the WATS Driver about the test configuration. This can be called from either:&lt;br /&gt;&lt;br /&gt;1.	The Test Program’s OnInitTest Event – this case is used when the user sets ATEasy’s test using the Test Properties dialog.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200342\Configuration.png" alt="Configuration" title="Configuration" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;2.	The Test case itself – this case is used when the user defines test properties within the test code. The procedure must be called after the test properties have been set. This method is used in the provided example.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200342\Test_Case.png" alt="Test Case" title="Test Case" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Screenshot from WATS showing data from supplied ATEasy example test program.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200342\Test_Status.png" alt="Test Status" title="Test Status" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To download and test the driver visit: &lt;b&gt;&lt;a href='http://www.eigerdesign.com/wats' target='_blank'&gt; www.eigerdesign.com/wats&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A prerequisite for testing the analysis platform is a WATS account, register for free here: &lt;b&gt;&lt;a href='https://register.wats.com/' target='_blank'&gt;https://register.wats.com/&lt;/a&gt;&lt;/b&gt;</description><link>https://www.MarvinTest.com/KB/Q200342/Integrating-ATEasy-with-the-WATS-Manufacturing-Intelligence-platform</link><pubDate>3/17/2022</pubDate></item><item><title>Upgrading ATEasy USB License Key - Published on 1/19/2022</title><description>In this example we will show how to upgrade to ATEasy 2021, however the same procedure applied to other versions.&lt;br /&gt;&lt;br /&gt;To upgrade your USB License Token follow these steps :&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Download and install the new ATEasy (e.g. ATEasy 2021 setup). &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ensure that the License key is plugged. The key driver should be installed and the Device Manager should show the token driver as shown here:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200345\ATEasyHardwareKeySafeNetToken.jpg" alt="ATEasy USB License Token Key" title="ATEasy USB License Token Key" border='0' &gt;&lt;br /&gt;If not, install the key driver by running the Hardware key driver, run "C:\Program Files (x86)\Marvin Test Solutions\ATEasy\2021\HardwareKey\HardwareKeySetup.msi"-&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Run the new ATEasy IDE (32 or 64-bit)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;When ATEasy starts, it checks the license and if it find that the version in the key is older - it will Prompt to Upgrade as shown here:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200345\HardwareKeyUpgrade1.jpg" alt="Upgrade ATEasy Hardware License Token" title="Upgrade ATEasy Hardware License Token" border='0' &gt;&lt;br /&gt;If you don't get the above message, You are on a trial license or the hardware key driver was not installed. To change the trial license open ATEasy, &lt;b&gt;Help&lt;/b&gt;, &lt;b&gt;About&lt;/b&gt;,&amp;nbsp;&amp;nbsp;Click &lt;b&gt;Set License...&lt;/b&gt; and select &lt;b&gt;Hardware Key License&lt;/b&gt; from the License Type drop list and you should see the message.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Click &lt;b&gt;Yes &lt;/b&gt;and enter the upgrade ID. The upgrade ID should show in your Magic portal licensing tab, If it does not and you are entitled for an upgrade (support and subscription is current), open a support incident and ask for an upgrade. &lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200345\HardwareKeyUpgrade2.jpg" alt="Enter Upgrade ID ATEasy Hardware License Token" title="Enter Upgrade ID ATEasy Hardware License Token" border='0' &gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;To confirm the upgrade, open the ATEasy About dialog from the Tools menu: the License type should show &lt;b&gt;Hardware key License&lt;/b&gt; with the ATEasy SN (1) as shown here:&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200345\HardwareKeyLicenseInstalled.jpg" alt="ATEasy Hardware License Token Installed" title="ATEasy Hardware License Token Installed" border='0' &gt;&lt;/li&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;b&gt;Your USB License Key is now ready to use with the new ATEasy.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;See Also&lt;/h3&gt;&lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=26' target='_blank'&gt;ATEasy Licensing Q&amp;A&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200345/Upgrading-ATEasy-USB-License-Key</link><pubDate>1/19/2022</pubDate></item><item><title>Introduction to ATEasy 2021 - Published on 12/20/2021</title><description>&lt;h3&gt;Summary&lt;/h3&gt;ATEasy 2021 (v11) contains numerous enhancements to the test development environment, run-time and Test Executive. &lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021Splash.jpg" alt="ATEasy 2021" title="ATEasy 2021" border='0' &gt;&lt;br /&gt;&lt;br /&gt;The following list describes the main changes in this version:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Revamped IDE user interface &lt;/b&gt;- New tabbed user interface to include improved layout, colored tabs, multi-tab panes, and improved sizing and docking.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;64-bit support&lt;/b&gt; - additional 64-bit IDE and run-time, ability to mix 32 and 64-bit software components&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Code Editor/Beautify Code/Auto Completion&lt;/b&gt; - Many, many improvements, including Syntax error highlight, Beautify code, auto completion improvements,  improved informational tooltip and parameter suggestion and many more.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Compile/Build - show multiple compiler errors.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Cyber Security updates to enable developers customize the IDE and the test application comply with DOD Application Security and Development (ASD) and DISA Security Technical Implementation Guide (STIG). See &lt;a href='https://www.marvintest.com/KB/Q200316/Cyber-Security-Features-of-ATEasy' target='_blank'&gt;KBase article&lt;/a&gt; for more information.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;~100% &lt;b&gt;backward compatible&lt;/b&gt;, with EXEs, DLLs compiled with older versions, and prior version source files, install side by side with your existing ATEasy version facilitates side by side test application migration &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Detailed Changes and New Features&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;IDE Changes:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;New tabbed documents interface with multiple panes instead of MDI child interface&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021Tabs.jpg" alt="ATEasy 2021 Tabs" title="ATEasy 2021 Tabs" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Colored tabs, same base color per document type (blue - programs, yellow - systems, green - drivers).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Group same document tabs together and use same color.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Active Tab is displayed with x and bold/red title to close them directly.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Tabbed documents can be dragged and ordered.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Additional tab panes can be created to split the main window vertically by dragging the tab to the client area of the mainframe.&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021TabPanes.jpg" alt="ATEasy 2021 Tab Panes" title="ATEasy 2021 Tab Panes" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Document windows are always maximized in their tab pane. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Improved handling of sizing and docking, docking hints when dragging a window.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New&amp;nbsp;&amp;nbsp;menu/toolbar images&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Large or small toolbar buttons size&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New Theme selection&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;64-bit support:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;New additional x64 version of IDE and run-time to create and run 64-bit Executables or DLLs.&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021DesktopIcons.jpg" alt="ATEasy 2021 Icons" title="ATEasy 2021 Icons" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Ability to mix call/use 32/64-bit DLLs/.Net/ActiveX from 32 or 64-bit target platforms using the revised library properties. .&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021MixedDLLPlatform.jpg" alt="ATEasy 2021 Mixed Platforms DLLs" title="ATEasy 2021 Mixed Platforms DLLs" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;One setup to install both IDEs (x86/x64) on x64 Windows. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Same driver or module can be used for 32/64-bit applications.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Code Editor:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Highlight all occurrences of variables/procedures/command items when placing the caret on one. &lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021CodeEditorHighlightSameSymbol.jpg" alt="ATEasy 2021 Editor Highlights Symbols " title="ATEasy 2021 Editor Highlights Symbols " border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Highlight statement keywords when placing caret on opening keyword.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021CodeEditorHighlightStatements.jpg" alt="ATEasy 2021 Editor Highlights Keywords" title="ATEasy 2021 Editor Highlights Keywords" border='0' &gt; &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Highlight closing parentheses and array index bracket when placing the caret on open parentheses or array index bracket.&amp;nbsp;&amp;nbsp;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021CodeEditorHighlightClosingParenthesis.jpg" alt="ATEasy 2021 Editor Highlights Closing Parenthesis" title="ATEasy 2021 Editor Highlights Closing Parenthesis" border='0' &gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Description view always shows in green text color. &lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021CodeEditorDescriptionInGreen.jpg" alt="ATEasy 2021 Description Editor" title="ATEasy 2021 Description Editor" border='0' &gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New option Show Syntax Errors to underline compiler errors while viewing or typing code. &lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021CodeEditorShowSyntaxErrors.jpg" alt="ATEasy 2021 Editor Show Syntax Errors" title="ATEasy 2021 Editor Show Syntax Errors" border='0' &gt;&lt;/li&gt;&lt;/ul&gt; &lt;br /&gt;&lt;h3&gt;Beautify Code and Auto Completion:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Beautify code while typing or scrolling or using the new Beautify Code command. &lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021BeautifyCodeMenuCommands.jpg" alt="ATEasy 2021 Beautify Commands" title="ATEasy 2021 Beautify Commands" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New Standard toolbar buttons to Beautify selection or enable/disable it. &lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021BeautifyCodeToolbarButtons.jpg" alt="ATEasy 2021 Beautify Toolbar Buttons~~&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Selection can be: selected text, procedure(s), test(s), form(s) and all the way to a whole project and its documents.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix statement indentation.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Indentation while typing using &lt;Enter&gt; key.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Strip/append/leave space between operators.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix statements text case.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix variables, procedure and commands (in process) text case.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Auto complete statements using &lt;Ctrl+Enter&gt; keys.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Improved and added colors to tooltip for functions and commands.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021CodeEditorTooltip.jpg" alt`=" title="ATEasy 2021 Beautify Toolbar Buttons~~&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Selection can be: selected text, procedure(s), test(s), form(s) and all the way to a whole project and its documents.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix statement indentation.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Indentation while typing using &lt;Enter&gt; key.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Strip/append/leave space between operators.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix statements text case.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix variables, procedure and commands (in process) text case.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Auto complete statements using &lt;Ctrl+Enter&gt; keys.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Improved and added colors to tooltip for functions and commands.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021CodeEditorTooltip.jpg" alt`="ATEasy 2021 Code Editor Tooltip' border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Improved parameter suggestion and tooltip to show automatically when caret is placed after '(', ','.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021CodeEditorTooltipCaretAutoCompletion.jpg" alt="ATEasy 2021 Code Editor Tooltip Shown on Caret position" title="ATEasy 2021 Code Editor Tooltip Shown on Caret position" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New Go To Implementation command - can be invoked by right clicking on a command item, shows the procedure assigned to the command. &lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021CodeEditorCommandGoToImplemntation.jpg" alt="ATEasy 2021 GoTo Implementation" title="ATEasy 2021 GoTo Implementation" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Compiler/Build:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Compiler now shows up to 200 errors instead of just one (new). &lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021BuildErrors.jpg" alt="ATEasy 2021 Build log Errors" title="ATEasy 2021 Build log Errors" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Build log clearly highlights compiler steps.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Workspace window:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;New Folders or external files of any type can be inserted at workspace top level items. &lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021MiscFolders.jpg" alt="ATEasy 2021 Workspace Folders" title="ATEasy 2021 Workspace Folders" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New Reorder Alphabetically command used to reorder Variables, Types, Procedures, Forms, IO tables, DLL Types, Procedures and Constants.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021Reorder.jpg" alt="ATEasy 2021 Reorder" title="ATEasy 2021 Reorder" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Monitor window:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;New Filters for Driver shortcuts, interface address in addition to interfaces filter.&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021MonitorFilter.jpg" alt="ATEasy 2021 Monitor Filter" title="ATEasy 2021 Monitor Filter" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New Save and Open commands to save the monitor window records to a file.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Options dialog:&lt;/h3&gt;&lt;b&gt;Text Editor page:&lt;/b&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Show Syntax Errors&lt;/b&gt; - new option to underline in red syntax errors (Default: checked).&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Workspace page:&lt;/b&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Theme Selection&lt;/b&gt; - Select from multiple available themes to customize the look of your IDE&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Code Beautify options:&lt;/b&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Statement Indentation&lt;/b&gt; - correct indentation of the current statement (when document is modified and the user uses up/down arrows or left click  in the code (Default: checked)).   &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Smart Spacing &lt;/b&gt;- correct spacing of the current statement  (when document is modified and the user uses up/down arrows or left click in the code) (Default: checked).  &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Complete Statement&lt;(Ctrl+Enter&gt;&lt;/b&gt; - when typing &lt;Ctrl+Enter&gt; keys, insert a skeleton for the current statement (Default: checked). &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Smart Indentation &lt;Enter&gt; - when typing the &lt;Enter&gt; enter key, indent the statement relative to the surrounding statement as needed (Default: checked).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Text Spacing&lt;/b&gt;: None, Strip, Append - add or remove a single space between assignment and other operators for consistency (default Strip)..&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Correct Case&lt;/b&gt;: Statement, Symbols - correct the statement (lowercase), and symbols such as variables/procedures/commands text case to match the symbol definition.&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021OptionsTextEditor.jpg" alt="ATEasy 2021 Text Editor Options" title="ATEasy 2021 Text Editor Options" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Other page:&lt;/b&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Notify Updates On Start&lt;/b&gt; - displays a message box when  ATEasy starts if a version update is available (Default: checked).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Check Project Before Run&lt;/b&gt; - check for compiler error and parse the whole project before we start running (Default: checked). &lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Status Bar&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;New pane to show a red flag image in the status bar when a new version update is available, double clicking on the flag invokes the Check For Update command.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Compare Folders window:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Swap &lt;/b&gt;button used to swap the right and left folders path. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Faster files comparison using file size/modified time, and new command/option &lt;b&gt;Compare File Content &lt;/b&gt;(default) to compare using file content if files size are the same.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Help menu:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ATEasy Web Page&lt;/b&gt; command.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Support Web Page&lt;/b&gt; command.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;User Forums Web Page&lt;/b&gt; command.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Check for Updates...&lt;/b&gt; command - check web for version update. If a newer version is available; information about the current and newer version is displayed with an option to download the update setup.&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021CheckForUpdates.jpg" alt="ATEasy 2021 Check for Updates" title="ATEasy 2021 Check for Updates" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Run-Time:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;32 and 64-bit versions of run-time.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Load and use 32/64-bit DLLs/ActiveX/.Net (no controls) with 32/64-bit EXE or DLL.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;APointer &lt;/b&gt;data type that is 32 or 64-bit size to match teh IDE/application 32 or-64&lt;br /&gt;bit size&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;AForm.OnMove()&lt;/b&gt;: new event.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Pos()&lt;/b&gt;: New optional parameters to perform Reverse find and ignore case.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;EnumConst()&lt;/b&gt;: New function to return enum constant name, description or value.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Licensing Updates:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;License activation/termination/moving using MTS web service using user email, password and license serial number. &lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200344\ATEasy2021OnLineLicenseActivation.jpg" alt="ATEasy 2021 Online License Activation" title="ATEasy 2021 Online License Activation" border='0' &gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Allow using license server on a VM using MTS web licensing service.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Allow using ATEasy on a VM using MTS web licensing service.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Improve on premise licensing log.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Test Executive (TestExec.drv):&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Reduced Test Executive overhead &lt;/b&gt; by x10.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New option to set how many runs when using Repeat Run.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New Option to set delay between runs when using Repeat Run.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;SemiEasy.drv/STDF.drv (Semiconductor add-on for the test executive):&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Support for STDF (Standard Test Data Format) file format for test log/results.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Commands to support software/hardware bins.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New test executive pane to display production yield, software and hardware bins.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Setup:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Installation folders:&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;\Program Files\Marvin Test Solutions\ATEasy\2021&lt;/b&gt; for x86 Windows for 32-bit ATEasy and on x64 Windows for 64-bit ATEasy.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;\Program Files (x86)\Marvin Test Solutions\ATEasy\2021&lt;/b&gt; for 32-bit ATEasy running on x64 Windows.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;No asking for installation folders or for program group. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;No /TARGETDIR setup command line option.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Shared using symbolic links for Examples and Drivers folders since same driver/module can be used for 32/64-bit applications.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Windows Startup menu group now shows under: &lt;b&gt;Marvin Test Solutions ATEasy 2021&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;HW 4.9.8 included - see HW readme.txt for list of changes.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Compatibility and System Requirements&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;ATEasy 2021 is compatible with &lt;b&gt;32/64 bit Windows operating systems&lt;/b&gt; including Windows XP (SP3), Vista, Windows 7, 8, 8.1, 10, &lt;b&gt;11&lt;/b&gt; and Windows Server 2003, 2008 (also R2) and 2012 (also R2). Windows 9x and Windows 2K are no longer supported. No special software or hardware is required beyond Windows requirements.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATEasy 2021 is ~100% backward compatible with prior ATEasy versions, no change in ATEasy file format. Forward compatibility is provided for version 4.0-8.0 (unless new features are used). EXE and DLL compiled with older versions of ATEasy can be used with X run-time.&lt;/li&gt;&lt;/ul&gt;See the ATEasy &lt;b&gt;ReadMe.txt&lt;/b&gt; for a complete list of all changes and new features included in this release.&lt;br /&gt;&lt;br /&gt;ATEasy 2021 can be &lt;a href='https://www.marvintest.com/Search.aspx?Category=All&amp;SearchType=AllWords&amp;kw=ATEasy2021' target='_blank'&gt;downloaded here&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200344/Introduction-to-ATEasy-2021</link><pubDate>12/20/2021</pubDate></item><item><title>How to obtain ATEasy Single License or a Trial License Extension - Published on 9/21/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;ATEasy® single license (GT800-SL) can be set up from the ATEasy License Setup dialog box. This dialog is displayed either when starting ATEasy with no license or trial license expired, or from the About ATEasy menu item under the Help menu.&lt;br /&gt;&lt;br /&gt;If you do not have a license, you can activate a 30-day trial version of the ATEasy software.&lt;br /&gt;&lt;br /&gt;The trial license contains full ATEasy functionality for 30 days. You are allowed one 30-day trial period on the computer on which you install ATEasy.&lt;br /&gt;&lt;br /&gt;Follow these steps to setup an ATEasy Single license:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Install ATEasy using the ATEasy Setup program.&lt;/b&gt;&lt;ul&gt;&lt;li&gt;Start ATEasy.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Open the &lt;b&gt;ATEasy License Setup &lt;/b&gt;dialog box.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select Install Single License from the License Type list. An &lt;b&gt;ATEasy Computer ID &lt;/b&gt;is displayed in the bottom field. The ATEasy Computer ID is used to identify the machine where the license is installed.&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200089\ATEasyLicenseSetup.jpg" alt="ATEasy License Setup Dialog" title="ATEasy License Setup Dialog" border='0' &gt;|&lt;br /&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;With the ATEasy Computer ID and the &lt;b&gt;ATEasy Serial Number &lt;/b&gt;(located on the outside of the CD case or on your purchase order), create a new support incident using your M@gic (www.marvintest.com/magic) user account to obtain a &lt;b&gt;license string &lt;/b&gt;or file. You will need to paste both Serial Number and the ATEasy Computer ID to the incident. You can start using ATEasy by activating the trial version until you receive the license string or file.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Once you receive an email with the license string, open the &lt;b&gt;ATEasy License Setup &lt;/b&gt;dialog box again.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select &lt;b&gt;Install Single License &lt;/b&gt;from the License Type list.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Type or paste in the ATEasy License String or select the license File. Click &lt;b&gt;OK&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;See Also&lt;/h3&gt;&lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=26' target='_blank'&gt;ATEasy Licensing Q&amp;A&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200089/How-to-obtain-ATEasy-Single-License-or-a-Trial-License-Extension</link><pubDate>9/21/2021</pubDate></item><item><title>ATEasy Application Module Events Sequence - Published on 9/21/2021</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;The following list represents the sequence in which ATEasy application module events execute:&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;system: OnInit&lt;br /&gt;drivers: OnInit (from start to end)&lt;br /&gt;system: OnInitSystem&lt;br /&gt;system: OnInitProgram&lt;br /&gt;drivers: OnInitProgram&lt;br /&gt;program: OnInit&lt;br /&gt;system: OnInitTask&lt;br /&gt;drivers: OnInitTask&lt;br /&gt;program: OnInitTask&lt;br /&gt;system: OnInitTest&lt;br /&gt;drivers: OnInitTest&lt;br /&gt;program:OnInitTest&lt;br /&gt;program:OnEndTest&lt;br /&gt;drivers: OnEndTest&lt;br /&gt;system: OnEndTest&lt;br /&gt;program:OnEndTask&lt;br /&gt;drivers: OnEndTask&lt;br /&gt;system: OnEndTask&lt;br /&gt;program:OnEnd&lt;br /&gt;drivers:OnEndProgram&lt;br /&gt;system:OnEndProgram&lt;br /&gt;system: OnEndSystem&lt;br /&gt;drivers: OnEnd&lt;br /&gt;system: OnEnd&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Note drivers are called : for InitXXX from top to bottom for EndXXX from bottom to start)&lt;br /&gt;&lt;br /&gt;Abort Sequence:&lt;br /&gt;system: OnAbort&lt;br /&gt;program: OnAbort&lt;br /&gt;drivers: OnAbort&lt;br /&gt;system: OnAbort&lt;br /&gt;&lt;br /&gt;Reset sequence: first call abort sequence if running that execute reset procedure than zero variables, then:&lt;br /&gt;program: OnReset&lt;br /&gt;drivers: OnReset&lt;br /&gt;system: OnReset&lt;br /&gt;&lt;br /&gt;Error sequence:&lt;br /&gt;source module: OnError&lt;br /&gt;program: OnError&lt;br /&gt;drivers: OnError&lt;br /&gt;system: OnError&lt;br /&gt;&lt;br /&gt;See Also: ATEasy ModuleEvents.prj located in the ATEasy examples folder.</description><link>https://www.MarvinTest.com/KB/Q200001/ATEasy-Application-Module-Events-Sequence</link><pubDate>9/21/2021</pubDate></item><item><title>White Paper: Instrument, Hardware and Software Simulation in a Test System - Published on 9/21/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;The simulation requires running the application with a subset of instrumentation or without any instrumentation and with or without the Unit Under Test (UUT). In simulation mode some of the instruments or the UUT may not exist, which requires that the simulation environment filter and mask out errors as well as be able to return different values for various application states.&lt;br /&gt;&lt;br /&gt;The simulation environment must also accommodate various data types including scalar, arrays, strings, structures, etc. Additionally, the simulation environment should not require modification of the application code; ideally the same code will run in the simulated or non-simulated environment.&lt;br /&gt;&lt;br /&gt;The solution presented by this paper details the implementation of a simulation system that is created by enhancing the application run-time engine which is part of a commercial application development software environment (ATEasy®).&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2015\TestSystemSimulation.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download white paper&lt;/a&gt;&lt;/td&gt;&lt;td&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description><link>https://www.MarvinTest.com/KB/Q200270/White-Paper-Instrument-Hardware-and-Software-Simulation-in-a-Test-System</link><pubDate>9/21/2021</pubDate></item><item><title>DC Characterization of ICs Using PXI Instrumentation - Published on 9/21/2021</title><description>DC Parametric Measurement Units (PMU), also known as Source Measure Units (SMU), can be used in one of two modes to perform dc characterization tests on the input and output lines of digital devices:&lt;br /&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Method 1&lt;/b&gt;: Force voltage and measure current. With this method the PMU applies a constant voltage and using its on-board measurement capability it measures the current being drawn by the device/pin being tested. The voltage being supplied by the PMU can also be measured. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Method 2&lt;/b&gt;: Force current and measure voltage. With this method the parametric measurement unit either forces a constant current across a device or sinks a constant current from a device pin and then measures the resultant voltage. The PMU sink/source current also can be measured.&lt;/li&gt;&lt;/ul&gt;This article will demonstrate how DC parametric measurement units (PMU) can be used to perform DC characterization tests on digital devices. The tests described here can be conducted on a wide variety of digital devices from semiconductor IC's to printed circuit boards and can be performed using the built-in DC Parametric Measurement Unit (PMU) capability of the Marvin Test Solutions&amp;nbsp;&amp;nbsp;&lt;a href='http://www.marvintest.com/Product.aspx?model=GX5295' target='_blank'&gt;GX5295&lt;/a&gt; Dynamic DIO cards. When operating in force voltage mode, the GX5295 PMU can supply a programmable constant voltage between -2V and +7Vdc. The PMU has eight current ranges that can be used for the Force Current or Measure Current modes. &lt;/td&gt;&lt;td&gt;[:+[+GX5295+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;These ranges are:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;-32mA to +32mA.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;-8mA to +8mA.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;-2mA to +2mA.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;-512uA to +512uA.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;-128uA to +128uA.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;-32uA to +32uA.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;-8uA to +8uA.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;-2uA to +2uA.&lt;/li&gt;&lt;/ul&gt;More information on the &lt;a href='http://www.marvintest.com/Product.aspx?model=GX5295' target='_blank'&gt;GX5295&lt;/a&gt; can be found on the &lt;a href='http://www.marvintest.com/' target='_blank'&gt;Marvin Test Solutions website&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;The following terms will explain some of the DUT parameters that can be measured using the PMU:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;VIH&lt;/b&gt;: (Voltage Input High) The minimum positive voltage applied to the input which will be accepted by the device as a logic High.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;VIL&lt;/b&gt;: (Voltage Input Low) The maximum positive voltage applied to the input which will be accepted by the device as a logic Low.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;VOL&lt;/b&gt;: (Voltage Output Low) The maximum positive voltage from an output which the device considers will be accepted as the maximum positive Low level.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;VOH&lt;/b&gt;: (Voltage Output High) The maximum positive voltage from an output which the device considers will be accepted as the minimum positive High level.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;IIL&lt;/b&gt;: (Low Level Input Leakage) The input leakage current measured when the input is a logic Low. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;IIH&lt;/b&gt;: (High Level Input Leakage) The input leakage current measured when the input is a logic High.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;IOS(H)&lt;/b&gt;: (High-level short-circuit output current) The short-circuit output current when the output is at a logic High&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;IOS(L)&lt;/b&gt;: (Low-level short-circuit output current) The short-circuit output current when the output is at a logic Low&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;h3&gt;&lt;b&gt;Output Voltage Level Testing (VOH, VOL, IOS)&lt;/b&gt;&lt;/h3&gt;Output Voltage Level tests are used to verify the operation of a digital output when used under its specified loading conditions. They can also be used to simulate a worst-case loading condition to observe how a DUT will perform when an output is loaded beyond its specified limit, for example when shorted to ground.&lt;br /&gt;&lt;br /&gt;When performing these types of tests the test current range should be chosen to adequately test the output without damaging the device-under-test (DUT).&lt;br /&gt; &lt;br /&gt;The following example shows how to perform a VOH test on a digital output. The purpose of this test is to ensure that the DUT can maintain an output voltage that is above the logic High threshold while supplying its maximum rated drive current.&lt;br /&gt;&lt;br /&gt;In this test the PMU will be programmed to sink current from the DUT output, simulating a load condition.&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Figure 1 below shows how the DUT and GX5295 are connected. To perform this test the DUT is powered up. One GX5295 channel (Ch1 in this example) is used to apply an input logic level that forces the DUT output to a logic High. As GX5295 channels can be set to either digital or PMU mode on a per-pin basis the type of signal applied to the input (a logic High/Low or a constant voltage value) will depend on the DUT test strategy. A second GX5295 channel (Ch2 in this example) is set to PMU Force Current/Measure Voltage mode with an initial sink current value that will not damage the DUT output pin. The PMU is then used to force a sink current from the minimum to the maximum test values. At each test current value the DUT output voltage is measured to ensure it is within its specified voltage range for a logic High. The actual PMU test current can be measured also. These measured values can be used to generate an I-V Curve trace for possible fault-finding in the event of an output failure. The testing technique shown here can also be used for VOL and IOS testing.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\\Q200207\Q200207_VOH.JPG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 1: VOH testing using the GX5295&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The following GX5295 pseudo code (ATEasy) shows how VOH testing is performed on the circuit in Figure 1 above&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;/*&lt;br /&gt;! Declare the following variables&lt;br /&gt;short nMasterNumber&amp;nbsp;&amp;nbsp;!The number of the master in the chassis. There may be multiple masters in a chassis&lt;br /&gt;short nMasterHandle&amp;nbsp;&amp;nbsp;!The handle of this master GX5295&lt;br /&gt;short nSlot&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!The slot where this master is located&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;short nDensity&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !The amount of memory in MB on the card&lt;br /&gt;short nBanks&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !The number of banks on the card&lt;br /&gt;short i&lt;br /&gt;short nStatus&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Procedure return value&lt;br /&gt;double dPmuCurrent&amp;nbsp;&amp;nbsp; !PMU Current value&lt;br /&gt;double dMeasV&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Voltage measured at the PMU pin&lt;br /&gt;double dMeasI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Current measured at the PMU pin&lt;br /&gt;char sError[255]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Used to store error string &lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;! Initialize variables&lt;br /&gt;nMasterNumber = 1&amp;nbsp;&amp;nbsp;!GX5295 is Master 1 in the PXI chassis&lt;br /&gt;nSlot = 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !It is located in slot 10&lt;br /&gt;nDensity = 256&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !There is 256MB of memory on the card&lt;br /&gt;nBanks = 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !One memory bank&lt;br /&gt;&lt;br /&gt;!Initialize the GX5295 &lt;br /&gt;DioSetupInitialization(0, nMasterNumber, nSlot, nDensity, nBanks, nMasterHandle, nStatus)&lt;br /&gt;if nStatus&lt;0 &lt;br /&gt;&amp;nbsp;&amp;nbsp; DioGetErrorString(nStatus, sError, 255) &lt;br /&gt;&amp;nbsp;&amp;nbsp; error nStatus, sError	! generate exception &lt;br /&gt;endif&lt;br /&gt;&lt;br /&gt;DioInitialize(nMasterNumber, nMasterHandle, nStatus)&lt;br /&gt; &lt;br /&gt;!Set Logic High to 5.0V and a Low to 0.0V&lt;br /&gt;DioSetupOutputVoltages(nMasterHandle, 1, 1, 5.0, 0.0, nStatus)&lt;br /&gt;&lt;br /&gt;! Set channel 1 mode to output a logic High &lt;br /&gt;DioSetupChannelMode(nMasterHandle, 1, 1, 3, nStatus)&lt;br /&gt; &lt;br /&gt;! Set channel 2 mode to PMU Forced Current mode &lt;br /&gt;DioSetupChannelMode(nMasterHandle, 2, 2, 4, nStatus)&lt;br /&gt; &lt;br /&gt;for i=0 to 16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dPmuCurrent = -0.25*i&amp;nbsp;&amp;nbsp;!Run test in 0.25mA increments&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Set channels to sink dPmuCurrent and the current range to -8mA to +8mA. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DioPmuSetupForcedCurrent(nMasterHandle, 2, 2, dPmuCurrent, 1, nStatus)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Allow time for the DUT output to settle&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Delay(200)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Measure channel 2 output current using a 50rps measurement rate &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DioMeasure(nMasterHandle, 2, 4, dMeasI, 50, 0, 0, nStatus) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Measure voltage at channel 2 using a 50rps measurement rate &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DioMeasure(nMasterHandle, 2, 5, dMeasI, 50, 0, 0, nStatus) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print "Ch2 measured output current="+str(dMeasI)+" Measured Voltage = "+str(dMeasV)+"\n"&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;DioReset(nMasterHandle, nStatus)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;b&gt;Input Leakage Testing (IIL, IIH)&lt;/b&gt;&lt;/h3&gt;Leakage current tests are performed by applying a constant voltage, in steps over a specified test voltage range, to the DUT input pin and measuring the input current at each step. As leakage currents are often in the uA range, the PMU should be set to its more sensitive current ranges to achieve more accurate measurements.&lt;br /&gt;&lt;br /&gt;To perform an Input Leakage Test the DUT is powered up and the PMU pin is set to Force Voltage/ Measure Current Mode. At each input voltage setting the PMU measures the current being drawn by the input and then verifies the value against the DUT specification. The actual test voltage that the PMU is sourcing can be measured also. &lt;br /&gt;&lt;br /&gt;The testing technique shown here can also be used for VIL and VIH testing.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\\Q200207\Q200207_InLeak.JPG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 1: Input Leakage testing using the GX5295 PMU capability&lt;/b&gt;&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200207/DC-Characterization-of-ICs-Using-PXI-Instrumentation</link><pubDate>9/21/2021</pubDate></item><item><title>White Paper: PXI Based Flightline Test Sets - Published on 9/21/2021</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;In the past decade, PXI has proven to be a powerful and robust standard that is suitable for most Mil-Aero test applications. PXI-based testers are widely used today in engineering test stations, as production acceptance testers, environmental stress screening testers, as well as full-fledged Intermediate-Level and Depot-Level testers. A lesser known fact is the success of PXI for field and flight-line test applications.&lt;br /&gt;&lt;br /&gt;This paper discusses several flightline and backshop test applications based on Commercial-Off-The-Shelf (COTS) PXI products. The applications include a Field Test Set for the Maverick missile system, a back-shop test set for the Alternate Mission Equipment (AME) for the F-35 Joint Strike Fighter (JSF), a back-shop armament test set for the TA-50 and FA-50 aircraft, and a portable test set for the C-130. These four testers are all based on an ultra-rugged COTS PXI platform - the MTS- 206 / 207 which has been successfully deployed since 2004 and has demonstrated the ability to operate reliably in any operational theater. The four testers demonstrate PXI’s viability as an ultra-rugged field and flight-line platform&amp;nbsp;&amp;nbsp;- offering performance and capabilities that were previously only achievable with custom electronics or MIL-SPEC VME products.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2009\FlightLinePXI.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;&lt;/td&gt;&lt;td&gt;[:+[+MTS-207+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description><link>https://www.MarvinTest.com/KB/Q200177/White-Paper-PXI-Based-Flightline-Test-Sets</link><pubDate>9/21/2021</pubDate></item><item><title>How to set up and control an LXI instrument from ATEasy - Published on 9/21/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;ATEasy® can interface with a wide variety of software and hardware, allowing users to leverage a plethora of instrumentation and driver implementations from within their ATEasy applications.&lt;br /&gt;&lt;br /&gt;One such interface is &lt;b&gt;LXI &lt;/b&gt;which takes advantage of the speed, flexibility, and standardization of the Local Area Network and the TCP/IP protocol. ATEasy can communicate with network enabled instrumentation in one of the following ways: &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Natively through&lt;b&gt; IOTable &lt;/b&gt;based ATEasy drivers - An ATEasy driver can be created and its interface property set to WinSocket. This allows IOTable communication to be routed to the Local Area Netork via TCP/IP protocol.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;By way of importing &lt;b&gt; IVI-C&lt;/b&gt; .FP Function Panel files to automatically generate a fully featured ATEasy driver which calls a vendor supplied DLL&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Using other type of software component (.NET, ActiveX, DLL, LabView, etc.)&lt;/li&gt;&lt;/ul&gt;This article will discuss the second option.&lt;/td&gt;&lt;td&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;ATEasy can communicate with LXI (and other interfaces such as VXI, GPIB, etc.) instrumentation through the use of IVI-C drivers and the IVI/VISA hardware abstraction layer. The following steps will allow a user to automatically create an ATEasy driver for a particular LXI instrument, install all applicable libraries for IVI/VISA, configure VISA to recognize the LXI instrument, and finally to configure the ATEasy driver to interface with VISA.&lt;br /&gt;&lt;br /&gt;Use the following procedure:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ensure that the VISA layer along with the IVI shared components (1.5+) are installed. The IVI shared components can be found at: &lt;a href='http://www.ivifoundation.org/shared_components/Default.aspx' target='_blank'&gt;IVI Foundation Shared Components&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Find and install the LXI compliant IVI-C driver package. This is usually available on the vendor’s website. Alternatively, the IVI Foundation Driver Registry can be searched at &lt;a href='http://www.ivifoundation.org/registered_drivers/driver_registry.aspx' target='_blank'&gt;IVI Driver Registry&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Import the .FP file from the IVI-C driver package into ATEasy. From the ATEasy menu, select &lt;b&gt;Insert &lt;/b&gt; | &lt;b&gt;Import .FP file (.fp)&lt;/b&gt;. Enter a &lt;b&gt;default name &lt;/b&gt;for the driver and then click the &lt;b&gt;Browse&lt;/b&gt; button to browse for the .fp file. The .fp file is usually located in the instrument specific folder located in C:\Program Files\IVI Foundation\IVI\Drivers\&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;You can specify %VXIPNPPATH% in the path field before cllicking on the browse button to use the IVI-C path variable. Also make sure to mark the &lt;b&gt;Convert VISA Basic Types to ATEasy Types&lt;/b&gt; checkbox. &lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200194\InsertFP.JPG" alt="IVI-C driver insert" title="IVI-C driver insert" border='0' &gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200194\InsertFP2.JPG" alt="IVI-C driver browse" title="IVI-C driver browse" border='0' &gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Make sure the new driver is inserted in the driver folder of the &lt;b&gt;system &lt;/b&gt;module as shown below.&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200194\InsertFP3.JPG" alt="Integrated Development Environment ATEasy Driver" title="Integrated Development Environment ATEasy Driver" border='0' &gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Start NI-MAX (Measurement &amp; Automation Explorer) in order add the LXI instrument to the database.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Right click on &lt;b&gt;Devices and Interfaces&lt;/b&gt; and select &lt;b&gt;Create New…&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select &lt;b&gt;VISA TCP/IP Resource&lt;/b&gt; and click Next.&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200194\InsertFP4.JPG" alt="TCP/IP Resource" title="TCP/IP Resource" border='0' &gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Select &lt;b&gt;Auto-Detect of LAN Instrument&lt;/b&gt; and click Next.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select the LXI instrument from the list of scanned network devices and click Next.&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200194\InsertFP5.JPG" alt="LXI Instrument list" title="LXI Instrument list" border='0' &gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Enter a descriptive alias. This alias will later be used in the ATEasy driver to address this particular instrument. Click Finish&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200194\InsertFP6.JPG" alt="VISA Alias" title="VISA Alias" border='0' &gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The LXI device will now appear in NI-MAX under Devices and Interfaces. Device specific information will be shown including the IP Address and hostname.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;In ATEasy, right click on the driver shortcut and select &lt;b&gt;properties&lt;/b&gt;. Click on the &lt;b&gt;Misc&lt;/b&gt; tab and enter the LXI instrument’s alias into the &lt;b&gt;ResourceName &lt;/b&gt;field (the Change button must be clicked to store the value).&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200194\InsertFP7.JPG" alt="Programming Properties" title="Programming Properties" border='0' &gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The new ATEasy driver can now be used to control the LXI instrument.&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200194\InsertFP8.JPG" alt="Test Development IDE" title="Test Development IDE" border='0' &gt;</description><link>https://www.MarvinTest.com/KB/Q200194/How-to-set-up-and-control-an-LXI-instrument-from-ATEasy</link><pubDate>9/21/2021</pubDate></item><item><title>Using the Winsock (TCP/IP) ATEasy Driver Interface - Published on 9/21/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;The following walkthrough demonstrates the creation and configuration of a WinSock interface based ATEasy® driver for sending/receiving TCP/IP messages to a remote server. Typically the Winsock interface is used to control LXI instruments however in this article you will be connecting to a mail server and sending email messages to the server following the SMTP protocol to send an email.&lt;br /&gt;&lt;br /&gt;It should be noted that there are easier ways to send an email programmatically than by using Winsock.&amp;nbsp;&amp;nbsp;This walkthrough is meant to demonstrate the use of ATEasy to perform the functions of a Telnet terminal automatically.&amp;nbsp;&amp;nbsp;For a simplier way to send an email through ATEasy, please look into using the .NET framework's System.Net.Mail namespace to send emails (DotNet.prj example).&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;This walkthrough mirrors a task that would normally be executed using a Telnet terminal (telnet.exe), as shown in the image below.&amp;nbsp;&amp;nbsp;Using ATEasy, you are able to simplify and automate Telnet communication.&lt;/td&gt;&lt;td&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200195\TelnetWindow.JPG" alt="Using the ATEasy to create a WinSock interface, we can avoid having to use Telnet" title="Using the ATEasy to create a WinSock interface, we can avoid having to use Telnet" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Step by Step Walkthrough&lt;/h3&gt;1. Create a new ATEasy application&lt;br /&gt;2. Create New Driver and name it EMAIL&lt;br /&gt;3. Open the properties editor and examine the Driver properties for EMAIL.&amp;nbsp;&amp;nbsp;Check the WinSock interface to enable it.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200195\EmailDriverProperties.JPG" alt="Screenshot: Enabling the WinSock interface for your EMAIL driver." title="Screenshot: Enabling the WinSock interface for your EMAIL driver." border='0' &gt;&lt;br /&gt;&lt;br /&gt;4. Click the Driver shortcut.&amp;nbsp;&amp;nbsp;Change the interface to WinSock and configure it to the target mail server.&amp;nbsp;&amp;nbsp;For this example, we will deliver the message through the domain GEOMAILSERVER on SMTP port 25.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200195\EmailDriverShortcut.JPG" alt="Screenshot: The proper settings for contacting GEOMAILSERVER of the e-mail port 25" title="Screenshot: The proper settings for contacting GEOMAILSERVER of the e-mail port 25" border='0' &gt;&lt;br /&gt;&lt;br /&gt;5. We must now create several IOTables to handle the communication between your computer and the mail server:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create the Hello IOTable as shown below.&amp;nbsp;&amp;nbsp;The Hello IOTable receives the server’s greeting message and initiates a dialog by introducing itself to the server.&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200195\HelloIOTable.JPG" alt="Screenshot: The completed and commented Hello IOTable" title="Screenshot: The completed and commented Hello IOTable" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create the MailFrom IOTable as shown below.&amp;nbsp;&amp;nbsp;The MailFrom IOTable sends the email address of the sender of the email to the server.&amp;nbsp;&amp;nbsp;After receiving this, the server sends back an acknowledgement message. &lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200195\MailFromIOTable.JPG" alt="Screenshot: The completed and commented MailFrom IOTable" title="Screenshot: The completed and commented MailFrom IOTable" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create the RcptTo IOTable as shown below.&amp;nbsp;&amp;nbsp;The RcptTo IOTable sends the email address of the intended recipient of the email to the server.&amp;nbsp;&amp;nbsp;After receiving this, the server sends back an acknowledgement.&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200195\RcptToIOTable.JPG" alt="Screenshot: The completed and commented RcptTo IOTable" title="Screenshot: The completed and commented RcptTo IOTable" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create the DataSend IOTable as shown below.&amp;nbsp;&amp;nbsp;The DataSend IOTable informs the server that you are ready to transfer a message and sends the email subject, header and body.&amp;nbsp;&amp;nbsp;Upon completion of transmission, the server sends back an acknowledgement that the message has been received and will be delivered.&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200195\DataSendIOTable.JPG" alt="Screenshot: The completed and commented DataSend IOTable" title="Screenshot: The completed and commented DataSend IOTable" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create the Disconnect IOTable as shown below.&amp;nbsp;&amp;nbsp;The Disconnect IOTable informs the server that you have finished and waits for the server to close the connection.&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200195\DisconnectIOTable.JPG" alt="Screenshot: The completed and commented Disconnect IOTable" title="Screenshot: The completed and commented Disconnect IOTable" border='0' &gt;&lt;br /&gt;&lt;br /&gt;6. Once all the IOTables have been created, we want to create a procedure within the EMAIL driver to call all of our IOTables.&amp;nbsp;&amp;nbsp;The procedure SendEmail is shown below.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200195\SendEmailProcedure.JPG" alt="Screenshot: The completed SendEmail procedure." title="Screenshot: The completed SendEmail procedure." border='0' &gt;&lt;br /&gt;&lt;br /&gt;7.&amp;nbsp;&amp;nbsp;The final modification to the EMAIL driver will be the creation of a command for use in the other modules of your ATEASY project.&amp;nbsp;&amp;nbsp;Insert a new command, rename it to Send and attach it to the EmailSend procedure.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200195\EmailSendCommand.JPG" alt="Screenshot: The Send() command." title="Screenshot: The Send() command." border='0' &gt;&lt;br /&gt;&lt;br /&gt;Now that the driver is completed, we can use the Send() command in our Program module to send tests.&amp;nbsp;&amp;nbsp;But we will need to open the Monitor window to observe the messages that are sent and received.&amp;nbsp;&amp;nbsp;If it is not already open, hit the keyboard shortcut ALT+6 or use the menu bar &lt;b&gt;View | Monitor&lt;/b&gt; to open it.&amp;nbsp;&amp;nbsp;With the monitor window open, you are ready to send your email.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;The parameters of the command are (Sender, Recipient, Subject, Message) so a proper command could be:&lt;br /&gt;&lt;div class='fixedFont'&gt;Email Send("ATE@awesome.com","victorb@geotestinc.com","EMAIL Driver Test", "This message was sent courtesy of ATEasy!")&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The ATEasy Monitor Window shows the messages that are being sent and received:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200195\MonitorWindow.JPG" alt="Screenshot: The monitor window after the email has been sent." title="Screenshot: The monitor window after the email has been sent." border='0' &gt;&lt;br /&gt;&lt;br /&gt;And, of course, the final product (Microsoft Outlook):&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200195\ReceivedMessage.JPG" alt="Screenshot: Received message from Outlook." title="Screenshot: Received message from Outlook." border='0' &gt;</description><link>https://www.MarvinTest.com/KB/Q200195/Using-the-Winsock-TCP-IP-ATEasy-Driver-Interface</link><pubDate>9/21/2021</pubDate></item><item><title>Controlling a GX3500 FPGA Design Using Register Reads and Writes - Published on 9/21/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;h3&gt;Introduction&lt;/h3&gt;To understand how to access registers on the GX3500 FPGA instrument, it is necessary to have a design that utilizes registers.&lt;br /&gt;&lt;br /&gt;This document is segmented into two sections; the first provides an overview of a 128 Channel Static I/O designed for the GX3500.&amp;nbsp;&amp;nbsp;It is assumed that the reader is already familiar with the process of creating designs for the GX3500 using the Altera Quartus II Design tools (refer to chapter 5 of the GX3500 User’s Guide: GXFPGA Tutorial and Examples).&lt;br /&gt;&lt;br /&gt;The design is implemented as four 32-channel bi-directional ports and is double-buffered to support simultaneous updates on all 128 channel for both writing and reading logic states.&lt;br /&gt;&lt;br /&gt;With a functioning FPGA design, the second section of the document describes how to load the design file into the GX3500 FPGA, how to connect the GX3500 I/O ports, and how to read and write registers within the FPGA design to facilitate operation of the static digital I/O.&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+GX3500+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;h3&gt;Design Overview&lt;/h3&gt;&lt;b&gt;Address Decoding&lt;/b&gt;&lt;br /&gt;The Gx3500 supports two types of PCI bus read and write operations; to registers using PCI Bar 1, and to RAM using PCI BAR 2.&amp;nbsp;&amp;nbsp;The static digital I/O design uses registers to control writing and reading the I/O ports, so will use the PCI BAR1 chip select signal for address decoding – which is synonymous with Chip Select 1 (CS[1]).&amp;nbsp;&amp;nbsp;The BAR 1 signal can access a 1024 byte address range (0x400), and access must be on a 4-byte alignment (256 DWords).&amp;nbsp;&amp;nbsp;Figure 1 shows the address decoding logic, using five address signals (Addr[6..2]), to provide 32 write enable signals (WE[31..0]) and 32 read enable signals(RE[31..0]).&amp;nbsp;&amp;nbsp;These signals are used with latched registers to write to the I/O ports (WE[x]) and read from the I/O ports (RE[x]).&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200205\Decode Logic.JPG" alt="GX3500 Register Address Decoding" title="GX3500 Register Address Decoding" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;div align='center'&gt;Figure 1:&amp;nbsp;&amp;nbsp;Register Address Decoding&lt;/div&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Port Control&lt;/b&gt;&lt;br /&gt;There are four identical I/O ports (Figure 2), one for each 32 channels.&amp;nbsp;&amp;nbsp;Each port supports full bi-directional capability with per-channel direction control.&amp;nbsp;&amp;nbsp;The output registers are double-buffered.&amp;nbsp;&amp;nbsp;This allows for all four ports (128 channels) to be updated simultaneously.&amp;nbsp;&amp;nbsp;The first stage output data is written using the WE_Data signal, and the tristate control will be written using WE_Tristate.&amp;nbsp;&amp;nbsp;These signals will come from the WE[31..0] signals, and are unique for each port.&amp;nbsp;&amp;nbsp;The second output stage is written using the WE_UpdatePort signal.&amp;nbsp;&amp;nbsp;This signal will also come from the WE[31..0] signals, but is common to all ports in order to facilitate the simultaneous update of the I/O ports.&amp;nbsp;&amp;nbsp;There is read access to the data and tristate control registers for both stages of the output registers using RE_Tristatelatch, RE_DataLatch, RE_TristatePort and RE_DataPort.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200205\Port Logic.JPG" alt="GX3500 Port Control Logic" title="GX3500 Port Control Logic" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;div align='center'&gt;Figure 2:&amp;nbsp;&amp;nbsp;Port Control Logic&lt;/div&gt;&lt;/b&gt;&lt;br /&gt;All channels on all four ports (128 I/O channels) are sampled simultaneously using the RE_SamplePortIO signal, and the sampled data is stored in a latched register for later retrieval using the respective port’s RE_PortIO signal.&amp;nbsp;&amp;nbsp;Since each port tristate control register can be read, you can deduce whether the sampled input state was generated by the GX3500 or the UUT.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Register Mapping&lt;/b&gt;&lt;br /&gt;The following is the read and write register offsets for controlling ports A – D:&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;&lt;b&gt;Write Functions:&lt;/b&gt;&lt;/th&gt;&lt;th&gt; &lt;/th&gt;&lt;th&gt; &lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Offset&lt;/th&gt;&lt;th&gt;(Hex)&lt;/th&gt;&lt;th&gt;Function&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0&lt;/td&gt;&lt;td&gt;(0x0)&lt;/td&gt;&lt;td&gt;WE[0]:&amp;nbsp;&amp;nbsp;Write data to Port A latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;4&lt;/td&gt;&lt;td&gt;(0x4)&lt;/td&gt;&lt;td&gt;WE[1]:&amp;nbsp;&amp;nbsp;Write data to Port B latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;8&lt;/td&gt;&lt;td&gt;(0x8)&lt;/td&gt;&lt;td&gt;WE[2]:&amp;nbsp;&amp;nbsp;Write data to Port C latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;12&lt;/td&gt;&lt;td&gt;(0xC)&lt;/td&gt;&lt;td&gt;WE[3]:&amp;nbsp;&amp;nbsp;Write data to Port D latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;16&lt;/td&gt;&lt;td&gt;(0x10)&lt;/td&gt;&lt;td&gt;WE[4]:&amp;nbsp;&amp;nbsp;Write tristate control to Port A latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;20&lt;/td&gt;&lt;td&gt;(0x14)&lt;/td&gt;&lt;td&gt;WE[5]:&amp;nbsp;&amp;nbsp;Write tristate control to Port B latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;24&lt;/td&gt;&lt;td&gt;(0x18)&lt;/td&gt;&lt;td&gt;WE[6]:&amp;nbsp;&amp;nbsp;Write tristate control to Port C latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;28&lt;/td&gt;&lt;td&gt;(0x1C)&lt;/td&gt;&lt;td&gt;WE[7]:&amp;nbsp;&amp;nbsp;Write tristate control to Port D latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;80&lt;/td&gt;&lt;td&gt;(0x50)&lt;/td&gt;&lt;td&gt;WE[20]: Simultaneous Update Port A – D&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;&lt;b&gt;Read Functions:&lt;/b&gt;&lt;/th&gt;&lt;th&gt; &lt;/th&gt;&lt;th&gt; &lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Offset&lt;/th&gt;&lt;th&gt;(Hex)&lt;/th&gt;&lt;th&gt;Function&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0&lt;/td&gt;&lt;td&gt;(0x0)&lt;/td&gt;&lt;td&gt;WE[0]:&amp;nbsp;&amp;nbsp;Read data from Port A latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;4&lt;/td&gt;&lt;td&gt;(0x4)&lt;/td&gt;&lt;td&gt;WE[1]:&amp;nbsp;&amp;nbsp;Read data from Port B latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;8&lt;/td&gt;&lt;td&gt;(0x8)&lt;/td&gt;&lt;td&gt;WE[2]:&amp;nbsp;&amp;nbsp;Read data from Port C latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;12&lt;/td&gt;&lt;td&gt;(0xC)&lt;/td&gt;&lt;td&gt;WE[3]:&amp;nbsp;&amp;nbsp;Read data from Port D latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;16&lt;/td&gt;&lt;td&gt;(0x10)&lt;/td&gt;&lt;td&gt;WE[4]:&amp;nbsp;&amp;nbsp;Read tristate control from Port A latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;20&lt;/td&gt;&lt;td&gt;(0x14)&lt;/td&gt;&lt;td&gt;WE[5]:&amp;nbsp;&amp;nbsp;Read tristate control from Port B latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;24&lt;/td&gt;&lt;td&gt;(0x18)&lt;/td&gt;&lt;td&gt;WE[6]:&amp;nbsp;&amp;nbsp;Read tristate control from Port C latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;28&lt;/td&gt;&lt;td&gt;(0x1C)&lt;/td&gt;&lt;td&gt;WE[7]:&amp;nbsp;&amp;nbsp;Read tristate control from Port D latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;32&lt;/td&gt;&lt;td&gt;(0x20)&lt;/td&gt;&lt;td&gt;WE[8]:&amp;nbsp;&amp;nbsp;Read data from Port A output&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;36&lt;/td&gt;&lt;td&gt;(0x24)&lt;/td&gt;&lt;td&gt;WE[9]:&amp;nbsp;&amp;nbsp;Read data from Port B output&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;40&lt;/td&gt;&lt;td&gt;(0x28)&lt;/td&gt;&lt;td&gt;WE[10]:&amp;nbsp;&amp;nbsp;Read data from Port C output&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;44&lt;/td&gt;&lt;td&gt;(0x2C)&lt;/td&gt;&lt;td&gt;WE[11]:&amp;nbsp;&amp;nbsp;Read data from Port D output&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;48&lt;/td&gt;&lt;td&gt;(0x30)&lt;/td&gt;&lt;td&gt;WE[12]:&amp;nbsp;&amp;nbsp;Read tristate control from Port A output&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;52&lt;/td&gt;&lt;td&gt;(0x34)&lt;/td&gt;&lt;td&gt;WE[13]:&amp;nbsp;&amp;nbsp;Read tristate control from Port B output&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;56&lt;/td&gt;&lt;td&gt;(0x38)&lt;/td&gt;&lt;td&gt;WE[14]:&amp;nbsp;&amp;nbsp;Read tristate control from Port C output&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;60&lt;/td&gt;&lt;td&gt;(0x3C)&lt;/td&gt;&lt;td&gt;WE[15]:&amp;nbsp;&amp;nbsp;Read tristate control from Port D output&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;64&lt;/td&gt;&lt;td&gt;(0x40)&lt;/td&gt;&lt;td&gt;WE[16]:&amp;nbsp;&amp;nbsp;Read sampled data from Port A input latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;68&lt;/td&gt;&lt;td&gt;(0x44)&lt;/td&gt;&lt;td&gt;WE[17]:&amp;nbsp;&amp;nbsp;Read sampled data from Port B input latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;72&lt;/td&gt;&lt;td&gt;(0x48)&lt;/td&gt;&lt;td&gt;WE[18]:&amp;nbsp;&amp;nbsp;Read sampled data from Port C input latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;76&lt;/td&gt;&lt;td&gt;(0x4C)&lt;/td&gt;&lt;td&gt;WE[19]:&amp;nbsp;&amp;nbsp;Read sampled data from Port D input latch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;80&lt;/td&gt;&lt;td&gt;(0x50)&lt;/td&gt;&lt;td&gt;WE[20]: Simultaneous Sample Port A – D to input latch&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200205\Ports A-D.JPG" alt="Read/Write Control for Port A and Port B" title="Read/Write Control for Port A and Port B" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;div align='center'&gt;Figure 3:&amp;nbsp;&amp;nbsp;Read/Write Control for Ports A, B, C and D &lt;/div&gt;&lt;/b&gt;&lt;br /&gt;The GX3500 Static I/O design files and the SVF file can be downloaded from &lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200205\GX3500+Static+IO.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;&lt;h3&gt;Software Control&lt;/h3&gt;To control the GX3500 design, you simply initialize the instrument driver, load the Serial Vector File created when the FPGA design was compiled, and write and read the register locations used in the design.&lt;br /&gt;&lt;br /&gt;The GX3500 API, distributed as a DLL, contains these and other function for accessing memory, enabling or bypassing the expansion board relays and an assortment of other miscellaneous functions.&amp;nbsp;&amp;nbsp;Refer to the GX3500 User’s Guide for a full list of the API functions and their calling convention.&lt;br /&gt;&lt;br /&gt;Code for controlling the GX3500 FPGA Static IO is provided for three different programming environments; ATEasy®, “C” and LabView.&lt;br /&gt;&lt;br /&gt;These examples assume the GX3500 is installed in slot 12 of a PXI chassis, that the SVF file produced using the Altera Quartus II design software is called “Static_IO.svf”, and that the SVF file is located in the same directory that the application program resides in.&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;ATEasy Example (using the ATEasy GX3500 Driver)&lt;/b&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;dwData:DWord[4] ! Contains output state for 32-bit ports A- D&lt;br /&gt;dwTristate:DWord[4] ! Contains tristate control for 32-bit ports A-D&lt;br /&gt;dwInput:DWord[4] ! Contains data read from four latches A-D&lt;br /&gt;i:Long ! Index counter&lt;br /&gt;&lt;br /&gt;Driver Initialize (12) ! Initialize driver for instrument in slot #12&lt;br /&gt;FPGA Load (".\\Static_IO.svf",TARGET_VOLATILE,MODE_SYNC) ! Load SVF file to volatile FPGA memory&lt;br /&gt;FPGA Set ExpansionBoardBypass(0b1111) ! Set the expansion bypass – signals route from the FPGA to the connectors&lt;br /&gt;For i=0 to 3 ! Repeat for port A - D&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FPGA Write Register(i*4,4,dwData[i]) ! Write to Data Latch WE[i]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FPGA Write Register((i+4)*4,4,dwTristate[i]) ! Write to Tristate Latch WE[i+4]&lt;br /&gt;Next&lt;br /&gt;FPGA Write Register(80,4,0) ! Simultaneous Update all 128 I/O pins (tristate and data)&lt;br /&gt;FPGA Read Register(80,4,dwData) ! Simultaneous Sample all 128 I/O pins&lt;br /&gt;For i=0 to 3 ! Repeat for port A-D&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FPGA Read Register(i*4,4,dwInput[i]) ! Read sampled state from Latch RE[i]&lt;br /&gt;Next&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;“C” Example&lt;/b&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nHandle, nStatus, i;&lt;br /&gt;DWord&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwData[4], dwTristate[4], dwInput[4];&lt;br /&gt;&lt;br /&gt;GxFpgaInitialize (12, nHandle, nStatus);&amp;nbsp;&amp;nbsp;\\ Initialize driver for instrument in slot #12&lt;br /&gt;GxFpgaLoad (nHandle, 0, "Static_IO.svf" ,0,, pnStatus);&amp;nbsp;&amp;nbsp;\\ Load SVF file to volatile FPGA memory&lt;br /&gt;GxFpgaSetExpansionBoardBypass (nHandle , 0xF, pnStatus);&amp;nbsp;&amp;nbsp;\\ Set the expansion bypass&lt;br /&gt;for(i=0;i&lt;4;i++){&amp;nbsp;&amp;nbsp;\\ Repeat for port A - D&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GxFpgaWriteRegister (nHandle ,i*4, dwData[i], 4, nStatus);&amp;nbsp;&amp;nbsp;\\ Write to Data Latch WE[i]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GxFpgaWriteRegister (nHandle ,(i+4)*4, dwTristate[i], 4, nStatus);&amp;nbsp;&amp;nbsp;\\ Write to Tristate Latch WE[i+4]&lt;br /&gt;}&lt;br /&gt;GxFpgaWriteRegister (nHandle ,80, 0, 4, nStatus);&amp;nbsp;&amp;nbsp;\\ Simultaneous Update all 128 I/O pins (tristate and data)&lt;br /&gt;GxFpgaReadRegister (nHandle, 80, dwInput[0], 4, nStatus);&amp;nbsp;&amp;nbsp;\\ Simultaneous Sample all 128 I/O pins&lt;br /&gt;&lt;br /&gt;for(i=0;i&lt;4;i++){&amp;nbsp;&amp;nbsp;\\ Repeat for port A - D&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GxFpgaReadRegister (nHandle, i*4, dwInput[i], 4, nStatus);&amp;nbsp;&amp;nbsp;\\ Read sampled state from Latch RE[i]&lt;br /&gt;}&lt;/div&gt; &lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200205\Vi.Zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;LabView Example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200205\LV Panel.JPG" alt="&amp;nbsp;&amp;nbsp;" title="&amp;nbsp;&amp;nbsp;" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4:&amp;nbsp;&amp;nbsp;LabView Example Control Panel&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200205\LV Frame 0.JPG" alt="LabView Example Frame 0 Diagram" title="LabView Example Frame 0 Diagram" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5:&amp;nbsp;&amp;nbsp;LabView Example Frame 0 Diagram&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200205\LV Frame 1.JPG" alt="LabView Example Frame 1 Diagram" title="LabView Example Frame 1 Diagram" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6:&amp;nbsp;&amp;nbsp;LabView Example Frame 1 Diagram&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200205\LV Frame 2.JPG" alt="LabView Example Frame 2 Diagram" title="LabView Example Frame 2 Diagram" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 7:&amp;nbsp;&amp;nbsp;LabView Example Frame 2 Diagram&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200205\LV Frame 3.JPG" alt="LabView Example Frame 3 Diagram" title="LabView Example Frame 3 Diagram" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 8:&amp;nbsp;&amp;nbsp;LabView Example Frame 3 Diagram&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200205\LV Frame 4.JPG" alt="LabView Example Frame 4 Diagram" title="LabView Example Frame 4 Diagram" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 9:&amp;nbsp;&amp;nbsp;LabView Example Frame 4 Diagram&lt;/b&gt;&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200205/Controlling-a-GX3500-FPGA-Design-Using-Register-Reads-and-Writes</link><pubDate>9/21/2021</pubDate></item><item><title>How to calculate the frequency measurement accuracy of the GTX22x0 series of Time Interval Counter PXI Cards - Published on 9/21/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;&lt;br /&gt;Many factors can effect the accuracy of frequency measurements taken on any instrument.&lt;br /&gt;&lt;br /&gt;Main factors that effect accuracy are:&lt;br /&gt;&lt;br /&gt;1) Signal noise&lt;br /&gt;2) Instrument timebase accuracy&lt;br /&gt;3) Gate time used to measure the signal&lt;br /&gt;4) Calibration cycle&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[:+[+GTX2200-Series+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;The frequency measurement accuracy for the GTX2200 series can be found using the following formulas:&lt;br /&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='2' border=0 class='border'&gt;&lt;tr&gt;&lt;th&gt;&lt;b&gt;Slew Rate&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;Slew Rate (S&lt;sub&gt;R&lt;/sub&gt;) = 2 x PI x V&lt;sub&gt;p&lt;/sub&gt; x f&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;where PI = 3.14159265&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V&lt;sub&gt;p&lt;/sub&gt; = peak amplitude of the sine wave being measured (in volts)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; f = frequency of the signal being measured&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='2' border=0 class='border'&gt;&lt;tr&gt;&lt;th&gt;&lt;b&gt;Trigger Error&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;Error due to noise superimposed on the input signal from both internal and external sources&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200171\Q200171 Trigger Error Formula.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;E&lt;sub&gt;n&lt;/sub&gt; = rms noise of input signal (100MHz bandwidth)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='2' border=0 class='border'&gt;&lt;tr&gt;&lt;th&gt;&lt;b&gt;Least Significant Digit (LSD)&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200171\Q200171 LSD Formula.JPG" alt`=&amp;quot; border='0' /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='2' border=0 class='border'&gt;&lt;tr&gt;&lt;th&gt;&lt;b&gt;Resolution (Hertz)&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200171\Q200171 Resolution Formula.JPG" alt`=&amp;quot; border='0' /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='2' border=0 class='border'&gt;&lt;tr&gt;&lt;th&gt;&lt;b&gt;Accuracy (Hertz)&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200171\Accuracy Formula.JPG" alt`=&amp;quot; border='0' /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;The following Excel file can be used to calculate the accuracy &lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/Q200171\GTX22x0 Accuracy.xls' target='_blank'&gt;GTX22x0 Accuracy Spreadsheet &lt;/a&gt;.The values for Signal Frequency, Signal Noise (E&lt;sub&gt;n&lt;/sub&gt;), Measurement Gate Time and Instrument Timebase accuracy can be adjusted to observe the effects of these parameters on the overall measurement accuracy.</description><link>https://www.MarvinTest.com/KB/Q200171/How-to-calculate-the-frequency-measurement-accuracy-of-the-GTX22x0-series-of-Time-Interval-Counter-PXI-Cards</link><pubDate>9/21/2021</pubDate></item><item><title>A Sample of ATEasy IDE Customizations - Published on 9/13/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;This article discusses some of the ways you can customize the ATEasy development environment to improve your programming experience.&amp;nbsp;&amp;nbsp;ATEasy lets you improve your development experience by providing the user with control of:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Test Log standardization&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Modification of Variable prefix macros&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Code Editor Fonts&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Workspace Colors&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Menus and Toolbars&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;External Tools&lt;/li&gt;&lt;/ul&gt;In this article, we are specifically examining menu / toolbar customization and workspace optimization.&lt;/td&gt;&lt;td&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;h3&gt;Add User-Defined Tools to the Menu&lt;/h3&gt;Many times, while developing an application using ATEasy, a developer will need to access additional applications outside of ATEasy.&amp;nbsp;&amp;nbsp;Examples of types of these applications can be software front panels for instruments, programmer resources such as a hex editor or calculator, or shortcuts to informational resources such as ATEasy forum. If an application is used repeatedly, it is best to create a menu item within ATEasy to open the external application with just one click.&lt;br /&gt;&lt;br /&gt;Let's start with a simple example.&amp;nbsp;&amp;nbsp;Here is the process for adding a toolbar item to open the Calculator application:&lt;ul&gt;&lt;li&gt;In ATEasy, open the Customize dialog box by selecting from the menu bar: &lt;b&gt;Tools | Customize&lt;/b&gt;... &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select the &lt;b&gt;Tools&lt;/b&gt; tab from the Customize dialog box.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;First click the &lt;b&gt;New&lt;/b&gt; (Insert) button at the top of the Menu contents list box.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Enter the name &lt;b&gt;Calculator&lt;/b&gt; in the newly created item.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Enter &lt;b&gt;Calc.exe&lt;/b&gt; in the Command text box.&lt;/li&gt;&lt;/ul&gt;At this point, you can click the Test button to open the Calculator application.&amp;nbsp;&amp;nbsp;Additionally, you can close the Customize dialog box and select your newly created Calculator from the Tools menu.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200272\CustomizeCalculator.png" alt="Calculator inserted in the Menu contents list" title="Calculator inserted in the Menu contents list" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;User-created tools are assigned a 1-indexed designation based upon their position in the Menu contents list box.&amp;nbsp;&amp;nbsp;Notice from the above image that PXI/PCI Explorer is first on the list (Tool 1) and Calculator is second on the list (Tool 2).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Customize the Toolbar&lt;/h3&gt;Let's continue by adding the Calculator to the toolbar:&lt;ul&gt;&lt;li&gt;In ATEasy, open the Customize dialog box by selecting from the menu bar:&lt;b&gt; Tools | Customize&lt;/b&gt;... &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select the &lt;b&gt;Commands&lt;/b&gt; tab from the Customize dialog box&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select &lt;b&gt;Tools&lt;/b&gt; from the Categories list&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click and drag Tool 2 to the toolbar&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200272\CustomizeMoveTool2.png" alt="Click and Drag Tool 2 to the toolbar" title="Click and Drag Tool 2 to the toolbar" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Assigning a Keyboard Shortcut to a Command&lt;/h3&gt;At this point, you can use the Calculator toolbar item.&amp;nbsp;&amp;nbsp;But we can further improve utility by adding a keyboard shortcut to the Calculator button that we just created.&lt;br /&gt;&lt;br /&gt;Assigning a keyboard shortcut to a menu item:&lt;ul&gt;&lt;li&gt;Open the Customize dialog box by selecting from the menu bar: &lt;b&gt;Tools | Customize&lt;/b&gt;... &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select the Keyboard tab from the Customize dialog box&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select Tools from the Category drop-down list&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select UserTool2 from the Commands list&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click the label field under &lt;b&gt;Press New Short Key&lt;/b&gt;.&amp;nbsp;&amp;nbsp;At this point, the next thing you type will be entered as a shortcut key.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Press &lt;b&gt;Ctrl &lt;/b&gt;&lt;b&gt;Alt &lt;/b&gt;and &lt;b&gt;C&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Finally, click &lt;b&gt;Assign&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200272\CustomizeKeyboardWindow.png" alt="Adding a keyboard shortcut to User Tool 2" title="Adding a keyboard shortcut to User Tool 2" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Using the New Tool Command&lt;/h3&gt;You can now access your user-created tool in three ways:&lt;ul&gt;&lt;li&gt;Select &lt;b&gt;Calculator &lt;/b&gt;from the &lt;b&gt;Tools &lt;/b&gt;menu&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click the &lt;b&gt;Tool 2&lt;/b&gt; button on the toolbar&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Press Ctrl+Alt+C while the ATEasy IDE is in focus&lt;/li&gt;&lt;/ul&gt;Remember that within the custom tool creator, you can also program in hard coded arguments or you can prompt the user to enter arguments by enabling the &lt;b&gt;Prompt for Arguments&lt;/b&gt; checkbox.&amp;nbsp;&amp;nbsp;In the following example, the called application is Internet Explorer and the argument is a website.&amp;nbsp;&amp;nbsp;When the user selects this menu item, an new browser window is opened to the MTS Forums for convenient discussion of ATEasy problems and solutions.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200272\CustomizeMTSForums.png" alt="An example of a custom tool with arguments" title="An example of a custom tool with arguments" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;IDE Color Customization&lt;/h3&gt;The color of the toolbar and IDE can be customized to personalize your workspace.&amp;nbsp;&amp;nbsp;This customization is available in the Workspace tab of the Options dialog.&amp;nbsp;&amp;nbsp;Hue and saturation can be changed with the slider controls and the default color scheme can be restored by clicking the Reset button.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200272\ToolbarColorCustomization.png" alt="Color Customization of the IDE" title="Color Customization of the IDE" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Customizing the Code/Description Views using the Options dialog, Text Editor page&lt;/h3&gt;To change the way code and descriptions are displayed, Select Tools | Options from the menu to open the Options dialog. Select the Text Editor tab to modify the way that your source code is displayed within ATEasy.&amp;nbsp;&amp;nbsp;The 'Face' drop-down list allows you to choose from any of your currently installed fixed-pitch or mono-spaced fonts. Font size can be increased for readability or reduced to optimize screen real estate.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200272\OptionsDialogTextEditorFont.png" alt="Text Editor is used to modify the way source code is displayed" title="Text Editor is used to modify the way source code is displayed" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In the Tabs group, you can also optimize screen real estate by modifying the Width value of Tabs.&amp;nbsp;&amp;nbsp;The default setting (4) sets each tab equal to 4 blank spaces.&amp;nbsp;&amp;nbsp;Source code can be made more compact by reducing the width value, while increasing the value makes the structure of your code more obvious and readable.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200272\OptionsDialogTextEditorTabWidth.png" alt="Text Editor is used to modify the way source code is displayed" title="Text Editor is used to modify the way source code is displayed" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Changing Options settings such as the Tab Width does not modify the underlying ATEasy code. Changing the settings only alters the way that the code is displayed to the development computer's current ATEasy user.&amp;nbsp;&amp;nbsp;The source code remains the same.&amp;nbsp;&amp;nbsp;Because of this, several programmers can share the same ATEasy test application files without impacting other developers' user experience.&amp;nbsp;&amp;nbsp;Plus, the customization changes made will persist between ATEasy sessions.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Where to go from here&lt;/h3&gt;To learn more about customization of the IDE, use the ATEasy on-Line help to search for the following topics:&lt;ul&gt;&lt;li&gt;Customizing the IDE&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Options (Tools Menu)&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200272/A-Sample-of-ATEasy-IDE-Customizations</link><pubDate>9/13/2021</pubDate></item><item><title>F-35 Armament Maintenance and Sustainment Test - Published on 9/13/2021</title><description>The F-35 Lightning II is the latest 5th generation aircraft and is operating in ever-increasing numbers worldwide. With only a stray voltage / continuity O-Level test set employed in the current sustainment plan, maintainers will be unable to detect several of the MIL-STD-1760 bus failure conditions until actual weapons are located on the aircraft. In addition, they will lack O- and I-level troubleshooting capabilities for the F-35’s sophisticated armament and weapons as there is no other armament test system planned for use outside of the depot since the F-35 program only calls for a two level maintenance concept. Knowing that previous attempts to establish only two levels of armament maintenance for legacy 4th and 5th generation aircraft have not been successful, Marvin Test Solutions invested its own resources to be able to provide war fighting test enhancements if and when needed by F-35 operators. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Marvin Test Solutions’ highly successful, ultra-rugged &lt;a href='http://www.marvintest.com/product/mts-235a' target='_blank'&gt;MTS-235A&lt;/a&gt; F-35 production and depot level test set is proven and also suitable to deploy as the I-Level Armament Test Set if F-35 users elect to implement three levels of armament maintenance. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The MTS-235A Armament Test Set is ready and available today for immediate deployment.&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200263/F-35-Armament-Maintenance-and-Sustainment-Test</link><pubDate>9/13/2021</pubDate></item><item><title>Digital I/O Hardware Handshaking Using GX5280/GX5290 Series - Published on 9/13/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;h3&gt;Overview&lt;/h3&gt;Often, testing devices with digital interfaces requires the ability to wait for the device to respond to specific pattern sequences sent to it.&amp;nbsp;&amp;nbsp;This is especially true for devices that incorporate bus transfers that use hardware handshaking to synchronize the data transfer.&amp;nbsp;&amp;nbsp;The &lt;a href='http://www.marvintest.com/product/GX5280-Series' target='_blank'&gt;GX5280&lt;/a&gt;/&lt;a href='http://www.marvintest.com/product/GX5290-Series' target='_blank'&gt;GX5290&lt;/a&gt; digital instruments family of cards&amp;nbsp;&amp;nbsp;provide sixteen external event inputs that can be used in support of this handshaking process.&amp;nbsp;&amp;nbsp;This article explains how to use the external events to perform synchronous Pause/Resume operations with the device under test (DUT).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;External Events&lt;/h3&gt;The GX5280 and GX5290 digital IO instruments (DIO) provide sixteen external input signals that can be used to pause and trigger (resume) the digital pattern sequences.&amp;nbsp;&amp;nbsp;This ability to pause, and then resume pattern sequencing based on hardware signaling is essential for performing closed-loop handshaking of data transfers.&amp;nbsp;&amp;nbsp;Figure 1 below provides a functional block diagram of the external event control.&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+GX5280+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200334\\External Events Block- Mid.png" alt="External Events Block Diagram" title="External Events Block Diagram" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1 - External Events Block Diagram&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;There are three pairs of registers that define how the external events can be used, labeled as the 'D' event', the 'T' event and the 'P' event.&amp;nbsp;&amp;nbsp;Each register pair has a sixteen bit event pattern, and a sixteen bit event mask for ignoring unused bits - where a logic '1' enables an event input signal, and a logic '0' disables, or masks, the corresponding input.&amp;nbsp;&amp;nbsp;Together, the event/mask combination defines a sixteen bit value that is passed to the pattern sequencer for evaluation.&lt;br /&gt;&lt;br /&gt;The 'D' and 'T' events are used to trigger the pattern sequencer.&amp;nbsp;&amp;nbsp;Triggers can be based on a single pattern match of the 'D' or 'T' event, or can be used in combination to define a trigger sequence that must be met in order to qualify as a valid trigger - as in a pre-trigger followed by the actual trigger.&amp;nbsp;&amp;nbsp;The event order can be defined either as 'D' followed by 'T', or 'T' followed by 'D'.&lt;br /&gt;&lt;br /&gt;The 'P' event will force the DIO sequencer to pause pattern execution when the defined event condition is met.&lt;br /&gt;&lt;br /&gt;The DIOs do provide software commands that can pause and trigger pattern sequencing, but software control is not synchronized to the data flow, and typically cannot operate at speeds the DUT is capable of, or data transfer protocols require.&amp;nbsp;&amp;nbsp;Control registers built into the instrument pattern sequencer can be used to pause execution at a specific vector, but the control register is only one state deep - meaning that without software intervention, only one pause command can exist in the entire pattern sequence.&amp;nbsp;&amp;nbsp;Reprogramming the pause vector using software can be used to extend the one-shot pause command, but slows the handshaking process to what might be unacceptable timing.&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;b&gt;Note:&lt;/b&gt;&amp;nbsp;&amp;nbsp;The &lt;a href='https://www.marvintest.com/Product/GX5295' target='_blank'&gt;GX5295&lt;/a&gt; only provides eight external event inputs.&amp;nbsp;&amp;nbsp;Otherwise, the functionality described in this article applies to the GX5295.&amp;nbsp;&amp;nbsp;The GX5296 and GX5960 series instruments use a completely different architecture and are not covered in this article.&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;At-Speed Hardware Handshaking&lt;/h3&gt;Utilizing the external event inputs and unused IO pins on the DIO, at-speed hardware handshaking can be achieved.&amp;nbsp;&amp;nbsp;By connecting unused pin(s) from the J1 connector to the external event inputs on the J3 connector, you can program a hardware "pause" at virtually any vector, or any number of vectors in the full pattern length of the instrument - effectively turning the unused IO channels into additional pause commands.&amp;nbsp;&amp;nbsp;For example, if IO channel 30 (J1-P31) is connected to external event input signal 2 (J3-P3), then IO channel 30 becomes the pause control signal if the 'P' event is defined as Mask=0x0004, and Event=0x0004.&amp;nbsp;&amp;nbsp;Then any vector where IO channel 30 is programmed to a logic '1' will force the DIO into a paused state.&amp;nbsp;&amp;nbsp;Assuming the DIO is acting as the controller in a data transfer involving handshaking, programming a 'P' event at the vector(s) where the controller must wait for the DUT to acknowledge the data transfer forces the entire DIO domain (all IO channels) into a Paused-Waiting-For-Trigger state.&amp;nbsp;&amp;nbsp;Continue triggers can be generated via software, come from the external trigger input, be received from the PXI backplane, or come from using the same external events used to force the pause state.&lt;br /&gt;&lt;br /&gt;If the DUT handshake response is also connected to external event inputs, say event signal 0 (J3-P1), and you elected to use the 'D" event to resume pattern sequencing, then you would define the 'D' event trigger as Mask=0x0001, and Event -0x0001.&amp;nbsp;&amp;nbsp;When the DIO is paused, a logic '1' on event input 0 will trigger the instrument and continue pattern execution.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;What's The Catch?&lt;/h3&gt;There are some caveats to using external events:&lt;ul&gt;&lt;li&gt;Events are level sensitive, and are not generated by rising or falling edges&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The pause is not immediate.&amp;nbsp;&amp;nbsp;It takes a minimum of 16 vectors to effect a pause.&amp;nbsp;&amp;nbsp;The maximum run-on depends on the pattern rate.&amp;nbsp;&amp;nbsp;Reasons for variations in the vector run-on are described below:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There is an approximately 350 nS propagation delay for pause events to be available to the pattern sequencing logic.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;There is a 16-state stimulus/response pipeline that must be considered when using DIO loop-back for pause control.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Synchronous External Event Pause/Trig requires only 1 vector to initiate the pause.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Asynchronous External Event Pause/Trig requires a minimum of 2 vectors to initiate the pause.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A maximum of 8 vectors can be used for initiating a pause.&amp;nbsp;&amp;nbsp;The DIO pipeline will retain pause event states which could initiate a pause immediately after a continue trigger is received if the pause signal is applied across too many vectors.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;At high data rates, ground bounce can cause false or intermittent Pause/Trigger operations as the bounce could exceed the vector period the instrument is running at.&lt;/li&gt;&lt;/ul&gt;The approximate 350 nS propagation delay and 16-state pipeline will delay pausing the DIO pattern from a minimum of 16, to a maximum of approximately 50 vector states.&amp;nbsp;&amp;nbsp;The patterns immediately following the pause signal should be programmed with static states so as not to vary the logic states presented to the DUT while waiting for the handshake acknowledge.&amp;nbsp;&amp;nbsp;The length of the run-on depends on the data rate of the DIO, for reason explained below.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200334\\DIO Pause-01.png" alt="Low Data Rate Pause Timing" title="Low Data Rate Pause Timing" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2 - Low Data Rate Pause Timing&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In Figure 2 above and Figure 3 below, the propagation delay (Tpd) is the same duration (~350 ns).&amp;nbsp;&amp;nbsp;Figure 3 has been stretched to better show the timing detail.&amp;nbsp;&amp;nbsp;You can see in Figure 2 that Tpd is less than 1 vector period, so its effect is contained in the first clock cycle after the pause signal.&amp;nbsp;&amp;nbsp;The pattern clock is slow enough that the effect of Tpd is hidden (contained) in the vector where the pause trigger is generated (blue clock cycle).&amp;nbsp;&amp;nbsp;So the pause run-on is affected only by the instrument pipeline, and the DIO pauses at 16 vectors after the pause event (red clock cycle).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200334\\DIO Pause-02.png" alt="High Data Rate Pause Timing" title="High Data Rate Pause Timing" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3 - High Data Rate Pause Timing&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In Figure 3, the vector clock is running much faster, and the same Tpd duration extends across multiple pattern clocks.&amp;nbsp;&amp;nbsp;During Tpd, pattern clocks (yellow clock cycles) have no effect in moving the pause trigger state through the instrument pipeline.&amp;nbsp;&amp;nbsp;So, in effect, the pause run-on is extended by the number of pattern clocks contained in the duration of Tpd - five clock cycles in the example.&amp;nbsp;&amp;nbsp;The vector in which the pause occurs is 21 vectors after the pause event (red clock cycle) - 16 vectors for the pipeline + 5 vectors for Tpd.&amp;nbsp;&amp;nbsp;If the DIO is running at 100 MHz (10 nS) period, an additional 35 clocks could occur during Tpd (350 nS / 10 nS period) - give or take.&amp;nbsp;&amp;nbsp;At high data rates, and due to minor variations in Tpd delays, there is some ambiguity concerning the exact vector where the pause will take effect, so the pipeline and Tpd run-on should be characterized for the data rate at which the test pattern will be run.&lt;br /&gt;&lt;br /&gt;Examples of this are shown in Figure 4:1 - 4:6 below.&amp;nbsp;&amp;nbsp;Each image is a screen capture of the GtDio panel running the same test pattern.&amp;nbsp;&amp;nbsp;In each case, the pause signal was programmed at vector 5000.&amp;nbsp;&amp;nbsp;The only difference between the screen captures is the data rate at which the pattern was executed.&amp;nbsp;&amp;nbsp;Reviewing the highlighted fields of Figure 4:1 shows the pattern clock is running at 1 MHz.&amp;nbsp;&amp;nbsp;The period, 1 uS, is well above the Tpd value, so the pause takes effect at vector 5016.&amp;nbsp;&amp;nbsp;Subsequent figures show different pattern clocks, up to 100 MHz, and the resulting pause vector for each.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200334\\Pipeline-01a.png" alt="Pause Vector at 1 MHz - 100MHz Data Rate" title="Pause Vector at 1 MHz - 100MHz Data Rate" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4 - Pause Vector at 1 MHz - 100MHz Data Rate&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;While the GX5280 and GX5290 Digital IO instruments provide pattern control using programmable registers and/or software commands, utilizing unused DIO resources can extend the functionality of the DIO instruments to support multiple pause/resume points across the entire depth of the UUT test pattern, or within multiple pattern sets that can be pre-loaded into the 64M vector DIO pattern memory.&lt;/td&gt;&lt;td&gt;[:+[+GX5290+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;.</description><link>https://www.MarvinTest.com/KB/Q200334/Digital-I-O-Hardware-Handshaking-Using-GX5280-GX5290-Series</link><pubDate>9/13/2021</pubDate></item><item><title>White Paper: Next Generation Armament Test - A Former USAF Armament Maintainer's Perspective - Published on 9/13/2021</title><description>Armament test is challenging, problematic on good days, and incredibly daunting when aircraft and munitions advance faster than their associated test equipment.&amp;nbsp;&amp;nbsp;Innovative solutions such as the MTS-3060A SmartCan have the potential to rewrite the armament test paradigm by advancing test equipment into the digital era, revolutionizing the way units prepare and execute combat missions in the 21st century and providing next generation support to our warfighters.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2020\Armament_Maintainer.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200328/White-Paper-Next-Generation-Armament-Test-A-Former-USAF-Armament-Maintainer-s-Perspective</link><pubDate>9/13/2021</pubDate></item><item><title>Passing an array from a .NET object to an ATEasy callback procedure - Published on 9/10/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;An ATEasy procedure can be used as a callback function when passed to an external library such as a .NET assembly or Windows DLL. &lt;br /&gt;&lt;br /&gt;This article will describe how an ATEasy callback procedure can be made to accept an array parameter from a calling .NET object.&lt;br /&gt;&lt;br /&gt;In this example, a simple .NET class called &lt;b&gt;MyClass&lt;/b&gt; will be used to pass an array of bytes to an ATEasy procedure.&lt;br /&gt;&lt;br /&gt;The MyClass constructor will accept one parameter of type MyCallback which is declared as a delegate accepting one parameter of type Object.&lt;br /&gt;&lt;br /&gt;The following c# code describes this class:&lt;/td&gt;&lt;td&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;namespace ArrayTest&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; public class MyClass&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public delegate void MyCallback(Object msg);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private MyCallback m_callback;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private byte[] m_data = new byte[3];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public MyClass(MyCallback callback) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_callback = callback;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// save the ATEasy procedure pointer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void Test()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_data[0] = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_data[1] = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_data[2] = 2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_callback(m_data);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// call the ATEasy procedure with array&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Using Object as the parameter type for the delegate, instead of an array, allows the .NET object to convert the passed in array to a Variant when invoking the ATEasy callback procedure.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200211\KBDotNetATEasy1.bmp" alt=".Net Callback" title=".Net Callback" border='0' &gt;&lt;br /&gt;&lt;br /&gt;The ATEasy callback procedure should be created as shown below. The only parameter should be of type &lt;b&gt;Val &lt;/b&gt;&lt;b&gt;Variant&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;The procedure &lt;b&gt;VarDimSize &lt;/b&gt;should be called to determine the number of elements contained within the &lt;b&gt;data &lt;/b&gt;parameter.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure MyCallback(data): Void&lt;br /&gt;---------------------------------------------------------------------------&lt;br /&gt;	data: Val Variant&lt;br /&gt;	size: Long&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size = VarDimSize(data, 0)&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print "Received " + Format(size, "0") + " bytes"&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! fails here since no data in array (index out of bounds)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print "No Data Received"&lt;br /&gt;&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Finally, the .NET class can be instantiated and invoked from ATEasy as follows:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;tester = new ArrayTest.MyClass(MyCallback) &lt;br /&gt;tester.Test()&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Note that &lt;b&gt;tester &lt;/b&gt;is of type ArrayTest.MyClass and &lt;b&gt;MyCallback &lt;/b&gt;is the name of the ATEasy callback procedure.&lt;br /&gt;Calling &lt;b&gt;Test()&lt;/b&gt; will result in an array being filled by the .NET object, and passed to the ATEasy callback procedure.</description><link>https://www.MarvinTest.com/KB/Q200211/Passing-an-array-from-a-NET-object-to-an-ATEasy-callback-procedure</link><pubDate>9/10/2021</pubDate></item><item><title>Using Excel File to Load Test Parameters to an ATEasy Program - Published on 9/10/2021</title><description>The article shows how to read Microsoft Excel file that has test parameters such as min, max values and to modify the program tests requirements dynamically.&lt;br /&gt;&lt;br /&gt;The example reads a Microsoft&amp;nbsp;&amp;nbsp;Excel file and store the new parameters in the program test objects. Each row in the Excel file contains the test id (test to read the parameters to) , test min, test max and additional extra parameter that is loaded to the ATest.Tag property (access from the test using test.tag).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200233\ATEasyExcelTestParameters1.JPG" alt="Excel Spreadsheet with ATEasy Test Parameters" title="Excel Spreadsheet with ATEasy Test Parameters" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Using the Example&lt;/h3&gt;The code to read the Excel file and apply the parameters resides in the ExcelTestParameters.drv driver and it uses the &lt;b&gt;&lt;a href='http://www.marvintest.com/product/ateasy' target='_blank'&gt;ATEasy®&lt;/a&gt;&lt;/b&gt; EXCEL driver. To use the driver:&lt;br /&gt;1. Insert the ExcelTestParameters.drv to your system&lt;br /&gt;2. Insert the Excel.drv to your system&lt;br /&gt;3. To load the parameters to your program use the following code:&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;div class='fixedFont'&gt;if not EXCELTESTS ReadTestParametersFile("C:\\ExcelTestParameters.xlsx", "Sheet1")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;abort&lt;br /&gt;endif&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;this code typically can reside in Program.OnInit event.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Example Code&lt;/h3&gt;The&amp;nbsp;&amp;nbsp;ExcelTestParameters.drv export one command / procedure that is used to load the parameters:&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;div class='fixedFont'&gt;Procedure ReadExcelTestParametersFile(sFile, sSheet): Bool&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sFile: Val String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sSheet: [Val] String = "Sheet1"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xlwb: Excel.Workbook&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xls: Excel.Worksheet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vrA: Variant&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vrB: Variant&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vrC: Variant&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vrD: Variant&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iRow: Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sRow: String&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCEL Initialize()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! open excel file&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCEL File Open Existing(, sFile, xlwb)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endtry&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if not xlwb&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MsgBox("Unable to open Excel Workbook File: '"+sFile+"'")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCEL Quit()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return False&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! verify the worksheet exist and get the object&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xls=xlwb.Sheets.Item(sSheet)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MsgBox("Bad Excel Worksheet: '"+sSheet+"' found in File: '"+sFile+"'")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCEL File Close(xlwb, False)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCEL Quit()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return False&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endtry&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! read row B to empty row&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! each row has columns: 1=testid, 2=min, 3=max, 4=parameters&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for iRow=2 to 9999&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sRow=str(iRow)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCEL Get Value(xlwb, sSheet, "A"+sRow, vrA)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if vrA=""&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exitloop		! last test&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCEL Get Value(xlwb, sSheet, "B"+sRow, vrB)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCEL Get Value(xlwb, sSheet, "C"+sRow, vrC)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCEL Get Value(xlwb, sSheet, "D"+sRow, vrD)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Program.Tests(vrA).Min=vrB&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Program.Tests(vrA).Max=vrC&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Program.Tests(vrA).Tag=vrD	! extra parameters&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MsgBox("Bad Test ID: '"+vrA+"' found in Row: '"+sRow+"', in File: '"+sFile+"', Sheet: '"+sSheet+"'")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCEL File Close(xlwb, False)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCEL Quit()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return False&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endtry&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCEL File Close(xlwb, False)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCEL Quit()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return True&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Running the Example&lt;/h3&gt;Running the example will open the ATEasy Test Executive with the new test parameters as specified in the spreadsheet:&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200233\ATEasyExcelTestParameters2.JPG" alt="Excel Spreadsheet with ATEasy Test Parameters Test Log" title="Excel Spreadsheet with ATEasy Test Parameters Test Log" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;How to Improve the Example&lt;/h3&gt;1. Use the program name as the sheet name; every sheet in the workbook can be used for one program.&lt;br /&gt;2. Add support for other test type. Once the test is located the routine can check the test type and load parameters accordingly.&lt;br /&gt;3. You can use the testid also for sequencing (similar to the profile driver)&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Example Files&lt;/h3&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200233\ExcelTestParameters.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download ATEasy ExeclTestParametrs project files&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200233/Using-Excel-File-to-Load-Test-Parameters-to-an-ATEasy-Program</link><pubDate>9/10/2021</pubDate></item><item><title>Programming I/O Width on the GX5290 Series - Published on 9/10/2021</title><description>The GX5290 series of DIO cards have a programmable I/O width feature that allows the user to trade I/O channel width for vector memory depth. The GX5292, GX5292e, GX5293 and GX5295 cards each offer 256MB of vector memory and the GX5291 offers 128MB of vector memory. Under software control, the vector memory can be configured to support channel widths shown in the table below. &lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;&lt;b&gt;&lt;div align='center'&gt;Vector Width&lt;/div&gt;&lt;/b&gt;&lt;/th&gt;&lt;th&gt;&lt;b&gt;&lt;div align='center'&gt;GX5292/GX5292e/GX5293/GX5295 Vector Depth&lt;/div&gt;&lt;/b&gt;&lt;/th&gt;&lt;th&gt;&lt;b&gt;&lt;div align='center'&gt;GX5291 Vector Depth&lt;/div&gt;&lt;/b&gt;&lt;/th&gt;&lt;th&gt;&lt;b&gt;&lt;div align='center'&gt;Corresponding DIO Channels&lt;/div&gt;&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;div align='center'&gt;32 Ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;64Mbit/Ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;32Mbit/Ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;Ch0-31&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;div align='center'&gt;16 Ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;128Mbit/ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;64Mbit/ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;Ch0-15&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;div align='center'&gt;8 Ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;256Mbit/ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;128Mbit/ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;Ch0-7&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;div align='center'&gt;4 Ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;512Mbit/ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;256Mbit/ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;Ch0-3&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;div align='center'&gt;2 Ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;1Gbit/ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;512Mbit/ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;Ch0-1&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;div align='center'&gt;1 Ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;2Gbit/ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;1Gbit/ch&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;Ch0&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Additional information on this subject can be found in the GTDIO Programmers Reference Manual under the &lt;b&gt;DIOWriteOutMemory()&lt;/b&gt; and &lt;b&gt;DIOWriteDirectionMemory()&lt;/b&gt; functions. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Configuring DIO cards for vector widths of 4, 2 or 1&lt;/h3&gt;To utilize all of the vector memory when using vector widths of 4, 2 or 1 channel(s), the vector data needs to be packed into a DWORD array (32-bit boundary) before it can be transmitted. The vector data is packed into the DWORD array starting at the LSB of the first DWORD array element. For example, a vector array with the following 32 4-bit hexadecimal values starting at element 0&amp;nbsp;&amp;nbsp;as shown here in this ATEasy example:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F&lt;/div&gt; &lt;br /&gt;will be packed into the DWORD array called adwTxData[] starting at element 0, as follows: &lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;adwTxData[0] = 0x76543210 &lt;br /&gt;adwTxData[1] = 0xFEDCBA98 &lt;br /&gt;adwTxData[2] = 0x76543210 &lt;br /&gt;adwTxData[3] = 0xFEDCBA98 &lt;/div&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;From the above example, it is clear that the packing process is very straightforward and utilizes all available vector memory. To perform the packing function the programmer can use either the GX529x driver &lt;b&gt;DioDataPack()&lt;/b&gt; function or can write a custom function to pack the data.&lt;br /&gt;&lt;br /&gt;Direction control information will also need to be packed into a DWORD array in the same way as the transmit data array.&lt;br /&gt;&lt;br /&gt;It is important to note that when writing the DWORD array to the DIO cards Output Memory (&lt;b&gt;DioWriteOutMemory()&lt;/b&gt;) or to the Direction Control Memory (&lt;b&gt;DioWriteDirectionMemory()&lt;/b&gt;) that the dwSize parameter is the number of vectors to transmit not the number of elements in the DWORD array.&lt;br /&gt;&lt;br /&gt;For example, using the data from the above array the&lt;b&gt; DioWriteOutMemory()&lt;/b&gt; and &lt;b&gt;DioWriteDirectionMemory(&lt;/b&gt;) functions will be as follows: &lt;/td&gt;&lt;td&gt;[:+[+gx5295+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;DioWriteOutMemory(nMasterHandle,adwTxData,0, 32, nStatus) &lt;br /&gt;DioWriteDirectionMemory(nMasterHandle, adwDirCtrl, 0, 32, nStatus) &lt;/div&gt;&lt;br /&gt;Notice the dwSize parameter is 32 not 4. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; If the DIO card is receiving data, this data will be stored in the receive memory in a packed format in the same way the transmit data is packed above. To analyze the received data it can be unpacked from the DWORD format to its original width using the&lt;b&gt; DioDataUnpack()&lt;/b&gt; function.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Configuring the DIO cards for vector widths of 8 and 16 channels&lt;/h3&gt;When using vector widths of 8 and 16 channels the transmit data and direction control data does not need to be packed as this process is done automatically by the &lt;b&gt;DioWriteOutMemory() &lt;/b&gt;and &lt;b&gt;DioWriteDirectionMemory()&lt;/b&gt; functions. The only requirements for using these widths are:&lt;br /&gt;1) When using a vector width of 8 channels the vector data must be in a BYTE array and&lt;br /&gt;2) When using a vector width of 16 channels the vector data must be in a WORD (16-bit) array. &lt;br /&gt;&lt;br /&gt;Below are two examples showing how the data can be packed. Example 1 uses the &lt;b&gt;DioDataPack()&lt;/b&gt; function and Example 2 uses standard compiler shift commands.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example 1&lt;/b&gt;: Transmit a number of 4-bit elements previously stored in BYTE array called aucFileData[]. The number of elements to transmit is indicated by dwFileSize. This example assumes that the vector data is stored as one 4-bit vector per array element.&lt;br /&gt;&lt;br /&gt;To pack the 4-bit data, 8 elements at a time are transferred to a temporary BYTE array (aucTemp[]) and then the DioDataPack() function is used to write the data to each element of the adwTxData[] DWORD array.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;!Pack the 4-bit data into adwTxData[] (a DWORD (32-bit) array)&lt;br /&gt;k=0&lt;br /&gt;for i=0 to dwFileSize-1&lt;br /&gt;&amp;nbsp;&amp;nbsp; !Transfer 8 4-bit elements to be packed into a temporary array aucTemp[]&lt;br /&gt;&amp;nbsp;&amp;nbsp; for j=0 to 7 do&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; aucTemp[j] = aucFileData[i]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i=i+1&lt;br /&gt;&amp;nbsp;&amp;nbsp; next&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Now pack the lower 4 bits of the first eight elements of the aucTemp[] array&lt;br /&gt;&amp;nbsp;&amp;nbsp;!into the adwTxData[] array starting at location 0. This is the data to be transmitted.&lt;br /&gt;&amp;nbsp;&amp;nbsp;DioDataPack(4, 8, 0, 1, adwTxData[k], aucTemp, nStatus)&lt;br /&gt;&amp;nbsp;&amp;nbsp;k=k+1&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Undo the last increment from the above For {j} loop because For {i} loop will also increment i&lt;br /&gt;&amp;nbsp;&amp;nbsp;i=i-1 &lt;br /&gt;next&lt;br /&gt;&lt;br /&gt;!Write the adwTxData array to the Output memory. Remember the dwSize parameter is the &lt;br /&gt;!number of vectors to be transmitted not the number of elements in the adwTxData array.&lt;br /&gt;DioWriteOutMemory(nMasterHandle,adwTxData,0, dwFileSize,nStatus)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example 2&lt;/b&gt;: Transmit a number of n-bit wide elements (where n=4,2 or 1) previously stored in BYTE array called aucFileData[]. The number of elements to transmit is indicated by dwFileSize. This ATEasy example assumes that the vector data is stored as one vector per array element.&lt;br /&gt;&lt;br /&gt;This example is written using standard compiler shift commands instead of using the &lt;b&gt;DioDataPack()&lt;/b&gt; function. It uses the ATEasy GX529x driver commands but also expands on the above example by working with vector widths of 4, 2 or 1. First, the DIO instrument I/O configuration is read and based on the channel width value (nChWidth), the data mask (nMask) and number of channels (nNumCh) variables are assigned appropiate values. nMask is used to mask the unwanted vector data bits in each aucFileData[] array element and nNumCh is used to shift the data during the packing process.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;!Get the DIO I/O Configuration information&lt;br /&gt;DIO Get IOConfiguration(nMasterHandle, nChWidth, nDir)&lt;br /&gt;&lt;br /&gt;!Set the nMask and nNumCh variables depending on the channel width&lt;br /&gt;select nChWidth&lt;br /&gt;&amp;nbsp;&amp;nbsp;Case aChannelsWidth4&amp;nbsp;&amp;nbsp;!Using a vector width of 4 Channels&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nMask = 0x0f&amp;nbsp;&amp;nbsp;!Mask out upper 4 bits. In this example data is in lower 4 bits&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nNumCh = 4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Number of DIO channels. Used to shift data for packing purposes&lt;br /&gt;&amp;nbsp;&amp;nbsp;Case aChannelsWidth2&amp;nbsp;&amp;nbsp;!Using a vector width of 2 Channels&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nMask = 0x03&amp;nbsp;&amp;nbsp; !Mask out upper 6 bits. Data is in the lower 2 bits&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nNumCh = 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Number of DIO channels. Used to shift data for packing purposes&lt;br /&gt;&amp;nbsp;&amp;nbsp;Case aChannelsWidth1&amp;nbsp;&amp;nbsp;!Using a vector width of 1 Channel&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nMask = 0x01&amp;nbsp;&amp;nbsp; !Mask out upper 7 bits. Data is in the LSB&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nNumCh = 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Number of DIO channels. &lt;br /&gt;endselect&lt;br /&gt;&lt;br /&gt;!Now pack the vector data into DWORD (32-bit) array called adwTxData[]&lt;br /&gt;i=0&amp;nbsp;&amp;nbsp;!Used to count through the vector data array dwFileData[]&lt;br /&gt;k=0&amp;nbsp;&amp;nbsp;!Used to count through the adwTxData[] as data gets packed&lt;br /&gt;while i &lt; dwFileSize&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Pack aucFileData[] elements into 32bit boundaries&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while j&lt;(32 div nNumCh) and i &lt; dwFileSize &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;adwTxData[k]=adwTxData[k] or ((aucFileData[i] and nMask) shl (j*nNumCh))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i=i+1 !Increment aucFileData[] counter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j=j+1 !Increment while loop counter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endwhile&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k=k+1&amp;nbsp;&amp;nbsp; !Increment adwTxData[] counter&lt;br /&gt;endwhile&lt;br /&gt;&lt;br /&gt;!Write the adwTxData array to the Output memory. Remember the dwSize parameter is the &lt;br /&gt;!number of vectors to be transmitted (dwFileSize) not the number of elements in the&lt;br /&gt;!adwTxData array.&lt;br /&gt;DIO Write Memory Out (nMasterHandle,adwTxData,0,dwFileSize)&lt;br /&gt;&lt;/div&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;h3&gt;Program examples&lt;/h3&gt;An ATEasy application that demonstrates how to setup a GX5295 DIO card for various vector widths can be downloaded by clicking on this link &lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200226\Q200226.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Q200226.zip&lt;/a&gt;. The application has three tests:&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;InitializeDIO. This initializes the GX5295. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;4ChWidthDLL: This is example 1 above. This uses the GTDIO DLL commands to setup the card for a 4 channel vector width and to transmit a clock pattern on all four channels. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;nChWidthATEasy: This is example 2 above. It uses the GX5295 ATEasy commands to setup the card for a 4 channel vector width and to transmit a clock pattern on all four channels. To change the configuration to output on two channels or only one channel, replace the aChannelsWidth4 parameter value in the configuration setup line.&lt;/blockquote&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;DIO Setup IOConfiguration(nMasterHandle,aChannelsWidth4, 0x0)&lt;/div&gt; &lt;br /&gt;with aChannelsWidth2 for a two channel vector width or to aChannelsWidth1 for a single channel vector width.&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200226/Programming-I-O-Width-on-the-GX5290-Series</link><pubDate>9/10/2021</pubDate></item><item><title>Accessing ATEasy Internal Classes from other programming languages - Published on 9/10/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;ATEasy has many documented methods for accessing externally developed code and software.&amp;nbsp;&amp;nbsp;DLLs, ActiveX objects, and .NET classes can be imported.&amp;nbsp;&amp;nbsp;Command line utilities, VIs, and scripts can be run from within the ATEasy environment.&lt;br /&gt;&lt;br /&gt;Should the need arise, ATEasy code can be exported to be used by other development environments.&amp;nbsp;&amp;nbsp;ATEasy projects can be compiled to DLLs which can be linked within other languages.&amp;nbsp;&amp;nbsp;Parameters described in a DLL procedure that are defined as ATEasy basic data types (Short, Long, Word, DWord, etc.) are easily passed and cast as a native type in the calling language. &lt;br /&gt;&lt;br /&gt;The article &lt;a href='http://www.marvintest.com/KnowledgeBase/KBArticle.aspx?ID=210' target='_blank'&gt;Comparing C/C++, C#, VB and ATEasy Basic Data Types&lt;/a&gt; can be used as a reference for setting compatible basic data types.&amp;nbsp;&amp;nbsp;But, ATEasy Internal classes such as &lt;b&gt;ATest&lt;/b&gt;, &lt;b&gt;ATask&lt;/b&gt;, and &lt;b&gt;ALog &lt;/b&gt;can require a bit more work.&amp;nbsp;&amp;nbsp;This article details the process using C++ and C#. &lt;/td&gt;&lt;td&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;h3&gt;IDispatch: Using the methods and properties of an ATEasy object&lt;/h3&gt;ATEasy objects and classes are ActiveX/COM objects. The COM &lt;b&gt;IDispatch &lt;/b&gt;interface allows the programmer to access an object's property and method list at run-time.&amp;nbsp;&amp;nbsp;ATEasy reserved objects such as &lt;b&gt;Program&lt;/b&gt;, &lt;b&gt;System&lt;/b&gt;, and &lt;b&gt;Test&lt;/b&gt; can be passed out of ATEasy and used using the IDispatch interface.&amp;nbsp;&amp;nbsp;The ATEasy object's members can subsequently be read and altered.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Example 1: Creating The DLL - C++&lt;/h3&gt;The DLL we are creating within Visual Studio will contain three exported functions:&lt;ul&gt;&lt;li&gt;&lt;b&gt;ATEasyClassSet()&lt;/b&gt; : Set a value to the specified property of the referenced object.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ATEasyClassGet()&lt;/b&gt; : Get the value of the specified property of the referenced object.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ATEasyClassMethod()&lt;/b&gt; : Call a method of the referenced object.&lt;/li&gt;&lt;/ul&gt;The project created is a Win32 console application that will be compiled to DLL.&amp;nbsp;&amp;nbsp;The project code was created in &lt;b&gt;Microsoft Visual Studio 2005&lt;/b&gt; and entitled IDispatchExample.&amp;nbsp;&amp;nbsp;It is provided at the bottom of this article.The Microsoft knowledge base article (retrieved from web.archive.org) &lt;a href='https://web.archive.org/web/20140922085810/http://support.microsoft.com/kb/238393' target='_blank'&gt;How To Use Visual C++ to Access DocumentProperties with Automation&lt;/a&gt; details the automation of Excel operations using the IDispatch interface.&amp;nbsp;&amp;nbsp;We will reuse the helper function &lt;b&gt;Autowrap()&lt;/b&gt; included within that article.&amp;nbsp;&amp;nbsp;The &lt;b&gt;Autowrap() &lt;/b&gt;function ensures that your request is formatted properly and provides some user notification in case of an error while performing the get, set or call.&amp;nbsp;&amp;nbsp;Each of the following three exported functions will make a call to &lt;b&gt;Autowrap&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ATEasyClassSet(): Setting an object's property&lt;/b&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;//PURPOSE: Sets the specified value vtParam to the specified property, sProperty on the object pATEasyObject&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;void WINAPI ATEasyClassSet(IDispatch *pATEasyObject, LPOLESTR sProperty, VARIANT vtParam)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; AutoWrap(DISPATCH_PROPERTYPUT, NULL, pATEasyObject, sProperty, 1, vtParam);&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ATEasyClassGet(): Getting an object's property&lt;/b&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;//PURPOSE: Gets the value of the specified property, sProperty of the specified object pATEasyObject and returns it in the referenced variant pvtParam.&lt;br /&gt;&lt;br /&gt;void WINAPI ATEasyClassGet(IDispatch *pATEasyObject, LPOLESTR sProperty, VARIANT *pvtParam)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; AutoWrap(DISPATCH_PROPERTYGET, pvtParam, pATEasyObject, sProperty, 0);&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ATEasyClassMethod(): Calling an object's method&lt;/b&gt;&lt;br /&gt;C supports calling functions with a variable number of arguments.&amp;nbsp;&amp;nbsp;&lt;b&gt;Autowrap() &lt;/b&gt;supports variable arguments because we will be utilizing objects which are undefined within the DLL.&amp;nbsp;&amp;nbsp;The ATEasyClassMethod() function will take 4 variants as parameters and then check to see if each variant has been defined before calling &lt;b&gt;Autowrap()&lt;/b&gt; (you can define it with more optional parameter in ATEasy if you use more than 4 arguments). It is assumed that if a variant is undefined within ATEasy, it will be passed to the DLL with the variant type VT_ERROR.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;//PURPOSE: Executes the specified object pATEasyObject's method sMethod.&amp;nbsp;&amp;nbsp;This method supports 0 to 4 parameters.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;void WINAPI ATEasyClassMethod(IDispatch *pATEasyObject, LPOLESTR sMethod, VARIANT vtParam1, VARIANT vtParam2, VARIANT vtParam3, VARIANT vtParam4)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (vtParam1.vt==VT_ERROR &amp;&amp; vtParam1.lVal==VT_ERROR_ARGMISSING)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp; AutoWrap(DISPATCH_METHOD, NULL, pATEasyObject, sMethod, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (vtParam2.vt==VT_ERROR &amp;&amp; vtParam2.lVal==VT_ERROR_ARGMISSING)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp; AutoWrap(DISPATCH_METHOD, NULL, pATEasyObject, sMethod, 1, vtParam1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (vtParam3.vt==VT_ERROR &amp;&amp; vtParam3.lVal==VT_ERROR_ARGMISSING)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp; AutoWrap(DISPATCH_METHOD, NULL, pATEasyObject, sMethod, 2, vtParam2, vtParam1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (vtParam4.vt==VT_ERROR &amp;&amp; vtParam4.lVal==VT_ERROR_ARGMISSING)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp; AutoWrap(DISPATCH_METHOD, NULL, pATEasyObject, sMethod, 3, vtParam3, vtParam2, vtParam1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; AutoWrap(DISPATCH_METHOD, NULL, pATEasyObject, sMethod, 4, vtParam4, vtParam3, vtParam2, vtParam1);&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The specific error type with be "ArgMissing" which is defined as 0x80020004.&amp;nbsp;&amp;nbsp;In the header, this can be declared as follows:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;#define VT_ERROR_ARGMISSING&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x80020004&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Testing the DLL with ATEasy - C++&lt;/h3&gt;Now that the DLL has been created, we can create an ATEasy application to test it.&lt;br /&gt;&lt;br /&gt;The first step is to define the DLL in ATEasy.&amp;nbsp;&amp;nbsp;The ATEasy Internal Class should be passed as a &lt;b&gt;Val Object&lt;/b&gt;.&amp;nbsp;&amp;nbsp;The property or method specifier should be a &lt;b&gt;Val BString&lt;/b&gt; and the parameter data should &lt;b&gt;Val or Var Variant&lt;/b&gt;, depending on whether you are sending or retrieve data.&amp;nbsp;&amp;nbsp;I started by creating a new library within my program module called &lt;b&gt;IDispatchExample &lt;/b&gt;and defining the DLL procedures as such:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure ATEasyClassMethod(pATEasyObject, sMethod, vtParam1, vtParam2, vtParam3, vtParam4): Void&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp; pATEasyObject: Val Object&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Specifies the ATEasy Object to access&lt;br /&gt;&amp;nbsp;&amp;nbsp; sMethod: Val BString&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Specifies the method to call&lt;br /&gt;&amp;nbsp;&amp;nbsp; vtParam1: [Val] Variant = VarEmpty	! Optional parameter 1&lt;br /&gt;&amp;nbsp;&amp;nbsp; vtParam2: [Val] Variant = VarEmpty	! Optional parameter 2&lt;br /&gt;&amp;nbsp;&amp;nbsp; vtParam3: [Val] Variant = VarEmpty	! Optional parameter 3&lt;br /&gt;&amp;nbsp;&amp;nbsp; vtParam4: [Val] Variant = VarEmpty	! Optional parameter 4&lt;br /&gt;&lt;br /&gt;Procedure ATEasyClassGet(pATEasyObject, sProperty, pvtParam): Void&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp; pATEasyObject: Val Object&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Specifies the ATEasy Object to access&lt;br /&gt;&amp;nbsp;&amp;nbsp; sProperty: Val BString&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Specifies the property to get the value of&lt;br /&gt;&amp;nbsp;&amp;nbsp; pvtParam: Var Variant&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!The returned value&lt;br /&gt;&lt;br /&gt;Procedure ATEasyClassSet(pATEasyObject, sProperty, vtParam): Void&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp; pATEasyObject: Val Object&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Specifies the ATEasy Object to access&lt;br /&gt;&amp;nbsp;&amp;nbsp; sProperty: Val BString&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Specifies the property to set the value of&lt;br /&gt;&amp;nbsp;&amp;nbsp; vtParam: Val Variant&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !The value to be set&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For the &lt;b&gt;ATEasyClassSet &lt;/b&gt;test, the &lt;b&gt;TestResult &lt;/b&gt;is intentionally set 	outside the Min/Max bounds.&amp;nbsp;&amp;nbsp;The &lt;b&gt;ATEasyClassSet &lt;/b&gt;procedure is used to set the Min/Max bounds to 40 and 50.&amp;nbsp;&amp;nbsp;We expect this test to PASS if the &lt;b&gt;ATEasyClassSet &lt;/b&gt;procedure is working.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Test 1.1 : "Modified Test Properties"&amp;nbsp;&amp;nbsp; ! ATEasyClassSet Test&lt;br /&gt;-------------------------------------------------------------&lt;br /&gt;Type = MinMax&lt;br /&gt;Min = 5&lt;br /&gt;Max = 5&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; TestResult=42&lt;br /&gt;&amp;nbsp;&amp;nbsp; IDispatchExample.ATEasyClassSet(Test, "Max", 50)&lt;br /&gt;&amp;nbsp;&amp;nbsp; IDispatchExample.ATEasyClassSet(Test, "Min", 40)&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For the ATEasyClassMethod test, the TestResult is set to 42 and the Min/Max bounds have been set to 40 and 50.&amp;nbsp;&amp;nbsp;Within the test Test.Min and Test.Max have been used to set the Min and Max bounds to 5 and 10.&amp;nbsp;&amp;nbsp;The procedure ATEasyClassMethod is used to call the Test Object's Reset method. This should return the Max/Min bounds to 40 and 50 and will cause this test to PASS.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Test 1.2 : "Reset Method Called"&amp;nbsp;&amp;nbsp; ! ATEasyClassMethod Test&lt;br /&gt;-------------------------------------------------------&lt;br /&gt;Type = MinMax&lt;br /&gt;Min = 40&lt;br /&gt;Max = 50&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; TestResult=42&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; !Manually set the Test properties&lt;br /&gt;&amp;nbsp;&amp;nbsp; Test.Max=5&lt;br /&gt;&amp;nbsp;&amp;nbsp; Test.Min=10&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; !Call reset method from DLL, returning Test Properties to design-time default&lt;br /&gt;&amp;nbsp;&amp;nbsp; IDispatchExample.ATEasyClassMethod(Test, "Reset")&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The third test simply demonstrates the use of &lt;b&gt;ATEasyClassMethod &lt;/b&gt;when a parameter has been provided.&amp;nbsp;&amp;nbsp;In this implementation, up to four parameters can be included with a method call.&amp;nbsp;&amp;nbsp;If this is working correctly, you should see the message "I am working!" appended to the end of this test.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Test 1.3 : "Log Append Called"&amp;nbsp;&amp;nbsp;!ATEasyClassMethod w/ Param Test&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;Type = Other&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; IDispatchExample.ATEasyClassMethod(Log, "Append", "\r\n///////////////////\r\n")&lt;br /&gt;&amp;nbsp;&amp;nbsp; IDispatchExample.ATEasyClassMethod(Log, "Append", "// I am working! //\r\n")&lt;br /&gt;&amp;nbsp;&amp;nbsp; IDispatchExample.ATEasyClassMethod(Log, "Append", "///////////////////\r\n")&lt;br /&gt;&amp;nbsp;&amp;nbsp; TestStatus=PASS&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The fourth and final test retrieves the file location of the &lt;b&gt;Log &lt;/b&gt;object natively and also uses &lt;b&gt;ATEasyClassGet &lt;/b&gt;to retrieve the Log's FullName property externally.&amp;nbsp;&amp;nbsp;The two values are compared and, if they match, the test will &lt;b&gt;PASS&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Test 1.4 : "Get Log Properties" !ATEasyClassGet Test&lt;br /&gt;----------------------------------------------------&lt;br /&gt;Type = String&lt;br /&gt;String = ""&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; !Retrieve the application's file and path natively&lt;br /&gt;&amp;nbsp;&amp;nbsp; Test.String=Log.FullName&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp; !Retrieve the application's file and path using IDispatch&lt;br /&gt;&amp;nbsp;&amp;nbsp; IDispatchExample.ATEasyClassGet(Log, "FullName", varTest)&lt;br /&gt;&amp;nbsp;&amp;nbsp; TestResult=varTest&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Example 2: Creating The DLL - C#&lt;/h3&gt;The DLL we are creating within Visual Studio will contain three exported functions:&lt;ul&gt;&lt;li&gt;&lt;b&gt;ATEasyTestSetMinMax()&lt;/b&gt; : Set the min and max properties of the referenced object.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ATEasyTaskGetTestCount()&lt;/b&gt; : Get the value of the TestsCount property of the referenced object.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ATEasyLogClear()&lt;/b&gt; : Call the Clear() method of the referenced object.&lt;/li&gt;&lt;/ul&gt;The project created is a Console Application (.NET 3.5 framework) that will be compiled to DLL.&amp;nbsp;&amp;nbsp;The project code was created in &lt;b&gt;Microsoft Visual Studio 2008&lt;/b&gt; and entitled ATEasyNetInterface.&amp;nbsp;&amp;nbsp;Make sure that you set the output of this project to Class Library.&amp;nbsp;&amp;nbsp;Change the default Class Name to Interface.&amp;nbsp;&amp;nbsp;Finally, add references to "C:\Windows\System32\AteRt.dll" and "C:\Windows\System32\AteCtl.dll".&amp;nbsp;&amp;nbsp;The project is provided at the bottom of this article.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ATEasyTestSetMinMax(): Sets a ATEasy test object's min and max properties&lt;/b&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;//PURPOSE: Sets the specified values iMin and iMax to the specified ATest object pExtObject&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;public void ATEasyTestSetMinMax(ref Object pExtObject, int iMin, int iMax)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; AteRtLib.ATest ATEasyObject = (AteRtLib.ATest)pExtObject;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ATEasyObject.Min = iMin;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ATEasyObject.Max = iMax;&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ATEasyTaskGetTestCount(): Getting an object's property&lt;/b&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;//PURPOSE: Gets the value of the TestsCount property from the specified ATask object pExtObject and returns it in the reference parameter iTestCount.&lt;br /&gt;&lt;br /&gt;public void ATEasyTaskGetTestCount(ref Object pExtObject, ref int iTestCount)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AteRtLib.ATask ATEasyObject = (AteRtLib.ATask)pExtObject;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iTestCount = ATEasyObject.TestsCount;&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ATEasyLogClear(): Clear the log of the specified ALog file&lt;/b&gt;&lt;br /&gt;The &lt;b&gt;Clear()&lt;/b&gt; method that is being demonstrated does not require any parameters be passed in.&amp;nbsp;&amp;nbsp;When creating a method which requires one or more parameters, they will have to be passed in or hard-coded within this class.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;//PURPOSE: Executes the specified ALog object pExtObject's Clear() method.&lt;br /&gt;&lt;br /&gt;public void ATEasyLogClear(ref Object pExtObject)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AteCtlLib.ALog ATEasyObject = (AteCtlLib.ALog)pExtObject;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ATEasyObject.Clear();&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Testing the DLL with ATEasy - C#&lt;/h3&gt;Now that the DLL has been created, we can create an ATEasy application to test it.&lt;br /&gt;&lt;br /&gt;After creating the ATEasy Test Application, insert the .NET assembly that we just created (ATEasyNetInterface.dll) into the Program module.&amp;nbsp;&amp;nbsp;Also, include the mscorlib assembly.&amp;nbsp;&amp;nbsp;Then create these variables:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;obNetInterface: ATEasyNetInterface.Interface&lt;br /&gt;vExtObj: Variant&lt;br /&gt;obNetObj: mscorlib.NetObject&lt;br /&gt;lTestCount: Long&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For the first test, the Log clear() method is called, which causing the application and program header to be erased from the Test Log.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Test 1.1 : "Call Method"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;Id = Call_Method&lt;br /&gt;&amp;nbsp;&amp;nbsp;Type = MinMax&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; !Create instance of .NET class &lt;br /&gt;&amp;nbsp;&amp;nbsp; obNetInterface=new ATEasyNetInterface.Interface() &lt;br /&gt;&amp;nbsp;&amp;nbsp; !Load Test object into variant &lt;br /&gt;&amp;nbsp;&amp;nbsp; vExtObj=Log &lt;br /&gt;&amp;nbsp;&amp;nbsp; !Load Test object variant into mscorlib.NetObject &lt;br /&gt;&amp;nbsp;&amp;nbsp; obNetObj=vExtObj &lt;br /&gt;&amp;nbsp;&amp;nbsp; !Send Test object to .Net DLL along with new properties &lt;br /&gt;&amp;nbsp;&amp;nbsp; obNetInterface.ATEasyLogClear(obNetObj)&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For the second test, the &lt;b&gt;TestResult &lt;/b&gt;is set to 42 and the Min/Max bounds have been set to 0 and 10.&amp;nbsp;&amp;nbsp;The call to &lt;b&gt;ATEasyTestSetMinMax &lt;/b&gt;will return the Max/Min bounds to 40 and 50 and will cause this test to &lt;b&gt;PASS&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Test 1.2 : "Set Properties"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;Id = Set_Properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;Type = MinMax&lt;br /&gt;&amp;nbsp;&amp;nbsp;Min = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;Max = 10&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; !Set TestResult outside of the bound of the test so the test will fail if the Min/Max aren't changed &lt;br /&gt;&amp;nbsp;&amp;nbsp; TestResult=42 &lt;br /&gt;&amp;nbsp;&amp;nbsp; !Create instance of .NET class &lt;br /&gt;&amp;nbsp;&amp;nbsp; obNetInterface=new ATEasyNetInterface.Interface() &lt;br /&gt;&amp;nbsp;&amp;nbsp; !Load Test object into variant &lt;br /&gt;&amp;nbsp;&amp;nbsp; vExtObj=Test &lt;br /&gt;&amp;nbsp;&amp;nbsp; !Load Test object variant into mscorlib.NetObject &lt;br /&gt;&amp;nbsp;&amp;nbsp; obNetObj=vExtObj &lt;br /&gt;&amp;nbsp;&amp;nbsp; !Send Test object to .Net DLL along with new properties &lt;br /&gt;&amp;nbsp;&amp;nbsp; obNetInterface.ATEasyTestSetMinMax(obNetObj, 40, 45)&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The third test demonstrates the use of &lt;b&gt;ATEasyTaskGetTestCount &lt;/b&gt;to retrieve a property of an ATEasy object.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Test 1.3 : "Get Property"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;Id = Get_Property&lt;br /&gt;&amp;nbsp;&amp;nbsp;Type = Precise&lt;br /&gt;&amp;nbsp;&amp;nbsp;Value = 3&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; !Create instance of .NET class &lt;br /&gt;&amp;nbsp;&amp;nbsp; obNetInterface=new ATEasyNetInterface.Interface() &lt;br /&gt;&amp;nbsp;&amp;nbsp; !Load Test object into variant &lt;br /&gt;&amp;nbsp;&amp;nbsp; vExtObj=Task &lt;br /&gt;&amp;nbsp;&amp;nbsp; !Load Test object variant into mscorlib.NetObject &lt;br /&gt;&amp;nbsp;&amp;nbsp; obNetObj=vExtObj &lt;br /&gt;&amp;nbsp;&amp;nbsp; !Send Test object to .Net DLL along with new properties &lt;br /&gt;&amp;nbsp;&amp;nbsp; obNetInterface.ATEasyTaskGetTestCount(obNetObj, lTestCount) &lt;br /&gt;&amp;nbsp;&amp;nbsp; TestResult=lTestCount&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Applications&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Integration of ATEasy and a scripting language.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Passing ATEasy objects out to be parsed externally.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Downloads&lt;/h3&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200215\CPPATEasyInterface.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;VS2005 C++ Project&lt;/a&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200215\CPPATEasyTest.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;ATEasy Test Workspace for C++ DLL&lt;/a&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200215\NetATEasyInterface.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;VS2010 C# Project&lt;/a&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200215\NetATEasyTest.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;ATEasy Test Workspace for C# Assembly&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200215/Accessing-ATEasy-Internal-Classes-from-other-programming-languages</link><pubDate>9/10/2021</pubDate></item><item><title>How to Modify ATEasy HTML Test Log Tests Table - Published on 9/8/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;&lt;br /&gt;This article is a step by step walk-through on how to change TestExec's HTML output log using &lt;b&gt;FormatLogString()&lt;/b&gt; and &lt;b&gt;GetLogString()&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;In this example, a new column for a time stamp will be added for the MinMax and Other test types.&lt;br /&gt;&lt;br /&gt;It is recommended to only make modifications to the &lt;b&gt;System Module&lt;/b&gt; (as shown in this example) or to create another driver.&lt;br /&gt;&lt;br /&gt;It is not recommended to modify the TestExec driver, that way you can update ATEasy to new versions without worrying about losing your changes or re-merging your work.&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Using FormatLogString to Change the Format of a Test Type&lt;/h3&gt;&lt;b&gt;1.&lt;/b&gt; Insert the &lt;b&gt;TestExec&lt;/b&gt; driver to your project. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200305\1.PNG" alt="Insert TestExec to your project." title="Insert TestExec to your project." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1: Insert TestExec to your project.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt; In the &lt;b&gt;System.OnEndTest()&lt;/b&gt; event use the &lt;b&gt;GetLongString()&lt;/b&gt; procedure to find the original header and test strings.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200305\1-2.PNG" alt="GetLogString() in System.OnEndTest." title="GetLogString() in System.OnEndTest." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2: GetLogString() in System.OnEndTest.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The HTML strings for the header and tests are traced to the &lt;b&gt;Debug Log&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200305\2.PNG" alt="The header string." title="The header string." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3: The header string for Min/Max tests.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200305\3.PNG" alt="The test string." title="The test string." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4: A test string for a Min/Max test.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt; Both strings need to be modified to add a new column for the time stamp. In this example the new column was added to the front and named "Time". After the time-stamp column was added, the strings were assigned to variables &lt;b&gt;sHeader&lt;/b&gt; and &lt;b&gt;sTest&lt;/b&gt; in the &lt;b&gt;System.OnInitTest() event&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200305\4.png" alt="The modified strings assigned to sHeader and sTest." title="The modified strings assigned to sHeader and sTest." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5: The modified strings assigned to sHeader and sTest.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;b&gt;Note:&lt;/b&gt; &lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt; In this example the strings were separated into different lines for readability. Leaving the string as one line is also valid.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Put a backslash before each of the inner quotations to use quotation marks inside of a string declaration. Ie: &lt;b&gt;sString="Bob said "hello" to Joe."&lt;/b&gt; becomes &lt;b&gt;sString="Bob said \"hello\" to Joe."&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; In sTest, the procedure &lt;b&gt;STime()&lt;/b&gt; is used to get the current time.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; In sTest, FONT COLOR was removed from the &lt;b&gt;Status&lt;/b&gt; field because ATEasy will add the color automatically when the test status is evaluated.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; The data in the &lt;b&gt;sTest&lt;/b&gt; string need to be replaced by the appropriate &lt;b&gt;field parameters&lt;/b&gt;. For more information on the field parameters, use the ATEasy Help (F1) and search for "FormatLogString" in the Index tab.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;/div&gt;	&lt;br /&gt;&lt;b&gt;4.&lt;/b&gt; In the &lt;b&gt;System.OnInitTest()&lt;/b&gt; event use the &lt;b&gt;FormatLogString()&lt;/b&gt; procedure to change the format of &lt;b&gt;Min/Max tests&lt;/b&gt;. Be sure to use &lt;b&gt;"atestTypeMinMax"&lt;/b&gt; as the input for the &lt;b&gt;enTestType&lt;/b&gt; parameter to specify the Min/Max test. &lt;br /&gt;&lt;br /&gt;The &lt;b&gt;System.OnInitTest()&lt;/b&gt; event should look like &lt;b&gt;Figure 6&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200305\5.png" alt="FormatLogString in System.OnInitTest()." title="FormatLogString in System.OnInitTest()." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6: FormatLogString in System.OnInitTest().&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5.&lt;/b&gt; Run the project in TestExec to see the new format for Min/Max tests.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200305\7.png" alt="TestExec with time stamps added to Min/Max tests." title="TestExec with time stamps added to Min/Max tests." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 8: TestExec with time stamps added to Min/Max tests.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Polish Before Moving On&lt;/h3&gt;&lt;b&gt;6.&lt;/b&gt; Notice an issue with the test log; the Min/Max tests are repeating the header for every consecutive Min/Max test. This occurs because TestExec prints the header if a new header format is applied. We can accommodate this behavior by only applying the modified test header &lt;b&gt;once per task&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;To start we need to add a couple of variables. Since we have been making our time-stamp changes to the &lt;b&gt;System Module&lt;/b&gt;, we will place these new variables into the &lt;b&gt;System Module's Variables&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Variables&lt;br /&gt;================================================================================&lt;br /&gt;	lPreviousTaskNumber: Long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	! Keeps track of the most recent task number that was ran.&lt;br /&gt;	ucTestedTypesFlags: Byte		! Each bit keeps track on whether a test type's header had been applied.&lt;br /&gt;									! Bit / Test Type&lt;br /&gt;									! 0 / MinMax&lt;br /&gt;									! 1 / Other&lt;br /&gt;									! 2 / Ref2&lt;br /&gt;									! 3 / RefX&lt;br /&gt;									! 4 / Tolerance&lt;br /&gt;									! 5 / Precise&lt;br /&gt;									! 6 / String&lt;/div&gt;&lt;br /&gt;									&lt;br /&gt;Now we add some code to only apply the header once per task. To do this, our application first needs to &lt;b&gt;check if the current test's task number is different than the previous&lt;/b&gt;. If it is different, reset our &lt;b&gt;ucTestedTypesFlags&lt;/b&gt; variable.&lt;br /&gt;&lt;br /&gt;For each test type, we check the bit in the &lt;b&gt;ucTestedTypesFlags&lt;/b&gt; variable for each respective test type. If the new format had not been applied for this task yet, it will apply the new header and test log format at the same time (using &lt;b&gt;aFormatLogDefault&lt;/b&gt;). Then set the test type's bit in the &lt;b&gt;ucTestedTypesFlags&lt;/b&gt; variable to 1, signifying that we have applied the header for this test. Since we are currently working on the Min/Max test, the bit we want to check/raise will be bit 0 (we have decided this in the comments of the &lt;b&gt;ucTestedTypesFlags&lt;/b&gt; variable). If the test header was already applied in the current task (respective test type bit in ucTestedTypesFlags is 1), then we can exclude the header and only apply the new test string format (using &lt;b&gt;aFormatLogIgnoresHeaderParameter&lt;/b&gt;).&lt;br /&gt;&lt;br /&gt;Finally, we want to record the current task number to the variable &lt;b&gt;lPreviousTaskNumber&lt;/b&gt;. It will be used to compare with the next test's task number to determine if the flags variable &lt;b&gt;ucTestedTypesFlags&lt;/b&gt; needs to be reset. &lt;b&gt;Figure 7&lt;/b&gt; shows the final result of the System.OnInitTest() event.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200305\PolishMinMax.png" alt="Only apply header once per task." title="Only apply header once per task." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 7: Only apply header once per task.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Now when we run the program we see that the header is correctly shown once for consecutive Min/Max tests. &lt;b&gt;Figure 8&lt;/b&gt; shows the test log after adding a time-stamp to Min/Max tests.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200305\FixedMinMaxLog.png" alt="TestExec log with time-stamps for MinMax tests." title="TestExec log with time-stamps for MinMax tests." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 8: TestExec log with time-stamps for MinMax tests.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Repeat to Modify the Format of Another Test Type&lt;/h3&gt;&lt;b&gt;7.&lt;/b&gt; Steps 2 through 6 can be repeated for another test type. Figure 9 below shows what the &lt;b&gt;System.OnInitTest()&lt;/b&gt; event looks like after repeating steps 2 through 6 for the &lt;b&gt;"Other"&lt;/b&gt; test type. Use &lt;b&gt;"atestTypeOther"&lt;/b&gt; for the enTestType parameter in FormatLogString to specify the changes are for the test type &lt;b&gt;"Other"&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200305\8.PNG" alt="System.OnInitTest() event with Other test type modified." title="System.OnInitTest() event with Other test type modified." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 9: System.OnInitTest() event with Other test type modified.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Tests of type &lt;b&gt;Min/Max&lt;/b&gt; and &lt;b&gt;Other&lt;/b&gt; now have a time stamp column.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200305\9.PNG" alt="Tests of type Min/Max and Other have a time stamp column added." title="Tests of type Min/Max and Other have a time stamp column added." border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 10: Tests of type Min/Max and Other have a time stamp column added.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Download&lt;/h3&gt; &lt;b&gt;The project included below was completed to add the time-stamp column for all test types (MinMax, Other, Precise, Ref2, RefX, String, and Tolerance).&lt;/b&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase/Q200305/AddTimeStamp.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Click here to download the example project used in this article as a .ZIP.&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200305/How-to-Modify-ATEasy-HTML-Test-Log-Tests-Table</link><pubDate>9/8/2021</pubDate></item><item><title>White Paper: Target Simulators for Modern Munitions - Published on 9/8/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;Precision guided weapons with optical guidance systems have become the munition of choice for advanced militaries throughout the world in the past few decades and to ensure these weapons are mission ready, a variety of field test sets and target simulators have been deployed.&lt;br /&gt;&lt;br /&gt;However, many of these test sets are now obsolete, not supportable, or extremely expensive to keep in service. &lt;br /&gt;&lt;br /&gt;This white paper addresses the requirement for new test solutions that can replace these legacy test sets and target simulators as well as offering test commonality for supporting a wide range of weapon systems.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2016\MTS-916whitepaper.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download white paper&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;[:+[+MTS-916+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description><link>https://www.MarvinTest.com/KB/Q200284/White-Paper-Target-Simulators-for-Modern-Munitions</link><pubDate>9/8/2021</pubDate></item><item><title>White Paper: Flightline Testing of Laser-Guided Munitions - Published on 9/8/2021</title><description>Read the white paper, "Flightline Testing of Laser Guided Munitions," to learn more about the key features of the &lt;b&gt;&lt;a href='https://www.marvintest.com/Product/MT1888' target='_blank'&gt;MT1888 Series&lt;/a&gt;&lt;/b&gt; including:&lt;br /&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200264/1888WP.JPG" alt="MT1888" title="MT1888" border='0' &gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Lightweight, handheld design suitable for flightline, backshop, and depot testing&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Eye-safe operation, no protective goggles required&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Simulated returns from "laser painted" targets&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Support of all U.S. laser-guided weapons&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;LCD screen and membrane switches select PRF and PIM laser code selection (MT1888A and MT1888A+)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Remote control option (MT1888A+)&lt;/li&gt;&lt;/ul&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2014\MT1888.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download white paper&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description><link>https://www.MarvinTest.com/KB/Q200264/White-Paper-Flightline-Testing-of-Laser-Guided-Munitions</link><pubDate>9/8/2021</pubDate></item><item><title>Customizing  the ATEasy Test Executive to Add Context Menus to Test Nodes - Published on 9/8/2021</title><description>In the Test Executive ATEasy driver, the &lt;b&gt;formTestExec &lt;/b&gt;creates the test tree view and the test nodes dynamically by reading data from the Program module (or Profile).&amp;nbsp;&amp;nbsp;The precise location of the node creation is with the driver procedure &lt;b&gt;FillProgramTree()&lt;/b&gt;.&amp;nbsp;&amp;nbsp;To add a context menu to allow right-click operation of a node, we will need to create an &lt;b&gt;AMenu &lt;/b&gt;of type Popup at design-time and display it at run-time.&amp;nbsp;&amp;nbsp;In addition, each item in the &lt;b&gt;AMenu &lt;/b&gt;will need to have an associated event procedure attached, which can be accomplished using a generic function call and the currently selected node.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200257\TreeView_TestNode.png" alt="ATEasy Test Executive Tree View Pane" title="ATEasy Test Executive Tree View Pane" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This project involves modifying the Test Executive driver which may be shared between multiple projects.&amp;nbsp;&amp;nbsp;Because of this, it may be prudent to make a backup copy of the TestExec.drv before proceeding.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Create a new popup menu at design-time&lt;/h3&gt;TestExec.drv includes several forms including the main Test Executive GUI class named &lt;b&gt;formTestExec&lt;/b&gt;.&amp;nbsp;&amp;nbsp;This form already includes a populated menu bar, &lt;b&gt;mnuTestExec&lt;/b&gt;, but we will be adding our own secondary menu which will be invisible until it is needed.&amp;nbsp;&amp;nbsp;To create the new pop-up menu:&lt;br /&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;ul&gt;&lt;li&gt;Click on the AMenu Control icon from the Controls Toolbox.&amp;nbsp;&amp;nbsp;Click and drag anywhere within your &lt;b&gt;formTestExec &lt;/b&gt;to add a new menu to the form.&amp;nbsp;&amp;nbsp;Rename this menu of Type bar to &lt;b&gt;mnuContext&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click on the &lt;b&gt;&lt;New Item&gt;&lt;/b&gt; entry and open the properties editor.&amp;nbsp;&amp;nbsp;By default, this entry is type Bar which means it will appear as a bar near the top of the form.&amp;nbsp;&amp;nbsp;Change the type to Popup, which means it will contain other menu items.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;In the Properties window change the &lt;b&gt;Name &lt;/b&gt;of the selected object to &lt;b&gt;mnuPopup&lt;/b&gt;, change the &lt;b&gt;Caption &lt;/b&gt;to &lt;b&gt;My Popup&lt;/b&gt;, and uncheck the &lt;b&gt;Visible &lt;/b&gt;property.&amp;nbsp;&amp;nbsp;This will allow us to hide the menu when it is not in use.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select the &lt;b&gt;&lt;New Item&gt;&lt;/b&gt; menu that is contained within our mnuPopup and open the properties editor.&amp;nbsp;&amp;nbsp;By default, this menu is type Item which means it is a menu item intended to execute some function.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;In the Properties window change the &lt;b&gt;Name &lt;/b&gt;of the selected object to &lt;b&gt;mnuHighlight&lt;/b&gt;, and change the &lt;b&gt;Caption &lt;/b&gt;to &lt;b&gt;Highlight Node&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Next, add the code that will perform the highlight operation:&lt;ul&gt;&lt;li&gt;Double-click the Highlight Node menu item.&amp;nbsp;&amp;nbsp;This should take open mnuHighlight’s OnClick() function. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Add the following code:&lt;/li&gt;&lt;/ul&gt;&lt;div class='fixedFont'&gt;f_node.BackColor=aclrYellow&lt;/div&gt;&lt;br /&gt;The variable f_node does not exist yet, so create the form variable as follows:&lt;br /&gt;&lt;div class='fixedFont'&gt;f_node : MSComctlLib.Node&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Display the popup menu when a user right-clicks a node&lt;/h3&gt;First, we will create an event to fire when the nodes are right-clicked.&amp;nbsp;&amp;nbsp;Since the Test Executive already makes use of a custom mouse-click event, we will add our code to that event.&amp;nbsp;&amp;nbsp;Go to the &lt;b&gt;formTestExec&lt;/b&gt;’s procedures list and select &lt;b&gt;OnTreeViewMouseUp()&lt;/b&gt;.&amp;nbsp;&amp;nbsp;This event fires each time a mouse button is released over the tree view.&amp;nbsp;&amp;nbsp;Add the following lines to the beginning of the procedure:&lt;br /&gt;! If the user executed a right-click&lt;br /&gt;&lt;div class='fixedFont'&gt;If Button=aMouseButtonRight&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Add the toolbar offset to the y-location of the popup&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y=y+tbr.Height&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Display the context menu&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Form.PopupMenu(mnuPopup, aformPopupMenuRightButton, x, y)&lt;br /&gt;EndIf&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Leave the rest of the code in &lt;b&gt;OnTreeViewMouseUp()&lt;/b&gt; alone.&lt;br /&gt;Run the project and try right-clicking the nodes.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200257\Completed_Project1.png" alt="ATEasy Test Executive with Context Menu" title="ATEasy Test Executive with Context Menu" border='0' &gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;Download the modified TestExec &lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/Q200257\TestExec_Context.drv' target='_blank'&gt;here&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200257/Customizing-the-ATEasy-Test-Executive-to-Add-Context-Menus-to-Test-Nodes</link><pubDate>9/8/2021</pubDate></item><item><title>Logging ATEasy Test Results to a CSV file, Excel worksheet, or a Database - Published on 9/8/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;This article demonstrates, through a programming example, a method for the automatic logging of test results to a records based&amp;nbsp;&amp;nbsp;format.&amp;nbsp;&amp;nbsp;The techniques presented in this article can be adapted to work with any data storage mechanism.&amp;nbsp;&amp;nbsp;Specifically, the example creates, opens and appends test results to a local CSV file, an ADODB based database, an Excel file, or some combination of the preceding.&lt;br /&gt;&lt;br /&gt;The code presented in this example resides in the AUTOLOG driver that is included with this article below. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Algorithm&lt;/h3&gt;The process for automatic test logging is as follows:&lt;ul&gt;&lt;li&gt;Create the log file&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Log the test results as they are accumulated&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Finalize the log file&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;h3&gt;Create the log file&lt;/h3&gt;To ensure that a new record is created each time we run the test program, a new external log file is created in the &lt;b&gt;OnInitProgram()&lt;/b&gt; event.&amp;nbsp;&amp;nbsp;In the example, we use three functions within &lt;b&gt;OnInitProgram()&lt;/b&gt; to create three different logs: &lt;b&gt;CreateNewCsvFile()&lt;/b&gt;, &lt;b&gt;CreateNewExcelFile()&lt;/b&gt;, and &lt;b&gt;CreateNewDBTable()&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;The purpose of creating the log before the tests are run is to both ensure that we are going to be able to save to the target location and to allow ourselves an opportunity to record any header data before the test data begins accumulating.&lt;br /&gt;&lt;br /&gt;In the case of logging to a text file, a file needs to be created (storing the file handle in a global variable) and header information including the serial number, start time, program name is recorded.&amp;nbsp;&amp;nbsp;The log file will remain open for the duration of the program execution; we can append test results to the file using the file handle created.&amp;nbsp;&amp;nbsp;CSV is an example of a text file and &lt;b&gt;CreateNewCsvFile()&lt;/b&gt; demonstrates this method behavior:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;m_hCsv=FileCreate(sFilename)&lt;br /&gt;FileWrite(m_hCsv, "Test Id,Test Name,Pin,Unit,Min,Result,Max,Status",,"\r\n")&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Accumulating results&lt;/h3&gt;By the time the &lt;b&gt;OnEndTest()&lt;/b&gt; event is called, the Test object will be updated with the latest test results.&amp;nbsp;&amp;nbsp;This is an ideal place to record the latest test results to the log file.&amp;nbsp;&amp;nbsp;In our example, we use three functions within &lt;b&gt;OnEndTest()&lt;/b&gt; to append to the logs: &lt;b&gt;AppendCsvResults()&lt;/b&gt;, &lt;b&gt;AppendExcelResults()&lt;/b&gt;, &lt;b&gt;AppendDBResults()&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;In the case of appending to a compliant ADODB, the record needs to be accessed and then a new record can be created and filled out.&amp;nbsp;&amp;nbsp;AppendDBResults demonstrates this method:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;obRecordSet.Open("SELECT * FROM TestsResults", sConnection, ,adOpenDynamic)&lt;br /&gt;obRecordSet.AddNew()&lt;br /&gt;&lt;br /&gt;obRecordSet.Fields.Item("TestId").Value=Test.Id&lt;br /&gt;...&lt;br /&gt;obRecordSet.Fields.Item("Result").Value=Test.Resul&lt;br /&gt;...&lt;br /&gt;obRecordSet.Update()&lt;br /&gt;t&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Or Using EXCEL driver (AppendExcelResults()) :&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;EXCEL Set Value(m_xlWorkbook,,"A"+sCurrentExcelRow, Test.Id)&lt;br /&gt;...&lt;br /&gt;EXCEL Set Value(m_xlWorkbook,,"F"+sCurrentExcelRow, Test.Result)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Closing the log file&lt;/h3&gt;Depending of the record type that you are utilizing, you may need to perform some sort of termination procedure such as writing footers, closing file handles, and releasing objects that were instantiated during the creation phase of the algorithm.&amp;nbsp;&amp;nbsp;This is the complement to the Create- type procedures so it is appropriate to put it in to the OnEndProgram() event.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Using the Example&lt;/h3&gt;This example workspace attached to this article uses The AUTOLOG Driver Shortcut properties to enable/disable the logging.&amp;nbsp;&amp;nbsp;If the Driver Shortcut properties are empty, no automatic logging will be performed.&amp;nbsp;&amp;nbsp;By default, the properties should be entered as followed: If you like to use the logging in your application, include the AUTOLOG.drv in your project System.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;DatabaseConn = &lt;b&gt;"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\MyLog"&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ExcelFile = &lt;b&gt;"C:\MyLog"&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;CsvFile = &lt;b&gt;"C:\\MyLog"&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;Using these properties will create three files in the C:\ root directory: MyLog.mdb, MyLog.xls and MyLog.csv.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200248\XLS_Results.JPG" alt="The XLS created by the Autologger driver" title="The XLS created by the Autologger driver" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 1. Microsoft Execl XLS File Output&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200248\MDB_Results.JPG" alt="The MDB created by the Autologger driver" title="The MDB created by the Autologger driver" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 2. Microsoft Access MDB Database File Output&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Where to Go From Here&lt;/h3&gt;This example only allows you to log results from Min/Max test types.&amp;nbsp;&amp;nbsp;If the ability to update the properties of another test type were needed, the code in the various Create- and Append- procedures would need to be updated.&lt;br /&gt; &lt;br /&gt;Download the &lt;b&gt;AutoLogger &lt;/b&gt;Example Files:&amp;nbsp;&amp;nbsp;&lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/Q200248\AutoLogger.zip' target='_blank'&gt;Click Here&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200248/Logging-ATEasy-Test-Results-to-a-CSV-file-Excel-worksheet-or-a-Database</link><pubDate>9/8/2021</pubDate></item><item><title>Semiconductor Continuity Test Using the GX5295 Digital IO w/ PMU - Published on 9/5/2021</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;Prior to testing the functionality of a semiconductor device, it is often a requirement to verify the structural integrity of the device including connections from the tester to the device. DC Parametric Measurement Units (PMU's) which are used to perform dc characterization tests on a device by forcing a voltage and measuring a current, and by forcing a current and measuring a voltage.&amp;nbsp;&amp;nbsp;This same PMU can be used to verify the integrity of connections between the UUT and tester. &lt;br /&gt;&lt;br /&gt;This article focuses on how the the per-pin PMU capabilities of the GX5295 can be used to perform continuity and shorts / opens tests on the device under test. The test programs are written in ATEasy, although any modern programming language could be used. All screen captures are of the ATEasy application.&amp;nbsp;&amp;nbsp;The tests described here can be conducted on a wide variety of devices, from semiconductor IC's to printed circuit boards, so the ATEasy application was written to allow easier migration to other devices.&lt;/td&gt;&lt;td&gt;[:+[+GX5295+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;h3&gt;Continuity Test&lt;/h3&gt;The first step in the test process, and the focus of this article, is to determine if the Device Under Test (DUT) is connected to the tester resources – in this case the GX5295 Digital IO (DIO).&amp;nbsp;&amp;nbsp;This test is called a “Continuity” test, and it verifies continuity between the tester and DUT by detecting the ESD diode found on IC pins.&amp;nbsp;&amp;nbsp;Tester-to-DUT continuity is measured by forcing a small current on to the DUT pins, and measuring for the presence or absence of a voltage.&amp;nbsp;&amp;nbsp;This utilizes the Force Current, Measure Voltage (FIMV) capability of the GX5295’s PMU.&amp;nbsp;&amp;nbsp;The ESD protection diode is a semiconductor device, and the voltage developed across it when a current flows is consistent with the voltage drop across a semiconductor junction.&amp;nbsp;&amp;nbsp;If the ESD diode is not present, or in the case of continuity tests, if the tester is not connected to the DUT pin, current will not flow through the ESD diode and the voltage will be inconsistent with semiconductor junction voltage drops.&amp;nbsp;&amp;nbsp;If the ESD diode is defective, then other voltage anomalies can be detected, such as “0” volts measured across an ESD diode in cases where the diode is shorted.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Pin Mapping&lt;/h3&gt;Before any test or measurement can be performed, you must define the system configuration.&amp;nbsp;&amp;nbsp;An ATEasy "Command" was created that allows the test programmer to define the number of DUT's (Device Under Test) installed in the test fixture, and their pin counts.&amp;nbsp;&amp;nbsp;For additional information about defining commands in ATEasy, refer to the ATEasy Help/Commands on-line documentation.&amp;nbsp;&amp;nbsp;It is assumed that all of the DUT's are of the same type device.&amp;nbsp;&amp;nbsp;The command specifys the number of DUT devices to test (nCount), and the number of pins per DUT (nPins), takes the form:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;Dut Define Counts(nCount, nPins)&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;&lt;br /&gt;In order to force currents and measure voltages on DUT pins, it is necessary to define in software the connections between the tester resources and the DUT IO.&amp;nbsp;&amp;nbsp;In this example, pin mapping is performed using another special command defined in ATEasy that will store the “Tester-Channel to DUT-Pin” correlation in a structured array.&amp;nbsp;&amp;nbsp;The pin-map structure also holds the DUT pin name and pin type (Output, Input, IO, Vcc1:4 and Ground) - which is useful for providing information about the pins being tested.&amp;nbsp;&amp;nbsp;When used, the “Dut Define PinMap” command specifies the DUT &lt;b&gt;pin_type&lt;/b&gt;, the DUT &lt;b&gt;pin_name&lt;/b&gt;, the DUT &lt;b&gt;pin_number&lt;/b&gt;, and an array containing the DIO channel numbers &lt;b&gt;channel_number&lt;/b&gt;.&amp;nbsp;&amp;nbsp;An array is used for the DIO channel numbers to support mapping pins from multiple DUT devices to appropriate DIO channels. &lt;/td&gt;&lt;td&gt;[:+[+dioeasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;The command takes the form:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;Dut Define PinMap pin_type ("pin_name", pin_number, channel_number[])&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;The sample device used is an SN74HC273 octal latch in a 20-pin TSSOP package.&amp;nbsp;&amp;nbsp;The commands for defining the number of DUT devices, the DUT pin count, and the DUT/DIO pin mapping are shown below.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt;&amp;nbsp;&amp;nbsp;The DIO channel array is defined in line with the pin mapping commands for clarity, but could be entered via oteher means, such as reading from a file or spreadsheet, or by entering the channel numbers from a dedicated GUI, to mention a few:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Dut Define Counts(1,20)&lt;br /&gt;&lt;br /&gt;Dut.DioChannels={0}&lt;br /&gt;Dut Define PinMap Input	 ("Clr-", 1, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={1}&lt;br /&gt;Dut Define PinMap Output ("Q1"&amp;nbsp;&amp;nbsp;, 2, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={2}&lt;br /&gt;Dut Define PinMap Input	 ("D1"&amp;nbsp;&amp;nbsp;, 3, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={7}&lt;br /&gt;Dut Define PinMap Input	 ("D2"&amp;nbsp;&amp;nbsp;, 4, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={4}&lt;br /&gt;Dut Define PinMap Output ("Q2"&amp;nbsp;&amp;nbsp;, 5, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={5}&lt;br /&gt;Dut Define PinMap Output ("Q3"&amp;nbsp;&amp;nbsp;, 6, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={6}&lt;br /&gt;Dut Define PinMap Input	 ("D3"&amp;nbsp;&amp;nbsp;, 7, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={3}&lt;br /&gt;Dut Define PinMap Input	 ("D4"&amp;nbsp;&amp;nbsp;, 8, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={8}&lt;br /&gt;Dut Define PinMap Output ("Q4"&amp;nbsp;&amp;nbsp;, 9, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={-1}&lt;br /&gt;Dut Define PinMap Ground ("Gnd" ,10, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={17}&lt;br /&gt;Dut Define PinMap Input&amp;nbsp;&amp;nbsp;("Clk+",11, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={15}&lt;br /&gt;Dut Define PinMap Output ("Q5"&amp;nbsp;&amp;nbsp;,12, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={10}&lt;br /&gt;Dut Define PinMap Input&amp;nbsp;&amp;nbsp;("D5"&amp;nbsp;&amp;nbsp;,13, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={13}&lt;br /&gt;Dut Define PinMap Input&amp;nbsp;&amp;nbsp;("D6"&amp;nbsp;&amp;nbsp;,14, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={12}&lt;br /&gt;Dut Define PinMap Output ("Q6"&amp;nbsp;&amp;nbsp;,15, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={11}&lt;br /&gt;Dut Define PinMap Output ("Q7"&amp;nbsp;&amp;nbsp;,16, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={14}&lt;br /&gt;Dut Define PinMap Input&amp;nbsp;&amp;nbsp;("D7"&amp;nbsp;&amp;nbsp;,17, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={9}&lt;br /&gt;Dut Define PinMap Input&amp;nbsp;&amp;nbsp;("D8"&amp;nbsp;&amp;nbsp;,18, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={16}&lt;br /&gt;Dut Define PinMap Output ("Q8"&amp;nbsp;&amp;nbsp;,19, Dut.DioChannels)&lt;br /&gt;Dut.DioChannels={1000}&lt;br /&gt;Dut Define PinMap Vcc1&amp;nbsp;&amp;nbsp; ("Vcc" ,20, Dut.DioChannels)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt;&amp;nbsp;&amp;nbsp;Two special pin mapping parameters need to be mentioned.&amp;nbsp;&amp;nbsp;First, the "-1" DIO channel specified for the DUT "Gnd" signal indicates that this DUT pin is not mapped to any DIO channel.&amp;nbsp;&amp;nbsp;In this case, this is due to the layout of the DUT load board, which connected the DUT Gnd pin to a ground plane, rather than a DIO channel.&amp;nbsp;&amp;nbsp;Second, specifying DIO channel "1000" for the DUT "+5V" Vcc pin means the Vcc pin is connected to one of the four auxilliary IO pins on the GX5295.&amp;nbsp;&amp;nbsp;These "Aux" channels are mapped to DIO channels starting at 1000.&amp;nbsp;&amp;nbsp;Specifying DIO channel 1000 as the DUT Vcc input means that the GX5295 AUX 0 channel will be supplying the Vcc voltage for the DUT.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;b&gt;Continuity Measurement&lt;/b&gt;&lt;/h3&gt;To test for continuity, another ATEasy command has been defined.&amp;nbsp;&amp;nbsp;This command accepts the DUT number and the DUT pin.&amp;nbsp;&amp;nbsp;The DUT pin is a type Variant and can accept the DUT name, as defined by the pin mapping command, the DUT pin number as a text parameter, or the DUT pin number as a numeric parameter.&amp;nbsp;&amp;nbsp;Two other parameters are passed by reference (pointer) and return the DUT pin number and DUT pin name associated with the DUT pin Variant.&amp;nbsp;&amp;nbsp;The command returns a type Double voltage measurement for the specified pin after a small negative current is first applied to the pin.&amp;nbsp;&amp;nbsp;The command takes the form:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;dMeasurement = Dut PMU Measure Continuity (nDutNumber, varDutPin, pnDutPin, psDutPin)&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;As an object oriented programming language, ATEasy allow a unique name for each test defined in it’s Task/Test structure (see ATEasy Help/Test).&amp;nbsp;&amp;nbsp;The test name is accessible as a text string at run-time using the "Test" object variable and the “Name” property, as shown below:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;string = Test.Name&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;This simplifies the overall test program to simply calling the Dut PMU Measure Continuity() command using Test.Name, and defining the Test.Name to be either the DUT pin name, or the DUT pin number.&amp;nbsp;&amp;nbsp;The example below measures continuity on the DUT pin defined by the test name, and using ATEasy’s internally defined TestResult variable to store the continuity measurement.&amp;nbsp;&amp;nbsp;The continuity measurements can all be invoked the same for each test:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;TestResult=Dut PMU Measure Continuity (1, Test.Name, pnDutPin, psDutPin)&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;An example of the ATEasy Task/Test structure is shown in &lt;b&gt;figure 1&lt;/b&gt; below.&amp;nbsp;&amp;nbsp;Notice that each test name is unique and the same as the names used in the pin mapping commands from above.&amp;nbsp;&amp;nbsp;Notice also that each test provides the minimum and maximum voltages for determining the Pass/Fail status of the continuity test (Min/Max parameters are visible just above the highlighted command).&amp;nbsp;&amp;nbsp;ATEasy will automatically evaluate the measurement returned to TestResult against the Min/Max parameters to determine the Pass/Fail status of each continuity measurement, and will automatically report the results of the evaluation to the Test Log (standard output) or Test Executive (ATEasy’s Test Management driver utility).&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200223\Figure 01.5.JPG" alt="Continuity Tests" title="Continuity Tests" border='0' &gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 1:&amp;nbsp;&amp;nbsp;Continuity Task/Test Structure and Test Command&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;Test PMU Measure Command&lt;/b&gt; is attached to a procedure call where the continuity measurement occurs.&amp;nbsp;&amp;nbsp;The procedure, &lt;b&gt;TestContinuity&lt;/b&gt;, is located in a driver called DUT, as are the commands discussed in this article.&amp;nbsp;&amp;nbsp;The procedure calls another procedure,&lt;b&gt; _GetPinInfo&lt;/b&gt;, which searches the structure array for the name or number of the DUT Variant pin passed in by the command, and when found, extracts the DUT pin number and DIO channel number associated with that pin.&amp;nbsp;&amp;nbsp;The code for _GetPinInfo is shown below:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure _GetPinInfo(nDutNumber, varDutPin, nDioPin, pnDutPin, psDutPin): Void&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;nDutNumber: Val Short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!DUT device number&lt;br /&gt;varDutPin: Val Variant&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !DUT Pin ("Name", "Number" or valNumber)&lt;br /&gt;nDioPin: Var Short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !DIO Channel number&lt;br /&gt;pnDutPin: Var Short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Returned DUT pin number&lt;br /&gt;psDutPin: Var String&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Returned DUT pin name&lt;br /&gt;nHandle: Short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !DIO handle&lt;br /&gt;iPin: Long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Pin index counter&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;! Get the DIO session handle&lt;br /&gt;&amp;nbsp;&amp;nbsp; Dio Get MasterHandle(nHandle)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; If VarType(varDutPin)=vtBstr&lt;br /&gt;&amp;nbsp;&amp;nbsp; ! The procedure searches the structure array for the "name" &lt;br /&gt;&amp;nbsp;&amp;nbsp; ! or "number" of the DUT pin passed in by the command,...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For iPin=0 to m_nDutCount[1]-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !&amp;nbsp;&amp;nbsp;and when "name" is found...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If LCase(m_astDomain[nDutNumber-1,iPin].Name)=LCase(varDutPin) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! the DUT pin number is saved, ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pnDutPin=iPin+1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! the DUT pin name is saved, ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;psDutPin=m_astDomain[nDutNumber-1,iPin].Name &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! the DIO channel number is used for the measurement process&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nDioPin=m_astDomain[nDutNumber-1,iPin].DIO &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ExitLoop ! exit the loop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! or when "number" is found...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ElseIf Val(varDutPin)=(iPin+1) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! the DUT pin number is saved, ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pnDutPin=iPin+1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! the DUT pin name is saved, ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;psDutPin=m_astDomain[nDutNumber-1,iPin].Name &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! the DIO channel number is used for the measurement process&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nDioPin=m_astDomain[nDutNumber-1,iPin].DIO &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ExitLoop ! exit the loop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EndIf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! If the DUT pin "name/number" was not found...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If iPin=m_nDutCount[1]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! generate an error exception and return&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Error 1,"DUT pin name/number \""+varDutPin+"\" not found" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EndIf&lt;br /&gt;&amp;nbsp;&amp;nbsp; Else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pnDutPin=varDutPin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! If the DUT pin number exceeds it's limits...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If pnDutPin&lt;1 or pnDutPin&gt;m_nDutCount[1]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! generate an error exception and return&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Error 1,"DUT pin number "+Str(pnDutPin)+" invalid" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EndIf&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! The DUT pin name is saved, and ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;psDutPin=m_astDomain[nDutNumber-1,pnDutPin-1].Name &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! the DIO channel number is used for the measurement process&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nDioPin=m_astDomain[nDutNumber-1,pnDutPin-1].DIO &lt;br /&gt;&amp;nbsp;&amp;nbsp; EndIf&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The DIO channel number returned by _GetPinInfo is used for the continuity measurement.&amp;nbsp;&amp;nbsp;The DIO channel is placed in the Force Current mode and the commutating voltages (voltage clamps) of +5V and -2V are applied to the DIO channel to keep the DUT pin voltage to a level that is safe for the DUT.&amp;nbsp;&amp;nbsp;A small negative current (-0.5mA) is applied to the DIO channel, and the resulting voltage is measured.&amp;nbsp;&amp;nbsp;Once the measurement is complete, the DIO channel is returned to dynamic mode (default) and the measured voltage is returned to the calling command.&amp;nbsp;&amp;nbsp;The full ATEasy algorithm is shown below:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure TestContinuity(nDutNumber, varDutPin, pnDutPin, psDutPin): Double&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;	nDutNumber: Val Short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!DUT device number&lt;br /&gt;	varDutPin: Val Variant&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !DUT Pin ("Name", "Number" or valNumber)&lt;br /&gt;	pnDutPin: Var Short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Returned DUT pin number&lt;br /&gt;	psDutPin: Var String&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Returned DUT pin name&lt;br /&gt;	nDioPin: Short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !DIO Channel number&lt;br /&gt;	dContinuity: Double&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Continuity voltage measurement&lt;br /&gt;	nHandle: Short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !DIO handle&lt;br /&gt;{&lt;br /&gt;	! Get the DIO session handle&lt;br /&gt;	Dio Get MasterHandle(nHandle)&lt;br /&gt;	&lt;br /&gt;	_GetPinInfo(nDutNumber,varDutPin,nDioPin,pnDutPin,psDutPin)&lt;br /&gt;	&lt;br /&gt;	! The DIO channel is placed in the Force Current mode and...&lt;br /&gt;	Dio Setup Channels Mode PmuForceCurrentMode RangeOfChannels(nHandle,nDioPin,nDioPin)&lt;br /&gt;	! commutating voltages (voltage clamps) of +5V and -2V are defined&lt;br /&gt;	Dio Setup Channels PMU ForcedCurrentCommutatingVoltage RangeOfChannels(nHandle,nDioPin,nDioPin,5.0,-2.0)&lt;br /&gt;	! A small negative current (-0.5mA) is applied to the DIO channel, and...&lt;br /&gt;	Dio Setup Channels PMU ForceCurrent RangeOfChannels(nHandle,nDioPin,nDioPin,-0.5,aPmuCurrentRange_n2ma_to_p2ma)&lt;br /&gt;	&lt;br /&gt;	! the resulting voltage is measured&lt;br /&gt;	Dio Measure PmuVoltage(nHandle,nDioPin,dContinuity,250)&lt;br /&gt;	&lt;br /&gt;	! The DIO channel is returned to dynamic (default) mode and...&lt;br /&gt;	Dio Setup Channels Mode DynamicIo RangeOfChannels(nHandle,nDioPin,nDioPin)&lt;br /&gt;	&lt;br /&gt;	!&amp;nbsp;&amp;nbsp;the measured voltage is returned to the calling command&lt;br /&gt;	&lt;br /&gt;	Return dContinuity&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Results&lt;/h3&gt;ATEasy automatically evaluates the measurement returned to TestResult against the test’s Min/Max parameters to determine the Pass/Fail status of each continuity measurement, and reports the results of the evaluation to the Test Log (standard output) or Test Executive (ATEasy’s Test Management driver utility).&amp;nbsp;&amp;nbsp;&lt;b&gt;Figure 2&lt;/b&gt; shows the Test Executive output with a DUT open continuity failure for pin 2, and a DUT short continuity failure for pin 9.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200223\Figure 04.6B.JPG" alt="Test Executive Output with Failures" title="Test Executive Output with Failures" border='0' &gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 2:&amp;nbsp;&amp;nbsp;ATEasy Test Executive Output with DUT continuity Failures&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The ATEasy project files for this article can be downloaded &lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200223\Q200223.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;here&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200223/Semiconductor-Continuity-Test-Using-the-GX5295-Digital-IO-w-PMU</link><pubDate>9/5/2021</pubDate></item><item><title>Consolidating Test Resources for Avionics Production Test - Published on 8/30/2021</title><description>Manufacturers of avionics products are constantly challenged to develop, manufacture, and maintain / service a diverse range of avionics products, including aircraft data acquisition and recording systems, navigation / communication solutions and aircraft network systems. These types of products which are deployed on virtually all commercial aircraft in operation today require rigorous functional testing as well as a robust test data collection system to ensure overall system reliability and traceability. Additionally, the long product life cycles for avionics products (typically more than 20 years for service and support) requires that the associated test systems be maintained and supported which can be both technically and financially challenging.&lt;br /&gt;&lt;br /&gt;Teledyne Controls manufactures a broad product line of avionics products which include:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Digital Flight data acquisition/management units&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Wireless / Quick Access Recorders (WQAR/QAR)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Nav-Com systems&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Network File Servers&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Network router systems&lt;/li&gt;&lt;/ul&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;&lt;br /&gt;To address the test requirements associated with these products Teledyne test engineers adopted the PXI platform as the core platform for their manufacturing test solution. Offering a broad variety of instrumentation and providing test engineers with the flexibility to build and easily reconfigure a compact, small footprint test system, Teledyne selected Marvin Test Solutions’ GX7100 PXI chassis, instrumentation and ATEasy® software to provide the basis for their manufacturing test systems.&lt;br /&gt;&lt;br /&gt;With over 95 test systems deployed for both production and service applications, Teledyne has been able to address both current and future generation products using a common core system. &lt;/td&gt;&lt;td&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;div align='center'&gt;&lt;td&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200312/Single_UUT_MATE.JPG" alt="Single UUT Modular Acceptance Test Equipment" title="Single UUT Modular Acceptance Test Equipment" border='0' &gt;&lt;/td&gt;&lt;/div&gt;&lt;td&gt; &lt;/td&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;td&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200312/MATE_with_Thermal_Chambers.JPG" alt="Teledyne Modular Acceptance Test Equipment with Thermal Chambers" title="Teledyne Modular Acceptance Test Equipment with Thermal Chambers" border='0' &gt;&lt;/td&gt;&lt;/div&gt;&lt;/tr&gt;&lt;tr&gt;&lt;div align='center'&gt;&lt;td&gt;&lt;b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Single UUT Modular Acceptance Test Equipment&lt;/b&gt;&lt;/td&gt;&lt;/div&gt;&lt;td&gt; &lt;/td&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;td&gt;&lt;b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Teledyne Modular Acceptance Test Equipment with Thermal Chambers&lt;/b&gt;&lt;/td&gt;&lt;/div&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;&lt;br /&gt;Previous generations of test stations based on custom or proprietary architectures would have taken years to develop, but by selecting a commercial off the shelf (COTS) platform as the core component, Teledyne Controls was able to complete the system design in a few months.&amp;nbsp;&amp;nbsp;And by standardizing on a core platform, Teledyne has been able to leverage the current platform over a 10 year timeframe, supporting over 25 avionics systems, 15 circuit card assemblies, and numerous types of UUTs – demonstrating the robustness and longevity of the platform. Currently there are over 95 test systems deployed for test and maintenance of Teledyne Controls products.&lt;br /&gt;&lt;br /&gt;In addition, by standardizing not only on a hardware platform but also on an integrated test executive and test development software platform, the development and deployment of multiple test solutions has resulted in a significant increase in test program development productivity with an equally significant reduction in test program deployment time when compared to previous generation systems.&amp;nbsp;&amp;nbsp;Teledyne’s experience with defining, developing and deploying a common test platform has shown that significant savings can be realized for both development and test maintenance costs.&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+gx7100+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;To learn more about the advantages of a common test platform for avionics production test, a detailed white paper is available:&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2018\Consolidating_Resources_Avionics_Test.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the White Paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200312/Consolidating-Test-Resources-for-Avionics-Production-Test</link><pubDate>8/30/2021</pubDate></item><item><title>Trendar / Fluke 3050B Digital Subsystem Replacement - Published on 8/18/2021</title><description>&lt;b&gt;I.	Introduction&lt;/b&gt;&lt;br /&gt;This technical brief offers a notional implementation for replacing the Trendar / Fluke 3050B digital subsystem with a PXI-based, MTS digital subsystem. The suggested implementation only addresses a subset of the Fluke 3050B’s digital test functionality and is based on information obtained from&amp;nbsp;&amp;nbsp;the 3050B Digital / Analog Test System manual, dated February, 1983 (Rev. 1,&amp;nbsp;&amp;nbsp;2/84).&lt;br /&gt; &lt;br /&gt;&lt;b&gt;II.	Background&lt;/b&gt;&lt;br /&gt;The Fluke 3050B Test System offered automated digital and analog functional test capability for PCB assemblies. Interfacing to the UUT was via a connector adapter which was connected to (4) 156 pin ZIF connectors. Figure 1 below is a picture of the system.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200314/Fluke-3050B.jpg" alt="Fluke 3050B System" title="Fluke 3050B System" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;div align='center'&gt;Figure 1: Fluke 3050B System&lt;/div&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The 3050B operated in two modes of pass/fail testing – comparison mode and signature mode. Comparison mode relied upon comparing the digital stimulus responses between a known good UUT and the UUT under test. I/O pin states, IC clips applied to the boards, and logic probes were compared step by step.&amp;nbsp;&amp;nbsp;The signature mode utilized only a single board and relied upon pass / fail decisions by comparing CRC (Cyclic Redundancy Check) signatures generated by the I/O pins of the UUT to signatures of a previously tested, known good board. &lt;br /&gt;&lt;br /&gt;The 3050B also included fault diagnostics using an environment called ADS, which was a guided probe algorithm that could diagnose faults based on UUT schematic, topology and components. Inputs needed by ADS to perform diagnostics included:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;IC type and location file&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;IC type definition file&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Priority node file (optional)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;From -&amp;nbsp;&amp;nbsp;to interconnect file&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Board edge priority file (optional)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Label file (used for documentation)&lt;/li&gt;&lt;/ul&gt;The 3050B offered two probes for monitoring / comparing of nodes on the UUT. Probe logic threshold was selectable 1 V, 2 V, 5 V, 7 V or variable (-10 to +10 V). The use of IC clips (16-pin) had similar characteristics except the variable range was 0 to +10 V.&lt;br /&gt;&lt;br /&gt;The 3050B digital subsystem’s key features are summarized below:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Maximum of 240 I/O pins, in 32-pin increments; base configuration was 64 pins&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Low level driver output less than or equal to 0.7 V @10 mA&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;High level driver output programmable via jumpers in the connector adapter (see figure 2 for output range)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Driver test rate: 1 MHz, (2 MHz in some modes)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Receiver threshold range: 1.8 V to 3.5 V based on driver voltage level (see figure 3)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Stored sequences: up to 2048 bits&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Test length: programmable for 20K, 40K, 100K, 200K, 400K, 1M, 2M, 4M, 10M, 20M, 40M&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Tester clock frequency: Programmable in 3 digits from 1 Hz to 9.99 MHz&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200314/Output_Driver_Range.png" alt="Output Driver Range" title="Output Driver Range" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;div align='center'&gt;Figure 2: Output Driver Range&lt;/div&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200314/Receiver_Threshold_Range.png" alt="Receiver Threshold Range" title="Receiver Threshold Range" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;div align='center'&gt;Figure 3: Receiver Threshold Range&lt;/div&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Sequence execution included the following capabilities:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Switch any of four pin groups from present mode to Auto Sequence, Stored Sequence, or High Impedance&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Change the state of drivers in a pin group in Auto Sequence mode, in accordance with the programmed Auto Sequence algorithm&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Change the state of the drivers in pin groups in Stored Sequence mode, in accordance with the programmed Stored Sequence&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Enable or disable all receivers&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Execute an opcode for a stored sequence as defined in the table below&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200314/Opcodes.png" alt="Opcodes for Stored Sequence" title="Opcodes for Stored Sequence" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;div align='center'&gt;Opcodes for Stored Sequence&lt;/div&gt;&lt;/b&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;III.	Notional 3050B Digital Subsystem Replacement&lt;/b&gt; &lt;br /&gt;The notional subsystem replacement is based on MTS’ 6U PXI &lt;a href='http://www.marvintest.com/Product.aspx?Model=GX5055' target='_blank'&gt;GX5055&lt;/a&gt; digital I/O card which offers 32 digital I/O channels and a wide (-14 V to +25 V) drive / sense voltage range.&lt;br /&gt;&lt;br /&gt;To accommodate 240 pins, the subsystem would consist of (8) GX5055 digital I/O cards, installed in a &lt;a href='http://www.marvintest.com/Product.aspx?Model=GX7005' target='_blank'&gt;GX7005&lt;/a&gt; high power, PXI chassis.&lt;br /&gt;&lt;br /&gt;This digital subsystem can operate to 50 MHz and features programmable slew rate, which would facilitate matching the 3050B’s driver performance characteristics. In addition, the subsystem features per-pin and per-test step direction control as well as programmable per pin drive / sense levels. All of these features provide the flexibility to facilitate the adaption / migration of a 3050B test program to the proposed digital subsystem. &lt;br /&gt;&lt;br /&gt;As noted in Section II, the 3050B supported several test modes, including a comparison and signature mode for pass / fail testing. A summary of possible capabilities and differences based on the GX5055 digital subsystem is detailed&amp;nbsp;&amp;nbsp;below:&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+GX7005C+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt; &lt;ul&gt;&lt;li&gt;Signature mode, pass/fail only. The use of signature mode requires the calculation of a CRC for the acquired data from the UUT and then comparing to the known good CRC. The GX5055 does not support CRC calculation so this would need to be done post acquisition by the system controller (a PC), provided the CRC calculation method is known.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Comparison mode can be supported, provided the stimulus / response vectors are available from the known good UUTs. The known good test vectors would be applied to the UUT and the response would be captured by the GX5055’s memory. Post-acquisition, the acquired vectors from the UUT would be compared against the known good vectors. The GX5055’s function library includes a function that supports this compare capability. Note that although the 3050B only supported 2K vectors, sequence length could be up to 40M. The GX5055 supports up to a sequence length of 512K, so for long sequences (&gt; 512K), the test and compare process would need to be split up into multiple sequences.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The notional subsystem makes no provision for incorporating a guided probe algorithm for fault diagnosis. A probe can be connected to a spare DIO channel, but development of the probe algorithm would be the responsibility of the end user.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The GX5055 digital subsystem is most aligned with supporting the Stored Sequence mode. The GX5055’s vector depth is much greater than the 3050B’s 2K vectors. However, sequence depth for the GX5055 is limited to 512K. The 3050B supported sequences to 40M. The GX5055’s opcodes are very similar to the 3050B’s which would facilitate re-hosting of Stored Sequences. For large sequences, multiple sequences would need to be loaded and executed as multiple bursts.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;IV.	Adopting the GX5055 Digital Subsystem for the 3050B Replacement&amp;nbsp;&amp;nbsp;- Considerations&lt;/b&gt; &lt;br /&gt;The GX5055 subsystem (Figure 4) can provide the basic digital test capabilities supported by the 3050B.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200314/GX7005.JPG" alt="GX7005" title="GX7005" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;div align='center'&gt;Figure 4: GX7005 Chassis &amp; Digital Subsystem&lt;/div&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;Additional issues to be considered as part of this replacement solution include:&lt;br /&gt;&lt;br /&gt;Fixtures: Adapter(s) will need to be constructed to adapt the 3050B’s Connector Adapter / test interface to the GX5055’s I/O connectors. Alternatively, new fixtures / cabling would need to be constructed. MTS offers the GX5055 digital subsystem with several different mass termination interfaces supplied by both Virginia Panel and Mac Panel.&lt;br /&gt;&lt;br /&gt;Software:&amp;nbsp;&amp;nbsp;A method for migrating the 3050B’s test vectors and associated test program will need to be created. Control of the GX5055 digital subsystem is done via modern text-based languages such as C or &lt;a href='http://www.marvintest.com/Product.aspx?Model=ATEasy' target='_blank'&gt;ATEasy&lt;/a&gt;® with the display / control of test programs via a PC-based controller. Any operator interfaces associated with the 3050B test programs would need to be migrated to the PC-based environment.&lt;br /&gt;&lt;br /&gt;3050B Specific Waveforms: The 3050B supported a variety of complex waveforms as well as clocks, gray-code clocks, and eight phase clocks. If the test programs being migrated require these waveforms, they will need to be created by the user as part of the test program migration process. These waveforms are associated with Auto Sequences which were generated by the 3050B’s Auto Sequence Processor.&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+gx5055+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Pass/Fail Test Modes: As noted in section III, the 3050B supported two modes – comparison mode and signature mode. If implementing signature mode for a program migration effort, the user will need to know the known good CRC signatures as well as having full knowledge of how the CRC signature is calculated.&lt;br /&gt;&lt;br /&gt;Guided probe: The digital subsystem is not supplied with any guided probe software. Any diagnostics would need to be developed by the end user.</description><link>https://www.MarvinTest.com/KB/Q200314/Trendar-Fluke-3050B-Digital-Subsystem-Replacement</link><pubDate>8/18/2021</pubDate></item><item><title>Cyber Security Features of ATEasy - Published on 8/18/2021</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;Prevention of security vulnerabilities is increasingly important as new threats and defenses are discovered. In order to support your asset protection, ATEasy includes many security features in compliance with DOD Application Security and Development (ASD) and DISA Security Technical Implementation Guide (STIG). ATEasy is compliant with ASD version 4 release 10 (V4R10) released October 25, 2019 (293 requirements). &lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;&lt;br /&gt;For example, the following audit requirements met by ATEasy:&lt;ul&gt;&lt;li&gt;Login/Logoff&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Start/End session/program&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;User modifications and login/logoff&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Inactivity locked timeout&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Password policy: term, repeats, disabled accounts, format (# of characters, upper lower/numeric, signs…)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;User file protection and read-only setup&lt;/li&gt;&lt;/ul&gt;Throughout your product's lifecycle, ATEasy provides encryption and a user administration interface to increase application security from conception to operation.&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;ATEasy User Auditing&lt;/h3&gt;Many attack vectors exploit improperly administrator user privileges. To mitigate the risks stemming from poorly defined user rights, rigorous user account management includes auditing. In addition to any enterprise-level solution, ATEasy also features user auditing. When enabled, ATEasy will generate audit records in Windows Event Log for the following events and their event ID number:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Audit Start/Stop - records to ATEasy Windows Application Event Log&lt;/b&gt;&lt;ul&gt;&lt;li&gt;ATEasy or Application Start (1010)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATEasy or Application Exit (1011)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Program Start (1012)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Program End (1013)&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Audit User Log In/Off - records to the ATEasy Windows Application Event Log&lt;/b&gt;&lt;ul&gt;&lt;li&gt;User Login Succeeded (1020)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;User Login Failed (1021)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;User Logoff (1022)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;User Locked (1023)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;User Unlocked (1024) &lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Audit User Modifications- records to the ATEasy Windows Application Event Log&lt;/b&gt;&lt;ul&gt;&lt;li&gt;User Password Change Succeeded (1030)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;User Password Change Failed (1031)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;User Added (1032)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Used Removed (1033)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;User Modified (1034)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;User's File Replaced (1035)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;User's File Changed (1036)&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Auditing establishes self-audits adding to existing security standards and best practices. User action traceability is a key security feature. Figure 1 shows an example of Windows Event Viewer and ATEasy audits. The log provides information security personnel an easy way of tracing user interaction. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200316\WindowsEventViewer_ATEasyAudit.png" alt="Example of ATEasy Program Start logging" title="Example of ATEasy Program Start logging" border='0' &gt;&lt;br /&gt;Figure 1. ATEasy logs application events, viewed here with Windows Event Viewer.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Building Safe ATEasy Projects&lt;/h3&gt;All user data is encrypted by default to prevent unauthorized access. Common application security flaws include revealing too much information about error conditions for example in the form of stack traces, detailed network timeout errors, buffer overflows and database structures. To support secure development through proper error handling, ATEasy has built-in support for example:&lt;ul&gt;&lt;li&gt;Try-Catch blocks to localize the handling of exceptions&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;OnError() module events to catch all / ease handling of runtime errors&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Error statements in user code to generate error conditions allowing centralized or grouped error handling (OnError /Try-Catch)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Procedures to process unhandled exception&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200316\ProjectProperties_EncryptExe.png" alt="Encrypt Checkbox" title="Encrypt Checkbox" border='0' &gt;&lt;br /&gt;Figure 2. Encrypting Executables is Accomplished by Checking Encrypt&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Projects can be built into an executable or DLL. Figure 2 shows ATEasy project properties with secure options available. Embedding runtime library can help prevent loading malicious libraries in man-in-the-middle/API-hooking attacks. In particular, when 'Encrypt' is checked the executable or DLL created receives a digital signature with its PCode section encrypted. This feature guards project integrity against file corruption or malicious changes. If the created EXE or DLL file is encrypted, it cannot be read for example using a text viewer. Figure 3 shows File Encryption being enabled for a Program module.&lt;br /&gt;&lt;br /&gt;Benefits of project target encryption include:&lt;ul&gt;&lt;li&gt;Maintain executable integrity and prevent hacking or modifying executable (Non-Repudiation)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Prevent reverse engineering and PCode code viewing&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200316\ProgramProperties_SettingAccess.png" alt="Set an access password" title="Set an access password" border='0' &gt;&lt;br /&gt;Figure 3. An administrator can set passwords for modules to control access&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Secure ATEasy Runtime&lt;/h3&gt;ATEasy includes features like stack overflow and mismatch checking to maintain project integrity. Buffer overflow protection prevents exploits that utilize malformed input injections. ATEasy implements Control-Flow Integrity to prevent stack smashing and injection of malicious code. Runtime applications are secured and provided with encryption. Binary source code encryption has many benefits. ATEasy verifies files as they are opened which contributes to protection from malicious changes. &lt;br /&gt;&lt;br /&gt;The benefits of using password or license serial number protection cannot be reiterated enough. Using access control protects applications from using, viewing, editing and reverse engineering of code by potentially harmful actors. In addition to access control, ATEasy also provides automatic file versioning. Versioning also provides additional recordkeeping capabilities.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;ATEasy User Administration, Access Control and Versioning&lt;/h3&gt;Access control throughout project lifecycle is paramount for application security. ATEasy includes many features for robust user administration. &lt;br /&gt;&lt;br /&gt;Administrator can specify access level and password. Alternatively, ATEasy serial number can be used to grant access based on license. In addition to controlling access, user changes to project files can be subject to versioning. Each version of project files can be labeled and time stamped promoting further tracing of changes and user actions. Figure 4 shows an example project using automatic versioning.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200316\ProgramProperties_AutomaticVersioning.png" alt="Tracking changes by a user" title="Tracking changes by a user" border='0' &gt;&lt;br /&gt;Figure 4. Tracking versions is convenient with periodic auto save enabled.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;User interaction can be limited to selecting and running tests with short menus. User login maybe required with ATEasy launch with Use Login Dialogbox. Minimum password length can be enforced as well. ATEasy users can be granted rights as individuals and as group members. Custom groups can be created and user rights can also be set/read in AUser class. These user rights are detailed in figure 5, while figure 6 shows how intuitive enforcing ATEasy information security can be.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200316\AUserClassRights.png" alt="User rights" title="User rights" border='0' &gt;&lt;br /&gt;Figure 5. Given proper clearance, user rights can be set from Users menu as well as in an instance of AUser class.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200316\Users_RightsAndGroups.png" alt="Define groups" title="Define groups" rights' border='0' &gt;&lt;br /&gt;Figure 6. Access to the IDE can be made selective based upon group definition.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Test Executive User Administrator, Access Control and Versioning&lt;/h3&gt;In addition to ATEasy, Test Executive also contains tools for configuring user rights and access to your application's functions. Administrator can hide/show/enable/disable/rearrange commands, menu items, toolbar &amp; form buttons, and options to handle customization privileges and access to test executive features. An administrator can add and modify available user groups as shown in figure 7, while figure 8 shows a menu for modifying group users.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200316\TestExecMultiUser_Groups.png" alt="Modify groups" title="Modify groups" border='0' &gt;&lt;br /&gt;Figure 7. Group changes can be made&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200316\TestExecMultiUser_Users.png" alt="Modify user" title="Modify user" border='0' &gt;&lt;br /&gt;Figure 8. Users can be modified.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Commands available to a Test Executive user can be restricted to based on individual or group settings. Each command can be mapped to custom procedures. For example in figure 9, changing a password is disabled for user group Testers. Much like commands Test Executive's available menus items can be restricted based on user privileges. An example of menu item customization is seen in figure 10, where access and organization of the Testers group menu is considered.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200316\TestExecMultiUser_Commands.png" alt="Set command rights for groups" title="Set command rights for groups" border='0' &gt;&lt;br /&gt;Figure 9. Group specific restrictions can be applied by disallowing functionality for specified parameters&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200316\TestExecMultiUser_Menu.png" alt="Set menu items for groups" title="Set menu items for groups" border='0' &gt;&lt;br /&gt;Figure 10. Menu items can be restricted as well.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Application toolbars and options are also available for customization according to user access level. Control of available options can restrict use of for example user being able to delete log files. In figure 11 example, the Test Executive toolbar seen by Supervisors group is being modified.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200316\TestExecMultiUser_Toolbar.png" alt="Set toolbar items for groups" title="Set toolbar items for groups" border='0' &gt;&lt;br /&gt;Figure 11. Setting a custom toolbar for the Supervisor group&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200316\TestExecMultiUser_Forms.png" alt="Set forms for groups" title="Set forms for groups" border='0' &gt;&lt;br /&gt;Figure 12. Specifying modal user interface for a given group name&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Figure 12 shows configuration of the Test Executive touch panel user interface in the case Testers user group. Access to commands linked to form items can be added and removed from user group. Additionally, figures 13 and 14 show more user interface options that can be set for a given user groups and modal and modeless dialog. In figure 13 for example, whether window is shown in full screen can be set. Figure 14 shows some example groups and how their user password minimum requirements can be mandated.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200316\TestExecMultiUser_Options.png" alt="Set options for groups" title="Set options for groups" border='0' &gt;&lt;br /&gt;Figure 13. Customizing options for the group Testers&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200316\TestExecMultiUser_MoreOptions.png" alt="Set options for groups" title="Set options for groups" border='0' &gt;&lt;br /&gt;Figure 14. Customizing options for the group Testers&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;ATEasy and Test Executive provide STIG V4R10 compliant, as well as many other, tools for secure application development. ATEasy applications are deployed across many different platforms and can have a long lifetime, in which case the usefulness of ATEasy built-in application security capabilities will likely only increase with time.&lt;br /&gt;&lt;br /&gt;[References]&lt;br /&gt;&lt;a href='https://stigviewer.com/stig/application_security_and_development/' target='_blank'&gt;https://stigviewer.com/stig/application_security_a&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200316/Cyber-Security-Features-of-ATEasy</link><pubDate>8/18/2021</pubDate></item><item><title>White Paper: Overcoming 5G mmWave Semiconductor Production Test Challenges - Published on 7/27/2021</title><description>Beamformer integrated circuits are the key to unlocking the low latency and increased bandwidth performance promised by 5G networks, and they play a critical role in other applications areas as well including radar, imaging and remote sensing. Multiple beamforming devices are integrated into an RF front end as part of the antenna assembly, which is then programmed to form the desired overall radiation pattern. Importantly, the ability to steer the RF signal by shifting the phase of the output is essential for accurate and repeatable signal transmission and reception. &lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2021\Overcoming_5G_mmWave_Test_Challenges.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200343/White-Paper-Overcoming-5G-mmWave-Semiconductor-Production-Test-Challenges</link><pubDate>7/27/2021</pubDate></item><item><title>Adding Custom Commands to ATEasy Test Executive - Published on 7/17/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;h3&gt;Overview&lt;/h3&gt;ATEasy is a test executive and a rapid application development framework for functional test, Automated Test Equipment, data acquisition, process control, and instrumentation systems, providing all the necessary tools to develop, deploy and maintain software components, as well as a complete and customizable test executive.&lt;br /&gt;&lt;br /&gt;Test engineers have several commercial options available to them when choosing the best platform to standardize on for writing test programs.&amp;nbsp;&amp;nbsp;And while there are also commercial test executive development packages available, most are a collection of tools with which engineers can assemble a test executive. &lt;br /&gt;&lt;br /&gt;ATEasy comes bundled with a full-featured test executive that runs out-of-the-box with no coding necessary, exploiting ATEasy’s structured applications to dynamically build a user interface tailored to the test processes.&amp;nbsp;&amp;nbsp;And because ATEasy was developed for test engineers, it has many of the processes common to test programs built into the system – like measurement evaluation and data reporting.&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+ATEasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;That is not to say that the ATEasy Test Executive is rigid and inflexible when customization is warranted.&amp;nbsp;&amp;nbsp;In fact, since the ATEasy Test Executive was written in native ATEasy language, the full source code to the test executive driver is provided so the user has complete control over adding new functions, or altering the look, feel and functionality of their application.&lt;br /&gt;&lt;br /&gt;ATEasy supports easy integration into the test executive of unique user procedures and functions, including user defined menu additions and tool bar images to support those functions.&amp;nbsp;&amp;nbsp;This article will demonstrate the process for adding custom functions, commands, menu’s, forms and tool bars.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Custom Test Executive Procedure&lt;/h3&gt;The first step in customizing the test executive is to add code that represents the required functionality.&amp;nbsp;&amp;nbsp;The code could be in the form of a procedure or function, and may include a graphical interface.&amp;nbsp;&amp;nbsp;As a representative example of custom functionality and place-holder for future code development, this example will add a simple procedure called “MySetTemp”.&amp;nbsp;&amp;nbsp;The procedure was added to the System module, and will allow an operator to manually, or programmatically set an ambient temperature that will be recorded in the ATEasy Test Executive data log.&amp;nbsp;&amp;nbsp;Code for the procedure is below:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure MySetTemp(dTempSetting): Void Public&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Sytem.MySetTemp&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;dTempSetting: [Val] Double = 0&lt;br /&gt;sInput: String&lt;br /&gt;i: Long&lt;br /&gt;{&lt;br /&gt;&lt;blockquote&gt;	If ArgMissing(dTempSetting)&lt;blockquote&gt;		dTempSetting = m_dTempSetting&lt;br /&gt;		i = InputBox("Set operating temperature","Set Temperature",sInput)&lt;br /&gt;	&lt;br /&gt;		If i = 2 ! Cancel&lt;br /&gt;&lt;blockquote&gt;			m_dTempSetting = dTempSetting&lt;/blockquote&gt;		Else&lt;br /&gt;&lt;blockquote&gt;			m_dTempSetting = Val(sInput)&lt;/blockquote&gt;		EndIf&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;	Else&lt;br /&gt;&lt;blockquote&gt;		m_dTempSetting = dTempSetting&lt;/blockquote&gt;	EndIf&lt;br /&gt;	&lt;br /&gt;	Print "Operating Temperature Set To: "+Str(m_dTempSetting)&lt;br /&gt;&lt;/blockquote&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The procedure will store a temperature to the System module variable “m_dTempSetting”.&amp;nbsp;&amp;nbsp;If the procedure is called from the program thread, and passed a value via the “dTempSetting” parameter, then the variable is updated without user intervention.&amp;nbsp;&amp;nbsp;If the procedure is called without the “dTempSetting” parameter, then a built-in user form will open requesting the operator to enter the temperature.&amp;nbsp;&amp;nbsp;Which ever method is used, the set temperature is stored in the System variable for use by the test executive.&amp;nbsp;&amp;nbsp;Make sure to set the procedure properties to Public and Compile as shown in figure 1.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200329\\Fig-1.jpg" alt="MySetTemp Procedure Properties" title="MySetTemp Procedure Properties" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1 – MySetTemp Public and Compile properties&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Test Executive Data Logging&lt;/h3&gt;The System “OnInitProgram” event is used in this example to report the set temperature whenever the test process is initiated.&amp;nbsp;&amp;nbsp;This event is called each time the Program module (which contains the Task/Test list) runs.&amp;nbsp;&amp;nbsp;A simple print statement is used to inform the operator of the previously stored temperature, and because the statement occurs in the System OnInitProgram event, the information is located in the Program header section of the Test Executive log.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure:&amp;nbsp;&amp;nbsp;OnInitProgram(): Void Public	! Syste.OnInitProgram, Occurs when a program has started.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;{&lt;br /&gt;&lt;blockquote&gt;	Print "Operating Temperature: "+Str(m_dTempSetting)&lt;/blockquote&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Customizing the Test Executive&lt;/h3&gt;&lt;b&gt;Create Command Image&lt;/b&gt;&lt;br /&gt;ATEasy’s Test Executive allows custom commands and images to be added to the existing menu, forms and toolbar.&amp;nbsp;&amp;nbsp;The image is a BMP image that will graphically represent the functionality of the added procedure.&amp;nbsp;&amp;nbsp;In this example, a 16 x 16 pixel BMP image was created using the Windows Paint program, and saved as “Thermometer.bmp” - see figure 2.&amp;nbsp;&amp;nbsp;This image will be used when adding the new function to the ATEasy's Test Executive Menu, Form and Toolbar.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200329\\Fig-2.jpg" alt="Set Temperature Image" title="Set Temperature Image" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2 – Set Temperature Image&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Create New Test Executive Command&lt;/b&gt;&lt;br /&gt;A new command must be defined to link the MySetTemp() procedure and the Set Temperature image to the Test Executive.&amp;nbsp;&amp;nbsp;While the application is running and the Test Executive is visible, click on &lt;b&gt;Tools:Customize&lt;/b&gt;.&amp;nbsp;&amp;nbsp;The default tab should be "Commands".&amp;nbsp;&amp;nbsp;If it's not, select it.&amp;nbsp;&amp;nbsp;At the bottom of the command list is the "User Defined popup" selection.&amp;nbsp;&amp;nbsp;Click on this and using the "Insert New Command" tool, add a new user defined command as shown in Figure 3:A.&amp;nbsp;&amp;nbsp;Name the command "Set Temperature" (Figure 3:B).&amp;nbsp;&amp;nbsp;Since we will be adding this command to the Test Executive Menu, Form and Toolbar, change the Caption for each of these items to "Set Temperature" (Figure 3:C).&amp;nbsp;&amp;nbsp;Then add the description ""Set operating temperature" to the new command as shown in figure 3:D.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200329\\Fig-3.jpg" alt="Command Dialog" title="Command Dialog" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3 – Create New Test Executive Command&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To link the MySetTemp procedure to the newly created command, click in the Procedure field (figure 3:E) and enter the procedure "System.SetMyTemp" )Module.Procedure Name), then click on the check next to the field to accept the entry.&amp;nbsp;&amp;nbsp;If you make a mistake entering the procedure an error message will be dislayed.&lt;br /&gt;&lt;br /&gt;To link the image to the command, click on the box next to the Image field to open up a navigation window.&amp;nbsp;&amp;nbsp;Navigate to the folder containing the BMP file previously created, and select the file (figure 3:F).&amp;nbsp;&amp;nbsp;The navigation box will display the image after successfully selecting the BMP image.&amp;nbsp;&amp;nbsp;The last step in defining the new Test Executiv command is to enable it by checking the Enable check box as shown in figure 3:G.&amp;nbsp;&amp;nbsp;When done the Test Executive Customize:Commands dialog should look similar to figure 3.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='GB'&gt;&lt;b&gt;NOTE:&lt;/b&gt;&amp;nbsp;&amp;nbsp;The image navigation will use the absolute path when linking the image.&amp;nbsp;&amp;nbsp;If you intend to deploy your application and cannot guarantee that the installation path will be the same as the development path, you can manually substitute the absolute path with a relative path using this syntax: &lt;b&gt;".\image.bmp"&lt;/b&gt;.&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;Create New Test Executive Menu Function&lt;/b&gt;&lt;br /&gt;To add a new Menu item to the Test Executive, while still in the Tools:Customize dialog, click on the "Menu" tab.&amp;nbsp;&amp;nbsp;Expand the "User Defined popup" in the left side of the dialog and select the "Set Temperature" command you just created - Figure 4:A.&amp;nbsp;&amp;nbsp;Expand the "Log" item in the right side of the dialog, and select "Clear" (figure 4:B), then click on "Add" (figure 4:C) to insert the item selected on the left side of the dialog (user defined Set Temperature command), into the position selected on the right side of the dialog, bumping the selected item down on the list.&amp;nbsp;&amp;nbsp;The new item should be visible in the expanded Log function list (figure 4:D).&amp;nbsp;&amp;nbsp;The ordering tools above the right side function list can be used to change the position the functions in the list are displayed in the Test Executive Log Menu (figure 4:E).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200329\\Fig-4.jpg" alt="Adding new menu selection" title="Adding new menu selection" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4 – New Test Executive Menu Selection&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Create New Test Executive Form Function&lt;/b&gt;&lt;br /&gt;Test Executive forms are used when the Test Executive is set to operate in the Modal (Touch Panel) mode.&amp;nbsp;&amp;nbsp;Modal or Modeless operation can be selected from the Tools:Customize Options tab.&amp;nbsp;&amp;nbsp;Using the same process as was used to add a new menu item to the Test Executive, you can add our customer command and image to the Test Executive form.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;From the &lt;b&gt;Tools:Customize&lt;/b&gt; dialog, select the Forms tab.&amp;nbsp;&amp;nbsp;Expand the "User Defined popup" in the left side of the dialog and select the "Set Temperature" command you just created - Figure 5:A.&amp;nbsp;&amp;nbsp;Select "Log" from the drop-down list at the top of the dialog (figure 5:B).&amp;nbsp;&amp;nbsp;In the Main Buttons area, select "Clear" (Figure 5:C)), then click on "Add" (figure 5:D) to insert the user defined Set Temperature command into the position selected in the Main Button list, bumping the selected item down on the list.&amp;nbsp;&amp;nbsp;The new item should be visible in the expanded list (figure 5:E).&amp;nbsp;&amp;nbsp;The ordering tools above the right side function list can be used to change the position the functions in the list are displayed in the Test Executive Log Form (figure 5:F).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200329\\Fig-5.jpg" alt="Adding new form selection" title="Adding new form selection" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5 – New Test Executive Form Selection&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Create New Test Executive Toolbar Function&lt;/b&gt;&lt;br /&gt;To add the new command and image to the Test Executive toolbar, click on the "Toolbar" tab and expand the "User Defined popup" on the left side of the dialog.&amp;nbsp;&amp;nbsp;Select the "Set Temperature" command - Figure 6:A.&amp;nbsp;&amp;nbsp;Click on "Program exit" on the right side of the dialog to select it (figure 6:B), then click on "Add" (figure 6:C) to insert the item into the position selected on the right side of the dialog.&amp;nbsp;&amp;nbsp;The new item should be visible in the expanded Log function list (figure 6:D).&amp;nbsp;&amp;nbsp;The ordering tools can be used to change the position the functions when displayed in the Test Executive Toolbar (figure 6:E).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200329\\Fig-6.jpg" alt="Adding new toolbar selection" title="Adding new toolbar selection" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6 – New Test Executive Toolbar Selection&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Using The New Commands&lt;/h3&gt;To use the new function, while the Test Executive is running, you can select it from any of the three Test Executive interface it was linked to, Menus, Forms (when running in Modal mode) or Toolbars.&amp;nbsp;&amp;nbsp;You can also call the function from within a test program.&amp;nbsp;&amp;nbsp;If a temperature parameter is included in the call, then the function executes silently (without operator interaction).&amp;nbsp;&amp;nbsp;If the parameter is omitted, then an operator prompt allows a temperature value to be manually entered, the same as if the function were initiated via the Menu/Form/Toolbar interface - as shown in figure 7.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\Q200329\Fig-7.jpg" alt="User Input" title="User Input" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 7 - InputBox For Manual Temperature Input&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Examples of both programming methods are shown below.&amp;nbsp;&amp;nbsp;This code was placed in the Program OnInitTask event, and demonstrates user the input method for Task2, and silent temperature updating for Task 3.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure OnInitTask(): Void Public	! Program.OnInitTask, Occurs when a program task has started.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;{&lt;br /&gt;Select Task.Name&lt;br /&gt;&lt;blockquote&gt;Case "Task 2"&lt;br /&gt;&lt;blockquote&gt;System.MySetTemp()&lt;/blockquote&gt;Case "Task 3"&lt;br /&gt;&lt;blockquote&gt;System.MySetTemp(98.6)&lt;/blockquote&gt;&lt;/blockquote&gt;EndSelect&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Examples of using the set temperature function from the Test Executive Menu/Form/Toolbar interfaces are provided below&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\Q200329\Fig-8.jpg" alt="Test Executive Menu Selection" title="Test Executive Menu Selection" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 8 - Using Set Temperature From The Test Executive Log Menu&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\Q200329\Fig-9.jpg" alt="Test Executive Form Selection" title="Test Executive Form Selection" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 9 - Using Set Temperature From The Test Executive Modal (Touch Panel) Log Form&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\Q200329\Fig-10.jpg" alt="Test Executive Toolbar Selection" title="Test Executive Toolbar Selection" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 10 - Using Set Temperature From The Test Executive Toolbar&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Test Executive Data Log&lt;/h3&gt;The following is a sample test log documenting the temperature values stored in the m_dTempSetting System module variable.&amp;nbsp;&amp;nbsp;The initial value was set using the toolbar to enter a value of 123 before running the application.&amp;nbsp;&amp;nbsp;When the test is initiated, the System OnInitProgram event is executed, the initial value of 123, stored from the toolbar entry, is displayed.&amp;nbsp;&amp;nbsp;Prior to Task 2 starting, the operator is prompted to enter a new value, and responds by entering the value of 100.&amp;nbsp;&amp;nbsp;This new value is documented before to the Task 2 header.&amp;nbsp;&amp;nbsp;Prior to Task 3 starting, the program automatically updates the m_dTempSetting System variable, and the new value is documented at the beginning of Task 3.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\Q200329\Fig-11.jpg" alt="Test Executive Test Log" title="Test Executive Test Log" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 11 - Test Executive Test Log Output&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;This article demonstrates the process for creating user defined functions, and integrating them into the ATEasy Test Executive.&amp;nbsp;&amp;nbsp;The example presented, while simple in concept, can serve as a template for adding more, and more varied functions.&amp;nbsp;&amp;nbsp;It's important to note that the functions can be ported to other ATEasy platforms, but to invoke them, you must either follow the setup process of creating commands and linking them to the Test Executive interface as described here, or, as the setup is saved to the "ATEasy.usr" file, you can copy the .USR file from the initial development system to multiple deployment systems and bypass creating and linking the commands on each deployment system.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='GB'&gt;Note:&amp;nbsp;&amp;nbsp;When copying the .USR file to a new system, ATEasy will detect the new .USR file and prompt the operator (must be ATEasy administrator) to&amp;nbsp;&amp;nbsp;accept using the new .USR file, or revert back to the .USR file currently in use.&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;The ATEasy project used to develop this article can be downloaded from the link below.&amp;nbsp;&amp;nbsp;The application was developed using ATEasy 10.0, build 156d&lt;br /&gt;&lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/\Q200329\CustomToolbar.zip' target='_blank'&gt;ATEasy Custom Toolbar Example (zip)&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200329/Adding-Custom-Commands-to-ATEasy-Test-Executive</link><pubDate>7/17/2021</pubDate></item><item><title>How to Support Multiple Languages User Interface in ATEasy - Published on 7/17/2021</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;This article shows how to create or convert an ATEasy application to support multiple languages user interface providing an application that is more accessible and localized to customers around the world. &lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;h3&gt;Overview&lt;/h3&gt;The article provides an example showing how to implement language localization for the following UI elements:&lt;ul&gt;&lt;li&gt;Forms inducing controls, menus&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;User Messages, prompts and strings&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Test Log, including Test Names, Task Names&lt;/li&gt;&lt;/ul&gt;The main components that were used to create the example provided are:&lt;br /&gt;1. Three modules used in this example as a typical ATEasy application&lt;br /&gt;&lt;blockquote&gt;a. Program module &lt;br /&gt;b. System module &lt;br /&gt;c. Driver module&lt;br /&gt;&lt;/blockquote&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+ATEasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;2. An ATEasy DLL file for each language to hold the application user interface; 4 DLLs are provided:&lt;br /&gt;&lt;blockquote&gt;a. LanguageUIEnglish.dll, LanguageUIHebrew.dll, LanguageUIGerman.dll, LanguageUIChinese.dll, etc.&lt;br /&gt;b. These DLL files should contain the implementation of the User interface and language based resources.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;3. Have a &lt;b&gt;UIlib&lt;/b&gt; DLL such that the language DLLs have the same prototype as the &lt;b&gt;UIlib&lt;/b&gt; DLL&lt;br /&gt;&lt;blockquote&gt;a. Allows the DLLs to have the same inputs and outputs&lt;br /&gt;b. Allows the program to call in the language DLLs through the &lt;b&gt;UIlib &lt;/b&gt; DLL&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;4. The UI driver can be included with the &lt;b&gt;UIlib&lt;/b&gt; library and all of that should be placed inside the system module. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Background&lt;/h3&gt;There are two different ways that you can make a multiple language user interface. The first is by replacing the text fields in your form dynamically for each language. However, problems can occur with the font, size, and alignment of the text since each language's text has different attributes. As you can see, the first option can give you many problems, which brings us to the second option. The second option is to make multiple copies of the application in ATEasy DLL files (one file for each language), then calling in the appropriate DLL so it opens up the proper user interface. Implementing DLL files with user interface procedures instead of just replacing the text allows you to more accurately scale the user interface for each language. For this reason, in this article we will be showing you a step by step process of how to complete option two (creating ATEasy DLL files).&lt;br /&gt;&lt;br /&gt;Every DLL will have the same DLL interface such that they have the same string functions but the user interface will look different, as seen in figures 1, 2, 3, and 4 below. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\Figure1 - Chinese TranslateLogString.png" alt="Chinese log changes" title="Chinese log changes" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1. Translating test log output to Chinese&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\Figure 2 - Chinese output.png" alt="Chinese log output with changes" title="Chinese log output with changes" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2. Chinese UI form&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\Figure 3 - German TranslateLogString.png" alt="German log changes" title="German log changes" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3. Translating test log output to German&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\Figure 4 - German output.png" alt="German log output with changes" title="German log output with changes" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4. German UI form&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;When the program figures out the desired language, it can simply load the proper DLL through LoadLibrary(UILib, “DLL path”). Using DLL files also allows you to have code in a driver and all the DLLs in that driver that can use that code which helps maximize reusable code.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Step by Step Process&lt;/h3&gt;1. Create a new driver &lt;br /&gt;&lt;blockquote&gt;a. Name it &lt;b&gt;UI&lt;/b&gt;&lt;br /&gt;b. Create the driver that will have all of the DLLs in it&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;2. Go to events in the &lt;b&gt;UI&lt;/b&gt; driver&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\step1.1.png" alt="Step 2" title="Step 2" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;3. In UI driver create a new form&lt;br /&gt;&lt;blockquote&gt;a. Name it &lt;b&gt;SelectLanguage&lt;/b&gt;&lt;br /&gt;b. Gives the user the opportunity to choose which language they want to be displayed&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;4. In &lt;b&gt;SelectLanguage&lt;/b&gt; select the &lt;b&gt;OnLoad()&lt;/b&gt; event&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\step2.2.png" alt="Step 4" title="Step 4" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;5. In &lt;b&gt;SelectLanguage&lt;/b&gt; select the &lt;b&gt;OnClick()&lt;/b&gt; event&lt;br /&gt;&lt;blockquote&gt;a. By clicking the language, it will call in the proper language DLL&lt;br /&gt;&lt;/blockquote&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\step3.3.3.png" alt="Step 5" title="Step 5" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 7:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;A-&lt;/b&gt; ALabel - name: lblInstructions &lt;br /&gt;&lt;b&gt;B-&lt;/b&gt; AComboBox - name: cbSelectLanguage &lt;br /&gt;&lt;b&gt;C-&lt;/b&gt; AButton - name: btnOk &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;6. Go to &lt;b&gt;UI&lt;/b&gt; events to &lt;b&gt;OnInitProgram()&lt;/b&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\step4.4.png" alt="Step 6" title="Step 6" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 8&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;7. Go to &lt;b&gt;UI&lt;/b&gt; events to &lt;b&gt;OnInitTask()&lt;/b&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\step5.5.png" alt="Step 7" title="Step 7" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 9&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;8. Go to &lt;b&gt;UI&lt;/b&gt; events to &lt;b&gt;OnInitTest()&lt;/b&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\step6.6.png" alt="Step 8" title="Step 8" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 10&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;9. Go to your program file and create a new test&lt;br /&gt;&lt;blockquote&gt;a. Name it &lt;b&gt;Display Form&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\step7.7.png" alt="Step 9" title="Step 9" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 11&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;10. Go to &lt;b&gt;UI&lt;/b&gt; Procedures and create a new procedure&lt;br /&gt;&lt;blockquote&gt;a. Name it &lt;b&gt;LoadMainForm&lt;/b&gt;&lt;br /&gt;b. This procedure is in all the language DLLs too, so by calling in this procedure, the program reads in the UILib DLL and transfers you to the proper DLL file&lt;br /&gt;&lt;/blockquote&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\step8.8.png" alt="Step 10" title="Step 10" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 12&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;11. Go to Driver commands and connect procedure &lt;b&gt;LoadMainForm&lt;/b&gt; to the commands&lt;br /&gt;&lt;blockquote&gt;a. In ATEasy, when you create a new procedure, it is not a public procedure so by making this procedure into a command you are allowing the entire project to see and use this command. Essentially, you are converting the procedure from a private to a public procedure.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;12. Go to &lt;b&gt;UI&lt;/b&gt; events to &lt;b&gt;OnEndProgram()&lt;/b&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\step9.9.png" alt="Step 12" title="Step 12" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 13&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;13. Create a new project&lt;br /&gt;&lt;blockquote&gt;a. Name it &lt;b&gt;LanguageUIChinese&lt;/b&gt; or whatever language DLL you are making&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;14. In &lt;b&gt;LanguageUIChinese&lt;/b&gt; make a new form&lt;br /&gt;&lt;blockquote&gt;a. Name it &lt;b&gt;MainForm&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\mainformStep13.png" alt="Step 14" title="Step 14" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 14&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;15. In &lt;b&gt;LanguageUIChinese&lt;/b&gt; make a new procedure&lt;br /&gt;&lt;blockquote&gt;a. Name it &lt;b&gt;LoadMainForm&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\loadmainformStep15.png" alt="Step 15" title="Step 15" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 15&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;16. In &lt;b&gt;LanguageUIChinese&lt;/b&gt; make a new procedure&lt;br /&gt;&lt;blockquote&gt;a. Name it &lt;b&gt;GetTaskTestName&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\getTaskTestNameStep14.png" alt="Step 16" title="Step 16" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 16&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;17. In &lt;b&gt;LanguageUIChinese&lt;/b&gt; make a new procedure&lt;br /&gt;&lt;blockquote&gt;a. Name it &lt;b&gt;TranslateLogString_OnInit&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\translatelogstringStep16.png" alt="Step 17" title="Step 17" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 17&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;18. In &lt;b&gt;LanguageUIChinese&lt;/b&gt; make a new procedure&lt;br /&gt;&lt;blockquote&gt;a. Name it &lt;b&gt;TranslateLogString_OnInitProgram&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\Figure 18 - Chinese system TranslateLogString_OnInitProgram.png" alt="Step 18" title="Step 18" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 18&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;19. In &lt;b&gt;LanguageUIChinese&lt;/b&gt; make a new procedure&lt;br /&gt;&lt;blockquote&gt;a. Name it &lt;b&gt;TranslateLogString_OnInitTask&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\translatelogstringStep18.png" alt="Step 19" title="Step 19" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 19&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;20. In &lt;b&gt;LanguageUIChinese&lt;/b&gt; make a new procedure&lt;br /&gt;&lt;blockquote&gt;a. Name it &lt;b&gt;TranslateLogString_OnEndProgram&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200321\translatelogstringStep19.png" alt="Step 20" title="Step 20" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 20&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;Introducing a new multiple language user interface in ATEasy increases the availability of an application to more users. Implementing a multiple language user interface through DLL files allows for a more accurate user interface than just changing the text to a different language. Using DLL files allows users to dynamically load the appropriate files during run time which is a response to the increasing trend of making applications more accessible.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Example Files&lt;/h3&gt;ATEasy example project files used in this article:&lt;ul&gt;&lt;li&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200321\LanguageUI.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;LanguagesUI&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200321/How-to-Support-Multiple-Languages-User-Interface-in-ATEasy</link><pubDate>7/17/2021</pubDate></item><item><title>How to access the JTAG port on GX3500 and GX3700 series cards - Published on 7/13/2021</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;While all of MTS's GX3500 &amp; GX3700 series cards are supplied with software panels that allow you to program and interact with the instrument, some users desire access to the built in JTAG port in these devices. Accessing the JTAG signals on these instruments gives users the ability to leverage on-chip debugging tools such as SignalTap II Logic Analyzer.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Required Items&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;GX3500 or GX3700 series card&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;10-pin (2 x 5) 0.100”(2.54mm) pitch header (male)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;USB Blaster Intel/Altera download cable&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Soldering iron (to mount 10-pin header)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Intel/Altera Quartus II v11.0SP1 installed&amp;nbsp;&amp;nbsp;&lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/https://www.marvintest.com/Download/798/Quartus-Free-Web-Windows-Edition-v11-0-sp1-for-GX37xx/?type=Other&amp;refpage=%2fdownloads.aspx' target='_blank'&gt;Download Here&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;/td&gt;&lt;td&gt;[:+[+GX3700+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Installing the J6 Header&lt;/h3&gt;New GX3500/GX3700 series cards ship from the factory without the J6 header installed so the first thing you must do is solder the 10-pin header into J6, position shown below in red.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200336\\J6-installed.png" alt="GX3500 J6 header" title="GX3500 J6 header" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='GB'&gt;&lt;b&gt;&lt;b&gt;WARNING:&lt;/b&gt;&lt;/b&gt; MTS is not responsible if you damage your instrument during this step. Extreme caution should be taken and soldering should only be performed by qualified technicians.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;With the 10-pin header placed in the plated-through holes of J6, solder from the backside. Care must be taken not to apply too much heat and consequently reflow nearby surface mounted parts.&lt;br /&gt;&lt;br /&gt;Now that you have your 10-pin header soldered into J6, you can now connect the JTAG connector from the USB Blaster (10-pin female connector) to the GX3500/GX3700 and place the card back into the chassis. You must install the JTAG connector from the USB Blaster to the J6 header with pin 1 of the USB Blaster cable oriented towards the rear of the GX3500/GX3700 card, as shown below.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200336\\J6-with_usbblaster.jpg" alt="USB Blaster connected to J6 header" title="USB Blaster connected to J6 header" border='0' &gt;&lt;br /&gt;&lt;br /&gt;Once you have attached the USB Blaster to the GX3500/GX3700, gently slide the card into the chassis, being careful not to let the USB Blaster ribbon cable bind on the chassis rails as you move it into position. As you will notice, you need to have the slots adjacent to the slot occupied by your GX3500/GX3700 clear so that the USB Blaster can fit in your chassis. Now that the GX3500/GX3700 has been installed into the chassis, connect the USB connector on the USB Blaster to an available chassis USB port and power up the chassis.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Setting Up the USB Blaster Driver&lt;/h3&gt;Once Windows has completed booting up, open the Windows Device Manager. Until you specify the proper driver for the USB Blaster, Windows will likely identify it as “Other device” as shown below.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200336\\dev-manager.png" alt="Device Manager" title="Device Manager" border='0' &gt;&lt;br /&gt;&lt;br /&gt;Right click on the USB Blaster, select &lt;b&gt;Update driver&lt;/b&gt; and then select &lt;b&gt;Browse my computer for driver software&lt;/b&gt;. Now browse to: &lt;b&gt;[Your Altera installation folder]\11.0sp1\quartus\drivers&lt;/b&gt; (shown below, using the default installation path) and select &lt;b&gt;Next&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200336\\usbblaster_driver.png" alt="Driver location" title="Driver location" border='0' &gt;&lt;br /&gt;&lt;br /&gt; &lt;h3&gt;Verifying JTAG Connectivity Using the JTAG Chain Integrity Test&lt;/h3&gt;Now that you have assigned the proper driver to the USB Blaster within Windows, you can open Quartus II and set the USB Blaster as the designated JTAG programmer/debugger. This is accomplished by selecting &lt;b&gt;Tools-&gt;JTAG&lt;/b&gt; Chain Debugger from the main menu tool bar in Quartus II. You will then see the window shown below.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200336\\JTAG-Chain.png" alt="JTAG Chain Debugger" title="JTAG Chain Debugger" border='0' &gt;&lt;br /&gt;&lt;br /&gt;From this window’s menu bar select &lt;b&gt;Edit-&gt;Hardware Setup&lt;/b&gt;. This will open the &lt;b&gt;Hardware Setup&lt;/b&gt; window where you can select the USB Blaster from the &lt;b&gt;Currently selected hardware&lt;/b&gt; drop-down list, as shown below.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200336\\hardware-setup.png" alt="Hardware Setup" title="Hardware Setup" border='0' &gt;&lt;br /&gt;&lt;br /&gt;Once you have selected the USB Blaster as your current hardware, select the &lt;b&gt;Close&lt;/b&gt; button and you will be returned to the former &lt;b&gt;JTAG Chain Debugger&lt;/b&gt; window. You will notice that the &lt;b&gt;Test JTAG Chain&lt;/b&gt; button is now enabled. By selecting this button you can verify that all the solder connections on the J6 header are good and that JTAG connectivity has been established. After testing the JTAG chain you should see a message in the session log stating that the JTAG connection is good, as shown below.&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200336\\JTAG-integrity.png" alt="JTAG chain connection" title="JTAG chain connection" border='0' &gt;&lt;br /&gt;At this point you have established JTAG connectivity with the Cyclone III/Stratix III device on your GX3500/GX3700 card and you are now able to program and debug using many of the Quartus II built in tools. For more information on these tools and their usage please see the links provided below.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Links&lt;/h3&gt;&lt;a href='https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/hb/qts/qts_qii53027.pdf' target='_blank'&gt;Quartus II System Debugging Tools Overview&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href='https://www.intel.com/content/www/us/en/programmable/support/training/course/odsw1164.html' target='_blank'&gt;Signal Tap Logic Analyzer: Intro &amp; Getting Started &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href='https://www.youtube.com/watch?v=DCUhsezqydQ' target='_blank'&gt;SignalTap II Logic Analyzer (Video)&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200336/How-to-access-the-JTAG-port-on-GX3500-and-GX3700-series-cards</link><pubDate>7/13/2021</pubDate></item><item><title>IC Test Socket Contamination - Published on 6/1/2021</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;One of the most important, if not the most important connection between the TS-900 Semiconductor tester and the DUT is the test socket on the load board. &lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;Because of the nature of this connection, the constant insertion and removal of devices in the socket, it will deteriorate over time and compromise the connection which is critical to the overall integrity of the test. The damage occurs when devices are inserted and removed from the test socket and is caused by metallic residue buildup on the test socket contacts from small particles from the lead plating of the DUT.&lt;br /&gt;&lt;br /&gt;These particles are transferred and get embedded on the surface of the test socket contact; these particles become resistive and eventually degrade the connection between the test socket pin and the DUT lead.&lt;br /&gt;&lt;br /&gt;Another factor is the wear out of the plating on the test socket contacts themselves. This wear out mechanism happens because of the extreme hardness of the plating on some DUT leads. Repetitive insertions and removal of the DUT will erode the test socket contact plating requiring more and more downward pressure be applied to the DUT to make contact with the test socket, eventually the connection will become intermittent or fail altogether.&lt;/td&gt;&lt;td&gt;&lt;br /&gt;[:+[+ts-900e-5g+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;The most common plating processes for IC leads, after the ROHS directive became effective in 2006, are matte tin (Sn) and nickel-palladium-gold (NiPdAu) for leaded and pad packages and tin-silver-copper (SnAgCu) for balls on ball grid array packages.&lt;br /&gt;&lt;br /&gt;Matte tin plating is the most widely used lead plating for leaded and pad packages because of its low cost and availability; extensive research has been conducted by the packaging industry, semiconductor manufacturers and test socket manufacturers and the processes for using this type of platting are well understood. &lt;br /&gt;&lt;br /&gt;Because matte tin plating develops an oxide layer almost immediately after exposure to air, it is necessary to mechanically break through this oxide to make a good, reliable contact. In older test socket designs, those used to test pre-ROHS tin-lead (SnPb) plated leads, the contacts just presses against DUT lead with little to no mechanical scrubbing action. When this type of socket is new the contacts will penetrate the oxide layer on the tin plated leads; however as the number of parts inserted in the socket increases very small particles from the lead plating will buildup on the surface of the contact (these particles will immediately begin to oxidize and become resistive), and after a number of insertions this residue build up will cause a resistive contact. This resistance is now in series between the DUT and the TS-900 test equipment and will cause intermittent to full contact failure. On devices that draw significant amounts of current, the voltage drop developed across this resistance can cause damage or destruction of the test socket, the load board and the DUT.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Effects of Contamination on Contact Resistance&lt;/h3&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200240\Fig1.JPG" alt="Device Plating 2mm" title="Device Plating 2mm" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Effects of Pb-Free Device Plating –Matte Tin (Courtesy Johnstech)&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt; &lt;img src="https://www.MarvinTest.com/images/support/Q200240\Fig9.JPG" alt="Device Plating 4mm" title="Device Plating 4mm" border='0' &gt;&lt;br /&gt;&lt;b&gt;Effects of Pb-Free Device Plating –Matte Tin (Courtesy Johnstech)&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;On devices with NiPdAu lead plating, because of the hardness of this plating, the contact degrading mechanism is the wearing out of the plating on the test socket contact surface over time. This exposes the base contact metal and a resistive contact develops because of oxidation. Balls in BGAs will also develop an oxide layer because of the tin in the SnAgCu plating. The pogo pin contacts on BGA sockets will get contaminated with these metallic oxide particles and the contact will also become resistive.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200240\Fig2.JPG" alt="Contact Resistance" title="Contact Resistance" border='0' &gt;&lt;br /&gt;&lt;b&gt;Effects of Pb-Free Device Plating –NiPdAu (Courtesy Johnstech)&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;New Socket Technologies&lt;/h3&gt;New socket technology designs addresses this oxide layer issue by creating contacts that mechanically wipes across the surface of the lead. The socket contacts are plated with a hard metal alloy which will displace the oxide as it slides on the surface of the lead. Some test sockets are manufactured with pins made of solid hard alloy metal; these pins will last longer because as the contact metal wears out, its surface metal stays the same.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200240\Fig5.JPG" alt="New Socket Technology" title="New Socket Technology" border='0' &gt;&lt;br /&gt;&lt;b&gt;New socket technology with movable contacts and force elastometers&amp;nbsp;&amp;nbsp;(Courtesy Johnstech)&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Effects of Contact Insertions&lt;/h3&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200240\Fig6.JPG" alt="1 insertion" title="1 insertion" border='0' &gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200240\Fig7.JPG" alt="10 insertion" title="10 insertion" border='0' &gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200240\Fig8.JPG" alt="50 insertion" title="50 insertion" border='0' &gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;b&gt;Device I/O Surface Oxide Penetration and Removal: SnPb 1, 10 and 50 insertions (Courtesy Johnstech)&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;			&lt;br /&gt;Test socket manufacturers recommend that test sockets be cleaned after a certain number of insertions. Each manufacturer has its own cleaning procedure and most sockets can be rebuilt and contacts can be replaced if the they become unusable. Test sockets used in the production test floor should be placed under a preventive maintenance schedule to minimize contact deterioration due to tin oxide buildup and wear. This will maximize your first-time-pass yields and minimizes the amount of product re-test. Taking care of the test sockets will guarantee that they will perform consistently and reliably for a long time.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Test Socket manufacturers and suppliers&lt;/h3&gt;&lt;a href='http://www.johnstech.com/' target='_blank'&gt;Johnstech&lt;/a&gt;&lt;br /&gt;&lt;a href='http://www.loranger.com/loranger_edc2/html/index.php?page=home' target='_blank'&gt;Loranger International&lt;/a&gt;&lt;br /&gt;&lt;a href='http://www.jftech.com.my/index.html' target='_blank'&gt;JF Technology Berhad&lt;/a&gt;&lt;br /&gt;&lt;a href='http://www.arieselec.com/products/bgsocket.htm' target='_blank'&gt;Aries Electronics, Inc&lt;/a&gt;&lt;br /&gt;&lt;a href='http://www.ironwoodelectronics.com/index.cfm' target='_blank'&gt;Ironwood Electronics&lt;/a&gt;&lt;br /&gt;&lt;a href='http://test-sockets.com/catalog/off-the-shelf_solutions/sockets/overview.cfm' target='_blank'&gt;Emulation Technology, Inc.&lt;/a&gt;&lt;br /&gt;&lt;a href='http://www.advanced.com/products/bga-socketing-systems' target='_blank'&gt;Advanced Interconnections&lt;/a&gt;&lt;br /&gt;&lt;a href='http://solutions.3m.com/wps/portal/3M/en_US/Interconnect/Home/Solutions/Textool/?WT.mc_id=Electronics_Redirect&amp;WT.tsrc=Redirect' target='_blank'&gt;3M Textool&lt;/a&gt;&lt;br /&gt;&lt;a href='http://custominterconnects.com/index.html' target='_blank'&gt;Custom Interconnects&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Copyright&lt;/h3&gt;All Graphs and Pictures copyright and courtesy of Johnstec</description><link>https://www.MarvinTest.com/KB/Q200240/IC-Test-Socket-Contamination</link><pubDate>6/1/2021</pubDate></item><item><title>What is HW driver? - Published on 6/1/2021</title><description>&lt;h3&gt;MTS HW driver&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;The &lt;b&gt;HW &lt;/b&gt;package - MTS (Marvin Test Solutions) Hardware Access Driver, is used by all MTS instrument drivers and &lt;b&gt;ATEasy&lt;/b&gt; to access the PC resources (memory, IO ports, DMA etc), to set/query the PCI/PXI configuration and more.&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;HW &lt;/b&gt;package includes libraries used to program and create instrument drivers for PCI/cPCI/PXI based instruments, including the PCI Express (PCIe) derivatives. &lt;b&gt;PXI/PCI Explorer &lt;/b&gt;, a utility to configure and display PXI/PC based systems, is also included.&amp;nbsp;&amp;nbsp;This utility includes a VISA configuration manager for PXI and PXI express instruments (similar to NI-MAX), and supports MTS and other vendors PXI chassis, controllers and bus expanders. &lt;br /&gt;&lt;br /&gt;The MTS &lt;b&gt;HW&lt;/b&gt; driver is used by, and installed with all MTS software packages, including ATEasy and all MTS instrument drivers. It is also available as a stand alone package, to download the current &lt;b&gt;HW&lt;/b&gt; software &lt;a href='https://www.marvintest.com/Product.aspx?Model=HW' target='_blank'&gt;click here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Once installed the &lt;b&gt;HW&lt;/b&gt; driver includes the following files:&lt;/td&gt;&lt;td&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;HwSetup.exe&lt;/b&gt; - A command line utility to install, uninstall and check the status of the HW driver&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;HwTest.exe&lt;/b&gt; - A program to test the HW driver and to read/write to I/O ports, memory and to display PCI resources&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;HwPciExplorer.exe&lt;/b&gt; - HW PXI/PCI Explorer Applet, a PXI/PCI based VISA compatible resource manager control panel applet. Used to display the current PXI/PCI devices and to assign slot numbers to device resources. Slots numbers are required to identify a PCI/PXI board when using MTS board driver&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;HwPciExplorer.cpl and HwPciExplorer64.cpl&lt;/b&gt; - 32 and 64 bit PXI/PCI Explorer - Windows Control Applet Panel support&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Hw.sys and Hw64.sys&lt;/b&gt; - Windows kernel mode device drivers, provides access to I/O ports, memory and PCI resources, installed to the Windows System Drivers directory.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;HwDevice.sys and HwDevice64.sys&lt;/b&gt; - 32 and 64 bit Windows kernel mode device driver for HW.INF boards, installed to the Windows System Drivers directory&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;HwPxiExpress.dll and HwPxiExpress64.dll&lt;/b&gt; - 32 and 64 bit driver to provide information to MTS Chassis, Controller and Peripheral PXIe devices, installed to the Windows System directory&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;HwCIns32.dll and HwClins64.dll&lt;/b&gt; - Windows Class Installer for HwDevice.sys and HwDevice64.sys&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Hw.dll and Hw64.dll&lt;/b&gt; -&amp;nbsp;&amp;nbsp;Library with API defined in hw.h, installed in Windows System folder&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Hw.h&lt;/b&gt; -&amp;nbsp;&amp;nbsp;Include file, to include in your C/C++ project provides functions prototypes to Hw.dll&amp;nbsp;&amp;nbsp;and Hw64.dll files&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Hw.lib and Hw64.lib&lt;/b&gt; -&amp;nbsp;&amp;nbsp;Import library for C/C++ applications&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;HwCIns32.dll and HwCIns32.dll&lt;/b&gt; - 32 and 64 bit Windows Class Installer for HW&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Hw.inf&lt;/b&gt; - Driver information files for MTS's PXI/PCI boards.&amp;nbsp;&amp;nbsp;Installed to the Windows System INF directory&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Hw.cat&lt;/b&gt; - Windows digitally signed catalog file&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;HW-NI-PAL-PCI.reg&lt;/b&gt; - HW-NI-PAL Registration entries file&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;GX7XXXX.ini&lt;/b&gt; - Configuration files used to support Marvin Test Solutions chassis and controllers&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Hw.vxd&lt;/b&gt; - Windows 9x/Me virtual device driver provides access for memory and PCI resources, installed to the Windows System directory&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;HwCIns16.dll&lt;/b&gt; - Windows 9x/Me Class Installer for HW&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;HwVdd.dll&lt;/b&gt; - VDD for 16 bit application running on 2000-Vista, installed to the Windows System directory&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ReadMe.txt&lt;/b&gt; - Contains the latest release information about the HW package&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;HW Library Functions&lt;/h3&gt;There are many functions within the &lt;b&gt;HW&lt;/b&gt; library that are useful for determining the system configuration. This article discusses the most important procedures, the structHWPCIDEVICE data structure, and provides an examples using the objects listed below for querying the PXI system resources:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;HwOpen&lt;/b&gt;:&lt;br /&gt;Initializes the HW library this must be called prior to any HW driver functions. This is automatically performed in the ATEasy HW driver (HW.drv), but needs to be explicitly called from other programming languages. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;PciGetSlotNumbers([Val] Word wVendorId, [Val] Word wDeviceId, Var Short panSlotNumbers[], Var Word pwDevicesFound)&lt;/b&gt;:&lt;br /&gt;Returns an array of slot number(s) for the devices with the specified Vendor ID and specified Device ID.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PciGetSlotDevice(Val Long lSlot, Var structHWPCIDEVICE pstPciDev)&lt;/b&gt;:&lt;br /&gt;Returns the device information for the instrument in the specified slot.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Struct structHWPCIDEVICE&lt;/b&gt;:&lt;br /&gt;A data type structure that contains information about devices (instruments) installed in a PXI system.&amp;nbsp;&amp;nbsp;While the procedures above are used to obtain information about a PXI device, it is the structHWPCIDEVICE data structure where that information is stored.&amp;nbsp;&amp;nbsp;Knowing the structure of the data type is key to fully utilizing the &lt;b&gt;HW&lt;/b&gt; driver.&amp;nbsp;&amp;nbsp;The full structure provided in the &lt;b&gt;HW&lt;/b&gt; driver is provided below for review:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;br /&gt;structHWPCIDEVICE: Struct Public&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwVendorId: DWord&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwDeviceId: DWord&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwBus: DWord&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stPciSn: structPciSlotNumber&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stPciCfg: strictPciCommonConfig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aResDesc: structCmPartialResourceDescriptor[8]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aMemDesc: structHwMemoryDesc[8]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;szId: Char[256]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;! stPciSn - PCI/PXI slot number (5 low bit: device #, 3 bits: function #, 8 bits: Legacy slot, 16 chassis/slot : 0x203&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;structPciSlotNumber: Struct Public&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwAsUlong: DWord&lt;br /&gt;}&lt;br /&gt;strictPciCommonConfig: Struct Public&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wVendorId: Word&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wDeviceId: Word&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wCommand: Word&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wStatus: Word&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ucRevisionId: Byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ucProgIf: Byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ucSubClass: Byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ucBaseClass: Byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ucCacheLineSize: Byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ucLatencyTimer: Byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ucHeaderType: Byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ucBIST: Byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stType0: structPciHeaderType0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwDeviceSpecific: Byte[192]&lt;br /&gt;}&lt;br /&gt;structPciHeaderType0: Struct Public&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;adwBaseAddresses: DWord[6]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwSubSystem: DWord&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwSubVendorID: DWord&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwROMBaseAddress: DWord&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;adwReserved2: DWord[2]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ucInterruptLine: Byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ucInterruptPin: Byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ucMinimumGrant: Byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ucMaxinumLatency: Byte&lt;br /&gt;}&lt;br /&gt;structPxiChassisInfo: Struct Public&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwSize: Long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! Fill with sizeof (PXIChassisInfo)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;apcidevBridges: structHWPCIDEVICE[4]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Bridges in the chassis&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wChassisModel: Word&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Chassis model # : i.e. 7010&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wChassisRevision: Word&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwChassisSerial: DWord&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;acUserDefinedData: Char[64]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wNumberOfSlots: Word&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! Total number of slots in the chassis&lt;br /&gt;}&lt;br /&gt;structCmPartialResourceDescriptor: Struct Public&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ucType: Byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ucShareDisposition: Byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wFlags: Word&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Address1: DWord&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Address2: DWord&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Address3: DWord&lt;br /&gt;}&lt;br /&gt;structHwMemoryDesc: Struct Public&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwPhAddrLow: DWord&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lPhAddrHigh: Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwLength: DWord&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pvVirtualAddress: DWord&lt;br /&gt;}&lt;br /&gt;structHwMemoryDma: Struct Public&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ucSize: Byte&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! Struct Size for Version&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ucBus: Byte&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! PCI Bus #&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwLength: DWord&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Allocation Size&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memdesc: structHwMemoryDesc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Returned by HW&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwDmaAdapter: DWord&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Returned by HW&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Using a Device Alias&lt;/h3&gt;To demonstrate the utility of the &lt;b&gt;HW&lt;/b&gt; driver, let's review a common task confronting anyone writing a program to control PXI test instruments.&amp;nbsp;&amp;nbsp;When writing a test program, the programmer is always faced with having to identify what instruments are installed in the PXI chassis.&amp;nbsp;&amp;nbsp;This information is essential to the test program so it knows how to establish a communication link between the host computer (i.e., the test program) and the instruments. Instrument identification can take one of several forms. PXI slot numbers can identify instruments.&amp;nbsp;&amp;nbsp;Instruments could also be identified by a resource descriptor (VISA) or a board index number. &lt;br /&gt;&lt;br /&gt;One traditional method to initialize an instrument would be to use a VISA Resource Descriptor string, for example "PCI4::13::INSTR". ATEasy achieves similar functionality using the nSlot value.&amp;nbsp;&amp;nbsp;This parameter contains both the Chassis number and the Slot number.&amp;nbsp;&amp;nbsp;For example, for the nSlot value of 0x108, the hex 0x100 identifies the instrument Chassis as 1 and hex 0x8 identifies the Slot number as 8. &lt;br /&gt;&lt;br /&gt;The &lt;b&gt;HW&lt;/b&gt; driver also provides a method to create an Alias to an instrument. An alias is a text name that can be assigned to any instrument in a PXI chassis using &lt;b&gt;PXI/PCI Explorer&lt;/b&gt;, a PXI resource utility that is installed with the &lt;b&gt;HW&lt;/b&gt; package. Using an Alias name for an instrument allows using the instrument without having to identify its specific location in the system. This is useful if an instrument is moved or the system configuration is changed. Since the Alias name identifies the instrument it is no longer location dependent and can simply be remapped using PCI/PXI Explorer to match the existing test programs, and thus avoiding coding changes that might force recertification of a test program. For example to use Alias names to initialize two GX5295s in an &lt;b&gt;ATEasy&lt;/b&gt; program the user would simply define the alias using&amp;nbsp;&amp;nbsp;&lt;b&gt;PXI/PCI Explorer&lt;/b&gt; (below), and then use initialization code similar to the example that follows:&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200192\HW Alias.jpg" alt="Using PXI/PCI Explorer to assign an instrument Alias" title="Using PXI/PCI Explorer to assign an instrument Alias" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1:&amp;nbsp;&amp;nbsp;Using PXI/PCI Explorer to assign an instrument Alias&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;lSlot: Long&lt;br /&gt;nStimulusHandle: Short&lt;br /&gt;nResponseHandle: Short&lt;br /&gt;&lt;br /&gt;!Using PXI-PCI Explorer Alias to Initalize two GX5295 masters&lt;br /&gt;!Use "Skip On Init" to disable automatic initialization of the GX5295 instruments&lt;br /&gt;	&lt;br /&gt;!The following procedure uses the HW and GX5295 driver functions,&lt;br /&gt;!Void HwOpen() Automatically called by ATEasy&lt;br /&gt;!Long HwPciGetAliasChassisSlot(sAlias) Returns nSlot used by GXXXInitialize&lt;br /&gt;!Void InitializeMaster(nMasterNumber,nSlot,sVisaResource) Master board Init&lt;br /&gt;!Void GetMasterHandle(pnHandle) Returns the current master handle&lt;br /&gt;&lt;br /&gt;!Open the HW driver automatically called by ATEasy&lt;br /&gt;!Hw Initialize()&lt;br /&gt;	&lt;br /&gt;!Initialization for GX5295 Master 1&lt;br /&gt;lSlot = HW Pci Get AliasChassisSlot("Stimulus") !Gets nSlot value&lt;br /&gt;Dio Initialize Master(1,lSlot,"")&lt;br /&gt;Dio Get MasterHandle(nStimulusHandle)&lt;br /&gt;	&lt;br /&gt;!Initialization for GX5295 Master 2&lt;br /&gt;lSlot = HW Pci Get AliasChassisSlot("Response")&amp;nbsp;&amp;nbsp;!Gets nSlot value&lt;br /&gt;Dio Initialize Master(2,lSlot,"")&lt;br /&gt;Dio Get MasterHandle(nResponseHandle)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For additional information about using PXI/PCI Explorer, refer to Knowledge Base article &lt;a href='http://www.MarvinTest.com/KnowledgeBase/KBArticle.aspx?ID=273' target='_blank'&gt;Using HW PXI/PCI Explorer Applet&lt;/a&gt;. Further details of how to create and use an Alias name is discussed in Knowledge Base article &lt;a href='http://www.MarvinTest.com/KnowledgeBase/KBArticle.aspx?ID=187' target='_blank'&gt;Using an Alias to address PXI instruments&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Instrument Initialization &lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;The process for establishing communication with an instrument is to “Initialize” the instrument.&amp;nbsp;&amp;nbsp;This is done by passing the appropriate identification parameter into an initialization procedure, typically contained in the instrument drivers, and having the procedure return a “handle” that is used as a reference for future communication with that instrument. MTS initialization is performed using the GxXXXInitialize function, where XXX is the mnemonic of the instrument, such as DIO, CNT, DMM, etc. This function can use the device's nSlot parameter, Legacy Slot, VISA Resource Descriptor string or an Alias to Initialize an instrument. This information can be obtained in the &lt;b&gt;PCI/PXI Explorer&lt;/b&gt;, or can be obtained programmatically from the structHWPCIDEVICE listed above.&lt;br /&gt;&lt;br /&gt;For example, to initialize the GX5295 located in nSlot 0x108 as referenced above, the user can initialize the instrument using Dio Initialize Master(1, 0x108).&amp;nbsp;&amp;nbsp;The device handle can be queried using the ATEasy command Dio Get Master Handle(pnHandle).&lt;br /&gt;&lt;br /&gt;The instrument initialization process is very similar to that of opening a file, and using the returned “file handle” for subsequent reading or writing to a file.&lt;/td&gt;&lt;td&gt;[:+[+gx5295+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Identification of instruments can be done at program design time by hard-coding the instrument identification into the test program, or at run time by querying the system resources and dynamically initializing instruments using the information returned by the system query.&amp;nbsp;&amp;nbsp;To use procedures contained in HW.DLL to query the system resources and identify installed instruments at run time, the HW HwOpen() procedure must be called prior to calling any of the other procedures in the &lt;b&gt;HW&lt;/b&gt; driver. In the &lt;b&gt;ATEasy&lt;/b&gt; HW driver, this initialization is automatically performed when the ATEasy application runs. &lt;br /&gt;&lt;br /&gt;Once the &lt;b&gt;HW&lt;/b&gt; driver has been initialized, the PciGetSlotNumbers() procedure returns an array of PXI slot numbers that contain instruments matching the search criteria – often the Vendor ID and/or the Device ID.&amp;nbsp;&amp;nbsp;The device information is contained in the structure structHWPCIDEVICE (listed above).&amp;nbsp;&amp;nbsp;If, for example, you wanted to know how many GX5295 dynamic digital instruments were installed in a PXI chassis, what are their slot numbers, and the firmware revision of each of those instruments, you could use the following code:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Word wVendorId : Word =0x16E2 ! Marvin Tests Solutions Vendor ID&lt;br /&gt;wDeviceId=0x5295 : Word&amp;nbsp;&amp;nbsp;! GX5295 Device ID&lt;br /&gt;panSlotNumbers : Short[32] ! Array of slot numbers found&lt;br /&gt;Word pwDevicesFound: Word ! Number of slots matching the Vendor and Device ID’s&lt;br /&gt;pstPciDev: structHWPCIDEVICE &lt;br /&gt;sDeviceInfo : String&lt;br /&gt;i : Long &lt;br /&gt;&lt;br /&gt;!HwOpen() Is performed automatically using ATEasy &lt;br /&gt;!Open the HW driver automatically called by ATEasy&lt;br /&gt;!Hw Initialize()&lt;br /&gt;&lt;br /&gt;PciGetSlotNumbers(wVendorId, wDeviceId, panSlotNumbers, pwDevicesFound)&lt;br /&gt;If pwDevicesFound&lt;&gt;0&lt;br /&gt;&amp;nbsp;&amp;nbsp;For i=0 to pwDevicesFound-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PciGetSlotDevice(panSlotNumbers[i], pstPciDev)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sDeviceInfo= pstPciDev.szId&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Print "Slot "+Format(panSlotNumbers[i],"00")+" Firmware: "+Mid(sDeviceInfo,Pos("SUBSYS_",sDeviceInfo)+7,4)&lt;br /&gt;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;EndIf&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;After the slot number for an instrument is obtained, it would be a simple matter to initialize the instrument by calling the instrument's Initialize() procedures and passing the slot number obtained by scanning the PXI system using the example above.&amp;nbsp;&amp;nbsp;Another method of identifying a PXI system's configuration is using the PciGetSlotDevice().&amp;nbsp;&amp;nbsp;This procedure returns the device information for the instrument in the specified slot.&amp;nbsp;&amp;nbsp;PciGetSlotDevice() can be used in a polling scheme to identify what, if any, instruments are installed in each slot of a PXI chassis, or in all slots in a multi-chassis configuration. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Device Settings&lt;/h3&gt;The Device Settings are as shown in PCI/PXI Explorer, &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200273\HW Device Settings.JPG" alt="Device Settings" title="Device Settings" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2: Device Settings&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To view the Device Settings, expand the folder under the desired instrument. This folder displays the Bus, Device, Function, Device ID, Vendor ID and the memory allocated for the module.&amp;nbsp;&amp;nbsp;These parameters can help determine if the module has had the correct resources allocated during the boot process. For example, if neither of the Memory parameters is showing that memory has been allocated for the instrument, then the module was not allocated memory resources on system boot-up, which could indicate that the instrument drivers need to be installed.&amp;nbsp;&amp;nbsp;Typically, this is done prior to installing the hardware and allows these resources to be allocated when the computer/Windows boots.&amp;nbsp;&amp;nbsp;The Device Settings are informational only and are not editable by the user.&lt;br /&gt;&lt;br /&gt;The Device Settings information can be obtained programmatically using &lt;b&gt;HW&lt;/b&gt; driver functions such as PciGetSlotDevice. The PciGetSlotDevice function can be used to obtain information on all devices in a system and allow the user to write driver functions using the information contained in the HWPCIDEVICE structure. The following is an &lt;b&gt;ATEasy&lt;/b&gt; procedure that displays the Device Settings of all devices found in the chassis.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Slot: Long&lt;br /&gt;nCntr: Short&lt;br /&gt;stPciDevice: structHWPCIDEVICE&lt;br /&gt;&lt;br /&gt;!DisplayDeviceInfo&lt;br /&gt;!This example demonstrates using the HW driver library function HwPciGetSlotDevice&lt;br /&gt;!to obtain PCI/PXI device configuration of each slot of a system. The variable&lt;br /&gt;!stPciDevice is defined as a HWPCIDEVICE structure. The for-next loop prints &lt;br /&gt;!the information found in each populated slot&lt;br /&gt;	&lt;br /&gt;Log.PlainText=True&lt;br /&gt;ClearLog()&lt;br /&gt;	&lt;br /&gt;HW Initialize()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! Must be called before any HW call&lt;br /&gt;HW Pci AssignDeviceSlot()&amp;nbsp;&amp;nbsp; ! Assign slots to all devices&lt;br /&gt;	&lt;br /&gt;for lSlot=0 to HW_MAX_SLOTS-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HW Pci Get SlotDevice(lSlot, stPciDevice)	 ! Get the device in the specified slot&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if stPciDevice.dwVendorId&lt;&gt;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! if populated slot, print the device info&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; append "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Slot ";lSlot;" - Bus ";stPciDevice.dwBus;", Device ";\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stPciDevice.stPciSn.dwAsUlong and 0x1F;\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;", Function ";(stPciDevice.stPciSn.dwAsUlong shr 5) and 0x7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; append "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - VendorID 0x";ucase(str(stPciDevice.stPciCfg.wVendorId, 16));\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;", SubVendorID 0x";ucase(Str(stPciDevice.stPciCfg.stType0.dwSubVendorID, 16))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; append "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - DeviceID 0x";ucase(str(stPciDevice.stPciCfg.wDeviceId, 16));\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;", SubSystem 0x";ucase(Str(stPciDevice.stPciCfg.stType0.dwSubSystem, 16))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for nCntr=0 to 7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select stPciDevice.aResDesc[nCntr].ucType&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;append "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Port:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0x";\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ucase(Str(stPciDevice.aResDesc[nCntr].Address1, 16));\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; " Length 0x";ucase(str(stPciDevice.aResDesc[nCntr].Address3, 16))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;append "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Interrupt: 0x";\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ucase(Str(stPciDevice.aResDesc[nCntr].Address1, 16))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;append "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Memory:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0x";\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ucase(Str(stPciDevice.aResDesc[nCntr].Address1, 16));\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; " Length 0x";ucase(str(stPciDevice.aResDesc[nCntr].Address3, 16))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; endselect&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;next&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;The &lt;b&gt;HW&lt;/b&gt; driver, coupled with the &lt;b&gt;PCI/PXI Explorer&lt;/b&gt; Applet, provides the user a powerful toolset to not only obtain system information, but can be used to automate identification and initialization of the instrumentation contained in the test system. For additional information about how to use the &lt;b&gt;HW&lt;/b&gt; driver and the &lt;b&gt;PCI/PXI Explorer&lt;/b&gt; Applet, review the &lt;b&gt;HW&lt;/b&gt; programming example installed with &lt;b&gt;ATEasy&lt;/b&gt; (Hw.prj) located in the ATEasy driver directory and the files installed the Program Files\Marvin Test Solutions\HW. In addition refer to the following knowledge base articles: &lt;a href='http://www.MarvinTest.com/KnowledgeBase/KBArticle.aspx?ID=273' target='_blank'&gt;Using HW PXI/PCI Explorer Applet&lt;/a&gt;, &lt;a href='http://www.MarvinTest.com/KnowledgeBase/KBArticle.aspx?ID=182' target='_blank'&gt;Scanning a PXI system to learn about system resources&lt;/a&gt; and &lt;a href='http://www.MarvinTest.com/KnowledgeBase/KBArticle.aspx?ID=187' target='_blank'&gt;Using an Alias to address PXI instruments&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200192/What-is-HW-driver</link><pubDate>6/1/2021</pubDate></item><item><title>Adding TCP/IP-based LAN buffer Peek and Flush to ATEasy WinSock Functions - Published on 6/1/2021</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;In order to assert more control in LAN data exchange, you may find it useful to peek at the available buffer data.&lt;br /&gt;&lt;br /&gt;Peeking doesn't empty the buffer as with the WsReceive ATEasy function. To maintain communication, you will eventually need to flush a buffer.&lt;br /&gt;&lt;br /&gt;This article discusses how to use &lt;b&gt;Windows Sockets 2 API&lt;/b&gt; in &lt;a href='http://www.marvintest.com/product/ateasy' target='_blank'&gt;ATEasy&lt;/a&gt; combined with ATEasy internal WinSock functions. &lt;br /&gt;&lt;br /&gt;The example shows how to set up a simple client-server connection to send, receive, peek and flush TCP/IP data. &lt;br /&gt;&lt;br /&gt;For more information on using DLLs,&amp;nbsp;&amp;nbsp;see ATEasy Help. In the example we use &lt;b&gt;Ws2_32.dll&lt;/b&gt; and the API defined in &lt;b&gt;Winsock2.h&lt;/b&gt;. See the &lt;b&gt;recv &lt;/b&gt;function as detailed here: &lt;a href='https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-recv' target='_blank'&gt;MSDN: recv function&lt;/a&gt;&lt;/td&gt;&lt;td&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;h3&gt;Creating a Server Socket and Connecting to the Client&lt;/h3&gt;You can create simple server and client sockets with ATEasy internal library WinSock functions. In this example the client and the server will run on the same machine and communicate with each other. You can also use the internal library to resolve the server IPv4 address to its handle to bind to the created server socket. Lastly, the server socket is set to listen and a separate thread for the client is created.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;! Create a server socket&lt;br /&gt;hServerSocket=WsCreate(aWsTcpIp, 0)&lt;br /&gt;&lt;br /&gt;! Bind to for example localhost --&gt; TCP socket 127.0.0.1:10&lt;br /&gt;lStatus=WsBind(hServerSocket, 10, WsGetNameAddress("127.0.0.1"))&lt;br /&gt;&lt;br /&gt;! Place socket to listen&lt;br /&gt;lStatus=WsListen(hServerSocket)&lt;br /&gt;&lt;br /&gt;! New thread to connect client and send test data&lt;br /&gt;CreateThread(ClientConnectAndSend, 1)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 1. Server socket creation, binding and setting to listen at example address "127.0.0.1:10". Client thread creation.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Creating a Client Socket and Connecting to the Server&lt;/h3&gt;The example uses a separate thread for the client. In the client's thread, a client socket is created and connected to the server. After connection, data packet "42\x0" with a null byte terminator is sent to the server.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;! Client socket created&lt;br /&gt;hClientSocket=WsCreate(aWsTcpIp, 0)&lt;br /&gt;&lt;br /&gt;! Connect client to server&lt;br /&gt;WsConnect(hClientSocket, 10, WsGetNameAddress("127.0.0.1"), lTimeout)&lt;br /&gt;&lt;br /&gt;! Send data&lt;br /&gt;lStatus=WsSend(hClientSocket, lTimeout,,"42\x0")&lt;br /&gt;m_bSent=True&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 2. Client socket creation, connection and sending bytes to server&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Creating a Client Socket and Connecting to the Server and Sending Data&lt;/h3&gt;Once the incoming client connection is accepted and data received, a null-terminated peek buffer is initialized with 1 kB of null bytes. The peeked data will be used to Pass/Fail the example's test. Note that ATEasy socket handle are the same as Windows socket handle and can be interchanged.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;! Accept incoming hServerSocket connection&lt;br /&gt;hPipe=WsAccept(hServerSocket, 10)&lt;br /&gt;&lt;br /&gt;! Wait until data is sent&lt;br /&gt;if hPipe&gt;0&lt;br /&gt;&amp;nbsp;&amp;nbsp; while m_bSent=False&lt;br /&gt;&amp;nbsp;&amp;nbsp; endwhile&lt;br /&gt;else&lt;br /&gt;&amp;nbsp;&amp;nbsp; TestStatus=ERR&lt;br /&gt;&amp;nbsp;&amp;nbsp; ExitTest&lt;br /&gt;endif&lt;br /&gt;! Allocate 1 kB for sPacket&lt;br /&gt;sPacket=Dupl("\x0",1024)&lt;br /&gt;&lt;br /&gt;! Peek (recv with MSG_PEEK flag) buffer data - not receiving data&lt;br /&gt;lStatus=recv(hPipe,sPacket, 1024, MSG_PEEK)&lt;br /&gt;if lStatus&lt;&gt;3 OR sPacket&lt;&gt;"42" &lt;br /&gt;&amp;nbsp;&amp;nbsp; TestStatus=FAIL&lt;br /&gt;endif	&lt;br /&gt;&lt;br /&gt;TestResult=sPacket&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 3. Accepting client connection and its sent data. Peeking the buffer with recv does not flush sent data from client.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Server Peeking and Receiving the Data&lt;/h3&gt;Once the data is peeked, the sent data can be received and flushed. Flushing can be done by receiving a byte of data at a time until none are available. One last peek is done to confirm no more data is available.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;! Receive data&lt;br /&gt;lStatus=WsReceive(hPipe, 1, ,sPacket, len(sPacket))&lt;br /&gt;if lStatus&lt;&gt;2 OR sPacket&lt;&gt;"42"	&lt;br /&gt;&amp;nbsp;&amp;nbsp; TestStatus=FAIL&lt;br /&gt;endif&lt;br /&gt;&lt;br /&gt;! Ensure buffer is empty - 1 byte at a time&lt;br /&gt;while lStatus&gt;0&lt;br /&gt;&amp;nbsp;&amp;nbsp; lStatus=WsReceive(hPipe, 1, ,sPacket, 1)&lt;br /&gt;endwhile&lt;br /&gt;&lt;br /&gt;! Peek (recv with MSG_PEEK flag) buffer data to ensure it has been emptied&lt;br /&gt;lStatus=recv(hPipe,sPacket, 1024, MSG_PEEK)&lt;br /&gt;if sPacket&lt;&gt;""&lt;br /&gt;&amp;nbsp;&amp;nbsp; TestStatus=FAIL&lt;br /&gt;endif&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 4. Once more ATEasy WinSock module is used to receive data. A peek is performed to confirm buffer is void of data&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;ATEasy provides an intuitive interface for conducting WinSock communication. Peeking and flushing sockets can be done with importing Windows Sockets 2 DLL &lt;b&gt;Ws2_32.dll&lt;/b&gt; by using the Winsock2 header per above mentioned MSDN. &lt;b&gt;Recv &lt;/b&gt;and &lt;b&gt;Recvfrom &lt;/b&gt;functions can be used to peek and flush sockets efficiently in ATEasy. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Example Files&lt;/h3&gt;ATEasy example project files used in this article:&lt;ul&gt;&lt;li&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200335\LanBufferPeekFlush.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;LanBufferPeekFlush&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200335/Adding-TCP-IP-based-LAN-buffer-Peek-and-Flush-to-ATEasy-WinSock-Functions</link><pubDate>6/1/2021</pubDate></item><item><title>TS-900 Load Board Design Considerations - Published on 6/1/2021</title><description>&lt;h3&gt;&lt;b&gt;TS-900 Load Board Design Considerations&lt;/h3&gt;&lt;/b&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;The load board used to interface the device under test (DUT) to the instruments in the TS-900 Semiconductor Test System is a critical component in the overall test system performance.&lt;br /&gt;&lt;br /&gt;The careful consideration of its design will allow consistent and repeatable test results increasing first pass yields and minimizing false failures, reducing the need for retesting failed devices and increasing test throughput. &lt;br /&gt;&lt;br /&gt;Designing the load board might look like a routine task that can be accomplished easily, however with new technologies and increasingly complex devices to be tested, there are many more issues to be considered when developing the design.&lt;br /&gt;&lt;br /&gt;Some factors that need to be considered early are board layout, parts placement, power planes and grounding. These factors all help minimize crosstalk, noise and current leakage issue and improve the electrical, signal performance and integrity.&lt;/td&gt;&lt;td&gt;[:+[+ts-900+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;			 &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200251\Load Board Picture.jpg" alt`=&amp;quot; border='0' /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;TS-900 Load Board&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;b&gt;The Device Under Test (DUT)&lt;/b&gt;&lt;/h3&gt;The first critical component in the design of the load board design is the DUT itself. Understand its characteristics; is it mixed signal, analog only or digital only? What are its power supply needs, single or multiple (analog and digital) supplies, ground pins – how many? In mixed signal devices the ground pins are usually separated into analog and digital grounds.&lt;br /&gt;&lt;br /&gt;Also important are clock requirements: single or multi clock; does the device requires operating with a crystal (internal oscillator), does it have a PLL (Phase Lock Loop) – what components are needed for the PLL to operate?&lt;br /&gt;&lt;br /&gt;In mixed signal and analog devices there might be outputs with high source impedance that requires buffering to prevent loading of the signal during operation. Also some inputs might require special signal conditioning for the DUT to operate correctly. Are there needs for pull-up or pull-down resistors, bypass capacitors, filtering?&lt;br /&gt;On devices with high power requirements, power dissipation will need to be addressed. Power supply requirements are critical and decoupling capacitors are essential for their operation.&lt;br /&gt;&lt;br /&gt;All of these issues require careful planning for the external components positioning, including relays to allow for connection and disconnection of components and instruments during testing. Understanding these requirements is critical for the load board lay out to maximize performance, signal integrity and minimize noise generation and crosstalk.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;&lt;b&gt;Test Socket&lt;/h3&gt;&lt;/b&gt;One of the most important components on the load board is the DUT socket. Its selection is critical to the overall performance of the load board and ultimately the test system. There are many different types of sockets from different manufacturers and selection will depend on several factors like: package type, frequency of operation, cost, contact type, contact material, DUT power requirements, temperature of operation, etc. The emphasis here is for reliability, the socket will be used tens of thousands if not hundreds of thousands of times, and it is the weakest link on the tester set up. During operation contacts are compressed and subject to wear, if used for temperature testing it sees extreme temperature variations, and debris and particles accumulates on its contacts after many insertions and removal of the DUT.&lt;br /&gt;&lt;br /&gt;These and other factors create an environment where the socket will begin to deteriorate causing intermittent contact failures and over time it will eventually fail. One option that should be investigated when selecting the socket is whether the different socket components (contactors, springs, housing) can be replaced in case of damage, this will allow you to repair a socket and keep maintenance costs down. Careful consideration to the selection of the DUT socket will help you minimize the impact of the socket on the overall reliability of the test system.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;b&gt;Load Board Design&lt;/h3&gt;&lt;/b&gt;When it comes to high speed digital devices the ideal characteristic impedance for the load board should be 50 ohms. When laying out the high speed signal traces maintaining 50 ohm impedance will increase the bandwidth of the signals and prevent mismatching. A practical rule to remember is that it takes about an inch of trace for every nanosecond of signal rise time, so for a 2 nanosecond rise time signal a trace greater than 2 inches must be considered to be a transmission line and should be treated as controlled impedance trace.&lt;br /&gt;&lt;br /&gt;A typical load board will have a minimum of 4 layers (see Fig. 1), high speed parallel signals and high speed clocks should be laid out first and should be as straight as possible from the source to the DUT pins; also try to reduce parallel trace runs, the longer they run side by side the more the propensity to have crosstalk between them. A good rule to follow is to have two times the width of the trace when routing signals close to each other. Signal traces should be equal length to minimize skew between signals, try to avoid running the signals through vias or minimize them as much as possible, they create impedance mismatches and degrade the signal integrity.&lt;br /&gt;&lt;br /&gt;Other things to avoid during layout are sharp 90 deg. angle corners in high speed traces, turn traces using two 45 deg corners; this will lower noise generation and improve signal integrity.&lt;br /&gt;&lt;br /&gt;If there is space available a highly effective technique for reducing crosstalk is to separate high speed signal traces (like high speed clock lines, reset or strobe signals) that run parallel to each other with a ground trace between them. This ground trace should be tied to the digital ground plane with vias at each end and at regular intervals, the closer the ground vias are to each other the lower the impedance of the ground trace, effectively creating a shield around the signal trace. If differential, high speed clock signals are involved, they should be routed together as a pairs with a ground trace between them and between other signals. &lt;br /&gt;Sometimes there are components that are needed for the operation of the DUT such as crystals for internal oscillators or more specific the loop capacitor for an internal PLL. These components are external to the DUT and should be placed as close to the pins they belong to as possible. Since they might be susceptible to noise pickup, they could be shielded using a guard ring trace around these components.&lt;br /&gt;&lt;br /&gt;A side effect of adding required components to the DUT (like pull-up or pull-down resistors, capacitors, etc) is how are you are going to test for the parameters on these pins when these components are connected to the DUT. Connecting instruments like source meters or DMMs to these pins will require a relay to disconnect these components during parameter measurements; a SPDT relay contact per pin and per component will allow you to connect and disconnect the instrument and component during tests and operation. The relay common (C) terminal should be connected to the DUT pin; the normally closed (NC) terminal should be connected to the component while the instrument will be connected to the normally open (NO) terminal. Typical relays used should be small signal relays with low capacitance and high signal bandwidth like the Coto 2200 series, Omron G6K series, NEC Tokin UA2/UB2 series, Panasonic GQ (AGQ) series etc.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;b&gt;Load Board Layout&lt;/h3&gt;&lt;/b&gt;Typically, when laying out the traces for high speed signals, is better not to introduce stubs. These stubs act like antennas, they create impedance mismatch and degrade performance by either generating or picking up noise. Also, it is usually not a good layout rule to take off and route a signal perpendicular from a trace to connect it to a component, pin or trace, maintain the physical trace continuity from beginning to end.&lt;br /&gt;&lt;br /&gt;Power supply pin decoupling capacitors should be placed as close to the supply pin as possible using quality ceramic surface mount capacitors; DUT ground pins should be connected directly to the ground plane, avoid running a ground trace from a via to the DUT ground pin; this also applies to the ground connections for bypass capacitors. The rule here is to keep ground connections short.&lt;br /&gt;&lt;br /&gt;Whenever possible power supply traces to the DUT pins should be wider than normal, 2x to 3x wider; this lowers the impedance to the power supply and improves current carrying capability.&lt;br /&gt;&lt;br /&gt;On a mixed signal device, the analog and digital power planes should be split (see Fig. 2) to separate the noise generating digital domain from the noise sensitive analog domain. Lay out analog signals on top of the analog power plane and digital signals on top of the digital power plane, this will maintain the return signal currents on top of its corresponding power plane minimizing noise coupling and generation.&lt;br /&gt;&lt;br /&gt;It is important to understand that even with low speed mixed signal devices, with today’s fast digital circuitry it is the fast edge rates (rise and fall) and not the frequency of the signal that are the cause of noise generation.&lt;br /&gt;&lt;br /&gt;When dealing with sensitive analog pins is important to keep this digital noise away from them. Noise immunity from this digital noise is achieved by separating the digital signals away from the analog traces during the layout process. PCB traces that carry analog signals to high impedance analog inputs should be completely separated from running next to digital traces to prevent noise coupling. If, because layout constrains, the two types of signals must be close to each other then isolating the analog trace with ground traces between them would improve noise immunity considerably.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;b&gt;Power Supplies and Ground Planes&lt;/h3&gt;&lt;/b&gt;During lay out of a mixed signal load board any component, including buffers, op amps, analog power supply pins that are part of the analog portion of the DUT should be connected to the analog supply power plane. Any digital supply pin and any digital circuit or components should be connected to the digital supply power plane; do not mix components from the two different power planes. The digital output pins generate fast current transients every time their outputs toggle creating noise that couples to the power lane, you want to keep these transient away from the analog power supply plane and prevent the injecting noise into the analog circuitry.&lt;br /&gt;&lt;br /&gt;Decoupling capacitors, typically up to 100 KHz use electrolytic caps, from 100 KHz to about 10 to 15 MHz use 0.1uf, from 15 MHz to 100 MHz use 0.01uf and above 100 MHz a combination of 0.001uf with the PCB power and ground planes would be good a compromise; use good quality capacitors, Tantalum for the electrolytic caps and specially the ceramic caps should be surface mount. When decoupling the power supply pins on both analog and digital supply pins, place the caps as close the pins as possible and the&amp;nbsp;&amp;nbsp;cap’s ground connection should be directly to ground, avoid connecting to ground through a trace and a via. On high power devices include a quality tantalum capacitor in parallel with the ceramic capacitor to supply the current demand for the device.&lt;br /&gt;&lt;br /&gt;On a four layer board, the two internal layers are usually the power and ground layers while the two outside layers are used for signal routing. The power planes for a mixed signal device load board should be split between an analog supply plane and a digital supply plane (see Fig.2). It is necessary that at least one layer of the load board be dedicated to a solid ground plane. Source Power Supply ground connections (both analog and digital supply grounds) to the ground plane or planes should be made at one point or location.&lt;br /&gt;&lt;br /&gt;The following figure shows the typical arrangement of the load board layers. When more than 4 layers are needed, add alternate ground and signal planes on the bottom of the load board. All the ground planes should be connected together to the power supply grounds with heavy, low impedance connections.&lt;br /&gt;&lt;br /&gt;			&lt;div align='center'&gt; &lt;img src="https://www.MarvinTest.com/images/support/Q200251\Load Board layers.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The signal routing for the digital traces and any digital signal or component should be routed over the digital power plane on the top signal layer, while any analog signal traces or analog components should be routed over the analog power plane on the top signal layer.&lt;br /&gt;&lt;br /&gt;			&lt;div align='center'&gt; &lt;img src="https://www.MarvinTest.com/images/support/Q200251\DUT Power Plane.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The reason for routing analog signals and digital signals on top of their corresponding power planes has to do with the return paths the currents take on the PCB. Any time a signal travels down a PCB trace a corresponding return current is generated. The path this return current takes is mostly dependent on the resistance (takes the path of least resistance) of the PCB plane for DC and low frequency signals, in this case they literally go in a straight line from source to load and back. As the frequency of the signal increases (around 1 MHz and above) the path the return current takes is mostly concentrated under the original signal trace (takes the path of less inductance), this is called the “proximity effect” and it follows the trace as it is laid out on the PCB. In reality the process is somewhat more complicated than this and includes several variables that affect it, but in general and what concern us here are the current return paths especially for digital signals.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;For any digital signal that is routed on the top layer and crosses the power planes split line, you should include locations to add capacitors between each power plane and ground close to where the signal crosses the power planes. These capacitors allow for the return currents, which flow on the plane adjacent to the trace, to pass across the power planes close to where the signal crosses the power plane split (see Fig. 3). The reason for two capacitors is to minimize the possibility of coupling digital noise between the two planes.&lt;br /&gt;&lt;br /&gt;Sometimes this might not be necessary because there may be a short return current path that somewhere we cannot see. So, it is generally good to lay out your board for use of these capacitors, and then test for differences in signal integrity with and without these capacitors in place. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200251\Return Currents.jpg" alt`=&amp;quot; border='0' /&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;The bottom layer signal routing does not need to follow this restriction since the ground plane is next to the signal layer providing a return path for the currents and shielding any noise from the power planes. Keeping the correct signal routing above their respective power plane will minimize the current loops that degrade signal integrity.&lt;br /&gt;&lt;br /&gt;Use separate power sources for each power supply plane. Use a linear output power supply for the analog supply because mixed signal devices do not behave well with the high frequency supply noise generated by switching supplies.&lt;br /&gt;&lt;br /&gt;Sometimes you have to deal with a high output impedance analog pin that have to drive external circuitry, in this situation it necessary to buffer the output signal using an op-amp (with low input bias currents) to be able to drive the circuitry without unnecessarily loading the signal down; if an op-amp is used, a relay might need to be added between the DUT pin and the op-amp to allow parametric testing of the DUT pin. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;b&gt;Other DUT Testing Equipment&lt;/h3&gt;&lt;/b&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;At some point it might be necessary to connect the TS-900 tester to either a wafer prober or a packaged part device handler. In this case a new load board will be designed with connectors for the wire harnesses used to connect the tester to the equipment. The wire harness should be built for high frequency, with 50 ohms impedance coaxial wires and connectors to maximize signal integrity and minimize noise pick up.&lt;br /&gt;&lt;br /&gt;You should apply the same mixed signal design criteria when designing a load board for mixed signal device testing in a handler or prober as you would for a normal load board. The same separation of the power planes should apply here. Keeping the digital and analog signals separate in the wire harness will allow you to route the signals at the connector location into separate power planes.&lt;br /&gt;&lt;br /&gt;Unless there is a direct docking between the TS-900 and the handler, a DUT interface card for the handler will have to be designed to accommodate the wire harness connectors, any critical external components and the handler contactor needed to test the DUT. &lt;/td&gt;&lt;td&gt;[:+[+ts-900e-5g+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;b&gt;Conclusions&lt;/h3&gt;&lt;/b&gt;&lt;ul&gt;&lt;li&gt;Use a solid, single layer ground plane. Do not split the ground plane. Use the thickest cooper metal planes as feasible. It reduces inductance and resistance to connections.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Split the power planes; keep all power planes in the same board layer. There should be a power plane for the analog circuitry and a power plane for the digital circuits. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Locate all analog components and traces over the analog power plane and all digital components and traces over their respective digital power plane. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Trace width should remain constant throughout the length of the trace.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Use separate power sources for each plane. It is best to use a linear voltage regulator for the analog power source because analog and mixed signal devices do not behave well with the high frequency supply noise produced by switching supplies. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Signal that cross the split between power planes should include locations to add capacitors between each power plane and ground. Locate these capacitors very close to the signal lines and the power plane split. Add these capacitors if during test, the signal generates unwanted noise.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;If the DUT has multiple ground pins, connect all of them to the ground plane. The same is applicable to the&amp;nbsp;&amp;nbsp; + or - power supply pins; each supply pin needs to be connected to its appropriate supply plane and decoupled with capacitors to ground.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Decoupling capacitors should be positioned next to the power supply pins and connected directly to the ground plane. A good rule is to use high quality ceramic, surface mount, capacitors, 0.1uf when frequencies involved are below 10 MHz, 0.01uf frequencies are above 10 MHz and 0.001uf for 100 MHz and above; for High Current devices add a quality Tantalum capacitor in parallel with the ceramic capacitor.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;If, because of layout constraints, you are running analog and digital signals parallel to each other, try to separate them with a ground trace; tie this ground trace at both ends and at multiple points in between to the ground plane to shield the signals.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Use vias only when absolutely necessary. Avoid the use of vias when routing high frequency signals.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The distance between traces running in parallel should be equal to two trace widths when routing signals close to each other.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Always follow the currents. We are dealing with circuits here and the current always flows from a source to the load and then back via a return path. Keeping track of where the current flows and how it flows is essential in making the load board work well.&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200251/TS-900-Load-Board-Design-Considerations</link><pubDate>6/1/2021</pubDate></item><item><title>How to modify the ATEasy Test Log output - Published on 6/1/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;This article covers the following Log file subjects:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;How to set the Log format to HTML or Text&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;How to modify the ATEasy Log strings&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;How to change the TestLog Company Logo&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;How to change the position of the TestLog Company Logo&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;How to add additional information to the TestLog&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Note:&lt;br /&gt;An ATEasy application (Q200188.zip) that demonstrates how to adjust the various TestLog settings, shown here, can be downloaded by clicking on this link &lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200188.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Q200188.zip&lt;/a&gt;&lt;/td&gt;&lt;td&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;h3&gt;Setting the ATEasy Log Format&lt;/h3&gt;The ATEasy Log format can be set to either HTML or Text as follows:&lt;ul&gt;&lt;li&gt;In the ATEasy Menu go to the Tools..Options. In the Log tab check the "Use the HTML format as default" box to set the output to HTML. If the box is not checked the output will be Text mode.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;In the Test Executive similar example exist in the Options, Customize or Users forms.&lt;/li&gt;&lt;/ul&gt; &lt;ul&gt;&lt;li&gt;The format can also be changed at runtime by setting the PlainText property of the internal variable &lt;b&gt;Log&lt;/b&gt;. The PlainText property can be used to set a value that determines whether the log file will be displayed and opened as either text or HTML. It can also be used to check if the log file is set to HTML or Text mode. See ALog control, PlainText and "Log Window, Using the Log, TestLog, and DebugLog Internal Variables" in ATEasy Help for more information:&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Example&lt;/b&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;!Adding the following statement to the System.OnInitSystem() event &lt;br /&gt;!sets the log format to plain text&lt;br /&gt;Log.PlainText=True&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;How to modify ATEasy Log strings&lt;/h3&gt;The following example shows how to remove the Signature line from the ATEasy TestLog output. Similiar approaches can be used to modify/remove other log string components. Note: The code shown in this example is given in the ModifyTestLogFooter() System procedure in the accompanying ATEasy application.&lt;br /&gt;&lt;br /&gt;The following example is written around three ATEasy procedures&lt;br /&gt;1) GetLogString()&lt;br /&gt;2) Replace()&lt;br /&gt;3) SetLogString()&lt;br /&gt;&lt;br /&gt;1) GetLogString(): While ATEasy is executing Event procedures GetLogString() retrieves the current Log string. The contents of the Log string for the different Event procedures are shown below. See ATEasy Help for more information.&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;Module Event&lt;/th&gt;&lt;th&gt;GetLogString() returns&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;OnInitSystem&lt;/td&gt;&lt;td&gt;The application top header includes the company logo &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;OnInitProgram / Program.OnInit&lt;/td&gt;&lt;td&gt;The serial number and the start time.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;OnInitTask&lt;/td&gt;&lt;td&gt; The task header.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;OnEndTest&lt;/td&gt;&lt;td&gt;The test log line (MIN/MAX, RESULT, etc.), including the test table header if required.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;OnEndProgram / Program.OnEnd&lt;/td&gt;&lt;td&gt;The stopped time, elapsed time, UUT status, Signature&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;2) Replace(): Replace() returns a string in which a specified substring has been replaced with another substring. See ATEasy Help for more information.&lt;br /&gt;&lt;br /&gt;3) SetLogString(): This procedure is used to set the next log string used by ATEasy. Setting the log string inside a test will cause ATEasy to output the string after the OnEndTest event is called. See ATEasy Help for more information.&lt;br /&gt;&lt;br /&gt;As you can see from Item1 above, to modify the Signature line the following code will need to be added to the System.OnEndProgram() event or if the Test Excutive driver is being used it will need to be added to the beginning of the TestExec.OnEndProgram() event:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example&lt;/b&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;s:string! String used to store the Log string&lt;br /&gt;sSub:string! String used to store the line to be removed &lt;br /&gt;&lt;br /&gt;s=GetLogString()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Get the current log string&lt;br /&gt;if Log.PlainText=TRUE then&amp;nbsp;&amp;nbsp;! Check to see which log format is being used&lt;br /&gt;&amp;nbsp;&amp;nbsp; !If the log format is Plain Text then remove this line&lt;br /&gt;&amp;nbsp;&amp;nbsp; sSub="Signature&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;: ...................."&lt;br /&gt;else&lt;br /&gt;&amp;nbsp;&amp;nbsp; !If the log format is HTML then remove this line&lt;br /&gt;&amp;nbsp;&amp;nbsp; sSub="&lt;TR&gt;&lt;TD width=15% align=left&gt;Signature&lt;TD width=85% "&amp;nbsp;&amp;nbsp;\&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "align=left&gt;: __________________________________"&lt;br /&gt;endif&lt;br /&gt;s=Replace(s, sSub,"",,,True)! Remove the string sSub from the original log string &lt;br /&gt;SetLogString(s)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! Set the new log string&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;How to change the TestLog Company Logo&lt;/h3&gt;Note: See ChangeCompanyLogo() System procedure in the accompanying ATEasy application&lt;br /&gt;&lt;br /&gt;There are two ways of replacing the company logo:&lt;ul&gt;&lt;li&gt;The quick solution is to save your company logo to the same size as the built in image (103x44) and copy it to C:\Program Files\ATEasy\CompanyLogo.gif.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Alternatively, you can change the default Company Logo file location. To do this you will need to change the HTML header that is output to the test log after OnInitSystem is called. You can do that by calling GetLogString(), modifying the return string with your own file location and then calling SetLogString().&lt;br /&gt;To view the original string you can right click on your log window and select View Source. Then look for CompanyLogo.gif, you will need to modify the table around it.&lt;/li&gt;&lt;/ul&gt; &lt;br /&gt;Notes:&lt;ul&gt;&lt;li&gt;1) If your company logo file is larger than 103x44 you will have to change the Right and Left Width values to adjust the location of the logo&lt;br /&gt;2) If you are using the Test Exec you will need to use the following command to set the string (instead of Get/SetLogString):&lt;/li&gt;&lt;/ul&gt;&lt;div class='fixedFont'&gt;TestExec Log Set InitialString()&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example&lt;/b&gt;: &lt;br /&gt;&lt;div class='fixedFont'&gt;s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:string&amp;nbsp;&amp;nbsp;! String used to store the Log string&lt;br /&gt;sSub&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :string&amp;nbsp;&amp;nbsp;! String used to store the line to be removed &lt;br /&gt;sFileLoc&amp;nbsp;&amp;nbsp;:string&amp;nbsp;&amp;nbsp;! String used to store new Logo image file location&lt;br /&gt;&lt;br /&gt;s=GetLogString()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Get the current log string&lt;br /&gt;sSub="C:\\Program Files\\ATEasy\\CompanyLogo.gif" !This is the default Logo image file location&lt;br /&gt;s=Replace(s, sSub,sFileLoc,,,True)&amp;nbsp;&amp;nbsp; ! Add in the new Logo location &lt;br /&gt;SetLogString(s)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! Set the new log string&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;How to change the position of the TestLog Company Logo&lt;/h3&gt;Note: See ChangeCompanyLogo() System procedure in the accompanying ATEasy application.&lt;br /&gt;As before you will need to change the HTML header that is output to the test log after OnInitSystem is called. You can do that by calling GetLogString(), modifying the return string with your new settings and then calling SetLogString(). To view the original string you can right click on your log window and select View Source. Then look for your company logo image filename, you will need to modify the table arround it.&lt;br /&gt;The logo can be shifted horizontally adjusting the LEFT and RIGHT Width settings and by using the HSPACE attribute.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example&lt;/b&gt;: &lt;br /&gt;&lt;div class='fixedFont'&gt;s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :string&amp;nbsp;&amp;nbsp;! String used to store the Log string&lt;br /&gt;sSub&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:string&amp;nbsp;&amp;nbsp;! String used to store the line to be removed &lt;br /&gt;sNewStr:string&amp;nbsp;&amp;nbsp;! String used to store new Logo position&lt;br /&gt;&lt;br /&gt;s=GetLogString()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Get the current log string&lt;br /&gt;sSub="&lt;TD Width=65% ALIGN=LEFT&gt;: &lt;TD ALIGN=RIGHT WIDTH=20% ROWSPAN=4&gt; " \ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&lt;IMG SRC=\"File:C:\\Program Files\\ATEasy\\CompanyLogo.gif\"&gt;"&lt;br /&gt;sNewStr="&lt;TD Width=20%ALIGN=LEFT&gt;:&lt;TD ALIGN=RIGHT WIDTH=40%ROWSPAN=4&gt;"&amp;nbsp;&amp;nbsp;\&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"&lt;IMG SRC=\"File:C:\\Program Files\\ATEasy\\CompanyLogo.gif\"HSPACE=100&gt;"&lt;br /&gt;s=Replace(s, sSub,sNewStr,,,True)! Add in the new Logo position in the Test Log&lt;br /&gt;SetLogString(s)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! Set the new log string&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;How to insert additional information to the TestLog&lt;/h3&gt;Additional information can be added to the TestLog by using the Append() procedure. This statement appends a message to the log string that ATEasy generates. For example, running an Append statement from a test will print its message after test results instead of ahead of them. See ATEasy Help for more information. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example&lt;/b&gt;:&lt;br /&gt;&lt;div class='fixedFont'&gt;DMM Measure (TestResult)&lt;br /&gt;if (TestResult&lt;Test.min)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Append "Result too low - check circuit X"&lt;br /&gt;elseif (TestResult&gt;Test.max)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Append "Result too high - check circuit Y"&lt;br /&gt;endif&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200188/How-to-modify-the-ATEasy-Test-Log-output</link><pubDate>6/1/2021</pubDate></item><item><title>Programming GX1110 for AM and FM Modulation - Published on 6/1/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;Introduction&lt;/b&gt;:&amp;nbsp;&amp;nbsp;The GX1110 is a 100 MHz, single-channel PXI Arbitrary Waveform Generator (AWG) that can also operate as a function generator with Direct Digital Synthesis (DDS) of the clocking resource.&amp;nbsp;&amp;nbsp;Built-in waveforms are available for use with both the DDS or AWG modes of operation and include Sine, Triangle, Ramp, Noise, Gaussian pulse and Sinx/x. &lt;br /&gt;&lt;br /&gt;The GX1110 can apply either Amplitude Modulation (AM) or Frequency Modulation (FM) to the carrier waveform using either an internal modulation source or an external modulation signal.&lt;br /&gt;&lt;br /&gt;This article demonstrates how to program the GX1110 to generate AM and FM signals using an internal modulation source.&amp;nbsp;&amp;nbsp;The modulating signal has three parameters that define its characteristics.&lt;br /&gt;&lt;br /&gt;For AM, those parameters are the modulation frequency, the modulation amplitude and the modulation waveform.&lt;br /&gt;&lt;br /&gt;For FM, the parameters are modulation frequency, deviation and modulation waveform.&lt;/td&gt;&lt;td&gt;[:+[+gx1110+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Specifications for the modulation parameters are:&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;Modulation Parameters:&lt;blockquote&gt;Source:		Internal or External&lt;br /&gt;Frequency:		0 Hz - 20 KHz&lt;br /&gt;AM Amplitude:	0% - 100%&lt;br /&gt;FM Deviation:		0% - 100%&lt;br /&gt;Waveform:		Sine, Square, Triangle, Ramp Up, Ramp Down, Noise&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Program Examples:&amp;nbsp;&amp;nbsp;The following ‘C’ code sets the GX1110 to generate a &lt;br /&gt;100.0 KHz carrier signal with a 5.0V amplitude, and defines the modulation to be FM, 16.0 KHz modulation frequency and a 20.0 KHz frequency deviation.&amp;nbsp;&amp;nbsp;The resulting waveform is shown in figure 1.&lt;br /&gt;&lt;div class='fixedFont'&gt;// Initialize the GX1110 in slot #6&lt;br /&gt;	GtWaveInitialize(6,&amp;nHandle,&amp;nStatus);&lt;br /&gt;// Reset the GX1110&lt;br /&gt;	GtWaveReset(nHandle,&amp;nStatus);&lt;br /&gt;// Set the GX1110 to Function Generator mode&lt;br /&gt;	GtWaveSetOperationMode(nHandle,GTWAVE_OPERATING_MODE_FUNC,&amp;nStatus);&lt;br /&gt;// Set output to 5.0V, Enabled, Sine Wave, 100.0 KHz Frequency&lt;br /&gt;	GtWaveSetAmplitude(nHandle,GTWAVE_CHANNEL_A,5.0,&amp;nStatus);&lt;br /&gt;	GtWaveSetOutputState(nHandle,GTWAVE_CHANNEL_A,True,&amp;nStatus);&lt;br /&gt;	GtWaveFuncSetWaveform(nHandle,GTWAVE_CHANNEL_A,GTWAVE_WAVEFORM_SINE,&amp;nStatus);&lt;br /&gt;	GtWaveFuncSetFrequency(nHandle,GTWAVE_CHANNEL_A,1.0E5,&amp;nStatus);&lt;br /&gt;// Set FM modulation source to internal&lt;br /&gt;	GtWaveFuncGetFmSource(nHandle,GTWAVE_CHANNEL_A,GTWAVE_FUNC_FM_SOURCE_INTERNAL, &amp;nStatus)&lt;br /&gt;//&amp;nbsp;&amp;nbsp;Set modulation to FM Sine Wave, 16 KHz Modulation, 20.0 KHz Deviation&lt;br /&gt;	GtWaveFuncSetFmWaveform(nHandle,GTWAVE_CHANNEL_A,GTWAVE_WAVEFORM_SINE,&amp;nStatus);&lt;br /&gt;	GtWaveFuncSetFmFrequency(nHandle,GTWAVE_CHANNEL_A,16.0E3,&amp;nStatus);&lt;br /&gt;	GtWaveFuncSetFmDeviation(nHandle,GTWAVE_CHANNEL_A,20.0E3,&amp;nStatus);&lt;br /&gt;//&amp;nbsp;&amp;nbsp;Enable FM modulation&lt;br /&gt;	GtWaveFuncSetFmState(nHandle,GTWAVE_CHANNEL_A,True,&amp;nStatus);&lt;br /&gt;// Set the GX1110 to Run state&lt;br /&gt;	GtWaveRun(nHandle,GTWAVE_CHANNEL_A,&amp;nStatus);&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200222\FM_Triang_01.bmp" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;/div&gt;&lt;div align='center'&gt;Figure 1:&amp;nbsp;&amp;nbsp;Frequency Modulation Waveform&lt;/div&gt;&lt;br /&gt;The following ‘C’ code sets the GX1110 to generate a 1.4 KHz carrier signal with a 5.0V amplitude, and defines the modulation to be AM, 50.0 Hz modulation frequency and&amp;nbsp;&amp;nbsp;100% modulation level.&amp;nbsp;&amp;nbsp;The resulting waveform is shown in figure 2.&lt;br /&gt;&lt;div class='fixedFont'&gt;// Initialize the GX1110 in slot #6&lt;br /&gt;	GtWaveInitialize(6,&amp;nHandle,&amp;nStatus);&lt;br /&gt;// Reset the GX1110&lt;br /&gt;	GtWaveReset(nHandle,&amp;nStatus);&lt;br /&gt;// Set the GX1110 to Function Generator mode&lt;br /&gt;	GtWaveSetOperationMode(nHandle,GTWAVE_OPERATING_MODE_FUNC,&amp;nStatus);&lt;br /&gt;// Set output to 5.0V, Enabled, Sine Wave, 1.4 KHz Frequency&lt;br /&gt;	GtWaveSetAmplitude(nHandle,GTWAVE_CHANNEL_A,5.0,&amp;nStatus);&lt;br /&gt;	GtWaveSetOutputState(nHandle,GTWAVE_CHANNEL_A,True,&amp;nStatus);&lt;br /&gt;	GtWaveFuncSetWaveform(nHandle,GTWAVE_CHANNEL_A,GTWAVE_WAVEFORM_SINE,&amp;nStatus);&lt;br /&gt;	GtWaveFuncSetFrequency(nHandle,GTWAVE_CHANNEL_A, 1.4E3,&amp;nStatus);&lt;br /&gt;//&amp;nbsp;&amp;nbsp;Set modulation to AM Sine Wave, 50 Hz Modulation, 100% Amplitude&lt;br /&gt;	GtWaveFuncSetFmWaveform(nHandle,GTWAVE_CHANNEL_A,GTWAVE_WAVEFORM_SINE,&amp;nStatus);&lt;br /&gt;	GtWaveFuncSetFmFrequency(nHandle,GTWAVE_CHANNEL_A,50,&amp;nStatus);&lt;br /&gt;	GtWaveFuncSetFmDeviation(nHandle,GTWAVE_CHANNEL_A,20.0E3,&amp;nStatus);&lt;br /&gt;//&amp;nbsp;&amp;nbsp;Enable FM modulation&lt;br /&gt;	GtWaveFuncSetFmState(nHandle,GTWAVE_CHANNEL_A,True,&amp;nStatus);&lt;br /&gt;// Set the GX1110 to Run state&lt;br /&gt;	GtWaveRun(nHandle,GTWAVE_CHANNEL_A,&amp;nStatus);&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200222\AM_Sine_01.bmp" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;/div&gt;&lt;div align='center'&gt;Figure 2:&amp;nbsp;&amp;nbsp;Amplitude Modulation Waveform&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200222\AM_Triang_01.bmp" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;/div&gt;&lt;div align='center'&gt;Figure 2:&amp;nbsp;&amp;nbsp;Amplitude Modulation Waveform&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200222\AM_RampUp_01.bmp" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;/div&gt;&lt;div align='center'&gt;Figure 2:&amp;nbsp;&amp;nbsp;Amplitude Modulation Waveform&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200222/Programming-GX1110-for-AM-and-FM-Modulation</link><pubDate>6/1/2021</pubDate></item><item><title>How to use Microsoft Visual Studio to debug a DLL function called from ATEasy - Published on 6/1/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;ATEasy is capable of interfacing with and calling external libraries such as DLL, .NET assemblies and ActiveX components.&lt;br /&gt;&lt;br /&gt;Sometimes it is necessary and useful to be able to debug and step into the code that resides in the external library. The procedure described here demonstrates debugging a C/C++ DLL debugged in Visual Studio 2005 . A similar approach can be done to debug ActiveX or .NET assembly and other development environments than Visual Studio (for example LabWindows /CVi).&lt;br /&gt;&lt;br /&gt;Follow these steps to debug your DLL using Visual Studio:&lt;br /&gt;&lt;br /&gt;1. Compile your DLL project within Visual Studio C++ in &lt;b&gt;Debug mode&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;2. Set the Visual Studio DLL project debug &lt;b&gt;Command&lt;/b&gt; to ATEasy (ATEasy.exe) and the &lt;b&gt;Working Directory&lt;/b&gt; to the ATEasy directory path (by default: &lt;br /&gt;C:\Program Files\ATEasy\):&lt;br /&gt;&lt;/td&gt;&lt;td&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200219\DLLDebug1.JPG" alt="Visual Studio Debugger Property Page" title="Visual Studio Debugger Property Page" border='0' &gt;&lt;br /&gt;&lt;br /&gt;3. Place a breakpoint in the DLL source in the function ATEasy will call .&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200219\DLLDebug2.JPG" alt="Visual Studio Debugger Break Point" title="Visual Studio Debugger Break Point" border='0' &gt;&lt;br /&gt;&lt;br /&gt;4. Begin a debug session from within Visual Studio. This should result in ATEasy being started by visual studio debugger:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200219\DLLDebug3.JPG" alt="Visual Studio Debugge Runr" title="Visual Studio Debugge Runr" border='0' &gt;&lt;br /&gt;&lt;br /&gt;5. Make sure your ATEasy module library points to the debug version of the DLL file:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200219\DLLDebug6.JPG" alt="ATEasy DLL Path" title="ATEasy DLL Path" border='0' &gt;&lt;br /&gt;&lt;br /&gt;6. In ATEasy, run the DLL function using &lt;b&gt;DoIt&lt;/b&gt; or &lt;b&gt;Start&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200219\DLLDebug4.JPG" alt="ATEasy DoIt Start" title="ATEasy DoIt Start" border='0' &gt;&lt;br /&gt;&lt;br /&gt;7. The Visual Studio IDE should be paused when the breakpoint set earlier is reached. The debugger can now be used to step through the code:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200219\DLLDebug5.JPG" alt="Visual Studio Debugger Step Through Code" title="Visual Studio Debugger Step Through Code" border='0' &gt;&lt;br /&gt;&lt;br /&gt;8. You can confirm that the correct DLL is loaded by going to &lt;b&gt;Debug &lt;/b&gt;| &lt;b&gt;Windows &lt;/b&gt;| &lt;b&gt;Modules&lt;/b&gt; from the Visual Studio file menu:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/\Q200219\DLLDebug7.JPG" alt="Visual Studio Debugger Modules" title="Visual Studio Debugger Modules" border='0' &gt;</description><link>https://www.MarvinTest.com/KB/Q200219/How-to-use-Microsoft-Visual-Studio-to-debug-a-DLL-function-called-from-ATEasy</link><pubDate>6/1/2021</pubDate></item><item><title>Using the GX5296 to Emulate the SPI Bus - Published on 6/1/2021</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;The use of digital test instruments for emulating common serial bus protocols can provide benefits over dedicated bus test products and often presents a trade-off between functionality, flexibility and cost. For example, a dedicated test instrument solution can offer more extensive test capabilities such as protocol support for controlling and analyzing traffic between a bus controller and a device under test.&lt;br /&gt;&lt;br /&gt;However, a dynamic digital solution using the GX5296 can offer the flexibility to adapt to nonstandard line rates and timing as well as supporting other digital test needs such as multi-site test capability, analog testing and the ability to test the connectivity of the Device Under Test (DUT) to the test system. Ultimately, the goal is to identify those instances where the clever or novel application of a digital test tool is appropriate and provides tangible benefits.&lt;br /&gt;&lt;br /&gt;This paper presents an overview of how the rich feature set of the GX5296 dynamic digital I/O instrument can be used to support SPI serial bus interfaces. By using this dynamic test solution, users can potentially realize a lower cost compact test system solution with similar capabilities of the “Big Iron” test systems of the past, along with providing a common user control interface and expandability for future requirements.&lt;/blockquote&gt; &lt;br /&gt;&lt;/td&gt;&lt;td&gt;[:+[+gx5296+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;The &lt;b&gt;Serial Peripheral Interface&lt;/b&gt; (SPI) bus is a synchronous serial communications interface specification used for short distance communication. Refer to the block diagram shown in &lt;b&gt;Figure 1&lt;/b&gt;. SPI devices communicate in full duplex mode and use a master-slave configuration. Multiple slaves can be selected by using individual slave select lines. The basic SPI bus specifies four logic signals:&lt;br /&gt;&lt;blockquote&gt;•	&lt;b&gt;SCLK &lt;/b&gt;: Serial Clock (output from master)&lt;br /&gt;•	&lt;b&gt;MOSI &lt;/b&gt;: Master Output, Slave Input (output from master)&lt;br /&gt;•	&lt;b&gt;MISO &lt;/b&gt;: Master Input, Slave Output (output from slave)&lt;br /&gt;•	&lt;b&gt;SS &lt;/b&gt;: Slave Select (Active low, output from master)&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200275\BlockDiagram 2.png" alt="SPI Bus Block Diagram" title="SPI Bus Block Diagram" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1: SPI Bus Block Diagram&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Refer to &lt;b&gt;Figure 2&lt;/b&gt;, the SPI bus master configures the clock polarity and clock phase with respect to the data. These are referred to as &lt;b&gt;CPOL &lt;/b&gt;for the polarity setting and &lt;b&gt;CPHA &lt;/b&gt;for the clock transition setting. The following example illustrates how the rich feature set of the GX5296 can be set up to test a SPI bus in any configuration. For our example the GX5296 is configured to simulate a master testing a slave in a CPOL=0 and CPHA=0 configuration.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200275\Clock Polarity and Phase Timing Diagram 2.png" alt="Clock Polarity and Phase Timing Diagram" title="Clock Polarity and Phase Timing Diagram" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 2: Clock Polarity and Phase Timing Diagram&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;GX5296 Using GtDio6x Software&lt;/h3&gt;The GX5296 is supplied with &lt;b&gt;Dio6xEasy &lt;/b&gt;- graphical vector development / waveform display tools, &lt;b&gt;GtDio6x-FIT&lt;/b&gt; - File Import toolkit (optional) as well as a virtual instrument panel - &lt;b&gt;GtDio6x-Panel&lt;/b&gt;, 32 / 64-bit DLL driver libraries, and documentation. The GtDio6x virtual panel can be used to interactively control and monitor the instrument from a window that displays the instrument’s current settings and status. In addition, various interface files provide access to the instrument’s function library for programming tools and languages such as ATEasy, C/C++, Microsoft Visual Basic®, Delphi, and LabVIEW. &lt;br /&gt;&lt;br /&gt;Our example focuses on using the GtDio6x-Panel (software virtual panel) launched from the desktop, or by selecting the program from Windows Start menu. It is recommended that most of the GX5296 setup be performed using the panel and saved to a file. This provides the simplest method to set up and or reuse test conditions.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;DIO to UUT Connections&lt;/h3&gt;The GX5296 DIO connections to the unit under test (UUT) are as follows: channel 0 is connected to the SCLK pin, channel 1 is connected to the master out (MOSI) pin, channel 2 is connected to the slave input (MISO) pin and channel 3 is connected to the slave select (SS_L) pin.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Channels Setup&lt;/h3&gt;As CPOL and CPHA are set to zero, SCLK is a positive edge clock and data is captured on the clock's positive transition. To achieve the positive edge clock required for this example, the SCLK channel is set to the &lt;b&gt;Return To One&lt;/b&gt; data format. If CPOL is set to one SCLK would be a negative edge clock and therefore the channel would need to be set to the &lt;b&gt;Return To Zero&lt;/b&gt; data format. All other channels are set to the “No Return” data format, as these pins will not need to change within the timing period. &lt;br /&gt;&lt;br /&gt;Before beginning the instrument setup, reset the GX5296 instrument by pressing the reset button on the panel. To configure the GX5296 channels select the channels page. Refer to &lt;b&gt;Figure 3&lt;/b&gt; below and make the following settings. After each selection has been made, press the &lt;b&gt;Apply Settings&lt;/b&gt; button.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Set the &lt;b&gt;Channel Mode&lt;/b&gt; of channels 0 thru 3 to &lt;b&gt;Dynamic I/O&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Set the &lt;b&gt;Channel Mode&lt;/b&gt; of all other channels to &lt;b&gt;Disabled&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Set the &lt;b&gt;Capture Mode&lt;/b&gt; of each active channel to &lt;b&gt;Window Open Edge&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Set the &lt;b&gt;Data Format&lt;/b&gt; of channel 0 to &lt;b&gt;Return To One&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Set the &lt;b&gt;Data Format&lt;/b&gt; of all other active channels to &lt;b&gt;No Return&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Set the &lt;b&gt;Phase&lt;/b&gt; and &lt;b&gt;Window&lt;/b&gt; settings of channel 0 to &lt;b&gt;Step TSet0&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Set the &lt;b&gt;Phase&lt;/b&gt; and &lt;b&gt;Window&lt;/b&gt; settings of all other active channels to &lt;b&gt;Step TSet1&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Configure the &lt;b&gt;Drive&lt;/b&gt; and &lt;b&gt;Sense &lt;/b&gt;logic levels for each channel&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;b&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200275\Configuring GX5296 Channels.png" alt="Configuring GX5296 Channels" title="Configuring GX5296 Channels" border='0' &gt;&lt;br /&gt;Figure 3: Configuring GX5296 Channels&lt;/b&gt;&lt;/div&gt; &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;System Clock Setup&lt;/h3&gt;The data rate used in this example is 25MHz. In order to achieve the maximum timing flexibility the &lt;b&gt;T0 Clock Period&lt;/b&gt; should be set to the lowest practical setting and the &lt;b&gt;Clocks Per Vector (CPV)&lt;/b&gt; multiplier set to achieve the desired timing period. For our example this means that the &lt;b&gt;T0 Clock Period&lt;/b&gt; should be set to 10ns and the &lt;b&gt;Clocks Per Vector (CPV)&lt;/b&gt; should be set to 4 (10 * 4 = 40ns or 25MHz). Refer to &lt;b&gt;Figure 4&lt;/b&gt; and set the &lt;b&gt;T0 Clock Period&lt;/b&gt; to 10ns and the &lt;b&gt;Clocks per Vector (CPV)&lt;/b&gt; to 4, then press the &lt;b&gt;Set&lt;/b&gt; button. Note that the total timing period can be varied during the burst on a per step basis by changing the CPV value. The T0 Clock value is fixed for the entire burst.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;div align='center'&gt;&lt;b&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200275\Configuring GX5296 Clock.png" alt="Clock and Clocks Per Vector (CPV) Configuration" title="Clock and Clocks Per Vector (CPV) Configuration" border='0' &gt;&lt;/div&gt;&lt;br /&gt;Figure 4: Clock and Clocks Per Vector (CPV) Configuration&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Timing Setup&lt;/h3&gt;To recap, we have now configured the GX5296 as follows:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Total period timing set is to 40ns (10ns * 4)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;SCLK DIO channel is set to use Phase Step TSet0 with &lt;b&gt;Return To One&lt;/b&gt; format&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;SSL, MISO and MOSI channels are set to use Phase Step TSet1 with &lt;b&gt;No Return&lt;/b&gt; formatting&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;All Channels are set to use Window 0&lt;/li&gt;&lt;/ul&gt;In the Channel setup, each channel is assigned to one of four Phases (0-3) and four Windows (0-3). The Phases setting in the Timing Setup determines when the Drive signal will be asserted and or returned (denied) during the timing cycle. The Window setting determines when the Sensing open and close window will occur. The TSets Page is used to display the 64 Timing Set groups. Refer to timing diagram in Figure 5, SCLK transitions from a low to a high at 50% of the cycle. To achieve this clock period, Phase Assert0 must be set to 0ns and Phase Return0 to 20ns. Since data formatting for this channel is set to &lt;b&gt;Return To One&lt;/b&gt;, this will generate the desired clock frequency as long as the vectors for this channel are set to output a low. The SS, MISO and MOSI channels are set to &lt;b&gt;No Return&lt;/b&gt; formatting. These channels are valid at beginning of the period and remain constant during the timing cycle so Phase Assert1 is set to 0ns. Phase Return1 is not used but needs to be set to some value greater than the Phase 1 Assert, say 20ns. &lt;br /&gt;&lt;div align='center'&gt; &lt;div align='center'&gt;&lt;b&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200275\SPI Bus Timing.png" alt="SPI Bus Timing" title="SPI Bus Timing" border='0' &gt;&lt;/div&gt;&lt;br /&gt;Figure 5: SPI Bus Timing&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To enter the Timing Set Editor, select the TSets page. Refer to figure 6, and set the Phase and Window of TSet Index 0 to the following values and then press the Write button. &lt;br /&gt;&lt;blockquote&gt;•	Set Phase Assert0 to 0.00&lt;br /&gt;•	Set Phase Return0 to 20.00&lt;br /&gt;•	Set Window Open0 to 30.00&lt;br /&gt;•	Set Window Close0 to 40.00&lt;br /&gt;•	Set Phase Assert1 to 0.00&lt;br /&gt;•	Set Phase Return1 to 20.00&lt;br /&gt;•	Set Window Open1 to 20.00&lt;br /&gt;•	Set Window Close1 to 40.00&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200275\TimnigSetEditor.png" alt="Timing Set Editor" title="Timing Set Editor" border='0' &gt;&lt;br /&gt;Figure 6: Timing Set Editor&lt;/b&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;Step and Vector Creation&lt;/h3&gt;A Step is a group of vectors with a defined starting address and vector count. If desired, a Step can use the same set, a subset, or a unique set of vectors. Each vector defines the drive and sense states at the defined timing set period. Each step can select a unique CPV value, Timing Set Index (0-63), Record Memory mode, Phase Trigger Source and Step Trigger control. &lt;br /&gt;&lt;br /&gt;Select the Steps page and refer to Figure 7. By default, the GtDio6x driver defines step 0. There are four icons used to Create, Delete, Move Up or Move Down a step. To modify the step's parameters, simply select the step by clicking on it. Our example requires two steps: Step 0 set to 50 Vectors and Step 1 set to 1 vector. Add a second step by pressing the Create New Step icon. Select Step 0 and set the Vector Count to 50 and the Address to 0, followed by the set button. Select Step 1 and set the Vector Count to 1 and the Address to 50, followed by the Set button. Our example requires that the Clocks Per Vector setting for both Step 0 and 1 be set to 4. As the CPV setting has already been set for step 0, select step 1 and change the CPV setting to 4 and press the Set button. Since our demo only uses 1 timing set group, ensure that step 0 and step 1 Timing Step Indexes are both set to zero.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200275\StepEditing.bmp" alt="Step Editor" title="Step Editor" border='0' &gt;&lt;br /&gt;Figure 7: Step Editing&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;The Phase Trigger Source has two selections: “System Clock” and “Vector Clock”. The “System Clock” selection sets the selected Phase timing to the T0 Period. The “Vector Clock” selection sets the selected Phase to the System T0 Clock times the CPV setting. Note this selection can be made on a per Step basis. Refer to figure 8. If a pin is set to return to zero using a T0 setting of 8ns with 5 Clocks per vector (CPV) using “System Clock”, the pin can be set up to generate a clock of 8ns, or 125MHz. This “System Clock” pin would then generate five 8ns Clocks per 40ns timing period. Another pin using “Vector Clock” can only be set up to produce one transition per the 40ns timing period. Our example requires that both Phase 0 and Phase 1 be set to “Vector Clock”. Phase 2 and Phase 3 are not used. Perform this setting for both Step 0 and Step 1.&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200275\SystemVectorClock.png" alt="System Vector Clock" title="System Vector Clock" border='0' &gt;&lt;br /&gt;Figure 8: System and Vector Clock Definition&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Refer to figure 9 on the Steps page, there are four record modes that are set up on a per step basis. If the vector response is known then the record mode should most likely be set to Real Time Compare Error. Using the Real Time Compare Error (Recording) mode, a burst will automatically return a pass/fail status. If however, as in our example, the application calls out to read back and analyze a response from the DUT, then the mode should be set to Response (recording). To make this selection, select each Step and select Response (recording) from the pull down menu.&lt;br /&gt;&lt;br /&gt; &lt;div align='center'&gt;&lt;b&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200275\RecordMode.png" alt="Record Mode Selection" title="Record Mode Selection" border='0' &gt;&lt;br /&gt;Figure 9: Record Mode Selection&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Any Step can be set up to perform a jump or goto subroutine. This feature can be used unconditionally or can be set up to jump, or not jump, on a specified condition. A jump can be set up to jump back to its own or any other step. There are also sixteen loop counters available to use in a jump condition. Loop counters can be nested. Our example does not require the use of Jumps or Subroutines. Ensure that the Step Control is set to “None” for both steps. The last step needs to be defined to tell the sequencer engine where to end the burst. In our Demo example, we have two steps. The first step is 50 vectors to send and receive data from the SPI bus. The second step is used as a Standby sequence step. Refer to Figure 10, at the completion of a digital sequence run the GX5296 will execute one of two Run Completion Modes - Standby or Idle. If Standby is selected the sequencer will continuously run the first vector of the indicated Run Completion Step. If Idle is selected the sequencer will continuously run the selected Idle Step. For our example, select Step 0 and make sure the “Last Step” check box is checked. Set the Sequencer Run Completion Mode to Standby and the Run Completion Step to 1.&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200275\RunCompletionMode.png" alt="Run Completion Mode Selection" title="Run Completion Mode Selection" border='0' &gt;&lt;br /&gt;Figure 10: Run Completion Mode Selection&lt;/b&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;Vector Editor Example&lt;/h3&gt;Vectors can be programmed manually or by importing a number of different simulation sources such as WGL, STIL and ATP file formats. Note that the simulation file importing requires an optional FIT licence. To edit Vectors manually select the step to edit and press the Edit button, or double click on the Step. Refer to figure 11 for an example of manual vector editing. Each channel for Vectors within the step is set to an Opcode to indicate the Drive and Sense state.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200275\VectorEditor.png" alt="Vector Editor" title="Vector Editor" border='0' &gt;&lt;br /&gt;Figure 11: Manual Vector Editing&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Saving the GX5296 setup&lt;/h3&gt;A unique feature of the GtDio6x driver and panel allows all GX5296 settings to be saved into a file that can be retrieved at anytime. To save the GX5296 settings press File from the top menu and select Save. When prompted select a directory and enter a filename. Press the Okay button when finished. This greatly simplifies programming as the state of the GX5296 can be easily reprogrammed by simply loading a file from the panel, or by loading the file programmatically as in the following ATEasy example, &lt;br /&gt;&lt;blockquote&gt;&lt;blockquote&gt;sFile = GetDir(aGetDirCurrent)&lt;br /&gt;sFile = sFile+"\\DioFiles\\"+"SpiBusExample.dio6x"&lt;br /&gt;DIO File Load(sFile,0,0,0,0)&lt;br /&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;Running the GX5296&lt;/h3&gt;To run the GX5296, perform the following: from the panel depress the “Reset Seq.” button, select the run completion step and set it to 1, then press the “Run” button. &lt;br /&gt; &lt;br /&gt;&lt;h3&gt;Reading Record Memory&lt;/h3&gt;Record memory can be read by pressing the “Edit Vector” button on the Steps page of the GtDio6x panel, or can be read programmatically using the function GtDio6xReadRecordMemory. The GtDio6xReadRecordMemory function can be setup to read the results of any number of pins. In our example, the GtDio6xReadRecordMemory would be used to read the results of the MOSI line. This data can then be modified and written back to the GX5296 MISO line using the GtDio6xWriteVectorMemory function.&lt;br /&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;While a dedicated test instrument can offer more targeted test capabilities for serial bus interfaces, a solution built around a dynamic digital test instrument, such as the GX5296, can offer flexibility that is unmatched when compared to a dedicated bus test tool. These features include the flexibility to adapt to multiple bus environments, adapt to changing test conditions, support nonstandard protocols (data rates, timing, message sizes…) and provide synchronization for external equipment to time-specific bus events. As the instrument also provides a full featured PMU per pin, analog and connectivity tests can also be easily integrated. A dynamic digital PXI solution can also reduce the footprint of the test system and reduce the test equipment learning curve as the test engineer is working with one instrument and learning one programming language. As can be easily seen, support for multiple serial buses with the single dynamic digital test solution can also be realized. Using a multipurpose instrument means that the test engineer needs to interface with only one vendor should technical support be required. Finally, significant cost savings can be realized since a variety of different bus protocols can be supported without incurring incremental hardware investment each time a new bus protocol is added to a test setup. Ultimately, the goal is to identify those instances where the clever or novel application of a dynamic digital test tool is appropriate and provides tangible benefits in time, cost, flexibility and effective utilization of resources.&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+gtdio6x-fit+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description><link>https://www.MarvinTest.com/KB/Q200275/Using-the-GX5296-to-Emulate-the-SPI-Bus</link><pubDate>6/1/2021</pubDate></item><item><title>Comparing C/C++, C#, VB and ATEasy Basic Data Types - Published on 5/27/2021</title><description>&lt;h3&gt;Data type reference table&lt;/h3&gt;The following table describes ATEasy equivalent data types when calling procedures defined in other programming languages such as C/C++. The table also shows the suggested ATEasy data types used when importing C/C++ header file to ATEasy; these suggestions are offered using the ATEasy &lt;b&gt;Ambiguous C Type Dialog&lt;/b&gt; (see ATEasy on-line help for more information):&lt;br /&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;C/C++&lt;/th&gt;&lt;th&gt;C#.NET&lt;/th&gt;&lt;th&gt;VB.NET&lt;/th&gt;&lt;th&gt;ATEasy &lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;signed char&lt;/td&gt;&lt;td&gt;sbyte&lt;/td&gt;&lt;td&gt;ByVal SByte&lt;/td&gt;&lt;td&gt;Val Char&lt;/td&gt;&lt;td&gt;Signed 8-bit integer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;signed char *&lt;/td&gt;&lt;td&gt;sbyte *&lt;/td&gt;&lt;td&gt;ByRef SByte&lt;/td&gt;&lt;td&gt;Val String, Var String, Val Char[ ], Var Char[ ]&lt;/td&gt;&lt;td&gt;Pointer to a single or an array of signed 8-bit integer characters&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;unsigned char&lt;/td&gt;&lt;td&gt;byte&lt;/td&gt;&lt;td&gt;ByVal Byte&lt;/td&gt;&lt;td&gt;Val Byte&lt;/td&gt;&lt;td&gt;Unsigned 8-bit integer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;unsigned char *&lt;/td&gt;&lt;td&gt;byte *&lt;/td&gt;&lt;td&gt;ByRef Byte&lt;/td&gt;&lt;td&gt;Val Byte, Var Byte[ ], Val Byte[ ]&lt;/td&gt;&lt;td&gt;Pointer to a single or an array of unsigned 8-bit integer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;bool&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;ByVal Boolean&lt;/td&gt;&lt;td&gt;Val Bool&lt;/td&gt;&lt;td&gt;Boolean data type (True &lt;&gt;0/False 0), True is usually -1 but in C data type BOOL is 1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;bool *&lt;/td&gt;&lt;td&gt;bool *&lt;/td&gt;&lt;td&gt;ByRef Boolean&lt;/td&gt;&lt;td&gt;Var Bool, Var Bool[ ], Val Bool[ ]&lt;/td&gt;&lt;td&gt;Pointer to a single or an array of boolean data type (True/False)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;signed short int&lt;/td&gt;&lt;td&gt;short&lt;/td&gt;&lt;td&gt;ByVal Short&lt;/td&gt;&lt;td&gt;Val Short&lt;/td&gt;&lt;td&gt;Signed 16-bit integer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;signed short int *&lt;/td&gt;&lt;td&gt;short *&lt;/td&gt;&lt;td&gt;ByRef Short&lt;/td&gt;&lt;td&gt;Var Short, Var Short[ ], Val Short[ ]&lt;/td&gt;&lt;td&gt;Pointer to a single or an array of signed 16-bit integer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;unsigned short int&lt;/td&gt;&lt;td&gt;ushort&lt;/td&gt;&lt;td&gt;ByVal UShort&lt;/td&gt;&lt;td&gt;Val Word&lt;/td&gt;&lt;td&gt;Unsigned 16-bit integer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;unsigned short int *&lt;/td&gt;&lt;td&gt;ushort *&lt;/td&gt;&lt;td&gt;ByRef UShort&lt;/td&gt;&lt;td&gt;Var Word, Var Word[ ], Val Word[ ]&lt;/td&gt;&lt;td&gt;Pointer to single or an array of unsigned 16-bit integer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;wchar_t&lt;/td&gt;&lt;td&gt;char&lt;/td&gt;&lt;td&gt;ByVal Char&lt;/td&gt;&lt;td&gt;Val WChar&lt;/td&gt;&lt;td&gt;Unicode 16-bit integer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;wchar_t *&lt;/td&gt;&lt;td&gt;char *&lt;/td&gt;&lt;td&gt;ByRef Char&lt;/td&gt;&lt;td&gt;Var WChar, Val BString, Var BString, Val WChar[ ], Var WChar[ ]&lt;/td&gt;&lt;td&gt;Pointer to single or an array of Unicode 16-bit integer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;signed int&lt;/td&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;ByVal Integer&lt;/td&gt;&lt;td&gt;Val Long&lt;/td&gt;&lt;td&gt;Signed 32-bit integer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;signed int *&lt;/td&gt;&lt;td&gt;int *&lt;/td&gt;&lt;td&gt;ByRef Integer&lt;/td&gt;&lt;td&gt;Var Long, Var Long[ ], Val Long[ ]&lt;/td&gt;&lt;td&gt;Pointer to single or an array of signed 32-bit integer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;unsigned int&lt;/td&gt;&lt;td&gt;uint&lt;/td&gt;&lt;td&gt;ByVal UInteger&lt;/td&gt;&lt;td&gt;Val DWord&lt;/td&gt;&lt;td&gt;Unsigned 32-bit integer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;Var DWord, Var DWord[ ], Val DWord[ ]&lt;/td&gt;&lt;td&gt;unsigned int *&lt;/td&gt;&lt;td&gt;uint *&lt;/td&gt;&lt;td&gt;ByRef UInteger&lt;/td&gt;&lt;td&gt;Pointer to a single or an array unsigned 32-bit integer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;float&lt;/td&gt;&lt;td&gt;float&lt;/td&gt;&lt;td&gt;ByVal Single&lt;/td&gt;&lt;td&gt;Val Float&lt;/td&gt;&lt;td&gt;32-bit floating-point (single precision)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;float *&lt;/td&gt;&lt;td&gt;float *&lt;/td&gt;&lt;td&gt;ByRef Single&lt;/td&gt;&lt;td&gt;Var Float, Var Float[ ], Val Float[ ]&lt;/td&gt;&lt;td&gt;Pointer to a single or an array of 32-bit floating-point&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;double&lt;/td&gt;&lt;td&gt;double&lt;/td&gt;&lt;td&gt;ByVal Double&lt;/td&gt;&lt;td&gt;Val Double&lt;/td&gt;&lt;td&gt;64-bit floating-point (double precision)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;double *&lt;/td&gt;&lt;td&gt;double *&lt;/td&gt;&lt;td&gt;ByRef Double&lt;/td&gt;&lt;td&gt;Var Double, Var Double[ ], Val Double[ ]&lt;/td&gt;&lt;td&gt;Pointer to a single or an array of 64-bit floating-point&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;char[ ]&lt;/td&gt;&lt;td&gt;sbyte[ ]&lt;/td&gt;&lt;td&gt;ByVal Byte ( )&lt;/td&gt;&lt;td&gt;Val String, ValChar[ ], Var Char[ ]&lt;/td&gt;&lt;td&gt;String of NULL terminated ASCII characters&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;char[ ] *&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;ByRef Byte ( )&lt;/td&gt;&lt;td&gt;Val String, Var String&lt;/td&gt;&lt;td&gt;Pointer to string of NULL terminated ASCII characters&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;wchar_t[ ]&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;ByVal String&lt;/td&gt;&lt;td&gt;Val BString, Val WChar[ ], Var WChar[ ]&lt;/td&gt;&lt;td&gt;String of Unicode characters&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;VARIANT&lt;/td&gt;&lt;td&gt;object&lt;/td&gt;&lt;td&gt;ByVal Object&lt;/td&gt;&lt;td&gt;Val Variant&lt;/td&gt;&lt;td&gt;Dynamically-changeable data type&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;int&lt;/td&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;ByVal Integer&lt;/td&gt;&lt;td&gt;Val Procedure&lt;/td&gt;&lt;td&gt;Holds the address of a procedure, 32 bit&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;IUnknown *. IDispatch *&lt;/td&gt;&lt;td&gt;object&lt;/td&gt;&lt;td&gt;ByVal Object&lt;/td&gt;&lt;td&gt;Val Object&lt;/td&gt;&lt;td&gt;COM/NET object, stored in a 32-bit address for the COM interface&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;h3&gt;Using Val and Var Parameters&lt;/h3&gt;ATEasy function parameters can be either Val or Var.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Val&lt;/b&gt;: The parameter is passed 'by value'.&amp;nbsp;&amp;nbsp;A local variable is made from the supplied argument.&amp;nbsp;&amp;nbsp;Any changes made to a Val parameter within ATEasy will not affect the original variable.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Var&lt;/b&gt;: The parameter is passed 'by reference'.&amp;nbsp;&amp;nbsp;The parameter is a reference to the supplied argument.&amp;nbsp;&amp;nbsp;Any changes made to a Var parameter within ATEasy will be made to the original variable.&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Using MemoryCopy() to get/set variable values&lt;/h3&gt;The ATEasy &lt;b&gt;MemoryCopy(&lt;/b&gt;) internal procedure can be used in ATEasy to copy variables values into ATEasy using the variable's memory address and size.&lt;br /&gt;&lt;br /&gt;For instance, in this C++ DLL procedure a char array is created.&amp;nbsp;&amp;nbsp;The function returns the location of the first element in the array (plAddress) and the array's size (plSize):&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;void StringTest(int *plAddress, int *plSize)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static char szExample[]="Test String ABC123";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*plAddress=(int)&amp;szExample[0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*plSize=strlen(szExample);&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The ATEasy procedure shown below calls the C++ DLL procedure, retrieving the address and size data and then uses that information to construct its own variable using MemoryCopy.&amp;nbsp;&amp;nbsp;In this case, a string is the most appropriate variable.&amp;nbsp;&amp;nbsp;But this technique could be used for other basic and / or user-defined variables.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure MemoryCopyTest(): String Public&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;sTest: String&lt;br /&gt;lSize: Long&lt;br /&gt;lAddress: Long&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringTest(lAddress, lSize)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetLen(sTest, lSize)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MemoryCopy(&amp;sTest, lAddress, lSize)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return sTest&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Related Material&lt;/h3&gt;Knowledge Base: &lt;a href='http://www.geotestinc.com/KnowledgeBase/KBArticle.aspx?ID=211' target='_blank'&gt;Passing Array between ATEasy and .NET&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200210/Comparing-C-C-plus-plus-C-VB-and-ATEasy-Basic-Data-Types</link><pubDate>5/27/2021</pubDate></item><item><title>Metal-Oxide (MOX) Gas Sensor Testing - Published on 5/27/2021</title><description>&lt;h3&gt;Background&lt;/h3&gt;The application of MEMS technology has allowed Metal Oxide (MOX) Gas Sensors to be mass-produced at the wafer level with silicon wafer manufacturing offering cost reduction and scalability to large volumes. These gas sensor devices are suitable for precise measurement of Carbon Monoxide (CO) and a wide range of Volatile Organic Compounds (VOCs) such as Ethanol, Acetone and Toluene. Applications for these sensors, which are largely driven by health and safety considerations, include environmental monitoring, biological research, industrial control, portable breathalyzers and home air monitoring systems. The adoption of MEMS technology for MOX gas sensors has resulted in greatly reduced manufacturing costs. However, each of these sensors must also be tested, which presents a unique set of challenges when compared to the manufacturing and testing of typical semiconductor devices. This application note discusses how a semiconductor manufacturer of Gas Sensors employed a focused test solution that provided the required accuracy, accommodated very large site counts, and matched the over-all throughput performance of high performance semiconductor test systems at a much lower cost.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;What is a MOX Gas Sensor?&lt;/h3&gt;The MOX Gas Sensor is a MEMS device (Micro-Electro-Mechanical System) fabricated as a multi-chip module (MCM).&amp;nbsp;&amp;nbsp;The basic components of the MCM are the micro-controller ASIC, pre-tested on the wafer, and the sensor, the object of this test application.&amp;nbsp;&amp;nbsp;These components are placed on a common substrate and a lid is placed over the components with a small hole or mesh in the lid that allows gas into the sensor.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;The sensor consists of a small heating element housed beneath a thin membrane coated with a proprietary metal-oxide material.&amp;nbsp;&amp;nbsp;The MOX material is a variable resistor that responds to chemicals in the gas it is exposed to.&amp;nbsp;&amp;nbsp;The MOX can be formulated to respond differently to certain types or classes of gas, called the target gas.&amp;nbsp;&amp;nbsp;In an environment of “clean” air, the MOX resistance can be several MOhms.&amp;nbsp;&amp;nbsp;When heated, and in the presence of the target gas, the resistance of the MOX material drops significantly, down to several tens of KOhms.&amp;nbsp;&amp;nbsp;When the application of heat is removed, and/or the test gas is eliminated, the MOX resistance returns to its previous value.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;With the application of controlled heat, measuring the resistance of the MOX coating in the presence of clean air, and then measuring the resistance of the MOX coating in the presence of air with a controlled amount of the target gas (measured in Parts per Million), the ratio of the two measurements can be used to calibrate the device.&amp;nbsp;&amp;nbsp;In actual operation, the calibrated MOX resistance measurement is indicative of the density of the target gas in the environment.&lt;br /&gt;Control of the sensor heater and MOX measurements, as well as device register read/write, are performed by the controller ASIC, which is in turn controlled by the test system over an I&lt;sup&gt;2&lt;/sup&gt;C interface.&amp;nbsp;&amp;nbsp;The I&lt;sup&gt;2&lt;/sup&gt;C interface is a four-wire bus consisting of the two-wire I&lt;sup&gt;2&lt;/sup&gt;C bus (SCL and SDA), an interrupt signal and a reset signal.&amp;nbsp;&amp;nbsp;Figure 1 details the components that comprise the MOX Sensor MCM device. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200313/MOX_Gas_Sensor_MCM.png" alt="MOX Gas Sensor MCM" title="MOX Gas Sensor MCM" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Figure 1: MOX Gas Sensor MCM&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Test System Requirements&lt;/h3&gt;To test these devices, the test system needed to have the following capabilities and attributes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The time to test/calibrate a MOX sensor can be several tens of minutes. This long “dwell” time is required due to the need to “soak” the sensor(s) with clean air and the target gas. Clearly, using a large, high performance semiconductor tester, which is effectively sitting idle for many minutes during the gas soak time, is not a productive use of that expensive resource.&amp;nbsp;&amp;nbsp;&lt;b&gt;The solution had to have a low initial capital cost.&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Test throughput is still important.&amp;nbsp;&amp;nbsp;With long dwell times, it was essential that the system &lt;b&gt;support very large parallel test capability so the soak time can be amortized across many devices.&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The DUT load board had to reside in an enclosed environment where concentrations of gas could be precisely controlled.&amp;nbsp;&amp;nbsp;This precluded the typical practice of using handlers to load and unload devices, resulting in the requirement for manual insertion and removal of the devices.&amp;nbsp;&amp;nbsp;Consequently, &lt;b&gt;a means for an operator to visually identify passing and failing components for manual binning was required.&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Once the desired soak time had been reached, &lt;b&gt;all measurements needed to be completed in less than one second&lt;/b&gt; to avoid skewing of the results due to disparate soak times.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;As the component was a new design, &lt;b&gt;the system needed to be expandable&lt;/b&gt;, so the test capacity could grow as production volumes increased.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The devices arrive for package test after the wafer-level ASIC test is completed, with common I&lt;sup&gt;2&lt;/sup&gt;C slave addresses for all devices.&amp;nbsp;&amp;nbsp;The system needed the ability to &lt;b&gt;isolate the I&lt;sup&gt;2&lt;/sup&gt;C bus to each device&lt;/b&gt;, eliminating the need to modify the slave address for testing. Since the load board involved manual insertion of the DUT, a test method was needed to verify correct component insertion prior to initiating the lengthy test process.&amp;nbsp;&amp;nbsp;A simple contact test achieved this, so the system needed to &lt;b&gt;provide PMU/pin capability&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;Implementation&lt;/h3&gt;&lt;b&gt;Architecture&lt;/b&gt;&lt;br /&gt;The architecture selected was a hybrid PXI-based system consisting of a mixture of PXI instruments and external instruments controlled over USB.&amp;nbsp;&amp;nbsp;Note, the use of the word hybrid in this circumstance does not mean PXI Express hybrid – the PXI instruments are all standard PXI-1.&amp;nbsp;&amp;nbsp;In this context, hybrid means the combination of PXI and non-PXI instruments.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Power&lt;/b&gt;&lt;br /&gt;The operating current of the device in normal, or idle, states was very low, but during measurements, experiments showed that, when the sensor heater was activated, inrush current per device could be quite high. To support a large multi-site configuration (up to 512 devices), PXI power solutions were deemed inadequate, so external Keysight E36313A power supplies were selected.&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Digital Instrument&lt;/b&gt;&lt;br /&gt;An obvious implementation is to use a dedicated digital instrument for each device being tested.&amp;nbsp;&amp;nbsp;This would meet the requirement to isolate the I&lt;sup&gt;2&lt;/sup&gt;C bus for each device, but the cost for such a “brute force” approach would exceed the overall system budget.&amp;nbsp;&amp;nbsp;So a switched, or multiplexed, digital interface implementation was devised whereby each DUT would communicate over a dedicated I&lt;sup&gt;2&lt;/sup&gt;C bus, minimizing the digital instrumentation resources.&amp;nbsp;&amp;nbsp;The instrument of choice, based on cost, channel density and ease of use, was the Marvin Test Solutions GX5295 digital I/O card.&lt;br /&gt;&lt;br /&gt;With 32 channels per slot, per-pin PMU, deep pattern memory and a robust API function set, the GX5295 could test eight devices in parallel without slave address conflict issues.&amp;nbsp;&amp;nbsp;An 8:1 multiplexing scheme allowed one GX5295 to test 64 devices in groups of eight at a time, again avoiding slave address conflicts.&amp;nbsp;&amp;nbsp;This approach allowed one inexpensive GX5295 to measure a full 64-site load board in well under the allocated time budget.&amp;nbsp;&amp;nbsp;And, since the GX5295 supports synchronous multi-instrument expansion, the time to make measurements on 512 devices is the same as the time to measure 64.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+gx5295+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;System expansion is simply a matter of adding extra GX5295s, load boards, chambers and ITA cables, up to a maximum of 8 total (512 DUTs).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Load Board&lt;/b&gt;&lt;br /&gt;Load board density was set to 64 devices (Figure 2).&amp;nbsp;&amp;nbsp;For reasons explained above, this provided a natural granularity for system expansion.&amp;nbsp;&amp;nbsp;To simplify the system/DUT interface, the mux switching devices were placed on the load board, eliminating external switching and the associated cables, while still maintaining good signal integrity.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200313/Load_Board.png" alt="Load Board" title="Load Board" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Figure 2: Load Board&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The load board includes 64 tri-color LEDs for visually indicating Pass/Fail status of each DUT. The LED power includes a battery backup so the visual Pass/Fail state is retained even when the load board is removed from the system – which was necessary for the operator to manually remove and bin the devices.&amp;nbsp;&amp;nbsp;A charging circuit on the load board keeps the battery topped-off while tests are running.&lt;br /&gt;&lt;br /&gt;Since the I&lt;sup&gt;2&lt;/sup&gt;C interface is an open-collector bus, it requires external pull-up resistors for operation.&amp;nbsp;&amp;nbsp;These resistors interfere with the PMU contact test for determining proper DUT insertion in their sockets – the current through the pull-up resistors would swamp the ESD diode measurements.&amp;nbsp;&amp;nbsp;Consequently, a Vcc controlled pull-up relay was included to isolate the pull-up resistors from Vcc when making the contact measurements (Figure 3). &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200313/Pull-up_Isolation.png" alt="Pull-up Isolation" title="Pull-up Isolation" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Figure 3: Pull-up Isolation&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Load Board Control&lt;/b&gt;&lt;br /&gt;An inexpensive MTS GX5733 static digital I/O module was used to control all of the load board functions (I&lt;sup&gt;2&lt;/sup&gt;C mux, tri-color LEDs and Vcc pull-up isolation relay).&amp;nbsp;&amp;nbsp;A special driver was developed that simplifies load board control.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PXI Chassis&lt;/b&gt;&lt;br /&gt;The PXI chassis selected was the MTS GX7305 high-power chassis.&amp;nbsp;&amp;nbsp;The chassis provides 20 PXI-1 (non-express) slots – one for the MXI controller and 19 for instrumentation.&amp;nbsp;&amp;nbsp;The chassis exceeds the PXI minimum specifications for power delivery and cooling capacity, and includes functions for monitoring backplane voltages and slot temperatures.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Interface Test Adapter (ITA)&lt;/b&gt; &lt;br /&gt;A dedicated ITA was designed for the GX7305’s hinged front panel, allowing for simple, clean cabling between the test system resources and the load boards.&amp;nbsp;&amp;nbsp;Cables from both the PXI instruments and the external E36313A power supplies mate to connectors on the back side of the ITA, which are hidden from view when the hinged panel is closed.&amp;nbsp;&amp;nbsp;Cables to the load board, Mass Flow Controllers and exhaust valves connect to the front of the ITA (Figure 4).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200313/ITA.jpg" alt="Interface Test Adapter" title="Interface Test Adapter" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Figure 4: Interface Test Adapter&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Figure 5 details a block diagram of the test system’s resources and associated ITA. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200313/Block_Diagram.png" alt="System Block Diagram" title="System Block Diagram" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Figure 5: System Block Diagram&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Gas Control&lt;/b&gt;&lt;br /&gt;To facilitate precise control of gas exposure to the DUT, an enclosed environment (chamber) was designed to house the load board and restrict the test gas to a confined space.&amp;nbsp;&amp;nbsp;The gas is introduced to the chamber via Mass Flow Controllers (MFCs) that meter Clean-Dry Air, Humidified Air and the Test Gas, allowing them to be mixed in precise quantities to achieve the desired gas densities (measured in Parts per Million).&amp;nbsp;&amp;nbsp;A separate MFC is also provided for each chamber to meter the mixed gas to the enclosed chamber in a controlled volume.&amp;nbsp;&amp;nbsp;Control of the MFCs is performed using the auxiliary PMU channels on the GX5295’s J3 connector.&lt;br /&gt;&lt;br /&gt;Exhaust valves are used to&amp;nbsp;&amp;nbsp;evacuate the test gas from the load board chamber after the tests are complete.&amp;nbsp;&amp;nbsp;The exhaust valves are solenoid operated, powered by one of the E36313A power supplies, and controlled via 12 V switching relays located on the ITA.&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;&lt;b&gt;Software&lt;/b&gt;&lt;br /&gt;The software used to control the system is ATEasy®, v10.&amp;nbsp;&amp;nbsp;Software control was written to facilitate easy expansion of the system as well.&amp;nbsp;&amp;nbsp;ATEasy supports multi-threading applications.&amp;nbsp;&amp;nbsp;For each GX5295/load board/chamber, ATEasy instantiates a separate thread for processing measurements and generating data logging reports.&amp;nbsp;&amp;nbsp;The ATEasy test application queries the number of GX5295s installed in the system (one GX5295 for each 64-site load board), then dynamically allocates a thread for each.&amp;nbsp;&amp;nbsp;Processes common to all threads, such as initiating the digital test patterns that are run in parallel for each load board, are facilitated using thread synchronization.&lt;br /&gt;&lt;br /&gt;Included in the ATEasy application are drivers for the GX5295s, GX5733, Keysight power supplies and GX7305 chassis monitoring, as well as an Excel spreadsheet driver for managing the data logging.&amp;nbsp;&amp;nbsp;There is a MOX driver, built on top of the GX5733 static digital instrument, for simplified control of the load board.&lt;br /&gt;&lt;br /&gt;Included in the delivered package are tools for high-level creation of I&lt;sup&gt;2&lt;/sup&gt;C bus patterns, concatenation and loading of I&lt;sup&gt;2&lt;/sup&gt;C bus sequences, as well as downloading captured I&lt;sup&gt;2&lt;/sup&gt;C bus traffic for diagnostics and analysis.&amp;nbsp;&amp;nbsp;Data logging to an Excel spreadsheet facilitates the use of all of the high-level data analysis tools of Excel, such as graphs, filters and application of formulas to the acquired measurements.&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+ateasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Communication to the DUT is done over an I&lt;sup&gt;2&lt;/sup&gt;C bus.&amp;nbsp;&amp;nbsp;As mentioned above, each device is preconfigured with an identical I&lt;sup&gt;2&lt;/sup&gt;C slave address.&amp;nbsp;&amp;nbsp;Were all of the DUTs to reside on the same I&lt;sup&gt;2&lt;/sup&gt;C bus, it would be necessary to reprogram each device with a unique slave address prior to testing to avoid bus conflicts, and then re-program the slave address to the default value for delivery to the customer.&amp;nbsp;&amp;nbsp;Using a dedicated bus per device allows all communication to occur using the default address, saving time and money, and avoiding potential human error.&amp;nbsp;&amp;nbsp;A single GX5295 with 32 I/O channels can communicate across eight I&lt;sup&gt;2&lt;/sup&gt;C busses simultaneously without concern for address conflicts.&lt;br /&gt;&lt;br /&gt;The I&lt;sup&gt;2&lt;/sup&gt;C test patterns were generated using a simple utility written in ATEasy (Figure 6).&amp;nbsp;&amp;nbsp;Bus commands are constructed using a drop down menu of pre-defined bus commands for reading and writing to a device’s registers.&amp;nbsp;&amp;nbsp;An idle command is also available to allow insertion of dead-time between commands that require it, or to serve as a visual separation in the data patterns for debugging purposes.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200313/I2C_UI.png" alt="I&lt;sup&gt;2&lt;/sup&gt;C User Interface Utility" title="I&lt;sup&gt;2&lt;/sup&gt;C User Interface Utility" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Figure 6 : I&lt;sup&gt;2&lt;/sup&gt;C User Interface Utility&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Based on the requirements of the test processes, a sequence of commands are generated for a single device.&amp;nbsp;&amp;nbsp;Then using DIOEasy (Figure 7), a tool for generating and diagnosing GX5295 digital test patterns, the single (four-wire) bus control is copied to the remaining seven busses supported by the GX5295.&amp;nbsp;&amp;nbsp;Each test process is written as series of stand-alone pattern sequences so they can be concatenated together in any order desired.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200313/DIOEasy.png" alt="DIOEasy" title="DIOEasy" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Figure 7 : I&lt;sup&gt;2&lt;/sup&gt;C Pattern Editing using the DIOEasy Tool&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;An offline utility is included in the ATEasy application that performs this concatenation, generating one large test file that is quickly loaded to the test hardware during initialization of the system.&amp;nbsp;&amp;nbsp;To aid in debugging and diagnostics, a text file is generated identifying the order of the loaded tests, their initial vector address, and the pattern size of each pattern sequence.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Lock NVM, :Start 0, :Size 204, :Length 1632&lt;br /&gt;Unlock NVM, :Start 2656, :Size 204, :Length 1632&lt;br /&gt;Dut Poll, :Start 5312, :Size 207, :Length 1656&lt;br /&gt;Dut Status, :Start 7992, :Size 207, :Length 1656&lt;br /&gt;Start Sequence, :Start 10672, :Size 204, :Length 1632&lt;br /&gt;Pre-Init 3, :Start 13328, :Size 240, :Length 1920&lt;br /&gt;Pre-Init 5, :Start 16272, :Size 204, :Length 1632&lt;br /&gt;Pre-Init 7, :Start 18928, :Size 204, :Length 1632&lt;br /&gt;Pre-Init 12, :Start 21584, :Size 1908, :Length 15264&lt;br /&gt;Pre-Init 14, :Start 37872, :Size 1363, :Length 10904&lt;br /&gt;Pre-Init 16, :Start 49800, :Size 240, :Length 1920&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The state of each pin is recorded during test execution.&amp;nbsp;&amp;nbsp;At the completion of the test, the actual bus traffic (commands and DUT responses) can be uploaded from the hardware to DIOEasy, allowing the user to evaluate and/or document I&lt;sup&gt;2&lt;/sup&gt;C bus communication. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Test Process&lt;/h3&gt;&lt;b&gt;Continuity&lt;/b&gt;&lt;br /&gt;The per-pin PMU function available with each GX5295 I/O channel is used to source a small current through each of the DUT’s ESD diodes, and the resulting voltage drop across the diodes is measured to determine if the DUT is correctly installed in its socket.&amp;nbsp;&amp;nbsp;Prior to doing this, the pull-up isolation relay needs to be enabled so current flow through the I&lt;sup&gt;2&lt;/sup&gt;C pull-up resistors does not corrupt the continuity measurement.&amp;nbsp;&amp;nbsp;Devices are binned according to their pass/fail status.&amp;nbsp;&amp;nbsp;Future test evaluation is bypassed for any device having a “Failed” bin status.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sensor Initialization&lt;/b&gt;&lt;br /&gt;Prior to exposing the DUT to a test gas and measuring the MOX resistance, the sensor must be initialized.&amp;nbsp;&amp;nbsp;The Initialization reads relevant NVM (Non-Volatile Memory) data and stores it for future data correlation. It also dynamically calculates minimum and maximum permissible MOX resistance values for each DUT, based on the stored Heater Resistance and the current chamber temperature. These values are stored for future use.&amp;nbsp;&amp;nbsp;The Gas Test will use these values when determining good/bad devices.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Gas Measurement&lt;/b&gt;&lt;br /&gt;The Gas Measurement test is the heart of the MOX Gas Sensor production test.&amp;nbsp;&amp;nbsp;Once initialized, all devices in all chambers are exposed to a controlled mixture of “Clean/Dry Air” (CDA), “Humidified Air” (running CDA through a bubbler - BBL) and the “Test Gas”. The gas mixtures are precisely controlled (in PPM) using programmable Mass Flow Controllers.&amp;nbsp;&amp;nbsp;Each of the three MFCs is controlled by the application of 0 V – 5 V, representing 0% to 100% of the rated flow, respectively.&amp;nbsp;&amp;nbsp;A fourth MFC is included for each chamber/load board. The MFC control voltages are provided by the auxiliary PMU channels on the J3 connector of the GX5295s.&lt;br /&gt;&lt;br /&gt;During the Gas Test, the concentration of the test gas, and the exposure time for each specific concentration, is defined by a “Soak List”.&amp;nbsp;&amp;nbsp;The soak list contains set points for the three gasses, and the duration to hold that concentration before moving to the next set point in the list.&amp;nbsp;&amp;nbsp;At the end of the defined time period, a MOX measurement is taken, compared against the MOX min/max values previously calculated, and recorded.&amp;nbsp;&amp;nbsp;Binning is set accordingly.&lt;br /&gt;&lt;br /&gt;To simplify the application of the soak parameters, a form (Figure 8) was created in ATEasy that allows an engineer to create the soak list using a GUI. Set points can be added, inserted, modified and deleted. During execution, the GUI highlights where in the list the test process is, providing the operator an indication of how long the test has run, and how long until completion.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200313/Soak_List.png" alt="GUI Soak List" title="GUI Soak List" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Figure 8 : GUI Soak List&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;An optional parameter that can be enabled when running the soak list is to make intermediate MOX measurements – measurements between the soak list set points.&amp;nbsp;&amp;nbsp;This provides additional characterization data of the MOX operation by logging additional measurements during the lengthy test process.&amp;nbsp;&amp;nbsp;The options for data logging are “Off”, measurements only at the set points, and “2”, “4”, “6” measurements/minute.&amp;nbsp;&amp;nbsp;Intermediate measurements are saved to the Excel data log file, but are not used in evaluation of pass/fail status.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Pre-Initialization&lt;/b&gt;&lt;br /&gt;The devices arrive from the contract manufacturer (CM) with some information already stored in the device’s Non-Volatile Memory (NVM), such as the Product ID, a correlation Tracking Number, Heater Resistance and the ambient temperature the resistance was measured at, Slave Address, etc.&amp;nbsp;&amp;nbsp;The pre-initialization test allows an engineer to overwrite the NVM with new data.&amp;nbsp;&amp;nbsp;This is not a normal test process used during production.&amp;nbsp;&amp;nbsp;Instead, it is used to allow an engineer to run characterization tests on the device with complete control over all DUT parameters.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sensor Aging&lt;/b&gt;&lt;br /&gt;The Sensor Aging test is also not part of the normal production test.&amp;nbsp;&amp;nbsp;It is used to characterize the MOX under simulated aging processes.&amp;nbsp;&amp;nbsp;The aging test runs CDA to the part with an extended heater temperature, for a user-defined number of one minute cycles.&amp;nbsp;&amp;nbsp;Analysis data is collected during this process, and at the conclusion of the aging test, a normal Gas Test is run and the MOX characteristics recorded.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DUT Polling&lt;/b&gt;&lt;br /&gt;When running the Gas Test, the Sensor Aging test, and other test processes, the DUT is programmed with a test sequence table with the processes executed and controlled by the micro controller.&amp;nbsp;&amp;nbsp;During this sequence table execution, the DUT registers are not available for access, except for a polling register.&amp;nbsp;&amp;nbsp;The polling register is updated during the table sequence execution and can be queried by the test system to determine if the sequence table is done, or if the current table in the sequence is executing.&amp;nbsp;&amp;nbsp;Since polling is required for several of the MOX tests (every process that utilizes sequence tables), it is implemented as a subroutine that can be called when needed.&amp;nbsp;&amp;nbsp;The time that it takes to execute the sequence table can vary depending on the test requirement – number of steps in the table and delay parameters per step.&amp;nbsp;&amp;nbsp;To provide the operator with status of the sequence execution, an Elapsed Time form (Figure 9) was created to provide visual feedback of the time remaining to complete the sequence table.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200313/Elapsed_Time.png" alt="Elapsed Time Form" title="Elapsed Time Form" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Figure 9 : Elapsed Time Form&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DUT Status&lt;/b&gt;&lt;br /&gt;Like DUT Polling, the DUT Status is queried by multiple test processes, and is implemented as a subroutine.&amp;nbsp;&amp;nbsp;The status indicates the health of the DUT – specifically, if a Power On Reset has occurred recently.&amp;nbsp;&amp;nbsp;The POR bit is set whenever power to the device is interrupted, or if a Reset is initiated.&amp;nbsp;&amp;nbsp;Reading the POR state resets the bit.&amp;nbsp;&amp;nbsp;Many of the tests will not function correctly, or are considered invalid, if a POR is indicated.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Chamber Characterization&lt;/b&gt;&lt;br /&gt;One of the most challenging aspects associated with proving the efficacy of the test system, was characterizing the distribution of the test gasses in the chamber (Figure 10).&amp;nbsp;&amp;nbsp;The initial concept was to introduce the gasses at the four corners of the load board, assuming that, over time, the gas would mix and be distributed evenly within the chamber.&amp;nbsp;&amp;nbsp;But tests proved that the gas would not reach a homogenous concentration within the chamber in the time limit defined by the soak list.&amp;nbsp;&amp;nbsp;Increasing the flow rate of the test gasses, and extending the soak time, were both considered as a remedy for this shortcoming, but in the end were deemed too expensive in gas utilization and test throughput, respectively.&lt;br /&gt;&lt;br /&gt;Extensive experimentation, later substantiated by fluid modeling, demonstrated that a modified manifold approach produced near ideal gas distribution.&amp;nbsp;&amp;nbsp;The gas was introduced at four points into a low-volume manifold located directly above the DUT sockets.&amp;nbsp;&amp;nbsp;Pin-holes in the manifold above each socket deliver a concentrated stream of the test gasses directly to each device.&amp;nbsp;&amp;nbsp;The end result was near optimal performance utilizing a minimum amount of test gas, without adversely affecting test throughput.&amp;nbsp;&amp;nbsp;The chamber design will be modified to incorporate these findings into the production systems.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200313/Gas_Manifold.jpg" alt="Gas Manifold" title="Gas Manifold" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Figure 10 : Device Gas Manifold&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;In conclusion, each of the criteria for the test system was met, or exceeded.&lt;ul&gt;&lt;li&gt;The solution had to have a low initial capital cost.&amp;nbsp;&amp;nbsp;Based on the PXI form factor, a creative hardware and software implementation resulted in a capital cost at well under 1/5 of the cost of a conventional semiconductor test system.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The system needed to support very large parallel test capability.&amp;nbsp;&amp;nbsp;Site count can be expanded from 64 sites to 512 sites, in 64 site increments.&amp;nbsp;&amp;nbsp;At these capacities, a 35 minute test cycle still results in a throughput rating of just over 4 seconds per device.&amp;nbsp;&amp;nbsp;Further optimization of the test code, gas flow rate, soak times and pass/fail parameter optimization will drive the test time per device even lower.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A means for an operator to visually identify and manually bin passing and failing components was required.&amp;nbsp;&amp;nbsp;Test status LEDs with battery backup provides the operator with a visual indication of DUT site pass/fail (Figure 11). &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200313/DUT_Board.jpg" alt="DUT Board" title="DUT Board" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Figure 11 : DUT Board with LED Indicators for Pass/Fail Status&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;All measurements needed to be completed in less than one second.&amp;nbsp;&amp;nbsp;The time to measure the MOX resistance for 64 sites was measured at less than 800 mS.&amp;nbsp;&amp;nbsp;Due to the parallel operation of the GX5295 digital test instrument, extending the site count to 512 will not appreciably increase the measurement time.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The system needed to be expandable.&amp;nbsp;&amp;nbsp;Site count can be expanded from 64 sites to 512 sites in 64 site increments.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Isolate the I&lt;sup&gt;2&lt;/sup&gt;C bus to each device.&amp;nbsp;&amp;nbsp;Each DUT socket has an isolated I&lt;sup&gt;2&lt;/sup&gt;C bus for programming and reading/writing register, accessed as an 8 x 8 matrix (8 groups of 8 DUT’s).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Provide PMU/pin capability.&amp;nbsp;&amp;nbsp;The GX5295 architecture comes standard with a PMU per pin capability, plus four additional PMUs for general purpose use.&amp;nbsp;&amp;nbsp;The PMUs provided an easy method to perform a contact test and the additional PMUs were dedicated to MFC control, helping to lower the system cost by eliminating extra hardware.&lt;/li&gt;&lt;/ul&gt;The specialized requirements associated with the testing of MOX gas sensors presented unique challenges. In particular, the large test “dwell” time required by these devices demanded a different kind of test solution – one that could be easily scaled to support very large parallel test capabilities with test assets that were significantly lower in cost than the traditional “big iron” ATE solution.&amp;nbsp;&amp;nbsp;As detailed above, a PXI-based solution based on off-the-shelf hardware and software provided the optimal solution – achieving both high throughput and very moderate cost.</description><link>https://www.MarvinTest.com/KB/Q200313/Metal-Oxide-MOX-Gas-Sensor-Testing</link><pubDate>5/27/2021</pubDate></item><item><title>Translating STIL, WGL, VCD, EVCD and Teradyne ATP files to DIO/DIO6x Files - Published on 5/6/2021</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;The Marvin Test Solutions &lt;b&gt;FIT (File Import Toolkit)&lt;/b&gt; option is a simulation file translator that engineers can use to easily import &lt;b&gt;STIL, WGL, VCD, EVCD&lt;/b&gt; simulation and &lt;b&gt;Teradyne ATP&lt;/b&gt; files to Marvin’s compressed digital file format. The FIT converter is available as a separate option for both families of digital I/O products &lt;b&gt;GtDio6x&lt;/b&gt; (GX5296, GX5960 Series) and &lt;b&gt;DIOEasy&lt;/b&gt; (GX5290 series). Since the features and operation associated with the two options are virtually identical, this article refers to both options as &lt;b&gt;FIT&lt;/b&gt;. Both DioEasy and Dio6xEasy coupled with the -FIT option create a comprehensive tool-set for users to translate, view and debug digital test vectors on the user’s desktop or on a Marvin Test Solutions test system. The following article explains the simple process to convert a file.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Licensing the FIT converter&lt;/h3&gt;FIT is launched from DioEasy/DioEasy6x by selecting File-&gt;File Import from DioEasy/Dio6xEasy, if no license is installed you will be prompted to enter a license string. The license string can be obtained via the MTS support portal (&lt;a href='https://www.marvintest.com/magic' target='_blank'&gt;Magic&lt;/a&gt;), by creating an incident, providing the FIT Serial number and the Computer ID displayed at the bottom of the License Setup dialog as shown here:&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+gx5296+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt; &lt;img src="https://www.MarvinTest.com/images/support/.\\Q200330\\File License Setup.jpg " alt=" DioEasy-FIT License Setup " title=" DioEasy-FIT License Setup " border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1 – DioEasy-FIT License Setup&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The FIT Window&lt;/h3&gt;The following controls are displayed on the FIT window:&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Import File&lt;/b&gt; &lt;br /&gt;May be entered manually or by pressing the &lt;b&gt;Browse (...)&lt;/b&gt; button to browse for the file name to import and convert.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Output DIO File&lt;/b&gt; &lt;br /&gt;This file name will be automatically filled in with same name as the Import file with a DIO/DIO6x file extension. The Output file can be any valid file name or file path.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Signals TAB&lt;/b&gt; &lt;br /&gt;Once the conversion file name has been entered the Signals Tab of the FIT converter will look similar to the display in Figure 2. The Signal names, UUT Direction and the Bidirectional Control are determined by the selected file. The DIO Channels are assigned automatically. All columns can be easily edited with drop-down choices.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200330\\DioEasyFIT.jpg " alt="DioEasy-FIT Main Page" title="DioEasy-FIT Main Page" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2 – DioEasy-Fit Main Page&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Profile TAB&lt;/b&gt;&lt;br /&gt;The Profile Tab provides a simple method to edit signals and also provides a means to change variables or options that will affect the outcome of the conversion. Signals can be copied and pasted from and to the profile tab. This provides a simple method to change the digital channel used, signal name or the UUT Direction. Comments can also be added when followed by a '#'.&lt;br /&gt;&lt;br /&gt;As shown below digital channels can be easily re-sequenced, the UUT direction can change or an unused signal can be removed by removing the DIO channel associated with the signal. Once a Profile has been edited it can be saved for use in future conversions. To save a profile, enter the profile name in the Import Profiles drop list then press the Save Profile to File button. See Import Profiles file name selection in Figure 2.&lt;br /&gt;&lt;br /&gt;The figure below depicts removed channels, channel re-sequencing, and signal renaming using the file import toolkit. &lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;[Signals]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cen_I :&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Input;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Re-sequenced digital channels &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cen_O :&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wen_I :&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wen_O :&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oen_I :&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oen_O :&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Output;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bhen_I :&amp;nbsp;&amp;nbsp; Input;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Removed unused signal&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bhen_O :&amp;nbsp;&amp;nbsp; Output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blen_I :&amp;nbsp;&amp;nbsp; Input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blen_O :&amp;nbsp;&amp;nbsp; Output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a0_I :&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a0_O :&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Output;&lt;br /&gt; [End]&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;h3&gt;File Conversion&lt;/h3&gt;Marvin Test Solutions' DioEasy-FIT converter will import any STIL, WGL, VCD, EVCD simulation or Teradyne ATP files. The conversion process is the same regardless of the file type. Use the following steps below to import a file.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Select the file to import, make sure to select the File type.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;If necessary enter the target digital file name and path (.dio or .dio6x). &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Make any necessary changes to the profile or select a saved profile to use for the conversion. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select the board type to use for the target file. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click on &lt;b&gt;Import&lt;/b&gt; to begin importing the file. &lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;[:+[+GtDio6x-FIT+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Once the import process has started, FIT will switch to the Status tab. The Status tab will show the progress of the conversion and will display any errors encountered. At the completion of a successful conversion the status tab will look similar to the display shown in Figure 3. For additional information regarding DioEasy-FIT refer to the DioSoftware or the GtDio6x User Guides. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200330\\FITStatus.jpg " alt=" DioEasy-FIT Conversion Status " title=" DioEasy-FIT Conversion Status " border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3 – DioEasy-FIT Conversion Status&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200330/Translating-STIL-WGL-VCD-EVCD-and-Teradyne-ATP-files-to-DIO-DIO6x-Files</link><pubDate>5/6/2021</pubDate></item><item><title>Proper Termination of High-Speed Digital Signals - Published on 5/6/2021</title><description>&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;When interfacing to any digital logic source, it is important to provide quality signals to the device under test (DUT).&amp;nbsp;&amp;nbsp;And the key to providing quality signals is to treat the interconnecting cables between the digital source and the digital receiver as a transmission line requiring proper termination.&amp;nbsp;&amp;nbsp;This termination can take the form of impedance matching and Impedance bridging.&lt;br /&gt;&lt;br /&gt;Impedance matching is the design practice of setting the input impedance (Z&lt;sub&gt;L&lt;/sub&gt;) of an electrical load equal to the fixed output impedance (Z&lt;sub&gt;S&lt;/sub&gt;) of the signal source to which it is connected, usually in order to maximize the power transfer and minimize reflections from the load&lt;sup&gt;1&lt;/sup&gt;, while Impedance Bridging maximizes transfer of a voltage signal to the load&lt;sup&gt;2&lt;/sup&gt;.&amp;nbsp;&amp;nbsp;When the output impedance of a device is connected to the input impedance of another device, it is a bridging connection if the second device does not appreciably load the previous device&lt;sup&gt;2&lt;/sup&gt;.&lt;/td&gt;&lt;td&gt;[:+[+dioeasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;For many electrical systems, simple wires and cables are adequate connection schemes, but for high-speed digital signals, this is not the case.&amp;nbsp;&amp;nbsp;The fast edge rates of these signals contain frequency components that are much faster that the data rate of the signals.&amp;nbsp;&amp;nbsp;And it is edge speed, not data rate or clock frequency that is the critical parameter.&amp;nbsp;&amp;nbsp;As the edge rate of the signal approaches the round-trip propagation delay of the signal through the cable, the cable begins to behave as a transmission line.&amp;nbsp;&amp;nbsp;A good rule-of-thumb in determining the propagation delay of a cable is to use 1nS per foot cable length.&amp;nbsp;&amp;nbsp;In figure 1, if the cable length (L) were 1 foot, then a digital signal with a 2nS edge rate would require that the cable be terminated with a load of Z ohms.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200196\Fig1.JPG" alt="Unterminated Transmission Line" title="Unterminated Transmission Line" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1 – Unterminated Transmission Line&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;There are many methods for terminating a transmission line.&amp;nbsp;&amp;nbsp;While some use active components, like diodes, this article will focus on the more common method of using resistors.&amp;nbsp;&amp;nbsp;For instance, a common TTL transmission environment is 100 ohms.&amp;nbsp;&amp;nbsp;Impedances of 50-75 ohms are also used, but have a disadvantage that the termination resistors would place a large load on the digital driver.&amp;nbsp;&amp;nbsp;This is best to avoid, especially for "weak" drive devices.&amp;nbsp;&amp;nbsp;The simplest way to terminate a 100 ohm transmission line would be to place a resistor at the end or the cable (Figure 2) where R&lt;sub&gt;L&lt;/sub&gt; is equal to Z Ohms.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200196\Fig2.JPG" alt="Terminated Transmission Line" title="Terminated Transmission Line" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2 – Terminated Transmission Line&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This termination scheme, while simple, places an added load on the driver.&amp;nbsp;&amp;nbsp;In keeping with the above example, if the drive voltage were 5V, and R&lt;sub&gt;L&lt;/sub&gt; is 100 ohms, then the termination load is 5Volts/100Ohms=50mA.&amp;nbsp;&amp;nbsp;This is beyond what many TTL devices can accommodate.&amp;nbsp;&amp;nbsp;One way to address this loading is to use a higher impedance cable.&amp;nbsp;&amp;nbsp;Simply changing your transmission environment to 125 ohms would lower the termination loading to 40mA – still high, but lower than the previous example.&amp;nbsp;&amp;nbsp;An advantage of this method of termination is the ability to handle multiple fanouts.&amp;nbsp;&amp;nbsp;Each fanout stub would have their own termination resistors, but the fanout network would multiply the termination loading.&lt;br /&gt;&lt;br /&gt;To address the loading drawback, parallel termination can be used.&amp;nbsp;&amp;nbsp;Terminating the transmission line requires that the termination load be referenced to a power plane.&amp;nbsp;&amp;nbsp;While the ground plane is typically considered the termination reference, the V&lt;sub&gt;CC&lt;/sub&gt; power plane can also be used (Figure 3).&amp;nbsp;&amp;nbsp;The resistors R&lt;sub&gt;PU&lt;/sub&gt; (Pull-Up) and R&lt;sub&gt;PD&lt;/sub&gt; (Pull-Down), while technically not in parallel, for the purposes of transmission line termination, are in parallel with each other.&amp;nbsp;&amp;nbsp;The resulting termination value is calculated using Ohms Law:&amp;nbsp;&amp;nbsp;R&lt;sub&gt;L&lt;/sub&gt;=(R&lt;sub&gt;PU&lt;/sub&gt; x R&lt;sub&gt;PD&lt;/sub&gt;) / (R&lt;sub&gt;PU&lt;/sub&gt; + R&lt;sub&gt;PD&lt;/sub&gt;).&amp;nbsp;&amp;nbsp;If Z were 125 ohms, then using R&lt;sub&gt;PU&lt;/sub&gt; and R&lt;sub&gt;PD&lt;/sub&gt; with values of 180 ohms and 390 ohms, respectively, would result in a Thévenin equivalent termination of 123 ohms.&amp;nbsp;&amp;nbsp;The load on the driver, when outputting a 4V logic “1”, would only be around 10mA – well within the range of most TTL devices.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200196\Fig3.JPG" alt="Parallel Termination" title="Parallel Termination" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3 – Parallel Terminated Transmission Line&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;GX5292 &lt;/b&gt;has 330/390 parallel termination built in and are user selectable in groups of eight channels using on-board relays.&amp;nbsp;&amp;nbsp;This termination is intended to provide proper termination of UUT driven signals, but has minimal affect of signals driver by the &lt;b&gt;GX5292&lt;/b&gt;.&amp;nbsp;&amp;nbsp;The termination can be enabled programatically, or using the &lt;b&gt;Group Termination &lt;/b&gt;controls on the &lt;b&gt;DioEasy Panel's I/O Channel Settings &lt;/b&gt;tab.&amp;nbsp;&amp;nbsp;The &lt;b&gt;GX5055 &lt;/b&gt;and &lt;b&gt;GX5960 &lt;/b&gt;also provide on-board termination, however, they are controlled per pin, and includes the ability to source and sink current.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200196\Fig4.JPG" alt="DioEasy Panel" title="DioEasy Panel" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4 – DioEasy Panel - Group Termination Controls&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A little overshoot is not harmful to your system.&amp;nbsp;&amp;nbsp;In fact, many designs under-terminate a signal on purpose to achieve some overshoot and undershoot.&amp;nbsp;&amp;nbsp;This guarantees a clean transition through the UUT input thresholds so you don't linger in the hysteresis range of the receiver.&amp;nbsp;&amp;nbsp;It will also reduce termination loading further.&amp;nbsp;&amp;nbsp;Under-termination produces some ringing in the signal at the receiver (figure 4), but so long as the negative "bounce" does not drop below the input-high threshold of your receiver (Vih), there is no negative affect.&amp;nbsp;&amp;nbsp;As a general rule, if the ringing is not affecting your UUT's operation, then it may not be a problem and you can ignore it.&amp;nbsp;&amp;nbsp;A 220/330 ohm termination network would provide 132 ohm termination; slightly under-terminating a 125 ohm transmission line and producing minor ringing on the signal.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200196\Fig5.JPG" alt="Minor ringing" title="Minor ringing" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5 – Minor ringing in a digital signal&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Digital signal are often part of a bi-directional bus, and it is typically a requirement that when a bi-directional line is tristated, the bus will “float” to a known level.&amp;nbsp;&amp;nbsp;A 125 ohm termination resistor to ground or V&lt;sub&gt;CC&lt;/sub&gt; will guarantee that a tristated bus would be pulled to ground or to V&lt;sub&gt;CC&lt;/sub&gt;, respectively.&amp;nbsp;&amp;nbsp;Parallel termination can allow a bus that is in an undriven state to float to a predetermined value.&amp;nbsp;&amp;nbsp;For example, 180/390 ohm parallel termination will force a tristated signal to about 46% of V&lt;sub&gt;CC&lt;/sub&gt;, or about 2.3V for V&lt;sub&gt;CC&lt;/sub&gt; equal to 5V.&lt;br /&gt;&lt;br /&gt;Source termination is an example of &lt;b&gt;Impedance Bridging&lt;/b&gt; termination.&amp;nbsp;&amp;nbsp;As mentioned previously, impedance bridging maximizes transfer of a voltage signal to the load.&amp;nbsp;&amp;nbsp;Since most IC’s have a very high input impedance, large drive currents are not required to transmit a signal, so long as the voltage levels comply with the V&lt;sub&gt;IL&lt;/sub&gt; and V&lt;sub&gt;IH&lt;/sub&gt; parameters.&amp;nbsp;&amp;nbsp;Source termination places a resistor in series with the driver, with the source resistance value (R&lt;sub&gt;S&lt;/sub&gt;) equal to the characteristic impedance of the transmission line (Figure 5).&amp;nbsp;&amp;nbsp;The resistor (R&lt;sub&gt;S&lt;/sub&gt; Ohms), in series with the transmission line (Z Ohms) will appear as a voltage divider.&amp;nbsp;&amp;nbsp;When R&lt;sub&gt;S&lt;/sub&gt; Ohms equals Z Ohms, the instantaneous voltage on the transmission line will be 50% of the voltage provided by the driver.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200196\Fig6.JPG" alt="Source Termination" title="Source Termination" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6 – Impedance Bridging Source Termination&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The 50% amplitude wave propagates down the transmission line until it sees the large mismatch at the unterminated receiver.&amp;nbsp;&amp;nbsp;Source termination relies on the large mismatch to reflect 100% (ideally) of the signal back into the transmission line – in effect, instantly doubling the voltage at the receiver from 50% of the drive voltage to 100%.&amp;nbsp;&amp;nbsp;Since there is very little power transferred to the receiver - remember, source termination is impedance bridging, not impedance matching, the voltage level remains nearly equal to the drive voltage.&amp;nbsp;&amp;nbsp;The reflected wave propagates back down the transmission line, where the source termination resistor absorbs it.&lt;br /&gt;&lt;br /&gt;There are a couple of caveats to using this termination scheme.&amp;nbsp;&amp;nbsp;First, if you were to look at the signal on the transmission line side of the source termination resistor, you would see a very poor digital signal.&amp;nbsp;&amp;nbsp;The signal would rise to 50% of the driver voltage, remain at this level for 2x the propagation delay of the cable (approximately 1nS/ft), and then complete the transition to 100% of the drive voltage, producing a stair-step transition.&amp;nbsp;&amp;nbsp;However, we are not concerned with the signal integrity at the source.&amp;nbsp;&amp;nbsp;The receiver sees a clean 100% signal transition, which is what is important in digital signal transmission.&lt;br /&gt;&lt;br /&gt;The other disadvantage of source termination is that it works best for a single receiver.&amp;nbsp;&amp;nbsp;Additional receivers on the bus will be unterminated stubs.&amp;nbsp;&amp;nbsp;When the source terminated signal reaches a stub, the 50% amplitude signal is divided in half again, producing a 25% amplitude signal (assuming the stub matches the impedance of the transmission line).&amp;nbsp;&amp;nbsp;Now the 100% reflection at the receiver produces a 50% amplitude transition (assuming a single stub), and the reflected wave when it reaches the transmission line will be split between propagating back down the transmission line, and propagating to the other stub.&amp;nbsp;&amp;nbsp;With multiple receivers on a source terminated transmission line, instead of seeing clean transitions at the receiver, you get a transition with steps and added ringing caused by multiple reflections bouncing every which-way.&amp;nbsp;&amp;nbsp;If the length of all of the stubs is very short, then the perturbations in the edge transitions will be minimal, and the signal quality might be adequate.&amp;nbsp;&amp;nbsp;But with source termination, as the unterminated stub lengths increase, edge transition quality for all receivers decreases.&lt;br /&gt;&lt;br /&gt;One final caution about using source termination.&amp;nbsp;&amp;nbsp;Providing both source and load termination on the same signal, while resulting in a very reliable signal, will also limit the amplitude to half of what it would otherwise be.&amp;nbsp;&amp;nbsp;As illustrated in figure 6, double termination creates a voltage divider at the receiver.&amp;nbsp;&amp;nbsp;The current across R&lt;sub&gt;S&lt;/sub&gt; and R&lt;sub&gt;L&lt;/sub&gt; is equal, and assuming the values of R&lt;sub&gt;S&lt;/sub&gt; and R&lt;sub&gt;L&lt;/sub&gt; are equal, the voltage at the receiver is 50% of the source voltage, rather than the full source voltage.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200196\Fig7a.JPG" alt="Source Termination" title="Source Termination" border='0' &gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200196\Fig7b.JPG" alt="Source Termination" title="Source Termination" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 7 – Double Terminated Signal&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;The voltage drop from double termination can be compensated for if the source driver has programmable outputs with a range at least double the desired logic level.&amp;nbsp;&amp;nbsp;The GX528x and GX529x series digital instruments available from Geotest (except the GX5295) all have programmable output levels in the range of 0V to 3.6V.&amp;nbsp;&amp;nbsp;The GX5295 has a programmable range of -2V to +7V and the GX5055 and GX5960 have programmable output levels in the range of –10V to +15V.&lt;br /&gt;&lt;br /&gt;Terminating a Differential transmission line requires placing a resistor of the same value as the characteristic impedance of the cable, across the differential signals (figure 8).&amp;nbsp;&amp;nbsp;The termination can be on either or both ends of the transmission line, depending on the application requirements.&amp;nbsp;&amp;nbsp;Cables are generally rated for their characteristic impedance based on the type of cable.&amp;nbsp;&amp;nbsp;For example, the &lt;b&gt;GT95022 &lt;/b&gt;cable supplied with Geotest DIO instruments is a SCSI Fast cable, and as SCSI is a differential transmission standard, the cable impedance is specified as a differential Impedance of 124 ohms, ± 10 Ohms.&amp;nbsp;&amp;nbsp;When used in a single-ended application, then the impedance is half the rated differential impedance.&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+GX5295+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200196\Fig8.JPG" alt="Differential Termination" title="Differential Termination" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 8 – Differential Termination&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To facilitate easy connection of Geotest dynamic digital instruments, Geotest has optional breakout adapters, the &lt;b&gt;GT95014 &lt;/b&gt;and &lt;b&gt;GT95015&lt;/b&gt;, which provide 34 x 2 rows of male pins on a 0.1” spacing.&amp;nbsp;&amp;nbsp;This is compatible with a 68-pin IDC type connector.&amp;nbsp;&amp;nbsp;These adapters accommodate single-ended or differential signals, respectively, and provide sockets for termination resistors on the board.&amp;nbsp;&amp;nbsp;Documentation for these adapters can be found here (&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200196\GT95014.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;GT95014**) and here (&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200196\GT95015.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;GT95015&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200196\GT95014.JPG" alt="GT95014" title="GT95014" border='0' &gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200196\GT95015.JPG" alt="GT95015" title="GT95015" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 9 - GT95014 &amp; GT95015 Breakout Adapters&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In summary, to guarantee good signal quality in a digital environment, it is important to understand when termination is required (as the edge speed of the signal transition approaches the round-trip delay time of the signal through the interface cable), the different methods of terminating a transmission line (source termination, single load termination and parallel load termination), and the advantages and disadvantages of each.&lt;br /&gt;&lt;br /&gt;&lt;sup&gt;1.	Wikipedia - http://en.wikipedia.org/wiki/Impedance_matching&lt;br /&gt;2.	Wikipedia - http://en.wikipedia.org/wiki/Impedance_bridging&lt;/sup&gt;</description><link>https://www.MarvinTest.com/KB/Q200196/Proper-Termination-of-High-Speed-Digital-Signals</link><pubDate>5/6/2021</pubDate></item><item><title>Translating Waveform Generation Language Files (WGL) to Marvin Test Solutions DIO File Format - Published on 5/6/2021</title><description>&lt;h3&gt;Defining WGL&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;The Waveform Generation Language (WGL) is a data description language supported by Test Systems Strategies Inc.&amp;nbsp;&amp;nbsp;A WGL file uses an ASCII representation of the digital waveform data, so can be edited using any text editor.&amp;nbsp;&amp;nbsp;WGL is also an intermediate file format used by the semiconductor industry for converting digital test patterns from a logic simulator to tester hardware, and back again.&lt;br /&gt;&lt;br /&gt;Test information is represented in a WGL file using a structured, free form language with small, specialized structural blocks contained within larger, more generalized blocks.&amp;nbsp;&amp;nbsp;A full discussion of the WGL language and syntax is beyond the scope of this article, but can be found in the TDS Languages Guide, Version 2007.1, published by Test Systems Strategies, Inc.&amp;nbsp;&amp;nbsp;The benefit of WGL is that any digital instrument or tester that is capable of reading or writing test patterns using the WGL language, has a link to any simulation tool that also supports WGL, either directly between the simulator and tester hardware, or indirectly through other translators or filters.&lt;/td&gt;&lt;td&gt;[:+[+dioeasy+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;To illustrate the Marvin Test Solutions Digital I/O (DIO) WGL import filter, a &lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200203\SimpleWGL.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Simple WGL&lt;/a&gt; file was manually generated.&amp;nbsp;&amp;nbsp;Note, this is not a typical WGL file as many of the structural blocks are excluded for clarity.&amp;nbsp;&amp;nbsp;But it does serve as a good primer into the WGL file structure and facilitates demonstrating the process for importing WGL files into the Marvin Test Solutions DIO format.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;A Simple WGL File&lt;/h3&gt;&lt;div class='fixedFont'&gt;Waveform Sample&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Signal&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim00&amp;nbsp;&amp;nbsp; : input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim01&amp;nbsp;&amp;nbsp; : input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim02&amp;nbsp;&amp;nbsp; : input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim03&amp;nbsp;&amp;nbsp; : input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim04&amp;nbsp;&amp;nbsp; : input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim05&amp;nbsp;&amp;nbsp; : input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim06&amp;nbsp;&amp;nbsp; : input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim07&amp;nbsp;&amp;nbsp; : input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim08&amp;nbsp;&amp;nbsp; : input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim09&amp;nbsp;&amp;nbsp; : input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim10&amp;nbsp;&amp;nbsp; : input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim11&amp;nbsp;&amp;nbsp; : input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim12&amp;nbsp;&amp;nbsp; : input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim13&amp;nbsp;&amp;nbsp; : input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim14&amp;nbsp;&amp;nbsp; : input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim15&amp;nbsp;&amp;nbsp; : input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp00&amp;nbsp;&amp;nbsp; : output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp01&amp;nbsp;&amp;nbsp; : output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp02&amp;nbsp;&amp;nbsp; : output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp03&amp;nbsp;&amp;nbsp; : output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp04&amp;nbsp;&amp;nbsp; : output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp05&amp;nbsp;&amp;nbsp; : output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp06&amp;nbsp;&amp;nbsp; : output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp07&amp;nbsp;&amp;nbsp; : output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp08&amp;nbsp;&amp;nbsp; : output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp09&amp;nbsp;&amp;nbsp; : output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp10&amp;nbsp;&amp;nbsp; : output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp11&amp;nbsp;&amp;nbsp; : output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp12&amp;nbsp;&amp;nbsp; : output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp13&amp;nbsp;&amp;nbsp; : output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp14&amp;nbsp;&amp;nbsp; : output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp15&amp;nbsp;&amp;nbsp; : output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;End&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Timeplate Match_0 Period 100nS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim00&amp;nbsp;&amp;nbsp; := input[0pS:S];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim01&amp;nbsp;&amp;nbsp; := input[0pS:S];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim02&amp;nbsp;&amp;nbsp; := input[0pS:S];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim03&amp;nbsp;&amp;nbsp; := input[0pS:S];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim04&amp;nbsp;&amp;nbsp; := input[0pS:S];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim05&amp;nbsp;&amp;nbsp; := input[0pS:S];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim06&amp;nbsp;&amp;nbsp; := input[0pS:S];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim07&amp;nbsp;&amp;nbsp; := input[0pS:S];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim08&amp;nbsp;&amp;nbsp; := input[0pS:S];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim09&amp;nbsp;&amp;nbsp; := input[0pS:S];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim10&amp;nbsp;&amp;nbsp; := input[0pS:S];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim11&amp;nbsp;&amp;nbsp; := input[0pS:S];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim12&amp;nbsp;&amp;nbsp; := input[0pS:S];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim13&amp;nbsp;&amp;nbsp; := input[0pS:S];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim14&amp;nbsp;&amp;nbsp; := input[0pS:S];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim15&amp;nbsp;&amp;nbsp; := input[0pS:S];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp00&amp;nbsp;&amp;nbsp; := output[0pS:Q];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp01&amp;nbsp;&amp;nbsp; := output[0pS:Q];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp02&amp;nbsp;&amp;nbsp; := output[0pS:Q];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp03&amp;nbsp;&amp;nbsp; := output[0pS:Q];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp04&amp;nbsp;&amp;nbsp; := output[0pS:Q];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp05&amp;nbsp;&amp;nbsp; := output[0pS:Q];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp06&amp;nbsp;&amp;nbsp; := output[0pS:Q];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp07&amp;nbsp;&amp;nbsp; := output[0pS:Q];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp08&amp;nbsp;&amp;nbsp; := output[0pS:Q];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp09&amp;nbsp;&amp;nbsp; := output[0pS:Q];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp10&amp;nbsp;&amp;nbsp; := output[0pS:Q];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp11&amp;nbsp;&amp;nbsp; := output[0pS:Q];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp12&amp;nbsp;&amp;nbsp; := output[0pS:Q];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp13&amp;nbsp;&amp;nbsp; := output[0pS:Q];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp14&amp;nbsp;&amp;nbsp; := output[0pS:Q];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp15&amp;nbsp;&amp;nbsp; := output[0pS:Q];&lt;br /&gt;&amp;nbsp;&amp;nbsp;End&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Pattern Loopback (Stim00,Stim01,Stim02,Stim03,Stim04,Stim05,Stim06,Stim07,Stim08,Stim09,Stim10,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stim11,Stim12,Stim13,Stim14,Stim15,Resp00,Resp01,Resp02,Resp03,Resp04,Resp05,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Resp06,Resp07,Resp08,Resp09,Resp10,Resp11,Resp12,Resp13,Resp14,Resp15)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{Start Vectors}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Loop 32&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Repeat 4&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{End Vectors}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector(+, Match_0) := [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End&lt;br /&gt;&amp;nbsp;&amp;nbsp;End&lt;br /&gt;End&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The keyword &lt;b&gt;Waveform &lt;/b&gt;denotes the beginning of a waveform block called &lt;b&gt;Sample&lt;/b&gt;.&amp;nbsp;&amp;nbsp;Within the Waveform block are several sub-blocks; the first is a sub-block denoted by the keyword &lt;b&gt;Signal&lt;/b&gt;.&amp;nbsp;&amp;nbsp;This block defines the signal names and types.&amp;nbsp;&amp;nbsp;The point of reference for the signal types is the UUT, meaning that all the I&lt;b&gt;nput&lt;/b&gt; signals (Stim Names) are input to the UUT, and all &lt;b&gt;Output&lt;/b&gt; signals (Resp&amp;nbsp;&amp;nbsp;signal names) are output from the UUT.&amp;nbsp;&amp;nbsp;WGL defines other signal types that are not used in this example.&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;Timeplate &lt;/b&gt;keyword defines the beginning of the block structure called &lt;b&gt;Match_0&lt;/b&gt;, where signal timing is defined.&amp;nbsp;&amp;nbsp;It also defines the period of the Match_0 timing set to be 100nS – a 10 MHz data rate.&amp;nbsp;&amp;nbsp;All of the Stim signals are defined as being active at the beginning of the test cycle (0pS), and the driven data pattern will be substituted (:S) by the value in the signals associated bit position within Pattern block (discussed later).&amp;nbsp;&amp;nbsp;All of the Resp signals are defined as being active at the beginning of the test cycle (0pS), and the compare data pattern will be substituted (:Q) by the value in the signals associated bit position within Pattern block.&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;Pattern &lt;/b&gt;block called &lt;b&gt;Loopback &lt;/b&gt;first defines the bit ordering for the subsequent data patterns.&amp;nbsp;&amp;nbsp;The ordering is LSB first, so Stim00 is the LSB data position, and the drive state is be represented by the left-most bit value in the vector field.&amp;nbsp;&amp;nbsp;Bit ordering continues with Resp15 being the MSB, with the compare state being represented by the right-most bit value in the vector field.&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;Vector &lt;/b&gt;field defines the substitute I/O patterns for the :S and :Q signals defined in the Match_0 Timeplate, and stipulating the Match_0 timeplate specifies the timing parameters to use.&amp;nbsp;&amp;nbsp;In WGL, each vector has the capability of using different timing parameters, although that is not the case in our simple example.&amp;nbsp;&amp;nbsp;The data pattern for the Stimulus pins and Response pins is a Walking 1 pattern from the LSB word to the MSB word, providing a 16-bit loop back pattern (16 LSB Stimulus pins to 16 MSB Response pins).&amp;nbsp;&amp;nbsp;The pattern is entered once, but looped 32 times, as denoted by the &lt;b&gt;Loop &lt;/b&gt;keyword.&amp;nbsp;&amp;nbsp;The final four vectors are a repeat of the last vector, which contains all 0’s for both the Stimulus and Response signals, as indicated by the &lt;b&gt;Repeat &lt;/b&gt;keyword.&lt;br /&gt;&lt;br /&gt;Each sub-block structure is terminated by the &lt;b&gt;End &lt;/b&gt;keyword, and the text contained in the curly-braces {} indicated text labels that are included as labels in the resulting DIO file.&lt;br /&gt;&lt;br /&gt;WGL can represent simple Stimulus/Record digital test patterns, as well as more complex Stimulus/Response patterns that incorporate Real-Time compare functionality.&amp;nbsp;&amp;nbsp;Since several Marvin Test Solutions DIO products support both functions, this article will demonstrate importing the sample WGL file both ways.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Activating DIOEasy-FIT - WGL Import Toolkit&lt;/h3&gt;The Marvin Test Solutions WGL import utility is a licensed product of Marvin Test Solutions , Inc.&amp;nbsp;&amp;nbsp;Once purchased, the &lt;b&gt;File Import Translator&lt;/b&gt; license (FIT) can be activated by entering a unique license string for the system.&amp;nbsp;&amp;nbsp;The license string is based on the &lt;b&gt;Computer ID&lt;/b&gt; of the host system where the license will be installed, and can be found from DIOEasy by clicking on &lt;b&gt;Help\About DIOEasy\Setup License&lt;/b&gt;, and selecting &lt;b&gt;Setup License&lt;/b&gt; (see figure 1).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200203\License Setup.JPG" alt="License Setup" title="License Setup" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 1:&amp;nbsp;&amp;nbsp;File Import Translator License Setup&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The computer ID is the 10 digit code displayed at the bottom of the DIOEasy License Setup dialog - "&lt;b&gt;XXXX YYYY ZZ&lt;/b&gt;" in figure 2.&amp;nbsp;&amp;nbsp;To obtain the FIT license, open a &lt;b&gt;Magic &lt;/b&gt;incident, request an FIT license, and provide the sales order number of your FIT purchase and the Computer ID.&amp;nbsp;&amp;nbsp;You will receive a license that is unique to the system whose ID you provided.&amp;nbsp;&amp;nbsp;Enter the license string in the "&lt;b&gt;License String/File&lt;/b&gt;" text box and click on "&lt;b&gt;OK&lt;/b&gt;".&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200203\FIT License ID.JPG" alt="Computer ID" title="Computer ID" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2:&amp;nbsp;&amp;nbsp;Computer ID Code&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The Marvin Test Solutions WGL import utility is supported using DIOEasy, Marvin Test Solutions' interactive digital development tool set, and from GtDio32.dll API, a Dynamic Link Library of DIO software functions.&amp;nbsp;&amp;nbsp;The full list of these DIO functions and their syntax and uses can be found in the "&lt;b&gt;DioSoftwareProgRef.PDF&lt;/b&gt;" document.&amp;nbsp;&amp;nbsp;This document is included with the &lt;b&gt;GtDio.Exe &lt;/b&gt;driver installation package available from the Marvin Test Solutions web page:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;http://www.marvintest.com/Downloads.aspx?prodId=16&amp;search=package&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;The DioFileImportWgl Function&lt;/h3&gt;One of the functions included in the GtDio32.Dll is DioFileImportWgl().&amp;nbsp;&amp;nbsp;This function is an import utility for reading WGL formated digital test patterns and converting them into a Marvin Test Solutions DIO formatted file.&amp;nbsp;&amp;nbsp;The file can be loaded to the instrument, opened for viewing and editing using DIOEasy, or opened under program control so digital pattern data can be accessed from within a test program.&amp;nbsp;&amp;nbsp;The syntax for this function, and an example of it’s usage are provided below:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DioFileImportWgl (pszSourceWglFile, pszDestDioFile, nConversionMode, nBoardType, pdMaxFrequncy, pdwMaxSteps, pszError, nErrMaxLen, pnStatus)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Parameters:&lt;/b&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;pszSourceWglFile&lt;/td&gt;&lt;td&gt;PCSTR&lt;/td&gt;&lt;td&gt;Source file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;pszDestDioFile&lt;/td&gt;&lt;td&gt;PCSTR&lt;/td&gt;&lt;td&gt;Target DIO file name&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;nConversionMode&lt;/td&gt;&lt;td&gt;SHORT&lt;/td&gt;&lt;td&gt;Conversion mode:&lt;br /&gt;&amp;nbsp;&amp;nbsp; 0 DIO_FILE_WGL_TO_DIO: Standard DIO file.&lt;br /&gt;&amp;nbsp;&amp;nbsp; 1 DIO_FILE_WGL_TO_DIO_RTC: Real Time Compare DIO file&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;nBoardType&lt;/td&gt;&lt;td&gt;SHORT&lt;/td&gt;&lt;td&gt;Sets the target supported DIO board type:&lt;br /&gt;&amp;nbsp;&amp;nbsp; 0x55 DIO_BOARD_TYPE_GX5055 – Gx5055 DIO board type.&lt;br /&gt;&amp;nbsp;&amp;nbsp; 0x70 DIO_BOARD_TYPE_GX5290 - Gx5290 DIO board type.&lt;br /&gt;&amp;nbsp;&amp;nbsp; 0x75 DIO_BOARD_TYPE_GX5290E - Gc5290 Express DIO board type.&lt;br /&gt;&amp;nbsp;&amp;nbsp; 0x7A DIO_BOARD_TYPE_GX5295 - Gc5295 board type.&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;pdMaxFrequncy&lt;/td&gt;&lt;td&gt;PDOUBLE &lt;/td&gt;&lt;td&gt;0 for the WGL importer to use the best vector clock frequency, otherwise overwrites the vector max frequency.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;pdwMaxSteps&lt;/td&gt;&lt;td&gt;PDWORD&lt;/td&gt;&lt;td&gt;The maximum number of steps to convert.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;pszError&lt;/td&gt;&lt;td&gt;PSTR&lt;/td&gt;&lt;td&gt;Buffer to contain the returned error string.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;nErrMaxLen&lt;/td&gt;&lt;td&gt;SHORT&lt;/td&gt;&lt;td&gt;Size of the buffer to contain the error string.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;pnStatus&lt;/td&gt;&lt;td&gt;PSHORT&lt;/td&gt;&lt;td&gt;Returned status: 0 on success, negative number on failure.&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Importing WGL In DIOEasy&lt;/h3&gt;To import a WGL file into a DIOEasy digital file, click on File from the menu bar, and select &lt;b&gt;Import WGL File&lt;/b&gt;.&amp;nbsp;&amp;nbsp;A dialog will pop up prompting you to select the source WGL file, and the destination DIO file (figure 3).&amp;nbsp;&amp;nbsp;In addition to specifying the source and destinations files, you must also select the target DIO instrument from the drop-down list (see the &lt;b&gt;nBoardType&lt;/b&gt; parameter above), and whether to use the default values for the test frequency (data rate) and file size.&amp;nbsp;&amp;nbsp;When importing a WGL file, the import filter will determine the optimal timing to use based on the capabilities of the DIO instrument selected, and set the clock rate accordingly.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200203\WGL Import Dialog.JPG" alt="DIOEasy WGL Import Dialog" title="DIOEasy WGL Import Dialog" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3:&amp;nbsp;&amp;nbsp;DIOEasy WGL Import Dialog&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;One final selection is whether to translate the WGL patterns for stimulus/record operations with &lt;b&gt;Post Process&lt;/b&gt; compare, or to translate the WGL patterns for &lt;b&gt;Real-Time&lt;/b&gt; compare.&amp;nbsp;&amp;nbsp;Real-Time compare has the advantage of performing a hardware comparison of the UUT response against a pre-loaded expected response.&amp;nbsp;&amp;nbsp;Since the compare process is done in hardware, and at the speed the digital engine is operating at, pass/fail results are instantaneous, whereas, post-process compare requires software to read the recorded information from the DIO hardware, and compare each step against a reference file that contains the expected UUT response.&amp;nbsp;&amp;nbsp;The WGL import filter supports both test methodologies, as do selected Marvin Test Solutions digital instruments.&lt;br /&gt;&lt;br /&gt;Once the import process completes, a new DIO file is created and automatically loaded to DIOEasy.&amp;nbsp;&amp;nbsp;The file can be viewed and edited, the same as any other DIO file, and the test file can be loaded to the DIO hardware for execution.&amp;nbsp;&amp;nbsp;Figure 4 shows a portion of the translated Simple.WGL file.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200203\Small Simple DIO.JPG" alt="Translated Simple.WGL Digital Test Patterns" title="Translated Simple.WGL Digital Test Patterns" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4:&amp;nbsp;&amp;nbsp;Translated Simple.WGL Digital Test Patterns&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;h3&gt;Timing Translation&lt;/h3&gt;A common concern when porting digital test from the simulation environment to hardware is how timing parameters are interpreted.&amp;nbsp;&amp;nbsp;A simulator can generate process with picosecond timing resolution.&amp;nbsp;&amp;nbsp;This is far beyond the capability of the actual hardware test system to implement.&amp;nbsp;&amp;nbsp;The WGL import filter will try to fit the timing parameters into the capabilities of the hardware by adjusting the clock frequency to accommodate the minimum phase resolution between the signals.&amp;nbsp;&amp;nbsp;This is done by dividing the WGL test cycle time by the minimum phase difference between the various signals.&amp;nbsp;&amp;nbsp;For example, if you had a WGL file with a cycle time of 1uS (1 MHz data rate), but there was a setup parameter of 10nS between a clock and data channel, the importer would calculate a new data rate for the hardware that meets both criteria.&amp;nbsp;&amp;nbsp;In this example, the digital hardware would run at 100 MHz, providing the 10nS phase resolution.&amp;nbsp;&amp;nbsp;This translates to more digital test vectors loaded into the hardware than the native WGL file represents.&amp;nbsp;&amp;nbsp;In this case, &lt;b&gt;1uS period / 10nS resolution&lt;/b&gt; results in 10:1 pattern depth on the digital tester.&amp;nbsp;&amp;nbsp;So, if the WGL pattern file were initially 1M vectors, the pattern file loaded to the hardware would be 10M vectors.&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;[:+[+GX5295+]+:]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;In some cases, the simulated phase resolution exceeds the capability of the tester, so the WGL importer maintains a proportional relationship between the signals.&amp;nbsp;&amp;nbsp;For example, assume the cycle time is 50nS and some of the channels in that cycle change on 5nS phases (200 MHz resolution).&amp;nbsp;&amp;nbsp;The WGL importer determines that one WGL cycle will require ten DIO cycles (50nS period / 5nS resolution).&amp;nbsp;&amp;nbsp;Assuming the hardware is the GX5292, the minimum&amp;nbsp;&amp;nbsp;cycle timing for this instrument is 10nS (100 MHz maximum frequency), so the pattern data rate would be set to 100 MHz, but you would maintain the 10:1 pattern ratio to keep the phase relationships proportional to the original WGL pattern ( (50nS period / 5nS resolution) = (100nS period / 10nS resolution) ).</description><link>https://www.MarvinTest.com/KB/Q200203/Translating-Waveform-Generation-Language-Files-WGL-to-Marvin-Test-Solutions-DIO-File-Format</link><pubDate>5/6/2021</pubDate></item><item><title>Multisite Digital Test System Design - Published on 3/9/2021</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;Semiconductor digital tests, especially digital test programs converted from simulation files such as STIL, WGL, VCD, EVCD or ATP, are often required to be expanded into multiple DUT test sites. This article discusses the system hardware and software requirements to perform multi-site testing using the GtDio6x product line and ATEasy®, to provide a cost effective solution. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Digital Design Considerations&lt;/h3&gt;When designing a multi-site test program the tradeoffs between cost and performance may not be completely understood. After evaluating the performance and capability of the &lt;a href='https://www.marvintest.com/Product/GX5296' target='_blank'&gt;GX5296&lt;/a&gt; or the &lt;a href='https://www.marvintest.com/Product/GX5961' target='_blank'&gt;GX5964&lt;/a&gt; series of dynamic digital instruments, it may be logical to assume that the large number of channels of a single GtDio6x board should be capable of providing a multi-site digital test solution. While this solution is possible, it cannot yield the performance of a system that uses a digital resource or board per DUT test site. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Domain Per Site Solution&lt;/h3&gt;Marvin Test Solutions recommends that multi-site test systems be designed such that each DUT test site uses its own digital domain, as shown in Figure 1. This solution provides the fastest multi-site test performance, as each DUT test site can be run independently.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200340\\Multi Site.bmp " alt=" Multi-Domain Block Diagram" title=" Multi-Domain Block Diagram" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1 – Multi-Domain Solution Block Diagram&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Using this configuration, all digital resources are available for each DUT test site. The test status of each DUT test site can be instantly identified by reading the Real Time Compare (RTC) error status register. In addition, the system can be designed such that each DUT test site will use the same digital test file and test program. DUT test sites can be can easily be expanded by adding additional digital domains. Using ATEasy® a multi-threaded test program can easily be created to perform this testing.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200340\\multiboard.png " alt=" Domain Per Site Solution " title=" Domain Per Site Solution " border='0' &gt;&lt;br /&gt;&lt;b&gt;Table 1 – The relative merits of the Multi-Domain Solution&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Single Domain Solution&lt;/h3&gt;A multi-site digital test system designed using a single digital domain as shown in Figure 2 has several disadvantages. First, each test site can no longer use the same digital file. This solution will require a separate application to create the additional test sites from the original digital file. This additional application would need to copy the original channel and vector data to all of the new DUT test sites. &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200340\\Single Site.bmp " alt=" Single Domain Block Diagram" title=" Single Domain Block Diagram" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2 – Single Domain Solution Block Diagram&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;This also requires a much more complicated test program to determine DUT test site status. As with the multi-board solution if the RTC error status register is zero then all DUT test sites pass. But when a failure occurs, the status of each DUT test site cannot be determined by simply reading the RTC error status register. The DUT test status must be determined by reading the RTC Error Address and or the record memories.&lt;br /&gt;&lt;br /&gt;[:+&lt;br /&gt;The record memory alone could be read and evaluated to determine the status of all DUT sites, but as the sizes of most of these digital tests are very large, the approach is not practical as it would consume too much test time. &lt;br /&gt;&lt;br /&gt;The RTC Error address memory contains the failing vector addresses up to 1K failures. The record memory for each of these addresses can then read to determine the failing DUT site(s). As each entry indicates a failing location time is not wasted reading large sections of record memory to determine the test failures. Unless the number of failures is less than 1k or all DUTs have failed as indicated above, the status of all DUTs cannot be determined. In this case the test program must disable the failing test sites and rerun the digital test until the status of all DUT test sites are known. The GtDio6x series of digital instruments provides a method to abort the test sequence if a failure is detected; this feature can save test time when a failure occurs. &lt;br /&gt;[+GX5296+]+:]&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\\Q200340\\Singleboard.png " alt=" Single-Domain Per Site Solution " title=" Single-Domain Per Site Solution " border='0' &gt;&lt;br /&gt;&lt;b&gt;Table 2 – The relative merits of the Single-Domain Solution&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;The following table compares the two solutions:&lt;br /&gt;&lt;blockquote&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;&lt;b&gt;Multisite in a Single Domain Solution&lt;/b&gt;&lt;/th&gt;&lt;th&gt;&lt;b&gt;Single Site Per Domain Solution&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;Programming is required to Create Digital Test File&lt;/td&gt;&lt;td&gt;Automatic Generation of Digital Test File&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;Reduced number of PXI Slots and Boards&lt;/td&gt;&lt;td&gt;More Slots/Digital Test Boards&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;Lower Hardware Cost&lt;/td&gt;&lt;td&gt;Higher Hardware Cost&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;Slower Deployment&lt;/td&gt;&lt;td&gt;Faster Deployment&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;Requires complicated programming to find the faulty DUT&lt;/td&gt;&lt;td&gt;Better Diagnostics&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;Lower Test Yield&lt;/td&gt;&lt;td&gt;Maximum Test Yield&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;&lt;div align='center'&gt;&lt;b&gt;Table 3 – Pros and Cons of Single vs. Multiple Domain Solutions&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;Unless the space (PXI slots) in the semiconductor test system is at premium, a multi-site test system should always be designed using one digital domain for each DUT test site. The upfront costs of adding the additional hardware will pay large dividends, guarantying the fastest possible test times and simplifying test programming. Careful consideration of these capabilities is paramount in the design of a multi-site digital test system.</description><link>https://www.MarvinTest.com/KB/Q200340/Multisite-Digital-Test-System-Design</link><pubDate>3/9/2021</pubDate></item><item><title>Using External Events with the GX5296 and GX5960 Products - Published on 10/8/2020</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;It is often a requirement of a digital instrument to wait for a specific event to synchronize data transfers, handshake to a device under test (DUT) or to trigger on a specific event. The digital sequencer of the GX5296/GX5960 series of digital instruments provides capabilities such as&amp;nbsp;&amp;nbsp;conditional / unconditional jump, subroutine jump, or looping. Additionally, the sequencer has the ability to trigger on and or handshake with external signals in order to synchronize with a DUT. The trigger sources for these triggers include the Auxiliary channels as well as up to 32 digital channels. This article focuses on explaining the usage and set up the various triggers available in this series of high speed digital (DIO) products using the GtDio6x panel and ATEasy examples to program the instrument.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Trigger Logic &lt;/h3&gt;The Test Logic block of the digital sequencer as shown in Figure 1 is controlled by the state of the auxiliary (AUX) Inputs and or the Error / Channel Test signal (ERR/CH TEST). The Error / Channel Test or Channel Compare 0 signal is controlled by the state of the digital channels. These trigger mechanisms can direct sequencer operations such as Start, Stop, Halt, Pause and Resume as well as conditional looping from a number of input sources.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200230\TestLogic.bmp" alt="DIO Block Diagram" title="DIO Block Diagram" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 1 - DIO Block Diagram&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Trigger Sources&lt;/h3&gt;Trigger sources are provided by the Auxiliary Channels, PXI Triggers 0-7 and Channel Compare 0. The GX5296 provides 4 and the GX5961 provides 12 Auxiliary channels. The eight PXI triggers an be generated by multiple instruments in the PXI chassis or the PXI system controller. The Channel Compare 0 trigger resource is the result of the state of any number of digital channels on the Master DIO board in the domain. Channel Compare 0 becomes true when the DIO channel states matches the Channel Compare programmed state. The Channel Test also includes mask to remove unwanted channels from the comparison. Any Trigger Input Source can be programmed to be level or edge sensitive and or can be inverted. Triggers can only be sourced from the Master DIO of a domain of channels. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;GtDio6x Panel Trigger Page &lt;/h3&gt;The GtDio6x panel Trigger page as shown in Figure 2 allows the user to view or configure external events to control the state of the digital sequence engine. The available Trigger Logic includes multiple Pause, Resume and Jump commands as well as basic sequencer operations such as Run, Stop or Halt. The sources for these triggers can be programmed to become level or edge sensitive and can be inverted. Some of the trigger logic signals have a reset mode that can allow the trigger to occur only once or multiple times during a burst. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200230\GtDio6xTriggerPage.png" alt="DIO Trigger Page" title="DIO Trigger Page" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 2 - DIO Trigger Page Run Trigger&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Run and Stop Triggers&lt;/h3&gt;To configure a Run trigger simply select the Run trigger to in the trigger logic field. Select the trigger source such as Auxiliary 0, Level/Edge type to Rising Edge, signal Inversion to False. Press the Set button to apply theses settings. Figure 2 shows the Run trigger set to run the sequencer when Auxiliary channel 0 transitions from a low to a high logic level. Note that the Run trigger does not include a reset mode. The configuration of all triggers can be saved and or loaded using a Dio6x file. This configuration and the Stop trigger can be programmed in ATEasy as follows,&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;!ATEasy Run and Stop Trigger Examples&lt;br /&gt;!Run Trigger example&lt;br /&gt;Dio Set Trigger Run(adio6xTriggerSourcePXI0,False,adio6xTriggerOnRisingEdge)&lt;br /&gt;!Stop trigger example&lt;br /&gt;Dio Set Trigger Stop(adio6xTriggerSourcePXI0,False,adio6xTriggerOnFallingEdge)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Halt Trigger using Channel Compare 0&lt;/h3&gt;There are four channel compare triggers as shown in Figure 3. Only Channel Compare 0 can be used as an input trigger source. Each channel of the master in the domain can be used in a Channel Compare. The Channel Compare also provides a mask register to remove channels from the comparison. Each bit of the Expected and Mask values represent a channel.&lt;br /&gt;&lt;br /&gt;When using the GX5296 a channel is "Masked Out" when the mask value of that channel is a logic 1. When using the GX5960 series a channel is "Masked Out" when the mask value of that channel is a logic 0. Channel Compare 0 becomes true when the digital channels state matches the state of the non masked expected value. This example is using the GX5296, the Channel Compare is set to 0x1234 and the mask value is set to 0xFFFF0000. In this case the GX5296 has been programmed to execute in an endless loop waiting for the channels to match the expected value of 0x1234 to halt the sequence. All other channels are ignored.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200230\ChannelCompare.png" alt="DIO Halt Trigger" title="DIO Halt Trigger" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 3 - Halt Trigger using Channel Compare 0&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;!AtEasy Halt Trigger example using Channel Compare 0&lt;br /&gt;dwExpectData=0x1234&lt;br /&gt;dwMaskData=0xFFFF0000&lt;br /&gt;!Setup Channel Compare&lt;br /&gt;Dio Set Sequencer ChannelsCompareTrigger(adio6xChannelsCompareTrigge0, dwExpectData,dwMaskData)&lt;br /&gt;!Setup Halt trigger&lt;br /&gt;Dio Set Trigger Halt(adio6xTriggerSourceChannelCompare0, False, adio6xTriggerOnHighLevel, adio6xHaltTriggerResetStartEndStep)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Jump Triggers&lt;/h3&gt;Using a Jump trigger allows a digital pattern to be repeated until an external event occurs. The trigger state is tested at the end of the step. Care must be used when using this trigger as if the trigger it can create and endless loop if the trigger condition is always present or the step will only run once if the trigger state is not matched. This trigger requires settings on both the Steps page and the trigger page. Refer to figure 4, go to the Steps page and select the where the jump is to occur. In this case Step 2, set the Step Control to Jump then perform the following selections,&lt;ul&gt;&lt;li&gt;Set the Loop Counter to 0&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The jump Condition&amp;nbsp;&amp;nbsp;to Jump Trigger 0 True&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select the GoTo to Step 2&lt;/li&gt;&lt;/ul&gt; &lt;ul&gt;&lt;li&gt;Uncheck the Continuous Loop radio button&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select a loop count 1&lt;/li&gt;&lt;/ul&gt;Finally go to the Trigger page and select Jump Trigger 0. Select the trigger source to PXI Trigger 3, the Level/Edge to High level and press the Set button.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200230\GtDio6xJumpTrigger.png" alt="DIO Jump Trigger" title="DIO Jump Trigger" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 4 - Configuring a Jump Trigger&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;!ATEasy Jump Trigger Example&lt;br /&gt;lStep=2&lt;br /&gt;lNextStep=2&lt;br /&gt;lLoopCount=1&lt;br /&gt;lLoopCounter=0&lt;br /&gt;!Set Step Control&lt;br /&gt;Dio Set Step Control(lStep,adio6xControlActionJump,lNextStep,adio6xControlConditionJumpTrigger0_True,lLoopCount,lLoopCounter,0)&lt;br /&gt;!Set Jump trigger&lt;br /&gt;Dio Set Trigger Jump(adio6xJumpTrigger0,adio6xTriggerSourcePXI3, False, adio6xTriggerOnRisingEdge, adio6xJumpTriggerResetStartEndStep)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Pause Resume Triggers&lt;/h3&gt;Pause Resume triggers offer a method to pause the sequencer to wait for an external event to occur. Unlike the Jump trigger the Pause trigger stops the execution of the sequencer and waits for an external event to Resume the additional digital sequences. Care must be taken when using this trigger as if the resume trigger event never occurs the sequencer will never resume from the pause state. &lt;br /&gt;&lt;br /&gt;Refer to Figure 5, in this case it is known that PXI trigger 0 will be low prior to the start of the burst, this meets the pause trigger condition. The sequencer will resume when the PXI trigger 0 transitions from a low to a high state. To configure the Pause Resume triggers first go to the Steps page and select Step 0. Select the Pause trigger to Pause: Pause Trigger 0=True, Resume: Pause Resume Trigger 0=False. Then go to the Trigger page and select Pause Trigger 0. Set the trigger source to PXI Trigger 0, the Level Edge to Low level and press the set button. Finally select Resume Trigger 0 and set the trigger source to PXI Trigger 0, the Level/Edge to Rising Edge and press the set button. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200230\PauseResumeTrigger.png" alt="DIO Pause Resume Trigger" title="DIO Pause Resume Trigger" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 5 - Pause Resume Trigger&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;!ATEasy Pause Resume Example&lt;br /&gt;lStep=0&lt;br /&gt;!Set Step pause resume trigger&lt;br /&gt;Dio Set Step PauseTriggerResume(lStep,adio6xPauseTrigger0True_ResumePauseTrigger0False,adio6xResumeDisabled)&lt;br /&gt;!Set Pause Trigger&lt;br /&gt;Dio Set Trigger Pause(adio6xPauseTrigger0,adio6xTriggerSourcePXI0,False,adio6xTriggerOnLowLevel, adio6xTriggerResetStepStartResume)&lt;br /&gt;!Set PauseResume Trigger&lt;br /&gt;Dio Set Trigger PauseResume(adio6xResumeTrigger0,adio6xTriggerSourcePXI0,False,adio6xTriggerOnRisingEdge)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;The GtDio6x series of digital instruments provides a robust set of trigger resources that can be used to control the digital instrument. For more information regarding the GtDio6x panel or for specific trigger settings refer to the GtDio6x User's guide. For further information on your specific instrument refer to the GX5296 or GX5960 User's Guides.</description><link>https://www.MarvinTest.com/KB/Q200230/Using-External-Events-with-the-GX5296-and-GX5960-Products</link><pubDate>10/8/2020</pubDate></item><item><title>Countering Cybersecurity and Counterfeit Material Threats in Test Systems - Published on 10/16/2019</title><description>Automatic test systems designed to validate the performance of military and aerospace products have always been held to a higher standard; moreover, emerging threats to data security and instrumentation integrity continue to raise this bar.&amp;nbsp;&amp;nbsp;Engineers are faced with growing pressure to not only ensure that the unit under test (UUT) meets all design criteria, but that it remains safe from malicious attacks aimed at gaining access to test parameters or results, controlling of test sequences and functionality, downloading malware, or impacting functionality by way of counterfeit parts installed in instrumentation. &lt;br /&gt;&lt;br /&gt;Originally presented at AUTOTESTCON 2019.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2019\Cybersecurity_and_Counterfeit_Materials.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200323/Countering-Cybersecurity-and-Counterfeit-Material-Threats-in-Test-Systems</link><pubDate>10/16/2019</pubDate></item><item><title>White Paper: Solving Functional Test Obsolescence - Published on 10/10/2019</title><description>Electronic functional test equipment obsolescence challenges military, aerospace, and manufacturing test engineers who must support mission-critical electronics with lifecycles measured in decades. The lack of available OEM support for legacy Automated Test Equipment (ATE) systems compels users to consider either replacing or upgrading high-performance legacy ATE systems. Yet, the perception that replacing or upgrading obsolete systems is very expensive, extremely difficult, and / or sacrifices functionality prevents users from adopting either solution. &lt;br /&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='noBorder'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200260\wp_GENASYS.jpg" alt="GENASYS" title="GENASYS" border='0' &gt;&lt;/td&gt;&lt;td&gt;Marvin Test Systems’ PXI-based test system offers the features and capabilities needed to support both legacy and next generation factory and depot test needs. Key features and capabilities of the GENASYS platform’ include: &lt;ul&gt;&lt;li&gt;A high performance, PXI-based, digital subsystem for both legacy and next generation digital test needs&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Configurable, commercial off the shelf (COTS) digital, analog, and switching software components&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Comprehensive test program migration tools supporting legacy L200 / L300 test systems&lt;/li&gt;&lt;/ul&gt;To learn more about how the GENASYS platform can solve functional test obsolescence, click &lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2014\MTS_WhitePaper_GENASYS_RevA.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;here.&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description><link>https://www.MarvinTest.com/KB/Q200260/White-Paper-Solving-Functional-Test-Obsolescence</link><pubDate>10/10/2019</pubDate></item><item><title>Presentation: User Programmable FPGAs for ATE - Trends and Applications - Published on 9/12/2019</title><description>User Programmable FPGAs for ATE - Trends and Applications&lt;br /&gt;&lt;br /&gt;User-programmable FPGAs can address a range of analog and digital test needs. &lt;br /&gt;&lt;br /&gt;This presentation will provide an overview of current trends and applications for FPGAs in automated test systems, with a focus on the advantages of employing industry standard design tools, hardware and interfaces to configure a new test instrument or a legacy replacement solution.&lt;br /&gt;&lt;br /&gt;Originally presented at IEEE AUTOTESTCON 2019.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2019\ATC2019panel.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the presentation&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200322/Presentation-User-Programmable-FPGAs-for-ATE-Trends-and-Applications</link><pubDate>9/12/2019</pubDate></item><item><title>The PXI Standard – A Summary of Updates and Enhancements to the PXI Specifications - Published on 9/5/2019</title><description>Since its first release in 1998, the PXI standard has been continually upgraded, taking advantage of the ever evolving capabilities of card modular architectures. The specification, which was initially based on the PCI standard, has been continually updated as both hardware and software technologies / standards have evolved over time. And as summarized in this paper, the latest updates to the PXI specification demonstrate how the standard is focused on addressing the latest technologies and capabilities via its high performance and compact card modular architecture.&lt;br /&gt;&lt;br /&gt;Originally presented at AUTOTESTCON 2019.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2019\PXI_Specification_Updates.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200325/The-PXI-Standard-A-Summary-of-Updates-and-Enhancements-to-the-PXI-Specifications</link><pubDate>9/5/2019</pubDate></item><item><title>Addressing ATE Instrument Obsolescence with Form / Fit / Function Compatible Solutions – A Case Study - Published on 9/5/2019</title><description>The availability of form, fit, function (FFF) replacement instrument solutions offers a viable path for extending the life cycle of automatic test systems and preserving the investment in associated test programs. And for those applications where a significantly large number of active TPSs are involved, the FFF approach offers the only real viable solution. By employing a FFF replacement solution, test system maintainers are able to extend the life cycle of ATE and the associated test program sets as well as improve performance and reliability of both the ATE and the test programs.&lt;br /&gt;&lt;br /&gt;Originally presented at AUTOTESTCON 2019.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2019\ATE_Legacy_Instrument_Replacement.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200324/Addressing-ATE-Instrument-Obsolescence-with-Form-Fit-Function-Compatible-Solutions-A-Case-Study</link><pubDate>9/5/2019</pubDate></item><item><title>White Paper: Modernizing Military Flightline Test Sets With the MTS-207 - Published on 5/24/2019</title><description>This paper describes how the USAF's 309th Software Maintenance Group (SMXG) at Hill Air Force Base developed the PATS (Portable Automated Test Set)-70 which supports the testing of various A-10/C systems on the flightline. Based on Marvin Test Solutions' MTS-207, a state-of-the-art, ruggedized, portable PXI-based platform designed for flightline, back shop, and airborne applications, the MTS-207 provided the USAF with the necessary flexibility to add a specific test instrumentation, such as GX6315 and GX2065 PXI cards for supporting the A-10/C's specific flightline test needs .&lt;br /&gt;&lt;br /&gt;To learn more about the PATS-70 test set, click &lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2017\PATS-70_White_Paper_RevB.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt; here&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200255/White-Paper-Modernizing-Military-Flightline-Test-Sets-With-the-MTS-207</link><pubDate>5/24/2019</pubDate></item><item><title>White Paper: Leveraging Industry Standards for User Programmable FPGA Instrumentation - Published on 9/25/2018</title><description>Field Programmable Gate Arrays (FPGAs) are used extensively in today’s electronic assemblies and test engineers are also choosing to incorporate FPGA-based instrumentation as part of their functional test solutions. Today there are a variety of user-programmable FPGA-based instruments available to test engineers which can be used to support a wide range of applications and interfaces. These instruments employ a range of programming tools and architectures. However, to ensure maximum flexibility and long-term / organic support for test systems and applications, both the suppliers and end-users of these instruments need to focus on employing industry standards. &lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2018\Leveraging_Industry_Standards_for_FPGAs.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200320/White-Paper-Leveraging-Industry-Standards-for-User-Programmable-FPGA-Instrumentation</link><pubDate>9/25/2018</pubDate></item><item><title>White Paper: Next Generation Armament Test Solutions  for the Flightline - Published on 9/25/2018</title><description>Smart weapon systems are now common place within the U.S. Armed Forces community and among U.S. allies. And to ensure mission success, maintainers need to confirm that all of these systems are mission ready or Full Mission Capable (FMC). Gone are the days of simply checking for the absence of stray voltage and the presence of firing signals by using an Armament Circuits Pre-Load Test Set (ACPTS), commonly referred to as a “beer can”. Today’s sophisticated weapon systems need to support not only legacy test needs but also advanced systems by providing multiple measurement and stimulus channels as well as incorporating communication busses such as MMSI, MIL-STD-1760, Ethernet, CAN Bus, and more. The challenges faced by developers and customers alike lie with the difficulty to incorporate these capabilities into a handheld package to help minimize the “footprint of test”. &lt;br /&gt;&lt;br /&gt;There are some advanced solutions available today that can address not only the current generation of legacy and smart weapons but also have the flexibility to address future armament test needs on the flightline. Building on the current generation of “smart” beercans, the next generation solution for flightline test offers maintainers the ability to perform advanced test and diagnosis on the flightline - simplifying maintenance logistics while increasing performance and reducing test and maintenance time. &lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2018\SmartCan_ATC_2018.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200319/White-Paper-Next-Generation-Armament-Test-Solutions-for-the-Flightline</link><pubDate>9/25/2018</pubDate></item><item><title>Presentation: User Programmable FPGA PXI Instrumentation for Functional Test – Applications and Best Practices - Published on 9/20/2018</title><description>User Programmable FPGA PXI Instrumentation for Functional Test – Applications and Best Practices&lt;br /&gt;&lt;br /&gt;Field Programmable Gate Arrays are used extensively in today’s electronic assemblies and test engineers are also choosing to incorporate FPGA – based instrumentation as part of their functional test solutions.&lt;br /&gt;&lt;br /&gt;This presentation will provide an overview of how user-programmable, FPGA-based PXI instrumentation, when combined with commercially available IP (Intellectual Property) or custom logic cores, can provide cost-effective, flexible test instrumentation solutions which can potentially support multiple applications and a range of interfaces using a single, FPGA-based instrument. In addition, the presentation will discuss “best practices” associated with the design and programming of FPGAs in order to ensure success and maintainability for a user – defined FPGA instrument.&lt;br /&gt;&lt;br /&gt;Originally presented at PXI China 2018.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2018\FPGA-Aug2018-PXISAr1.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the presentation&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200318/Presentation-User-Programmable-FPGA-PXI-Instrumentation-for-Functional-Test-Applications-and-Best-Practices</link><pubDate>9/20/2018</pubDate></item><item><title>White Paper: Metal-Oxide (MOX) Gas Sensor Testing - Published on 6/4/2018</title><description>The application of MEMS technology has allowed Metal Oxide (MOX) Gas Sensors to be mass-produced at the wafer level with silicon wafer manufacturing offering cost reduction and scalability to large volumes. &lt;br /&gt;&lt;br /&gt;This white paper discusses how a semiconductor manufacturer of Gas Sensors employed a focused test solution that provided the required accuracy, accommodated very large site counts, and matched the over-all throughput performance of high performance semiconductor test systems at a much lower cost.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2018\MOX_Sensor_Testing.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200315/White-Paper-Metal-Oxide-MOX-Gas-Sensor-Testing</link><pubDate>6/4/2018</pubDate></item><item><title>Active Power Management for Digital Functional Test Systems - Published on 12/18/2017</title><description>Digital functional test systems have been part of the test landscape for over 40 years. The earliest test systems employed simple, static digital test capabilities. However, as the performance and complexity of these digital devices, modules, and systems evolved, the digital test instrumentation advanced as well. In particular, the on-going advancements associated with device toggle rates have placed a corresponding demand for ever-higher performance on the test instrumentation and systems, with today’s high-end semiconductor test systems offering multi-GHz test capabilities with attendant high power dissipation.&lt;br /&gt;&lt;br /&gt;For military-aerospace applications, digital functional test has always presented a unique set of requirements and challenges. Unlike the test requirements associated with high-end device test, M-A applications are primarily focused on supporting module and system level test. Consequently, “bleeding edge” digital test performance is not required; however, a broad range of test flexibility and capability is required.&amp;nbsp;&amp;nbsp;The test systems and associated digital subsystems are tasked with supporting a broad portfolio of both legacy and current generation electronic assemblies, since these test systems are being used to service products in the field as well as test new generation products in the factory.&amp;nbsp;&amp;nbsp;More specifically, test systems deployed in the field (such as the VIPER/T shown in Figure 1) have the added constraints of both size and power dissipation – with the requirement that these systems be portable and exhibit high reliability.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200311/viper-T.jpg" alt="VIPER/T Test System" title="VIPER/T Test System" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Figure 1: VIPER/T Test System&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt; The digital subsystem’s capabilities associated with these types of systems include:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Support vector rates of at least 50 MHz with timing per pin, multiple time sets and a flexible sequencer.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Offer a compact footprint and modular architecture, supporting up to 512 channels within a single chassis.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Offer a wide programmable drive / sense voltage range, which allows support for both legacy applications as well as current&amp;nbsp;&amp;nbsp;technologies.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Flexible architecture providing per pin programmability – maximizing flexibility for a wide range of applications.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Managing the power requirements and power dissipation associated with these digital subsystems is a key requirement to achieving high reliability. Modern digital subsystems employ two major components&amp;nbsp;&amp;nbsp;- a high performance ASIC or FPGA which provides all of the digital logic, timing, and&amp;nbsp;&amp;nbsp;sequence control; and a monolithic pin electronics (PE) device(s) which interfaces to the digital logic and provides the programmable levels to the UUT or device under test (Figure 2).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200311/fig2.png" alt="Digital Subsystem Architecture" title="Digital Subsystem Architecture" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Figure 2: Digital Subsystem Architecture&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Historically, pin electronics for digital subsystems have relied upon custom designs – some discrete, some hybrid and some full custom. However, today there are commercial vendors producing a range of pin electronic products for both semiconductor and board level test applications that offer a high level of integration and channel density. These devices are a key enabler to achieving ever higher channel densities, which also brings with it the on-going challenge of managing power dissipation and power consumption.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Today’s digital subsystems are based on open architecture, card modular platforms such as the VXI and PXI standard, with PXI being the dominant platform. And to accommodate many of the necessary features and capabilities associated with supporting M-A applications, PXI’s 6U form factor offers added PCB real estate and flexibility with regard to the use of additional power supplies, beyond the standard PXI supplies. However, power management is still a primary concern for these digital subsystems. Consider the following:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;For a wide voltage swing, high slew rate configuration, power requirements per channel can be 2.5 W or more, with a 32 channel board requiring 80 watts just for the pin electronics.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A multi-board digital system, with all channels operating in a high voltage mode (25 V range) can require over 1200 W of power for a 512 channel system.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Total input power for a digital subsystem can easily exceed 2 KW for a high channel count system.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;As previously noted, today’s digital subsystem architectures are comprised of pin electronics and a digital ASIC or FPGA and as indicated above, the PEs are responsible for a significant portion of a digital subsystem’s power dissipation.&amp;nbsp;&amp;nbsp;Clearly, there is the opportunity to manage overall system power dissipation by actively managing the configuration and operating conditions associated with the PE devices.&lt;br /&gt;&lt;br /&gt; Modern monolithic pin electronics employ two voltage rails, VH (or VCC) and VL (or VEE), which support the programmable input and output voltage levels and interface to the unit under test. These rails require a wide voltage range (-18 V to +29 V), and are the primary source of high power dissipation within the system.&amp;nbsp;&amp;nbsp;Consequently, by actively managing the PE devices’ operating conditions based on specific test needs, total average power and dissipation can be reduced.&amp;nbsp;&amp;nbsp;Incorporating programmable power&amp;nbsp;&amp;nbsp;supplies into the system for VL and VH and tightly controlling them by software, based on an application’s specific drive / sense levels, offers the ability to manage overall power dissipation.&amp;nbsp;&amp;nbsp;Under software control, active power management can be accomplished in the following ways:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Operation with optimal rail voltages - The quiescent power dissipation for pin electronics is VL+VH times the quiescent current.&amp;nbsp;&amp;nbsp;However, the instrument output’s programmable levels Voh and Vol for a specific application may not be close to the VH and VL rails, with quiescent power dissipation being high regardless of the programmed Voh and Vol levels if the maximum voltages are applied to the VH and VL device rails. However, by programmatically lowering the VH and VL voltage levels such that just enough head room is required for a specific application, power dissipation can be significantly reduced. Consider the case where the programmable output level range is -10 V to +15 V. The VH voltage needs to be around 20 V and the VL voltage needs to be around -15 V to provide head room for the pin electronics circuits. If an application requires Voh=5V and Vol=0V, VH can be programmed down to 10V and VL to -5V. In this case, the pin electronics’ power dissipation will be reduced by more than 50%.&amp;nbsp;&amp;nbsp;By actively managing the VH and VL power supply voltages, power dissipation can be minimized, resulting in lower operating temperatures and increased reliability.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The design of PE devices also allows for the device’s output section to be powered down without affecting the digital state of the device.&amp;nbsp;&amp;nbsp;This feature is extremely useful when one considers that the active duty cycle or burst time for running active digital patterns is very low. Consequently, by incorporating an “intelligent” or “smart” instrument driver that manages the digital subsystem’s power supplies, average power consumption (and power dissipation) can be reduced by over 50%.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Adjustable / programmable slew rate and device bias current also provide the means to actively manage overall digital subsystem power dissipation.&amp;nbsp;&amp;nbsp;For those applications that require a high voltage swing, high slew rate is typically not required.&amp;nbsp;&amp;nbsp;Consequently, the PEs can be programmed via the instrument driver for optimum slew rate and bias levels based on specific test needs. A range of over 2 to 1 is available for managing power dissipation.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;To prove out the effectiveness of the “active power” management implementation, an existing test program that employed a VXI-based digital test system was converted to execute on a 6U PXI digital subsystem (Figure 3) that employs an active power management implementation. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200311/gx5961mts_fig3.JPG" alt="PXI Digital Subsystem" title="PXI Digital Subsystem" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Figure 3: PXI Digital Subsystem&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Compared to the legacy VXI-based digital subsystem, the PXI system demonstrated over a 50% reduction in power consumption under idle conditions - translating into lower operational costs, lower internal operating temperatures, and increased overall system reliability and up time.&amp;nbsp;&amp;nbsp;By leveraging the features and capabilities found in modern digital pin electronics in conjunction with use of “smart” instrument drivers, an active power management implementation can be realized that minimizes power dissipation without sacrificing system performance.</description><link>https://www.MarvinTest.com/KB/Q200311/Active-Power-Management-for-Digital-Functional-Test-Systems</link><pubDate>12/18/2017</pubDate></item><item><title>Using Visual Indicators  (LEDs) in ITAs - Published on 11/13/2017</title><description>&lt;ul&gt;&lt;li&gt;MTS has developed a CCA that serves as a general purpose indicator board.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Attached are the schematics &lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/Q200309\3999-402-00-Aa-SCH.PDF' target='_blank'&gt;3999-402-00-Aa-SCH.PDF&lt;/a&gt; and the assembly drawings 3999-402-00_Assembly Drawings.pdf. The mechanical engineers have a template of the board so they can design an ITA front panel after you tell them which indicator the design uses of the available ones.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;There are 4 AC indicators (LD7 – LD10), supporting ITAs that use a three phase input (Neutral is common for them) and / or a single phase. Those inputs are rectified and designed to be ON for inputs of about 115VAC (most probably will be ON for a much lower voltage too).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;There are 2 DC indicators for the 5-40V range (LD1 - LD2). When the associated jumper connects positions 1 and 2 the range is 5-20V, when connecting 2-3 the range is 6-40V.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;There are 4 DC indicators for the 6-80V range (LD3 – LD6). When the associated jumper connects positions 1 and 2 the range is 8-80V, when connecting 2-3 the range is 6-40V.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Keep in mind that the DC inputs have an input capacitor and the AC inputs have a 270K input resistor. This means that Safe To Turn On or Isolation tests may be impacted.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200309/Using-Visual-Indicators-LEDs-in-ITAs</link><pubDate>11/13/2017</pubDate></item><item><title>White Paper: Implementing Digital Interfaces with User Programmable FPGAs - Published on 9/22/2017</title><description>The electronics test engineer is constantly challenged by a myriad of digital interfaces. Military, Space, Communications, and Automotive electronics all utilize both industry standard and custom digital interfaces. Many of these interfaces are supported with test instrumentation that is dedicated to a specific interface or alternatively, a cycle-based, general purpose digital I/O instrument may be employed.&amp;nbsp;&amp;nbsp;Using dedicated test instrumentation can be very costly and general purpose digital I/O instrumentation can offer only a partial solution as well as requiring substantial programming / debugging, with either solution ultimately driving up the cost of test. A user-programmable FPGA-based solution can offer a cost-effective, alternative solution for supporting digital interfaces and specifically, serial interfaces.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2017\Implementing_Digital_Interfaces_with_User_Programmable_FPGAs.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200308/White-Paper-Implementing-Digital-Interfaces-with-User-Programmable-FPGAs</link><pubDate>9/22/2017</pubDate></item><item><title>Using Subversion (SVN) Source Control From ATEasy - Published on 6/27/2017</title><description>&lt;h3&gt;How to Use Tortoise SVN With ATEasy&lt;/h3&gt;&lt;b&gt;1.&lt;/b&gt; Download and install TortoiseSVN (x86 or x64 depending on your system) from SourceForge.net. Make sure &lt;b&gt;Command line client tools&lt;/b&gt; are installed.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200298\1.PNG" alt="Install TortoiseSVN and make sure command line client tools are installed" title="Install TortoiseSVN and make sure command line client tools are installed" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1: Install TortoiseSVN and make sure the command line client tools are installed.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt; Using Windows explorer, create a folder to host the repository (local or server). Right click the newly created folder and select TortoiseSVN and select &lt;b&gt;Create Repository Here&lt;/b&gt;. Click on &lt;b&gt;Create folder structure&lt;/b&gt;.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200298\2.PNG" alt="Creating a TortoiseSVN repository" title="Creating a TortoiseSVN repository" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2: Creating a TortoiseSVN repository.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt; Open ATEasy, select &lt;b&gt;Tools, Options, then the Source Control tab&lt;/b&gt;. In the drop-down box select &lt;b&gt;Subversion&lt;/b&gt;. Make sure the executable is correct; if not, locate the file and update the Executable field. Click Close and confirm your selection.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200298\3.PNG" alt="Select the TortoiseSVN executable" title="Select the TortoiseSVN executable" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3: Select the TortoiseSVN executable.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.&lt;/b&gt; Open a workspace and select the project you wish to add to the source control repository. &lt;b&gt;Right click on the Project&lt;/b&gt; from the workspace window and select &lt;b&gt;Add&lt;/b&gt;:&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200298\4.PNG" alt="Add your project to the Source Control Repository" title="Add your project to the Source Control Repository" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4: Add your project to the Source Control Repository.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5.&lt;/b&gt; In the&lt;b&gt; Add Files to Source Control&lt;/b&gt; dialog do the following:&lt;ul&gt;&lt;li&gt;Type in the&lt;b&gt; Repository Root&lt;/b&gt; (server or local folder where you created the repository).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Type in the &lt;b&gt;Subfolder&lt;/b&gt; - usually the project name where the added files will be stored in the repository.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Type in the &lt;b&gt;Working Copy Folder&lt;/b&gt; - the root folder for your local files where the project resides. Note that all of the Added files should be located below this root folder.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Check the files that you want to add. Note not to select files that reside in a folder outside of the working folder.&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200298\5.PNG" alt="Add Files to Source Control" title="Add Files to Source Control" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5: Add Files to Source Control.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Next, click &lt;b&gt;OK&lt;/b&gt; to add the files. You will get the following message if TestExec Subfolder in the repository does not exist.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200298\6.PNG" alt="Subfolder if the repository does not exist" title="Subfolder if the repository does not exist" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6: Subfolder if the repository does not exist.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;Click &lt;b&gt;Yes &lt;/b&gt;to add the files to the repository and put them under source control (shown in Cyan color in the workspace window). The files are also checked off as shown here: &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200298\7.PNG" alt="Files under source control have check marks" title="Files under source control have check marks" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 7: Files under source control have check marks.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; The &lt;b&gt;Log window's Source Control tab&lt;/b&gt; will show all the commands invoked by ATEasy that perform the operation (Add Files in this case). This log can also be used to troubleshoot the operation in case of issues due to a wrong command line configuration set by the Options dialog or wrong parameters invoked by ATEasy. The command reply is also visible. The Log window is color coded so that commands invoked by ATEasy show in blue, replies from the source control tool show in green, and error replies show in red.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200298\8.PNG" alt="The Log window Source Control tab" title="The Log window Source Control tab" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 8: The Log window Source Control tab.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; The information about the repository and the local working folder is saved in the ATEasy Workspace file used when you added the file to the source control repository.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6.&lt;/b&gt; You can check the latest status of the file in the source control repository using the &lt;b&gt;Source Control &gt; Show Properties&lt;/b&gt; command.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200298\9.PNG" alt="Source Control File Properties" title="Source Control File Properties" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 9: Source Control File Properties.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;7.&lt;/b&gt; To add the other files that reside under the Drivers folder, repeat steps 4 and 5. Select the &lt;b&gt;Profile &lt;/b&gt;and the &lt;b&gt;Test Exec&lt;/b&gt; drivers and add them to the repository under the &lt;b&gt;Drivers subfolder&lt;/b&gt; and &lt;b&gt;C:\Program Files\ATEasy 9.0\Drivers working folder&lt;/b&gt;.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200298\10.PNG" alt="Add the Other Files that reside under the Drivers folder" title="Add the Other Files that reside under the Drivers folder" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 10: Add the Other Files that reside under the Drivers folder.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;At this point all the project files are added and checked off as shown here:&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200298\11.PNG" alt="All project files are added and checked off" title="All project files are added and checked off" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 11: All project files are added and checked off.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;8.&lt;/b&gt; You now can make changes to the files , save them, and when ready, re-check the files in. For example, change the &lt;b&gt;TestExec1.prg&lt;/b&gt; and check it in. You can also add a comment to describe the changes made as shown here:&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200298\12.PNG" alt="Check In" title="Check In" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 12: Check In.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;9.&lt;/b&gt; You can open the&lt;b&gt; Source Control History&lt;/b&gt; dialog and see all the file revisions that were checked in, including the revision number, the user, the date and the comment:&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200298\13.PNG" alt="Source Control History" title="Source Control History" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 13: Source Control History.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;You&amp;nbsp;&amp;nbsp;can select the revision you need and then click on &lt;b&gt;Get &lt;/b&gt;to copy that revision to add to a selected folder:&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200298\14.PNG" alt="Get a copy of a revision" title="Get a copy of a revision" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 14: Get a copy of a revision.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;Use &lt;b&gt;Open &lt;/b&gt;to open that revision in ATEasy,&lt;b&gt; View Text&lt;/b&gt; to view the revision in text mode, and &lt;b&gt;Diff &lt;/b&gt;to show the difference between the revision and the version you have selected as shown here:&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200298\15.PNG" alt="Use Diff to show the difference between the revision and the version you have" title="Use Diff to show the difference between the revision and the version you have" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 15: Use Diff to show the difference between the revision and the version you have.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;10.&lt;/b&gt; The &lt;b&gt;Get Files&lt;/b&gt; operation is useful when you no longer have the files locally and you want to retrieve them from source control. To get files from the repository, right click and go to &lt;b&gt;Source Control &gt; Get Files&lt;/b&gt;.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200298\16.PNG" alt="Get Files from Source Control" title="Get Files from Source Control" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 16: Get Files from Source Control.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200298/Using-Subversion-SVN-Source-Control-From-ATEasy</link><pubDate>6/27/2017</pubDate></item><item><title>How to Convert C++ Driver Example to LabWindows/CVI - Published on 4/26/2017</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;This Knowledge base will give guidance on how to convert Marvin Test Solutions C++ Driver Example to LabWindows/CVI. Since CVI is based on C and not C++ we need to convert some types from C++ to C. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Steps to Convert Examples&lt;/h3&gt;&lt;b&gt;Step 1: Create LabWindows/CVI Project&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Create the LabWindows/CVI project in the Examples\LabWindows\ folder. Save it at GxXXXExampleC.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 2: Copy Example files to the LabWindows folder&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Copy GxXXX.h, GxXXX.lib and GxXXXExample.cpp files into the newly created folder. Rename the .CPP file to .C as LabWindows only works with C files.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 3: Insert the Example files into the LabWindows/CVI project.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Insert GxXXX.h, GxXXX.lib and GxXXXExample.c files into the newly created project.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 4: Modify the GxXXX.h file.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In the GxXXX.h file there is a piece of code that needs to be modified. &lt;br /&gt;&lt;br /&gt;The original code looks like:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200306\LabWindowsHFileBefore.JPG" alt="GxXXX.h prior to any change being made" title="GxXXX.h prior to any change being made" border='0' &gt;&lt;br /&gt;&lt;br /&gt;After the change is made:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200306\LabWindowsHFileAfter.JPG" alt="GxXXX.h after the change is made" title="GxXXX.h after the change is made" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 5: Modify the GxXXXExample.c code to account for C++ to C changes.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The following changes need to be made to the C file to account for the change in language from C++ to C.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;false needs to changed to FALSE&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;true needs to be changed to TRUE&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;new needs to be changed with malloc&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;padwDataWr = new DWORD[dwDmaByteCount];&lt;br /&gt;becomes&lt;br /&gt;padwDataWr = (DWORD *) malloc(sizeof(DWORD) * dwDmaByteCount);&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;delete[] needs to be converted to free&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;delete [] padwWr;&lt;br /&gt;becomes&lt;br /&gt;free(padwDataWr);&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;atoi() needs to be converted to (BYTE)atoi()&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;atoi(szParameter);&lt;br /&gt;becomes&lt;br /&gt;(BYTE)atoi(szParameter)&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;To convert a C++ example to LabWindows/CVI can be done, but there are some challenges that need to be met. When converting your own C++ code to LabWindows, be aware of any language specific changes that need to be made.&lt;br /&gt;&lt;br /&gt;&lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/\Q200306\GxFpgaExampleC_LabWindows.zip' target='_blank'&gt;Download&lt;/a&gt; LabWindows/CVI Example showing converting the C++ provided with GXFPGA driver converted to C.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200306/How-to-Convert-C-plus-plus-Driver-Example-to-LabWindows-CVI</link><pubDate>4/26/2017</pubDate></item><item><title>Migrating from ATEasy 2.x to ATEasy 9.0 - Published on 4/25/2017</title><description>To begin migrating your ATEasy 2 project to the new ATEasy:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;1. Installing ATEasy&lt;/h3&gt;Install the new version of ATEasy with Migration Files. This installation choice has DLLs that will be used in the conversion step.&lt;br /&gt;&lt;br /&gt;You can choose to install the Migration Files by:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Selecting &lt;b&gt;Install&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Selecting the &lt;b&gt;ATEasy 2.x Migration Files&lt;/b&gt; option in the Custom Install. If you have already installed ATEasy just rerun the installation and choose &lt;b&gt;Modify&lt;/b&gt; and check the &lt;b&gt;ATEasy 2.x Migration Files&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200307\InstallingMigrationFiles.JPG" alt="Installing Migration Files" title="Installing Migration Files" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1: Installing Migration Files&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;The ATEasy Setup will copy three Migration Files:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ATEasy2_32.dll&lt;/b&gt;: This file is used for loading and converting ATEasy 2 files into the new ATEasy file format.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ATEZUser32.dll&lt;/b&gt;: This file is used if your existing ATEasy 2 system makes use of the USER driver (ATEZUser.drv).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ATEZUser.drv&lt;/b&gt;: This file is a new ATEasy driver file replacing the ATEZUSER.ins used by system files in ATEasy 2. It provides procedures to create user interface elements used in ATEasy 2 applications&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;2. Creating a New Project&lt;/h3&gt;Create a new project using the &lt;b&gt;File, New.. &lt;/b&gt;menu command.&amp;nbsp;&amp;nbsp;That project will become the Active Project (shows in bold in the workspace window).&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200307\CreatingANewProject.JPG" alt="Creating a New Project" title="Creating a New Project" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2: Creating a New Project&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200307\ProjectInWorkspace.JPG" alt="New Project in the Workspace" title="New Project in the Workspace" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3: The new Project is shown in bold in the Workspace View&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;3. Save the New Project&lt;/h3&gt;Save the project file by clicking &lt;b&gt;File, Save&lt;/b&gt;. We recommend to save all application files (.prg, .sys, .drv, .prj. wsp) that were migrated or created to a single and new application folder.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;4. Adding System File&lt;/h3&gt;Open and add the ATEasy 2 system file (.CFG file) into the new ATEasy project using the &lt;b&gt;File, Open...&lt;/b&gt; menu command. Make sure &lt;b&gt;Add to Project&lt;/b&gt; is checked in the &lt;b&gt;File Open dialog&lt;/b&gt;.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200307\AddingCFGToATEasyProject.JPG" alt=".CFG file being added" title=".CFG file being added" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4: ATEasy 2 .CFG file is added into the ATEasy project&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;During the process of converting the system file the ATEasy 2 driver files (.INS) that are configured to your old system will be also converted. If ATEasy cannot find the INS file you'll be prompt to enter a new path for them. You will also be prompted to replace any 16 bit DLLs that were used by the old driver files to 32 bit DLLs. ATEasy will scan your system and driver file code and make changes during the conversion.&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200307\INSFilesMigratedDuringCFGMigration.JPG" alt=".INS files being migrated" title=".INS files being migrated" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5: ATEasy 2 .INS files are migrated during CFG file migration.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200307\SystemFileAfterMigration.JPG" alt="System File After Migration" title="System File After Migration" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6: ATEasy System File after migration.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;5. Adding a TestExecutive&lt;/h3&gt;If you need a test executive user interface to your application insert the &lt;b&gt;TestExec.drv and Profile.drv&lt;/b&gt; (Profile driver must be inserted before the Test executive).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200307\InsertingTestExecAfterSystemMigration.JPG" alt="Inserting TestExec after migration" title="Inserting TestExec after migration" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 7: Inserting TestExec after Migration of the System file is complete.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200307\SystemFileAfterTestExecInserted.JPG" alt="System File After TestExec is inserted" title="System File After TestExec is inserted" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 8: ATEasy System File after TestExec is inserted.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;6. Inserting Programs&lt;/h3&gt;Insert your ATEasy 2 program (.PRG) files into the new ATEasy project (similar to step #3) . ATEasy will scan your program code and make changes during the conversion. &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200307\InsertingProgramFiles.JPG" alt="Inserting Program File" title="Inserting Program File" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 9: Inserting an ATEasy Program(PRG) File.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200307\InsertingProgramFileInFolder.JPG" alt="Choosing a Program File" title="Choosing a Program File" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 10: Choosing an ATEasy Program(PRG) File.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200307\ProgramInsertedIntoProject.JPG" alt="Program Inside ATEasy Project" title="Program Inside ATEasy Project" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 11: Program shown in the Workspace view inside the newly created Project.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;If you have not saved the files up until now this would be a good time to do Save All. This will make sure that all the migration is saved. The old ATEasy 2 files will not be changed. Since the Program files keep the same file extension, the file name should be changed or saved in a different location.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200307\MigratedProgramFileSave.JPG" alt="Saving the Migrated Program File" title="Saving the Migrated Program File" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 12: Saving the Migrated Program file to another name.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Finally there is the workspace to save. In ATEasy 2 these did not exist, but this is where you can link many ATEasy projects together. You can choose not to have a workspace and add the project to an empty workspace every time you want to work with it, but it is beneficial to have all your projects in one easy to reach location.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200307\WorkspaceSave.JPG" alt="Saving the Workspace" title="Saving the Workspace" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 13: Saving the Workspace to link many Projects together.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Downloads&lt;/h3&gt;If you would like to see the files that were imported, the example is available for &lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/Q200307\ATEasy2MigrationExample.zip' target='_blank'&gt;download&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you would like to read more information about ATEasy migration and what has been changed in the new ATEasy continue to the sections below. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;What's New in ATEasy from version 2.x&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='2' border=0 class='border'&gt;&lt;tr&gt;&lt;th&gt;New ATEasy&amp;nbsp;&amp;nbsp;Features&lt;/th&gt;&lt;th&gt;ATEasy 2 Features&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;Windows 9x, or newer user interface incorporating all of the GUI capabilities and design features of these advanced operating systems.&lt;/td&gt;&lt;td&gt;Windows 3.1 user interface.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;A 32-bit application written using the Win32 programming model and object-oriented techniques.&lt;/td&gt;&lt;td&gt;A 16-bit application.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;An event-driven programming language using properties, methods and events to aid in ease of use and functionality.&lt;/td&gt;&lt;td&gt;A declarative programming language.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;Support for OLE Automation, for interaction with other OLE-compliant applications such as Microsoft Excel.&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;Integration of the various "editors" of ATEasy 2 into a coherent and unified menu structure.&lt;/td&gt;&lt;td&gt;Specialized "editors" for different areas of the program.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;Forms&lt;/b&gt; are now built into ATEasy, and use events to respond to user action.&lt;/td&gt;&lt;td&gt;Only dialog boxes can be constructed.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Code Changes&lt;/h3&gt;&lt;b&gt;1. Converting Basic Data Types to 'C' like data types.&lt;/b&gt;&lt;br /&gt;Basic data types have been renamed in the new version to correspond with 'C'-like data types. Their size and functionality remain the same. When you do programming in the new ATEasy, you will have to use the renamed data types.&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='2' border=0 class='border'&gt;&lt;tr&gt;&lt;th&gt;ATEasy 2&lt;/th&gt;&lt;th&gt;ATEasy 9&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;byte&lt;/td&gt;&lt;td&gt;char&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;int&lt;/td&gt;&lt;td&gt;short&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;long&lt;/td&gt;&lt;td&gt;long&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;float&lt;/td&gt;&lt;td&gt;double&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Restructuring Driver and System Commands&lt;/b&gt;&lt;br /&gt;Driver and System commands have been restructured in the new version.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Commands&lt;/b&gt; in ATEasy 2 were divided into four types: Analog, Digital, Instrument and Special.&lt;br /&gt;&lt;br /&gt;If you created a command in ATEasy 2 under Instrument or Special, it can be used in the new ATEasy as is.&lt;br /&gt;&lt;br /&gt;If you created a command in ATEasy 2 under Analog or Digital, the syntax of that command looked like:&lt;br /&gt;&lt;div class='fixedFont'&gt;Set &lt;b&gt;XXX &lt;/b&gt;Function VDC&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;where XXX was the name of the driver.&lt;br /&gt;&lt;br /&gt;In the new ATEasy, the syntax for commands is:&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;b&gt;XXX&lt;/b&gt; Set Function VDC&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;where XXX is the name of the driver.&lt;br /&gt;&lt;br /&gt;The new ATEasy will convert commands used in tests and procedures to the correct syntax when converting, but the System Driver must be loaded in order for the conversion to take place.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Filename Extensions have changed&lt;/b&gt;&lt;table width='100%' cellpadding='0' cellspacing='2' border=0 class='border'&gt;&lt;tr&gt;&lt;th&gt;ATEasy 2&lt;/th&gt;&lt;th&gt;ATEasy 9&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;.INS files&lt;/td&gt;&lt;td&gt;.DRV files (driver files)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;CFG files&lt;/td&gt;&lt;td&gt;.SYS files (system files)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;.PRG files&lt;/td&gt;&lt;td&gt;.PRG files (program files)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;4. LST Files are no longer supported&lt;/b&gt;&lt;br /&gt;The new ATEasy does not support the loading of&lt;b&gt; .LST&lt;/b&gt; (ASCII text format program) files. Use ATEasy 2 to load these files and convert them to &lt;b&gt;.PRG&lt;/b&gt; files before converting the .PRG files to the new ATEasy.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. 16-bit DLL's are no longer supported&lt;/b&gt;&lt;br /&gt;The new ATEasy &lt;b&gt;does not support 16-bit DLLs&lt;/b&gt;. If your .INS driver (with the exception of ATEZUSER) uses a 16-bit DLL, you will have to replace it with a &lt;b&gt;32-bit DLL&lt;/b&gt;. If you have the source code for the 16-bit DLL, recompile it as a 32-bit DLL. If you do not have the source code, contact the vendor who supplied the 16-DLL to obtain a 32-bit version. Below is the warning box you get when you try to load and convert an .INS driver based on a 16-bit DLL.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6. Dialog Box(DLG) files are now supported through ATEZUSER&lt;/b&gt;&lt;br /&gt;The new ATEasy supports &lt;b&gt;.DLG&lt;/b&gt; (dialog box) files through the &lt;b&gt;ATEZUSER&lt;/b&gt; driver; they can be used as is. However, it is recommended that you consider converting your .DLG files to ATEasy 9 &lt;b&gt;Forms&lt;/b&gt;, as Forms offer much more flexibility plus event-based programming. (This conversion is not a file format conversion; you will have to rework your dialog boxes manually.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;7. String RIGHT function functions differently&lt;/b&gt;&lt;br /&gt;The &lt;b&gt;RIGHT&lt;/b&gt; string function in the new ATEasy differs from the RIGHT function in ATEasy 2.&lt;br /&gt;&lt;br /&gt;The RIGHT function in ATEasy 2 programs will be changed to the &lt;b&gt;MID&lt;/b&gt; function with one parameter when a program is converted to the new ATEasy.&lt;br /&gt;&lt;br /&gt;When MID has only one parameter, it functions the same as RIGHT.&lt;br /&gt;&lt;div class='fixedFont'&gt;Mid (sSTR, iBYTES)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;where iBytes is the number of bytes from the right that will be returned. With this syntax:&lt;br /&gt;&lt;div class='fixedFont'&gt;Mid ("abc",2) = "bc"&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note&lt;/b&gt;: Many of the new ATEasy library functions have been modified to accept additional optional parameters. However, these functions remain compatible with their ATEasy 2 equivalents.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;8. Subroutines have been replaced by Events.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ATEasy 2 subroutines have been replaced by the use of &lt;b&gt;Events&lt;/b&gt; in the new ATEasy. The following table describes the ATEasy 2 subroutines and the corresponding new ATEasy event. Click on any event for a syntax description and an example of its use.&lt;br /&gt;&lt;br /&gt;During the process of converting ATEasy 2 files to the new ATEasy files, the new ATEasy converts each ATEasy 2 subroutine in each module into a corresponding event. For example, if the Driver module contained an &lt;b&gt;_AbortProgram&lt;/b&gt; subroutine, the new ATEasy would convert it to an &lt;b&gt;OnAbort&lt;/b&gt; event residing in the Driver module. For more information on conversion, see Converting ATEasy 2 Files.&lt;table width='100%' cellpadding='0' cellspacing='2' border=0 class='border'&gt;&lt;tr&gt;&lt;th&gt;ATEasy 2 Subroutine&lt;/th&gt;&lt;th&gt; ATEasy 3 Corresponding Event&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;_AbortProgram&lt;/td&gt;&lt;td&gt;System OnAbort Event&lt;br /&gt;&lt;br /&gt;Program OnAbort Event&lt;br /&gt;&lt;br /&gt;Driver OnAbort Event&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;_EndProgram&lt;/td&gt;&lt;td&gt;System OnEndProgram Event&lt;br /&gt;&lt;br /&gt;Driver OnEndProgram Event&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;_EndTask&lt;/td&gt;&lt;td&gt;System OnEndTask Event&lt;br /&gt;&lt;br /&gt;Program OnEndTask Event&lt;br /&gt;&lt;br /&gt;Driver OnEnd Task Event&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;_EndTest&lt;/td&gt;&lt;td&gt;System OnEndTest Event&lt;br /&gt;&lt;br /&gt;Program OnEndTest Event&lt;br /&gt;&lt;br /&gt;Driver OnEndTest Event&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;_ErrorProgram&lt;/td&gt;&lt;td&gt;System OnError Event&lt;br /&gt;&lt;br /&gt;Program OnError Event&lt;br /&gt;&lt;br /&gt;Driver OnError Event&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;_InitProgram&lt;/td&gt;&lt;td&gt;Driver OnInitProgram Event&lt;br /&gt;&lt;br /&gt;System OnInitProgram Event&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;_InitTask&lt;/td&gt;&lt;td&gt;System OnInitTask Event&lt;br /&gt;&lt;br /&gt;Program OnInitTask Event&lt;br /&gt;&lt;br /&gt;Driver OnInitTask Event&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;_InitTest&lt;/td&gt;&lt;td&gt;System OnInitTest Event&lt;br /&gt;&lt;br /&gt;Program OnInitTest Event&lt;br /&gt;&lt;br /&gt;Driver OnInitTest Event&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;_ResetProgram&lt;/td&gt;&lt;td&gt;Program OnReset Event&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;_ResetDriver&lt;/td&gt;&lt;td&gt;Driver OnReset Event&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;_ResetSystem&lt;/td&gt;&lt;td&gt; System OnReset Event&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;9. Run statement has changed&lt;/b&gt;&lt;br /&gt;The &lt;b&gt;Run statement&lt;/b&gt; argument for a string expression has changed in the new ATEasy. The syntax is:&lt;br /&gt;&lt;div class='fixedFont'&gt;Run program-specifier&lt;/div&gt;&lt;br /&gt;One change is that in the new ATEasy, the program-specifier can be a string or object expression. In ATEasy 2, the program-specifier could only be a string expression.&lt;br /&gt;&lt;br /&gt;Another change is that when a string expression is passed as an argument in the new ATEasy, the string expression can contain a program shortcut name or a program filename. In ATEasy 2, when a string expression was passed as an argument, it contained only a filename.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;10. &lt;b&gt;TestRefResult&lt;/b&gt; was removed and replaced with &lt;b&gt;TestResult&lt;/b&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;TestRefResult&lt;/b&gt; variable which was used to store Ref-X/2 test result was deleted. You need to use the &lt;b&gt;TestResult&lt;/b&gt; variable instead. The migration will convert all preferences.&amp;nbsp;&amp;nbsp;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200307/Migrating-from-ATEasy-2-x-to-ATEasy-9-0</link><pubDate>4/25/2017</pubDate></item><item><title>White Paper: Presentation: Leveraging the PXI Modular Architecture for Semiconductor ATE Platforms - Published on 11/29/2016</title><description>&lt;br /&gt;Leveraging the PXI Modular Architecture for ATE Platforms&lt;br /&gt;&lt;br /&gt;The PXI platform presents a flexible, innovative, cost-effective alternative to big-iron ATE systems for semiconductor test. Marvin Test Solutions offers a range of advanced, PXI-based test system configurations for digital, mixed-signal and RF test applications.&lt;br /&gt;&lt;br /&gt;Originally presented at International Test Conference 2016.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2016\MTS_ITC2016.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the presentation&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200303/White-Paper-Presentation-Leveraging-the-PXI-Modular-Architecture-for-Semiconductor-ATE-Platforms</link><pubDate>11/29/2016</pubDate></item><item><title>Combat Helicopters and Armament Test - Published on 11/15/2016</title><description>In the decades since it made its debut on the battlefields of the mid-20th Century, the helicopter has come into its own as a nimble, responsive platform capable of performing a variety of missions over widely divergent terrain. Supporting these aircraft presents unique challenges for the military services.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2016\Combat_Helicopter.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200302/Combat-Helicopters-and-Armament-Test</link><pubDate>11/15/2016</pubDate></item><item><title>White Paper: Using IEEE 1149.1-2013 (JTAG) with ATEasy - Published on 11/10/2016</title><description>ATEasy® is a flexible integrated Test Executive development environment for board and system- level test.&amp;nbsp;&amp;nbsp;This white paper provides an overview of how ATEasy can be used to support JTAG/IEEE 1149.1 based instrument control, programming and test.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2016\Integrating_ATEasy_with_IEEE_1149.1.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200301/White-Paper-Using-IEEE-1149-1-2013-JTAG-with-ATEasy</link><pubDate>11/10/2016</pubDate></item><item><title>White Paper: Legacy Test Systems - Replace or Maintain - Published on 9/21/2016</title><description>Test platforms age, the components within the test systems degrade, become obsolete and wear out over time. Manufacturing companies must continuously evaluate the expected lifespan of their test equipment and determine the risk and tradeoffs associated with replacing the equipment vs. maintaining the equipment.&amp;nbsp;&amp;nbsp;Both industry and government entities continually struggle with how to best evaluate and address the issues of aging test equipment and systems. This paper reviews the various options available to test engineers when faced with replacing or maintaining a test system. &lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2016\Evaluation_of_Test_Equipment_Modernization.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200299/White-Paper-Legacy-Test-Systems-Replace-or-Maintain</link><pubDate>9/21/2016</pubDate></item><item><title>White Paper: Modernizing Legacy Automated Test Systems for DoD Depots - Published on 6/28/2016</title><description>Department of defense (DoD) maintenance depots face a growing challenge regarding legacy Automated Test Systems (ATS). These systems, which are critical to ensuring mission success, are increasingly difficult to maintain and repair as well as being costly to modernize or replace. According to the General Accounting Office, the DoD has estimated that they will spend billions of dollars to modernize their ATS inventory, much of which was acquired in the 1970s and 1980s [1]. One of the maintenance depots is Tobyhanna Army Depot (TYAD) and is in a similar situation with its legacy test systems. The aging testers at TYAD are becoming increasingly out of date and more difficult to support. When the testers do not work properly, maintenance can suffer and readiness can be adversely affected. This paper reviews the requirements and issues associated with depot ATS equipment and will present a technical strategy for the modernization of ATS at TYAD.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2016\Modernizing_Legacy_ATS.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200297/White-Paper-Modernizing-Legacy-Automated-Test-Systems-for-DoD-Depots</link><pubDate>6/28/2016</pubDate></item><item><title>Solution Spotlight: Cost Effective Functional Test Solutions with ATEasy - Published on 6/16/2016</title><description>&lt;h3&gt;Solution Spotlight: Cost Effective Functional Test Solutions with ATEasy®&lt;/h3&gt;From &lt;a href='http://www.marvintest.com/Newsletters/?ID=37' target='_blank'&gt;Test Connections Newsletter - December 2015&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;Test engineers are looking for more time efficient &amp; cost effective functional test solutions for modern electronics. To achieve this, many are exploring the use of low cost equipment and/or alternative test strategies, such as eliminating ICT/Flying-probe test and instead, using simpler test methods including AOI and functional test work-flows. True time and cost savings however, do not come from just using low cost equipment or eliminating tests; there are many considerations to realize a cost effective test solution.&lt;br /&gt;&lt;br /&gt;In-house designed test systems often 'hide' the true time and cost of developing &amp; maintaining the hardware, software, &amp; mechanics associated with a test system within the company’s overhead expenses. The cost of test escapes and field failures, not to mention customer satisfaction, can often get 'buried’ deep in a company's general operating costs. The most effective “total cost solution” often comes from using high quality equipment, and a standardized, reconfigurable and reusable test platform.&lt;/td&gt;&lt;td&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200291\ATEasy_LT_9.0.JPG" alt="ATEasy LT 9.0" title="ATEasy LT 9.0" border='0' &gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;One of the most important considerations when designing or selecting a test system is to choose the right software platform. Using a powerful and standardized software platform is the ideal goal, which offers the following key benefits:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Reduced training time &amp; costs&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Accelerated implementation of test programs because of standardization and the ability to re-use code &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Improved efficiency of test engineering resources by having a common programming / toolset environment&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Reduced test program maintenance and support costs &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;For functional test systems, the software platform should include the following features and capabilities:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A focus on automated functional test&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A simple and easy to use coding language, structured coding environment and intelligent code completion to speed the overall coding process&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Easy code maintenance &amp; re-use&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Backward compatibility with previous versions of the test program tool set&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Support for various communication protocols&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Extensive driver support for various instruments&amp;nbsp;&amp;nbsp;and a simple method for implementing new drivers&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Support for existing customer test code including graphical programming languages such as LabView. .&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A configurable and feature rich test executive.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Expert support and training&lt;/li&gt;&lt;/ul&gt;Just as the software platform described above offers key features and benefits for functional test, the associated test system hardware needs to be highly integrated, flexible, reconfigurable and reusable, allowing its use on multiple projects within a company. Test engineers must also consider the test system’s mechanics at the outset. All too often this is an afterthought and the downfall of many a test system. A good test system interface solution should allow easy, quick, short, and reliable interconnection to the UUT while at the same time being easily reconfigurable and reusable.&lt;br /&gt;&lt;br /&gt;Eiger Design GmbH, has recently introduced the J-Testr, a new, highly integrated, flexible &amp; modular functional test system which includes the ATEasy® Lite software platform and offers the features and capabilities detailed above.&amp;nbsp;&amp;nbsp;J-Testr's compact size, versatility and safety features make it applicable for functional test applications ranging from commercial and industrial to military. In particular, the J-testr offers a simplified tester / UUT interface, by employing a special dual plugging mechanism and a simple interposer design for connecting test system resources to the UUT. &lt;br /&gt;&lt;br /&gt;The J-Testr,&amp;nbsp;&amp;nbsp;provides a full range of peripheral stimulation cards which are all controlled via the ATEasy® Lite software and offer advanced test and safety features required for efficient, safe and quick testing of modern UUTs. The ATEasy® Lite product is designed specifically for OEM suppliers of functional test systems, offering a cost effective and full-featured test development and test executive environment that supports OEM specific instrumentation. With ATEasy® Lite, functional test suppliers can offer a robust, cost-effective, commercial software platform that supports their test system specific hardware as well as an additional “external” instrument. &lt;br /&gt;&lt;br /&gt;When combining ATEasy® Lite's features with systems such as the J-Testr, test engineers can considerably reduce their 'true' functional test system implementation and support costs, as well as realizing moderate acquisition costs.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200291/Solution-Spotlight-Cost-Effective-Functional-Test-Solutions-with-ATEasy</link><pubDate>6/16/2016</pubDate></item><item><title>Solution Spotlight: Replacing Legacy Instrumentation with Form/Fit/Function (FFF) Instrumentation - Published on 6/7/2016</title><description>&lt;h3&gt;Replacing Legacy Instrumentation with Form/Fit/Function (FFF) Instrumentation&lt;/h3&gt;From &lt;a href='http://www.marvintest.com/Newsletters/?ID=26' target='_blank'&gt;Test Connections Newsletter - June 2015&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Military, aerospace and even commercial products require support equipment for production and maintenance. One important type of support equipment is functional Automated Test Equipment (ATE). When a dedicated test system fails and is not available, there is usually an immediate impact on the product it supports. It can be a monetary impact or even worse, readiness impact. Legacy ATE systems are being pushed into extended service, beyond the service years for which they were originally intended, and as they age, the downtime increases. Instrument obsolescence is one of the major reasons for test system down time. If a system resource fails, it must be repaired or replaced. If the instrument is no longer produced (i.e. obsolete), then other, less traditional remedies must be employed.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;b&gt;Preserving Investment&lt;/b&gt;&lt;/h3&gt;Over a test system’s life span, significant costs can accrue. ATE costs start with the initial investment for designing, building and developing Test Program Sets (TPSs). However, after the initial cost of ATE deployment, test system costs will continue to accrue due to the on-going investment in test programs, fixtures, etc.&amp;nbsp;&amp;nbsp;And over time, the major investment component will become the test programs which increases exponentially, as the number of programs are added to a system.&lt;br /&gt; &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200293\TPS_ATS_Cost_Ratio.JPG" alt="Cost of TPS Relative to ATE Capital Cost" title="Cost of TPS Relative to ATE Capital Cost" border='0' &gt;&lt;br /&gt;&lt;b&gt;Cost of TPS Relative to ATE Capital Cost&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Additionally, as the ATE matures, maintenance costs will increase due to ageing and obsolescence issues. Consequently, to preserve the investment in the test system and associated test programs, identifying “drop – in” or form, fit, function replacement solutions for obsolescence issues can offer a cost-effective solution.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;b&gt;Replacement Options&lt;/b&gt;&lt;/h3&gt;Stockpiling Spares&lt;br /&gt;Stockpiling of spare instruments is one way to mitigate system down time and maintenance issues.&amp;nbsp;&amp;nbsp;The spare instruments may be procured as part of the initial investment, during the ATE life span or as a life time buy when the notice of end of life is received. With the typical life span for commercial instrumentation being 5-7 years, but with test systems in use for 20 or more years, this strategy is routinely employed by test system maintainers. However; this is only a short-term solution, particularly when dealing with system life cycles of 20+ years since at some point, the spares will be depleted.&lt;br /&gt;&lt;br /&gt;Ongoing Maintenance and Repair&lt;br /&gt;On-going maintenance and repair of the obsolete instrument may be an option. However, the problem with this approach is the ever-increasing cost and time to repair as well as obtaining components which may become obsolete. Even if some systems are reserved for cannibalization, the source of instruments and parts will eventually be exhausted - resulting in a short-term solution at best. &lt;br /&gt;&lt;br /&gt;Used Instruments&lt;br /&gt;A tempting solution is to find an instrument replacement on the secondary market. Many test equipment distributors offer used instruments and depending on the age of the instrument (how long it has been out of production), there is a good chance of finding the instrument on the secondary market. However, even if the equipment is in pristine condition, this is still a short term solution to the long term problem of support and maintenance since eventually, this source will be exhausted.&lt;br /&gt;&lt;br /&gt;TPS Migration / COTS Instrument with Adapter&lt;br /&gt;A long-term solution can be the migration of the test program to a new, up-to-date test system.&lt;br /&gt;However, this approach can be very expensive; especially if a large number of TPS’ are involved and particularly if new fixtures are also part of the conversion process. Consequently, the high cost associated with a complete test program re-host strategy usually precludes TPS migration to a new test platform. What is a more likely scenario is to selectively replace those instruments that are obsolete with a new COTS instrument which can offer comparable functionality and performance. However, software functionality will not be compatible, requiring a software driver wrapper or adapter. Identifying a COTS functional replacement should be done with care. The candidate instrument’s specification should be scrutinized closely to verify that all the features used in the ATE are compatible, all the levels and ranges are covered, and all required inputs and outputs exist. An important issue that must be addressed is the improved performance of the new instrument. Newer instruments will, in most cases, have much faster or better performance than the obsolete instrument which will typically lead to TPS failures. For example, if a DMM with a reading rate of 100 readings per second is being replaced by a new DMM with a reading rate of 1000 readings per second, it may be necessary to add delays to the test program. &lt;br /&gt;&lt;br /&gt;In most cases the new instrument is not compatible with the legacy command set and translation/adaption is required. The translation should replicate the legacy instrument’s commands as well as the instrument’s response. Comprehensive functionality also needs to include any self-test functionality that the legacy instrument may have offered, since overall compatibility must address not only test program functionality, but also any system self-test functionality which may incorporate individual instrument self-test functionality. Instrument adaption can be accomplished in one of two ways:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Software conversion layer or wrapper:&amp;nbsp;&amp;nbsp;With addition of a software wrapper to the instrument’s driver, the replacement instrument will be compatible with the legacy instrument’s commands and TPSs should be able to use the new instrument with virtually no changes. Of course once installed, the legacy instrument cannot be used any more.&amp;nbsp;&amp;nbsp;However, like all software development tasks, there is also some risk involved and in many cases, changes to the test program may be required, necessitating revalidation of the complete test program - incurring additional time and expense. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Hardware adapter or Translation Module Adapter (TMA): A TMA is a stand-alone unit that connects between the system controller and the replacement instrument. The TMA has its own processor and uses two ports; one to communicate with the system controller and one to communicate with the replacement instrument. Special firmware needs to be developed to accept the legacy commands from the controller and translate them to the new instrument’ commands. Like its software counterpart, once a hardware adapter is implemented, TPSs should be able to use the new instrument with virtually no changes but unlike the software adapter, the legacy instrument can still be used simply by bypassing the TMA. Hardware adapters face similar obstacles as their software counterparts. There is some risk involved with firmware development and communication response time can create timing issues, necessitating test program revisions - requiring TPS revalidation. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;&lt;b&gt;&lt;b&gt;Form, Fit Function (FFF) Instrument Replacement - A Superior Solution&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;FFF instrument replacement offers a superior solution for replacing out of production, legacy instrumentation. A modern, COTS instrument with an integral communication interface adapter offers a drop in replacement that is functionally, electrically, and mechanically equivalent to the legacy instrument, preserving the initial investment in the ATE and associated TPS’.&amp;nbsp;&amp;nbsp;Key features and benefits associated with an FFF solution include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Preservation of existing test programs. Great care is taken replicate the legacy instrument’s functionality, allowing system self-test and test programs to execute with no changes - eliminating the time and costs associated with re-verification.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Flexibility to use both the legacy instrument and replacement instrument&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Ability to replicate “un-documented” behavior of a legacy instrument - which can be a key feature for performing accurate TPS execution since a TPS may use undocumented functions as a “feature” requiring the replacement instrument to behave the same.&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200293\HP8112_FFF_Replacement.JPG" alt="FFF Replacement for HP8112" title="FFF Replacement for HP8112" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;FFF Replacement: GP1612 for HP8112&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;As shown in the chart below, the FFF solution when compared to all other alternatives, offers key advantages for those users looking to replace legacy instrumentation as well as preserving their investment in ATE and TPS. &lt;br /&gt; &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200293\FFF_Advantages.JPG" alt="FFF Solution Options" title="FFF Solution Options" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Marvin Test Solutions' GP15xx and GP16xx instrumentation offers 100% form-fit-function drop in replacements for a broad range of GPIB pulse, arbitrary waveform and function generators that were manufactured by Wavetek and Hewlett-Packard.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;Obsolete Product&lt;/th&gt;&lt;th&gt;Manufacturer&lt;/th&gt;&lt;th&gt;MTS Model Number&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;HP8160A&lt;/td&gt;&lt;td&gt;Hewlett Packard&lt;/td&gt;&lt;td&gt;&lt;a href='http://www.marvintest.com/Product.aspx?Model=GP1552AH' target='_blank'&gt;GP1552AH&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;HP8112&lt;/td&gt;&lt;td&gt;Hewlett Packard&lt;/td&gt;&lt;td&gt;&lt;a href='http://www.marvintest.com/Product.aspx?Model=GP1612H' target='_blank'&gt;GP1612H&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;HP8116&lt;/td&gt;&lt;td&gt;Hewlett Packard&lt;/td&gt;&lt;td&gt;&lt;a href='http://www.marvintest.com/Product.aspx?Model=GP1616H' target='_blank'&gt;GP1616H&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;HP8165A&lt;/td&gt;&lt;td&gt;Hewlett Packard&lt;/td&gt;&lt;td&gt;&lt;a href='http://www.marvintest.com/Product.aspx?Model=GP1665H' target='_blank'&gt;GP1665H&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;175&lt;/td&gt;&lt;td&gt;Wavetek&lt;/td&gt;&lt;td&gt;&lt;a href='http://www.marvintest.com/Product.aspx?Model=GP1650W' target='_blank'&gt;GP1650W&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;178&lt;/td&gt;&lt;td&gt;Wavetek&lt;/td&gt;&lt;td&gt;&lt;a href='http://www.marvintest.com/Product.aspx?Model=GP1665W' target='_blank'&gt;GP1665W&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;859&lt;/td&gt;&lt;td&gt;Wavetek&lt;/td&gt;&lt;td&gt;&lt;a href='http://www.marvintest.com/Product.aspx?Model=GP1552AW' target='_blank'&gt;GP1552AW&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200293/Solution-Spotlight-Replacing-Legacy-Instrumentation-with-Form-Fit-Function-FFF-Instrumentation</link><pubDate>6/7/2016</pubDate></item><item><title>White Paper: PXI-Based, Advanced Switching Architecture for Functional Test - Published on 5/24/2016</title><description>Virtually all ATE systems employ a switching subsystem in order to route test system resources to multiple test points on the UUT. The challenge for any switching subsystem is multi-dimensional and involves many considerations / trade-offs including footprint, performance, flexibility, maintainability, and reliability. Additionally, if the application needs to address legacy test needs, there can be the additional challenge to support not only current and future switching requirements, but also legacy test requirements. Many of today’s functional test systems employ the PXI architecture which offers modularity and flexibility. However when combining switching and instrumentation, test engineers can be challenged to create a system that combines all of the switching and instrumentation capabilities in one compact platform. &lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2016\PXI-Based_Advanced_Switching_Architecture_for_Functional_Test.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200295/White-Paper-PXI-Based-Advanced-Switching-Architecture-for-Functional-Test</link><pubDate>5/24/2016</pubDate></item><item><title>Solution Spotlight: Expanding Digital Test Capabilities with a Multi-Site Test Feature - Published on 5/16/2016</title><description>&lt;h3&gt;Solution Spotlight: Expanding Digital Test Capabilities with a Multi-Site Test Feature&lt;/h3&gt;From &lt;a href='http://www.marvintest.com/Newsletters/?ID=36' target='_blank'&gt;Test Connections Newsletter - September 2015&lt;/a&gt;&lt;br /&gt;&lt;br /&gt; &lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200290/GX5295.JPG" alt="GX5295" title="GX5295" border='0' &gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 1: GX5295&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;br /&gt;Today’s semiconductor vendors are increasingly moving to open architecture, PXI –based solutions to provide them with cost effective, compact footprint, and flexible test solutions. MEMS suppliers in particular, are looking to PXI-based solutions as being well-suited for addressing their need for cost effective test solutions.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;MTS was approached by a major supplier of MEMS devices to help with addressing their requirement to test multiple, low pin count devices using Marvin Test Solutions’ &lt;a href='http://www.marvintest.com/Product.aspx?Model=GX5295' target='_blank'&gt;GX5295&lt;/a&gt; digital instrument. Supporting 32 digital channels, with PMU per pin capability, the customer needed to support the testing of 8 devices, using a single GX5295 for their multi-site test configuration. The customer’s key requirements included the following:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Using the GX5295’s Real-Time Compare function, log the first failure on each channel if/when they occur.&amp;nbsp;&amp;nbsp;The failed channel&amp;nbsp;&amp;nbsp;is correlated to specific site failures.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;	For future failure analysis, record the test pattern step where each channel’s first-failure occurred.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;	Suppress all further real-time compare operations for a channel, after the first failure.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;	Enable or disable first-failure logging on a channel-by-channel basis.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;	Support complete test execution, without pause or interruption, regardless of the number of channel failures.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;	Report all failed channels with a single register read, avoiding the time-consuming operation of up-loading and post processing the full pattern buffer to identify failed channels.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;	Maintain existing real-time compare capability.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;	Support the LabVIEW programming environment&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;With the requirements defined, MTS’ engineering group enhanced the GX5295's features with an updated firmware, driver and software package to meet all of the objectives outlined above. These new features included the following enhancements:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Channel error latch with a feed-back loop to the real-time compare mask circuit.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Selection logic to enable the Record-First-Failure (RFF) mode or the standard Real-Time Compare&amp;nbsp;&amp;nbsp;mode (RTC).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A Channel-Disable register to globally and selectively disable real-time compare per channel when operating in the RFF mode.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New API functions added to the GX5295 DLL to control the new RFF features&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;An upgraded GtDio Panel application which provides interactive control and display of results for the RFF functions&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;LabVIEW wrappers for the new RFF functions which were added to the GX5295’s DLL.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;&lt;b&gt;Implementation&lt;/b&gt;&lt;/h3&gt;In normal operation, the RTC Error Memory will record up to 1K of errors, including address locations.&amp;nbsp;&amp;nbsp;However, for applications that require support for multi-site testing ( and recording of errors on each channel), what is needed is additional control logic that will record only the first failure for each channel, preventing the possibility of overflowing the 1K of error memory if multiple errors&amp;nbsp;&amp;nbsp;occur on a single channel. The block diagram below details the normal RTC operation and the enhanced&amp;nbsp;&amp;nbsp;RFF mode of operation.&amp;nbsp;&amp;nbsp;With the modified GX5295 firmware, both the RTC and RFF features are supported by the module with the mode of operation being a software selection. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200290/BlockDiagram.JPG" alt="Block Diagram" title="Block Diagram" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2: RTC and RTF Modes&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;&lt;b&gt;On-Site Evaluation &amp; Deployment&lt;/b&gt;&lt;/h3&gt;The new capabilities were delivered to the customer for beta testing, and installed on a development station in their test lab.&amp;nbsp;&amp;nbsp;The GX5295 supports firmware upgrades in the field by loading the new firmware to the target hardware via the PXI bus. An updated DLL, DioEasy application and updated LabVIEW drivers were also installed on-site. &lt;br /&gt;&lt;br /&gt;Initial checkout was done using the DioEasy application and involved loading the GX5295 with test patterns that would guarantee multiple RTC errors across many channels, using a simple loopback cable to inter-connect channels.&amp;nbsp;&amp;nbsp;The original RTC functionality was first demonstrated and verified, proving that the changes did not affect the base-line functionality of the GX5295.&amp;nbsp;&amp;nbsp;Then, the RFF mode was enabled, and the test results verified that only the first failure (and failing vector address) for a channel was recorded in the GX5295 error memory.&amp;nbsp;&amp;nbsp;Subsequent errors for the channel were ignored.&amp;nbsp;&amp;nbsp;At the conclusion of the test, the DioEasy display correctly indicated all known failing channels.&lt;br /&gt;&lt;br /&gt;Once the new capabilities were demonstrated, the process was repeated with the customer’s Devices Under Test (DUT’s).&amp;nbsp;&amp;nbsp;The GX5295 executed a 20M-vector scan test on twelve devices simultaneously.&amp;nbsp;&amp;nbsp;With a 1K error memory, the un-enhanced GX5295 would over-run the error memory if one site were bad, forcing a cumbersome coding exercise to monitor the error memory, and when full, save the error information, clear the error memory, and continue the test.&amp;nbsp;&amp;nbsp;At the conclusion of the test, the saved error data had to be integrated and correlated to the failed DUT site(s). With the RFF mode enabled, the tests were again executed and it was verified that only the first failure for a channel was recorded in the GX5295’s error memory.&amp;nbsp;&amp;nbsp;Failures were also induced on several sites, and in each circumstance, the GX5295 correctly identified the failing sites – in a single pass and without an error memory over-run.&lt;br /&gt;&lt;br /&gt;The customer’s LabVIEW control program was then modified to add the new functions for setting up and controlling the RFF capabilities and a single “Read Error” VI was placed in parallel with the LabVIEW code that was managing the data collection and correlation to identify failed sites.&amp;nbsp;&amp;nbsp;When executed, the modified code executed as expected and correctly identified all of the failed sites.&amp;nbsp;&amp;nbsp;The end result was that the multi-site test ran faster by eliminating a significant piece of code that was used to manage error collection, reducing a lengthy, iterative process of running, flushing error memory, and restarting the test.&amp;nbsp;&amp;nbsp;In addition, test functionality was improved in that any known bad sites could be excluded from the test simply by writing a value to the Channel Disable Register that would mask the channel associated with that site, eliminating the need to fill a 20M-vector pattern (in this instance) with the equivalent mask pattern. With the enhanced GX5295, MTS was able to deliver a test solution that meets all of the customer’s stated requirements and provides a drop-in upgrade path for those customers using the GX5295 for multi-site semiconductor testing.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200290/Solution-Spotlight-Expanding-Digital-Test-Capabilities-with-a-Multi-Site-Test-Feature</link><pubDate>5/16/2016</pubDate></item><item><title>PXI chassis configuration is lost every time the system is powered up. - Published on 5/16/2016</title><description>&lt;b&gt;Problem:&lt;/b&gt; Every time my test system boots up, the Marvin Test Solutions PXI chassis configuration that is stored in the &lt;b&gt;PXISYS.ini&lt;/b&gt; file gets replaced with an empty file with no configuration data. This forces us to create a new PXISYS.ini file with the correct configuration data each time the system is re-booted.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;This problem is caused by National Instruments Measurement and Automation Explorer overwriting the Marvin Test Solutions slot description file upon rebooting.&amp;nbsp;&amp;nbsp;If you have NI Measurement and Automation Explorer (NI-MAX) installed, and it is version 4.0 or later, then your configuration file is being overwritten by NI-MAX and NI-VISA .&amp;nbsp;&amp;nbsp;To correct this problem you need perform one of the following procedures:&lt;br /&gt;&lt;br /&gt;1. Download and install the latest HW (v4.9.1 or above). Many of Marvin Test Solutions drivers and products release after April 2016 contains the new HW. The new HW perform the registry fix (described in 2 below) automatically .&lt;br /&gt;&lt;br /&gt;2. Modify the Windows registry by applying a registry patch to disable NI-VISA from doing this.&amp;nbsp;&amp;nbsp;The process is as follows:&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Create a text file called "&lt;b&gt;DisableBootPxiSysGeneration.reg&lt;/b&gt;" and copy/paste the following text to the file:&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;Windows Registry Editor Version 5.00&lt;br /&gt;[HKEY_LOCAL_MACHINESOFTWARENational InstrumentsNI-PXIRM]&lt;br /&gt;"DisableBootPxiSysGeneration"=dword:00000001&lt;/div&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Save the file (in text format).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Double click the file to apply the registry change.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Use PXI/PCI Explorer to verify or assign instruments to the appropriate chassis slot.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Cycle power and verify that the chassis configuration and instrument slots are preserved.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;</description><link>https://www.MarvinTest.com/KB/Q200087/PXI-chassis-configuration-is-lost-every-time-the-system-is-powered-up</link><pubDate>5/16/2016</pubDate></item><item><title>Solution Spotlight: Field and Flightline Testing of MIL-STD-1760 Systems - Published on 5/10/2016</title><description>&lt;h3&gt;Field and Flightline Testing of MIL-STD-1760 Systems&lt;/h3&gt;From &lt;a href='http://www.marvintest.com/Newsletters/?ID=25' target='_blank'&gt;Test Connections Newsletter - March 2015&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;MIL-STD-1760 defines the electrical interface between the aircraft and the Carriage Stores as well as the mechanical and communication protocol aspects of the interface. &lt;br /&gt;&lt;div class='GB'&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt; 	&lt;td&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200292\Flightline_Test.jpg" alt="Flightline Test" title="Flightline Test" border='0' &gt;&lt;/td&gt;&lt;td&gt;The intent of MIL-STD-1760 (also known as just "1760") was to simplify the integration of new weapons onto existing platforms. Prior to the introduction of 1760, the integration cost of a new weapon system was over $100 million dollars (in 1980 dollars). With 1760, integration costs shrank to under $25 million which was a significant improvement.&lt;br /&gt;&lt;br /&gt;As with all good inventions, there’s always a "but" and 1760 was no exception. Most field and flight-line test sets for armament were deployed over three decades ago and as such, were not suitable to test the "smart" interface of MIL-STD-1760. And unlike legacy systems, the aircraft is expecting to have a carriage store present in order to keep the interface active. Immediately after powering up the 1760 interface, the aircraft sends a MIL-STD-1553 transmission that can be translated to "who’s out there".&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The aircraft is expecting an answer within 150 mSec and this response needs to include the identification of the Carriage Store or at least a message that says "I’m busy". In case of the "busy" message, the aircraft expects the identification response within 500 mSec of power up.&amp;nbsp;&amp;nbsp;If there’s no response from the carriage store, the aircraft shuts down the interface and it is no longer powered or operating.&lt;br /&gt;&lt;br /&gt;Legacy field and flight-line test sets cannot communicate with the aircraft as they do not include the ability to test a 1760 interface. As a result, they can only perform some limited testing of the interface during the first 150 mSec after power up. However,&amp;nbsp;&amp;nbsp;since they can’t even respond with an "I’m busy" answer, the interface will be shut down 150 mSec after power is applied and from that point forward, the test set is testing a dormant interface. Since one of the main functions of flight-line armament test sets is to check for stray voltage and functionality, it is clear that neither can be achieved unless the aircraft "believes" that there’s a real 1760 carriage store present and active. &lt;br /&gt;&lt;br /&gt;In order to effectively test the interface, the test set not only needs to support the MIL-STD-1760 interface but it also needs to be able to identify itself as a real carriage store that will be recognized by the aircraft as part of its standard configuration. Since this is not easily achieved, many users revert to the use of the real carriage store when testing is needed although using a real carriage store as a test set has its complications too.&amp;nbsp;&amp;nbsp;Stores such as JDAM cannot just be connected to the interface. Because the store’s Inertial Measurement Unit (IMU) needs to be aligned, the store will need to move before it can be aligned prior to testing the interface. This means that the aircraft needs to be taxied around the base until such alignment is achieved which also means that a pilot is now needed to run the test. Obviously, having a pilot taxi the aircraft around the air base to test the 1760 interface is not a preferred method although it is being used occasionally. Alternatively, maintainers have attempted to use other tools, such as a ruggedized laptop with a MIL-STD-1553 interface configured as a weapon. However, this solution is also inadequate since it does not support the testing of power, analog, or discrete signals associated with the 1760 interface.&lt;br /&gt;&lt;br /&gt;Full featured and complete testing of the 1760 interface is key to ensuring mission readiness. Recognizing this need for a next generation flight-line test solution, Marvin Test Solutions (MTS) developed the &lt;a href='http://www.marvintest.com/SmartCan/' target='_blank'&gt;MTS-3060 SmartCan&lt;/a&gt;. As a universal flight line armament test set the SmartCan is capable of testing all legacy and "smart" interfaces used on military aircraft. &lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;br /&gt;Most military aircraft today are capable of carrying JDAM and for that reason, MTS elected to implement JDAM support with the SmartCan. Upon power up, the SmartCan will identify itself as a JDAM and test the entire interface while the aircraft is communicating with the "JDAM". Additionally, since some wing stations (such as the wingtip) cannot be used with JDAM, MTS also implemented support for testing the AIM-120 AMRAAM interface. With the SmartCan, the aircraft does not need to be moved anywhere and the 1760 interface can be tested thoroughly without moving the aircraft.&lt;br /&gt;&lt;br /&gt;The compact and handheld MTS-3060 SmartCan™ operates from four commercial AA batteries and weighs less than 2 Kg, making it ideal for flight-line test applications. With its full-featured MIL-STD-1553 interface, the SmartCan can support the testing of virtually any "smart weapon" interface including JDAM and AIM-120. Additionally, it can load / test AC and DC power lines, provide video for testing the 1760’s analog signals, and check for the functionality and presence of stray voltage on the Release Consent line. &lt;/td&gt;&lt;td&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200292\SmartCan.JPG" alt="SmartCan" title="SmartCan" border='0' &gt;&lt;/td&gt; &lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200292/Solution-Spotlight-Field-and-Flightline-Testing-of-MIL-STD-1760-Systems</link><pubDate>5/10/2016</pubDate></item><item><title>Solution Spotlight: Advanced Digital Testing Using PXI Instrumentation - Published on 5/6/2016</title><description>&lt;h3&gt;Solution Spotlight: Advanced Digital Testing Using PXI Instrumentation&lt;/h3&gt;From &lt;a href='http://www.marvintest.com/Newsletters/?ID=38' target='_blank'&gt;Test Connections Newsletter - March 2016&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Device Under Test&lt;/h3&gt;The target device was a WiFi IC, with 802.11n and Bluetooth capabilities. Upon reviewing the target IC specifications, a set of resource requirements to test the IC were identified and matched to instruments available in the PXI form-factor. The Device Under Test (DUT) required four power supplies, and the power supplies had to be sequenced in a specific order when powering up the DUT. Further, while the IDD for the DUT was very low, when the DUT was initialized, the inrush current could exceed 1A on one of the supplies. The power requirement mandated that programmable power supplies be used, and that the 1A of in-rush current be accommodated.&lt;br /&gt;&lt;br /&gt;On initial power-up, the DUT is in a low-power idle state whereby communication is possible. There are two communication ports on the DUT: a JTAG port and a Scan port. The JTAG port is used to configure and initialize the DUT, and perform an initial structural test of the IO. The Scan port is used to configure the DUT for operation and complete the structural IO test. Additional functional tests are also implemented using the Scan port to control the DUT.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Since the DUT was already being tested on an UltraFlex system, the DUT had a proven set of test patterns that were available for reuse with the PXI system. Marvin Test Solutions’ file conversion tools were available to convert the ATP files to hardware specific patterns, with the digital test instrumentation meeting the speed, channel density, pattern depth, and timing capabilities required to accurately represent the ATP pattern file parameters.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Test System&lt;/h3&gt;A means to interface to the DUT was required in order to substitute for the IC handler associated with the UltraFlex system. Dedicated DUT boards were designed and cabled to the instrumentation for the demonstration system. The DUT board design was modularized to accommodate easy expansion of the number of test sites and demonstrate multi-site test capabilities.&lt;br /&gt; &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200289\TestSystem.jpg" alt="Test System" title="Test System" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 1: Test System&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The system design as shown consisted of a &lt;a href='http://www.marvintest.com/Product.aspx?Model=GX7100B' target='_blank'&gt;GX7100B&lt;/a&gt; PXI 3U/6U Combo Smart Chassis. A combination of 3U and 6U PXI slots was required to accommodate the two &lt;a href='http://www.marvintest.com/Product.aspx?Model=GX7400A' target='_blank'&gt;GX7400A&lt;/a&gt; programmable power supplies.&amp;nbsp;&amp;nbsp;Each GX7400A provides two 150W programmable power supplies in three 6U slots.&lt;br /&gt; &lt;br /&gt;&lt;div class='GB'&gt; &lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;td&gt;&lt;br /&gt;Four &lt;a href='http://www.marvintest.com/Product.aspx?Model=GX5296' target='_blank'&gt;GX5296&lt;/a&gt; PXI modules were chosen as the digital test instruments for the DUT.&amp;nbsp;&amp;nbsp;The GX5296 provides 32 IO channels per card with full PMU per channel capabilities, 64M pattern depth, 125 MHz clock rates, 1nS edge timing resolution, timing per pin,&amp;nbsp;&amp;nbsp;and real-time compare of DUT response data.&lt;br /&gt;&lt;br /&gt;Using MTS’ GtDio6x-FIT file translation tools, the digital test patterns were translated from the UltraFlex ATP pattern files, and formatted so that the patterns for each DUT would reside on two GX5296 instruments. Expanding the capabilities from testing one DUT to two DUT’s was simply a matter of adding a second set of GX5296 instruments, and cabling from those modules to a second DUT test board. &lt;br /&gt;&lt;br /&gt;The software to control loading the translated ATP test patterns, running the analog contact tests, executing the test patterns and reporting test results to the operator was written using the &lt;a href='http://www.marvintest.com/product.aspx?model=ateasy' target='_blank'&gt;ATEasy&lt;/a&gt;® development environment, and the test execution was controlled using the integrated Test Executive GUI.&amp;nbsp;&amp;nbsp;Demonstrations were also written using LabVIEW and TestStand to show the overall versatility of using open architecture hardware and software tools for semiconductor test applications.&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200289\GX5296.jpg" alt="GX5296" title="GX5296" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Figure 2: GX5296&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; &lt;/div&gt;To learn more about PXI - Based Semiconductor Test Systems: Advanced Test Capabilities and Features, &lt;a href='http://www.marvintest.com/ts-900/default.aspx?hp=1&amp;T=1&amp;Ref=38' target='_blank'&gt;download our white paper&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200289/Solution-Spotlight-Advanced-Digital-Testing-Using-PXI-Instrumentation</link><pubDate>5/6/2016</pubDate></item><item><title>What is the screw thread for the Marvin Test Solutions switching product's DB78 connector - Published on 5/6/2016</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Geotest switching cards use a Positronic DB78 connector. This connector has a jackscrew for fastening a harness or cable. What is the jack-screw thread spec? It is 4-40 thread.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200056/What-is-the-screw-thread-for-the-Marvin-Test-Solutions-switching-product-s-DB78-connector</link><pubDate>5/6/2016</pubDate></item><item><title>Calling Marvin Test Solutions DLL functions from a C# Visual Studio .NET Project - Published on 5/6/2016</title><description>All Marvin Test Solutions driver packages such as GxPS, GxSW, etc. come with a Windows DLL that can be called from a user created Windows application. Each driver package also includes examples and interface files (.vb and .h) for Visual Basic and C/C++ projects. &lt;br /&gt;&lt;br /&gt;Before referencing such a DLL in a C# .NET project, a few steps must be taken to bridge the gap between the Unmanaged code in the DLL and the Managed code in the .NET project.&lt;br /&gt;&lt;br /&gt;This can be accomplished by using a concept called Marshaling where unmanaged data types are converted to managed .NET CLR (Common Language Run-time) data types. Each .NET datatype has a default unmanaged data type that the CLR will use to marshal data back and forth between managed code and a unmanaged function. As an example, the C# data type string has a default unamnaged data type of LPTSTR. Note that the default marshaled datatype can be changed in the C# code. The figure below illustrates the relationship between the .NET classes and the Marvin Test Solutions DLL. Generally, the application class will reference function prototypes that are defined in a marshalling class which actually links to the DLL functions.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200191\unmanagedSmall.JPG" alt="PXI .NET Driver" title="PXI .NET Driver" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Follow these steps to use the DLL from C#:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Create a new .cs file&lt;/b&gt; (GxFpga.cs in this example) to contain a class that will import and define all the functions and constants in a Marvin Test Solutions DLL. This class should be contained in a namespace that will later be referenced in your main program with a "using" statement.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Use the DllImport attritube within your C# code, to specify the name of the DLL that needs to be loaded.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Use the static and extern C# keywords to declare a function prototype and name for the imported DLL function along with the correct parameter datatypes. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Use the &lt;b&gt;ref &lt;/b&gt;keyword to delcare pointer parameters (data passed by reference) and the MarshalAs keyword to change the default marshaled datatype.&lt;/li&gt;&lt;/ul&gt;In this example the &lt;b&gt;GxFpgaInitialize&lt;/b&gt;, &lt;b&gt;GxFpgaGetDriverSummary &lt;/b&gt;and &lt;b&gt;GxFpgaWriteMemory &lt;/b&gt;C functions along with some constants, will be imported into a C# .NET project:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;br /&gt;GxFpgaInitialize (SHORT nSlot, PSHORT pnHandle, PSHORT pnStatus);&lt;br /&gt;GxFpgaGetDriverSummary (PSTR pszSummary , SHORT nSummaryMaxLen, PDWORD pdwVersion, PSHORT pnStatus);&lt;br /&gt;GxFpgaWriteMemory(SHORT nHandle, DWORD dwOffset, PVOID pvData, DWORD dwSize, PSHORT pnStatus);&lt;br /&gt;&lt;br /&gt;#define GXFPGA_LOAD_TARGET_VOLATILE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&lt;br /&gt;#define GXFPGA_LOAD_TARGET_EEPROM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The following is an example of the above header file converted to c# declaration:&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;br /&gt;&lt;b&gt;//GxFpga.cs&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;namespace GxFpgaNamspace&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;class GxFpga&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DllImport("GxFpga.dll")]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public static extern void GxFpgaInitialize(short nSlot, ref short pnHandle, ref short pnStatus);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DllImport("GxFpga.dll")]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public static extern void GxFpgaGetDriverSummary([MarshalAs(UnmanagedType.LPStr)] StringBuilder sSummary, short nMaxLength, ref long pdwVersion, ref short pnStatus);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DllImport("GxFpga.dll")]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public static extern void GxFpgaWriteMemory(short nHandle, UInt32 dwOffset, UInt32[] pvData, UInt32 dwSize, ref short pnStatus);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DllImport("GxFpga.dll")]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public static extern void GxFpgaReadMemory(short nHandle, UInt32 dwOffset, UInt32[] pvData, UInt32 dwSize, ref short pnStatus);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DllImport("GxFpga.dll")]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public static extern void GxFpgaReset(short nHandle, ref short pnStatus);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // … more functions and definitions here&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public const short GXFPGA_LOAD_TARGET_VOLATILE = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public const short GXFPGA_LOAD_TARGET_EEPROM = 1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// … more definitions here&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Note that in the example above,&amp;nbsp;&amp;nbsp;[MarshalAs(UnmanagedType.LPStr)]&amp;nbsp;&amp;nbsp;was used to override the default marshaled datatype of LPTSTR (Unicode). The default marshaled datatype for the .NET data types short and long work correctly and do not need to be modified. The StringBuilder class should be used for passing strings by reference as shown in the &lt;b&gt;GxFpgaGetDriverSummary &lt;/b&gt; function prototype above.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Add the .cs file&lt;/b&gt; created above to your C# .NET Project.&lt;br /&gt; &lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200191\CSharpProject.JPG" alt="C# Project" title="C# Project" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Include the marshalling class&lt;/b&gt; created in step 1, within your main project code with a "using" statement. Then call the imported DLL functions.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;br /&gt;&lt;b&gt;//Program.cs&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;using System.Text;&lt;br /&gt;using GxFpgaNamspace;&lt;br /&gt;&lt;br /&gt;class GxFpgaExample&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static void Main(string[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;short nHandle = 0, nStatus = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;long dwVersion = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32[] adwReadData;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32[] adwWriteData;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32 i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder sSummary = new StringBuilder(256);&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;adwReadData = new UInt32[10];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;adwWriteData = new UInt32[10];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(i=0; i&lt;10; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;adwWriteData[i] = i+2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GxFpga.GxFpgaInitialize(35, ref nHandle, ref nStatus);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GxFpga.GxFpgaGetDriverSummary(sSummary, 256, ref dwVersion, ref nStatus);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GxFpga.GxFpgaReset(nHandle, ref nStatus);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GxFpga.GxFpgaWriteMemory(nHandle, 0, adwWriteData, 4*10, ref nStatus);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GxFpga.GxFpgaReadMemory(nHandle, 0, adwReadData, 4*10, ref nStatus);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Note that the ref keyword is also used when passing non-string parameters by reference. The StringBuilder class is used so that the buffer can be allocated before passing it to the &lt;b&gt;GxFpgaGetDriverSummary&lt;/b&gt;. String would not work in this case because it is immutable.</description><link>https://www.MarvinTest.com/KB/Q200191/Calling-Marvin-Test-Solutions-DLL-functions-from-a-C-Visual-Studio-NET-Project</link><pubDate>5/6/2016</pubDate></item><item><title>PXI Addressing Using Marvin Test Solutions and VISA based Drivers - Published on 5/6/2016</title><description>To initialize a VISA based PXI drivers, you call &lt;b&gt;viOpen&lt;/b&gt;(.., resource, …_) function passing resource string as an address that can be one of the following: &lt;ul&gt;&lt;li&gt;&lt;b&gt;Canonical resource name&lt;/b&gt; – “PXI::15::INSTR” PXI bus 0 device 15,&amp;nbsp;&amp;nbsp;or using slot numbers “PXI::CHASSIS1::SLOT3::INSTR” –In this case, when you move the board to another slot in the chassis you need to specify different string and change the application.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Alias Name&lt;/b&gt;– “DMM1” –&amp;nbsp;&amp;nbsp;DMM1 need to be defined in the VISA resource manager (usually NI-MAX) Alias Editor and assigned to physical PXI address – In this case, when you move the board to another slot in the chassis you need to open the VISA resource manager and change the alias to point to the new slot – no change to the application is required.&lt;/li&gt;&lt;/ul&gt;Marvin Test Solutions drivers for PXI instruments are supplied with HW - Geotest Hardware Access Driver. These drivers works in two modes, using VISA or using HW: &lt;ul&gt;&lt;li&gt;&lt;b&gt;Using VISA&lt;/b&gt; – Using the Geotest driver &lt;b&gt;GxxxInitializeVisa&lt;/b&gt;( … ,sResource, …) function - Allow you to initialize using resource string or alias as in VISA : “PXI::15::INSTR” or “DMM1”) – Using an alias will allow moving of the card without changing the address (you need to change using the VISA resource manager Alias Editor). &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Using HW&lt;/b&gt; – the Geotest driver &lt;b&gt;GxxxxInitialize&lt;/b&gt;(.., nSlot, …)&amp;nbsp;&amp;nbsp;function –&amp;nbsp;&amp;nbsp;You can specify the nSlot parameter in two ways: logical number (legacy slot, for example 3) or physical slot number: chassis*256+slot&amp;nbsp;&amp;nbsp;- 0x103 for chassis 1 slot 3. If you use the logical slot number (3) when you move the board from slot 3 to 4 – You can reassign 4 to 3 logical number using the Marvin Test Solutions PCI/PXI Explorer applet and the app will work with no changes. HW also support alias name, you can set alias name using PXI Explorer and use a HW function to convert the “DMM1” alias as entered in PXI Explorer applet to nSlot to allow using names instead of addresses.&lt;/li&gt;&lt;/ul&gt;The following are the HW v3.2 functions used&amp;nbsp;&amp;nbsp;to map between alias and physical PXI/PCI address as defined in hw.h:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;br /&gt;// returns the VISA resource for the specified alias&lt;br /&gt;INT&amp;nbsp;&amp;nbsp;HwPciGetAliasVisaResource(PCSTR pszAlias, PSTR pszResource); &lt;br /&gt;&lt;br /&gt;// returns the chassis slot for the specified alias (Chassis*256+Slot)&lt;br /&gt;INT&amp;nbsp;&amp;nbsp;HwPciGetAliasChassisSlot(PCSTR pszAlias);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;// returns the legacy slot for the specified alias&lt;br /&gt;INT&amp;nbsp;&amp;nbsp;HwPciGetAliasLegacySlot(PCSTR pszAlias);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In ATEasy, you configure PXI driver address from the driver shortcut property page. Newer ATEasy drivers (for example GX2200.drv) supports the same type of initialization of the instrument: using VISA or using HW. If you intend to use VISA, set the &lt;b&gt;VISAResource &lt;/b&gt;driver parameter to a resource string or alias. If you intend to use HW, set the &lt;b&gt;Slot &lt;/b&gt;parameter to legacy or slot number (you can also call the HwPciGetAliasChassisSlot if you intend to use alias).&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Notes:&lt;/b&gt;&lt;ul&gt;&lt;li&gt;Marvin Test Solutions drivers that were release with HW v1.x or v2.x do not support VISA&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Alias mapping is provided with HW 3.2 and above&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200117/PXI-Addressing-Using-Marvin-Test-Solutions-and-VISA-based-Drivers</link><pubDate>5/6/2016</pubDate></item><item><title>What is the mating connector for the Marvin Test Solutions DIO products - Published on 5/6/2016</title><description>The Marvin Test Solutions DIO cards use 68-pin female VHDCI connector with a shielded, double pin row receptacle. The mating connector is the Honda HDRA-E68MA+ (or equivalent).&amp;nbsp;&amp;nbsp;The plastic shell part number is HDRA-E68LGKPE.&lt;br /&gt;&lt;br /&gt;For more information check the &lt;a href='http://www.honda-connectors.co.jp/product/index.php?m=partNoSearch&amp;ser_id=HDRA&amp;lang_cd=2' target='_blank'&gt;Honda Web Site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/HDRA-E68MA+ Pic1.jpg' target='_blank'&gt;Connector Image and Information&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200127/What-is-the-mating-connector-for-the-Marvin-Test-Solutions-DIO-products</link><pubDate>5/6/2016</pubDate></item><item><title>Importing Teradyne* DTB files to the Marvin Test Solutions GX5960 Digital Subsystem - Published on 5/6/2016</title><description>Teradyne&lt;sup&gt;TM&lt;/sup&gt;* users who have already developed digital test programs for the Teradyne&lt;sup&gt;TM&lt;/sup&gt;* platform in the form of Digital Test Binary (DTB) files can convert them to XML files and then import them using Marvin Test Solutions' GtDio6x Software Front Panel.&lt;br /&gt;&lt;br /&gt;The process of importing the DTB files consists of the following steps:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Exporting the DTB files to XML&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;The Teradyne&lt;sup&gt;TM&lt;/sup&gt;* software front panel can be used to export a DTB file to XML format, allowing for a transparent and readable representation of the digital test data. &lt;br /&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Creating a Domain to describe the GX5960 (GX5961/GX5964) Digital Subsystem&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;A Domain is a group of adjacent GX5960 PXI cards that are synchronized across the PXI backplane using a common set of timing signals. Several cards can be added to a domain in order to achieve a pin count that matches or exceeds the pin count requirement by the original .DTB file.&lt;br /&gt;&lt;br /&gt;The GX5960 series is comprised of two individual, stand alone PXI cards, the GX5961 and the GX5964. The GX5961 has 16 I/O channels and additional connectors for auxiliary channels, high voltage pins, and an external probe connection. The GX5964 has 32 I/O channels. More information can be found at: &lt;a href='http://www.marvintest.com/Product.aspx?model=GX5960+Series' target='_blank'&gt;GX5960&lt;/a&gt;. Depending on the needs of the end user (channel and feature requirements), one or more of these cards can be used to describe the digital subsystem. Using the GtDio6x Software Front Panel, a Domain can be set up in the domain tab as shown here:&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200208\KBDTB1b.BMP" alt="Digital Test Software Front Panel" title="Digital Test Software Front Panel" border='0' &gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Importing and executing the XML file for the Marvin Test Solutions Gx5960 Digital Subsystem&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;The XML file can be imported into the GX5960 Digital Subsystem by way of a C API function call that is part of the Marvin Test Solutions Driver DLL. The function prototype of this function is as follows:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;VOID WINAPI GtDio6xExecuteDigitalTest(SHORT nHandle, LPCSTR szXMLFile, PLONG palPinRemapping, LONG lPinRemappingArraySize, PSHORT pnTestResult, PLONG plStatus)&lt;/div&gt;&lt;br /&gt;The array parameter &lt;b&gt;palPinRemapping&lt;/b&gt; allows the end user to create a mapping between the DTB specified channel numbering and the physical channels that make up the Gx5960 Digital Subsystem Domain.&lt;br /&gt;&lt;br /&gt;The indices of the array represent the physical channels of the domain and the values of each element represent the corresponding mapped pins from the DTB derived XML file. The following graphic shows this relationship:&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200208\Gx5960XMLDTB1.JPG" alt="Teradyne DTB File Conversion" title="Teradyne DTB File Conversion" border='0' &gt;&lt;/div&gt;&lt;br /&gt;The &lt;b&gt;GtDio6xExecuteDigitalTest &lt;/b&gt; function will load the digital sub system with the pattern data, timing sets, and channel settings as specified in the DTB derived XML file and execute the digital burst.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Querying the Subsystem for error count and location&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;Once sequencer execution has started, its status can be polled by calling &lt;b&gt;GtDio6xQuerySequencerStatus&lt;/b&gt;. Once execution has finished (or during execution), the user can query the instrument for a real time error count. The instrument also has a 1024 deep real time error memory that stores the pattern location of the first 1024 errors that have occurred. The error memory can be accessed by calling &lt;b&gt;GtDio6xQueryErrorAddress&lt;/b&gt;. Finally, the error record memory can be accessed which stores a per channel and pin pass/fail result that mirrors the pattern data memory. The record memory can be accessed by calling &lt;b&gt;GtDio6xQueryRecordData&lt;/b&gt;.&lt;br /&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Saving configuration to a native Marvin Test Solutions XML file&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;Once the digital subsystem has been loaded with the DTB derived XML file, the configuration can be edited and saved in a Marvin Test Solutions native XML file format for later use by calling &lt;b&gt;GtDio6xFileSaveConfiguration&lt;/b&gt; and &lt;b&gt;GtDio6xFileLoadConfiguration&lt;/b&gt;.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;* Teradyne is trademark of Teradyne, Inc.</description><link>https://www.MarvinTest.com/KB/Q200208/Importing-Teradyne-DTB-files-to-the-Marvin-Test-Solutions-GX5960-Digital-Subsystem</link><pubDate>5/6/2016</pubDate></item><item><title>How to configure NI-MAX version 4.1 and above to recognize a Marvin Test Solutions chassis. - Published on 5/6/2016</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; &lt;b&gt;HW v3.0&lt;/b&gt; and above automated the process described below. You can configure the chassis from the HW &lt;b&gt; PXI/PCI Explorer&lt;/b&gt; applet that can be found the Windows Control Panel using the &lt;b&gt;Scan for New Devices&lt;/b&gt; and clicking on the &lt;b&gt;Save &lt;/b&gt;button.&lt;br /&gt;&lt;br /&gt;Download and install the &lt;b&gt;GxChassis &lt;/b&gt;package, found in the download section of the Geotest website. Once this package is installed, all the chassis INI files can be found at the following path: C:Program Files\Marvin Test Solutions\GxChassis\INI Files\.&lt;br /&gt;&lt;br /&gt;In NI Measurement &amp; Automation Explorer (NI-MAX), right click on "PXI System" and select "Show PXI Buses". Typically, multiple buses will be shown, and the chassis may be associated with any one of these buses (depending on chassis type).&lt;br /&gt;&lt;br /&gt;Starting from the first bus listed, right click and select "Identify as a PXI Chassis". Then choose "other chassis" and select the Geotest .INI file that corresponds to your chassis.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/screen1.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;In case of an error message ("This chassis has been identified but is not described in the pxisys.ini for this system") right click on "PXI System" and select "Delete All Identifications".&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/screen3.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;Repeat steps 1 through 3 listed above, using the next bus in sequence, until NI-MAX properly identifies the correct Geotest chassis.&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Right click on "PXI System" again, and deselect (uncheck) "Show PXI Buses".&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/screen4.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;You will now be able to view and configure your chassis and its resources, using NI Measurement &amp; Automation Explorer (NI-MAX) 4.1+. &lt;br /&gt; &lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/screen5.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200085/How-to-configure-NI-MAX-version-4-1-and-above-to-recognize-a-Marvin-Test-Solutions-chassis</link><pubDate>5/6/2016</pubDate></item><item><title>Integrating Verifide's Data Storage and Analysis Tools with ATEasy - Published on 3/21/2016</title><description>ATEasy provides the ability to easily log test data which can then be analyzed to identify failure rates, yields, and pass/ fail trends. The use of 3rd party data analysis tools can greatly simplify this process compared to using conventional IT solutions which are deficient in several key areas: &lt;br /&gt;&lt;blockquote&gt;1.	File based data systems although simple, do not provide data management, search, or querying capabilities.&lt;br /&gt;2.	Database systems allow querying but are not flexible, require database administrator skills and effort, and can perform poorly&lt;br /&gt;3.	Basic data management methods do not readily support the extraction of trends and metrics from test data&lt;br /&gt;4.	Tools like Excel provide basic charts but no interactivity or ability to drill down&lt;br /&gt;5.	Dedicated reporting tools are expensive, not flexible, and often require coding to integrate&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Organizations many times, are left to build their own data management infrastructure and applications, specifically for their own system and data requirements. And while this approach may meet their needs, such systems are not scalable and useable across multiple devices or production lines. A better solution is to consider a test data management tool that can be easily integrated with test software such as ATEasy. &lt;b&gt;Verifide PASS &lt;/b&gt;is a a test management platform that can provide you with extensive capabilities for analyzing your test data. &lt;br /&gt;&lt;br /&gt;Designed with these requirements in mind, Verifide allows you to keep your tests in ATEasy while easily adding comprehensive data management and analysis tools to your existing systems. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200288\Figure1_2.PNG" alt="The PASS software fits around your existing ATEasy tests" title="The PASS software fits around your existing ATEasy tests" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1:The PASS software fits around your existing ATEasy tests&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;The PASS software by Verifide is a complete test platform that provides a comprehensive test infrastructure, data management and visualization tools, including the following capabilities:&lt;br /&gt;&lt;blockquote&gt;1.	The ability to store rich data such as tables, arrays, and images.&lt;br /&gt;2.	The power to search, access, and analyze test data locally or from a remote computer or via a web application&lt;br /&gt;3.	Requires no database design or administration because the database is built dynamically as data is stored&lt;br /&gt;4.	Visualize data and identify trends and drill down into raw data for troubleshooting/analysis &lt;br /&gt;5.	Compare/overlay test data and plots&lt;br /&gt;6.	Generate reports from tests with no code&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;The PASS software is a highly modular and scalable architecture. With the PASS platform, there is no database setup and you can continue to use the same framework and applications to manage data for any and all of your test systems. You can use it on one computer, or deploy through secure corporate IT firewalls with hundreds of users. &lt;br /&gt;With the event-driven architecture of ATEasy, the integration of the PASS data management system into your existing test systems is easily done. By simply adding the driver, your test results will be pushed to the database and the PASS applications will allow you to view trend data as well as generate reports.&lt;br /&gt;For a more hands-on demonstration of how to integrate the software and use the data analysis tools, you can view ATEasy integration video at:&lt;br /&gt;&lt;a href='https://player.vimeo.com/video/157803873' target='_blank'&gt;https://player.vimeo.com/video/157803873&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note&lt;/b&gt;: The example below assumes that the ATEasy software development platform is already installed.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Step 1: Install the PASS software&lt;/h3&gt;Go to &lt;a href='http://www.verifide.com/web/ateasy.html' target='_blank'&gt;http://www.verifide.com/web/ateasy.html&lt;/a&gt; to register and get a download of the 30 day trial software.&lt;br /&gt;You will be sent a download link and installation guide to complete the installation. The example is available &lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/Q200288\PASS_Driver.zip' target='_blank'&gt;here&lt;/a&gt; for download.&lt;br /&gt;&lt;h3&gt;Step 2: Add the driver to your ATEasy System.&lt;/h3&gt;First add the driver to the project by navigating to the &lt;b&gt;$(InstallDir)\Samples\ATEasy\&lt;/b&gt; folder and selecting the &lt;b&gt;PASSDriver.drv&lt;/b&gt; file&lt;br /&gt;This will load the driver with defaults and import all needed libraries automatically&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200288\Figure2.PNG" alt="The driver will be added to the project" title="The driver will be added to the project" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2: The driver will be added to the project&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200288\Figure3_2.PNG" alt="Select the driver file to add to the System" title="Select the driver file to add to the System" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3: Select the driver file to add to the System&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Step 3: Configure any options using driver parameters&lt;/h3&gt;The PASS Driver allows you to configure options and override the default settings. Right click on the [&lt;b&gt;PASSDriver&lt;/b&gt; in the &lt;b&gt;System\Drivers&lt;/b&gt; and choose Properties, then go to the Misc tab to set these options. &lt;br /&gt;By default, the driver is &lt;b&gt;ENABLED&lt;/b&gt;, Test data and Program summary record are stored to the Database, and PASS run-time services are disabled (for events/alarms/services) so you can get started without requiring any additional applications to be started/stopped.&lt;br /&gt;If you wish to disable the driver entirely, set the &lt;b&gt;ALL_OFF&lt;/b&gt; parameter to 1&lt;br /&gt;Data is stored by default to a Database named &lt;b&gt;ATData&lt;/b&gt;. If you wish to store to another Database, set the &lt;b&gt;DB_NAME&lt;/b&gt; parameter in the driver settings, or use one of the available driver commands to set it.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200288\Figure4.PNG" alt="The driver has various options that you can control" title="The driver has various options that you can control" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4: The driver has various options that you can control&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Step 4: Run your tests.&lt;/h3&gt;By default, data storage is enabled and you should not need to do anything. The PASS driver will key off of the ATEasy event-driven mechanism and store the data automatically (You do not need to do any DB or parameter setup upfront)&lt;br /&gt;If you choose to store additional data, in addition to the TestResult, such as arrays, images, etc. then you can use the commands in the driver to do so. You can also use the driver to log activity or debug data for later analysis.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200288\Figure5.PNG" alt="The driver has commands to add data, log messages, and configure options" title="The driver has commands to add data, log messages, and configure options" border='0' &gt;&lt;br /&gt;[&lt;b&gt;Figure 5: The driver has commands to add data, log messages, and configure options&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200288\Figure6.PNG" alt="The driver commands can be used to add additional results to the test record or to log information messages to the log" title="The driver commands can be used to add additional results to the test record or to log information messages to the log" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6: The driver commands can be used to add additional results to the test record or to log information messages to the log&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Step 4: Consuming the data&lt;/h3&gt;Once the results have been stored, you can view them using the PASS Vision application. This can be located in &lt;b&gt;Start-&gt;All Programs-&gt;Verifide-&gt;Applications-&gt;Vision&lt;/b&gt;&lt;br /&gt;When the application opens up, you will be asked to login. The default, Readonly, account is &lt;b&gt;vguest&lt;/b&gt; and does not have a password, so leave it blank.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200288\Figure7.PNG" alt="The vguest account does not need a password to read data from the database" title="The vguest account does not need a password to read data from the database" border='0' &gt; &lt;br /&gt;&lt;b&gt;Figure 7: The vguest account does not need a password to read data from the database&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This will bring up a Dashboard and show you all the existing databases and a quick snapshot of the test volume etc. If you wish to learn more, you can play around with the &lt;b&gt;DEMO&lt;/b&gt; database to explore the full capabilities of the PASS data platform.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200288\Figure8_2.PNG" alt="The dashboard shows all the current databases and allows the user to choose what analysis to perform" title="The dashboard shows all the current databases and allows the user to choose what analysis to perform" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 8: The dashboard shows all the current databases and allows the user to choose what analysis to perform&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Viewing test results&lt;/h3&gt;To view past results by time or test name etc, first select the database name, then click on the Query button in the Dashboard. This will bring up a list of previous results. Clicking on a result will allow you to view the raw data and/or report for the test&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200288\Figure9_2.PNG" alt="The PASS reporting framework allows you to create custom templates with charts, tables, images etc." title="The PASS reporting framework allows you to create custom templates with charts, tables, images etc." border='0' &gt; &lt;br /&gt;&lt;b&gt;Figure 9: The PASS reporting framework allows you to create custom templates with charts, tables, images etc.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Trending&lt;/h3&gt;With the PASS data management, you automatically get the ability to observe data trends across runs. To perform a trend, select a database from the dashboard and click on the Trend button.&lt;br /&gt;Here, you will first select a test or tests whose results you want to analyze for trends. Then select the data items such as &lt;b&gt;TestResult&lt;/b&gt; to trend. To define the data set, you need to then perform a query – the easiest way to do this is using the Quick Query button at the top.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200288\Figure10_2.PNG" alt="The Trend application allows selection of result fields&amp;nbsp;&amp;nbsp;to create a trend table" title="The Trend application allows selection of result fields&amp;nbsp;&amp;nbsp;to create a trend table" border='0' &gt; &lt;br /&gt;&lt;b&gt;Figure 10: The Trend application allows selection of result fields&amp;nbsp;&amp;nbsp;to create a trend table&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Clicking on the Load button will mine all the data items from the results available and present it to you in a table. You can then further analyze the data visually using the chart button at the bottom of the table.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200288\Figure11_2.PNG" alt="The trend table shows tabulated result values based on your query" title="The trend table shows tabulated result values based on your query" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 11: The trend table shows tabulated result values based on your query&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;From the trend table, if you click the Chart icon at the bottom of the page, then it will bring up a chart viewer for you to see all your test results plotted in a trend line.&lt;br /&gt; &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200288\Figure12_2.PNG" alt="The trend table values can be plotted and you can zoom in and export the chart as well." title="The trend table values can be plotted and you can zoom in and export the chart as well." border='0' &gt; &lt;br /&gt;&lt;b&gt;Figure 12: The trend table values can be plotted and you can zoom in and export the chart as well.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Metrics&lt;/h3&gt;Metrics are important to viewing your overall test process and volumes. PASS provides this feature out-of-the-box with customizable pivot tables and analytics. For more information, please visit our main website to watch our product intro videos, or refer to our comprehensive help file.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200288\Figure13_2.PNG" alt="Metrics allow you to view process information and statistics" title="Metrics allow you to view process information and statistics" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 13: Metrics allow you to view process information and statistics&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;Using Verifide with ATEasy offers a complete test solution. Verifide provides the tools you need across your testing process- from data analysis to data storage, including monitoring and execution requirements.&lt;br /&gt;&lt;br /&gt;Learn more at &lt;a href='http://www.verifide.com' target='_blank'&gt;http://www.verifide.com&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200288/Integrating-Verifide-s-Data-Storage-and-Analysis-Tools-with-ATEasy</link><pubDate>3/21/2016</pubDate></item><item><title>White Paper: Leveraging Open Architecture, Modular Test Platforms for ATE - Published on 11/30/2015</title><description>Card modular archtectures and specifically the PXI architecture offer a compelling alternative to closed, "big iron" ATE systems for semiconductor test.&lt;br /&gt;This presentation provides an overview of market factors impacting the semiconductor ATE business and describes how advanced PXI instrumentation and systems are addressing current and future semiconductor test needs. The next generation of PXI digital instrumentation offers the capabilities and test features normally only found in proprietary ATE semiconductor systems. With advent of these new, advanced digital subsystems, PXI–based semiconductor test solutions such as MTS' TS-900, can now offer a broader range of test capabilities and features for digital, mixed-signal and RF test applications.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2015\ITC-presentation-2015.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the presentation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200286/White-Paper-Leveraging-Open-Architecture-Modular-Test-Platforms-for-ATE</link><pubDate>11/30/2015</pubDate></item><item><title>White Paper: PXI-Based, High Performance, High Density Switching Architecture - Published on 11/30/2015</title><description>Virtually all ATE systems employ a switching subsystem in order to route test system resources to multiple test points on the UUT. The challenge for any switching subsystem is multi-dimensional and involves many considerations / trade-offs including footprint, performance, flexibility, maintainability, and reliability. Additionally, if the application needs to address legacy test needs, there can be the additional challenge to support not only current and future switching requirements, but also legacy test requirements. This paper reviews current switching architectures employed today and discusses the benefits / limitations of current COTS offerings. The paper also reviews the switching requirements associated with addressing high complexity / high performance functional test applications and how the development and implementation of a PXI-based switching architecture can meet these requirements.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2015\PXI-BasedHighPerformanceHighDensitySwitchingArchitecture.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200287/White-Paper-PXI-Based-High-Performance-High-Density-Switching-Architecture</link><pubDate>11/30/2015</pubDate></item><item><title>White Paper:  PXI–Based Semiconductor Test Systems: Advanced Test Capabilities and Features - Published on 10/13/2015</title><description>The next generation of PXI digital instrumentation offers the capabilities and test features normally only found in proprietary ATE semiconductor systems. With the advent of these new, advanced digital subsystems, PXI–based semiconductor test solutions such as the TS-900, can now offer a broader range of test capabilities and features for digital, mixed-signal and RF test applications. Offering comparable features and performance to proprietary or “big iron” ATE, today’s PXI systems offer compelling test solutions for verification, focused production, and failure analysis applications. With a wide offering of software tools, an intuitive software development / test executive environment (ATEasy), and the open architecture of PXI, PXI platforms like the TS-900 offer a cost effective, performance ATE solution. &lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2015\PXI-basedSemiconductorTestSystemsWhitePaper.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200285/White-Paper-PXI-Based-Semiconductor-Test-Systems-Advanced-Test-Capabilities-and-Features</link><pubDate>10/13/2015</pubDate></item><item><title>Source Control using ATEasy - Published on 9/3/2015</title><description>&lt;h3&gt;Overview&lt;/h3&gt;In this example we demonstrate how to setup source control for a project in ATEasy 9.0 using Git source control. Features include the ability able to add, check in/out files, view history and check differences between repository history files.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Download and Install Git&lt;/h3&gt;Download and install Git from the Git website: &lt;a href='http://git-scm.com/downloads' target='_blank'&gt;http://git-scm.com/downloads&lt;/a&gt;. The Git GUI can be used to view your files and edits with a broad spectrum of applications, but we will focus on using Git for ATEasy source control.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Creating Workspace&lt;/h3&gt;We will open ATEasy and create a new workspace called &lt;b&gt;SourceControlExample.wsp&lt;/b&gt;. You can place the workspace within your own projects folder, in a folder on your desktop or in some other folder.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Adding Project to Workspace&lt;/h3&gt;Instead of creating our own project we will use one that already exists. We use the Forms project and program located in the ATEasy Examples folder (on x64 machine &lt;b&gt;C:\Program Files(x86)\ATEasy 9.0\Examples\&lt;/b&gt;). Copy the&lt;b&gt; Forms.prj&lt;/b&gt; and&lt;b&gt; Forms.prg&lt;/b&gt; to your project folder located in the SourceControlExample.wsp.&lt;br /&gt;&lt;br /&gt;Click &lt;b&gt;File-&gt;Open&lt;/b&gt; and Forms.prj in your folder. This will open the project and program file in your workspace. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200265\Add Forms Project_2.PNG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1 : Open Forms Project in SourceControlExample Workspace&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Setting up Source Control Options&lt;/h3&gt;To setup Source Control in ATEasy click &lt;b&gt;Tools-&gt;Options&lt;/b&gt;. Go to the &lt;b&gt;Source Control &lt;/b&gt;tab and choose what type of Source Control you are using. In this example we are using Git. Choose where the source control client executable (.exe) file is located.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200265\Tools Source Control Options_8.PNG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2 : ATEasy Source Control Options&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Adding Files to Source Control&lt;/h3&gt;Each ATEasy file in the workspace can have the following icons in addition to the blue color indicating that the file belongs to source control:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200265\Source Control Menu Item_1.JPG" alt="ToolTip" title="ToolTip" border='0' &gt; file checked out by the current user&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200265\Source Control Menu Item_2.JPG" alt="ToolTip" title="ToolTip" border='0' &gt; file checked out by others&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200265\Source Control Menu Item_3.JPG" alt="ToolTip" title="ToolTip" border='0' &gt; file checked out by multiple users&lt;br /&gt;&lt;br /&gt;Click on the Forms project to select it. We will now add the Files to Source Control, creating a saved base before we make any changes. Click &lt;b&gt;File-&gt;Source Control-&gt;Add&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200265\Add Files to Source_3_1.PNG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3 : Initial addition of files to Source Control&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200265\Add Files to Source_3.PNG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4 : Add Forms Project and Program to the Source Control&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;After the window above pops up select both the &lt;b&gt;.PRJ&lt;/b&gt; and &lt;b&gt;.PRG&lt;/b&gt; files and add a comment to the commit. The comment will allow you easily distinguish&amp;nbsp;&amp;nbsp;commits from each other. Try to use short phrases that describe what changes you made to the files. Finally click &lt;b&gt;OK&lt;/b&gt; and the Source Control Log will pop up and show the Git commands that are being called to commit the files to your source control. &lt;br /&gt;&lt;br /&gt;The Workspace window in ATEasy changes after a Check In is made.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200265\Workspace after Source Control_9.PNG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5 : Workspace After Source Control Check In&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Viewing Repository Path of a File&lt;/h3&gt;The repository path can be viewed by opening the properties of a file in ATEasy and going to the &lt;b&gt;Source Control&lt;/b&gt; tab. In this example we went to the &lt;b&gt;Forms.prg&lt;/b&gt; properties.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200265\Form Source Control Properties Repository Path_7.PNG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6 : Source Control Properties&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Making and Committing Changes to Source Control&lt;/h3&gt;We will make a change so we can see how the history and differences work. In the forms program, open and maximize the Forms so we can view all the forms that are available. Now highlight over a few forms, delete and save. &lt;br /&gt;&lt;br /&gt;Now to commit the changes we have made, click&lt;b&gt; File-&gt;Source Control-&gt;Check In…&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200265\Checkin Files _4.PNG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 7 : Check In Updated File to Source Control&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Since we only changed the program only check the &lt;b&gt;Forms.prg&lt;/b&gt;. Add a comment to distinguish it from other changes we may have made. Click &lt;b&gt;OK&lt;/b&gt; to commit the change into the Source Control.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200265\Forms Update Delete forms_4.PNG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 8 : Update Source Control with Program&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Viewing Source Control History&lt;/h3&gt;To view the Source Control History, click to highlight the file you want to check then click&lt;b&gt; File-&gt;Source Control-&gt;Show History…&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200265\Show Deletion History of Source Control Check Diff_5.PNG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 9 : Source Control History&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In the &lt;b&gt;Source Control History&lt;/b&gt; window you can view all the commits you have made. Information about the user is displayed, the time they committed the change and the description of the change are all displayed. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Display Source Control Differences&lt;/h3&gt;To show the differences between the original file and the current file, highlight over the first commit on the bottom and click &lt;b&gt;Diff… &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200265\Show Diff in ATEasy Diff_6.PNG" alt="ToolTip" title="ToolTip" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 10 : Difference in Original and Current program files.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To jump through the differences in the files, click the down arrow. The left side shows the current file and right side shows the file in the source control. As you can see the form was deleted from the original file.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;See Also&lt;/h3&gt;The ATEasy on-line books provide additional information about using source control tools with ATEasy.</description><link>https://www.MarvinTest.com/KB/Q200265/Source-Control-using-ATEasy</link><pubDate>9/3/2015</pubDate></item><item><title>Using ATEasy Procedure Data Type to Dynamically Call Commands and Procedures - Published on 9/3/2015</title><description>The ATEasy Procedure data type allow users to programmatically link to procedures and commands, enabling the user to:&lt;ul&gt;&lt;li&gt;Call procedures or commands using a string that hold their name&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Dynamically call commands of different driver Instances&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Create scalable drivers&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Procedure Data Type Basics&lt;/h3&gt;The ATEasy procedure data type is a pointer to a procedure. To assign data to a procedure variable you use the procedure name or procedure name string. For example, if &lt;b&gt;proc &lt;/b&gt;is a variable of data type Procedure, the following code shows the use of the variable:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;! proc: Procedure&amp;nbsp;&amp;nbsp;! declare a variable in variables&lt;br /&gt;&lt;br /&gt;proc=GetLogString&amp;nbsp;&amp;nbsp;! assigns the internal library function GetLogString() pointer to proc variable&lt;br /&gt;Print proc()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! will call the GetLogString and will print the current log string&lt;br /&gt;&lt;br /&gt;proc=System._Reset ! assigns System _Reset() procedure pointer to proc variable&lt;br /&gt;proc()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! will call the _Reset() procedure&lt;br /&gt;&lt;br /&gt;proc=Abs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! assigns the internal function Abs pointer to proc variable&lt;br /&gt;print proc(-5)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! calls Abs with a parameter of -5, this will print 5 to the log&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;When referencing a command with a procedure variable, the command statement is enclosed in quotes:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;br /&gt;proc="TestExec Log Clear"&amp;nbsp;&amp;nbsp;! assigns the command 'TestExec Log Clear()' pointer to a procedure&lt;br /&gt;proc()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! will clear the Test Executive's log&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Procedure variables can also be assigned to string variables in case any string manipulation needs to be done:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;! proc: Procedure&lt;br /&gt;! s:String&lt;br /&gt;&lt;br /&gt;proc="TestExec Log Append"&lt;br /&gt;s=proc&lt;br /&gt;s=s+" Message"&lt;br /&gt;proc=s&lt;br /&gt;proc("My note")&amp;nbsp;&amp;nbsp;! calls TestExec Log Append Message("My Note")&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Using Procedures Variable to Call Multiple Module Instances&lt;/h3&gt;ATEasy supports multi UUT testing so that a single test program can be written to support testing of many devices in parallel or sequential modes. To achieve this functionality, we need to dynamically select to which Driver Shortcut to direct the commands.&amp;nbsp;&amp;nbsp;In a recent application, a user has 16 data bus transceivers which the user tests by sending and receiving messages from the PC.&amp;nbsp;&amp;nbsp;The communication with the UUTs is modeled with the UUT ATEasy driver and 16 instances of the driver are placed in the ATEasy System which the handles UUT1 through UUT16.&lt;br /&gt;&lt;br /&gt;Since the same Program will be used for all 16 UUTs, the TPS must somehow differentiate between the various instruments. Using the internal AApp class&amp;nbsp;&amp;nbsp;UutIndex property to differentiate between the UUT that the program talks to. This property returns the current instance of the UUT that is running.&amp;nbsp;&amp;nbsp;With some procedural code in the Program module, the programmer can reference the proper driver instance as shown here:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure UutMessageSend(sMessage): Void&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;sMessage: Val String&lt;br /&gt;&amp;nbsp;&amp;nbsp;proc: Procedure&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;proc="UUT"+Str(App.UutIndex+1)+" Message Send"&lt;br /&gt;&amp;nbsp;&amp;nbsp;proc(sMessage)&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For this test case, the programmer uses ATEasy's Multiple UUT testing mode and specifies parallel testing of 16 UUTs.&amp;nbsp;&amp;nbsp;When the application is run, 16 instances of the program and driver are created by ATEasy and executed at the same time.&amp;nbsp;&amp;nbsp;The instances are automatically assigned an AppIndex of 0 to 15.&amp;nbsp;&amp;nbsp;When UutMessageSend() is called from the Program module, the command dynamically created is "UUT1 Message Send(sMessage)" to "UUT16 Message Send(sMessage)".&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Arrays of Procedures&lt;/h3&gt;Another approach to the solving the problem of dynamically directing commands to various UUTs is to assemble a collection of procedure pointers into an array and use the UutIndex to differentiate between them.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;! i: Long&lt;br /&gt;! aprocUutMessageSend: Procedure[1] ! declare array of procedure&lt;br /&gt;&lt;br /&gt;! Resize the procedure array&lt;br /&gt;redim aprocUutMessageSend[App.UutCount]&lt;br /&gt;! Loading the procedure array&lt;br /&gt;for i=0 to App.UutCount-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;aprocUutMessageSend[i]="UUT"+Str(i+1)+" Message Send"&lt;br /&gt;next&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The procedure array is loaded once during application initialization.&amp;nbsp;&amp;nbsp;After the array is loaded, it can be called from within the Program module with a single call:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;aprocReferences[App.UutIndex](sMessage)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Common Errors&lt;/h3&gt;&lt;b&gt;Procedure Scope&lt;/b&gt;&lt;br /&gt;Referenced procedures must be in scope.&amp;nbsp;&amp;nbsp;If it is not, you will receive the following JIT compiler error.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200274/JIT592_SystemReset.PNG" alt="Error Dialog that displays when a referenced procedure is out of scope" title="Error Dialog that displays when a referenced procedure is out of scope" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If you link a System procedure to a procedure variable in the Program module, the System procedure must be set to public.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200274/PropertiesEditor_PublicFlag.png" alt="Properties Editor showing Public Flag Checked" title="Properties Editor showing Public Flag Checked" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Procedure Not Compiled&lt;/b&gt;&lt;br /&gt;If you assign a command to a procedure variable using quotation marks the reference will not be noticed and compiled when the application is built.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200274/RT414ProcedureNotCompiled.PNG" alt="Error Dialog that displays when a referenced procedure is not compiled" title="Error Dialog that displays when a referenced procedure is not compiled" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This issue can be resolved by checking the Compile checkbox in the Properties window for the procedure. Checking the Compile checkbox ensures that the procedure will be compiled, even if it is not used by your application.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200274/PropertiesEditor_CompileFlag.png" alt="Properties Editor showing Compile Flag Checked" title="Properties Editor showing Compile Flag Checked" border='0' &gt;&lt;/div&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200274/Using-ATEasy-Procedure-Data-Type-to-Dynamically-Call-Commands-and-Procedures</link><pubDate>9/3/2015</pubDate></item><item><title>White Paper: PXI-Based, Functional Test Solutions for Legacy and Next Generation Test Requirements - Published on 7/2/2015</title><description>Mission critical, high value electronic products require comprehensive functional testing prior to final shipment or deployment.&amp;nbsp;&amp;nbsp;In addition there are many products in use today that have lifecycles extending into decades, creating a challenge for test organizations that must support these products.&amp;nbsp;&amp;nbsp;The lack of available OEM support for legacy Automated Test Equipment (ATE) systems compels users to consider either replacing or upgrading high-performance legacy ATE systems. Marvin Test Solutions’ PXI-based, GENASYS platform offers the features and capabilities needed to support both legacy and next generation factory and depot test needs.&lt;br /&gt;&lt;br /&gt;Read the white papers to learn more about the GENASYS platform’s key features including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A high performance, modular , switching subsystem&amp;nbsp;&amp;nbsp;that addresses both legacy and future test needs&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A high performance digital subsystem for both legacy and next generation digital test needs&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Configurable, commercial off the shelf (COTS) digital, analog, and switching software components including migration tools for addressing legacy test applications&lt;/li&gt;&lt;/ul&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2015\PXI-basedFunctionalTestSolutions.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200283/White-Paper-PXI-Based-Functional-Test-Solutions-for-Legacy-and-Next-Generation-Test-Requirements</link><pubDate>7/2/2015</pubDate></item><item><title>White Paper: Bridging the Warfighting Armament Test Gap - Published on 6/26/2015</title><description>Over the years, modern fighter aircraft have received numerous upgrades to their avionics and armament systems. From the F-35 to the A-10, all of the aircraft now possess “smart” (Mil-STD 1553 and 1760) weapons technology and enhancements to legacy weapons. Today’s armament systems do not resemble the systems TAC, now called Air Combat Command (ACC), deployed almost four decades ago. Yet, maintainers are still required to use the same or similar ACPTS (Armament Circuits Pre-load Test Sets) combined with big box test equipment to verify that these sophisticated armament and munitions systems are Full Mission Capable (FMC). Additionally, this combination of box testers and ACPTS equipment doesn't deliver the capabilities needed to support today’s Smart weapons.The advanced Smart armament and munitions employed today, combined with obsolete or inadequate test equipment deployed on the flight line, has created an armament test gap because of the inability of today’s O-Level testers to provide the necessary tools to test and maintain armament and munitions. The armament test gap represents major maintenance and readiness issues for maintainers and operators alike due to the necessity of having to implement of a multitude of workarounds on the flight line.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Having identified the armament test gap in legacy 4th and 5th generation aircraft several years ago, Marvin Test Solutions has developed, qualified, and successfully deployed the MTS-3060 SmartCan™ universal O-level tester across legacy aircraft and is planning to do the same for 5th&amp;nbsp;&amp;nbsp;generation aircraft. Despite maintaining the small footprint of a ACPTS, the MTS-3060 SmartCan™ bridges the armament test gap by combining all of the capabilities of the ACPTS and &lt;br /&gt;provides maintainers with the necessary tools to adequately test and troubleshoot today’s aircraft loaded with legacy and smart weapons. &lt;br /&gt;&lt;br /&gt;To read more about how the MTS-3060 is bridging the armament test gap, click &lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2013\BridgingtheArmamentTestGap.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;here&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200249/White-Paper-Bridging-the-Warfighting-Armament-Test-Gap</link><pubDate>6/26/2015</pubDate></item><item><title>Upgrading PXI Instrument Firmware - Published on 6/18/2015</title><description>&lt;h3&gt;Overview&lt;/h3&gt;Often, capabilities of PXI instrumentation is enhanced over the life of the product.&amp;nbsp;&amp;nbsp;Sometimes those enhancements are as a result of changes or improvements to the instrument drivers and/or controlling software.&amp;nbsp;&amp;nbsp;But many times those improvements are in the form of new hardware capabilities via the instrument firmware.&amp;nbsp;&amp;nbsp;The firmware may fix bugs that were identified after the product was delivered, or may introduce altogether new capabilities.&amp;nbsp;&amp;nbsp;In these cases, it is preferred that the new firmware be updated, or flashed, in the field, rather than returning the instrument to the factory.&amp;nbsp;&amp;nbsp;This minimizes down time associated with shipping to and from the factory, and allows immediate feedback as to the effectiveness of the upgrade.&lt;br /&gt;&lt;br /&gt;Instruments produced by Marvin Test Solutions support field upgrades to the firmware, and from time-to-time, new firmware is released for Marvin Test Solutions (MTS) products.&amp;nbsp;&amp;nbsp;This document explains how to flash the firmware in the field for those MTS instruments that support this capability.&amp;nbsp;&amp;nbsp;The process for flashing firmware on MTS instruments is essentially the same from product-to-product, so this document will use the GX5292 Digital IO (DIO) instrument as a representative example for how to flash firmware for all MTS instruments.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Upgrading Firmware&lt;/h3&gt;&lt;b&gt;Step 1&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Request the new firmware file from Marvin Test Solutions.&amp;nbsp;&amp;nbsp;The best method to do so is to open a &lt;a href='http://www.marvintest.com/magic' target='_blank'&gt;Magic support ticket&lt;/a&gt;, accessible from the Marvin Test Solution’s web page under the “Support” link (Figure 1, below), and request the firmware file.&amp;nbsp;&amp;nbsp;Using Magic requires an MTS User Account.&amp;nbsp;&amp;nbsp;It is free to sign up and requires only some basic information so we know who you are and how to contact you for support follow-up.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200258\Magic.bmp" alt="Magic support link" title="Magic support link" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Magic support link&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Step 2&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Launch the instrument's virtual panel.&amp;nbsp;&amp;nbsp;For the GX5292, this is the DIO Panel (Figure 2, below), which is included in the instrument’s software installation package.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200258\DIO Panel 01.bmp" alt="GX5292 instrument panel" title="GX5292 instrument panel" border='0' &gt; &lt;br /&gt;&lt;b&gt;Figure 2&lt;/b&gt;:&amp;nbsp;&amp;nbsp;GX5292 instrument panel&lt;/div&gt; &lt;br /&gt;&lt;b&gt;Step 3&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Initialize the instrument by selecting the hardware you wish to initialize.&amp;nbsp;&amp;nbsp;For the GX5292, click on the “Configuration” tab located at the top of the instrument panel, and enter your instrument list.&amp;nbsp;&amp;nbsp;This may be a single instrument (Figure 3, below), or multiple instruments configured as a Master/Slave domain.&amp;nbsp;&amp;nbsp;If necessary, you may need to select the instance of the instrument you want to initialize.&amp;nbsp;&amp;nbsp;For the GX5292, and most other MTS products, you specify the instrument by its PXI slot number.&amp;nbsp;&amp;nbsp;Click on the &lt;b&gt;Initialize&lt;/b&gt; button.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200258\DIO Panel 02.bmp" alt="Initializing the instrument" title="Initializing the instrument" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Initializing the instrument&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Step 4&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Once the instrument is initialized, click on the &lt;b&gt;About&lt;/b&gt; tab.&amp;nbsp;&amp;nbsp;The About page displays useful information about the instrument, such as the driver revision, the instrument serial number (some instruments do not include this information), the firmware revision, and the Upgrade Firmware button (Figure 4).&amp;nbsp;&amp;nbsp;Click on the &lt;b&gt;Upgrade Firmware&lt;/b&gt; button.&amp;nbsp;&amp;nbsp;Using the navigation window, select the firmware file that was provided to you.&amp;nbsp;&amp;nbsp;Before committing to the upgrade, you will be provided a final opportunity to cancel the firmware upgrade process (Figure 5).&amp;nbsp;&amp;nbsp;Click on &lt;b&gt;Yes&lt;/b&gt; to continue with the firmware upgrade.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200258\DIO Panel 03.bmp" alt="The "About" page" title="The "About" page" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4&lt;/b&gt;:&amp;nbsp;&amp;nbsp;The "About" page&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200258\DIO Panel 06.bmp" alt="Update Firmware confirmation" title="Update Firmware confirmation" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Update Firmware confirmation&lt;/div&gt;&lt;br /&gt;During the firmware upgrade process, the status of the upgrade (erasing old firmware, programming new firmware and verifying new firmware) will be displayed (Figure 6).&amp;nbsp;&amp;nbsp;It is &lt;b&gt;very important &lt;/b&gt;that the process not be interrupted or chassis power removed during the upgrade process – especially after the old firmware has been erased.&amp;nbsp;&amp;nbsp;It is possible that the instrument would be left without a valid firmware installed, rendering the instrument useless.&amp;nbsp;&amp;nbsp;If this were to happen, then the instrument can be returned to the MTS factory in Irvine, California, where a new firmware image can be installed on the instrument.&amp;nbsp;&amp;nbsp;Request an RMA via your Magic incident.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200258\DIO Panel 08.bmp" alt="Firmware update status" title="Firmware update status" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 6&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Firmware update status&lt;/div&gt;&lt;br /&gt;At the conclusion of the firmware upgrade, a message will be displayed indicating that the firmware upgrade was successful (Figure 7).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200258\DIO Panel 09.bmp" alt="Firmware update completed" title="Firmware update completed" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 7&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Firmware update completed&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Step 5&lt;/b&gt;:&amp;nbsp;&amp;nbsp;At this time, the instrument EEPROM has been upgraded and contains the new firmware image, but the instrument FPGA still retains the logic represented by the old firmware, which was loaded during the chassis power up sequence.&amp;nbsp;&amp;nbsp;To begin using the new firmware, it is necessary to run the PXI chassis through a full power cycle.&amp;nbsp;&amp;nbsp;Shut down all open applications, and then shut down the Windows OS.&amp;nbsp;&amp;nbsp;If the PXI chassis is still running after Windows terminates, cycle chassis power to OFF.&amp;nbsp;&amp;nbsp;Allow the chassis to remain off for several seconds to provide sufficient time for all backplane power voltages to dissipate, and then cycle the chassis and the host PC power to ON.&lt;br /&gt;&lt;br /&gt;On older Windows OS’s, you may receive a New Hardware Found message.&amp;nbsp;&amp;nbsp;This is normal as the Windows registry retains the old firmware key.&amp;nbsp;&amp;nbsp;Follow the normal new hardware found installation procedure to update the registry with the new firmware information.&amp;nbsp;&amp;nbsp;Run the instrument virtual panel and initialize the instrument as before.&amp;nbsp;&amp;nbsp;The About tab should now indicate the new firmware version.&lt;br /&gt;&lt;br /&gt;At this point, the instrument is ready to use with the new firmware functionality.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200258/Upgrading-PXI-Instrument-Firmware</link><pubDate>6/18/2015</pubDate></item><item><title>White Paper: Addressing Legacy ATE System Requirements with PXI - Published on 11/24/2014</title><description>Beginning in the late 1960s, proprietary ATE systems were deployed by a wide range of customers for the functional test and verification of high value, mission critical products including board &amp; box level avionics, depot level test &amp; repair of armament and avionics electronics, and communications / satellite subsystems. These test systems are now obsolete, however the products (and their derivatives) originally tested on these platforms are still in use and need to be maintained. Consequently, there is an on-going need to either maintain these obsolete systems or migrate the applications and the legacy system’s capabilities to a modern test platform. Read the white paper to learn how the PXI architecture, and associated instrumentation and software can provide the basis for a modern functional test platform that can effectively support both legacy ATE functionality as well as future functional test needs.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2014\AddressingLegacyATESystemRequirements.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200269/White-Paper-Addressing-Legacy-ATE-System-Requirements-with-PXI</link><pubDate>11/24/2014</pubDate></item><item><title>White Paper: A Portable, Engineering-Design Partnership to Replace Obsolete Test Systems - Published on 11/24/2014</title><description>Based on Marvin Test Solutions' MTS-207 COTS platform, a state-of-the-art, ruggedized, portable PXI-based test system designed for flightline, back shop, and airborne applications; the MTS-207 provided the USAF with the necessary flexibility to add specific test instrumentation to support the A-10/C's flightline test needs. Read the white paper to learn more about the benefits of this COTS platform including:&lt;ul&gt;&lt;li&gt;Accelerated time to market&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Proven capabilities for flightline test&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Modular and expandable for future applications&lt;/li&gt;&lt;/ul&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2014\PATS-70USAFTechnicalPaper.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200268/White-Paper-A-Portable-Engineering-Design-Partnership-to-Replace-Obsolete-Test-Systems</link><pubDate>11/24/2014</pubDate></item><item><title>White Paper: Incorporating Optical Test Capabilities into a Depot Test Platform - Published on 6/25/2014</title><description>&lt;b&gt;&lt;h3&gt;Abstract&lt;/h3&gt;&lt;/b&gt;&lt;br /&gt;This paper reviews how an existing test platform that supports a variety of missile launcher systems; LAU 7, LAU 88, LAU 117, LAU 127, LAU 128, and LAU 129, was modified to address support for Paveway laser guided bomb kits. Specifically, support for the Paveway system required the addition of an optical test bench as well as adding additional simulation and test capabilities to accurately simulate laser targets and to measure laser detection signals. The modular design of the existing TS-217 test system afforded test engineers the ability to augment the existing test platform such that both LRU and SRU level test capabilities were part of the complete solution. Additionally, by incorporating an innovative optical bench with a solid-state target, a complete functional simulation of the weapon was achievable including testing of operational limits.&lt;br /&gt;&lt;br /&gt;The paper details the updates incorporated into the test system which were needed to provide a test solution that offers full functional verification of the weapon. Additionally, a review of the optical bench implementation is discussed including the incorporation of a novel solid state target simulation system.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2014\IncorporatingOpticalTestCapabilitiesIntoDepotTestPlatform.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200262/White-Paper-Incorporating-Optical-Test-Capabilities-into-a-Depot-Test-Platform</link><pubDate>6/25/2014</pubDate></item><item><title>White Paper: Upgrading Alstom BTE Functional Test Systems with PXI - Published on 6/9/2014</title><description>This technical brief provides an overview of how SNCF railway in France was able to update their current Alstom BTE (Bench Test Equipment) platforms to PXI.&lt;br /&gt;&lt;br /&gt;SNCF maintains a wide range of electronic assemblies which are part of the Alstom train sets operated by SNCF. The BTE platform incorporated Geotest’s (now Marvin Test Solutions) GTXI systems and was deployed in world-wide locations. These test sets, which are now over 15 years old, have reached end of life, requiring railway operators to look at upgrade solutions that can be used to continue servicing Alstom’s AGATE (Advanced Generic Alstom Transport Electronics) family of electronic control units. Marvin Test Solutions (MTS) worked with Accelonix, an integrator in Paris, France to upgrade and convert SNCF's existing GTXI systems and ATEasy programs to MTS’ GX7100 PXI platform. &lt;br /&gt;&lt;br /&gt;The resulting upgrades provided SNCF with greatly improved test performance and maintainability. Key benefits included:&lt;ul&gt;&lt;li&gt;Up to 60% test time reduction&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Simple program conversion and retention of existing user interface by leveraging ATEasy’s backward compatibility&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A modern test platform (PXI) architecture, providing a cost effective extension of the test system’s life cycle&lt;/li&gt;&lt;/ul&gt;To read more about this solution download our &lt;a href='https://www.MarvinTest.com/downloads/KnowledgeBase/Whitepapers\2014\TestSolutions-SNCF.pdf' target='_blank'&gt;test solutions technical brief&lt;/a&gt;.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200259/White-Paper-Upgrading-Alstom-BTE-Functional-Test-Systems-with-PXI</link><pubDate>6/9/2014</pubDate></item><item><title>How do I force a Task or a Test to run in ATEasy Test Executive? - Published on 4/17/2014</title><description>The ATEasy Test Executive provides a way for users to check and uncheck a Task or a Test by clicking on the Tests pane check boxes. The Tests pane displays a tree control (TreeView) nodes that represents a Program, Task or Test. This article describes how to check and disable a TreeView node to force a Task or a Test to run and to prevent&amp;nbsp;&amp;nbsp;the user from un-checking the node.&lt;br /&gt;&lt;br /&gt;The example assumes you are running a program with a task ID "SystemBIT" and we want to prevent users from un-checking it. The code can be placed in Program.OnInit():&lt;br /&gt;&lt;br /&gt;1. Define a program variable:&lt;br /&gt; &lt;br /&gt;&lt;div class='fixedFont'&gt;node: MSComctlLib.Node &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;2. Insert the following cod to the Program.OnInit() event:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;br /&gt;! force task with an id of "SystemBit" to run, prevent the user from un-checking it &lt;br /&gt; ! find the node for SystemBIT, replace this name with your task ID&lt;br /&gt;node=TestExec.m_frmMain.FindNode(Program, Program.Tests("SystemBIT")) &lt;br /&gt;! check the node&lt;br /&gt;TestExec.CheckTreeNode(node)&amp;nbsp;&amp;nbsp; &lt;br /&gt; ! prevent the user from un-checking it&lt;br /&gt;TestExec.SetNodeData(node, ateNodeFieldDisable, True)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200247/How-do-I-force-a-Task-or-a-Test-to-run-in-ATEasy-Test-Executive</link><pubDate>4/17/2014</pubDate></item><item><title>Using an XML File to Load Test Parameters to an ATEasy Program - Published on 4/16/2014</title><description>This example reads a XML file and stores the new parameters in the program test objects. The parameters which will be updated by the XML file are grouped into a Test node and the specific test which will be updated is identified by an ID attribute.&amp;nbsp;&amp;nbsp;Each child node that is grouped within a Test node can be used to update a Test properties.&amp;nbsp;&amp;nbsp;For instance:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;Test ID="PS1"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;min&gt;3&lt;/min&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;max&gt;3.6&lt;/max&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;tag&gt;3.3&lt;/tag&gt;&lt;br /&gt;&lt;/Test&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This XML Test node, when used with the XMLTestParameters.drv, will update the the Test whose ID properties equals "PS1".&amp;nbsp;&amp;nbsp;It will update the Test's Min, Max and Tag properties with 3, 3.6, and 3.3 respectively.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Using the Example&lt;/h3&gt;The code to read the XML file and apply the parameters reside in the XMLTestParameters.drv driver.&amp;nbsp;&amp;nbsp;The XMLTestParameters driver utilizes the XML.drv, a general purpose XML file reader.&amp;nbsp;&amp;nbsp;This driver uses the functionality of Microsoft's System.Xml namespace, documentation &lt;a href='http://msdn.microsoft.com/en-us/library/system.xml(v=VS.80).aspx' target='_blank'&gt;here&lt;/a&gt;.&amp;nbsp;&amp;nbsp;Functionality includes the ability to create, open, read and write XML files.&amp;nbsp;&amp;nbsp;Additional methods and properties can be added by the user to expand the driver functionality.&lt;br /&gt;&lt;br /&gt;To use the driver:&lt;br /&gt;1. Insert the XMLTestParameters.drv to your system&lt;br /&gt;2. Insert the XML.drv to your system&lt;br /&gt;3. To load the parameters to your program use the following code:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;if not XMLTESTS ReadTestParametersFile(GetDir(0)+"\\TestParameters.xml")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;abort&lt;br /&gt;endif&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This code typically resides in Program.OnInit() event.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Example Code&lt;/h3&gt;The&amp;nbsp;&amp;nbsp;XMLTestParameters.drv export one command / procedure that is used to load the parameters:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;--------------------------------------------------------------------------------&lt;br /&gt; Procedure ReadTestParametersFile(sFile): Bool&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;sFile: Val String&lt;br /&gt;sProperty: String&lt;br /&gt;sTest: String&lt;br /&gt;s: String&lt;br /&gt;enNodeType: Long&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;! open the test properties file&lt;br /&gt;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XML Reader Open(sFile)&lt;br /&gt;&amp;nbsp;&amp;nbsp;catch else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MsgBox("Unable to open XML File: '"+sFile+"'")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return False&lt;br /&gt;&amp;nbsp;&amp;nbsp;endtry&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;!Iterate through the open XML file&lt;br /&gt;&amp;nbsp;&amp;nbsp;while (XML Reader Next())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enNodeType=XML Reader Get NodeType()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select enNodeType&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case XmlNodeType.Element&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Keep track of the element that the user is on.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s = XML Reader Get Name()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if s="Test"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!If the element is a new test, store the ID attribute&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sTest=XML Reader Get Attribute("ID")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Store the name of the element as a property&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sProperty=s&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case XmlNodeType.Text&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!If the node is text, it is a value that should be updated&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!use the Test ID and property name to decide where to assign the value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select sProperty&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case "min"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Program.Tests(sTest).Min=Val(XML Reader Get Value())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case "max"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Program.Tests(sTest).Max=Val(XML Reader Get Value())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case "tag"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Program.Tests(sTest).Tag=XML Reader Get Value()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!More customization can be here&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endselect&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EndSelect&lt;br /&gt;&amp;nbsp;&amp;nbsp;EndWhile&lt;br /&gt;&amp;nbsp;&amp;nbsp;XML Reader Close() &lt;br /&gt;&amp;nbsp;&amp;nbsp;return True&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Where to Go From Here&lt;/h3&gt;This example only allows you to update a Min/Max type tests properties.&amp;nbsp;&amp;nbsp;If the ability to update the properties of another test type were needed, the code within the sProperty case statement would need to be updated.&amp;nbsp;&amp;nbsp;To add the ability to set the ValuePlus and ValueMinus property of a Tolerance type test, the user would need to add a 'case "valueplus"' and a 'case "valueminus"'.&lt;br /&gt;&lt;br /&gt;Download the Example and the XML drivers:&amp;nbsp;&amp;nbsp;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200241\XmlTestParameters.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Click Here&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200241/Using-an-XML-File-to-Load-Test-Parameters-to-an-ATEasy-Program</link><pubDate>4/16/2014</pubDate></item><item><title>Using MATLAB from ATEasy - Published on 4/16/2014</title><description>Installing MathWorks MATLAB® will also install an ActiveX control “Matlab Application Type Library” that can be used to write and retrieve variables from environments other than the MATLAB command window, such as ATEasy.&amp;nbsp;&amp;nbsp;An ATEasy driver (MATLAB.drv) has been created as a wrapper for this interoperability tool to perform the majority of the overhead of starting and communicating with the MATLAB utility.&amp;nbsp;&amp;nbsp;This allows you to reuse existing test application code in ATEasy projects with only a few lines of code.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Manipulating the MATLAB Command Window&lt;/h3&gt;Upon launching the ATEasy, the MATLAB driver will open a MATLAB command window that will open and run in the background until the termination of the ATEasy Application.&amp;nbsp;&amp;nbsp;If your project requires direct interaction with the command window, there are two ATEasy commands for command window manipulation:&lt;br /&gt;&lt;div class='fixedFont'&gt;MATLAB Window Maximize(): Maximizes command window and brings it to the front.&lt;br /&gt;MATLAB Window Minimize(): Minimizes the command window.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Send Instructions to the MATLAB Command Window&lt;/h3&gt;Text-based instructions can be sent to the MATLAB window from ATEasy using the Execute command.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;div class='fixedFont'&gt;MATLAB Execute (sCommand, psResponse)&lt;/div&gt;&lt;br /&gt;Where sCommand is the string sent to the MATLAB window and psResponse is MATLAB’s response.&lt;br /&gt;For instance, the following code in MATLAB: &lt;br /&gt;&lt;div class='fixedFont'&gt;&gt;&gt; a=1&lt;br /&gt;&lt;br /&gt;a =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;br /&gt;&lt;br /&gt;&gt;&gt; b=3*a&lt;br /&gt;&lt;br /&gt;b =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&lt;/div&gt;&lt;br /&gt;Can be executed in ATEasy with the following commands:&lt;br /&gt;&lt;div class='fixedFont'&gt;MATLAB Execute(“a=1”, sResponse1)&lt;br /&gt;MATLAB Execute(“b=3*a”, sResponse2)&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Example Code&lt;/h3&gt;The following code with pass the integers 3 and 5 to the ExpTwo function in ExpTwo.m and return back the value to the TestResult variable.&lt;br /&gt;&lt;div class='fixedFont'&gt;dwLength : DWord ! The length of the directory string name&lt;br /&gt;sCommand : String ! The command that is sent to the command window&lt;br /&gt;s : String ! The response from the command window&lt;br /&gt;&lt;br /&gt;dwLength=GetShortPathNameA(GetDir(0), NULL, 0)&lt;br /&gt;dwLength=GetShortPathNameA(GetDir(0), sCommand, dwLength)&amp;nbsp;&amp;nbsp; ! HPVEE requires&amp;nbsp;&amp;nbsp;short file names 8.3 use Windows API to retrieve it &lt;br /&gt;sCommand="cd "+sCommand&lt;br /&gt;MATLAB Execute(sCommand, s)&lt;br /&gt;sCommand="result=ExpTwo(3,5)"&lt;br /&gt;MATLAB Execute(sCommand, s)&lt;br /&gt;MATLAB Get Variable("result", TestResult)&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;ATEasy Project and Example&lt;/h3&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200235\MATLAB_ATEasyExample.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;ATEasy and MATLAB Example&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200235/Using-MATLAB-from-ATEasy</link><pubDate>4/16/2014</pubDate></item><item><title>Calling Agilent VEE UserFunctions from ATEasy - Published on 4/16/2014</title><description>Installing Agilent VEE will allow the installation of an ActiveX automation server that can be used to run UserFunction from environments other than the VEE development environment, such as ATEasy and Visual Studio.&amp;nbsp;&amp;nbsp;An ATEasy driver (VEE.drv) has been created as a wrapper providing an interoperability tool that can perform the majority of the overhead associated with starting and communicating with the VEE Run-time.&amp;nbsp;&amp;nbsp;This allows you to reuse existing test application code in ATEasy projects with the addition of only a few lines of code.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Example VEE library&lt;/h3&gt;For example, we have “VEE_ATEasyExample.vee” which contains three UserFunctions:&lt;ul&gt;&lt;li&gt;AddTwo: Adds two numbers and outputs the sum (a+b=result)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ExpTwo: Outputs the first input raised to the power of the second input (a^b=result)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;MultiplyTwo: Multiplies two numbers and outputs the product (a*b=result)&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200234\VEE_ATEasyExample_IMG1.bmp" alt="Screenshot of VEE Project Navigator" title="Screenshot of VEE Project Navigator" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Image 1: VEE Project Navigator&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Flow of data&lt;/h3&gt;To call a VEE function from ATEasy, you would implement the following prototype:&lt;br /&gt;&lt;div class='fixedFont'&gt;VEE Call (sLibFile, sUserFunction, inputs, outputs)&lt;/div&gt;&lt;br /&gt;The sLibFile defines the .VEE file that contains the target UserFunction, sUserFunction specifies the VEE function that will be executed, and the inputs and outputs represent the input and output terminals as arrays of variants.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200234\VEE_ATEasyExample_IMG2.png" alt="Flow of data between ATEasy and VEE" title="Flow of data between ATEasy and VEE" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Image 2: Flow of data between ATEasy and VEE&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Example Code&lt;/h3&gt;The following code will pass the integers 3 and 5 to the AddTwo function in the VEE_ATEasyExample.vee and should assign the value {8} back to the outputs variable.&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;br /&gt;sLibFile : String&amp;nbsp;&amp;nbsp; ! Contains the path to the VEE file&lt;br /&gt;sUserFunction : String&amp;nbsp;&amp;nbsp; ! Contains the name of the VEE UserFunction&lt;br /&gt;avrInputs : Variant[2]&amp;nbsp;&amp;nbsp; ! The input parameters, where 2 is the number of parameters passed to the VEE function&lt;br /&gt;vrOutputs : Variant&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! The returned output parameters array stored to a variant&lt;br /&gt;&lt;br /&gt;sLibFile=GetDir(0)+"\\VEE_ATEasyExample.vee" ! vee in current directory&lt;br /&gt;sUserFunction="AddTwo"&amp;nbsp;&amp;nbsp; ! VEE function name&lt;br /&gt;avrInputs={3,5}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! input parameters&lt;br /&gt;VEE Call(sLibFile, sUserFunction, aVarInputs, vrOutputs)&lt;br /&gt;TestResult=vrOutputs[0]&amp;nbsp;&amp;nbsp;! store returned value&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;ATEasy Project and Example&lt;/h3&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200234\VEE_ATEasyExample.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;ATEasy and VEE Example&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200234/Calling-Agilent-VEE-UserFunctions-from-ATEasy</link><pubDate>4/16/2014</pubDate></item><item><title>Consume a web service in ATEasy - Published on 4/16/2014</title><description>In this article, we will be consuming the CDYNE free weather service.&amp;nbsp;&amp;nbsp;We will be using the following resources:&lt;br /&gt;&lt;br /&gt;&lt;a href='http://wiki.cdyne.com/wiki/index.php?title=CDYNE_Weather' target='_blank'&gt;Weather Service WIKI&lt;/a&gt;&lt;br /&gt;&lt;a href='http://www.cdyne.com/downloads/SPECS_Weather.pdf' target='_blank'&gt;Weather service Specification Sheet&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Use WSDL.exe to generate the source code for the proxy class in one of the Visual Studio languages.&lt;/h3&gt;WSDL is a tool provided by Microsoft for the generation of Web Services proxy classes.&amp;nbsp;&amp;nbsp;The help file for the tool is located &lt;a href='http://msdn.microsoft.com/en-us/library/7h3ystb6(v=vs.80).aspx' target='_blank'&gt;here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The weather service specification sheet provides us with a listing of functions and parameters as well as the location of the WSDL formatted files.&amp;nbsp;&amp;nbsp;Type the following into your command prompt to generate the proxy class code in Visual Basic and save the output to "C:\Temp\myProxyClass.vb".&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&gt;WSDL /L:VB /O:C:\Temp\myProxyClass.vb HTTP://wsf.cdyne.com/WeatherWS/Weather.asmx?wsdl&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Use Visual Studio to generate a .Net assembly from the source code.&lt;/h3&gt;Launch Visual Studio and create a class library project and import the code generated by WSDL.exe.&amp;nbsp;&amp;nbsp;User Project | Add Reference to add System.Web.Services to your project.&amp;nbsp;&amp;nbsp;Build the project and locate the compiled library.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200220\WeatherProxyClassVB.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download Visual Basic project&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Import the .NET library into ATEasy.&lt;/h3&gt;Create a new ATEasy application and a new driver.&amp;nbsp;&amp;nbsp;Rename the new driver to WeatherSvc.&amp;nbsp;&amp;nbsp;Import the .NET library into the new driver.&amp;nbsp;&amp;nbsp;For convenience, you can also move the DLL file into the ATEasy application directory.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Instantiate the proxy class with ATEasy. &lt;/h3&gt;Create a driver procedure GetWeather().&amp;nbsp;&amp;nbsp;This procedure will allow us to retrieve the city, state and current temperature for the provided zip code.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure GetWeather(zipcode, temperature, state, city): Void&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;	zipcode: Val BString&lt;br /&gt;	temperature: Var BString&lt;br /&gt;	state: Var BString&lt;br /&gt;	city: Var BString&lt;br /&gt;	WeatherReturn: WeatherProxyClass.WeatherReturn&lt;br /&gt;	weather: WeatherProxyClass.Weather&lt;br /&gt;{&lt;br /&gt;	weather=new WeatherProxyClass.Weather()&lt;br /&gt;	WeatherReturn=weather.GetCityWeatherByZIP(zipcode)&lt;br /&gt;	city=WeatherReturn.City&lt;br /&gt;	state=WeatherReturn.State&lt;br /&gt;	temperature=WeatherReturn.Temperature&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Create a command tree within your driver to link to this procedure.&amp;nbsp;&amp;nbsp;Attach this procedure to the "Driver Get Weather" command.&lt;br /&gt;&lt;br /&gt;To test this, create a series of variables and tests in the program module.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;	weatherCity: BString&lt;br /&gt;	weatherState: BString&lt;br /&gt;	weatherTemperature: BString&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Task 1 : "Perform Weather Operations"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;	Id = Perform_Weather_Operations&lt;br /&gt;&lt;br /&gt;Test 1.1 : "Request information"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;	Id = Request_information&lt;br /&gt;	Type = Other&lt;br /&gt;{&lt;br /&gt;	WeatherSvc Get Weather("92614", weatherTemperature, weatherState, weatherCity)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Test 1.2 : "Check City"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;	Id = Check_City&lt;br /&gt;	Type = String&lt;br /&gt;	String = "Irvine"&lt;br /&gt;{&lt;br /&gt;	TestResult=weatherCity&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Test 1.3 : "Check State"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;	Id = Check_State&lt;br /&gt;	Type = String&lt;br /&gt;	String = "CA"&lt;br /&gt;{&lt;br /&gt;	TestResult=weatherState&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Test 1.4 : "Check Temp"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;	Id = Check_Temp&lt;br /&gt;	Unit = "Fahrenheit"&lt;br /&gt;	Type = MinMax&lt;br /&gt;	Min = 30&lt;br /&gt;	Max = 120&lt;br /&gt;{&lt;br /&gt;	TestResult=Val(weatherTemperature)&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200220\WeatherServiceATEasy.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download ATEasy project&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200220/Consume-a-web-service-in-ATEasy</link><pubDate>4/16/2014</pubDate></item><item><title>Capturing channels simultaneously with the GX2472 Digitizer - Published on 4/16/2014</title><description>The GX2472 is a dual differential channel, 14-bit digitizer offering a 70 MS/s ADC and 512K of memory.&amp;nbsp;&amp;nbsp;Each of the GX2472's differential channels has its own amplifier, filters, ADC and capture memory allowing for simultaneous waveform capture.&lt;br /&gt;&lt;br /&gt;The following procedure demonstrates how to achieve simultaneous digitization using psuedocode.&amp;nbsp;&amp;nbsp;For more details, there are example projects at the end of the article.&amp;nbsp;&amp;nbsp;For more information, refer to the Gx2472 User's Guide.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Procedure to Achieve Simultaneous Digitization&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Setup channel parameters for each channel&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Arm both channels for triggering&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Wait for GX2472 to finish data capture&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Read device memory&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Breakdown of Procedure&lt;/h3&gt;Each channel saves its own parameters independently.&amp;nbsp;&amp;nbsp;The first step is to setup each channel's parameters.&amp;nbsp;&amp;nbsp;This is done by sequentially setting each channel to active, unlocking the channel to allow changes and configuring that channels parameters.&amp;nbsp;&amp;nbsp;In the psuedocode below, both channel's parameters will be identical.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;For ChannelNumber = 1 to 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetActiveChannel(ChannelNumber)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UnlockChannel()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetClockSource(...)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetRange(...)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetTriggerLevel(...)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetDCOffset(...)&lt;br /&gt;Next&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;After parameters have been set, lock the channels to initiate a capture.&amp;nbsp;&amp;nbsp;Each channel has it's own configurable trigger criteria.&amp;nbsp;&amp;nbsp;After a channel is locked, it awaits a trigger to begin data capture.&amp;nbsp;&amp;nbsp;Each channel has it's own trigger settings and can be connected to a different stimulus.&amp;nbsp;&amp;nbsp;Therefore, it is possible for one channel to trigger and begin capture while the other channel does not trigger and simply remains in the armed state.&amp;nbsp;&amp;nbsp;The psuedocode below demonstrates locking both channels to arm for triggering.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;For ChannelNumber = 1 to 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetActiveChannel(ChannelNumber)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LockChannel() ! Locks access to the controller and allows channel to begin capture&lt;br /&gt;Next&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Now, the controller must wait for the channels to complete their data capture.&amp;nbsp;&amp;nbsp;This is done by repeatedly checking the status of the GX2472 to see if both channels have completed.&amp;nbsp;&amp;nbsp;A timeout condition should also exist in case one or both channels do not trigger and thereby never complete their data capture.&amp;nbsp;&amp;nbsp;The pseudocode demonstrates such a loop:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Repeat&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetTestStatus()&lt;br /&gt;Until (TestComplete or TimeOut)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Finally, each channel must transfer its capture memory back to the controller.&amp;nbsp;&amp;nbsp;Again, we must loop through each channel, reading the memory back sequentially.&amp;nbsp;&amp;nbsp;The psuedocode below shows this:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;For ChannelNumber = 1 to 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetActiveChannel(ChannelNumber)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UnlockChannel() ! Allows memory to be accessed by controller&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReadADCResults(Array[ChannelNumber])&lt;br /&gt;Next&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Sample Projects and Examples&lt;/h3&gt;The sample projects below contain working code that sets both channels for capturing a 50,000 sample waveform:&lt;ul&gt;&lt;li&gt;ATEasy example can be downloaded &lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200206\ATEasy_GX2472_Simultaneous_Sample.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Microsoft Visual C++ 2005 example can be downloaded &lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200206\GX2472_Simultaneous_Sample.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200206/Capturing-channels-simultaneously-with-the-GX2472-Digitizer</link><pubDate>4/16/2014</pubDate></item><item><title>Real-Time Digital IO Compare Example - Published on 4/16/2014</title><description>In this tutorial, we will be running a PXI Digital IO GX5292 board in real-time compare mode through DIOEasy and examining some of its functionality.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Create the pattern we will use in DIOEasy as follows:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. Open DIOEasy.&lt;br /&gt;&lt;br /&gt;2. Create a new file with the following settings:&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;File Type: DIO (DIOEasy File Menu)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Board Type: GX5290 (DIOEasy File Properties - General tab)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Num. Of Boards: 1 (DIOEasy File Properties - General tab)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Num. Of Steps: 1024 (DIOEasy File Properties - General tab)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Operating Mode: Real Time Compare (DIOEasy File Properties - General tab)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Clock Delay (ns): 0.00 (DIOEasy File Properties - Setup tab)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Strobe Delay (ns): 0.00 (DIOEasy File Properties - Setup tab)&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;3. Set Channels 0 through 15 to output&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Select Channel 0 through Channel 15&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;From the menu bar, select Fill -&gt; Direction…&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click Output&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;4. Fill Channels 0 through 15 with a walking one pattern&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;While Channels 0 through 15 are still highlighted, select Fill -&gt; Shift / Rotate…&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;In the dialog that pops up, change the Type from ‘Shift’ to ‘Rotate’&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click Overwrite!&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;5. Create the expected pattern for Channel 16 through 31&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Select Channel 16 through 31.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;From the menu bar, select Fill -&gt; Shift / Rotate…&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;In the dialog that pops up, change the Type from ‘Shift’ to ‘Rotate’&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click Overwrite!&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;6. Add HALT command to the end of the pattern&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Click on the last step of your pattern (step 1023)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Hit Alt+Enter to open the command properties window.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Change the command for this step from NOP to HALT&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;7. Insert error in Channel 0&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Click Channel 0 to highlight the entire channel&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;From the menu bar, select Fill -&gt; Value…&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Select to fill the channel with all 0s and click Overwrite!&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;8. Save this file as “&lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200186\RTCError.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;RTCError.dio&lt;/a&gt;”&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200186\image1.JPG" alt="Digital IO Pattern using DIOEasy" title="Digital IO Pattern using DIOEasy" border='0' &gt;&lt;br /&gt;&lt;br /&gt;The image above depicts the DIO file created.&amp;nbsp;&amp;nbsp;When executed, it will output a walking one pattern on J1 channels 0 through 15 while reading J1 channels 16 through 31 as input.&amp;nbsp;&amp;nbsp;Externally, the first sixteen channels will need to be wired to the second sixteen channels (channel 0 wired to channel 16, channel 1 wired to channel 17, and so on) to achieve a loopback.&amp;nbsp;&amp;nbsp;We are expecting to see the same walking one pattern on channels 16 through 31 as we output on channels 0 through 15.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Since we want to observe some errors, we have intentionally set all steps in channel 0 to LOW.&amp;nbsp;&amp;nbsp;This will generate 64 errors (1 error every 16 steps).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Run the Pattern using GTDIO Panel:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. Launch the GTDIO Panel from DIOEasy using the shortcut (F10).&lt;br /&gt;&lt;br /&gt;2. Initialize the driver for the board.&lt;br /&gt;&lt;br /&gt;3. Load and run the RTCError.dio pattern&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Change the vector from 'File' to 'Window' and click 'Execute'&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;After the pattern is loaded to the DIO, click 'Arm!', then click 'Trig!'&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;4. View the resultant pattern.&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Change the vector from 'Load' to 'Show' and click 'Execute'&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;In the dialog box that pops up, select the option 'Load into New Window'&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;A result pattern will be loaded into DIOEasy.&amp;nbsp;&amp;nbsp;Whenever discrepancies are found between the expected results and the actual results, the column containing the error will be shaded as shown below:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200186\image2.JPG" alt="Digital IO Pattern Compare using DIOEasy" title="Digital IO Pattern Compare using DIOEasy" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Masking / Unmasking:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;If there is a channel or number of steps that you do not want to check for errors, the real time compare input mask can be used to enable/disable the compare engine.&lt;br /&gt;&lt;br /&gt;1. Mask steps 0 through 15&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Highlight steps 0 through 15.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;From the menu bar, select Fill -&gt; Real Time Compare Input Mask&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click Mask On&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;2. Run the Pattern using the GTDIO Panel&lt;br /&gt;&lt;br /&gt;In the result pattern below, you can see that the error that was masked does not appear shaded because it was not analyzed.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200186\image4.JPG" alt="Digital IO Pattern Compare using DIOEasy" title="Digital IO Pattern Compare using DIOEasy" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Real Time Compare Error Logging Modes&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When your DIO is operating in Real Time Compare mode, you can set stop conditions.&amp;nbsp;&amp;nbsp;In DIOEasy, hit CTRL+R or use the menu bar to open the File-&gt; Properties dialog window.&amp;nbsp;&amp;nbsp;Click on the Real Time Compare tab.&amp;nbsp;&amp;nbsp;By default, it is set up to not stop for any special condition.&amp;nbsp;&amp;nbsp;By changing the 'Failures count:' to 10 and clicking Set, we indicate that the pattern should stop running if ten errors are encountered during execution.&amp;nbsp;&amp;nbsp;You can use this properties window to set the DIO to stop execution if a certain data value is encountered or when the program counter reaches a specified value.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200186\image3.JPG" alt="Digital IO Real Time Compare Settings" title="Digital IO Real Time Compare Settings" border='0' &gt;</description><link>https://www.MarvinTest.com/KB/Q200186/Real-Time-Digital-IO-Compare-Example</link><pubDate>4/16/2014</pubDate></item><item><title>How to Repeat a test multiple times - Published on 4/16/2014</title><description>In &lt;b&gt;ATEasy&lt;/b&gt;, there are many ways to display the results of tests.&amp;nbsp;&amp;nbsp;The following example demonstrates how to measure and display the results of similar measurements in a single test loop rather than several individual tests. For example, we already have a test that calls an instrument to make a measurement.&amp;nbsp;&amp;nbsp;We want to measure and display the results eight times.&lt;br /&gt;&lt;br /&gt;To achieve this goal, we are going to create a test to make a measurement.&amp;nbsp;&amp;nbsp;After we take a measuremet we call the &lt;b&gt;RepeatTest()&lt;/b&gt; procedure to repeat the test times as required. Finally, we will create a variable to track the number of iterations in a driver public variable &lt;b&gt;m_nTestIteration&lt;/b&gt; (initialized to -1).&lt;br /&gt;&lt;br /&gt;The test to repeat and make the measurements will be:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;br /&gt;&lt;br /&gt;DMM Measure(TestResult)&lt;br /&gt;RepeatTest(8) ! add this line at the end of every test that need to be repeated&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The procedure to loop would be:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure RepeatTest(nNumberOfIterations) : Void&lt;br /&gt;nNumberOfIterations: Val Short&lt;br /&gt;{&lt;br /&gt;if m_nTestIteration=-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_nTestIteration=nNumberOfIterations! start count&lt;br /&gt;endif&lt;br /&gt;&lt;br /&gt;m_nTestIteration=m_nTestIteration-1&lt;br /&gt;&lt;br /&gt;if m_nCurrentTest=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! we are done&lt;br /&gt;endif&lt;br /&gt;&lt;br /&gt;Test EndEvents Test ! repeat this test&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Create the module variable:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;m_nTestIteration: Short = -1&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The result shows that the test 1.1 ran 8 times, taking different measurements each time.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200181\kb_loop1.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;From the picture, we can see that the tests numbers were all identical: “001, no matter what iteration was it.&amp;nbsp;&amp;nbsp;Another problem is that if the last iteration of the test has a PASS status, the program status will show as PASS no matter if one of the test iteration failed. We can add code to include the test iteration in the test number by revising the &lt;b&gt;RepeatTest &lt;/b&gt;procedure:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure RepeatTest(nNumberOfIterations) : Void&lt;br /&gt;nNumberOfIterations: Val Short&lt;br /&gt;s: String&lt;br /&gt;i: Short&lt;br /&gt;{&lt;br /&gt;if m_nTestIteration=-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_nTestIteration=nNumberOfIterations! start count&lt;br /&gt;endif&lt;br /&gt;&lt;br /&gt;m_nTestIteration=m_nTestIteration-1&lt;br /&gt;&lt;br /&gt;! display test number - test iteration to the log&lt;br /&gt;s=GetLogString(aLogStringCalcTestStatus)&lt;br /&gt;i=pos(Format(test.Index+1, "000"), s)&lt;br /&gt;SetLogString(Left(s, i)+Format(test.Index+1,"000") + "." + str(nNumberOfIterations-m_nTestIteration) + mid(s, i+len(Format(test.Index+1, "000"))))&lt;br /&gt;&lt;br /&gt;! if one test failed fail the program&lt;br /&gt;if TestStatus=FAIL&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;program.Status=FAIL&lt;br /&gt;endif&lt;br /&gt;&lt;br /&gt;if m_nTestIteration=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! we are done&lt;br /&gt;endif&lt;br /&gt;&lt;br /&gt;Test EndEvents Test ! repeat this test&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200181\kb_loop2.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;The ATEasy driver which contains the &lt;b&gt;RepeatTest &lt;/b&gt;procedure can be downloaded &lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase\Q200181\Q200181.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;here&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200181/How-to-Repeat-a-test-multiple-times</link><pubDate>4/16/2014</pubDate></item><item><title>How to print a HTML or TEXT file from within an ATEasy application - Published on 4/16/2014</title><description>One method of printing a HTML file from within an ATEasy application is to use the ALog control. This can be done as follows:&lt;br /&gt;&lt;br /&gt;1. Create a form and uncheck the form &lt;b&gt;Visible &lt;/b&gt;property. &lt;br /&gt;2. Place an &lt;b&gt;ALog &lt;/b&gt;control in the form and set it's &lt;b&gt;PlainText &lt;/b&gt;property to False for HTML or True for text file printing.&lt;br /&gt;3. Create a public procedure with one parameter that contains the location and name of the HTML file to be printed.&lt;br /&gt;4. The procedure should load the form in Modeless mode, set the logPrint.LocationURL to the HTML file location, call logPrint.PrintLog and then return.&lt;br /&gt;&lt;br /&gt;The example that accompanies this KB article is called &lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase/Q200180.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Q200180.zip&lt;/a&gt;. In the example the form used to print the HTML file is called PrintHTMLForm. The public procedure used to call the form and print the file is called PrintHTML(). The same code can be used to print TEXT (log) files. The procedure code is as follows:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;PrintHTML(sFile)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;blockquote&gt;! Declare a PrintHTMLForm form variable called frmPrintHTML&lt;br /&gt;&lt;br /&gt;Load frmPrintHTML, False, 0&amp;nbsp;&amp;nbsp;!Load the PrintHTML form&lt;br /&gt;DoEvents()&amp;nbsp;&amp;nbsp; !Process all pending operations&lt;br /&gt;frmPrintHTML.logPrint.LocationURL=sFile&amp;nbsp;&amp;nbsp;!Set the URL of the file to be printed&lt;br /&gt;&lt;br /&gt;!Wait for the file to be loaded&lt;br /&gt;while frmPrintHTML.logPrint.ReadyState &lt;&gt; alogReadyStateComplete&lt;br /&gt;&amp;nbsp;&amp;nbsp;DoEvents()&lt;br /&gt;endwhile&lt;br /&gt;&lt;br /&gt;frmPrintHTML.logPrint.PrintLog()&amp;nbsp;&amp;nbsp;!Print the file&lt;br /&gt;Unload frmPrintHTML&lt;br /&gt;frmPrintHTML= Nothing&lt;br /&gt;&lt;/blockquote&gt;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;For more information about how to select a printer for printing refer to &lt;a href='/knowledgebase/kbarticle.aspx?id=90' target='_blank'&gt;Q000090&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200180/How-to-print-a-HTML-or-TEXT-file-from-within-an-ATEasy-application</link><pubDate>4/16/2014</pubDate></item><item><title>How to create a "system modal" form similar to ATEasy 2.x dialogs - Published on 4/16/2014</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The System modal dialog style (DS_SYSMODAL) was dropped as it is no longer supported in Win32. According to MSDN documentation:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;This style is obsolete and is included for compatibility with 16-bit versions of Windows. If you specify this style, the system creates the dialog box with the WS_EX_TOPMOST style. This style does not prevent the user from accessing other windows on the desktop. Do not combine this style with the DS_CONTROL style.&lt;br /&gt;&lt;/blockquote&gt;You can still make a window top-most by using the following USER32.DLL function, in the &lt;b&gt;Form OnLoad &lt;/b&gt;event:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;SetWindowPos(Form.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE) &lt;/div&gt;&lt;br /&gt;Where the parameters are prototype as follows:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;DLL User32&lt;br /&gt;––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––&lt;br /&gt;File = User32.dll&lt;br /&gt;&lt;br /&gt;DLL Types&lt;br /&gt;––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––&lt;br /&gt;&lt;br /&gt;DLL Procedures&lt;br /&gt;––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––&lt;br /&gt;&lt;br /&gt;Procedure SetWindowPos(hwnd, hwndInsertAfter, x, y, cx, cy, uFlags): Bool&lt;br /&gt;––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––&lt;br /&gt; &lt;div class='fixedFont'&gt;hwnd: Val AHandle&lt;br /&gt; hwndInsertAfter: Val AHandle&lt;br /&gt; x: Val Long&lt;br /&gt; y: Val Long&lt;br /&gt; cx: Val Long&lt;br /&gt; cy: Val Long&lt;br /&gt; uFlags: Val DWord&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;DLL Constants&lt;br /&gt;––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––&lt;br /&gt; HWND_TOPMOST: AHandle Const = -1&lt;br /&gt; SWP_NOSIZE: Long Const = 1&lt;br /&gt; SWP_NOMOVE: Long Const = 2&lt;br /&gt; SWP_NOZORDER: Long Const = 4&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Sample files are available: &lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase/Q200054.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Q200054.zip&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200054/How-to-create-a-system-modal-form-similar-to-ATEasy-2-x-dialogs</link><pubDate>4/16/2014</pubDate></item><item><title>Regenerating Program Tasks and Tests IDs - Published on 4/16/2014</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ATEasy will try to leave the Test or Task IDs intact after renaming them. The reason is that an external file or code may reference the ID; changing the ID name will break the code.&lt;br /&gt;&lt;br /&gt;If you don't have any external reference to the Task or Test IDs, and you would like to generate IDs that are similar to the Task/Test name, you can use the attached utility. &lt;br /&gt;&lt;br /&gt;To use the utility, open the link below to access the ATEasy utility files (&lt;b&gt;ProgramIds.prj, ProgramIds.sys and ProgramIds.drv&lt;/b&gt;) and copy the files to a folder.&amp;nbsp;&amp;nbsp;Open the project file (&lt;b&gt;ProgramIds.prj&lt;/b&gt;) in ATEasy and from the &lt;b&gt;Run&lt;/b&gt; menu select &lt;b&gt;Start&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200053.gif" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;Select the program source file that you wish to convert (language.pgt in this example) and type a new program name that will contain the new program with the new Ids (language-new.pgt). Click on the &lt;b&gt;Convert&lt;/b&gt; button.&lt;br /&gt;&lt;br /&gt;Files for this Article: &lt;a href='/GetFile.aspx?Type=File&amp;Name=KnowledgeBase/Q200053.zip&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Q200053.zip&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200053/Regenerating-Program-Tasks-and-Tests-IDs</link><pubDate>4/16/2014</pubDate></item><item><title>Using ATEasy and DSI Software to Run and Analyze Test Programs - Published on 1/13/2014</title><description>ATEasy Test programs can be converted to an ATML Test Descriptions file.&amp;nbsp;&amp;nbsp;The eXpress environment imports the ATML Test Descriptions file and enables the user to perform their System Diagnostics, Prognostics Health Management and Testability evaluations and use any other features which are made available through eXpress.&amp;nbsp;&amp;nbsp;At the conclusion of the diagnostics creation, eXpress generates DiagML files which are utilized by the eXpress Run-Time Authoring Tool which can enable us to analyze faults through DSI Workbench by monitoring a ATML Test Results file or through the ATEasy Fault Analysis tool by creating a Conditions file which can be used with the embedded ATEasy Test Executive.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200250\ATEasyDSIInteroperability2.jpg" alt="This diagram depicts the interoperability between ATEasy and the DSI suite of software" title="This diagram depicts the interoperability between ATEasy and the DSI suite of software" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;b&gt;Interoperable data formats in ATEasy and DSI software&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;DSI eXpress and ATEasy Integration (Part I)&lt;/h3&gt;The video demonstrates the interaction where DSI Workbench monitors first a passing Test Results file and then a failing Test Results file.&amp;nbsp;&amp;nbsp;The failures are generated using hardware on the MTS TS-710 test system and a custom UUT that has been modeled in eXpress to take advantage of the ability to highlight components on a real image of the UUT.&lt;br /&gt;&lt;a href='http://www.youtube.com/watch?v=XBn1VMO2oBI' target='_blank'&gt;http://www.youtube.com/watch?v=XBn1VMO2oBI&lt;/a&gt;&lt;br /&gt;&lt;a href='https://www.youtube.com/embed/XBn1VMO2oBI' target='frameVideo' border='0' onclick='return MoveFocustoVideo();'&gt;&lt;img src='/Images/icons/ico_play.gif' border='0'&gt;Link to video&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;DSI eXpress and ATEasy Integration (Part 2)&lt;/h3&gt;The video demonstrates the interaction where the eXpress Run-Time Authoring Tool generates a conditions file which is used natively by the ATEasy Test Executive. The Diagnostic Study in eXpress is examined to describe how a constellation of passing and failing test results allows the software to fault a specific component and creates a DiagML file.&amp;nbsp;&amp;nbsp;Then the eXpress Run-Time Authoring Tool is used to generate the conditions file.&amp;nbsp;&amp;nbsp;Within the ATEasy Test Executive, the previously created file is opened and used to analyze the test results and fault a component based on the study created in eXpress.&lt;br /&gt;&lt;a href='http://www.youtube.com/watch?v=t0iv78TW78I' target='_blank'&gt;http://www.youtube.com/watch?v=t0iv78TW78I&lt;/a&gt;&lt;br /&gt;&lt;a href='https://www.youtube.com/embed/t0iv78TW78I' target='frameVideo' border='0' onclick='return MoveFocustoVideo();'&gt;&lt;img src='/Images/icons/ico_play.gif' border='0'&gt;Link to video&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;More Information on the Software&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://www.marvintest.com/Product.aspx?model=ATEasy' target='_blank'&gt;ATEasy&lt;/a&gt; - A test executive and rapid application development framework for ATE.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://www.dsiintl.com/WebLogic/Products.aspx?Page=eXpress/WhatIsExpress.ascx' target='_blank'&gt;eXpress&lt;/a&gt; - Software diagnostic engineering tools that encompass diagnostics, testability, prognostics and systems engineering.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://www.dsiintl.com/Products/rta.aspx' target='_blank'&gt;eXpress Run-Time Authoring Tool&lt;/a&gt; - Takes eXpress diagnostic design data and integration and deployment of Systems Diagnostic and Prognostic designs within real-world troubleshooting environments such DSI Workbench and ATEasy.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://www.dsiintl.com/Products/DSIWorkbench.aspx' target='_blank'&gt;DSI Workbench&lt;/a&gt; - Allows for publication of diagnostics within production and maintenance troubleshooting environments. Will facilitate the integration of diagnostic design views, engineering views, photos and videos within an integrated environment. &lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200250/Using-ATEasy-and-DSI-Software-to-Run-and-Analyze-Test-Programs</link><pubDate>1/13/2014</pubDate></item><item><title>White Paper: The MTS-3060 SmartCan - The Next Generation in Armament Test Solutions - Published on 1/2/2014</title><description>This paper provides an overview of the MTS-3060 SmartCan™ which offers next generation,&amp;nbsp;&amp;nbsp;O-level test capabilities for alternate mission equipment (AME) and other aircraft systems. Delivering new and advanced flightline test capabilities, it supports the testing of suspension and AME systems including pylons, launchers, bomb racks, and pods.&amp;nbsp;&amp;nbsp;The MTS-3060 SmartCan™ is a high-performance hand-held device with the shape of a "beercan", and provides advanced test capabilities that are unavailable in other O-level test products. Unlike any other beercan testers, the MTS-3060 provides measurement, loading and stimuli functions that are typically only associated with large O-level testers, such as the SERD-75501. With multiple measurement and load channels, dedicated and continuous squib circuit monitoring, audio and video simulation, and MIL-STD-1760 support, the MTS-3060 SmartCan™ can support a range of aircraft platforms including the F-15, F-16, TA-50, F-5, and&amp;nbsp;&amp;nbsp;F-22 as well as any "smart" or legacy armament system. &lt;br /&gt;&lt;br /&gt;To learn more about the MTS-3060 SmartCan, click &lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2013\MTS-3060TheNextGenerationInO-LevelArmamentTest.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt; here&lt;/a&gt;.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200254/White-Paper-The-MTS-3060-SmartCan-The-Next-Generation-in-Armament-Test-Solutions</link><pubDate>1/2/2014</pubDate></item><item><title>White Paper: Commercial Off the Shelf (COTS) Based, Flightline Test Solutions - Published on 11/22/2013</title><description>The flight-line test sets discussed in this paper are all based on a common core PXI (Compact PCI Extensions for Instrumentation). The platform includes a 14-slot PXI backplane. PXI is a modular card, rugged standard which can be used to achieve reliable performance under harsh operating conditions. Industry&lt;br /&gt;standard PXI includes two form factors: 3U and 6U. While 3U is the more popular of the two and most PXI instrumentation is available in this form factor, many products including high-density switching and high performance digital are only available in the 6U form factor. Additionally, the PXI standard maintains full interoperability between 6U and 3U, allowing any 3U PXI module to be installed into any 6U PXI slot. For these reasons, the PXI core platform employed by these test sets offers both 6U and 3U PXI slots. Since 2004, PXI-based flight-line test solutions have been supporting a wide range of aircraft including the F-16, F-15, TA-50, FA-50, A-10, and MC-130.&lt;br /&gt;&lt;br /&gt;To learn more about COTS Based, Flightline Test Solutions, click &lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2013\COTSFlightlineTestSolutions.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt; here&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200253/White-Paper-Commercial-Off-the-Shelf-COTS-Based-Flightline-Test-Solutions</link><pubDate>11/22/2013</pubDate></item><item><title>White Paper: Integration of Software Technologies into a Test System - Published on 6/20/2013</title><description>ATE systems can require the incorporation of a range of software tools and components. This presentation provides an overview of these different software tools and how ATEasy can be used to simplify the process of incorporating various application development environments as well as 3rd party software applications such Excel, XML and databases.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2013\IntegrationOfSoftwareTechnologiesIntoATestSystemETEr1.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the presentation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200245/White-Paper-Integration-of-Software-Technologies-into-a-Test-System</link><pubDate>6/20/2013</pubDate></item><item><title>White Paper: Addressing Semiconductor Test with PXI - Published on 6/17/2013</title><description>Recent advancements in PXI (Compact PCI Extensions for Instrumentation) digital, analog and RF test products and systems now makes it possible for test engineers to address a range of ATE device test needs with the PXI platform. In particular, PXI digital products that offer tester per-pin features including a parametric measurement unit (PMU) per-pin architecture as well as PXI test systems that incorporate these features are now offering ATE semiconductor test capabilities with high value and performance. In addition, these PXI test systems, such as Marvin Test Solutions' TS-900 are providing test engineers cost-effective ATE that can be used for failure analysis, prototype device verification, and pilot / early production runs – allowing the “big iron” ATE to be focused on the volume production test applications while providing engineering test groups ATE features in a compact and configurable platform. &lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2013\AddressingSemiconductorTestwithPXI.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200246/White-Paper-Addressing-Semiconductor-Test-with-PXI</link><pubDate>6/17/2013</pubDate></item><item><title>Using ICEasy's Shmoo Plot Tool with ATEasy - Published on 6/11/2013</title><description>Shmoo plots can be useful for graphically representing test results obtained when characterizing a part using two test variables. &lt;br /&gt;&lt;br /&gt;When testing a device, one may want to know how a device will operate over a range of test parameters such as supply voltage and clock frequency. By varying the parameters while performing a functional test on the device, it is possible to characterize the device for a range of operating conditions. By plotting the test parameters and indicating a pass / fail condition in green or red for each test condition, the resulting two dimensional plot will graphically show the area over which the device operates or fails. &lt;br /&gt;&lt;br /&gt;ATEasy v9 supports two dimensional Shmoo plotting using the AChart control within a Form.&amp;nbsp;&amp;nbsp;The Shmoo plot capability is used extensively with the&amp;nbsp;&amp;nbsp;TS-900 Semiconductor Test System for characterizing a device for a given range of operating conditions.&lt;br /&gt;&lt;br /&gt;The following figure is an example of a Shmoo plot generated in ATEasy that represents the test results based on a sweep of the VCC and operating frequencies for a digital part:&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200244/ShmooPlot2.JPG" alt="Shmoo Plot Axes" title="Shmoo Plot Axes" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In order to use the Shmoo Plot within a form, follow these steps:&lt;br /&gt;&lt;br /&gt;1. Create a Form within ATEasy&lt;br /&gt;&lt;br /&gt;2. Select the AChart control and draw the chart on to the Form&lt;br /&gt;&lt;br /&gt;3. Right click on the newly placed AChart control, and select Properties.&lt;br /&gt;&lt;br /&gt;4. Select the "Control" tab and select "Shmoo" from the "Style" combo box.&lt;br /&gt;&lt;blockquote&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200244/ShmooStyle.JPG" alt="Shmoo Plot Axes" title="Shmoo Plot Axes" border='0' &gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;The Shmoo plot is one of several styles that can be selected for an AChart Control.&lt;br /&gt;&lt;/blockquote&gt;5. Select the "Ticks" tab and configure the Major and Minor intervals for the X and Y axis.&lt;br /&gt;&lt;blockquote&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200244/ShmooTicks.JPG" alt="Shmoo Plot Axes" title="Shmoo Plot Axes" border='0' &gt;&lt;br /&gt;The minor interval sets the resolution of the axis.&lt;br /&gt;&lt;/blockquote&gt;6. Select the "Axes" tab and configure the X and Y axis names and scales (min/max)&lt;br /&gt;&lt;blockquote&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200244/ShmooAxes.JPG" alt="Shmoo Plot Axes" title="Shmoo Plot Axes" border='0' &gt;&lt;br /&gt;The "Axes" tab contains the minimum and maximum value for each of the axis. Each axis represents a variable that is being sweeped. The axis range (min/max) in conjunction with the Minor tick interval, determines the number of steps for a given axis. In this example, the X-axis (Frequency) has a range of 1-26 Mhz with a minor interval of 1 resulting in 26 steps for the sweep across the X-axis &lt;/blockquote&gt;7. Call the SetData member of the AChart control to set the measurement and Pass/Fail results for the Shmoo Plot.&lt;br /&gt;&lt;blockquote&gt;Shmoo data is represented by an X axis value, a Y axis value, and the corresponding Test Result Boolean value. In this example, the X axis represents VCC and the Y axis represents the Frequency. &lt;br /&gt;&lt;br /&gt;Each cell of data can be entered, one at a time, using the following call (the chart control is called "cht1" in this example):&lt;br /&gt;&lt;div class='fixedFont'&gt;cht1.SetData(0, dVcc, dFrequency,,,False, bTestResult)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;bTestResult contains the Pass/Fail result of a functional test that was run with a particular value of VCC and VOH.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; This article uses a pre-release version of ATEasy 9.&amp;nbsp;&amp;nbsp;</description><link>https://www.MarvinTest.com/KB/Q200244/Using-ICEasy-s-Shmoo-Plot-Tool-with-ATEasy</link><pubDate>6/11/2013</pubDate></item><item><title>White Paper: Where’s The Beer? A Paradigm Shift in Flight-Line Armament Testing - Published on 12/12/2012</title><description>&lt;b&gt;&lt;h3&gt;Abstract&lt;/h3&gt;&lt;/b&gt;&lt;br /&gt;Prior to loading live weapons on an aircraft, maintainers are required to verify that no stray voltage is present and that the firing signals are functioning properly. In the Air Force world, this is done with a small, battery-operated tester called an Armament Circuits Pre-Load Test Set (ACPTS), commonly referred to as a “beercan” due to its shape and size. The typical beercan is a rudimentary test set with few capabilities and limited performance. The beercan’s function is to verify that there is no stray voltage on the critical firing lines (squibs), and to verify the presence of firing signals including magnitude and timing during a valid launch procedure. The typical beercan only has one or two measurement channels, necessitating the manual switching of various adapters to enable testing of multiple signals. The typical beercans also lack the ability to emulate weapon signals, precluding any effective “smart” weapons testing by beercans.&lt;br /&gt;&lt;br /&gt;A new breed of beercans has been recently introduced to address this deficiency by improving the test capabilities of the beercan, thus eliminating the flight-line testers and simplifying the maintenance logistics while increasing performance and reducing test and maintenance time. This paper discusses the requirements of flight-line armament testers and introduces a universal beercan - the SmartCan which offers capabilities previously unavailable for the flight-line. &lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers/2012/BeercanPaperCopyright.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200237/White-Paper-Where-s-The-Beer-A-Paradigm-Shift-in-Flight-Line-Armament-Testing</link><pubDate>12/12/2012</pubDate></item><item><title>White Paper: Incorporating Advanced Instrumentation Capabilities into a PXI DMM - Published on 12/12/2012</title><description>&lt;b&gt;&lt;h3&gt;Abstract&lt;/h3&gt;&lt;/b&gt;&lt;br /&gt;The use of card modular instrumentation for ATE systems offers test engineers many benefits - including lower acquisition costs, a more compact system footprint, and higher performance when compared to "box based" ATE architecture. In particular, upgrading to the PXI architecture can decrease both the physical and budgetary footprints, while still meeting the overall test requirements. However, for T&amp;M instrument suppliers, incorporating the features and capabilities associated with advanced instrumentation into the PXI form-factor can present several design challenges, particularly in the areas of volume / real estate, noise, power consumption, and measurement stability. Additionally, these demanding requirements can be further challenged when the instrument is required to operate beyond the "normal" temperature range associated with commercial instrumentation.&lt;br /&gt;&lt;br /&gt;This paper discusses the requirements and techniques used to develop a PXI-based, high performance DMM. A review of the required performance parameters is presented along with an analysis of the alternative design methods employed in order to achieve the necessary performance capabilities without compromising the overall capabilities of the hardware. Areas covered in this paper include a discussion of design techniques which includes the use of multi-function circuitry to reduce overall volume requirements, the conversion of purely analog circuitry into a mixed signal format to reduce volume and power requirements, minimizing power supply noise when replacing a mains-based power supply with isolated and non-isolated DC/DC circuitry and the requirement to operate over an extended temperature range. Additionally, a review of the overall mechanical design with attention to the need to accommodate the noise and airflow considerations associated with the PXI architecture is discussed.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers/2012/IncorporatingAdvancedInstrumentationIntoAPXIDMM.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200236/White-Paper-Incorporating-Advanced-Instrumentation-Capabilities-into-a-PXI-DMM</link><pubDate>12/12/2012</pubDate></item><item><title>Using the DAQ Function of the GX2065 - Published on 7/23/2012</title><description>The GX2065 is a 3U DMM and DAQ. The DAQ is capable of capturing up to 8192 Voltage or Current measurements to memory.&lt;br /&gt;&lt;br /&gt;The DAQ function uses a 3Mhz sampling clock and a clock divider with a maximum value of 255, allowing a range of sampling frequencies (3Mhz to 11.76Khz). &lt;br /&gt;&lt;br /&gt;Follow these steps to capture samples using the DAQ:&lt;br /&gt;&lt;br /&gt;1. Set desired function by calling &lt;b&gt;GxDmmSetFunction&lt;/b&gt;, and passing in VAC_AC, VAC_DC, IAC_AC, or IAC_DC (Voltage or Current). The function must be one of four "AC" functions in order to use the DAQ.&lt;br /&gt;&lt;br /&gt;2. Set desired range by calling &lt;b&gt;GxDmmSetRange&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;3. Call &lt;b&gt;GxDmmSetACClockDivider &lt;/b&gt;and pass in the clock divider value (1 to 256).&lt;br /&gt;&lt;br /&gt;4. Call &lt;b&gt;GxDmmSetTriggerMode &lt;/b&gt;and pass in &lt;b&gt;GXDMM_TRIGGER_ARRAY&lt;/b&gt; along with the number of samples you would like to capture (1 to 8192). This will initiate the capture process&lt;br /&gt;&lt;br /&gt;5. Monitor the status of the capture by calling &lt;b&gt;GxDmmGetReadArrayStatus&lt;/b&gt;. This function will return the finished state of the capture and the number of samples currently captured.&lt;br /&gt;&lt;br /&gt;6. When the capture process has completed, call &lt;b&gt;GxDmmReadArray &lt;/b&gt;to retrieve the samples. The function will return an array of samples as well as an array of time stamps. Each sample is accompanied by a time stamp in nano seconds.&lt;br /&gt;&lt;br /&gt;The following is C example code to capture 1000 samples of voltage at a sampling rate of 1.5Mhz:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;SHORT nHandle, nStatus;&lt;br /&gt;&lt;br /&gt;//Measurement array&lt;br /&gt;DOUBLE adMeasurements[1000];&lt;br /&gt;&lt;br /&gt;//64 Bit Time Stamps&lt;br /&gt;DDWORD addwTimeStamps[1000];&lt;br /&gt;&lt;br /&gt;BOOL bFinished=FALSE;&lt;br /&gt;&lt;br /&gt;//Initialize DMM&lt;br /&gt;GxDmmInitialize(nSlot, &amp;nHandle, &amp;nStatus);&lt;br /&gt;&lt;br /&gt;//Set Function to AC, AC coupled for DAQ functionality&lt;br /&gt;GxDmmSetFunction(nHandle, GXDMM_FUNCTION_VAC_AC_CPL, &amp;nStatus);&lt;br /&gt;&lt;br /&gt;//Set Range to 10 Volts&lt;br /&gt;GxDmmSetRange(nHandle, GXDMM_RANGE_10V, &amp;nStatus);&lt;br /&gt;&lt;br /&gt;//Divide DAQ 3Mhz clock by 2 to get 1.5Mhz sampling clock&lt;br /&gt;GxDmmSetACClockDivider(nHandle, 2, &amp;nStatus);&lt;br /&gt;&lt;br /&gt;//Start capture of 1000 samples&lt;br /&gt;GxDmmSetTriggerMode(nHandle, GXDMM_TRIGGER_ARRAY, 1000, &amp;nStatus);&lt;br /&gt;&lt;br /&gt;//Wait until capture complete&lt;br /&gt;while(!bFinished)&lt;br /&gt;GxDmmGetReadArrayStatus(nHandle, &amp;bFinished, &amp;dwSampleCount, &amp;nStatus);&lt;br /&gt;&lt;br /&gt;//Read back measurements and timestamps&lt;br /&gt;GxDmmReadArray(nHandle, adMeasurements, addwTimeStamps, 1000, &amp;nStatus);&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200228/Using-the-DAQ-Function-of-the-GX2065</link><pubDate>7/23/2012</pubDate></item><item><title>PMU Functionality with the GX5960 Series - Published on 5/7/2012</title><description>The Gx5960 Series of Digital I/O devices include the ability to configure each of its I/O channels to operate in either dynamic or PMU mode. This article focuses on the PMU mode.&lt;br /&gt;&lt;br /&gt;Each digital channel includes a parametric measurement unit (PMU) which can be used to characterize and measure a digital pin’s DC characteristics. The PMU can be configured for force current, measure voltage, or force voltage, measure current.&amp;nbsp;&amp;nbsp;The PMU’s range of operation is listed below:&lt;ul&gt;&lt;li&gt;Force voltage range: -10 volts to +15 volts (plus vMid Voltage)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Force current range: +/- 25 mA FS or +/- 200 mA &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Measure voltage range: -10 volts to +15 volts (plus vMid Voltage)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Measure current range: +/- 25 mA FS or +/- 200 mA &lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200224\\PMUDiagram2.JPG" alt="GX5960 Parametrics Measurement Unit Circuit" title="GX5960 Parametrics Measurement Unit Circuit" border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;API Functions&lt;/h3&gt;The following are the API calls required to set up the instrument for PMU operation:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;VOID WINAPI GtDio6xSetChannelMode(SHORT nHandle, LONG lChannelListArraySize, PLONG palChannelListArray, SHORT nMode, PSHORT pnStatus);&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;VOID WINAPI GtDio6xSetChannelForcedVoltage(SHORT nHandle, LONG lChannelListArraySize, PLONG palChannelListArray, DOUBLE dVoltage,&amp;nbsp;&amp;nbsp;SHORT nCurrentRange, DWORD dwSetupMode, DOUBLE dMaxCurrent, PSHORT pnStatus);&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;VOID WINAPI GtDio6xSetChannelForcedCurrentCommutatingVoltage(SHORT nHandle, LONG lChannelListArraySize, PLONG palChannelListArray, DOUBLE dVComHi, DOUBLE dVComLo, PSHORT pnStatus);&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;VOID WINAPI GtDio6xSetChannelForcedCurrentCommutatingVoltage(SHORT nHandle, LONG lChannelListArraySize, PLONG palChannelListArray, DOUBLE dVComHi, DOUBLE dVComLo, PSHORT pnStatus);&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Note that the voltage clamps only apply for forced current operation up to 24mA. If this current is exceeded, the voltage clamps are no longer effective.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Example Code&lt;/h3&gt;The following C code performs the following:&lt;br /&gt;1. Set Channel 0 Mode to PMU Force Current&lt;br /&gt;2. Set Channel 0 PMU Force Current Voltage clamps to +5V and -5V&lt;br /&gt;3. Set Channel 0 to Force 10mA in 25mA range&lt;br /&gt;4. Measure the output current&lt;br /&gt;5. Set Channel 0 Mode to PMU Force Voltage&lt;br /&gt;6. Set Channel 0 to Force 12V with the current range set to 25mA&lt;br /&gt;7. Measure the output voltage&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;//Use channel 0&lt;br /&gt;alChannelListArray[0]=0; //Use channel 0&lt;br /&gt;GtDio6xInitialize(1, &amp;nHandle, &amp;nStatus);&lt;br /&gt;GtDio6xSetChannelConnect(nHandle, 1, alChannelListArray, TRUE, &amp;nStatus);&lt;br /&gt; //Set Channel Mode to PMU Force Current&lt;br /&gt;GtDio6xSetChannelMode(nHandle, 1, alChannelListArray, GTDIO6X_CHANNEL_MODE_PMU_FORCE_CURRENT, &amp;nStatus);&lt;br /&gt;//Set Clamping voltages to +5V and -5V&lt;br /&gt;GtDio6xSetChannelForcedCurrentCommutatingVoltage(nHandle, 1, alChannelListArray, 5, -5, &amp;nStatus);&lt;br /&gt;//Force 10 mA in 25mA range&lt;br /&gt;GtDio6xSetChannelForcedCurrent(nHandle, 1, alChannelListArray, 10, GTDIO6X_PMU_CURRENT_RANGE_N25MA_TO_P25MA, &amp;nStatus); &lt;br /&gt;//Measure the current output&lt;br /&gt;GtDio6xMeasure(nHandle, 0, GTDIO6X_MEASURE_OUTPUT_CURRENT, &amp;dMeasurement, 1, 0, 0, &amp;nStatus); &lt;br /&gt;&lt;br /&gt;//Set Channel Mode to PMU Force Voltage&lt;br /&gt;GtDio6xSetChannelMode(nHandle, 1, alChannelListArray, GTDIO6X_CHANNEL_MODE_PMU_FORCE_VOLTAGE, &amp;nStatus); &lt;br /&gt;//Force 12 Volts&lt;br /&gt;GtDio6xSetChannelForcedVoltage(nHandle, 1, alChannelListArray, 12.0, GTDIO6X_PMU_CURRENT_RANGE_N25MA_TO_P25MA, GTDIO6X_PMU_FV_SETUP_DEFAULT, 20, &amp;nStatus); &lt;br /&gt;//Measure the voltage output&lt;br /&gt;GtDio6xMeasure(nHandle, 0, GTDIO6X_MEASURE_IO_VOLTAGE, &amp;dMeasurement, 1, 0, 0, &amp;nStatus); &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;More information on the &lt;a href='http://www.geotestinc.com/Product.aspx?model=GX5960+Series' target='_blank'&gt;GX5960&lt;/a&gt; series can be found on the &lt;a href='http://www.Geotestinc.com' target='_blank'&gt;Geotest&lt;/a&gt; website. &lt;br /&gt;&lt;br /&gt;Look at the following articles for more information about PMU and related applications: &lt;a href='http://www.geotestinc.com/KnowledgeBase/KBArticle.aspx?ID=207' target='_blank'&gt;PMU White Paper&lt;/a&gt; , &lt;a href='http://www.geotestinc.com/KnowledgeBase/KBArticle.aspx?ID=223' target='_blank'&gt; Semiconductor Testing with GX5295 PMU&lt;/a&gt; </description><link>https://www.MarvinTest.com/KB/Q200224/PMU-Functionality-with-the-GX5960-Series</link><pubDate>5/7/2012</pubDate></item><item><title>White Paper: Next Generation Test System Architectures for Depot and O-Level Test - Published on 3/1/2012</title><description>&lt;b&gt;Abstract:&lt;/b&gt;&lt;br /&gt;For over 30 years, ATE has been a key resource and tool for the maintenance and repair of electronic systems, subsystems and board level assemblies deployed on a wide range of military-aerospace systems. ATE has been relied upon to maintain and support electronic assemblies for avionics, weapons systems, and communication systems. In addition, repair logistics and the “up-time” demands for these systems have resulted in the need for repair / support strategies that shorten the repair loop. For the US Marine Corp, the need to minimize this repair loop is acute and has resulted in the adoption of a maintenance / repair strategy that employs Depot – level test capabilities which can also be deployed at the field or O-level. &lt;br /&gt;&lt;br /&gt;This paper discusses how a PXI-based architecture which employs the GX5960 subsystem can provide the basis for replacing a Teradyne VXI M9 digital test solution. The successful development and implementation of software tool set for migrating M9 or LASAR-based test programs is also presented. The resulting solution offers a downsized test platform that supports legacy test programs while offering portability and performance at a significantly lower cost for both Depot and O-level test needs.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2012\Nxgen-test-systems.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200227/White-Paper-Next-Generation-Test-System-Architectures-for-Depot-and-O-Level-Test</link><pubDate>3/1/2012</pubDate></item><item><title>Using Interrupts with the GX3500 and GX3700/GX3700e FPGA Instruments - Published on 8/12/2011</title><description>Interrupts are widely used as a means for hardware to handshake and syncronize with software in order to signal the completion of a hardware process or the need for a change in software execution. The Gx3500 and Gx3700 User FPGA boards both support this feature by exposing a dedicated hardware interrupt pin to the FPGA designer, and three API functions in software for interrupt management and set up.&lt;br /&gt;&lt;br /&gt;Before getting started with Interrupts follow these steps:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Verify that&amp;nbsp;&amp;nbsp;the GX3500 has the lastest firmware. The Interface FPGA, which contains the core firmware for the device, must be upgraded to version B003 or greater. This can be done by initializing the GX3500 from within the software front panel, clickong on the &lt;b&gt;About &lt;/b&gt;Tab, clicking on &lt;b&gt;Upgrade Firmware&lt;/b&gt;, and then browsing to the appropriate firmware file (.RPD file extension).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Verify that the latest GXFPGA software package has been installed (Version 1.2 or greater).&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Software&lt;/h3&gt;The user can select to handle a hardware interrupt in one of two ways:&lt;ul&gt;&lt;li&gt;Assign a callback function to be invoked (in a new threadd) whenever an interrupt occurs (&lt;b&gt;GxFpgaSetEvent&lt;/b&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Block (Wait) until an interrupt occurs or timeout (&lt;b&gt;GxFpgaWaitOnEvent&lt;/b&gt;)&lt;/li&gt;&lt;/ul&gt;The software API functions that interface with the hardware generated interrupt are:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;GxFpgaSetEvent&lt;/h3&gt;&lt;div class='fixedFont'&gt;GxFpgaSetEvent(SHORT nHandle, SHORT nEventType, BOOL bEnable, Gt_EventCallback procCallback, PVOID pvUserData, PSHORT pnStatus)&lt;/div&gt;&lt;br /&gt;This function is used to enable the capture of interrupt events and set up the callback interrupt handler. &lt;br /&gt;&lt;b&gt;nEventType&lt;/b&gt;: The type of event to capture. Currently this value must be set to &lt;b&gt;GT_EVENT_INTERRUPT&lt;/b&gt; &lt;br /&gt;&lt;b&gt;bEnable&lt;/b&gt;: A boolean flag to enable or disable interrupt generation&lt;br /&gt;&lt;b&gt;procCallBack&lt;/b&gt;: A call back function (function pointer) can be passed to the procCallback parameter &lt;br /&gt;&lt;b&gt;pvUserData&lt;/b&gt;: A pointer to user data (scalar or structured data) that will be passed to the callback function when an interrupt occurs&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note&lt;/b&gt;: The callback function (passed into &lt;b&gt;procCallback&lt;/b&gt;) must match the following prototype where GxFpgaCallBack can be any name:&lt;br /&gt;&lt;div class='fixedFont'&gt;GxFpgaCallBack(SHORT nHandle, SHORT nEventType, PVOID pvUserData)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;GxFpgaWaitOnEvent&lt;/h3&gt;&lt;div class='fixedFont'&gt;GxFpgaWaitOnEvent(SHORT nHandle, SHORT nEventType, LONG lTimeout, PSHORT pnStatus)&lt;/div&gt;&lt;br /&gt;This function blocks program execution and waits for an interrupt to occur.&lt;br /&gt;&lt;b&gt;nEventType&lt;/b&gt;: The type of event to capture. Currently this value must be set to &lt;b&gt;GT_EVENT_INTERRUPT&lt;/b&gt; &lt;br /&gt;&lt;b&gt;lTimeout&lt;/b&gt;: A timeout value (in terms of mS) to determine how long to wait for an interrupt before continuing the program&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;GxFpgaDiscardEvents&lt;/h3&gt;&lt;div class='fixedFont'&gt;GxFpgaDiscardEvents(SHORT nHandle, SHORT nEventType, PSHORT pnStatus)&lt;/div&gt;&lt;br /&gt;This function discards all pending interrupt requests.&lt;br /&gt;&lt;b&gt;nEventType&lt;/b&gt;: The type of event to capture. Currently this value must be set to &lt;b&gt;GT_EVENT_INTERRUPT&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Hardware&lt;/h3&gt;When creating an FPGA design, use the IRQ pin (as assigned in the pin planner) to generate a hardware interrupt. An interrupt is generated when the IRQ pin is driven from a logic low to a logic high state (Rising Edge).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Example&lt;/h3&gt;The GXFPGA driver contains an example that shows how to program the card interrupt. See the The GxFpgaExampleC.cpp and the&amp;nbsp;&amp;nbsp;GxFpgaExampleIRQx250ms.rpd in the Examples\C folder. In the example an interrupt is generated every 250 mSec.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200221/Using-Interrupts-with-the-GX3500-and-GX3700-GX3700e-FPGA-Instruments</link><pubDate>8/12/2011</pubDate></item><item><title>Using the Gx5960 Pattern Test Flags to Qualify real time compare errors - Published on 6/7/2011</title><description>The Gx5960 series DIO boards are able to perform real time conditonal branching/halting and recording when a compare error has been detected from a particular data pattern. Each data pattern contains two flags to help qualify any errors generated. The qualification (by way of Pattern Test Flags) allows the sequencer to determine if a particular pattern's error can cause a branch/halt and if it will be recorded in the EAM (Error Address Memory) or not.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Pattern Test Flags&lt;/h3&gt;&lt;b&gt;Conditional Error Enable Flag&lt;/b&gt;: Each data pattern contains a Conditional Enable (CONDEN) flag that is used by the Conditional Logic to determine if a real time compare result generated by a particular data pattern will be used within a conditional error statement. &lt;br /&gt;A list of conditional error statements are:&lt;ul&gt;&lt;li&gt;Halting on error (or NOT error)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Jumping on error (or NOT error)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Go subroutine on error (or NOT error)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Looping on error (or NOT error)&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Burst Error Enable Flag&lt;/b&gt;: Each data pattern also contains a Burst Error Enable (BERREN) flag that is used by the Error Address Memory to determine if an error generated by a particular data pattern will be recorded or not. &lt;br /&gt;&lt;br /&gt;Note that the Error Address Memory stores up to 1024 real time compare error addresses. The Burst Error Enable flag does not have any effect on the Record Memory.&lt;br /&gt;&lt;br /&gt;Either flag (&lt;b&gt;CONDEN&lt;/b&gt;, or &lt;b&gt;BERREN&lt;/b&gt;) can be set, or no flags set at all on a per data pattern basis.&lt;br /&gt;&lt;br /&gt;The API function used to configure the pattern test is as follows:&lt;br /&gt;&lt;div class='fixedFont'&gt;VOID WINAPI GtDio6xSetPatternTestEnable (SHORT nHandle, LONG lPatternOffset, SHORT nEnable, PSHORT pnStatus)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;After selecting the sequence step using the &lt;b&gt;GtDio6xSelectSequenceStep &lt;/b&gt;function, this function can be called to apply a pattern test flag to a particular data pattern.&lt;br /&gt;&lt;br /&gt;The possible values of nEnable are as follows:&lt;ul&gt;&lt;li&gt;GTDIO6X_STE_NONE - No Flags are enabled for the data pattern&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;GTDIO6X_STE_COND - Only the CONDEN flag is enabled for the data pattern&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;GTDIO6X_STE_BURST - Only the BERREN flag is enabled for the data pattern&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;GTDIO6X_STE_BOTH - Both, CONDEN and BERREN flags are enabled for the data pattern&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;Sequencer Basis Settings&lt;/h3&gt;The sequencer uses the following three settings to determine if the Pattern Test Flags (CONDEN and BERREN) will be used or not: &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Error Count Basis&lt;/b&gt; - Selection of the signal used for counting real time compare errors by the EAM&lt;ul&gt;&lt;li&gt;Local - Unqualified (all), locally generated real time compare errors will be used in the EAM Error Count&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Local BERREN - Only qualified (with the BERREN flag enabled) locally generated real time compare errors will be used in the EAM Error Count&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Domain - Unqualified (all), domain wide real time compare errors will be used in the EAM Error Count&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Domain BERREN - Only qualified (with the BERREN flag enabled) domain wide real time compare errors will be used in the EAM Error Count&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Error Address Basis&lt;/b&gt; - Selection of the signal used to generate a real time compare error pattern/sequence address for use by the EAM&lt;ul&gt;&lt;li&gt;Local - Unqualified (all), locally generated real time compare errors will be recorded in the EAM&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Local BERREN - Only qualified (with the BERREN flag enabled) locally generated real time compare errors will be recorded in the EAM&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Domain - Unqualified (all), domain wide real time compare errors will be recorded in the EAM&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Domain BERREN - Only qualified (with the BERREN flag enabled) domain wide real time compare errors will be recorded in the EAM&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Pass/Fail Basis &lt;/b&gt;- Selection of the signal used by the Conditional Logic to perform an action on a rela time compare error.&lt;ul&gt;&lt;li&gt;Local - Unqualified (all), locally generated real time compare errors will be used by the Conditional Logic&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Local CONDEN - Only qualified (with the CONDEN flag enabled) locally generated real time compare errors will be used by the Conditional Logic&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Domain - Unqualified (all), domain wide real time compare errors will be used by the Conditional Logic&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Domain CONDEN - Only qualified (with the CONDEN flag enabled) domain wide real time compare errors will be used by the Conditional Logic&lt;/li&gt;&lt;/ul&gt;The API Function used to configure the Error Count Basis and Error Address Basis is as follows:&lt;br /&gt;&lt;div class='fixedFont'&gt;VOID WINAPI GtDio6xSetErrorParameters (SHORT nHandle, SHORT nErrorCountBasis, SHORT nErrorAddressBasis, PSHORT pnStatus)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The API Function used to configure the Pass/Fail Basis is as follows:&lt;br /&gt;&lt;div class='fixedFont'&gt;VOID WINAPI GtDio6xSetPassFailParameters (SHORT nHandle, SHORT nPassFailBasis, SHORT nPassValidMode, PSHORT pnStatus)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Consult the Function Reference for more information on these functions.&lt;br /&gt;&lt;br /&gt;The following diagram explains the concepts described above:&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200217\Gx5960PatternTestCodes.bmp" alt="Real Time Compare Error Conditional" title="Real Time Compare Error Conditional" border='0' &gt;</description><link>https://www.MarvinTest.com/KB/Q200217/Using-the-Gx5960-Pattern-Test-Flags-to-Qualify-real-time-compare-errors</link><pubDate>6/7/2011</pubDate></item><item><title>Using GX5295 Level Comparators for Fast Go/NoGo Production Tests - Published on 5/13/2011</title><description>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;In the semiconductor production test world, the maxim “Throughput is King” is as true today as when the term was coined decades ago.&amp;nbsp;&amp;nbsp;The underlying assumption is that the test “adequately” evaluates the operation and functionality of the UUT.&amp;nbsp;&amp;nbsp;Special emphasis is given to the word "&lt;b&gt;Adequate&lt;/b&gt;" because the typical practice is to perform a robust, comprehensive functional test and characterization for design verification, and then perform a subset of those tests on the production line.&amp;nbsp;&amp;nbsp;Once a design has been verified, it is usually not necessary to functionally test every aspect of each device, or fully characterize the AC and/or DC parameters of each device during the production test cycle.&amp;nbsp;&amp;nbsp;An adequate subset of the functional and parametric tests are selected such that, if the UUT passes these tests, you have high confidence that the component will function correctly in its intended application.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Limit Testing&lt;/b&gt;&lt;br /&gt;By limiting the number and scope of the tests performed, test time can be significantly reduced.&amp;nbsp;&amp;nbsp;And, as “time is money”, reducing test time can save money, improve production yields, and directly impact the profitability of a device in the market.&amp;nbsp;&amp;nbsp;But limiting the number and scope of tests performed during production is not the only way to reduce test time.&amp;nbsp;&amp;nbsp;Limit testing can also be an effective time saver that will improve yield without sacrificing quality.&amp;nbsp;&amp;nbsp;Limit testing is the practice of testing only to a minimum or maximum value to validate device parameters.&amp;nbsp;&amp;nbsp;For example, if a device is specified to provide a minimum 2.5V output under a specified load, it is not necessary to test the device to 2.6V.&amp;nbsp;&amp;nbsp;Nor is it necessary to actually measure the output voltage.&amp;nbsp;&amp;nbsp;So long as the device meets the minimum output threshold (or limit), it is considered within specification.&lt;br /&gt;&lt;br /&gt;Testing to a specific limit or threshold, rather than measuring an actual value, can improve test time by utilizing comparators for the limit test, rather than making a measurement.&amp;nbsp;&amp;nbsp;The output of a comparator provides an instantaneous pass/fail indication of whether the parameter meets the minimum (or maximum) allowable value for the parameter being measured.&amp;nbsp;&amp;nbsp;A measurement is not only slower than using a comparator, but requires that the measured value be evaluated against the pass/fail criteria.&amp;nbsp;&amp;nbsp;Typically this evaluation is performed in software, which is slower than a hardware comparison.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;GX5295 Limit Testing&lt;/b&gt;&lt;br /&gt;The GX5295, from Geotest - Marvin Test Systems, Inc., supports both methodologies.&amp;nbsp;&amp;nbsp;It has a full-function Parametric Measurement Unit (PMU) per pin, capable of forcing voltage or current, and measuring current or voltage, respectively.&amp;nbsp;&amp;nbsp;It also provides a dual-threshold comparator for each pin with minimum and maximum thresholds that can be used to validate whether or not a DC parameter meets an acceptable limit.&amp;nbsp;&amp;nbsp;By providing a dual-threshold comparator per pin, the GX5295 can be programmed with a unique minimum AND maximum limit for EACH pin, and then simply select for each pin which comparator output to use for a limit test.&amp;nbsp;&amp;nbsp;The output of the comparator is binary, “0” or “1”, “pass” or “fail”, “good” or “bad”.&amp;nbsp;&amp;nbsp;No measurement is performed, no evaluation of the measured value is needed.&amp;nbsp;&amp;nbsp;Compliance for the parameter is known immediately.&amp;nbsp;&amp;nbsp;Further, comparators can run at the maximum rate of the GX5295 and has minimal impact on throughput.&lt;br /&gt;&lt;br /&gt;A block diagram for one GX5295 channel input is shown below.&amp;nbsp;&amp;nbsp;Each channel can be independently configured to operate in Digital I/O mode (DIO) or Parametric Measurement Unit mode (PMU).&amp;nbsp;&amp;nbsp;The DIO mode is useful for performing standard digital functional test; supporting both Digital Stimulus/Response and Digital Real-Time compare.&amp;nbsp;&amp;nbsp;The PMU mode is useful for making DC measurements or validating DC limits.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200216\GX5295 PMU Blobk Diagram Small.jpg" alt="GX5295 DIO &amp; PMU Comparator Block Diagram" title="GX5295 DIO &amp; PMU Comparator Block Diagram" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In PMU mode, the GX5295 can force a voltage or a current on each channel, and then measure the respective current or voltage.&amp;nbsp;&amp;nbsp;The measured property can also be passed to the PMU comparators to be used in limit testing.&amp;nbsp;&amp;nbsp;Since each channel has fully independent control over the high and low limit values for it's comparator, as well as the force property and value, a complete DC validation of all input pin thresholds and output pin levels can be performed in a single measurement cycle.&amp;nbsp;&amp;nbsp;For bidirectional channels, two cycles would be required.&amp;nbsp;&amp;nbsp;Features and specifications for the GX5295 PMU are provided in the Table below:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Parametric Measurement Unit (PMU) Specifications:&lt;/b&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;Number of PMUs&lt;/b&gt;&lt;/td&gt;&lt;td&gt;32, one per data channel&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;/td&gt;&lt;td&gt;4, one per auxiliar channel (for timing / control functions)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;Modes:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Force voltage, measure current&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;/td&gt;&lt;td&gt;Forcecurrent, measure voltage&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;Force Voltage Range:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;-1 volts to +6 volts&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;Force Accuracy:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;+/- 25 mV&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;Force Voltage Resolution:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;16 bits&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;Force Current Range:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;+/- 32 mA FS, +/- 8 mA, +/- 2 mA, +/- 512 uA, +/- 128 uA, +/- 32 uA, +/- 8 uA, +/- 2 uA FS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;Force / Measure Current Accuracy:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;+/ 160 uA, 32 mA range&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;/td&gt;&lt;td&gt;+/- 40 uA, 8 mA range&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;/td&gt;&lt;td&gt;+/- 10 uA , 2 mA range&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;/td&gt;&lt;td&gt;+/- 2.56 uA, 512 uA range&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;/td&gt;&lt;td&gt;+/- 640 nA, 128 uA range&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;/td&gt;&lt;td&gt;+/- 160 nA 32 uA range&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;/td&gt;&lt;td&gt;+/- 40 nA, 8 uA range&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;/td&gt;&lt;td&gt;+/- 10 nA, 2 uA range&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;Measure Voltage Range:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;-2 volts to +7 volts&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;Measure Voltage Accuracy:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;+/- 5 mV&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;High &amp; Low Voltage Clamps:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;VCLo: -2 to +5 V&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;/td&gt;&lt;td&gt;VCHi: 0 to +7 V&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;&lt;b&gt;Voltage Clamp Accuracy:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;+/- 100 mV&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;The DLL API functions for utilizing the GX5295 PMU functions are:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;DioGetChannelMode()&lt;br /&gt;DioGetInputLoadCurrent()&lt;br /&gt;DioGetInputLoadCommutatingVoltage()&lt;br /&gt;DioGetInputLoadState()&lt;br /&gt;DioMeasure()&lt;br /&gt;DioPmuGetComparatorsSource()&lt;br /&gt;DioPmuGetComparatorsStates()&lt;br /&gt;DioPmuGetComparatorsValues()&lt;br /&gt;DioPmuGetComparisonBooleanResult()&lt;br /&gt;DioPmuGetComparisonResults()&lt;br /&gt;DioPmuGetForcedCurrent()&lt;br /&gt;DioPmuGetForcedCurrentCommutatingVoltage()&lt;br /&gt;DioPmuGetForcedVoltage()&lt;br /&gt;DioPmuSetupComparatorsSource()&lt;br /&gt;DioPmuSetupComparatorsValues()&lt;br /&gt;DioPmuSetupForcedCurrent()&lt;br /&gt;DioPmuSetupForcedCurrentCommutatingVoltage()&lt;br /&gt;DioPmuSetupForcedVoltage()&lt;br /&gt;DioSetupChannelMode()&lt;br /&gt;DioSetupInputLoadCurrent()&lt;br /&gt;DioSetupInputLoadCommutatingVoltage()&lt;br /&gt;DioSetupInputLoadState()&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example&lt;/b&gt;&lt;br /&gt;A example test setup and code for validating the output drive levels of a UUT are provided below.&amp;nbsp;&amp;nbsp;The UUT is a 10-bit full adder.&amp;nbsp;&amp;nbsp;There are 20 input signals mapped to GX5295 channels 0:19; Ain[0:9] and Bin[10:19].&amp;nbsp;&amp;nbsp;There are 11 output signals, 10 bits for the sum and one bit for the carry.&amp;nbsp;&amp;nbsp;these signals are mapped to GX5295 channels 20:30.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200216\KB Block Diagram_Small.jpg" alt="GX5295 Test Configuration" title="GX5295 Test Configuration" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example ATEasy Code for limit testing UUT outputs:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;! Define DIO output as force voltage (drive UUT inputs)&lt;br /&gt;Dio Setup Channels Mode PmuForceVoltageMode RangeOfChannels(nHandle,0,19)&lt;br /&gt;! Set default voltage to 0V for DIO outputs - logic '0' for UUT Ain and Bin inputs&lt;br /&gt;Dio Setup Channels PMU ForceVoltage RangeOfChannels(nHandle,0,19,0,1,0,1)&lt;br /&gt;&lt;br /&gt;! Define DIO inputs as force current mode (load UUT outputs)&lt;br /&gt;Dio Setup Channels Mode PmuForceCurrentMode RangeOfChannels(nHandle,20,30)&lt;br /&gt;! Set force current to 1mA load using the 2mA range&lt;br /&gt;Dio Setup Channels PMU ForceCurrent RangeOfChannels(nHandle,20,30,1,2)&lt;br /&gt;! Set high/low commutating voltage to +3.5V and -1V, respectively&lt;br /&gt;Dio Setup Channels PMU ForcedCurrentCommutatingVoltage RangeOfChannels(nHandle,20,30,3.5,-1)&lt;br /&gt;&lt;br /&gt;! Set channels 20 - 30 for comparator mode (limit testing)&lt;br /&gt;Dio Setup Channels PMU ComparatorsSource RangeOfChannels(nHandle,20,30,aPmuComparatorsSourceIoVoltage)&lt;br /&gt;! Define High/Low input comparator limits to 1.5V/0.5V, respectively&lt;br /&gt;Dio Setup Channels PMU ComparatorsValues RangeOfChannels(nHandle,20,30,1.5,0.5)&lt;br /&gt;&lt;br /&gt;! Apply logic '0' (0V) to UUT Ain inputs (Bin is also '0') - force UUT sum outputs to '0'&lt;br /&gt;Dio Setup Channels PMU ForceVoltage RangeOfChannels(nHandle,0,9,0,1,0,1)&lt;br /&gt;! Return high/low comparator results in arrays adwHighStates and adwLowStates&lt;br /&gt;Dio Get Channels PMU ComparatorsStates(nHandle,False,adwHighStates,adwLowStates)&lt;br /&gt;&lt;br /&gt;! Apply logic '1' (3.0V) to UUT Ain inputs (Bin inputs are '0') - force UUT sum outputs to '1'&lt;br /&gt;Dio Setup Channels PMU ForceVoltage RangeOfChannels(nHandle,0,9,3,1,0,1)&lt;br /&gt;! Return high/low comparator results in arrays adwHighStates and adwLowStates&lt;br /&gt;Dio Get Channels PMU ComparatorsStates(nHandle,False,adwHighStates,adwLowStates)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;Using comparator-based limit testing improves test throughput for DC parametric tests by streamlining the procedure for validating DC parameters of the UUT, without sacrificing quality or coverage.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200216/Using-GX5295-Level-Comparators-for-Fast-Go-NoGo-Production-Tests</link><pubDate>5/13/2011</pubDate></item><item><title>Error while using online help books: 'Navigation to the webpage was canceled' - Published on 5/11/2011</title><description>When attempting to open a Microsoft Compiled HTML Help CHM file via a link on a website, you may encounter a message stating 'Navigation to the webpage was canceled'&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200218\Navigation_Canceled.JPG" alt="Navigation to the webpage was canceled appears upon opening help file" title="Navigation to the webpage was canceled appears upon opening help file" border='0' &gt;&lt;br /&gt;&lt;br /&gt;Windows security update 896358 prevents the opening of CHM files from non-trusted locations.&amp;nbsp;&amp;nbsp;Specifically, when attempting to open a CHM by clicking a link from a website, the file is downloaded to your computer's local Internet cache.&amp;nbsp;&amp;nbsp;Although this file location is local to your machine, the directory is designated as Internet zone which is not by default an "Trusted" zone.&amp;nbsp;&amp;nbsp;By default, only the Local Machine (URL Security Zone 0) is trusted and therefore only CHM files downloaded and saved on the machine's local hard disks are accessible.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Workaround: Changing your max allowed zone&lt;/h3&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;MaxAllowedZone&lt;/th&gt;&lt;th&gt;URL Security Zones Allowed&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0&lt;/td&gt;&lt;td&gt;Local Machine zone: Content that exists on the local computer.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;1&lt;/td&gt;&lt;td&gt;Local Intranet zone: Content located on an organizations local intranet.&amp;nbsp;&amp;nbsp;Also includes local machine zone.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;2&lt;/td&gt;&lt;td&gt;Trusted Sites zone: Content located on web sites that are considered more reputable or trustworthy than other sites on the Internet. The user designated these sites manually by adding the URLs of these trusted Web sites to this zone.&amp;nbsp;&amp;nbsp;Also includes local machine and intranet zone.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;3&lt;/td&gt;&lt;td&gt;Internet zone: Content located on web sites that are not designated as either trusted sites or restricted sites.&amp;nbsp;&amp;nbsp;Also includes zones 0 through 2.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;4&lt;/td&gt;&lt;td&gt;Restricted sites zone: Content located on web sites that are considered less reputable or trustworthy than other sites on the Internet.&amp;nbsp;&amp;nbsp;The user designates these sites manually by adding the URLs of these distrusted sites to this zone.&amp;nbsp;&amp;nbsp;Also includes all other zones.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;You can perform a registry edit to enable zones beyond the local machine zone.&amp;nbsp;&amp;nbsp;Copy this code below into a text editor and save as EnableCHM.reg; right-clicking and selecting Merge will merge these changes to the registry, enabling the running of .chm files opened from the Internet zone:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;REGEDIT4&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTMLHelp]&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTMLHelp\1.x\ItssRestrictions]&lt;br /&gt;"MaxAllowedZone"=dword:00000003&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The will enable the running of .chm files from any site on the Internet except those listed within your computer's restricted sites.&amp;nbsp;&amp;nbsp;Copy the code below into a text editor and save as DisableChm.reg; right-clicking and selecting Merge will disable the running .chm files, except when opened from the local system, which is the most restrictive setting possible:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;REGEDIT4&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTMLHelp]&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTMLHelp\1.x\ItssRestrictions]&lt;br /&gt;"MaxAllowedZone"=dword:00000000&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note&lt;/b&gt;: IT personnel should be consulted before making registry changes.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Workaround: Running the CHM from the local machine&lt;/h3&gt;Choose to right-click and save the CHM file to your computer.&lt;br /&gt;&lt;br /&gt;If the file doesn't open from your local machine, it may still have a flag incidicating that the file originated from another computer.&lt;br /&gt;&lt;br /&gt;1. Right-click and open the Properties of the CHM file. &lt;br /&gt;2. Click 'Unblock' at the bottom of the Properties Dialog window. &lt;br /&gt;3. Retry opening the file.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200218/Error-while-using-online-help-books-Navigation-to-the-webpage-was-canceled</link><pubDate>5/11/2011</pubDate></item><item><title>How to assign a Processor Core for an ATEasy thread or process - Published on 4/7/2011</title><description>As multi core processors become more prevalent, software developers can take advantage of the additional performance benefits by writing code that implement multiple threads to accomplish tasks in parallel. ATEasy fully supports multithreading technology and provides a set of API functions that easily allow a user to create, terminate and manage threads.&lt;br /&gt;&lt;br /&gt;This article describes two such API function that can be defined in your ATEasy application from the Windows API to manage the processor affinity property of a thread or process. Setting the processor affinity will lock a thread or process into using a particular CPU Core, bypassing the Windows scheduler.&lt;br /&gt;&lt;br /&gt;The following describe the function prototypes:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;BOOL WINAPI SetProcessAffinityMask( __in&amp;nbsp;&amp;nbsp;HANDLE hProcess, __in&amp;nbsp;&amp;nbsp;DWORD_PTR dwProcessAffinityMask)&lt;br /&gt;&lt;br /&gt;DWORD_PTR WINAPI SetThreadAffinityMask(__in&amp;nbsp;&amp;nbsp;HANDLE hThread, __in&amp;nbsp;&amp;nbsp;DWORD_PTR dwThreadAffinityMask)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;These functions are defined in kernel32.dll. In order to use them in ATEasy, kernel32.dll library must be inserted into an ATEasy Program, System, or Driver and the above functions defined.&lt;br /&gt;&lt;br /&gt;For each function, the first parameter can be defined as Val AHandle and the second parameter can be defined as Val DWord in ATEasy. The return type can be defined as DWORD.&lt;br /&gt;&lt;br /&gt;Pass -1 to the&amp;nbsp;&amp;nbsp;&lt;b&gt;hProcess &lt;/b&gt; parameter to configure the main ATEasy process.&lt;br /&gt;&lt;br /&gt;Pass the return value from the ATEasy functions &lt;b&gt;CreateThread&lt;/b&gt; or &lt;b&gt;GetCurrentThread&lt;/b&gt; to &lt;b&gt;hThread&lt;/b&gt; to configure a specific thread. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;dwProcessAffinityMask&lt;/b&gt; and &lt;b&gt;dwThreadAffinityMask&lt;/b&gt; are bit-wise masks that indicate which core will be selected.&lt;br /&gt;&lt;br /&gt;More information can be found at the following links:&lt;br /&gt;&lt;a href='http://msdn.microsoft.com/en-us/library/ms686223(v=VS.85).aspx ' target='_blank'&gt;SetProcessAffinityMask&lt;/a&gt;&lt;br /&gt;&lt;a href='http://msdn.microsoft.com/en-us/library/ms686247(VS.85).aspx. ' target='_blank'&gt;SetThreadAffinityMask&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200214/How-to-assign-a-Processor-Core-for-an-ATEasy-thread-or-process</link><pubDate>4/7/2011</pubDate></item><item><title>Guidelines for designing a custom GX3500 expansion board - Published on 12/16/2010</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;A unique feature of the GX3500 FPGA card is that it can accommodate an expansion card assembly that can be used to customize the interface to the UUT.&amp;nbsp;&amp;nbsp;This eliminates cumbersome and physically difficult to integrate external boards from the test system.&lt;br /&gt;&lt;br /&gt;The custom expansion interface is contained on a mezzanine board that sits piggyback on the GX3500 FPGA PCB (figure 1).&amp;nbsp;&amp;nbsp;The expansion board provides approximately 105 cm&lt;sup&gt;2&lt;/sup&gt; on each the front and back sides (figure 2), and obtains power from the GX3500.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200212\Assembled GX3500_1.JPG" alt="Disassembled GX3500 and Expansion Mezzanine" title="Disassembled GX3500 and Expansion Mezzanine" border='0' &gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200212\Assembled GX3500_2.JPG" alt="Assembled GX3500 and Expansion Mezzanine" title="Assembled GX3500 and Expansion Mezzanine" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 1:&amp;nbsp;&amp;nbsp;GX3500 with Expansion Board&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200212\Board Area.jpg" alt="GX3500 Expansion Board design area" title="GX3500 Expansion Board design area" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 2:&amp;nbsp;&amp;nbsp;GX3500 Expansion Board Design Area&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Software controlled relays control whether the 160 FPGA signals are routed directly to the GX3500 front panel connectors, or whether the I/O signals are intercepted from the FPGA and routed through the expansion board.&amp;nbsp;&amp;nbsp;The relays can be controlled using the API function &lt;b&gt;GxFpgaSetExpansionBoardBypass()&lt;/b&gt;, or using the GX3500 Soft Panel (figure 3).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200212\Expansion Bypass.JPG" alt="Expansion board bypass control" title="Expansion board bypass control" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 3:&amp;nbsp;&amp;nbsp;Expansion Board Bypass Control&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;High Speed Terminal Strips, manufactured by Samtec, are use to provide power to the expansion board, and bring the signals on and off the board (figure 4).&amp;nbsp;&amp;nbsp;The middle bar of the connector is used for ground and power connections to the expansion board, while the outer pins provide access to the I/O signals (figure 5).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200212\Mezzanine.JPG" alt="Expansion connectors" title="Expansion connectors" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 4:&amp;nbsp;&amp;nbsp;Expansion Connectors&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200212\Expansion Power.JPG" alt="Power connections" title="Power connections" border='0' &gt;&lt;br /&gt;&lt;b&gt;Figure 5:&amp;nbsp;&amp;nbsp;Power Connections&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Design Guidelines&lt;/h3&gt;When designing an expansion interface for the GX3500, consideration must be given to the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Board Area:&lt;/b&gt;&amp;nbsp;&amp;nbsp;Maximum board surface area is about 200 cm&lt;sup&gt;2&lt;/sup&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Component Height:&lt;/b&gt;&amp;nbsp;&amp;nbsp;Maximum component height is 8mm, with some areas on the board reduced to a maximum component height of 5mm.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Power Requirements:&lt;/b&gt;&amp;nbsp;&amp;nbsp;The GX3500 expansion connectors provide multiple power voltages to the expansion board.&amp;nbsp;&amp;nbsp;Provide adequate decoupling and filter capacitors and do not exceed the maximum power budget for the voltages:&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;5V, 4.0A&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;+12V, 0.5A&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;-12V, 0.5A&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;1.2V, 1.0A&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;2.5V, 0.5A&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;3.3V, 4.0A&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Cooling:&lt;/b&gt;&amp;nbsp;&amp;nbsp;Make certain the air flow is not blocked to higher power components.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Termination:&lt;/b&gt;&amp;nbsp;&amp;nbsp;Provide proper trace impedance and, if necessary, termination for high-speed signals and signals with fast edge rates.&lt;/li&gt;&lt;/ul&gt;A full GX3500 Expansion Board Design Guide is included in the &lt;a href='http://www.geotestinc.com/GetFile.aspx?fileid=401&amp;type=Manual&amp;refpage=..%2fProduct.aspx%3fmodel%3dGX3500' target='_blank'&gt;GX3500 User Guide&lt;/a&gt;.</description><link>https://www.MarvinTest.com/KB/Q200212/Guidelines-for-designing-a-custom-GX3500-expansion-board</link><pubDate>12/16/2010</pubDate></item><item><title>White Paper: An FPGA–Based Solution for Testing Legacy Video Displays - Published on 11/30/2010</title><description>Systems deployed in the last century used CRT monitors to display information to a technician or operator.&amp;nbsp;&amp;nbsp;These monitors were based on analog video transmission standards such RS170, NTSC (National Television Standards Council), PAL (Phase Alternating Line) and other similar standards.&amp;nbsp;&amp;nbsp;Today, with the widespread use of DVI and HDMI digital video, it is rare to find CRT monitors in commercial use.&amp;nbsp;&amp;nbsp;But they are still widely used in older deployed systems.&amp;nbsp;&amp;nbsp;&lt;br /&gt;This paper is a case study based on the requirement for a PXI-based instrument that can generate simple color bar signals in NTSC and PAL formats to support the Mini-Samson/Katlanit Remote Controlled Weapon Station.&amp;nbsp;&amp;nbsp;By integrating an off-the-shelf PXI FPGA card (&lt;a href='http://www.geotestinc.com/Product.aspx?model=GX3500' target='_blank'&gt;GX3500&lt;/a&gt;), with an intellectual property (IP) core available in the public domain and a handful of commercially available support components, a cost effective solution was developed which supports the generation of both analog and digital video signals for testing CRT and LCD monitors.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2010\PXI-FPGA-video-paper_11-18.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the white paper&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200209/White-Paper-An-FPGA-Based-Solution-for-Testing-Legacy-Video-Displays</link><pubDate>11/30/2010</pubDate></item><item><title>Using Simple Network Management Protocol (SNMP) in ATEasy 8.0 - Published on 11/22/2010</title><description>SNMP (Simple Network Management Protocol) is a networking protocol used to monitor and control network-attached devices such as adapters, routers, switches, workstations, and servers.&amp;nbsp;&amp;nbsp;To use SNMP to communicate with a device, the device must both support SNMP and have SNMP enabled.&amp;nbsp;&amp;nbsp;The primary functions that can be performed through SNMP are device identification, device property querying and device configuration.&amp;nbsp;&amp;nbsp;Since SNMP can be integrated with ATEasy, a technician using ATEasy can automate the testing of SNMP-enabled devices.&lt;br /&gt;&lt;br /&gt;In this guide, we will discuss two ways to utilize SNMP within ATEasy:&lt;ul&gt;&lt;li&gt;Using 3rd party software&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Using the WinSNMP API with the ATEasy SNMP.drv driver&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Using 3rd party software&lt;/h3&gt;There are a few open-source SNMP Managers available to utilize for basic testing.&amp;nbsp;&amp;nbsp;This example will demonstrate using Net-SNMP.&amp;nbsp;&amp;nbsp;When installed, &lt;a href='http://www.net-snmp.org' target='_blank'&gt;Net-SNMP&lt;/a&gt; adds command-line executables such as the SNMPGET, SNMPGETNEXT, and SNMPSET functions for OID querying, SNMPWALK for device location, and SNMPSTATUS and SNMPNETSTAT for device status information.&amp;nbsp;&amp;nbsp;Only a couple of these features will be used in the article for demonstration.&amp;nbsp;&amp;nbsp;The complete list of features is available on the Net-SNMP webpage.&lt;br /&gt;&lt;br /&gt;The example below demonstrates calling the executable SNMPGet to query an OID for information and saving the results to a text file.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure SNMPGet(): Void&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sAgent: String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sSaveFile: String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sOID: String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sCommunity: String&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sCommunity = "public"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sAgent = "127.0.0.1" ! Local Host&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Object Identifier Descriptor for the device we're talking with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sOID = "sysDescr.0"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sSaveFile = "snmpgetresults.txt"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Calls device SNMP and saves results to text file&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WinExec("SNMPGET -v 1 -c " + sCommunity + " " + sAgent + " " + sOID + " &gt; " \ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+ sSaveFile)	&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! display results&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WinExec("notepad " + sSaveFile) ! Opens text file for viewing the SNMPGET results&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In the first WinExec command an OID, sysDescr.0, is requested from the local host and saved into "snmpgetresults.txt".&amp;nbsp;&amp;nbsp;The second WinExec command opens that file so the data can be viewed.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200199/snmpgetresults.JPG" alt="Results of SNMPGET: The string information stored at sysDescr.0 on the agent at 127.0.0.1" title="Results of SNMPGET: The string information stored at sysDescr.0 on the agent at 127.0.0.1" border='0' &gt;&lt;br /&gt;&lt;br /&gt;The SNMPGet procedure can be modified to use the other Net-SNMP features, such as SNMPNETSTAT which gives us the assignment of an agent's TCP and UDP ports.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200199/snmpnetstatresults.JPG" alt="Results of SNMPNETSTAT: The first few open TCP ports and their remote hosts." title="Results of SNMPNETSTAT: The first few open TCP ports and their remote hosts." border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Using the ATEasy v8.0 WinSNMP Driver&lt;/h3&gt;Another way to communicate with a target agent using SNMP protocol is to directly access the WinSNMP API provided with Microsoft Windows. The implementation is simplified through use of the WinSNMP ATEasy driver, which is available in ATEasy v8.0 and above. The driver also lists the procedure to install and configure the WinSNMP service required when using the Windows driver.&lt;br /&gt;&lt;br /&gt;In the ATEasy implementation of WinSNMP, an SNMPGET call can request and retrieve the value of an Object Identifier in a single command, as shown here:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;! Request the System Contact from the agent&lt;br /&gt;TestResult = SNMP Function Get("1.3.6.1.2.1.1.5.0")&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;With the ATEasy Driver included in the project, the preceding line of code acquires the System Contact octet string and assigns it back to the TestResult variable for use in ATEasy.&lt;br /&gt;&lt;br /&gt;Similarly, the included function "SNMP Function Walk(...)" can be used to traverse a system and returns back all of the nodes between the start and stop OID specified.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt; !Return the data stored at all OIDs between 1.3.6.1.2.1 and 1.3.6.1.2.1.6.0&lt;br /&gt;TestResult = SNMP Function Walk("1.3.6.1.2.1", "1.3.6.1.2.1.1.6.0")&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Example results of an SNMP Walk:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;1.3.6.1.2.1 = NULL: 0&lt;br /&gt;1.3.6.1.2.1.1.1.0 = STRING: Hardware: x86 Family 15 Model 4 Stepping 7 AT/AT COMPATIBLE&lt;br /&gt;1.3.6.1.2.1.1.3.0 = TIMETICKS: 52335668&lt;br /&gt;1.3.6.1.2.1.1.4.0 = STRING: Victor Brode&lt;br /&gt;1.3.6.1.2.1.1.6.0 = STRING: My CTS box&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;This demonstration of features just barely scratches the surface of the utility that SNMP provides.&amp;nbsp;&amp;nbsp;A complete listing of the WinSNMP ATEasy driver is available in ATEasy v8.0 and above.&amp;nbsp;&amp;nbsp;Hopefully, if your project is required to automate SNMP communication, this article has given you a good idea where to start.</description><link>https://www.MarvinTest.com/KB/Q200199/Using-Simple-Network-Management-Protocol-SNMP-in-ATEasy-8-0</link><pubDate>11/22/2010</pubDate></item><item><title>White Paper: Implementing a High Performance Digital Subsystem Using the PXI Architecture - Published on 10/14/2010</title><description>&lt;b&gt;Abstract&lt;/b&gt;&lt;br /&gt;High Performance digital subsystems have been developed over the years using a variety of proprietary and industry standard architectures such as GPIB and VXI. With the availability of high performance / high density FPGAs and analog electronics, the implementation of high performance digital functional test subsystems has now become a reality using the PXI architecture. The smaller form factor of PXI, which offers users the ability to down size and deploy very cost effective, performance digital subsystems, has also presented some unique challenges for instrument design teams developing these high performance digital subsystems. This paper discusses some major considerations and challenges when implementing high performance digital instrumentation based on the PXI architecture.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers/2010/PXI-Digital-Subsystems.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200204/White-Paper-Implementing-a-High-Performance-Digital-Subsystem-Using-the-PXI-Architecture</link><pubDate>10/14/2010</pubDate></item><item><title>Activating the Multi-User Features of ATEasy's Test Executive - Published on 9/27/2010</title><description>The Test Executive driver included with ATEasy provides a multi-user environment. Within, a user with administrator rights can create user groups and user accounts. User group such as&amp;nbsp;&amp;nbsp;&lt;b&gt;Testers&lt;/b&gt;, &lt;b&gt;Supervisors&lt;/b&gt;, &lt;b&gt;Administrators &lt;/b&gt;can be assigned a customized set of command menus, toolbars, options and different levels of privileges.&amp;nbsp;&amp;nbsp;This article with cover activating these features and configuring user groups within the test executive.&lt;br /&gt;&lt;br /&gt;The TestExec.drv ATEasy software driver includes integrated support for multi-user features which are turned off by default.&amp;nbsp;&amp;nbsp;To activate these features, you only need to enter the location of your users file (.USR) into the TestExec Driver Shortcut parameters page.&amp;nbsp;&amp;nbsp;The parameter &lt;b&gt;UsersFile&lt;/b&gt;, which is empty by default, can be changed to the absolute or relative location of a file i.e. 'C:\Windows\System32\Ateasy.usr'&lt;br /&gt;&lt;br /&gt;Ideally, a Users file would be located on a network drive where it would be accessible by all of the ATEasy developers and testers within an organization, but write access could be controlled and given to project administrators.&amp;nbsp;&amp;nbsp;For the purposes of this demo, which can be done locally, it is sufficient to use a user file that is stored locally.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200201\TestExec_DriverShortcutParameters.PNG" alt="This TestExec Driver Shortcut already has the UserFile parameter set.&amp;nbsp;&amp;nbsp;Multi-user features are enabled." title="This TestExec Driver Shortcut already has the UserFile parameter set.&amp;nbsp;&amp;nbsp;Multi-user features are enabled." border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Configuring the user groups within your Test Executive&lt;/h3&gt;Now that the multi-user features have been enabled, you will be prompted with a User Login Dialog when you attempt to start your program.&amp;nbsp;&amp;nbsp;If you are using the multi-user features for the first time, you will need to log in with one of the user file's administrator accounts to configure each user's privileges.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200201\FirstTimeTestExec_NotAdminMsg.PNG" alt="This is the error you will encounter as you try to log in for the first time as a non-administrator." title="This is the error you will encounter as you try to log in for the first time as a non-administrator." border='0' &gt;&lt;br /&gt;&lt;br /&gt;To begin configuring your user groups, log in as an administrator.&amp;nbsp;&amp;nbsp;If you are using the user file located at 'C:\Windows\System32\Ateasy.usr' and you have never changed the password on this file, the default administrator account user name is &lt;b&gt;Administrator&lt;/b&gt;.&amp;nbsp;&amp;nbsp;Leave the password blank and hit &lt;b&gt;OK &lt;/b&gt;to log in.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200201\ATEasyLogin_DefaultAdmin.PNG" alt="The ATEasy Login Dialog with Administrator username included." title="The ATEasy Login Dialog with Administrator username included." border='0' &gt;&lt;br /&gt;&lt;br /&gt;Once logged in as Administrator with multi-user features enabled, you should have a new menu bar item: &lt;b&gt;Tools | Users...&lt;/b&gt;&lt;br /&gt;This is your portal for configuring users groups.&amp;nbsp;&amp;nbsp;Clicking this item will allow you access the Test Executive's &lt;b&gt;Users Dialog&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200201\TestExec_ToolsUsersAdmin.PNG" alt="A new menu item!" title="A new menu item!" border='0' &gt;&lt;br /&gt;&lt;br /&gt;The Users Dialog is where access levels, UI configuration, and Test Executive customization is handled in multi-user mode.&amp;nbsp;&amp;nbsp;Layouts and privileges are differentiated for your users. The User Dialog window has eight pages, all of which are documented in the Test Executive help.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Users Dialog: Groups Page&lt;/h3&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200201\UsersDialog_GroupsPage.PNG" alt="The Groups page is where new User Groups can be created/modified/deleted" title="The Groups page is where new User Groups can be created/modified/deleted" border='0' &gt;&lt;br /&gt;&lt;br /&gt;By default, you are provided with three User Groups with which to organize your ATEasy users.&amp;nbsp;&amp;nbsp;When the Test Executive activates a User file for the first time, it will automatically create three default user groups with their own set of command menus, toolbars, and options.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Administrators &lt;/b&gt;- Has all of the functions available in a Test Executive that is not using the multi-user feature.&amp;nbsp;&amp;nbsp;Also has ability to configure the user file from within the Test Executive.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Supervisors &lt;/b&gt;- Same rights and default layout as the Administrator account, but does not have the ability to access the Users dialog.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Testers &lt;/b&gt;-&amp;nbsp;&amp;nbsp;This user group was designed to allow selection of program / profile, execution of that selection and test log archiving.&lt;br /&gt;&lt;br /&gt;Each individual user must be placed into one of these User Groups before they can access the Test Executive.&amp;nbsp;&amp;nbsp;Alternatively, a custom User Group can be created and assigned to a user.&amp;nbsp;&amp;nbsp;The Groups page is where user groups can be created / modified / deleted.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Users Dialog: Users Page&lt;/h3&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200201\UsersDialog_UsersPage.PNG" alt="The Users Page allows the creation of new users and assignment into user groups." title="The Users Page allows the creation of new users and assignment into user groups." border='0' &gt;&lt;br /&gt;&lt;br /&gt;The Users Page allows the administrator to see all of the users associated with the current USR file.&amp;nbsp;&amp;nbsp;Users can be added and deleted here, passwords can be changed, and users can be assigned to user groups.&amp;nbsp;&amp;nbsp;Also, one user can be selected as a default user, allowing automatic login when the test program is started.&amp;nbsp;&amp;nbsp;The default user account can not have a password, however.&lt;br /&gt;&lt;br /&gt;The rest of the pages in the Users Dialog deal with configuring each user groups layout.&amp;nbsp;&amp;nbsp;The details of these pages are covered in the Test Executive help under the keywords "Users Dialog".&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Example&lt;/h3&gt;The following example will demonstrate using the administrator account to configure the layout of the tester account.&amp;nbsp;&amp;nbsp;The tester account, by default, has only Continuous and Task By Task run conditions available.&amp;nbsp;&amp;nbsp;We will be adding the Test By Test mode.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Start an ATEasy project and include the TestExec software driver.&amp;nbsp;&amp;nbsp;Make sure the &lt;b&gt;UsersFile &lt;/b&gt;parameter is set to the ATEasy.usr file in your Window's System folder.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Log in to the project as an &lt;b&gt;Administrator&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Open the Users Dialog (&lt;b&gt;Tools | Users...&lt;/b&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click the &lt;b&gt;Toolbar tab&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click the drop-down box labeled Group: and change the active user group to &lt;b&gt;Testers&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;In the available commands box, click the plus icon by &lt;b&gt;Conditions...&lt;/b&gt; to expand the list.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Locate and click on the item &lt;b&gt;Test By Test&lt;/b&gt;.&amp;nbsp;&amp;nbsp;Click it and click the &lt;b&gt;Add -&gt;&lt;/b&gt; button to add the item to the active toolbar for Testers.&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200201\UsersDialog_AddingToolbar.png" alt="Clicking Add will add the Test by Test option to the Testers user group." title="Clicking Add will add the Test by Test option to the Testers user group." border='0' &gt;&lt;br /&gt;&lt;br /&gt;We have added the button to the toolbar, but it is not enabled yet. &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Click the Commands tab.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click the drop-down box labeled &lt;b&gt;User Group:&lt;/b&gt; and change the active user group to &lt;b&gt;Testers&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;In the available commands box, click the plus icon by &lt;b&gt;Conditions...&lt;/b&gt; to expand the list.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click the item &lt;b&gt;Test By Test&lt;/b&gt; and click the Enable checkbox to enable this item.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Click &lt;b&gt;OK&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200201\UsersDialog_EnablingTestByTest.png" alt="A screenshot taken after the Test By Test option has been enabled for the Tester user group." title="A screenshot taken after the Test By Test option has been enabled for the Tester user group." border='0' &gt;&lt;br /&gt;&lt;br /&gt;If you use&lt;b&gt; Tools | Change User... &lt;/b&gt;to log into your Tester account, you will notice that the&lt;b&gt; Task By Task &lt;/b&gt;option has been added to the toolbar.&amp;nbsp;&amp;nbsp;In this manner, other items can be added and removed from the ToolBar.&amp;nbsp;&amp;nbsp;The process is very similar for menu items as well.</description><link>https://www.MarvinTest.com/KB/Q200201/Activating-the-Multi-User-Features-of-ATEasy-s-Test-Executive</link><pubDate>9/27/2010</pubDate></item><item><title>Executing and communicating with Perl or TCL scripts from ATEasy v8.0 using the Standard I/O Process Driver - Published on 8/12/2010</title><description>ATEasy v8.0 supports calling, controlling and communicating with Windows console applications. This allows test engineers leverage existing script code written in languages such as &lt;b&gt;TCL&lt;/b&gt;, &lt;b&gt;Perl&lt;/b&gt;, &lt;b&gt;PHP&lt;/b&gt; and use the script from their tests. &lt;br /&gt;&lt;br /&gt;This article describes the simple process involved in calling a TCL and Perl script from ATEasy. The example code involves with using the ATEasy Standard I/O Process Driver &lt;b&gt;StdIoProcess.drv&lt;/b&gt;. The example scripts will wait for ATEasy to send data via the standard I/O and then will respond by echoing this data back to ATEasy. Similar techniques can be used to control any Windows command line utilities.&lt;br /&gt;&lt;br /&gt;The ATEasy StdIoProcess driver allows a user to call console based executable, pass arguments,monitor the process’s standard output and send data to the process via its standard input. &lt;br /&gt;&lt;br /&gt;Note that the following software components are required to get started:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Microsoft .NET Framework&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Installation of an script interpreter&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A script interpreter executable that can take the filename of the script to be run from its first command line argument.&lt;/li&gt;&lt;/ul&gt;The first example calls a TCL script. This example is using the &lt;a href='http://www.activestate.com/activetcl/' target='_blank'&gt;ActiveTCL&lt;/a&gt; interpreter which was installed in the C:\tcl folder.&amp;nbsp;&amp;nbsp;The script will accept two numeric values and output the sum of those two values:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;br /&gt;puts "TCL Script Started"&lt;br /&gt;gets stdin x&lt;br /&gt;gets stdin y&lt;br /&gt;set result "The Sum is: "&lt;br /&gt;append result [expr $x+$y]&lt;br /&gt;puts $result&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Here is the ATEasy code using the StdIoProcess driver. ATEasy pass in two numbers 4 and 5 and read back the result as calculated by the RCL script:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;br /&gt;sTclPath="C:\\tcl\\bin\\tclsh85.exe"&lt;br /&gt;StdIoProcess Execute(sTclPath, "\""+sExamplePath+"StdIoProcessAdd.tcl\"", "4\r\n5\r\n", True)&lt;br /&gt;s=StdIOProcess Get StdOutput()&lt;br /&gt;if StdIOProcess Get ExitCode()&lt;&gt;0&lt;br /&gt;	TestStatus=FAIL&lt;br /&gt;endif&lt;br /&gt;if val(right(s, 3))&lt;&gt;9&lt;br /&gt;	TestStatus=FAIL&lt;br /&gt;endif&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Similar to the TCL interpreter, the Perl interpreter installed from &lt;a href='http://www.strawberryperl.com' target='_blank'&gt;Strawberry Perl&lt;/a&gt; can be used. In the following example we run StdIoProcessAdd.pl, passing two numbers 45 and 9 and getting back the sum as shown here:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;br /&gt;! add two numbers using PERL&lt;br /&gt;StdIoProcess Execute(sPerlPath, "\""+sExamplePath+"StdIoProcessAdd.pl\"", , False)&lt;br /&gt;StdIoProcess Write("45")&lt;br /&gt;StdIoProcess Write("9")&lt;br /&gt;StdIoProcess Read(s, True)&lt;br /&gt;TestResult=val(s)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The contents of the perl script TestScript.pl is the following:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;br /&gt;print "Perl Script Started";&lt;br /&gt;$x =&amp;nbsp;&amp;nbsp;&lt;STDIN&gt;;&lt;br /&gt;$y =&amp;nbsp;&amp;nbsp;&lt;STDIN&gt;;&lt;br /&gt;print $x+$y;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The referenced files are included in ATEasy v8.0 and above (see StdIoProcess.prj example). The example also contains example of executing the Windows command prompt (CMD.EXE). Here is the ATEasy form that is provided with the example:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/q200200\q200200-ScriptExample.jpg" alt="TCL Scripting using StdIoProcess" title="TCL Scripting using StdIoProcess" border='0' &gt;&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200200/Executing-and-communicating-with-Perl-or-TCL-scripts-from-ATEasy-v8-0-using-the-Standard-I-O-Process-Driver</link><pubDate>8/12/2010</pubDate></item><item><title>Importing non-standard Function Panel (.fp) drivers into ATEasy - Published on 7/8/2010</title><description>&lt;h3&gt;Introduction&lt;/h3&gt;ATEasy allow you to use VXI Plug&amp;Play drivers (sometimes refer to as&amp;nbsp;&amp;nbsp;IVI-C driver) created by instrument vendors. These instrument drivers support various interface types such as GPIB, VXI , Serial, PXI, USB, LXI or PCI based board and more. The function panel driver (FP) has a .fp file extension and can be imported to ATEasy using the Insert, Import FP File (*.fp) command. Once the driver is imported you will need to save it to ATEasy driver (.drv or .drt file). The process of importing the FP driver is described in the ATEasy on-line help (see "Using VXI Plug&amp;Play Function Panel Drivers" topic).&lt;br /&gt;&lt;br /&gt;You can obtain and download a Function Panel driver from the instrument manufacturer web site. Most vendors also register their driver at the IVI Foundation web site &lt;a href='http://www.ivifoundation.org/' target='_blank'&gt;IVI Foundation website&lt;/a&gt; under the Driver Registry section. Some vendor such as Agilent or National Instruments carry also third party instruments drivers. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Driver Prerequistes:&lt;/h3&gt;The IVI-C driver specification describe a standard for Initialize, and error handling functions which must exist in the FP driver. The ATEasy Import command will search for these functions and generate special ATEasy code to intialize and handle errors in the imported driver. The following functions are searched by the Import command:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Initialize function should have the following format:&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;b&gt;PREFIX_init(sResourceName, bIDQuery, bResetDevice, m_session)&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Error Message function should have the following format:&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;b&gt;PREFIX_error_message(m_session, lStatusCode, psMessage)&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;The prefix begins with a two-character vendor code, followed by characters that uniquely identify the instrument driver. The following is an example of the Initialize function for the Pickering System 40 PXI cards:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;pipx40_init(sResourceName, bIDQuery, bResetDevice, m_session)&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;Importing Non-Standard FP Drivers&lt;/h3&gt;The ATEasy Import Wizard will search the FP driver for the required Initialize and Error Message functions. If these functions do not exist in the FP driver, ATEasy will display messages listing the missing function(s) and ask the driver developer to select the appropiate function from the displayed FP function list (see example below).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200202\Q200202_UnableToFind.JPG" alt`=&amp;quot; border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Figure 1: "Unable to find Standard Function" message from the ATEasy Import Wizard&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If the appropiate function does not exist in the displayed listing, ATEasy will create a function wrapper with no source code so the developer can include the source code at a later time manually. The following are examples of the &lt;b&gt;Initialize &lt;/b&gt;and &lt;b&gt;CheckError &lt;/b&gt;functions after the ATEasy Import process, showing the required FP driver functions implementation:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;b&gt;Procedure Initialize(sResourceName, bIDQuery, bResetDevice) : Void&lt;/b&gt;&lt;br /&gt;! Create the following variables&lt;br /&gt;!&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sResourceName: [Val] ViRsrc&lt;br /&gt;!&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bIDQuery: [Val] ViBoolean = 0&amp;nbsp;&amp;nbsp;!Specifies if the card is to be queried&lt;br /&gt;!&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;to confirm it's ID when it is opened. This action is implicit in the&lt;br /&gt;!&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;driver's operation so the value of this control is ignored.&lt;br /&gt;!&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bResetDevice: [Val] ViBoolean = 0 ! Specifies if the card is to be reset&lt;br /&gt;!&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;when it is opened. This action is obligatory for all cards so the &lt;br /&gt;!&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value of this control is ignored.&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ArgMissing(sResourceName)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sResourceName=Driver.Parameters("ResourceName")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if sResourceName=""&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error -1001, "Unable to initialize.\nDriver Shortcut parameters must "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"be configured from its Misc property page"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; endif&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ArgMissing(bIDQuery)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bIDQuery=Driver.Parameters("IdQuery")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ArgMissing(bResetDevice)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bResetDevice=Driver.Parameters("ResetOnInit")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Required FP driver function is highlighted below&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CheckError(&lt;b&gt;pipx40_init(sResourceName, bIDQuery, bResetDevice, m_session) &lt;/b&gt;)&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;b&gt;Procedure CheckError(iStatus) : Void&lt;/b&gt;&lt;br /&gt;!&amp;nbsp;&amp;nbsp; Create the following variables:&lt;br /&gt;!&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iStatus: Val ViStatus&lt;br /&gt;!&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sError: String: 1024 &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_lLastError=iStatus&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if iStatus &lt;&gt; VI_SUCCESS then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! Required FP driver function is highlighted below&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;pipx40_error_message(m_session, iStatus, sError)&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; error iStatus, sError	! generate exception&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200202/Importing-non-standard-Function-Panel-fp-drivers-into-ATEasy</link><pubDate>7/8/2010</pubDate></item><item><title>White Paper: GX52xx - PXI Digital I/O Cards - Clock and Strobe Delay Operation - Published on 5/20/2010</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;The Gx528x and Gx529x dynamic Digital I/O (DIO) product families have very robust timing features that provide the user with the flexibility to align signals between the DIO and the Unit Under Test (UUT). The clock signal is used to output test vectors, and the strobe signal samples data into the DIO’s record memory. The basic architecture provides six coarse delays in 4 ns steps. In addition, a fine resolution delay (vernier) is available which provides a 0ns to 3ns delay in 250ps steps.&amp;nbsp;&amp;nbsp;Together, these elements provide delays in the range of 0ns to 27ns, with 250ps resolution. Read more...&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2010\GX52xx-ClockAndStrobeDelayOperation.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200198/White-Paper-GX52xx-PXI-Digital-I-O-Cards-Clock-and-Strobe-Delay-Operation</link><pubDate>5/20/2010</pubDate></item><item><title>How to call ATEasy procedures dynamically based on Test and Task names - Published on 5/19/2010</title><description>Sometimes it is useful to call a procedure with a function pointer. One example would be calling a unique procedure for each Test defined in a Program based on the Test and Task name of the current Test being executed. A procedure pointer can be used instead of hard coding a call to each procedure, thereby simplifying the code and allowing more tests to be added without code modification.&lt;br /&gt;&lt;br /&gt;The following steps should be followed:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create procedures for each test defined in the program. In this example, the procedure names must be the Task name followed with the underscore character, appended to the Test name follwed by “_Init”. This naming template can be changed by modifying the first line of code in step 3.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200193\TestTask.JPG" alt="IDE Integrated Development Environment" title="IDE Integrated Development Environment" border='0' &gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Define a variable in the &lt;b&gt;OnInitTest() &lt;/b&gt;event named proc of type Procedure. This will act as the function pointer.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Insert the following code in the &lt;b&gt;OnInitTest()&lt;/b&gt; event.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;proc=Task.Name+"_"+Test.Name+"_Init" !Assign the procedure pointer a procedure&lt;br /&gt;if(proc)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Check to make sure the procedure actually exists&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Execute procedure&lt;br /&gt;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "proc is not valid!"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !error handling code&lt;br /&gt;endif&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;</description><link>https://www.MarvinTest.com/KB/Q200193/How-to-call-ATEasy-procedures-dynamically-based-on-Test-and-Task-names</link><pubDate>5/19/2010</pubDate></item><item><title>White Paper: ATEasy - Deployment Across the Organization - Published on 5/19/2010</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;ATEasy’s modular structure lends itself to the distribution of ATEasy development activities among different skills sets, allowing organizations to better control the development and deployment of ATEasy. The modular structure promotes achieving of code reuse, better manageability and increased efficiency.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Because driver files, the test executive (which is an ATEasy driver as well), and the systems files can be reusable components between systems or shared by programs, they should be standardize to achieve better reusability.&amp;nbsp;&amp;nbsp;To achieve standardization, organizations should define and allocate specific job responsibilities to enforce and create a streamlined process of managing the development and deployment. By assigning personnel with responsibilities to the various aspects of ATEasy module development, organizations can achieve much higher efficiency and code reusability.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2010\ATEasy-DeploymentAcrossTheOrganization.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200197/White-Paper-ATEasy-Deployment-Across-the-Organization</link><pubDate>5/19/2010</pubDate></item><item><title>PXI Express Standard - Published on 4/30/2010</title><description>&lt;b&gt;What is PXI Express?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The PXI Express (PXI-5) standard was created by the &lt;a href='http://www.pxisa.org' target='_blank'&gt;PXI Systems Alliance&lt;/a&gt; to integrate PCI Express advances into the PXI standard to improve performance attainable in modular instrumentation and automation systems such as those utilized by automated test developers and technicians.&amp;nbsp;&amp;nbsp;The PXI-Express standard brings with it several improvements but still provides a high degree of compatibility with the PXI-1 standard and compatibility with industry-standard software and operating systems.&amp;nbsp;&amp;nbsp;For more information on the PXI-1 standard, please follow the link to this article: &lt;a href='http://www.geotestinc.com/KnowledgeBase/KBArticle.aspx?ID=189' target='_blank'&gt;What is PXI?&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Instead of a shared parallel bus, PXI Express uses multiple point-to-point serial connections (“lanes”) for instrument communication.&amp;nbsp;&amp;nbsp;Each lane consists of a pair of lines:&amp;nbsp;&amp;nbsp;one transmitting and one receiving, each able to transfer data independently allowing unimpeded bidirectional communication.&amp;nbsp;&amp;nbsp;A single-lane connection (‘x1’ or ‘by 1') has a bandwidth of 250 Mbytes/sec/direction.&amp;nbsp;&amp;nbsp;The lanes are assigned to the instruments by a matrix switch and can routed to provide one or more instruments with additional bandwidth.&amp;nbsp;&amp;nbsp;In this manner, devices with a higher bandwidth requirement can be allocated more resources.&amp;nbsp;&amp;nbsp; The PXI Express standard also incorporates a 100 MHz differential system clock that is phase-aligned with the existing 10 MHz PXI system clock and can work in conjunction with the 33MHz PCI system clock.&amp;nbsp;&amp;nbsp;Additional features include signaling to ensure that modules using system clocks or clock divisions are synchronized and point-to-point differential triggering.&amp;nbsp;&amp;nbsp;A PXI Express controller utilizes the same operating system and driver model as PXI.&amp;nbsp;&amp;nbsp;This ensures that the test designer can reuse existing code and software with the newer PXI Express system.&lt;br /&gt;&lt;br /&gt; &lt;img src="https://www.MarvinTest.com/images/support/Q200190\slots.JPG" alt="A Geotest PXI Express chassis’ slot layout." title="A Geotest PXI Express chassis’ slot layout." border='0' &gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Slots&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A PXI Express chassis can have five slot types:&lt;ul&gt;&lt;li&gt;&lt;b&gt;PXI Express System Slot&lt;/b&gt;: slot 1 shown above&lt;/li&gt;&lt;/ul&gt; &lt;ul&gt;&lt;li&gt;&lt;b&gt;PXI Express Peripheral Slot&lt;/b&gt;: slot 5 shown above&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;PXI Express System Timing Slot&lt;/b&gt;: slot 4 shown above&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;PXI Peripheral (PXI-1) Slot&lt;/b&gt;: slots 2 and 6 through 9 shown above&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;PXI Hybrid Slot&lt;/b&gt;: slot 3 shown above&lt;/li&gt;&lt;/ul&gt;The &lt;b&gt;PXI Express System Slot &lt;/b&gt;is the leftmost PXI slot, designated by a filled triangle labeled '1'.&amp;nbsp;&amp;nbsp;This slot will accept a system module in the form of an embedded controller or a PXI Express Bus Expander.&amp;nbsp;&amp;nbsp;An embedded controller is a single-board computer which comes with traditional components such as processor, memory, network and video cards, and I/O ports such as keyboard, mouse, and USB.&amp;nbsp;&amp;nbsp;A PXI Express Bus Expander kit allows remote control of the PXI Chassis and its hardware by another computer.&amp;nbsp;&amp;nbsp;The kit consists of a PXI-Express interface card which goes in the System Slot, a PCI-Express card which is installed into the desktop or plugged into the laptop, and an interface cable.&amp;nbsp;&amp;nbsp;If the System Module's functionality is integrated into the chassis and none is required, then the PXI System Slot will not be present on the chassis and the peripheral slot numbering will begin with '2'.&amp;nbsp;&amp;nbsp;Additionally, if a system module does not fit into a single slot, the PXI Express standard requires that the System Module expand to the left in slot-wide increments defined as controller expansion slots.&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;System Timing Slot &lt;/b&gt;is intended to be used by a PXI Express System Timing Module.&amp;nbsp;&amp;nbsp;A System Timing Module provides individual triggers to all other PXI Express Peripheral modules and allows replacement of the system reference clock.&amp;nbsp;&amp;nbsp;The System Timing Module replaces the Star Trigger Module as the timing and synchronization provider for the rest of the peripheral modules. The star trigger connection points defined in PXI-1 are still retained as well as the ability to replace the system reference clock with it's own, more accurate reference clock.&amp;nbsp;&amp;nbsp;If a system timing module is not required, the system timing slot can be used can by a PXI Express Peripheral.&lt;br /&gt;&lt;br /&gt;The PXI Express standard specifies that there may be slots that support PXI board as defined by the PXI Hardware Specification.&amp;nbsp;&amp;nbsp;These peripheral slots are referred to as PXI-1 slots.&amp;nbsp;&amp;nbsp;Communication with the controller is supported via an included, shared PCI bus.&lt;br /&gt;&lt;br /&gt;Finally, there are two hybrid slots that can be used with PXI Express instruments or with legacy PXI instruments that are hybrid slot compatible.&lt;br /&gt;&lt;br /&gt; &lt;img src="https://www.MarvinTest.com/images/support/Q200190\hybrid_slot_compatibility.JPG" alt="The hybrid slot can accept different types of instrument interfaces." title="The hybrid slot can accept different types of instrument interfaces." border='0' &gt;&lt;br /&gt;&lt;br /&gt;PXI-1 peripheral modules have a J1 and J2 interface to connect to the backplane.&amp;nbsp;&amp;nbsp;To make these instruments hybrid slot compatible, the card’s J2 interface must be removed and replaced with an XJ4 interface.&amp;nbsp;&amp;nbsp;The resulting interface is compatible with PXI Express chassis hybrid slots but will still work in traditional PXI-1 slots.&amp;nbsp;&amp;nbsp;Since removing the lower portion of the J2 interface will remove the access to the local bus, this modification should not be done on some instruments.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;img src="https://www.MarvinTest.com/images/support/Q200190\pxi1_to_hybrid_compatible.JPG" alt="Before and after making a card hybrid slot compatible." title="Before and after making a card hybrid slot compatible." border='0' &gt;</description><link>https://www.MarvinTest.com/KB/Q200190/PXI-Express-Standard</link><pubDate>4/30/2010</pubDate></item><item><title>What is PXI? - Published on 3/30/2010</title><description>&lt;h3&gt;The PXI Standard&lt;/h3&gt;The PXI standard is defined by the &lt;a href='http://www.pxisa.org' target='_blank'&gt;PXI Systems Alliance&lt;/a&gt; and was developed in response to the needs of test systems developers and users who required a new platform that is high-performance, functional, reliable, compact, yet easy to integrate and use. By leveraging off of the PCI, CompactPCI and VXI standards, PXI brings together the right technologies for PC-based test and measurement, instrumentation, and industrial automation. Further, since PXI is a PC-based platform, it maintains software compatibility with industry-standard personal computers, as well as all PC-based operating systems, software tools, and instrument drivers. Not only is PXI fully compatible with existing operating systems and software, it is fully compatible with the Virtual Instrument Software Architecture (VISA) standard that was created by the &lt;a href='http://www.vxi.org' target='_blank'&gt;VXIplug&amp;play Systems Alliance&lt;/a&gt;. VISA is used to locate PXI resources as well as communicate with PXI, serial interface, VXI, and GPIB peripheral modules and is supported by test development software packages such as ATEasy™, LabVIEW™, LabWindows/CVI™ and Agilent VEE™. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The PCI bus is a 33/66MHz 32/64bit bus that offers peak data transfer rates of 132 Mbytes/s (32-bit, 33MHz) and 528 Mbytes/s (64-bit, 66 MHz). PXI expands upon the PCI bus by using the rugged form factor of CPCI and then adding triggering, local buses and system clock capabilities. The result is a standard that incorporates all of the benefits of PCI and cPCI in an architecture that supports these standards’ mechanical, electrical and software features. Also because interoperability between CompactPCI and PXI is a feature of the PXI Standard, both instrument types can reside in the same PXI system without any conflict - offering users a broad selection of both 3U and 6U cPCI modules in addition to the PXI instrument offerings.&lt;br /&gt;&lt;br /&gt;PXI Express leverages the electrical features defined by the widely adopted PCI Express specification for data movement. All PXI Express modules comply with the CompactPCI Express specification, which combines the PCI Express electrical specification with rugged euro card mechanical packaging and high performance differential connectors. This allows measurement and automation Systems based on PXI Express to have a data throughput of up to 4 GBytes/sec in each direction. PXI Express also offers two-way interoperability with CompactPCI Express products. For more information on PXI Express go to the following article on the &lt;a href='http://http://www.geotestinc.com/KnowledgeBase/KBArticle.aspx?ID=190' target='_blank'&gt;PXI Express Standard&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PXI Instrument architecture:&lt;/h3&gt;PXI instruments are available in two form factors: 3U (100 by 160 mm, or 3.94 by 6.3 in.) and 6U (233.35 by 160 mm, or 9.19 by 6.3 in.). These two form factors are shown below.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200189\3U_6U Cards.JPG" alt="PXI 3U/6U Instrument Form Factors" title="PXI 3U/6U Instrument Form Factors" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;Figure 1: PXI 3U/6U Instrument Form Factors&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;3U PXI instruments have two rear connectors named J1 and J2. J1 is used to carry the 32-bit PCI local bus signals. J2 is used to carry the signals for 64-bit PCI transfers and the PXI signals for implementing the local bus, star trigger signals and trigger bus signals. These signals are described later in this article. Connectors J3/J4/and J5 are undefined for 6U PXI modules but may be used for special applications.&lt;br /&gt;6U system controller modules and system slots may use P3/J3, P4/J4, P5/J5 for rear I/O purposes. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; 3U instruments can reside in 6U slots when used with a 3U-to-6U Panel adapter similar to the Geotest &lt;a href='http://www.geotestinc.com/Product.aspx?model=GX97005' target='_blank'&gt;GX97005&lt;/a&gt; panel adapter shown below.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200189\3U_6U Adapter.JPG" alt="PXI 3U to 6U Panel Adapter (GX97005)" title="PXI 3U to 6U Panel Adapter (GX97005)" border='0' &gt;&lt;/div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;div align='center'&gt;Figure 2: Geotest &lt;a href='http://www.geotestinc.com/Product.aspx?model=GX97005' target='_blank'&gt;GX97005&lt;/a&gt; PXI 3U-to-6U Panel Adapter mounted on a 3U PXI/cPCI instrument&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PXI Hardware Architecture Overview&lt;/h3&gt;A PXI system consists of three main components:&lt;br /&gt;&amp;nbsp;&amp;nbsp;1) The chassis&lt;br /&gt;&amp;nbsp;&amp;nbsp;2) The system controller&lt;br /&gt;&amp;nbsp;&amp;nbsp;3) Peripheral instrumentation&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200189\3U PXI Chassis.JPG" alt="3U PXI Chassis (Geotest 3U GX7300 20-slot PXI Chassis)" title="3U PXI Chassis (Geotest 3U GX7300 20-slot PXI Chassis)" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;Figure 3: &lt;a href='http://www.geotestinc.com/Product.aspx?model=GX7300+Series' target='_blank'&gt;GX7300&lt;/a&gt; 20-slot 3U PXI chassis&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PXI Chassis and Backplane Information:&lt;/h3&gt;The main components of a PXI chassis are:&lt;br /&gt;&amp;nbsp;&amp;nbsp;1) The System Controller&lt;br /&gt;&amp;nbsp;&amp;nbsp;2) The Star Trigger Controller&lt;br /&gt;&amp;nbsp;&amp;nbsp;3) The Chassis Backplane&lt;br /&gt;&lt;br /&gt;Per the PXI Standard, the System controller will always reside in Slot 1 and the Star Trigger Controller, if required, is always located in Slot 2. The chassis backplane contains the PCI Bus, the Star Trigger Bus, a PXI Trigger Bus, PCI-PCI Bridge devices and the 10MHz System Reference Clock. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; In a typical 20-Slot PXI chassis layout, slot number 1 is dedicated for an embedded or remote controller. Slot 2 can be used by a PXI Star Trigger Controller or by a PXI/cPCI instrument. Slots 3 through 15 supports the PXI Star Trigger and Slots 16-20 accommodate PXI or cPCI instruments without the Star Trigger. &lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200189\PXI Chassis Components.JPG" alt="PXI Chassis architecture" title="PXI Chassis architecture" border='0' &gt; &lt;/div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;div align='center'&gt;Figure 4: PXI Chassis architecture&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200189\6U Chassis.JPG" alt="6U PXI Chassis (20-slot GX7000A PXI Chassis)" title="6U PXI Chassis (20-slot GX7000A PXI Chassis)" border='0' &gt;&lt;/div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;div align='center'&gt;Figure 5: &lt;a href='http://www.geotestinc.com/Product.aspx?model=GX7000A+Series' target='_blank'&gt; GX7000A&lt;/a&gt; 20-slot 6U PXI chassis&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;System Controllers&lt;/h3&gt;The System Controller is always located in the first slot on the left-hand side of the chassis and is available in two configurations: &lt;b&gt;Embedded controllers&lt;/b&gt; and &lt;b&gt;Remote Controller Interface Kits&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Embedded controllers&lt;/b&gt; are basically a PC on a card and can run on a number of different Operating Systems, for example Windows and Linux. As they remove the need for any external control they are ideal for portable applications and applications that require “single box” solutions. In cases where the embedded controller requires more than one slot the PXI Standard allows for additional controller expansion slots to the left of the controller slot. In this way instrument slots are not used by the controller.&lt;br /&gt;&lt;br /&gt;Embedded controllers come in two form factor, &lt;b&gt;Single slot controllers &lt;/b&gt;and&lt;b&gt; Multi-slot controllers&lt;/b&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Single-slot embedded controllers &lt;/b&gt;are one PXI slot wide and do not require any controller expansion slots. They support multiple peripherals and I/O interfaces through the controller’s front panel and the chassis rear I/O panel. Connection to the DVD-RW drive, hard drive and chassis rear I/O connectors is via the controller’s internal I/O interface. As some of these controller cards have a flash drive port option, where the flash-drive port is built onto the controller card, they can be operated from a flash-drive without the need for a hard drive. All Geotest embedded system controllers adhere to the PXI and cPCI specifications and are PICMG 2.0 Rev. 3.0 compliant.&lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200189\3U 6U Controllers.JPG" alt="3U/6U PXI Single-slot embedded controllers" title="3U/6U PXI Single-slot embedded controllers" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;Figure 6: &lt;a href='http://www.geotestinc.com/Product.aspx?model=GX7924' target='_blank'&gt;GX7924&lt;/a&gt; 6U and &lt;a href='http://www.geotestinc.com/Product.aspx?model=GX7934' target='_blank'&gt;GX7934&lt;/a&gt; 3U PXI Single-Slot Embedded Controllers&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Multi-slot embedded controllers &lt;/b&gt;operate the same as single-slot controllers but differ in that all the PC components, for example the hard-drive, are built onto the controller card and all the external connectors, for example Ethernet, USB, etc.., are available on the front faceplate. As these components and connectors require extra space, these controllers can occupy up to three slots (a system slot plus two controller expansion slots). &lt;/li&gt;&lt;/ul&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200189\Multi-slot Embedded Controller.JPG" alt="PXI Multi-slot embedded controller" title="PXI Multi-slot embedded controller" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;Figure 7: Typical Multi-Slot Embedded Controller&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Remote Controller&lt;/b&gt; Interface Kits (also referred to as Bus Expansion Kits) are used in cases where the user wants to control a slave PXI chassis using an external PC, laptop or a Master PXI chassis. The interface kit consists of a pair of cards, one that plugs into the PC/Laptop or the Master PXI Chassis and another that goes in the system slot of the slave PXI chassis. The cards are then linked via copper or fiber-optic cable. For more information on the various PXI bus expansion options please see the following article on &lt;a href='http://http://www.geotestinc.com/KnowledgeBase/KBArticle.aspx?ID=168' target='_blank'&gt;PXI Bus expander configurations&lt;/a&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200189\External PC Remote Controller.JPG" alt="Controlling a PXI Chassis using an external PC/Laptop" title="Controlling a PXI Chassis using an external PC/Laptop" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;Figure 8: External PC controlling a slave PXI chassis with a &lt;a href='http://www.geotestinc.com/Product.aspx?model=MXI-4+Series' target='_blank'&gt;MXI-4&lt;/a&gt; Remote Controller Kit&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200189\Master PXI chassis Remote Controller.JPG" alt="Master PXI chassis controlling a Slave PXI chassis" title="Master PXI chassis controlling a Slave PXI chassis" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;Figure 9: Master PXI chassis controlling a Slave PXI chassis&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Star Trigger Controller&lt;/h3&gt;The Star Trigger (ST) Controller, if required, will always reside in Slot 2. This slot has dedicated trigger lines that can be used to synchronize up to 13 Peripheral PXI instruments that reside in the 13 consecutive slots to the right of the controller. It does this by utilizing backplane traces that are of equal length, providing for a skew of less than 1nSec between slots. If a Star Trigger Controller is not required, any PXI or cPCI instrument can be used in this slot. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For example, in the Geotest GX73xx and GX70xx 20-slot chassis’s Slots 2 through 15 support the Star Trigger while slots 16 through 20 accommodate PXI or cPCI instruments without the Star Trigger.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PXI Bus Segments&lt;/b&gt;&lt;/h3&gt;The PXI Standard allows for up to eight slots per 33MHz segment (one system slot and seven peripheral slots). Multiple segments can be connected together using a PCI-PCI bridge device. The PCI-PCI bridge presents one PCI load on each of the bus segments that it links together.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A typical 20-slot PXI chassis is divided to three bus segments (see Figure 8 below), each connected by a PCI-PCI Bridge device. The left bus segment supports the System Slot, the Star Trigger Slot and 5 more peripheral slots (Slot 3 to 7). The second segment supports slots 8 to 13. The third segment supports slots 14 to 20. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PXI Local Bus&lt;/h3&gt;The PXI local bus is a daisy-chained bus connecting peripheral slots in the same bus segment. Each local bus consists of 13 user-defined lines that can be used to pass analog or digital signals between two adjacent modules or provide a high-speed side-band digital communication path that does not affect the PXI bandwidth. Local bus signals can support voltages from 0 to 42V DC and up to 200 mA DC current for any local bus line. The local bus lines for the leftmost peripheral slot of a PXI back plane (slot 2) are used for the star trigger facilities. Figure 8 schematically shows a complete PXI system including the local buses.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200189\PXI Local Bus.JPG" alt="PXI Local Bus Segments" title="PXI Local Bus Segments" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;Figure 10: PXI Local Bus Segments&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PXI Trigger Bus&lt;/h3&gt;The eight PXI bused trigger lines can be used in a variety of ways. For example, triggers can be used to synchronize the operation of several different PXI peripheral modules. In other applications, one module can control carefully timed sequences of operations performed by other modules in the system. Triggers may be passed from one module to another, allowing precisely timed responses to asynchronous external events that are being monitored or controlled. The number of triggers that a particular application requires varies with the complexity and number of events involved.&lt;br /&gt;The PXI trigger bus provides connectivity only within a single bus segment.which maintains the high performance characteristics of the trigger bus and allows the partitioning of instruments into logical groups as show in Figure 9. However, logical connections between bridge segment for the trigger bus are permitted, allowing communication between bridge segments. For example, all of Geotest’s PXI chassis can be configured programmatically to enable any of the trigger lines between adjacent segments as well as set direction.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200189\PXI Trigger Bus.JPG" alt="PXI Trigger Bus Segments" title="PXI Trigger Bus Segments" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;Figure 11: PXI Trigger Bus Segments&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;System Reference Clock&lt;/h3&gt;The PXI 10 MHz system clock (PXI_CLK10) is also part of the PXI standard. It resides on the PXI backplane and is distributed to all peripheral slots. This common reference clock can be used for synchronization of multiple instruments or as a time base reference for measurement instrumentation. In cases where a more accurate 10MHz reference is required, the PXI clock can be sourced via the Star Trigger module. If the presence of this Star Trigger clock is detected, circuitry on the PXI backplane will automatically disconnect the backplane reference and connect the 10 MHz system clock lines to the Star Trigger module’s 10 MHz reference. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PXI Chassis Power Supply specifications&lt;/h3&gt;The PXI Standard also specifies the minimum power supply requirements for each slot of the PXI chassis regardless of the number of slots or the instrument form factor (3U or 6U). The PXI chassis supplies +5VDC, +3.3VDC, +12VDC and -12VDC to each slot. Figure 12 below shows the minimum power requirements for each slot in the chassis.&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; All Geotest PXI chassis form factors meet and/or exceed these specifications.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200189\PXI Power Supply Specs.JPG" alt="PXI Chassis Minimum Power Supply Specifications" title="PXI Chassis Minimum Power Supply Specifications" border='0' &gt;&lt;/div&gt;&lt;br /&gt;&lt;div align='center'&gt;Figure 12: PXI Chassis Minimum Power Supply Specifications&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;The PXI specification provides a very well defined and robust architecture for building high performance functional test systems. With over 1500 modules available today and over 60 PXI suppliers, the user can select from a broad range of products and vendors. The standard is over 10 years old which offers further proof to the longevity and acceptance of PXI as the primary card modular standard for the test and measurement industry. &lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200189/What-is-PXI</link><pubDate>3/30/2010</pubDate></item><item><title>ATEasy Forms Z-Order and Tab Order - Published on 3/18/2010</title><description>ATEasy forms consist of controls such as Buttons, Text Boxes, and Charts (&lt;b&gt;AForm.Controls &lt;/b&gt;property).&amp;nbsp;&amp;nbsp;Each individual control is a distinct object created at design time (also at run-time)&amp;nbsp;&amp;nbsp;within the form editor. This article discusses the order of drawing of the control on the form and TAB key sequence when navigating between the controls using the Tab key.&lt;br /&gt;&lt;br /&gt;The tab order is the order in which focus moves from one control to another by pressing the TAB key.&amp;nbsp;&amp;nbsp;The order in which these controls are placed on the form determines their Tab Order.&amp;nbsp;&amp;nbsp;By default, the first control placed on a form will have tab order #0, the second control that &lt;b&gt;accepts keyboard input&lt;/b&gt; will have tab order #1 and so on. &lt;br /&gt;&lt;br /&gt;The Z-Order is the order in which the controls are stacked on a form and are drawn by ATEasy when the area on the form that they occupy require redraw.&amp;nbsp;&amp;nbsp;A control on the bottom of the Z-Order will be drawn on the form first and a control on the top of the Z-Order will be drawn on the form last.&amp;nbsp;&amp;nbsp;If two controls occupy the same space on the form, the control at the top of the Z-Order will overlap the control at the bottom of the Z-Order, partially or completely hiding it.&lt;br /&gt;&lt;br /&gt;When you set the Tab-Order of your controls, you are also setting the order that the controls will be placed on the form.&amp;nbsp;&amp;nbsp;The first control in the Tab-Order is placed at the bottom of the Z-Order.&amp;nbsp;&amp;nbsp;Subsequent controls in the Tab-Order are stacked on top of the first control, obscuring it if they overlap.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img src="https://www.MarvinTest.com/images/support/Q200184\figure1.JPG" alt="Form in Tab Order Mode" title="Form in Tab Order Mode" border='0' &gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;Figure 1 - The button with Tab-Order #0 is at the bottom of the Z-Order, so other buttons overlap it.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Making changes to the order of controls:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;At design time ATEasy allows you to change the order of controls using the &lt;b&gt;Edit&lt;/b&gt;, &lt;b&gt;Arrange&lt;/b&gt;, &lt;b&gt;Tab Order &lt;/b&gt;command or by pressing on the Tab-Order button from the Form Design Toolbar as shown in Figure 1. &lt;br /&gt;&lt;br /&gt;At run time you can change the order of controls in the AForm.Controls using the &lt;b&gt;AControl.ZOrder&lt;/b&gt; property. &lt;br /&gt;&lt;br /&gt;For example, the command:&lt;br /&gt; &lt;br /&gt;&lt;div class='fixedFont'&gt;tbMyControl.ZOrder=aWindowZOrderTop&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;will bring the control named &lt;b&gt;tbMyControl &lt;/b&gt;to the top of the ZOrder and the top of the layers of controls.&amp;nbsp;&amp;nbsp;Conversely, the command: &lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;tbMyControl.ZOrder=aWindowZOrderBottom&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;will place the control at the bottom of the layer.&lt;br /&gt;&lt;br /&gt;The following code was added to the &lt;b&gt;AForm.OnLoad&lt;/b&gt; event for the form from Figure 1, resulting in btn1 now overlapping button2: &lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;btn1.ZOrder=aWindowZOrderTop&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img src="https://www.MarvinTest.com/images/support/Q200184\figure2.JPG" alt="Form after Changing the Z-Order" title="Form after Changing the Z-Order" border='0' &gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Figure 2 - After running the code, btn1 now overlaps btn2 but retains it’s position in Tab-Order&lt;/b&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200184/ATEasy-Forms-Z-Order-and-Tab-Order</link><pubDate>3/18/2010</pubDate></item><item><title>Using an Alias to address PXI instruments - Published on 2/4/2010</title><description>When writing a test program, often you must &lt;b&gt;"hard code"&lt;/b&gt; the configuration of the test system into your application; for example, the PXI slot numbers of the instruments.&amp;nbsp;&amp;nbsp;If a future system upgrade necessitates reordering the instrument slot numbers, you would need to modify the test program code to accommodate those changes - often requiring recertification of the test program before it can be released for use.&lt;br /&gt;&lt;br /&gt;A more flexible approach, and one that avoids code recertification, is to use &lt;b&gt;PXI/PCI Explorer&lt;/b&gt; to assign a text &lt;b&gt;Alias &lt;/b&gt;in place of the instrument slot number, and reference the alias in your system configuration code.&amp;nbsp;&amp;nbsp;The alias can remain the same regardless of which slot the instrument is installed in, so reordering instrument slots will not affect the test program code.&amp;nbsp;&amp;nbsp;The following example illustrates this concept.&lt;br /&gt;&lt;br /&gt;Assume you have two &lt;b&gt;GX5282 Dynamic Digital I/O&lt;/b&gt; modules installed in slots 15 and 17 of your &lt;b&gt;GX7000A&lt;/b&gt; system.&amp;nbsp;&amp;nbsp;And assume that the GX5282 installed in slot 15 is going to be used for providing 32 channels of digital stimulus patterns to the UUT, and that the GX5282 installed in slot 17 will be used to capture 32 channels of digital response patterns from the UUT.&amp;nbsp;&amp;nbsp;Using ATEasy to write your test program, you could initialize these instrument using the &lt;b&gt;Driver Shortcut &lt;/b&gt;slot settings (figure 1), or by directly calling the initialization driver procedure, as shown below:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;nMaster1:&amp;nbsp;&amp;nbsp;Short=1&lt;br /&gt;nMaster2:&amp;nbsp;&amp;nbsp;Short=2&lt;br /&gt;nSlot1:&amp;nbsp;&amp;nbsp;Short=15&lt;br /&gt;nSlot2:&amp;nbsp;&amp;nbsp;Short=17&lt;br /&gt;&lt;br /&gt;InitializeMaster(nMaster1,nSlot)&lt;br /&gt;InitializeMaster(nMaster2,nSlot)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200187\Driver Shortcut.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 1:&amp;nbsp;&amp;nbsp;Setting the GX5282 Driver Shortcut slot number parameter&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In both cases, if later the instrument slot positions were changed, the test program would need to be modified, recompiled and possibly recertified before the new program can be released.&lt;br /&gt;&lt;br /&gt;However, if each instrument were assigned an alias text name, and the text name were used to initialize the instrument, instead of it's slot position, then the test program operation is independent of the instrument slot positions.&amp;nbsp;&amp;nbsp;To assign an alias for these two instruments, open the &lt;b&gt;PXI/PCI Explorer&lt;/b&gt; application that is installed with any &lt;b&gt;Geotest &lt;/b&gt;product.&amp;nbsp;&amp;nbsp;Expand the slot parameter for the GX5282 installed in slots 15 and 17.&amp;nbsp;&amp;nbsp;Assign the alias for the GX5282 in slot 15 to &lt;b&gt;"Stimulus"&lt;/b&gt;, and the alias for the GX5282 in slot 17 to &lt;b&gt;"Response"&lt;/b&gt; (figure 2).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200187\PXI Explorer Alias.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 2:&amp;nbsp;&amp;nbsp;Assigning the "Stimulus" and "Response" alias to the GX5282's&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To initialize the instrument based on its assigned alias, use the HW function &lt;b&gt;Long HwPciGetAliasChassisSlot(String sAlias)&lt;/b&gt;.&amp;nbsp;&amp;nbsp;The &lt;b&gt;HW Device Driver&lt;/b&gt; installed with Geotest products provides low-level access and information about resources installed in a test system.&amp;nbsp;&amp;nbsp;Insert the &lt;b&gt;HW.DRV&lt;/b&gt; driver into your ATEasy System.&amp;nbsp;&amp;nbsp;The HW.DRV &lt;b&gt;HwPciGetAliasChassisSlot()&lt;/b&gt; function returns the slot position of the instrument matching the text string contained in the &lt;b&gt;sAlias &lt;/b&gt;parameter, which can be used to initialize the instrument.&amp;nbsp;&amp;nbsp;Additional information about the HW device driver can be found &lt;b&gt;here&lt;/b&gt;.&amp;nbsp;&amp;nbsp;The ATEasy code to initialize the GX5282's using their alias is:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;gxStimulus:&amp;nbsp;&amp;nbsp;Long&lt;br /&gt;gxResponse:&amp;nbsp;&amp;nbsp;Long&lt;br /&gt;&lt;br /&gt;HW Initialize()&lt;br /&gt;&lt;br /&gt;gxStimulus=HW Pci Get AliasLegacySlot("Stimulus")&lt;br /&gt;DIO Initialize Master(1,gxStimulus)&lt;br /&gt;&lt;br /&gt;gxResponse=HW Pci Get AliasLegacySlot("Response")&lt;br /&gt;DIO1 Initialize Master(2,gxResponse)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In summary, using an alias in place of an instrument slot number provides many benefits, the most important being decoupling the instrument slot position from your test code and providing configuration independent operation of your test program.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200187/Using-an-Alias-to-address-PXI-instruments</link><pubDate>2/4/2010</pubDate></item><item><title>Scanning a PXI system to learn about system resources. - Published on 2/4/2010</title><description>When writing test programs, the test engineer is often faced with the task of obtaining information about the instruments installed in a chassis.&amp;nbsp;&amp;nbsp;This information may be essential to the ATE program, or to determine how to establish a communication link between the test program and the test resources.&amp;nbsp;&amp;nbsp;The HW instrument driver can be used to query a PCI-type instrument (PCI, cPCI, PXI, PCIe, or PXIe) and return information about those resources.&amp;nbsp;&amp;nbsp;This article focuses on the how to use the &lt;b&gt;HW &lt;/b&gt;device driver for querying the PCI system resources.&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;HW &lt;/b&gt;driver is a &lt;b&gt;Device Driver &lt;/b&gt;that is installed with any Geotest product (PXI Instrument, PCI Instruments, ATEasy, DIOEasy, WAVEasy…).&amp;nbsp;&amp;nbsp;There are many procedures within the &lt;b&gt;HW &lt;/b&gt;driver that are useful for determining the system configuration.&amp;nbsp;&amp;nbsp;The HW driver is installed in your machine under &lt;b&gt;Program Files\Geotest\HW&lt;/b&gt;. This article will focus on just a couple of them, for more information see the HW folder,&lt;b&gt; HW.h&lt;/b&gt; for function definition, and the &lt;b&gt;HW.drv&lt;/b&gt; ATEasy driver:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Initialize()&lt;/h3&gt;The &lt;b&gt;Initialize&lt;/b&gt;() procedure Initializes the HW driver and must be called prior to calling any of the other procedures in the HW library.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PciGetSlotNumbers([Val] Word wVendorId, [Val] Word wDeviceId, Var Short panSlotNumbers[], Var Word pwDevicesFound)&lt;/h3&gt;The &lt;b&gt;PciGetSlotNumbers&lt;/b&gt;() procedure will return an array of slot number(s) for all devices matching the specified Vendor ID and Device ID.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PciGetSlotDevice(Val Long lSlot, Var structHWPCIDEVICE pstPciDev)&lt;/h3&gt;The &lt;b&gt;PciGetSlotDevice&lt;/b&gt;() procedure returns device information for the instrument installed in the specified slot.&amp;nbsp;&amp;nbsp;The device information is contained in the structure &lt;b&gt;structHWPCIDEVICE&lt;/b&gt;.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;The structure of the &lt;b&gt;structHWPCIDEVICE&lt;/b&gt; data type is shown below:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;br /&gt;structHWPCIDEVICE: Struct Public&lt;br /&gt;{&lt;br /&gt;&lt;blockquote&gt;	dwVendorId: DWord&lt;br /&gt;	dwDeviceId: DWord&lt;br /&gt;	dwBus: DWord&lt;br /&gt;	stPciSn: structPciSlotNumber&amp;nbsp;&amp;nbsp; !PCI/PXI slot number&amp;nbsp;&amp;nbsp;\&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(5 low bit: device #, 3 bits: function #, \ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8 bits: Lgacy slot, 16 chassis/slot : 0x203)&lt;br /&gt;	stPciCfg: strictPciCommonConfig&lt;br /&gt;	aResDesc: structCmPartialResourceDescriptor[8]&lt;br /&gt;	aMemDesc: structHwMemoryDesc[8]&lt;br /&gt;	szId: Char[256]&lt;br /&gt;&lt;/blockquote&gt;}&lt;br /&gt;&lt;br /&gt;structPciSlotNumber: Struct Public&lt;br /&gt;{&lt;br /&gt;&lt;blockquote&gt;	dwAsUlong: DWord&lt;/blockquote&gt;}&lt;br /&gt;&lt;br /&gt;structPciCommonConfig: Struct Public&lt;br /&gt;{&lt;br /&gt;&lt;blockquote&gt;	wVendorId: Word&lt;br /&gt;	wDeviceId: Word&lt;br /&gt;	wCommand: Word&lt;br /&gt;	wStatus: Word&lt;br /&gt;	ucRevisionId: Byte&lt;br /&gt;	ucProgIf: Byte&lt;br /&gt;	ucSubClass: Byte&lt;br /&gt;	ucBaseClass: Byte&lt;br /&gt;	ucCacheLineSize: Byte&lt;br /&gt;	ucLatencyTimer: Byte&lt;br /&gt;	ucHeaderType: Byte&lt;br /&gt;	ucBIST: Byte&lt;br /&gt;	stType0: structPciHeaderType0&lt;br /&gt;	dwDeviceSpecific: Byte[192]&lt;br /&gt;&lt;/blockquote&gt;}&lt;br /&gt;&lt;br /&gt;structPciHeaderType0: Struct Public&lt;br /&gt;{&lt;br /&gt;&lt;blockquote&gt;	adwBaseAddresses: DWord[6] &lt;br /&gt;	dwSubSystem: DWord&lt;br /&gt;	dwSubVendorID: DWord&lt;br /&gt;	dwROMBaseAddress: DWord&lt;br /&gt;	adwReserved2: DWord[2]&lt;br /&gt;	ucInterruptLine: Byte&lt;br /&gt;	ucInterruptPin: Byte&lt;br /&gt;	ucMinimumGrant: Byte&lt;br /&gt;	ucMaxinumLatency: Byte&lt;br /&gt;&lt;/blockquote&gt;}&lt;br /&gt;&lt;br /&gt;structPxiChassisInfo: Struct Public&lt;br /&gt;{&lt;blockquote&gt;	dwSize: Long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Fill with sizeof (PXIChassisInfo)&lt;br /&gt;	apcidevBridges: structHWPCIDEVICE[4]	! Bridges in the chassis&lt;br /&gt;	wChassisModel: Word&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Chassis model # : i.e. 7010&lt;br /&gt;	wChassisRevision: Word&lt;br /&gt;	dwChassisSerial: DWord&lt;br /&gt;	acUserDefinedData: Char[64]&lt;br /&gt;	wNumberOfSlots: Word&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Total number of slots in the chassis&lt;/blockquote&gt;}&lt;br /&gt;&lt;br /&gt;structCmPartialResourceDescriptor: Struct Public&lt;br /&gt;{&lt;blockquote&gt;	ucType: Byte&lt;br /&gt;	ucShareDisposition: Byte&lt;br /&gt;	wFlags: Word&lt;br /&gt;	Address1: DWord&lt;br /&gt;	Address2: DWord&lt;br /&gt;	Address3: DWord&lt;/blockquote&gt;}&lt;br /&gt;&lt;br /&gt;structHwMemoryDesc: Struct Public&lt;br /&gt;{&lt;br /&gt;&lt;blockquote&gt;	dwPhAddrLow: DWord&lt;br /&gt;	lPhAddrHigh: Long&lt;br /&gt;	dwLength: DWord&lt;br /&gt;	pvVirtualAddress: DWord&lt;br /&gt;&lt;/blockquote&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;With these three procedures, you can perform many useful queries that will return information about the hardware residing on your PCI bus, although we are most interested in just the test instreuments.&amp;nbsp;&amp;nbsp;If, for example, you wanted to know how many GX5290 instruments were installed in a PXI chassis, their slot numbers, and the firmware revision of those instruments, you could use the following code:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;wVendorId: Word =0x16E2 ! Geotest Vendor ID&lt;br /&gt;wDeviceId:Word=0x5290 ! GX5290 Device ID&lt;br /&gt;anSlotNumbers: Short[32] ! Array of slot numbers found&lt;br /&gt;wDevicesFound:Word ! Number of slots matching the Vendor and Device ID’s&lt;br /&gt;stPciDev: structHWPCIDEVICE &lt;br /&gt;sDeviceInfo: String&lt;br /&gt;i: Long: &lt;br /&gt;&lt;br /&gt;Initialize()&lt;br /&gt;PciGetSlotNumbers(wVendorId, wDeviceId, anSlotNumbers, wDevicesFound)&lt;br /&gt;If wDevicesFound&lt;&gt;0&lt;br /&gt;&amp;nbsp;&amp;nbsp;For i=0 to wDevicesFound-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PciGetSlotDevice(panSlotNumbers[i], stPciDev)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sDeviceInfo= stPciDev.szId&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Print "Slot "+Format(anSlotNumbers[i],"00")+" Firmware: "+Mid(sDeviceInfo, \ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pos("SUBSYS_",sDeviceInfo)+7,4)&lt;br /&gt;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;EndIf&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Once the slot number for an instrument is obtained, it would be a simple matter to initialize the instrument using the slot number(s).&amp;nbsp;&amp;nbsp;In the code below, each GX5290 instrument found in the system scan performed above, is initialized as a DIO Master.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;nMasterHandle: Short =0&lt;br /&gt;nBrdNum: Short &lt;br /&gt;wSlot: Word &lt;br /&gt;nDensity:Short &lt;br /&gt;nBanks: Short &lt;br /&gt;anHandle:Short[1] &lt;br /&gt;nStatus:Short &lt;br /&gt;&lt;br /&gt;If wDevicesFound&lt;&gt;0&lt;br /&gt;&amp;nbsp;&amp;nbsp;Redim anHandle[wDevicesFound]&lt;br /&gt;&amp;nbsp;&amp;nbsp;For nBrdNum=0 to wDevicesFound-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wSlot=anSlotNumbers[nBrdNum]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DioSetupInitialization(nMasterHandle, nBrdNum, wSlot, nDensity, \ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nBanks, anHandle[nBrdNum], nStatus)&lt;br /&gt;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;EndIf&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For additional information, review the HW programming example installed with ATEasy (HW.PRJ).&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200182/Scanning-a-PXI-system-to-learn-about-system-resources</link><pubDate>2/4/2010</pubDate></item><item><title>White Paper: Using PXI Digital Instrumentation for Video Test Applications - Published on 2/1/2010</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;The use of video imaging and high performance displays has become common-place on virtually all Mil-Aero airframes and weapons systems.&lt;br /&gt;This in turn, has placed new demands on the test systems and instrumentation that are used to test and support these complex systems. In the past, test systems have relied upon “box” video generators to evaluate monitors and displays that might be part of a flight deck’s avionics package. However, with the advent of sophisticated imaging sensors and processors and high-definition video, more advanced techniques and instrumentation are needed. &lt;br /&gt;Today’s test techniques are incorporating high performance digital instrumentation in conjunction with software and specialized “video adaptation” hardware to support the generation and analysis of high definition video signals.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2008\Using_PXI_Digital_Instrumentation_for_Video_Test_Applications.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200156/White-Paper-Using-PXI-Digital-Instrumentation-for-Video-Test-Applications</link><pubDate>2/1/2010</pubDate></item><item><title>Comparing Structurers in ATEasy - Published on 2/1/2010</title><description>Programming languages typically do not support structure comparison directly.&amp;nbsp;&amp;nbsp;In ATEasy, structures can be compared by converting them to a Variant and then comparing the variants.&amp;nbsp;&amp;nbsp;In ATEasy, when a structure is assigned to a variant, the structure is converted to an array of variant data types, where each field of the structure becomes an element in the array.&lt;br /&gt;&lt;br /&gt;A generic structure comparison procedure can be coded as follows:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure CompareStructs(vrStruct1, vrStruct2): Bool&lt;br /&gt;! Compare structs of the same type, return TRUE if equal, FALSE otherwise&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;vrStruct1: Val Variant&lt;br /&gt;vrStruct2: Val Variant&lt;br /&gt;i: Long&lt;br /&gt;{&lt;br /&gt;! Must have the same number of fields&lt;br /&gt;If VarDimSize(vrStruct1, 0)&lt;&gt; VarDimSize(vrStruct2, 0) Then Return FALSE&lt;br /&gt;&lt;br /&gt;! Compare each element/field&lt;br /&gt;For i=0 To VarDimSize(vrStruct1, 0)-1&lt;br /&gt;&amp;nbsp;&amp;nbsp; ! Test if element is another array/structure&lt;br /&gt;&amp;nbsp;&amp;nbsp; If VarDimSize(vrStruct1[i], 0) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Re-call CompareStructs() procedure&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Return CompareStructs(vrStruct1[i],vrStruct2[i]) &lt;br /&gt;&amp;nbsp;&amp;nbsp; Else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Test for same data type&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If VarType(vrStruct1[i])&lt;&gt;VarType(vrStruct2[i]) Then Return FALSE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Test for same value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If vrStruct1[i]&lt;&gt;vrStruct2[i] Then Return FALSE &lt;br /&gt;&amp;nbsp;&amp;nbsp;EndIf&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;! structs are equal&lt;br /&gt;Return TRUE&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Following are example tests to compare two structs of the same type with both Pass and Fail results, and two nested structures with both Pass and Fail results:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Types&lt;br /&gt;================================================================================&lt;br /&gt;strTest: Struct&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;Field1: Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;Field2: Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;Field3: String&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;strTest2: Struct&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;Field1: String&lt;br /&gt;&amp;nbsp;&amp;nbsp;Field2: strTest&lt;br /&gt;}&lt;br /&gt;================================================================================&lt;br /&gt;&lt;br /&gt;Variables&lt;br /&gt;================================================================================&lt;br /&gt;&amp;nbsp;&amp;nbsp;st1: strTest&lt;br /&gt;&amp;nbsp;&amp;nbsp;st2: strTest&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst1: strTest2&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst2: strTest2&lt;br /&gt;================================================================================&lt;br /&gt;&lt;br /&gt;Tests&lt;br /&gt;================================================================================&lt;br /&gt;Task 1 : "Test Compare Structs"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Test 1.1 : "Struct Compare"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Type = Precise&lt;br /&gt;Value = -1&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;st1.Field1=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;st1.Field2=2&lt;br /&gt;&amp;nbsp;&amp;nbsp;st1.Field3="123"&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;st2.Field1=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;st2.Field2=2&lt;br /&gt;&amp;nbsp;&amp;nbsp;st2.Field3="123"&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;TestResult=CompareStructs(st1,st2)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Test 1.2 : "Struct Not Compare"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Type = Precise&lt;br /&gt;Value = -1&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;st1.Field1=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;st1.Field2=2&lt;br /&gt;&amp;nbsp;&amp;nbsp;st1.Field3="123"&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;st2.Field1=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;st2.Field2=2&lt;br /&gt;&amp;nbsp;&amp;nbsp;st2.Field3="132"&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;TestResult=CompareStructs(st1,st2)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Task 2 : "Test Compare Nested Structs"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Test 2.1 : "Struct Compare"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Type = Precise&lt;br /&gt;Value = -1&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst1.Field1="Test"&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst1.Field2.Field1=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst1.Field2.Field2=2&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst1.Field2.Field3="123"&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst2.Field1="Test"&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst2.Field2.Field1=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst2.Field2.Field2=2&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst2.Field2.Field3="123"&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;TestResult=CompareStructs(nst1,nst2)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Test 2.2 : "Struct Not Compare"&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Type = Precise&lt;br /&gt;Value = -1&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst1.Field1="Test"&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst1.Field2.Field1=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst1.Field2.Field2=2&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst1.Field2.Field3="123"&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst2.Field1="Test"&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst2.Field2.Field1=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst2.Field2.Field2=2&lt;br /&gt;&amp;nbsp;&amp;nbsp;nst2.Field2.Field3="132"&lt;br /&gt;	&lt;br /&gt;&amp;nbsp;&amp;nbsp;TestResult=CompareStructs(nst1,nst2)&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Running the Task/Test programs produces the following results:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Test Log Results:&lt;/b&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Task 1 : Test Compare Structs&lt;br /&gt;------------------------------------------&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;&amp;nbsp; Test Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Unit&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Value&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result&amp;nbsp;&amp;nbsp; Status&lt;br /&gt;--- ------------------ ------ ------ ---------- ---------- ------&lt;br /&gt;001 Struct Compare&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -1.0000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-1.0000 Pass&lt;br /&gt;002 Struct Not Compare -&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -1.0000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+0.0000 Fail*&lt;br /&gt;&lt;br /&gt;Task 2 : Test Compare Structs&lt;br /&gt;------------------------------------------&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;&amp;nbsp; Test Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Unit&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Value&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Result&amp;nbsp;&amp;nbsp; Status&lt;br /&gt;--- ------------------ ------ ------ ---------- ---------- ------&lt;br /&gt;001 Struct Compare&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -1.0000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-1.0000 Pass&lt;br /&gt;002 Struct Not Compare -&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -1.0000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+0.0000 Fail*&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200172/Comparing-Structurers-in-ATEasy</link><pubDate>2/1/2010</pubDate></item><item><title>White Paper: Addressing Instrument Obsolescence - Published on 2/1/2010</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;Many projects and programs rely upon test systems that were designed at the beginning of a program for on-going system support and maintenance. However, as pro-grams are extended beyond their original life term, the equipment, including test systems, must undergo a modernization phase every few years in order to ensure continued sup-port and maintenance of the system and its sub-assemblies. One of the major issues typically addressed by this upgrade phase is equipment obsolescence. As technology evolves, even programs (and test systems) that were originally designed for a long life term can face obsolescence issues. This paper reviews and compares the options available to program managers and test engineers facing test instrument obsolescence problems. Various options and tradeoffs are discussed including stocking of spare instruments, on-going maintenance &amp; repair of cur-rent instrumentation, replacement through the used market, migration of existing Test Pro-gram Sets (TPSs) to fit a new test system, re-placement using similar products with software or hardware adapters, and replacement using same Form-Fit-Function instrumentation.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2006\Addressing_Instrument_Obsolescence_David_Manor.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200151/White-Paper-Addressing-Instrument-Obsolescence</link><pubDate>2/1/2010</pubDate></item><item><title>White Paper: White Paper: Designing PXI-Based Systems for Field and Flight-Line Applications - Published on 2/1/2010</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;PXI has become a mainstream test and data acquisition platform in the MIL/Aero market. Numerous programs addressing Depot and Intermediate-level test requirementsnow use PXI as the core of the product.&lt;br /&gt;While the Mil/Aero market and specifically the military would prefer the use of PXI based systems for field and flight-line test applications due to its small size, weight, and cost, the question of suitability needs to be addressed. Is PXI suitable as a platform for field and flight-line applications? Can PXI be used in harsh environments?&lt;br /&gt;This paper addresses these issues and demonstrates how PXI can be used in harsh environments, and how Commercial Off The Shelf (COTS) solutions can replace the once traditional solutions of custom test equipment.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2006\Designing_PXI-Based_Systems_for_Field_and_Flight-Line_Applications_Loofie_Gutterman.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200152/White-Paper-White-Paper-Designing-PXI-Based-Systems-for-Field-and-Flight-Line-Applications</link><pubDate>2/1/2010</pubDate></item><item><title>White Paper: A Common Core PXI Test Platform for Factory and Depot Applications - Published on 2/1/2010</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;The test requirements for the manufacturing and maintenance of military - aerospace components, subsystems, and systems should ideally be addressed by a common test platform. The ability to leverage test programs, fixturing, test resources and even product knowledge all points to the use of a common core platform. However, more often than not, the requirements for supporting and maintaining these assemblies results in specifying and developing completely different test solutions- resulting in higher capital and maintenance expenditures for deployed systems and components. This paper reviews how one can successfully address the test needs associated with both the manufacture and maintenance of systems and components - based on a common core&lt;br /&gt;solution and built around the PXI architecture, which can successfully address both the performance and economics aspects of test. The paper also presents a real world example of how this strategy has been successfully implemented on a current weapons system program.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2006\A_Common_Core_PXI_Test_Platform_for_Factory_and_Depot_Applications_Lowell_Parsons_and_Mike_Dewey.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200150/White-Paper-A-Common-Core-PXI-Test-Platform-for-Factory-and-Depot-Applications</link><pubDate>2/1/2010</pubDate></item><item><title>White Paper: New Ruggedized COTS field tester is an attractive and economic alternative - Published on 2/1/2010</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;While COTS Test Systems are becoming more widely used in Depot and Second-Level Test Sets, Field-Level COTS Testers are beginning to gain acceptance by Military customers and OEM suppliers. Ruggedized lightweight housings with general purpose COTS cards and backplanes are now serving roles once reserved exclusively for custom dedicated designs. COTS PXI instrument-on-a-card manufacturers are learning how to migrate commercial designs to meet the challenges of first-line testing. These ruggedized COTS testers, offering a wide range of capabilities, are more easily upgradeable and re-configurable than their dedicated counter-parts. They also cost substantially less, making them a technically attractive and economic alternative.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2005\New_Ruggedized_COTS_field_tester_is_an_attractive_and_economic_alternative_Thomas_M.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200149/White-Paper-New-Ruggedized-COTS-field-tester-is-an-attractive-and-economic-alternative</link><pubDate>2/1/2010</pubDate></item><item><title>White Paper: Integration of Software Technologies into a Test System - Published on 2/1/2010</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;Test applications often require integration of many software technologies. The white paper describes the benefits and the ways to integrate software technologies into an application. Several samples are provided:&lt;ul&gt;&lt;li&gt;A specific instrument driver is available only in a particular technology. Re-using or integrating the driver requires using that technology.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The application requires use of external software components to provide additional functionality such as databases to store test results or test requirement, user interface (i.e., ActiveX controls), spreadsheet, test log generation (HTML/XML), data analysis libraries, communication protocols, and more.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Existing or legacy code can be integrated into the current application.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Integration of these technologies will maximize code reuse and will allow faster completion of the test system application. The use of intuitive software can minimize coding, making integration of these technologies possible.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2005\Integration_of_Software_Technologies_into_a_Test_System_Ron_Yazma.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200148/White-Paper-Integration-of-Software-Technologies-into-a-Test-System</link><pubDate>2/1/2010</pubDate></item><item><title>White Paper: Independent Integrator Consolidates Resources - Published on 2/1/2010</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;Support equipment capability and availability are frequently not primary issues facing recipients of new Military Systems - but they should be! Such support equipment is invariably provided as a part of the Military System field deployment - support equipment whose objective is narrowly defined, and sometimes exclusively focused on the one system, subsystem, or device. Unlike the Prime Contractor (who is motivated to support only their own products), an independent PXI Systems Integrator is sometimes able to consolidate test resources by broadening the mission of the support equipment. Utilizing COTS PXI technology, an Independent Integrator could expand the mission of a Bench-Top Maintenance Tester to include a family of applications, often including UUTs from multiple OEM suppliers, and ultimately save ground support and depot support organizations millions of dollars.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2005\Independent_Integrator_Consolidates_Resources_Thomas_M.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200147/White-Paper-Independent-Integrator-Consolidates-Resources</link><pubDate>2/1/2010</pubDate></item><item><title>White Paper: Obsolescence Replacement—Applied Technology - Published on 2/1/2010</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;Equipment obsolescence is a growing concern for both military and commercial test equipment users. Many critical test systems currently in use were designed to remain in service for many years - sometimes even decades - using the most innovative technology at the time. However, as technology constantly evolves, newer, more advanced systems have since taken the place of these legacy systems. In fact, many of the older technologies are no longer in production so when instruments fail, the replacement components may not be available and the instruments become nonmaintainable.&lt;br /&gt;This paper covers the options available to test engineers and program managers facing test equipment obsolescence problems. These include on-going maintenance &amp; repair, replacement through a secondary (used) market, replacement using similar products and software or hardware adapters, re-hosting all existing Test Program Sets (TPSs) to a new target system, and replacement using 100% form-fitfunctioninstrumentation.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2004\Obsolescence_Replacement—Applied_Technology_Thomas_M.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200146/White-Paper-Obsolescence-Replacement-Applied-Technology</link><pubDate>2/1/2010</pubDate></item><item><title>Running a batch file or command prompt from ATEasy - Published on 12/23/2009</title><description>The procedure we will be using for calling our batch files is the ATEasy internal function &lt;b&gt;WinExec&lt;/b&gt;.&amp;nbsp;&amp;nbsp;Using WinExec causes ATEasy to run a batch file or an executable as an independant child process.&lt;br /&gt;&lt;br /&gt;To run a batch file, simply reference it in the WinExec procedure call.&amp;nbsp;&amp;nbsp;The batch file is looked for in several places including the directory in which the project resides.&amp;nbsp;&amp;nbsp;The list of locations and their priorities is located in the ATEasy help files.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt; ! default directory is the directory of execution&lt;br /&gt;WinExec("test.bat") &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To clear up any filename ambiguity, you can reference a specific location for the batch file.&amp;nbsp;&amp;nbsp;You can enter the full directory location, but since you are writing a string, you must use escape characters where appropriate (e.g C:\test.bat becomes "C:\\test.bat")&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt; ! run batch file in non-default directory&lt;br /&gt;WinExec("C:\\test.bat") &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;When specifying a location, directories with spaces require quotes around them (e.g. C:\My Documents\test.bat becomes "\"C:\\My Documents\\test.bat\"")&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt; ! run batch file in non-default directory (spaces in folder name)&lt;br /&gt;WinExec("\"C:\\My Documents\\test.bat\"") &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In these last examples your batch files appeared on the screen while they ran.&amp;nbsp;&amp;nbsp;To get the files to execute in the background, you must pass an optional parameter into your procedure call.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt; ! batch file runs in background&lt;br /&gt;WinExec("test.bat", aformShowHide) &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;So far we have run the batch files directly.&amp;nbsp;&amp;nbsp;For your purposes, you may want to run your executables through the command prompt.&amp;nbsp;&amp;nbsp;Running the following command opens the command prompt.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt; ! call cmd prompt&lt;br /&gt;WinExec("cmd") &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Or, to add some more functionality.&amp;nbsp;&amp;nbsp;We will open the command prompt and run our batch file.&amp;nbsp;&amp;nbsp;Using the&lt;b&gt; /k&lt;/b&gt; modifier with cmd.exe causes the window to stay open after completing it's task.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt; ! call cmd prompt to run a batch file and remain open&lt;br /&gt;WinExec("cmd /k test.bat") &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Alternately, we can use the cmd.exe modifier&lt;b&gt; /c&lt;/b&gt; to have the command prompt close after execution and the ATEasy parameter aFormShowHide to have it run in the background.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt; ! call cmd prompt to run a batch file silently and close itself.&lt;br /&gt;WinExec("cmd /c test.bat", aformShowHide) &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Finally, to allow a bit of end-user interaction, we could create a form with a textbox and allow the user to enter the name of the file that needs to be run and any additional parameters.&amp;nbsp;&amp;nbsp;In this example, the name of the textbox would be changed to tbUserInput.&amp;nbsp;&amp;nbsp;On a button click, the user input would be inserted into the WinExec command call as follows.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt; ! call a cmd prompt to run a file based on user input&lt;br /&gt;WinExec("cmd.exe /k " + tbUserInput.Text) &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The WinExec function launches the command console as a child process and continues the execution of the ATEasy program in parallel with the command console.&amp;nbsp;&amp;nbsp;If you wish for your program to pause and wait until the command console is close, the following example can be used:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure CommandTest() : Void&lt;br /&gt;h : AHandle&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! assign the window to the AHandle variable&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; h=WinExec("cmd")&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! wait for the window to close&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WaitForSingleObject(h)&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200173/Running-a-batch-file-or-command-prompt-from-ATEasy</link><pubDate>12/23/2009</pubDate></item><item><title>How the GTX2200/GC2200 Series Timer Counter Gate works - Published on 12/22/2009</title><description>The GTX2200 and GC2200 series timer/counter allows the user to set a gate time through either the software front panel or through a API call &lt;b&gt;GxCntSetGateTime()&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;The gate will stay open until one full period of the input signal has completed. &lt;br /&gt;&lt;br /&gt;If the gate time is set to a value that is less than one period of the input signal, then the gate will actually remain open until one signal period has completed. This is why a valid measurement is obtained when the gate time is set to a value less than the input signal period.&lt;br /&gt;&lt;br /&gt;This behavior also explains the "plus up to one signal period" in the gate time specification (GTX2200 Datasheet). If the gate time expires in between a period of the input signal, the gate will remain open until that cycle (period) completes.&lt;br /&gt;&lt;br /&gt;An example of this is as follows:&lt;br /&gt;If the gate time is set to 500 uS, and the input signal's period is 200 uS, the gate will actually close at 600 uS, after the 3rd cycle has completed (it will not close mid-cycle at 500 uS).&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200170\GateTimePlotd.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;Therefore the function of the gatetime is to allow the user to force the instrument to oversample an input signal. The instrument does not allow the user to select a gate time that will result in a closure part way through a cycle of the measured signal.&lt;br /&gt;&lt;br /&gt;The Measurement Timeout can be set by using the API function call &lt;b&gt;GxCntSetMeasurementTimeout()&lt;/b&gt; to make sure that a very slow signal will not cause unnecessary delays in your program.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200170/How-the-GTX2200-GC2200-Series-Timer-Counter-Gate-works</link><pubDate>12/22/2009</pubDate></item><item><title>Calling DLL functions with CDECL callback function parameters - Published on 12/21/2009</title><description>ATEasy can interface with DLL functions that accept call back function pointers as parameters.&lt;br /&gt;When dealing with function pointers, you should keep in mind that there are two types of x86 calling convention, CDECL and STDCALL.&lt;br /&gt;&lt;br /&gt;CDECL –The caller will clean up the stack when the function returns.&lt;br /&gt;STDCALL – The called function will clean up the stack when it returns.&lt;br /&gt;&lt;br /&gt;If the two calling conventions are missmatched (between the DLL’s function pointer parameter declaration and the passed in parameter’s function declaration), the stack could become corrupted resulting in an ATEasy run-time error.&lt;br /&gt;&lt;br /&gt;By default ATEasy will pass in a STDCALL function pointer that wraps around the native ATEasy procedure. This behavior can be changed to CDECL by changing certain options in the procedure’s properties page. &lt;br /&gt;&lt;br /&gt;First, you must create the procedure in either the System module or in a Driver module. &lt;br /&gt;&lt;br /&gt;Then you must set the procedure’s properties such that the export checkbox is set and CDECL is selected from the drop down menu. Once these properties have been set, the procedure can be passed into the DLL function.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200179.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;Note: Make sure your procedure's prototype is equivalent to the function pointer prototype of the DLL function's callback parameter.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200179/Calling-DLL-functions-with-CDECL-callback-function-parameters</link><pubDate>12/21/2009</pubDate></item><item><title>White Paper: DTIF (IEEE-1445) - Based Digital Test Solution - Published on 10/1/2009</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;The digital test interchange format (DTIF) is defined by the IEEE-1445 specification and provides a standardized digital data interchange format that can be used with various digital test environments. This standardized format, when used in conjunction with tools for post-processing of DTIF files and appropriate functional test digital hardware, offers a cost effective and viable solution for migrating legacy TPS’s to a modern digital test system platform.&lt;br /&gt;&lt;br /&gt;This paper provides an overview of how DTIF files generated by simulator tools such as Teradyne’s LASAR simulator can be used in conjunction with modern digital test post-processing tools and hardware to provide a robust TPS migration strategy for legacy digital test applications including support for Go / No-Go tests, guided probe and fault dictionary functionality. All of these capabilities are supported by the DtifEasy software tool set which can be used with the GX5292 or GX5055 digital instrumentation to re-host legacy applications developed on GenRad, Teradyne, Hewlett-Packard, or Schlumberger functional test systems. &lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2009\DTIF-BasedDigitalTest.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200175/White-Paper-DTIF-IEEE-1445-Based-Digital-Test-Solution</link><pubDate>10/1/2009</pubDate></item><item><title>White Paper: Integration of Software Technologies into a Test System - Published on 10/1/2009</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;Test applications often require the integration of many different software technologies. This paper provides an overview of how several Windows-based technologies can be incorporated into a single application by employing ATEasy's common software framework and architecture. Technologies discussed are DLL, ActiveX/COM, .NET, Function Panel drivers (.fp, VXI Plug&amp;Play drivers), IVI-C and IVI-COM. ATEasy is used to demonstrates several of these technologies.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2009\IntegrationOfSoftwareTechnologiesIntoATestSystem.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200174/White-Paper-Integration-of-Software-Technologies-into-a-Test-System</link><pubDate>10/1/2009</pubDate></item><item><title>White Paper: Implementing Serial Bus Interfaces with General Purpose Digital Instrumentation - Published on 10/1/2009</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;The use of generic digital test instruments for emulating common serial bus protocols can provide benefits over dedicated bus test products, and often presents a trade-off between functionality, flexibility and cost. For example, a dedicated test instrument solution can offer more extensive test capabilities such as protocol support for controlling and analyzing traffic between a bus controller and a device under test.&amp;nbsp;&amp;nbsp;However, a more general-purpose solution that utilizes a digital test instrument can offer the flexibility to adapt to non-standard line rates and timing as well as supporting other digital test needs. This paper presents an overview of how a general-purpose digital I/O instrument such as the PXI GX5290 series of DIO cards can used to support three widely used serial bus interfaces. By using a general-purpose digital I/O solution, users can potentially realize a lower cost test solution, a more compact test system footprint, multi-site test capability, a common user control interface and expandability for future requirements.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2009\ImplementingSerialBusInterfaces.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200178/White-Paper-Implementing-Serial-Bus-Interfaces-with-General-Purpose-Digital-Instrumentation</link><pubDate>10/1/2009</pubDate></item><item><title>White Paper: Consolidating Test Resources for Avionics Production Test – Requirements and Applications - Published on 9/24/2009</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;The manufacturing and test of avionics products for military and commercial aircraft presents a unique set of requirements and challenges. Historically, the development and deployment of production test systems for avionics products such as aircraft data acquisition and recording systems, navigation and communication products, and aircraft network systems have been addressed on a product specific basis – resulting in a variety of test platforms and solutions with little test system commonality and technology. &lt;br /&gt;&lt;br /&gt;Additionally, this lack of test system commonality and the requirement to maintain legacy products with long product life cycles results in increased maintenance and logistics costs for manufacturing and support test. The adoption of a common test platform can offer producers of avionics products lower test costs, improved test resource utilization, and the flexibility to support both new and legacy products.&amp;nbsp;&amp;nbsp;This paper reviews the requirements and the implementation of a common test platform and environment based on the GX7100A PXI 6U/3U chassis and ATEasy. The resulting solution offers a high level of efficiency, supports the implementation of routine test processes, offers reusability, and allows the consolidation of test resources to facilitate the collection of reliability data and test results.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2009\ConsolidatingTSTResources.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200176/White-Paper-Consolidating-Test-Resources-for-Avionics-Production-Test-Requirements-and-Applications</link><pubDate>9/24/2009</pubDate></item><item><title>White Paper: Automating Flight Line Testing for Proximity Sensor Maintenance Applications - Published on 9/22/2009</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;Embedded passive position sensors in various commercial aircraft locations have exhibited substantial failure rates and have resulted in costly turnbacks and delayed flights. Responding to the need to proactively identify marginal sensors prior to failure, Geotest and Alaska Airlines have developed an inexpensive test system that can facilitate the maintenance and troubleshooting of passive flaps and slats sensors for the Boeing 737-400 aircraft. The test system is used during heavy maintenance on commercial aircraft to identify, predict and analyze the failures of these embedded sensors.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2009\Testing_for_Proximity_Sensor_Maintenance_Applications.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200165/White-Paper-Automating-Flight-Line-Testing-for-Proximity-Sensor-Maintenance-Applications</link><pubDate>9/22/2009</pubDate></item><item><title>White Paper: DATSA Obsolescence Management Approach - Published on 9/22/2009</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;The AN/GSM-305 Depot Automated Test System for Avionics (DATSA) is an aging Automatic Test Equipment (ATE) used by the U.S. Air Force on the B1B and F-15 programs since the late seventies. Originally built by Emerson, the DATSA systems are now faced with many obsolescence and reliability problems due to the “advanced age” of the systems. While there is no current funded program to replace all the DATSA systems in the inventory, each Air Logistics Center (ALC) is taking the necessary steps to improve the current situation and “patch up” the DATSA for their own local needs. One of these efforts, by Oklahoma City ALC (Tinker AFB), includes extending the DATSA life by replacing key obsolete instruments that can no longer be maintained.&lt;br /&gt;Another effort by Ogden ALC (Hill AFB) led to the replacement of the DATSA altogether with an off-the-shelf tester that already had most of the TPSs for that program. This paper compares these two cases of extending life and complete replacement.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2008\DATSA_Obsolescence_Management_Approach_Loofie_Gutterman.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200155/White-Paper-DATSA-Obsolescence-Management-Approach</link><pubDate>9/22/2009</pubDate></item><item><title>White Paper: Joint Strike Fighter Alternate Mission Equipment Test Set - Published on 9/22/2009</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;With the Joint Strike Fighter (JSF) program underway, many new airborne products will have to be tested and maintained for the next few decades. The tester selected by the U.S. Air Force to be the standard platform for manufacturing, ESS (Environmental Stress Screening) and depot-level testing is the Lockheed Martin LM-STAR test set. LM STAR is an open-architecture test set with most of the test set’s components being Commercial&lt;br /&gt;Off The Shelf (COTS) products. Using COTS products helps reduce up-front and maintenance costs and simplified the development process. The test set platform is only the beginning and hundreds of Test Program Sets (TPSs) will be developed for the LM STAR in the next decade to support the 3000+ aircraft to be used by the U.S. Air Force and our allies.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2007\Joint_Strike_Fighter_Alternate_Mission_Equipment_Test_Set_Loofie_Gutterman.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200154/White-Paper-Joint-Strike-Fighter-Alternate-Mission-Equipment-Test-Set</link><pubDate>9/22/2009</pubDate></item><item><title>White Paper: Instrument Certification as part of a Modular Test platform Architecture - Published on 9/22/2009</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;The use of modular test systems for depot, intermediate, and factory test applications has increased dramatically in the last two decades. Today, the primary card modular architecture is based on the PCI Extensions for Instrumentation (PXI) standard with thousands of PXI-based systems in use today. The flexibility and configurability associated with PXI has also created new challenges for the calibration and certification of these systems. Historically, the process for re-certification of modular instruments has been to remove and return the modules to the original equipment manufacturer (OEM) or a 3rd party test house, resulting in system down time. However, a better certification method for a card modular architecture is to develop an overall methodology and implementation that allows recertification of modules within the host system. This paper discusses the features and benefits associated with incorporating a PXI-based standards module (GX1034) as the basis for implementing a system level re-certification strategy. By employing a standards module within the system, recertification logistics and maintenance can be simplified, resulting in extended system up time and offering test managers added flexibility for supporting in-house certification of the system and system components. The GX1034 incorporates frequency, resistance and voltage standards and source / measurement facilities allowing the system designer to implement a baseband re-certification strategy for an automatic test system (ATS) platform. &lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2007\Instrument_Certification_as_part_of_a_Modular_Test_platform_Architecture_David_Manor_and_Michae_Dewey.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Related Product: &lt;a href='../Product.aspx?model=GX1034' target='_blank'&gt;GX1034 - Standards Module&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200153/White-Paper-Instrument-Certification-as-part-of-a-Modular-Test-platform-Architecture</link><pubDate>9/22/2009</pubDate></item><item><title>Creating ATEasy Controls Dynamically - Published on 6/16/2009</title><description>There are two processes for adding controls to a form in ATEasy, at design time, and dynamically at run time.&amp;nbsp;&amp;nbsp;The topic of adding controls at design time and referrencing the control objects from an array are discussed in Knowledgebase article &lt;a href='http://www.geotestinc.com/KnowledgeBase/KBArticle.aspx?ID=161' target='_blank'&gt;Q200161&lt;/a&gt;.&amp;nbsp;&amp;nbsp;This article is an extension of Q200161 and will focus on using arrays to access controls that were placed on the form dynamically at run time.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;InsertControl()&lt;/b&gt; method allows you to create a control during run-time.&amp;nbsp;&amp;nbsp;The syntax is:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;[ ctrl = ] Object.InsertControl ( sControlName, sControlClassType, [fLeft], [fTop], [fWidth], [fHeight], [sContainer], [bVisible], [vNameOrIndex] )&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A full description of this method, and the associated &lt;b&gt;AddHandler&lt;/b&gt; statement can be found in the ATEasy help document.&amp;nbsp;&amp;nbsp;An example of inserting a new GroupBox with eight Switches and a Label onto an existing ATEasy form is shown below.&amp;nbsp;&amp;nbsp;This code duplicates controls that were placed on the form at design time.&amp;nbsp;&amp;nbsp;Note:&amp;nbsp;&amp;nbsp;Code for setting the dynamically created controls properties and creating an event handlers, while not discussed, were included for completeness.&amp;nbsp;&amp;nbsp;The resulting form and controls are shown in figure 1:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Module Variables:&lt;/b&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;objGB:&amp;nbsp;&amp;nbsp;AGroupBox&lt;br /&gt;objLBL:&amp;nbsp;&amp;nbsp;ALabel&lt;br /&gt;aobjGroup:&amp;nbsp;&amp;nbsp;ASwitch[8]&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Procedure:&lt;/b&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;lWidth:&amp;nbsp;&amp;nbsp;Long&lt;br /&gt;lHeight:&amp;nbsp;&amp;nbsp;Long&lt;br /&gt;lPosX:&amp;nbsp;&amp;nbsp;Long&lt;br /&gt;lPosY:&amp;nbsp;&amp;nbsp;Long&lt;br /&gt;i:&amp;nbsp;&amp;nbsp;Long&lt;br /&gt;&lt;br /&gt;lWidth=gb1.Width&lt;br /&gt;lHeight=gb1.Height&lt;br /&gt;lPosx=gb1.Left&lt;br /&gt;lPosY=gb1.Top+lHeight+50&lt;br /&gt;i=Form.ControlsCount&lt;br /&gt;&lt;br /&gt;!&amp;nbsp;&amp;nbsp;Add new GroupBox control to form "MyForm" and set the Caption property&lt;br /&gt;objGB=Form.InsertControl("objGB","AGroupBox",lPosX,lPosY,lWidth,lHeight,"MyForm",True,i)&lt;br /&gt;objGB.Caption="Run-Time Controls"&lt;br /&gt;&lt;br /&gt;! Add new Label control to form "MyForm" and set properties&lt;br /&gt;objLBL=Form.InsertControl("objLBL","ALabel",170,lPosY+lHeight+10,76,17,"MyForm",True,i+1)&lt;br /&gt;objLBL.Alignment=alblCenter&lt;br /&gt;objLBL.Font.Name="MS Sans Serif"&lt;br /&gt;objLBL.Font.Size=8&lt;br /&gt;objLBL.Font.Bold=True&lt;br /&gt;objLBL.Caption="Byte Value"&lt;br /&gt;&lt;br /&gt;! Add eight Switch control to the new GroupBox control and set properties&lt;br /&gt;For i=0 to 7&lt;br /&gt;&amp;nbsp;&amp;nbsp;aobjGroup[i]=Form.InsertControl("swGB"+Str(i),"ASwitch",343-i*47,41,24,58,"objGB",True,i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;aobjGroup[i].Caption=""&lt;br /&gt;&amp;nbsp;&amp;nbsp;aobjGroup[i].OffText=""&lt;br /&gt;&amp;nbsp;&amp;nbsp;aobjGroup[i].OnText=""&lt;br /&gt;&amp;nbsp;&amp;nbsp;aobjGroup[i].Style=4&lt;br /&gt;! Add an OnSwitchChange event handler for each new switch created&lt;br /&gt;&amp;nbsp;&amp;nbsp;AddHandler aobjGroup[i], "OnChange", OnSwitchChange&lt;br /&gt;Next&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;OnSwitchChange Procedure(objCtrl):&lt;/b&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;objCtrl:&amp;nbsp;&amp;nbsp;VAL AControl&lt;br /&gt;lByteValue:&amp;nbsp;&amp;nbsp;Long&lt;br /&gt;i:&amp;nbsp;&amp;nbsp;Long&lt;br /&gt;&lt;br /&gt;For i=0 to 8&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lByteValue=lByteValue+((2^i)*aobjGroup[i].Value)&lt;br /&gt;Next&lt;br /&gt;objLBL.Caption=Str(lByteValue)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200161\\KB161_05.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 1 - Design Time and Run Time generated controls&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Refer to the Forms.PRG example in the ATEasy Examples.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200169/Creating-ATEasy-Controls-Dynamically</link><pubDate>6/16/2009</pubDate></item><item><title>Using arrays of control objects in ATEasy - Published on 6/16/2009</title><description>When creating a test program that utilizes many controls, often it is desirable to query or manipulate those controls in a controlled sequence, such as a &lt;b&gt;For/Next&lt;/b&gt; loop.&amp;nbsp;&amp;nbsp;An example of this might be a group of eight &lt;b&gt;Switch &lt;/b&gt;controls representing the value of a binary byte (&lt;b&gt;figure 1&lt;/b&gt;).&amp;nbsp;&amp;nbsp;In these instances it is necessary to create an array of control objects that can be referenced using the loop count variable.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200161\\KB161_01.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 1 - Using switches to enter or display binary values in a program&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The typical method for accessing a control is to reference the control by it’s name.&amp;nbsp;&amp;nbsp;If, for example, you created a &lt;b&gt;Switch &lt;/b&gt;control, and named that switch object &lt;b&gt;swMySwitch&lt;/b&gt;, then to print the switch position (&lt;b&gt;Value&lt;/b&gt;) for &lt;b&gt;swMySwitch&lt;/b&gt; you would use the following:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Print swMySwitch.Value&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;But if, as in the example in figure 1, you had eight switches, or 16 or 32, then you would need to reference each switch specifically by its unique name in order to print the switch position:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Print swMySwitch0.Value&lt;br /&gt;Print swMySwitch1.Value&lt;br /&gt;Print swMySwitch2.Value&lt;br /&gt;Print swMySwitch3.Value&lt;br /&gt;Print swMySwitch4.Value&lt;br /&gt;Print swMySwitch5.Value&lt;br /&gt;Print swMySwitch6.Value&lt;br /&gt;Print swMySwitch7.Value&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A much simpler approach would be to print the switch positions using a &lt;b&gt;For/Next&lt;/b&gt; loop:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;For index=0 to 7&lt;br /&gt;&amp;nbsp;&amp;nbsp;Print objMySwitch[index].Value&amp;nbsp;&amp;nbsp;! Reference switch by array index number&lt;br /&gt;Next&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To use an array of control objects, first you must define a variable array to store the objects in.&amp;nbsp;&amp;nbsp;The array variable must be of a Control Object type - refer to the ATEasy Help for a comprehensive list of the standard control types.&amp;nbsp;&amp;nbsp;You can use the generic &lt;b&gt;AControl&lt;/b&gt; type object, or you can use the specific control object, like &lt;b&gt;ASwitch&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;objMyGeneric:&amp;nbsp;&amp;nbsp;AControl[8]&lt;br /&gt;objMySwitch:&amp;nbsp;&amp;nbsp;ASwitch[8]&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The advantage of using the specific control type, like ASwitch, is that all of the properties and methods associated with the control are available using ATEasy's code completion tools.&amp;nbsp;&amp;nbsp;This is because the ASwitch object uses Early Binding, which exposes all of the properties of an object at design time.&amp;nbsp;&amp;nbsp;The generic &lt;b&gt;AControl &lt;/b&gt;or &lt;b&gt;Object&lt;/b&gt; object uses Late Binding and does not display all of the properties of all controls.&amp;nbsp;&amp;nbsp;Late binding exposes the object to the application at run time, so the properties of the object are not known to the application at design time.&amp;nbsp;&amp;nbsp;For example, the &lt;b&gt;Value&lt;/b&gt; property of an ASwitch control can be accessed via a dropdown list with a variable of type ASwitch, but not with a variable of type AControl.&amp;nbsp;&amp;nbsp;The Value property can still be referrenced within a program for a generic type control, assuming it is valid for the control object stored in the AControl variable, but you must type the property manually in your program code.&lt;br /&gt;&lt;br /&gt;The advantage of using the generic AControl object is that any control type can be assigned to it in a "mix-n-Match" process.&amp;nbsp;&amp;nbsp;Since not all controls represented in mix-n-match grouping will share the same properties, you can use the ATEasy Try/Catch statement to test for non-existant controls or properties and avoid ATEasy run-time errors.&amp;nbsp;&amp;nbsp;Refer to the ATEasy help for information regarding Early and Late binding objects.&amp;nbsp;&amp;nbsp;The remaining examples in the article will use control objects with Early Binding.&lt;br /&gt;&lt;br /&gt;Once an appropriate array variable has been defined, then you must copy the control object to the array.&amp;nbsp;&amp;nbsp;There are two methods for doing this.&amp;nbsp;&amp;nbsp;The first is to reference the object by it's name, the second is to use the object's Tab Order.&amp;nbsp;&amp;nbsp;The first method is shown in the code segment below.&amp;nbsp;&amp;nbsp;An array of type ASwitch is created with 8 elements, then each of the eight ASwitch objects are copied to the array in ascending order:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;aobjSwitch:&amp;nbsp;&amp;nbsp;ASwitch[8]&lt;br /&gt;&lt;br /&gt;aobjSwitch[0]=swMySwitch0&lt;br /&gt;aobjSwitch[1]=swMySwitch1&lt;br /&gt;aobjSwitch[2]=swMySwitch2&lt;br /&gt;aobjSwitch[3]=swMySwitch3&lt;br /&gt;aobjSwitch[4]=swMySwitch4&lt;br /&gt;aobjSwitch[5]=swMySwitch5&lt;br /&gt;aobjSwitch[6]=swMySwitch6&lt;br /&gt;aobjSwitch[7]=swMySwitch7&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This is an inefficient process for placing control objects into an array by name.&amp;nbsp;&amp;nbsp;Fortunately, the &lt;b&gt;Controls()&lt;/b&gt; statement provides a much simpler process for referencing an object either by it's unique text name (shown below), or by its Tab Order (discussed later):&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;i: Long&lt;br /&gt;aobjSwitch:&amp;nbsp;&amp;nbsp;ASwitch[8]&lt;br /&gt;&lt;br /&gt;For i=0 to 7&lt;br /&gt;&amp;nbsp;&amp;nbsp;aobjSwitch[i]=Controls("swMySwitch"+Str(i))&amp;nbsp;&amp;nbsp;! Reference control by text name&lt;br /&gt;Next&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The tab order is the order in which a user moves from one control to another in an application when pressing the TAB key.&amp;nbsp;&amp;nbsp;Each form has its own tab order, and some controls, such as the &lt;b&gt;GroupBox&lt;/b&gt;, has its own tab suborder.&amp;nbsp;&amp;nbsp;Usually, the tab order is the same as the order in which you created the controls within an ATEasy form, or within an ATEasy control.&amp;nbsp;&amp;nbsp;However, the tab order can be redefined at anytime using the &lt;b&gt;TabOrder &lt;/b&gt;button.&amp;nbsp;&amp;nbsp;Refer to the ATEasy online help for additional information about Tab Orders.&lt;br /&gt;&lt;br /&gt;By clicking on the &lt;b&gt;TabOrder &lt;/b&gt;button while the form containing the eight switches from figure 1 is active, you can see the current tab order for the switches (figure 2).&amp;nbsp;&amp;nbsp;The order was defined as the controls were created, with the switch on the right representing the LSB and tab order 0.&amp;nbsp;&amp;nbsp;The MSB is tab order 7, and the label with the text "Byte Value" is tab order 8.&amp;nbsp;&amp;nbsp;The tab order can be redefined simply by clicking on the controls in whatever tab order you desire.&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200161\\KB161_02.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 2 - Tab ordering of controls on a form&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;By utilizing the &lt;b&gt;Controls&lt;/b&gt; statement you can take advantage of the tab order to simplify the process of assigning control objects to an array.&amp;nbsp;&amp;nbsp;The &lt;b&gt;Controls&lt;/b&gt; statement returns a control object as specified by a given control name or index.&amp;nbsp;&amp;nbsp;The index value is the tab order, so the eight switch control objects can be stored in the aobjSwitch[] array using the simple For/Loop structure shown below:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;i: Long&lt;br /&gt;aobjSwitch:&amp;nbsp;&amp;nbsp;ASwitch[8]&lt;br /&gt;&lt;br /&gt;For i=0 to 7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aobjSwitch[i] = Controls(i)&amp;nbsp;&amp;nbsp;! Reference control by tab order&lt;br /&gt;Next&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Once the switch objects are stored to the control array, the controls can be used by referencing the array and index, the same as if you used the control directly.&amp;nbsp;&amp;nbsp;For example, if you wanted to calculate the byte value represented by the switch positions, the following procedure could be used:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;i:&amp;nbsp;&amp;nbsp;Long&lt;br /&gt;lByteValue:&amp;nbsp;&amp;nbsp;Long=0&lt;br /&gt;&lt;br /&gt;For i=0 to 7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lByteValue=lByteValue+((2^i)*aobjSwitch[i].Value)&lt;br /&gt;Next&lt;br /&gt;lblValue.Caption=Str(lByteValue)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200161\\KB161_03.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 3 - Byte value represented by switch positions&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;As mentioned previously in this article, some ATEasy controls allow embedding other controls within them.&amp;nbsp;&amp;nbsp;The AGroupBox is an example of this type of control.&amp;nbsp;&amp;nbsp;In this case, the tab order for controls embedded within another control have a sub-index number, or an indented tab order.&amp;nbsp;&amp;nbsp;If you were to place the eight byte-value switches inside a AGroupBox control, the AGroupBox control would have the major tab order, or index value, and each of the switches would have a sub tab order.&amp;nbsp;&amp;nbsp;Assuming the GroupBox control had a tab order of 0, then the switche controls inside the AGroupBox would have a tab order of 0.0, 0.1, 0.2 and so on, up to tab order 0.7, and the Byte Value label which had been tab order 8 is now tab order 1 (figure 3).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200161\\KB161_04.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 4 - Tab ordering of controls within controls&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A new reference level is added for accessing the switch control objects.&amp;nbsp;&amp;nbsp;Since they are now embedded in the AGroupBox, you must reference the AGroupBox control first, before having access to the switch controls within it.&amp;nbsp;&amp;nbsp;This is done by adding another level of the &lt;b&gt;Controls &lt;/b&gt;property to reference the GroupBox.&amp;nbsp;&amp;nbsp;The code below demonstrates how to build the array of ASwitch objects from switches embedded in a AGroupBox:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;i: Long&lt;br /&gt;aobjSwitch:&amp;nbsp;&amp;nbsp;ASwitch[8]&lt;br /&gt;&lt;br /&gt;For i=0 to 7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aobjSwitch[i] = Controls(0).Controls(i)&lt;br /&gt;Next&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Refer to Knowledgebase article &lt;a href='http://www.geotestinc.com/KnowledgeBase/KBArticle.aspx?ID=169' target='_blank'&gt;Q200169&lt;/a&gt; for an example of how to create controls dynamically on an ATEasy form.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200161/Using-arrays-of-control-objects-in-ATEasy</link><pubDate>6/16/2009</pubDate></item><item><title>How to call a program procedure from the system or from a driver - Published on 6/16/2009</title><description>ATEasy does not allow you to call program procedures directly from the system or a driver as that would make them dependent on specifc programs.&amp;nbsp;&amp;nbsp;Doing so will generate a compiler error.&amp;nbsp;&amp;nbsp;Only one Program module can be active at any time, and it is possible that a procedure defined in one program module would not exist in another module.&amp;nbsp;&amp;nbsp;ATEasy would not be able to resolve this procedure call from the Driver or System module.&lt;br /&gt;&lt;br /&gt;The following procedure shows how to call a program procedure from the System or Driver module.&lt;br /&gt;&lt;br /&gt;In ATEasy you can call program procedures using procedure variables. For example: If you pass a procedure as an argument to a system procedure, that system can call the program procedure using a procedure variable as shown here:&lt;br /&gt;&lt;br /&gt;In the program Program create your procedure ( called 'a' in this example): &lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure a()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Place procedure code here&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Create a public System (or a Driver) procedure variable (called m_procA in this example) and at the beginning of your application assign it to Procedure a, as shown below:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Program.OnInit()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;system.m_procA=a&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In the system the program procedure can be called as follows:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;m_procA()&lt;/div&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200166/How-to-call-a-program-procedure-from-the-system-or-from-a-driver</link><pubDate>6/16/2009</pubDate></item><item><title>PCI/PXI Bus Enumeration - Published on 5/28/2009</title><description>The Plug and Play features of the PCI bus were designed to automate the process of allocating resources to PCI devices. A simplifed process of enumeration is as follows: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;When a PC is first powered on, the BIOS is loaded and starts the Plug and Play BIOS to enumerate all devices on the PCI bus. Upon boot up, all PCI devices connected to the bus are in an inactive state with no resources assigned and the Plug and Play BIOS must rescan the bus to ascertain what devices are currently present in the system. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The CPU will request the PCI Controller to query each combination of bus, device, and function numbers for a corresponding Device ID and Vendor ID. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;If a device is found for the specified bus device and function, the BIOS will read the configuration space for required resources from the device and memory range (Base Address Registers), IO ports, DMA, and IRQ accordingly. If a PCI-to-PCI bridge is encountered, all the devices behind the bridge are enumerated and allocated resources before continuing past the bridge. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The configuration data is recorded in the Extended System Configuration Data (ESCD) file which is stored in non-volatile memory.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;If the PCI Controller times out, it will return the maximum value with all bits set high (0xFFFF) indicating that no device was found at the specified device and function number.&lt;/li&gt;&lt;/ul&gt;When Windows XP boots up, it will check the ESCD file along with the PCI bus to determine if any new hardware was installed. If so, it will start the process of trying to install the correct device driver. Windows will typically leave the hardware configuration up to the BIOS as to not risk exposing latent BIOS bugs by optimizing resource allocation.&lt;br /&gt;&lt;br /&gt;The BIOS and Windows work in concert to establish the Plug and Play operation of the PCI bus. The level of control given to Windows can sometimes be changed in the BIOS configuration utility for older motherboards. When the PnP OS option is set to &lt;b&gt;No&lt;/b&gt;, the BIOS will configure all PnP PCI devices before Windows boots. If the PnP OS option is set to &lt;b&gt;Yes&lt;/b&gt;, then the BIOS will only configure boot critical devices (Hard Drive, VGA etc.) and leave the rest of the configuration to Windows. ACPI compatible (newer) motherboards do not provide this option.&lt;br /&gt;&lt;br /&gt;The following is a screenshot of the Geotest&lt;b&gt; PCI/PXI Explorer &lt;/b&gt;showing the enumerated PCI devices and their respective resources.&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200163.bmp" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;Reference Knowledge Base Article &lt;a href='http://www.geotestinc.com/KnowledgeBase/KBArticle.aspx?ID=132' target='_blank'&gt;Q200132&lt;/a&gt; for information on how to resolve PCI resource allocation errors.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200163/PCI-PXI-Bus-Enumeration</link><pubDate>5/28/2009</pubDate></item><item><title>How to repeat a test based on the TestStatus variable - Published on 5/18/2009</title><description>There are a number of ways to repeat a test based on the value of a variable. This example will use the &lt;b&gt;OnEndTest &lt;/b&gt;event to repeat test 4.2 up to three times if the test fails. Code in the &lt;b&gt;OnEndTest&lt;/b&gt; Event will run at the end of every test, so if the retry is only required on specific tests, then the &lt;b&gt;OnEndEvent &lt;/b&gt;code should check for the specific Test Number(s) to prevent retrying all the tests in the application. This example assumes that if Task# 4 Test# 2 fails, then it should be rerun a maximum of 3 times or until it passes. In this example will use a global varaible (m_iTestCount) to keep count of the test retries.&amp;nbsp;&amp;nbsp;A constant iCount will be used to indicate the maximum number of retries.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;br /&gt;Program Global Variables:&lt;br /&gt;! First declare iCount as a Short Constant and give it a value of 3&lt;br /&gt;m_iCount: Short Const = 3 ! Limit the number of retries to 3&lt;br /&gt;m_iTestCount:&amp;nbsp;&amp;nbsp;Short&lt;br /&gt;&lt;br /&gt;Procedure Program.OnEndTest() ! Event&lt;br /&gt;{&lt;br /&gt;if Test.Number = "4.2"&amp;nbsp;&amp;nbsp; !Check if this is Test Number 4.2&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Check if the test has failed and the number of retries is less than iCount-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Remember the test has already been run at least once at this stage&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if TestStatus=FAIL AND m_iTestCount &lt; m_iCount-1 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! Increment the m_iTestCount variable to track the number of retries&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_iTestCount=m_iTestCount + 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! Rerun the current test. Remember Index is zero-based&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Task EndEvents Task.Index+1, Test.Index+1 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_iTestCount = 0&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EndIf&lt;br /&gt;&lt;br /&gt;Endif&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200162/How-to-repeat-a-test-based-on-the-TestStatus-variable</link><pubDate>5/18/2009</pubDate></item><item><title>Calling a DLL Function with Variable Parameter Lists from ATEasy - Published on 4/28/2009</title><description>Sometimes it is desirable to create and use C/C++ functions within a DLL, that accept a variable number of parameters instead of a fixed set of parameters. &lt;br /&gt;&lt;br /&gt;ATEasy supports use of such a function and calling it from within your test program.&lt;br /&gt;&lt;br /&gt;The first step is to insert the appropriate DLL into your ATEasy project. &lt;br /&gt;&lt;br /&gt;You will then need to manually define the DLL function you wish to use by inserting a new procedure in the DLL sub-module. &lt;br /&gt;&lt;br /&gt;After inserting a new DLL procedure, select CDecl from the type drop down list of the DLL procedure properties page. CDecl is an x86 calling convention that requires the calling function to clean the stack after the called function returns, allowing a variable number of parameters to be used.&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support//Q200159/varlist3.bmp" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;Define all the fixed parameters as you would normally. &lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support//Q200159/varlist1.bmp" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;When you get to the variable list, use the &lt;b&gt;Any &lt;/b&gt;parameter type. Define as many &lt;b&gt;Any &lt;/b&gt;parameters as you would expect to use in your variable list and mark them as optional. These optional parameters will serve as the variable list interface. Use &lt;b&gt;Val Any &lt;/b&gt;type parameters to push parameters to the function (pass by value) or &lt;b&gt;Var Any &lt;/b&gt;type parameters to push a pointer (pass by reference).&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support//Q200159/varlist2.bmp" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;Please refer to Tests 6.8 and 6.9 in the Language.prg example program for more information on implementation of variable parameter lists for &lt;b&gt;sprintf &lt;/b&gt;and &lt;b&gt;scanf&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Note: In order to use a variable parameter list, the DLL must be built using the CDECL convention. Please reference the Microsoft knowledge base article: &lt;br /&gt;&lt;a href='http://support.microsoft.com/kb/69897' target='_blank'&gt;Microsoft KB Article&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You must also have ATEasy 6.0 Build 136 or greater installed (Val/Var Any changes are required for this to work).&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200159/Calling-a-DLL-Function-with-Variable-Parameter-Lists-from-ATEasy</link><pubDate>4/28/2009</pubDate></item><item><title>How to retrieve Windows Environment variables in ATEasy - Published on 4/28/2009</title><description>There are several methods that can be used for retrieving Windows environment variables&lt;br /&gt;1) Using the .NET Framework &lt;b&gt;Environment &lt;/b&gt;class and&lt;br /&gt;2) Using the Windows API &lt;b&gt;GetEnvironmentVariableA() &lt;/b&gt;function&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1) Using the .NET Framework Environment Class:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Note: If you do not have the .NET Framework installed on your computer it can be downloaded and installed for free from the Microsoft web site or by using Windows update. &lt;br /&gt;&lt;br /&gt;To use the &lt;b&gt;Environment &lt;/b&gt;class, first right click on the &lt;b&gt;Libraries&lt;/b&gt; submodule in your program and select &lt;b&gt;Insert Library Below&lt;/b&gt;. Click on the &lt;b&gt;.NET Assemblies&lt;/b&gt; tab and scroll down to &lt;b&gt;mscorlib&lt;/b&gt;. Expand &lt;b&gt;mscorlib&lt;/b&gt; and scroll down to &lt;b&gt;System&lt;/b&gt;. Expand &lt;b&gt;System&lt;/b&gt; and scroll down to &lt;b&gt;Classes&lt;/b&gt;. Expand &lt;b&gt;Classes&lt;/b&gt; and check the box beside &lt;b&gt;Environment&lt;/b&gt;. Then select &lt;b&gt;Insert&lt;/b&gt;. ATEasy will automatically insert the Environment Class into your program. Now define a string variable (called sEnvironVar in the example below) that will be used to store the Environment variable.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;! The following example will find the value of the Windows Environment variable COMPUTERNAME.&lt;br /&gt;! First declare sEnvironVar as a String variable&lt;br /&gt;! Get the Windows Environment variable COMPUTERNAME&lt;br /&gt;sEnvironVar = Environment.GetEnvironmentVariable("COMPUTERNAME") &lt;br /&gt;Print sEnvironVar&amp;nbsp;&amp;nbsp; !Print COMPUTERNAME&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2) Using the Windows API&amp;nbsp;&amp;nbsp;&lt;b&gt;GetEnvironmentVariableA()&lt;/b&gt; function&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;To use this function, first right click on the &lt;b&gt;Libraries&lt;/b&gt; submodule in your program and select &lt;b&gt;Insert Library Below&lt;/b&gt;. Click on the &lt;b&gt;DLL&lt;/b&gt; tab. For the &lt;b&gt;DLL Filename&lt;/b&gt; select &lt;b&gt;kernel32.dll &lt;/b&gt;from the Windows\System32 folder and select &lt;b&gt;Insert&lt;/b&gt;. ATEasy will insert the kernel32 library into your program. Then under the library procedures define a procedure:&lt;br /&gt;&lt;div class='fixedFont'&gt;GetEnvironmentVariableA(sName: Val String, psBuffer: Var String, dwSize: Val DWord) : Public DWord.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;When you call this function make sure to allocate the psBuffer string parameter (use SetLen).&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;! This example will find the value of the Windows Environment variable COMPUTERNAME&lt;br /&gt;! First declare sEnvironVar as a String variable&lt;br /&gt;! Allocate an appropiate amount of memory to the sEnvironVar string parameter &lt;br /&gt;setlen(sEnvironVar,512) &lt;br /&gt;! Get the Windows Environment variable COMPUTERNAME&lt;br /&gt;GetEnvironmentVariableA("COMPUTERNAME", sEnvironVar, 512)&lt;br /&gt;Print sEnvironVar&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Print COMPUTERNAME&lt;/div&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200160/How-to-retrieve-Windows-Environment-variables-in-ATEasy</link><pubDate>4/28/2009</pubDate></item><item><title>White Paper: PXI - The Future of Test - Published on 4/14/2009</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;As commercial and military electronic technology evolves so does the need for more sophisticated, reliable, and cost-effective test equipment. The new PXI platform fills this gap and provides the ultimate test solution for field, laboratory, or manufacturing test applications. This paper discusses the evolution of test that led to the development of the PXI standard and provides technical information of the PXI Bus.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2002\PXI_The_Future_of_Test.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;</description><link>https://www.MarvinTest.com/KB/Q200139/White-Paper-PXI-The-Future-of-Test</link><pubDate>4/14/2009</pubDate></item><item><title>White Paper: PXI for Military Test Applications - Published on 4/14/2009</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;As PXI is gaining in-roads into military test applications, systems integrators start using the PXI platform as the core of military testers for manufacturing, service, and field test. This paper discusses two such applications. The first is a production tester used in the manufacturing of the Longbow launcher and the second is a portable field tester for the Maverick Missile System.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2002\PXI_for_Military_Test_Applications_Loofie_Gutterman.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200140/White-Paper-PXI-for-Military-Test-Applications</link><pubDate>4/14/2009</pubDate></item><item><title>White Paper: Military and Field Test Applications Using Modified COTS Products - Published on 4/14/2009</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;Field test for military and industrial applications requires special test equipment that meets stringent environmental requirements. These test applications require hardware that can provide high-performance and capabilities, yet be portable and rugged to ensure usability in the field. Typical environmental requirements include extended temperature range, shock &amp; vibration, altitude, humidity, salt-fog, explosive atmosphere, EMI/RFI and more. The required levels are in most cases higher than those provided by Commercial Off The Shelf (COTS) equipment, which dictates a different approach by the tester designer. This paper discusses design approaches for such testers or data acquisition systems and advocates the use of modified COTS as the preferred solution.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2003\Military_and_Field_Test_Applications_Using_Modified_COTS_Products_Loofie_Gutterman.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200141/White-Paper-Military-and-Field-Test-Applications-Using-Modified-COTS-Products</link><pubDate>4/14/2009</pubDate></item><item><title>White Paper: Next Generation COTS Test Systems - Published on 4/14/2009</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;This paper surveys card-to-card coordination, synchronization, triggering, and cross triggering in PCI eXtensions for Instrumentation (PXI) commercial off-the-shelf (COTS) systems. It provides an overview with some design guidelines for COTS designers and offers some suggestions to system integrators.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2003\Next_Generation_COTS_Test_Systems_Thomas_M.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200142/White-Paper-Next-Generation-COTS-Test-Systems</link><pubDate>4/14/2009</pubDate></item><item><title>White Paper: Testing MicroProcessor-Based Boards - Published on 4/14/2009</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;Testing Microprocessor-based boards (µP) could be a challenge even for the experienced test engineer. This paper reviews the related challenges and available test philosophies for the functional testing of these products.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2003\Testing_MicroProcessor-Based_Boards_Loofie_Gutterman.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200143/White-Paper-Testing-MicroProcessor-Based-Boards</link><pubDate>4/14/2009</pubDate></item><item><title>White Paper: Integrating VISA, IVI and ATEasy to Migrate Legacy Test Systems - Published on 4/14/2009</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;New software technology, such as Interchangeable Virtual Instruments (IVI), benefits customers of Automatic Test Equipment by reducing cost of ownership. The costs of rehosting test program software due to obsolescence issues can be reduced by using application development environments such as ATEasy and IVI. ATEasy provides the means of changing instruments and test system resources similar to IVI via its interchangeable Instrument Technology (I2T). IVI further allows the customer end-user to make the change without compiling the application, as ATEasy would require. Bycombining the power of both technologies, both the customer and the integrator benefit from maximum flexibility and options for instrumentation obsolescence. &lt;br /&gt;This paper discusses the issues and concerns in applying this strategy to a deliverable test system. It discusses some of the obstacles and "speed-bumps" that were overcome during development. Although IVI has been around for over 5 years, it's still a new technology and early adopters will have the work around issues such as driver availability, varying levels of support by equipment vendors, and the lack of experience in the industry applying IVI.&lt;br /&gt;The ATEasy environment can leverage the current, state-of-the art technology while positioning the user and integrator for the future.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2004\Integrating_Interchangeable_Virtual_Instruments_IVI_Resources_with_ATEasy_Ron_Yazma.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200144/White-Paper-Integrating-VISA-IVI-and-ATEasy-to-Migrate-Legacy-Test-Systems</link><pubDate>4/14/2009</pubDate></item><item><title>White Paper: Migrating an Electro-Optic Test Bench to PXI - Published on 4/14/2009</title><description>&lt;h3&gt;Abstract&lt;/h3&gt;This paper describes how the Electro-Optic Test Bench ground support test equipment for the TOW Missile has been pressed into extended service even though it is not supported and is obsolete. A new COTS PXI-based test system and optical bench has been designed to replace the obsolete test set for all versions of TOW.&lt;br /&gt;&lt;br /&gt;&lt;a href='/GetFile.aspx?Type=File&amp;Name=Whitepapers\2004\Migrating_an_Electro-Optic_Test_Bench_to_PXI_Thomas_M.pdf&amp;refpage=&amp;FileID=0'&gt;&lt;img src='/images/icons/ico_download.gif' border='0' alt='Download' /&gt;Download the complete white paper&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200145/White-Paper-Migrating-an-Electro-Optic-Test-Bench-to-PXI</link><pubDate>4/14/2009</pubDate></item><item><title>Using Trigger Mapping on the GX7XXX Smart Chassis - Published on 3/26/2009</title><description>One of the capabilities that differentiate a test and measurement instrument installed in a PXI chassis from traditional rack-and-stack instruments and instruments installed in a PCI mainframe, is the addition of the PXI trigger bus.&amp;nbsp;&amp;nbsp;This bus facilitates a more tightly integrates suite of instrument by allowing PXI-based instruments to synchronize operation using common clocks and triggers, without the need for external wires or cables.&amp;nbsp;&amp;nbsp;However, due to the nature of the PCI bus, and by extension, the PXI bus, bridges are required to link bus segments together when more than 8 devices are installed on the bus.&amp;nbsp;&amp;nbsp;The PCI bridge extends the computer data bus, but does nothing about extending the PXI trigger bus across multiple bus segments, which is necessary to maintain the synchronization capabilities designed into the PXI bus across the full backplane.&lt;br /&gt;&lt;br /&gt;Early introductions of PXI chassis' accommodated extending the PXI trigger bus by using jumpers on the chassis backplane to enable triggers and set the direction control of the trigger signals between bus segments.&amp;nbsp;&amp;nbsp;If for any reason the trigger bus ever needed to be reconfigured, the chassis would have to be powered down, instruments removed to gain access to the backplane jumpers, and the jumpers manually reconfigured to accommodate the new triggering requirements.&amp;nbsp;&amp;nbsp;This dated technique is still used by many PXI chassis’.&lt;br /&gt;&lt;br /&gt;With the introduction the Smart Chassis series from Geotest, this dated methodology has been replaced with software control for mapping and enabling PXI triggers across bus segments.&amp;nbsp;&amp;nbsp;Trigger mapping can now be set using software commands or virtual instrument panels, all while the chassis is powered on and instruments installed.&amp;nbsp;&amp;nbsp;Geotest chassis’ that include this “Smart” feature are the GX7000A, GX7100A, GX7300 and GX7600.&lt;br /&gt;&lt;br /&gt;To configure trigger mapping you must have the appropriate chassis DLL driver installed and be connected to the chassis using either an embedded controller or a PXI bus extender connected to an external host PC.&amp;nbsp;&amp;nbsp;To manually set the trigger direction, launch the Chassis Panel application by selecting &lt;b&gt;GxChassis Panel &lt;/b&gt; on your desktop or from the Windows Start Menu.&amp;nbsp;&amp;nbsp;Click on the &lt;b&gt;Initialize&lt;/b&gt; button and follow the directions for initializing the chassis (figure 1).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\Q200137\GX7XXX Chassis Panel.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 1 - Generic GX7XXX Chassis Panel&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;From the main panel select the &lt;b&gt;PXI Trigger Lines&lt;/b&gt; tab.&amp;nbsp;&amp;nbsp;The PXI Trigger Lines tab will reflect the number of slots available on the chassis being controlled.&amp;nbsp;&amp;nbsp;The GX7000A and GX7300 each have twenty (20) slots (figures 2 and 3, respectively), the GX7100A has fourteen (14) slots (figure 4) and the GX7600 has nine (9) slots (figure 5).&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\Q200137\GX7000 Small Triggers.JPG" alt`=&amp;quot; border='0' /&gt;&amp;nbsp;&amp;nbsp;&lt;img src="https://www.MarvinTest.com/images/support/.\Q200137\GX7300 Small Triggers.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 2 - GX7000 Chassis Triggers Tab&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;Figure 3 -&amp;nbsp;&amp;nbsp;GX7300 Chassis Triggers Tab&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\Q200137\GX7100 Small Triggers.JPG" alt`=&amp;quot; border='0' /&gt; &lt;img src="https://www.MarvinTest.com/images/support/.\Q200137\GX7600 Small Triggers.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 4 - GX7100 Chassis Triggers Tab&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;Figure 5 - GX7600 Chassis Triggers Tab&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The screen indicates which slots are the primary slots and which slots are the secondary slots associated with each bridge.&amp;nbsp;&amp;nbsp;The chassis will continuously monitor the state of the triggers on all of the bus segments and report them via the panel as either a logic &lt;b&gt;"0"&lt;/b&gt; or a logic &lt;b&gt;"1"&lt;/b&gt;.&amp;nbsp;&amp;nbsp;Each bridge between bus segments provides three controls for each trigger line.&amp;nbsp;&amp;nbsp;Simply click on the desired control and a drop-down list will be presented that allows you to select the appropriate parameter:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Direction Control&lt;/b&gt; - Direction of the trigger mapping:&lt;ul&gt;&lt;li&gt;NC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Trigger Mapping Disabled)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;L -&gt; R&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Primary to Secondary Mapping&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;L &lt;- R&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Secondary to Primary Mapping&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Primary Control&lt;/b&gt; / &lt;b&gt;Secondary Control&lt;/b&gt; - Define whether the trigger is passive (monitored only) or actively driven by the chassis:&lt;ul&gt;&lt;li&gt;X&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Monitor only, driven by instruments installed on that bus segment&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Force trigger line to logic "0"&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Force trigger line to logic "1"&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;blank&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Monitor only, mapped to (driven by) the opposite bus segment&lt;/li&gt;&lt;/ul&gt;Once all of the triggers have been mapped for each bridge, the settings can be saved to EEPROM by selecting the &lt;b&gt;Temperature Settings&lt;/b&gt; tab and clicking on the &lt;b&gt;Save User Settings&lt;/b&gt; button, as represented by the GX7300 panel in figure 6.&amp;nbsp;&amp;nbsp;Once saved, the user defined PXI trigger mapping can be restored manually by clicking on the &lt;b&gt;Recall User Setting&lt;/b&gt; button on the Temperature Setting tab, or automatically on power-up by clicking on the &lt;b&gt;Recall User Settings&lt;/b&gt; radio button under the &lt;b&gt;Load Settings On Power Up&lt;/b&gt; control group.&amp;nbsp;&amp;nbsp;Be sure to save user settings each time you change the Load Settings On Power Up control or the new selection will not be remembered during the next power cycle.&lt;br /&gt; &lt;br /&gt;&lt;div align='center'&gt;&lt;img src="https://www.MarvinTest.com/images/support/.\Q200137\Save-Recall User Settings.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;b&gt;Figure 6 - Save/Recall User Settings&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Setting of the PXI bridge trigger mapping can also be accomplished programmatically using the &lt;b&gt;GxChassisSetPxiTriggerLine &lt;/b&gt;function, and the &lt;b&gt;GxChassisGetPxiTriggerLine &lt;/b&gt;function can be used to query the current trigger mapping settings .&amp;nbsp;&amp;nbsp;The format for these functions are described fully in the GX7XXX User Guide:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;blockquote&gt;GxChassisSetPxiTriggerLine (nHandle, nLine, nSegment, ucDirection, nPrimaryMode, nSecondaryMode,pnStatus)&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;GxChassisGetPxiTriggerLine (nHandle, nLine, nSegment, pucDirection, pnPrimaryMode, pnSecondaryMode,pnStatus)&lt;br /&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The Load Settings On Power Up parameter can be set programmatically using the &lt;b&gt;GxChassisRecallSettings &lt;/b&gt;function.&amp;nbsp;&amp;nbsp;The format for this function is described fully in the GX7XXX User Guide:&lt;br /&gt;&lt;div class='fixedFont'&gt;&lt;blockquote&gt;GxChassisRecallSettings (nHandle, nSettingSource, pnStatus)&lt;br /&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200137/Using-Trigger-Mapping-on-the-GX7XXX-Smart-Chassis</link><pubDate>3/26/2009</pubDate></item><item><title>Support for ECL / PECL Logic Levels - Published on 3/25/2009</title><description>Instruments that provide PECL interfacing are the &lt;b&gt;GX5050&lt;/b&gt;, &lt;b&gt;GX5150&lt;/b&gt; and &lt;b&gt;GX5152&lt;/b&gt;, provide they are configured with the &lt;b&gt;GX5940&lt;/b&gt; PECL I/O module.&amp;nbsp;&amp;nbsp;The &lt;b&gt;GX5280&lt;/b&gt; Series or the &lt;b&gt;GX5290&lt;/b&gt; Series do not have support for PECL. &lt;br /&gt;&lt;br /&gt;ECL (Emitter Coupled Logic) and PECL (Positive ECL) are both differential I/O interfaces and are not compatible with single-ended logic families.&amp;nbsp;&amp;nbsp;ECL logic is designed to work with negative power supply levels, and the normal logic levels for ECL are:&lt;br /&gt;&lt;blockquote&gt;V(OH) = -0.9 V&lt;br /&gt;V(OL) = -1.7 V&lt;/blockquote&gt;&lt;br /&gt;The term PECL means we are using ECL logic but with Positive power supply voltages. The normal logic levels for PECL are:&lt;br /&gt;&lt;blockquote&gt;V(OH) = 4.1 V&lt;br /&gt;V(OL) = 3.3 V&lt;/blockquote&gt;&lt;br /&gt;The &lt;b&gt;GX5280 &lt;/b&gt;and &lt;b&gt;GX5290 &lt;/b&gt;series Digital I/O instruments support two types of logic interfaces, Programmable LVTTL and LVDS – except for the &lt;b&gt;GX5291&lt;/b&gt;, which supports only Programmable LVTTL levels.&amp;nbsp;&amp;nbsp;Neither LVTTL nor LVDS are compatible with ECL or PECL logic.&lt;br /&gt;&lt;br /&gt;LVTTL is a single ended I/O standard with output levels programmable in the range of:&lt;br /&gt;&lt;blockquote&gt;Min:&amp;nbsp;&amp;nbsp;1.4V&lt;br /&gt;Max:&amp;nbsp;&amp;nbsp;3.6V&lt;/blockquote&gt;This is compatible with TTL/LVTTL/CMOS/LVCMOS logic families.&amp;nbsp;&amp;nbsp;&lt;br /&gt;The input thresholds for the LVTTL interface is selectable:&lt;br /&gt;&lt;blockquote&gt;1.5 V, 1.8V, 2.5V, or 3.3 V (all are 5V tolerant)&lt;/blockquote&gt;&lt;br /&gt;LVDS is a differential signal, similar to ECL and PECL, but the levels are incompatible with either ECL or PECL.&amp;nbsp;&amp;nbsp;The levels for LVDS/LVDM/M-LVDS are:&lt;br /&gt;&lt;blockquote&gt;Differential Output Voltage:&lt;br /&gt;&lt;blockquote&gt;480mV (Min.); 650mV (Max.)&lt;/blockquote&gt;Input Threshold:&lt;br /&gt;&lt;blockquote&gt;Positive going threshold: 50mV (Max.)&lt;br /&gt;Negative going threshold: -50mV (Min.)&lt;br /&gt;Input voltage hysteresis: 25mV (Typ.)&lt;/blockquote&gt;&lt;/blockquote&gt;</description><link>https://www.MarvinTest.com/KB/Q200134/Support-for-ECL-PECL-Logic-Levels</link><pubDate>3/25/2009</pubDate></item><item><title>Using WaveEasy with the GX1110 Arbitrary Waveform Generator - Published on 3/25/2009</title><description>WaveEasy can interface with the Geotest GX1110 Arbitrary Waveform Generator software front panel, allowing users to create waveforms using the powerful waveform editor and then downloading the wavefform into the GX1110 memory to generate the wave. The following steps described the process:&lt;br /&gt;&lt;br /&gt;1. Create either a standard waveform, a complex mathematical function, or a free hand waveform within WaveEasy. Further information on using WaveEasy to create waveforms can be found in the GtWave Manual.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/./Q200138/wavepic1.bmp" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;2. Open the GX1110 Software Front Panel from within WaveEasy; Select &lt;b&gt;GtWave Panel &lt;/b&gt;from the WaveEasy &lt;b&gt;Tools&lt;/b&gt; menu or click on the &lt;b&gt;GtWave Panel&lt;/b&gt; button in the toolbar as shown here:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/./Q200138/wavepic2.bmp" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;GtWave Panel &lt;/b&gt;will be displayed:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/./Q200138/wavepic3.bmp" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;3. Initialize the GX1110 Software Front Panel and select &lt;b&gt;Arbitrary Waveform Generator&lt;/b&gt; from the &lt;b&gt;Operation Mode &lt;/b&gt;drop down list:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/./Q200138/wavepic4.bmp" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;4. Enter the ARB &lt;b&gt;Start Address &lt;/b&gt;(typically 0) and the &lt;b&gt;Length&lt;/b&gt; (number of samples) of the waveform you created in WaveEasy:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/./Q200138/wavepic5.bmp" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;5. Select [! WaveEasy&lt;/b&gt; as the source for loading data and enter the &lt;b&gt;Start &lt;/b&gt;(Start pointbv typically 0) and the number of points (&lt;b&gt;Points&lt;/b&gt;)&amp;nbsp;&amp;nbsp;you would like to load (typically the waveform size as noted in step 4). Then click &lt;b&gt;Execute&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/./Q200138/wavepic6.bmp" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;6. Now the waveform data has been loaded from WaveEasy to the GX1110. Make any changes to the set up of the GX1110 such as amplitutde, sample rate, etc. and click on &lt;b&gt;Apply&lt;/b&gt;. Check the &lt;b&gt;Output Enabled &lt;/b&gt;box to prepare for output.&lt;br /&gt;&lt;br /&gt;7. Use the &lt;b&gt;Run&lt;/b&gt; button to start generating the wave, and &lt;b&gt;Stop&lt;/b&gt; button to suspend the waveform output:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/./Q200138/wavepic7.bmp" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200138/Using-WaveEasy-with-the-GX1110-Arbitrary-Waveform-Generator</link><pubDate>3/25/2009</pubDate></item><item><title>GX5290 or GX5280 Series Causing Windows Code 12 Error Indicating Insufficient Resources - Published on 1/13/2009</title><description>When using multiple GX5290 and/or GX5280 DIO devices, Windows might not be able to allocate enough contiguous memory resources causing the OS to generate an error code 12. &lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q2000132-Code12.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;The code 12 error is caused by a limitation in the PC's BIOS and PCI memory allocation system. Each DIO card requires 16MB of PCI of contiguous memory space to map to the DIO's internal memory structure.&lt;br /&gt;&lt;br /&gt;To fix this issue, change the BIOS settings and disable unused peripherals such as LPT1, COM (serial) port, built in audio, and shared graphics memory. This will free up enough resources to allow BIOS and Windows to allocate memory correctly.&lt;br /&gt;&lt;br /&gt;You should also update your system with the latest BIOS version.</description><link>https://www.MarvinTest.com/KB/Q200132/GX5290-or-GX5280-Series-Causing-Windows-Code-12-Error-Indicating-Insufficient-Resources</link><pubDate>1/13/2009</pubDate></item><item><title>ATEasy v6.0 SP2 (build 136) - List of changes - Published on 1/12/2009</title><description>The following changes were done since build 132:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ATEasy v6.0 build 136b, November 2008&lt;/b&gt;&lt;ul&gt;&lt;li&gt;Check All/Check Module does not check if data type of variables, procedures and types is undefined.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;"Too few elements" error message when setting the array initial value with smaller number of elements in the variable property page. ATEasy allows to initial the array with smalller number of elements than what defined in the array. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;.NET set-only properties are rejected when loading the assembly.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Assigning Variant to array of enumerated type generated an exception.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;TestExec. Prompt On Failure does not prompt unless Pause on Failure was checked.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AChart. Current bar value for HiLo Horizontal Bar chart were not drawn correctly, it was drawn vertically instead of horizontally.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Unable to load a driver saved in build 136/142 with WinSocket interface.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New ATEasy.EXE command line option /s used with /b to suppress the error message that is displayed if the build results in error.&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b&gt;ATEasy v6.0 build 136a, October 2008 (intermidiate build)&lt;/b&gt;&lt;ul&gt;&lt;li&gt;When inserting the TestExec driver it create TestExecA shortcut name instead of TestExec.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Passing array of BString to COM method VAR BSTR[] does not work.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Passing array element to Var parameter of late-binding COM/.NET method does not work.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Comparison operands with Variant and unsigned integer returns wrong result.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Passing Var String parameter to an error statement generates an exception.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Passing CreateThread a form procedure generate exception.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;VarDimSize() lDim parameter is now optional (0).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Setting AForm.OnQueryUnload pbCancel to TRUE does not keep the form when exiting a a catch block.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;When inserting a variable under procedure the workspace displays the procedure variable mistakenly.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Project EXE/DLL file path is relative instead of absolute if not overrode by the user from the Project property page.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;TestStatus=ERR terminate the application.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Setting AForm.OnQueryUnload pbCancel to TRUE does not prevent the form from close when exiting a a catch block inside a try statement. &lt;/li&gt;&lt;/ul&gt;&lt;b&gt;ATEasy v6.0 build 136, August 2008 (service pack 2)&lt;/b&gt;&lt;ul&gt;&lt;li&gt;Includes all issues (see below) since build 132 (service pack 1) was release. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New propery AApp.Info property and new type enumAppInfoApp. The property is similar to App.Flags however it retuns a single flag. Two new flags were added aAppInfoIdeAbort and aAppInfoIdeReset indicating True if the user press the IDE abort or Reset command.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix. Test executive exit if the abort / reset statements called from within the program (134c issue).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix. Test executive did not display fail statistics when abort.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix. Type/COM Library display to show void * as Val Any and void ** as Var Any (in both cases address of the variable is pushed).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix. #ifdef work also on symbols (variable, types, procedures) and can be used to test if they exist.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Compiler error is generated if passing Const or literal to Var Any.&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix. Calling a module event in DoIt! mode sometimes ignored.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix. VarChangeType/Str did not work properly with BYREF variants.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix. ATEasy generated exception when cleaning up a parameter after a DLL call with NULL BString.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix. Improved error handling for operation and assignments when using variant data types containg unsigned integers that are unsupported by ole automation.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix. New statement for COM or .NET class does not work if the class resided outside of the current module.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix. Opening a text format driver file with discrete I/O operations did not read the discrete file correctly resulting in removal of the discrete values.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix. Assignment statement between a method or a property to a procedure type variable resulted in NoProcedure.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix. Assignment statement between a module event to a procedure sometimes generates NoProcedure.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix. Assignment statement between a module event to a procedure sometimes resulted in NoProcedure.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix. Opening a workspace files from Windows Explorer sometimes generated an exception.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fix. Compiling a reference to a .NET class virtual property generated an exception.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New support for Variant data types with VT_Ux (unsigned integers) for operators such as add or subtract. Support for these types also expanded for older Windows (e.g. Windows 2K). &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New HW v3.1 (PCI/PXI explorer and hardware access driver) is included in this release - more information is available under Program Files folder, Getotest\HW, ReadMe.txt. &lt;/li&gt;&lt;/ul&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b&gt;ATEasy v6.0 build 134c, April 2008 (intermidiate build)&lt;/b&gt;&lt;ul&gt;&lt;li&gt;DLL Procedure view display the procedure vertically centered next&amp;nbsp;&amp;nbsp;to the +/-.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Task/Test property page will rename the task/test name when untitled base on the task/test title.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Form with many controls are slow to draw in design time.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Changing Tab Order after run and running again genrate exception.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Changing title or name of a symbol not always reflected immediately in the Properties window title.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Startup dialog does not enable the OK button in the Recent page if no recent files are available in the list.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATEasy About dialog displays the product Serial Number.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Variables initial value is shown in the Properties Value page for types such as DateTime, Double and more.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Viewing a Program DLL Constant value caused it value to be deleted after importing the DLL from header file.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Importing string constant from a hedaer file added extra space to the string.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Deleting a procedure variable from the command view is not updated in the command view procedures view.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Some third party controls (such as Microsoft TreeView, ListView) do not anchor correctly after its parent form or container is resize.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATEasy generate exception when calculating watch expression with Late Bind expression with typedef return (for example AHandle).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;On Empty Workspace, Print Document\Selection Enabled instead of disable.&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Unable to set the software license on Vista with user Access Control On.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Loading text format module that have command arguments with function calls corrupt the command argument&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Commands displays a procedure in the parameters box instead of no procedure when the top level command is selcted (i.e. Driver)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Improvments to import C/C++ header file.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Improvements to performance of ComRecive/SetInterfaceEvent.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;When IDE Reset command is executed. OnReset events are called prior to reloading the application.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Toolbar button stays pressed when a combination of buttons is pressed. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Creating MDI child on a different thread than the MDI frame generate exception.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New support for Val/Var Any to DLL procedure to push Value/Pointer instead of just Pointer.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New examples in Language.prg to show calling sprintf and sscanf using optional Var/Val Any. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Optional [Val] Any not passing Null for second level procedure with [Val] Any parameter.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Optional [Val] array did not allocate one element for each dimension if an array was not passed as an argument.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Assigning lLong=vVariant[2] failed while dDouble=vVariant[2] is OK (vVariant contains array of LONG).&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;COM Interface with Xon/Xoff handshake not working properly when set from the driver property page (ComSetup does work).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;SetLogString() with no argument generate exception.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AImageListImage.ExtracIcon changed to AImageListImage.ExtractIcon.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AImageListImage.ExtractIcon generate exception if Icon not exist.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;InputBox/MsgBox window is not using the Windows MessageBox font and sometimes is displayed behind the application window.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AForm.RemoveControl/AForm.RemoveMenu returns Bool value change was reverse to void since causes compatability issue with EXE files.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Internal Error after when event set by AddHandler is called on a form procedure and the procedure calls another control event.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;After editing of a test exec profile, the profile will be reloaded if being used by the test executive.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fault Analysis condition string size limitation increased to 5K.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Test Executive Log Word Wrap is to True to allow longer text not to clip.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Several improvements to the profile action, count and conditions.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New HW v3.0 (PCI/PXI explorer and hardware access driver) is included in this release - more information is available under Program Files folder, Getotest\HW, ReadMe.txt. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New drivers: GX1034, GX2002 and GX2472. &lt;/li&gt;&lt;/ul&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Build 134b November 29, 2007 v6.0&amp;nbsp;&amp;nbsp;(intermidiate build)&lt;/b&gt;&lt;ul&gt;&lt;li&gt;ATEasy now traps exception generated by a DLL when DLL is unloaded&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Test Executive/Profile forms for Select Program/UUT/Profile are sizable&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AForm.RemoveControl/AForm.RemoveMenu returns Bool with False if an&amp;nbsp;&amp;nbsp;error occured&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New drivers GX5290 (GX5292)&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Build 134a November 2, 2007 v6.0&amp;nbsp;&amp;nbsp;(intermidiate build)&lt;/b&gt;&lt;ul&gt;&lt;li&gt;GetCallerName - new internal function to return the caller procedure&amp;nbsp;&amp;nbsp;procedure name or test id&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Support for Right to Left or non-english Locale:&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;When Form.RightToLeft is TRUE, menu, statusbar, and toolbar are displayed from right to left&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;All controls will display text using the current system locale&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;property pages for controls will display text using the current locale&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Form.RightToLeft can be set at run-time (not read-only property) &lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;New Variant constants: VarEmpty, VarErrorArgMissing, &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;DebugLog can be set at run-time (not read-only property anymore)&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200130/ATEasy-v6-0-SP2-build-136-List-of-changes</link><pubDate>1/12/2009</pubDate></item><item><title>ATEasy v7.0 - List of changes - Published on 1/12/2009</title><description>ATEasy version 7.0 contains numerous enhancements to the test development environment, run-time and Test Executive. The following list describes the main changes in this version.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Development Environment&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ATEasy DLL &lt;/b&gt;- ATEasy supports creating a DLL from ATEasy code. The new Library Wizard creates a Library DLL project. Export commands supports generating of .vb/.h header files with prototypes of the functions exported by the DLL so they can be called from C or Visual Basic languages. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Threads Window &lt;/b&gt;- a new debug window for debugging a multi-threaded application. You can use the Threads window to view thread information - call stack and local variables. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Batch Build&lt;/b&gt; - a new command that displays the Batch Build dialog allowing you to select multiple workspace projects for build. The selected projects are saved to the workspace file.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Back/Forward navigation commands &lt;/b&gt;- these new View commands use the history of windows and symbols viewed and allows you to navigate between these symbols. Similar to Internet Explorer, a drop down history lists all symbols viewed in the ATEasy session.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;New Log file format&lt;/b&gt;, Web Archive Single File format (.mht) is available in File Open as well as in ALog's Save and SaveAs methods for Log files.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ATML support &lt;/b&gt;- provides functions to export and import ATEasy test results and test descriptions in ATML format (.xml).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Support for &lt;b&gt;LabView v8.5, v8.6&lt;/b&gt; (all versions from 7.0 to&amp;nbsp;&amp;nbsp;8.6 are now supported) and enhanced support for .NET.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Support for USB &lt;/b&gt;driver interface - provides control of USB RAW or TMC devices using IO Tables or the internal library.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New IDE Workspace Option for default file saving - Binary and Text format saves in both file formats every time the user saves . Allows you to maintain an up to date text format that can be used by external tools such as text editor or a source control application. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New IDE Options: &lt;b&gt;Arguments for External Tools&lt;/b&gt; - a set of predefined variables that are available for invoking External Tools.&amp;nbsp;&amp;nbsp;The Customize Tools dialog has been modified to accept new arguments and their values are passed when the tools are launched.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New IDE Option &lt;b&gt;Auto Recover &lt;/b&gt;- this new option, when set, will cause ATEasy to save your work (modified files) every x minutes to a temporary location. When the workspace is loaded again after a system or any other failure, ATEasy will notify you of the modified files that are available for recovery. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New IDE command: &lt;b&gt;Open Containing Folder &lt;/b&gt;- opens a folder in Windows' Explorer which contains the selected file.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New ATEasy Development Environment automation server (Application)&amp;nbsp;&amp;nbsp;- provides access to some of the IDE functionality.&lt;/li&gt;&lt;/ul&gt; &lt;br /&gt;&lt;h3&gt;Run Time Engine&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;New &lt;b&gt;LoadLibrary/UnloadLibrary statements&lt;/b&gt; for dynamic loading and unloading of DLL libraries while running. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New &lt;b&gt;USB procedures &lt;/b&gt;to control USB RAW or USBTMC devices and support for USB driver interface.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New &lt;b&gt;String tokenizer functions &lt;/b&gt;: Split, Join, Filter, Replace. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New &lt;b&gt;Math functions &lt;/b&gt;- Min and Max returns the minimum or maximum value of two numbers.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New &lt;b&gt;Misc function &lt;/b&gt;- GetCallerName used to retrieve the current or caller procedure name or test id.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New &lt;b&gt;Time functions&lt;/b&gt;: Now, Date, Time, Year, Month, Day, Weekday, Hour, Minute, Second.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New &lt;b&gt;ATask/ATest properties &lt;/b&gt;StartTime and EndTime.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New AApp.Info property and enumAAppInfo returns information about the application.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New Variant constants VarEmpty and VarErrorArgMissing and support for 64 signed and unsigned bit variant integers.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Support for converting a string to DateTime/Currency data types and vice versa.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New optional parameter added to CreateObject() : bFreeThreadingModel.&amp;nbsp;&amp;nbsp;Allows the user to specify the server's threading model to be Free, instead of the Apartment model.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New &lt;b&gt;HW v3.1&lt;/b&gt; (Geotest PCI/PXI explorer and hardware access driver) is included in this release to support VISA, multiple PXI chassis, USB and more. More information is available under Program Files folder, Getotest\HW, ReadMe.txt. &lt;/li&gt;&lt;/ul&gt; &lt;br /&gt;&lt;h3&gt;Test Executive Enhancements &lt;/h3&gt;&lt;ul&gt;&lt;li&gt;External Programs (EXE) Support - Unlike a typical project containing all test programs, supports for external programs allows you to create executables, each containing one (or more) programs, while still allowing all programs to run from the same user interface.&amp;nbsp;&amp;nbsp;The main benefit is the support for modular test program development which allows adding programs to the test executive after the initial release of the application.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Profile driver - create and modify test sequences or profiles programmatically using commands.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Support for Web Archive Single File (.mht) - allows the user to save an HTML test log containing images into a single file.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Ability to disable checking or un-checking of tests and tasks in the tree pane.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New Option to show or hide the Log Summary tab (enOptionsDisplayLogSummaryTab).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New Option to retry a failed Task automatically (enOptionsRetryFailedTask).&lt;/li&gt;&lt;/ul&gt;See the Test Executive Help for detailed information regarding these new features.&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;New Examples/Drivers&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;ATEasyDLL.prj - this example shows how to create an ATEasy DLL and how to use the DLL from ATEasy code or from a C or VB based application.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Profile.prj - this example shows how to use profile commands to create a profile programmatically.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Visa.prj - VISA driver and example - this example shows how to use VISA to control an instrument from ATEasy using the ATEasy Visa.drv driver. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATML.prj - this example shows how to use the new ATEasy ATML driver (ATML.drv) to export and format test description and results.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Ki210x.prj - driver/example for USB based driver Keithley 2100 DMM.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New Geotest drivers for GX1034, GX2002, GX2472 and GX5290.&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200131/ATEasy-v7-0-List-of-changes</link><pubDate>1/12/2009</pubDate></item><item><title>List of changes in GTDIO/DIOEasy Software version 3.20 build 42 - Published on 12/8/2008</title><description>&lt;h3&gt;GTDIO/DIOEasy Version 3.2 Build 42 (December 2008) Change List&lt;/h3&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;- Hardware Support Changes:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;- New support for the GX5055 DIO board.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;- New support for the GX5291 DIO board.&lt;br /&gt;&amp;nbsp;&amp;nbsp;- GtDio versions 3.1 (Build 40) and above does not supports the GT5900, GT2550 and GT5150&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ISA boards anymore, use GTDDIO v3.0 to control these cards.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;- Fixed issues: &lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; • Driver:&lt;b&gt;DioSetupClkStrobeDelay()&lt;/b&gt; returns an error when the handle passed into the function is a File handle.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; • DIOEasy: Gx529X and Gx5055 file types would crash when trying to copy and past channels.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;- New driver (Firmware) functionality:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; • &lt;b&gt;Gx528X/Gx529X:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Additional offset (advance or delay) of -3.0 to +3.0 nSec (0.25 increments) was added&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in order to ease timing alignment between DIO boards in a domain. See&lt;b&gt; DioSetupClkStrobeDelay() &lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function in the "DIO Programmer’s Reference Guide".&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;• &lt;b&gt;Gx529X:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Firmware version 0x8A00 and above allow reading the I/O pins data when the card is in PUASE/HALT state.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Firmware versions 0x8A00 and above integrates high speed memory read back operation.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;- New driver functions:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; • &lt;b&gt;DioSetupExternalRefClkFrequency() &lt;/b&gt;- sets the External refernce clock frequency.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; • &lt;b&gt;DioGetExternalRefClkFrequency() &lt;/b&gt;- returns the External refernce clock frequency.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; • &lt;b&gt;DioFileSetChannelsOrder() &lt;/b&gt;- sets all 32-channels logical order in a DIO file.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; • &lt;b&gt;DioFileGetChannelsOrder() &lt;/b&gt;- returns all 32-channels logical order in a DIO file.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;- DIO Virtual panel:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; • Support configurations using VISA and new multiple chassis slot numbering as&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; well as legacy slot numbering.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; • Cut execution time for upgrading DIO's firmware.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; • Add Domain Setting Save and Recall - allow the user to save/recall the domains&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; timing calibration settings after calibrating the clock and strobe delays between&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boards in the domain.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;- DIO User's Guides:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; • Update all User's Guides "Chapter 3: Installation and Setup" to reflect the&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; support for the new HW v3.0 (PCI/PXI explorer and hardware access driver).&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; • Update the "DIO Software User’s Guide" with the latest DIO panel description&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; and Configuration.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;- Examples&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; • New C example named "GtDioExampleC" supporting all PXI/PCI DIO boards.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; • New VB 6.0 and VB .NET 2005 examples.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; • New Microsoft Visual Basic .NET (2005) GtDio COM Object example.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; • New LabView library and examples.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;- New HW v3.2 ](PCI/PXI explorer and hardware access driver)&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;- The new HW v3.2 is included in this release to support VISA, multiple chassis and more - &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;more information is available under Program Files folder, Getotest\HW, ReadMe.txt. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The new HW provides the following new/revised functionality: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;• New function,&lt;b&gt; DioSetupInitializationVisa()&lt;/b&gt; - initializes the board using VISA, use VISA&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resource string or alias (configure using HW PXI Explorer) to identify the board &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (require NI-MAX).&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;• GtDio boards are shown in VISA resource manager (NI-MAX), using HW v3.1.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;• &lt;b&gt;DioSetupInitialization()&lt;/b&gt; function supports multiple chassis slot numbering (for example &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0x203 - chassis 2 Slot 3) as well as legacy slot numbering (1-255) as displayed&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;in HW v3.1 PXI/PCI explorer.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200128/List-of-changes-in-GTDIO-DIOEasy-Software-version-3-20-build-42</link><pubDate>12/8/2008</pubDate></item><item><title>Should OCLK and CLK_LVDS have the same phase? - Published on 12/2/2008</title><description>CLK_LVDS (J4-P4 and J4-P38) and OCLK (J3-P22) are sourced from different PLL outputs within the DIO's FPGA, so it is possible for them to have different frequencies and different phase settings. Even if the phase settings are the same for both clocks, the actual phase observed at the output will be different since the respective signal paths are quite different.&amp;nbsp;&amp;nbsp;Due to the programmability of it, the OCLK goes thru added logic, such as dividers, delays and an external buffer IC. The LVDS clock exits the PLL and goes straight from the FPGA to the connector, resulting in a much shorter signal path.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;WARNING&lt;/b&gt;:&amp;nbsp;&amp;nbsp;The CLK_LVDS signal is driven directly from the FPGA.&amp;nbsp;&amp;nbsp;Shorting the CLK_LVDS may cause &lt;b&gt;damage &lt;/b&gt;to the FPGA device.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;See Also&lt;/b&gt;:&amp;nbsp;&amp;nbsp;&lt;a href='http://www.geotestinc.com/KnowledgeBase/KBArticle.aspx?ID=126' target='_blank'&gt;Q200126&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200124/Should-OCLK-and-CLK-LVDS-have-the-same-phase</link><pubDate>12/2/2008</pubDate></item><item><title>Using USBTMC instruments in ATEasy 7.0 - Published on 12/2/2008</title><description>ATEasy 7.0 has the capability to control two types of USB devices, USBTMC instruments and USB RAW instruments. &lt;br /&gt;&lt;br /&gt;The following steps will outline how to install, configure, and use the Keithley 2100 USBTMC DMM instrument - this procedure can be applied to other USBTMC instruments:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Plug your USBTMC device into an available USB port on your PC&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; When Windows finds the new hardware, install either the VISA&amp;nbsp;&amp;nbsp;(if you have installed NI VISA for example) USBTMC driver or the Geotest HW driver&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;The Geotest HW driver inf file can be found in Program FIiles\Geotest\HW\Hw.inf &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/usb1.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; From within ATEasy, verify that the driver module you want to use supports USBTMC by checking the driver properties. Make sure the USBTMC and USB checkboxes are set&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/usb6.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Insert the appropriate driver into your System module&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/usb2.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Right click on the driver shortcut and go to the properties to select "USB" within the interfaces tab. Select your USBTMC device in the drop down menu labled "Device". &lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/usb3.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Make sure the Vendor ID, Device ID, and Serial Number match your device.&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/usb4.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Your USBTMC device can now be used in ATEasy by accessing the configured driver.&lt;/li&gt;&lt;/ul&gt;&lt;img src="https://www.MarvinTest.com/images/support/usb5.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;USBTMC devices can also be accessed using the built in ATEasy internal procedures for USB such as USBOpen(), USBSetup(), USBSend(), etc. More information can be found in the ATEasy help under the USB heading.</description><link>https://www.MarvinTest.com/KB/Q200125/Using-USBTMC-instruments-in-ATEasy-7-0</link><pubDate>12/2/2008</pubDate></item><item><title>How does the programmable clock delay affect the CLK_LVDS or OCLK signal? - Published on 12/2/2008</title><description>The programmable clock delay (DioSetupClkStrobeDelay) applies to both the internal and external versions of the OCLK; it is the same signal.&amp;nbsp;&amp;nbsp;OCLK (J3-P22) is derived from an internally generated clock, the delayed version of which actually controls the pattern sequencing.&amp;nbsp;&amp;nbsp;Because the data is clocked using the delayed OCLK, the phase relationship of Data Out to OCLK is consistent regardless of the delay setting.&lt;br /&gt;&lt;br /&gt;The programmable delay has no affect on the CLK_LVDS signal.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;See Also&lt;/b&gt;:&amp;nbsp;&amp;nbsp;&lt;a href='http://www.geotestinc.com/KnowledgeBase/KBArticle.aspx?ID=124' target='_blank'&gt;Q200124&lt;/a&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200126/How-does-the-programmable-clock-delay-affect-the-CLK-LVDS-or-OCLK-signal</link><pubDate>12/2/2008</pubDate></item><item><title>How can you play a sound file within an ATEasy application - Published on 10/7/2008</title><description>One of the simplest methods for playing a sound within an ATEasy application involves using the Windows API function &lt;b&gt;sndPlaySound &lt;/b&gt;that resides in &lt;b&gt;Winmm.dll&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;sndPlaySound&lt;/b&gt; function plays the waveform sound specified either by a file name or by an entry in the registry or the WIN.INI file.&amp;nbsp;&amp;nbsp;The function is described in detail in the &lt;b&gt;Microsoft Developers Network&lt;/b&gt; library under the path:&lt;br /&gt;&lt;blockquote&gt;- Win32 and COM Development&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- Graphics and Multimedia&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- Windows Multimedia&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- Multimedia Reference&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- Multimedia Functions&lt;br /&gt;&lt;/blockquote&gt;The direct link is:&amp;nbsp;&amp;nbsp;&lt;a href='http://msdn.microsoft.com/en-us/library/ms713269.aspx' target='_blank'&gt;MSDN sndPlaySound&lt;/a&gt;.&amp;nbsp;&amp;nbsp;The method for using the &lt;b&gt;sndPlaySound&lt;/b&gt; function can be applied to any of the functions described in the MSDN library.&lt;br /&gt;&lt;br /&gt;To use the &lt;b&gt;sndPlaySound&lt;/b&gt; function within an ATEasy application you will need to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Insert the &lt;b&gt;Winmm.dll&lt;/b&gt; library under the &lt;b&gt;Libraries&lt;/b&gt; sub-module of any ATEasy module (System, Driver or Program) - this example uses the Driver module. You can do this by right clicking on &lt;b&gt;Libraries&lt;/b&gt; and selecting &lt;b&gt;Insert Library Below&lt;/b&gt;. Select the DLL tab and for the &lt;b&gt;DLL File Name&lt;/b&gt; parameter, enter:&amp;nbsp;&amp;nbsp;&lt;b&gt;Winmm.dll&lt;/b&gt;.&amp;nbsp;&amp;nbsp;Since the DLL resides in the Windows System folder, the DLL file path can be omitted.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200118_1a.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Click &lt;b&gt;Insert&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Declare in the libraries &lt;b&gt;Procedures&lt;/b&gt; submodule the following function:&amp;nbsp;&amp;nbsp;&lt;div class='fixedFont'&gt;sndPlaySoundA(Val String : sSoundFile, Val DWord dwFlags) : Bool&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;img src="https://www.MarvinTest.com/images/support/Q200118_1b.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;/blockquote&gt;The constants for the dwFlags parameter are described in the MSDN Library and the header file &lt;b&gt;Mmsystem.h&lt;/b&gt;.&amp;nbsp;&amp;nbsp;The three parameters used in this example are:&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;SND_SYNC = 0x0000 ! Play synchronously (default)&lt;br /&gt;SND_ASYNC = 0x0001&amp;nbsp;&amp;nbsp;! Play asynchronously&lt;br /&gt;SND_LOOP = 0x0008&amp;nbsp;&amp;nbsp;! Loop the sound until next sndPlaySound&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;The ATEasy &lt;b&gt;Getting Started&lt;/b&gt; manual explains how to define a DLL and DLL procedures in an ATEasy application.&amp;nbsp;&amp;nbsp;There are also examples for calling DLL procedures and defining Windows API's in the ATEasy &lt;b&gt;Language.prj&lt;/b&gt; example.&lt;/li&gt;&lt;/ul&gt;Assuming you have a WAV file in the "C:\Sounds" directory called &lt;b&gt;Alert.wav&lt;/b&gt;, then the following ATEasy code can be used to play the sound:&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;sSoundFile: String&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;sSoundFile="C:\\Sounds\\alert.wav" ! Define the WAV file path&lt;br /&gt;&amp;nbsp;&amp;nbsp;sndPlaySoundA(sSoundFile,SND_SYNC) ! Play the sound file&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;The flags can be combined (added) to produce additional effects, such as repeatedly looping the sound for awhile before stopping:&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;sSoundFile: String&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;sSoundFile="C:\\Sounds\\alert.wav" ! Define the WAV file path&lt;br /&gt;&amp;nbsp;&amp;nbsp;sndPlaySoundA(sSoundFile,SND_LOOP+SND_ASYNC) ! Loop the sound indefinately&lt;br /&gt;&amp;nbsp;&amp;nbsp;Delay(2000) ! Allow sound loop to play for 2 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;sndPlaySoundA(sSoundFile,SND_SYNC) ! Terminate the prior sound loop&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;</description><link>https://www.MarvinTest.com/KB/Q200118/How-can-you-play-a-sound-file-within-an-ATEasy-application</link><pubDate>10/7/2008</pubDate></item><item><title>How to terminate an application from within ATEasy - Published on 10/7/2008</title><description>You can use the following Windows API functions defined in Kernel32.dll to terminate an application using the application's name: Process32First, Process32Next, OpenProcess, GetExitCodeProcess, and TerminateProcess.&lt;br /&gt;&lt;br /&gt;First you will need to insert kernel32.dll under Libraries sub-module of the ATEasy module (System, Driver or Program). You can do this by right clicking on &lt;b&gt;Libraries&lt;/b&gt; and selecting &lt;b&gt;Insert Library Below&lt;/b&gt;. Select the DLL tab and enter the following file path under &lt;b&gt;DLL File Name&lt;/b&gt;:&lt;br /&gt;kernel32.dll.&amp;nbsp;&amp;nbsp;Since the DLL resides in the Windows System folder, the DLL file path can be omitted.&lt;br /&gt;&lt;br /&gt;Click &lt;b&gt;Insert&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;You will now need to define several functions under the procedures section of the newly inserted kernel32 library as shown below:&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/killproc1.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;You will also need to define a structure under the types section of the kernel32 library as shown below:&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/killproc2.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;And finally, will need to define the following variables in your module:&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/killproc3.JPG" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;Now you can enter the code required to scan a list of all open processes and terminate one based on its name. In this example, the first instance of&amp;nbsp;&amp;nbsp;&lt;b&gt;Wordpad.exe&lt;/b&gt; will be terminated.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;CreateToolhelp32Snapshot(2, 0)&lt;br /&gt;&lt;br /&gt;ProcInfo.dwSize = sizeOf(ProcInfo)&lt;br /&gt;&lt;br /&gt;!Get first Process's information&lt;br /&gt;Process32First(lHandle, ProcInfo)&lt;br /&gt;&lt;br /&gt;!Loop until wordpad.exe is found or the end of the process list has been reached&lt;br /&gt;repeat&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Get the exe file name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sProcName = lcase(ProcInfo.szExeFile)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Check if the current process is wordpad.exe&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (sProcName = "wordpad.exe")&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!If wordpad.exe is found get its ProcessID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lHandle = OpenProcess(0x1F0FFF,0, ProcInfo.th32ProcessID)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Terminate wordpad.exe&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TerminateProcess(lHandle, -100) ! -100 is user defined exit code&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exitloop&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;&lt;br /&gt;until not Process32Next(lHandle, ProcInfo)&lt;/div&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200119/How-to-terminate-an-application-from-within-ATEasy</link><pubDate>10/7/2008</pubDate></item><item><title>How does ATEasy support GPIB Service Requests (SRQ) - Published on 10/7/2008</title><description>There are several ways to support GPIB SRQ's within ATEasy.&amp;nbsp;&amp;nbsp;They are:&lt;ul&gt;&lt;li&gt;Using SetInterfaceEvent() internal function&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Using the GPIB driver and implementing OnInterface event&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Using EnableInterrupt() internal function&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Using I/O Table Receive operation&lt;/li&gt;&lt;/ul&gt;This article will demonstrate the process for using ATEasy's SetInterfaceEvent() procedure, allowing you to set an ATEasy procedure that will be called by ATEasy when a GPIB SRQ interrupt occurs for a particular GPIB Controller card. A full description of this function is available in ATEasy Help. As there is only one GPIB SRQ line on the GPIB bus, when the event procedure is called, you will have to poll each of the instruments, using GpibSpl(), to find which one requires servicing.&lt;br /&gt;&lt;br /&gt;For example, to assign event procedure OnGpibCntlr1SRQ() to the SRQ interrupt of GPIB controller card1 (there may be more than one GPIB controller card in the system), use the following code:&lt;br /&gt;&lt;div class='fixedFont'&gt;status = SetInterfaceEvent(aioGpib, 0x10000, aioGpibSRQ, OnGpibCntlr1SRQ)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Create a service procedure called OnGpibCntlr1SRQ().&amp;nbsp;&amp;nbsp;The function will search for all of the GPIB drivers in the application system to find the GPIB instrument generating the SRQ:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;OnGpibCntlr1SRQ()&lt;br /&gt;! Declare the following variables &lt;br /&gt;! i&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !short variable to be used as a loop counter&lt;br /&gt;! sDriverName&amp;nbsp;&amp;nbsp; !String to hold the drivers name&lt;br /&gt;! lAddress&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !string to hold GPIB instrument address&lt;br /&gt;! sData&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!String to hold instruments buffer information&lt;br /&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Search all the drivers assigned to the application to find the GPIB drivers&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i=1&amp;nbsp;&amp;nbsp;!System driver numbers start at 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while i &lt;= System.DriversCount&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! System.DriversCount gives the number of drivers assigned to the application&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sDriverName = GetDriverName(i)&amp;nbsp;&amp;nbsp;!Get the name of the driver&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Check if it is a GPIB driver&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if GetDriverType(sDriverName) = aioGpib &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Get the address of the GPIB driver&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lAddress = GetDriverAddress(sDriverName)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Now check Request Service bit (RQS is Bit6) in the instruments Status&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Byte Register (STB). RQS will be set to 1 if service is requested&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(GpibSpl(lAddress) and 0b01000000) &lt;&gt; 0&amp;nbsp;&amp;nbsp;!Check if RQS (bit6) is set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !Read the instruments buffer for information on the SRQ&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sData="" !Clear the buffer array&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GpibReceive(lAddress, "\r\n", 1, 150, 0, sData, 20)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !TODO: Add code to handle the SRQ&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!...&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; endif&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GpibClear(lAddress)&amp;nbsp;&amp;nbsp;!Reset the Gpib Instrument if required&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endif&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; endwhile&lt;br /&gt;)&lt;/div&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200120/How-does-ATEasy-support-GPIB-Service-Requests-SRQ</link><pubDate>10/7/2008</pubDate></item><item><title>How to use C language  structure with bit fields from ATEasy - Published on 9/22/2008</title><description>&lt;b&gt;Solution:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ATEasy language, similar to Microsoft Visual Basic, does not have a bit field data type as C language structures. This does not prevent you from using bit fields structures when calling to C DLLs. In C, bit fields are grouped to integers (short, long, etc) and in ATEasy you substitute the group with the bit field basic type (for example DWord). To Access the specific field in ATEasy you use AND and SHR operators. For example, if in C you have the following structure:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;typedef struct&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;UINT32 data1 : 10;&lt;br /&gt;&amp;nbsp;&amp;nbsp;UINT32 data2 : 6; &lt;br /&gt;&amp;nbsp;&amp;nbsp;UINT32 data3 : 14; &lt;br /&gt;&amp;nbsp;&amp;nbsp;UINT32 data4 : 2 ;&lt;br /&gt;} DWORDBITS;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In ATEasy the structure is defined as DWord (dwBits). Accessing data2 field is done as follows:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;dwData2=(dwBits shr 10) and 0x3F&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;or &lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;dwData2=(dwBits shr 10) and 0b111111&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A more elegant and prone to changes (in the structure fields) is to use a procedure for setting and getting the fields values. Constants that hold the offset and the fields size can be also used as shown here:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;DWORDBITS_DATA2_OFFSET : Word Const = 10&lt;br /&gt;DWORDBITS_DATA2_SIZE : Word Const = 6&lt;br /&gt;&lt;br /&gt;Procedure DWordBitsField(pdwBits, wOffset, dwSize, dwValue) : DWord&lt;br /&gt;&amp;nbsp;&amp;nbsp;pdwBits: Var DWord&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;wOffset : Val Word&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! offset of field, 0 based&lt;br /&gt;&amp;nbsp;&amp;nbsp;dwSize : Val DWord&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! # of bits for the field&lt;br /&gt;&amp;nbsp;&amp;nbsp;dwValue: [Val] DWord&amp;nbsp;&amp;nbsp; ! optional, value of the field&lt;br /&gt;&amp;nbsp;&amp;nbsp;dwMask : DWord &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;! get or set DWordBits fields&lt;br /&gt;&amp;nbsp;&amp;nbsp;dwMask=(2ul ^ dwSize) -1&amp;nbsp;&amp;nbsp;! calc mask, 8 bit integer&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;If ArgMissing(dwValue)&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! get and return the field value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Return&amp;nbsp;&amp;nbsp; (pdwBits shr wOffset) and dwMask&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! set the field and return all the bits&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pdw=(pdwBits and&amp;nbsp;&amp;nbsp;not (dwMask shl wOffset))&amp;nbsp;&amp;nbsp;or (dwValue shl wOffset)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Return pdw&lt;br /&gt;&amp;nbsp;&amp;nbsp;Endif&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Now to set data2 to 35 in dwBits:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;dwData2=DWordbitsField(dwBits, DWORDBITS_DATA2_OFFSET, DWORDBITS_DATA2_SIZE, 35)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To get data2 from dwBits:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;dwData2=DWordbitsField(dwBits, DWORDBITS_DATA2_OFFSET, DWORDBITS_DATA2_SIZE)&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Notes:&lt;/b&gt;&lt;ul&gt;&lt;li&gt;When you import&amp;nbsp;&amp;nbsp;a C header file that contains bit fields ATEasy substitute them with the basic type.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;You can also use the ATEasy Bit() function in the internal library to access (get or set) a single bit. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200102/How-to-use-C-language-structure-with-bit-fields-from-ATEasy</link><pubDate>9/22/2008</pubDate></item><item><title>How can I have two versions of ATEasy in the same computer - Published on 9/4/2008</title><description>ATEasy does not allow running two versions at the same time on the same computer. When you upgrade ATEasy to a newer version, ATEasy setup overrides and replaces current files not allowing you to have two versions of ATEasy on the same computer. The procedure below shows how to install more than one version on the same computer and how to switch between the versions to run specific version. &lt;br /&gt;&lt;br /&gt;The following steps describe installing version 5.0 and 7.0 at the same compute. Make sure to read and understand the whole procedure before attempting to perform it:&lt;br /&gt;&lt;br /&gt;1. Install ATEasy 5 (run ATEasy5.exe and follow the instructions).&lt;br /&gt;2. Copy ATEasy folder and subdirectories (C:\Program Files\ATEasy) to C:\Program Files\ATEasy5.&lt;br /&gt;3. In the Windows System folder (usually C:\Windows\System32) copy ATEasy files and add 5 to the files name. There may be up to 6 files to copy: ATERT.dll, ATERCTL.dll, ATEasy.usr, ATEasyPanel.cpl and optionally ATEasy2_32.dll and ATEZUSER32.dll – add 5 to the filename. For example copy ATERT.dll to ATERT5.dll.&lt;br /&gt;4. Install/upgrade to 7 by running ATEasy7.exe and follow the instructions.&lt;br /&gt;5. Repeat steps 2 and 3&amp;nbsp;&amp;nbsp;(above) this time to ATEasy7 folder and ATERT7.dll etc.&lt;br /&gt;6. At this time ATEasy 7 in ready to run (ATEasy 5 will not run).&lt;br /&gt;7. When you need to switch from version X to Y (5 to 7 or 7 to 5), delete the ATEasy folder and copy ATEasyY folder to ATEasy folder (copy ATEasy5 folder to ATEasy)&amp;nbsp;&amp;nbsp;and copy the ATEasy System files to the original files (for example ATERT5.dll to ATERT.dll). Once files are copied, you will need to re-register the files by opening the windows command prompt (Start, Run Cmd), change the current directory to the Windows System folder ("cd c:\windows\system32")&amp;nbsp;&amp;nbsp;and re-register the two files ATERT.dll and ATECTL.dll ("regsvr32 ATERT.DLL" and "regsvr32ATECTL.dll"). At this point version Y is ready for use.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Notes:&lt;/b&gt;&lt;br /&gt;1. You can create a batch file to automate this process and launch ATEasy at the end. You can create shortcut on your desktop to switch to version Y.&lt;br /&gt;2. Make sure not to attempt to run executables created with newer version of ATEasy with older run time version. Newer run time can run older EXE files.&lt;br /&gt;3. Modifying files created such as programs with newer version of ATEasy with older version of ATEasy is not recommended.&lt;br /&gt;4. If you wish to have diffrenet options and settings for each version you may also need to copy and restore the ATEasy registry settings under HKEY_LOCAL_MACHINE\SOFTWARE\Geotest\ATEasy and HKEY_CURRENT_USER\Software\Geotest\ATEasy.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200101/How-can-I-have-two-versions-of-ATEasy-in-the-same-computer</link><pubDate>9/4/2008</pubDate></item><item><title>How to inform an ATEasy application of a UPS Power Failure - Published on 8/21/2008</title><description>This process will be broken into two parts: first create an application (EXE) that will be called by the UPS Management Software when a power failure occurs. This application should create an AEvent object with a name "UPSPowerFailEvent". After creating it, use the PulseEvent() method to signal the test application that the UPS is now running on battery power and it needs to shut down. Second, the test application will create a thread to watch for a UPSPowerFailEvent signal and if received shut down gracefully.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 1:&lt;/b&gt; Create an application to be run by the UPS Management Software in the event of a power failure. Note: the UPS Management Software is supplied with the UPS&lt;br /&gt;&lt;br /&gt;In ATEasy create an application (for example UPSPowerFailure). In the OnInit event procedure create an object called UPSPowerFailEvent (an object with the same name will be created by the test application). Then use the PulseEvent() method to signal the test application that a power failure has occured.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure System.OnInit()&lt;br /&gt;obUPSEvent: AEvent !Object to inform test application of UPS power failure&lt;br /&gt;{&lt;br /&gt;obUPSEvent = CreateObject("AEvent") ! Create an AEvent object&lt;br /&gt;obUPSEvent.Name="UPSPowerFailEvent" ! Give it the same name as the test application thread &lt;br /&gt;obUPSEvent.PulseEvent() ! Signal the test application of the UPS power failure and that it&lt;br /&gt;! should shutdown&lt;br /&gt;} &lt;/div&gt;&lt;br /&gt;Compile the application and add the name of the executable file to the UPS Management Software Event Notification command line. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 2: &lt;/b&gt;The test application should create a thread when it starts (OnInit). The thread will call a procedure (called MonitorForUPSEvent() in this example). In the procedure create an event with the same name "UPSPowerFailEvent" as used Step 1 above. Then call WaitForSingleObject() to monitor the event signal. Once the wait returns perform the shut down of the application (call abort, exit, display a message etc):&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure MonitorForUPSEvent(lThread)&lt;br /&gt;lThread: Val Long ! Required to create the thread&lt;br /&gt;obUPSEvent: AEvent ! Object to be monitored for UPS Failure&lt;br /&gt;{&lt;br /&gt;obUPSEvent = CreateObject("AEvent") ! Create an object&lt;br /&gt;obUPSEvent.Name=" UPSPowerFailEvent " ! Give it the same name as Step 1&lt;br /&gt;WaitForSingleObject(obUPSEvent.Handle,) ! Wait for a Pulse Event to occur&lt;br /&gt;&lt;br /&gt;! Once the PulseEvent has occurred there are multiple ways of dealing with the shutdown process. These will mainly depend&lt;br /&gt;! on the UPS battery run time. In this example we will use Abort. &lt;br /&gt;&lt;br /&gt;Abort !Jump to System.OnAbort. Add code to OnAbort to run all the instrument and application shutdown routines&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Procedure System.OnInit()&lt;br /&gt;{&lt;br /&gt;	CreateThread(MonitorForUPSEvent)&lt;br /&gt;} &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For instructions on shutting down Windows from ATEasy see KB Article &lt;a href='/KnowledgeBase/KBArticle.aspx?ID=70' target='_blank'&gt;Q200070&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The language.prg has additional examples of how to use events.</description><link>https://www.MarvinTest.com/KB/Q200099/How-to-inform-an-ATEasy-application-of-a-UPS-Power-Failure</link><pubDate>8/21/2008</pubDate></item><item><title>GX5280 and GX5290 Delay Settings - Published on 7/18/2008</title><description>The Gx5280 and Gx5290 boards use a multi-step delay circuit to perform two critical functions:&lt;br /&gt;&lt;br /&gt;1. Time-align the internal main clocks across a multi-module digital domain.&lt;br /&gt;2. Adjusting the timing between the data clock (data out) and strobe clock (data in) signals on each module to ensure that valid setup and/or hold parameters are met while testing the UUT. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Domain Offset&lt;/b&gt;&lt;br /&gt;While all modules in a digital domain use a common reference clock to maintain synchronization of the data clock and strobe clock, the alignment of theese clock edges is not guaranteed across all of the modules in the domain. The Domain Offset delay can be used to calibrate the modules in a domain so that the respective data and strobe clocks on each module are not only phase locked to each other, but are also phase aligned. The edge of each module’s master clock can be adjusted in a +/- 3nS range with 250pSec resolution, with slower edges adjusted in the negative direction, and faster edges adjusted in the positive direction, until all clock edges are aligned.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Clock and Strobe Delays&lt;/b&gt;&lt;br /&gt;The clock and strobe delays are achieved using a two stage process. The first stage is a programmable delay generator capable of generating delays from 0.0nS to 3.0nS, with a 250pS resolution. The second stage consists of a fixed delay generator with six output taps, each offset by 4nS. A switching circuit routs the clock or strobe signal through the appropriate delay path to produce a cumulative delay of the desired value.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Delay Ranges&lt;/b&gt;&lt;br /&gt;There is a gap between the maximum 3.0nS programmable delay in the stage one delay circuit and the minimum 4.0nS delay tap in the stage two delay circuit. These 1nS gaps are found between 3.0nS and 4.0nS, 7.0nS and 8.0nS, 11.0nS and 12.0nS, 15.0nS and 16.0nS, 19.0nS and 20.0nS and 23.0nS and 24.0nS. The second reason for the non-linearity is that there are added propagation delays introduced whenever the stage two delay circuit is included in the signal path. Because these additional delay factors are uncontrolled, each module has the potential for slight variations in the cumulative delays.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200097/GX5280-and-GX5290-Delay-Settings</link><pubDate>7/18/2008</pubDate></item><item><title>Changing the log result during run time after the test result is appended to the log - Published on 7/18/2008</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;You can change the log result during run time (even for tests that have already completed) by utilizing the ATEasy ALog’s Document object. The Document object is consistent with the Document Object Model (DOM of the Internet Explorer) .&lt;br /&gt;&lt;br /&gt;In the example code below, the various data members of the ALog Document object are used to modify the contents of the ATEasy test log. The Document object has access to all the text that is output to the test log.&lt;br /&gt;&lt;br /&gt;You can modify the text of each entry in the test log by accessing the appropriate innerText property.&lt;br /&gt;&lt;br /&gt;Use the following code to modify the log entry corresponding to the first test in the first task:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;! obj is a variable of type Object&lt;br /&gt;&lt;br /&gt;obj=Log.Document.getElementsByTagName("TABLE")&lt;br /&gt;&lt;br /&gt;obj.item(3).cells.item(5).innerText="Some Text"&lt;br /&gt;&lt;br /&gt;! Destroy reference to Document object&lt;br /&gt; obj= Nothing&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Here is an explanation of how to index the different lines of the test&lt;br /&gt;&lt;br /&gt;obj.item(3) corresponds to the first test line in the first task and cells.item(5) corresponds with the sixth column of that particular test line (if you are using a min/max test then this means the test result).&lt;br /&gt;&lt;br /&gt;Here are some other examples:&lt;br /&gt;&lt;br /&gt;If you have 1 task with 2 tests then obj.item(3) will correspond with task1 test1, and obj.item(4) will correspond with task1 test2.&lt;br /&gt;&lt;br /&gt;You have to add 1 to the obj.item index if you are crossing a task. So if you have two tasks, each with 1 test, then obj.item(3) will correspond with task1 test1, and obj.item(5) will correspond with task2 test1.&lt;br /&gt;&lt;br /&gt;Use the View Source Log context menu to see the HTML table structure generated by ATEasy.&lt;br /&gt;&lt;br /&gt;Note: ATEasy Log must be configured to HTML format in order to use the methods described in this article (log.PlainText=False).</description><link>https://www.MarvinTest.com/KB/Q200098/Changing-the-log-result-during-run-time-after-the-test-result-is-appended-to-the-log</link><pubDate>7/18/2008</pubDate></item><item><title>Using threads to execute code within a specified time interval - Published on 6/17/2008</title><description>You can create a thread to execute code at a specified time interval. This can be useful if you want to take a measurement or reading for example every 200 millisecond. Use the following two part process:&lt;br /&gt;&lt;br /&gt;1. Create a thread procedure that accepts one parameter and contains the code you want to repeat on a regular, timed, basis.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The following thread procedure takes 50 measurements. Each measurement takes 200 mSec. Once the measurement is taken, the thread is suspended for the remaining time (of the 200mSec) using the Sleep function, releasing the CPU to handle other tasks: &lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure MeasurementThreadProcedure(num) : Void&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num: Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwTimeStart : DWord&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwTimeEnd : DWord&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i : Long &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! take 50 measurements each should take no more than 200 mSec&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i=0 to 49&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Record time before measurement&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwTimeStart = Tick()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Make measurement&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DMM Measure (g_adMeasurement[i])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Record time after measurement&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwTimeEnd = Tick()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Let thread sleep for the remaining time of this 200ms time cycle&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sleep(200-(dwTimeEnd-dwTimeStart))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;2. In your main program, you create the thread (in this case supended), start it, and then wait for the thread to end before continuing the main program.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; - Create a variable of type AHandle in your variables submodule.&lt;br /&gt;&lt;br /&gt;- Instantiate a thread object and link it to the previously created procedure using the following code:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;hMeasurementThread = CreateThread(MeasurementThreadProc, 1, True, )&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This line of code will create a thread and wait for you to start it with the Resume method. &lt;br /&gt;In this example, MeasureThreadProc is the name of the procedure created in step 1 and MeasurementThreadHandle is the name of the AHandle variable created earlier.&lt;br /&gt;&lt;br /&gt; - Optionaly. Set the priority of the thread to time critical for improved timing accuracy.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;div class='fixedFont'&gt;SetThreadPriority(hMeasurementThread, aPriorityTimeCritical)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt; - Start the thread by calling its ResumeThread function:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;div class='fixedFont'&gt;ResumeThread(hMeasurementThread)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt; - Use the WaitForSingleObject procedure to wait for the thread to finish execution (with a 20 second time out) before finishing your main ATEasy program.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;div class='fixedFont'&gt;WaitForSingleObject(hMeasurementThread, 20000)&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;</description><link>https://www.MarvinTest.com/KB/Q200095/Using-threads-to-execute-code-within-a-specified-time-interval</link><pubDate>6/17/2008</pubDate></item><item><title>Determining the frequency measurement accuracy of the GTX2200 and GC2200 Timer/Counter - Published on 6/17/2008</title><description>For frequency measurements, the GTX2200 family uses a technique known as Reciprocal Counting, a method where the accuracy of the measurement is based on the relationship of the reference clock period and the measurement window duration (gate time), and not the input signal frequency.&lt;br /&gt;&lt;br /&gt;This method measures the time interval between two identical trigger points on the input signal, as defined by the trigger level setting and the trigger slope setting.&amp;nbsp;&amp;nbsp;During the gate time – the window in which the instrument is taking a measurement, the instrument simultaneously counts the number of cycles of the input signal, and the number of clock pulses from the built-in frequency reference.&amp;nbsp;&amp;nbsp;A microprocessor then calculates the frequency of the input signal.&amp;nbsp;&amp;nbsp;The absolute resolution of a measurement is the period of one reference clock cycle, and the relative resolution is equal to the absolute resolution divided by the gate time.&lt;br /&gt;&lt;br /&gt;For example, if the counter incorporates a 100MHz reference clock, then the absolute resolution is eight digits (10nS = 1.0E-8 Seconds).&amp;nbsp;&amp;nbsp;Using a gate time of 100mS, the relative resolution is seven digits irrespective of the input signal frequency (10 nS/0.1S = 1.0E-7 Seconds).&amp;nbsp;&amp;nbsp;The GTX2210, GTX2220 and GTX2230 all use a 100 MHz reference clock, but the GTX2220 and GTX2230 use an interpolation technique which yields an effective absolute resolution of 10 digits, equivalent to a 10 GHz reference clock.&lt;br /&gt;&lt;br /&gt;The overall accuracy of the measurement is degraded by the combined effects of the jitter on the measured signal, the jitter on the reference clock, the accuracy of trigger detection circuit and the accuracy of the gate timer.&amp;nbsp;&amp;nbsp;The frequency measurement accuracies for the GTX2200 family of products are:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;GTX2210/GC2210:&lt;/b&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;#Digits&lt;/th&gt;&lt;th&gt;Gate Time (s)&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;8&lt;/td&gt;&lt;td&gt;1.000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;7&lt;/td&gt;&lt;td&gt;0.100&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;6&lt;/td&gt;&lt;td&gt;0.010&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;5&lt;/td&gt;&lt;td&gt;0.001&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;GTX2220/GC2220 and GTX2230/GC2230:&lt;/b&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;#Digits&lt;/th&gt;&lt;th&gt;Gate Time (s)&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;10&lt;/td&gt;&lt;td&gt;1.000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;9&lt;/td&gt;&lt;td&gt;0.100&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;8&lt;/td&gt;&lt;td&gt;0.010&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;7&lt;/td&gt;&lt;td&gt;0.001&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200094/Determining-the-frequency-measurement-accuracy-of-the-GTX2200-and-GC2200-Timer-Counter</link><pubDate>6/17/2008</pubDate></item><item><title>Why is my plain text Log columns not aligned? - Published on 6/17/2008</title><description>When the &lt;b&gt;ALog.PlainText&lt;/b&gt; property is set to True, ATEasy will use the Internet Explorer (IE) fixed pitch font. By default this will be set to "Courier New", however some systems may have set it to non-fixed pitch font (using IE options). You can override that by setting the &lt;b&gt;ALog.FixedFont.Name&lt;/b&gt; in your application.&amp;nbsp;&amp;nbsp;Once the font is set to a fixed pitch, any print statement in this mode will generate the same spacing for every character. &lt;br /&gt;&lt;br /&gt;The log control font can be set as follows:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Log.FixedFont.Name = "Courier New"&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The log control font size can be set as follows:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Log.FixedFont.Size= 11&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200096/Why-is-my-plain-text-Log-columns-not-aligned</link><pubDate>6/17/2008</pubDate></item><item><title>How do I change the order of controls on a form? - Published on 6/16/2008</title><description>The form controls are drawn according to the order of the Form.Controls where 0 is drawn first and 1 is on top of 0, etc. This is sometimes reffered to as ZOrder of controls. &lt;br /&gt;&lt;br /&gt;At design-time, you can change the order of controls at design time using the Tab Order command (Edit, Arrange, Tab Order) or by dragging the control in the Controls drop down list at the form editor.&lt;br /&gt; &lt;br /&gt;At run-time, you can use the following code to change the ZOrder using the following code:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;img1.ZOrder(aWindowZOrderTop)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;will draw the img1 control on top of all controls. If you want img1 on top of img3, do the following:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;img3.ZOrder(aWindowZOrderTop)&lt;br /&gt;img1.ZOrder(aWindowZOrderTop)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200091/How-do-I-change-the-order-of-controls-on-a-form</link><pubDate>6/16/2008</pubDate></item><item><title>How to change the default printer that ATEasy uses for printing - Published on 5/29/2008</title><description>The following example shows how to change the default printer used by ATEasy when printing using &lt;b&gt;ALog.PrintLog &lt;/b&gt;method or internal functions such as &lt;b&gt;LogPrint&lt;/b&gt;, &lt;b&gt;FilePrint&lt;/b&gt;. The example prints the ALog control (log1) to a network printer:&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure btnPrint.OnClick(): Void Public Compile ! Occurs&lt;br /&gt;! when the mouse button is pressed and released upon the object.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sDefaultPrinter: String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sPrinter: String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ob: Object&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Example for Log Printing with printer different than default&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Use the following to print while prompting the user to select printer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!log1.ExecWB(alogOleCmdIdPrint, alogOleCmdExecOptPromptUser)&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Use the following code to change the default printer &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! (that ATEasy uses when printing) programmatically&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! print to sPrinter to (may be different than current default)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sPrinter="\\\\geoserver\\Dell Laser Printer 5100cn PCL6"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Get current default printer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ob=CreateObject("WScript.Shell")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sDefaultPrinter=ob.RegRead("HKCU\\Software\\Microsoft\\Windows NT\\" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"CurrentVersion\\Windows\\Device")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sDefaultPrinter=Left(sDefaultPrinter, Pos(",", sDefaultPrinter))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Set default printer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ob=CreateObject("WScript.Network")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ob.SetDefaultPrinter(sPrinter)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Print&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log1.PrintLog()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! Restore default printer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ob.SetDefaultPrinter(sDefaultPrinter)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ob=Nothing&lt;br /&gt;}&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200090/How-to-change-the-default-printer-that-ATEasy-uses-for-printing</link><pubDate>5/29/2008</pubDate></item><item><title>Creating Dynamic Forms Using ATEasy - Published on 12/14/2007</title><description>ATEasy supports creating dynamic forms. Usually the form contents: Controls and menus is created at design time using the ATEasy form editor. Dynamic forms are forms that their content is created at run time. While it possible to create the form with all the possible controls that you expecting to use at design time and then use the control &lt;b&gt;Visible &lt;/b&gt;property to show or hide control and &lt;b&gt;Move &lt;/b&gt;method to position them, sometimes you may want to create the controls at run-time based on the form logic.&lt;br /&gt;&lt;br /&gt;To create a dynamic form you create a form at design time with the fixed controls on it. At run time you call the &lt;b&gt;InsertControl&lt;/b&gt;, AForm class method to create and add additional controls:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;btnClicked=InsertControl("btnClicked", "AButton", Form.Width/2-80, Form.Height/2-14, 160, 28)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Once the control is created you can link the control events with an event handler procedure (btnClicked.OnClick) using the &lt;b&gt;AddHandler &lt;/b&gt;statement as shown here:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;AddHandler btnClicked.OnClick, btnClickedOnClick&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Call the &lt;b&gt;RemoveHandler &lt;/b&gt;statement and the &lt;b&gt;RemoveControl&amp;nbsp;&amp;nbsp;&lt;/b&gt;method to and release the handler and&amp;nbsp;&amp;nbsp;delete the control. &lt;br /&gt;&lt;br /&gt;For more information on dynamic forms see the Dynamic Form task in the Forms.prg example.</description><link>https://www.MarvinTest.com/KB/Q200088/Creating-Dynamic-Forms-Using-ATEasy</link><pubDate>12/14/2007</pubDate></item><item><title>ATEasy v6.0 Service Pack 1 (build 134)  - list of changes - Published on 7/20/2007</title><description>ATEasy 6 build 134 contains all fixes and changes since version 6 (build 132). &lt;br /&gt;&lt;br /&gt;The following list the changes that were made:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Enhanced support for .NET and new support for .NET namespace&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Enhanced support for WinSocket interface interface re-openeing when InterfaceInfo changes, support for terminators&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Project new option AutoIncrementFileVersion&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;LoadOnAccess new option for DLL &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AdoDB example - new task that show how to use System.Data for databases using .NET&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;DotNet example - new task showing how to send email using System.Net.Mail using .NET &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Enhanced License Server support with automated setup as service and a way to set the server from the client&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New drivers for Signametrix SM2060/55, SMX4030/32, Navatek NT6000, GX5733, GX5641, GX5642, GX2002, GX6377, GX6384, GxChassis, Gx7xxxA smart chassis), Keithley Instruments 2000/1/2/10 DMMs, Keithley Instruments PXI (DAQ and DIO) boards, Sorensen DCS and DLM600 power supplies&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New command line options for the setup:&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;div class='GB'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Silent mode&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/SetupType"[Typical, Full, LicenseServer]"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Specify one of the setup type, i.e Typical, Full,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LicenseServer&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Default=Typical&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;This command only apply to clean installation&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/TargetDir"Path"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Specify the target directory for the installation&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Default="C:\Program File\ATEasy"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;This command only apply to clean installation&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/Uninst&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Uninstall ATEasy &lt;/div&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;GetLogString - new constant aLogStringAppend to enumALogStringType to return the current append statements string &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Enahance support for WinSocket interface (OnInterface, AutoAccept)&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New Units in the test property page&amp;nbsp;&amp;nbsp; &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Allow passing of Form procedures to DLL/callbacks&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Readonly control properties were change to read/write (for example BorderStyle, Sorted, Style, etc)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AUsers.ShowLogInDialog() returns a user token and AUsers.Login() accept a token&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;CreateObject internal function support for remote host (DCOM) and free&amp;nbsp;&amp;nbsp;treading model&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Tolerance test type Plus and Minus values if left empty allow open end&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New code completion support for .NET overloaded methods and constructors&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Bug fixes&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200086/ATEasy-v6-0-Service-Pack-1-build-134-list-of-changes</link><pubDate>7/20/2007</pubDate></item><item><title>What is the accuracy of the Delay() function? Is background processing occurs while Delay() is called? - Published on 3/13/2007</title><description>&lt;b&gt;Delay() &lt;/b&gt;is accurate to 1msec, however, since the Delay() function allows form events and interrupts to be dispatched, it may not always be accurate to 1msec. You can use the &lt;b&gt;Sleep() &lt;/b&gt;function if you would like to completely suspend the thread and get better accuracy , however your form events will not be dispatched and will look frozen until Sleep is returned (if sleep is called in the form thread). The &lt;b&gt;SetThreadPriority()&lt;/b&gt; may also be used to improve accuracy. While delay is processing an event is, the delay can only return after the event is executed, so make sure the event processing time is short as possible. &lt;br /&gt;&lt;br /&gt;If you still want to process events while you are waiting but want to consume less CPU, use the &lt;b&gt;Tick() &lt;/b&gt;function to implement your own delay and allow other processing such as interrupts, form events and other custom processing while doing it. You should call &lt;b&gt;WaitForEvent() &lt;/b&gt;function to suspend the thread and consume less CPU while waiting to the next event resulting in a better delay function as in the following example:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;lStart=tick()&lt;br /&gt;while tick()-lStart&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! optional&amp;nbsp;&amp;nbsp;- do something&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! suspend to conserve CPU but still allow form events interrupts etc&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WaitForEvent(tick()-lStart)&lt;br /&gt;&lt;br /&gt;endwhile&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200084/What-is-the-accuracy-of-the-Delay-function-Is-background-processing-occurs-while-Delay-is-called</link><pubDate>3/13/2007</pubDate></item><item><title>Calculating time diffrerence using DateTime data type - Published on 3/8/2007</title><description>ATEasy's DateTime type values are really a Double data type - the same applies to a DateTime value in a variant (vtDate) type.&lt;br /&gt;The integer part of the double number is the number of days since 12-30-1899.&amp;nbsp;&amp;nbsp;The fractional part is effectively the time-of-day.&lt;br /&gt;The easiest way to convert a date string into our DateTime is to assign the string to a variant and then assign the variant to a DateTime variable, for example:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;vr01 = "8/25/2006 17:49"&lt;br /&gt;dt01 = vr01&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;DateTime values can be compared with the expected meaning.&amp;nbsp;&amp;nbsp;Since they are really Double values, if you subtract them and store the result in a Double, you have the number of days between the two dates.&amp;nbsp;&amp;nbsp;Similarly, adding a Double to a DateTime, adjusts the date and time by that many days plus a fraction of a day.&lt;br /&gt;Here is an example of subtracting two day/time:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;vr1:Variant&lt;br /&gt;vr2:Variant&lt;br /&gt;&lt;br /&gt;vr1="08/27/06 "&lt;br /&gt;print VarChangeType(vr1, vtDate)&lt;br /&gt;print vr1&lt;br /&gt;vr2="08/28/06 10:48"&lt;br /&gt;print VarChangeType(vr2, vtDate)&lt;br /&gt;print vr2&lt;br /&gt;print vr2-vr1&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;The example will print:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;0&lt;br /&gt;8/27/2006&lt;br /&gt;0&lt;br /&gt;8/28/2006 10:48:00 AM&lt;br /&gt;1.44999999999709 (one day and .449 of 24 hours)&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200083/Calculating-time-diffrerence-using-DateTime-data-type</link><pubDate>3/8/2007</pubDate></item><item><title>ATEasy is unable to load a DLL error when I start my ATEasy application - Published on 12/15/2006</title><description>ATEasy 6.x and above uses &lt;b&gt;LoadLibraryEx &lt;/b&gt;Windows Application Programming Interface (API) function at run time to load the DLLs you described in the ATEasy module (program, system or driver). The function returns a details status which ATEasy displays when it fails. The error will show as "Unable to Load the '%1' DLL file '%2'. Windows API LoadLibraryEx returned error # %3 (0x%4): %5". Prior version of ATEasy returned the error "Unable to load the '%1' DLL file '%2' Error %3 (0x%4): %5".&lt;br /&gt;&lt;br /&gt;Here are a list of possible causes and solution to this problem in case the error description (%5) is "The specified DLL or a referenced DLL could not be found" (error #127/0x7F) or "the specified module could not be found" (error #127/0x7F) or "the specified procedure could not be found"&amp;nbsp;&amp;nbsp;(error #126/0x7E):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Check the DLL library file path and make sure the DLL exist. You can check this from ATEasy DLL Properties. The property page display if the file exist or not, if the file exist it will show the exact location where the DLL file name will be used at run-time.&amp;nbsp;&amp;nbsp;If you are using relative (i.e. ..abc.dll) or no path name in the DLL path in ATEasy you need to make sure the DLL will be located in a folder found relative to the EXE file name as displayed in the Project property page. If you are not using a path in the file name (i.e. kernel32.dll) using no You may have several DLLs of the same name make sure the DLL on the disk is the one you think is loaded - Try to temporary change the DLL Library path in ATEasy to a full path name instead of relative path or no path. This procdure is used usally for error # 127 or&amp;nbsp;&amp;nbsp;0x7F. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The DLL you are using may depends on other DLLs. You can download a tool called &lt;b&gt;DEPENDS.EXE &lt;/b&gt;from &lt;br /&gt;&lt;a href='http://www.support.microsoft.com/kb/198038' target='_blank'&gt;http://www.support.microsoft.com/kb/198038&lt;/a&gt; to see what DLLs are used by the DLL you are trying to load. After you download it, run the program and open the DLL you are trying to load from the DEPENDS file menu and it will show a list of DLLs that are used by your DLL. If it's missing it will show it in red the DLL that is missing.&amp;nbsp;&amp;nbsp;This procdure is used usally for error # 126 or&amp;nbsp;&amp;nbsp;0x7E. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Some DLLs will have initialization code that is called when they are loaded. This code may fail. Follow the DLL manufacturer instruction for setup and preparation before using it or contact the manufacturer for support.&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200082/ATEasy-is-unable-to-load-a-DLL-error-when-I-start-my-ATEasy-application</link><pubDate>12/15/2006</pubDate></item><item><title>How can i disable the popup menu of the ALog control? - Published on 12/11/2006</title><description>The ALog.ShowContextMenuItem method can be used to hide individual items of the contecxt menu. For example:&lt;br /&gt; &lt;br /&gt;&lt;div class='fixedFont'&gt;log1.ShowContextMenuItem(alogContextMenuItemClear, False)&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;would hide the Clear from the context menu.&lt;br /&gt; &lt;br /&gt;To remove the context menu all together add the following to the Form.OnLoad event:&lt;br /&gt; &lt;br /&gt;&lt;div class='fixedFont'&gt;log1.ShowContextMenuItem(-1, False)&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200081/How-can-i-disable-the-popup-menu-of-the-ALog-control</link><pubDate>12/11/2006</pubDate></item><item><title>How to use Microsoft Excel to calculate a statistical/mathematical/financial function from ATEasy - Published on 12/7/2006</title><description>The example creates a hidden Excel workbook, fill the data and calculate &lt;b&gt;TINV &lt;/b&gt;value and return it to ATEasy. &lt;br /&gt;&lt;br /&gt;TINV Excel function used in this example returns the t-value of the Student's t-distribution as a function of the probability and the degrees of freedom.&lt;br /&gt;&lt;br /&gt;You can modify the example to calculate and to use any excel mathematical/statistical/financial formula.&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;ob: Object&lt;br /&gt;&lt;br /&gt;ob=CreateObject("Excel.Application")&lt;br /&gt;if ob=Nothing&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MsgBox("Unable to Create Excel.Application. Check if MS Excel is intsalled properly. Aborting...")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;abort&lt;br /&gt;endif&lt;br /&gt;ob.Caption="ATEasy Excel Function Call Using COM"&lt;br /&gt;ob.Visible=TRUE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! show/activate execl main window&lt;br /&gt;&lt;br /&gt;ob.Workbooks.Add()&amp;nbsp;&amp;nbsp;! add workbook&lt;br /&gt;&lt;br /&gt;ob.Cells.Item(1, 1).Value = 0.054644927&lt;br /&gt;ob.Cells.Item(2, 1).Value = 60.0&lt;br /&gt;ob.Cells.Item(1, 2).Value = "=TINV(A1, A2)"&lt;br /&gt;&lt;br /&gt;print ob.Cells.Item(1, 2).Value &lt;br /&gt;&lt;br /&gt;ob.Workbooks.Item(1).Close(FALSE)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! close workbook do not save changes&lt;br /&gt;ob.Quit()&lt;br /&gt;ob=Nothing&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200080/How-to-use-Microsoft-Excel-to-calculate-a-statistical-mathematical-financial-function-from-ATEasy</link><pubDate>12/7/2006</pubDate></item><item><title>Can an ATEasy executable (EXE) handle command line parameters? - Published on 7/21/2006</title><description>Use the App.CommandLine to retrieive these parameters. The on-line help explains how to use the &lt;b&gt;CommandLine &lt;/b&gt;property of the &lt;b&gt;AApp &lt;/b&gt;class.&lt;br /&gt;&lt;br /&gt;For example if you call your exe:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;abc.exe a.log&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The App.CommandLine will be equal to "a.log" and in you code you can use it:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;SaveLog(App.CommandLine)&lt;/div&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200079/Can-an-ATEasy-executable-EXE-handle-command-line-parameters</link><pubDate>7/21/2006</pubDate></item><item><title>How can I display a PDF file from ATEasy application using WinExec? - Published on 7/21/2006</title><description>Use &lt;b&gt;WinExec()&lt;/b&gt; internal function to open a window with a the PDF document. For example &lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;iStatus=WinExec("\"\\\\MyServerName\\SharedFolder\\Program Files\\"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"ATEasy\\Corporate\\Mercuri\\Help\\MERCURI HELP.pdf\"")&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Note also that the file name is surrounded with double quotes since the file name may contain space which. A space will cause ATEasy the think the first part (up to the space) is the exe and the second is the command line parameters, so to avoid this we use the quotes .&lt;br /&gt;&lt;br /&gt;WinExec will noot generate exception so there is no need for try statement just check as the help says that the returned status or handle is greater than 32.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200078/How-can-I-display-a-PDF-file-from-ATEasy-application-using-WinExec</link><pubDate>7/21/2006</pubDate></item><item><title>How do I modify the test log results numbers format to not display numbers in scientific format? - Published on 7/21/2006</title><description>There are several ways to change the formatting of the test results in the log:&lt;br /&gt;&lt;br /&gt;1. Use the &lt;b&gt;FormtLogString()&lt;/b&gt;to internal functions change the table columns and their contents &lt;br /&gt;&lt;br /&gt;2. In &lt;b&gt;OnEndTest &lt;/b&gt;event call &lt;b&gt;GetLogString()&lt;/b&gt;, modify the string and call &lt;b&gt;SetLogString()&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;The FormatLogString() automatically switches to Scientific format (i.e. 1.2E+07) if the number cannot be displayed. You can override this by changing the test result:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;TestResult=Round(TestResult, -3)&amp;nbsp;&amp;nbsp;! Will truncate and leave only 3 digits after the decimal point.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The second method is a bit more flexible and it gives you full control over the way the &lt;b&gt;TestResult&lt;/b&gt; number is displayed in the log string and than send it back to ATEasy. Once you identify using string manipulation functions the position of the test result in the log string, use the &lt;b&gt;Format()&lt;/b&gt; function to convert the number to a string the way you use it and than replace the test result string. Make sure the code you'll put will work with both HTML and Text test logs.</description><link>https://www.MarvinTest.com/KB/Q200077/How-do-I-modify-the-test-log-results-numbers-format-to-not-display-numbers-in-scientific-format</link><pubDate>7/21/2006</pubDate></item><item><title>ATEasy v6.0 Detailed List of Changes - Published on 7/21/2006</title><description>&lt;b&gt;Development Environment&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Fresh new look for the development environment includes auto hide docking windows, gradient and color customization for menus and toolbars. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Multiple level programs in your project allow you to organize your projects test programs under user defined folders and divide them to categories. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Create folders in your projects to store baggage files of your projects such as documentation, dlls, software components and more. You can open/edit/print these files directly from ATEasy (using Windows shell verbs). &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New program Parameters property page allow you to create and define parameters at design time for AProgram of type Numeric, String and enumerated type. Document shortcuts have description and program shortcut have a way to override and change the program UUT name set in the Program. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Procedure property page: new Compile checkbox, to force a procedure to compile even if not referenced.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Run-Time&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;New class AVirtualKeyboard allow you to control and display the Virtual keyboard on the screen. The virtual keyboard enables touch pane; support for control that require text input using a keyboard that is displayed on the screen and designed for touch panel user interface. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;EnableTouchScreen new internal function to configure and enable automatic support touch panel to your application including support for scrollbar sizing, font changes etc. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AForm.AutoScale - new property enables auto sizing and scaling of the form by setting the AForm.Font. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AProgram, ASystem, ADriver new property Type and new eneum enumAAppItemType. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AProgram, ASystem, ADriver new property Parent to return the parent folder. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AProgram.Parameters new property, ADriver.Parameters also extended to support write at run-time. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ADriver.MiscFolder, AProgram.MiscFolder and ASystem.MiscFolder new property used to store the application files. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ADriver.Tag, AProgram.Tag and ASystem.Tag new property used to store user defined string to the module files. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New classes AAppFolder and AAppShortcut used for module based user defined folders and baggage files. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New statement Append statement - allows you to append text to be appended to the log after the test results is printed. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Support for dynamically creating of menus AMenu.InsertMenu new method to dynamically insert a menu, AMenu.Move new method to move a menu item, AMenu.RemoveMenu. This is similar to 5.0 dynamically creating of form controls using AForm.InsertControl and AForm. RemoveControl. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AButton - multi-line and word wrap text support. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New File and directory functions FileGetStatus, FileCopy, DirectoryCreate, DirectoryRename, DirectoryDelete new internal functions, FileFind now returns optional structure structFileStatus. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ParseDateTime and FormatDateTime new internal functions for date time string manipulation. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The statement AddHandler and RemoveHandler now support .NET, COM events, Control and Menu events (any object type that generate events). &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATEasy now support importing of the new .NET 2.0 framework and Lab View 8.0 (up from .NET 1.1 and LabView 7.1). &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AButton, ARadioButton, ACheckBox new support for multiple lines text and word wrap for the caption property. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AStatusBarPane new support for Progress bar pane - new properties ProgressMin/Max and Value, asbrpStyleProgressBar new member of enumStatusBarPaneStyle. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;enumGetDir has new constants aGetDirApp, aGetDirAppExe, also the aGetDirATEasy now always return the ATEasy folder (and not the EXE when running outside of the IDE). &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New internal function, GetCallbackThunkAddress, the function return the ATEasy procedure thunk so it can be called from an external DLL. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ControlsCount and Controls properties are now available only to controls that are containers: ATab, APanel and AGroupbBox (also AForm). &lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Test Executive&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Full support for touch panel user interface: &lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Modal and Modeless user interface. Modal user interface used mainly for touch panel to replace menus and toolbars with buttons forms to navigate and control the test executive. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The user can define forms designed for touch panel user interface that includes test executive commands or user defined commands to control the test executive&amp;quot;s capabilities via the touch panel in Modal mode. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;User groups based user interface, allow you to customize the user interface for production users, test engineers etc. Each group can have its own privileges and user interface (forms, menu, toolbars and options). &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Customization of forms, menus, toolbar options and more per users group can be set by the administrator with no programming.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Automatic management and backup, save, delete and naming of log files.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Compatibility issues&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ATEasy 6.0 is fully backward compatible with prior versions of ATEasy (3.0-5.0) . Binary files saved in version 6.0 can be loaded using version 5.0 build 94a (but not always with versions prior to 94a). ATEasy 6 can also run EXE created with prior versions. &lt;br /&gt;&lt;br /&gt;See &lt;a href='http://www.geotestinc.com/KnowledgeBase/KBArticle.aspx?ID=75' target='_blank'&gt;Q200075&lt;/a&gt; for a summary and less detailed list of features.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200076/ATEasy-v6-0-Detailed-List-of-Changes</link><pubDate>7/21/2006</pubDate></item><item><title>ATEasy v6.0 Main New Features Summary - Published on 7/20/2006</title><description>&lt;b&gt;Run time and Development:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Fresh new look for the development environment includes auto hide docking windows, gradient and color customization for menus and toolbars. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New support for applications that have a large number of programs, we now provide an easy way to organize these programs. Essentially, the user can define folders under the Programs folders and organize its test program in a tree structure according to their functionality or UUT variants. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Create folders within the project modules that can contain "baggage" information. Things like UUT documentation, fixture wiring, TRDs', software components, etc. These can be opened directly from ATEasy regardless of their application type - i.e. Word, Excel. Etc. The advantage to this is that now, all of the specific files needed for an application can be located in one location, facilitating source control, archiving and backup. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New Full feature, virtual on-screen virtual keyboard. This allows full keyboard support for applications that are designed for touch panel. This feature also includes support for an increased scrollbar size for all windows controls, multi line push buttons and automatic sizing/scaling of a form when it font is changed. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The Internal library contains several new functions and class including support for extended directory and file manipulation, date time parsing, dynamic menu and control creation and extended support for .NET/ActiveX events. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New support for .NET 2.0, LabView 8.0, ActiveX/COM event handlers, DLL callback. &lt;/li&gt;&lt;/ul&gt;Tested under Windows VISTA (b2) &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Test Executive Features:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Full support of test executive features using a touch panel user interface: &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The user can define forms designed for touch panel user interface that includes test executive commands or user defined commands to control the test executive's capabilities via the touch panel. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Virtual keyboard will automatically popup when the current control requires text entry. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Customize the user interface for different classes of users - i.e. operators, technicians, test engineers, etc. Each group can have its own privileges and user interface (forms, menu, toolbars and options).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Automatic management of log files - i.e. when to backup, when to delete, when to save, how to name log files, etc. Previously, the user had to code these capabilities as part of the logging process.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;See &lt;a href='http://www.geotestinc.com/KnowledgeBase/KBArticle.aspx?ID=76' target='_blank'&gt;Q200076&lt;/a&gt; for additional and more detailed list of features.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200075/ATEasy-v6-0-Main-New-Features-Summary</link><pubDate>7/20/2006</pubDate></item><item><title>Getting Return Code from External Process Started with WinExec - Published on 4/24/2006</title><description>&lt;b&gt;Solution:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;WinExec()&lt;/b&gt; does not operate synchronously and will not wait until the called process is closed before returning to the calling application. Instead, it will return immediately and return a process handle indicating if the process was successfully created or not. To access the code returned by the application launched with WinExec(), you will need to use code similar to the following:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;hProcess=WinExec("...")&lt;br /&gt;if hProcess&lt;21&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! error creating the process&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;br /&gt;endif&lt;br /&gt;WaitForSingleObject(hProcess)&lt;br /&gt;GetExitCodeProcess(hProcess, dwCode)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;GetExitCodeProcess &lt;/b&gt;function retrieves the termination status of the specified process, and is defined in kerner32.dll. You will need to define it under a kernel32.dll entry within your module libraries.&amp;nbsp;&amp;nbsp;In ATEasy this function will be defined as:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;GetExitCodeProcess(hProcess: Val AHandle, pdwCode : VAR DWord) : BOOL&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A description of the function is provided below:&lt;br /&gt;&lt;br /&gt;&lt;div class='GB'&gt;&lt;b&gt;GetExitCodeProcess:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;BOOL GetExitCodeProcess&lt;br /&gt;(&lt;br /&gt;HANDLE hProcess,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // handle to the process&lt;br /&gt;LPDWORD lpExitCode&amp;nbsp;&amp;nbsp; // termination status&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Parameters:&lt;/b&gt;&lt;ul&gt;&lt;li&gt;hProcess [in] - Handle to the process. For Windows NT/2000/XP, the handle must have PROCESS_QUERY_INFORMATION access. For more information, see Process Security and Access Rights. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;lpExitCode [out] - Pointer to a variable to receive the process termination status. &lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Return Values:&lt;/b&gt;&lt;br /&gt;If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Remarks:&lt;/b&gt;&lt;br /&gt;If the specified process has not terminated, the termination status returned is STILL_ACTIVE. If the process has terminated, the termination status returned may be one of the following: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;The exit value specified in the ExitProcess or TerminateProcess function. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The return value from the main or WinMain function of the process. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The exception value for an unhandled exception that caused the process to terminate.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200069/Getting-Return-Code-from-External-Process-Started-with-WinExec</link><pubDate>4/24/2006</pubDate></item><item><title>How do I send email from ATEasy? - Published on 4/18/2006</title><description>&lt;b&gt;Solution:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You can do it by using the Microsoft CDO ActiveX/COM library :&lt;br /&gt;&lt;br /&gt;1. Insert the CDO library to your module&lt;br /&gt;&lt;br /&gt;2. Define the following variables:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;cdocfg: CDO.Configuration&lt;br /&gt;msg: CDO.Message&lt;br /&gt;sMyHTMLMessage: String&amp;nbsp;&amp;nbsp;! HTML message&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;3. The following code is an example of how to use the CDO library to send email (may require some changes for error handling message text):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;! create configuration &lt;br /&gt;cdocfg=CreateObject("CDO.Configuration")&lt;br /&gt;cdocfg.Fields.Item(cdoSMTPConnectionTimeout).Value=400 &lt;br /&gt;cdocfg.Fields.Item(cdoSMTPServer).Value="10.10.1.1" ! server address could be also something like "smtp.primenet.com"&lt;br /&gt;cdocfg.Fields.Item(cdoSendUsingMethod).Value=cdoSendUsingPort&lt;br /&gt;cdocfg.Fields.Update()&lt;br /&gt;&lt;br /&gt;! create a message&lt;br /&gt;msg=CreateObject("CDO.Message")&lt;br /&gt;msg.Configuration=cdocfg&lt;br /&gt;msg.From="rony@geotestinc.com"&lt;br /&gt;msg.Subject="Hello world!"&lt;br /&gt;msg.HTMLBody=sMyHTMLMessage&lt;br /&gt;msg.To="\"Ron Y\""&lt;br /&gt;&lt;br /&gt;! send the message&lt;br /&gt;Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; msg.Send()&lt;br /&gt;Catch Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; ! error message&lt;br /&gt;EndTry&lt;br /&gt;&lt;br /&gt;!clean up&lt;br /&gt;mgs=Nothing&lt;br /&gt;cdocfg=Nothing&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200071/How-do-I-send-email-from-ATEasy</link><pubDate>4/18/2006</pubDate></item><item><title>How do I shut down or restart windows from my ATEasy application? - Published on 3/21/2006</title><description>&lt;b&gt;Solution:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;To shut down or restart windows, You need to call a Windows API that is found in USER32.dll. The function is described here:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ExitWindowsEx(uFlags: Val DWord, dwReason: VAL DWord): Bool&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Parameters&lt;/b&gt;&lt;br /&gt;&lt;b&gt;uFlags &lt;/b&gt;- [in] Shutdown type. This parameter must include one of the following values: &lt;br /&gt;&lt;br /&gt;EWX_LOGOFF - 0 - Shuts down all processes running in the logon session of the process that called the ExitWindowsEx function. Then it logs the user off. This flag can be used only by processes running in an interactive user's logon session.&lt;br /&gt; &lt;br /&gt;EWX_POWEROFF - 0x00000008 - Shuts down the system and turns off the power. The system must support the power-off feature. The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section.&lt;br /&gt; &lt;br /&gt;EWX_REBOOT - 0x00000002 -&amp;nbsp;&amp;nbsp;Shuts down the system and then restarts the system. The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section.&lt;br /&gt; &lt;br /&gt;EWX_SHUTDOWN - 0x00000001 - Shuts down the system to a point at which it is safe to turn off the power. All file buffers have been flushed to disk, and all running processes have stopped. The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section. Specifying this flag will not turn off the power even if the system supports the power-off feature. You must specify EWX_POWEROFF to do this. &lt;br /&gt;Windows XP SP1:&amp;nbsp;&amp;nbsp;If the system supports the power-off feature, specifying this flag turns off the power.&lt;br /&gt; &lt;br /&gt;This parameter can optionally include one of the following values:&lt;br /&gt;&lt;br /&gt;EWX_FORCE - 0x00000004 -&amp;nbsp;&amp;nbsp;Windows 2000/NT:&amp;nbsp;&amp;nbsp;Forces processes to terminate. When this flag is set, the system does not send the WM_QUERYENDSESSION and WM_ENDSESSION messages. This can cause the applications to lose data. Therefore, you should only use this flag in an emergency. Starting with Windows XP, these messages will always be sent.&lt;br /&gt; &lt;br /&gt;EWX_FORCEIFHUNG - 0x00000010 - Forces processes to terminate if they do not respond to the WM_QUERYENDSESSION or WM_ENDSESSION message within the timeout interval. For more information, see the Remarks. Windows NT and Windows Me/98/95:&amp;nbsp;&amp;nbsp;This value is not supported.&lt;br /&gt; &lt;br /&gt;&lt;b&gt;dwReason&amp;nbsp;&amp;nbsp;&lt;/b&gt;- [in] Reason for initiating the shutdown. This parameter must be one of the system shutdown reason codes. If this parameter is zero, the SHTDN_REASON_FLAG_PLANNED reason code will not be set and therefore the default action is an undefined shutdown that is logged as "No title for this reason could be found". By default, it is also an unplanned shutdown. Depending on how the system is configured, an unplanned shutdown triggers the creation of a file that contains the system state information, which can delay shutdown. Therefore, do not use zero for this parameter. Windows 2000/NT and Windows Me/98/95:&amp;nbsp;&amp;nbsp;This parameter is ignored.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Return Values&lt;/b&gt;&lt;br /&gt;If the function succeeds, the return value is nonzero. Because the function executes asynchronously, a nonzero return value indicates that the shutdown has been initiated. It does not indicate whether the shutdown will succeed. It is possible that the system, the user, or another application will abort the shutdown.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;See Also&lt;/b&gt;&lt;ul&gt;&lt;li&gt;See &lt;a href='http://msdn.microsoft.com/en-us/library/aa376868.aspx' target='_blank'&gt;microsoft.com&lt;/a&gt; for more information regarding this function.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;See the ATEasy Getting Started manual for more information of how to define an call an external DLL function.&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200070/How-do-I-shut-down-or-restart-windows-from-my-ATEasy-application</link><pubDate>3/21/2006</pubDate></item><item><title>List of issues/changes for ATEasy v4.0 build 94 and ATEasy v5.0 build 104 - Published on 12/5/2005</title><description>Here is the list of changes/issues resolved in build 104a/94a. Changes in [ATEasy5] are specific to v5.0 (104a), changes without [ATEasy5] applies to both&amp;nbsp;&amp;nbsp;build 94a and 104a since 92a and 102a was released.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IDE (development environment)&lt;/b&gt;&lt;ul&gt;&lt;li&gt;Property page of Precise,Tolerance, or Min/Max test types displays "Out of range" warning when enter a hex value between 0x80000000 - 0xFFFFFFFF. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;'Insert Driver' dialog does not display correctly, controls sometime overlap each other &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Viewing/Saving ATEasy program in text mode (.pgt) results in REFX values printed/displayed as decimal rather than hex. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATEasy sometimes crashed when it tries to load/import Function Panel file (.fp) of Version 3.0 &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Unable to select HiMetric scale mode from AForm's Scale property page. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Auto Type Information tooltips does not display the description of the attached procedure when hovering the mouse over command item. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Go To Definitions Of 'xxx' does not show the command when "if" is preceding the command &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;DLL procedures are checked twice when using Check All &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New option to clear the Build Log before build &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Function Panel files (.fp) conversion/import was improved &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Compiler error generate an internal error for struct variable.enumfield.constant &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Code Completion should not displays enum constants when entering '.' character after variable of type enum &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Command is not properly updated when insert/delete its attached procedure's parameter(s) &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;'Goto Defnition Of' does not work for Struct types in the Code View &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Call Completion listbox window's width is not calculated correctly &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Problem undo/redo AForm's menu items &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Unable to build stand-alone EXE in Windows 95/98/Me. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A breakpoint at the last line of a test only works if it's right after the last line of code. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Find dialog hang when searching for non-exist symbol&amp;nbsp;&amp;nbsp;in active view only and current active view is the local varariables frame. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Escape sequence string support for AComboBox and AListBox controls. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;App.ModulePath property has been changed to return the ATEasy folder instead of the application EXE file path when running from the IDE. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Module protection did not protect the documents from viewing / changing in all cases. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Enhanced Font property page of form and controls to include font scripts (e.g. Western, Hebrew etc...). &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATEasy will detect if a wrong version/build of the ATERT.DLL is used. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATEasy may crashes when loading invalid or corrupted project file &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Renaming project file name may crashs ATEasy if File tree view is the current active view of the Workspace window. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Watch window generates 'access violation exception' after entering build-in procedure name (e.g. Sin, Cos, Abs, Round etc...) into the watch list. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Duplicate items in call stack when paused in interrupt handler or Dll call back procedure. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;[ATEasy 5] ATEasy crashed when importing IviConfigServer.h header file and ATEasyPreprocessor.h is missing &lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Run-Time&lt;/b&gt;&lt;ul&gt;&lt;li&gt;During Run-Time Error processing, Ignore statement in OnError() cause ATEasy to crash &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;'Unsupported MSXML2 type' error when inserting Microsoft CML, v5.0 type library &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Program's Status property is not reset to NONE before run &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATEasy crashed while running example Excel project &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Repeated Ignore of "Unable to open interface for driver" errors which occurred in IOTable caused ATEasy to crash &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Redim preserve of array of struct containing field of type Object crash ATEasy &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Unable to print enum's constants (i.e. PRINT enumATestStatus.PASS) &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Text file (.drt, .pgt) loading is terminated when encounter an unclosed string, e.g. "xyz, as supplied parameter in command &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Changing Form.Backcolor does not update the background when AutoRedraw is TRUE &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Form.PopupMenu method does not work if the popup menu does not belong to any menubar or the menubar is not visible &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Setting the Form.AutoRedraw to True for MDI form will corrupt the display of its client area&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Unable to close or save changes in Users dialog after selecting 'Clear User' &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Compiler error when references non-public nested menu , e.g. Menu1.Popup1.Item1, while inside a form event or procedure &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Omitting the error number from the catch module statements, e.g. CATCH MODULE DMM, generate "Expected end-of-line" compiler error &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Array of procedure does not get initialized with its initial value when running in EXE mode &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;WSReceive() erroneously return 0 if the remote socket was closed instead of -1 as documented in the Help &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Form's mouse cursor change does not take effect until the mouse is moved &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Unable to load ActiveX library with version &gt;= 10.0 &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Problem accessing AForm's procedures and variables using array of form &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New optional EndEvents keyword for Exit statement &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Val(sHexString, 16) function's behavior has been modified, it will now convert sHexString to an unsigned integer (i.e. 0xFFFF is 65,535 instead of -1) &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;'Unsupported Types' error when loading ActiveX library containing 64-bit integer data type &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Generates OnQueryUnload and OnUnload events for MDI child form when its parent MDI form is being destroyed. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATEasy EXE will detect if a different build is used for ATERT.dll and ATECTL.dll &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATEasy crashed when run TestExec project more than one and m_stRunTime struct is being watched in the Watch view &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New aFlagsExit flag was added to enumARuntimeFlags which can be used to indicate whether an Exit EndEvents statement has been executed &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Optional EndEvents keyword to be used with Exit statement (i.e. Exit EndEvents) &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AProgram's Uut information is not serialized in text mode. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;[ATEasy 5] Fixed several bugs related to 'Optimize Short Circuit Boolean Expressions' &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;[ATEasy 5] Added supports for callback procedures, this feature provides a way for an external instrument driver (i.e., DLL) or Windows API to call ATEasy procedure when a certain event occurs. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;[ATEasy 5] Added supports for late binding COM/.NET events using AddHandler and RemoveHandler statements. &lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Library&lt;/b&gt;&lt;ul&gt;&lt;li&gt;AForm's DrawText() does not return the width and height. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AForm/Acontrol's Image property does not return the content if window is not visible or covered &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;MDI child form's OnQueryUnload and OnUnload events are not generated when its parent MDI form is being destroyed. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Problem Inserting AChart control into design time dialog of Visual C &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Using Common Dialog with multiple selection files does not return the selections &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;APicture.Render() method does not work &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AControl. Creating a control from text file (property bag) will use the control name as the caption instead of the Caption/Text stored in the text file &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AToolbar with labels displays fixed width buttons instead of variable width buttons base on the button's text &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;When a modeless form is unloaded, its parent form was not activated &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ALabel's appearance always look 3D regardless of the Appearance property setting &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Some of ALog's events were never generated. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ALog.Find() method does not work &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AForm.DrawText() does not use FillColor as background when FontTransparent is True &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AForm.DrawText() method with aformDrawTextVCenter draw mode does not center the text vertically (text is a bit down) &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AForm.Circle() method uses the ForeColor as default color instead of the FillColor &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AForm.Circle() method ignored lArcStart, lArcEnd&amp;nbsp;&amp;nbsp; &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Calling ComSend to send a BString with # of bytes equals 1 fails &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Calling ComOpen after ComClose with no delay between cause ComOpen to fail &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ComSetup - XOn/Xoff Setup sometime does not work &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Form's General property page should not restrict ClientWidth and ClientHeight to 102 and 27 respectively &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATEasy crashed when the focus was changed while inside one of Form's KeyPreview events. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The run-time will detect different version of ActiveX libraries when running EXE. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AListBox control's OnClick() and OnMouseDown() events are not generated for left mouse button &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Setting AForm's menu bar dynamically at run-time (e.g. Form.MenuBar=menu2) causes ATEasy to crash on the next run or exit. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;MsgBox and InputBox always enable its owner window when close regardless of whether the owner was previously disabled. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;[ATEasy 5] Enhanced ACommonDialog control to support directory selection using acdlgOpenOptionsDirectory option. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;[ATEasy 5] AListBox control with CheckBox style and contains no item (empty) may cause ATEasy to crash &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;[ATEasy 5] ATab control's OnPageSelChange() event does not set 'PageNew' parameter correctly &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;[ATEasy 5] Added supports for .NET assemblies. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;[ATEasy 5] Added supports for dynamicly created controls using AForm's InsertControl and RemoveControl methods. &lt;/li&gt;&lt;/ul&gt;&lt;b&gt;TestExec&lt;/b&gt;&lt;ul&gt;&lt;li&gt;When CLEAR LOG is pressed after START, the font and log alignments are not as they should &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;OnReset called twice after we call the reset statement &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Fixed problem related to RunProgram command. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;[ATEasy 5] Replaced all occurences of 'Exit' statement with 'Exit EndEvents' &lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Drivers&lt;/b&gt;&lt;ul&gt;&lt;li&gt;SM204X ATEasy Driver Diode Range off by 1 &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;All ATEasy DIO drivers DioGetDriverSummary generate RT error &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;TE5200 ATEasy driver problem &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New and updated DLLs for various Geotest drivers &lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Setup&lt;/b&gt;&lt;ul&gt;&lt;li&gt;When installing a new ATEasy version/build, personalized settings disappear. &lt;/li&gt;&lt;/ul&gt; &lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200068/List-of-issues-changes-for-ATEasy-v4-0-build-94-and-ATEasy-v5-0-build-104</link><pubDate>12/5/2005</pubDate></item><item><title>Setting form variables and calling form procedures from the creator of the form before the form is displayed. - Published on 9/1/2005</title><description>&lt;b&gt;Solution:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;For a modeless form (Load frmVariable, FALSE):&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;1. Use frmVariable.variableName where the variableName is a form’s public variable. &lt;br /&gt;&lt;br /&gt;2. Use a form procedure to set or get the variable’s value.&amp;nbsp;&amp;nbsp;For example: &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;frmVariable.SetVariableValue(value)&lt;br /&gt;frmVariable.GetVariableValue():type.&amp;nbsp;&amp;nbsp;Note:&amp;nbsp;&amp;nbsp;procedure must be public. &lt;/div&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;For a modal form (Load frm.Variable, TRUE):&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;The caller cannot set the variable or call a procedure because the control does not return to the Load’s callee until the form is destroyed. &lt;br /&gt; &lt;br /&gt;1. You can use a Module (program, system or driver) Procedure or a variable to retrieve a value and use it in the OnLoad Form Event. &lt;br /&gt;&lt;br /&gt;2. You can create the form as modeless (as shown above), set the form’s variables, call the form's procedure and use the Load statement again with TRUE as the mode parameter.&amp;nbsp;&amp;nbsp;See the example below:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;Load frmVariable, FALSE&lt;br /&gt;frmVariable.variableName=value&lt;br /&gt;frmVariable.procName()&lt;br /&gt;Load frmVariable, TRUE&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Note:&amp;nbsp;&amp;nbsp;This procedure can only be implemented in ATEasy 4.0 (build 94) or ATEasy 5.0 (build 102b and above).&amp;nbsp;&amp;nbsp;You can initialize the form to be hidden and then show it just before the second Load statement (frmVariable.Visible=True).&amp;nbsp;&amp;nbsp;See the example below:&lt;br /&gt; &lt;br /&gt;&lt;div class='fixedFont'&gt;Load frmVariable, FALSE&lt;br /&gt;frmVariable.variableName=value&lt;br /&gt;frmVariable.Visible=True&lt;br /&gt;Load frmVariable, TRUE&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;This added line (line 3) will prevent the user from accessing the form control before the form is ready.&lt;br /&gt;&lt;/blockquote&gt;</description><link>https://www.MarvinTest.com/KB/Q200066/Setting-form-variables-and-calling-form-procedures-from-the-creator-of-the-form-before-the-form-is-displayed</link><pubDate>9/1/2005</pubDate></item><item><title>Acquiring data into a file/database without interrupting the current acquisition process. - Published on 8/26/2005</title><description>&lt;b&gt;Problem: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I am trying to get more functionality from my IOTech DaqLab 2000. I have data acquisition on 32 channels that run at about 1Hz each. This data logging is uninterrupted for days at a time. I would like to be able to look at old data without interrupting the current acquisition. I would prefer one continuous file or a database like Access or Oracle that could be viewed and manipulated while the data is logging without causing any data loss. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In ATEasy, you can write a small program that can gather a DAQ’s data and insert it into a text, binary, excel, or database file.&amp;nbsp;&amp;nbsp;You can use IOTech’s DLL functions to gather data and the ATEasy internal library for everything else.&amp;nbsp;&amp;nbsp;The ATEasy Getting Started Manual, which can be downloaded from the Geotest web site, discusses DLL function implementation.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;There are several ways to write to a database file.&amp;nbsp;&amp;nbsp;In the ATEasy Getting Started Manual, an example is provided to show you how to use the Microsoft Active Data Object COM Component (see also the AdoDB.prj example).&amp;nbsp;&amp;nbsp;This library supports a long list of databases that includes Microsoft Access (.mdb files), SQL Server and Oracle.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;You can also read and write to a database using an ODBC driver or a DLL.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200065/Acquiring-data-into-a-file-database-without-interrupting-the-current-acquisition-process</link><pubDate>8/26/2005</pubDate></item><item><title>ATEasy 5.0 Main New Features Summary - Published on 11/9/2004</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;ATEasy 5.0 Main New Features Summary &lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Enhanced &lt;b&gt;Test Executive &lt;/b&gt;with: &lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Touch Screen&lt;/b&gt; user interface; allows operation of test set via touch-screens with a special customized toolbars. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Users and Groups based privileges and customization; the administrator can customize the test executive per user groups without writing code. Each option and each menu command can be hidden or disabled. The toolbar buttons can be also customized per group and its buttons can be hidden or arranged. User can use the administrator set of customization and customize it further if the administrator allowed it. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Complete customization of toolbars menu with or without using users and groups feature. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Many new options including: selection of debugging level for the operator – allows the test engineer to disable selection and running of individual tests or tasks, log failures only. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New commands for better controls of the test executive options and behavior. New test conditions, option to disable menus while program is running, Windows XP style menus and much more.&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;On-line Help for the test executive to provide detail on how to operate and customize the test executive. &lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;New &lt;b&gt;Fault Library&lt;/b&gt;: &lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Fault Library provides a powerful troubleshooting tool for electronic circuits. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A Fault Editor allows program developers to define Fault Conditions to be analyzed by ATEasy during runtime. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;When activated during runtime, the operator can be prompted to replace assemblies or components based on the actual failures (i.e. “Replace U1 and Re-Test”). &lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Open Architecture &lt;/b&gt;Improvements: &lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Built in support for &lt;b&gt;IVI drivers&lt;/b&gt;. ATEasy now includes ATEasy drivers for all the IVI driver classes currently available (DC power supply, Digital multimeter, Function generator &amp; Arb, Oscilloscope, Power meter, RF signal generator, Spectrum analyzer and Switch. ATEasy also support of importing non-class compliant IVI drivers using a new &lt;b&gt;IVI Wizard &lt;/b&gt;and support both IVI driver formats: IVI-C and IVI-COM &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Support for &lt;b&gt;.NET components .Net&lt;/b&gt;. assemblies or assemblies components can be imported to ATEasy and used similar to the way you would use them from Visual Studio .NET languages. This capability provides a truly open architecture by embracing new technologies and is similar to the way COM and DLL extend ATEasy capabilities. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATEasy can now import functions and type declarations directly from &lt;b&gt;C/C++ header &lt;/b&gt;file (.h). This reduces the development cycle and eliminates any errors when calling external DLL library. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;LabView &lt;b&gt;VIs &lt;/b&gt;– ATEasy users can now use existing LabView code in their test applications. All the user needs to do is selects the VI (Virtual Instrument or LLB (library) file and the ATEasy Insert LabView wizard generates an ATEasy procedure to call the VI. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Lab Windows &lt;b&gt;Function Panels Drivers &lt;/b&gt;(.fp) import was improved and generates more accurately ATEasy driver from LabWindows drivers – this feature allows users to use these drivers without the need to re-write them. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATEasy now includes a Summation Import Wizard that allows import of Summation TestCase programs into ATEasy. &lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Enhanced &lt;b&gt;Forms &lt;/b&gt;Features: &lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Two new controls were added: Tab Control (&lt;b&gt;ATab&lt;/b&gt;) and Panel Control (&lt;b&gt;APanel&lt;/b&gt;) &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Current controls where enhanced. For example, the AListBox now support a list of checkboxes. Additionally, Controls now have the XP theme look and the AMenu support the new .NET style menus.. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATEasy forms now support automatic &lt;b&gt;form and controls sizing&lt;/b&gt;. Similar to .NET controls, each control can be anchored and aligned. This allows users to implement sizable forms with minimal coding to size the controls when the form is sized. &lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Programming Language &lt;/b&gt;Enhancements: &lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;New support for &lt;b&gt;COM events handlers &lt;/b&gt;using the &lt;b&gt;AddHandler/RemoveHandler &lt;/b&gt;statements. This allows users to interface with COM applications that generate events. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ATEasy&lt;/b&gt; now supports&lt;b&gt; callback procedures&lt;/b&gt;. ATEasy procedures can be called by an external DLL directly. This feature provides a way for an external instrument driver (i.e. DLL) to call ATEasy procedure when a certain event occurs. Windows API also uses callbacks. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Internal library have new bit manipulation, help, log functions and more. Also new classes properties and methods extend the internal library further.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Support for 64 bit integers.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Other Improvements and Enhancements: &lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;The Integrated Development Environment (IDE) has new dialogs such as Save Modified, new popup Conditions menu and new menu commands. Additionally, many editing features were added or improved. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Many new additional ATEasy drivers. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New examples &lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;And much, much more… &lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200063/ATEasy-5-0-Main-New-Features-Summary</link><pubDate>11/9/2004</pubDate></item><item><title>How to Customize log string for the program header - Published on 6/9/2004</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt; &lt;br /&gt;ATEasy generates the following test log string when a program is start to run. The output is generated after the Program Init events are called as shown here:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;div class='GB'&gt;Program&amp;nbsp;&amp;nbsp;: Program5&amp;nbsp;&amp;nbsp;&lt;br /&gt;UUT&amp;nbsp;&amp;nbsp;:&amp;nbsp;&amp;nbsp;&lt;br /&gt;Serial #&amp;nbsp;&amp;nbsp;:&amp;nbsp;&amp;nbsp;&lt;br /&gt;Start time&amp;nbsp;&amp;nbsp;: 6/9/2004 9:21:46 AM &lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;/div&gt; &lt;br /&gt;To customize the test log program start string you need to add some code of the Program Events OnInit() and OnInitTask(). If the change is for all programs in the project you can place ad the same code in the System Events OnInitProgram() and OnInitTask().&lt;br /&gt;&lt;br /&gt;The code in OnInit/OnInitProgram should load the your form with the special serial number / uut information and than set the log off to prevent ataesy from output it log string and than, output your own customized log string.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Program.OnInit() or System.OnInitProgram()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;! display my serial num form&lt;br /&gt;Load frmMySerialNum&lt;br /&gt;&lt;br /&gt;! Take control over log printing for this event! &lt;br /&gt;SetLogOff()&lt;br /&gt;&lt;br /&gt;! print to log (two ways&lt;br /&gt;&lt;br /&gt;! one way is to modify the ateasy log string&lt;br /&gt;! s=GetLogString()&lt;br /&gt;! modify s using Mid., Pos etc&lt;br /&gt;! print s&lt;br /&gt;&lt;br /&gt;! second way is to output a completly new string, (shown here is the default log string)&lt;br /&gt;&lt;br /&gt;print "&lt;TABLE class=Header border=0&gt;;" \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;TBODY&gt;"; \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;TR&gt;"; \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;TD class=Program align=left width=\"15%\"&gt;Program"; \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;TD class=Program align=left width=\"85%\"&gt;: Program5"; \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;TR&gt;"; \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;TD align=left width=\"15%\"&gt;UUT"; \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;TD align=left width=\"85%\"&gt;: "; \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;TR&gt;"; \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;TD align=left width=\"15%\"&gt;Serial #"; \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;TD align=left width=\"85%\"&gt;: "; \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;TR&gt;"; \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;TD align=left width=\"15%\"&gt;Start time"; \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;TD align=left width=\"85%\"&gt;: 6/9/2004 9:21:46 AM"; \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;/TR&gt;"; \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;/TBODY&gt;"; \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;/TABLE&gt;"; \ &lt;br /&gt;&amp;nbsp;&amp;nbsp; "&lt;HR width=\"100%\"&gt;" &lt;br /&gt;} &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The code shown above is for HTML test log you can make your program works for HTML and Text by using the Log.PlainText property:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;If Log.PlanText&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! print text&lt;br /&gt;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! print HTML&lt;br /&gt;endif&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;You can figure out the ATEasy default log string by right clicking on the log window and selecting View Source from the menu.&lt;br /&gt;&lt;br /&gt;Finally in OnInitTask we have to enable the log again:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Program.OnInitTask()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetLogOn()&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200062/How-to-Customize-log-string-for-the-program-header</link><pubDate>6/9/2004</pubDate></item><item><title>Using ADO to Access a Database from ATEasy - Published on 6/3/2004</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; ATEasy 5.x and above provide a more elaborate example (AdoDb.prj) for accessing database from ATEasy. &lt;br /&gt;&lt;br /&gt;The following describes how to access database using ADODB Active Data Objects) ActiveX library:&lt;br /&gt;&lt;br /&gt;Add ADO (Active Data Objects) type library to your module libraries (You must have VB or Access installed on your machine).&lt;br /&gt;&lt;br /&gt;The following code shows how to open a database for R/W (Declare rs as ADODB.Recordset and sSrc and sCon as String):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;rs=CreateObject("ADODB.Recordset")&lt;br /&gt;&lt;br /&gt;sSrc="SELECT "+m_sField1+", "+ m_sField2+" FROM "+m_sTableName &lt;br /&gt;&lt;br /&gt;sCon="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+m_sDataBaseFile&lt;br /&gt;&lt;br /&gt;rs.Open(sSrc, sCon,,adLockPessimistic)&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Notes: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;m_sField1 and m_sField2 are database field names &lt;br /&gt;m_sTableName is the database table name that contains m_sField1 and m_sField2 &lt;br /&gt;m_sDataBaseFile is the path to the database file.&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;The following code shows how to read a field in the current record:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;rs.Fields.Item(m_sField1).Value&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The following code shows how to set a field in the current record, then update the record:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;rs.Fields.Item(m_sField1).Value=Value&lt;br /&gt;&lt;br /&gt;rs.Update()&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The following code shows how to move to the next record:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;rs.MoveNext&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The following code shows how to close the database connection:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;rs.Close()&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;You can browse on the library object and classes if you need more operations. If you need more help on this select the ADODB library from ATEasy under Libraries and press F1.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200029/Using-ADO-to-Access-a-Database-from-ATEasy</link><pubDate>6/3/2004</pubDate></item><item><title>ATEasy 4.0 build 92 changes - Published on 4/5/2004</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We have release a new build of ATEasy 4.0.&lt;br /&gt;&lt;br /&gt;The new release includes several bug fixes that were found since build 90 was released and some new features as shown here:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Run-Time&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; Form.Refresh method did not invalidate the rectangle and only update the window. &lt;br /&gt;2.&amp;nbsp;&amp;nbsp; Non-public form procedures and events were accessible outside the form even if they are not public. &lt;br /&gt;3.&amp;nbsp;&amp;nbsp; Error in Catch block need to be sent to outer Try Block instead of the current one. &lt;br /&gt;4.&amp;nbsp;&amp;nbsp; Path of CompanyLogo.gif in the test log was changed to absolute from the ATEasy folder. This allows proper display of the log file from any folder. &lt;br /&gt;5.&amp;nbsp;&amp;nbsp; When running from the IDE OnEnd for drivers sometimes did not get called. &lt;br /&gt;6.&amp;nbsp;&amp;nbsp; Assignment of Driver type Structure that is alias (typedef) to a driver DLL type structure to a literal in a program fails loading of EXE. Executable returned ‘Unknown Error’ when running EXE. &lt;br /&gt;7.&amp;nbsp;&amp;nbsp; GPIB IO Table timeout with NI board does not take effect unless with set the timeout in NI max properties. &lt;br /&gt;8.&amp;nbsp;&amp;nbsp; Setting App.StartProgram before the start program gets called did not had any effect. &lt;br /&gt;9.&amp;nbsp;&amp;nbsp; Tolerance test display +3/+0 instead of +3/-0 in the test log. &lt;br /&gt;10.&amp;nbsp;&amp;nbsp;Assign a variant array member which is also an array into another variant generated run-time error #310 : 'Unable to assign a value'. &lt;br /&gt;11.&amp;nbsp;&amp;nbsp;Using function that return a structure field will crash at run-time. &lt;br /&gt;12.&amp;nbsp;&amp;nbsp;Hour glass is displayed when the EXE is loaded. &lt;br /&gt;13.&amp;nbsp;&amp;nbsp;Calling the Abort statement twice will terminate the application. &lt;br /&gt;14.&amp;nbsp;&amp;nbsp;Calling ExitTest statement from OnInitTest will skip OnEndTest. &lt;br /&gt;15.&amp;nbsp;&amp;nbsp;Nested modal forms may hang if no messages are available in Windows queue. &lt;br /&gt;16.&amp;nbsp;&amp;nbsp;After Run/Start, calling Form.TextWidth second time loading same Modal form returns 0 instead of the actual width. &lt;br /&gt;17.&amp;nbsp;&amp;nbsp;Test.Type property can be set at run-time. &lt;br /&gt;18.&amp;nbsp;&amp;nbsp;Form.Tag, Control.Tag type was changed from string to variant. &lt;br /&gt;19.&amp;nbsp;&amp;nbsp;Double precision test type Min/Max/Tolerance Pass/Fail status is evaluated within a 1e-15 tolerance rounded result to avoid floating point errors. &lt;br /&gt;20.&amp;nbsp;&amp;nbsp;Run-time now supports changing the test type at run-time. &lt;br /&gt;21.&amp;nbsp;&amp;nbsp;Allow assign of array literal with different dim size but same count. &lt;br /&gt;22.&amp;nbsp;&amp;nbsp;Assign incompatible data type to initial value of indirect data type VARIANT/DOUBLE/DATETIME/CURRENTCY leaked memory. &lt;br /&gt;23.&amp;nbsp;&amp;nbsp;When calling abort or reset statements ATEasy print ..."Application abort or reset&amp;nbsp;&amp;nbsp;by user" instead of "Application abort or reset".&lt;br /&gt;24.&amp;nbsp;&amp;nbsp;MF42CLOC.DLL causes ATEasy to display ??? in various message boxes and in the Control property pages names. &lt;br /&gt;25.&amp;nbsp;&amp;nbsp;When calling DLL function stack miss-match is now reported if the function is prototype with wrong number of parameters or wrong CDecl/StdCall DLL function definition. &lt;br /&gt;26.&amp;nbsp;&amp;nbsp;Passing a string to VAR Any passes the address of the address of the string instead of the address of the string. &lt;br /&gt;27.&amp;nbsp;&amp;nbsp;Passing NULL to DLL procedure’s parameter of type VAL OBJECT generates 'Internal Run-time Error # 28'. &lt;br /&gt;28.&amp;nbsp;&amp;nbsp;Passing 'NULL' to DLL procedure's parameter of type [VAR] STRING generates compiler error # 620 'Expected l-value'. &lt;br /&gt;29.&amp;nbsp;&amp;nbsp;Passing 'Nothing' to DLL procedure's parameter of type [VAL/VAR] ANY no longer working (did not pass NULL). &lt;br /&gt;30.&amp;nbsp;&amp;nbsp;Compiler Error # 650 "Type 'Object' is undefined" when calling DLL proc which has parameter of type [VAL] OBJECT. &lt;br /&gt;31.&amp;nbsp;&amp;nbsp;Run-time error #310 'Unable to assign a value' when accessing the returning struct's members from a call using Procedure variable. &lt;br /&gt;32.&amp;nbsp;&amp;nbsp;s=FuncReturnVariantContainsStringArray()[0] caused GP fault. &lt;br /&gt;33.&amp;nbsp;&amp;nbsp;Print ProcReturnComplexStruct().m_ArrayOfStruct[0].m_lField1 caused GP fault. &lt;br /&gt;34.&amp;nbsp;&amp;nbsp;Changing TestStatus (i.e. to FAIL) at OnEndTest() event does not have any affect on UUT Status (GetUUTStatus()). &lt;br /&gt;35.&amp;nbsp;&amp;nbsp;StringArray2D[0]=ByteArray1D generated a GP fault. &lt;br /&gt;36.&amp;nbsp;&amp;nbsp;Calling DLL procedure with parameter of type VAR BString generated "Memory Access Violation" run-time error. &lt;br /&gt;37.&amp;nbsp;&amp;nbsp;Assign DateTime to Variant will result in vtDouble instead of vtDate. &lt;br /&gt;38.&amp;nbsp;&amp;nbsp;Goto a label within&amp;nbsp;&amp;nbsp;the same TRY block generates run-time error #330 - 'Catch or EndTry executed without Try'. &lt;br /&gt;39.&amp;nbsp;&amp;nbsp;Unable to 'Ignore' recoverable error inside a CATCH block. &lt;br /&gt;40.&amp;nbsp;&amp;nbsp;FileRead() should not allow reading more than the size of the Fixed size string. &lt;br /&gt;41.&amp;nbsp;&amp;nbsp;Log.Append will not display the image unless an absolute file path is stated. &lt;br /&gt;42.&amp;nbsp;&amp;nbsp;Assignment of array of bytes to string assignement xcaused internal error -33 line -2 &lt;br /&gt;43.&amp;nbsp;&amp;nbsp;MemoryCopy() does not work between array element (string/byte). &lt;br /&gt;44.&amp;nbsp;&amp;nbsp;FileEOF() always returns zero, even when end of file is reached. &lt;br /&gt;45.&amp;nbsp;&amp;nbsp;Changing procedure variable to parameter, setting a constant value, and than changing parameter to var or val causes ATEasy to lock.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IDE (integrated Development Environment)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; Variables property page. Changing procedure variable parameter from none, setting a constant value, and changing parameter to var or val causes ATEasy to lock. &lt;br /&gt;2.&amp;nbsp;&amp;nbsp; Debugger. Aborting the application from the IDE when the form.OnLoad() is in process causes ATEasy Crash upon when Call Stack view is open. &lt;br /&gt;3.&amp;nbsp;&amp;nbsp; Driver shortcut Interface property page. Unable to populate I/O address IO1 with a range of values in the drivers properties/interface section. &lt;br /&gt;4.&amp;nbsp;&amp;nbsp; Text file format. Constants variables should display their initial value even if it’s the same as the default value. &lt;br /&gt;5.&amp;nbsp;&amp;nbsp; Paste Bellow command was enabled for the text editor. &lt;br /&gt;6.&amp;nbsp;&amp;nbsp; Code completion displays function prototype in a different format than text file format. &lt;br /&gt;7.&amp;nbsp;&amp;nbsp; Paste a procedures to procedure view with no procedures will crash. &lt;br /&gt;8.&amp;nbsp;&amp;nbsp; Switching to another user with the same access rights should update menus and views with the new access rights. &lt;br /&gt;9.&amp;nbsp;&amp;nbsp; After loading ATEasy, pressing TaskIt does not necessarily run the task that is shown by the cursor (as gray, not blue). &lt;br /&gt;10.&amp;nbsp;&amp;nbsp;Do not allow drag anything to enum unless it has long + const &lt;br /&gt;11.&amp;nbsp;&amp;nbsp;Globals. Internal Page did not display correct value for CONTROL and FORM variables. &lt;br /&gt;12.&amp;nbsp;&amp;nbsp;ATEasy crashes when the command line is missing the file name after the option flag (e.g. /b). &lt;br /&gt;13.&amp;nbsp;&amp;nbsp;Changes in the current user’s access rights (because of log in) was not reflected to the IDE only after the IDE was closed and open again. &lt;br /&gt;14.&amp;nbsp;&amp;nbsp;Setting the initial value of Optional Variant Val Parameter to 'Nothing' will crash ATEasy upon Save. &lt;br /&gt;15.&amp;nbsp;&amp;nbsp;Converting a number that start with a ‘.’ (i.e. .234) failed when serializing with text file format and from property pages. &lt;br /&gt;16.&amp;nbsp;&amp;nbsp;Command parameters font is using the code editor font. &lt;br /&gt;17.&amp;nbsp;&amp;nbsp;Parsing commands built-in arguments sometimes failed. &lt;br /&gt;18.&amp;nbsp;&amp;nbsp;Changing public attribute of module variable from the variables property page cleared initial value. &lt;br /&gt;19.&amp;nbsp;&amp;nbsp;Double click on a Form will not open the form if we have a browser window open with Forms selected and the form selected in the object view in list mode. &lt;br /&gt;20.&amp;nbsp;&amp;nbsp;ATEasy Crash with ProgramIt after setting the active project. &lt;br /&gt;21.&amp;nbsp;&amp;nbsp;Description in the property page. Tab setting is not the same as in the description view.&amp;nbsp;&amp;nbsp;Pressing enter in the description of the property page will insert a new line. Word wrap was also enabled. &lt;br /&gt;22.&amp;nbsp;&amp;nbsp;Under Windows XP the tree/list view will not show the selection if the window does not have focus. &lt;br /&gt;23.&amp;nbsp;&amp;nbsp;Comparing two drivers that turned out&amp;nbsp;&amp;nbsp;to be identical display a very big message box. &lt;br /&gt;24.&amp;nbsp;&amp;nbsp;The new address when changing the address of a driver from the driver shortcut property page does not always save. &lt;br /&gt;25.&amp;nbsp;&amp;nbsp;Test Property Page. Changing the test type from Min Max to Tolerance or Precise should reuse the values. &lt;br /&gt;26.&amp;nbsp;&amp;nbsp;Change the test type&amp;nbsp;&amp;nbsp;from MIN-MAX to TOLERANCE gets caught in an endless loop &lt;br /&gt;27.&amp;nbsp;&amp;nbsp;Importing FP that uses the new 5.1 specifications crashes ATEasy. &lt;br /&gt;28.&amp;nbsp;&amp;nbsp;Missing files when opening Drivers.wsp (GP1008.drv, GP1650.prj and GT1648.prj). &lt;br /&gt;29.&amp;nbsp;&amp;nbsp;When trying to copy constants from one ATEasy DLL driver to another (replacing all existing duplicates), the program hung up and did not respond to Windows. &lt;br /&gt;30.&amp;nbsp;&amp;nbsp;Clicking on a menu procedure when the properties window is open will cause the document to be modified. &lt;br /&gt;31.&amp;nbsp;&amp;nbsp;Sorted List sym view did not refresh correctly after deleting an item. &lt;br /&gt;32.&amp;nbsp;&amp;nbsp;Occasional crash when running Language and aborting out of multi-threading task. &lt;br /&gt;33.&amp;nbsp;&amp;nbsp;Monitor Window crashes when Clear with Properties Window open. &lt;br /&gt;34.&amp;nbsp;&amp;nbsp;Bitmaps displayed in menus and toolbar have transparent look when running on XP. &lt;br /&gt;35.&amp;nbsp;&amp;nbsp;FileCreate/FileOpen mode enum displayed in decimal instead of hexadecimal. &lt;br /&gt;36.&amp;nbsp;&amp;nbsp;Watch window's display format "All Hexadecimal" caused Bool var to display Hex instead of True/False. &lt;br /&gt;37.&amp;nbsp;&amp;nbsp;Watching variant of type VT_UI4, VT_UI2 (reference) crashed ATEasy. &lt;br /&gt;38.&amp;nbsp;&amp;nbsp;Struct displayed in Watch or CallStack windows will crash ATEasy after Redim the struct's field of type BString array. &lt;br /&gt;39.&amp;nbsp;&amp;nbsp;Redim array which is currently expanded displayed&amp;nbsp;&amp;nbsp;in global call stack caused GP fault. &lt;br /&gt;40.&amp;nbsp;&amp;nbsp;Not all of ATEasy Context Menu update handlers are checking user's rights - for example enabled Edit/Save/View doc for Tester. &lt;br /&gt;41.&amp;nbsp;&amp;nbsp;Breakpoint after the last line of code disappear after refreshing the code view as result of window close or display of different symbol. &lt;br /&gt;42.&amp;nbsp;&amp;nbsp;Run-Current-Task, etc. are enabled even though there is no program module for the project Start-Program and there is no System module. &lt;br /&gt;43.&amp;nbsp;&amp;nbsp;Loading text file with version's time beetween [Dec 31 69 16:00:00] and [Dec 31 69 17:00:00] crashed ATEasy. &lt;br /&gt;44.&amp;nbsp;&amp;nbsp;Internal run-time error #1 when running EXE which contained a module event with local variables and empty code. (i.e. program's OnEndTask()). &lt;br /&gt;45.&amp;nbsp;&amp;nbsp;Startup dialog hang if the recent workspaces list contains a workspace file from a disabled (Power Off or removed from network) network's computer. (i.e. //UNIT219-01//ATeasy//Workspace.wsp). &lt;br /&gt;46.&amp;nbsp;&amp;nbsp;Run-time sometimes stops at breakpoint that is no longer exists. &lt;br /&gt;47.&amp;nbsp;&amp;nbsp;View in Text Format will display current date and user instead of the original one. &lt;br /&gt;48.&amp;nbsp;&amp;nbsp;Project’s Start program is now displayed in bold in the workspace window. &lt;br /&gt;49.&amp;nbsp;&amp;nbsp;Build All will now generate warning if a defined DLL function does not exist in the DLL. &lt;br /&gt;50.&amp;nbsp;&amp;nbsp;License Server was modified to run as a service. Server-client communication was improved. See ReadMe.txt for more information. &lt;br /&gt;51.&amp;nbsp;&amp;nbsp;Code Completion will not work for non-project modules. &lt;br /&gt;52.&amp;nbsp;&amp;nbsp;Text format for ATEasy modules doesn't include Stdcall/CDecl attribute for DLL procs. &lt;br /&gt;53.&amp;nbsp;&amp;nbsp;Changing 'Untitled' Task/Test's title using property page does not update the test/task's Id to a new id based on its name. &lt;br /&gt;54.&amp;nbsp;&amp;nbsp;Saving new module file as a text file format saved it in a binary format. &lt;br /&gt;55.&amp;nbsp;&amp;nbsp;Reloading a driver file since it was modified externally causes the system to be marked as changed. &lt;br /&gt;56.&amp;nbsp;&amp;nbsp;Edit-Find-Replace dlg FindAll flag cannot be remembered correctly - registry says All (True), but ATEasy does not come back with the All option checked. &lt;br /&gt;57.&amp;nbsp;&amp;nbsp;Find in current document doesn't search in menu items until a menu item has been selected. &lt;br /&gt;58.&amp;nbsp;&amp;nbsp;Find-Replace All OldName to NewName can get into very tight loop when there already exist two procedures named OldName and NewName and RenamSym fails on proc OldName because proc NewName already exists.&lt;br /&gt;59.&amp;nbsp;&amp;nbsp;Opening a driver shortcut property pages and changing the driver file name to an invalid file name and switching to Misc. page crashed ATEasy. &lt;br /&gt;60.&amp;nbsp;&amp;nbsp;Access violation opening test in Tests view. Test is under nested task. &lt;br /&gt;61.&amp;nbsp;&amp;nbsp;62Sizing of Members list/Parameters Suggestion for code completion is now remembered between sessions of ATEasy and between subsequent displays. &lt;br /&gt;62.&amp;nbsp;&amp;nbsp;Goto Definition of internal library symbol (i.e. enumATestStatus) in a project without a system (i.e. Language) crashed ATEasy. &lt;br /&gt;63.&amp;nbsp;&amp;nbsp;Drag and Drop is now allowed from one DLL to another. &lt;br /&gt;64.&amp;nbsp;&amp;nbsp;Endless "Illegal Type" message box when viewing parameter of type optional VAR ([VAR]). For example, Add method of treeview's nodes collection. &lt;br /&gt;65.&amp;nbsp;&amp;nbsp;File difference can now use a folder in one of the fields From/To instead of a file. &lt;br /&gt;66.&amp;nbsp;&amp;nbsp;Changing Project Defines should invalidate all compiled code. &lt;br /&gt;67.&amp;nbsp;&amp;nbsp;After pressing Ignore in the dafault error handling the status bar continues to display in red the error message. &lt;br /&gt;68.&amp;nbsp;&amp;nbsp;Changing procedure's local variable of type Fixed string to Val/Var parameter generated endless "Illegal Type" message. &lt;br /&gt;69.&amp;nbsp;&amp;nbsp;Run/Doit! will remove newly typed text of the Debug window. &lt;br /&gt;70.&amp;nbsp;&amp;nbsp;I/O address in the ISA Interface property page is not saved.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Test Executive&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; Hour glass is displayed when filling the tree view when a new program or a profile is selected. &lt;br /&gt;2.&amp;nbsp;&amp;nbsp; New commands to set wait cursor. &lt;br /&gt;3.&amp;nbsp;&amp;nbsp; New commands to set the status bar. &lt;br /&gt;4.&amp;nbsp;&amp;nbsp; Status bar will display driver initialization progress when the test executive is started. &lt;br /&gt;5.&amp;nbsp;&amp;nbsp; TestExec will run a task with out being checked after test -1 statement &lt;br /&gt;6.&amp;nbsp;&amp;nbsp; Menu and Toolbar Icons support the XP transparent Style, Also images are now included for all commands&amp;nbsp;&amp;nbsp;&lt;br /&gt;7.&amp;nbsp;&amp;nbsp; OnEndProgram. Move print of the GetLogString to the beginning to complete the test log before calling other drivers OnEndProgram (e.g. they&amp;nbsp;&amp;nbsp;might call SaveLog). &lt;br /&gt;8.&amp;nbsp;&amp;nbsp; After user login, the string for the log header does not updated by the new user name. &lt;br /&gt;9.&amp;nbsp;&amp;nbsp; Test Executive has a new command to set the CompanyLogo.gif file displayed on the top of the test log. &lt;br /&gt;10.&amp;nbsp;&amp;nbsp;When loading a program to the tree view program tasks are not get expanded to save loading time. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Examples&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; Language.prg Example has new test showing how to use DLL CDecl function call. Th example shows call to atof() using MSVCRT.DLL. also added new examples for Variables, Structures and more.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;New Drivers&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; HW.drv does not return the board description. &lt;br /&gt;2.&amp;nbsp;&amp;nbsp; GT1648.drv - New driver for the GT1648 - analog output.&amp;nbsp;&amp;nbsp;&lt;br /&gt;3.&amp;nbsp;&amp;nbsp; GX5731.drv - New driver for the GX5731 - digital I/O with 128 channels and 32 customizable channels PXI board from Geotest. &lt;br /&gt;4.&amp;nbsp;&amp;nbsp; GX1648.drv - New driver for the GX1648 - analog output. &lt;br /&gt;5.&amp;nbsp;&amp;nbsp; GX1838.drv - New driver for the GX1838 - programmable discrete outputs. &lt;br /&gt;6.&amp;nbsp;&amp;nbsp; GX5050.drv - New driver for the GX5050 - 50MHz digital I/O. &lt;br /&gt;7.&amp;nbsp;&amp;nbsp; NvNT5000.drv - New driver for the NX500/NT5000 ROM emulator boards from Navatek. &lt;br /&gt;8.&amp;nbsp;&amp;nbsp; PiLPxi.drv - driver for System 40 PXI switching board from Pickering Interfaces.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200061/ATEasy-4-0-build-92-changes</link><pubDate>4/5/2004</pubDate></item><item><title>ATEasy 4.0 - What's new - Published on 10/7/2003</title><description>ATEasy version 4.0 contains numerous enhancements to the test development environment. Among the new features included are the ability to import Function Panel (FP) driver files and convert to ATEasy drivers, Integration with Microsoft Source Safe, the ability to show and edit ATEasy documents in text mode and to display file differences side by side. The Test Executive driver was enhanced greatly and uses a new Profile driver that allows you to create and run a profile that is a subset of the application programs, tasks and tests in a user specific/defined order and count. Version 4.0 also contains enhancements to the ATEasy run time engine. New functions were added, for examples, functions to read and write directly to physical memory, which can be useful when writing or creating drivers or prototype to PCI boards. We also improved the speed of the run time engine so that it runs ATEasy application 30% faster than version 3.0. The following lists new features available in ATEasy 4.0:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Open Architecture&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ability to import Function Panel driver files. Function Panel driver file (.fp) is a file of a specific format used by software packages (LabWindows and HP VEE) drivers. The function panel file format is based on the VXIPlug&amp;Play Instrument Driver specifications published by VXIPlug&amp;Play organization (http://www.vxipnp.org). Using the File Open command a Function Panel file (.fp) can be opened and then, converted to ATEasy driver format (.drv). ATEasy will generate a command tree, procedures, DLL function calls, constants and data types as defined in the function panel file and its accompanied C/C++ header file.&amp;nbsp;&amp;nbsp;ATEasy also loads an optional SUB file, which commonly used by IVI drivers.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Source Safe Integration. ATEasy directly interfaces with Microsoft Visual Source Safe. You can 'source control' ATEasy documents/files: Add, Check in, and Check out files directly from ATEasy. It also allows comparing files between versions of ATEasy and showing their versions. Differences are clearly marked and highlighted. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;You can edit or view in text mode ATEasy documents, Program, Driver, System and Project, directly from ATEasy.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Command line options allow you to log on to ATEasy as a specific user, as well as allow you to build an application, print a file or load a file to ATEasy.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;IDE User Interface&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Startup dialog allows opening examples, driver examples and recent workspaces files or create new files or an application using the Application Wizard. This dialog can be programmed to show up at the start up of ATEasy, as well as it is available from File menu command.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Workspace Window has a new Files Tab. The current workspace window is displayed in the Objects Tab while a new tab, Files is showing each current workspace file. This provides a simpler file view of your project file and faster navigation between files. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Workspace window. When ATEasy starts up, the active project is expanded, and Files/Objects tab and selection is restored.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Description button was added to various views. The description view now has a button, displayed on the module view (new), the Forms, Procedures, Tests, and Commands View that can show or hide the view. The button has an indication to show whether the description is empty or not.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Description of objects (sub modules, etc) was enhanced and is more self-explanatory.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Module view. A new view is shown when you click on a module (e.g. Program). The new view displays the module's sub-modules and a larger area containing the module description.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Find and Replace dialogs. They have new options to skip the internal library and whether to re-start the search when the end of file is reached ('All').&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New Program is now created with a Task and a Test.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Insert Object Below/After/At menu command now displays the type of object being inserted, e.g. Insert Variable Below.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New context menu to show/hide toolbars and dockable windows.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Display documents and type libraries progress during ATEasy loading a workspace in the status bar.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Selecting colors from the property pages (e.g. chart, status bar) was enhanced and allows using system colors for controls. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ATEasy notifies you if another application or user modified externally the document that you are currently working on.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Save As Text context menu command allows saving the current file in text mode (same file name with text file extension) without prompting.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Variables and their types (and initial values and descriptions) can be typed directly when renamed from the list view. Additional command was added to perform the in-place editing of the name and type of a variable (Ctrl+F2). For example, you can type "i:int=3!index starts at 3"&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Application Wizard was enhanced to support the new Profile driver.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Programit!&amp;nbsp;&amp;nbsp;New command lets you execute any program, which may not be the first one.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Go to Definition. New menu command (and context menu) opens a window containing the definition or type of the selected symbol.&amp;nbsp;&amp;nbsp;This is a convenient tool that you can use during coding.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Project has an optional setting (in the project property page) that allows including or excluding unreferenced procedures during build.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Certain List view such as variables can now be sorted by Name, Type or Description (display only) by clicking on its column header.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;In the procedures or form view, the procedure combo box provides the Drag and Drop capability.&amp;nbsp;&amp;nbsp;After pulled down the combo list box, you can drag and drop a procedure within the combo list, so that you can re-arrange the procedure list.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The Build menu, Check All includes checking of making sure Dll procedures defined in a module (under Libraries) actually exist in the Dll.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Debugger&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Auto Data Tips - ATEasy will display variables values on the code view in a tooltip window during debugging when the application is paused. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;When an application paused via break point, one can view each variable/parameter value in the variable/parameter view.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Watch and CallStack/Global windows will retain the values even after the current run terminates.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Run Time Engine&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Speed Improvements. Run-time engine runs ATEasy application faster, at least by 30%.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Peek and Poke functions. New functions to read and write directly to the PC physical memory. This is mainly to support PCI/ISA boards driver development. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;MemoryCopy function. New function to copy and fill data between two ATEasy variables.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ArgMissing function. New function to indicate whether an optional parameter was passed to a procedure.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;DoEvents function. New function to allow form events to be nested. Useful when performing long operation in a form event.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Redim statement. New statement to change the dimension of an array size programmatically.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AClipboard class. Allow you to perform clipboard operations and to transfer data between applications (Cut, Copy, Paste, Clear).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;AChart, ASlider, ASwitch controls uses the control area better and optimized more.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;EndEvents keyword. New optional keyword to be used with the Run, Task and Test statements.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;HTML Log uses CSS style sheet that allows changing the test log format attributes easier, e.g., font, color...&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;ADriver.InterfaceType can be set during run-time.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Test Executive and Profile&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Added support to Text and HTML log format.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New Options dialog allows you to specify the default Log format, Clear and Save log before run.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The main window can be divided to two main panes. The left pane, the Tests Pane displays the program tests while the right pane, the Log pane shows the test Log as shown the previous test executive version. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The Tests pane displays in a tree the available tests of the current selected program or profile. A check box appears next to each Program, Task or Test. The user can select individual tests, tasks and programs from the Tests pane to run from the Tests pane. Program or Task is displayed in bold if they are partial selection (e.g. one test is checked and one is unchecked).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;At run-time, these tests are color coded to reflect the test status at run time (black for none, green for Pass and Light Red for Fail and Red for Error). &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The left pane bottom area displays the current selected test properties such as the test Name, Type, Required, Result and Status. At run-time it shows the current running test properties.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The Log, Tests and Tests Properties panes may be visible or hidden from the View menu. At list one Tests or Log Pane must be visible.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Window position and size and Log Options are remembered between sessions.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;New Profile driver. The profile driver allows the user or the test engineer to create profile files for an application. A profile file contains tests, tasks and programs list that can be executed in that specific order and count.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Test Executive can dynamically supports the new Profile. Adding the profile to your system and the Profile command will show in the test executive menus.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;New Examples/Drivers&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hp34401a, FP driver - example for a converted function panel driver.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;MultiPad example - example for MDI application that provides text editor similar to NotePad.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;HW example - example for Port I/O, Memory I/O and PCI device handling.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Additional drivers (Geotest, Adlink, UEI, PC Instruments and more).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200059/ATEasy-4-0-What-s-new</link><pubDate>10/7/2003</pubDate></item><item><title>ATEasy 4.0 build 90 – Release Notes - Published on 7/22/2003</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IDE/Run-Times New Features/Changes&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; AApp.Flags - new flags and re-organizing existing flags. The new flags were added to allow the test executive to synchronize the tree view and the execution after the application uses the Run/Task and Test statements.&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;nbsp; Call Stack window will display binary/hex values of Bool type variables &lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;&amp;nbsp; You can override an internal function by declaring it. ATEasy will call your function instead of the internal one. You can still call the internal one using Internal.Function Name&lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;&amp;nbsp; Drag and drop inside the procedures combo box was added. Also, the drop down list is stayed dropped after dropping&lt;br /&gt;&lt;br /&gt;5.&amp;nbsp;&amp;nbsp; The debugger will pause after stepping/tracing on the last line and will let you examine local variable before exiting the procedure&lt;br /&gt;&lt;br /&gt;6.&amp;nbsp;&amp;nbsp; Leaving Task and Test ID empty should cause their property page to regenerate new Ids&lt;br /&gt;7.&amp;nbsp;&amp;nbsp; Source Safe. Check In will always save the file without prompting the user unless it is a read-only file.&lt;br /&gt;&lt;br /&gt;8.&amp;nbsp;&amp;nbsp; Source Safe. Check Out/Undo Check Out will not prompt the user to save the changes. (This is unnecessary since the file will be replaced by source safe.)&lt;br /&gt;&lt;br /&gt;9.&amp;nbsp;&amp;nbsp; Source Safe. If the file is under source control and was not checked out, any attempt to modify it will be ignored, or the user will be prompted to check out the file. (Depends on the setting of the new "Check Out When Edited' option).&lt;br /&gt;&lt;br /&gt;10.&amp;nbsp;&amp;nbsp;Insert At/After was added to drag and drop depends on the position of the mouse cursor&lt;br /&gt;&lt;br /&gt;11.&amp;nbsp;&amp;nbsp;When debugging (e.g. Doit!) the run-time thread is kept until you restart the application again. This allows DLLs to retain their initialization between subsequent DoIt!s. DLLs and Applications will now initialize and load only between different starts.&lt;br /&gt;&lt;br /&gt;12.&amp;nbsp;&amp;nbsp;Insert Command will prompt for code completion for parameters&lt;br /&gt;&lt;br /&gt;13.&amp;nbsp;&amp;nbsp;DLL libraries can be merged using drag and drop&lt;br /&gt;&lt;br /&gt;14.&amp;nbsp;&amp;nbsp;Control, Form, and Menu property pages supports escape sequence strings in Caption and Text properties&lt;br /&gt;&lt;br /&gt;15.&amp;nbsp;&amp;nbsp;Recent page in Startup dialog has a new button called “Other” that allows opening other files that are not listed in the list&lt;br /&gt;&lt;br /&gt;16.&amp;nbsp;&amp;nbsp;During pause, debugged forms remain painted to allow you to examine the run-time form while pausing&lt;br /&gt;&lt;br /&gt;17.&amp;nbsp;&amp;nbsp;Step-Out is now enabled and allows stepping out of a test&lt;br /&gt;&lt;br /&gt;18.&amp;nbsp;&amp;nbsp;Step Over will not activate the application form causing debugging a form using the Step Over to cause flickering&lt;br /&gt;&lt;br /&gt;19.&amp;nbsp;&amp;nbsp;CreateObject/GetObject now supports "LibraryName.ClassName" or "Class" instead of only supporting the registry ProgID&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;20.&amp;nbsp;&amp;nbsp;Any type is now supported as a variable type and not only as a parameter to a DLL procedure&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Compatibility&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; It is recommended to rebuild your EXE application before using it on the new run-time engine. This is especially needed when running applications that contain the test executive driver.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bug/Issues&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; Compiler. Compiler error was mistakenly reported 'Function has no return statement' when performing CheckIt! on a function&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;nbsp; Compiler. The statement "if lAttrib or ~0xA0" did not generate compiler error&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;&amp;nbsp; Compiler. Checkit! On a module shortcut caused the containing module to be checked instead of the module.&lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;&amp;nbsp; Compiler. Doit! generated compiler error on no-return statement&lt;br /&gt;&lt;br /&gt;5.&amp;nbsp;&amp;nbsp; Compiler. Did not generate error for Val Object type with initial value &lt;br /&gt;&lt;br /&gt;6.&amp;nbsp;&amp;nbsp; Compiler. Did not allow taking address of Const variable even though it allows address of literal constant.&lt;br /&gt;&lt;br /&gt;7.&amp;nbsp;&amp;nbsp; Compiler. Problem with passing Val enumXXX from System to Program.&lt;br /&gt;&lt;br /&gt;8.&amp;nbsp;&amp;nbsp; Compiler. When system procedure with parameter type of public system enum is called via system command, the parse fails the first time, but it is OK on subsequent compilations&lt;br /&gt;&lt;br /&gt;9.&amp;nbsp;&amp;nbsp; Compiler. Structure size and member offset are incorrectly calculated if packing order is greater than 1 when loading type information from a type library.&lt;br /&gt;&lt;br /&gt;10.&amp;nbsp;&amp;nbsp;Compiler. Omitting parameter list when comparing variant to function return value, e.g."IF TestResult &lt; GetTestMax" - will generate wrong PCode that will crash the run-time&lt;br /&gt;&lt;br /&gt;11.&amp;nbsp;&amp;nbsp;Run-Time. Assignment of array of characters to a string could crash ATEasy&lt;br /&gt;&lt;br /&gt;12.&amp;nbsp;&amp;nbsp;Run-Time. ExitTask and Test -1 statements will not work properly in Taskit mode&lt;br /&gt;&lt;br /&gt;13.&amp;nbsp;&amp;nbsp;Run-Time. Calling empty module event crashed ATEasy in stand-alone EXE&lt;br /&gt;&lt;br /&gt;14.&amp;nbsp;&amp;nbsp;Run-Time. Calling System.OnXXX event from a driver will crash if the event does not exist&lt;br /&gt;&lt;br /&gt;15.&amp;nbsp;&amp;nbsp;Run-Time. Passing variant containing array of non-object (LONG[], DOUBLE[], STRING[] etc...) to procedure's parameter of type VAL OBJECT[] (array of type object) could crash ATEasy.&lt;br /&gt;&lt;br /&gt;16.&amp;nbsp;&amp;nbsp;Run-Time. Passing a non-array variant to a procedure's parameter of type VAL array crashed ATEasy.&lt;br /&gt;&lt;br /&gt;17.&amp;nbsp;&amp;nbsp;Run-Time. Test Log tables header for HTML and text displays different strings for Text and HTML: Test-Name and Name.&lt;br /&gt;&lt;br /&gt;18.&amp;nbsp;&amp;nbsp;Run-Time. Changing Projects did not reset the FormatLogString() settings&lt;br /&gt;&lt;br /&gt;19.&amp;nbsp;&amp;nbsp;Run-Time. Late bound call to method which has a parameter which is a safe array fails&lt;br /&gt;&lt;br /&gt;20.&amp;nbsp;&amp;nbsp;Run-Time. Assigning a variant to another did not set the LValue variant type as the right side&lt;br /&gt;&lt;br /&gt;21.&amp;nbsp;&amp;nbsp;Run-Time. Passing array of string to a variant generated run-time error #427&lt;br /&gt;&lt;br /&gt;22.&amp;nbsp;&amp;nbsp;Run-Time. DoIt! of program code followed by Run-Start command did not compile or execute program events&lt;br /&gt;&lt;br /&gt;23.&amp;nbsp;&amp;nbsp;Run-Time. Form's drawing functions (Circle, Rectangle, DrawText etc...) did not work after the first usage.&lt;br /&gt;&lt;br /&gt;24.&amp;nbsp;&amp;nbsp;Run-Time. Passing negative number to Output IO table operation generated sometimes "Out Of Range" message&lt;br /&gt;&lt;br /&gt;25.&amp;nbsp;&amp;nbsp;Run-Time. Print statement in HTML mode truncated string above 1024 characters caused the log to display garbage &lt;br /&gt;&lt;br /&gt;26.&amp;nbsp;&amp;nbsp;Run-Time. Assigning structure literal to element of structure array VAR parameter generated access violation in RT&lt;br /&gt;&lt;br /&gt;27.&amp;nbsp;&amp;nbsp;Run-Time. Return statement in procedure which returns a complex type and which also has structure literal generated run-time error when run from EXE file&lt;br /&gt;&lt;br /&gt;28.&amp;nbsp;&amp;nbsp;Run-Time. Passing address of a variable to a Val parameter of type LONG generated parser error #612 'Type of argument is incompatible'.&lt;br /&gt;&lt;br /&gt;29.&amp;nbsp;&amp;nbsp;Run-Time. Setting default value of optional parameter that its type is resolved to object will crash during Build/Execute.&lt;br /&gt;&lt;br /&gt;30.&amp;nbsp;&amp;nbsp;Run-Time. Passing variable of type object to a parameter of type "[Var] Variant" generated run-time error # 407.&lt;br /&gt;&lt;br /&gt;31.&amp;nbsp;&amp;nbsp;Run-Time. The statement proc=Program.OnInit did not work from the driver&lt;br /&gt;&lt;br /&gt;32.&amp;nbsp;&amp;nbsp;Controls. Changing list item's text using List() property of AListBox or AComboBox reset item data to 0.&lt;br /&gt;&lt;br /&gt;33.&amp;nbsp;&amp;nbsp;Controls. Inserting, deleting or changing item of a sorted AListBox or AComboBox control in design mode using List property page unsorted current items.&lt;br /&gt;&lt;br /&gt;34.&amp;nbsp;&amp;nbsp;Controls. Changing round slider control's ticks spacing to non-auto (interval, division) could crash ATEasy.&lt;br /&gt;&lt;br /&gt;35.&amp;nbsp;&amp;nbsp;Controls. ALog.SaveAs will not work when Visible=FALSE&lt;br /&gt;&lt;br /&gt;36.&amp;nbsp;&amp;nbsp;Commands. Reducing procedures # of parameters will corrupt a command that uses this procedure with a constants/changed parameters&lt;br /&gt;&lt;br /&gt;37.&amp;nbsp;&amp;nbsp;Commands. Creating a command that is assigned to a procedure with two with two enum parameters does not saved the commands parameters (constants) properly&lt;br /&gt;&lt;br /&gt;38.&amp;nbsp;&amp;nbsp;Debugger. A Change in array dimension size followed by a Redim statement was not reflected in Watch/Call Stack window or code completion.&lt;br /&gt;&lt;br /&gt;39.&amp;nbsp;&amp;nbsp;Debugger. Changing display format of the Watch/Call Stack windows did not refresh the value with new format&lt;br /&gt;&lt;br /&gt;40.&amp;nbsp;&amp;nbsp;Debugger. Changing array elements in the Watch window could crash ATEasy&lt;br /&gt;&lt;br /&gt;41.&amp;nbsp;&amp;nbsp;Debugger. Char is displayed as a number in the Watch window&lt;br /&gt;&lt;br /&gt;42.&amp;nbsp;&amp;nbsp;Debugger. Aborting while in error handling OnError caused breakpoints placed in OnAbort to be ignored.&lt;br /&gt;&lt;br /&gt;43.&amp;nbsp;&amp;nbsp;Debugger. Duplicated items were shown in the call stack when paused while displaying a message box/input box.&lt;br /&gt;&lt;br /&gt;44.&amp;nbsp;&amp;nbsp;Debugger. Step Over (F10) the last line of the nested call does not always work. It behaved like Continue (F4) instead of pausing at the next line after the call.&lt;br /&gt;&lt;br /&gt;45.&amp;nbsp;&amp;nbsp;Debugger. Step out from interrupt procedure did not continue stepping at point of interrupt.&amp;nbsp;&amp;nbsp;Step into when interrupt procedure is fired did not continue stepping at start of interrupt procedure.&lt;br /&gt;&lt;br /&gt;46.&amp;nbsp;&amp;nbsp;Property Page. Fixed string did not retain the its value from the Value property page&lt;br /&gt;&lt;br /&gt;47.&amp;nbsp;&amp;nbsp;Property Page. Terminator in Winsock Interface of a Driver was missing from the property page&lt;br /&gt;&lt;br /&gt;48.&amp;nbsp;&amp;nbsp;Property Page/ActiveX controls. TabStrip ActiveX control. Making changes in its property page (Remove Tab) was not caused the page to be marked as dirty and not saved.&lt;br /&gt;&lt;br /&gt;49.&amp;nbsp;&amp;nbsp;Property Page. Open On Access fro GPIB, VXI and ISA was mistakenly displayed in the driver shortcut property page&lt;br /&gt;&lt;br /&gt;50.&amp;nbsp;&amp;nbsp;Property Page. Document property page File Browse button initializes the current directory instead of the document path directory.&lt;br /&gt;&lt;br /&gt;51.&amp;nbsp;&amp;nbsp;Property Page. Form property pages of READ ONLY document does not disable some of controls.&lt;br /&gt;&lt;br /&gt;52.&amp;nbsp;&amp;nbsp;Property Page. REFX tests use as default 0x0 mask instead of 0xfffffffffffffff.&lt;br /&gt;&lt;br /&gt;53.&amp;nbsp;&amp;nbsp;Property Page. Changing the Form ScaleMode in design time will confuse the form editor&lt;br /&gt;&lt;br /&gt;54.&amp;nbsp;&amp;nbsp;Property Page. Pressing Del when the driver shortcut is selected with the Misc page sometimes crashed ATEasy&lt;br /&gt;&lt;br /&gt;55.&amp;nbsp;&amp;nbsp;Property Page. Selecting new file to replace the currently modified file using file browse dialog (instead of typing the file name) crashed ATEasy.&lt;br /&gt;&lt;br /&gt;56.&amp;nbsp;&amp;nbsp;Property Page. GPIB Primary secondary address spin button behavior was wrong &lt;br /&gt;&lt;br /&gt;57.&amp;nbsp;&amp;nbsp;Property Page. Com method/property/variable or type allowed to change its type from the property page&lt;br /&gt;&lt;br /&gt;58.&amp;nbsp;&amp;nbsp;Code Completion. Syntax coloring problem with '\"' marks the rest of the line as comment&lt;br /&gt;&lt;br /&gt;59.&amp;nbsp;&amp;nbsp;Code Completion. Replacing a string with a ‘.’ did not display the members list box&lt;br /&gt;&lt;br /&gt;60.&amp;nbsp;&amp;nbsp;Code Editor. Selecting a variable or placing the cursor at the end of the variable makes the Go To Definition disabled&lt;br /&gt;&lt;br /&gt;61.&amp;nbsp;&amp;nbsp;Code Editor. Test header did not show the Task number and name when having two level tasks or more&lt;br /&gt;&lt;br /&gt;62.&amp;nbsp;&amp;nbsp;List View. List View edit label box was sometimes too small to type in long variable name, etc&lt;br /&gt;&lt;br /&gt;63.&amp;nbsp;&amp;nbsp;List View. Types such as Enum, Struct edit labeling with F2 display the type incorrectly.&lt;br /&gt;&lt;br /&gt;64.&amp;nbsp;&amp;nbsp;List View. Commands View. Insert After, Undo, Insert Below may crash ATEasy&lt;br /&gt;&lt;br /&gt;65.&amp;nbsp;&amp;nbsp;Undo/Redo. Undo of copy/paste of multiple controls&amp;nbsp;&amp;nbsp;could crash ATEasy&lt;br /&gt;&lt;br /&gt;66.&amp;nbsp;&amp;nbsp;Copy/Paste. After Copy and Paste of controls, selection of a particular button selects other control&lt;br /&gt;&lt;br /&gt;67.&amp;nbsp;&amp;nbsp;Copy/Paste. Paste into Procedures combo box disregards what is being selected, it always paste at the end&lt;br /&gt;&lt;br /&gt;68.&amp;nbsp;&amp;nbsp;Copy/Paste. Paste Task/Test did not always checked for unique ID.&lt;br /&gt;&lt;br /&gt;69.&amp;nbsp;&amp;nbsp;Find/Replace. Various problems were fixed.&lt;br /&gt;&lt;br /&gt;70.&amp;nbsp;&amp;nbsp;Source Control. Source control status did not correctly displayed status of read-only files&lt;br /&gt;&lt;br /&gt;71.&amp;nbsp;&amp;nbsp;Source Control. All changes will be rolled back after CheckOut or Undo CheckOut.&lt;br /&gt;&lt;br /&gt;72.&amp;nbsp;&amp;nbsp;Source Control. Source control file changed notification did not work under Windows 95/98/Me.&lt;br /&gt;&lt;br /&gt;73.&amp;nbsp;&amp;nbsp;Source Control. File difference combo box does not always offer to use the latest folder/file in the to combo box&lt;br /&gt;&lt;br /&gt;74.&amp;nbsp;&amp;nbsp;Options. Removed unused 'Menu Return' option from the Option dialog. &lt;br /&gt;&lt;br /&gt;75.&amp;nbsp;&amp;nbsp;Document. Menu text format serialization does not serialize the shortcut information&lt;br /&gt;&lt;br /&gt;76.&amp;nbsp;&amp;nbsp;Document. Save In Text Format on binary format document resets the document modified flag&lt;br /&gt;&lt;br /&gt;77.&amp;nbsp;&amp;nbsp;FP Document. Conversion of FP file could crash ATEasy&lt;br /&gt;&lt;br /&gt;78.&amp;nbsp;&amp;nbsp;FP Document. After Converting FP file and running the application ATEasy crashes since the FP author did not enclose a string GPIB0::5::0::INSTR with double quotes. &lt;br /&gt;&lt;br /&gt;79.&amp;nbsp;&amp;nbsp;ATEasy 2 conversion. Converting INS files IO Table with Input IO operation generates an extra argument&lt;br /&gt;&lt;br /&gt;80.&amp;nbsp;&amp;nbsp;ATEasy 2 conversion. ATEasy2 I/O table conversion did not work with Input mode "File"&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Test Executive/Profile&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; Will synchronize the tree view and the execution with the Run/Task/Test/ExitTask/ExitProgram (Task -1) statements&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;nbsp; Profile forever count did not work&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;&amp;nbsp; Test Executive will disabled itself when debugging from the IDE using TaskIt/TestIt/ProgramIt!&lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;&amp;nbsp; Profile Editor Up Down caused endless message boxes to be displayed&lt;br /&gt;&lt;br /&gt;5.&amp;nbsp;&amp;nbsp; Node tags of the Test Executive/Profile stored information using array of variants instead of single string &lt;br /&gt;&lt;br /&gt;6.&amp;nbsp;&amp;nbsp; Redesigned parts of the test executive execution mechanism to provide better performance handling of flow control statements&lt;br /&gt;&lt;br /&gt;7.&amp;nbsp;&amp;nbsp; The Test Executive commands where organized and new commands where added to provide better application control&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Drivers&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; SM2040x - added/modified new ranges, added new function such as pulse width&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;nbsp; SM2020 - DMMReadBuferStr spelled incorrect, DMM Measure command uses the DMMReadNorm instead of DMMReadDbl&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;&amp;nbsp; PCI42x - DLL file name was wrong under NT/2000/XP - users must change the DLL manually if using the driver on these OSs. This is now documented in the driver&lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;&amp;nbsp; HW.drv - better support for PCI and Plug and Play configuration and resource handling &lt;br /&gt;&lt;br /&gt;5.&amp;nbsp;&amp;nbsp; New drivers for NIDAQ (National Instruments), NT5000 (Navatek), various Geotest PXI Instruments and Adlink Data Acquisition. &lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200058/ATEasy-4-0-build-90-Release-Notes</link><pubDate>7/22/2003</pubDate></item><item><title>How to control the vertical scroll bar in the ALog control - Published on 7/22/2003</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;To hide the scroll bar:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;log.Object.Document.Body.Scroll="No"&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To show the scroll bar (same as ALog default):&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;log.Object.Document.Body.Scroll="Yes"&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To show the scroll bar only if needed:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;log.Object.Document.Body.Scroll="Auto" &lt;/div&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200057/How-to-control-the-vertical-scroll-bar-in-the-ALog-control</link><pubDate>7/22/2003</pubDate></item><item><title>Implementing a loop micro-code command by writing directly to the control memory (GX5050/GC5050/GT2550) - Published on 4/17/2003</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The following table shows the control memory content in order to create the sequence of loop three times and then Halt.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; All 32 channels direction are set to OUT, i.e. bits 28-31 are low.&lt;br /&gt;&lt;br /&gt;When writing commands to the control memory all commands need to be spread on four consecutive steps.&lt;br /&gt;&lt;table width='100%' cellpadding='0' cellspacing='0' class='border'&gt;&lt;tr&gt;&lt;th&gt;&lt;b&gt;Step #&lt;/b&gt;&lt;/th&gt;&lt;th&gt;&lt;b&gt;Control Memory value&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;0&lt;/td&gt;&lt;td&gt;0x00000002&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;1&lt;/td&gt;&lt;td&gt;0x00000002&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;2&lt;/td&gt;&lt;td&gt;0x00000002&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;3&lt;/td&gt;&lt;td&gt;0x00000002&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;4&lt;/td&gt;&lt;td&gt;0x00000000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;5&lt;/td&gt;&lt;td&gt;0x00000000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;6&lt;/td&gt;&lt;td&gt;0x00000000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;7&lt;/td&gt;&lt;td&gt;0x00000004&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;8&lt;/td&gt;&lt;td&gt;0x00000004&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;9&lt;/td&gt;&lt;td&gt;0x00000004&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;10&lt;/td&gt;&lt;td&gt;0x00000004&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;11&lt;/td&gt;&lt;td&gt;0x00000000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;12&lt;/td&gt;&lt;td&gt;0x000E0000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;13&lt;/td&gt;&lt;td&gt;0x000E0000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;14&lt;/td&gt;&lt;td&gt;0x000E0000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='min-width: 150px;'&gt;15&lt;/td&gt;&lt;td&gt;0x01CE0000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Steps 0-3:&lt;/b&gt;&lt;br /&gt;Command Sets register A equal to 2 with no conditions in order to loop a total of 3 times we set register A to 2. &lt;br /&gt;The first three steps (0 through 2) hold the Register value (bits 0 through 15). The fourth consecutive step (3) &lt;br /&gt;has the register number (bits 20-21) ORed with the Loop address value.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Steps 4-6:&lt;/b&gt;&lt;br /&gt;Command No Operation&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Steps 7-11:&lt;/b&gt;&lt;br /&gt;Command: Loop on A. Loop steps 4 through 10 the number of times register A is set to.&lt;br /&gt;The first three steps (7 through 9) hold the Loop address value (bits 0 through 16 for a total of 128K).&lt;br /&gt;The fourth consecutive step (10) holds the Operation Code (bits 22 through 24) ORed with the Loop address value.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 11:&lt;/b&gt;&lt;br /&gt;Command No Operation&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Steps 7-11:&lt;/b&gt;&lt;br /&gt;Command: Halt. The first three steps (12 through 14) hold the Halt command condition value (bits 17-19). &lt;br /&gt;The fourth consecutive step (15) holds the Operation Code, bits 22 through 24 ORed with Halt command condition value.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Loop command flow chart:&lt;/b&gt;&lt;br /&gt;&lt;img src="https://www.MarvinTest.com/images/support/Loop Image.jpg" alt`=&amp;quot; border='0' /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; The value of register A at the end of a Loop command is 65535 (0xFFFF).</description><link>https://www.MarvinTest.com/KB/Q200051/Implementing-a-loop-micro-code-command-by-writing-directly-to-the-control-memory-GX5050-GC5050-GT2550</link><pubDate>4/17/2003</pubDate></item><item><title>Accelerating the execution of ARM or TRIG commands when using GT2550 board - Published on 4/16/2003</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;The GT25/50 driver has embedded delays (about 30-40 mS) in order for it to work properly under different operating systems, carrier cards or different computers.&lt;br /&gt;&lt;br /&gt;In GTDIO/DIOEasy v3.0 build 12 and above users can accelerate the execution of &lt;b&gt;DioArm &lt;/b&gt;or &lt;b&gt;DioTrig&lt;/b&gt; procedures when the GT25/50 run in frequencies greater then 200KHz using the &lt;b&gt;DioSetOperationMode&lt;/b&gt; procedure. See the Dio on-line books for details on how to use this function.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200021/Accelerating-the-execution-of-ARM-or-TRIG-commands-when-using-GT2550-board</link><pubDate>4/16/2003</pubDate></item><item><title>GX5150 VHI0, VHI1 VREF, VTH0, VTH1 Pins - Published on 4/15/2003</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It is not necessary to connect these pins. The GT5930 provides return path for all 32 channels on the wire opposite the signal wire.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200055/GX5150-VHI0-VHI1-VREF-VTH0-VTH1-Pins</link><pubDate>4/15/2003</pubDate></item><item><title>Setting test requirements (e.g. Min/Max) from an external file - Published on 2/20/2003</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The following describe a way to use external requirements files:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Open the external test requirements file in &lt;b&gt;Program.OnInit&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Read the new requirements file.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Set the program test objects properties. You can set the test properties in &lt;b&gt;OnInitTest &lt;/b&gt;(e.g., Test.Min=dMin) or for the whole program at once during &lt;b&gt;Program.OnInit &lt;/b&gt;by looping and setting the test's objects (e.g., Program.Tests(name or number).Min=dMin).&lt;/li&gt;&lt;/ul&gt;If you want to set the test requirements for all the&amp;nbsp;&amp;nbsp;program tests at one time, do that after the program is running (e.g. &lt;b&gt;OnInitProgram&lt;/b&gt; and not in &lt;b&gt;OnInitSystem)&lt;/b&gt; since the &lt;b&gt;run&lt;/b&gt; statments will reset any requirements you set.&lt;br /&gt;&lt;br /&gt;The external file can be text, binary, an Excel spreadsheet, or a database. Text and binary files can be opened and read using ATEasy's FileXXX internal library functions. Excel spreadsheets or database files can be opened using Excel or ADO COM objects using a type library. For example code, refer to the ATEasy Excel example.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200050/Setting-test-requirements-e-g-Min-Max-from-an-external-file</link><pubDate>2/20/2003</pubDate></item><item><title>How Do I Call a DLL Created in Microsoft.NET from ATEasy 3.x or 4.x? - Published on 2/3/2003</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ATEasy 3.x or 4.x (ATEasy 5.x and above support importing and using .NET assemblies directly) cannot call Microsoft.NET assemblies directly. Even if you create a Microsoft.NET class library with public methods, Microsoft.NET will compile these into Microsoft.NET assembly. This assembly will still have a .DLL extension, but it is NOT a dynamic link library (DLL). For more information on assemblies, see Microsoft.com &lt;a href='http://msdn.microsoft.com/en-us/library/hk5f40ct(VS.71).aspx' target='_blank'&gt;assemblies&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One way to use the .NET assembly from ATEasy is by wrapping the .NET classes in your .NET library to ActiveX COM objects using a tool that is provided with .NET.&amp;nbsp;&amp;nbsp;This tool works as follows:&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; Register the .NET assembly using the .NET Framework Assembly Registration Utility (RAGASM.EXE) for example:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;RGEASM MyLib.dll /tlb&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The /tlb option is optional and will create and register a type library with the name MyLib.tlb. The type library can then inserted to the ATEasy sub module Libraries and can be used as other early binding objects.&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;nbsp; Install the assembly into the Global Assembly Cache&amp;nbsp;&amp;nbsp;(GAC) using the .NET Framework Global Assembly Cache Utility (GACUTIL.EXE) for example:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;GACUTIL –I MyLib.dll&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;&amp;nbsp; After these step the .NET components can be used similar to any other COM object from ATEasy. Both methods early and late binding can be used. &lt;br /&gt;&lt;br /&gt;Another workaround is to create an actual dynamic link library (DLL) from a Microsoft.NET language. This can be done with Visual Studio.NET. From within Visual Studio.NET, select &lt;b&gt;File » New » Project&lt;/b&gt;. You can then select &lt;b&gt;Visual C++ &lt;/b&gt;as the Project Type and &lt;b&gt;Win 32 Project &lt;/b&gt;as the Template. After you click &lt;b&gt;OK&lt;/b&gt;, you can then select &lt;b&gt;Application Settings&lt;/b&gt;, rather than &lt;b&gt;Overview&lt;/b&gt;. Then select DLL as the Application Type and select &lt;b&gt;Export Symbols &lt;/b&gt;as Additional Options&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200044/How-Do-I-Call-a-DLL-Created-in-Microsoft-NET-from-ATEasy-3-x-or-4-x</link><pubDate>2/3/2003</pubDate></item><item><title>How to use a DCOM component from ATEasy - Published on 12/16/2002</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Use the following procedure to use a DCOM component from ATEasy:&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; Register the server application on the server computer (usually by running it)&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;nbsp; Run the component setup to register the server component on the client computer&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;&amp;nbsp; Run Component Services Windows application (Start, Run, dcomcnfg.exe) on the server computer and select the application from the Component Services, My Computer, DCOM Config and set the security to allow remote computer to access the component&lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;&amp;nbsp; Run Component Services Windows application (Start, Run, dcomcnfg.exe) on the client computer and select the application from the Component Services, My Computer, DCOM Config and set the application computer location&lt;br /&gt;&lt;br /&gt;5.&amp;nbsp;&amp;nbsp; From ATEasy use &lt;b&gt;CreateObjec()&lt;/b&gt; or &lt;b&gt;GetObject()&lt;/b&gt;&amp;nbsp;&amp;nbsp;internal functions to create the remote objects as creating local object&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; Since ATEasy version 6.0, &lt;b&gt;CreateObject()&lt;/b&gt; has a new optional parameter (&lt;b&gt;sHostName&lt;/b&gt;) that can be used (in addition to the method described here) to create remote objects.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt; &lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200043/How-to-use-a-DCOM-component-from-ATEasy</link><pubDate>12/16/2002</pubDate></item><item><title>ATEasy's Sleep(), Delay() and WaitForEvent() Functions Usage - Published on 12/6/2002</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Sleep suspends the thread from which it was called (meaning it will also suspend UI such as form events, painting, etc.). If you wish to create an interval of time, you may call &lt;b&gt;Delay() &lt;/b&gt; instead. However, &lt;b&gt;Delay()&lt;/b&gt; consumes CPU time (see knowledge base article &lt;a href='http://www.geotestinc.com/KnowledgeBase/KBArticle.aspx?ID=30' target='_blank'&gt;Q200030&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;If that is a problem, you can use the following code:&lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Procedure DelayEx(lDelay)&lt;br /&gt;{&lt;br /&gt;lStart=Tick()&lt;br /&gt;&lt;br /&gt;loop&lt;br /&gt;&amp;nbsp;&amp;nbsp; lTime=Tick()&lt;br /&gt;&amp;nbsp;&amp;nbsp; if lTime-lStart&gt;lDelay than exitloop&lt;br /&gt;&amp;nbsp;&amp;nbsp; WaitForEvent(lStart+lDelay-Time)&lt;br /&gt;&amp;nbsp;&amp;nbsp; ! optional - call DoEvent() if you are calling this from a form event&lt;br /&gt;endloop&lt;br /&gt;}&lt;/div&gt;</description><link>https://www.MarvinTest.com/KB/Q200041/ATEasy-s-Sleep-Delay-and-WaitForEvent-Functions-Usage</link><pubDate>12/6/2002</pubDate></item><item><title>PCI/PXI explorer hangs when opened - Published on 12/3/2002</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The problem can be replicate usually on new Dell computers since their mother board contains a PCI device with function #7.&lt;br /&gt;&lt;br /&gt;To replicate the problem, you can run the HWTEST application from the Program Files\Geotest\HW from the command prompt:&lt;br /&gt;&lt;br /&gt;HWTEST pci&lt;br /&gt;&lt;br /&gt;After running it you will see endless list of PCI devices displayed in the command window. &lt;br /&gt;&lt;br /&gt;Geotest fixed this issue with HW (hardware access device driver) v2.11. This driver is shipped with every Geotest product that was released after December, 3 2002.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200042/PCI-PXI-explorer-hangs-when-opened</link><pubDate>12/3/2002</pubDate></item><item><title>ATEasy 2.x DLG Based Dialog Boxes Appear Narrower in ATEasy 3.0 than in ATEasy 2.x - Published on 10/31/2002</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This problem occurs because the Windows Dialog Base Unit (DBU) works differently in Win32 than in Win16. &lt;br /&gt;&lt;br /&gt;DBUs are a Windows unit that let you specify control in a portable way that will allow different system to display text without clipping (to prevent the problem that cause fonts to be truncated). &lt;br /&gt;&lt;br /&gt;Dialog Base Units (DBU) are used in DlgEasy and by Windows specify control size and position which are later on converted to pixels before being displayed by Windows. &lt;br /&gt;&lt;br /&gt;Microsoft recommends to UI designers to add 30% width to controls that display text to prevent font clipping when changing system. If this rule is not followed, font truncating is not guaranteed. In addition, moving from WIN16 to WIN32 DBU translation to pixels was changed by Microsoft and made a bit narrower. However if the 30% rule was used than in most cases migrating dialog (in C or ATEasy) will work. Designing a dialog box in Visual C 1.5 and recompiling it to Visual C 6.0 may cause the same problem.&lt;br /&gt;&lt;br /&gt;If font is truncated the only workaround is to resize the dialog controls in DlgEasy before using it from ATEasy 3.0.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200014/ATEasy-2-x-DLG-Based-Dialog-Boxes-Appear-Narrower-in-ATEasy-3-0-than-in-ATEasy-2-x</link><pubDate>10/31/2002</pubDate></item><item><title>Changing ATEasy control properties that affect the control window area does not take effect until you return from the form/control event - Published on 10/31/2002</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;For example changing the ASwitch control &lt;b&gt;Value&lt;/b&gt; property will not take effect (in the control area in the form) until you exit the form event.&lt;br /&gt;&lt;br /&gt;Use one of the following methods to force painting:&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp;Call &lt;b&gt;DoEvent() &lt;/b&gt; this will cause events to be handled while the form event is handled. (ATEasy 4.0)&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;nbsp;Use the control &lt;b&gt;Refresh()&lt;/b&gt; method (ATEasy 4.0 build 90 and above).&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;&amp;nbsp;You can use User32.dll &lt;b&gt;UpdateWindow(hwnd)&lt;/b&gt; to force painting (hwnd is the control.hWnd property).&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200040/Changing-ATEasy-control-properties-that-affect-the-control-window-area-does-not-take-effect-until-you-return-from-the-form-control-event</link><pubDate>10/31/2002</pubDate></item><item><title>How to make the ATEasy log window update immediately after print during a form event - Published on 10/28/2002</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;You need to use the &lt;b&gt;Flush()&lt;/b&gt; method of the log control. Just call the method after the print statement or append method and the log control will be updated immediately.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200039/How-to-make-the-ATEasy-log-window-update-immediately-after-print-during-a-form-event</link><pubDate>10/28/2002</pubDate></item><item><title>CoolBar control in Microsoft Window Common Control 3 not supported with ATEasy - Published on 10/16/2002</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ATEasy does not support control that contains other controls (control container using ISimpleFrameSite interface). This interface is not documented by Microsoft and is currently supported only by VB. (Not supported by other application such as: Access or FoxPro MFC or ATL).&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200038/CoolBar-control-in-Microsoft-Window-Common-Control-3-not-supported-with-ATEasy</link><pubDate>10/16/2002</pubDate></item><item><title>ATEasy EXE File Compatibility with Older Run-Time (RT) Engine Builds - Published on 10/16/2002</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In general, ATEasy created executables (EXE) files run with the same run-time that was used to build the EXE. The EXE can also run with newer version of the ATEasy run-time. &lt;br /&gt;&lt;br /&gt;Upgrading the target computer with the build that that you used to build the EXE along with the EXE file will always work. However, steps have been to reduce incapability between versions of ATEasy, so you will be able to mix different run time and EXE versions. &lt;br /&gt;&lt;br /&gt;Since the file format of the ATEasy EXE or files rarely changes, you may not always need to send the run-time engine with your rebuilt EXE file. Starting from ATEasy 3.0 build 54 we made several changes to prevent the need for sending run-time updates.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200037/ATEasy-EXE-File-Compatibility-with-Older-Run-Time-RT-Engine-Builds</link><pubDate>10/16/2002</pubDate></item><item><title>How to Find the Free Disk Space from an ATEasy Application - Published on 9/27/2002</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;You need to call the Windows API that resides in a system dll. See the on-line help how to declare and call DLL function.&lt;br /&gt;&lt;br /&gt;You can call &lt;b&gt;GetDiskFreeSpace&lt;/b&gt; or &lt;b&gt;GetDiskFreeSpaceEx&lt;/b&gt; declared in kernel32.dll or &lt;b&gt;SHGetDiskFreeSpace &lt;/b&gt; in shell32.dll (check the Microsoft web site for declaration of these functions).&lt;br /&gt;&lt;br /&gt;Below is a sample &lt;b&gt;GetDiskFreeSpace &lt;/b&gt;declaration in ATEasy:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;GetDiskFreeSpace(&lt;br /&gt;lpRootPathName : val string,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! root path e.g. "c:\\"&lt;br /&gt;lpSectorsPerCluster: var dword,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;! sectors per cluster&lt;br /&gt;pBytesPerSector: var dword,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!bytes per sector&lt;br /&gt;lpNumberOfFreeClusters: var dword,&amp;nbsp;&amp;nbsp;! free clusters&lt;br /&gt;lTotalNumberOfClusters: var dword:&lt;br /&gt;) : Bool&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Free space is calculated as:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;dFreeSpace=lpSectorsPerCluster*1.0*pBytesPerSector*lpNumberOfFreeClusters&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;the *1.0 in the above code is used to convert to double and to avoid overflow since the result could be &gt;4GB&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200036/How-to-Find-the-Free-Disk-Space-from-an-ATEasy-Application</link><pubDate>9/27/2002</pubDate></item><item><title>Make ATEasy Wait until WinExec Application/Process Completes - Published on 9/25/2002</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In ATEasy 3.0 build 54b and above, &lt;b&gt;WinExec&lt;/b&gt; returns a true handle.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;hHandle=WinExec(..)&lt;br /&gt;&lt;br /&gt;WaitForSingleObject(nHandle)&amp;nbsp;&amp;nbsp;! wait until app is completed&lt;br /&gt;&lt;br /&gt;….&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;For ATEasy 3.0 build 54a and below, you must use &lt;b&gt;FindWindow&lt;/b&gt; (user32) on the caption of you application or the class of its main window (using spy):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;WinExec(...)&lt;br /&gt;&lt;br /&gt;while FindWindow(...)&lt;br /&gt;endwhile&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;</description><link>https://www.MarvinTest.com/KB/Q200035/Make-ATEasy-Wait-until-WinExec-Application-Process-Completes</link><pubDate>9/25/2002</pubDate></item><item><title>How to copy a file from an ATEasy application - Published on 9/25/2002</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;ATEasy 6.x and above have a FileCopy() function that can be used to copy file. The following provides a way to copy a file using ATEasy 3.x-5.x:&lt;br /&gt;&lt;br /&gt;Copy the following to your text file Libraries section:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;DLL Kernel32&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt; File = Kernel32.dll&lt;br /&gt;&lt;br /&gt;DLL Types&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;DLL Procedures&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Procedure CopyFile(sExitingFileName, sNewFileName, bFaiIfExist): Bool&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt; sExitingFileName: Val String&lt;br /&gt; sNewFileName: Val String&lt;br /&gt; bFaiIfExist: Val Bool&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;</description><link>https://www.MarvinTest.com/KB/Q200034/How-to-copy-a-file-from-an-ATEasy-application</link><pubDate>9/25/2002</pubDate></item><item><title>Toggling the DTR line with an RS232 COM port from ATEasy - Published on 9/25/2002</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Before starting, you must know the base address for the port, which can be obtained from Windows Device Manager Resource tab. Usually the base address for COM1 is 0x3F8.&lt;br /&gt;&lt;br /&gt;The DTR line is connected to Modem Control Register (MCR) bit 0 at an offset of 4 (e.g., 0x3F8 + 4). Setting this bit to 1 makes the line active.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;iBase=0x3F8&lt;br /&gt;ucByte=PortInByte(iBase+4)&lt;br /&gt;&lt;br /&gt;! set DTR On&lt;br /&gt;PortOutByte(iBase+4, ucByte or 0x1)&lt;br /&gt;Delay(500)&lt;br /&gt;&lt;br /&gt;! set DTR Off&lt;br /&gt;PortOutByte(iBase+4, ucByte and 0xFE)&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;</description><link>https://www.MarvinTest.com/KB/Q200033/Toggling-the-DTR-line-with-an-RS232-COM-port-from-ATEasy</link><pubDate>9/25/2002</pubDate></item><item><title>ATEasy 2.x and 3.x GPIB Secondary Addresses - Published on 9/25/2002</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In ATEasy 3.0 and above, Secondary Address 0 is used as a None secondary address. Use 1 to 31 as a Secondary Address for GPIB instruments.&lt;br /&gt;&lt;br /&gt;ATEasy 2.x uses 0 as the first Secondary Address. To remain compatible with ATEasy 3.0 and above, add 1 to ATEasy 2.x application Secondary Address (e.g., use 1 instead of 0).&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200032/ATEasy-2-x-and-3-x-GPIB-Secondary-Addresses</link><pubDate>9/25/2002</pubDate></item><item><title>Printing an Image or Form Data from ATEasy - Published on 9/25/2002</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;The process is comprised of two steps. The first step is to save the chart to a image file. The second step is to print the image file.&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp;To save to an image file, use the Image property with the &lt;b&gt;SavePicture()&lt;/b&gt; internal library routine.&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;nbsp;Use one of the following methods to print the saved image file:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Use &lt;b&gt;WinExec()&lt;/b&gt; with MSPAINT or any other application that supports printing of picture from the command line (/p).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Use the Log control in HTML mode to insert a picture tag to it with the file saved. Then, use &lt;b&gt;Log.PrintLog&lt;/b&gt;. This method is very flexible, as you may add text and/or other drawing elements to your printout.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Use COM libraries such as Word and Excel to send a picture and to print.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;</description><link>https://www.MarvinTest.com/KB/Q200031/Printing-an-Image-or-Form-Data-from-ATEasy</link><pubDate>9/25/2002</pubDate></item><item><title>High CPU Utilization when Using ATEasy's Delay() - Published on 9/25/2002</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Calling &lt;b&gt;Delay()&lt;/b&gt; does not put your thread to sleep; events and interrupts continue to be monitored in your thread.&lt;br /&gt;&lt;br /&gt;If you don't want to monitor events, you can use &lt;b&gt;Sleep()&lt;/b&gt;, which does not use as much CPU.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200030/High-CPU-Utilization-when-Using-ATEasy-s-Delay</link><pubDate>9/25/2002</pubDate></item><item><title>Is there a way to know if my application is running from the ATEasy development env (IDE)? - Published on 9/25/2002</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;If &lt;b&gt;app.ModulePath &lt;/b&gt;has the string value "ATEasy.EXE", then your application is running from the ATEasy development environment.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200025/Is-there-a-way-to-know-if-my-application-is-running-from-the-ATEasy-development-env-IDE</link><pubDate>9/25/2002</pubDate></item><item><title>PCI/PXI Instruments not working properly when several instruments of the same type are installed on the same Windows NT machine - Published on 9/25/2002</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Cause:&lt;/b&gt; The Windows NT Hardware Abstraction Layer (HAL) HAL assigned an I/O port address or memory resource to a PCI device that overlaps with an existing PCI device, causing a PCI resource conflict on your system. Under normal operation, the system BIOS is responsible for setting the PCI device resource requirements. When Windows NT loads, the Windows NT HAL sometimes moves the PCI device resources. PCI devices are dynamically configurable. However, the Windows NT HAL sometimes assigns overlapping I/O port addresses or memory resources for the PCI devices.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Resolution:&lt;/b&gt; Adding the /PCILOCK switch to the BOOT.INI file forces the Windows NT HAL to use the PCI device resources allocated by the system BIOS. After modifying the BOOT.INI file the system must be rebooted.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example:&lt;/b&gt; The following is a typical Boot.INI file with the /PCILOCK switch&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;[boot loader]&lt;br /&gt;timeout=3&lt;br /&gt;[operating systems]&lt;br /&gt;multi(0)disk(0)rdisk(0)partition(1)WINNT="Windows NT Workstation&lt;br /&gt;Version 4.00"/PCILOCK&lt;br /&gt;multi(0)disk(0)rdisk(0)partition(1)WINNT="Windows NT Workstation&lt;br /&gt;Version 4.00 [VGA mode]" /basevideo /sos /PCILOCK&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;</description><link>https://www.MarvinTest.com/KB/Q200020/PCI-PXI-Instruments-not-working-properly-when-several-instruments-of-the-same-type-are-installed-on-the-same-Windows-NT-machine</link><pubDate>9/25/2002</pubDate></item><item><title>On Windows 9x ATEasy will not notify if file used by ATEasy was saved externaly on a network driver - Published on 9/19/2002</title><description>&lt;b&gt;Solution: &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This problem can happen only in ATEasy 4.x and above running on Windows 9x.&lt;br /&gt;&lt;br /&gt;This is due to a known windows 98 bug with &lt;b&gt;FindFirstChangeNotification&lt;/b&gt; Windows API used by ATEasy that does not return notification when file saved on network drive.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200024/On-Windows-9x-ATEasy-will-not-notify-if-file-used-by-ATEasy-was-saved-externaly-on-a-network-driver</link><pubDate>9/19/2002</pubDate></item><item><title>VB Controls or Objects are Slow When Running from the ATEasy IDE - Published on 9/19/2002</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Visual Basic 6.0 objects are single threaded by default. VB objects that are run in the ATEasy IDE will run in the IDE's main process thread apartment. ATEasy must then use a proxy when creating a control from the run-time thread, which slows performance (50-100 times).&lt;br /&gt;&lt;br /&gt;To increase performance when using VB objects, make sure to change your VB project setting to use the Apartment Threaded threading model.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200018/VB-Controls-or-Objects-are-Slow-When-Running-from-the-ATEasy-IDE</link><pubDate>9/19/2002</pubDate></item><item><title>Customizing the ATEasy Log Header and Footer when printing - Published on 9/19/2002</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;If you are using ATEasy 5.x and above the &lt;b&gt;PrintLog() &lt;/b&gt;internal function and the &lt;b&gt;ALog.PrintLog&lt;/b&gt; has parameters to support setting the page header and footer for printing. &lt;br /&gt;&lt;br /&gt;For ATEasy 3.x and 4.x users use the following solution:&lt;br /&gt;&lt;br /&gt;The ATEasy Log window is based on Internet Explorer (IE). When printing, the ATEasy log window uses the IE page setup options that are stored in the Registry. To change the settings, you can run IE, select &lt;b&gt;Page Setup &lt;/b&gt;from the &lt;b&gt;File&lt;/b&gt; menu, then edit the header and footer fields as required. You can also do this programmatically -- you'll need to locate the registry entry and write to it on the fly before calling &lt;b&gt;Log.PrintLog()&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200023/Customizing-the-ATEasy-Log-Header-and-Footer-when-printing</link><pubDate>9/19/2002</pubDate></item><item><title>ATEasy USB License Key Does Not Work in Windows NT 4.0 - Published on 2/28/2001</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Windows NT does not support USB devices. Therefore, the USB Rainbow protection key is not supported under Windows NT. &lt;br /&gt;&lt;br /&gt;The USB protection key is supported only under Windows 9x/ME and Windows 2000.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200017/ATEasy-USB-License-Key-Does-Not-Work-in-Windows-NT-4-0</link><pubDate>2/28/2001</pubDate></item><item><title>How to Create and Use C Structure Bit Fields in ATEasy - Published on 2/12/2001</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Bit fields are not part of the ATEasy language. To create a bit field-like structure, you can define a member as an integer and manipilate the field using the Or or And operators to set values in the fields. To clear a field you can use the &lt;b&gt;Not &lt;/b&gt;operator.&lt;br /&gt;&lt;br /&gt;For example if the C structure was : &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;Struct Fields&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD a : 5;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD b: 3;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Define the Bit field as dw in ATEasy:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;struct Fields&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwFields : Dword&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&amp;nbsp;&amp;nbsp;} &lt;/div&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Define some constants:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;A _MASK: Dword=0x1F&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A _POS: Dword=0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; B_MASK : Dword=0x7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; B_POS: Dword=5&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;To clear b use:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;f.dwFiellds =f.dwFiellds &amp; not (B_MASK shl B_POS)&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;To set b use:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;f.dwFiellds =f.dwFiellds &amp; not (B_MASK shl B_POS) or (bNew shl B_POS)&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;</description><link>https://www.MarvinTest.com/KB/Q200015/How-to-Create-and-Use-C-Structure-Bit-Fields-in-ATEasy</link><pubDate>2/12/2001</pubDate></item><item><title>Can I Pass an ATEasy Procedure to a DLL for CallBack? - Published on 2/12/2001</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Passing an ATEasy procedure to a callback is supported from version 6.0 and above. &lt;br /&gt;&lt;br /&gt;The following workaround provides the same functionality for ATEasy version 3.x-5.x:&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; Write a DLL with the callback function and pass it to the function that requires callback function. &lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;nbsp; To pass the address, call the Windows API &lt;b&gt;GetProcAddresss()&lt;/b&gt;, then pass the result as long to the function that requires callback function. &lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;&amp;nbsp; The DLL callback function can use another ATEasy thread to perform an action in ATEasy when the call back was called. The thread can be triggered by an ATEasy synchronization object (AEvent), using a global variable or an ATEasy user interrupt.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200016/Can-I-Pass-an-ATEasy-Procedure-to-a-DLL-for-CallBack</link><pubDate>2/12/2001</pubDate></item><item><title>ATEasy Log Control Hangs or Crashes - Published on 10/13/2000</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;The ATEasy ALog control may hang or crash if appending too much text.&lt;br /&gt;&lt;br /&gt;The ATEasy Log Windows is based on Microsoft Internet Explorer (IE). IE does not provide an easy and fast way to determine the limitation on the IE page size. The limit is highly dependent on IE platform, version, and memory. Usually the log file can be very large (several MB) if Windows have enough memory.&lt;br /&gt;&lt;br /&gt;If each program run is saved to a separate log file (default), this will not should be an issue.&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200013/ATEasy-Log-Control-Hangs-or-Crashes</link><pubDate>10/13/2000</pubDate></item><item><title>ATEasy SNMP Protocol Support - Published on 10/4/2000</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;The SNMP protocol API comes with Windows NT/2000 and above, and can be accessed from ATEasy using Windows SNMP APIs. &lt;br /&gt;&lt;br /&gt;&lt;a href='http://msdn.microsoft.com/en-us/library/aa378988.aspx' target='_blank'&gt;http://msdn.microsoft.com/en-us/library/aa378988.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Additionally, there are third party ActiveX or .NET SNMP components available, including: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;PowerTCP SNMP Tool &lt;a href='http://www.dart.com/powertcp/Snmp.asp ' target='_blank'&gt;http://www.dart.com/power&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Cyberons &lt;a href='http://www.netaphor.com/products/default.asp' target='_blank'&gt;http://www.netaphor.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200012/ATEasy-SNMP-Protocol-Support</link><pubDate>10/4/2000</pubDate></item><item><title>ATEasy Properties or IDE Dockable Window Disappears or is not Positioned Properly - Published on 9/26/2000</title><description>&lt;b&gt;Solution:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This issue is caused by corrupted ATEasy Workspace key the the Windows registry.&lt;br /&gt;&lt;br /&gt;This problem can be fixed by editing the Windows Registry which will cause ATEasy IDE to reset all windows position to default:&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; Exit ATEasy.&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;nbsp; Start the Registry Editor (REGEDIT.EXE).&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;&amp;nbsp; In the Registry editor, select the&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class='fixedFont'&gt;HKEY_CURRENT_USER\Software\Geotest\ATEasy\Workspace&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;4.&amp;nbsp;&amp;nbsp; To delete the whole IDE windows position delete the whole key.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;To delete the properties window position and size delete the PropertiesPlacement from the Full key.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200011/ATEasy-Properties-or-IDE-Dockable-Window-Disappears-or-is-not-Positioned-Properly</link><pubDate>9/26/2000</pubDate></item><item><title>Bypassing the Windows NT Logon Process - Published on 9/20/2000</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;WARNING: &lt;/b&gt;Use this procedure only when absolutely necessary. Follow the procedures carefully. If the registry editor is used improperly, you may have to reinstall Windows NT to correct problems. Back-up pertinent data. Geotest - Marvin Test Systems, Inc. provides this information as a courtesy to its users. Geotest is not responsible nor liable for any damage caused by following these procedures.&lt;br /&gt;&lt;br /&gt;Windows NT allows you to automate the logon process by storing your password and other pertinent information in the Registry database. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; Storing login and password information in the Registry database allows other users to start your computer and use the account you establish to automatically logon. Timing conflicts can also occur. For example, if you have several network transports loaded, enabling automatic logon may make Windows NT attempt to connect to network resources before the network transports are completely loaded. &lt;br /&gt;&lt;br /&gt;Use the Registry Editor (REGEDT32.EXE), available as part of Windows NT operating system, to add your logon information, as follows: &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; Start REGEDT32.EXE and locate the following Registry subkey: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon &lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;nbsp; Establish your domain name, account name, and password using the values you would normally type when logging on. You should assign the following values:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;DefaultDomainName&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;DefaultUserName&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;DefaultPassword&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; The DefaultPassword value may not exist. If it doesn't, from the &lt;b&gt;Edit&lt;/b&gt; menu, choose &lt;b&gt;Add Value&lt;/b&gt;. In the &lt;b&gt;Value Name &lt;/b&gt;field, type:&lt;br /&gt;&lt;div class='fixedFont'&gt;DefaultPassword&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Select REG_SZ for the Data Type. In the &lt;b&gt;String&lt;/b&gt; field, type your password. Save your changes. &lt;br /&gt;&lt;br /&gt;Also, if no DefaultPassword value string is specified, Windows NT automatically changes the value of the AutoAdminLogon key from 1 (true) to 0 (false), thus disabling the AutoAdminLogon feature.&lt;br /&gt;&lt;/blockquote&gt;3.&amp;nbsp;&amp;nbsp; From the Edit menu, choose Add Value. Enter AutoAdminLogon in the Value &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Name field. Select REG_SZ for the Data Type. Enter 1 in the String field. Save your changes. &lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;&amp;nbsp; Exit REGEDT32.&lt;br /&gt;&lt;br /&gt;5.&amp;nbsp;&amp;nbsp; Exit Windows NT and turn off your computer. &lt;br /&gt;&lt;br /&gt;6.&amp;nbsp;&amp;nbsp; Restart your computer and Windows NT. You should be able to logon automatically.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200009/Bypassing-the-Windows-NT-Logon-Process</link><pubDate>9/20/2000</pubDate></item><item><title>ATEasy Timers - Published on 7/28/2000</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;ATEasy has two types of timers: &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; ATimer control&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;nbsp; INT_TIMERx interrupts&lt;br /&gt;&lt;br /&gt;The ATimer is based on the windows WM_TIMER message (not an accurate timer). Windows documentation describes the WM_TIMER message as a low-priority message. The GetMessage and PeekMessage functions post this message only when no other higher-priority messages are in the thread's message queue. &lt;br /&gt;&lt;br /&gt;The &lt;b&gt;INT_TIMERx&lt;/b&gt; interrupts are based on the Window MultiMedia Timers (see the Windows SDK for &lt;b&gt;timeSetEvent &lt;/b&gt;API). The multimedia timers provide accuracy up to 1 ms. ATEasy's ability to deliver 1 ms interrupts depends on the time required to execute a single PCode command. Since interrupts cannot be called in the middle of a PCode command in that thread, this time may be long if the thread calling a DLL function takes a long time before it completes.&lt;br /&gt;&lt;br /&gt;The following list alternatives to the above mentioned timers:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create an ATEasy thread and use the &lt;b&gt;Sleep()&lt;/b&gt; function to form a delay between events. Call &lt;b&gt;SetThreadPriority()&lt;/b&gt; to ensure more accurate timer.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Write a DLL and use the multimedia timer &lt;b&gt;timeSetEvent&lt;/b&gt;. This method is accurate, but requires a callback function that must be implemented in a DLL. This method could be more accurate if implemented in its own thread.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Write a DLL and use the Windows &lt;b&gt;SetWaitableTimer&lt;/b&gt;. This method is accurate (better than 1 ms), but requires a callback function must be implemented in a DLL in its own thread. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Use hardware to implement the handler functionality.&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200008/ATEasy-Timers</link><pubDate>7/28/2000</pubDate></item><item><title>Can't obtain a license from ATEasy License Server - Published on 7/11/2000</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;The following list reasons why license cannot be obtained from an ATEasy Network License server:&lt;br /&gt;&lt;br /&gt;1. ATEasy v6.0 (build 136 and above) support automatic installation of the license server in the server. It installs the server as a service in the server computer and have more reliable and flexible way of communication with the workstations. &lt;br /&gt;2. The License server must be running and have enough licenses installed to accommodate requests from the workstations. &lt;br /&gt;3. The workstation ATEasy version must be equal or smaller than the license installed in the license server. If the workstation have an ATEasy 4.x and the server license is for ATEasy 4.x and above it will work. For example You can not have 7.0 client and a 4.0 license.&lt;br /&gt;4. ATEasy workstations must have a direct and a reliable connection to the license server at all time. Same IP subnet is recommended for both server and workstation.&amp;nbsp;&amp;nbsp;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200007/Can-t-obtain-a-license-from-ATEasy-License-Server</link><pubDate>7/11/2000</pubDate></item><item><title>Cannot Call an ATEasy Program Procedure from a Driver or a System - Published on 6/20/2000</title><description>&lt;b&gt;Solution:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Calling a program procedure from a driver or a system is prohibited by design. Drivers or systems should be designed so that they are independent the active program's implementation, which can be changed when the application is running.&lt;br /&gt;&lt;br /&gt;Program events, however, can be called by a driver or system using, for example, Program.OnInit().&lt;br /&gt;&lt;br /&gt;The following procedure provides a workaround using procedure variable:&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; Program pass in the procedure to a procedure variable stored in a driver or a system module.&lt;br /&gt;2.&amp;nbsp;&amp;nbsp; The driver or system can now call the program procedure using the procedure variable.&lt;br /&gt;&lt;br /&gt;The following procedure provides a workaround using interrupts:&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; Program installs an interrupt&lt;br /&gt;2.&amp;nbsp;&amp;nbsp; When a driver needs to call the program procedure, it sets the interrupt&lt;br /&gt;3.&amp;nbsp;&amp;nbsp; The program interrupt handler can then call a driver function to retrieve the parameters, or can use driver public variables to pass parameters&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200006/Cannot-Call-an-ATEasy-Program-Procedure-from-a-Driver-or-a-System</link><pubDate>6/20/2000</pubDate></item><item><title>Modifying ATEasy Code During Debugging - Published on 5/31/2000</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;ATEasy Code that was already parsed will not re-parsed to include the new code changes in the code editor. Code that was not yet parsed by the ATEasy's Just In Time compiler is parsed&amp;nbsp;&amp;nbsp;when called and&amp;nbsp;&amp;nbsp;the latest code changes will take effect. &lt;br /&gt;&lt;br /&gt;When the application is started, ATEasy first compiles the application module events and the procedures and commands referenced by these events. When a program is run ateasy first compile its events. Tasks tests&amp;nbsp;&amp;nbsp;are compiled before they are about to be executed (one task at a time).&amp;nbsp;&amp;nbsp;When a DoIt! is executed only the highlighted code and the referenced procedures and commands are compiled.&lt;br /&gt;&lt;br /&gt;Since module events are always parsed when the application is started, code changes in module events will only take effect when the application is started but not during debugging. &lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200004/Modifying-ATEasy-Code-During-Debugging</link><pubDate>5/31/2000</pubDate></item><item><title>Removing ATEasy License from a Machine - Published on 5/31/2000</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Use the following procedure to remove an ATEasy license from a machine:&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; Open the ATEasy &lt;b&gt;About&lt;/b&gt; dialog box from the Help menu.&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;nbsp; Press &lt;b&gt;Ctrl + Alt + Shift + K&lt;/b&gt;. A confirmation dialog box is displayed.&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;&amp;nbsp; Click &lt;b&gt;Yes&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;&amp;nbsp; Write down the confirmation code and send to customer support for verification. A temporary file containing this information is also generated in the temp directory. It is recommended to take a screen capture and send to Geotest for approval the confirmation code to avoid mistakes while copying the confirmation code from the screen.&lt;br /&gt;&lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200005/Removing-ATEasy-License-from-a-Machine</link><pubDate>5/31/2000</pubDate></item><item><title>Reasons why ATEasy Save Command Fails - Published on 5/19/2000</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;A Save Document operation may fail under any one of the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The file's security permissions or attributes are set to Read Only&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Another application or instance of ATEasy is using the file&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A user on another machine is accessing the file&lt;/li&gt;&lt;/ul&gt;</description><link>https://www.MarvinTest.com/KB/Q200003/Reasons-why-ATEasy-Save-Command-Fails</link><pubDate>5/19/2000</pubDate></item><item><title>ATEasy Form.Visible, and .WindowState Values During OnLoad Event - Published on 3/28/2000</title><description>&lt;b&gt;Solution:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;During the form loading the properties have the following values:, &lt;br /&gt;&lt;br /&gt;&lt;div class='fixedFont'&gt;Form.Visible = False &lt;br /&gt;Form.WindowState = Normal &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;After the OnLoad is return these properties are restored as set in design mode.&lt;br /&gt;&lt;br /&gt;This behavior is similar to Microsoft Visual Basic's forms behavior. &lt;br /&gt;</description><link>https://www.MarvinTest.com/KB/Q200002/ATEasy-Form-Visible-and-WindowState-Values-During-OnLoad-Event</link><pubDate>3/28/2000</pubDate></item></channel></rss>