HOME > ソフテックだより > 第463号(2024年12月4日発行) 技術レポート「CODESYSを用いたファイルアクセス・ファイル転送」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ


ソフテックだより 第463号(2024年12月4日発行)
技術レポート

「CODESYSを用いたファイルアクセス・ファイル転送」

1. はじめに

私は入社2か月目の本社事業所の社員です。まだまだ若輩者の私ですが、研修をするにあたってソフトウェアPLCのCODESYSに触れることになりました。今回行う研修内容は主に

  • CODESYSを使用したファイルアクセス
  • WebVisuを使用したファイル転送

の2つになります。

今回のソフテックだよりではこの2つに関しての仕様などについて紹介させていただきます。

2. CODESYSとは?

CODESYSは国際標準規格IEC61131-3に準拠したソフトウェアPLCや、統合開発環境を含んだオートメーションプラットフォームです。
IEC-61131-3が定める複数の言語やCFCのような規格外言語に対応しています。Visual Studioなどとは異なり、これらの複数の言語を1つのプロジェクト内で組み合わせて使用することができるのが特徴です。
またVisualizationという機能を用いてGUIを作成することも可能です。
Visualizationには

  • Web上でモニタリングできるWebVisu
  • ディスプレイ搭載のハードウェアでモニタリングできるTargetVisu

などがあります。
以下ではVisuはWebVisu・TargetVisu両方を指し、WebVisuはWebVisuだけを指すものとします。

CODESYSの環境構築や使い方に関しては”ソフテックだより第401号技術レポート「CODESYSを使ってみて〜簡易スタートアップガイド〜」” を参考にしていただければと思います。

3. CODESYSを使用したファイルアクセスの実装

3-1. FILE ACCESSライブラリの追加

まず新規プロジェクトを作成します。
その後ライブラリマネージャーから[ライブラリの追加]をクリックします。

検索欄にFile Accessと入力し、[File Access]を選択し、OKを押します。

これでファイルアクセスに関するライブラリの追加は完了です。ライブラリ追加をしたことでファイルアクセスに関するFunction Block(以下FB)が使用可能になっているはずです。

3-2. FILE ACCESSライブラリの追加

さきほど追加したライブラリを利用して実際にファイルアクセスをしてみましょう。

今回はこのような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 どのようなエラーが出ているかを数字で表示

3-3. ファイル読み込み・書き込みのFBを作成

まずはファイルを読み込むためのFBを作成します。変数を以下のように宣言します。

処理は以下のようになります。

次にファイルに書き込むためのFBを作成します。変数を以下のように宣言します。

処理は以下のようになります。

これでFBの作成は終了です。

3-4. メインプログラム作成

実装するのは

  • Readボタン押下時にFileReadが実行される処理
  • Writeボタン押下時にFileWriteが実行される処理

の2つです。
読み込み・書き込み処理をそれぞれFBにまとめることでメインプログラムを簡潔にすることができ、コードの再利用や修正も容易になります。
ボタン押下時のフラグ変数ですが、メインプログラム・ボタンクリックイベントの両方で使用するため、グローバル変数として宣言します。

グローバル変数:プロジェクト全体で使用できる変数のこと

続いてメインプログラムの変数宣言は次のようになります。

処理は以下のようになります。

このままではボタンを押下しても何も起きませんので、押下時にフラグ変数をTRUEとするために、以下のようにOnMouseClickの「STコードの実行」を利用します。



あとはテキストフィールドのフォーマットを%sに設定し、読み込みたいファイルをCODESYSのフォルダに保存すれば完了です。

※ファイルは「PlcLogic」フォルダに保存してください。もし、違う場所に保存したいという場合は、ファイルパスを適切に指定してください。

3-5. 実行してみる

それではWriteボタン押下→Readボタン押下の順で実行してみます。

・Writeボタン押下

メッセージに「書き込みに成功しました。」と出てきましたね。無事に処理が行われたようです。

・Readボタン押下

元の「Hello World!!」という文章から「I am Bob.」が付け足された文章になっていますね。

ちなみにPlcLogicフォルダに保存してあるmytext.txtを確認してみると

確かにファイル内容が変更されています。

4. VISUを使用したファイル転送

Visu→PLC、PLC→Visuの2方向でファイル転送ができるように実装します。
まずはVisu→PLCへのファイル転送です。

4-1. FBの実装

・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)

4-2. ステータス変数用の宣言

ファイル転送をした際、正常に転送が行われているか否かを判定してくれる変数を宣言します。今回は変数宣言にグローバル変数を使用します。

グローバル変数の名前は何でもいいですが、ここではGVL_TransferStatusとしています。

4-3. メインプログラムの作成

メインプログラムなどと謳ってはいますが、FBで処理は実装し終わっているため、基本的にインスタンス化と制御フラグ用の変数の宣言をして終わりです。

VisuStreamWriterのみ、sFileNameTargetの値を代入していますが、後で詳しく説明します。

4-4. クリックイベントの設定

Visualizationにファイル転送用のボタンを2つ配置します。

ファイル転送と書かれたほうがVisu→PLC、ファイル保存と書かれたほうがPLC→Visuに対応します。
ファイル転送ボタンのプロパティから入力構成→OnMouseClickを選択し、ファイル転送をダブルクリックします。そして以下のように、それぞれ変数やインスタンスを設定します。

右下のボックスにチェックを入れるのを忘れないようにしてください。

ここで制御フラグについて詳しく紹介します。
Visu→PLCへの転送をする際に制御フラグをどれに設定するかで適用されるパスが異なってきます。
フラグは2つ用意されています。
フラグ1:VisuElems.VisuEnumFileTransferControlFlags.UseOriginalFileName
フラグ2:VisuElems.VisuEnumFileTransferControlFlags.ConfirmFileOverwriteInPlc

フラグの設定は3通りあり、

  • 何も設定しない
    FileNameまたはインスタンス名のストリーミングで指定されたパスに保存されているファイルを選択
  • フラグ1に設定
    Visu実行時にユーザが指定したパスがPLCファイルシステム内のパスとして使用される
  • フラグ1・フラグ2両方設定
    クライアント側で指定されたパスにファイルが既に存在する場合、メッセージがVisuに表示され、ユーザがそれを確認してから上書きが実行されます。

今回は制御フラグに何も設定をしないため、1つ目のようにパスが指定されます。

続いてファイル保存ボタンにも同様の設定をします。

4-5. 実行してみる

PlcLogicフォルダにmyText.txtがない状態でWebVisuからファイル転送ボタンをクリックしてみます。するとダイアログが表示されるので、mytext.txtを選択し、[開く]をクリックします。



CODESYSのPlcLogicフォルダを確認してみると、ちゃんとファイルが転送できていることが確認できます。

次にファイル保存です。今回はPLC内部にある文字列をファイルとしてWebVisu側に転送するケースを考えます。実際にファイルを転送したい場合は、ファイル読み込みでファイルの中身を取り出すだけで対応できます。

今回転送する文字列はこちらです。では実際にファイルとして送ることができるか確認してみましょう。
ボタンをクリックし、転送されたファイルの中身を確認すると、ちゃんと転送できていることが確認できました。



5. おわりに

ここまで、CODESYSを用いたファイルアクセスとWebVisuを使用したファイル転送についてご紹介しました。

インターフェースや継承など、オブジェクト指向の考えを用いているため、プログラミング初学者の自分には理解するのが難しい箇所が多々ありました。 しかしながら、今までうっすら避けてきたオブジェクト指向について学ぶ良い機会になりました。

またCODESYSはネット上に情報が少ないため、公式のOnlineHelpやForgeを頼りに勉強を進めなければいけません。 悩みながら英語の説明を読んで勉強したため、「自分で調べて学ぶ力」これも同時に養うことができたと思います。

CODESYSを使い始めてすぐの執筆だったため、拙い部分も多分にあったかと思いますが、自分と同じようなCODESYS初心者にとって少しでも参考になったら嬉しいです。

(D.M.)


関連ページへのリンク

関連するソフテックだより

ページTOPへ