JiecUnitは、テキスト形式で記述されたIEC 61131-3言語のPOUを単体テストするためのフレームワークです。
特徴は、テスト対象POUのソースコード、単体テストコード、JiecUnit自体のソースコードがすべてIEC 61131-3 ST言語を拡張したテキスト形式で完結している点です。これにより、Git等で直接構成管理が可能です。Visual Studio Codeなどの対応IDEによっては生成AIを活用したIEC 61131-3プログラミングも可能です。
このテキスト形式コードをPLCメーカーのツールで取り込み可能な形式に変換するため、IEC 61131-3 ⇄ IEC 61131-10変換ソフトウェア Jieccを使用します。
JiecUnitは現在、IEC 61131-10 XMLをサポートする以下の環境に対応しています。
- オムロン社製Sysmac Studio
- キーエンス社製KV Studio
- CODESYS社製CODESYS
JiecUnitのサンプル単体テストを実行するには、以下の環境が必要です。
- Jiecc 5.14以降
- Jieccは、IEC 61131-3テキストをIEC 61131-10 XMLに変換する無料のコマンドラインソフトウェアです。Jieccのダウンロードと実行方法を参照してください。
- Sysmac Studio(試用期間制限あり)、KV Studio(試用回数制限あり)、またはCODESYS
- いずれも同梱シミュレータでテスト可能。必要に応じてPLC本体もご用意ください。
まず、JiecUnitプロジェクトをダウンロードします。mainブランチのDownload ZIPで取得するか、git clone https://github.com/yunos0987/jiecunit.gitでクローンしてください。
JiecUnitプロジェクトには、単体テスト実行可能なサンプルがsamplesディレクトリにあります。samples/sample_pous.iecには、テスト対象POUとして以下2つが含まれます。
meanファンクション:配列入力の平均値を計算RunningMeanファンクションブロック:状態を記憶し逐次平均値を出力
samples/sample.iecには、上記POUをテストする2つのテストプログラムtest_meanとtest_RunningMeanが含まれています。
テストサンプルの実行方法は環境ごとに異なります。
- コマンドプロンプトを起動し、次のコマンドを実行します。
コマンド内の<JiecUnit Project Root>はJiecUnitプロジェクトをダウンロードしたディレクトリに変更してください。また、事前にjiecc.exeを<JiecUnit Project Root>直下におくか、jieccがあるディレクトリへパスを通しておいてください。
$ cd <JiecUnit Project Root>
$ jiecc .\samples\sample.iec -I. -I.\sys -t omron -o .\samples\sample.xml
.\samples\sample.xmlが出力されます。
- 出力された
.\samples\sample.xmlをSysmac StudioのIEC 61131-10インポート機能 [ ツール | IEC 61131-10 XML | インポート ] でインポートします。
単体テストを実行するためのグローバル変数、データ型、およびPOUがインポートされます。インポート完了後に次のダイアログが表示されるので、OKを押下します。
- Sysmac Studioのタスク設定でプライマリ定周期タスクに以下のようにプログラムを割り付けます(マルチビューエクスプローラ|構成・設定|タスク設定|プログラムの割付設定|)。必要に応じて、デフォルトで作成されるProgram0プログラムを削除してください。特に、
JiecUnitMainが先頭になるように設定してください。
JiecUnitMaintest_meantest_RunningMean
- ビルド(F8キー)し、シミュレータ(F5キー)や実機で実行します。
- テストの実行結果がグローバル変数
g_consoleに出力されます。
2つのテストtest_meanとtest_RunningMeanが実行され、テストをパス(成功)したことを意味します。
以下は、テストが失敗したときの例です。テストtest_RunningMeanのテストコード57行目の3サイクル目(@2)において、期待値は5であったが、実値は3となり、失敗したことを意味します。
※57行目という数字は、XMLにコンバートする前のテキストの行番号です。これをSysmac Studio上のtest_RunningMeanの行数で表示するテクニックは、Jieccソフトウェアの機能を活用します。ここでは、深く述べません。
- コマンドプロンプトを起動し、次のコマンドを実行します。
コマンド内の<JiecUnit Project Root>はJiecUnitプロジェクトをダウンロードしたディレクトリに変更してください。また、事前にjiecc.exeを<JiecUnit Project Root>直下におくか、jieccがあるディレクトリへパスを通しておいてください。
$ cd <JiecUnit Project Root>
$ jiecc .\samples\sample.iec -I. -I.\sys -t keyence -o .\samples\sample.xml
.\samples\sample.xmlが出力されます。
- 出力された
.\samples\sample.xmlをKV StudioのIEC 61131-10インポート機能 [ ファイル | インポート | IEC 61131-10 XMLのインポート ] でインポートします。
単体テストを実行するためのグローバル変数、データ型、およびPOUがインポートされます。インポート完了後に次のダイアログが表示されるので、OKを押下します。
- KV Studioのワークスペースにおいて、毎スキャンモジュールが次のようになっていることを確認します。必要に応じて、デフォルトで作成される
Mainモジュールを削除してください。特にJiecUnitMainが先頭になっていることを確認してください。
JiecUnitMaintest_meantest_RunningMean
- 変換(Ctrl+F9キー)し、シミュレータ(Ctrl+F2キー)や実機で実行(シミュレータの場合、[ デバッグ | RUN ])します。
- テストの実行結果がグローバル変数
g_consoleに出力されます。
2つのテストtest_meanとtest_RunningMeanが実行され、テストをパス(成功)したことを意味します。
以下は、テストが失敗したときの例です。テストtest_RunningMeanのテストコード56行目の3サイクル目(@2)において、期待値は5であったが、実値は3となり、失敗したことを意味します。
※56行目という数字は、XMLにコンバートする前のテキストの行番号です。これをKV Studio上のtest_RunningMeanの行数で表示するテクニックは、Jieccソフトウェアの機能を活用します。ここでは、深く述べません。
事前にCODESYSのIEC 61131-10のインポート機能を有効化しておいてください。
- コマンドプロンプトを起動し、次のコマンドを実行します。
コマンド内の<JiecUnit Project Root>はJiecUnitプロジェクトをダウンロードしたディレクトリに変更してください。また、事前にjiecc.exeを<JiecUnit Project Root>直下におくか、jieccがあるディレクトリへパスを通しておいてください。
$ cd <JiecUnit Project Root>
$ jiecc .\samples\sample.iec -I. -I.\sys -t codesys -o .\samples\sample.xml
.\samples\sample.xmlが出力されます。
- CODESYSにてNew ProjectにてEmpty projectを作成し、出力された
.\samples\sample.xmlをCODESYSのIEC 61131-10インポート機能 [File | Import IEC 61131-10] でインポートします。
インポートダイアログが表示されます。
- OKボタンを押下します。
単体テストを実行するためのコンフィグレーション、リソース、グローバル変数、データ型、POUがインポートされます。
-
CODESYSのDevices画面において、インポートされたMainConfigurationを右クリックし、Update Device...から適切なデバイスを設定します。
-
POUs画面において、以下画像の通りにオブジェクトを選択し(Project Settings以外を選択し)、Devices画面のMainResourceにドラッグ&ドロップします。
MainResouce下にオブジェクトが移動されます。
- Devices画面において、MainResourceを右クリックし、Add Object | Task Configuration... し、追加されたTask Configurationを次のように設定します。特に
JiecUnitMainが先頭になっていることを確認してください。
JiecUnitMaintest_meantest_RunningMean
- Devices画面のLibrary Managerを選択し、AddLibraryを選択し、次の画面のようにStandard Libraryの
CONCATを選択した状態にし、OKボタンを押下します。
Standardライブラリが追加されます。
- Generate Code(F11キー)すると、「C0174: VAR_TEMP declaration not allowed in this place」エラーが複数出力されますので、Replaceダイアログで次のように設定し、Replace Allボタンを押下します。
ソースコード内のすべてのVAR_TEMPがVARに置換されます。
-
Generate Code(F11キー)し、成功することを確認します。シミュレーションや実機で実行(シミュレーションの場合、[ Debug | F5 ])します。
-
テストの実行結果がグローバル変数
g_consoleに出力されます。
2つのテストtest_meanとtest_RunningMeanが実行され、テストをパス(成功)したことを意味します。
以下は、テストが失敗したときの例です。テストtest_RunningMeanのテストコード58行目の3サイクル目(@2)において、期待値は5.0であったが、実値は3.0となり、失敗したことを意味します。
※58行目という数字は、XMLにコンバートする前のテキストの行番号です。これをCODESYS上のtest_RunningMeanの行数で表示するテクニックは、Jieccソフトウェアの機能を活用します。ここでは、深く述べません。
- jiecunit.iec:JiecUnitユーザが使用すべき公開API。テスト記述用のマクロや関数群を定義。
- docsディレクトリ:補助資料(各種画像、説明図、メーカー別手順、技術資料など)を格納。
- samplesディレクトリ:JiecUnitの使い方サンプル。テスト対象POU(sample_pous.iec)とテストコード(sample.iec)を含む。
- srcディレクトリ:JiecUnit本体のソースコード。コア機能、テスト実行エンジン、設定ファイルなど。
- sysディレクトリ:JiecUnitの動作に必要な補助的コード。型変換ファンクション、コンソール出力、メーカー依存の補助関数など。
- testディレクトリ:JiecUnit自体の単体テストコード。各種マクロ・内部関数の動作検証用テストファイル(test_jiectest.iec等)を含む。
- checkディレクトリ:テスト結果(XMLファイル等)の出力先。テスト実行時に生成される成果物を格納。
- wsディレクトリ:作業用・バックアップ用ディレクトリ。履歴管理や一時保存に利用。
- README.md:本ドキュメント。使い方・構成・サポート状況などを記載。
- LICENSE:ライセンス情報。
- VERSION:バージョン管理用ファイル。
- VERSION_MANAGEMENT.md:バージョン管理の運用ルールや履歴。
ターゲットの環境ごとに以下のコマンドを実行し、上述と同じ手順を実行します。
$ cd <JiecUnit Project Root>
$ mkdir check
$ cd check
$ jiecc -I.. -I..\sys ..\test\test.iec -o .\test.xml -t omron
or
$ jiecc -I.. -I..\sys ..\test\test.iec -o .\test.xml -t keyence
or
$ jiecc -I.. -I..\sys ..\test\test.iec -o .\test.xml -t codesys
| 項目 | OM (Sysmac) | KE (KV) | CO (CODESYS) |
|---|---|---|---|
| データ型 SINT | ✓ | ✓ | |
| データ型 INT | ✓ | ✓ | ✓ |
| データ型 DINT | ✓ | ✓ | ✓ |
| データ型 LINT | ✓ | ✓ | |
| データ型 USINT | ✓ | ✓ | |
| データ型 UINT | ✓ | ✓ | ✓ |
| データ型 UDINT | ✓ | ✓ | ✓ |
| データ型 ULINT | ✓ | ✓ | |
| データ型 REAL | ✓ | ✓ | ✓ |
| データ型 LREAL | ✓ | ✓ | ✓ |
| データ型 BYTE | ✓ | ✓ | |
| データ型 WORD | ✓ | ✓ | |
| データ型 DWORD | ✓ | ✓ | |
| データ型 LWORD | ✓ | ✓ | |
| データ型 TIME | ✓ | ✓ | |
| データ型 BOOL | ✓ | ✓ | ✓ |
| データ型 DATE | ✓ | ✓ | |
| データ型 TIME_OF_DAY | ✓ | ✓ | |
| データ型 DATE_AND_TIME | ✓ | ✓ | |
| データ型 STRING | ✓ | ✓ | ✓ |
| データ型 WSTRING | ✓ | ||
| 構造体 | ✓ | ✓ | ✓ |
| FB | ✓ | ✓ | ✓ |
| 配列 | ✓ | ✓ | ✓ |
このプロジェクトはMIT Licenseのもとで公開されています。詳細はLICENSEファイルをご参照ください。
Graviness Blogもご参照ください。
















