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
<?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規格の目的の一つは、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)
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
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テキストに変換して管理するときなどに有用です。
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

上記コマンドでは、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.
以下のフォームを使用して、ブラウザ上でIEC 61131-3テキストをIEC 61131-10 XMLへ変換できます。
{st} ~ {end} で囲んでいない場合、構文エラーが発生します。 Body program section requires `{st}` and `{end}` pragmas.Jieccの入力仕様や特性について記載します。
JieccがサポートするIEC 61131-3テキストのエンコーディング方式は、UTF-8です。改行コードは、LF、CRLF、CRをサポートします。
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言語のプログラムコードを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 |
|---|---|---|
| プラグマ; {~} | Yes | Yes |
| 基本型: 符号有り整数型; sint, int, dint, lint | Yes | Yes |
| 基本型: 符号無し整数型; usint, uint, udint, ulint | Yes | Yes |
| 基本型: 実数型; real, lreal | Yes | Yes |
| 基本型: ビット列型; byte, word, dword, lword | Yes | Yes |
| 基本型: 真偽型; bool | Yes | Yes |
| 基本型: 時間型; time, ltime | Yes | Yes |
| 基本型: 日付型; date, ldate | Yes | Yes |
| 基本型: 時刻型; tod, time_of_day, ltod, ltime_of_day | Yes | Yes |
| 基本型: 日付時刻型; dt, date_and_time, ldt, ldate_and_time | Yes | Yes |
| 基本型: 文字型: char, wchar | Yes | Yes |
| 基本型: 文字列型: string, wstring | Yes | Yes |
| 列挙型定義 | Yes | Yes |
| 名前付き値型定義 | Yes | Yes |
| 構造体型定義; struct | Yes | Yes |
| 構造体属性; at, overlap | Yes | Yes |
| 範囲型定義 | Yes | Yes |
| 参照型定義; ref_to | Yes | Yes |
| 配列型定義; array | Yes | Yes |
| 直接派生型定義 | Yes | Yes |
| 名前空間定義; namespace | Yes | Yes |
| 名前空間属性; internal | Yes | Yes |
| usingディレクティブ | Yes | Yes |
| ファンクション定義; function | Yes | Yes |
| FB定義; function_block | Yes | Yes |
| オブジェクト指向FB(OOFB)定義 | Yes | Yes |
| プログラムPOU定義; program | Yes | Yes |
| クラス定義; class | Yes | Yes |
| クラス属性; abstract, final | Yes | Yes |
| クラス・OOFB継承; extends | Yes | Yes |
| インタフェース定義; interface | Yes | Yes |
| インタフェース実装; implements | Yes | Yes |
| インタフェース継承; extends | Yes | Yes |
| メソッド定義; method | Yes | Yes |
| メソッド属性; abstract, final, override | Yes | Yes |
| this, superキーワード | Yes | Yes |
| 基本型変数定義 | Yes | Yes |
| 範囲属性付き変数定義 | Yes | Yes |
| 配列変数定義; array | Yes | Yes |
| 可変長配列変数定義; [*] | Yes | Yes |
| 参照型変数定義; ref_to | Yes | Yes |
| 変数属性; at | Yes | Yes |
| 変数属性; constant, retain, non_retain | Yes | Yes |
| 変数属性; r_edge, f_edge | Yes | Yes |
| ローカル変数定義; var_temp, var | Yes | Yes |
| ローカル変数定義; var_input, var_in_out, var_output | Yes | Yes |
| 外部変数定義; var_external | Yes | Yes |
| 基本型初期値 | Yes | Yes |
| 構造体初期値; (...) | Yes | Yes |
| 配列初期値; [...] | Yes | Yes |
| 配列初期値の繰り返し指定; [n(...)] | Yes | Yes |
| ST言語プログラム; {st}~{end} | Yes | Yes |
| LD言語プログラム; {ld}~{end} | Yes | Yes |
| FBD言語プログラム; {fbd}~{end} | Yes | Yes |
| IL言語プログラム; {il}~{end} | Yes | Yes |
| SFC言語プログラム; {sfc}~{end} | Yes | Yes |
| コンフィグレーション定義; configuration | Yes | Yes |
| リソース定義; resource | Yes | Yes |
| グローバル変数定義; var_global | Yes | Yes |
| 可視属性; private, internal, protected, public | Yes | Yes |
| var_access変数定義 | Yes | Yes |
| var_access変数属性; read_only, read_write | Yes | Yes |
| var_config定義 | Yes | Yes |
| タスク定義; task | Yes | Yes |
| タスクインスタンス定義; with | Yes | Yes |
| +, -演算子 | Yes | Yes |
| *, /, mod演算子 | Yes | Yes |
| **演算子 | Yes | Yes |
| and, &, or, xor演算子 | Yes | Yes |
| <, <=, >=, >演算子 | Yes | Yes |
| =, <>演算子 | Yes | Yes |
| #演算子; e_t#e1, int#1 | Yes | Yes |
| .演算子; ns1.ns2, v.m0, w.%x2 | Yes | Yes |
| :=演算子 | Yes | Yes |
| ?=演算子 | Yes | Yes |
| 単項+,-演算子 | Yes | Yes |
| not演算子 | Yes | Yes |
| ref演算子 | Yes | Yes |
| ^演算子 | Yes | Yes |
| 配列アクセス演算子; a[n] | Yes | Yes |
| false, trueキーワード | Yes | Yes |
| nullキーワード | Yes | Yes |
| if文 | Yes | Yes |
| case文 | Yes | Yes |
| for文 | Yes | Yes |
| while文 | Yes | Yes |
| repeat文 | Yes | Yes |
| continue, exit, return文 | Yes | Yes |
| トランジション定義; transition | Yes | Yes |
| アクション定義; action | Yes | Yes |
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固有の仕様として、プラグマの構文は、{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 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装置}
| 属性名 | プラグマ名 | デフォルトのプラグマ値 |
|---|---|---|
| FileHeaderタグ属性 companyName | company-name | 空文字列 |
| FileHeaderタグ属性 companyURL | company-url | - |
| FileHeaderタグ属性 productName | product-name | 空文字列 |
| FileHeaderタグ属性 productVersion | product-version | 空文字列 |
| FileHeaderタグ属性 productRelease | product-release | - |
| ContentHeaderタグ属性 name | content-name | 空文字列 |
| ContentHeaderタグ属性 version | content-version | - |
| ContentHeaderタグ属性 creationDateTime | creation-datetime | TODAY |
| ContentHeaderタグ属性 modificationDateTime | modification-datetime | - |
| ContentHeaderタグ属性 organization | organization | - |
| ContentHeaderタグ属性 author | author | - |
| ContentHeaderタグ属性 language | language | - |
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プラグマは、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プラグマは、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プラグマは、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 <~>と同じです。
| プラグマ | 探し方 |
|---|---|
include | includeが記述されているファイルが存在するディレクトリを基準にして探します。 見つからなければ、Jieccのコマンドラインオプション --syspath (-I) で指定したパス、syspathプラグマ、もしくは#syspathディレクティブで指定したパスを基準にして探します。 |
sinclude | Jieccのコマンドラインオプション --syspath (-I) で指定したパス、もしくは、syspathプラグマ、又は#syspathディレクティブで指定したパスを基準にして探します。 |
例えば、{include: lib/x.txt}と記述したファイルがsrcディレクトリにある場合、src/lib/x.txtを探して読み込みます。
4.8.10~パス部分を{include <~>}のように<~>で囲うと、{sinclude ~}と同等の動作になります。
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プラグマは、IEC 61131-10 XML出力時、またはIEC 61131-3テキスト出力時の改行文字を指定します。
// XMLの改行をCR-LFで出力します。
// {line-separator: $r$n}
targetプラグマは、変換先のターゲットを指定します。デフォルト値は、STD(IEC 61131-10規格準拠)です。
本プラグマは、主に、当該ターゲットによるIEC 61131-3やIEC 61131-10規格の独自解釈部分や独自拡張をサポートするためにあります。
// {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プラグマは、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__マクロに相当し、プラグマが行番号に置換されます。
get-line, __line__プラグマは、ST, LD, FBD, SFC, ILプラグマ内では、置換されないことに注意してください。プリプロセス機能の__LINE__マクロを使用すれば置換されます。
retro_capsプラグマは、IEC 61131-3キーワードを小文字で出力するか、大文字で出力するかを制御します。
デフォルトは、小文字で出力します。{retro_caps: true}とすると大文字で出力します。
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
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
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プラグマは、戻り値変数のコメントを指定するために使用します。
IEC 61131-10に対応する要素はなく、ターゲットがOMRONのときのみ機能します。
// {doc: ファンクションfのコメントです。}
// {return-doc: 戻り値変数のコメントです。}
function f: bool end_function
5.4~FunPouProperties.isEnEno, FbPouProperties.isEnEnoプラグマは、それぞれファンクションとファンクションブロックの属性であり、三菱電機社製MELSOFT GX Works3 Ver.1におけるPOUのプロパティ「EN/ENOを使用する」を指定するために使用します。
function {FunPouProperties.isEnEno: true} func: bool end_function
ST, LD, FBD, SFC, ILプラグマは、ENDプラグマと併用して使用し、ST/LD/FBD/SFC/IL言語のプログラムコードを記述するために使用します。詳しくは、ST言語などのプログラムコード部の記述方法を参照ください。
Jieccはプリプロセス機能を持ちます。IEC 61131-3テキストをIEC 61131-10 XMLに変換する過程において、最初にプリプロセスを実行します。プリプロセスでは、主に以下の処理を行います。
{~}内の$に続く改行文字を検出すると、その2文字を削除します。5.10~同様に、改行文字を検出した場合も、その改行文字を削除します。本処理は、プリプロセス処理の中でも最初に行われます。その後、IEC 61131-3テキストの構文解析が続きます。プリプロセスのみを適用するには、Jieccのコマンドラインオプションに-Eをつけます。
プリプロセスでは、本節で示すシステム定義のマクロとプリプロセッサディレクティブがあります。
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__マクロは、ソースコードの行番号に置換されます。
program Main
var v: int; end_var
{st}
v := __LINE__; // v := 4;
{end}
end_program
__FILE__マクロは、ソースコードのファイルパスの文字列リテラルに置換されます。
program Main var v: string := __FILE__; // 本ファイルのファイルパスが"a.txt"であれば、v: string := 'a.txt'; です。 end_var end_program
__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
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
4.4.0~__TIMESTAMP__マクロは、現在のソースファイルが最後に変更された日付日時の文字列リテラルに置換されます。
program Main var lastmodified_datev: string := __TIMESTAMP__; // 'Mon Dec 09 01:02:03 2024' などを得ます。 end_var end_program
#defineディレクティブは、以下のことを除き、概ねC言語の#defineディレクティブと同じ仕様です。一般情報も併せて参照ください。
$のあとに改行を記述することで、#defineディレクティブ内で改行できます。#defineディレクティブ内で自由に改行を記述できます。C言語では、\(バックスラッシュ)のあとに改行を記述します。@@ です。C言語は、## です。@ です。C言語は、# です。...)は、0個以上の引数を許容します。0個のとき、__VA_ARGS__ は空文字です。__VA_ARGC__マクロをサポートします。C言語は、標準ではサポートしません。#defineディレクティブ内で、プリプロセッサディレクティブを記述した場合の仕様は未定義です。e.g. {#define A ${#define B 2$}}#defineディレクティブは、識別子に対して文字列を関連付けを定義し、以降のソースコード内で当該識別子が現れると関連付けている文字列で置換します。
既に同じ識別子に関連付けがある場合、警告を出力します。ただし、内容が同じであれば警告を出力しません4.4.0~。#defineディレクティブは、オブジェクトマクロと、引数をもつ関数マクロがあります。
{#define identifier tokensopt}
上記形式で記述するオブジェクトマクロは、identifierにtokensを関連付けます。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ディレクティブは、#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への関連付けを削除します。
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)と等価です。
なお、無効になっても行番号は維持されます。
#if, #ifdef, #ifndef, #elif, #else, #endifディレクティブは、以下のことを除き、概ねC言語の#if, #ifdef, #ifndef, #elif, #else, #endifディレクティブと同じ仕様です。一般情報も併せて参照ください。
#ifディレクティブ、および#elifディレクティブの引数が、整数値0、ビット列値04.6.8~になる場合や真偽値falseになる場合に無効と判定されます。C言語では、整数値0になる場合に無効と判定されます。#ifディレクティブ、および#elifディレクティブの引数の評価では、BOOL型、整数型、およびビット列型4.6.8~を明確に区別します。例えば、#if 1 and 0は、整数値に対する論理積となるため、エラーが発生します。C言語では、エラーは発生しません。#ifディレクティブ、および#elifディレクティブの引数の評価では、BOOL型、整数型、およびビット列型4.6.8~を区別します。4.8.10~型指定のない整数リテラルをnot, or, and, xorで演算するとき、その整数リテラルをdword型として扱います。型昇格しません。C言語では、int型として扱い、必要に応じて、long longなどへの型昇格します。#ifディレクティブや#elifディレクティブの引数で使用できる演算子は、IEC 61131-3 ST言語で使用できる演算子の一部です。例えば、論理演算子は、not, and, or, xorを使用します。C言語では、!, &&, ||, ^を使用します。
{#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__マクロ、__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ディレクティブは、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ディレクティブで指定したパスを基準にして探します。 |
#sinclude | Jieccのコマンドラインオプション --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ディレクティブは、#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プラグマにも影響します。
4.16~#max-include-depthディレクティブは、#includeのネストの上限を変更します。初期値は、200です。
コマンドラインオプション max-include-depth によっても変更できます。
4.4~#errorディレクティブは、プリプロセス時にユーザ指定のエラーメッセージを出力して、処理全体を停止します。
{#if _STD}
// _STDが真の場合の処理を記述します。
{#else}
// _STDが偽の場合、以下のエラーメッセージ'Standard mode required.'を出力して停止します。
{#error Standard mode is required.}
{#endif}
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キーワードは、あらゆる"始まり"の構文に対応する"終わり"として使用できます。
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を指定するリテラルをサポートします。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言語のプログラムコード内にていくつかの文の終端においてセミコロンを省略できます。
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
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 のエラーコードの一覧を下表に示します。
| Code | Symbol | Kind |
|---|---|---|
| 0x10000000 | INFO_MESSAGE | RSC |
| 0x20000401 | UNKNOWN_VISIBILITY | WARNING | ATTR |
| 0x20000421 | NO_ON_ATTR_RESOURCE | WARNING | ATTR | CFG |
| 0x20000501 | INTERNALVAR_IN_FUNCTION | WARNING | ATTR | VAR |
| 0x20000502 | VAR_IN_OUT_WITH_CONSTANT | WARNING | ATTR | VAR |
| 0x20001001 | FLOATING_POINT_WARNING_IN_DURATION | WARNING | LIT |
| 0x20008001 | UNKNOWN_PRAGMA_WARNING | WARNING | PRAGMA |
| 0x20802001 | UNKNOWN_TAG | WARNING | DECL | XML |
| 0x20804001 | UNKNOWN_PP_DIRECTIVE | WARNING | DECL | PP |
| 0x20804002 | REDEFINE_PPMACRO_WARNING | WARNING | DECL | PP |
| 0x20900200 | DECL_SUBRANGE_TYPE_WITH_INIT | WARNING | DECL | INIT | TYPE |
| 0x20900210 | DECL_ARRAY_TYPE_WITH_INIT | WARNING | DECL | INIT | TYPE | ARRAY |
| 0x24000001 | RESERVED_KEYWORD_USED_WARNING | WARNING | SYNTAX |
| 0x24000401 | IGNORE_ATTRS | WARNING | SYNTAX | ATTR |
| 0x24200001 | LD_SECTION_DETECTED | WARNING | SYNTAX | PROG |
| 0x28000001 | NOT_IMPLEMENTED_WARNING | WARNING | APP |
| 0x30000000 | WARNING_MESSAGE | WARNING | RSC |
| 0x30008001 | UNKNOWN_ERROR_CODE | WARNING | RSC | PRAGMA |
| 0x40001001 | INVALID_BASE_NUMBER | ERROR | LIT |
| 0x40002001 | UNSUPPORTED_PLCOPENXML | ERROR | XML |
| 0x40008001 | INVALID_PRAGMA | ERROR | PRAGMA |
| 0x40044001 | FMACRO_INVALID_PARAMS | ERROR | CALL | PP |
| 0x40080001 | TYPE_ERROR | ERROR | CONV |
| 0x40084001 | INVALID_PP_DEFINED_OPERAND | ERROR | CONV | PP |
| 0x40084002 | INVALID_PP_SETLINE_OPERAND | ERROR | CONV | PP |
| 0x40084003 | INVALID_PP_IGNORE_OPERAND | ERROR | CONV | PP |
| 0x40088001 | INVALID_PRAGMA_SETLINE_OPERAND | ERROR | CONV | PRAGMA |
| 0x40204001 | INVALID_PP_NO_EXPR | ERROR | PROG | PP |
| 0x40204002 | INVALID_PP_EXPR | ERROR | PROG | PP |
| 0x40800201 | VALUED_ENUM_WITH_NO_BASETYPE | ERROR | DECL | TYPE |
| 0x40804001 | INVALID_PP_DIRECTIVE | ERROR | DECL | PP |
| 0x40804004 | FMACRO_INVALID_VAARGS | ERROR | DECL | PP |
| 0x44000001 | INVALID_DATA | ERROR | SYNTAX |
| 0x44000002 | INVALID_CHARACTER | ERROR | SYNTAX |
| 0x44000003 | INVALID_TOKEN | ERROR | SYNTAX |
| 0x44000004 | INVALID_SYNTAX | ERROR | SYNTAX |
| 0x44000005 | INVALID_SYNTAX_FOR_COMMENT | ERROR | SYNTAX |
| 0x44001009 | INVALID_SYNTAX_FOR_STRING | ERROR | SYNTAX | LIT | STRING |
| 0x4400100a | INVALID_STRING_ESCAPE_SEQUENCE | ERROR | SYNTAX | LIT | STRING |
| 0x44004001 | INVALID_SYNTAX_FOR_PP | ERROR | SYNTAX | PP |
| 0x44004002 | INVALID_PP_ESCAPE_SEQUENCE | ERROR | SYNTAX | PP |
| 0x44008001 | INVALID_SYNTAX_FOR_PRAGMA | ERROR | SYNTAX | PRAGMA |
| 0x44008002 | INVALID_PRAGMA_ESCAPE_SEQUENCE | ERROR | SYNTAX | PRAGMA |
| 0x44020001 | INVALID_SYNTAX_FOR_CASE | ERROR | SYNTAX | CTRL |
| 0x44020002 | INVALID_SYNTAX_FOR_LABEL | ERROR | SYNTAX | CTRL |
| 0x44101011 | INVALID_ARRAY_INIT_SEQUENCE | ERROR | SYNTAX | INIT | LIT | ARRAY |
| 0x44208001 | INVALID_SYNTAX_FOR_CODEBLOCK | ERROR | SYNTAX | PROG | PRAGMA |
| 0x44800801 | INVALID_SYNTAX_FOR_NAME | ERROR | SYNTAX | DECL | SYM |
| 0x44804002 | FMACRO_INVALID_STRINGIZING | ERROR | SYNTAX | DECL | PP |
| 0x44804003 | FMACRO_INVALID_TOKEN_PASTING | ERROR | SYNTAX | DECL | PP |
| 0x48000001 | NOT_IMPLEMENTED_ERROR | ERROR | APP |
| 0x48000002 | UNSUPPORTED_LANGUAGE | ERROR | APP |
| 0x50000000 | ERROR_MESSAGE | ERROR | RSC |
| 0x50000001 | FILE_ERROR | ERROR | RSC |
| 0x50000002 | FILE_NOT_FOUND | ERROR | RSC |
| 0x50000003 | CIRCULAR_INCLUDE | ERROR | RSC |
| 0x50000004 | INVALID_COMMAND | ERROR | RSC |
| 0x50004001 | MAX_INCLUDE_DEPTH_EXCEEDED | ERROR | RSC | PP |
| 0x80000000 | FATAL | SEVERE |
| 0x88000001 | OPERATION_NOT_ALLOWED | SEVERE | APP |
| 0x90000000 | SEVERE_MESSAGE | SEVERE | RSC |
| 0x90200001 | FATAL_DATA | SEVERE | RSC | PROG |
工事中🙏; コマンド実行時に表示される0x~のエラーコードをエラーコード一覧から検索してヒントを得てください。
| 日付 | 更新内容 |
|---|---|
| 2025/09/28 | Jiecc 5.12.4をリリースしました。
|
| 2025/08/02 | Jiecc 5.10.4をリリースしました。
|
| 2025/05/18 | Jiecc 5.8.4をリリースしました。
|
| 2025/05/07 | Jiecc 5.6.4をリリースしました。
|
| 2025/05/06 | Jiecc 5.4.4をリリースしました。
|
| 2025/04/20 | Jiecc 5.2.1をリリースしました。
|
| 2025/04/13 | Jiecc 4.22.23をリリースしました。
|
| 2025/03/26 | Jiecc 4.20.19をリリースしました。
|
| 2025/03/23 | Jiecc 4.18.17をリリースしました。
|
| 2025/03/16 | Jiecc 4.16.16をリリースしました。
|
| 2025/03/02 | Jiecc 4.16.14をリリースしました。
|
| 2025/02/17 | Jiecc 4.14.12をリリースしました。
|
| 2025/02/08 | Jiecc 4.12.11をリリースしました。
|
| 2025/02/02 | Jiecc 4.10.10をリリースしました。
|
| 2025/01/20 | Jiecc 4.8.10をリリースしました。
|
| 2025/01/06 | Jiecc 4.6.8をリリースしました。
|
| 2024/12/27 | Jiecc 4.4.7をリリースしました。
|
| 2024/12/26 | Jiecc 4.4.5をリリースしました。
|
| 2024/12/25 | Jiecc 4.4.4をリリースしました。
|
| 2024/10/19 | Jiecc 4.2.2をリリースしました。
|
| 2024/10/14 | Jiecc 4.2.0をリリースしました。
|
| 2024/09/08 | Jiecc 3.6.0をリリースしました。
|
| 2024/07/21 | Jiecc 3.4.2をリリースしました。
|
| 2024/07/15 | Jiecc 3.4.0をリリースしました。
|
| 2024/07/07 | Jiecc Web版 3.3.0をリリースしました。α版の位置付けとし、Jiecc Web版限定としています。本頁の詳しい仕様の記載もありません m(_ _)m
|
| 2024/06/30 | Jiecc Web版 3.1.0をリリースしました。α版の位置付けとし、Jiecc Web版限定としています。本頁の詳しい仕様の記載もありません m(_ _)m
|
| 2024/06/09 | Jiecc 2.10.5をリリースしました。
|
| 2024/06/02 | Jiecc 2.8.5をリリースしました。
|
| 2023/12/28 | Jiecc 2.8.4をリリースしました。
|
| 2023/12/17 | Jiecc 2.8.3をリリースしました。
|
| 2023/12/8 | Jiecc 2.8.2をリリースしました。
|
| 2023/12/6 | Jiecc 2.8.1をリリースしました。
|
| 2023/12/3 | Jiecc 2.8.0をリリースしました。 |
| 2023/11/19 | Jiecc 2.6.0をリリースしました。
|
| 2023/11/12 | Jiecc 2.4.0をリリースしました。
|
| 2023/10/28 | Jiecc 2.2.0をリリースしました。
|
| 2023/10/22 | Jiecc 1.4.0をリリースしました。
|
| 2023/10/21 | Jiecc 1.2.0をリリースしました。
|
| 2023/09/24 | Jiecc 0.2.1をリリースしました。
|
| 2023/09/17 | Jiecc 0.2.0をリリースしました。 |
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は、The 2-Clause BSD Licenseに従うフリーソフトウェアです。詳しくは、ダウンロードしたファイルに同梱されているLICENSE.txtを参照ください。
Jieccに関する問い合わせ・改善要望等については、Blogのコメントにて記載するか、管理者メールアドレスに連絡ください。