Jieccは、IEC 61131-3のテキストをIEC 61131-10 XMLに変換するコマンドラインツールです。Windows 7以降の64bit OSにて動作します。
例えば、以下のIEC 61131-3テキストを、IEC 61131-10 XMLに変換します。
TYPE t: STRUCT m0: INT; m1: ARRAY[0..7] OF BOOL; END_STRUCT; END_TYPE // mainプログラム PROGRAM main VAR intv: INT; ints: ARRAY[0..2] OF INT := [2, 3, 5]; tv: t; END_VAR //{ST} FOR intv := 0 OT 2 BY 1 DO ints[intv] := intv[intv] + intv; END_FOR; //{END} END_PROGRAM
<?xml version="1.0" encoding="utf-8"?> <Project xmlns="www.iec.ch/public/TC65SC65BWG7TF10" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="www.iec.ch/public/TC65SC65BWG7TF10 IEC61131_10_Ed1_0.xsd" schemaVersion="1.0"> <FileHeader companyName="COMPANY NAME" productName="PRODUCT NAME" productVersion="1.0" /> <ContentHeader name="CONTENT NAME" creationDateTime="2023-09-01T00:00:00+09:00" /> <Types><GlobalNamespace> <DataTypeDecl name="t"> <UserDefinedTypeSpec xsi:type="StructTypeSpec"> <Member name="m0"> <Type><TypeName>INT</TypeName></Type> </Member> <Member name="m1"> <Type><InstantlyDefinedType><BaseType><TypeName>BOOL</TypeName></BaseType><DimensionSpec dimensionNumber="1"><IndexRange lower="0" upper="7" /></DimensionSpec></InstantlyDefinedType></Type> </Member> </UserDefinedTypeSpec> </DataTypeDecl> <Program name="main"> <Vars accessSpecifier="private"> <Variable name="intv"><Type><TypeName>INT</TypeName></Type></Variable> </Vars> <Vars accessSpecifier="private"> <Variable name="ints"> <Type><InstantlyDefinedType><BaseType><TypeName>INT</TypeName></BaseType><DimensionSpec dimensionNumber="1"><IndexRange lower="0" upper="2" /></DimensionSpec></InstantlyDefinedType></Type> <InitialValue> <ArrayValue> <Value><SimpleValue value="2" /></Value> <Value><SimpleValue value="3" /></Value> <Value><SimpleValue value="5" /></Value> </ArrayValue> </InitialValue> </Variable> </Vars> <Vars accessSpecifier="private"> <Variable name="tv"><Type><TypeName>t</TypeName></Type></Variable> </Vars> <MainBody> <BodyContent xsi:type="ST"><ST><![CDATA[FOR intv := 0 OT 2 BY 1 DO ints[intv] := intv[intv] + intv; END_FOR; ]]></ST></BodyContent> </MainBody> </Program> </GlobalNamespace></Types> <Instances> </Instances> </Project>
IEC 61131-10 XMLは、PLCメーカー間等の相互データ交換を容易にすることを目的とする規格ですが、ヒトがIEC 61131-10 XMLを直接書くのは非効率です。Jieccは、可読性もありヒトでも書けるIEC 61131-3テキストを、IEC 61131-10 XMLに自動変換することにより、メーカー間等の相互データ交換を維持しつつ、可読性のあるIEC 61131-3テキストで制御プログラムやライブラリを管理することを可能にします。
Download Jiecc!からzipファイルをダウンロードし解凍すると、次のファイルが展開されます。
jiecc.exe ; Jiecc実行ファイル本体 LICENSE.txt ; Jieccのライセンス情報です。 jiecc_homepage.url ; 本サイトへのショートカット iec_61131_sample/ ; IEC 61131-3テキストサンプルと、対応するIEC 61131-10 XML enum.txt,xml ; 列挙型定義 named_value.txt,xml ; 名前付き値型定義 struct.txt,xml ; 構造体型定義 array.txt,xml ; 配列変数定義 func.txt,xml ; ファンクション定義 fb.txt,xml ; FB定義 program.txt,xml ; プログラムPOU定義 namespace.txt,xml ; 名前空間定義 global_var.txt,xml ; グローバル変数定義 doc.txt,xml ; 各種要素ドキュメント header_info.txt,xml ; IEC 61131-10のヘッダ情報を設定するプラグマの使用例
変換を実行するには、Windowsのコマンドプロンプト等を起動後、jiecc.exeのあるフォルダに移動し、次の形式でコマンドを入力します。
$ jiecc.exe <入力IEC 61131-3テキストファイルパス> -o <出力IEC 61131-10 XMLファイルパス>
例えば、次のコマンドを入力すると、実行フォルダにenum.xml
が出力されます。
$ jiecc.exe .\iec_61131_sample\enum.txt -o .\enum.xml
`jiecc.exe --version
`で、jieccのバージョンを確認できます。その他のjieccコマンドのオプションについては、`jiecc.exe --help
`にて確認できます。
Jieccの入力仕様や特性について記載します。
JieccがサポートするIEC 61131-3テキストのエンコーディング方式は、UTF-8です。改行コードは、LFをサポートします。
Jieccは、構文を除き、validation機能を持ちません。入力のIEC 61131-3テキストを可能な限り、IEC 61131-10 XMLに変換しようとします。
例えば、次のIEC 61131-3テキストは、同じ名前の変数aがプログラムPOUに定義されているため、IEC 61131-3の仕様的には不正なプログラムです。しかし、Jieccはこれを異常とせず、VAR_TEMPのaとVARのaを含むIEC 61131-10 XMLを生成します。
PROGRAM main VAR_TEMP a: BOOL; END_VAR VAR a: INT; END_VAR END_PROGRAM
また、ファンクション内でVAR変数を定義している次のプログラムは、IEC 61131-3の仕様的には正しいですが、IEC 61131-10 XMLの仕様では不正となります。このようなプログラムについても、Jieccは可能な限り、XMLを生成しようとします。
FUNCTION f: BOOL VAR v: INT; END_VAR // IEC 61131-10的には不正 END_FUNCTION
最終的な確認はターゲット環境にて実施ください。現状では、OMRON社製Sysmac Studioがサポートしています。
ST言語などのプログラムコードをPOU内に記述するには、プラグマ{ST}~{END}
を使用して次のように記述します。
PROGRAM main VAR intv: INT; END_VAR {ST} intv := 3; intv := intv + 1; {END} END_PROGRAM
上記は次のように出力されます。{ST}~{END}
内の文字列がそのまま出力されます。get-line, __line__プラグマ等も置換されずそのまま出力されることに注意ください。
: <Program name="main"> <Vars accessSpecifier="private"> <Variable name="intv"> <Type><TypeName>INT</TypeName></Type> </Variable> </Vars> <MainBody> <BodyContent xsi:type="ST"><ST><![CDATA[intv := 3; intv := intv + 1; ]]></ST></BodyContent> </MainBody> </Program> :
JieccのIEC 61131-3言語要素のサポート状況は下表の通りです。Yesのない要素は、未サポートか又はテストされていません。
言語要素 | サポート |
---|---|
基本型: 符号有り整数型; SINT, INT, DINT, LINT | Yes |
基本型: 符号無し整数型; USINT, UINT, UDINT, ULINT | Yes |
基本型: 実数型; REAL, LREAL | Yes |
基本型: ビット列型; BYTE, WORD, DWORD, LWORD | Yes |
基本型: 真偽型; BOOL | Yes |
基本型: 時間型; TIME, LTIME | Yes |
基本型: 日付型; DATE, LDATE | Yes |
基本型: 時刻型; TIME_OF_DAY, LTIME_OF_DAY | Yes |
基本型: 日付時刻型; DATE_AND_TIME, LDATE_AND_TIME | Yes |
基本型: 文字列型: STRING, WSTRING | Yes |
列挙型定義 | Yes |
名前付き値型定義 | Yes |
構造体型定義; STRUCT | Yes |
構造体属性; AT, OVERLAP | |
範囲型定義 | |
参照型定義; REF_TO | |
配列型定義; ARRAY | |
直接派生型定義 | |
名前空間定義; NAMESPACE | Yes |
名前空間属性; INTERNAL | |
USINGディレクティブ | Yes |
ファンクション定義; FUNCTION | Yes |
FB定義; FUNCTION_BLOCK | Yes |
オブジェクト指向FB定義 | |
プログラムPOU定義; PROGRAM | Yes |
クラス定義; CLASS | |
クラス属性; ABSTRACT, FINAL | |
継承; EXTENDS | |
インタフェース定義 | |
IMPLEMENTS | |
メソッド定義; METHOD | |
メソッド属性; OVERRIDE | |
基本型変数定義 | Yes |
範囲型変数定義 | Yes |
配列型変数定義; ARRAY | Yes |
可変長配列型変数定義; [*] | Yes |
参照型変数定義; REF_TO | |
変数属性; AT, CONSTANT, RETAIN, NON_RETAIN, R_EDGE, F_EDGE | Yes |
ローカル変数定義; VAR_TEMP, VAR, VAR_EXTERNAL, VAR_INPUT, VAR_IN_OUT, VAR_OUTPUT | Yes |
基本型初期値 | Yes |
構造体初期値 | Yes |
配列初期値 | Yes |
配列初期値の繰り返し指定; n(...) | Yes |
ST言語プログラム; {ST}~{END} | Yes |
ST言語を除くプログラム; {IL, LD, FBD, SFC}~{END} | |
コンフィグレーション定義; CONFIGURATION | Yes |
リソース定義; RESOURCE | Yes |
グローバル変数定義; VAR_GLOBAL | Yes |
アクセス属性; PRIVATE, PROTECTED, PUBLIC | |
VAR_ACCESS | |
VAR_ACCESS変数属性; READ_ONLY, READ_WRITE | |
VAR_CONFIG | |
タスク定義; TASK, WITH | |
プラグマ; {~} | Yes |
変換後のIEC 61131-10にはいくつかの必須属性があり、FileHeader
タグのcompanyName
(会社名)属性はその一つです。もちろん、IEC 61131-3にはこの属性を指定する正式な方法は存在しませんが、IEC 61131-10の必須属性ですので、設定できなければ困ります。
この問題の解決に、IEC 61131-3のプラグマを使用します。プラグマは、IEC 61131-3サポートメーカーの独自拡張のために存在します。{The pragma}
のように記述しますが、{~}
の内容にIEC 61131-3の特別な規定はありません。メーカーが独自に規定します。Jieccでは、IEC 61131-10の必須属性の設定のためだけでなく、C言語のプリプロセッサのlineディレクティブ相当や、IEC 61131-10に埋め込む要素のコメントなど、IEC 61131-3でサポートされない様々なことを実現するために活用します。Jieccがサポートするプラグマについては、本サイトで説明しています。
一方、プラグマの構文{~}
をサポートしているメーカーは少なく、メーカーのエディタ上に書くと構文エラーを発生させます。Jieccでは、構文エラーを発生させないために、{~}
の記法に加え、次の3つの記法をサポートしています。これらは全てJiecc固有のプラグマの別記法です。この記法は、IEC 61131-3規定のコメントの中に記述されていますので、どのメーカーにとっても無害です。
//{~} (*{~}*) /*{~}*/
Jiecc固有の仕様として、すべてのプラグマの構文は、{key:value}
です。valueの指定が必要のないプラグマは、{key:}
のように記述します。
Jieccのコマンドラインから指定できるオプションの多くは本章で示すプラグマでも指定できます。両方指定している場合、コマンドラインオプションが優先されます。
下表のプラグマは、出力するIEC 61131-10 XMLのFileHeader
タグの属性値を指定します。
// {company-name: Jiecc Corp.} // {company-url: https://www.graviness.com/iec_61131-3/jiecc.html}
FileHeaderタグ属性名 | プラグマ名 | プラグマ値 |
---|---|---|
companyName | company-name | IEC 61131-10規格に従う |
companyURL | company-url | IEC 61131-10規格に従う |
productName | product-name | IEC 61131-10規格に従う |
productVersion | product-version | IEC 61131-10規格に従う |
productRelease | product-release | IEC 61131-10規格に従う |
下表のプラグマは、出力するIEC 61131-10 XMLのContentHeader
タグの属性値を指定します。
creation-datetime
、およびmodification-datetime
の値には、2023-09-01T00:00:00+09:00
のような日付時刻を直接指定する他にTODAY
、およびNOW
を指定できます。それぞれ、本日の日付(時刻を00:00:00固定)、今の時間(秒含めて正確)に置き換えられます。
// {content-name: Xxx装置}
ContentHeaderタグ属性名 | プラグマ名 | プラグマ値 |
---|---|---|
name | content-name | IEC 61131-10規格に従う |
version | content-version | IEC 61131-10規格に従う |
creationDateTime | creation-datetime | IEC 61131-10規格に従う |
modificationDateTime | modification-datetime | IEC 61131-10規格に従う |
organization | organization | IEC 61131-10規格に従う |
author | author | IEC 61131-10規格に従う |
language | language | IEC 61131-10規格に従う |
doc
プラグマは、IEC 61131-10 XMLのDocumentation
タグに相当し、変数などの要素のコメントを付加するために使用します。コメントを付加する要素の宣言の前に記述します。
// {doc: ファンクションfのコメントです。} FUNCTION f: DINT VAR_INPUT // {doc: 入力変数inのコメントです。} in: DINT; END_VAR END_FUNCTION
return-doc
プラグマは、戻り値変数のコメントを指定するために使用します。IEC 61131-10に対応する要素はなく、ターゲットがOMRONのときのみ意味があります。
// {return-doc: ファンクションfのコメントです。} FUNCTION f: BOOL END_FUNCTION
order
プラグマは、IEC 61131-10 XMLの引数変数宣言に対するorderWithinParamSet
属性を設定します。
FUNCTION f: BOOL VAR_INPUT // {order: 3} i_third: INT; // {order: 1} i_first: INT; // {order: 2} i_second: INT; END_VAR : END_FUNCTION
include
プラグマは、C言語プリプロセッサのincludeディレクティブに相当し、指定のパスにあるファイルを読み込みます。
指定のパスが相対パスのとき、処理しているファイルのパスが基準になります。例えば、以下のファイルが、srcディレクトリにある場合、src/lib/x.txtを読み込みます。
{include: ./lib/x.txt} PROGRAM main END_PROGRAM
line-separator
プラグマは、IEC 61131-10 XML出力時の改行文字を指定します。
// XMLの改行をCR-LFで出力します。 // {line-separator: $r$n}
target
プラグマは、変換先のターゲットを指定します。デフォルト値は、DEFAULT
(IEC 61131-3準拠)です。
// {target: OMRON} // {return-doc: 戻り値変数のコメントです。} FUNCTION f: BOOL END_FUNCTION
現在サポートしているターゲット一覧を下表に示します。
ターゲット | 値 |
---|---|
IEC 61131-10規格準拠 | DEFAULT |
OMRON社製Sysmac Studio準拠 | OMRON |
id
プラグマは、IEC 61131-3では記述することが難しいパス文字列や識別子を記述します。
VAR // vのAT属性値は半角空白を含む'%xxx://x y 3'になります。 v AT {id: %xxx://x y 3} : BOOL; END_VAR
set-line, line
プラグマは、C言語プリプロセッサのlineディレクティブに相当し、プラグマを記述した行の番号がプラグマで指定した番号になります。
{set-line: 4} PROGRAM main // mainは6行目で定義された要素と解釈されます。 END_PROGRAM
get-line, __line__
プラグマは、C言語プリプロセッサの__LINE__マクロに相当し、プラグマが行番号に置換されます。
st, endプラグマ内では、置換されないことに注意してください。
st, end
プラグマは、ST言語等のプログラムコードを記述するために使用します。詳しくは、ST言語などのプログラムコード部の記述方法を参照ください。
PROGRAM main VAR intv: INT; END_VAR {ST} intv := 3; intv := intv + 1; {END} END_PROGRAM
Jieccは、IEC 61131-3の構文仕様を拡張した独自構文をサポートしています。プラグマはその一つです。IEC 61131-3に準拠する構文のみを使用する必要がある場合、本章の内容に注意ください。
ENDキーワードは、あらゆる"始まり"の構文に対応する"終わり"として使用できます。
TYPE ... END PROGRAM main ... END
(* VAR V1: INT := 0; v2: INT := 0; v3: INT := 0; END_VAR *) // 以下は、上記宣言と等価です。 VAR v1, v2, v3: INT := 0; END_VAR
(* VAR CONSTANT v1: INT := 2; END_VAR VAR CONSTANT RETAIN v2: INT := 3; END_VAR *) // 以下は、上記宣言と等価です。 VAR v1: INT CONSTANT := 2; v2: INT CONSTANT RETAIN := 3; END_VAR
VAR // 'ab|cde|f'と等価です。 stringv: STRING[100] := 'ab' '|' 'cde' '|' 'f'; END_VAR
10#12; // 基数10の12、即ち12です。IEC 61131-3では、基数2, 8, 16のみ規定されています。 36#12; // 基数36の12、即ち38です。
プログラムの自動生成時に有用な末尾カンマ(trailing comma)構文をサポートします。
TYPE e_t: (e0, e1,); END_TYPE : VAR a: ARRAY[0..3] OF INT := [1, 2, 3, 4,]; END_VAR
TYPE // e_tをDINT (e0 := 2, e1 := 3)と解釈します。 e_t: (e0 := 2, e1 := 3); END_TYPE
変数名等に使用できる識別子の制約が、IEC 61131-3規格の識別子よりも少ないです。
VAR __a__: INT; END_VAR
jieccコマンドは、変換時に異常や"異常相当"を検出した場合、標準エラー出力にエラー情報を出力します。
例えば、以下のコマンドの実行結果は、illegal_syntax.txt の2行目のTYPEキーワードの位置で構文エラー(0x41000001)が発生したことを意味します。
$ jiecc.exe illegal_syntax.txt error:2.0: 0x41000001: 'TYPE_BLOCK' $
複数のエラー情報が出力されることもあります。個々のエラーは、エラーコード一覧にて確認できる下表に示すエラーレベルと特性を持ちます。
エラーレベル | マスク値 | 変換結果※1 |
---|---|---|
SEVERE | 0x80000000 | 不正 |
ERROR | 0x40000000 | 不正 |
WARNING | 0x20000000 | 不正の可能性有り |
INFO | 0x10000000 | -(変換結果に影響なし) |
jieccコマンドの戻り値については、SEVERE又はERRORのエラー情報が含まれるときに限り、1以上となります。以降では、エラーコードとその意味について示します。
※1 Jieccは、不正を検出すると変換処理を中止します。一方、既に生成した、変換結果となり得るファイルについては、削除等しません。ファイル書き込み中にメモリ不足になったりするケースがこれに該当します。jieccコマンドの戻り値が1以上であるか、SEVERE、又はERRORのエラーメッセージが表示されている場合、変換結果は不正です。
エラーコードの一覧を下表に示します。
Code | Symbol | Kind |
---|---|---|
0x80000001 | FATAL | SEVERE |
0x44000002 | UNSUPPORTED_LANGUAGE | ERROR | APP |
0x44000001 | NOT_IMPLEMENTED_ERROR | ERROR | APP |
0x42400008 | CIRCULAR_INCLUDE | PRAGMA | IO | ERROR |
0x42000002 | FILE_NOT_FOUND | IO | ERROR |
0x42000001 | FILE_ERROR | IO | ERROR |
0x41400001 | INVALID_SYNTAX_FOR_PRAGMA | SYNTAX | PRAGMA | ERROR |
0x41040001 | INVALID_SYNTAX_FOR_CODEBLOCK | SYNTAX | PROG | ERROR |
0x41002002 | INVALID_CHARACTER | TOKEN | SYNTAX | ERROR |
0x41002001 | INVALID_TOKEN | TOKEN | SYNTAX | ERROR |
0x41000003 | INVALID_SYNTAX_FOR_STRING | SYNTAX | ERROR |
0x41000002 | INVALID_SYNTAX_FOR_COMMENT | SYNTAX | ERROR |
0x41000001 | INVALID_SYNTAX | SYNTAX | ERROR |
0x40200201 | VALUED_ENUM_WITH_NO_BASETYPE | TYPE | ERROR | DECL |
0x40001001 | INVALID_BASE_NUMBER | LIT | ERROR |
0x24000001 | NOT_IMPLEMENTED_WARNING | WARNING | APP |
0x21002001 | RESERVED_KEYWORD_USED_WARNING | WARNING | TOKEN | SYNTAX |
0x20400001 | UNKNOWN_PRAGAMA_WARNING | WARNING | PRAGMA |
0x20001001 | FLOATING_POINT_WARNING_IN_DURATION | WARNING | LIT |
0x20000101 | INTERNALVAR_IN_FUNCTION_WARNING | WARNING | VAR |
0x20000001 | UNKNOWN_ELEMENT_WARNING | WARNING |
工事中🙏; コマンド実行時に表示される0x~のエラーコードをエラーコード一覧から検索してヒントを得てください。
日付 | 更新内容 |
---|---|
2023/09/17 | Jiecc 0.2.0をリリースしました。 |
Jieccには次に示す既知の不具合や改善項目があります。随時、対応していきます。
ID | 項目 | 対象 | 補足 |
---|---|---|---|
BUG-1 | IEC 61131-10のInstantlyDefinedType要素にxsi:type属性がない。 | Ver.0.2.0~ | 配列変数宣言、範囲属性を持つ変数宣言が関連する。 |
ENH-1 | USINGディレクティブの複数引数に対応する。 | Ver.0.2.0~ | USING a, b.c, d;といった構文のこと。 |
Jieccは、The 2-Clause BSD Licenseに従うフリーソフトウェアです。詳しくは、ダウンロードしたファイルに同梱されているLICENSE.txtを参照ください。
Jieccに関する問い合わせ・改善要望等については、Blogのコメントにて記載するか、管理者メールアドレスに連絡ください。