プロジェクト開発するときに同じプログラムを別のプロジェクトにも流用したいとき、みなさんはどうしますか。おそらくCopy-pasteが一番多いでしょう。小さなプロジェクトならこれは問題ありませんが、アプリケーションが大きくなると、ライブラリで私達が作ったFunctionやFunction Blockを管理することができます。
ライブラリを使用することにより、私達は自分が作ったソフトを複数のプロジェクトに管理することができます。まずは装置によって機能が異なることが当たり前ですが、それでも必ず共通の部分がでてきます。ソフトウェア開発の世界ではそのライブラリ管理のコンセプトはかなり一般的です。
例えば、このプロジェクトにはFB1、FB2、FB3があります。
もし新規のプロジェクトがあり、そのプロジェクトにはFB1,2,4、があります。中には同じ機能を持つFB1、FB2があり、いつもやり方だけProject Aを開いてFB1、FB2をCopyし、ProjectBに貼り付けるでしょう。実際私達はライブラリを作成しFB1,FB2をその”Library”の一部として移動することができます。
このように各PLC Projectに同じライブラリを参照します。せっかく作ったプログラムなので、また車輪の再発明をするのは時間的にもったいないです。
ライブラリ使用するのメリットは、
- ソフトはモジュール化される、つまり例えば私がシリンダーのソフトがあるならシリンダーのライブラリを使えばよい、Loggingのソフトがあれば、Loggingのライブラリを使えばよいので。
- 各ライブラリの独自にテストされる
Create Library
最初はライブラリ用のプロジェクトを作成します。
今回の記事ではライブラリ化のFB、FC1つずつ作りました。
Library Codes
はじめてライブラリ化するFunction BlockとFunctionを作ります。
FB_FB_AXL_E_EC_DI8_DO8_M12_6P_BitMaps
1つ目はFB_FB_AXL_E_EC_DI8_DO8_M12_6P_BitMapsです。そのFunction Blockは昔のPhoenix Contact製のEtherCAT Slave IP67IOを立ち上げたとき作ったFunction blockの修正版なので、よかったらそちらの記事も参考にしてください。
FUNCTION_BLOCK FB_FB_AXL_E_EC_DI8_DO8_M12_6P_BitMaps VAR_INPUT i_ModuleOut:ARRAY[1..8]OF BOOL; END_VAR VAR_OUTPUT q_ModuleIn:ARRAY[1..8]OF BOOL; q_DataOK :BOOL; END_VAR VAR DI1,DI2,DI3,DI4,DI5,DI6,Di7,DI8 AT %I*:BIT; DO1,DO2,DO3,DO4,DO5,DO6,DO7,DO8 AT %Q*:BIT; WcState AT %I*:BIT; END_VAR //In q_ModuleIn[1]:=DI1; q_ModuleIn[2]:=DI2; q_ModuleIn[3]:=DI3; q_ModuleIn[4]:=DI4; q_ModuleIn[5]:=DI5; q_ModuleIn[6]:=DI6; q_ModuleIn[7]:=DI7; q_ModuleIn[8]:=DI8; //Status q_DataOK:=NOT WcState; // DO1:=i_ModuleOut[1]; DO2:=i_ModuleOut[2]; DO3:=i_ModuleOut[3]; DO4:=i_ModuleOut[4]; DO5:=i_ModuleOut[5]; DO6:=i_ModuleOut[6]; DO7:=i_ModuleOut[7]; DO8:=i_ModuleOut[8]; |
FC_Word2Bools
次はFunctionです。簡単なWORDをBoolに分解するプログラムです。
FUNCTION FC_Word2Bools : Array[0..7]of bool VAR_INPUT w16:WORD; END_VAR VAR END_VAR FC_Word2Bools[0]:=w16.0; FC_Word2Bools[1]:=w16.1; FC_Word2Bools[2]:=w16.2; FC_Word2Bools[3]:=w16.3; FC_Word2Bools[4]:=w16.4; FC_Word2Bools[5]:=w16.5; FC_Word2Bools[6]:=w16.6; FC_Word2Bools[7]:=w16.7; |
Delete the MAIN POU
ライブラリなら当然MAINがいらないので、削除します。
Library Properties
ライブラリをExportするまでに、いくつかの設定が必要です。これから一つずつ説明しますので安心してください。
Projectを右クリック>Propertiesします。
このようなライブラリ画面になります。
Company
最初はCompany、つまり会社名ですね。私の場合はthreesSoup01です。
Title
Titleはそのライブラリの名前です。とりあえずCommonsにします。実際はDrive関係ならDriveで、シリンダーならSVとか、わかりやすい名前にしてください。
Version
いまライブラリのバージョンですね。数字が大きくなればなるほど最新バージョンになります。
Released Checkbox
Released Checkboxは該当するVersionのライブラリも正式になったかを示しています。もしまだBeta版で正式版でないならReleased Checkboxを外してください。Released Checkboxを入れたらライブラリの中身が変更できなくなりますので。
Default namespace
Namespaceのコンセプトはライブラリ管理の中で非常に大事な役割をしています。
設定を進める前にNamespaceのコンセプトを説明します。例えばいま郵便やさんが私の家に手紙を配達したいと考えています。自分の住所は3丁目208室ですが、日本中で3丁目208室がやまほどあり、郵便やさんがどこか私の住所がわかりませんよね。
なので、住所は東京都三鷹市ABC町3丁目208室と大阪府大阪市淀川区DFC町3丁目208室などで切り分けられるようにします。3丁目208室がたくさんありますが、東京都三鷹市ABC町が1つしかありません。
Library管理でそのNamespaceも一緒なので、ライブラリを作るときどうしても名前がかぶるときが出てきます。その対策として使用するのはNamespaceです。私とAくんも同じくServoのライブラリ作りましたが、私のNamespaceはsoup01.servo,AくんのNamespaceはA.servoなので、ソフトでAくんのソフトを使用する場合はA.servo.Enable()とか。私のソフトを使用する場合はsoup01.servo.Enable()になります。
ここでthreesSoup01_Commonに入力します。
つまりこのLibraryを使用したいなら、threesSoup01_Common.YourFBになります。
Author
Authorがそのライブラリを作った人です。この場合はわたしですね。
Description
Libraryに簡単な説明を入れましょう。
Global version structure
次はこのGlobal version structureです。”ADD”を押すとGVL(Global Variable Listにいまのライブラリ Versionを示す変数が作成されます。)
VersionのFolderが作成され、中にGlobal_VersionというGVLが生成されます。
中にST_LibVersionがData Typeの変数があり、該当するライブラリのVersionが明確示されています。
Save and Install
最後はProjectを右クリック>Save as library and installします。
.libraryのFileとして保存します。
Import your Library
ライブラリが用意されたら次は別のProjectからそのライブラリをImportしてみましょう。
Your Project>Referencesをクリックします。
Add libraryをクリックします。
(Miscellaneous)を展開します。
そこにCommonsというライブラリがありますね!(先ほど私たちが作った)、そしてCompanyはthreesSoup01。そのCommonsを選び>OKします。
よし、それでライブラリが追加されました。
ライブラリの中には先程作成したFB、FCとGlobal_Versionが入ってます。
Miscellaneous?
Miscellaneousは他のという意味で、やっばりライブラリを作成するとき、 きちんとカタログを機能に分けたいですね。いま一回Libraryのプロジェクトに戻り、Library Categoriesの項目があります。隣の…ボタンをクリックします。
ここからtemplate.libcat.xmlをDownloadします。
開くと中にこのようなXMLがあります。
.
よくあるカタログ、例えばDrive大きなカタログがあり、その下はBeckhoff・三菱のように小分けします。でも今回はシンプルに設定します。このように修正してください。つまりLibraryCategoryが一つだけに残るようにします。
そしてDefaultNameの項目でカタログ名を入れましょう。
次はIdの項目を変更します。
そこで必要なのはGUIDです。以下のLINKにアクセスしGenerate some GUIDs!でランダムのGUIDを生成します。
最後のFileは下記のようになります。
<?xml version=”1.0″ encoding=”UTF-8″?> <LibraryCategories xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:noNamespaceSchemaLocation=”LibraryCategories.xsd”> <LibraryCategory> <Id>3b5f5476-b03c-4a04-afc3-2c98ee1e5941</Id> <Version>1.0.0.0</Version> <DefaultName>Soup01Threes</DefaultName> </LibraryCategory> </LibraryCategories> |
Fileをcat.libcat.xmlで保存します。
先のライブラリ設定画面の話に戻り、Add>ボタンをクリックします。
From Description Fileを選びます。
先ほど作成した.libcat.xmlを選び>Openします。
.libcat.xmlで記述されたカタログが表示され、OKで確定します。
Library Categoniesは設定OKです!
もう一度Save as Library and installで変更を保存します。
GUID?
GUID(Globally Unique Identifier)もしくはUUID(Universally Unique Identifier)というのは128-Bitの整数でリソース認証として使われています。GUIDはMicrosoft関連ソフトの開発者がによく使われてるTermです。その128Bitのデータと生成するアルゴリズムはどれくらいユニークかといいますと、1年間で1秒ごとに1,000,000,000 回そのGUIDを生成すると、50%くらいの確率でかぶります。
Import again
ではもう一度別のProjectからライブラリをImportしてみます。
もし以下のようにカタログ表示できない場合があれば、プロジェクトを閉じてもう一度試してみてください。
カタログが表示されました!
そのLibarayを追加したらReferenceの欄にも反映されます。
Use it your Project
最後はプロジェクトの中で使ってください。