「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
私は入社2か月目の本社事業所の社員です。まだまだ若輩者の私ですが、研修をするにあたってソフトウェアPLCのCODESYSに触れることになりました。今回行う研修内容は主に
の2つになります。
今回のソフテックだよりではこの2つに関しての仕様などについて紹介させていただきます。
CODESYSは国際標準規格IEC61131-3に準拠したソフトウェアPLCや、統合開発環境を含んだオートメーションプラットフォームです。
IEC-61131-3が定める複数の言語やCFCのような規格外言語に対応しています。Visual Studioなどとは異なり、これらの複数の言語を1つのプロジェクト内で組み合わせて使用することができるのが特徴です。
またVisualizationという機能を用いてGUIを作成することも可能です。
Visualizationには
などがあります。
以下ではVisuはWebVisu・TargetVisu両方を指し、WebVisuはWebVisuだけを指すものとします。
CODESYSの環境構築や使い方に関しては”ソフテックだより第401号技術レポート「CODESYSを使ってみて〜簡易スタートアップガイド〜」” を参考にしていただければと思います。
まず新規プロジェクトを作成します。
その後ライブラリマネージャーから[ライブラリの追加]をクリックします。
検索欄にFile Accessと入力し、[File Access]を選択し、OKを押します。
これでファイルアクセスに関するライブラリの追加は完了です。ライブラリ追加をしたことでファイルアクセスに関するFunction Block(以下FB)が使用可能になっているはずです。
さきほど追加したライブラリを利用して実際にファイルアクセスをしてみましょう。
今回はこのようなtxtファイルを用意し、「I am Bob.」と書き込むことを目標に実装していきたいと思います。
流れとしては
Writeボタンを押下→Readボタンを押下→テキストに「Hello World!!I am Bob.」と表示
となります。UIは以下のようになります。
File Accessライブラリには様々なFBがありますが、今回は「FILE.Open」「FILE.Close」「FILE.Read」「FILE.Write」の4つを使います。まずはそれぞれのFBのInputとOutputを紹介します。
3-2-1. Open
・Input
name | Type |
|
xExecute | BOOL | FALSE→TRUEへの切り替えをすることによってFBを実行 |
sFileName | CAA.FILENAME | 相対パスと絶対パスのどちらかをファイルパスとして指定 |
eFileMode | MODE | どのモードでオープンするかを決める変数 |
xExclusive | BOOL | 排他制御を許可するか否かを決める変数 |
・Output
name | Type |
|
xDone | BOOL | TRUE:実行完了 |
xBusy | BOOL | TRUE:実行中 |
xError | BOOL | TRUE:エラー発生 |
eError | ERROR | どのようなエラーが出ているかを数字で表示 |
hFile | CAA.HANDLE | ファイルハンドル |
3-2-2. Close
・Input
name | Type |
|
xExecute | BOOL | FALSE→TRUEへの切り替えをすることによってFBを実行 |
hFile | CAA.HANDLE | ファイルハンドル |
・Output
name | Type |
|
xDone | BOOL | TRUE:実行完了 |
xBusy | BOOL | TRUE:実行中 |
xError | BOOL | TRUE:エラー発生 |
eError | ERROR | どのようなエラーが出ているかを数字で表示 |
3-2-3. Read
・Input
name | Type |
|
xExecute | BOOL | FALSE→TRUEへの切り替えをすることによってFBを実行 |
xAbort | BOOL | TRUE:実行を中断 |
udiTimeOut | UDINT | タイムアウトするまでの時間 |
hFile | CAA.HANDLE | ファイルハンドル |
pBuffer | CAA.PVOID | 読み込んだ内容を保存するためのバッファのアドレス |
szBuffer | CAA.SIZE | バッファのサイズ |
・Output
name | Type |
|
xDone | BOOL | TRUE:実行完了 |
xBusy | BOOL | TRUE:実行中 |
xError | BOOL | TRUE:エラー発生 |
xAborted | BOOL | TRUE:ユーザによって処理が中断 |
eError | ERROR | どのようなエラーが出ているかを数字で表示 |
szSize | CAA.SIZE | 読み込んだバイト数 |
3-2-4. Write
・Input
name | Type |
|
xExecute | BOOL | FALSE→TRUEへの切り替えをすることによってFBを実行 |
xAbort | BOOL | TRUE:実行を中断 |
udiTimeOut | UDINT | タイムアウトするまでの時間 |
hFile | CAA.HANDLE | ファイルハンドル |
pBuffer | CAA.PVOID | 書き込むファイルのアドレス |
szSize | CAA.SIZE | 書き込むファイルのサイズ |
・Output
name | Type |
|
xDone | BOOL | TRUE:実行完了 |
xBusy | BOOL | TRUE:実行中 |
xError | BOOL | TRUE:エラー発生 |
xAborted | BOOL | TRUE:ユーザによって処理が中断 |
eError | ERROR | どのようなエラーが出ているかを数字で表示 |
まずはファイルを読み込むためのFBを作成します。変数を以下のように宣言します。
処理は以下のようになります。
次にファイルに書き込むためのFBを作成します。変数を以下のように宣言します。
処理は以下のようになります。
これでFBの作成は終了です。
実装するのは
の2つです。
読み込み・書き込み処理をそれぞれFBにまとめることでメインプログラムを簡潔にすることができ、コードの再利用や修正も容易になります。
ボタン押下時のフラグ変数ですが、メインプログラム・ボタンクリックイベントの両方で使用するため、グローバル変数として宣言します。
グローバル変数:プロジェクト全体で使用できる変数のこと
続いてメインプログラムの変数宣言は次のようになります。
処理は以下のようになります。
このままではボタンを押下しても何も起きませんので、押下時にフラグ変数をTRUEとするために、以下のようにOnMouseClickの「STコードの実行」を利用します。
あとはテキストフィールドのフォーマットを%sに設定し、読み込みたいファイルをCODESYSのフォルダに保存すれば完了です。
※ファイルは「PlcLogic」フォルダに保存してください。もし、違う場所に保存したいという場合は、ファイルパスを適切に指定してください。
それではWriteボタン押下→Readボタン押下の順で実行してみます。
・Writeボタン押下
メッセージに「書き込みに成功しました。」と出てきましたね。無事に処理が行われたようです。
・Readボタン押下
元の「Hello World!!」という文章から「I am Bob.」が付け足された文章になっていますね。
ちなみにPlcLogicフォルダに保存してあるmytext.txtを確認してみると
確かにファイル内容が変更されています。
Visu→PLC、PLC→Visuの2方向でファイル転送ができるように実装します。
まずはVisu→PLCへのファイル転送です。
・Visu→PLC方向(Writer)のFB
以下のようにオブジェクトを追加してください。
その際にFBで実装するインターフェースをIMPLEMENTSしてからFBを右クリックし、[インターフェースの実装]をクリックすると、自動でインターフェースを追加してくれるため便利です。
それぞれのインターフェースやプロパティは次のような役割があります。
以下に具体的なコードを記載します。
・VisuStreamWriter
・Write
・StartOperation
・EndOperation
・Get(FileNameProposal)
・Set(Filename)
・PLC→Visu方向(Reader)のFB
Visu→PLC方向と同様に以下のようにオブジェクトを追加してください。
それぞれの役割は次の通りです。
以下に具体的なコードを記載します。
・VisuStreamReader
・Read
・StartOperation
・EndOperation
・Get(FileNameProposal)
ファイル転送をした際、正常に転送が行われているか否かを判定してくれる変数を宣言します。今回は変数宣言にグローバル変数を使用します。
グローバル変数の名前は何でもいいですが、ここではGVL_TransferStatusとしています。
メインプログラムなどと謳ってはいますが、FBで処理は実装し終わっているため、基本的にインスタンス化と制御フラグ用の変数の宣言をして終わりです。
VisuStreamWriterのみ、sFileNameTargetの値を代入していますが、後で詳しく説明します。
Visualizationにファイル転送用のボタンを2つ配置します。
ファイル転送と書かれたほうがVisu→PLC、ファイル保存と書かれたほうがPLC→Visuに対応します。
ファイル転送ボタンのプロパティから入力構成→OnMouseClickを選択し、ファイル転送をダブルクリックします。そして以下のように、それぞれ変数やインスタンスを設定します。
右下のボックスにチェックを入れるのを忘れないようにしてください。
ここで制御フラグについて詳しく紹介します。
Visu→PLCへの転送をする際に制御フラグをどれに設定するかで適用されるパスが異なってきます。
フラグは2つ用意されています。
フラグ1:VisuElems.VisuEnumFileTransferControlFlags.UseOriginalFileName
フラグ2:VisuElems.VisuEnumFileTransferControlFlags.ConfirmFileOverwriteInPlc
フラグの設定は3通りあり、
今回は制御フラグに何も設定をしないため、1つ目のようにパスが指定されます。
続いてファイル保存ボタンにも同様の設定をします。
PlcLogicフォルダにmyText.txtがない状態でWebVisuからファイル転送ボタンをクリックしてみます。するとダイアログが表示されるので、mytext.txtを選択し、[開く]をクリックします。
CODESYSのPlcLogicフォルダを確認してみると、ちゃんとファイルが転送できていることが確認できます。
次にファイル保存です。今回はPLC内部にある文字列をファイルとしてWebVisu側に転送するケースを考えます。実際にファイルを転送したい場合は、ファイル読み込みでファイルの中身を取り出すだけで対応できます。
今回転送する文字列はこちらです。では実際にファイルとして送ることができるか確認してみましょう。
ボタンをクリックし、転送されたファイルの中身を確認すると、ちゃんと転送できていることが確認できました。
ここまで、CODESYSを用いたファイルアクセスとWebVisuを使用したファイル転送についてご紹介しました。
インターフェースや継承など、オブジェクト指向の考えを用いているため、プログラミング初学者の自分には理解するのが難しい箇所が多々ありました。 しかしながら、今までうっすら避けてきたオブジェクト指向について学ぶ良い機会になりました。
またCODESYSはネット上に情報が少ないため、公式のOnlineHelpやForgeを頼りに勉強を進めなければいけません。 悩みながら英語の説明を読んで勉強したため、「自分で調べて学ぶ力」これも同時に養うことができたと思います。
CODESYSを使い始めてすぐの執筆だったため、拙い部分も多分にあったかと思いますが、自分と同じようなCODESYS初心者にとって少しでも参考になったら嬉しいです。
(D.M.)
関連ページへのリンク
関連するソフテックだより