🧃

Sysmac Studioのシミュレータ上のプログラムでprintしてターミナルでモニタする

に公開

はじめに

本記事は、PLC(Programmable Logic Controller)向けのソフトウェア開発に従事、または関心のある方で、Structured Text(ST)による開発に興味がある方向けです。OMRON社のSysmac Studioを使用します。

Sysmac Studioのシミュレータ上で動作するプログラム内で文字列をprintしてターミナルで出力を確認します。いつか作ろうと思っていたのですが、シミュレータのブレークポイントが効かなくなってしまったので急遽作りました。

printは以下のように使用します。よく見るHello Worldです。

print('Hello World');

標準入出力を使用できるわけではありません。規定のファイルにいい具合に出力するだけです。それをtail風コマンドでモニタすることでリアルタイムに出力を確認することができます。実質、ただのログで、PowerShellのGet-Contentコマンドレットで連携できます。Git Bashのtailとは連携できませんでした。ファイルを監視する手段が異なるのかもしれません。地味ですがJSONで出力するとPowerShellでパイプしやすくなります。PowerShellは、v7.5.0を使用しました。古いバージョンによっては意図しない動作をする可能性があります。

サンプルプロジェクトを動作させ、PowerShellターミナルでモニタすると以下のようになります。

print関数の使用例
print関数の使用例

printの出力は以下をPowerShellのターミナルで実行してモニタします。

Monitor-Print.ps1
Get-Content -Path C:\OMRON\Data\SimulatorData\CARD\Memory001\dev\print -wait -tail 0 -Encoding UTF8

媒体となるファイルは以下を実行することで作成とクリアをします。

New-PrintFile.ps1
New-Item -Path C:\OMRON\Data\SimulatorData\CARD\Memory001\dev -Name print -ItemType "File" -Force

Sysmacプロジェクト

以下にSysmacプロジェクトがあります。

https://github.com/kmu2030/PrintLib

使い方

使用するプロジェクトで関連ライブラリを参照し、出力プログラムをタスクに登録することでprintを使用できるようになります。

  1. 関連ライブラリをプロジェクトで参照
    lib/LogStreamLib.slr、PrintLib.slrをプロジェクトで参照します。
  2. シングルトン変数をグローバル変数に登録
    gPrintSingleton: stfreakjp\develop\PrintContextを登録します。
  3. 出力プログラムをタスクに登録
    POU/プログラム/DefaultPrintRunnerをタスクに登録します。

実装

実装はロギング用に作ったファイル出力ライブラリを転用してシングルトンで動作するようにまとめました。何も考えずに使用できるように以下を要求しましたが、そもそもライブラリが満たしているので何もしていません。そのため、ライブラリのPOUを使用するだけになってしまいました。

  • マルチタスクに対応
  • 出力のリトライ機能

ファイルI/Oは、入力-処理-出力を体感する良い題材です。入力、出力のぞれぞれを任意に切り替えられようにし、入力と出力に依らず処理を同一にするために仕様と機能を抽象することになります。これは、装置制御にも応用できる考え方です。ファイルI/Oを、ファイル操作の手続きとしか考えないのはもったいないです。

まとめ

デバッグにprintを使うのは、褒められたことではありませんがつい使ってしまいます。これまでは無かったので使うことはありませんでしたが、これからは使ってしまいそうです。頻繁にファイルへ書き込むのは少し気になるので、RAMディスクをフォルダにマウントして正常に機能するのであれば、そうした方が良いと思います。思いがけずシミュレータのファイルI/OとGet-Contentコマンドレットの相性が良いことが分かったので、STUnitにオプションとしてJSON形式でのテスト出力を実装するかもしれません。

Discussion