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
<?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規格の目的の一つは、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以降)が生成した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/ ; 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
上記コマンドでは、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.0のコマンド実行結果は以下の通りです。
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] [--creation_datetime CREATION_DATETIME] [--modification_datetime MODIFICATION_DATETIME] [--silent] [filepaths ...] 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: filepaths IEC 61131-3 text file paths. 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. 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. --creation_datetime CREATION_DATETIME, -T CREATION_DATETIME creation datetime. options include TODAY, NOW, or a specifc format like 1999-12-31T23:59:59.999999+11:59. Default: TODAY. --modification_datetime MODIFICATION_DATETIME, -M MODIFICATION_DATETIME modification datetime. options include TODAY, NOW, or a specifc format like 1999-12-31T23:59:59.999999+11:59. Default: TODAY. --silent activate silent mode to suppress error messages.
以下のフォームを使用して、ブラウザ上でIEC 61131-3テキストをIEC 61131-10 XMLへ変換できます。
Jieccの入力仕様や特性について記載します。
JieccがサポートするIEC 61131-3テキストのエンコーディング方式は、UTF-8です。改行コードは、LF、CRLF2.8.0~、CR2.8.0~をサポートします。
Jieccは、構文を除き、validation機能を持ちません。入力のIEC 61131-3テキストを可能な限り、IEC 61131-10 XMLに変換しようとします。
例えば、次のIEC 61131-3テキストは、同じ名前の変数aがプログラムPOUに定義されているため、IEC 61131-3の仕様的には不正なプログラムです。しかし、Jieccはこれを異常とせず、VAR_TEMPのaとVARのaを含むIEC 61131-10 XMLを生成します。
PROGRAM main VAR_TEMP a: BOOL; END_VAR VAR a: INT; END_VAR END_PROGRAM
また、ファンクション内でVAR変数を定義している次のプログラムは、IEC 61131-3の仕様的には正しいですが、IEC 61131-10 XMLの仕様では不正となります。このようなプログラムについても、Jieccは可能な限り、XMLを生成しようとします。
FUNCTION f: BOOL VAR v: INT; END_VAR // IEC 61131-10的には不正 END_FUNCTION
最終的な確認はターゲット環境にて実施ください。現在、OMRON社製Sysmac Studioがサポートしています。
ST言語のプログラムコードをPOU内に記述するには、プラグマ{ST}~{END}
を使用して次のように記述します。
PROGRAM main VAR intv: INT; END_VAR {ST} intv := 3; intv := intv + 1; {END} END_PROGRAM
上記は次のように出力されます。{ST}~{END}
内の文字列がそのまま出力されます。get-line, __line__プラグマ等も置換されずそのまま出力されることに注意ください。
: <Program name="main"> : <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 |
---|---|---|
プラグマ; {~} | 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 | Yes1.2.0~ | Yes1.2.0~ |
基本型: 文字列型: STRING, WSTRING | Yes | Yes |
列挙型定義 | Yes | Yes |
名前付き値型定義 | Yes | Yes |
構造体型定義; STRUCT | Yes | Yes |
構造体属性; AT, OVERLAP | Yes2.4.0~ | Yes2.4.0~ |
範囲型定義 | Yes1.2.0~ | Yes1.2.0~ |
参照型定義; REF_TO | Yes1.2.0~ | Yes1.2.0~ |
配列型定義; ARRAY | Yes1.2.0~ | Yes1.2.0~ |
直接派生型定義 | Yes1.2.0~ | Yes1.2.0~ |
名前空間定義; NAMESPACE | Yes | Yes |
名前空間属性; INTERNAL | Yes2.2.0~ | Yes2.2.0~ |
USINGディレクティブ | Yes | Yes |
ファンクション定義; FUNCTION | Yes | Yes |
FB定義; FUNCTION_BLOCK | Yes | Yes |
オブジェクト指向FB(OOFB)定義 | Yes2.6.0~ | Yes2.6.0~ |
プログラムPOU定義; PROGRAM | Yes | Yes |
クラス定義; CLASS | Yes2.6.0~ | Yes2.6.0~ |
クラス属性; ABSTRACT, FINAL | Yes2.6.0~ | Yes2.6.0~ |
クラス・OOFB継承; EXTENDS | Yes2.6.0~ | Yes2.6.0~ |
インタフェース定義 | Yes2.6.0~ | Yes2.6.0~ |
インタフェース実装; IMPLEMENTS | Yes2.6.0~ | Yes2.6.0~ |
インタフェース継承; EXTENDS | Yes2.6.0~ | Yes2.6.0~ |
メソッド定義; METHOD | Yes2.6.0~ | Yes2.6.0~ |
メソッド属性; ABSTRACT, FINAL, OVERRIDE | Yes2.6.0~ | Yes2.6.0~ |
THIS, SUPERキーワード | Yes2.6.0~ | Yes2.6.0~ |
基本型変数定義 | Yes | Yes |
範囲属性付き変数定義 | Yes | Yes |
配列変数定義; ARRAY | Yes | Yes |
可変長配列変数定義; [*] | Yes | Yes |
参照型変数定義; REF_TO | Yes1.2.0~ | Yes1.2.0~ |
変数属性; 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} | 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~ |
コンフィグレーション定義; CONFIGURATION | Yes | Yes |
リソース定義; RESOURCE | Yes | Yes |
グローバル変数定義; VAR_GLOBAL | Yes | Yes |
可視属性; PRIVATE, INTERNAL, PROTECTED, PUBLIC | Yes2.2.0~ | Yes2.2.0~ |
VAR_ACCESS変数定義 | Yes2.4.0~ | Yes2.4.0~ |
VAR_ACCESS変数属性; READ_ONLY, READ_WRITE | Yes2.4.0~ | Yes2.4.0~ |
VAR_CONFIG定義 | Yes2.2.0~ | Yes2.2.0~ |
タスク定義; TASK | Yes2.4.0~ | Yes2.4.0~ |
タスクインスタンス定義; WITH | Yes2.4.0~ | Yes2.4.0~ |
+, -演算子 | Yes | Yes |
*, /, mod演算子 | Yes | Yes |
**演算子 | Yes | Yes |
and, &, or, xor演算子 | Yes | Yes |
<, <=, >=, >演算子 | Yes | Yes |
=, <>演算子 | Yes | Yes |
#演算子; e_t#e1, int#1 | Yes | Yes |
.演算子; v.m0, w.%x2 | Yes | Yes |
:=演算子 | Yes | Yes |
?=演算子 | Yes2.6.0~ | Yes2.6.0~ |
単項+,-演算子 | Yes | Yes |
not演算子 | Yes | Yes |
ref演算子 | Yes2.6.0~ | Yes2.6.0~ |
^演算子 | 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 | Yes2.8.0~ | Yes2.8.0~ |
アクション定義; ACTION | Yes2.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固有の仕様として、プラグマの構文は、{key:value}
です※1。valueの指定を必要としないプラグマについては、{key:}
のように記述します。
Jieccのコマンドラインから指定できるオプションの多くは本章で示すプラグマでも指定できます。両方指定している場合、コマンドラインオプションが優先されます。
※1 ST, LD, ENDプラグマだけは例外です。{ST}
、{LD}
、{END}
のようにコロン(:)なしで記述します。これは、{ST}
~{END}
内のIEC 61131-3テキストをそのままXMLに転写する特殊なプラグマであることに起因します。
下表のプラグマは、出力する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 | COMPANY NAME |
FileHeaderタグ属性 companyURL | company-url | - |
FileHeaderタグ属性 productName | product-name | PRODUCT NAME |
FileHeaderタグ属性 productVersion | product-version | 1.0 |
FileHeaderタグ属性 productRelease | product-release | - |
ContentHeaderタグ属性 name | content-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
return-doc
プラグマは、戻り値変数のコメントを指定するために使用します。IEC 61131-10に対応する要素はなく、ターゲットがOMRONのときのみ意味があります。
// {doc: ファンクションfのコメントです。} // {return-doc: 戻り値変数のコメントです。} FUNCTION f: BOOL 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
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
プラグマ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 <~>と同じです。
プラグマ | 探し方 |
---|---|
include | includeが記述されているファイルが存在するディレクトリを基準にして探します。 見つからなければ、syspathで指定したパスを基準にして探します。 |
sinclude | syspathで指定したパスを基準にして探します。 |
例えば、上述した例のファイルがsrcディレクトリにある場合、src/lib/x.txtを探して読み込みます。
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
プラグマは、IEC 61131-10 XML出力時、またはIEC 61131-3テキスト出力時の改行文字を指定します。
// XMLの改行をCR-LFで出力します。 // {line-separator: $r$n}
target
プラグマは、変換先のターゲットを指定します。デフォルト値は、STD
(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 |
OMRON社製Sysmac Studio準拠 | OMRON |
id
プラグマは、IEC 61131-3では記述することが難しいパス文字列や識別子を記述します。
VAR // vのAT属性値は半角空白を含む'%xxx://x y 3'になります。 v AT {id: %xxx://x y 3} : BOOL; END_VAR
set-line, line
プラグマは、C言語プリプロセッサのlineディレクティブに相当し、プラグマを記述した行の番号がプラグマで指定した番号になります。
{set-line: 4} PROGRAM main // mainは6行目で定義された要素と解釈されます。 END_PROGRAM
get-line, __line__
プラグマは、C言語プリプロセッサの__LINE__マクロに相当し、プラグマが行番号に置換されます。
ST, LD, ENDプラグマ内では、置換されないことに注意してください。
ST, LD
プラグマは、END
プラグマと併用して使用し、ST/LD言語のプログラムコードを記述するために使用します。詳しくは、ST言語などのプログラムコード部の記述方法を参照ください。
Jieccは、IEC 61131-3の構文仕様を拡張した独自構文をサポートしています。IEC 61131-3準拠の構文のみを使用する必要がある場合、本章の内容に注意ください。
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
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のエラーメッセージが表示されている場合、変換結果は不正です。
エラーコードの一覧を下表に示します。
Code | Symbol | Kind |
---|---|---|
0x20001001 | UNKNOWN_VISIBILITY | WARNING | ATTR |
0x20001081 | NO_ON_ATTR_RESOURCE | WARNING | ATTR | CFG |
0x20001401 | INTERNALVAR_IN_FUNCTION | WARNING | ATTR | VAR |
0x20001402 | VAR_IN_OUT_WITH_CONSTANT | WARNING | ATTR | VAR |
0x20004001 | FLOATING_POINT_WARNING_IN_DURATION | WARNING | LIT |
0x20008001 | UNKNOWN_PRAGMA_WARNING | WARNING | PRAGMA |
0x24000001 | RESERVED_KEYWORD_USED_WARNING | WARNING | SYNTAX |
0x24001001 | IGNORE_ATTRS | WARNING | SYNTAX | ATTR |
0x24200001 | LD_SECTION_DETECTED | WARNING | SYNTAX | PROG |
0x28000000 | NOT_IMPLEMENTED_WARNING | WARNING | APP |
0x28000001 | BROKEN_CELL | WARNING | APP |
0x40004001 | INVALID_BASE_NUMBER | ERROR | LIT |
0x40800801 | VALUED_ENUM_WITH_NO_BASETYPE | ERROR | DECL | TYPE |
0x44000001 | INVALID_CHARACTER | ERROR | SYNTAX |
0x44000002 | INVALID_TOKEN | ERROR | SYNTAX |
0x44000003 | INVALID_SYNTAX | ERROR | SYNTAX |
0x44000004 | INVALID_SYNTAX_FOR_CASE | ERROR | SYNTAX |
0x44000005 | INVALID_SYNTAX_FOR_LABEL | ERROR | SYNTAX |
0x44000008 | INVALID_SYNTAX_FOR_COMMENT | ERROR | SYNTAX |
0x44004011 | INVALID_SYNTAX_FOR_STRING | ERROR | SYNTAX | LIT | STRING |
0x44004012 | INVALID_STRING_ESCAPE_SEQUENCE | ERROR | SYNTAX | LIT | STRING |
0x44008001 | INVALID_SYNTAX_FOR_PRAGMA | ERROR | SYNTAX | PRAGMA |
0x44008002 | INVALID_PRAGMA_ESCAPE_SEQUENCE | ERROR | SYNTAX | PRAGMA |
0x44208001 | INVALID_SYNTAX_FOR_CODEBLOCK | ERROR | SYNTAX | PROG | PRAGMA |
0x48000000 | NOT_IMPLEMENTED_ERROR | ERROR | APP |
0x48000001 | UNSUPPORTED_LANGUAGE | ERROR | APP |
0x48000002 | OPERATION_NOT_ALLOWED | ERROR | APP |
0x50000001 | FILE_ERROR | ERROR | RSC |
0x50000002 | FILE_NOT_FOUND | ERROR | RSC |
0x50000003 | CIRCULAR_INCLUDE | ERROR | RSC |
0x80000000 | FATAL | SEVERE |
工事中🙏; コマンド実行時に表示される0x~のエラーコードをエラーコード一覧から検索してヒントを得てください。
日付 | 更新内容 |
---|---|
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-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のコメントにて記載するか、管理者メールアドレスに連絡ください。