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に変換します。

// User defined types
type
	// Enum type
	e_t: (e0, e1);
	// Struct type
	t_t: struct
		m0: int;
		// Array member
		m1: array[0..7] of bool;
	end_struct;
end_type

// Program POU
program Main
	// Static variables
	var
		i: int;
		vs: array[0..2] of int := [2, 3, 5];
		ev: e_t := e0;
		tv: t_t := (m0 := 7, m1 := [8(true)]);
	end_var
// Body program section requires `{st}` and `{end}` pragmas.
// {st}
for i := 0 to 2 by 1 do
	vs[i] := vs[i] + i;
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="" productName="" productVersion="" />
<ContentHeader name="" creationDateTime="2024-06-29T00:00:00+09:00" />
<Types><GlobalNamespace>
<DataTypeDecl name="e_t">
<UserDefinedTypeSpec xsi:type="EnumTypeSpec">
	<Enumerator name="e0" />
	<Enumerator name="e1" />
</UserDefinedTypeSpec>
</DataTypeDecl>
<DataTypeDecl name="t_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="i">
			<Type><TypeName>int</TypeName></Type>
		</Variable>
	</Vars>
	<Vars accessSpecifier="private">
		<Variable name="vs">
			<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="ev">
			<Type><TypeName>e_t</TypeName></Type>
			<InitialValue>
				<SimpleValue value="e0" />
			</InitialValue>
		</Variable>
	</Vars>
	<Vars accessSpecifier="private">
		<Variable name="tv">
			<Type><TypeName>t_t</TypeName></Type>
			<InitialValue>
				<StructValue>
					<Value member="m0">
						<SimpleValue value="7" />
					</Value>
					<Value member="m1">
						<ArrayValue>
							<Value repetitionValue="8">
								<SimpleValue value="true" />
							</Value>
						</ArrayValue>
					</Value>
				</StructValue>
			</InitialValue>
		</Variable>
	</Vars>
	<MainBody>
		<BodyContent xsi:type="ST"><ST>for i := 0 to 2 by 1 do
	vs[i] := vs[i] + i;
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はプリプロセス機能をもちます。

{#define DECL_ADD_FUNCTION(T)
	function add_@@T: T
	var_input
		in1, in2: T;
	end_var
	${st$}
	add_@@T := in1 + in2;
	${end$}
	end_function
}

DECL_ADD_FUNCTION(int)
DECL_ADD_FUNCTION(lreal)
IEC 61131-3テキスト(プリプロセス前)
function add_int: int
	var_input
		in1, in2: int;
	end_var
	{st}
	add_int := in1 + in2;
	{end}
end_function

function add_lreal: lreal
	var_input
		in1, in2: lreal;
	end_var
	{st}
	add_lreal := in1 + in2;
	{end}
end_function
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以降, CODESYS V3.5.21.0, March 2025以降)が生成した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/          ; オムロン社製Sysmac Studio準拠のXMLとIEC 61131-3テキストです。
    keyence/        ; キーエンス社製KV STUDIO準拠のXMLとIEC 61131-3テキストです。5.2~
    mitsubishi/     ; 三菱電機社製GX Works 3準拠のXMLとIEC 61131-3テキストです。5.4~
    codesys/        ; CODESYS社製CODESYS準拠のXMLとIEC 61131-3テキストです。5.8~

変換を実行するには、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` を付加します。 see ターゲット一覧

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

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

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

IEC 61131-3テキストにプリプロセスのみを適用した結果を得るには、-Eオプションをつけます。標準出力にプリプロセス後のIEC 61131-3テキストが出力されます。

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

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

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

usage: jiecc.exe [-h] [--version] [--output OUTPUT] [--output_iec_61131_10 | --output_iec_61131_3] [--define-macro DEFINE_MACRO] [--syspath SYSPATH] [--target TARGET] [--line-separator LINE_SEPARATOR] [--retro_caps]
	[--max-include-depth MAX_INCLUDE_DEPTH] [--recursion-limit RECURSION_LIMIT] [--preprocess-only] [--pp-output-pragma-style PP_OUTPUT_PRAGMA_STYLE] [--remove-comments] [-dM] [--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: STDOUT (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.
--define-macro DEFINE_MACRO, -D DEFINE_MACRO
		   define a macro. -D <macro> to set <macro> to 1 or -D<macro>=<value> to assign a specific value. e.g. -D DEBUG, -D V=10.
--syspath SYSPATH, -I SYSPATH
		   add the directory SYSPATH to the list of directories to be searched for (s)include/(s)import files.
--target TARGET, -t TARGET
		   conversion target. e.g. OMRON, KEYENCE. Default: STD.
--line-separator LINE_SEPARATOR, -N LINE_SEPARATOR
		   newline code for the output. e.g. LF, CRLF, CR. Default: LF.
--retro_caps          output IEC 61131-3 keywords in uppercase.
--max-include-depth MAX_INCLUDE_DEPTH
		   the maximum depth of the nested #include. The default is 200.
--recursion-limit RECURSION_LIMIT
		   the maximum recursion depth allowed by the program. The default is the system default value.
--preprocess-only, -E
		   preprocessed only.; do not convert.
--pp-output-pragma-style PP_OUTPUT_PRAGMA_STYLE
		   The format of preprocessor output pragmas. Possible values: annotated (*{~}*) or standard {~}. Default: annotated.
--remove-comments, -nC
		   remove comments in preprocessed output. The default is False.
-dM                   generate a list of #define directives for all the macros defined during the execution of the preprocessor, including predefined macros. must be invoked with -E.
--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へ変換できます。

⚠️プログラムコード部を {st} ~ {end} で囲んでいない場合、構文エラーが発生します。 Body program section requires `{st}` and `{end}` pragmas.

Powered by Jiecc 0.0.0

Jieccの仕様

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

エンコーディング方式

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

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をサポートする以下の環境にて行ってください。

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__プラグマ等も置換されずそのまま出力されることに注意ください。プリプロセス機能__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のラダープログラム部分をそのまま記述します。

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>
:

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変換のサポート状況です。Jiecc 4.x以降において、IEC 61131-3および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, wcharYesYes
基本型: 文字列型: string, wstringYesYes
列挙型定義YesYes
名前付き値型定義YesYes
構造体型定義; structYesYes
構造体属性; at, overlapYesYes
範囲型定義YesYes
参照型定義; ref_toYesYes
配列型定義; arrayYesYes
直接派生型定義YesYes
名前空間定義; namespaceYesYes
名前空間属性; internalYesYes
usingディレクティブYesYes
ファンクション定義; functionYesYes
FB定義; function_blockYesYes
オブジェクト指向FB(OOFB)定義YesYes
プログラムPOU定義; programYesYes
クラス定義; classYesYes
クラス属性; abstract, finalYesYes
クラス・OOFB継承; extendsYesYes
インタフェース定義; interfaceYesYes
インタフェース実装; implementsYesYes
インタフェース継承; extendsYesYes
メソッド定義; methodYesYes
メソッド属性; abstract, final, overrideYesYes
this, superキーワードYesYes
基本型変数定義YesYes
範囲属性付き変数定義YesYes
配列変数定義; arrayYesYes
可変長配列変数定義; [*]YesYes
参照型変数定義; ref_toYesYes
変数属性; 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}YesYes
FBD言語プログラム; {fbd}~{end}YesYes
IL言語プログラム; {il}~{end}YesYes
SFC言語プログラム; {sfc}~{end}YesYes
コンフィグレーション定義; configurationYesYes
リソース定義; resourceYesYes
グローバル変数定義; var_globalYesYes
可視属性; private, internal, protected, publicYesYes
var_access変数定義YesYes
var_access変数属性; read_only, read_writeYesYes
var_config定義YesYes
タスク定義; taskYesYes
タスクインスタンス定義; withYesYes
+, -演算子YesYes
*, /, mod演算子YesYes
**演算子YesYes
and, &, or, xor演算子YesYes
<, <=, >=, >演算子YesYes
=, <>演算子YesYes
#演算子; e_t#e1, int#1YesYes
.演算子; ns1.ns2, v.m0, w.%x2YesYes
:=演算子YesYes
?=演算子YesYes
単項+,-演算子YesYes
not演算子YesYes
ref演算子YesYes
^演算子YesYes
配列アクセス演算子; a[n]YesYes
false, trueキーワードYesYes
nullキーワードYesYes
if文YesYes
case文YesYes
for文YesYes
while文YesYes
repeat文YesYes
continue, exit, return文YesYes
トランジション定義; transitionYesYes
アクション定義; actionYesYes

プラグマ

IEC 61131-10にはいくつかの必須属性があり、FileHeaderタグのcompanyName(会社名)属性はその一つです。もちろん、IEC 61131-3にはこの属性を指定する正式な方法は存在しませんが、IEC 61131-10の必須属性ですので、設定できなければ困ります。

この問題の解決に、IEC 61131-3のプラグマを使用します。プラグマは、IEC 61131-3をサポートするメーカーの独自拡張のためにも使用できます。{pragma_key pragma_value}のように記述しますが、{~}の内容に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}4.2.0~、又はコロンで区切る{key:value}です。valueの指定を必要としないプラグマについては、{key}4.2.0~、又は{key:}のように記述します。

プラグマ内で自由に改行できます。5.10~プラグマ内で改行するには、$に続いて改行します。

{doc: メインプログラム
---
メインプログラムの説明を記述します。}
program Main end_program
改行を含むプラグマの例

ただし、プラグマ内の改行は、プリプロセス機能により早い段階で改行そのものが削除されコンバート処理が実行されます。上記の例は文法的に間違ってはいませんが、プラグマ内で改行に意味がある場合、次のように$nを記述します。

{doc: メインプログラム$n
---$n
メインプログラムの説明を記述します。}
program Main end_program
プラグマ内での改行文字の記述方法

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

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

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プラグマ

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プラグマは、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

4.12~IEC 61131-10 XMLを直接読み込むことができます。{include: x.xml}のように拡張子をxmlにします。

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

ファイルの探し方
プラグマ探し方
includeincludeが記述されているファイルが存在するディレクトリを基準にして探します。
見つからなければ、Jieccのコマンドラインオプション --syspath (-I) で指定したパス、syspathプラグマ、もしくは#syspathディレクティブで指定したパスを基準にして探します。
sincludeJieccのコマンドラインオプション --syspath (-I) で指定したパス、もしくは、syspathプラグマ、又は#syspathディレクティブで指定したパスを基準にして探します。

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

4.8.10~パス部分を{include <~>}のように<~>で囲うと、{sinclude ~}と同等の動作になります。

syspathプラグマ

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

指定するパスが相対パスのとき、Jieccの実行ディレクトリを基準にします。Jieccの実行ディレクトリが変わる場合は、注意してください。sincludeプラグマが探索するディレクトリは、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規格準拠)です。

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

⚠️targetプラグマは、コンバータの機能であり、事前定義マクロを含むプリプロセスフェーズに影響しないことに注意してください。

// {target: OMRON}

program Main
	var
		a: array[0..2] of int := [1, 2, 3];
	end_var
end_program

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

ターゲット一覧
ターゲット
IEC 61131-10規格準拠STD
オムロン社製Sysmac Studio準拠OMRON
キーエンス社製KV STUDIO準拠5.2~KEYENCE
三菱電機社製MELSOFT GX Works3 Ver.1準拠5.4~MITSUBISHI
CODESYS社製CODESYS準拠5.8~CODESYS

IEC 61131-10のインポート動作未確認ですが、値 PHOENIXCONTACT も有効に機能します。5.4~

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__マクロに相当し、プラグマが行番号に置換されます。

get-line, __line__プラグマは、ST, LD, FBD, SFC, ILプラグマ内では、置換されないことに注意してください。プリプロセス機能__LINE__マクロを使用すれば置換されます。

retro_capsプラグマ

retro_capsプラグマは、IEC 61131-3キーワードを小文字で出力するか、大文字で出力するかを制御します。

デフォルトは、小文字で出力します。{retro_caps: true}とすると大文字で出力します。

__func__プラグマ

4.18~__func__プラグマは、C言語の__func__変数に相当する機能を提供します。POUの属性として記述するとき、__func__プラグマの値で指定する変数名の当該POU単純名を初期値にもつ文字列型変数を自動生成します。

program {__func__:this_pouname} Main
var s: string[32]; end
{st}
s := this_pouname; // s = 'Main' となります。
{end}
end_program

上記プログラムは以下のプログラムと等価です。

program Main
var s: string[32]; end
var constant this_pouname: string[5] := 'Main'; end
{st}
s := this_pouname; // s = 'Main' となります。
{end}
end_program

single-bodyプラグマ

4.18~一つのPOUが複数のコードブロックで記述されるとき、対応するXMLにおいてもそのまま複数のコードブロックでXMLを出力します。single-bodyプラグマを使用すると、複数のコードブロックを一つのコードブロックにまとめたXMLを出力します。

program {single-body: true} Main
var v: int; end_var
{st}
v := 2;
{end}
var t: dint; end_var
{st}
t := 3;
{end}
end_program

上記プログラムは以下のプログラムと等価です。

program Main
var v: int; end_var
var t: dint; end_var
{st}
v := 2;
t := 3;
{end}
end_program

append-eilogue-pou-bodyプラグマ

5.4~いくつかのターゲットにおいては、そのターゲット環境の特性が理由で、XML生成時に自動でプログラムを挿入することがあります。例えば、キーエンス社製KV STUDIOがターゲットの場合、POUのXML生成時に、END・ENDH命令を含むラダープログラムを自動挿入します。append-eilogue-pou-bodyプラグマを使用すると、この自動挿入を抑制することができます。自動挿入を抑制したい場合、{append-eilogue-pou-body: false}のように記述します。append-eilogue-pou-bodyプラグマは、個々のPOUに対してではなく、コンバート単位全体に対して適用されます。

// {append-eilogue-pou-body: false}

function func_1: bool end_function
function func_2: bool end_function

return-docプラグマ

return-docプラグマは、戻り値変数のコメントを指定するために使用します。

IEC 61131-10に対応する要素はなく、ターゲットがOMRONのときのみ機能します。

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

FunPouProperties.isEnEno, FbPouProperties.isEnEnoプラグマ

5.4~FunPouProperties.isEnEno, FbPouProperties.isEnEnoプラグマは、それぞれファンクションとファンクションブロックの属性であり、三菱電機社製MELSOFT GX Works3 Ver.1におけるPOUのプロパティ「EN/ENOを使用する」を指定するために使用します。

IEC 61131-10に対応する要素はなく、ターゲットがMITSUBISHIのときのみ機能します。

function {FunPouProperties.isEnEno: true} func: bool end_function

ST, LD, FBD, SFC, IL, ENDプラグマ

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

プリプロセス機能

Jieccはプリプロセス機能を持ちます。IEC 61131-3テキストをIEC 61131-10 XMLに変換する過程において、最初にプリプロセスを実行します。プリプロセスでは、主に以下の処理を行います。

その後、IEC 61131-3テキストの構文解析が続きます。プリプロセスのみを適用するには、Jieccのコマンドラインオプションに-Eをつけます。

プリプロセスでは、本節で示すシステム定義のマクロとプリプロセッサディレクティブがあります。

⚠️プリプロセスに関連する機能は、大文字・小文字を区別します。例えば、__FILE__マクロを__file__と記述すると機能しません。同様に#defineディレクティブを#DEFINEと記述すると機能しません。4.2.0~

事前定義マクロ

4.4.0~Jieccは、ターゲットやコマンドラインオプションに応じて、特定のプリプロセッサマクロを事前に定義します。Jiecc 5.8.4にて、`jiecc -dM - < /dev/null`した結果は次の通りです。

{#define __SINT_MIN__ -128}
{#define __SINT_MAX__ 127}
{#define __INT_MIN__ -32768}
{#define __INT_MAX__ 32767}
{#define __DINT_MIN__ -2147483648}
{#define __DINT_MAX__ 2147483647}
{#define __LINT_MIN__ -9223372036854775808}
{#define __LINT_MAX__ 9223372036854775807}
{#define __USINT_MIN__ 0}
{#define __USINT_MAX__ 255}
{#define __UINT_MIN__ 0}
{#define __UINT_MAX__ 65535}
{#define __UDINT_MIN__ 0}
{#define __UDINT_MAX__ 4294967295}
{#define __ULINT_MIN__ 0}
{#define __ULINT_MAX__ 18446744073709551615}
{#define __BYTE_MASK__ byte#16#ff}
{#define __WORD_MASK__ word#16#ffff}
{#define __DWORD_MASK__ dword#16#ffffffff}
{#define __LWORD_MASK__ lword#16#ffffffffffffffff}
{#define __LTIME_MIN__ time#-9223372036854775808ns}
{#define __LTIME_MAX__ time#9223372036854775807ns}
{#define __LTIME_MIN_IN_NS__ -9223372036854775808}
{#define __LTIME_MAX_IN_NS__ 9223372036854775807}
{#define __LDATE_MIN__ ldate#1970-01-01}
{#define __LDATE_MAX__ ldate#2554-07-21}
{#define __LTOD_MIN__ ldate#1970-01-01}
{#define __LTOD_MAX__ ldate#2554-07-21}
{#define __LDT_MIN__ ldate#1970-01-01-00$:00$:00}
{#define __LDT_MAX__ ldate#2554-07-21-23$:34$:33.709551615}
{#define __INT8_TYPE sint}
{#define __INT16_TYPE int}
{#define __INT32_TYPE dint}
{#define __INT64_TYPE lint}
{#define __UINT8_TYPE usint}
{#define __UINT16_TYPE uint}
{#define __UINT32_TYPE udint}
{#define __UINT64_TYPE ulint}
{#define __BITS8_TYPE byte}
{#define __BITS16_TYPE word}
{#define __BITS32_TYPE dword}
{#define __BITS64_TYPE lword}
{#define _JIECC true}
{#define _JIECC_FULL_VER 50804}
{#define _JIECC_VER 508}
{#define _JIECC_VERSION '5.8.4'}
{#define _STD true}
{#define _STANDARD true}
{#define _OMRON false}
{#define _OM false}
{#define _OMRON_SYSMAC false}
{#define _PHOENIXCONTACT false}
{#define _PH false}
{#define _PHOENIXCONTACT_PLCNEXT false}
{#define _KEYENCE false}
{#define _KE false}
{#define _KEYENCE_KVST false}
{#define _MITSUBISHI false}
{#define _MI false}
{#define _MITSUBISHI_GXWORKS3 false}
{#define _CODESYS false}
{#define _CO false}
{#define _CODESYS_CODESYS false}

__LINE__マクロ

__LINE__マクロは、ソースコードの行番号に置換されます。

program Main
var v: int; end_var
{st}
v := __LINE__; // v := 4;
{end}
end_program

__FILE__マクロ

__FILE__マクロは、ソースコードのファイルパスの文字列リテラルに置換されます。

program Main
var
	v: string := __FILE__; // 本ファイルのファイルパスが"a.txt"であれば、v: string := 'a.txt'; です。
end_var
end_program

__COUNTER__マクロ

__COUNTER__マクロは、整数リテラルに置換されます。0から始まり、置換が発生するたびにインクリメントされます。#includeした場合もリセットされることはありません。

program Main
var v: int; end_var
//{st}
v := __COUNTER__; // v := 0;
v := __COUNTER__; // v := 1;
v := __COUNTER__; // v := 2;
//{end}
end_program

__DATE__, __TIME__マクロ

4.4.0~__DATE__, __TIME__マクロは、それぞれソースコードのコンパイル日付とコンパイル時刻の文字列リテラルに置換されます。

program Main
	var
		compile_datev: string := __DATE__; // 'Dec 02 2024' などを得ます。
		compile_todv: string := __TIME__; // '01:02:03' などを得ます。
	end_var
end_program

__TIMESTAMP__マクロ

4.4.0~__TIMESTAMP__マクロは、現在のソースファイルが最後に変更された日付日時の文字列リテラルに置換されます。

program Main
	var
		lastmodified_datev: string := __TIMESTAMP__; // 'Mon Dec 09 01:02:03 2024' などを得ます。
	end_var
end_program

#defineディレクティブ

🛈Jieccの#defineディレクティブは、以下のことを除き、概ねC言語の#defineディレクティブと同じ仕様です。一般情報も併せて参照ください。

#defineディレクティブは、識別子に対して文字列を関連付けを定義し、以降のソースコード内で当該識別子が現れると関連付けている文字列で置換します。

既に同じ識別子に関連付けがある場合、警告を出力します。ただし、内容が同じであれば警告を出力しません4.4.0~#defineディレクティブは、オブジェクトマクロと、引数をもつ関数マクロがあります。

オブジェクトマクロ

{#define identifier tokensopt}

上記形式で記述するオブジェクトマクロは、identifiertokensを関連付けます。tokensを省略する場合、空文字列を関連付けます。

{#define KEY_TYPE uint}
{#define VALUE_TYPE lreal}

type
	Pair_t: struct
		key: KEY_TYPE; // key: uint;
		value: VALUE_TYPE; // value: lreal;
	end_struct;
end_type

function Pair_init
var_in_out self: Pair_t; end_var
var_input
	key: KEY_TYPE; // key: uint;
	value: VALUE_TYPE; // value: lreal;
end_var
//{st}
self.key := key;
self.value := value;
//{end}
end_function

関数マクロ4.2.0~

{#define identifier(identifier,opt ...opt) tokensopt}

上記形式で記述する関数マクロは、括弧内のパラメータをtokens内で使用できます。

{#define SWAP(x, y, t) t := y; y := x; x := t}

program Main
var
	i: int := 2;
	j: int := 3;
	t: int;

	r: lreal := 5.0;
	s: lreal := 7.0;
	tmp: lreal;
end_var
//{st}
SWAP(i, j, t); // t := j; j := i; i := t;
SWAP(r, s, tmp); // tmp := s; s := r; r := tmp;
//{end}
end_program

次に示す例のように、単純に置換すれば無限再帰する関数マクロも無限再帰せずに可能な限り置換を行います。このような例でもgccのプリプロセッサと同じ結果を得ます。※1

{#define F(x) H(x),G(x),F(x),x}
{#define G(x) H(x),G(x),F(x),x}
{#define H(x) H(x),G(x),F(x),x}

F(A); // H(A),H(A),G(A),F(A),A,F(A),A,H(A),G(A),F(A),A,G(A),F(A),A,F(A),A;
G(B); // H(B),G(B),H(B),G(B),F(B),B,B,G(B),H(B),G(B),F(B),B,G(B),F(B),B,B;
H(C); // H(C),H(C),G(C),H(C),G(C),F(C),C,C,H(C),H(C),G(C),F(C),C,F(C),C,C;

5.10~#defineディレクティブ内で自由に改行できます。

{#define SWAP(x, y, t)
	t := y;
	y := x;
	x := t;
}

なお、#defineディレクティブ内でプラグマを記述する場合、${st$}~${end$}などと$でエスケープする必要があることに注意してください。

※1 Dave Prosser's C Preprocessing Algorithm

文字列化演算子 @4.2.0~

@演算子に続くパラメータを文字列リテラル化します。

{#define VAR_MSG(var) CONCAT(@var, ':', var)}

program Main
var
	my_var: string[100];
	msg: string[100];
end_var
//{st}
msg := VAR_MSG(my_var); // msg := CONCAT('my_var', ':', my_var);
//{end}
end_program

トークン連結演算子 @@4.2.0~

@@演算子の前後のトークンを連結します。

{#define DECL_VAR(name, type) name@@_@@type: type}

program Main
var
	DECL_VAR(my, int); // my_int: int;
	DECL_VAR(my, lreal); // my_lreal: lreal;
end_var
end_program

可変個引数マクロ4.2.0~

可変個引数マクロは、関数マクロの引数に可変個数のパラメータを指定できるようにしたものです。

可変個引数部分を参照するには、__VA_ARGS__マクロを使用します。

{#define MSG(kind, ...) CONCAT(kind, __VA_ARGS__)}

program Main
	var
		msg: string[100];
	end_var
	//{st}
	msg := MSG('severe', '0'); // msg := CONCAT('severe', '0');
	msg := MSG('error',  '1', 'redefine'); // msg := CONCAT('error', '1', 'redefine');
	//{end}
end_program

4.18~可変個引数部分の引数個数を得るには、__VA_ARGC__マクロを使用します。

{#define INITIALIZED_ARRAY_TYPE(basetype, ...) array[__VA_ARGC__] of basetype := [__VA_ARGS__]}

program Main
	var
		a: INITIALIZED_ARRAY_TYPE(int, 10, 20, 30); // a: array[3] of int := [10,20,30];
	end
end_program

#undefディレクティブ

#undefディレクティブは、#defineディレクティブによる定義を削除します。関連付けがなければ、何も起きません。

{#define T int} // 識別子Tにintを関連付けします。
function_block fb1
	var
		v: T; // v: int;
	end_var
end_function_block

{#undef T} // 識別子Tへの関連付けを削除します。
{#define T real} // 識別子Tにrealを関連付けします。
function_block fb2
	var
		v: T; // v: real;
	end_var
end_function_block
{#undef T} // 識別子Tへの関連付けを削除します。

#if, #ifdef, #ifndef, #elif, #else, #endifディレクティブ

4.4.0~#if, #ifdef, #ifndef, #elif, #else, #endifディレクティブは、ソースコード内の各ブロックの有効・無効を制御します。#ifの引数が0以外の整数値、又は真偽値trueになる場合、その後の一連のブロックは有効で保持されます。#ifの引数が整数値0、又は真偽値falseになる場合、その後の一連のブロックは無効となり、ソースコードに存在しなかったものと同等に扱われます。

#ifdef, #ifndefディレクティブは、#ifディレクティブが登場可能な場所に登場可能であり、#ifディレクティブ同様、ソースコード内の各ブロックの有効・無効を制御します。#ifdefの引数で指定する識別子が、マクロで定義されている場合、その後の一連のブロックは有効で保持されます。反対に、#ifndefの引数で指定する識別子が、マクロで定義されていない場合、その後の一連のブロックは有効で保持されます。#ifdef NAMEは、後述するdefined演算子を使用し、#if defined(NAME)と等価です。同様に、#ifndef NAMEは、#if not defined(NAME)と等価です。

なお、無効になっても行番号は維持されます。

🛈Jieccの#if, #ifdef, #ifndef, #elif, #else, #endifディレクティブは、以下のことを除き、概ねC言語の#if, #ifdef, #ifndef, #elif, #else, #endifディレクティブと同じ仕様です。一般情報も併せて参照ください。
{#define _RELEASE}

{#ifdef _RELEASE}
// _RELEASEマクロが定義されているため、本ブロックは有効です。このようなマクロは、通常、コマンドラインや別ファイルで定義されます。
function f: int end_function
{#else}
// 本ブロックは無効です。
function g: int end_function
function f: int end_function
{#endif}

以下の例において、_STD, _OMRON, 5.2~_KEYENCE, 5.4~_MITSUBISHIなどは、事前定義されるマクロの一つであって、コマンドラインオプション --target (-t) により制御できます。

program Main
{st}
{#if _OMRON}
// コマンドラインで、-t OMRON を指定した場合、本ブロックは有効です。指定していない場合、本ブロックは無効です。
/* for OMRON body. */
{#elif _KEYENCE}
// コマンドラインで、-t KEYENCE を指定した場合、本ブロックは有効です。指定していない場合、本ブロックは無効です。
/* for KEYENCE body. */
{#elif _MITSUBISHI}
// コマンドラインで、-t MITSUBISHI を指定した場合、本ブロックは有効です。指定していない場合、本ブロックは無効です。
/* for MITSUBISHI body. */
{#elif _CODESYS}
// コマンドラインで、-t CODESYS を指定した場合、本ブロックは有効です。指定していない場合、本ブロックは無効です。
/* for CODESYS body. */
{#elif _PHOENIXCONTACT}
// コマンドラインで、-t PHOENIXCONTACT を指定した場合、本ブロックは有効です。指定していない場合、本ブロックは無効です。
/* for PHOENIXCONTACT body. */
{#elif _STD}
// コマンドラインで、-t STD を指定した場合、又は-tを指定していない場合、本ブロックは有効です。指定していない場合、本ブロックは無効です。
/* for STD body. */
{#else}
// コマンドラインで、-t OMRON, -t KEYENCE, -t MITSUBISHI, -t CODESYS, -t PHOENIXCONTACT, -t STD以外を指定した場合、本ブロックは有効です。
/* for OTHER body. */
{#endif}
{end}
end_program

defined演算子

defined演算子のオペランドに指定される識別子に関連するマクロが存在する場合にtrueと評価されます。

{#define X}
{#define Z_VALUE 0}

program Main
var
{#if defined(X)}
	// マクロXが定義されているため、このブロックは有効です。
	x: int;
{#endif}
{#if defined(Y)}
	// マクロYが定義されていないため、このブロックは無効です。
	y: int;
{#endif}
{#if defined(Z_VALUE)}
	// マクロZ_VALUEが定義されているため、このブロックは有効です。
	z: int := Z_VALUE;
{#else}
	// このブロックは無効です。
	z: int := 1;
{#endif}
end_var
end_program

###ディレクティブ

###ディレクティブは、記述された位置に文字列を展開します。

{#define T int}

function add_{### T}: T // function add_int: int
var_input
	in1, in2: T; // in1, in2: int;
end_var
//{st}
add_{### T} := in1 + in2; // add_int := in1 + in2;
//{end}
end_function

##ディレクティブ

##ディレクティブは、記述された位置に文字列リテラルを展開します。

'$などは、展開時にエスケープされます。

program Main
var
	s: string := {## __COUNTER__}; // s: string := '0';
	i: int := __COUNTER__; // i: int := 1;
end_var
//{st}
s := {## __COUNTER__}; // s := '2';
i := __COUNTER__; // i := 3;
//{end}
end_program

#lineディレクティブ

#lineディレクティブは、エラー発生における行番号やファイル名を制御します。

{#line 行番号<空白文字>ファイル名}で指定します。ファイル名については省略可能です。__LINE__マクロ__FILE__マクロに影響します。

program Proc1
var
	filename: string := __FILE__; // filename: string := 'ファイル名';
	lineno: int := __LINE__; // lineno: int := 4;
end_var
end_program

{#line 108 ./dir/new.txt}
program Proc2
var
	filename: string := __FILE__; // filename: string := './dir/new.txt';
	lineno: int := __LINE__; // lineno: int := 112;
end_var
end_program

#include, #sincludeディレクティブ

#include, #sincludeディレクティブは、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 <~>と同じです。

ファイルの探し方
ディレクティブ探し方
#include#includeディレクティブが記述されているファイルが存在するディレクトリを基準にして探します。
見つからなければ、Jieccのコマンドラインオプション --syspath (-I) で指定したパス、もしくは、#syspathディレクティブで指定したパスを基準にして探します。
#sincludeJieccのコマンドラインオプション --syspath (-I) で指定したパス、もしくは、#syspathディレクティブで指定したパスを基準にして探します。

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

4.8.10~パス部分を{#include <~>}のように<~>で囲うと、{#sinclude ~}と同等の動作になります。

include, sincludeプラグマの機能と違う点は、#include, #sincludeディレクティブは、IEC 61131-10 XMLを直接読み込むことができないこと、そして、プリプロセスフェーズで読み込むか否かです。4.8.10~また、include, sincludeプラグマでは、ファイルの再帰的な呼び出しが許可されていませんが、#include, #sincludeディレクティブでは、許可されます。一方で、無限再帰を防止するため、呼び出しの深さが200で制限されています。この制限は、Jieccの--max-include-depthにより変更できます。

#syspathディレクティブ

#syspathディレクティブは、#sincludeディレクティブ、およびsincludeプラグマが探索するディレクトリを追加します。

指定するパスが相対パスのとき、Jieccの実行ディレクトリを基準にします。Jieccの実行ディレクトリが変わる場合は、注意してください。#sincludeディレクティブ、およびsincludeプラグマが探索するディレクトリは、Jieccのコマンドラインオプション --syspath (-I) によっても指定できます。

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

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

syspathプラグマとの違いは、プリプロセスフェーズで読み込むか否かです。#syspathディレクティブで設定したパスは、sincludeプラグマにも影響します。

#max-include-depthディレクティブ

4.16~#max-include-depthディレクティブは、#includeのネストの上限を変更します。初期値は、200です。

コマンドラインオプション max-include-depth によっても変更できます。

#errorディレクティブ

4.4~#errorディレクティブは、プリプロセス時にユーザ指定のエラーメッセージを出力して、処理全体を停止します。

{#if _STD}
// _STDが真の場合の処理を記述します。
{#else}
// _STDが偽の場合、以下のエラーメッセージ'Standard mode required.'を出力して停止します。
{#error Standard mode is required.}
{#endif}

#warning, #infoディレクティブ

4.16~#warning, #infoディレクティブは、プリプロセス時にユーザ指定のメッセージを出力します。処理全体は継続します。

{#if _STD}
// _STDが真の場合の処理を記述します。
{#else}
// _STDが偽の場合、以下のメッセージ'Standard mode is strongly recommended.'を出力します。
{#warning Standard mode is strongly recommended.}
{#endif}

拡張構文

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

endキーワード

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

type
	t: struct m: int; end;
end

program Main
	var v: int; end
{st}
if true then v := 1; else v := 0; end;
{end}
end

末尾部分での変数属性の指定

(*
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

サイズ指定の配列宣言

4.18~配列宣言時に、始点と終点ではなく、サイズを指定する構文をサポートします。

var
	a: array[10] of int; // a: array[0..9] of int と等価です。
end_var

基数10の数値リテラル

基数10を指定するリテラルをサポートします。IEC 61131-3では、基数2, 8, 16のみ規定されています。

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

コードブロック外における文字列リテラルの連結

コードブロック外において、トークン的に連続する文字列リテラルがあるとき、一つの文字列リテラルに連結します。本機能は、プリプロセス時とコンバート時の両方で実行されます。

var
	// 'シンボル,値$nPI,3.14159$nE,2.71828$n'と等価です。
	stringv: string[100] := 'シンボル,値' '$n'
		'PI,3.14159' '$n'
		'E,2.71828' '$n'
		;
end_var

末尾カンマ

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

type e_t: (e0, e1,); end_type
:
var a: array[0..3] of int := [1, 2, 3, 4,]; end_var

終端のセミコロン省略

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

program Main
	var v: int; end_var
	var w: int end_var
end_program

ST言語のプログラムコード内のセミコロン省略

ST言語のプログラムコード内にていくつかの文の終端においてセミコロンを省略できます。

program Main
	var a, b: bool; end_var
//{st}
if a then
	a := b
	if a then a := b end_if
	if a then a := b end_if
end_if
a := b; // 式と式の間には、セミコロンが必要です。
a := b
//{end}
end_program

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

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

type
	// e_tをdint (e0 := 2, e1 := 3)と解釈します。
	e_t: (e0 := 2, e1 := 3);
end_type

識別子の制約が少ない

変数名等に使用できる識別子の制約が、IEC 61131-3規格の識別子よりも少ないです。キーワードについては、endキーワードが追加されていることを除き、IEC 61131-3規格のキーワードと同等です。

var __a__: int; end_var

オムロン社製Sysmac Studioの名前空間記法をサポート

5.12~オムロン社製Sysmac Studioのバックスラッシュを使用するの名前空間記法をサポートします。例えば、 \\a, a\b\c などをソースコード内で使用できます。

エラーコード

jieccコマンドは、変換時に異常や"異常相当"を検出した場合、標準エラー出力にエラー情報を出力します。

例えば、以下のコマンドの実行結果は、illegal_syntax.txt の2行目のtypeキーワードの位置で構文エラー0x44000003(INVALID_SYNTAX)が発生したことを意味します。

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

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

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

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

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

エラーコード一覧

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

Error Code List
CodeSymbolKind
0x10000000INFO_MESSAGERSC
0x20000401UNKNOWN_VISIBILITYWARNING | ATTR
0x20000421NO_ON_ATTR_RESOURCEWARNING | ATTR | CFG
0x20000501INTERNALVAR_IN_FUNCTIONWARNING | ATTR | VAR
0x20000502VAR_IN_OUT_WITH_CONSTANTWARNING | ATTR | VAR
0x20001001FLOATING_POINT_WARNING_IN_DURATIONWARNING | LIT
0x20008001UNKNOWN_PRAGMA_WARNINGWARNING | PRAGMA
0x20802001UNKNOWN_TAGWARNING | DECL | XML
0x20804001UNKNOWN_PP_DIRECTIVEWARNING | DECL | PP
0x20804002REDEFINE_PPMACRO_WARNINGWARNING | DECL | PP
0x20900200DECL_SUBRANGE_TYPE_WITH_INITWARNING | DECL | INIT | TYPE
0x20900210DECL_ARRAY_TYPE_WITH_INITWARNING | DECL | INIT | TYPE | ARRAY
0x24000001RESERVED_KEYWORD_USED_WARNINGWARNING | SYNTAX
0x24000401IGNORE_ATTRSWARNING | SYNTAX | ATTR
0x24200001LD_SECTION_DETECTEDWARNING | SYNTAX | PROG
0x28000001NOT_IMPLEMENTED_WARNINGWARNING | APP
0x30000000WARNING_MESSAGEWARNING | RSC
0x30008001UNKNOWN_ERROR_CODEWARNING | RSC | PRAGMA
0x40001001INVALID_BASE_NUMBERERROR | LIT
0x40002001UNSUPPORTED_PLCOPENXMLERROR | XML
0x40008001INVALID_PRAGMAERROR | PRAGMA
0x40044001FMACRO_INVALID_PARAMSERROR | CALL | PP
0x40080001TYPE_ERRORERROR | CONV
0x40084001INVALID_PP_DEFINED_OPERANDERROR | CONV | PP
0x40084002INVALID_PP_SETLINE_OPERANDERROR | CONV | PP
0x40084003INVALID_PP_IGNORE_OPERANDERROR | CONV | PP
0x40088001INVALID_PRAGMA_SETLINE_OPERANDERROR | CONV | PRAGMA
0x40204001INVALID_PP_NO_EXPRERROR | PROG | PP
0x40204002INVALID_PP_EXPRERROR | PROG | PP
0x40800201VALUED_ENUM_WITH_NO_BASETYPEERROR | DECL | TYPE
0x40804001INVALID_PP_DIRECTIVEERROR | DECL | PP
0x40804004FMACRO_INVALID_VAARGSERROR | DECL | PP
0x44000001INVALID_DATAERROR | SYNTAX
0x44000002INVALID_CHARACTERERROR | SYNTAX
0x44000003INVALID_TOKENERROR | SYNTAX
0x44000004INVALID_SYNTAXERROR | SYNTAX
0x44000005INVALID_SYNTAX_FOR_COMMENTERROR | SYNTAX
0x44001009INVALID_SYNTAX_FOR_STRINGERROR | SYNTAX | LIT | STRING
0x4400100aINVALID_STRING_ESCAPE_SEQUENCEERROR | SYNTAX | LIT | STRING
0x44004001INVALID_SYNTAX_FOR_PPERROR | SYNTAX | PP
0x44004002INVALID_PP_ESCAPE_SEQUENCEERROR | SYNTAX | PP
0x44008001INVALID_SYNTAX_FOR_PRAGMAERROR | SYNTAX | PRAGMA
0x44008002INVALID_PRAGMA_ESCAPE_SEQUENCEERROR | SYNTAX | PRAGMA
0x44020001INVALID_SYNTAX_FOR_CASEERROR | SYNTAX | CTRL
0x44020002INVALID_SYNTAX_FOR_LABELERROR | SYNTAX | CTRL
0x44101011INVALID_ARRAY_INIT_SEQUENCEERROR | SYNTAX | INIT | LIT | ARRAY
0x44208001INVALID_SYNTAX_FOR_CODEBLOCKERROR | SYNTAX | PROG | PRAGMA
0x44800801INVALID_SYNTAX_FOR_NAMEERROR | SYNTAX | DECL | SYM
0x44804002FMACRO_INVALID_STRINGIZINGERROR | SYNTAX | DECL | PP
0x44804003FMACRO_INVALID_TOKEN_PASTINGERROR | SYNTAX | DECL | PP
0x48000001NOT_IMPLEMENTED_ERRORERROR | APP
0x48000002UNSUPPORTED_LANGUAGEERROR | APP
0x50000000ERROR_MESSAGEERROR | RSC
0x50000001FILE_ERRORERROR | RSC
0x50000002FILE_NOT_FOUNDERROR | RSC
0x50000003CIRCULAR_INCLUDEERROR | RSC
0x50000004INVALID_COMMANDERROR | RSC
0x50004001MAX_INCLUDE_DEPTH_EXCEEDEDERROR | RSC | PP
0x80000000FATALSEVERE
0x88000001OPERATION_NOT_ALLOWEDSEVERE | APP
0x90000000SEVERE_MESSAGESEVERE | RSC
0x90200001FATAL_DATASEVERE | RSC | PROG

エラーコード詳細

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

ソフトウェア更新履歴

ソフトウェア更新履歴
日付更新内容
2025/09/28Jiecc 5.12.4をリリースしました。
  • オムロン社製Sysmac Studioの名前空間記法(e.g. \\a, a\b\c)をサポートしました。
2025/08/02Jiecc 5.10.4をリリースしました。
  • プリプロセッサディレクティブやプラグマ内において、$なしの改行をサポートしました。
2025/05/18Jiecc 5.8.4をリリースしました。
  • CODESYS社製CODESYSをサポートしました。ただし、以下の点を除きます。
    • 一部のstring型の初期値指定。string[100]などサイズありの場合と挙動が違います。おそらくCODESYSの不具合です。
    • 複数のimplementsをもつOOFBを構文エラーの状態でインポートします。おそらくCODESYSの不具合です。
    • その他、注意として、ファンクション内で使用するvarやvar_tempがxmlインポート後にエラーになります。
    • また、CODESYSのIEC 61131-10 XMLインポート方法は、いくつかの手動操作を必要とします。JiecUnit@GitHubなどを参考にしてください。
  • コンバート時、正値の時間リテラルのとき、+符号を付与しないようにしました。CODESYSが未サポートのため。
  • (いくつか過去のバージョンから、zipファイルに同梱しているiec 61131-3サンプルソースコードが、ifdefまみれになっていますが、ソースコード管理が容易なためにそうしています。プリプロセッサだけを起動するjiecc -Eによりプリプロセス後のiec 61131-3ソースコードを得ることができます。)
2025/05/07Jiecc 5.6.4をリリースしました。
  • 二重引用符の文字列リテラルをXMLで出力するときに、$22で出力するように変更しました。(KV Studioが、$"を受け付けないため)
  • 配列初期化子での[1, 2(3, 4, 5), 6]のような複数要素を内包する連続指定をサポートしました。
2025/05/06Jiecc 5.4.4をリリースしました。
  • 三菱電機社製MELSOFT GX Wokrs3 Ver.1をサポートしました。ただし、以下の点を除きます。
    • タスク定義
  • 三菱電機社製MELSOFT GX Wokrs3 Ver.1専用のFunPouProperties.isEnEno, FbPouProperties.isEnEnoプラグマをサポートしました。
  • キーエンス社製KV STUDIOにおいて、AT指定をサポートしました。
  • キーエンス社製KV STUDIOにおいて、END/ENDHラダープログラムを自動挿入するようにしました。また、自動挿入を抑制するためのappend-eilogue-pou-bodyプラグマをサポートしました。
  • ターゲットにCODESYS, PHOENIXCONTACTを指定できるようにしました。ただし、インポート動作確認をしておりません。ifディレクティブの条件などでの活用を想定しています。
  • コンフィグレーション定義直下に定義するグローバル変数定義がIEC 61131-10 XMLに変換されない不具合を修正しました。
  • (上記不具合修正により)キーエンス社製KV STUDIOにおいて、グローバル変数定義をサポートしました。
  • return-docプラグマを変換できない不具合を修正しました。
  • デコンバート処理において、AddDataを無視するようにし、エラーを発生させないようにしました。
  • デコンバート処理において、可変長配列を変換できない不具合を修正しました。
2025/04/20Jiecc 5.2.1をリリースしました。
  • キーエンス社製KV STUDIO Ver.12をサポートしました。ただし、当該ソフトウェアが受け付けるXML仕様が不明な以下の点を除きます。
    • グローバル変数を定義する方法が不明です。IEC 61131-10規格に従い、単純にCONFIGURATIONやRESOURCE下に定義してみましたが、受け付けてくれません。
    • 共用体型を定義する方法が不明です。
    • その他、ST言語プログラムのみのMainBodyを作ると「END命令, ENDH命令がない不正なプログラム」となります → Jieccではユーザによる意図的なものか判断が難しいため、ご自身で適切な位置にEND命令, ENDH命令を挿入ください。orderWithinParamSet属性を2以上にしないと引数変数定義を受け付けてくれません → KEYENCEの場合、Jieccで2オリジンで生成するようにしています。文字列型変数定義時の初期値に単純に '~' の記法で記述すると、変数定義自体を受け付けてくれなくなります → Jieccでstring#'~'のように生成するようにしています。
  • コメントを含むIEC 61131-10 XMLを、IEC 61131-3テキストできないことがある不具合を修正しました。
2025/04/13Jiecc 4.22.23をリリースしました。
  • シングルクォーテーションなど、文字列リテラル内でエスケープが必要な文字の出力方法を変更しました。
  • プリプロセス時のエラーメッセージの行番号を改善しました。
2025/03/26Jiecc 4.20.19をリリースしました。
  • -nCオプションを使用したときに、ドキュメントコメント/*! ~ */(*! ~ *)//! ~を削除しないようにしました。
  • 3つ以上のコードブロックのときにsingle-bodyプラグマが正しく機能しない問題を修正しました。
  • その他の軽微な不具合を修正しました。
2025/03/23Jiecc 4.18.17をリリースしました。
  • C言語の__func__変数と同等の機能をもつ__func__プラグマをサポートしました。
  • プリプロセスの可変長引数の引数個数を得る__VA_ARGC__マクロをサポートしました。
  • サイズ指定だけで配列を宣言できる構文をサポートしました。e.g. array[10] of int → array[0..9] of int
  • POU内に複数のコードブロックがあった場合に、一つのコードブロックにして出力するsingle-bodyプラグマをサポートしました。
  • 配列初期値の繰り返し指定、および文字列型のサイズ指定の定数部分を加算・減算に限定して畳み込むようにしました。e.g. string[10 + 1]
  • コードブロック開始直後に改行がある場合に、行番号がずれる問題を修正しました。
2025/03/16Jiecc 4.16.16をリリースしました。
  • デコンバート時にIEC 61131-10よりも古いPLCopen XMLフォーマットが入力された場合に、エラーコード UNSUPPORTED_PLCOPENXMLを発行するようにしました。
  • STコードブロック内がセミコロンから始まる場合に、構文エラーが発生していた問題を修正しました。
2025/03/02Jiecc 4.16.14をリリースしました。
  • #max-include-depthディレクティブをサポートしました。
  • #warning, #infoディレクティブをサポートしました。
  • プリプロセッサ処理の過程で出力するプラグマの形式を {~} から、 (*{~}*) に変更しました。この振る舞いは、コマンドラインオプション pp-output-pragma-style により変更できます。
  • 名前付き値型のIEC 61131-10 XML生成できないことがある不具合を修正しました。
  • IEC 61131-10 XML上のNamespace要素のDocumentを正しくIEC 61131-3テキストに変換できない不具合を修正しました。
2025/02/17Jiecc 4.14.12をリリースしました。
  • プリプロセス時にすべてのコメントを削除するコマンドラインオプション -nC をサポートしました。※プログラムコード内のコメントも削除します。
  • 関数マクロ展開時に行番号がずれることがある不具合を修正しました。
2025/02/08Jiecc 4.12.11をリリースしました。
  • 性能改善しました。Boost preprocessorライブラリのコンバート 10秒 → 6秒
    • Python、およびPyinstallerをアップデートした。
    • その他、細かなロジック見直し。
  • include, sincludeプラグマで、IEC 61131-10 XMLファイルを直接インクルードする機能をサポートしました。一方、#include, #sincludeディレクティブでは、IEC 61131-10 XMLを直接インクルードできないことを明示しました。
2025/02/02Jiecc 4.10.10をリリースしました。
  • 性能改善しました。Boost preprocessorライブラリのコンバート 18秒 → 10秒
    • Lexer/Parserを再利用するようにした。
    • #includeにより読み込んだ内容をキャッシュするようにした。
    • その他、細かなロジック見直し。
2025/01/20Jiecc 4.8.10をリリースしました。
2025/01/06Jiecc 4.6.8をリリースしました。
  • #ifディレクティブの条件部分に、ビット列型を含む式をサポートしました。
2024/12/27Jiecc 4.4.7をリリースしました。
  • defined演算子が括弧なしの場合、機能しない不具合を修正しました。
  • この関数マクロ実装教科書の以下黄色部を実装しました。(実装しないことによる問題はよく分かっておりません。w)
2024/12/26Jiecc 4.4.5をリリースしました。
  • コマンドラインオプション --target (-t) にSTDを指定した場合に、_STDに加え_STANDARDマクロが事前定義されるようにしました。
  • jiecc.zipの内容に#ifディレクティブのサンプルを追加しました。
  • 本体のコードを一部見直しました。
2024/12/25Jiecc 4.4.4をリリースしました。
  • #if, #ifdef, #ifndef, #elif, #else, #endifディレクティブをサポートしました。C言語と同様、コンパイルするソースコードの部分の有効・無効を制御できるようになりました。
  • プリプロセス処理実行直前に事前定義マクロを定義するようにしました。
  • プリプロセス処理実行後のマクロ定義一覧を出力するコマンドラインオプション -dM をサポートしました。`echo | jiecc -E -dM -`などと実行することで、事前定義マクロを確認できます。
  • __DATE__, __TIME__マクロをサポートしました。コンパイル時刻をIEC 611131-10 XMLに埋め込むことができるようになりました。
  • __TIMESTAMP__マクロをサポートしました。ソースコードを最後に更新した日付時刻をIEC 611131-10 XMLに埋め込むことができるようになりました。
  • #errorディレクティブをサポートしました。コンバート時にユーザ指定のエラーを発生させることができるようになりました。
  • オブジェクトマクロ定義と関数マクロ定義において、同じ識別子で定義された場合でもあっても関連付けられた内容が同じであれば、警告を出力しないようにしました。
  • #lineディレクティブにファイル名だけでなく、絶対パスや相対パスを指定できるように改善しました。
2024/10/19Jiecc 4.2.2をリリースしました。
  • 入力プログラムサイズが大きいとFATALエラーで落ちる問題を修正しました。→ スタックオーバーフローが発生していました。この関数マクロ実装教科書の、説明のために書かれた爆再帰アルゴリズムをそのまま実装したためです。\(^o^)/
  • jieccコマンドの-Eオプション時に-Dオプションが機能しない問題を修正しました。
2024/10/14Jiecc 4.2.0をリリースしました。
  • プリプロセス機能関数マクロ、文字列化演算子、トークン連結演算子、可変個引数マクロをサポートしました。
  • コマンドラインオプション --define-macro (-D) をサポートしました。
2024/09/08Jiecc 3.6.0をリリースしました。
  • ST言語プログラム内で、文終端に必要なセミコロンの構文規則を緩和しました。
  • WSTRING文字列リテラルでエスケープ文字が含まれるとエラーになる不具合を修正しました。
2024/07/21Jiecc 3.4.2をリリースしました。
  • プラグマ内での改行方法を厳密化しました。改行する場合、$に続いて改行する必要があります。
  • エラーメッセージにファイル名を含めるようにしました。
  • いくつかの軽微な不具合を修正しました。
2024/07/15Jiecc 3.4.0をリリースしました。
  • プリプロセス機能をサポートしました。
  • Jiecc Web版に10 XMLから3 Textへの変換モードと、3 Textにプリプロセスのみを適用するモードを追加しました。
2024/07/07Jiecc Web版 3.3.0をリリースしました。α版の位置付けとし、Jiecc Web版限定としています。本頁の詳しい仕様の記載もありません m(_ _)m
  • プリプロセッサ命令 ###(トークン展開), ##(文字列化) および __func__マクロ, __counter__マクロをサポートしました。以下のように使用します。大文字・小文字を区別します。
    {#define: R0 := 0}
    {#define: R1 := 9}
    {#define: T := int}
    
    type
        t: struct
            m0: array[R0..R1] of T;
        end_struct;
    end
    
    function line_{###: T}: T // function line_int: int
    //{st}
    f := __line__;
    //{end}
    end
    
    program Main
    var
    	// name: string := 'Main';
    	name: string := __func__;
    	v: array[R0..R1] of T;
    	tv: t;
    	i: dint;
    	// s0: string := '25';
    	s{###: __counter__}: string := {##: __line__};
    	// s1: string := '27';
    	s{###: __counter__}: string := {##: __line__};
    end
    //{st}
    for i := R0 to R1 by 1 do
        v[i] := tv.m0[i];
    end;
    //{end}
    end
    
2024/06/30Jiecc Web版 3.1.0をリリースしました。α版の位置付けとし、Jiecc Web版限定としています。本頁の詳しい仕様の記載もありません m(_ _)m
  • プリプロセッサ命令 #define, #undef および __LINE__マクロをサポートしました。以下のように使用します。大文字・小文字を区別します。
    //{#define: R0 := 0}
    //{#define: R1 := 9}
    //{#define: T := int}
    
    type t_t: struct
    	m0: array[R0..R1] of T;
    	m1: int;
    end; end
    
    program Main
    var
    	v: array[R0..R1] of T;
    	tv: t_t;
    	i: dint;
    	// __LINE__マクロ部分が、行番号の17に置換されます。
    	// コード部でも有効に機能します。
    	l: dint := __LINE__;
    end
    {st}
    for i := R0 to R1 by 1 do
        v[i] := tv.m0[i];
    end;
    {end}
    end
    
  • (** ~ *)/** ~ */ とコメントを記述することで、docプラグマと同等になるようにしました。※本機能もまたα版です。
  • retro_capsオプションに対応するretro_capsプラグマをサポートしました。e.g. {retro_caps: true}
2024/06/09Jiecc 2.10.5をリリースしました。
  • IEC 61131-3のキーワードをデフォルト小文字で出力するように変更しました。--retro_capsオプションで大文字に変更できます。
  • IEC 61131-10からIEC 61131-3に変換するとき、名前がIEC 61131-3の文法的に不正なとき、idプラグマを使用して出力するように変更しました。
2024/06/02Jiecc 2.8.5をリリースしました。
  • 「BUG-6 サイズ指定ありのwstring型を含む宣言で不正なxmlが生成される。」を修正しました。
  • 「BUG-5 一行コメントのENDプラグマが小文字で記述できない。」を修正しました。
  • 「BUG-4 var a at %IX0: bool; end_varのようにパスの直後に:があると正しく変換されない。」を修正しました。
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-7 wstring型リテラルのエスケープ文字がエラーになる。 Ver.0.2.0~
BUG-6 サイズ指定ありのwstring型を含む宣言で不正なxmlが生成される。 Ver.0.2.0~ var a: wstring[10]; end_varなど。stringでは再現しない。。。
BUG-5 一行コメントのENDプラグマが小文字で記述できない。 Ver.0.2.0~ 大文字・小文字を区別する実装になってしまっています。
BUG-4 var a at %IX0: bool; end_varのようにパスの直後に:があると正しく変換されない。 Ver.0.2.0~ var a AT %IX0 : bool; end_varのように空白を入れると問題を回避できます。
BUG-3 配列初期化子での[1, 2(3, 4, 5), 6]のような複数要素を内包する連続指定が正しく変換されない。 Ver.0.2.0~ IEC 61131-10に直接対応する記法がないのでは。。。 → べた展開するようにした。[2(3(5))]については、直接対応する記法がない。
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のコメントにて記載するか、管理者メールアドレスに連絡ください。