Вы находитесь на странице: 1из 8

18/11/2016

BestPracticesforCodeModuleDevelopmentNationalInstruments

BestPracticesforCodeModuleDevelopment
PublishDate:Jun10,2016

Overview

Acodemoduleisasoftwarecomponentthatperformsaspecifictestoraction.NITestStandprovidesadaptersthatcancall
codemodulesdevelopedusingvariousprogrammingenvironmentsandlanguagessuchasNILabVIEW,NI
LabWindows/CVI,C#,VB.NET,C/C++,HTBasicandActiveX.
Thispaperwilldetailseveralconsiderationstokeepinmindasyoudevelopcodemodules.Unlessotherwisenoted,this
documentappliestoTestStandversion3.5andlater.

TableofContents

1.AvailableTestStandAdapters
2.WheretoImplementFunctionality
3.StrategiesforTerminatingorBreakingSequences
4.UsingInstrumentationwithinCodeModules
5.PerformingSwitchingFunctions
6.HandlingErrors
7.LoadandUnloadOptions
8.LocatingCodeModuleFiles
9.Conclusion
10.ViewAdditionalSectionsoftheNITestStandAdvancedArchitectureSeries
11.AbouttheAuthor
12.RelatedLinks
1.AvailableTestStandAdapters

ThefivebuiltinTestStandsteptypesshowninFigure1createstepinstancesthatcaninvokeacodemodule.Thenewly
createdstepusesthedefaultpropertiesdefinedbythesteptype,suchastheRunOptionsandStatusExpression,butdoes
notspecifythecodemodule.

Figure1Builtinsteptypesthatcallcodemodules

TheTestStandEngineusesanadaptertoprovideaninterfacetoacodemodulesotheenginecanload,call,andpassdatato
andfromcodemoduleswhileTestStandexecutessequences.

RefertoChapter4,BuiltInStepTypes(http://zone.ni.com/reference/enXX/help/370052M
01/tsfundamentals/infotopics/built_in_step_types/),andChapter5,ModuleAdapters(http://zone.ni.com/reference/en
XX/help/370052M01/tsfundamentals/infotopics/module_adapters/),oftheNITestStandReferenceManualformore
informationaboutbuiltinsteptypesandhowtospecifycodemodules.

Youcanusethesefivebuiltinsteptypeswithalladaptertypes,asshowninFigure2.Usethe<None>Adapterifyoudonot
wantasteptocallacodemodule.TheSequenceAdapterishiddenbydefault.SelectConfigureAdaptersfromthe
TestStandmenubarandremovethecheckmarkfromthecheckboxintheHiddencolumntodisplaytheSequenceAdapterin
theadapterringcontrol.

http://www.ni.com/productdocumentation/10369/en/

1/8

18/11/2016

BestPracticesforCodeModuleDevelopmentNationalInstruments

Figure2TestStandAdapters

2.WheretoImplementFunctionality

Whenyoudefinerequirementsatthebeginningofthedevelopmentprocess,youshouldalsodeterminethefunctionalityyou
willimplementwithincodemodules.Usingsimple,welldefinedcodemodulesthatareindependent,reusablecomponentscan
lessentheburdenofsoftwaremaintenanceandcanhelpsupportacompanywidecommonteststrategy.

FunctionalitytoIncludeinCodeModules

Usecodemodulesforthefollowingcommontasks:
Settingupstimuli
Makingmeasurementsorservingasaninterfacetohardware
Performingroutingtasks
CompletingactionsbettersuitedforcodemodulesratherthanforTestStand,suchascomplexarraymanipulation
Iteratingoverlargeamountsofdataorperforminglargenumbersofcalculations

FunctionalitytoIncludeinTestStand

BecauseTestStandimplementsthefollowingtasks,considerexcludingthemfromcodemodules:
Sequencingordeterminingtheexecutionorderoftestsorsubtests
Evaluatingtestmeasurementsagainstlimits
Reportingandloggingresults

Sometestengineershardcodetestlimitsincodemodulestoensuretamperfreelimitvaluesandappropriatetestparameters.
However,embeddingtestlimitsincodemodulesrestrictsthereusabilityofcodemodules,canincreasethetimeneededto
updatetestsystemsbyrequiringcodechanges,andpreventsyoufromusingtoolssuchastheTestStandPropertyLoaderto
loadorsavelimitsintextfiles,spreadsheets,anddatabases.Insteadofembeddingtestlimitsincodemodules,definetest
limitsinthesequencefileandusetheparameterlisttopassthelimitstothecodemodules,ifnecessary.WithTestStand4.x
andlater,youcansavesequencefilesinalockedbinaryformattoreducetheriskoftamperingonthetargetcomputer.

LoopingInternallyorExternally

Ifthecodemoduleperformsameasurementwithsomeswitchingtoconnecttoanddisconnectfromatestpoint,useexternal
loopingsoTestStandcanprovidetheloopindex.However,ifyouneedtoperformanadjustmentortakeaseriesof
measurements,performloopingwithinthecodemodulebecauseaccessingseveralcodemodulestoperformthetaskcan
considerablyincreasetheruntime.

AnotherwaytodeterminewhichloopingstrategytouseistoconsiderwhatinformationyouneedtoreturntotheTestStand
architecturelayerforreportingordatabaselogging.Ifallyouneedisthefinalresultorasubsetofallthepossibleiteration
results,considerinternalloopinginthecodemodule.Ifyouneedalltheiterationresults,considerexternallyloopingin
TestStandsoyoucancontroltheactionsaroundthecalltothecodemodule.

PassingtheSequenceContextObjectReferencetoCodeModules

UsingtheTestStandAPIincodemodulesrequirespassinginreferencestotherelevantTestStandobjects.Typically,steps
passareferencetotheSequenceContextobjecttocodemodulesbecausetheSequenceContextobjectprovidesaccesstoall
otherTestStandobjects.IfyoupassareferencetotheSequenceContextobjecttoallcodemodules,youcanusethe
TestStandAPIwithinthemodulesinthefuturewithoutupdatingexistingcallstoaparticularmodule.Youcanusethe
SequenceContextobjecttoaccessanyvariableorproperty,andyoucanusethePropertyObjectinterfacetostoreorretrieve
values.ThedrawbacksofusingthisapproachinsteadofusingexplicitadditionalparametersarethatitrequiresTestStandAPI
callswithinthemoduletoaccessdata.Therefore,theparameterlistofthecodemoduleisnolongerafullyaccurate
representationofthedatathemodulerequiresorreturns.Bynotexplicitlypassingdatathroughparameters,youcanmake
sequencefiledebuggingandvalidationmoredifficult.

http://www.ni.com/productdocumentation/10369/en/

2/8

18/11/2016

BestPracticesforCodeModuleDevelopmentNationalInstruments

IfthecodemoduledoesnotallowanullSequenceContextvalue,youcannotcallthemoduleoutsideofTestStand.Therefore,
youshouldtestthevalidityoftheSequenceContextreference.InLabVIEW,youcanusetheNotANumber/Path/Refnum?
function,whichreturnsaBooleanvalue,asshowninFigure3.

Figure3UsingNotaNumber/Path/Refnum?tocheckvalidityoftheSequenceContextObjectReference

3.StrategiesforTerminatingorBreakingSequences

WhenauserpressestheTerminatebutton,TestStandstopstheexecutingsequenceandrunsanyCleanupsteps.However,
onceTestStandgivescontroltoacodemodule,themodulemustcompleteexecutionandreturncontrolbacktoTestStand
beforethesequencecanterminate.Whentheruntimeofacodemoduleisalwaysafewsecondsorless,itisusuallynota
problemtowaitforthecodemoduletocompleteexecutionwhenterminating.

However,whentheruntimeofacodemoduleislongerthanafewsecondsorwhenthemodulewaitsforaconditiontooccur,
suchasuserinput,waitingforthecodemoduletocompleteexecutionbeforeterminatingatestsequencecanbe
unacceptablebecauseitcanappeartotheuserthattheirterminatecommandwasignored.

Codemodulesthatdonotalwayscompleteinashorttimecantesttheexecutionstateofthetestsequenceandcheckfor
termination.Forexample,youcanusetheExecution.GetTerminationMonitorStatusTestStandAPImethodtoobtainthe
executionstate.Basedontheexecutionstate,thecodemodulecanquicklyexitiftheTestStandEngineattemptstoterminate
theexecution.BeforeyoucalltheExecution.GetTerminationMonitorStatusmethod,youmustfirstcallthe
Execution.InitTerminationMonitormethodtocreateaPropertyObjecttoholdtheexecutionandterminationstates.The
Execution.GetTerminationMonitorStatusmethodusesthePropertyObjectandreturnsaBooleanvalueyoucanuseto
terminateloopsorskipcodetoquicklyexitbacktoTestStand.

LabVIEWincludesVIsyoucanusetomonitortheexecutionstatus.TheComputerMotherboardTestexamplecallsthe
ComputerSequenceSimulationDialogVIfromtheSetupstepgroupoftheMainSequenceoftheComputerMotherboardTest
Sequence.seqfile,asshowninFigure4.

Figure4MotherboardTestSimulatorVIthatmonitorsforexecutiontermination

TheTestStandInitializeTerminationMonitorVIcallstheExecution.InitTerminationMonitormethodtoobtaintheexecution,
terminationmonitor,andSequenceContextreferencestopasstotheTestStandGetTerminationMonitorStatusVI.

TheTestStandGetTerminationMonitorStatusVIcallstheExecution.GetTerminationMonitorStatusmethodandreturnsa
Booleanvalue,whichiswiredtoanArithmeticCompoundFunctionsettotheORoperation.TheinvertedoutputoftheOR
functioniswiredtotheWhileLoopconditionalterminal,whichissettoContinueifTrue.Theloopexitsifthe
Execution.GetTerminationMonitorStatusmethodreturnsTRUE,ifanerroroccurs,oriftheuserpressestheOKbuttononthe
frontpaneloftheVI.TheTestStandCloseTerminationMonitorVIclosestheexecutionandterminationmonitorreferences
theTestStandInitializeTerminationMonitorVIopened.WhentheWhileLoopconditionalterminalissettoStopifTrue,you
donotneedtoinverttheoutputoftheArithmeticCompoundFunction.

http://www.ni.com/productdocumentation/10369/en/

3/8

18/11/2016

BestPracticesforCodeModuleDevelopmentNationalInstruments

IntheLabWindows/CVIversionoftheComputerMotherboardTestexample,theComputerSequenceSimulationDialogfunction
callusestheTS_CancelDialogIfExecutionStopsfunctiontoautomaticallyexitthedialogiftheexecutionterminates.

Refertothe<TestStandPublic>\Examples\DemodirectoryfortheComputerMotherboardTestexamplesforother
programminglanguages.RefertotheTSUtilfilesintherelevantdirectoriesofthe<TestStand>\APIdirectoryforsimilar
executionmonitoringfunctions.RefertotheNITestStandHelpformoreinformationaboutTestStandAPImethods.

TheTerminationMonitorisveryusefulinsituationswherecodemodulesthattakealongtimetoexecuteneedtoevaluatethe
statusoftheexecutionsothattheycanquicklyexitinsituationswhereanexecutionhasbeenterminated.Atothertimes
duringalongcodemodulesexecution,ratherthanterminate,developersneedtomanuallybreakasimultaneouslyexecuting
threadforthepurposesofdebugging.Executionsmustwaituntilallthreadsareinbetweenstepsbeforebreaking,which
meansalengthycodemodulewouldberequiredtocompleteandreturn.Asaresult,duringcodemodulesthathavealengthy
runtimeorwaitforsomeconditiontooccur,executionwillnotbreakuntilthecodemodulehascompletedandtheuser
interfacemaygivetheimpressionofbeingunresponsiveifthedevelopertriestousethedebuggingtools.

Inordertodebugonethreadwhilealengthycodemodulerunsinanother,youcansettheThread.ExternallySuspended
propertytotruewithinthecodemoduleimmediatelybeforerunningthebodyofthecode.AfterusingtheTestStandAPItoset
thispropertywithinthecodemodule,theexecutiontreatsthisthreadasthoughitisalreadysuspendedbytheexternal
module.Ifthedeveloperthenbreaksanalternativethreadwhilethemoduleisrunning,themodulewillcontinuetorunto
completionbuttheinterfacewillimmediatelyrespondappropriatelyinsteadofwaitingforthemoduletoreturn.

ItisimportanttorememberthatwhenThread.ExternallySuspendedissettoTRUE,developersshouldrefrainfromusingthe
TestStandAPItoguaranteethatallraceconditionsandcollisionsareavoided.IfyouneedtoutilizetheTestStandAPIorifthe
modulebodyfinishesexecuting,besuretoresettheThread.ExternallySuspendedpropertybacktoitsoriginalstate.

WithNITestStand4.2andlater,LabVIEWdeveloperscanusetheSetThreadExternallySuspendedVItoeasilyaccessthe
Thread.ExternallySuspendedpropertywithinthecodemoduleitself,asseenwithinFigure5.

Figure5UsingtheSetThreadExternallySuspendedVIwithinacodemodule

4.UsingInstrumentationwithinCodeModules

Tocallaninstrumentdriver,youtypicallyfirstopenahandletothedriver,usethehandletomakedriverspecificcalls,and
thenclosethehandlewhenyouaredone.

YoucanreturnthehandlethataninstrumentdriverInitializefunctioncreatesinacodemodulesoyoucanstoreitina
TestStandlocalorglobalvariable.Youcanthenpassthevariableasaninputtoeachstepthatrequiresaccesstothe
instrument.InLabVIEW,youcanusetheLabVIEWIOControlastheterminaldatatype.Alternatively,youcanusethelegacy
SessiontoRefnumVIthatconvertsanexternalsessionhandletoaLabVIEWrefnumandthelegacyRefnumtoSessionVI
thatconvertsaLabVIEWrefnumtoasessionhandlesoyoucanstorethehandleinaTestStandnumericvariableorproperty.
WhenyouexplicitlypassinstrumenthandlesbetweenTestStandandcodemodules,youmustdecideinwhichvariablesto
storethehandles,andyoumustconsidertheplacementoftheinitializeandtheclosecodemoduleswithinthesequencesyou
createsoyoucanusethehandlewithinallthestepsthatrequireit.TheadvantagesofreturningthehandletoTestStandare
thatyouhavecompletecontroloverwhenyouinitializeandclosetheinstrumentandthatthecodemodulesaredecoupled
fromobtainingtheinstrumenthandle.

Alternatively,youcankeepthehandleinglobalcodemodulememorysoitisaccessiblefromwithinallcodemodules,suchas
withinastaticviSessionvariable(CVI/C++)orwithinaLabVIEWglobalvariable.Whenyoukeepthehandlewithinthecode,
youcanavoidtheneedforaseparateinitializestepbyretrievingitthroughcodethattestsforavalidhandleandcreateoneif
onedoesnotexist.Thedisadvantagesofthisapproacharethatitcouplesthecodemoduleswiththeglobalvariable,anditis
moredifficulttoshareinstrumenthandlesamongcodemoduleswrittenindifferentlanguagesthatcannotshareglobal
variables.Also,youstillneedtoexplicitlydecidewhentoclosethehandle.

ForVISAandIVIinstrumenthandles,anotheroptionistousetheSessionManager.Codemodulesandsequencespassa
logicalname,suchasDMM1,toobtainareferencecountedsessionobjectfromtheSessionManager,whichholdsthe
correspondinginstrumenthandle.TheSessionManagerautomaticallyinitializesthehandleafterthesessioniscreatedand
http://www.ni.com/productdocumentation/10369/en/

4/8

18/11/2016

BestPracticesforCodeModuleDevelopmentNationalInstruments

automaticallyclosesthehandlewhenthelastreferencetothesessionisreleased.Thus,codemodulescansharean
instrumenthandlebynamewithoutexplicitcouplingthroughsharedglobalvariables.Inaddition,byholdingareferencetoa
session,ahigherlevelentity,suchasasequence,canmakecertainthatasessionexistsforthedurationofitsexecution.This
ensuresthattheinstrumenthandlewillbeinitializedandclosedonetimeatmost,nomatterhowmanyofthesequencecode
modulesandsubsequencesaccessthesamesession.

IntheexampleshowninFigure6,theGetDMMSessionstepobtainsareferencetotheinstrumentsessionobjectforthe
DMMforthelogicalname.Thestepstoresthesessionreferenceinalocalvariablesothatthesessionremainsinitializedfor
thedurationofthesequence.

Figure6TheLabVIEWversionoftheTestStandexampleforSessionManager

ThepreviousexamplesequenceobtainsthesessionfromaLabVIEWcodemodulethatcallstheSessionManagerinsteadof
callingtheSessionManagerdirectlybecausethisexampleconfiguredtheLabVIEWAdaptertorunVIsinaseparateprocess.
RefertotheLimitationswithSharingInstrumentSessionsBetweenProcessestopicintheSessionManagerHelp
(http://zone.ni.com/reference/enXX/help/370052M01/tsexamples/infotopics/session_manager/)formoreinformation.

ToobtainaninstrumentrefnumfromalogicalnameinaLabVIEWcodemodule,calltheGetInstrumentSessionVItoobtain
theinstrumenthandlefromtheSessionManager.CalltheSessiontoRefnumVItoconvertthehandletoaLabVIEWrefnum,
whichyouthenpasstoaLabVIEWinstrumentdriverVI,asshowninFigure7.

Figure7LabVIEWcodemodulethatdemonstratestheuseoftheSessionManager

TheTestStandSessionManagerexamplesarelocatedinthe<TestStandExamplesFolder>\SessionMgrdirectory.Select
ProgramFilesNationalInstrumentsSessionManagertolaunchtheSessionManagerHelp
(http://zone.ni.com/reference/enXX/help/370052M01/tsexamples/infotopics/session_manager/).

5.PerformingSwitchingFunctions
http://www.ni.com/productdocumentation/10369/en/

5/8

18/11/2016

BestPracticesforCodeModuleDevelopmentNationalInstruments
5.PerformingSwitchingFunctions

YoucanhandleswitchinginTestStandbycallingswitchdriverfunctionswithincodemodules,usingtheTestStandIVISwitch
step,orbyusingthebuiltinswitchingpropertiesofastep.However,ifyouarenotusingNISwitchExecutive,youcannotuse
theswitchingpropertiesofastep.IfyouareusingIVI,considerusingNISwitchExecutivesoyoucanremovetheswitching
functionsfromthecodemodulesandconvenientlyusetheswitchingpropertiesofstepsinstead.Takingthisapproachcan
increasethereusabilityandreducethecomplexityofyourcodemodules.

MaintainingswitchroutenamesorchannelnamesinaTestStandarrayisaconvenientapproachwhenyouwanttomakea
seriesofmeasurementsatdifferentlocations.AsdemonstratedinFigure8,youcanusetheRunState.LoopIndexpropertyor
anothervariabletoindextherouteorroutegroupnamesforstepsthatyouloopon.Also,ifthestepispartofatestsequence
thatusestheParallelorBatchprocess,youcanusethetestsocketindexRunState.TestSockets.MyIndexaspartofthe
routingstringorastheindextoanarray.

Figure8RunState.LoopIndexisaconvenientvariableforswitchrouteconnectionindexingonloopingsteps

RefertotheAcceleratingDevelopmentandSimplifyingMaintenancewithNISwitchExecutive
(http://zone.ni.com/wv/app/doc/p/id/wv704)webcastformoreinformationaboutusingtheswitchingsteppropertiesto
incorporateswitching.

6.HandlingErrors

Anerrorinatestsystemisanunexpectedruntimebehaviorthatpreventstestingfrombeingperformed.Incontrast,atest
failureoccurswhenafaultisdetectedinaunitundertest,suchastheresultofthetestmeasurementfallingoutsidethe
boundariesofitslimits.

Whenacodemodulegeneratesanerror,passthatinformationbackintothetestsequencetodeterminewhatactionto
performnext,suchasterminatingtheexecution,repeatingthelasttest,ortakinganotheraction.

YoureturnerrorinformationtotheResult.Errorcontainerofthestep,asshowninFigures9and10.Inmostofthelanguages
TestStandsupports,youmustfillintheindividualitemsoftheErrorcontainerseparately,asshowninFigure9.InLabVIEW,
youdonothavetofilltheitemsoftheErrorcontainerseparately,asshowninFigure10.

Figure9ROMTeststepfromthe.NETversionoftheComputerMotherboardTestexample

http://www.ni.com/productdocumentation/10369/en/

6/8

18/11/2016

BestPracticesforCodeModuleDevelopmentNationalInstruments

Figure10ROMTeststepfromtheLabVIEWversionoftheComputerMotherboardTestexample

Noticethatthecodemodulepassestheerrorinformationout,orbacktoTestStand.Youdonotneedtopasstheerror
informationfromTestStandintothecodemodule.IfthecodemodulereturnsanerrortoTestStand,executioncanbranchto
anotherpartofthetestsequence,suchastotheCleanupstepgroup.

7.LoadandUnloadOptions

Youcansettheloadandunloadoptionsofastep.TheloadoptiondefaultisPreloadwhenexecutionbegins.Theunload
optiondefaultisUnloadwhensequencefileisclosed.Withthedefaultsettings,TestStandloadscodemodulesintomemory
whenthesequencefilebeginsexecutingandunloadsthecodemodulesfrommemorywhenthesequencefileisunloaded.
Withlargesequencefilesthatincludemanycodemodules,anoticeableinitialdelaycanoccurwhenyoustartasequence.

ThePreloadwhenopeningsequencefileloadoptionincreasestheloadingtimeofsequencefilesbecauseTestStandloads
allthecodemodulesintomemoryatthesametimeasthesequencefile,butwhenstarted,thesequencebeginsrunning
immediately.TheLoaddynamicallyloadoptionloadsthecodemoduleintomemoryonlywhenthestepexecutes.Usethe
LoaddynamicallyloadoptionwiththeUnloadafterstepexecutesunloadoptionfortheleastamountofmemoryusage.

OneadvantageofloadingallthecodemodulesatsequencefileloadtimeisthatTestStandimmediatelyreportsanyissues
withthecodemodules,suchasmissingDLLs,brokenVIs,andsoon.Whenyoudynamicallyloadcodemodules,TestStand
doesnotreportissuesforthecodemodulesuntilitloadsthecodemodule,whichcouldbetowardtheendofalengthy
execution.However,loadingcodemodulesduringexecutionisusefulwhenyouwanttodynamicallyselectaparticulartestfor
agivenUUTorwhenyouwanttorunadiagnostictestwhenafailureoccurs.Inthiscase,youmightnotwanttoautomatically
loadtheseoptionalcodemodules.Takingthisapproachcanreducetheoverallmemoryfootprintofsequencefiles,buttherun
timeincreasesasaresultoftheadditionalloadtimes.

TheDynamicallyDetermineCodeModuleexampleillustrateshowtousetheLoaddynamicallyloadoptionandtheUnload
afterstepexecutesunloadoption.

RefertoBestPracticesforImprovingNITestStandSystemPerformance(http://zone.ni.com/devzone/cda/tut/p/id/7559)for
moreinformationaboutotherwaystooptimizetheperformanceofatestsystem.

8.LocatingCodeModuleFiles

Youcanuseabsoluteorrelativepathstoreferencecodemodulesinsequencefiles.However,youshoulduserelativepaths
wheneverpossiblebecauseitismucheasiertomanipulatetheorganizationofthefiles.Forexample,ifasequencecallscode
modulefilesthatarelocatedinthesamedirectoryasthesequenceorwithinasubdirectoryofthatdirectory,youcanmoveor
copytheentiredirectoryifthecodemodulepathsarerelativetothesequencefile.However,ifthecodemodulepathsare
absolute,movingthedirectorycausestheabsolutecodemodulepathstorefertononexistentfiles.Whenyoucopythe
directory,thecodemodulepathsofthecopiedsequencefilestillrefertotheoriginalcodemodulefilesinsteadoftothecopies.
ForanexampleofhowtoappropriatelyuseabsolutepathsinanNITestStanddeployment,refertotheUseofAbsolutePaths
DeploymentExample(http://decibel.ni.com/content/docs/DOC7450).

AnotherissuetoconsideristhatwhenyouusetheTestStandDeploymentUtilitytodeploythetestsequencefilesthat
referencecodemoduleswithabsolutepaths,thedeploymentutilityattemptstoconverttheabsolutepathstoberelativetoa
commonroot.However,ifyouhaveabsolutepathstofilesondifferentdrives,orifyourdeploymentspecifiesmultiple
installationdirectories,thedeploymentutilitymightnotbeabletoautomaticallydeterminerelativepathsforallthefiles.

9.Conclusion

Whenyoucarefullyconsidertheissuesoutlinedinthisdocument,youcancreateefficient,reusablecodemodulesthatare
easytomaintainanddeploy.

10.ViewAdditionalSectionsoftheNITestStandAdvancedArchitectureSeries

http://www.ni.com/productdocumentation/10369/en/

7/8

18/11/2016

BestPracticesforCodeModuleDevelopmentNationalInstruments

ClicktoviewadditionaldocumentswithintheNITestStandAdvancedArchitectureSeriescoveringtopicsofinterestto
advancedNITestStanddevelopers(http://www.ni.com/whitepaper/7022/en)

11.AbouttheAuthor

RayFarmerNomadTechnicalServices,Ltd.(mailto:ray.farmer@talk21.com)
RayFarmerhasbeenahighlydemandedspecialistconsultantforovertwelveyears,implementingtestsolutionsforawide
spectrumofclientswiththeuseofLabVIEW,LabWindows/CVI,andTestStandacrossavarietyofindustries.

12.RelatedLinks

BestPracticesforImprovingNITestStandSystemPerformance(http://zone.ni.com/devzone/cda/tut/p/id/7559)
AcceleratingDevelopmentandSimplifyingMaintenancewithNISwitchExecutive(http://zone.ni.com/wv/app/doc/p/id/wv704)
UseofAbsolutePathsDeploymentExample(http://decibel.ni.com/content/docs/DOC7450)

http://www.ni.com/productdocumentation/10369/en/

8/8

Вам также может понравиться