diff --git a/examples/nidcpower_source_dc_voltage/README.md b/examples/nidcpower_source_dc_voltage/README.md index 13c9038e1..dfd1c97c9 100644 --- a/examples/nidcpower_source_dc_voltage/README.md +++ b/examples/nidcpower_source_dc_voltage/README.md @@ -16,6 +16,10 @@ This is a MeasurementLink example that sources and measures a DC voltage with an `ui_file_paths` array in `measurement.py` - Includes a TestStand sequence showing how to configure the pin map, register instrument sessions with the session management service, and run a measurement + - For the sake of simplicity, the TestStand sequence handles pin map and session + registration and unregistration in the `Setup` and `Cleanup` sections of the main + sequence. For **Test UUTs** and batch process model use cases, these steps should + be moved to the `ProcessSetup` and `ProcessCleanup` callbacks. - Uses the NI gRPC Device Server to allow sharing instrument sessions with other measurement services when running measurements from TestStand diff --git a/examples/nidmm_measurement/NIDmmMeasurement.seq b/examples/nidmm_measurement/NIDmmMeasurement.seq index 139881d57..7fbf8bf19 100644 --- a/examples/nidmm_measurement/NIDmmMeasurement.seq +++ b/examples/nidmm_measurement/NIDmmMeasurement.seq @@ -1670,37 +1670,31 @@ E@=3DJC4100hYLECF=_K@0@mKCYo_1KN:<Ta239hF9[gHbEVFDfRINZfQ01CkaUMk5=k`[c;[42MMF9aiNliecVfMFCLXi_`f2H7c\G\X50M=Z4S4aT2QI>A^D:d1\PCI`L11RlV5bM5AIZTc9STI5Mkg<bHlle[O=CL_KEgb?8RiVHS7QmPY@S4X^7I58A@kPaKcPWCOC1;DBf61lViY=]`28BC\B_mEf20ZJS@W@GDDRffLe\Ci;aKbN>i5P_4ScVVBTjIIfn0j8l<e6IcMbZHgCI;n8CRlR7<YcK0@cY[8aDHj=GGkNK;C?KC?b=]mMejoc1gGol1>hL6lf5fZ92?Ia@l1;QL024f^NSm2MhNlcFg_YR[l5kclo:einXehbR>98[4?GC:CX[3hm\UMob2aIMT0eJmgI@\;njRK9]fIl_8f=d]n4bQcRXDEl<o=@Yiik\3Md@?k1=0Joj>?Je`<RUd<JYmeOnOgB3G@Ub\FoGFgIQmQli8nGH=QjKD9i`2nf41XEKj;oDB8iZU`@XP^KWoAKEbOf:ViVAl=_I37KJSec7Ea\nJ5]NZj\OnJF;ASQemRIDbbdglb\U>H[O^bDHO?XMLaOoeVCf=a^CC`d8^TX2B E@=3@J\4110h]L]Mg[cK3fBoj\Kifo1C[KY_3VgFm3_6n>DfdTDgjaSF_LdVUJaY::FII@T:GB9LaYOo80OP^053LBBVb1G?:50k4;P1c\^`03ffoj9S72=AOm;a2oh?Na\lC7TUOXcNfaSdfIbVCC_ao20aN9bmo_<R_S=>KV;lhbmh89SY[:2UflXcmGIlnngoE]\\ad_6_gW8X9GAXJSPJYin>C71=c74a79JN<`GPK]_\>2`h9IOC]VA5BU4AMW1Qc`j?lJ\aR4__>R4SI_`[_mmnM33ONg`3P[g4N5aSF;ce]^eVffg6>cIRLhI]7CjE^W[jW`kZkGEWHk1=RR;gTe:O[H;k[bAd7UCaTVXgjlho3Af>?oIJdjMo>3=o;aTo\ZZnG9_cgcO7mjV^k>\:gkoOkSn1jkfm@MgLnb<Amg;\Nmj8klk3llhhnW>nn^GCW_fW_>ji]:Va>TNnNQdK5LolNX?M@\6jN2ddlIHh=MT1E^[o4Q7I54R=RlVg[S\KmOe9GM:Qeh9OnUhWTeC^ZM7SAGP1V=LZ4[i\cOmoH[RS6YBL2L\PAg][JQ<Eo?8;D9Mk3M]>N^6>HgJ]KP^a>cfBkkmZ33RdU`]jB_NIOShWL4oDlbn3lNOCL??R7GCmKaTDhekoi_En`9oJKe<e1`lBjmjXJ<^4_^_^>?7O?nEE_WTY:VYEc]3^eJm^cdC7;LcK_]Ei>b<^`9HR6YcO>l@Amg>PLXQbSb^=?FXRUZd<[n<SGjgCQ`mhTl;7NUbgaRQBkXNY4iX5iAJX6C`gdG[d3d>`Uj3DPMF7h71WBBLLR>Tk9dZlFCYSi__fNBBT`C;A>jeP2CdONN52i5^eBEIEI=8EMHBBe^G^1ohD6>LRiJgM\IPYE8Wn`T9W@jf8iEfN:@L3<Ha_l0CCE<HOJjXBRll_NLReo_^K7CQWihL<B1::YXdSaG<XFnCP94dQXb;^6V07F>TkPem>4QI;?9JkF`g80:`G?AULFSY^XW;4XL^_D=GZV9VVODS^[=]dL]b=N;O[ib6]2aLATM7\AcX=JH<\1j8_?I9_VUO]5;PKjdi^o>Kn=FbmhAmF3EXh?dAPF?cWPU;NHFT9YBblF15fj0n]RK9>d;@lD9HXLGTZOAa;gEd6:MElAPOkOoMom`hnaYko^ne_;PeC\`kMYOoCalP3DR_^NADNSV6R1Nk4f?=Lo;VQ>7>fR@=2j8C:;D@3fk>^=YHE^PQ1fU>TFoNH>GnfRGNMNW`[okK`S56RJfM4Zmo^6E9ZYc>FNEO3PO=T9eK0:bgljYdR7WooKS9eTjd@bcImNVZ8UXa:AC_F_WCj]4\6ST<:ie_AbZFIL7UmlIne:BcTQ5T2U]O2goYWXRN5F8oeQT^`HXPD=2LV[h;ibbNNj1kU]lXlnX4ACO5aRA@TfHY77@P?L=_N@4^cJG;Wi2@3M5OQ:^@>2K9_9W:4Vn1LGaRN@WL9AFFVg1oYHdi`54XIa5G[\i>iPT4506XA7h2^c_T`3d[ARdFICaAS2RM:1KgT7B>MhXVaI<kA^@CX2aS^I:B>=W<U?l<DWU<Jd7^cKe2R]EdIBcBQZni_K1JPCEhV>VH]FBZ<5413k[U]MAFA`Ohma2g2NoU0@E;FI93Yi;RjnlScC;`glEaH^X@K[NY9Y1EUZc6V6\3?FKC0APU0^[aP:_GMI=eeWnJ<6e2]@;AXaAE<S[lhAb`XFjPP@dTXNYS=<568je\`W3?@gn9HDaM84^>SDl0<Ba6YNKCeYZ\CUU?WGnR4=m^aN[KTlFG\?VZ[MC:3HfflAagl\jZUG@ScZW:2K\FU9TQa<h;?iYb<RJI66IEg<WHgdkU:\KFIZG\BDU=9W>:\:W7nM3NIjXT;2YV[@dDaY3bhOQY^af<UVo:ZV^^@0d_M5ObRQ2PIHZ9bbbGm;4Z\KEfEYI=M];D@9j1kZ@2@FIkf9:\CYe5KnKANXH7R@eMc2M;Pl]PZG]@4h2Q7OY:=QFh@\Y6]E6X1bL6mjS76a`JS=H=XQReG6Djb7[c<h@S5UCX4`ABLQ4:ZZ7=JF9JejC5\[T:meE5_[:`Qm=DfI0EDQLRH6o]LAPRXlbTgXSbnW7ZTN?N]lH02JKm;Z4hn<A[89:C8lM5hC]Ab^\\WNK7JGS]XainLm:PWFF3EmC15\]YC\D;I6a<NiIhd2GMIG`A9\[]T00fP:UXIXSHk2jI>XFG>I521bbKDA`Xb]h>oAl>IolbRB7j=i9_H89<FR=U572U\LjNhnkeeemHDJJ\GHX\;J51M<?QV2DneREAR3in6<M75M_Re=Ci3gEOQ2VO`4P8_hfhSO\dZ7m]n\hlV6gSlSC@PoZSe8WUaY3d0_;Z=9H:I6Gf2PVG`mf8CC87@DBlT62^h6QFFhZF64BJ46@Dh<T1=C]0_9J?073S@61ADIUT31<mVE<W?R@RBUJP`@;50X2Bh618KM^bf033T033D?NM@P`?0\dBA3A8AXF0]@KnP[5<EDfUICcBF^EZT=:cWKBKYTDKXD=<A:mkNB7LFDHC9b7nG57NFZ1]Ubo]8]0MN]YWJJ>eS42I?===3_n_?J=384=Go8e^0mdmBiTjRaf;F@8M4_gCZSGQ3cUUnF6J_R9WJV0PNaTJDk<RiWS6=>Rf9EmM:WgL4LHg5oH[aMbbOlnI6b`9KZ^Z]oAdeH\@YgaV8ChHTKjEVA]a^YN<;71CAbR\<jAYI\\Y<R\`1AOol`j1>53?d8MV_@kAN_W4nIdKc0gRYHEo`]U?HWN?0<?l2h:ZC\>^D]Ug4FNZl123fNoZ7fLRB[_HR6O>BaoomWl_8YS0Q\8;RB]@j=GIIe]J<AT[;1I<5ZJ\?Va5g?>7hXgcbU4V=lT>nV[28JKeQJ5QX4^WD3MfTBIBPKU57e>[FRd>_EeSHJhDa4hM9S9TUlOR=KWn]eAJ]W5VROh9ak`n5<LV6L9d<0`?fk]J8FW52OlL2i<L1kO=mGBf9e:\`^[_J:F>7o0_9mGc_`=KP@SW_^NU525JcQcEGhR8Da3gf4mJ?R6a2lLPKjL:TlfL8iHOKf:Mjeb\>Xb3>0kM@iNkaifYHDFNIKP\e^;bhg@V<g0Za7F]R=JKPMgdg>nYaMSb8MAV0o05XKjM5<5^V=albT\<868hhl^jHPRa0KcT4i[31chfOeGW>;``>>I;B:YafYW>jW_7D1>9_X14U9VXJ5E_PA2ZPb>n6eBLcN]SU4eSd<IDGD4D5WHMlFCU0DeARScb:h\?EC1>IBWead>7F>FeBea\oCS]jf@kE47ZHcB?TlP6_K[QC2@_N>ilNn0VdgZE>Z98hXCHa4bNUM16M74Q;DhldmcZ>V?_TG1J?NI:F8<aomhdPX5^AEe6BRYle4clf_gSb6D9LaD2h]ij8SAH@[`J@cb2G7ee@iZWl2A>`Ga95FDhJo7Xo>Zd3[jL<DQ4OILX9a;0T\SUDWY:Bh>WGNb:dHQ[S`[8:1L:F@>H[49RQ6_3QV<UT0oIITF^H_\X=:<42`N``YjM75HWEd]5O`<EX89FTP`^oN:QHgED5k:\CaYbA2GbD1;X5:N;?SoLhVhR`R_9lg3hU4n:I`2Gn:IjDHED]5i=2fcTklTK1H6k4HjK;HBM>;c]9;i[MFD?WaY1O]oS293kLd9S3N6He?:_QKEcBGLOc:jB6H@fR]h]HGB5;:<RE<`3K4Ibi29dR;nU<<TKBRnTdK[ZTT6oiOVVXKgaP6<lMTO_JC\0<RY5NkR352<FbcCB<_3?0XjQ`BJP;OJR::8eHFb3<;M\9FOC8T:MkD:Z;C=eb^0:AMSbSY_^Lc=SGbD5WDh@6j]PCDc@;\X1Nb\[`Z0W_Th5<HD4CafYghb`T95Ko571]SZJDHF2eE<7jViL_\8TQ@dFRo]`G[h3>862l:2F[UU6dVbFjU?NI>OHOk>JNcFNU[mXi]iJ[neWQ\mWa]i[e?IkO^Mf]LHTP[G3?43M8g^Wh``lW3kBT7ADM6b_IUCIPO=C8g5@?9R3<hilXNY7_<THNN<KMLm;eGM6_A6AUDB\c5Q;S2POniP9[mdEeIDnO7;T7Nia2nFN\L2XZIP?ZJKW\2cK0U5fb[dLn?[C>YAMXfVFic02OQA\6LHEk0oBd0f;`kR1hImAUl:@I;^:oFJUF?mDgPlLokm]OIgenn9;n5[Oh3g7@W7OWBCk9X1mYDPF9AQ4LOGeM_D_WR?I7QRlVEmN_0QlA9^lO[HjnfngGjkHokO\A35=_4hVU^jKm;\?Y9^B=RkTG1I<6nI`AQ_kJ;of[GmIi[g0]1\UG_FKUnX]ZcGmoI;NUdDFOolHn;NbMLkT`1GEo;j63N_8b_O`PQ[KRjb<NDHW4;\lT[Ila;nMd`56_c\C25fJLUS;9fn@6[[SMIBBMFK\8d;ZIRSI;fJ5_cojWSIfcY2kNd1jkS0f9A3BNfk8W1m4H0gRbfA3J6Q726nmNm4PQYcWZ___NEf_FmmmOm40IZ1mf4PmS?H8k>=J3g<\1K6j;CNTGZ8kY61mk30RLUO`T`_H`Hg<`\K67=HJ3g<\3K6iGRVO9``_1H`L`\K6`f=371ikY61mf30S<W]K86enT`_H`Hg<=fbaLQO`c@<hK;Rmmf>KT=]4\mm;NkW]^mcFgV[_]l=8aHk_j]MgIEYV5XJkiW]l^^CKnYn2OgNJ0g<fR\mWo;?JNcFN^cfL_eWZ[Eff[LeWebL[d?YfWFm3O0neW6m3NP3nGQ@G_M?lS61c3KG?`NUXHYTJ?j1SoC7V>RGj_]d[blRO_M^Qg>f_[0oQJWgg`CkhXXJ\hG;1Ujg`4MNjIg_6l3GG;oohYSNBallm3eZnFmebBeaLSDIS17WJfDBN9nUo^n2oC_;Q\;4O3WWk7mAZI17;2]ChHfZeJ;I\fY;^dB\J;NW@cEDj]HE]B8GSiKJgN9M6f4UIKhV02kFjYnXXBH9lF?3gDC<EC`d=4l<aIYa?]YS<9Zl8]AkXcPg:6L69WWX^8R2;YXfC<Xg6AQg@oOoChH=41ln]AG?J3U0Wn>8[8cdWGUnL2Z>Ll4HaNcI<f]SiWCVXSMeP?^a7:Tf<`L3cKdmDl7?Uj>FnPG5NSQBkHE`Yj>ZNQ^;UbDk0kCT]3]YV<50o<2<aTY7THb5hg;3^hl@GYRZE@mbL?5gdHJNW5`6W8[eho^38?;R459L4WN1Jg[egNX[3[_>lAAY>L9Z_H5YN]9:KZMj\cPGZco]??=ig[hH7YShgPS8:44leI:@9R?fLHKlH6UZ]nlAXHFAFUn7AdT=;FK^oZgocoK[2W_=Aj]T;2mBd8`7h`B0K>IP<04@S6]dA9N`8Q8YBk19T@8RFF4T29OB1V7TX7QM01@hI@3`QJ=4@H\nBkS2d5P1BDgN8?4B230Y8lb8ONC@?IPH0A@OMPD?HZ@1`>mj`5N5c60PN06hNI1c8`@k6b0M9IN3`QM68;M1l5Bl>6cX>XD78V@S2j5Ad;C<0cA7OX0nM8<iaN3K0@0Kil664BNSOe:0@R=6NA66f9@PX0d0dHb:LL\6@1aSJl[5h6I38X<0`;0<Al748MXb84H=@Y<lI\5@GNMD;RJd?DeY0Ac1J230g>d1e00LP8d;>V@59CQA1BG<@2[2A45hE8CX:H0A=a\KRAC<Q0YPRb5D<IR63P1QX<JXCS9a3FQ>daQVRjO4I;1da1URZ;LZ444@R2PX2XAXA9Te@FngkoKI_ea>NZN^m\`1H5CMhX9Bn1?ZYS0WAbR2RD8F3W@XajF1=AXS6<TS4i09PN?`gPUG9G3J26`2GbAW]jGY5<AGn^iZAjM_;W5<g^kKMC]B[X13GZm3mmNffKMhb:cJ]DAT>a?_4H8jZX2PIja6[DFTFC:]l]=1AN=PD`VJ>HX2k?Pj7:bQ`W[XWe0\38<V=I\:]2HOl74S6e0a;ZmCFf:3FnRcED67[hUWZPU7ZZKLUVD\PFX_FVE23Q7WUaWV=U><ZRLQB8LDd0hS94OC1D?6J9N:\\`US2k:iaJY8jY]eTVWO0KLeICMh3dn\dH86aYA7eY]eZZ3=d6WJLE7IPEWIe=_c4FYLEhdA\b5XoJQE;n[HFdKI7C3oK`RFK6l`B8RhhCXhP8XnP3841548PB6P6B[DKHS41JU<Qne:U\ARQ=B[VDHSOT307XA07Qhn2d8RBoajKU>9P@S2lYle3RId0IIf072nP8>;NUah=0ilGD:G5\RN_\=;5jTD@iTfQNGIfmQJ2oJl[SBFC]DLncWBE4mFZe6d_Ob>3YC4APEA@D_mOFNI8ALek79bT>:a8]EjYToY<]8C`FV4Z``X`1aB@L<?V9ARCQ4c:K71jA4o8X@_N2@;?hf9D0M0]D;:A]?]T5@Y1`>Vi=L5H`I25YCYJTF@F?fd@VbI9Pf6?dDZY8JdAcR`QM5>MT<aOnO7<DiRiB;\k?RRIHVCkC<FWi=5fXF\he2n@Q>2TEkZIo6kBK3\C@]3\oE]=7UY8knVi7O5=^_a6d;G^?DaLI=YY]ARAc7NRDMhAYZlK90=KQlem6G@;;lecBDFecfKNA=H>mJl3I59=NFgn`nf[B1:05f5E[`fiTPQ4EDe1H=4ZRWkf3TWlOP>Ela5hZDn]cQJC=UBXIIJdWiR@KZe]DHRbmfI;]VYoi>o?3K1h=6 - - + + + + + - "%ModuleDescription" + ResStr("NI_STEPTYPES", "ACTION_DESCRIPTION_NAME") + (("%ModuleDescription" == "") ? "" : ", %ModuleDescription") - ResStr("NI_STEPTYPES", "EDIT_DEF_SUBSTEP_NAME") + ResStr("NI_STEPTYPES", "ACTION_DEF_STEP_NAME") - - - - - - - - false - - + - true + false - true + false "" - ResStr("NI_STEPTYPES", "EDIT_SUBSTEP_MENU_ITEM_NAME") + ResStr("NI_STEPTYPES", "ACTION_MENU_ITEM_NAME") "" @@ -1712,16 +1706,10 @@ false - EditSubsteps + Action - - - - - DefaultLabVIEWNXG|DefaultLabVIEW|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template - @@ -1785,7 +1773,7 @@ - + @@ -1793,7 +1781,7 @@ - + @@ -1849,21 +1837,21 @@ 2 - 4 + 0 true - + Next - + Next - + - + @@ -2067,7 +2055,7 @@ - + 0 @@ -2086,26 +2074,32 @@ - + - - false - - + + DefaultLabVIEW|DefaultLabVIEWNXG|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template + + - - + + + + + false - - + + false - + + + Action + - + - - + + @@ -2118,62 +2112,26 @@ 1 - + - - + + _notNamed - 0 + 7 - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ typename='Expression' xsi:type='Expression' name='' classname='ExprValue' structureflags='131072'> - 1024 - - - - - - 1024 - - - 0 - - + - - + + - - - 0 - + - + @@ -2186,7 +2144,7 @@ - + @@ -2201,80 +2159,70 @@ - - - - - + - - + + - + - + + true + + + 3 + + - - + + - - + + + + + + true + + + + + + 1 + + + 0 + + + + + + + + + + + - <_NAME_IN_ATTRIBUTE_ typename='FCParameter' xsi:type='FCParameter' name='' classname='FCParameter' structureflags='131072'> + <_NAME_IN_ATTRIBUTE_ typename='NI_PythonParameter' xsi:type='NI_PythonParameter' name='' classname='CPythonParameter' structureflags='131072'> _notNamed - 0 + 7 - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - + - - + + - - - 0 - + - + @@ -2287,7 +2235,7 @@ - + @@ -2302,66 +2250,27 @@ - - - - + Return Value - 3 + 7 - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - + - - + + - - - 0 - + - + @@ -2374,7 +2283,7 @@ - + @@ -2389,2962 +2298,1974 @@ - - - - + - + + + 5 + - - - - - - - - - - - - - - - 0 - + - + - - + + - - - - + + "%ModuleDescription" + + + ResStr("NI_STEPTYPES", "EDIT_DEF_SUBSTEP_NAME") + + + + + + + + + false + + + + + true + + + true + + + "" + + + ResStr("NI_STEPTYPES", "EDIT_SUBSTEP_MENU_ITEM_NAME") + + + "" + + + false + + + false + + + EditSubsteps + + + + + + + + DefaultLabVIEWNXG|DefaultLabVIEW|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template + + + + + <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> - + + + + + + + + + + + 8192 + + + 2 + + - - - - + + 3 + + + true + + - - + + + + + - - - - CommonSubsteps.dll - - - EditStatementStep - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='FCParameter' structureflags='0'/> - - - - - - Return Value - - - 3 - - - 4 - - - 2 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - context - - - 4 - - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - ThisContext - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - reserved - - - 0 - - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - 0 - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - changed - - - 0 - - - 4 - - - 2 - - - - - - 1 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - RunState.InitialSelection.SelectedFile.ChangeCount - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - true - - - true - - - true - - - true - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - ResStr("NI_SUBSTEPS", "STATEMENT_EDIT_STEP_MENU_NAME") - - - true - - - true - - - - - - - - LocalizeExpression(Step.TS.PostExpr) - - - ResStr("NI_SUBSTEPS", "STATEMENT_DEF_STEP_NAME") - - - - - false - - - false - - - "" - - - ResStr("NI_SUBSTEPS", "STATEMENT_MENU_ITEM_NAME") - - - "" - - - false - - - false - - - NI_Miscellaneous - - - - - - - <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - ResStr("NI_SUBSTEPS", "STATEMENT_EXPRESSION") - - - LocalizeExpression(Step.PostExpression) - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - StatementStep.ico - - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - false - - - true - - - true - - - true - - - 0 - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - NIStepTypeControls.dll|NationalInstruments.TestStand.StepTypeControls.StatementTabInfo - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - false - - - false - - - - - - - - - - - - ResStr("NI_STEPTYPES", "ACTION_DESCRIPTION_NAME") + (("%ModuleDescription" == "") ? "" : ", %ModuleDescription") - - - ResStr("NI_STEPTYPES", "ACTION_DEF_STEP_NAME") - - - - - false - - - false - - - "" - - - ResStr("NI_STEPTYPES", "ACTION_MENU_ITEM_NAME") - - - "" - - - false - - - false - - - Action - - - - - - - <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - true - - - true - - - true - - - true - - - 0 - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - DefaultLabVIEW|DefaultLabVIEWNXG|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template - - - - - - - - - false - - - false - - - Action - - - - - - - - - - - - 8192 - %#x - - - 1 - - - - - - - - - _notNamed - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - true - - - 3 - - - - - - - - - - - - true - - - - - - 1 - - - 0 - - - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ typename='NI_PythonParameter' xsi:type='NI_PythonParameter' name='' classname='CPythonParameter' structureflags='131072'> - - - _notNamed - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - Return Value - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - 5 - - - - - - - - - - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> - - - - - -
- - - - - - - - ID#:1m8fotxw7RGuNrjdh1OqZD - - - Measurement\Measurement.ico - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 4 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - true - - - true - - - true - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - - - ni.examples.NIDmmMeasurement_Python - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='Obj'> - - - - - - - - - - - - false - - - 0 - - - - - - 0 - - - - - - - - - - - - pin_name - - - "Pin1" - - - In - - - false - - - 0 - - - TypeString - - - 1 - - - Pin - - - - - - - - - measurement_type - - - "DC Volts" - - - In - - - false - - - 0 - - - TypeString - - - 2 - - - None - - - - - - - - - range - - - 10 - - - In - - - false - - - 0 - - - TypeDouble - - - 3 - - - None - - - - - - - - - resolution_digits - - - 5.5 - - - In - - - false - - - 0 - - - TypeDouble - - - 4 - - - None - - - - - - - - - measured_value - - - - - - Out - - - true - - - 0 - - - TypeDouble - - - 1 - - - None - - - - - - - - - signal_out_of_range - - - - - - Out - - - true - - - 0 - - - TypeBool - - - 2 - - - None - - - - - - - - - absolute_resolution - - - - - - Out - - - true - - - 0 - - - TypeDouble - - - 3 - - - None - - - - - - - - - - - - -
- - - - - - - - true - - - - - 0 - - - true - - - "Unnamed Entry Point" - - - True - - - - - - false - - - false - - - true - - - false - - - true - - - false - - - false - - - false - - - true - - - 2953567917 - - - - - - - - - - - - 2 - -
-
-
- - - Test UUTs and Single Pass call this callback in their setup step group. It is empty in the model file. Override this in the client file to perform an action before any code in the model executes. - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> - - - - - -
- - - - - - - - ID#:CHEZyO1w7RGuNrjdh1OqZD - - - StatementStep.ico - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - FindFile(FileGlobals.MeasurementLink.PinMapFileName,True,FileGlobals.MeasurementLink.PinMapPath) - - - - - - false - - - true - - - true - - - true - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + PreloadWhenExecuted + + + UnloadWithFile + + + Normal + + + None + + + 1 + + + true + + + false + + + false + + + + + + 0 + + + false + + + + + + 1 + + + + + + + + + 1 + + + 2 + + + 4 + + + true + + + Next + + + Next + + + + + + + + + + + + Next + + + Next + + + + + + + + + NoLooping + + + + + + + + + RunState.LoopIndex += 1 + + + RunState.LoopIndex = 0 + + + 0 + + + + + + + + + + + + true + + + true + + + true + + + true + + + 0 + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + false + + + + + + + + + + + + + + false + + + + + + false + + + false + + + + + + + + + + + + 8192 + %#x + + + 1 + + + + + + + + + _notNamed + + + 0 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ typename='Expression' xsi:type='Expression' name='' classname='ExprValue' structureflags='131072'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ typename='FCParameter' xsi:type='FCParameter' name='' classname='FCParameter' structureflags='131072'> + + + _notNamed + + + 0 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + Return Value + + + 3 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + CommonSubsteps.dll + + + EditStatementStep + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='FCParameter' structureflags='0'/> + + + + + + Return Value + + + 3 + + + 4 + + + 2 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + context + + + 4 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + ThisContext + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + reserved + + + 0 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + 0 + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + changed + + + 0 + + + 4 + + + 2 + + + + + + 1 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + RunState.InitialSelection.SelectedFile.ChangeCount + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + PreloadWhenExecuted + + + UnloadWithFile + + + Normal + + + None + + + 1 + + + true + + + false + + + false + + + + + + 0 + + + false + + + + + + 1 + + + + + + + + + 1 + + + 2 + + + 0 + + + true + + + Next + + + Next + + + + + + + + + + + + Next + + + Next + + + + + + + + + NoLooping + + + + + + + + + RunState.LoopIndex += 1 + + + RunState.LoopIndex = 0 + + + 0 + + + + + + + + + + + + true + + + true + + + true + + + true + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - 0 - - + - - - false - - - - - - - - - - - - - - - - - - - - - - ID#:fhWpfuRw7RGuNrjdh1OqZD - - - - - - - - - - false - - - 2 - - - 3.9 - - - .venv - - - - - - true - - - teststand_fixture.py - - - 1 - - - 0 - - - - - - - - - update_pin_map - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CPythonParameter' structureflags='0'/> - - - - - - Return Value - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - pin_map_id - - - 7 - - - FileGlobals.MeasurementLink.PinMapPath - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - 5 - + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + - + + + + + + true + - + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + + 0 + + + + + + false + + + + + + + + + + + + + + ResStr("NI_SUBSTEPS", "STATEMENT_EDIT_STEP_MENU_NAME") + + + true + + + true + + + + + + + + LocalizeExpression(Step.TS.PostExpr) + + + ResStr("NI_SUBSTEPS", "STATEMENT_DEF_STEP_NAME") + + + + + false + + + false + + + "" + + + ResStr("NI_SUBSTEPS", "STATEMENT_MENU_ITEM_NAME") + + + "" + + + false + + + false + + + NI_Miscellaneous + + + + + + + <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + ResStr("NI_SUBSTEPS", "STATEMENT_EXPRESSION") + + + LocalizeExpression(Step.PostExpression) + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + StatementStep.ico + + + + + + + PreloadWhenExecuted + + + UnloadWithFile + + + Normal + + + None + + + 1 + + + true + + + false + + + false + + + + + + 0 + + + false + + + + + + 1 + + + + + + + + + 1 + + + 2 + + + 0 + + + true + + + Next + + + Next + + + + + + + + + + + + Next + + + Next + + + + + + + + + NoLooping + + + + + + + + + RunState.LoopIndex += 1 + + + RunState.LoopIndex = 0 + + + 0 + + + + + + + + + + + + false + + + true + + + true + + + true + + + 0 + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + NIStepTypeControls.dll|NationalInstruments.TestStand.StepTypeControls.StatementTabInfo + + + + + + + + + + 0 + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + false + + + false + + + + + + + + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> + + + + + +
+ + + + + + + + ID#:1m8fotxw7RGuNrjdh1OqZD + + + Measurement\Measurement.ico + @@ -5400,7 +4321,7 @@ 2 - 0 + 4 true @@ -5455,187 +4376,439 @@ - - + + + + + + true + + + true + + + true + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + + 0 + + + + + + false + + + + + + + - - - true - - - true - - - true - - - true - - - 0 - - - + + + + + + + + ni.examples.NIDmmMeasurement_Python + + + - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + <_NAME_IN_ATTRIBUTE_ name='' classname='Obj'> + + + + + + + + + + + + false + + + 0 + + + + + + 0 + + + + + + + + + + + + pin_name + + + "Pin1" + + + In + + + false + + + 0 + + + TypeString + + + 1 + + + Pin + + + + + + + + + measurement_type + + + "DC Volts" + + + In + + + false + + + 0 + + + TypeString + + + 2 + + + None + + + + + + + + + range + + + 10 + + + In + + + false + + + 0 + + + TypeDouble + + + 3 + + + None + + + + + + + + + resolution_digits + + + 5.5 + + + In + + + false + + + 0 + + + TypeDouble + + + 4 + + + None + + + + + + + + + measured_value + + + + + + Out + + + true + + + 0 + + + TypeDouble + + + 1 + + + None + + + + + + - - + + signal_out_of_range - - - - + - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - + + + Out + + true - + + + 0 + + + TypeBool + + + 2 + + + None + - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + - - + + absolute_resolution - - - - + - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - + + + Out + + true - + + + 0 + + + TypeDouble + + + 3 + + + None + - - + + - - - - - - - - - 0 - - - - - - false - - - - - - - - - - + - + + +
+ + - + - ID#:c5USoqlx7RGuNrjdh1OqZD + ID#:fhWpfuRw7RGuNrjdh1OqZD @@ -5678,10 +4851,10 @@ - create_nidmm_sessions + update_pin_map - + <_NAME_IN_ATTRIBUTE_ name='' classname='CPythonParameter' structureflags='0'/> @@ -5689,13 +4862,61 @@ - Return Value + Return Value + + + 7 + + + + + + + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + pin_map_path 7 - + FileGlobals.MeasurementLink.PinMapPath @@ -5711,7 +4932,7 @@ 8192 - 1 + 2 @@ -5737,13 +4958,13 @@ - pin_map_id + sequence_context 7 - FileGlobals.MeasurementLink.PinMapPath + ThisContext @@ -5759,7 +4980,7 @@ 8192 - 1 + 2 @@ -6075,16 +5296,166 @@ - + - ID#:7xzPK+Rw7RGuNrjdh1OqZD + ID#:c5USoqlx7RGuNrjdh1OqZD - StatementStep.ico + + + + + + + false + + + 2 + + + 3.9 + + + .venv + + + + + + true + + + teststand_fixture.py + + + 1 + + + 0 + + + + + + + + + create_nidmm_sessions + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CPythonParameter' structureflags='0'/> + + + + + + Return Value + + + 7 + + + + + + + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + sequence_context + + + 7 + + + ThisContext + + + + + + + + + + + + + 8192 + + + 2 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + 5 + + + + + @@ -6194,13 +5565,13 @@ - RunState.Engine.TemporaryGlobals.SetValString("NI.MeasurementLink.PinMapId", 0x1, FileGlobals.MeasurementLink.PinMapPath) + - false + true true @@ -6370,95 +5741,8 @@ -
- - - - - - false - - - - - 0 - - - true - - - "Unnamed Entry Point" - - - True - - - - - - false - - - false - - - true - - - false - - - true - - - false - - - false - - - true - - - 2953567917 - - - false - - - - - - - - - - - - 2 - -
-
-
- - - Test UUTs and Single Pass call this callback in their cleanup step group. It is empty in the model file. Override this in the client file to perform an action after all code in the model executes and just before the execution completes. - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> - - - - - -
@@ -7153,15 +6437,9 @@ -
- - - - - - false + true @@ -7201,15 +6479,15 @@ false + + false + true 2953567917 - - false - @@ -7234,11 +6512,8 @@ false - - NIDmmMeasurement.pinmap - - + NIDmmMeasurement.pinmap
diff --git a/examples/nidmm_measurement/README.md b/examples/nidmm_measurement/README.md index 2facb19d0..70a1ca759 100644 --- a/examples/nidmm_measurement/README.md +++ b/examples/nidmm_measurement/README.md @@ -9,6 +9,10 @@ This is a MeasurementLink example that performs a measurement using an NI DMM. - Includes InstrumentStudio and MeasurementLink UI Editor project files - Includes a TestStand sequence showing how to configure the pin map, register instrument sessions with the session management service, and run a measurement + - For the sake of simplicity, the TestStand sequence handles pin map and session + registration and unregistration in the `Setup` and `Cleanup` sections of the main + sequence. For **Test UUTs** and batch process model use cases, these steps should + be moved to the `ProcessSetup` and `ProcessCleanup` callbacks. - Uses the NI gRPC Device Server to allow sharing instrument sessions with other measurement services when running measurements from TestStand diff --git a/examples/nidmm_measurement/_helpers.py b/examples/nidmm_measurement/_helpers.py index eeec62a20..66ba0d3fc 100644 --- a/examples/nidmm_measurement/_helpers.py +++ b/examples/nidmm_measurement/_helpers.py @@ -2,7 +2,7 @@ import logging import pathlib -from typing import Dict, NamedTuple, TypeVar +from typing import Any, Dict, NamedTuple, TypeVar import grpc @@ -48,23 +48,25 @@ def __init__(self, *, grpc_channel: grpc.Channel): pin_map_service_pb2_grpc.PinMapServiceStub(grpc_channel) ) - def update_pin_map(self, pin_map_id: str) -> None: + def update_pin_map(self, pin_map_path: str) -> str: """Update registered pin map contents. Create and register a pin map if a pin map resource for the specified pin map id is not found. Args: - pin_map_id (str): The resource id of the pin map to register as a pin map resource. By - convention, the pin map id is the .pinmap file path. + pin_map_path: The file path of the pin map to register as a pin map resource. + Returns: + The resource id of the pin map that is registered to the pin map service. """ - pin_map_path = pathlib.Path(pin_map_id) + pin_map_path_obj = pathlib.Path(pin_map_path) + # By convention, the pin map id is the .pinmap file path. request = pin_map_service_pb2.UpdatePinMapFromXmlRequest( - pin_map_id=pin_map_id, pin_map_xml=pin_map_path.read_text(encoding="utf-8") + pin_map_id=pin_map_path, pin_map_xml=pin_map_path_obj.read_text(encoding="utf-8") ) response: pin_map_service_pb2.PinMap = self._client.UpdatePinMapFromXml(request) - assert response.pin_map_id == pin_map_id + return response.pin_map_id class GrpcChannelPoolHelper(GrpcChannelPool): @@ -108,3 +110,63 @@ def get_grpc_device_channel(self, provided_interface: str) -> grpc.Channel: service_class="ni.measurementlink.v1.grpcdeviceserver", ).insecure_address ) + + +class TestStandSupport(object): + """Class that communicates with TestStand.""" + + def __init__(self, sequence_context: Any) -> None: + """Initialize the TestStandSupport object. + + Args: + sequence_context: + The SequenceContext COM object from the TestStand sequence execution. + (Dynamically typed.) + """ + self._sequence_context = sequence_context + + def get_active_pin_map_id(self) -> str: + """Get the active pin map id from the NI.MeasurementLink.PinMapId temporary global variable. + + Returns: + The resource id of the pin map that is registered to the pin map service. + """ + return self._sequence_context.Engine.TemporaryGlobals.GetValString( + "NI.MeasurementLink.PinMapId", 0x0 + ) + + def set_active_pin_map_id(self, pin_map_id: str) -> None: + """Set the NI.MeasurementLink.PinMapId temporary global variable to the specified id. + + Args: + pin_map_id: + The resource id of the pin map that is registered to the pin map service. + """ + self._sequence_context.Engine.TemporaryGlobals.SetValString( + "NI.MeasurementLink.PinMapId", 0x1, pin_map_id + ) + + def resolve_file_path(self, file_path: str) -> str: + """Resolve the absolute path to a file using the TestStand search directories. + + Args: + file_path: + An absolute or relative path to the file. If this is a relative path, this function + searches the TestStand search directories for it. + + Returns: + The absolute path to the file. + """ + if pathlib.Path(file_path).is_absolute(): + return file_path + (_, absolute_path, _, _, user_canceled) = self._sequence_context.Engine.FindFileEx( + fileToFind=file_path, + absolutePath=None, + srchDirType=None, + searchDirectoryIndex=None, + userCancelled=None, # Must match spelling used by TestStand + searchContext=self._sequence_context.SequenceFile, + ) + if user_canceled: + raise RuntimeError("File lookup canceled by user.") + return absolute_path diff --git a/examples/nidmm_measurement/teststand_fixture.py b/examples/nidmm_measurement/teststand_fixture.py index 4612c3a82..d04a67104 100644 --- a/examples/nidmm_measurement/teststand_fixture.py +++ b/examples/nidmm_measurement/teststand_fixture.py @@ -1,33 +1,49 @@ """Functions to set up and tear down sessions of NI-DMM devices in NI TestStand.""" +from typing import Any import nidmm -from _helpers import GrpcChannelPoolHelper, PinMapClient +from _helpers import GrpcChannelPoolHelper, PinMapClient, TestStandSupport import ni_measurementlink_service as nims -def update_pin_map(pin_map_id: str) -> None: +def update_pin_map(pin_map_path: str, sequence_context: Any) -> None: """Update registered pin map contents. Create and register a pin map if a pin map resource for the specified pin map id is not found. Args: - pin_map_id (str): The resource id of the pin map to register as a pin map resource. By - convention, the pin_map_id is the .pinmap file path. - + pin_map_path: + An absolute or relative path to the pin map file. + sequence_context: + The SequenceContext COM object from the TestStand sequence execution. + (Dynamically typed.) """ + teststand_support = TestStandSupport(sequence_context) + pin_map_abs_path = teststand_support.resolve_file_path(pin_map_path) + with GrpcChannelPoolHelper() as grpc_channel_pool: pin_map_client = PinMapClient(grpc_channel=grpc_channel_pool.pin_map_channel) - pin_map_client.update_pin_map(pin_map_id) + pin_map_id = pin_map_client.update_pin_map(pin_map_abs_path) + + teststand_support.set_active_pin_map_id(pin_map_id) -def create_nidmm_sessions(pin_map_id: str) -> None: - """Create and register all NI-DMM sessions.""" +def create_nidmm_sessions(sequence_context: Any) -> None: + """Create and register all NI-DMM sessions. + + Args: + sequence_context: + The SequenceContext COM object from the TestStand sequence execution. + (Dynamically typed.) + """ with GrpcChannelPoolHelper() as grpc_channel_pool: session_management_client = nims.session_management.Client( grpc_channel=grpc_channel_pool.session_management_channel ) + teststand_support = TestStandSupport(sequence_context) + pin_map_id = teststand_support.get_active_pin_map_id() pin_map_context = nims.session_management.PinMapContext(pin_map_id=pin_map_id, sites=None) with session_management_client.reserve_sessions( context=pin_map_context, diff --git a/examples/nifgen_standard_function/NIFgenStandardFunction.seq b/examples/nifgen_standard_function/NIFgenStandardFunction.seq index 80f5ac20c..87cefd43f 100644 --- a/examples/nifgen_standard_function/NIFgenStandardFunction.seq +++ b/examples/nifgen_standard_function/NIFgenStandardFunction.seq @@ -1670,37 +1670,31 @@ E@=3DJC4100hYLECF=_K@0@mKCYo_1KN:<Ta239hF9[gHbEVFDfRINZfQ01CkaUMk5=k`[c;[42MMF9aiNliecVfMFCLXi_`f2H7c\G\X50M=Z4S4aT2QI>A^D:d1\PCI`L11RlV5bM5AIZTc9STI5Mkg<bHlle[O=CL_KEgb?8RiVHS7QmPY@S4X^7I58A@kPaKcPWCOC1;DBf61lViY=]`28BC\B_mEf20ZJS@W@GDDRffLe\Ci;aKbN>i5P_4ScVVBTjIIfn0j8l<e6IcMbZHgCI;n8CRlR7<YcK0@cY[8aDHj=GGkNK;C?KC?b=]mMejoc1gGol1>hL6lf5fZ92?Ia@l1;QL024f^NSm2MhNlcFg_YR[l5kclo:einXehbR>98[4?GC:CX[3hm\UMob2aIMT0eJmgI@\;njRK9]fIl_8f=d]n4bQcRXDEl<o=@Yiik\3Md@?k1=0Joj>?Je`<RUd<JYmeOnOgB3G@Ub\FoGFgIQmQli8nGH=QjKD9i`2nf41XEKj;oDB8iZU`@XP^KWoAKEbOf:ViVAl=_I37KJSec7Ea\nJ5]NZj\OnJF;ASQemRIDbbdglb\U>H[O^bDHO?XMLaOoeVCf=a^CC`d8^TX2B E@=3@J\4110h]L]Mg[cK3fBoj\Kifo1C[KY_3VgFm3_6n>DfdTDgjaSF_LdVUJaY::FII@T:GB9LaYOo80OP^053LBBVb1G?:50k4;P1c\^`03ffoj9S72=AOm;a2oh?Na\lC7TUOXcNfaSdfIbVCC_ao20aN9bmo_<R_S=>KV;lhbmh89SY[:2UflXcmGIlnngoE]\\ad_6_gW8X9GAXJSPJYin>C71=c74a79JN<`GPK]_\>2`h9IOC]VA5BU4AMW1Qc`j?lJ\aR4__>R4SI_`[_mmnM33ONg`3P[g4N5aSF;ce]^eVffg6>cIRLhI]7CjE^W[jW`kZkGEWHk1=RR;gTe:O[H;k[bAd7UCaTVXgjlho3Af>?oIJdjMo>3=o;aTo\ZZnG9_cgcO7mjV^k>\:gkoOkSn1jkfm@MgLnb<Amg;\Nmj8klk3llhhnW>nn^GCW_fW_>ji]:Va>TNnNQdK5LolNX?M@\6jN2ddlIHh=MT1E^[o4Q7I54R=RlVg[S\KmOe9GM:Qeh9OnUhWTeC^ZM7SAGP1V=LZ4[i\cOmoH[RS6YBL2L\PAg][JQ<Eo?8;D9Mk3M]>N^6>HgJ]KP^a>cfBkkmZ33RdU`]jB_NIOShWL4oDlbn3lNOCL??R7GCmKaTDhekoi_En`9oJKe<e1`lBjmjXJ<^4_^_^>?7O?nEE_WTY:VYEc]3^eJm^cdC7;LcK_]Ei>b<^`9HR6YcO>l@Amg>PLXQbSb^=?FXRUZd<[n<SGjgCQ`mhTl;7NUbgaRQBkXNY4iX5iAJX6C`gdG[d3d>`Uj3DPMF7h71WBBLLR>Tk9dZlFCYSi__fNBBT`C;A>jeP2CdONN52i5^eBEIEI=8EMHBBe^G^1ohD6>LRiJgM\IPYE8Wn`T9W@jf8iEfN:@L3<Ha_l0CCE<HOJjXBRll_NLReo_^K7CQWihL<B1::YXdSaG<XFnCP94dQXb;^6V07F>TkPem>4QI;?9JkF`g80:`G?AULFSY^XW;4XL^_D=GZV9VVODS^[=]dL]b=N;O[ib6]2aLATM7\AcX=JH<\1j8_?I9_VUO]5;PKjdi^o>Kn=FbmhAmF3EXh?dAPF?cWPU;NHFT9YBblF15fj0n]RK9>d;@lD9HXLGTZOAa;gEd6:MElAPOkOoMom`hnaYko^ne_;PeC\`kMYOoCalP3DR_^NADNSV6R1Nk4f?=Lo;VQ>7>fR@=2j8C:;D@3fk>^=YHE^PQ1fU>TFoNH>GnfRGNMNW`[okK`S56RJfM4Zmo^6E9ZYc>FNEO3PO=T9eK0:bgljYdR7WooKS9eTjd@bcImNVZ8UXa:AC_F_WCj]4\6ST<:ie_AbZFIL7UmlIne:BcTQ5T2U]O2goYWXRN5F8oeQT^`HXPD=2LV[h;ibbNNj1kU]lXlnX4ACO5aRA@TfHY77@P?L=_N@4^cJG;Wi2@3M5OQ:^@>2K9_9W:4Vn1LGaRN@WL9AFFVg1oYHdi`54XIa5G[\i>iPT4506XA7h2^c_T`3d[ARdFICaAS2RM:1KgT7B>MhXVaI<kA^@CX2aS^I:B>=W<U?l<DWU<Jd7^cKe2R]EdIBcBQZni_K1JPCEhV>VH]FBZ<5413k[U]MAFA`Ohma2g2NoU0@E;FI93Yi;RjnlScC;`glEaH^X@K[NY9Y1EUZc6V6\3?FKC0APU0^[aP:_GMI=eeWnJ<6e2]@;AXaAE<S[lhAb`XFjPP@dTXNYS=<568je\`W3?@gn9HDaM84^>SDl0<Ba6YNKCeYZ\CUU?WGnR4=m^aN[KTlFG\?VZ[MC:3HfflAagl\jZUG@ScZW:2K\FU9TQa<h;?iYb<RJI66IEg<WHgdkU:\KFIZG\BDU=9W>:\:W7nM3NIjXT;2YV[@dDaY3bhOQY^af<UVo:ZV^^@0d_M5ObRQ2PIHZ9bbbGm;4Z\KEfEYI=M];D@9j1kZ@2@FIkf9:\CYe5KnKANXH7R@eMc2M;Pl]PZG]@4h2Q7OY:=QFh@\Y6]E6X1bL6mjS76a`JS=H=XQReG6Djb7[c<h@S5UCX4`ABLQ4:ZZ7=JF9JejC5\[T:meE5_[:`Qm=DfI0EDQLRH6o]LAPRXlbTgXSbnW7ZTN?N]lH02JKm;Z4hn<A[89:C8lM5hC]Ab^\\WNK7JGS]XainLm:PWFF3EmC15\]YC\D;I6a<NiIhd2GMIG`A9\[]T00fP:UXIXSHk2jI>XFG>I521bbKDA`Xb]h>oAl>IolbRB7j=i9_H89<FR=U572U\LjNhnkeeemHDJJ\GHX\;J51M<?QV2DneREAR3in6<M75M_Re=Ci3gEOQ2VO`4P8_hfhSO\dZ7m]n\hlV6gSlSC@PoZSe8WUaY3d0_;Z=9H:I6Gf2PVG`mf8CC87@DBlT62^h6QFFhZF64BJ46@Dh<T1=C]0_9J?073S@61ADIUT31<mVE<W?R@RBUJP`@;50X2Bh618KM^bf033T033D?NM@P`?0\dBA3A8AXF0]@KnP[5<EDfUICcBF^EZT=:cWKBKYTDKXD=<A:mkNB7LFDHC9b7nG57NFZ1]Ubo]8]0MN]YWJJ>eS42I?===3_n_?J=384=Go8e^0mdmBiTjRaf;F@8M4_gCZSGQ3cUUnF6J_R9WJV0PNaTJDk<RiWS6=>Rf9EmM:WgL4LHg5oH[aMbbOlnI6b`9KZ^Z]oAdeH\@YgaV8ChHTKjEVA]a^YN<;71CAbR\<jAYI\\Y<R\`1AOol`j1>53?d8MV_@kAN_W4nIdKc0gRYHEo`]U?HWN?0<?l2h:ZC\>^D]Ug4FNZl123fNoZ7fLRB[_HR6O>BaoomWl_8YS0Q\8;RB]@j=GIIe]J<AT[;1I<5ZJ\?Va5g?>7hXgcbU4V=lT>nV[28JKeQJ5QX4^WD3MfTBIBPKU57e>[FRd>_EeSHJhDa4hM9S9TUlOR=KWn]eAJ]W5VROh9ak`n5<LV6L9d<0`?fk]J8FW52OlL2i<L1kO=mGBf9e:\`^[_J:F>7o0_9mGc_`=KP@SW_^NU525JcQcEGhR8Da3gf4mJ?R6a2lLPKjL:TlfL8iHOKf:Mjeb\>Xb3>0kM@iNkaifYHDFNIKP\e^;bhg@V<g0Za7F]R=JKPMgdg>nYaMSb8MAV0o05XKjM5<5^V=albT\<868hhl^jHPRa0KcT4i[31chfOeGW>;``>>I;B:YafYW>jW_7D1>9_X14U9VXJ5E_PA2ZPb>n6eBLcN]SU4eSd<IDGD4D5WHMlFCU0DeARScb:h\?EC1>IBWead>7F>FeBea\oCS]jf@kE47ZHcB?TlP6_K[QC2@_N>ilNn0VdgZE>Z98hXCHa4bNUM16M74Q;DhldmcZ>V?_TG1J?NI:F8<aomhdPX5^AEe6BRYle4clf_gSb6D9LaD2h]ij8SAH@[`J@cb2G7ee@iZWl2A>`Ga95FDhJo7Xo>Zd3[jL<DQ4OILX9a;0T\SUDWY:Bh>WGNb:dHQ[S`[8:1L:F@>H[49RQ6_3QV<UT0oIITF^H_\X=:<42`N``YjM75HWEd]5O`<EX89FTP`^oN:QHgED5k:\CaYbA2GbD1;X5:N;?SoLhVhR`R_9lg3hU4n:I`2Gn:IjDHED]5i=2fcTklTK1H6k4HjK;HBM>;c]9;i[MFD?WaY1O]oS293kLd9S3N6He?:_QKEcBGLOc:jB6H@fR]h]HGB5;:<RE<`3K4Ibi29dR;nU<<TKBRnTdK[ZTT6oiOVVXKgaP6<lMTO_JC\0<RY5NkR352<FbcCB<_3?0XjQ`BJP;OJR::8eHFb3<;M\9FOC8T:MkD:Z;C=eb^0:AMSbSY_^Lc=SGbD5WDh@6j]PCDc@;\X1Nb\[`Z0W_Th5<HD4CafYghb`T95Ko571]SZJDHF2eE<7jViL_\8TQ@dFRo]`G[h3>862l:2F[UU6dVbFjU?NI>OHOk>JNcFNU[mXi]iJ[neWQ\mWa]i[e?IkO^Mf]LHTP[G3?43M8g^Wh``lW3kBT7ADM6b_IUCIPO=C8g5@?9R3<hilXNY7_<THNN<KMLm;eGM6_A6AUDB\c5Q;S2POniP9[mdEeIDnO7;T7Nia2nFN\L2XZIP?ZJKW\2cK0U5fb[dLn?[C>YAMXfVFic02OQA\6LHEk0oBd0f;`kR1hImAUl:@I;^:oFJUF?mDgPlLokm]OIgenn9;n5[Oh3g7@W7OWBCk9X1mYDPF9AQ4LOGeM_D_WR?I7QRlVEmN_0QlA9^lO[HjnfngGjkHokO\A35=_4hVU^jKm;\?Y9^B=RkTG1I<6nI`AQ_kJ;of[GmIi[g0]1\UG_FKUnX]ZcGmoI;NUdDFOolHn;NbMLkT`1GEo;j63N_8b_O`PQ[KRjb<NDHW4;\lT[Ila;nMd`56_c\C25fJLUS;9fn@6[[SMIBBMFK\8d;ZIRSI;fJ5_cojWSIfcY2kNd1jkS0f9A3BNfk8W1m4H0gRbfA3J6Q726nmNm4PQYcWZ___NEf_FmmmOm40IZ1mf4PmS?H8k>=J3g<\1K6j;CNTGZ8kY61mk30RLUO`T`_H`Hg<`\K67=HJ3g<\3K6iGRVO9``_1H`L`\K6`f=371ikY61mf30S<W]K86enT`_H`Hg<=fbaLQO`c@<hK;Rmmf>KT=]4\mm;NkW]^mcFgV[_]l=8aHk_j]MgIEYV5XJkiW]l^^CKnYn2OgNJ0g<fR\mWo;?JNcFN^cfL_eWZ[Eff[LeWebL[d?YfWFm3O0neW6m3NP3nGQ@G_M?lS61c3KG?`NUXHYTJ?j1SoC7V>RGj_]d[blRO_M^Qg>f_[0oQJWgg`CkhXXJ\hG;1Ujg`4MNjIg_6l3GG;oohYSNBallm3eZnFmebBeaLSDIS17WJfDBN9nUo^n2oC_;Q\;4O3WWk7mAZI17;2]ChHfZeJ;I\fY;^dB\J;NW@cEDj]HE]B8GSiKJgN9M6f4UIKhV02kFjYnXXBH9lF?3gDC<EC`d=4l<aIYa?]YS<9Zl8]AkXcPg:6L69WWX^8R2;YXfC<Xg6AQg@oOoChH=41ln]AG?J3U0Wn>8[8cdWGUnL2Z>Ll4HaNcI<f]SiWCVXSMeP?^a7:Tf<`L3cKdmDl7?Uj>FnPG5NSQBkHE`Yj>ZNQ^;UbDk0kCT]3]YV<50o<2<aTY7THb5hg;3^hl@GYRZE@mbL?5gdHJNW5`6W8[eho^38?;R459L4WN1Jg[egNX[3[_>lAAY>L9Z_H5YN]9:KZMj\cPGZco]??=ig[hH7YShgPS8:44leI:@9R?fLHKlH6UZ]nlAXHFAFUn7AdT=;FK^oZgocoK[2W_=Aj]T;2mBd8`7h`B0K>IP<04@S6]dA9N`8Q8YBk19T@8RFF4T29OB1V7TX7QM01@hI@3`QJ=4@H\nBkS2d5P1BDgN8?4B230Y8lb8ONC@?IPH0A@OMPD?HZ@1`>mj`5N5c60PN06hNI1c8`@k6b0M9IN3`QM68;M1l5Bl>6cX>XD78V@S2j5Ad;C<0cA7OX0nM8<iaN3K0@0Kil664BNSOe:0@R=6NA66f9@PX0d0dHb:LL\6@1aSJl[5h6I38X<0`;0<Al748MXb84H=@Y<lI\5@GNMD;RJd?DeY0Ac1J230g>d1e00LP8d;>V@59CQA1BG<@2[2A45hE8CX:H0A=a\KRAC<Q0YPRb5D<IR63P1QX<JXCS9a3FQ>daQVRjO4I;1da1URZ;LZ444@R2PX2XAXA9Te@FngkoKI_ea>NZN^m\`1H5CMhX9Bn1?ZYS0WAbR2RD8F3W@XajF1=AXS6<TS4i09PN?`gPUG9G3J26`2GbAW]jGY5<AGn^iZAjM_;W5<g^kKMC]B[X13GZm3mmNffKMhb:cJ]DAT>a?_4H8jZX2PIja6[DFTFC:]l]=1AN=PD`VJ>HX2k?Pj7:bQ`W[XWe0\38<V=I\:]2HOl74S6e0a;ZmCFf:3FnRcED67[hUWZPU7ZZKLUVD\PFX_FVE23Q7WUaWV=U><ZRLQB8LDd0hS94OC1D?6J9N:\\`US2k:iaJY8jY]eTVWO0KLeICMh3dn\dH86aYA7eY]eZZ3=d6WJLE7IPEWIe=_c4FYLEhdA\b5XoJQE;n[HFdKI7C3oK`RFK6l`B8RhhCXhP8XnP3841548PB6P6B[DKHS41JU<Qne:U\ARQ=B[VDHSOT307XA07Qhn2d8RBoajKU>9P@S2lYle3RId0IIf072nP8>;NUah=0ilGD:G5\RN_\=;5jTD@iTfQNGIfmQJ2oJl[SBFC]DLncWBE4mFZe6d_Ob>3YC4APEA@D_mOFNI8ALek79bT>:a8]EjYToY<]8C`FV4Z``X`1aB@L<?V9ARCQ4c:K71jA4o8X@_N2@;?hf9D0M0]D;:A]?]T5@Y1`>Vi=L5H`I25YCYJTF@F?fd@VbI9Pf6?dDZY8JdAcR`QM5>MT<aOnO7<DiRiB;\k?RRIHVCkC<FWi=5fXF\he2n@Q>2TEkZIo6kBK3\C@]3\oE]=7UY8knVi7O5=^_a6d;G^?DaLI=YY]ARAc7NRDMhAYZlK90=KQlem6G@;;lecBDFecfKNA=H>mJl3I59=NFgn`nf[B1:05f5E[`fiTPQ4EDe1H=4ZRWkf3TWlOP>Ela5hZDn]cQJC=UBXIIJdWiR@KZe]DHRbmfI;]VYoi>o?3K1h=6 - - + + + + + - "%ModuleDescription" + ResStr("NI_STEPTYPES", "ACTION_DESCRIPTION_NAME") + (("%ModuleDescription" == "") ? "" : ", %ModuleDescription") - ResStr("NI_STEPTYPES", "EDIT_DEF_SUBSTEP_NAME") + ResStr("NI_STEPTYPES", "ACTION_DEF_STEP_NAME") - - - - - - - - false - - + - true + false - true + false "" - ResStr("NI_STEPTYPES", "EDIT_SUBSTEP_MENU_ITEM_NAME") + ResStr("NI_STEPTYPES", "ACTION_MENU_ITEM_NAME") "" @@ -1712,16 +1706,10 @@ false - EditSubsteps + Action - - - - - DefaultLabVIEWNXG|DefaultLabVIEW|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template - @@ -1785,7 +1773,7 @@ - + @@ -1793,7 +1781,7 @@ - + @@ -1849,21 +1837,21 @@ 2 - 4 + 0 true - + Next - + Next - + - + @@ -2067,7 +2055,7 @@ - + 0 @@ -2086,26 +2074,32 @@ - + - - false - - + + DefaultLabVIEW|DefaultLabVIEWNXG|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template + + - - + + + + + false - - + + false - + + + Action + - + - - + + @@ -2118,62 +2112,26 @@ 1 - + - - + + _notNamed - 0 + 7 - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ typename='Expression' xsi:type='Expression' name='' classname='ExprValue' structureflags='131072'> - 1024 - - - - - - 1024 - - - 0 - - + - - + + - - - 0 - + - + @@ -2186,7 +2144,7 @@ - + @@ -2201,80 +2159,70 @@ - - - - - + - - + + - + - + + true + + + 3 + + - - + + - - + + + + + + true + + + + + + 1 + + + 0 + + + + + + + + + + + - <_NAME_IN_ATTRIBUTE_ typename='FCParameter' xsi:type='FCParameter' name='' classname='FCParameter' structureflags='131072'> + <_NAME_IN_ATTRIBUTE_ typename='NI_PythonParameter' xsi:type='NI_PythonParameter' name='' classname='CPythonParameter' structureflags='131072'> _notNamed - 0 + 7 - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - + - - + + - - - 0 - + - + @@ -2287,7 +2235,7 @@ - + @@ -2302,66 +2250,27 @@ - - - - + Return Value - 3 + 7 - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - + - - + + - - - 0 - + - + @@ -2374,7 +2283,7 @@ - + @@ -2389,2902 +2298,1974 @@ - - - - + - + + + 5 + - - - - - - - - - - - - - - - 0 - + - + - - + + - - - - + + "%ModuleDescription" + + + ResStr("NI_STEPTYPES", "EDIT_DEF_SUBSTEP_NAME") + + + + + + + + + false + + + + + true + + + true + + + "" + + + ResStr("NI_STEPTYPES", "EDIT_SUBSTEP_MENU_ITEM_NAME") + + + "" + + + false + + + false + + + EditSubsteps + + + + + + + + DefaultLabVIEWNXG|DefaultLabVIEW|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template + + + + + <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> - + + + + + + + + + + + 8192 + + + 2 + + - - - - + + 3 + + + true + + - - + + + + + - - - - CommonSubsteps.dll - - - EditStatementStep - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='FCParameter' structureflags='0'/> - - - - - - Return Value - - - 3 - - - 4 - - - 2 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - context - - - 4 - - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - ThisContext - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - reserved - - - 0 - - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - 0 - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - changed - - - 0 - - - 4 - - - 2 - - - - - - 1 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - RunState.InitialSelection.SelectedFile.ChangeCount - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - true - - - true - - - true - - - true - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - ResStr("NI_SUBSTEPS", "STATEMENT_EDIT_STEP_MENU_NAME") - - - true - - - true - - - - - - - - LocalizeExpression(Step.TS.PostExpr) - - - ResStr("NI_SUBSTEPS", "STATEMENT_DEF_STEP_NAME") - - - - - false - - - false - - - "" - - - ResStr("NI_SUBSTEPS", "STATEMENT_MENU_ITEM_NAME") - - - "" - - - false - - - false - - - NI_Miscellaneous - - - - - - - <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - ResStr("NI_SUBSTEPS", "STATEMENT_EXPRESSION") - - - LocalizeExpression(Step.PostExpression) - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - StatementStep.ico - - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - false - - - true - - - true - - - true - - - 0 - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - NIStepTypeControls.dll|NationalInstruments.TestStand.StepTypeControls.StatementTabInfo - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - false - - - false - - - - - - - - - - - - ResStr("NI_STEPTYPES", "ACTION_DESCRIPTION_NAME") + (("%ModuleDescription" == "") ? "" : ", %ModuleDescription") - - - ResStr("NI_STEPTYPES", "ACTION_DEF_STEP_NAME") - - - - - false - - - false - - - "" - - - ResStr("NI_STEPTYPES", "ACTION_MENU_ITEM_NAME") - - - "" - - - false - - - false - - - Action - - - - - - - <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - true - - - true - - - true - - - true - - - 0 - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - DefaultLabVIEW|DefaultLabVIEWNXG|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template - - - - - - - - - false - - - false - - - Action - - - - - - - - - - - - 8192 - %#x - - - 1 - - - - - - - - - _notNamed - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - true - - - 3 - - - - - - - - - - - - true - - - - - - 1 - - - 0 - - - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ typename='NI_PythonParameter' xsi:type='NI_PythonParameter' name='' classname='CPythonParameter' structureflags='131072'> - - - _notNamed - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - Return Value - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - 5 - - - - - - - - - - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> - - - - - -
- - - - - - - - ID#:1m8fotxw7RGuNrjdh1OqZD - - - Measurement\Measurement.ico - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 4 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - true - - - true - - - true - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - - - ni.examples.NIFgenStandardFunction_Python - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='Obj'> - - - - - - - - - - - - false - - - 0 - - - - - - 0 - - - - - - - - - - - - pin_name - - - "Pin1" - - - In - - - true - - - 0 - - - TypeString - - - 1 - - - Pin - - - - - - - - - waveform_type - - - "Sine" - - - In - - - true - - - 0 - - - TypeString - - - 2 - - - None - - - - - - - - - frequency - - - 1000000 - - - In - - - true - - - 0 - - - TypeDouble - - - 3 - - - None - - - - - - - - - amplitude - - - 2 - - - In - - - true - - - 0 - - - TypeDouble - - - 4 - - - None - - - - - - - - - duration - - - 10 - - - In - - - true - - - 0 - - - TypeDouble - - - 5 - - - None - - - - - - - - - - - - -
- - - - - - - - true - - - - - 0 - - - true - - - "Unnamed Entry Point" - - - True - - - - - - false - - - false - - - true - - - false - - - true - - - false - - - false - - - false - - - true - - - 2953567917 - - - - - - - - - - - - 2 - -
-
-
- - - Test UUTs and Single Pass call this callback in their setup step group. It is empty in the model file. Override this in the client file to perform an action before any code in the model executes. - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> - - - - - -
- - - - - - - - ID#:CHEZyO1w7RGuNrjdh1OqZD - - - StatementStep.ico - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - FindFile(FileGlobals.MeasurementLink.PinMapFileName,True,FileGlobals.MeasurementLink.PinMapPath) - - - - - - false - - - true - - - true - - - true - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + PreloadWhenExecuted + + + UnloadWithFile + + + Normal + + + None + + + 1 + + + true + + + false + + + false + + + + + + 0 + + + false + + + + + + 1 + + + + + + + + + 1 + + + 2 + + + 4 + + + true + + + Next + + + Next + + + + + + + + + + + + Next + + + Next + + + + + + + + + NoLooping + + + + + + + + + RunState.LoopIndex += 1 + + + RunState.LoopIndex = 0 + + + 0 + + + + + + + + + + + + true + + + true + + + true + + + true + + + 0 + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + false + + + + + + + + + + + + + + false + + + + + + false + + + false + + + + + + + + + + + + 8192 + %#x + + + 1 + + + + + + + + + _notNamed + + + 0 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ typename='Expression' xsi:type='Expression' name='' classname='ExprValue' structureflags='131072'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ typename='FCParameter' xsi:type='FCParameter' name='' classname='FCParameter' structureflags='131072'> + + + _notNamed + + + 0 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + Return Value + + + 3 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + CommonSubsteps.dll + + + EditStatementStep + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='FCParameter' structureflags='0'/> + + + + + + Return Value + + + 3 + + + 4 + + + 2 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + context + + + 4 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + ThisContext + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + reserved + + + 0 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + 0 + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + changed + + + 0 + + + 4 + + + 2 + + + + + + 1 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + RunState.InitialSelection.SelectedFile.ChangeCount + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + PreloadWhenExecuted + + + UnloadWithFile + + + Normal + + + None + + + 1 + + + true + + + false + + + false + + + + + + 0 + + + false + + + + + + 1 + + + + + + + + + 1 + + + 2 + + + 0 + + + true + + + Next + + + Next + + + + + + + + + + + + Next + + + Next + + + + + + + + + NoLooping + + + + + + + + + RunState.LoopIndex += 1 + + + RunState.LoopIndex = 0 + + + 0 + + + + + + + + + + + + true + + + true + + + true + + + true + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - 0 - - + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + - - - false - + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + - - - - - - - - - - - - - + + + + + + + + + + + + 0 + + + + + + false + + + + + + + + + + + + + + ResStr("NI_SUBSTEPS", "STATEMENT_EDIT_STEP_MENU_NAME") + + + true + + + true + + + + + + + + LocalizeExpression(Step.TS.PostExpr) + + + ResStr("NI_SUBSTEPS", "STATEMENT_DEF_STEP_NAME") + + + + + false + + + false + + + "" + + + ResStr("NI_SUBSTEPS", "STATEMENT_MENU_ITEM_NAME") + + + "" + + + false + + + false + + + NI_Miscellaneous + + + + + + + <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + ResStr("NI_SUBSTEPS", "STATEMENT_EXPRESSION") + + + LocalizeExpression(Step.PostExpression) + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + StatementStep.ico + + + + + + + PreloadWhenExecuted + + + UnloadWithFile + + + Normal + + + None + + + 1 + + + true + + + false + + + false + + + + + + 0 + + + false + + + + + + 1 + + + + + + + + + 1 + + + 2 + + + 0 + + + true + + + Next + + + Next + + + + + + + + + + + + Next + + + Next + + + + + + + + + NoLooping + + + + + + + + + RunState.LoopIndex += 1 + + + RunState.LoopIndex = 0 + + + 0 + + + + + + + + + + + + false + + + true + + + true + + + true + + + 0 + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + NIStepTypeControls.dll|NationalInstruments.TestStand.StepTypeControls.StatementTabInfo + + + + + + + + + + 0 + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + false + + + false + + + + + + + + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> + + + + + +
+ - + - ID#:fhWpfuRw7RGuNrjdh1OqZD + ID#:1m8fotxw7RGuNrjdh1OqZD - - - - - - - - false - - - 2 - - - 3.9 - - - .venv - - - - - - true - - - teststand_fixture.py - - - 1 - - - 0 - - - - - - - - - update_pin_map - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CPythonParameter' structureflags='0'/> - - - - - - Return Value - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - pin_map_id - - - 7 - - - FileGlobals.MeasurementLink.PinMapPath - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - 5 - - - - - + Measurement\Measurement.ico + @@ -5340,7 +4321,7 @@ 2 - 0 + 4 true @@ -5399,9 +4380,6 @@ - - true - true @@ -5566,16 +4544,211 @@ + + + + ni.examples.NIFgenStandardFunction_Python + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='Obj'> + + + + + + + + + + + + false + + + 0 + + + + + + 0 + + + + + + + + + + + + pin_name + + + "Pin1" + + + In + + + true + + + 0 + + + TypeString + + + 1 + + + Pin + + + + + + + + + waveform_type + + + "Sine" + + + In + + + true + + + 0 + + + TypeString + + + 2 + + + None + + + + + + + + + frequency + + + 1000000 + + + In + + + true + + + 0 + + + TypeDouble + + + 3 + + + None + + + + + + + + + amplitude + + + 2 + + + In + + + true + + + 0 + + + TypeDouble + + + 4 + + + None + + + + + + + + + duration + + + 10 + + + In + + + true + + + 0 + + + TypeDouble + + + 5 + + + None + + + + + + + + + +
+ + - + - ID#:c5USoqlx7RGuNrjdh1OqZD + ID#:fhWpfuRw7RGuNrjdh1OqZD @@ -5618,10 +4791,10 @@ - create_nifgen_sessions + update_pin_map - + <_NAME_IN_ATTRIBUTE_ name='' classname='CPythonParameter' structureflags='0'/> @@ -5629,13 +4802,61 @@ - Return Value + Return Value + + + 7 + + + + + + + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + pin_map_path 7 - + FileGlobals.MeasurementLink.PinMapPath @@ -5651,7 +4872,7 @@ 8192 - 1 + 2 @@ -5677,13 +4898,13 @@ - pin_map_id + sequence_context 7 - FileGlobals.MeasurementLink.PinMapPath + ThisContext @@ -5699,7 +4920,7 @@ 8192 - 1 + 2 @@ -6015,16 +5236,166 @@ - + - ID#:7xzPK+Rw7RGuNrjdh1OqZD + ID#:c5USoqlx7RGuNrjdh1OqZD - StatementStep.ico + + + + + + + false + + + 2 + + + 3.9 + + + .venv + + + + + + true + + + teststand_fixture.py + + + 1 + + + 0 + + + + + + + + + create_nifgen_sessions + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CPythonParameter' structureflags='0'/> + + + + + + Return Value + + + 7 + + + + + + + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + sequence_context + + + 7 + + + ThisContext + + + + + + + + + + + + + 8192 + + + 2 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + 5 + + + + + @@ -6134,13 +5505,13 @@ - RunState.Engine.TemporaryGlobals.SetValString("NI.MeasurementLink.PinMapId", 0x1, FileGlobals.MeasurementLink.PinMapPath) + - false + true true @@ -6310,95 +5681,8 @@ -
- - - - - - false - - - - - 0 - - - true - - - "Unnamed Entry Point" - - - True - - - - - - false - - - false - - - true - - - false - - - true - - - false - - - false - - - true - - - 2953567917 - - - false - - - - - - - - - - - - 2 - -
-
-
- - - Test UUTs and Single Pass call this callback in their cleanup step group. It is empty in the model file. Override this in the client file to perform an action after all code in the model executes and just before the execution completes. - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> - - - - - -
@@ -7093,15 +6377,9 @@ -
- - - - - - false + true @@ -7141,15 +6419,15 @@ false + + false + true 2953567917 - - false - @@ -7174,11 +6452,8 @@ false - - NIFgenStandardFunction.pinmap - - + NIFgenStandardFunction.pinmap
diff --git a/examples/nifgen_standard_function/README.md b/examples/nifgen_standard_function/README.md index 54d9645ac..e15bcd9da 100644 --- a/examples/nifgen_standard_function/README.md +++ b/examples/nifgen_standard_function/README.md @@ -14,6 +14,10 @@ using an NI waveform generator. - Includes InstrumentStudio and MeasurementLink UI Editor project files - Includes a TestStand sequence showing how to configure the pin map, register instrument sessions with the session management service, and run a measurement + - For the sake of simplicity, the TestStand sequence handles pin map and session + registration and unregistration in the `Setup` and `Cleanup` sections of the main + sequence. For **Test UUTs** and batch process model use cases, these steps should + be moved to the `ProcessSetup` and `ProcessCleanup` callbacks. - Uses the NI gRPC Device Server to allow sharing instrument sessions with other measurement services when running measurements from TestStand diff --git a/examples/nifgen_standard_function/_helpers.py b/examples/nifgen_standard_function/_helpers.py index eeec62a20..66ba0d3fc 100644 --- a/examples/nifgen_standard_function/_helpers.py +++ b/examples/nifgen_standard_function/_helpers.py @@ -2,7 +2,7 @@ import logging import pathlib -from typing import Dict, NamedTuple, TypeVar +from typing import Any, Dict, NamedTuple, TypeVar import grpc @@ -48,23 +48,25 @@ def __init__(self, *, grpc_channel: grpc.Channel): pin_map_service_pb2_grpc.PinMapServiceStub(grpc_channel) ) - def update_pin_map(self, pin_map_id: str) -> None: + def update_pin_map(self, pin_map_path: str) -> str: """Update registered pin map contents. Create and register a pin map if a pin map resource for the specified pin map id is not found. Args: - pin_map_id (str): The resource id of the pin map to register as a pin map resource. By - convention, the pin map id is the .pinmap file path. + pin_map_path: The file path of the pin map to register as a pin map resource. + Returns: + The resource id of the pin map that is registered to the pin map service. """ - pin_map_path = pathlib.Path(pin_map_id) + pin_map_path_obj = pathlib.Path(pin_map_path) + # By convention, the pin map id is the .pinmap file path. request = pin_map_service_pb2.UpdatePinMapFromXmlRequest( - pin_map_id=pin_map_id, pin_map_xml=pin_map_path.read_text(encoding="utf-8") + pin_map_id=pin_map_path, pin_map_xml=pin_map_path_obj.read_text(encoding="utf-8") ) response: pin_map_service_pb2.PinMap = self._client.UpdatePinMapFromXml(request) - assert response.pin_map_id == pin_map_id + return response.pin_map_id class GrpcChannelPoolHelper(GrpcChannelPool): @@ -108,3 +110,63 @@ def get_grpc_device_channel(self, provided_interface: str) -> grpc.Channel: service_class="ni.measurementlink.v1.grpcdeviceserver", ).insecure_address ) + + +class TestStandSupport(object): + """Class that communicates with TestStand.""" + + def __init__(self, sequence_context: Any) -> None: + """Initialize the TestStandSupport object. + + Args: + sequence_context: + The SequenceContext COM object from the TestStand sequence execution. + (Dynamically typed.) + """ + self._sequence_context = sequence_context + + def get_active_pin_map_id(self) -> str: + """Get the active pin map id from the NI.MeasurementLink.PinMapId temporary global variable. + + Returns: + The resource id of the pin map that is registered to the pin map service. + """ + return self._sequence_context.Engine.TemporaryGlobals.GetValString( + "NI.MeasurementLink.PinMapId", 0x0 + ) + + def set_active_pin_map_id(self, pin_map_id: str) -> None: + """Set the NI.MeasurementLink.PinMapId temporary global variable to the specified id. + + Args: + pin_map_id: + The resource id of the pin map that is registered to the pin map service. + """ + self._sequence_context.Engine.TemporaryGlobals.SetValString( + "NI.MeasurementLink.PinMapId", 0x1, pin_map_id + ) + + def resolve_file_path(self, file_path: str) -> str: + """Resolve the absolute path to a file using the TestStand search directories. + + Args: + file_path: + An absolute or relative path to the file. If this is a relative path, this function + searches the TestStand search directories for it. + + Returns: + The absolute path to the file. + """ + if pathlib.Path(file_path).is_absolute(): + return file_path + (_, absolute_path, _, _, user_canceled) = self._sequence_context.Engine.FindFileEx( + fileToFind=file_path, + absolutePath=None, + srchDirType=None, + searchDirectoryIndex=None, + userCancelled=None, # Must match spelling used by TestStand + searchContext=self._sequence_context.SequenceFile, + ) + if user_canceled: + raise RuntimeError("File lookup canceled by user.") + return absolute_path diff --git a/examples/nifgen_standard_function/teststand_fixture.py b/examples/nifgen_standard_function/teststand_fixture.py index 530bafe0c..d81111bac 100644 --- a/examples/nifgen_standard_function/teststand_fixture.py +++ b/examples/nifgen_standard_function/teststand_fixture.py @@ -1,33 +1,49 @@ """Functions to set up and tear down sessions of NI-FGEN devices in NI TestStand.""" +from typing import Any import nifgen -from _helpers import GrpcChannelPoolHelper, PinMapClient +from _helpers import GrpcChannelPoolHelper, PinMapClient, TestStandSupport import ni_measurementlink_service as nims -def update_pin_map(pin_map_id: str) -> None: +def update_pin_map(pin_map_path: str, sequence_context: Any) -> None: """Update registered pin map contents. Create and register a pin map if a pin map resource for the specified pin map id is not found. Args: - pin_map_id (str): The resource id of the pin map to register as a pin map resource. By - convention, the pin_map_id is the .pinmap file path. - + pin_map_path: + An absolute or relative path to the pin map file. + sequence_context: + The SequenceContext COM object from the TestStand sequence execution. + (Dynamically typed.) """ + teststand_support = TestStandSupport(sequence_context) + pin_map_abs_path = teststand_support.resolve_file_path(pin_map_path) + with GrpcChannelPoolHelper() as grpc_channel_pool: pin_map_client = PinMapClient(grpc_channel=grpc_channel_pool.pin_map_channel) - pin_map_client.update_pin_map(pin_map_id) + pin_map_id = pin_map_client.update_pin_map(pin_map_abs_path) + + teststand_support.set_active_pin_map_id(pin_map_id) -def create_nifgen_sessions(pin_map_id: str) -> None: - """Create and register all NI-FGEN sessions.""" +def create_nifgen_sessions(sequence_context: Any) -> None: + """Create and register all NI-FGEN sessions. + + Args: + sequence_context: + The SequenceContext COM object from the TestStand sequence execution. + (Dynamically typed.) + """ with GrpcChannelPoolHelper() as grpc_channel_pool: session_management_client = nims.session_management.Client( grpc_channel=grpc_channel_pool.session_management_channel ) + teststand_support = TestStandSupport(sequence_context) + pin_map_id = teststand_support.get_active_pin_map_id() pin_map_context = nims.session_management.PinMapContext(pin_map_id=pin_map_id, sites=None) with session_management_client.reserve_sessions( context=pin_map_context, diff --git a/examples/niscope_acquire_waveform/NIScopeAcquireWaveform.seq b/examples/niscope_acquire_waveform/NIScopeAcquireWaveform.seq index 98ac69ad2..92799e6e4 100644 --- a/examples/niscope_acquire_waveform/NIScopeAcquireWaveform.seq +++ b/examples/niscope_acquire_waveform/NIScopeAcquireWaveform.seq @@ -1670,37 +1670,31 @@ E@=3DJC4100hYLECF=_K@0@mKCYo_1KN:<Ta239hF9[gHbEVFDfRINZfQ01CkaUMk5=k`[c;[42MMF9aiNliecVfMFCLXi_`f2H7c\G\X50M=Z4S4aT2QI>A^D:d1\PCI`L11RlV5bM5AIZTc9STI5Mkg<bHlle[O=CL_KEgb?8RiVHS7QmPY@S4X^7I58A@kPaKcPWCOC1;DBf61lViY=]`28BC\B_mEf20ZJS@W@GDDRffLe\Ci;aKbN>i5P_4ScVVBTjIIfn0j8l<e6IcMbZHgCI;n8CRlR7<YcK0@cY[8aDHj=GGkNK;C?KC?b=]mMejoc1gGol1>hL6lf5fZ92?Ia@l1;QL024f^NSm2MhNlcFg_YR[l5kclo:einXehbR>98[4?GC:CX[3hm\UMob2aIMT0eJmgI@\;njRK9]fIl_8f=d]n4bQcRXDEl<o=@Yiik\3Md@?k1=0Joj>?Je`<RUd<JYmeOnOgB3G@Ub\FoGFgIQmQli8nGH=QjKD9i`2nf41XEKj;oDB8iZU`@XP^KWoAKEbOf:ViVAl=_I37KJSec7Ea\nJ5]NZj\OnJF;ASQemRIDbbdglb\U>H[O^bDHO?XMLaOoeVCf=a^CC`d8^TX2B E@=3@J\4110h]L]Mg[cK3fBoj\Kifo1C[KY_3VgFm3_6n>DfdTDgjaSF_LdVUJaY::FII@T:GB9LaYOo80OP^053LBBVb1G?:50k4;P1c\^`03ffoj9S72=AOm;a2oh?Na\lC7TUOXcNfaSdfIbVCC_ao20aN9bmo_<R_S=>KV;lhbmh89SY[:2UflXcmGIlnngoE]\\ad_6_gW8X9GAXJSPJYin>C71=c74a79JN<`GPK]_\>2`h9IOC]VA5BU4AMW1Qc`j?lJ\aR4__>R4SI_`[_mmnM33ONg`3P[g4N5aSF;ce]^eVffg6>cIRLhI]7CjE^W[jW`kZkGEWHk1=RR;gTe:O[H;k[bAd7UCaTVXgjlho3Af>?oIJdjMo>3=o;aTo\ZZnG9_cgcO7mjV^k>\:gkoOkSn1jkfm@MgLnb<Amg;\Nmj8klk3llhhnW>nn^GCW_fW_>ji]:Va>TNnNQdK5LolNX?M@\6jN2ddlIHh=MT1E^[o4Q7I54R=RlVg[S\KmOe9GM:Qeh9OnUhWTeC^ZM7SAGP1V=LZ4[i\cOmoH[RS6YBL2L\PAg][JQ<Eo?8;D9Mk3M]>N^6>HgJ]KP^a>cfBkkmZ33RdU`]jB_NIOShWL4oDlbn3lNOCL??R7GCmKaTDhekoi_En`9oJKe<e1`lBjmjXJ<^4_^_^>?7O?nEE_WTY:VYEc]3^eJm^cdC7;LcK_]Ei>b<^`9HR6YcO>l@Amg>PLXQbSb^=?FXRUZd<[n<SGjgCQ`mhTl;7NUbgaRQBkXNY4iX5iAJX6C`gdG[d3d>`Uj3DPMF7h71WBBLLR>Tk9dZlFCYSi__fNBBT`C;A>jeP2CdONN52i5^eBEIEI=8EMHBBe^G^1ohD6>LRiJgM\IPYE8Wn`T9W@jf8iEfN:@L3<Ha_l0CCE<HOJjXBRll_NLReo_^K7CQWihL<B1::YXdSaG<XFnCP94dQXb;^6V07F>TkPem>4QI;?9JkF`g80:`G?AULFSY^XW;4XL^_D=GZV9VVODS^[=]dL]b=N;O[ib6]2aLATM7\AcX=JH<\1j8_?I9_VUO]5;PKjdi^o>Kn=FbmhAmF3EXh?dAPF?cWPU;NHFT9YBblF15fj0n]RK9>d;@lD9HXLGTZOAa;gEd6:MElAPOkOoMom`hnaYko^ne_;PeC\`kMYOoCalP3DR_^NADNSV6R1Nk4f?=Lo;VQ>7>fR@=2j8C:;D@3fk>^=YHE^PQ1fU>TFoNH>GnfRGNMNW`[okK`S56RJfM4Zmo^6E9ZYc>FNEO3PO=T9eK0:bgljYdR7WooKS9eTjd@bcImNVZ8UXa:AC_F_WCj]4\6ST<:ie_AbZFIL7UmlIne:BcTQ5T2U]O2goYWXRN5F8oeQT^`HXPD=2LV[h;ibbNNj1kU]lXlnX4ACO5aRA@TfHY77@P?L=_N@4^cJG;Wi2@3M5OQ:^@>2K9_9W:4Vn1LGaRN@WL9AFFVg1oYHdi`54XIa5G[\i>iPT4506XA7h2^c_T`3d[ARdFICaAS2RM:1KgT7B>MhXVaI<kA^@CX2aS^I:B>=W<U?l<DWU<Jd7^cKe2R]EdIBcBQZni_K1JPCEhV>VH]FBZ<5413k[U]MAFA`Ohma2g2NoU0@E;FI93Yi;RjnlScC;`glEaH^X@K[NY9Y1EUZc6V6\3?FKC0APU0^[aP:_GMI=eeWnJ<6e2]@;AXaAE<S[lhAb`XFjPP@dTXNYS=<568je\`W3?@gn9HDaM84^>SDl0<Ba6YNKCeYZ\CUU?WGnR4=m^aN[KTlFG\?VZ[MC:3HfflAagl\jZUG@ScZW:2K\FU9TQa<h;?iYb<RJI66IEg<WHgdkU:\KFIZG\BDU=9W>:\:W7nM3NIjXT;2YV[@dDaY3bhOQY^af<UVo:ZV^^@0d_M5ObRQ2PIHZ9bbbGm;4Z\KEfEYI=M];D@9j1kZ@2@FIkf9:\CYe5KnKANXH7R@eMc2M;Pl]PZG]@4h2Q7OY:=QFh@\Y6]E6X1bL6mjS76a`JS=H=XQReG6Djb7[c<h@S5UCX4`ABLQ4:ZZ7=JF9JejC5\[T:meE5_[:`Qm=DfI0EDQLRH6o]LAPRXlbTgXSbnW7ZTN?N]lH02JKm;Z4hn<A[89:C8lM5hC]Ab^\\WNK7JGS]XainLm:PWFF3EmC15\]YC\D;I6a<NiIhd2GMIG`A9\[]T00fP:UXIXSHk2jI>XFG>I521bbKDA`Xb]h>oAl>IolbRB7j=i9_H89<FR=U572U\LjNhnkeeemHDJJ\GHX\;J51M<?QV2DneREAR3in6<M75M_Re=Ci3gEOQ2VO`4P8_hfhSO\dZ7m]n\hlV6gSlSC@PoZSe8WUaY3d0_;Z=9H:I6Gf2PVG`mf8CC87@DBlT62^h6QFFhZF64BJ46@Dh<T1=C]0_9J?073S@61ADIUT31<mVE<W?R@RBUJP`@;50X2Bh618KM^bf033T033D?NM@P`?0\dBA3A8AXF0]@KnP[5<EDfUICcBF^EZT=:cWKBKYTDKXD=<A:mkNB7LFDHC9b7nG57NFZ1]Ubo]8]0MN]YWJJ>eS42I?===3_n_?J=384=Go8e^0mdmBiTjRaf;F@8M4_gCZSGQ3cUUnF6J_R9WJV0PNaTJDk<RiWS6=>Rf9EmM:WgL4LHg5oH[aMbbOlnI6b`9KZ^Z]oAdeH\@YgaV8ChHTKjEVA]a^YN<;71CAbR\<jAYI\\Y<R\`1AOol`j1>53?d8MV_@kAN_W4nIdKc0gRYHEo`]U?HWN?0<?l2h:ZC\>^D]Ug4FNZl123fNoZ7fLRB[_HR6O>BaoomWl_8YS0Q\8;RB]@j=GIIe]J<AT[;1I<5ZJ\?Va5g?>7hXgcbU4V=lT>nV[28JKeQJ5QX4^WD3MfTBIBPKU57e>[FRd>_EeSHJhDa4hM9S9TUlOR=KWn]eAJ]W5VROh9ak`n5<LV6L9d<0`?fk]J8FW52OlL2i<L1kO=mGBf9e:\`^[_J:F>7o0_9mGc_`=KP@SW_^NU525JcQcEGhR8Da3gf4mJ?R6a2lLPKjL:TlfL8iHOKf:Mjeb\>Xb3>0kM@iNkaifYHDFNIKP\e^;bhg@V<g0Za7F]R=JKPMgdg>nYaMSb8MAV0o05XKjM5<5^V=albT\<868hhl^jHPRa0KcT4i[31chfOeGW>;``>>I;B:YafYW>jW_7D1>9_X14U9VXJ5E_PA2ZPb>n6eBLcN]SU4eSd<IDGD4D5WHMlFCU0DeARScb:h\?EC1>IBWead>7F>FeBea\oCS]jf@kE47ZHcB?TlP6_K[QC2@_N>ilNn0VdgZE>Z98hXCHa4bNUM16M74Q;DhldmcZ>V?_TG1J?NI:F8<aomhdPX5^AEe6BRYle4clf_gSb6D9LaD2h]ij8SAH@[`J@cb2G7ee@iZWl2A>`Ga95FDhJo7Xo>Zd3[jL<DQ4OILX9a;0T\SUDWY:Bh>WGNb:dHQ[S`[8:1L:F@>H[49RQ6_3QV<UT0oIITF^H_\X=:<42`N``YjM75HWEd]5O`<EX89FTP`^oN:QHgED5k:\CaYbA2GbD1;X5:N;?SoLhVhR`R_9lg3hU4n:I`2Gn:IjDHED]5i=2fcTklTK1H6k4HjK;HBM>;c]9;i[MFD?WaY1O]oS293kLd9S3N6He?:_QKEcBGLOc:jB6H@fR]h]HGB5;:<RE<`3K4Ibi29dR;nU<<TKBRnTdK[ZTT6oiOVVXKgaP6<lMTO_JC\0<RY5NkR352<FbcCB<_3?0XjQ`BJP;OJR::8eHFb3<;M\9FOC8T:MkD:Z;C=eb^0:AMSbSY_^Lc=SGbD5WDh@6j]PCDc@;\X1Nb\[`Z0W_Th5<HD4CafYghb`T95Ko571]SZJDHF2eE<7jViL_\8TQ@dFRo]`G[h3>862l:2F[UU6dVbFjU?NI>OHOk>JNcFNU[mXi]iJ[neWQ\mWa]i[e?IkO^Mf]LHTP[G3?43M8g^Wh``lW3kBT7ADM6b_IUCIPO=C8g5@?9R3<hilXNY7_<THNN<KMLm;eGM6_A6AUDB\c5Q;S2POniP9[mdEeIDnO7;T7Nia2nFN\L2XZIP?ZJKW\2cK0U5fb[dLn?[C>YAMXfVFic02OQA\6LHEk0oBd0f;`kR1hImAUl:@I;^:oFJUF?mDgPlLokm]OIgenn9;n5[Oh3g7@W7OWBCk9X1mYDPF9AQ4LOGeM_D_WR?I7QRlVEmN_0QlA9^lO[HjnfngGjkHokO\A35=_4hVU^jKm;\?Y9^B=RkTG1I<6nI`AQ_kJ;of[GmIi[g0]1\UG_FKUnX]ZcGmoI;NUdDFOolHn;NbMLkT`1GEo;j63N_8b_O`PQ[KRjb<NDHW4;\lT[Ila;nMd`56_c\C25fJLUS;9fn@6[[SMIBBMFK\8d;ZIRSI;fJ5_cojWSIfcY2kNd1jkS0f9A3BNfk8W1m4H0gRbfA3J6Q726nmNm4PQYcWZ___NEf_FmmmOm40IZ1mf4PmS?H8k>=J3g<\1K6j;CNTGZ8kY61mk30RLUO`T`_H`Hg<`\K67=HJ3g<\3K6iGRVO9``_1H`L`\K6`f=371ikY61mf30S<W]K86enT`_H`Hg<=fbaLQO`c@<hK;Rmmf>KT=]4\mm;NkW]^mcFgV[_]l=8aHk_j]MgIEYV5XJkiW]l^^CKnYn2OgNJ0g<fR\mWo;?JNcFN^cfL_eWZ[Eff[LeWebL[d?YfWFm3O0neW6m3NP3nGQ@G_M?lS61c3KG?`NUXHYTJ?j1SoC7V>RGj_]d[blRO_M^Qg>f_[0oQJWgg`CkhXXJ\hG;1Ujg`4MNjIg_6l3GG;oohYSNBallm3eZnFmebBeaLSDIS17WJfDBN9nUo^n2oC_;Q\;4O3WWk7mAZI17;2]ChHfZeJ;I\fY;^dB\J;NW@cEDj]HE]B8GSiKJgN9M6f4UIKhV02kFjYnXXBH9lF?3gDC<EC`d=4l<aIYa?]YS<9Zl8]AkXcPg:6L69WWX^8R2;YXfC<Xg6AQg@oOoChH=41ln]AG?J3U0Wn>8[8cdWGUnL2Z>Ll4HaNcI<f]SiWCVXSMeP?^a7:Tf<`L3cKdmDl7?Uj>FnPG5NSQBkHE`Yj>ZNQ^;UbDk0kCT]3]YV<50o<2<aTY7THb5hg;3^hl@GYRZE@mbL?5gdHJNW5`6W8[eho^38?;R459L4WN1Jg[egNX[3[_>lAAY>L9Z_H5YN]9:KZMj\cPGZco]??=ig[hH7YShgPS8:44leI:@9R?fLHKlH6UZ]nlAXHFAFUn7AdT=;FK^oZgocoK[2W_=Aj]T;2mBd8`7h`B0K>IP<04@S6]dA9N`8Q8YBk19T@8RFF4T29OB1V7TX7QM01@hI@3`QJ=4@H\nBkS2d5P1BDgN8?4B230Y8lb8ONC@?IPH0A@OMPD?HZ@1`>mj`5N5c60PN06hNI1c8`@k6b0M9IN3`QM68;M1l5Bl>6cX>XD78V@S2j5Ad;C<0cA7OX0nM8<iaN3K0@0Kil664BNSOe:0@R=6NA66f9@PX0d0dHb:LL\6@1aSJl[5h6I38X<0`;0<Al748MXb84H=@Y<lI\5@GNMD;RJd?DeY0Ac1J230g>d1e00LP8d;>V@59CQA1BG<@2[2A45hE8CX:H0A=a\KRAC<Q0YPRb5D<IR63P1QX<JXCS9a3FQ>daQVRjO4I;1da1URZ;LZ444@R2PX2XAXA9Te@FngkoKI_ea>NZN^m\`1H5CMhX9Bn1?ZYS0WAbR2RD8F3W@XajF1=AXS6<TS4i09PN?`gPUG9G3J26`2GbAW]jGY5<AGn^iZAjM_;W5<g^kKMC]B[X13GZm3mmNffKMhb:cJ]DAT>a?_4H8jZX2PIja6[DFTFC:]l]=1AN=PD`VJ>HX2k?Pj7:bQ`W[XWe0\38<V=I\:]2HOl74S6e0a;ZmCFf:3FnRcED67[hUWZPU7ZZKLUVD\PFX_FVE23Q7WUaWV=U><ZRLQB8LDd0hS94OC1D?6J9N:\\`US2k:iaJY8jY]eTVWO0KLeICMh3dn\dH86aYA7eY]eZZ3=d6WJLE7IPEWIe=_c4FYLEhdA\b5XoJQE;n[HFdKI7C3oK`RFK6l`B8RhhCXhP8XnP3841548PB6P6B[DKHS41JU<Qne:U\ARQ=B[VDHSOT307XA07Qhn2d8RBoajKU>9P@S2lYle3RId0IIf072nP8>;NUah=0ilGD:G5\RN_\=;5jTD@iTfQNGIfmQJ2oJl[SBFC]DLncWBE4mFZe6d_Ob>3YC4APEA@D_mOFNI8ALek79bT>:a8]EjYToY<]8C`FV4Z``X`1aB@L<?V9ARCQ4c:K71jA4o8X@_N2@;?hf9D0M0]D;:A]?]T5@Y1`>Vi=L5H`I25YCYJTF@F?fd@VbI9Pf6?dDZY8JdAcR`QM5>MT<aOnO7<DiRiB;\k?RRIHVCkC<FWi=5fXF\he2n@Q>2TEkZIo6kBK3\C@]3\oE]=7UY8knVi7O5=^_a6d;G^?DaLI=YY]ARAc7NRDMhAYZlK90=KQlem6G@;;lecBDFecfKNA=H>mJl3I59=NFgn`nf[B1:05f5E[`fiTPQ4EDe1H=4ZRWkf3TWlOP>Ela5hZDn]cQJC=UBXIIJdWiR@KZe]DHRbmfI;]VYoi>o?3K1h=6 - - + + + + + - "%ModuleDescription" + ResStr("NI_STEPTYPES", "ACTION_DESCRIPTION_NAME") + (("%ModuleDescription" == "") ? "" : ", %ModuleDescription") - ResStr("NI_STEPTYPES", "EDIT_DEF_SUBSTEP_NAME") + ResStr("NI_STEPTYPES", "ACTION_DEF_STEP_NAME") - - - - - - - - false - - + - true + false - true + false "" - ResStr("NI_STEPTYPES", "EDIT_SUBSTEP_MENU_ITEM_NAME") + ResStr("NI_STEPTYPES", "ACTION_MENU_ITEM_NAME") "" @@ -1712,16 +1706,10 @@ false - EditSubsteps + Action - - - - - DefaultLabVIEWNXG|DefaultLabVIEW|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template - @@ -1785,7 +1773,7 @@ - + @@ -1793,7 +1781,7 @@ - + @@ -1849,21 +1837,21 @@ 2 - 4 + 0 true - + Next - + Next - + - + @@ -2067,7 +2055,7 @@ - + 0 @@ -2086,26 +2074,32 @@ - + - - false - - + + DefaultLabVIEW|DefaultLabVIEWNXG|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template + + - - + + + + + false - - + + false - + + + Action + - + - - + + @@ -2118,62 +2112,26 @@ 1 - + - - + + _notNamed - 0 + 7 - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ typename='Expression' xsi:type='Expression' name='' classname='ExprValue' structureflags='131072'> - 1024 - - - - - - 1024 - - - 0 - - + - - + + - - - 0 - + - + @@ -2186,7 +2144,7 @@ - + @@ -2201,80 +2159,70 @@ - - - - - + - - + + - + - + + true + + + 3 + + - - + + - - + + + + + + true + + + + + + 1 + + + 0 + + + + + + + + + + + - <_NAME_IN_ATTRIBUTE_ typename='FCParameter' xsi:type='FCParameter' name='' classname='FCParameter' structureflags='131072'> + <_NAME_IN_ATTRIBUTE_ typename='NI_PythonParameter' xsi:type='NI_PythonParameter' name='' classname='CPythonParameter' structureflags='131072'> _notNamed - 0 + 7 - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - + - - + + - - - 0 - + - + @@ -2287,7 +2235,7 @@ - + @@ -2302,66 +2250,27 @@ - - - - + Return Value - 3 + 7 - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - + - - + + - - - 0 - + - + @@ -2374,7 +2283,7 @@ - + @@ -2389,3232 +2298,1974 @@ - - - - + - + + + 5 + - - - - - - - - - - - - - - - 0 - + - + - - + + - - - - + + "%ModuleDescription" + + + ResStr("NI_STEPTYPES", "EDIT_DEF_SUBSTEP_NAME") + + + + + + + + + false + + + + + true + + + true + + + "" + + + ResStr("NI_STEPTYPES", "EDIT_SUBSTEP_MENU_ITEM_NAME") + + + "" + + + false + + + false + + + EditSubsteps + + + + + + + + DefaultLabVIEWNXG|DefaultLabVIEW|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template + + + + + <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> - + + + + + + + + + + + 8192 + + + 2 + + - - - - + + 3 + + + true + + - - + + + + + - - - - CommonSubsteps.dll - - - EditStatementStep - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='FCParameter' structureflags='0'/> - - - - - - Return Value - - - 3 - - - 4 - - - 2 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - context - - - 4 - - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - ThisContext - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - reserved - - - 0 - - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - 0 - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - changed - - - 0 - - - 4 - - - 2 - - - - - - 1 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - RunState.InitialSelection.SelectedFile.ChangeCount - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - true - - - true - - - true - - - true - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - ResStr("NI_SUBSTEPS", "STATEMENT_EDIT_STEP_MENU_NAME") - - - true - - - true - - - - - - - - LocalizeExpression(Step.TS.PostExpr) - - - ResStr("NI_SUBSTEPS", "STATEMENT_DEF_STEP_NAME") - - - - - false - - - false - - - "" - - - ResStr("NI_SUBSTEPS", "STATEMENT_MENU_ITEM_NAME") - - - "" - - - false - - - false - - - NI_Miscellaneous - - - - - - - <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - ResStr("NI_SUBSTEPS", "STATEMENT_EXPRESSION") - - - LocalizeExpression(Step.PostExpression) - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - StatementStep.ico - - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - false - - - true - - - true - - - true - - - 0 - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - NIStepTypeControls.dll|NationalInstruments.TestStand.StepTypeControls.StatementTabInfo - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - false - - - false - - - - - - - - - - - - ResStr("NI_STEPTYPES", "ACTION_DESCRIPTION_NAME") + (("%ModuleDescription" == "") ? "" : ", %ModuleDescription") - - - ResStr("NI_STEPTYPES", "ACTION_DEF_STEP_NAME") - - - - - false - - - false - - - "" - - - ResStr("NI_STEPTYPES", "ACTION_MENU_ITEM_NAME") - - - "" - - - false - - - false - - - Action - - - - - - - <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - true - - - true - - - true - - - true - - - 0 - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - DefaultLabVIEW|DefaultLabVIEWNXG|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template - - - - - - - - - false - - - false - - - Action - - - - - - - - - - - - 8192 - %#x - - - 1 - - - - - - - - - _notNamed - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - true - - - 3 - - - - - - - - - - - - true - - - - - - 1 - - - 0 - - - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ typename='NI_PythonParameter' xsi:type='NI_PythonParameter' name='' classname='CPythonParameter' structureflags='131072'> - - - _notNamed - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - Return Value - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - 5 - - - - - - - - - - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> - - - - - -
- - - - - - - - ID#:1m8fotxw7RGuNrjdh1OqZD - - - Measurement\Measurement.ico - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 4 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - true - - - true - - - true - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - - - ni.examples.NIScopeAcquireWaveform_Python - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='Obj'> - - - - - - - - - - - - false - - - 0 - - - - - - 0 - - - - - - - - - - - - pin_names - - - "Pin1,Pin2,Pin3,Pin4" - - - In - - - false - - - 0 - - - TypeString - - - 1 - - - Pin - - - - - - - - - vertical_range - - - 5 - - - In - - - false - - - 0 - - - TypeDouble - - - 2 - - - None - - - - - - - - - vertical_coupling - - - "DC" - - - In - - - false - - - 0 - - - TypeString - - - 3 - - - None - - - - - - - - - input_impedance - - - 1000000 - - - In - - - false - - - 0 - - - TypeDouble - - - 4 - - - None - - - - - - - - - min_sample_rate - - - 10000000 - - - In - - - false - - - 0 - - - TypeDouble - - - 5 - - - None - - - - - - - - - min_record_length - - - 40000i64 - - - In - - - false - - - 0 - - - TypeInt32 - - - 6 - - - None - - - - - - - - - trigger_source - - - "Pin1" - - - In - - - false - - - 0 - - - TypeString - - - 7 - - - Pin - - - - - - - - - trigger_level - - - 0.5 - - - In - - - false - - - 0 - - - TypeDouble - - - 8 - - - None - - - - - - - - - trigger_slope - - - "Positive" - - - In - - - false - - - 0 - - - TypeString - - - 9 - - - None - - - - - - - - - auto_trigger - - - False - - - In - - - false - - - 0 - - - TypeBool - - - 10 - - - None - - - - - - - - - trigger_coupling - - - "DC" - - - In - - - false - - - 0 - - - TypeString - - - 11 - - - None - - - - - - - - - timeout - - - 5 - - - In - - - false - - - 0 - - - TypeDouble - - - 12 - - - None - - - - - - - - - waveform0 - - - - - - Out - - - true - - - 1 - - - TypeDouble - - - 1 - - - None - - - - - - - - - waveform1 - - - - - - Out - - - true - - - 1 - - - TypeDouble - - - 2 - - - None - - - - - - - - - waveform2 - - - - - - Out - - - true - - - 1 - - - TypeDouble - - - 3 - - - None - - - - - - - - - waveform3 - - - - - - Out - - - true - - - 1 - - - TypeDouble - - - 4 - - - None - - - - - - - - - - - - -
- - - - - - - - true - - - - - 0 - - - true - - - "Unnamed Entry Point" - - - True - - - - - - false - - - false - - - true - - - false - - - true - - - false - - - false - - - false - - - true - - - 2953567917 - - - - - - - - - - - - 2 - -
-
-
- - - Test UUTs and Single Pass call this callback in their setup step group. It is empty in the model file. Override this in the client file to perform an action before any code in the model executes. - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> - - - - - -
- - - - - - - - ID#:CHEZyO1w7RGuNrjdh1OqZD - - - StatementStep.ico - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - FindFile(FileGlobals.MeasurementLink.PinMapFileName,True,FileGlobals.MeasurementLink.PinMapPath) - - - - - - false - - - true - - - true - - - true - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + PreloadWhenExecuted + + + UnloadWithFile + + + Normal + + + None + + + 1 + + + true + + + false + + + false + + + + + + 0 + + + false + + + + + + 1 + + + + + + + + + 1 + + + 2 + + + 4 + + + true + + + Next + + + Next + + + + + + + + + + + + Next + + + Next + + + + + + + + + NoLooping + + + + + + + + + RunState.LoopIndex += 1 + + + RunState.LoopIndex = 0 + + + 0 + + + + + + + + + + + + true + + + true + + + true + + + true + + + 0 + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + false + + + + + + + + + + + + + + false + + + + + + false + + + false + + + + + + + + + + + + 8192 + %#x + + + 1 + + + + + + + + + _notNamed + + + 0 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ typename='Expression' xsi:type='Expression' name='' classname='ExprValue' structureflags='131072'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ typename='FCParameter' xsi:type='FCParameter' name='' classname='FCParameter' structureflags='131072'> + + + _notNamed + + + 0 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + Return Value + + + 3 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + CommonSubsteps.dll + + + EditStatementStep + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='FCParameter' structureflags='0'/> + + + + + + Return Value + + + 3 + + + 4 + + + 2 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + context + + + 4 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + ThisContext + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + reserved + + + 0 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + 0 + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + changed + + + 0 + + + 4 + + + 2 + + + + + + 1 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + RunState.InitialSelection.SelectedFile.ChangeCount + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + PreloadWhenExecuted + + + UnloadWithFile + + + Normal + + + None + + + 1 + + + true + + + false + + + false + + + + + + 0 + + + false + + + + + + 1 + + + + + + + + + 1 + + + 2 + + + 0 + + + true + + + Next + + + Next + + + + + + + + + + + + Next + + + Next + + + + + + + + + NoLooping + + + + + + + + + RunState.LoopIndex += 1 + + + RunState.LoopIndex = 0 + + + 0 + + + + + + + + + + + + true + + + true + + + true + + + true + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - 0 - - + - - - false - - - - - - - - - - - - - - - - - - - - - - ID#:fhWpfuRw7RGuNrjdh1OqZD - - - - - - - + + + + + + + + + 8192 + + + 2 + + - - false - - - 2 - - - 3.9 - - - .venv - - - - - + + 3 + + true - - - teststand_fixture.py - - - 1 - - - 0 - - - - - + + - - - update_pin_map - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CPythonParameter' structureflags='0'/> - - - - - - Return Value - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - pin_map_id - - - 7 - - - FileGlobals.MeasurementLink.PinMapPath - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - 5 - + + + + + + + + + + + + + + + + 1 + + + + - + + + + + + true + - + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + + 0 + + + + + + false + + + + + + + + + + + + + + ResStr("NI_SUBSTEPS", "STATEMENT_EDIT_STEP_MENU_NAME") + + + true + + + true + + + + + + + + LocalizeExpression(Step.TS.PostExpr) + + + ResStr("NI_SUBSTEPS", "STATEMENT_DEF_STEP_NAME") + + + + + false + + + false + + + "" + + + ResStr("NI_SUBSTEPS", "STATEMENT_MENU_ITEM_NAME") + + + "" + + + false + + + false + + + NI_Miscellaneous + + + + + + + <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + ResStr("NI_SUBSTEPS", "STATEMENT_EXPRESSION") + + + LocalizeExpression(Step.PostExpression) + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + StatementStep.ico + + + + + + + PreloadWhenExecuted + + + UnloadWithFile + + + Normal + + + None + + + 1 + + + true + + + false + + + false + + + + + + 0 + + + false + + + + + + 1 + + + + + + + + + 1 + + + 2 + + + 0 + + + true + + + Next + + + Next + + + + + + + + + + + + Next + + + Next + + + + + + + + + NoLooping + + + + + + + + + RunState.LoopIndex += 1 + + + RunState.LoopIndex = 0 + + + 0 + + + + + + + + + + + + false + + + true + + + true + + + true + + + 0 + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + NIStepTypeControls.dll|NationalInstruments.TestStand.StepTypeControls.StatementTabInfo + + + + + + + + + + 0 + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + false + + + false + + + + + + + + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> + + + + + +
+ + + + + + + + ID#:1m8fotxw7RGuNrjdh1OqZD + + + Measurement\Measurement.ico + @@ -5670,7 +4321,7 @@ 2 - 0 + 4 true @@ -5725,187 +4376,709 @@ - - + + + + + + true + + + true + + + true + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + + 0 + + + + + + false + + + + + + + - - - true - - - true - - - true - - - true - - - 0 - - - + + + + + + + + ni.examples.NIScopeAcquireWaveform_Python + + + - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + <_NAME_IN_ATTRIBUTE_ name='' classname='Obj'> + + + + + + + + + + + + false + + + 0 + + + + + + 0 + + + + + + + + + + + + pin_names + + + {"Pin1","Pin2","Pin3","Pin4"} + + + In + + + true + + + 1 + + + TypeString + + + 1 + + + Pin + + + + + + + + + vertical_range + + + 5 + + + In + + + false + + + 0 + + + TypeDouble + + + 2 + + + None + + + + + + + + + vertical_coupling + + + "DC" + + + In + + + false + + + 0 + + + TypeString + + + 3 + + + None + + + + + + + + + input_impedance + + + 1000000 + + + In + + + false + + + 0 + + + TypeDouble + + + 4 + + + None + + + + + + + + + min_sample_rate + + + 10000000 + + + In + + + false + + + 0 + + + TypeDouble + + + 5 + + + None + + + + + + + + + min_record_length + + + 40000i64 + + + In + + + false + + + 0 + + + TypeInt32 + + + 6 + + + None + + + + + + + + + trigger_source + + + "Pin1" + + + In + + + false + + + 0 + + + TypeString + + + 7 + + + Pin + + + + + + + + + trigger_level + + + 0.5 + + + In + + + false + + + 0 + + + TypeDouble + + + 8 + + + None + + + + + + + + + trigger_slope + + + "Positive" + + + In + + + false + + + 0 + + + TypeString + + + 9 + + + None + + + + + + + + + auto_trigger + + + False + + + In + + + false + + + 0 + + + TypeBool + + + 10 + + + None + + + + + + + + + trigger_coupling + + + "DC" + + + In + + + false + + + 0 + + + TypeString + + + 11 + + + None + + + + + + + + + timeout + + + 5 + + + In + + + false + + + 0 + + + TypeDouble + + + 12 + + + None + + + + + + + + + waveform0 + + + + + + Out + + + true + + + 1 + + + TypeDouble + + + 1 + + + None + + + + + + + + + waveform1 + + + + + + Out + + + true + + + 1 + + + TypeDouble + + + 2 + + + None + + + + + + - - + + waveform2 - - - - + - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - + + + Out + + true - + + + 1 + + + TypeDouble + + + 3 + + + None + - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + - - + + waveform3 - - - - + - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - + + + Out + + true - + + + 1 + + + TypeDouble + + + 4 + + + None + - - + + - - - - - - - - - 0 - - - - - - false - - - - - - - - - - + - + + +
+ + - + - ID#:c5USoqlx7RGuNrjdh1OqZD + ID#:fhWpfuRw7RGuNrjdh1OqZD @@ -5948,10 +5121,10 @@ - create_niscope_sessions + update_pin_map - + <_NAME_IN_ATTRIBUTE_ name='' classname='CPythonParameter' structureflags='0'/> @@ -5959,13 +5132,61 @@ - Return Value + Return Value + + + 7 + + + + + + + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + pin_map_path 7 - + FileGlobals.MeasurementLink.PinMapPath @@ -5981,7 +5202,7 @@ 8192 - 1 + 2 @@ -6007,13 +5228,13 @@ - pin_map_id + sequence_context 7 - FileGlobals.MeasurementLink.PinMapPath + ThisContext @@ -6029,7 +5250,7 @@ 8192 - 1 + 2 @@ -6345,16 +5566,166 @@ - + - ID#:7xzPK+Rw7RGuNrjdh1OqZD + ID#:c5USoqlx7RGuNrjdh1OqZD - StatementStep.ico + + + + + + + false + + + 2 + + + 3.9 + + + .venv + + + + + + true + + + teststand_fixture.py + + + 1 + + + 0 + + + + + + + + + create_niscope_sessions + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CPythonParameter' structureflags='0'/> + + + + + + Return Value + + + 7 + + + + + + + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + sequence_context + + + 7 + + + ThisContext + + + + + + + + + + + + + 8192 + + + 2 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + 5 + + + + + @@ -6464,13 +5835,13 @@ - RunState.Engine.TemporaryGlobals.SetValString("NI.MeasurementLink.PinMapId", 0x1, FileGlobals.MeasurementLink.PinMapPath) + - false + true true @@ -6640,95 +6011,8 @@ -
- - - - - - false - - - - - 0 - - - true - - - "Unnamed Entry Point" - - - True - - - - - - false - - - false - - - true - - - false - - - true - - - false - - - false - - - true - - - 2953567917 - - - false - - - - - - - - - - - - 2 - -
-
-
- - - Test UUTs and Single Pass call this callback in their cleanup step group. It is empty in the model file. Override this in the client file to perform an action after all code in the model executes and just before the execution completes. - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> - - - - - -
@@ -7423,15 +6707,9 @@ -
- - - - - - false + true @@ -7471,15 +6749,15 @@ false + + false + true 2953567917 - - false - @@ -7504,11 +6782,8 @@ false - - NIScopeAcquireWaveform.pinmap - - + NIScopeAcquireWaveform.pinmap
diff --git a/examples/niscope_acquire_waveform/README.md b/examples/niscope_acquire_waveform/README.md index 7fede91a8..b0dd3d222 100644 --- a/examples/niscope_acquire_waveform/README.md +++ b/examples/niscope_acquire_waveform/README.md @@ -12,6 +12,10 @@ This is a MeasurementLink example that acquires a waveform using an NI oscillosc - Includes InstrumentStudio and MeasurementLink UI Editor project files - Includes a TestStand sequence showing how to configure the pin map, register instrument sessions with the session management service, and run a measurement + - For the sake of simplicity, the TestStand sequence handles pin map and session + registration and unregistration in the `Setup` and `Cleanup` sections of the main + sequence. For **Test UUTs** and batch process model use cases, these steps should + be moved to the `ProcessSetup` and `ProcessCleanup` callbacks. - Uses the NI gRPC Device Server to allow sharing instrument sessions with other measurement services when running measurements from TestStand diff --git a/examples/niscope_acquire_waveform/_helpers.py b/examples/niscope_acquire_waveform/_helpers.py index eeec62a20..66ba0d3fc 100644 --- a/examples/niscope_acquire_waveform/_helpers.py +++ b/examples/niscope_acquire_waveform/_helpers.py @@ -2,7 +2,7 @@ import logging import pathlib -from typing import Dict, NamedTuple, TypeVar +from typing import Any, Dict, NamedTuple, TypeVar import grpc @@ -48,23 +48,25 @@ def __init__(self, *, grpc_channel: grpc.Channel): pin_map_service_pb2_grpc.PinMapServiceStub(grpc_channel) ) - def update_pin_map(self, pin_map_id: str) -> None: + def update_pin_map(self, pin_map_path: str) -> str: """Update registered pin map contents. Create and register a pin map if a pin map resource for the specified pin map id is not found. Args: - pin_map_id (str): The resource id of the pin map to register as a pin map resource. By - convention, the pin map id is the .pinmap file path. + pin_map_path: The file path of the pin map to register as a pin map resource. + Returns: + The resource id of the pin map that is registered to the pin map service. """ - pin_map_path = pathlib.Path(pin_map_id) + pin_map_path_obj = pathlib.Path(pin_map_path) + # By convention, the pin map id is the .pinmap file path. request = pin_map_service_pb2.UpdatePinMapFromXmlRequest( - pin_map_id=pin_map_id, pin_map_xml=pin_map_path.read_text(encoding="utf-8") + pin_map_id=pin_map_path, pin_map_xml=pin_map_path_obj.read_text(encoding="utf-8") ) response: pin_map_service_pb2.PinMap = self._client.UpdatePinMapFromXml(request) - assert response.pin_map_id == pin_map_id + return response.pin_map_id class GrpcChannelPoolHelper(GrpcChannelPool): @@ -108,3 +110,63 @@ def get_grpc_device_channel(self, provided_interface: str) -> grpc.Channel: service_class="ni.measurementlink.v1.grpcdeviceserver", ).insecure_address ) + + +class TestStandSupport(object): + """Class that communicates with TestStand.""" + + def __init__(self, sequence_context: Any) -> None: + """Initialize the TestStandSupport object. + + Args: + sequence_context: + The SequenceContext COM object from the TestStand sequence execution. + (Dynamically typed.) + """ + self._sequence_context = sequence_context + + def get_active_pin_map_id(self) -> str: + """Get the active pin map id from the NI.MeasurementLink.PinMapId temporary global variable. + + Returns: + The resource id of the pin map that is registered to the pin map service. + """ + return self._sequence_context.Engine.TemporaryGlobals.GetValString( + "NI.MeasurementLink.PinMapId", 0x0 + ) + + def set_active_pin_map_id(self, pin_map_id: str) -> None: + """Set the NI.MeasurementLink.PinMapId temporary global variable to the specified id. + + Args: + pin_map_id: + The resource id of the pin map that is registered to the pin map service. + """ + self._sequence_context.Engine.TemporaryGlobals.SetValString( + "NI.MeasurementLink.PinMapId", 0x1, pin_map_id + ) + + def resolve_file_path(self, file_path: str) -> str: + """Resolve the absolute path to a file using the TestStand search directories. + + Args: + file_path: + An absolute or relative path to the file. If this is a relative path, this function + searches the TestStand search directories for it. + + Returns: + The absolute path to the file. + """ + if pathlib.Path(file_path).is_absolute(): + return file_path + (_, absolute_path, _, _, user_canceled) = self._sequence_context.Engine.FindFileEx( + fileToFind=file_path, + absolutePath=None, + srchDirType=None, + searchDirectoryIndex=None, + userCancelled=None, # Must match spelling used by TestStand + searchContext=self._sequence_context.SequenceFile, + ) + if user_canceled: + raise RuntimeError("File lookup canceled by user.") + return absolute_path diff --git a/examples/niscope_acquire_waveform/teststand_fixture.py b/examples/niscope_acquire_waveform/teststand_fixture.py index 7fe8a49ba..8d49eceaf 100644 --- a/examples/niscope_acquire_waveform/teststand_fixture.py +++ b/examples/niscope_acquire_waveform/teststand_fixture.py @@ -1,33 +1,50 @@ """Functions to set up and tear down sessions of NI-Scope devices in NI TestStand.""" +from typing import Any import niscope -from _helpers import GrpcChannelPoolHelper, PinMapClient +from _helpers import GrpcChannelPoolHelper, PinMapClient, TestStandSupport import ni_measurementlink_service as nims -def update_pin_map(pin_map_id: str) -> None: +def update_pin_map(pin_map_path: str, sequence_context: Any) -> None: """Update registered pin map contents. Create and register a pin map if a pin map resource for the specified pin map id is not found. Args: - pin_map_id (str): The resource id of the pin map to register as a pin map resource. By - convention, the pin_map_id is the .pinmap file path. - + pin_map_path: + An absolute or relative path to the pin map file. + sequence_context: + The SequenceContext COM object from the TestStand sequence execution. + (Dynamically typed.) """ + teststand_support = TestStandSupport(sequence_context) + pin_map_abs_path = teststand_support.resolve_file_path(pin_map_path) + with GrpcChannelPoolHelper() as grpc_channel_pool: pin_map_client = PinMapClient(grpc_channel=grpc_channel_pool.pin_map_channel) - pin_map_client.update_pin_map(pin_map_id) + pin_map_id = pin_map_client.update_pin_map(pin_map_abs_path) + + teststand_support.set_active_pin_map_id(pin_map_id) + +def create_niscope_sessions(sequence_context: Any) -> None: + """Create and register all NI-Scope sessions. -def create_niscope_sessions(pin_map_id: str) -> None: - """Create and register all NI-Scope sessions.""" + Args: + sequence_context: + The SequenceContext COM object from the TestStand sequence execution. + (Dynamically typed.) + """ with GrpcChannelPoolHelper() as grpc_channel_pool: session_management_client = nims.session_management.Client( grpc_channel=grpc_channel_pool.session_management_channel ) + teststand_support = TestStandSupport(sequence_context) + pin_map_id = teststand_support.get_active_pin_map_id() + pin_map_context = nims.session_management.PinMapContext(pin_map_id=pin_map_id, sites=None) with session_management_client.reserve_sessions( context=pin_map_context, diff --git a/examples/niswitch_control_relays/NISwitchControlRelays.seq b/examples/niswitch_control_relays/NISwitchControlRelays.seq index 59cf6527e..e5da0a9da 100644 --- a/examples/niswitch_control_relays/NISwitchControlRelays.seq +++ b/examples/niswitch_control_relays/NISwitchControlRelays.seq @@ -4649,1165 +4649,415 @@
- - + + - - - + + + + ResStr("NI_STEPTYPES", "ACTION_DESCRIPTION_NAME") + (("%ModuleDescription" == "") ? "" : ", %ModuleDescription") + + + ResStr("NI_STEPTYPES", "ACTION_DEF_STEP_NAME") + + + + + false + + + false + + + "" + + + ResStr("NI_STEPTYPES", "ACTION_MENU_ITEM_NAME") + + + "" + + + false + + + false + + + Action + + + + + + + <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> - + + + + + + + + + + + 8192 + + + 2 + + - - - - + + 3 + + + true + + - - + + + + + - - - - CommonSubsteps.dll - - - EditStatementStep - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='FCParameter' structureflags='0'/> - - - - - - Return Value - - - 3 - - - 4 - - - 2 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - context - - - 4 - - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - ThisContext - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - reserved - - - 0 - - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - 0 - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - changed - - - 0 - - - 4 - - - 2 - - - - - - 1 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - RunState.InitialSelection.SelectedFile.ChangeCount - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - + + + + + + - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - + + 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - + + - - - 1 - - + + + + + + + + true + + + + + + + + + + + + + + + + + + + + PreloadWhenExecuted + + + UnloadWithFile + + + Normal + + + None + + + 1 + + + true + + + false + + + false + + + + + + 0 + + + false + + + + + + 1 + + + + + + + + + 1 + + + 2 + + + 0 + + + true + + + Next + + + Next + + + + + + + + + + + + Next + + + Next + + + + + + + + + NoLooping + + + + + + + + + RunState.LoopIndex += 1 + + + RunState.LoopIndex = 0 + + + 0 + + + + + + + + + + + + true + + + true + + + true + + + true + + + 0 + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + - - + + - - - 1 - - + + + + + + 8192 + + 2 - - - 0 - - + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + true - - - Next - - - Next - - + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + - - + + - - + + - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - true - - - true - - - true - - - true - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - + + + 8192 + + + 2 + + - - 0 - - + + 3 + + + true + + - - - false - + + + + + + + + + + + + + + + + 1 + + + + - - - - - - - - + + + + + + true + - - - ResStr("NI_SUBSTEPS", "STATEMENT_EDIT_STEP_MENU_NAME") - - - true - - - true - - - - - - - - LocalizeExpression(Step.TS.PostExpr) - - - ResStr("NI_SUBSTEPS", "STATEMENT_DEF_STEP_NAME") - - + + + + + + + - - false - - - false - - - "" - - - ResStr("NI_SUBSTEPS", "STATEMENT_MENU_ITEM_NAME") - - - "" - - - false - - - false - - - NI_Miscellaneous - + + + - - - - - <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - ResStr("NI_SUBSTEPS", "STATEMENT_EXPRESSION") - - - LocalizeExpression(Step.PostExpression) - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - + + - - - - - StatementStep.ico - - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - + + + + 0 + + + + + + false + + + + - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - false - - - true - - - true - - - true - - - 0 - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - NIStepTypeControls.dll|NationalInstruments.TestStand.StepTypeControls.StatementTabInfo - - - - - - - - - - 0 - - - - - - false - - - - - - - + + - + DefaultLabVIEW|DefaultLabVIEWNXG|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template @@ -5821,1432 +5071,1429 @@ false + + Action + - + - - + + - - - - - ResStr("NI_STEPTYPES", "ACTION_DESCRIPTION_NAME") + (("%ModuleDescription" == "") ? "" : ", %ModuleDescription") - - - ResStr("NI_STEPTYPES", "ACTION_DEF_STEP_NAME") - - - - - false - - - false - - - "" - - - ResStr("NI_STEPTYPES", "ACTION_MENU_ITEM_NAME") - - - "" - - - false - - - false - - - Action - + + + + + 8192 + %#x + + + 1 + + + + + + + + + _notNamed + + + 7 + + + + + + + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + - - - - - <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - + + + + + + + + - - - - - - - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - + true - - - false - - - false - - + + + 3 + + - - - 0 - - - false - - + + - - - 1 - - + + - - + + + true + + - - + + 1 - - - 2 - - + + 0 - - - true - - - Next - - - Next - - - - - - - - + + - - - Next - - - Next - - + + - - + + - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - true - - - true - - - true - - - true - - - 0 - - - - - - - - - - + + + - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + <_NAME_IN_ATTRIBUTE_ typename='NI_PythonParameter' xsi:type='NI_PythonParameter' name='' classname='CPythonParameter' structureflags='131072'> - - + + _notNamed - + + 7 + + - - + + - - - 8192 - - - 2 - - + + - - 3 - - - true - - - - - - - - + - - - - - - + + + + + 8192 + + + 1 + - - - 1 - - - - + + + + + + + + 8192 + + + 1 + + + - - - - - - true - + - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + - - + + Return Value - + + 7 + + - - + + - - - 8192 - - - 2 - - + + - - 3 - - - true - - - - - - - - + - - - - - - + + + + + 8192 + + + 1 + - - - 1 - - - - + + + + + + + + 8192 + + + 1 + + + - - - - - - true - + - - + + - - -
- - - - - + + + 5 + - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - DefaultLabVIEW|DefaultLabVIEWNXG|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template - - - - - - - - - false - - - false - - - Action - - - - - - - - - - - - 8192 - %#x - - - 1 - - - - - - - - - _notNamed - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - + - + - - + + - - - - true - - - 3 - - - - - - - - - - - - true - - - - - - 1 - - - 0 - - - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ typename='NI_PythonParameter' xsi:type='NI_PythonParameter' name='' classname='CPythonParameter' structureflags='131072'> - - - _notNamed - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - + + + + + + - - Return Value - - - 7 - - + - - + + - - + + - - - - - - - 8192 - - - 1 - - - - + - - - - - 8192 - - - 1 - - - - - - - - - - - - 5 - - - - - - - - - - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> - - - - - -
- - - - - - - - ID#:1m8fotxw7RGuNrjdh1OqZD - - - Measurement\Measurement.ico - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 4 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - true - - - true - - - true - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - - - ni.examples.NISwitchControlRelays_Python - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='Obj'> - - - - - - - - - - - - false - - - 0 - - - - - - 0 - - - - - - - - - - - - relay_names - - - "SiteRelay1" - - - In - - - false - - - 0 - - - TypeString - - - 1 - - - None - - - - - - - - - close_relay - - - True - - - In - - - false - - - 0 - - - TypeBool - - - 2 - - - None - - - - - - - - - - - - - - - - - - ID#:Y5gFOYZ27RGuNtVZ8EufkC - - - ni_hourglass.ico - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 2 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - true - - - true - - - true - - - true - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - "Foo" - - - 12 - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - false - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - ResStr("NI_WAIT_STEP_TYPE", "TIME_TO_WAIT") - - - Evaluate(Step.TimeExpr) - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - + + CommonSubsteps.dll + + + EditStatementStep + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='FCParameter' structureflags='0'/> + + + + + + Return Value + + + 3 + + + 4 + + + 2 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + context + + + 4 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + ThisContext + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + reserved + + + 0 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + 0 + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + changed + + + 0 + + + 4 + + + 2 + + + + + + 1 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + RunState.InitialSelection.SelectedFile.ChangeCount + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + - - - - - - false - - - true - - - - - - - - - 0 - - - - - - 0 - - - 5 - - - - - - true - - - - + + + + + + + + + + + + + + + + + 0 + + + + + + + + PreloadWhenExecuted + + + UnloadWithFile + + + Normal + + + None + + + 1 + + + true + + + false + + + false + + + + + + 0 + + + false + + + + + + 1 + + + + + + + + + 1 + + + 2 + + + 0 + + + true + + + Next + + + Next + + + + + + + + + + + + Next + + + Next + + + + + + + + + NoLooping + + + + + + + + + RunState.LoopIndex += 1 + + + RunState.LoopIndex = 0 + + + 0 + + + + + + + + + + + + true + + + true + + + true + + + true + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + + 0 + + + + + + false + + + + + + + + + + + + + + ResStr("NI_SUBSTEPS", "STATEMENT_EDIT_STEP_MENU_NAME") + + + true + + + true + + + + + + + + LocalizeExpression(Step.TS.PostExpr) + + + ResStr("NI_SUBSTEPS", "STATEMENT_DEF_STEP_NAME") + + + + + false + + + false + + + "" + + + ResStr("NI_SUBSTEPS", "STATEMENT_MENU_ITEM_NAME") + + + "" + + + false + + + false + + + NI_Miscellaneous + + + + + + + <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + ResStr("NI_SUBSTEPS", "STATEMENT_EXPRESSION") + + + LocalizeExpression(Step.PostExpression) + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + StatementStep.ico + + + + + + + PreloadWhenExecuted + + + UnloadWithFile + + + Normal + + + None + + + 1 + + + true + + + false + + + false + + + + + + 0 + + + false + + + + + + 1 + + + + + + + + + 1 + + + 2 + + + 0 + + + true + + + Next + + + Next + + + + + + + + + + + + Next + + + Next + + + + + + + + + NoLooping + + + + + + + + + RunState.LoopIndex += 1 + + + RunState.LoopIndex = 0 + + + 0 + + + + + + + + + + + + false + + + true + + + true + + + true + + + 0 + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + NIStepTypeControls.dll|NationalInstruments.TestStand.StepTypeControls.StatementTabInfo + + + + + + + + + + 0 + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + false + + + false + + + + + + + + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> + + + + + +
+ - + - ID#:DdLjW4Z27RGuNtVZ8EufkC + ID#:1m8fotxw7RGuNrjdh1OqZD Measurement\Measurement.ico @@ -7598,142 +6845,51 @@ - - - close_relay - - - False - - - In - - - false - - - 0 - - - TypeBool - - - 2 - - - None - - - - - - - - - - - - -
- - - - - - - - true - - - - - 0 - - - true - - - "Unnamed Entry Point" - - - True - - - - - - false - - - false - - - true - - - false - - - true - - - false - - - false - - - false - - - true - - - 2953567917 - - - - - - - - - - - - 2 - -
-
-
- - - Test UUTs and Single Pass call this callback in their setup step group. It is empty in the model file. Override this in the client file to perform an action before any code in the model executes. - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> - - - - - -
- + + + close_relay + + + True + + + In + + + false + + + 0 + + + TypeBool + + + 2 + + + None + + + + + + + + + + + - + - ID#:CHEZyO1w7RGuNrjdh1OqZD + ID#:Y5gFOYZ27RGuNtVZ8EufkC - StatementStep.ico + ni_hourglass.ico @@ -7766,7 +6922,7 @@ - 0 + 2 false @@ -7844,13 +7000,13 @@ - FindFile(FileGlobals.MeasurementLink.PinMapFileName,True,FileGlobals.MeasurementLink.PinMapPath) + - false + true true @@ -7870,10 +7026,10 @@ <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - + "Foo" - + 12 @@ -7920,7 +7076,7 @@ - true + false @@ -7928,7 +7084,7 @@ - + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> @@ -7988,198 +7144,113 @@ - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - - - - - - - - - ID#:fhWpfuRw7RGuNrjdh1OqZD - - - - - - - - - - false - - - 3 - - - 3.9 - - - .venv - - - - - - true - - - teststand_fixture.py - - - 1 - - - 0 - - - - - - - - - update_pin_map - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CPythonParameter' structureflags='0'/> - - - - - - Return Value - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - pin_map_id - - - 7 - - - FileGlobals.MeasurementLink.PinMapPath - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - + + + + + ResStr("NI_WAIT_STEP_TYPE", "TIME_TO_WAIT") + + + Evaluate(Step.TimeExpr) + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + - - - - - - 5 - - - - - + + + 1 + + + + + + + + + + + true + + + + + + + + + + false + + + true + + + + + + + + + 0 + + + + + + 0 + + + 5 + + + + + + true + + + + + + + + + + + ID#:DdLjW4Z27RGuNtVZ8EufkC + + + Measurement\Measurement.ico + @@ -8235,7 +7306,7 @@ 2 - 0 + 4 true @@ -8294,9 +7365,6 @@ - - true - true @@ -8461,16 +7529,121 @@ + + + + ni.examples.NISwitchControlRelays_Python + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='Obj'> + + + + + + + + + + + + false + + + 0 + + + + + + 0 + + + + + + + + + + + + relay_names + + + "SiteRelay1" + + + In + + + false + + + 0 + + + TypeString + + + 1 + + + None + + + + + + + + + close_relay + + + False + + + In + + + false + + + 0 + + + TypeBool + + + 2 + + + None + + + + + + + + + +
+ + - + - ID#:c5USoqlx7RGuNrjdh1OqZD + ID#:fhWpfuRw7RGuNrjdh1OqZD @@ -8513,10 +7686,10 @@ - create_niswitch_sessions + update_pin_map - + <_NAME_IN_ATTRIBUTE_ name='' classname='CPythonParameter' structureflags='0'/> @@ -8524,13 +7697,61 @@ - Return Value + Return Value + + + 7 + + + + + + + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + pin_map_path 7 - + FileGlobals.MeasurementLink.PinMapPath @@ -8546,7 +7767,7 @@ 8192 - 1 + 2 @@ -8572,13 +7793,13 @@ - pin_map_id + sequence_context 7 - FileGlobals.MeasurementLink.PinMapPath + ThisContext @@ -8594,7 +7815,7 @@ 8192 - 1 + 2 @@ -8910,16 +8131,166 @@ - + - ID#:7xzPK+Rw7RGuNrjdh1OqZD + ID#:c5USoqlx7RGuNrjdh1OqZD - StatementStep.ico + + + + + + + false + + + 3 + + + 3.9 + + + .venv + + + + + + true + + + teststand_fixture.py + + + 1 + + + 0 + + + + + + + + + create_niswitch_sessions + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CPythonParameter' structureflags='0'/> + + + + + + Return Value + + + 7 + + + + + + + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + sequence_context + + + 7 + + + ThisContext + + + + + + + + + + + + + 8192 + + + 2 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + 5 + + + + + @@ -9029,13 +8400,13 @@ - RunState.Engine.TemporaryGlobals.SetValString("NI.MeasurementLink.PinMapId", 0x1, FileGlobals.MeasurementLink.PinMapPath) + - false + true true @@ -9205,95 +8576,8 @@ -
- - - - - - false - - - - - 0 - - - true - - - "Unnamed Entry Point" - - - True - - - - - - false - - - false - - - true - - - false - - - true - - - false - - - false - - - true - - - 2953567917 - - - false - - - - - - - - - - - - 2 - -
-
-
- - - Test UUTs and Single Pass call this callback in their cleanup step group. It is empty in the model file. Override this in the client file to perform an action after all code in the model executes and just before the execution completes. - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> - - - - - -
@@ -9988,15 +9272,9 @@ -
- - - - - - false + true @@ -10036,15 +9314,15 @@ false + + false + true 2953567917 - - false - @@ -10069,11 +9347,8 @@ false - - NISwitchControlRelays.pinmap - - + NISwitchControlRelays.pinmap
diff --git a/examples/niswitch_control_relays/README.md b/examples/niswitch_control_relays/README.md index 221fa8221..2a9fe5a59 100644 --- a/examples/niswitch_control_relays/README.md +++ b/examples/niswitch_control_relays/README.md @@ -11,6 +11,10 @@ This is a MeasurementLink example that controls relays using an NI relay driver - Includes InstrumentStudio and MeasurementLink UI Editor project files - Includes a TestStand sequence showing how to configure the pin map, register instrument sessions with the session management service, and run a measurement + - For the sake of simplicity, the TestStand sequence handles pin map and session + registration and unregistration in the `Setup` and `Cleanup` sections of the main + sequence. For **Test UUTs** and batch process model use cases, these steps should + be moved to the `ProcessSetup` and `ProcessCleanup` callbacks. - Uses the NI gRPC Device Server to allow sharing instrument sessions with other measurement services when running measurements from TestStand diff --git a/examples/niswitch_control_relays/_helpers.py b/examples/niswitch_control_relays/_helpers.py index eeec62a20..66ba0d3fc 100644 --- a/examples/niswitch_control_relays/_helpers.py +++ b/examples/niswitch_control_relays/_helpers.py @@ -2,7 +2,7 @@ import logging import pathlib -from typing import Dict, NamedTuple, TypeVar +from typing import Any, Dict, NamedTuple, TypeVar import grpc @@ -48,23 +48,25 @@ def __init__(self, *, grpc_channel: grpc.Channel): pin_map_service_pb2_grpc.PinMapServiceStub(grpc_channel) ) - def update_pin_map(self, pin_map_id: str) -> None: + def update_pin_map(self, pin_map_path: str) -> str: """Update registered pin map contents. Create and register a pin map if a pin map resource for the specified pin map id is not found. Args: - pin_map_id (str): The resource id of the pin map to register as a pin map resource. By - convention, the pin map id is the .pinmap file path. + pin_map_path: The file path of the pin map to register as a pin map resource. + Returns: + The resource id of the pin map that is registered to the pin map service. """ - pin_map_path = pathlib.Path(pin_map_id) + pin_map_path_obj = pathlib.Path(pin_map_path) + # By convention, the pin map id is the .pinmap file path. request = pin_map_service_pb2.UpdatePinMapFromXmlRequest( - pin_map_id=pin_map_id, pin_map_xml=pin_map_path.read_text(encoding="utf-8") + pin_map_id=pin_map_path, pin_map_xml=pin_map_path_obj.read_text(encoding="utf-8") ) response: pin_map_service_pb2.PinMap = self._client.UpdatePinMapFromXml(request) - assert response.pin_map_id == pin_map_id + return response.pin_map_id class GrpcChannelPoolHelper(GrpcChannelPool): @@ -108,3 +110,63 @@ def get_grpc_device_channel(self, provided_interface: str) -> grpc.Channel: service_class="ni.measurementlink.v1.grpcdeviceserver", ).insecure_address ) + + +class TestStandSupport(object): + """Class that communicates with TestStand.""" + + def __init__(self, sequence_context: Any) -> None: + """Initialize the TestStandSupport object. + + Args: + sequence_context: + The SequenceContext COM object from the TestStand sequence execution. + (Dynamically typed.) + """ + self._sequence_context = sequence_context + + def get_active_pin_map_id(self) -> str: + """Get the active pin map id from the NI.MeasurementLink.PinMapId temporary global variable. + + Returns: + The resource id of the pin map that is registered to the pin map service. + """ + return self._sequence_context.Engine.TemporaryGlobals.GetValString( + "NI.MeasurementLink.PinMapId", 0x0 + ) + + def set_active_pin_map_id(self, pin_map_id: str) -> None: + """Set the NI.MeasurementLink.PinMapId temporary global variable to the specified id. + + Args: + pin_map_id: + The resource id of the pin map that is registered to the pin map service. + """ + self._sequence_context.Engine.TemporaryGlobals.SetValString( + "NI.MeasurementLink.PinMapId", 0x1, pin_map_id + ) + + def resolve_file_path(self, file_path: str) -> str: + """Resolve the absolute path to a file using the TestStand search directories. + + Args: + file_path: + An absolute or relative path to the file. If this is a relative path, this function + searches the TestStand search directories for it. + + Returns: + The absolute path to the file. + """ + if pathlib.Path(file_path).is_absolute(): + return file_path + (_, absolute_path, _, _, user_canceled) = self._sequence_context.Engine.FindFileEx( + fileToFind=file_path, + absolutePath=None, + srchDirType=None, + searchDirectoryIndex=None, + userCancelled=None, # Must match spelling used by TestStand + searchContext=self._sequence_context.SequenceFile, + ) + if user_canceled: + raise RuntimeError("File lookup canceled by user.") + return absolute_path diff --git a/examples/niswitch_control_relays/teststand_fixture.py b/examples/niswitch_control_relays/teststand_fixture.py index bb0682f10..c1910da96 100644 --- a/examples/niswitch_control_relays/teststand_fixture.py +++ b/examples/niswitch_control_relays/teststand_fixture.py @@ -1,33 +1,50 @@ """Functions to set up and tear down sessions of NI-Switch devices in NI TestStand.""" +from typing import Any import niswitch -from _helpers import GrpcChannelPoolHelper, PinMapClient +from _helpers import GrpcChannelPoolHelper, PinMapClient, TestStandSupport import ni_measurementlink_service as nims -def update_pin_map(pin_map_id: str) -> None: +def update_pin_map(pin_map_path: str, sequence_context: Any) -> None: """Update registered pin map contents. Create and register a pin map if a pin map resource for the specified pin map id is not found. Args: - pin_map_id (str): The resource id of the pin map to register as a pin map resource. By - convention, the pin_map_id is the .pinmap file path. - + pin_map_path: + An absolute or relative path to the pin map file. + sequence_context: + The SequenceContext COM object from the TestStand sequence execution. + (Dynamically typed.) """ + teststand_support = TestStandSupport(sequence_context) + pin_map_abs_path = teststand_support.resolve_file_path(pin_map_path) + with GrpcChannelPoolHelper() as grpc_channel_pool: pin_map_client = PinMapClient(grpc_channel=grpc_channel_pool.pin_map_channel) - pin_map_client.update_pin_map(pin_map_id) + pin_map_id = pin_map_client.update_pin_map(pin_map_abs_path) + + teststand_support.set_active_pin_map_id(pin_map_id) + +def create_niswitch_sessions(sequence_context: Any) -> None: + """Create and register all NI-Switch sessions. -def create_niswitch_sessions(pin_map_id: str) -> None: - """Create and register all NI-Switch sessions.""" + Args: + sequence_context: + The SequenceContext COM object from the TestStand sequence execution. + (Dynamically typed.) + """ with GrpcChannelPoolHelper() as grpc_channel_pool: session_management_client = nims.session_management.Client( grpc_channel=grpc_channel_pool.session_management_channel ) + teststand_support = TestStandSupport(sequence_context) + pin_map_id = teststand_support.get_active_pin_map_id() + pin_map_context = nims.session_management.PinMapContext(pin_map_id=pin_map_id, sites=None) with session_management_client.reserve_sessions( context=pin_map_context, diff --git a/examples/nivisa_dmm_measurement/NIVisaDmmMeasurement.seq b/examples/nivisa_dmm_measurement/NIVisaDmmMeasurement.seq index 5458bb43b..640202f7c 100644 --- a/examples/nivisa_dmm_measurement/NIVisaDmmMeasurement.seq +++ b/examples/nivisa_dmm_measurement/NIVisaDmmMeasurement.seq @@ -1670,37 +1670,31 @@ E@=3DJC4100hYLECF=_K@0@mKCYo_1KN:<Ta239hF9[gHbEVFDfRINZfQ01CkaUMk5=k`[c;[42MMF9aiNliecVfMFCLXi_`f2H7c\G\X50M=Z4S4aT2QI>A^D:d1\PCI`L11RlV5bM5AIZTc9STI5Mkg<bHlle[O=CL_KEgb?8RiVHS7QmPY@S4X^7I58A@kPaKcPWCOC1;DBf61lViY=]`28BC\B_mEf20ZJS@W@GDDRffLe\Ci;aKbN>i5P_4ScVVBTjIIfn0j8l<e6IcMbZHgCI;n8CRlR7<YcK0@cY[8aDHj=GGkNK;C?KC?b=]mMejoc1gGol1>hL6lf5fZ92?Ia@l1;QL024f^NSm2MhNlcFg_YR[l5kclo:einXehbR>98[4?GC:CX[3hm\UMob2aIMT0eJmgI@\;njRK9]fIl_8f=d]n4bQcRXDEl<o=@Yiik\3Md@?k1=0Joj>?Je`<RUd<JYmeOnOgB3G@Ub\FoGFgIQmQli8nGH=QjKD9i`2nf41XEKj;oDB8iZU`@XP^KWoAKEbOf:ViVAl=_I37KJSec7Ea\nJ5]NZj\OnJF;ASQemRIDbbdglb\U>H[O^bDHO?XMLaOoeVCf=a^CC`d8^TX2B E@=3@J\4110h]L]Mg[cK3fBoj\Kifo1C[KY_3VgFm3_6n>DfdTDgjaSF_LdVUJaY::FII@T:GB9LaYOo80OP^053LBBVb1G?:50k4;P1c\^`03ffoj9S72=AOm;a2oh?Na\lC7TUOXcNfaSdfIbVCC_ao20aN9bmo_<R_S=>KV;lhbmh89SY[:2UflXcmGIlnngoE]\\ad_6_gW8X9GAXJSPJYin>C71=c74a79JN<`GPK]_\>2`h9IOC]VA5BU4AMW1Qc`j?lJ\aR4__>R4SI_`[_mmnM33ONg`3P[g4N5aSF;ce]^eVffg6>cIRLhI]7CjE^W[jW`kZkGEWHk1=RR;gTe:O[H;k[bAd7UCaTVXgjlho3Af>?oIJdjMo>3=o;aTo\ZZnG9_cgcO7mjV^k>\:gkoOkSn1jkfm@MgLnb<Amg;\Nmj8klk3llhhnW>nn^GCW_fW_>ji]:Va>TNnNQdK5LolNX?M@\6jN2ddlIHh=MT1E^[o4Q7I54R=RlVg[S\KmOe9GM:Qeh9OnUhWTeC^ZM7SAGP1V=LZ4[i\cOmoH[RS6YBL2L\PAg][JQ<Eo?8;D9Mk3M]>N^6>HgJ]KP^a>cfBkkmZ33RdU`]jB_NIOShWL4oDlbn3lNOCL??R7GCmKaTDhekoi_En`9oJKe<e1`lBjmjXJ<^4_^_^>?7O?nEE_WTY:VYEc]3^eJm^cdC7;LcK_]Ei>b<^`9HR6YcO>l@Amg>PLXQbSb^=?FXRUZd<[n<SGjgCQ`mhTl;7NUbgaRQBkXNY4iX5iAJX6C`gdG[d3d>`Uj3DPMF7h71WBBLLR>Tk9dZlFCYSi__fNBBT`C;A>jeP2CdONN52i5^eBEIEI=8EMHBBe^G^1ohD6>LRiJgM\IPYE8Wn`T9W@jf8iEfN:@L3<Ha_l0CCE<HOJjXBRll_NLReo_^K7CQWihL<B1::YXdSaG<XFnCP94dQXb;^6V07F>TkPem>4QI;?9JkF`g80:`G?AULFSY^XW;4XL^_D=GZV9VVODS^[=]dL]b=N;O[ib6]2aLATM7\AcX=JH<\1j8_?I9_VUO]5;PKjdi^o>Kn=FbmhAmF3EXh?dAPF?cWPU;NHFT9YBblF15fj0n]RK9>d;@lD9HXLGTZOAa;gEd6:MElAPOkOoMom`hnaYko^ne_;PeC\`kMYOoCalP3DR_^NADNSV6R1Nk4f?=Lo;VQ>7>fR@=2j8C:;D@3fk>^=YHE^PQ1fU>TFoNH>GnfRGNMNW`[okK`S56RJfM4Zmo^6E9ZYc>FNEO3PO=T9eK0:bgljYdR7WooKS9eTjd@bcImNVZ8UXa:AC_F_WCj]4\6ST<:ie_AbZFIL7UmlIne:BcTQ5T2U]O2goYWXRN5F8oeQT^`HXPD=2LV[h;ibbNNj1kU]lXlnX4ACO5aRA@TfHY77@P?L=_N@4^cJG;Wi2@3M5OQ:^@>2K9_9W:4Vn1LGaRN@WL9AFFVg1oYHdi`54XIa5G[\i>iPT4506XA7h2^c_T`3d[ARdFICaAS2RM:1KgT7B>MhXVaI<kA^@CX2aS^I:B>=W<U?l<DWU<Jd7^cKe2R]EdIBcBQZni_K1JPCEhV>VH]FBZ<5413k[U]MAFA`Ohma2g2NoU0@E;FI93Yi;RjnlScC;`glEaH^X@K[NY9Y1EUZc6V6\3?FKC0APU0^[aP:_GMI=eeWnJ<6e2]@;AXaAE<S[lhAb`XFjPP@dTXNYS=<568je\`W3?@gn9HDaM84^>SDl0<Ba6YNKCeYZ\CUU?WGnR4=m^aN[KTlFG\?VZ[MC:3HfflAagl\jZUG@ScZW:2K\FU9TQa<h;?iYb<RJI66IEg<WHgdkU:\KFIZG\BDU=9W>:\:W7nM3NIjXT;2YV[@dDaY3bhOQY^af<UVo:ZV^^@0d_M5ObRQ2PIHZ9bbbGm;4Z\KEfEYI=M];D@9j1kZ@2@FIkf9:\CYe5KnKANXH7R@eMc2M;Pl]PZG]@4h2Q7OY:=QFh@\Y6]E6X1bL6mjS76a`JS=H=XQReG6Djb7[c<h@S5UCX4`ABLQ4:ZZ7=JF9JejC5\[T:meE5_[:`Qm=DfI0EDQLRH6o]LAPRXlbTgXSbnW7ZTN?N]lH02JKm;Z4hn<A[89:C8lM5hC]Ab^\\WNK7JGS]XainLm:PWFF3EmC15\]YC\D;I6a<NiIhd2GMIG`A9\[]T00fP:UXIXSHk2jI>XFG>I521bbKDA`Xb]h>oAl>IolbRB7j=i9_H89<FR=U572U\LjNhnkeeemHDJJ\GHX\;J51M<?QV2DneREAR3in6<M75M_Re=Ci3gEOQ2VO`4P8_hfhSO\dZ7m]n\hlV6gSlSC@PoZSe8WUaY3d0_;Z=9H:I6Gf2PVG`mf8CC87@DBlT62^h6QFFhZF64BJ46@Dh<T1=C]0_9J?073S@61ADIUT31<mVE<W?R@RBUJP`@;50X2Bh618KM^bf033T033D?NM@P`?0\dBA3A8AXF0]@KnP[5<EDfUICcBF^EZT=:cWKBKYTDKXD=<A:mkNB7LFDHC9b7nG57NFZ1]Ubo]8]0MN]YWJJ>eS42I?===3_n_?J=384=Go8e^0mdmBiTjRaf;F@8M4_gCZSGQ3cUUnF6J_R9WJV0PNaTJDk<RiWS6=>Rf9EmM:WgL4LHg5oH[aMbbOlnI6b`9KZ^Z]oAdeH\@YgaV8ChHTKjEVA]a^YN<;71CAbR\<jAYI\\Y<R\`1AOol`j1>53?d8MV_@kAN_W4nIdKc0gRYHEo`]U?HWN?0<?l2h:ZC\>^D]Ug4FNZl123fNoZ7fLRB[_HR6O>BaoomWl_8YS0Q\8;RB]@j=GIIe]J<AT[;1I<5ZJ\?Va5g?>7hXgcbU4V=lT>nV[28JKeQJ5QX4^WD3MfTBIBPKU57e>[FRd>_EeSHJhDa4hM9S9TUlOR=KWn]eAJ]W5VROh9ak`n5<LV6L9d<0`?fk]J8FW52OlL2i<L1kO=mGBf9e:\`^[_J:F>7o0_9mGc_`=KP@SW_^NU525JcQcEGhR8Da3gf4mJ?R6a2lLPKjL:TlfL8iHOKf:Mjeb\>Xb3>0kM@iNkaifYHDFNIKP\e^;bhg@V<g0Za7F]R=JKPMgdg>nYaMSb8MAV0o05XKjM5<5^V=albT\<868hhl^jHPRa0KcT4i[31chfOeGW>;``>>I;B:YafYW>jW_7D1>9_X14U9VXJ5E_PA2ZPb>n6eBLcN]SU4eSd<IDGD4D5WHMlFCU0DeARScb:h\?EC1>IBWead>7F>FeBea\oCS]jf@kE47ZHcB?TlP6_K[QC2@_N>ilNn0VdgZE>Z98hXCHa4bNUM16M74Q;DhldmcZ>V?_TG1J?NI:F8<aomhdPX5^AEe6BRYle4clf_gSb6D9LaD2h]ij8SAH@[`J@cb2G7ee@iZWl2A>`Ga95FDhJo7Xo>Zd3[jL<DQ4OILX9a;0T\SUDWY:Bh>WGNb:dHQ[S`[8:1L:F@>H[49RQ6_3QV<UT0oIITF^H_\X=:<42`N``YjM75HWEd]5O`<EX89FTP`^oN:QHgED5k:\CaYbA2GbD1;X5:N;?SoLhVhR`R_9lg3hU4n:I`2Gn:IjDHED]5i=2fcTklTK1H6k4HjK;HBM>;c]9;i[MFD?WaY1O]oS293kLd9S3N6He?:_QKEcBGLOc:jB6H@fR]h]HGB5;:<RE<`3K4Ibi29dR;nU<<TKBRnTdK[ZTT6oiOVVXKgaP6<lMTO_JC\0<RY5NkR352<FbcCB<_3?0XjQ`BJP;OJR::8eHFb3<;M\9FOC8T:MkD:Z;C=eb^0:AMSbSY_^Lc=SGbD5WDh@6j]PCDc@;\X1Nb\[`Z0W_Th5<HD4CafYghb`T95Ko571]SZJDHF2eE<7jViL_\8TQ@dFRo]`G[h3>862l:2F[UU6dVbFjU?NI>OHOk>JNcFNU[mXi]iJ[neWQ\mWa]i[e?IkO^Mf]LHTP[G3?43M8g^Wh``lW3kBT7ADM6b_IUCIPO=C8g5@?9R3<hilXNY7_<THNN<KMLm;eGM6_A6AUDB\c5Q;S2POniP9[mdEeIDnO7;T7Nia2nFN\L2XZIP?ZJKW\2cK0U5fb[dLn?[C>YAMXfVFic02OQA\6LHEk0oBd0f;`kR1hImAUl:@I;^:oFJUF?mDgPlLokm]OIgenn9;n5[Oh3g7@W7OWBCk9X1mYDPF9AQ4LOGeM_D_WR?I7QRlVEmN_0QlA9^lO[HjnfngGjkHokO\A35=_4hVU^jKm;\?Y9^B=RkTG1I<6nI`AQ_kJ;of[GmIi[g0]1\UG_FKUnX]ZcGmoI;NUdDFOolHn;NbMLkT`1GEo;j63N_8b_O`PQ[KRjb<NDHW4;\lT[Ila;nMd`56_c\C25fJLUS;9fn@6[[SMIBBMFK\8d;ZIRSI;fJ5_cojWSIfcY2kNd1jkS0f9A3BNfk8W1m4H0gRbfA3J6Q726nmNm4PQYcWZ___NEf_FmmmOm40IZ1mf4PmS?H8k>=J3g<\1K6j;CNTGZ8kY61mk30RLUO`T`_H`Hg<`\K67=HJ3g<\3K6iGRVO9``_1H`L`\K6`f=371ikY61mf30S<W]K86enT`_H`Hg<=fbaLQO`c@<hK;Rmmf>KT=]4\mm;NkW]^mcFgV[_]l=8aHk_j]MgIEYV5XJkiW]l^^CKnYn2OgNJ0g<fR\mWo;?JNcFN^cfL_eWZ[Eff[LeWebL[d?YfWFm3O0neW6m3NP3nGQ@G_M?lS61c3KG?`NUXHYTJ?j1SoC7V>RGj_]d[blRO_M^Qg>f_[0oQJWgg`CkhXXJ\hG;1Ujg`4MNjIg_6l3GG;oohYSNBallm3eZnFmebBeaLSDIS17WJfDBN9nUo^n2oC_;Q\;4O3WWk7mAZI17;2]ChHfZeJ;I\fY;^dB\J;NW@cEDj]HE]B8GSiKJgN9M6f4UIKhV02kFjYnXXBH9lF?3gDC<EC`d=4l<aIYa?]YS<9Zl8]AkXcPg:6L69WWX^8R2;YXfC<Xg6AQg@oOoChH=41ln]AG?J3U0Wn>8[8cdWGUnL2Z>Ll4HaNcI<f]SiWCVXSMeP?^a7:Tf<`L3cKdmDl7?Uj>FnPG5NSQBkHE`Yj>ZNQ^;UbDk0kCT]3]YV<50o<2<aTY7THb5hg;3^hl@GYRZE@mbL?5gdHJNW5`6W8[eho^38?;R459L4WN1Jg[egNX[3[_>lAAY>L9Z_H5YN]9:KZMj\cPGZco]??=ig[hH7YShgPS8:44leI:@9R?fLHKlH6UZ]nlAXHFAFUn7AdT=;FK^oZgocoK[2W_=Aj]T;2mBd8`7h`B0K>IP<04@S6]dA9N`8Q8YBk19T@8RFF4T29OB1V7TX7QM01@hI@3`QJ=4@H\nBkS2d5P1BDgN8?4B230Y8lb8ONC@?IPH0A@OMPD?HZ@1`>mj`5N5c60PN06hNI1c8`@k6b0M9IN3`QM68;M1l5Bl>6cX>XD78V@S2j5Ad;C<0cA7OX0nM8<iaN3K0@0Kil664BNSOe:0@R=6NA66f9@PX0d0dHb:LL\6@1aSJl[5h6I38X<0`;0<Al748MXb84H=@Y<lI\5@GNMD;RJd?DeY0Ac1J230g>d1e00LP8d;>V@59CQA1BG<@2[2A45hE8CX:H0A=a\KRAC<Q0YPRb5D<IR63P1QX<JXCS9a3FQ>daQVRjO4I;1da1URZ;LZ444@R2PX2XAXA9Te@FngkoKI_ea>NZN^m\`1H5CMhX9Bn1?ZYS0WAbR2RD8F3W@XajF1=AXS6<TS4i09PN?`gPUG9G3J26`2GbAW]jGY5<AGn^iZAjM_;W5<g^kKMC]B[X13GZm3mmNffKMhb:cJ]DAT>a?_4H8jZX2PIja6[DFTFC:]l]=1AN=PD`VJ>HX2k?Pj7:bQ`W[XWe0\38<V=I\:]2HOl74S6e0a;ZmCFf:3FnRcED67[hUWZPU7ZZKLUVD\PFX_FVE23Q7WUaWV=U><ZRLQB8LDd0hS94OC1D?6J9N:\\`US2k:iaJY8jY]eTVWO0KLeICMh3dn\dH86aYA7eY]eZZ3=d6WJLE7IPEWIe=_c4FYLEhdA\b5XoJQE;n[HFdKI7C3oK`RFK6l`B8RhhCXhP8XnP3841548PB6P6B[DKHS41JU<Qne:U\ARQ=B[VDHSOT307XA07Qhn2d8RBoajKU>9P@S2lYle3RId0IIf072nP8>;NUah=0ilGD:G5\RN_\=;5jTD@iTfQNGIfmQJ2oJl[SBFC]DLncWBE4mFZe6d_Ob>3YC4APEA@D_mOFNI8ALek79bT>:a8]EjYToY<]8C`FV4Z``X`1aB@L<?V9ARCQ4c:K71jA4o8X@_N2@;?hf9D0M0]D;:A]?]T5@Y1`>Vi=L5H`I25YCYJTF@F?fd@VbI9Pf6?dDZY8JdAcR`QM5>MT<aOnO7<DiRiB;\k?RRIHVCkC<FWi=5fXF\he2n@Q>2TEkZIo6kBK3\C@]3\oE]=7UY8knVi7O5=^_a6d;G^?DaLI=YY]ARAc7NRDMhAYZlK90=KQlem6G@;;lecBDFecfKNA=H>mJl3I59=NFgn`nf[B1:05f5E[`fiTPQ4EDe1H=4ZRWkf3TWlOP>Ela5hZDn]cQJC=UBXIIJdWiR@KZe]DHRbmfI;]VYoi>o?3K1h=6 - - + + + + + - "%ModuleDescription" + ResStr("NI_STEPTYPES", "ACTION_DESCRIPTION_NAME") + (("%ModuleDescription" == "") ? "" : ", %ModuleDescription") - ResStr("NI_STEPTYPES", "EDIT_DEF_SUBSTEP_NAME") + ResStr("NI_STEPTYPES", "ACTION_DEF_STEP_NAME") - - - - - - - - false - - + - true + false - true + false "" - ResStr("NI_STEPTYPES", "EDIT_SUBSTEP_MENU_ITEM_NAME") + ResStr("NI_STEPTYPES", "ACTION_MENU_ITEM_NAME") "" @@ -1712,16 +1706,10 @@ false - EditSubsteps + Action - - - - - DefaultLabVIEWNXG|DefaultLabVIEW|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template - @@ -1785,7 +1773,7 @@ - + @@ -1793,7 +1781,7 @@ - + @@ -1849,21 +1837,21 @@ 2 - 4 + 0 true - + Next - + Next - + - + @@ -2067,7 +2055,7 @@ - + 0 @@ -2086,26 +2074,32 @@ - + - - false - - + + DefaultLabVIEW|DefaultLabVIEWNXG|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template + + - - + + + + + false - - + + false - + + + Action + - + - - + + @@ -2118,62 +2112,26 @@ 1 - + - - + + _notNamed - 0 + 7 - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ typename='Expression' xsi:type='Expression' name='' classname='ExprValue' structureflags='131072'> - 1024 - - - - - - 1024 - - - 0 - - + - - + + - - - 0 - + - + @@ -2186,7 +2144,7 @@ - + @@ -2201,80 +2159,70 @@ - - - - - + - - + + - + - + + true + + + 3 + + - - + + - - + + + + + + true + + + + + + 1 + + + 0 + + + + + + + + + + + - <_NAME_IN_ATTRIBUTE_ typename='FCParameter' xsi:type='FCParameter' name='' classname='FCParameter' structureflags='131072'> + <_NAME_IN_ATTRIBUTE_ typename='NI_PythonParameter' xsi:type='NI_PythonParameter' name='' classname='CPythonParameter' structureflags='131072'> _notNamed - 0 + 7 - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - + - - + + - - - 0 - + - + @@ -2287,7 +2235,7 @@ - + @@ -2302,66 +2250,27 @@ - - - - + Return Value - 3 + 7 - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - + - - + + - - - 0 - + - + @@ -2374,7 +2283,7 @@ - + @@ -2389,2902 +2298,1974 @@ - - - - + - + + + 5 + - - - - - - - - - - - - - - - 0 - + - + - - + + - - - - + + "%ModuleDescription" + + + ResStr("NI_STEPTYPES", "EDIT_DEF_SUBSTEP_NAME") + + + + + + + + + false + + + + + true + + + true + + + "" + + + ResStr("NI_STEPTYPES", "EDIT_SUBSTEP_MENU_ITEM_NAME") + + + "" + + + false + + + false + + + EditSubsteps + + + + + + + + DefaultLabVIEWNXG|DefaultLabVIEW|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template + + + + + <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> - + + + + + + + + + + + 8192 + + + 2 + + - - - - + + 3 + + + true + + - - + + + + + - - - - CommonSubsteps.dll - - - EditStatementStep - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='FCParameter' structureflags='0'/> - - - - - - Return Value - - - 3 - - - 4 - - - 2 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - context - - - 4 - - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - ThisContext - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - reserved - - - 0 - - - 4 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - 0 - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - changed - - - 0 - - - 4 - - - 2 - - - - - - 1 - - - 0 - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> - 1024 - - - - - - 1024 - - - 0 - - - RunState.InitialSelection.SelectedFile.ChangeCount - - - - - - 0 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - true - - - true - - - true - - - true - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - ResStr("NI_SUBSTEPS", "STATEMENT_EDIT_STEP_MENU_NAME") - - - true - - - true - - - - - - - - LocalizeExpression(Step.TS.PostExpr) - - - ResStr("NI_SUBSTEPS", "STATEMENT_DEF_STEP_NAME") - - - - - false - - - false - - - "" - - - ResStr("NI_SUBSTEPS", "STATEMENT_MENU_ITEM_NAME") - - - "" - - - false - - - false - - - NI_Miscellaneous - - - - - - - <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - ResStr("NI_SUBSTEPS", "STATEMENT_EXPRESSION") - - - LocalizeExpression(Step.PostExpression) - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - StatementStep.ico - - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - false - - - true - - - true - - - true - - - 0 - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - NIStepTypeControls.dll|NationalInstruments.TestStand.StepTypeControls.StatementTabInfo - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - false - - - false - - - - - - - - - - - - ResStr("NI_STEPTYPES", "ACTION_DESCRIPTION_NAME") + (("%ModuleDescription" == "") ? "" : ", %ModuleDescription") - - - ResStr("NI_STEPTYPES", "ACTION_DEF_STEP_NAME") - - - - - false - - - false - - - "" - - - ResStr("NI_STEPTYPES", "ACTION_MENU_ITEM_NAME") - - - "" - - - false - - - false - - - Action - - - - - - - <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - true - - - true - - - true - - - true - - - 0 - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - DefaultLabVIEW|DefaultLabVIEWNXG|DefaultCVI|DefaultVB.NET|DefaultCSharp.NET|DefaultC++.NET|DefaultVC++_Template|DefaultHTB72_Template|DefaultHTB80_Template|Default_Template - - - - - - - - - false - - - false - - - Action - - - - - - - - - - - - 8192 - %#x - - - 1 - - - - - - - - - _notNamed - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - - - true - - - 3 - - - - - - - - - - - - true - - - - - - 1 - - - 0 - - - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ typename='NI_PythonParameter' xsi:type='NI_PythonParameter' name='' classname='CPythonParameter' structureflags='131072'> - - - _notNamed - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - Return Value - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - 5 - - - - - - - - - - - - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> - - - - - -
- - - - - - - - ID#:1m8fotxw7RGuNrjdh1OqZD - - - Measurement\Measurement.ico - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 4 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - - - - - - - true - - - true - - - true - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - - - - 0 - - - - - - false - - - - - - - - - - - - - - - - ni.examples.NIVisaDmmMeasurement_Python - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='Obj'> - - - - - - - - - - - - false - - - 0 - - - - - - 0 - - - - - - - - - - - - pin_name - - - "Pin1" - - - In - - - true - - - 0 - - - TypeString - - - 1 - - - Pin - - - - - - - - - measurement_type - - - "DC Volts" - - - In - - - true - - - 0 - - - TypeString - - - 2 - - - None - - - - - - - - - range - - - 1 - - - In - - - true - - - 0 - - - TypeDouble - - - 3 - - - None - - - - - - - - - resolution_digits - - - 3.5 - - - In - - - true - - - 0 - - - TypeDouble - - - 4 - - - None - - - - - - - - - measured_value - - - - - - Out - - - true - - - 0 - - - TypeDouble - - - 1 - - - None - - - - - - - - - - - - -
- - - - - - - - true - - - - - 0 - - - true - - - "Unnamed Entry Point" - - - True - - - - - - false - - - false - - - true - - - false - - - true - - - false - - - false - - - false - - - true - - - 2953567917 - - - - - - - - - - - - 2 - -
-
-
- - - Test UUTs and Single Pass call this callback in their setup step group. It is empty in the model file. Override this in the client file to perform an action before any code in the model executes. - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> - - - - - -
- - - - - - - - ID#:CHEZyO1w7RGuNrjdh1OqZD - - - StatementStep.ico - - - - - - PreloadWhenExecuted - - - UnloadWithFile - - - Normal - - - None - - - 1 - - - true - - - false - - - false - - - - - - 0 - - - false - - - - - - 1 - - - - - - - - - 1 - - - 2 - - - 0 - - - true - - - Next - - - Next - - - - - - - - - - - - Next - - - Next - - - - - - - - - NoLooping - - - - - - - - - RunState.LoopIndex += 1 - - - RunState.LoopIndex = 0 - - - 0 - - - - - - FindFile(FileGlobals.MeasurementLink.PinMapFileName,True,FileGlobals.MeasurementLink.PinMapPath) - - - - - - false - - - true - - - true - - - true - - - 0 - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - - - - - - - - - - - 8192 - - - 2 - - - - - 3 - - - true - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - true - - - - - - - - - - - + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + PreloadWhenExecuted + + + UnloadWithFile + + + Normal + + + None + + + 1 + + + true + + + false + + + false + + + + + + 0 + + + false + + + + + + 1 + + + + + + + + + 1 + + + 2 + + + 4 + + + true + + + Next + + + Next + + + + + + + + + + + + Next + + + Next + + + + + + + + + NoLooping + + + + + + + + + RunState.LoopIndex += 1 + + + RunState.LoopIndex = 0 + + + 0 + + + + + + + + + + + + true + + + true + + + true + + + true + + + 0 + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + false + + + + + + + + + + + + + + false + + + + + + false + + + false + + + + + + + + + + + + 8192 + %#x + + + 1 + + + + + + + + + _notNamed + + + 0 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ typename='Expression' xsi:type='Expression' name='' classname='ExprValue' structureflags='131072'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ typename='FCParameter' xsi:type='FCParameter' name='' classname='FCParameter' structureflags='131072'> + + + _notNamed + + + 0 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + Return Value + + + 3 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + CommonSubsteps.dll + + + EditStatementStep + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='FCParameter' structureflags='0'/> + + + + + + Return Value + + + 3 + + + 4 + + + 2 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + context + + + 4 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + ThisContext + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + reserved + + + 0 + + + 4 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + 0 + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + changed + + + 0 + + + 4 + + + 2 + + + + + + 1 + + + 0 + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='ExprValue' structureflags='0'> + 1024 + + + + + + 1024 + + + 0 + + + RunState.InitialSelection.SelectedFile.ChangeCount + + + + + + 0 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + PreloadWhenExecuted + + + UnloadWithFile + + + Normal + + + None + + + 1 + + + true + + + false + + + false + + + + + + 0 + + + false + + + + + + 1 + + + + + + + + + 1 + + + 2 + + + 0 + + + true + + + Next + + + Next + + + + + + + + + + + + Next + + + Next + + + + + + + + + NoLooping + + + + + + + + + RunState.LoopIndex += 1 + + + RunState.LoopIndex = 0 + + + 0 + + + + + + + + + + + + true + + + true + + + true + + + true + + + 0 + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> - - 0 - - + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + - - - false - + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + - - - - - - - - - - - - - + + + + + + + + + + + + 0 + + + + + + false + + + + + + + + + + + + + + ResStr("NI_SUBSTEPS", "STATEMENT_EDIT_STEP_MENU_NAME") + + + true + + + true + + + + + + + + LocalizeExpression(Step.TS.PostExpr) + + + ResStr("NI_SUBSTEPS", "STATEMENT_DEF_STEP_NAME") + + + + + false + + + false + + + "" + + + ResStr("NI_SUBSTEPS", "STATEMENT_MENU_ITEM_NAME") + + + "" + + + false + + + false + + + NI_Miscellaneous + + + + + + + <_NAME_IN_ATTRIBUTE_ typename='NI_CustomResult' xsi:type='NI_CustomResult' name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + ResStr("NI_SUBSTEPS", "STATEMENT_EXPRESSION") + + + LocalizeExpression(Step.PostExpression) + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + StatementStep.ico + + + + + + + PreloadWhenExecuted + + + UnloadWithFile + + + Normal + + + None + + + 1 + + + true + + + false + + + false + + + + + + 0 + + + false + + + + + + 1 + + + + + + + + + 1 + + + 2 + + + 0 + + + true + + + Next + + + Next + + + + + + + + + + + + Next + + + Next + + + + + + + + + NoLooping + + + + + + + + + RunState.LoopIndex += 1 + + + RunState.LoopIndex = 0 + + + 0 + + + + + + + + + + + + false + + + true + + + true + + + true + + + 0 + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CustomResult'> + + + + + + + + + + + + 8192 + + + 2 + + + + + 3 + + + true + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + true + + + + + + + + + + + + + NIStepTypeControls.dll|NationalInstruments.TestStand.StepTypeControls.StatementTabInfo + + + + + + + + + + 0 + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + false + + + false + + + + + + + + + + + + + + + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> + + + + + +
+ - + - ID#:fhWpfuRw7RGuNrjdh1OqZD + ID#:1m8fotxw7RGuNrjdh1OqZD - - - - - - - - false - - - 2 - - - 3.9 - - - .venv - - - - - - true - - - teststand_fixture.py - - - 1 - - - 0 - - - - - - - - - update_pin_map - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='CPythonParameter' structureflags='0'/> - - - - - - Return Value - - - 7 - - - - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - - pin_map_id - - - 7 - - - FileGlobals.MeasurementLink.PinMapPath - - - - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - 8192 - - - 1 - - - - - - - - - - - - 5 - - - - - + Measurement\Measurement.ico + @@ -5340,7 +4321,7 @@ 2 - 0 + 4 true @@ -5399,9 +4380,6 @@ - - true - true @@ -5566,16 +4544,211 @@ + + + + ni.examples.NIVisaDmmMeasurement_Python + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='Obj'> + + + + + + + + + + + + false + + + 0 + + + + + + 0 + + + + + + + + + + + + pin_name + + + "Pin1" + + + In + + + true + + + 0 + + + TypeString + + + 1 + + + Pin + + + + + + + + + measurement_type + + + "DC Volts" + + + In + + + true + + + 0 + + + TypeString + + + 2 + + + None + + + + + + + + + range + + + 1 + + + In + + + true + + + 0 + + + TypeDouble + + + 3 + + + None + + + + + + + + + resolution_digits + + + 3.5 + + + In + + + true + + + 0 + + + TypeDouble + + + 4 + + + None + + + + + + + + + measured_value + + + + + + Out + + + true + + + 0 + + + TypeDouble + + + 1 + + + None + + + + + + + + + +
+ + - + - ID#:c5USoqlx7RGuNrjdh1OqZD + ID#:fhWpfuRw7RGuNrjdh1OqZD @@ -5618,10 +4791,10 @@ - create_nivisa_dmm_sessions + update_pin_map - + <_NAME_IN_ATTRIBUTE_ name='' classname='CPythonParameter' structureflags='0'/> @@ -5629,13 +4802,61 @@ - Return Value + Return Value + + + 7 + + + + + + + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + pin_map_path 7 - + FileGlobals.MeasurementLink.PinMapPath @@ -5651,7 +4872,7 @@ 8192 - 1 + 2 @@ -5677,13 +4898,13 @@ - pin_map_id + sequence_context 7 - FileGlobals.MeasurementLink.PinMapPath + ThisContext @@ -5699,7 +4920,7 @@ 8192 - 1 + 2 @@ -6015,16 +5236,166 @@ - + - ID#:7xzPK+Rw7RGuNrjdh1OqZD + ID#:c5USoqlx7RGuNrjdh1OqZD - StatementStep.ico + + + + + + + false + + + 2 + + + 3.9 + + + .venv + + + + + + true + + + teststand_fixture.py + + + 1 + + + 0 + + + + + + + + + create_nivisa_dmm_sessions + + + + + <_NAME_IN_ATTRIBUTE_ name='' classname='CPythonParameter' structureflags='0'/> + + + + + + Return Value + + + 7 + + + + + + + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + + sequence_context + + + 7 + + + ThisContext + + + + + + + + + + + + + 8192 + + + 2 + + + + + + + + + + 8192 + + + 1 + + + + + + + + + + + + 5 + + + + + @@ -6134,13 +5505,13 @@ - RunState.Engine.TemporaryGlobals.SetValString("NI.MeasurementLink.PinMapId", 0x1, FileGlobals.MeasurementLink.PinMapPath) + - false + true true @@ -6310,95 +5681,8 @@ -
- - - - - - false - - - - - 0 - - - true - - - "Unnamed Entry Point" - - - True - - - - - - false - - - false - - - true - - - false - - - true - - - false - - - false - - - true - - - 2953567917 - - - false - - - - - - - - - - - - 2 - -
-
-
- - - Test UUTs and Single Pass call this callback in their cleanup step group. It is empty in the model file. Override this in the client file to perform an action after all code in the model executes and just before the execution completes. - - - - - - - - <_NAME_IN_ATTRIBUTE_ name='' classname='TEResult'/> - - - - - -
@@ -7093,15 +6377,9 @@ -
- - - - - - false + true @@ -7141,15 +6419,15 @@ false + + false + true 2953567917 - - false - @@ -7174,11 +6452,8 @@ false - - NIVisaDmmMeasurement.pinmap - - + NIVisaDmmMeasurement.pinmap
diff --git a/examples/nivisa_dmm_measurement/README.md b/examples/nivisa_dmm_measurement/README.md index aa96db2a0..488a8f4cc 100644 --- a/examples/nivisa_dmm_measurement/README.md +++ b/examples/nivisa_dmm_measurement/README.md @@ -11,6 +11,10 @@ and an NI Instrument Simulator v2.0. - Includes InstrumentStudio and MeasurementLink UI Editor project files - Includes a TestStand sequence showing how to configure the pin map, register instrument resources with the session management service, and run a measurement + - For the sake of simplicity, the TestStand sequence handles pin map and session + registration and unregistration in the `Setup` and `Cleanup` sections of the main + sequence. For **Test UUTs** and batch process model use cases, these steps should + be moved to the `ProcessSetup` and `ProcessCleanup` callbacks. - Demonstrates how to share instrument resources with other measurement services when running measurements from TestStand, without using NI gRPC Device Server diff --git a/examples/nivisa_dmm_measurement/_helpers.py b/examples/nivisa_dmm_measurement/_helpers.py index eeec62a20..66ba0d3fc 100644 --- a/examples/nivisa_dmm_measurement/_helpers.py +++ b/examples/nivisa_dmm_measurement/_helpers.py @@ -2,7 +2,7 @@ import logging import pathlib -from typing import Dict, NamedTuple, TypeVar +from typing import Any, Dict, NamedTuple, TypeVar import grpc @@ -48,23 +48,25 @@ def __init__(self, *, grpc_channel: grpc.Channel): pin_map_service_pb2_grpc.PinMapServiceStub(grpc_channel) ) - def update_pin_map(self, pin_map_id: str) -> None: + def update_pin_map(self, pin_map_path: str) -> str: """Update registered pin map contents. Create and register a pin map if a pin map resource for the specified pin map id is not found. Args: - pin_map_id (str): The resource id of the pin map to register as a pin map resource. By - convention, the pin map id is the .pinmap file path. + pin_map_path: The file path of the pin map to register as a pin map resource. + Returns: + The resource id of the pin map that is registered to the pin map service. """ - pin_map_path = pathlib.Path(pin_map_id) + pin_map_path_obj = pathlib.Path(pin_map_path) + # By convention, the pin map id is the .pinmap file path. request = pin_map_service_pb2.UpdatePinMapFromXmlRequest( - pin_map_id=pin_map_id, pin_map_xml=pin_map_path.read_text(encoding="utf-8") + pin_map_id=pin_map_path, pin_map_xml=pin_map_path_obj.read_text(encoding="utf-8") ) response: pin_map_service_pb2.PinMap = self._client.UpdatePinMapFromXml(request) - assert response.pin_map_id == pin_map_id + return response.pin_map_id class GrpcChannelPoolHelper(GrpcChannelPool): @@ -108,3 +110,63 @@ def get_grpc_device_channel(self, provided_interface: str) -> grpc.Channel: service_class="ni.measurementlink.v1.grpcdeviceserver", ).insecure_address ) + + +class TestStandSupport(object): + """Class that communicates with TestStand.""" + + def __init__(self, sequence_context: Any) -> None: + """Initialize the TestStandSupport object. + + Args: + sequence_context: + The SequenceContext COM object from the TestStand sequence execution. + (Dynamically typed.) + """ + self._sequence_context = sequence_context + + def get_active_pin_map_id(self) -> str: + """Get the active pin map id from the NI.MeasurementLink.PinMapId temporary global variable. + + Returns: + The resource id of the pin map that is registered to the pin map service. + """ + return self._sequence_context.Engine.TemporaryGlobals.GetValString( + "NI.MeasurementLink.PinMapId", 0x0 + ) + + def set_active_pin_map_id(self, pin_map_id: str) -> None: + """Set the NI.MeasurementLink.PinMapId temporary global variable to the specified id. + + Args: + pin_map_id: + The resource id of the pin map that is registered to the pin map service. + """ + self._sequence_context.Engine.TemporaryGlobals.SetValString( + "NI.MeasurementLink.PinMapId", 0x1, pin_map_id + ) + + def resolve_file_path(self, file_path: str) -> str: + """Resolve the absolute path to a file using the TestStand search directories. + + Args: + file_path: + An absolute or relative path to the file. If this is a relative path, this function + searches the TestStand search directories for it. + + Returns: + The absolute path to the file. + """ + if pathlib.Path(file_path).is_absolute(): + return file_path + (_, absolute_path, _, _, user_canceled) = self._sequence_context.Engine.FindFileEx( + fileToFind=file_path, + absolutePath=None, + srchDirType=None, + searchDirectoryIndex=None, + userCancelled=None, # Must match spelling used by TestStand + searchContext=self._sequence_context.SequenceFile, + ) + if user_canceled: + raise RuntimeError("File lookup canceled by user.") + return absolute_path diff --git a/examples/nivisa_dmm_measurement/teststand_fixture.py b/examples/nivisa_dmm_measurement/teststand_fixture.py index d7126d8fb..464d26cd0 100644 --- a/examples/nivisa_dmm_measurement/teststand_fixture.py +++ b/examples/nivisa_dmm_measurement/teststand_fixture.py @@ -1,7 +1,8 @@ """Functions to set up and tear down NI-VISA DMM sessions in NI TestStand.""" +from typing import Any import pyvisa.resources -from _helpers import GrpcChannelPoolHelper, PinMapClient +from _helpers import GrpcChannelPoolHelper, PinMapClient, TestStandSupport from _visa_helpers import ( INSTRUMENT_TYPE_DMM_SIMULATOR, create_visa_resource_manager, @@ -16,28 +17,44 @@ USE_SIMULATION = True -def update_pin_map(pin_map_id: str) -> None: +def update_pin_map(pin_map_path: str, sequence_context: Any) -> None: """Update registered pin map contents. Create and register a pin map if a pin map resource for the specified pin map id is not found. Args: - pin_map_id (str): The resource id of the pin map to register as a pin map resource. By - convention, the pin_map_id is the .pinmap file path. - + pin_map_path: + An absolute or relative path to the pin map file. + sequence_context: + The SequenceContext COM object from the TestStand sequence execution. + (Dynamically typed.) """ + teststand_support = TestStandSupport(sequence_context) + pin_map_abs_path = teststand_support.resolve_file_path(pin_map_path) + with GrpcChannelPoolHelper() as grpc_channel_pool: pin_map_client = PinMapClient(grpc_channel=grpc_channel_pool.pin_map_channel) - pin_map_client.update_pin_map(pin_map_id) + pin_map_id = pin_map_client.update_pin_map(pin_map_abs_path) + + teststand_support.set_active_pin_map_id(pin_map_id) + +def create_nivisa_dmm_sessions(sequence_context: Any) -> None: + """Create and register all NI-VISA DMM sessions. -def create_nivisa_dmm_sessions(pin_map_id: str) -> None: - """Create and register all NI-VISA DMM sessions.""" + Args: + sequence_context: + The SequenceContext COM object from the TestStand sequence execution. + (Dynamically typed.) + """ with GrpcChannelPoolHelper() as grpc_channel_pool: session_management_client = nims.session_management.Client( grpc_channel=grpc_channel_pool.session_management_channel ) + teststand_support = TestStandSupport(sequence_context) + pin_map_id = teststand_support.get_active_pin_map_id() + pin_map_context = nims.session_management.PinMapContext(pin_map_id=pin_map_id, sites=None) with session_management_client.reserve_sessions( context=pin_map_context,