
*ここではLabVIEW関連のファイルをテキストエディタで取り扱っています。ここでは参照するのみですが、編集もできます。しかし、編集によってファイルが破損するリスクがあります。これらの操作を行うことで、いかなる結果になっても責任は取りません。自己責任でお願いします。
CLA更新試験(CLA-R)のサンプル問題に次のような問題がありました。
- Which of the following is not a type of a project library?
e. Shared Variable
f. XControl
g. LabVIEW Class
h. StateChart
引用元:Certified LabVIEW Architect (CLA) *サンプル問題のダウンロードにはログインが必要
…選択肢がaではなくeから始まるのは仕様です。それより、StateChartって…今さらStateChartって…と思いますが、サンプル問題に歴史を感じるのも仕様です。CLA-Rでは問題を英語で出題するのが仕様です。生成AIによる自然な翻訳が可能な時代に、会社でもNigel AIをプッシュしているのに母国語への翻訳はしないと思われます。この問題を日本語にするとこんな感じでしょう。
- 次のうち、プロジェクトライブラリの仲間ではないのはどれ?
e. シェア変数
f. XControl
g. LabVIEWクラス
h. StateChart
同じ問題をペリテックさんも LabVIEW再設計者認定試験(CLA-R) | ペリテックSI で取り上げています。…共有変数と訳したかぁ。まあいいですね。答えは…
A:Shared Variable
です。…選択肢にAはないですし、しかも選択肢はすべて小文字ですが、Aが答えになっているのも仕様です。いずれにしても、シェア変数がこの問題の答えとなります。
とはいっても、なんでシェア変数が答えなのか?というのは公式でも説明されていません。暗記しないといけないのか?と言われると、ちゃんと暗記せずに確認する方法があります。今回はその確認をするために、LabVIEWプロジェクトをテキストエディタ+開発環境であるVisual Studio Code(VS Code)で見ていきたいと思います。
…まあ、シェア変数はライブラリの中のアイテムで、これ自体はプロジェクトライブラリ(あるいは、LabVIEW関係のファイルをパッケージするようなもの)ではないというだけですが。
LabVIEWプロジェクトをVisual Studio Code(VS Code)で開く
LabVIEWプロジェクト (.lvproj)
今回は、適当なLabVIEWプロジェクトのあるフォルダをVS Codeで開きました。こんな感じになります。

…プログラムでUTF-8対応したのは2026 Q3からなのに、エンコーディングはUTF-8だったのかぁ。UTF-8 with BOMで、日本語も文字化けせずに読めるはずです。
このLabVIEWプロジェクトはCLA-Rの対策用に各問題を実際に確認したVIやメモをLabVIEWプロジェクトにしたものです。実はLabVIEWプロジェクトはXML形式なので、テキストエディタで開いても人が読める形になっています。
LabVIEWプロジェクトの中身
<?xml version='1.0' encoding='UTF-8'?>
<Project Type="Project" LVVersion="20008000">
<Property Name="NI.LV.All.SaveVersion" Type="Str">20.0</Property>
<Property Name="NI.LV.All.SourceOnly" Type="Bool">true</Property>
<Property Name="NI.Project.Description" Type="Str"></Property>
<Property Name="varPersistentID:{028EA3F9-D685-4C99-A8B7-7D69236CCC81}" Type="Ref">/My Computer/Question/Q28/Q28.lvlib/Network Published</Property>
<Property Name="varPersistentID:{8D3A4576-5672-4EB8-BECA-4F534F0A3714}" Type="Ref">/My Computer/Question/Q28/Q28.lvlib/Single Process</Property>
<Property Name="varPersistentID:{9C2B2454-2411-4C8F-9C2B-0524C87561D6}" Type="Ref">/My Computer/Question/Q10/Q10.lvlib/Variable</Property>
<Item Name="My Computer" Type="My Computer">
<Property Name="server.app.propertiesEnabled" Type="Bool">true</Property>
<Property Name="server.control.propertiesEnabled" Type="Bool">true</Property>
<Property Name="server.tcp.enabled" Type="Bool">false</Property>
<Property Name="server.tcp.port" Type="Int">0</Property>
<Property Name="server.tcp.serviceName" Type="Str">My Computer/VI Server</Property>
<Property Name="server.tcp.serviceName.default" Type="Str">My Computer/VI Server</Property>
<Property Name="server.vi.callsEnabled" Type="Bool">true</Property>
<Property Name="server.vi.propertiesEnabled" Type="Bool">true</Property>
<Property Name="specify.custom.address" Type="Bool">false</Property>
<Item Name="Question" Type="Folder">
<Item Name="Q02" Type="Folder">
<Item Name="Q02.txt" Type="Document" URL="../Question/Q02/Q02.txt"/>
</Item>
省略
</Item>
<Item Name="Answer.vi" Type="VI" URL="../Answer.vi"/>
<Item Name="CLA-R Exam Prep. Guide Sample Exams_English.pdf" Type="Document" URL="../CLA-R Exam Prep. Guide Sample Exams_English.pdf"/>
<Item Name="Package Dependencies" Type="IIO Ladder Diagram">
<Property Name="NI.SortType" Type="Int">0</Property>
</Item>
<Item Name="Dependencies" Type="Dependencies"/>
<Item Name="Build Specifications" Type="Build"/>
</Item>
</Project>
LabVIEWプロジェクトでは<Project>タグがあり、その中にPropertyやItemがいる感じですね。仮にLabVIEWプロジェクトがライブラリの仲間と言われると、答えはNoらしいです。なんでかと言われると…そういうものと暗記するしかないかもですね。最初のほうの<Project Type=”Project” LVVersion=”20008000″>でTypeがいるのはLabVIEWプロジェクトぐらいでプロジェクトライブラリにはない(後述)のでライブラリではないという感じでしょうか?知らんけど。それとも、LabVIEWプロジェクトではアクセススコープの設定ができないからかな?ちなみに、LVVersion=”20008000″は保存したLabVIEWのバージョンで、LabVIEW 2020を意味します。
プロジェクトライブラリ (.lvlib)
今度は適当なプロジェクトライブラリを見ていきます。

プロジェクトライブラリの中身
<?xml version='1.0' encoding='UTF-8'?>
<Library LVVersion="20008000">
<Property Name="NI.Lib.Icon" Type="Bin">)!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!(]!!!*Q(C=\>7R=2MR%!81N=?"5X<A91P<!FNA#^M#5Y6M96NA"R[WM#WQ"<9A0ZYR'E?G!WPM1$AN>@S(!ZZQG&0%VLZ'@)H8:_X\<^P(^7@8H\4Y;"`NX\;8JZPUX@@MJXC]C.3I6K5S(F/^DHTE)R`ZS%@?]J;XP/5N<XH*3V\SEJ?]Z#F0?=J4HP+5<Y=]Z#%0/>+9@%QU"BU$D-YI-4[':XC':XB]D?%:HO%:HO(2*9:H?):H?)<(<4%]QT-]QT-]BNIEMRVSHO%R@$20]T20]T30+;.Z'K".VA:OAW"%O^B/GK>ZGM>J.%`T.%`T.)`,U4T.UTT.UTROW6;F.]XDE0-9*IKH?)KH?)L(U&%]R6-]R6-]JIPC+:[#+"/7Q2'CX&1[F#`&5TR_2@%54`%54`'YN$WBWF<GI8E==J\E3:\E3:\E-51E4`)E4`)EDW%D?:)H?:)H?5Q6S:-]S:-A;6,42RIMX:A[J3"Z`'S\*<?HV*MENS.C<>Z9GT,7:IOVC7*NDFA00><$D0719CV_L%7.N6CR&C(7(R=,(1M4;Z*9.T][RNXH46X62:X632X61?X6\H(L8_ZYP^`D>LP&^8K.S_53Z`-Z4K>4()`(/"Q/M>`P9\@<P<U'PDH?8AA`XUMPTP_EXOF`[8`Q<IT0]?OYVOA(5/(_Z!!!!!!</Property>
<Property Name="NI.Lib.Version" Type="Str">1.0.0.0</Property>
<Property Name="NI.LV.All.SourceOnly" Type="Bool">true</Property>
<Item Name="Class.lvclass" Type="LVClass" URL="../Class.lvclass"/>
<Item Name="test.vi" Type="VI" URL="../test.vi"/>
<Item Name="Variable" Type="Variable">
<Property Name="featurePacks" Type="Str">Network</Property>
<Property Name="Industrial:AliasVariable" Type="Str"></Property>
<Property Name="Network:SingleWriter" Type="Str">False</Property>
<Property Name="Network:UseBinding" Type="Str">False</Property>
<Property Name="Network:UseBuffering" Type="Str">False</Property>
<Property Name="numTypedefs" Type="UInt">0</Property>
<Property Name="type" Type="Str">Network</Property>
<Property Name="typeDesc" Type="Bin">)!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!!J*1!!!#!!A!!!!!!"!!V!#A!'2'^V9GRF!!!"!!!!!!!!!!!!!!!!!!!!!!!!</Property>
</Item>
<Item Name="XControl.xctl" Type="XControl" URL="../XControl.xctl"/>
</Library>
これもXML形式です。LabVIEWプロジェクトとあまり変わらない気がしますが、これがプロジェクトライブラリの仲間(というより、これがプロジェクトライブラリそのもの)になります。<Library LVVersion=”20008000″>というタグがあります。LabVIEWプロジェクトと違い、Type = “文字列”という設定はないですね。
LabVIEWクラス (.lvclass)
今度はLabVIEWクラスを見てみます。

LabVIEWクラスの中身
<?xml version='1.0' encoding='UTF-8'?>
<LVClass LVVersion="20008000">
<Property Name="NI.Lib.ContainingLib" Type="Str">Q10.lvlib</Property>
<Property Name="NI.Lib.ContainingLibPath" Type="Str">../Q10.lvlib</Property>
<Property Name="NI.Lib.Icon" Type="Bin">)!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!(]!!!*Q(C=\>8"<2MR%!813:!!O;K$1#V-#WJ",5Q,OPKI&K9&N;!7JA7VI";=JQVBZ"4F%#-ZG/O26X_ZZ$/87%>M\6P%FXB^VL\_NHV=@X<^39O0^N(_<8NZOEH@@=^_CM?,3)VK63LD->8LS%=_]J'0@/1N<XH,7^\SFJ?]Z#5P?=F,HP+5JTTF+5`Z>MB$(P+1)YX*RU2DU$(![)Q3YW.YBG>YBM@8'*\B':\B'2Z>9HC':XC':XD=&M-T0--T0-.DK%USWS(H'2\$2`-U4`-U4`/9-JKH!>JE<?!W#%;UC_WE?:KH?:R']T20]T20]\A=T>-]T>-]T?/7<66[UTQ//9^BIHC+JXC+JXA-(=640-640-6DOCC?YCG)-G%:(#(+4;6$_6)]R?.8&%`R&%`R&)^,WR/K<75?GM=BZUG?Z%G?Z%E?1U4S*%`S*%`S'$;3*XG3*XG3RV320-G40!G3*D6^J-(3D;F4#J,(T\:<=HN+P5FS/S,7ZIWV+7.NNFC<+.<GC0819TX-7!]JVO,(7N29CR6L%7,^=<(1M4#R*IFV][.DX(X?V&6>V&G>V&%>V&\N(L@_Z9\X_TVONVN=L^?Y8#ZR0J`D>$L&]8C-Q_%1_`U_>LP>WWPAO_0NB@$TP@4C`%`KH@[8`A@PRPA=PYZLD8Y![_ML^!!!!!!</Property>
<Property Name="NI.Lib.Version" Type="Str">1.0.0.0</Property>
<Property Name="NI.LV.All.SourceOnly" Type="Bool">true</Property>
<Property Name="NI.LVClass.ClassNameVisibleInProbe" Type="Bool">true</Property>
<Property Name="NI.LVClass.DataValRefToSelfLimitedLibFlag" Type="Bool">true</Property>
<Property Name="NI.LVClass.FlattenedPrivateDataCTL" Type="Bin">)!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!"#G5F.31QU+!!.-6E.$4%*76Q!!$&1!!!23!!!!)!!!$$1!!!!=!!!!!AF2-4!O<(:M;7).1WRB=X-O<(:D<'&T=Q!!!+!A!)!!!$!!!#A!"%!!!!!%!!-!0!#]!"^!!#)!!!!!!1!"!!<`````!!!!!!!!!!!!!!!!G[?EQ9G0W%K,")N%A]_O*A!!!!Q!!!!1!!!!!-QL3FS-4.^%H$1(X[<2]S(5(9T:DQ#S"/G!#:DM_%*_!!!!!!!!!!"2<0SQ%X3F29"4GDW%^<>_!1!!!0`````5(9T:DQ#S"/G!#:DM_%*_!!!!%/>D#.#,@KEB8.<;+N&E8'E!!!!%!!!!!!!!!#=!!5R71U-!!!!"!!*735R#!!!!!&"53$!!!!!&!!%!!1!!!!!#!!-!!!!!!A!"!!!!!!!C!!!!((C=9W"D9'JAO-!!R)R!T.4!^!0)`A$C-Q!!;!%).A!!!!!!21!!!2BYH'.AQ!4`A1")-4)Q-*U!UCRIYG!;RK9GQ'5O,LOAYMR1.\*#2"G"9ER\A!QGE"SK8J"`Q(Z#!7R9T!9!>P5I&1!!!!!!!!Q!!6:*2&-!!!!!!!-!!!!4!!!!#8C=9W"A9'2E!!)!!"1!!Q!!!!!-)!#!!!!!"$)Q,D!!!!!!$#!!A!!!!!1S-#YQ!!!!!!QA!)!!!!!%-D!O-!!!!!!-)!#!!!!!"$)Q,D!!!!!!$#!!A!!!!!1S-#YQ!!!!!!U!!!!!!!!!!!!!!!!!!!!!!!!!A0````_!!!!"A!!!!9!!!!'!!!!"A!!!!9!!!!'!!!!"A!!!!9!!!!'!!!!"A!!!!9"A!!'"G!!"BA9!!:A"A!'A!%!"M!$!!;Q$1!'D$M!"I06!!;!KQ!'A.5!"I#L!!;!V1!'A+M!"I$6!!:ALA!''.A!"A<A!!9"A!!(`````!!!%!0```````````````````````````````````````````Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!5&!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!7N79/N"1!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!7N73]P,S_$L15!!!!!!!!!!!!!!!!!!!!!``]!!!7N73]P,S]P,S]PA[U&!!!!!!!!!!!!!!!!!!$``Q#$73]P,S]P,S]P,S]P,Y/N!!!!!!!!!!!!!!!!!0``!&F:,S]P,S]P,S]P,S]P`I-!!!!!!!!!!!!!!!!!``]!79/$73]P,S]P,S]P`P\_71!!!!!!!!!!!!!!!!$``Q":AY/$AVEP,S]P`P\_`PZ:!!!!!!!!!!!!!!!!!0``!&G$AY/$AY.:L@\_`P\_`FE!!!!!!!!!!!!!!!!!``]!79/$AY/$AY0_`P\_`P\_71!!!!!!!!!!!!!!!!$``Q":AY/$AY/$A`\_`P\_`PZ:!!!!!!!!!!!!!!!!!0``!&G$AY/$AY/$`P\_`P\_`FE!!!!!!!!!!!!!!!!!``]!79/$AY/$AY0_`P\_`P\_71!!!!!!!!!!!!!!!!$``Q":AY/$AY/$A`\_`P\_`PZ:!!!!!!!!!!!!!!!!!0``!)/$AY/$AY/$`P\_`P\_AY-!!!!!!!!!!!!!!!!!``]!!&F:AY/$AY0_`P\_A[V:!!!!!!!!!!!!!!!!!!$``Q!!!!":AY/$A`\_AY.:!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!79/$AY-P!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!&EP!!!!!!!!!!!!!!!!!!!!!!!!!!$```````````````````````````````````````````]!!!!#!!%!!!!!!!Q!!5:13&!!!!!!!!-!!!!%!!!!!!!!!G9!!!4B?*SNF-^L%U%5R^_%63;BR>EUV1:;%MMU&EEO`KT";'GXBUIJ3CRY+.DARB`1'GW3[KG^,%)/B6)B"[%(,\F[S-'\"#^\U*-(CST.8_#F+.B.@$0*\K9LRIM*$%0S0O`\^HW`,)$SD9U%7L"J!W'(?&GQ);3<"+#2IN$^*&Y"7S+`A%3CR):JOM4W!SUS;M/!<C<I*;U#X\P6*%0?MA-M0=GCW#REQSH>0%.O=9PR>[/]=M,JKM)9WS;NQ$U?_U'XD1)+AD%J4D6&7E#UMYJCD.`/0=U<80Q;4.'I<"GUA7HGY!;XTG&(F0YA7Z)>EE4J<EP!FJ.1L^=^3/V!#4H'&$)E+=@>[=/%E8H"L;2E1J*"H9SDI]6;L]8M!P+D1^QM=AORF]ZGEI[5&L/H*>:M.B($MYM^NC(#L2E;J1@[6T*YRXA0"%DDPOO$OCB-E,6B^'%C46A7\VE<TBNG9!55:\NFW*5O+)Y,VY5,-^+&I&:BY.GQ_U]<'O.DM[PF9CG`(C]]D$^9T27,]7@L4T:SJ8R=TZ6S@RK5U=TA2@(U1KS4D7&1Y$GM^#[\!,6;$2?!JY@?1(3)7S[HSK@2X98LXM+&KL?ZG\AZ\?@>2W*\%_G!%VHQQHI"Q[J'`!->#_PF`R`7+ZCB46^992G`;XW#>\5$?7(&?I!V7/\$4#'TV2P7DIKDUS_MV`RB&;APL.6K^2C'+U_\965)[946_.Q_;B`Z)QP"R:\"[@\(MPM`T8+N4;.`,W"T+,:FQ\!W'`\%ZL(<!*WH=WQ04=78U7G[2Q]<8^TSRI*\Z7^C>/1XR%Z6SQ!!!!!!"!!!!#!!!!!%!!!!!!!!!!Q!!5*%3&!!!!!!!!-!!!!%!!!!!!!!!')!!!"S?*RD9'$)%Z"A_M>1^Z?"3?!LE#(^FY&:U)`R.Q-$JZ`!93$.+#!*&*<^S]!OK!U7VD[CS]%!";JMD"S3()=&/=!S(#U;$0```_@Y?O1;8-52(TB4::9]BQ1!&'):!!!!!!!!"!!!!!=!!!$:!!!!!Q!!!"2/33Z-6CZ"<'QO5W^V=G.F4WZM?1!!!"5A!)!!!!!!!1!%!#%!!1!!!1!!!!!!!!!B8WZJ8URB=X2,<G^X<E^X<GFO:UR71WRB=X.$<(6T>'6S!!!!.#!!A!!!!!!"!!A!-0````]!!1!!!!!!'!!!!!%!%%"1!!!*54%Q/E.M98.T!!%!!!!!!!!!!!!;4&:$<'&T=V"S;8:B>'6%982B6'&C4X*E:8)!!!!F)!#!!!!!!!)!"1!(!!!-!%!!!@````]!!!!"!!%!!!!!!!!!!!!!!!!!!!1!!A!)!!!!"!!!!%!!!!!I!!!!!A!!"!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.M!!!&6?*S.DU&0QE!5B,^F53C))JR.^M#"AT%3`U!4%M\),\$3FJ"M5E-8YN&@[RH_A>-7YM',G?4NG^HX:H;"-3N/X^HI%<$2[_TZS2`]^HUQ^UF:KF^8:^3Q>@"-YS5]T0W_$.H/&<GL"^T(<HN)1O<3*#2=#@2)Q2QR)P:-?6%<R2VM\D>UYS^<L%)D:%8/5.Z7Y^>U\$\.[66:.HSGWF\3IEP%Z&`Z,7I<&907XB4>:C%4RQU$C26O&8;"/?/P]HNT6[0ZC'%I2`1A&.;7WO??E7L`"Z:4.!9!!!!!=1!"!!)!!Q!%!!!!3!!0!!!!!!!0!.E!UA!!!&5!$Q!!!!!!$Q$:!.)!!!"C!!]!!!!!!!]!W1$3!!!!<Y!!A!#!!!!1@`]!!1R:>3"(<X2I;7-A65E-785A2W^U;'FD)&6*$&FV)%>P>'BJ9S"631%Q!!!!5F.31QU+!!.-6E.$4%*76Q!!$&1!!!23!!!!)!!!$$1!!!!!!!!!!!!!!#!!!!!U!!!%3!!!!"V-35*/!!!!!!!!!7R-6F.3!!!!!!!!!9"36&.(!!!!!!!!!:2$1V.5!!!!!!!!!;B-38:J!!!!!!!!!<R$4UZ1!!!!!!!!!>"544AQ!!!!!!!!!?2%2E24!!!!!!!!!@B-372T!!!!!!!!!AR(1U2*!!!!!!!!!C"W:8*T!!!!"!!!!D2(1V"3!!!!!!!!!JB*1U^/!!!!!!!!!KRJ9WQY!!!!!!!!!M"$5%-S!!!!!!!!!N2-37:Q!!!!!!!!!OB'5%6Y!!!!!!!!!PR'5%BC!!!!!!!!!R"'5&.&!!!!!!!!!S275%21!!!!!!!!!TB-37*E!!!!!!!!!UR#2%6Y!!!!!!!!!W"#2%BC!!!!!!!!!X2#2&.&!!!!!!!!!YB73624!!!!!!!!!ZR%6%B1!!!!!!!!!\".65F%!!!!!!!!!]2)36.5!!!!!!!!!^B71V21!!!!!!!!!_R'6%&#!!!!!!!!"!!!!!!!`````Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!!!!!!!0````]!!!!!!!!!R!!!!!!!!!!!`````Q!!!!!!!!$9!!!!!!!!!!$`````!!!!!!!!!/!!!!!!!!!!!0````]!!!!!!!!"$!!!!!!!!!!!`````Q!!!!!!!!%5!!!!!!!!!!$`````!!!!!!!!!4Q!!!!!!!!!!0````]!!!!!!!!"C!!!!!!!!!!!`````Q!!!!!!!!'9!!!!!!!!!!4`````!!!!!!!!!<!!!!!!!!!!"`````]!!!!!!!!"Q!!!!!!!!!!)`````Q!!!!!!!!(1!!!!!!!!!!H`````!!!!!!!!!?!!!!!!!!!!#P````]!!!!!!!!"]!!!!!!!!!!!`````Q!!!!!!!!)!!!!!!!!!!!$`````!!!!!!!!!B1!!!!!!!!!!0````]!!!!!!!!#G!!!!!!!!!!!`````Q!!!!!!!!;=!!!!!!!!!!$`````!!!!!!!!"K1!!!!!!!!!!0````]!!!!!!!!'N!!!!!!!!!!!`````Q!!!!!!!!;]!!!!!!!!!!$`````!!!!!!!!#3A!!!!!!!!!!0````]!!!!!!!!*-!!!!!!!!!!!`````Q!!!!!!!!EY!!!!!!!!!!$`````!!!!!!!!#5A!!!!!!!!!!0````]!!!!!!!!*5!!!!!!!!!!!`````Q!!!!!!!!GY!!!!!!!!!!$`````!!!!!!!!#=!!!!!!!!!!!0````]!!!!!!!!+I!!!!!!!!!!!`````Q!!!!!!!!KI!!!!!!!!!!$`````!!!!!!!!#L!!!!!!!!!!!0````]!!!!!!!!+X!!!!!!!!!#!`````Q!!!!!!!!O]!!!!!!F$<'&T=SZD>'Q!!!!!</Property>
<Property Name="NI.LVClass.IsTransferClass" Type="Bool">false</Property>
<Property Name="NI.LVClass.LowestCompatibleVersion" Type="Str">1.0.0.0</Property>
<Item Name="Class.ctl" Type="Class Private Data" URL="Class.ctl">
<Property Name="NI.LibItem.Scope" Type="Int">2</Property>
</Item>
</LVClass>
これもXML形式ですね。<LVClass LVVersion=”20008000″>というタグがあります。<Library LVVersion=”20008000″>というタグと完全一致しているわけではないですが、それ以外は同じ構造ですね。なので、LabVIEWクラスはプロジェクトライブラリの仲間と言えますね。
XControl (.xctl)
XControlとは、自分でオリジナルのデザインやプロパティ、メソッドを持つ制御器を作るものです。データ型は既存のものです。画面に表示する制御器と実際のデータ型が異なっていても構いません。今回はXControlを作るわけではないので、説明はこのくらいにして中身を見てみます。

XControlの中身
<?xml version='1.0' encoding='UTF-8'?>
<XControl LVVersion="20008000">
<Property Name="NI.Lib.ContainingLib" Type="Str">Q10.lvlib</Property>
<Property Name="NI.Lib.ContainingLibPath" Type="Str">../Q10.lvlib</Property>
<Property Name="NI.Lib.Icon" Type="Bin">)!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!(]!!!*Q(C=\>7R=2MR%!81N=?"5Q</07RB7W!,<'&<9+K1,7Q,<)%N<!NMA3X)DW?-RJ(JQ"I\%%Z,(@`BA#==ZB3RN;]28_,V7@PWW`:R`>HV*SU_WE@\N_XF[3:^^TX\+2YP)D7K6;G-RV3P)R`ZS%=_]J'XP/5N<XH,7V\SEJ?]Z#5P?=J4HP+5JTTFWS%0?=B$DD1G(R/.1==!IT.+D)`B':\B'2Z@9XC':XC':XBUC?%:HO%:HO&R7QT0]!T0]!S0I4<*<)?=:XA-(]X40-X40-VDSGC?"GC4N9(<)"D2,L;4ZGG?ZH%;T>-]T>-]T?.S.%`T.%`T.)^<NF8J4@-YZ$S'C?)JHO)JHO)R>"20]220]230[;*YCK=ASI2F=)1I.Z5/Z5PR&)^@54T&5TT&5TQO<5_INJ6Z;"[(H#>ZEC>ZEC>Z$"(*ETT*ETT*9^B)HO2*HO2*(F.&]C20]C2)GN4UE1:,.[:/+5A?0^NOS?UJ^3<*\9B9GT@7JISVW7*NIFC<)^:$D`5Q9TWE7)M@;V&D,6;M29DVR]6#R],%GC47T9_/=@>Z5V>V57>V5E>V5(OV?^T[FTP?\`?YX7ZRP6\D=LH%_8S/U_E5R_-R$I>$\0@\W/VW<[_"\Y[X&],0^^+,]T_J>`J@_B_]'_.T`$KO.@I"XC-_N!!!!!!</Property>
<Property Name="NI.Lib.Version" Type="Str">1.0.0.0</Property>
<Property Name="NI.LV.All.SourceOnly" Type="Bool">true</Property>
<Property Name="NI.XClass.Flags" Type="Int">0</Property>
<Property Name="NI.XItem.DeclaredLeakProof" Type="Bool">false</Property>
<Property Name="NI.XItem.Express" Type="Bool">false</Property>
<Property Name="NI.XItem.Name" Type="Str">XControl 1</Property>
<Property Name="NI.XItem.SupportsFatalErrorOut" Type="Bool">false</Property>
<Item Name="Data.ctl" Type="Ability VI" URL="../XControl/Data.ctl">
<Property Name="NI.XItem.Name" Type="Str">Data</Property>
</Item>
<Item Name="Facade.vi" Type="Ability VI" URL="../XControl/Facade.vi">
<Property Name="NI.XItem.Name" Type="Str">Facade</Property>
</Item>
<Item Name="Init.vi" Type="Ability VI" URL="../XControl/Init.vi">
<Property Name="NI.XItem.Name" Type="Str">Init</Property>
</Item>
<Item Name="State.ctl" Type="Ability VI" URL="../XControl/State.ctl">
<Property Name="NI.XItem.Name" Type="Str">State</Property>
</Item>
</XControl>
これも<XControl LVVersion=”20008000″>というタグがあり、やはりプロジェクトライブラリと同じ構造になっています。
StateChart (.lvsc)
StateChartはかつてNIが売り物にしていたアドオンです。確か、2018までは有償で購入、2019ではVIPMからフリーでインストールできたと思います。Windowsの場合、2026年時点で最新のOSには対応していないので、今さら使うこともないと思います。私の環境にはないですが、業務で使ったことはあります。当時退職した担当者がこれを使っていて、エンドユーザーの現場でプログラムを実行+修正しながら対応したというものです。
これもテキストエディタで開いたことがありますが、バイナリデータにプロジェクトライブラリと同じ構造が含まれているという感じでした。こんなことを知っていても役に立たないですね。
シェア変数はなぜプロジェクトライブラリではないのか?
シェア変数を作ると、シェア変数は必ずプロジェクトライブラリの中に作られます。

シェア変数とプロジェクトライブラリは必ずセットなのでライブラリっぽいですが、シェア変数はライブラリの中にあるアイテムであり、これ自体はライブラリではありません。このQ10.lvlibをVS Codeで見ると、この中に<Item Name=”Variable” Type=”Variable”>というタグがあります。
プロジェクトライブラリ内のシェア変数のItemタグ
<Item Name="Variable" Type="Variable">
<Property Name="featurePacks" Type="Str">Network</Property>
<Property Name="Industrial:AliasVariable" Type="Str"></Property>
<Property Name="Network:SingleWriter" Type="Str">False</Property>
<Property Name="Network:UseBinding" Type="Str">False</Property>
<Property Name="Network:UseBuffering" Type="Str">False</Property>
<Property Name="numTypedefs" Type="UInt">0</Property>
<Property Name="type" Type="Str">Network</Property>
<Property Name="typeDesc" Type="Bin">)!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!!J*1!!!#!!A!!!!!!"!!V!#A!'2'^V9GRF!!!"!!!!!!!!!!!!!!!!!!!!!!!!</Property>
</Item>
なので、冒頭の問題の答えはシェア変数となります。
LLBファイル (.llb)
CLA-Rの問題ではLLBファイルは選択肢にありませんでしたが、ライブラリ的なものなのでこれも確認していきます。LLBファイルとは、LabVIEWライブラリファイルというもので…まあ、過去の技術ですね。とはいっても、まだ見かけることはあります。これからLabVIEWでライブラリを作る場合は、llbではなくlvlibを作ることを推奨します。これをVS Codeで見ると…

…読めないですね。これはプロジェクトライブラリとは異なるものと言えます。ちなみに、LLBでは中に含まれるVIにアクセススコープを設定することはできません。
感想
今回はLabVIEWのいろいろなファイルをVS Codeで見ていきました。ライブラリやプロジェクトはXMLで表現されていることが分かりました。ここで見てきたファイルのほとんどがテキストファイルなので、保存バージョンを間違えたときにごまかすことができそうですが…VI自体にも保存バージョンの情報があるのでうまくいかないものです。ちなみに、VIはバイナリで表示されるので人が編集できるものではないです。これで、XMLの表現からプロジェクトライブラリとはどんなものか多少理解できたと思います。…やっぱり正規の開発環境=LabVIEWで開かないと理解できないですね。

