IEC 61131-3 to 10変換器 Jiecc

Jieccとは

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
IEC 61131-3テキスト(変換前)
<?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(変換後)

IEC 61131-10 XMLは、PLCメーカー間等の相互データ交換を容易にすることを目的とする規格ですが、ヒトがIEC 61131-10 XMLを直接書くのは非効率です。Jieccは、可読性もありヒトでも書けるIEC 61131-3テキストを、IEC 61131-10 XMLに自動変換することにより、メーカー間等の相互データ交換を維持しつつ、可読性のあるIEC 61131-3テキストで制御プログラムやライブラリを管理することを可能にします。

Jieccのダウンロードと実行方法

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 .\iec_61131_sample\enum.txt -o .\enum.xml
シンプルなjieccコマンドの実行例

`jiecc.exe --version`で、jieccのバージョンを確認できます。その他のjieccコマンドのオプションについては、`jiecc.exe --help`にて確認できます。

Jieccの仕様

Jieccの入力仕様や特性について記載します。

エンコーディング方式

JieccがサポートするIEC 61131-3テキストのエンコーディング方式は、UTF-8です。改行コードは、LFをサポートします。

validation機能

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言語などのプログラムコード部の記述方法

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, LINTYes
基本型: 符号無し整数型; USINT, UINT, UDINT, ULINTYes
基本型: 実数型; REAL, LREALYes
基本型: ビット列型; BYTE, WORD, DWORD, LWORDYes
基本型: 真偽型; BOOLYes
基本型: 時間型; TIME, LTIMEYes
基本型: 日付型; DATE, LDATEYes
基本型: 時刻型; TIME_OF_DAY, LTIME_OF_DAYYes
基本型: 日付時刻型; DATE_AND_TIME, LDATE_AND_TIMEYes
基本型: 文字列型: STRING, WSTRINGYes
列挙型定義Yes
名前付き値型定義Yes
構造体型定義; STRUCTYes
構造体属性; AT, OVERLAP
範囲型定義
参照型定義; REF_TO
配列型定義; ARRAY
直接派生型定義
名前空間定義; NAMESPACEYes
名前空間属性; INTERNAL
USINGディレクティブYes
ファンクション定義; FUNCTIONYes
FB定義; FUNCTION_BLOCKYes
オブジェクト指向FB定義
プログラムPOU定義; PROGRAMYes
クラス定義; CLASS
クラス属性; ABSTRACT, FINAL
継承; EXTENDS
インタフェース定義
IMPLEMENTS
メソッド定義; METHOD
メソッド属性; OVERRIDE
基本型変数定義Yes
範囲型変数定義Yes
配列型変数定義; ARRAYYes
可変長配列型変数定義; [*]Yes
参照型変数定義; REF_TO
変数属性; AT, CONSTANT, RETAIN, NON_RETAIN, R_EDGE, F_EDGEYes
ローカル変数定義; VAR_TEMP, VAR, VAR_EXTERNAL, VAR_INPUT, VAR_IN_OUT, VAR_OUTPUTYes
基本型初期値Yes
構造体初期値Yes
配列初期値Yes
配列初期値の繰り返し指定; n(...)Yes
ST言語プログラム; {ST}~{END}Yes
ST言語を除くプログラム; {IL, LD, FBD, SFC}~{END}
コンフィグレーション定義; CONFIGURATIONYes
リソース定義; RESOURCEYes
グローバル変数定義; VAR_GLOBALYes
アクセス属性; 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固有のプラグマの書き方

Jiecc固有の仕様として、すべてのプラグマの構文は、{key:value}です。valueの指定が必要のないプラグマは、{key:}のように記述します。

Jieccのコマンドラインから指定できるオプションの多くは本章で示すプラグマでも指定できます。両方指定している場合、コマンドラインオプションが優先されます。

IEC 61131-10 FileHeaderタグの属性

下表のプラグマは、出力するIEC 61131-10 XMLのFileHeaderタグの属性値を指定します。

// {company-name: Jiecc Corp.}
// {company-url: https://www.graviness.com/iec_61131-3/jiecc.html}
FileHeaderタグの属性プラグマ
FileHeaderタグ属性名プラグマ名プラグマ値
companyNamecompany-nameIEC 61131-10規格に従う
companyURLcompany-urlIEC 61131-10規格に従う
productNameproduct-nameIEC 61131-10規格に従う
productVersionproduct-versionIEC 61131-10規格に従う
productReleaseproduct-releaseIEC 61131-10規格に従う

IEC 61131-10 ContentHeaderタグの属性

下表のプラグマは、出力する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タグの属性プラグマ
ContentHeaderタグ属性名プラグマ名プラグマ値
namecontent-nameIEC 61131-10規格に従う
versioncontent-versionIEC 61131-10規格に従う
creationDateTimecreation-datetimeIEC 61131-10規格に従う
modificationDateTimemodification-datetimeIEC 61131-10規格に従う
organizationorganizationIEC 61131-10規格に従う
authorauthorIEC 61131-10規格に従う
languagelanguageIEC 61131-10規格に従う

doc

docプラグマは、IEC 61131-10 XMLのDocumentationタグに相当し、変数などの要素のコメントを付加するために使用します。コメントを付加する要素の宣言の前に記述します。

// {doc: ファンクションfのコメントです。}
FUNCTION f: DINT
	VAR_INPUT
		// {doc: 入力変数inのコメントです。}
		in: DINT;
	END_VAR
END_FUNCTION

return-doc

return-docプラグマは、戻り値変数のコメントを指定するために使用します。IEC 61131-10に対応する要素はなく、ターゲットがOMRONのときのみ意味があります。

// {return-doc: ファンクションfのコメントです。}
FUNCTION f: BOOL
END_FUNCTION

order

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

includeプラグマは、C言語プリプロセッサのincludeディレクティブに相当し、指定のパスにあるファイルを読み込みます。

指定のパスが相対パスのとき、処理しているファイルのパスが基準になります。例えば、以下のファイルが、srcディレクトリにある場合、src/lib/x.txtを読み込みます。

{include: ./lib/x.txt}

PROGRAM main
END_PROGRAM

line-separator

line-separatorプラグマは、IEC 61131-10 XML出力時の改行文字を指定します。

// XMLの改行をCR-LFで出力します。
// {line-separator: $r$n}

target

targetプラグマは、変換先のターゲットを指定します。デフォルト値は、DEFAULT(IEC 61131-3準拠)です。

// {target: OMRON}

// {return-doc: 戻り値変数のコメントです。}
FUNCTION f: BOOL END_FUNCTION

現在サポートしているターゲット一覧を下表に示します。

ターゲット一覧
ターゲット
IEC 61131-10規格準拠DEFAULT
OMRON社製Sysmac Studio準拠OMRON

id

idプラグマは、IEC 61131-3では記述することが難しいパス文字列や識別子を記述します。

VAR
	// vのAT属性値は半角空白を含む'%xxx://x y 3'になります。
	v AT {id: %xxx://x y 3} : BOOL;
END_VAR

set-line, line

set-line, lineプラグマは、C言語プリプロセッサのlineディレクティブに相当し、プラグマを記述した行の番号がプラグマで指定した番号になります。

{set-line: 4}

PROGRAM main // mainは6行目で定義された要素と解釈されます。
END_PROGRAM

get-line, __line__

get-line, __line__プラグマは、C言語プリプロセッサの__LINE__マクロに相当し、プラグマが行番号に置換されます。

st, endプラグマ内では、置換されないことに注意してください。

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キーワード

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

n進数整数リテラル(n ≦ 36)

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のエラーメッセージが表示されている場合、変換結果は不正です。

エラーコード一覧

エラーコードの一覧を下表に示します。

Error Code List
CodeSymbolKind
0x80000001FATALSEVERE
0x44000002UNSUPPORTED_LANGUAGEERROR | APP
0x44000001NOT_IMPLEMENTED_ERRORERROR | APP
0x42400008CIRCULAR_INCLUDEPRAGMA | IO | ERROR
0x42000002FILE_NOT_FOUNDIO | ERROR
0x42000001FILE_ERRORIO | ERROR
0x41400001INVALID_SYNTAX_FOR_PRAGMASYNTAX | PRAGMA | ERROR
0x41040001INVALID_SYNTAX_FOR_CODEBLOCKSYNTAX | PROG | ERROR
0x41002002INVALID_CHARACTERTOKEN | SYNTAX | ERROR
0x41002001INVALID_TOKENTOKEN | SYNTAX | ERROR
0x41000003INVALID_SYNTAX_FOR_STRINGSYNTAX | ERROR
0x41000002INVALID_SYNTAX_FOR_COMMENTSYNTAX | ERROR
0x41000001INVALID_SYNTAXSYNTAX | ERROR
0x40200201VALUED_ENUM_WITH_NO_BASETYPETYPE | ERROR | DECL
0x40001001INVALID_BASE_NUMBERLIT | ERROR
0x24000001NOT_IMPLEMENTED_WARNINGWARNING | APP
0x21002001RESERVED_KEYWORD_USED_WARNINGWARNING | TOKEN | SYNTAX
0x20400001UNKNOWN_PRAGAMA_WARNINGWARNING | PRAGMA
0x20001001FLOATING_POINT_WARNING_IN_DURATIONWARNING | LIT
0x20000101INTERNALVAR_IN_FUNCTION_WARNINGWARNING | VAR
0x20000001UNKNOWN_ELEMENT_WARNINGWARNING

エラーコード詳細

工事中🙏; コマンド実行時に表示される0x~のエラーコードをエラーコード一覧から検索してヒントを得てください。

ソフトウェア更新履歴

ソフトウェア更新履歴
日付更新内容
2023/09/17Jiecc 0.2.0をリリースしました。

Jieccの既知の不具合や改善項目一覧

Jieccには次に示す既知の不具合や改善項目があります。随時、対応していきます。

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の著作権と利用制限

Jieccは、The 2-Clause BSD Licenseに従うフリーソフトウェアです。詳しくは、ダウンロードしたファイルに同梱されているLICENSE.txtを参照ください。

Jieccに関する問い合わせ

Jieccに関する問い合わせ・改善要望等については、Blogのコメントにて記載するか、管理者メールアドレスに連絡ください。