IEC 61131-3 ⇄ 10変換器 Jiecc

Jieccとは

Jieccは、IEC 61131-3のテキストをIEC 61131-10 XMLに変換、又は逆変換するツールです。

Windows 7以降の64bit OSにて動作するコマンドライン版と、ブラウザ上で実行できるWeb版があります。

例えば、以下の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 TO 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-10-21T00: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 xsi:type="ArrayTypeSpec"><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 xsi:type="ArrayTypeSpec"><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>FOR intv := 0 TO 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のもう一つの機能であるIEC 61131-10 XMLからIEC 61131-3テキストへの逆変換は、あるIEC 61131-10 XMLを生成するソフトウェア(e.g. Mathworks® PLC Coder R2023b以降, PLCnext Engineer (2024.0 LTS以降))が生成した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のサンプルです。
    standard/       ; IEC 61131-10規格準拠のXMLとIEC 61131-3テキストです。
    omron/          ; OMRON Sysmac Studio準拠のXMLとIEC 61131-3テキストです。

変換を実行するには、Windowsのコマンドプロンプト等を起動後、jiecc.exeのあるフォルダに移動し、次の形式でコマンドを入力します。

$ jiecc.exe <入力IEC 61131-3テキストファイルパス> -o <出力IEC 61131-10 XMLファイルパス>

例えば、次のコマンドを入力すると、実行フォルダにenum.xmlが出力されます。

$ jiecc.exe .\iec_61131_sample\standard\enum.txt -o enum.xml
$ jiecc.exe .\iec_61131_sample\standard\enum.txt -o enum.xml
シンプルなjieccコマンドの実行例

上記コマンドでは、IEC 61131-10規格準拠のXMLを出力します。オムロン社製Sysmac Studio準拠のXMLを出力する場合、コマンドオプションに`-t omron`を付加します。

$ jiecc.exe .\iec_61131_sample\omron\enum.txt -t omron -o enum.xml

1.2.0~IEC 61131-10 XMLをIEC 61131-3テキストに逆変換するには、-dオプションをつけます。

$ jiecc.exe -d <入力IEC 61131-10 XMLファイルパス> -o <出力IEC 61131-3テキストファイルパス>

`jiecc.exe --version`で、jieccのバージョンを確認できます。

その他のjieccコマンドのオプションについては、`jiecc.exe --help`にて確認できます。Jiecc 2.8.4のコマンド実行結果は以下の通りです。

C:\Workspace>jiecc.exe --help
usage: jiecc.exe [-h] [--version] [--output OUTPUT] [--output_iec_61131_10 | --output_iec_61131_3] [--syspath SYSPATH] [--target TARGET] [--line_separator LINE_SEPARATOR] [--silent] [--set SET] [filepath ...]

Jiecc is an IEC 61131-3 <-> IEC 61131-10 converter/deconverter.

It converts IEC 61131-3 text to IEC 61131-10 XML and vice versa.

Typical usage:
    jiecc <IEC 61131-3 text filepath> -o <IEC 61131-10 XML filepath>
        or
    jiecc -d <IEC 61131-10 XML filepath> -o <IEC 61131-3 text filepath>

For additional details, visit:
https://www.graviness.com/iec_61131_3/jiecc.html

positional arguments:
  filepath              the IEC 61131-3 text file path in -c mode, or the IEC 61131-10 xml file path in -d mode.

options:
  -h, --help            show this help message and exit
  --version             show program's version number and exit
  --output OUTPUT, -o OUTPUT
                        the output XML file path in -c mode, or the output text file path in -d mode. Default: SYSOUT (outputs to standard output.)
  --output_iec_61131_10, -c
                        the mode output in IEC 61131-10 XML.
  --output_iec_61131_3, -d
                        the mode output in IEC 61131-3 text.
  --syspath SYSPATH, -I SYSPATH
                        add the directory SYSPATH to the list of directories to be seached for (s)include/(s)import files.
  --target TARGET, -t TARGET
                        convertion target. e.g. OMRON. Default: STD.
  --line_separator LINE_SEPARATOR, -N LINE_SEPARATOR
                        newline code for the output. e.g. LF, CRLF, CR. Default: LF.
  --silent              activate silent mode to suppress error messages.
  --set SET             set and lock options. e.g. creation-datetime=1999-12-31T23:59:59.999+11:59.

Jiecc Web版

以下のフォームを使用して、ブラウザ上でIEC 61131-3テキストをIEC 61131-10 XMLへ変換できます。

Powered by Jiecc 0.0.0

Jieccの仕様

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

エンコーディング方式

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

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

最終的な確認は、IEC 61131-10をサポートするOMRON社製Sysmac Studioや、Phoenix Contact社製PLCnext Engineer(2024.0 LTS以降)の環境にて行ってください。

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">
	:
	<MainBody>
		<BodyContent xsi:type="ST"><ST>intv := 3;
intv := intv + 1;
</ST></BodyContent>
	</MainBody>
</Program>
:

LD言語のプログラムコードをPOU内に記述するには、同様に{LD}~{END}を使用して次のように記述します。IEC 61131-10 XMLのラダープログラム部分をそのまま記述します。1.2.0~

PROGRAM main
	VAR o: BOOL; END_VAR
{LD}
<Rung evaluationOrder="1">
:
</Rung>
{END}
END_PROGRAM

上記は次のように出力されます。同様に{LD}~{END}内の文字列がそのまま出力されます。

:
<Program name="main">
	<Vars accessSpecifier="private">
		<Variable name="o">
			<Type><TypeName>BOOL</TypeName></Type>
		</Variable>
	</Vars>
	<MainBody>
		<BodyContent xsi:type="LD">
<Rung evaluationOrder="1">
:
</Rung>
		</BodyContent>
	</MainBody>
</Program>
:

2.8.0~FBD言語、SFC言語、IL言語も同様に{FBD}~{END}{SFC}~{END}{IL}~{END}を使用します。具体的な記述例は、jiecc.zipに同梱されているサンプルを参照してください。

サポート要素

JieccのIEC 61131-3言語要素のサポート状況は下表の通りです。Yesのない要素は、未サポートか又はテストされていません。"サポート -c"は、IEC 61131-3→IEC 61131-10変換のサポート状況、"サポート -d"は、IEC 61131-10→IEC 61131-3変換のサポート状況です。

サポート要素一覧
言語要素サポート -cサポート -d
プラグマ; {~}YesYes
基本型: 符号有り整数型; SINT, INT, DINT, LINTYesYes
基本型: 符号無し整数型; USINT, UINT, UDINT, ULINTYesYes
基本型: 実数型; REAL, LREALYesYes
基本型: ビット列型; BYTE, WORD, DWORD, LWORDYesYes
基本型: 真偽型; BOOLYesYes
基本型: 時間型; TIME, LTIMEYesYes
基本型: 日付型; DATE, LDATEYesYes
基本型: 時刻型; TOD, TIME_OF_DAY, LTOD, LTIME_OF_DAYYesYes
基本型: 日付時刻型; DT, DATE_AND_TIME, LDT, LDATE_AND_TIMEYesYes
基本型: 文字型: CHAR, WCHARYes1.2.0~Yes1.2.0~
基本型: 文字列型: STRING, WSTRINGYesYes
列挙型定義YesYes
名前付き値型定義YesYes
構造体型定義; STRUCTYesYes
構造体属性; AT, OVERLAPYes2.4.0~Yes2.4.0~
範囲型定義Yes1.2.0~Yes1.2.0~
参照型定義; REF_TOYes1.2.0~Yes1.2.0~
配列型定義; ARRAYYes1.2.0~Yes1.2.0~
直接派生型定義Yes1.2.0~Yes1.2.0~
名前空間定義; NAMESPACEYesYes
名前空間属性; INTERNALYes2.2.0~Yes2.2.0~
USINGディレクティブYesYes
ファンクション定義; FUNCTIONYesYes
FB定義; FUNCTION_BLOCKYesYes
オブジェクト指向FB(OOFB)定義Yes2.6.0~Yes2.6.0~
プログラムPOU定義; PROGRAMYesYes
クラス定義; CLASSYes2.6.0~Yes2.6.0~
クラス属性; ABSTRACT, FINALYes2.6.0~Yes2.6.0~
クラス・OOFB継承; EXTENDSYes2.6.0~Yes2.6.0~
インタフェース定義Yes2.6.0~Yes2.6.0~
インタフェース実装; IMPLEMENTSYes2.6.0~Yes2.6.0~
インタフェース継承; EXTENDSYes2.6.0~Yes2.6.0~
メソッド定義; METHODYes2.6.0~Yes2.6.0~
メソッド属性; ABSTRACT, FINAL, OVERRIDEYes2.6.0~Yes2.6.0~
THIS, SUPERキーワードYes2.6.0~Yes2.6.0~
基本型変数定義YesYes
範囲属性付き変数定義YesYes
配列変数定義; ARRAYYesYes
可変長配列変数定義; [*]YesYes
参照型変数定義; REF_TOYes1.2.0~Yes1.2.0~
変数属性; ATYesYes
変数属性; CONSTANT, RETAIN, NON_RETAINYesYes
変数属性; R_EDGE, F_EDGEYesYes
ローカル変数定義; VAR_TEMP, VARYesYes
ローカル変数定義; VAR_INPUT, VAR_IN_OUT, VAR_OUTPUTYesYes
外部変数定義; VAR_EXTERNALYesYes
基本型初期値YesYes
構造体初期値; (...)YesYes
配列初期値; [...]YesYes
配列初期値の繰り返し指定; [n(...)]YesYes
ST言語プログラム; {ST}~{END}YesYes
LD言語プログラム; {LD}~{END}Yes1.2.0~Yes1.2.0~
FBD言語プログラム; {FBD}~{END}Yes2.8.0~Yes2.8.0~
IL言語プログラム; {IL}~{END}Yes2.8.0~Yes2.8.0~
SFC言語プログラム; {SFC}~{END}Yes2.8.0~Yes2.8.0~
コンフィグレーション定義; CONFIGURATIONYesYes
リソース定義; RESOURCEYesYes
グローバル変数定義; VAR_GLOBALYesYes
可視属性; PRIVATE, INTERNAL, PROTECTED, PUBLICYes2.2.0~Yes2.2.0~
VAR_ACCESS変数定義Yes2.4.0~Yes2.4.0~
VAR_ACCESS変数属性; READ_ONLY, READ_WRITEYes2.4.0~Yes2.4.0~
VAR_CONFIG定義Yes2.2.0~Yes2.2.0~
タスク定義; TASKYes2.4.0~Yes2.4.0~
タスクインスタンス定義; WITHYes2.4.0~Yes2.4.0~
+, -演算子YesYes
*, /, mod演算子YesYes
**演算子YesYes
and, &, or, xor演算子YesYes
<, <=, >=, >演算子YesYes
=, <>演算子YesYes
#演算子; e_t#e1, int#1YesYes
.演算子; v.m0, w.%x2YesYes
:=演算子YesYes
?=演算子Yes2.6.0~Yes2.6.0~
単項+,-演算子YesYes
not演算子YesYes
ref演算子Yes2.6.0~Yes2.6.0~
^演算子YesYes
配列アクセス演算子; a[n]YesYes
FALSE, TRUEキーワードYesYes
NULLキーワードYesYes
IF文YesYes
CASE文YesYes
FOR文YesYes
WHILE文YesYes
REPEAT文YesYes
CONTINUE, EXIT, RETURN文YesYes
トランジション定義; TRANSITIONYes2.8.0~Yes2.8.0~
アクション定義; ACTIONYes2.8.0~Yes2.8.0~

プラグマ

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}です※1valueの指定を必要としないプラグマについては、{key:}のように記述します。

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

※1 ST, LD, ENDプラグマだけは例外です。{ST}{LD}{END}のようにコロン(:)なしで記述します。これは、{ST}~{END}内のIEC 61131-3テキストをそのままXMLに転写する特殊なプラグマであることに起因します。

IEC 61131-10 Headerタグの属性

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

IEC 61131-10 XML必須の属性については、下表に示すデフォルト値が設定されています。

creation-datetime、およびmodification-datetimeの値には、2023-09-01T00:00:00+09:00のような日付時刻を直接指定する他にTODAY、およびNOWを指定できます。それぞれ、本日の日付(時刻を00:00:00固定)、今の時間(秒含めて正確)に置き換えられます。

// {company-name: Jiecc Corp.}
// {company-url: https://www.graviness.com/iec_61131-3/jiecc.html}
// {content-name: Xxx装置}
Headerタグの属性プラグマ
属性名プラグマ名デフォルトのプラグマ値
FileHeaderタグ属性 companyNamecompany-name空文字列
FileHeaderタグ属性 companyURLcompany-url-
FileHeaderタグ属性 productNameproduct-name空文字列
FileHeaderタグ属性 productVersionproduct-version空文字列
FileHeaderタグ属性 productReleaseproduct-release-
ContentHeaderタグ属性 namecontent-name空文字列
ContentHeaderタグ属性 versioncontent-version-
ContentHeaderタグ属性 creationDateTimecreation-datetimeTODAY
ContentHeaderタグ属性 modificationDateTimemodification-datetime-
ContentHeaderタグ属性 organizationorganization-
ContentHeaderタグ属性 authorauthor-
ContentHeaderタグ属性 languagelanguage-

doc

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

TYPE
	// {doc: RGBカラーです。}
	color_t: ((*{doc: 赤}*) red, (*{doc: 緑}*) green, (*{doc: 青}*) blue);
END_TYPE

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

return-doc

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

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

order

orderプラグマは、IEC 61131-10 XMLの引数変数宣言に対するorderWithinParamSet属性を設定します。

FUNCTION f: BOOL
	VAR_INPUT
		i_third: INT (*{order: 3}*);
		i_first: INT (*{order: 1}*);
		i_second: INT (*{order: 2}*);
	END_VAR
END_FUNCTION

evaluation-order

2.4.0~evaluation-orderプラグマは、IEC 61131-10 XMLのプログラムインスタンス宣言に対するevaluationOrder属性を設定します。

CONFIGURATION cfg
	RESOURCE rsc ON plc
		TASK tsk_fast(INTERVAL := t#500us, PRIORITY := 1);

		PROGRAM task1 WITH tsk_fast: p1() (*{evaluation-order: 1}*);
		PROGRAM task2 WITH tsk_fast: p2() (*{evaluation-order: 2}*);
	END_RESOURCE
END_CONFIGURATION

include, sinclude

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

{include: lib/x.txt}

PROGRAM main END_PROGRAM

lib/x.txtの内容が、PROGRAM sub END_PROGRAMであれば、以下のソースコードを入力したことと等価になります。

PROGRAM sub END_PROGRAM

PROGRAM main END_PROGRAM

includeプラグマとsincludeプラグマの違いは、ファイルの探し方(下表参照)です。考え方は、C言語プリプロセッサの#include "~"と#include <~>と同じです。

ファイルの探し方
プラグマ探し方
includeincludeが記述されているファイルが存在するディレクトリを基準にして探します。
見つからなければ、syspathで指定したパスを基準にして探します。
sincludesyspathで指定したパスを基準にして探します。

例えば、上述した例のファイルがsrcディレクトリにある場合、src/lib/x.txtを探して読み込みます。

syspath

2.8.0~syspathプラグマは、sincludeプラグマが探索するディレクトリを追加します。

指定するパスが相対パスのとき、Jieccの実行ディレクトリを基準にします。Jieccの実行ディレクトリが変わる場合は、注意してください。Jieccの実行オプション --syspath (-I) によっても指定できます。

{syspath: common/lib/random}
{syspath: ./../submoodule}

// ./common/lib/random/mt.txt, または ./../submodule/mt.txt を探します。
{sinclude: mt.txt}

line-separator

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

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

target

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

targetプラグマは、主に、当該ターゲットによるIEC 61131-3や10規格の独自解釈部分や独自拡張をサポートするためにあります。

// {target: OMRON}

PROGRAM main
	VAR
		a: ARRAY[0..2] OF INT := [1, 2, 3];
	END_VAR
END_PROGRAM

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

ターゲット一覧
ターゲット
IEC 61131-10規格準拠STD
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, LD, ENDプラグマ内では、置換されないことに注意してください。

ST, LD, END

ST, LDプラグマは、ENDプラグマと併用して使用し、ST/LD言語のプログラムコードを記述するために使用します。詳しくは、ST言語などのプログラムコード部の記述方法を参照ください。

拡張構文

Jieccは、IEC 61131-3の構文仕様を拡張した独自構文をサポートしています。IEC 61131-3準拠の構文のみを使用する必要がある場合、本章の内容に注意ください。

ENDキーワード

ENDキーワードは、あらゆる"始まり"の構文に対応する"終わり"として使用できます。

TYPE
	t: STRUCT ... END;
END

PROGRAM main
	VAR ... END
//{ST}
IF ... END;
//{END}
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
	// 'シンボル,値$nPI,3.14159$nE,2.71828$n'と等価です。
	stringv: STRING[100] := 'シンボル,値' '$n'
		'PI,3.14159' '$n'
		'E,2.71828' '$n'
		;
END_VAR

10進数整数リテラル

IEC 61131-3では、基数2, 8, 16のみ規定されています。

10#12; // 基数10の12、即ち12です。

末尾カンマ

プログラムの自動生成時に有用な末尾カンマ(trailing comma)構文をサポートします。

TYPE e_t: (e0, e1,); END_TYPE
:
VAR a: ARRAY[0..3] OF INT := [1, 2, 3, 4,]; END_VAR

終端のセミコロン省略

いくつかのブロックの終端においてセミコロンを省略できます。1.2.0~

PROGRAM main
	VAR v: INT; END
	VAR w: INT END
END_PROGRAM

基底型なしの名前付き値型

基底型なしで列挙子に値を設定するとき、基底型がDINT型の名前付き値型として扱います。

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キーワードの位置で構文エラー0x44000003(INVALID_SYNTAX)が発生したことを意味します。

$ jiecc.exe illegal_syntax.txt
error:2.0: 0x44000003: 'TYPE_BLOCK'; INVALID_SYNTAX
$

複数のエラー情報が出力されることもあります。個々のエラーは、エラーコード一覧にて確認できる下表に示すエラーレベルと特性を持ちます。

エラーレベル一覧
エラーレベルマスク値変換結果※1
SEVERE 0x80000000 不正
ERROR 0x40000000 不正
WARNING 0x20000000 不正の可能性有り

jieccコマンドの戻り値については、SEVERE又はERRORレベルのエラー情報が含まれるときに限り、1以上となります。以降では、エラーコードとその意味について示します。

※1 Jieccは、不正を検出すると変換処理を中止します。一方、既に生成した、変換結果となり得るファイルについては、削除等しません。ファイル書き込み中にメモリ不足になったりするケースがこれに該当します。jieccコマンドの戻り値が1以上であるか、SEVERE、又はERRORのエラーメッセージが表示されている場合、変換結果は不正です。

エラーコード一覧

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

Error Code List
CodeSymbolKind
0x20001001UNKNOWN_VISIBILITYWARNING | ATTR
0x20001081NO_ON_ATTR_RESOURCEWARNING | ATTR | CFG
0x20001401INTERNALVAR_IN_FUNCTIONWARNING | ATTR | VAR
0x20001402VAR_IN_OUT_WITH_CONSTANTWARNING | ATTR | VAR
0x20004001FLOATING_POINT_WARNING_IN_DURATIONWARNING | LIT
0x20008001UNKNOWN_PRAGMA_WARNINGWARNING | PRAGMA
0x24000001RESERVED_KEYWORD_USED_WARNINGWARNING | SYNTAX
0x24001001IGNORE_ATTRSWARNING | SYNTAX | ATTR
0x24200001LD_SECTION_DETECTEDWARNING | SYNTAX | PROG
0x28000000NOT_IMPLEMENTED_WARNINGWARNING | APP
0x28000001BROKEN_CELLWARNING | APP
0x40004001INVALID_BASE_NUMBERERROR | LIT
0x40800801VALUED_ENUM_WITH_NO_BASETYPEERROR | DECL | TYPE
0x44000001INVALID_CHARACTERERROR | SYNTAX
0x44000002INVALID_TOKENERROR | SYNTAX
0x44000003INVALID_SYNTAXERROR | SYNTAX
0x44000004INVALID_SYNTAX_FOR_CASEERROR | SYNTAX
0x44000005INVALID_SYNTAX_FOR_LABELERROR | SYNTAX
0x44000008INVALID_SYNTAX_FOR_COMMENTERROR | SYNTAX
0x44004011INVALID_SYNTAX_FOR_STRINGERROR | SYNTAX | LIT | STRING
0x44004012INVALID_STRING_ESCAPE_SEQUENCEERROR | SYNTAX | LIT | STRING
0x44008001INVALID_SYNTAX_FOR_PRAGMAERROR | SYNTAX | PRAGMA
0x44008002INVALID_PRAGMA_ESCAPE_SEQUENCEERROR | SYNTAX | PRAGMA
0x44208001INVALID_SYNTAX_FOR_CODEBLOCKERROR | SYNTAX | PROG | PRAGMA
0x48000000NOT_IMPLEMENTED_ERRORERROR | APP
0x48000001UNSUPPORTED_LANGUAGEERROR | APP
0x48000002OPERATION_NOT_ALLOWEDERROR | APP
0x50000001FILE_ERRORERROR | RSC
0x50000002FILE_NOT_FOUNDERROR | RSC
0x50000003CIRCULAR_INCLUDEERROR | RSC
0x50000004INVALID_COMMANDERROR | RSC
0x80000000FATALSEVERE

エラーコード詳細

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

ソフトウェア更新履歴

ソフトウェア更新履歴
日付更新内容
2023/12/28Jiecc 2.8.4をリリースしました。
  • Microsoft OneDrive管理のフォルダでコマンドを実行すると異常に遅い問題を修正しました。(multiprocessingモジュールを含めないようにしたら問題解決しましたが、真因不明。)
  • creation_datetime, modification_datetimeコマンドラインオプションを削除し、代わりにsetコマンドラインオプションをサポートしました。jiecc.exe ... --set creation-datetime=1999-12-31T23:59:59.999+11:59のように指定します。
  • IEC 61131-10 edgeDetection属性の誤りを修正しました。
  • (2024/1/10追記)jiecc.exeが一部のアンチウィルスソフトにより、ウィルス判定されてしまう問題を修正しました。pyinstaller 6.*系により生成したexeを誤判定するようであり、pyinstaller 5.9にてjjiecc.exeを再生成することにより問題を解決しました。zipファイルを再ダウンロードしてください。
2023/12/17Jiecc 2.8.3をリリースしました。
  • IEC 61131-10 AccessVariableのdirection属性値の誤りを修正しました。
  • IEC 61131-10 ProgramInstanceタグ名のtypoを修正しました。
  • IEC 61131-10規格に従い、MethodタグのaccessSpecifier属性を必ず出力するようにしました。デフォルト値protected。
  • IEC 61131-10 Functionのアクセス属性internalの記述誤りを修正しました。
2023/12/8Jiecc 2.8.2をリリースしました。
  • EXE版において逆変換(IEC 61131-10 XML→ IEC 61131-3テキスト変換)に長い時間が掛かっていた問題を修正しました。
2023/12/6Jiecc 2.8.1をリリースしました。
2023/12/3Jiecc 2.8.0をリリースしました。
  • SFCのトランジション定義とアクション定義に対応しました。
  • プログラムコード{IL}~{END}、{FBD}~{END}、{SFC}~{END}に対応しました。
  • sincludeプラグマに対応しました。
  • syspathオプション、およびsyspathプラグマに対応しました。
  • 入力データの改行コードCRLF、CRに対応しました。
  • line_separatorオプションに対応しました。
2023/11/19Jiecc 2.6.0をリリースしました。
  • クラス定義、インタフェース定義、オブジェクト指向FB定義、メソッド定義、および各種属性に対応しました。
  • THIS, SUPERキーワードに対応しました。
  • REF演算子に対応しました。
  • 試行代入(?=)に対応しました。
2023/11/12Jiecc 2.4.0をリリースしました。
  • 構造体のOVERLAP属性とAT属性に対応しました。
  • VAR_ACCESS変数定義に対応しました。
  • タスク定義とプログラムインスタンス定義に対応しました。
2023/10/28Jiecc 2.2.0をリリースしました。
  • Web版をリリースしました。※開発中のWeb版については削除しました。
  • VAR_CONFIGに対応しました。
  • 変数のアクセス属性に対応しました。
  • 名前空間のアクセス属性に対応しました。
  • いくつかの不具合を修正しました。
2023/10/22Jiecc 1.4.0をリリースしました。
  • 標準入力からの入力に対応しました。
  • 開発中のWeb版公開にあたって、ポーティングのためのコード変更しました。
2023/10/21Jiecc 1.2.0をリリースしました。
  • IEC 61131-10 XMLからIEC 61131-3テキストへの逆変換に対応しました。
  • CHAR型、WCHAR型に対応しました。
  • 日付時刻系型の簡略表記TOD、LTOD、DT、LDTに対応しました。
  • 範囲型定義、参照型定義、配列型定義、直接派生型定義に対応しました。
  • 参照型変数定義に対応しました。
  • LDプラグマに対応しました。
  • いくつかの不具合を修正しました。
2023/09/24Jiecc 0.2.1をリリースしました。
  • ターゲット標準のとき、配列変数宣言と範囲属性付き変数宣言のXMLの誤りを修正しました。
  • エラーコードを整理しました。
2023/09/17Jiecc 0.2.0をリリースしました。

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

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

Jieccの既知の不具合や改善項目一覧
ID 項目 対象 補足
BUG-2 識別子にマルチバイト文字を使えない。 Ver.0.2.0~ 文字列リテラルには使える。
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のコメントにて記載するか、管理者メールアドレスに連絡ください。