言語リファレンス

プロジェクト構成

共通オブジェクト

ＳＦＣ言語

フローチャート（ＦＣ）言語

ＦＢＤ言語

ＬＤ言語

構造化テキスト（ＳＴ）言語

命令リスト（ＩＬ）言語

標準命令、ファンクションブロック、ファンクション


 プロジェクトの構成

ISaGRAFのプロジェクトは複数のプログラムから成立っています。個々のプログラムがツリー構造でリンクされて一つのプロジェクトを形成しています。　プログラムはSFC,FC（Flow Chart）,FBD, LD, ST, ILの６種類の言語から作られます。

プログラム

サイクリック及びシーケンシャルなセクション

チャイルドSFC,FCプログラム

ファンクションとサブプログラム

ファンクションブロック

言語の説明

実行ルール


プログラム

プログラムとはプログラミングの一つのユニットのことであり、プロセス中の変数間の操作を記述しています。　プログラムにはシーケンシャルな部分とサイクリックな部分があります。　サイクリックなプログラムとはターゲットのスキャン毎に実行されるプログラムであり、シーケンシャルなプログラムはＳＦＣ言語、或いは、ＦＣ言語のルールに基づいて実行されます。

各プログラムは互いに階層的にリンクされています。　トップレベルのプログラムはシステムによって起動されます。サブプログラム（下位の階層）はそれらの親プログラムによって起動されます。　各プログラムは６種類の言語のその場に応じていずれかの言語で記述されます。

・シーケンシャル ファンンクショナル チャート（ＳＦＣ）：	高級レベルプログラミング

・フローチャート（ＦＣ）：	高級レベルプログラミング

・ファンクション ブロック ダイアグラム（ＦＢＤ）：	サイクリックオペレーション

・ラダー ダイアグラム（ＬＤ）：	ブールオペレーション

・構造化テキスト（ＳＴ）：	サイクリックオペレーション

・命令リスト（ＩＬ）：	ローレベルオペレーション

ＬＤとＦＢＤが同一プログラムの中にミックスされることを除けば、同一プログラムには複数のプログラムを混在させることはできません。


サイクリック及びシーケンシャルなセクション

プログラムの階層は５つのメインセクション（グループ）に分けられます。

Begin	毎ｻｲｸﾙのはじめに実行されるプログラム

シーケンシャル	ＳＦＣ、ＦＣダイナミックルールに従ったプログラム

End	毎サイクルの最後に実行されるプログラム

ファンクション	サブプログラムの集合

ＦＢ	サブプログラムの集合

'Begin' や 'End' セクションはサイクリックな動作を記述し、時間依存しないプログラムです。シーケンシャル' セクションのプログラムはシーケンシャルな動作を記述し、同期などの時間依存型のプログラムです。'Begin' セクションのメインプログラムはランタイムサイクル毎のはじめに実行されます。 'End' セクションのメインプログラムはランタイムサイクル毎の終りに実行されます。 シーケンシャル' セクションのメインプルグラムはＳＦＣやＦＣのダイナミックルールに基づいて実行されます。

"ファンクション" セクションのプログラムはプロジェクト内の他のプログラムから呼出されるサブプログラムのことを表します。

"ファンクション"　セクションのプログラムは同じセクションのプログラムを更に呼出すことができます。

シーケンシャルセクションでのメイン、チャイルドプログラムは必ずＳＦＣ、或いは、ＦＣ言語で記述されなければなりません。サイクリックセクションのbegin や end　は、ＳＦＣ 、或いは、ＦＣ言語では記述できません。どのプログラムも一つ以上のサブプログラムを持つことができます。 シーケンシャルセクションのプログラムは一つ以上のＳＦＣ、ＦＣチャイルドプログラムを持つことができます。サブプログラムはＳＦＣ、或いは、ＦＣ言語で記述することはできません。

Begin セクションのプログラムは入力デバイスのフィルタリングして取り込むような初期的な処理（変換関数など）に使われることが多くあります。 こうして取り込まれた変数はよくシーケンシャルセクションで使用されます。 End セクションのプログラムはシーケンシャルセクションで使われた変数の後処理（内部変数を外部出力デバイスへ送り出すような処理）を行うときに使われます。


チャイルドＳＦＣ、ＦＣプログラム

シーケンシャルセクションのどのＳＦＣ、ＦＣプログラムも他のＳＦＣ、ＦＣプログラムをコントロールすることができます。

チャイルドＳＦＣプログラムはパラレル処理のプログラムとして扱われます。即ち、親プログラムから起動、停止(kill)、凍結(frozen)、再起動させることができます。ただし、親プログラムもチャイルドプログラムもＳＦＣ言語で書かれていなければなりません。　チャイルドＳＦＣプログラムはローカル変数、ローカル定義を持つことができます。

親プログラムがチャイルドＳＦＣプログラムを起動させたとき、ＳＦＣトークン(token)をチャイルドＳＦＣプログラムのイニシャルステップにセットします。　この起動コマンドはGSTART ステートメントで記述されます。もし、親プログラムがチャイルドＳＦＣプログラムを停止(kill)させると、チャイルドプログラムのステップに存在していた全トークンをクリアさせます。　この停止コマンドはGKILLステートメントで記述されます。

親プログラムがチャイルドＳＦＣプログラムを凍結(frozen)させると、チャイルドプログラムのステップに存在していたトークンを全てクリアしますが、これらの状態はメモリに保存されます。　この凍結コマンドはGFREEZEステートメントで記述されます。　親プログラムが凍結したチャイルドＳＦＣプログラムを再起動すると、凍結の時にクリアされたトークンが復元されます。　この再起動コマンドはGRSTステートメントで記述されます。

ＦＣプログラムでは、シーケンシャルセクションのＦＣプログラムは別のＦＣサブプログラム（チャイルドＦＣプログラム）を読み出すことができます。ＳＦＣと異なり、親ＦＣプログラムはＦＣサブプログラムが実行中は処理がサスペンドされています。ＦＣプログラムでは親プログラムとＦＣサブプログラムが同時に実行することはできません。


サブプログラム

サブプログラムは親プログラムから起動されます。ただし、このとき親プログラムの実行はサブプログラムが終了するまではサスペンドされることになります。

どのセクションのプログラムも一つ以上のサブプログラムを持つことができます。サブプログラムは一人の親プログラムによって所有されます。サブプログラムはローカル変数やローカル定義を持つことができます。ＳＦＣ、ＦＣ以外のプログラムはサブプログラムとして記述することができます。 "ファンクション" セクションのプログラムはプロジェクト内の他のプログラムから呼び出されるサブプログラムとして使われます。"ファンクション" セクションのプログラムは同じセクションの他のプログラムを呼び出すことができます。

注意: ＩＳａＧＲＡＦはリカーシブな処理をサポートしていません。もし、 "ファンクション" セクションのプログラムが自分自身や自分のサブプログラムから呼び出されるような場合はランタイムエラーが発生します。

サブプログラムのインタフェースはタイプとユニークな名前をもった入出力パラメータをもって明確に定義されなければなりません。ＳＴ言語のルールに基づいて出力パラメータ名はサブプログラムと同じ名前である必要があります。

以下に、サブプログラム本体に出力パラメータを設定する方法を言語毎にまとめます。

ST:	出力パラメータはサブプログラム名と同じにします。

(the same name as the sub-program):

   subprog_name := <expression>;

IL:	シーケンスの最後での現在結果の値（ILﾚｼﾞｽﾀ）が

出力パラメータにセットします。

   LD      10

   ADD   20   (* return parameter value = 30 *)

FBD:	出力パラメータとサブプログラム名を同じにします。

subprog_name

LD:	出力パラメータとサブプログラム名を同じにします。

subprog_name


ファンクションブロック

ファンクションブロックはＬＤ、ＦＢＤ、ＳＴ、ＩＬ言語で記述ができます。ファンクションブロックにはインスタンスが作られます。即ち、個々のファンクションブロックインスタンスはローカルなスタティックデータを持ちます。ファンクションブロックを読み出す場合は、実際はファンクションブロックのインスタンスを読み出すことになります。インスタンスの変数に保存される値はサイクル毎に保存されます。

注意：ＩＥＣ言語でかかれたファンクションブロックは別のファンクションブロックを読み出すことはできません。以下に、ＩＥＣ言語によるファンクションブロックから読み出すことができないファンクションブロックを示します。

SR, RS, R_Trig, F_Trig, SEMA, CTU, CTD, CTUD, TON, TOF, TP, CMP, StackInt, AVERAGE, HYSTER, LIM_ALRM, INTEGRAL, DERIVATE, BLINK, SIG_GEN

同様に、立ち上がり接点、立ち下がり接点、セットコイル、リセットコイルも使えません。

又、ファンクションブロック内でTSTART、TSTOPファンクションは3.20以降では扱えます。

ファンクションブロックの中でのループを作成する場合は、ループの前にローカル変数を定義する必要があります。以下に例を示します。

間違ったループ記述	正しいループ記述


言語の説明

プログラムは以下のグラフィック、文字型の言語で記述されます。

  シーケンシャル ファンクション チャート（ＳＦＣ）；高級レベルプログラミング

  フローチャート（ＦＣ）；高級レベルプログラミング

  ファンクション ブロック ダイアグラム（ＦＢＤ）；サイクリックオペレーション

  ラダー ダイアグラム（ＬＤ）；ブール型オペレーション

  構造化テキスト（ＳＴ）；サイクリックオペレーション

  命令リスト（ＩＬ）；ローレベルオペレーション

ＦＢＤとＬＤプログラムはミックスしてプログラムできることを除けば、通常は一つのプログラムは一つの言語で記述されます。　使用されるプログラム言語はプログラムを作成するときに決定します。


実行ルール

ＩＳａＧＲＡＦは同期型システムです。全処理は基本クロックによって起動されます。　このクロックの周期はここではサイクルタイムと呼ばれます。（ＰＬＣではスキャンタイムと呼ばれる場合もありますが、ＩＳａＧＲＡＦではスキャンに使用しないＦｒｅｅな時間を含めた期間を指します。）

ターゲットのサイクルタイムの間での基本的な処理は以下のようになります。

このシステムは以下のことを可能になります。

サイクルタイム中は入力変数は同じ値であることが保証されます。

出力変数はサイクルタイム中は１回のみ更新されます。

異なるプログラムからグローバル変数を安全に扱うことができます。

アプリケーション全体の応答時間を予測あるいは制御できます。


 共通オブジェクト

ここではＩＳａＧＲＡＦのプログラミングデータベースの共通オブジェクトに関して解説します。　この共通オブジェクトはSFC, FC, FBD, LD, ST あるいは IL 言語のいづれでも使われます。

基本タイプ

定数表現

変数

コメント

定義ワード


基本タイプ

プログラムで使われる定数、変数には以下の基本のタイプがあります。グラフィックなプログラミングでも言語ベースのプログラミングでもこのタイプは同じように扱われます。

  ブール型(BOOLEAN):	True（真）, Flase（偽）を持つブール値

  整数・実数型(INTEGER,REAL):	整数又は実数（浮動小数値）のｱﾅﾛｸﾞ値

  タイマ型(TIMER):	タイマ型値

  可変長文字列型(MESSAGE):	文字列

注意: 	タイマ型値は最大が１日の長さであり、日時を保存するためには使えません。


定数表現

定数は一つのタイプしか持つことができません。異なるタイプで同じ表現の定数は定義できません。

ブール型定数

整数型定数

実数型定数

タイマ型定数

可変長文字列型定数


ブール型定数

ブール型定数には以下の２つがあります。

 TRUE    	整数値の１に等しい

 FALSE	整数値の０に等しい

"True" と "False" はキーワードに登録されていて大文字、小文字の区別はありません。


整数型定数

整数型定数値は符号付きの３２ｂｉｔ値で -2147483647から +2147483647の値を持ちます。以下の表記方法で表現されます。プレフィックスによってベースを決めています。

ベース	ﾌﾟﾚﾌｨｯｸｽ	例
DECIMAL	(none)	-908
HEXADECIMAL	"16#"	16#1A2B3C4D
OCTAL	"8#"	8#1756402
BINARY	"2#"	2#1101_0001_0101_1101

BINARY表現で使われているアンダースコア('_')は区切りの目的であり、意味はありません。２進数を読みやすくするためのものです。


実数型定数

実数型定数表現は１０進数、及び、浮動小数点表示されます。整数型値との違いを表現するために小数点('.')を使います。浮動小数点表現はＥあるいはＦを使ってｴｷｽﾎﾟﾈﾝﾄ部分を表現します。ｴｷｽﾎﾟﾈﾝﾄ部は-37 から +37の値を取ります。以下に実数型定数表現例を示します。

3.14159	-1.0E+12

+1.0	1.0F-15

-789.56	+1.0E-37

"123"は実数型定数にはなりません。正しい表現方法は "123.0"となります。


タイマ型定数

タイマ型定数値は０秒から２３時間５９分５９秒９９９ミリ秒（23h59m59s999ms）まで定義できます。最小単位はｍｓです。

  Hour	"h" が時間の後に付きます。

  Minute	 	"m" が分の後に付きます。

  Second	"s"が秒の後に付きます。

  Millisecond	"ms"がミリ秒の後に付きます。

タイマ型定数を表記する際には必ず、"T#" あるいは "TIME#" のﾌﾟﾚﾌｨｯｸｽをつける必要があります。大文字、小文字の区別はありません。

T#1H450MS	1 hour, 450 milliseconds

time#1H3M	1 hour, 3 minutes

例えば"0"はタイマ型定数でなく、単なる整数型定数値となります。


可変長文字列型定数

文字列あるいは可変長文字列型定数は必ず‘　　’（これらは全て半角文字）で囲まれる必要があります。ＳＴプログラムなどで使われるときに従う必要があります。例えば、

これは可変長文字列です。'

注意: 	アポストロフィ（‘）は可変長文字列型定数の中に含めることはできません。可変長文字列型定数はソースコード内に一行に収まっていなければなりません。最大２５５半角文字（スペースも含む）長さです。

空の可変長文字列型定数は２つのアポストロフィ（‘’）で表現されます。タブやスペースは含めません。

''   (* 空の可変長文字列型定数 *)

印刷不可能な文字を表現する場合に ('$')シンボルを使います。以下にいくつかの例を示します。

文字表現	意味	Ascii (hexa)	例
$$	'$' character	16#24	'I paid $$5 for this'
$'	ｱﾎﾟｽﾄﾛﾌｨ	16#27	'Enter $'Y$' for YES'
$L	ﾗｲﾝﾌｨｰﾄﾞ	16#0a	'next $L line'
$R	ｷｬﾘｯｼﾞﾘﾀｰﾝ	16#0d	'   llo $R He'
$N	新しい行	16#0d0a	'This is a line$N'
$P	新しいﾍﾟｰｼﾞ	16#0c	'lastline $P first line'
$T	タブ	16#09	'name$Tsize$Tdate'
$hh   (*)	任意の文字	16#hh	'ABCD = $41$42$43$44'

(*) "hh" は表現したい文字の１６進数アスキーコードを示します。


#変数
変数

変数はローカルとグローバルの区別があります。ローカルは編集中のプログラムのみから参照可能です。　グローバルは同一プロジェクトのどのプログラムからでも参照可能です。

リザーブキーワード

直接表現変数（Directly Represented Variables）

ブール型変数

整数型変数

タイマ型変数

可変長文字列型変数

変数名は以下のルールに従う必要があります。

  最大１６半角文字

  最初の文字はレター（ａ－ｚ）

  以降の文字はレター、数字、＿　のいずれか


リザーブキーワード

予約語としては以下のものがあります。これらの予約語はプログラム、変数名、Ｃ言語ファンクション、Ｃ言語ファンクションブロックなどの名前には使えません。

A	ANA, ABS, ACOS, ADD, ANA, AND, AND_MASK, ANDN, ARRAY, ASIN, AT, ATAN,

B	BCD_TO_BOOL, BCD_TO_INT, BCD_TO_REAL, BCD_TO_STRING, BCD_TO_TIME, BOO, BOOL, BOOL_TO_BCD, BOOL_TO_INT, BOOL_TO_REAL, BOOL_TO_STRING, BOOL_TO_TIME, BY, BYTE,

C	CAL, CALC, CALCN, CALN, CALNC, CASE, CONCAT, CONSTANT, COS,

D	DATE, DATE_AND_TIME, DELETE, DINT, DIV, DO, DT, DWORD,

E	ELSE, ELSIF, EN, END_CASE, END_FOR, END_FUNCTION, END_IF, END_PROGRAM, END_REPEAT, END_RESSOURCE, END_STRUCT, END_TYPE, END_VAR, END_WHILE, ENO, EQ, EXIT, EXP, EXPT,

F	FALSE, FEDGE, FIND, FOR, FUNCTION,

G	GE, GFREEZE, GKILL, GRST, GSTART, GSTATUS, GT,

I	IF, INSERT, INT, INT_TO_BCD, INT_TO_BOOL, INT_TO_REAL, INT_TO_STRING, INT_TO_TIME,

J	JMP, JMPC, JMPCN, JMPN, JMPNC,

L	LD, LDN, LE, LEFT, LEN, LIMIT, LINT, LN, LOG, LREAL, LT, LWORD,

M	MAX, MID, MIN, MOD, MOVE, MSG, MUL, MUX,

N	NE, NOT,

O	OF, ON, OPERATE, OR, OR_MASK, ORN,

P	PROGRAM

R	R, REDGE, READ_ONLY, READ_WRITE, REAL, REAL_TO_BCD, REAL_TO_BOOL, REAL_TO_INT, REAL_TO_STRING, REAL_TO_TIME, REDGE, REPEAT, REPLACE, RESSOURCE, RET, RETAIN, RETC, RETCN, RETN, RETNC, RETURN, RIGHT, ROL, ROR,

S	S, SEL, SHL, SHR, SIN, SINT, SQRT, ST, STN, STRING, STRING_TO_BCD, STRING_TO_BOOL, STRING_TO_INT, STRING_TO_REAL, STRING_TO_TIME, STRUCT, SUB, SYS_ERR_READ, SYS_ERR_TEST, SYS_INITALL, SYS_INITANA, SYS_INITBOO, SYS_INITTMR, SYS_RESTALL, SYS_RESTANA, SYS_RESTBOO, SYS_RESTTMR, SYS_SAVALL, SYS_SAVANA, SYS_SAVBOO, SYS_SAVTMR, SYS_TALLOWED, SYS_TCURRENT, SYS_TMAXIMUM, SYS_TOVERFLOW, SYS_TRESET, SYS_TWRITE, SYSTEM,

T	TAN, TASK, THEN, TIME, TIME_OF_DAY, TIME_TO_BCD, TIME_TO_BOOL, TIME_TO_INT, TIME_TO_REAL, TIME_TO_STRING, TMR, TO, TOD, TRUE, TSTART, TSTOP, TYPE,

U	UDINT, UINT, ULINT, UNTIL, USINT,

V	VAR, VAR_ACCESS, VAR_EXTERNAL, VAR_GLOBAL, VAR_IN_OUT, VAR_INPUT, ,VAR_OUTPUT,

W	WHILE, WITH, WORD,

X 	XOR, XOR_MASK, XORN

アンダースコア ('_')で始まるキーワードは内部キーワードなのでインストラクションには使うことができません。


直接表現変数（Directly Represented Variables）

Ｉ／Ｏ変数が接続されていないＩ／Ｏチャネルはフリーチャネルと呼ばれます。ISaGRAFの直接表現変数はこのフリーチャネルをプログラムのソースコードの中で直接扱うことができます。直接表現変数の識別子として必ず%キャラクタで始まる変数名となります。

以下に、シングルＩ／Ｏボードに対する直接表現変数の名前の付け方について示します。ここで、  "s" はボードのスロット番号を示します。 "c" はＩ／Ｏチャネル番号を示します。

%IXs.c	ブール型入力ボードのフリーチャネル

%IDs.c	整数型入力ボードのフリーチャネル

%ISs.c	可変長文字列型入力ボードのフリーチャネル

%QXs.c	ブール型出力ボードのフリーチャネル

%QDs.c	整数型出力ボードのフリーチャネル

%QSs.c	可変長文字列型出力ボードのフリーチャネル

以下に、複数のＩ／Ｏボードから成り立っているＩ／Ｏ装置機器に対する直接表現変数の名前の付け方について示します。ここで、  "s" はボードのスロット番号を示します。 "b" はＩ／Ｏ装置機器の中でのシングルボードのインデックス番号を示します。 "c" はＩ／Ｏチャネル番号を示します。

%IXs.b.c	ブール型入力ボードのフリーチャネル

%IDs.b.c	整数型入力ボードのフリーチャネル

%ISs.b.c	可変長文字列型入力ボードのフリーチャネル

%QXs.b.c	ブール型出力ボードのフリーチャネル

%QDs.b.c	整数型出力ボードのフリーチャネル

%QSs.b.c	可変長文字列型出力ボードのフリーチャネル

以下にこれらの例を示します。

%QX1.6	ボードスロット番号１、Ｉ／Ｏチャネル番号６のブール型出力カード

%ID2.1.7	ボードスロット番号２のＩ／Ｏ装置機器で、ボード番号が１、Ｉ／Ｏチャネル番号７の整数型入力ボード

直接表現変数は実データタイプを持つことはできません。


ブール型変数

Boolean means logic. 論理（ﾌﾞｰﾘｱﾝ）値変数はＴＲＵＥ、ＦＡＬＳＥのいづれかのブール型値を持つことができます。ブール型変数は以下の属性を持つことができます。

内部:	プログラムによって更新されるメモリ上の変数

入力:	入力デバイスと接続される変数（システムでリフレッシュ）

出力:	出力デバイスと接続される変数

注意: 	ブール型変数を宣言するときはＴＲＵＥ、ＦＡＬＳＥの文字列を別の文字列で置き換えることが可能です。ただし、この置き換えられる文字列はプログラムでは扱えません。定義ワードで宣言されている場合は例外的に扱うことができます。


整数型変数

Analog means continuous. 整数型変数には整数と実数の２タイプが存在する。それぞれのフォーマットを以下に示します。

整数	32 bit 符号付き整数　-2147483647 から +2147483647

実数	IEEE 32 bit 浮動小数値（単精度）

1 符号ビット + 23 有効数字部ビット + 8 ｴｷｽﾎﾟﾈﾝﾄ部ビット

　（実数のｴｷｽﾎﾟﾈﾝﾄ部は -37 ～ +37　の間になります。）

REAL analog exponent value cannot be less than -37 or greater than +37. 以下の属性を持ちます。

内部:	プログラムによって更新されるメモリ上の変数

入力:	入力デバイスと接続される変数（システムでリフレッシュ）

出力:	出力デバイスと接続される変数

注意: 	実数型変数が外部のＩ／Ｏデバイスに接続される場合は、Ｉ／Ｏドライバは整数型変数として扱います。

注意: 	整数型と実数型値は同一の整数型演算式でミックスさせて使用できません。


タイマ型変数

タイマ型変数はタイマやカウンタに使われます。タイマ型変数は３２ｂｉｔを使用します。タイマ型変数は正数で最大２３時間５９分５９秒９９９ｍｓまで定義可能です。

注意: 	タイマ型変数の属性は内部のみで、入力、出力属性を指定することはできません。

タイマの値はＩＳａＧＲＡＦによって自動的に更新されます。タイマがアクティブの時はターゲットのリアルタイムクロックから読み出された信号で自動的に更新されています。ＳＴプログラムでは以下のステートメントが使用されます。

TSTART	タイマの自動リフレッシュを起動

TSTOP	タイマの自動リフレッシュを停止


可変長文字列型変数

可変長文字列型あるいは文字列変数は文字列を含んでいます。文字列変数の長さは可変長です。ただし、可変長文字列型変数を辞書エディタで宣言した際の最大長を越えることはできません。最大でも２５５半角文字までとなります。　可変長文字列型変数は以下の属性を持つことができます。

内部:	プログラムによって更新されるメモリ上の変数

入力:	入力デバイスと接続される変数（システムでリフレッシュ）

出力:	出力デバイスと接続される変数

可変長文字列型変数はアスキーコードの０～２５５までのいずれのコードを含むことができます。ＮＵＬＬ（０）キャラクタも文字列に含むことも可能です。ただし、ＣファンクションによってはＮｕｌｌを含む文字列を処理できない場合もあります。


コメント

ＳＴプログラム、ＩＬプログラムではコメントを挿入することができます。 "(*"ではじまり、 "*)"で終了する必要があります。　ＳＴプログラムのどこにでもコメントを挿入可能です。また、複数行にわたるコメントも可能です。以下に例を示します。

counter := ivalue;   (* assigns the main counter *)

(* ２行にまたがる

　　　　　コメント行　 *)

c := counter (* コメントはどこにでも挿入可能です *) + base_value + 1;

コメント内部には "(*"文字は含むことができません。

注意: 	ＩＬプログラムではコメントの挿入場所はインストラクションの最後に限られています。


定義ワード

ＩＳａＧＲＡＦでは定数表現、ブール型変数のＴＲＵＥ、ＦＡＬＳＥ表現、キーワード、ＳＴで使われる複雑な表現などを別名で再定義することができます。定義ワードによりこの置き換えを可能にします。例えば、

定義ワード	定義内容

YES	TRUE

PI	3.14159

OK	(auto_mode AND NOT (alarm))

ＹＥＳ、ＰＩ、ＯＫは例えばＳＴプログラムのどこでも扱えて複雑な表現を置き換えることができます。以下にＳＴプログラムに定義ワード（識別子）を用いた例を示します。

If OK Then

   angle := PI / 2;

   isdone := YES;

End_if;

定義ワードはそのプログラム内からのみ参照できるローカル定義、同一プロジェクト内のどのプログラムからでも参照可能なグローバル定義、どのプロジェクトのどのプログラムからでも参照可能な共通定義に分かれます。カマンはアーカイブマネージャで独自に保存できます。

注意: 	もし、同一の定義ワードに対して２回以上定義がなされた場合は最後に書かれた定義が使われます。例えば、

定義付け:	（定義ワード）	（定義内容）

　OPEN	　FALSE

　OPEN	　TRUE

と２回定義すると、結局

意味:	　OPEN	　TRUE

定義ワード名は以下のルールに従う必要があります。

  最大１６半角文字

  最初の文字はレター（ａ－ｚ）

  以降の文字はレター、数字、＿　のいずれか

注意: 	定義内で定義ﾜｰﾄﾞは使用できません。例えば、以下の例は無効です。

PI	is	3.14159

PI2 	is	PI*2 	：無効

PI2 	is	6.28318


 ＩＬ言語

命令リスト（ＩＬ）はローレベルの言語です。小さなアプリケーションやアプリケーションの特定部分の最適化に適しています。インストラクションは常に現在結果 （即ち、ＩＬレジスタ ）に関連しています。オペレーションは現状の値とオペランドとの間で必ず行なわれます。その結果は再び現在結果にストアされます。

ＩＬメイン文法

ＩＬ命令


ＩＬメイン文法

ＩＬプログラムはインストラクションのリストでもあります。各々のインストラクションは新しいラインに書かれ、オペレータ（命令）  と修飾子（修飾子）、さらに必要に応じて一つ以上のオペランド から成り立っています。これらの要素はカンマ（，）で区切られています。ラベル ：をインストラクション前に置くこともできます。もし、コメントを記入する場合はラインの最後に追加できます。ただし、(*   で始まり *)で終わる必要があります。空白ラインも認められていて、ここにコメントを記入することもできます。

ラベル

命令修飾子

遅延操作

以下に、インストラクションのサンプルを示します。

ラベル	ｵﾍﾟﾚｰﾀ（命令）	オペランド	コメント

Start:	LD	IX1	(* 押しボタン *)

ANDN	MX5	(* 禁止されていない場合は *)

ST	QX2	(* モータスタート *)


ラベル

ラベル 名の後にはコロン（：）がつきます。インストラクションはこのラベルの後から書かれます。ラベルは空白行に書かれます。ラベル名は他のインストラクションの中でジャンプ先としてオペランドで使われることがあります。ラベル名は以下のルールに従う必要があります。

  名前は１６文字以内

  最初の文字はレター（ａ－ｚ）

  それ以降はレター、数字、'_'

同じラベル名は同一のＩＬプログラムの中では使うことができません。ただし、変数名と同一のラベル名を定義することはできます。


命令修飾子

扱える命令修飾子 を以下に示します。修飾子文字は命令を完全な形にします。修飾子間でスペースは含まれてはなりません。

N	オペランドの反転

(	遅延操作

C	条件操作

'N' 修飾子 はブールオペランドの反転を意味します。

例えば、

ORN IX12 はＳＴでは以下のようになります。

result := result OR NOT (IX12)

'(' 修飾子 は ')' が見つかるまで括弧で囲まれたインストラクションの実行は先送りされます。

'C' 修飾子 は以下のインストラクションは現在結果がＴＲＵＥ（ブール型変数以外の場合は０以外の値）の時のみ実行されるようにする条件です。'C' 修飾子 は　'N' 修飾子と合わせて使うこともできます。この場合は現在結果がＦＡＬＳＥ（ブール型変数以外の場合は０）の時のみ以下のインストラクションが実行されます。


遅延操作

１つのＩＬレジスタ （即ち、現在結果）しか無いために、ある処理は遅延操作（先送り） される必要があります。インストラクションの実行順序が変更されることになります。

'('	修飾子	処理の先送りを意味します。
')'	命令	先送りされていた処理を実行します。
'(' 修飾子 は ')' が見つかるまで括弧で囲まれたインストラクションの実行は先送りされます。

例えば、

AND(	IX12

OR	IX35

)

は以下のように解釈されます。

result := result AND ( IX12 OR IX35 )


ＩＬ命令

  以下のテーブルはＩＬ言語の標準命令をまとめたものです。

命令	修飾子	オペランド	説明
LD	N	変数、定数	ロード
ST	N	変数	現在結果のストア
S R		ブール型変数	TRUEにセット FALSEにリセット
AND & OR XOR	N   ( N   ( N   ( N   (	ブール型	ブール型 AND ブール型 AND ブール型 OR 排他的 OR
ADD SUB MUL DIV	( ( ( (	変数、定数	加算 減算 乗算 除算
GT GE EQ LE LT	( ( ( ( (	変数、定数	Test: > Test: >= Test: = Test <= Test <
JMP RET	C   N C   N	ラベル	ラベルへのジャンプ ｻﾌﾞﾌﾟﾛｸﾞﾗﾑからﾘﾀｰﾝ
)			遅延（先送り）処理実行

以下に、ＩＬ固有の命令のみを示します。その他の標準的な命令は「標準命令、ファンクションブロック、ファンクション」で解説します。


LD 命令

オペレーション：	現在結果に値をロードします。

扱える修飾子：	N

オペランド：	定数あるいは、

内部、入力、出力変数

例：

(*  LD命令の例 *)

LDex:	LD	false	(* result := FALSE boolean constant *)

LD	true	(* result := TRUE boolean constant *)

LD	123	(* result := integer constant *)

LD	123.1	(* result := real constant *)

LD	t#3ms	(* result := time constant *)

LD	boo_var1	(* result := boolean variable *)

LD	ana_var1	(* result := analog variable *)

LD	tmr_var1	(* result := timer variable *)

LDN	boo_var2	(* result := NOT ( boolean variable ) *)


ST 命令

オペレーション：	現在結果を変数にストアします。現在結果はこの操作で変化しません。

扱える修飾子：	N

オペランド：	内部、出力変数

例：

(*  ST命令の例 *)

STboo:	LD	false

ST	boo_var1	(* boo_var1 := FALSE *)

STN	boo_var2	(* boo_var2 := TRUE *)

STana:	LD	123

ST	ana_var1	(* ana_var1 := 123 *)

STtmr:	LD	t#12s

ST	tmr_var1	(* tmr_var1 := t#12s *)


S 命令

オペレーション：	 現在結果がＴＵＲＥの時にブール型変数にＴＲＵＥをストアします。もし、現在結果がＦＡＬＳＥの時は何の処理も行ないません。この操作によって現在結果は変化しません。

扱える修飾子：	(none)

オペランド：	出力、入力のブール型変数

例：

(*  S命令の例 *)

SETex:	LD	true	(* current result := TRUE *)

S	boo_var1	(* boo_var1 := TRUE *)

(* current result is not modified *)

LD	false	(* current result := FALSE *)

S	boo_var1	(* nothing done - boo_var1 unchanged *)


R 命令

オペレーション：	現在結果がＴＵＲＥの時にブール型変数にＦＡＬＳＥをストアします。もし、現在結果がＦＡＬＳＥの時は何の処理も行ないません。この操作によって現在結果は変化しません。

扱える修飾子：	(none)

オペランド：	出力、内部のブール型変数

例：

(*  R命令の例 *)

RESETex:	LD	true	(* current result := TRUE *)

R	boo_var1	(* boo_var1 := FALSE *)

(* current result is not modified *)

ST	boo_var2	(* boo_var2 := TRUE *)

LD	false	(* current result := FALSE *)

R	boo_var1	(* nothing done - boo_var1 unchanged *)


JMP 命令

オペレーション：	特定ラベルへジャンプ

扱える修飾子：	C   N

オペランド：	同一のＩＬプログラムで定義されたラベル

例：

(* 以下の例はアナログセレクタの値をテストします。 (0 or 1 or 2) 	*)

(* ３つの出力ブール型に１をセット。セレクタの内容が０の時ジャンプします　*)

JMPex:	LD	selector	(* selector is 0 or 1 or 2 *)

BOO	(* conversion to boolean *)

JMPC	test1	(* if selector = 0 then *)

LD	true

ST	bo0	(* bo0 := true *)

JMP	JMPend	(* end of the program *)

test1:	LD 	selector

SUB	1	(* decrease selector:  is now 0 or 1 *)

BOO	(* conversion to boolean *)

JMPC	test2	(* if selector = 0 then *)

LD	true

ST	bo1	(* bo1 := true *)

JMP	JMPend	(* end of the program *)

test2:	LD	true	(* last possibility *)

ST	bo2	(* bo2 := true *)

JMPend:	(* end of the IL program *)


RET 命令

オペレーション：	現命令リストを終了します。もし、ＩＬシーケンスがサブプログラムのときはＩＬレジスタ（現在結果）が親プログラムに戻り値として戻されます。

扱える修飾子：	C   N

オペランド：	(none)

例：

(* 以下の例はアナログセレクタの値をテストします。 (0 or 1 or 2) 	*)

(* ３つの出力ブール型に１をセット。セレクタの内容が０の時ジャンプします　*)

JMPex:	LD	selector	(* selector is 0 or 1 or 2 *)

BOO	(* conversion to boolean *)

JMPC	test1	(* if selector = 0 then *)

LD	true

ST	bo0	(* bo0 := true *)

RET	(* end - return 0 *)

(* decrease selector *)

test1:	LD 	selector

SUB	1	(* selector is now 0 or 1 *)

BOO	(* conversion to boolean *)

JMPC	test2	(* if selector = 0 then *)

LD	true

ST	bo1	(* bo1 := true *)

LD	1	(* load real selector value *)

RET	(* end - return 1 *)

(* last possibility *)

test2:	RETNC	(* returns if the selector has *)

(* an invalid value *)

LD	true

ST	bo2	(* bo2 := true *)

LD	2	(* load real selector value *)

 	(* end - return 2 *)


")" 命令

オペレーション：	 遅延（先送り）されていた処理を実行します。先送りされていた処理は '('　で始まっています。

扱える修飾子：	(none)

オペランド：	(none)

例：

(* 遅延操作を含む例　　　　　　　　　 *)

(* res := a1 + (a2 * (a3 - a4) * a5) + a6; 　*)

Delayed:	LD	a1	(* result := a1; *)

ADD(	a2	(* delayed ADD - result := a2; *)

MUL(	a3	(* delayed MUL - result := a3; *)

SUB	a4	(* result := a3 - a4; *)

)	(* execute delayed MUL - result := a2 * (a3-a4); *)

MUL	a5	(* result := a2 * (a3 - a4) * a5; *)

)	(* execure delayed ADD *)

(* result := a1 + (a2 * (a3 - a4) * a5); *)

ADD	a6	(* result := a1 + (a2 * (a3 - a4) * a5) + a6; *)

ST	res	(* store current result in variable res *)


サブプログラムやファンクションのコール

ＩＬ、ＳＴ、ＬＤ、ＦＢＤで書かれたサブプログラムやファンクションはＩＬから呼び出すことができます。サブプログラム名を命令として割り付けます。

オペレーション：	サブプログラムやファンクションを実行します。 サブプログラムからの戻り値はＩＬレジスタ（現在結果）にストアされます。

扱える修飾子：	(none)

オペランド：	最初のパラメータはＩＬレジスタにストアされます。以下のパラメータはコンマで区切られてオペランドフィールドに書かれます。

例：

(* コールプログラム: アナログ値をタイム値に変換 *)

Main:	LD	bi0

SUBPRO	bi1,bi2	(* call sub-program to get analog value *)

ST	result	(* result := value returned by sub-program *)

GT	vmax	(* test value overflow *)

RETC	(* return if overflow *)

LD	result

MUL	1000	(* converts seconds in milliseconds *)

TMR	(* converts to a timer *)

ST	tmval	(* stores converted value in a timer *)

(* 読み出されるサブプログラム 'SUBPRO' : ｱﾅﾛｸﾞ値の評価 *)

(* ３つのバイナリブール: in0, in1, in2がサブプログラムの入力パラメータ *)

LD	in2

ANA	(* result = ana (in2); *)

MUL	2	(* result := 2*ana (in2); *)

ST	temporary	(* temporary := result *)

LD	in1

ANA

ADD 	temporary	(* result := 2*ana (in2) + ana (in1); *)

MUL	2	(* result := 4*ana (in2) + 2*ana (in1); *)

ST	temporary	(* temporary := result *)

LD	in0

ANA

ADD	temporary	(* result := 4*ana (in2) + 2*ana (in1)+ana (in0); *)

ST	SUBPRO	(* return current result to calling program *)


ファンクションブロックのコール: CAL命令

オペレーション： 	ファンクションブロックの呼び出し

扱える修飾子：	C   N

オペランド：	ファンクションブロックインスタンス名

ファンクションブロックの入力パラメータはコールされる前にLD/ST命令でアサインしておく必要があります。

例１：

(*  SRのコール : SR1はSRのインスタンス *)

LD	auto_mode

AND	start_cmd

ST	SR1.set1

LD	stop_cmd

ST	SR1.reset

CAL	SR1

LD	SR1.Q1

ST	command

(* 等価なFBD言語 *)

例２：

(*R_TRIG1は R_TRIGブロックのインスタンスで、

　　　　　CTU1は CTUブロックのインスタンス*)

LD	command

ST	R_TRIG1.clk

CAL	R_TRIG1

LD	R_TRIG1.Q

ST	CTU1.cu

LDN	auto_mode

ST	CTU1.reset

LD	100

ST	CTU1.pv

CAL	CTU1

LD	CTU1.Q

ST	overflow

LD	CTU1.cv

ST	result

(* 等価なFBD言語 *)


 構造化テキスト（ＳＴ）言語

構造化テキスト（ＳＴ）はハイレベルの構造化言語です。この言語は主にグラフィック言語で十分に表現しにくい手続きを表わすのに適用されます。ＳＴはＳＦＣ言語のトランジションやステップ内のアクションの記述のディフォルト言語です。

ＳＴメイン文法

表現法と括弧

ファンクションとファンクションブロックコール

ＳＴ特殊ブール命令

ＳＴ基本ステートメント

ＳＴ拡張


ＳＴメイン文法

ＳＴプログラムはＳＴステートメントのリストです。各々のステートメントの最後にはセミコロン（；）セパレータが必要です。ソースコード中の変数はinactiveセパレータ（スペース、タブなど）やactiveセパレータ（：＝、＜、＞など）で区切られています。コメントは(*,    *)で囲まれます。

基本のＳＴステートメントは以下のものがあります。

  ステートメントアサイン (variable := expression;)

  サブプログラム、ファンクションコール

  Ｃ言語ファンクションブロックコール

  選択ステートメント　(IF, THEN, ELSE, CASE...)

  繰り返しステートメント (FOR, WHILE, REPEAT...)

  コントロールステートメント (RETURN, EXIT...)

  ＳＦＣ等の他の言語とのリンク用の特殊ステートメント

InactiveセパレータはActiveセパレータ、定数、識別子の間であれば自由に挿入できます。Inactiveセパレータはスペース、タブ、End of Lineキャラクタです。以下のルールを守ってInactiveセパレータを使用することで読みやすいＳＴプログラムを作ることができます。

 一行に一つ以上のステートメントは書くことはできません。

 複雑なステートメントはタブキーを使ってインデントします。

 コメントをできる限り挿入します。

ソースコードの読み安さ - 例：

Low readability	High readability
imax := max_ite; cond := X12; if not(cond (* alarm *) then return; end_if; for i (* index *) := 1 to max_ite do if i <> 2 then Spcall(); end_if; end_for; (* no effect if alarm *)	(* imax : number of iterations *) (* i: FOR statement index *) (* cond: process validity *) imax := max_ite; cond := X12; if not (cond) then     return; end_if; (* process loop *) for i := 1 to max_ite do     if i <> 2 then         Spcall ();     end_if; end_for;


表現法と括弧

ＳＴ表現はＳＴ操作子と変数、定数を組み合わせて行ないます。一つの表現に対してオペランドのタイプは同じである必要があります。これらを組み合わせてより複雑な表現の記述を行ないます。例えば、

(boo_var1 AND boo_var2)	論理型

not (boo_var1)	論理型

(sin (3.14) + 0.72)	実数型

(t#1s23 + 1.78)	不正な表現！

括弧表現は全体の表現の中でのある部分を独立させるもので、操作の優先順位を高くします。括弧が存在しない表現では操作はＳＴ操作子間での暗黙の優先順位に従います。例えば、

2 + 3 * 6 	equals 2+18=20	乗算は加算よりも優先順位が高い。

(2+3) * 6	equals 5*6=30	括弧により優先順位を変更

注意：	一つのＳＴ表現内に最大８レベルまでの括弧が認められています。


ファンクションとファンクションブロックコール

標準的なＳＴによるファンクションコールで以下のファンクションを呼び出すことができます。

  サブプログラム

  ＩＥＣ言語で書かれたライブラリファンクション

  Ｃ言語ファンクション、Ｃ言語ファンクションブロック

  型変換関数

サブプログラムやファンクションの呼び出し

ファンクションブロックの呼び出し


サブプログラムやファンクションの呼び出し

名前:	サブプログラム名

またはＩＥＣやＣ言語で書かれたライブラリファンクション

意味:	ＳＴ，ＩＬ、ＬＤ、ＦＢＤで書かれたサブプログラム、ファンクションやＣ言語を呼び出し、戻り値を得る。

文法:	<variable> := <subprog> (<par1>, ... <parN> );

オペランド:	戻り値や引数のタイプはサブプログラムで定義されたパラメータ定義に従う必要があります。

戻り値:	サブプログラムからの戻り値

サブプログラムコールは各種の表現で呼び出されます。ＳＦＣプログラムのトランジション内部でも使われます。

例１： サブプログラムコール

(* Main ST program *)

(* サブプログラムから整数型値をもらってタイマ型値に変換 *)

ana_timeprog := SPlimit ( tprog_cmd );

appl_timer := tmr (ana_timeprog * 100);

(* 呼び出されるＦＢＤサブプログラム、名前は　'SPlimit'　 *)

例２： ファンクションコール

(* functions used in complex expressions: min, max, right, mlen and left are standard "C" functions *)

limited_value := min (16, max (0, input_value) );

rol_msg := right (message, mlen (message) - 1) + left (message, 1);


ファンクションブロックの呼び出し

名前:	ファンクションブロックインスタンス名

意味:	ＩＳａＧＲＡＦライブラリに登録されているファンクションブロックをコールして出力パラメータを使う。

文法:	(* call of the function block *)

<blockname> ( <p1>, <p2> ... );

(gets its return parameters *)

<result> := <blockname>. <ret_param1>;

...

<result> := <blockname>. <ret_paramN>;

オペランド:	パラメータのタイプはファンクションブロックで定義されているタイプに一致しなければなりません。

戻り値:	文法を参照

ファンクションの意味、パラメータの型、戻り値の型などはＩＳａＧＲＡＦライブラリに登録されているので参照。

ファンクションブロックインスタンスは必ず辞書に登録しておく必要があります。

例：

(* ファンクションブロックを読み出すＳＴプログラム例 *)

(* ブロックのインスタンスを辞書で宣言しておきます。 *)

(* trigb1 : block R_TRIG - 立ち上がり検出*)

(* ＳＴ言語からの読み出し *)

trigb1 (b1);

(* 出力パラメータへのアクセス *)

If (trigb1.Q) Then nb_edge := nb_edge + 1; End_if;


ＳＴ特殊ブール命令

次のブール命令はST言語特有です。

REDGE	立ち上がりエッジ検出

FEDGE	立ち下がりエッジ検出

他の基本ブール命令を以下に示します。

 NOT	論理反転

 AND (&)	AND（論理積）

 OR	OR（論理和）

 XOR	XOR（排他的論理和）


REDGE 命令

名前：	REDGE

意味：	ブール型変数の立ち上がり検出

文法：	<edge> := REDGE ( <boo_expression>,<memo_variable> );

オペランド：	<boo_expression>立ち上がり検出するブール型変数<memo_variable>直前の変数状態をストアするための内部変数

戻り値：	TRUE 　FALSE から TRUEへ変化したとき

FALSE　上記以外の場合

ＲＥＤＧＥ（）を使っての立ち上がり検出は一回の実行スキャン内に２回以上は検出されません。立ち上がり検出はＳＦＣのトランジション条件に使われる場合はあります。

注意：	<memo_variable>変数は変数直前の状態の保管のために使われるので、他の変数の立ち上がり検出などの目的には同時に使えません。通常、立ち上がり検出をしたい変数名が "xxx"　のとき、<memo_variable>としては　"EDGE_xxx" を使います。こうすることにより、他のREDGE操作によって上書きされたりされることはありません。

例：

(* ST program using REDGE operator *)

(* this program counts the rising edges of a boolean input *)

(* Bi120 is an input boolean variable *)

(* Edge_Bi120 is the memory of the Bi120 variable state *)

If REDGE (Bi120, Edge_Bi120) Then

Counter := Counter + 1;

End_if;

注意：	この命令はIEC1131-3に含まれていません。互換性のためには R_TRIG標準ブロックのご使用をお勧めします。


FEDGE 命令

名前：	FEDGE

意味：	ブール型変数の立ち下がり検出

文法：	<edge> := FEDGE ( <boo_expression>, <memo_variable> );

オペランド：	<boo_expression>立ち下がり検出するブール型変数<memo_variable>直前の変数状態をストアするための内部変数

戻り値：	TRUE 　TRUE から FALSEへ変化したとき

FALSE　上記以外の場合

ＦＥＤＧＥ（）を使っての立ち上がり検出は一回の実行スキャン内に２回以上は検出されません。立ち上がり検出はＳＦＣのトランジション条件に使われる場合はあります。

注意：	<memo_variable>変数は変数直前の状態の保管のために使われるので、他の変数の立ち上がり検出などの目的には同時に使えません。

通常、立ち上がり検出をしたい変数名が "xxx"　のとき、<memo_variable>としては　"EDGE_xxx" を使います。こうすることにより、他のFEDGE操作によって上書きされたりされることはありません。

例：

(* ST program using FEDGE operator *)

(* this program counts the falling edges of a boolean input *)

(* Bi120 is an input boolean variable *)

(* Edge_Bi120 is the memory of the Bi120 variable state *)

If FEDGE (Bi120, Edge_Bi120) Then

Counter := Counter + 1;

End_if;

注意：	この命令はIEC1131-3に含まれていません。換性のためには R_TRIG標準ブロックのご使用をお勧めします。


ＳＴ基本ステートメント

ＳＴ言語の基本ステートメントには以下のものがあります。

Assignment（アサイン）

RETURN ステートメント

IF-THEN-ELSIF-ELSE 構造

CASE ステートメント

WHILE 繰り返しステートメント

REPEAT 繰り返しステートメント

FOR 繰り返しステートメント

EXIT ステートメント


Assignment（アサイン）

名前：	:=

意味：	表現を変数にアサイン

文法：	<variable> := <any_expression> ;

オペランド：	変数は内部、あるいは出力変数の必要があります。

変数と表現のタイプが一致している必要があります。

<any_expression>はサブプログラムやＩＳａＧＲＡＦライブラリのＣ言語ファンクションコールでも構いません。

例：

(* アサインを使ったＳＴプログラム *)

(* variable <<= variable *)

bo23 := bo10;

(* variable <<= expression *)

bo56 := bx34 OR alrm100 & (level >= over_value);

result := (100 * input_value) / scale;

(* サブプログラムの戻り値をアサイン *)

rc := PSelect ( );

(* ファンクションコールをアサイン *)

limited_value := min (16, max (0, input_value) );


RETURN ステートメント

名前：	RETURN

意味：	現在実行のプログラムを終了する

文法：	RETURN ;

オペランド：	(none)

ＳＦＣのアクションブロックでは、 RETURN ステートメント はそのアクションブロックのみの終了を意味します。

例：

(* FBDプログラムカウンタ例*)

(* RETURNステートメントを使ったＳＴプログラム例 *)

If not (CU) then

Q := false;

CV := 0;

RETURN;   (* プログラムの終了 *)

end_if;

if R then

CV := 0;

else

if (CV < PV) then

CV := CV + 1;

end_if;

end_if;

Q := (CV >= PV);


IF-THEN-ELSE ステートメント

名前：	IF ... THEN ... ELSIF ... THEN ... ELSE ... END_IF

意味：	ＳＴステートメントをブール型表現の値によって

選択し実行します

文法：	IF <boolean_expression> THEN

   <ステートメント> ;

   <ステートメント> ;

   ...

ELSIF <boolean_expression> THEN

  <ステートメント> ;

   <ステートメント> ;

   ...

ELSE

   <ステートメント> ;

   <ステートメント> ;

   ...

END_IF;

ELSEやELSIF ステートメントはオプションです。もし、ELSE ステートメントが書かれていない場合は条件がFALSEの時は何も実行されません。

例：

(* IFステートメントを使ったＳＴプログラム *)

IF manual AND not (alarm) THEN

level := manual_level;

bx126 := bi12 OR bi45;

ELSIF over_mode THEN

level := max_level;

ELSE

level := (lv16 * 100) / scale;

END_IF;

(* IF structure without ELSE *)

If overflow THEN

alarm_level := true;

END_IF;


CASE ステートメント

名前：	CASE ... OF ... ELSE ... END_CASE

意味：	複数のＳＴステートメントの中から整数表現の

内容によってステートメントを選択し実行します

文法：	CASE <integer_expression> OF

   <value> : <statements> ;

   <value> , <value> : <statements> ;

   ...

ELSE

   <statements> ;

END_CASE;

Case の<value>値は必ず整数定数でなければなりません。複数の<value>をコンマで区切って並べている場合は同じステートメントを実行することを意味します。ELSEステートメントはオプションです。

例：

(* CASEステートメントを使ったＳＴプログラム *)

CASE error_code OF

255:	err_msg := 'Division by zero';

fatal_error := TRUE;

1:	err_msg := 'Overflow';

2, 3:	err_msg := 'Bad sign';

ELSE

err_msg := 'Unknown error';

END_CASE;


WHILE ステートメント

名前：	WHILE ... DO ... END_WHILE

意味：	ＳＴステートメントのグループの繰り返し

実行を行ないます。繰り返しの前に繰り返し

の条件の評価を行ないます

文法：	WHILE <boolean_expression> DO

   <statement> ;

   <statement> ;

   ...

END_WHILE ;

注意：	ＩＳａＧＲＡＦはサイクルタイムに同期するシステムなので、例えば入力変数はＷＨＩＬＥの繰り返し実行中には変化しません。即ち、定数や入力変数を直接、ＷＨＩＬＥ繰り返しの条件に使うことはできません。（無限ループができてしまいます。）

例：

(* WHILEステートメントを使ったＳＴプログラム *)

(* Ｃファンクションをシリアルポートからの文字の読み出しに使っています *)

string := ''; (* empty string *)

nbchar := 0;

WHILE ((nbchar < 16) & ComIsReady ( )) DO

string := string + ComGetChar ( );

nbchar := nbchar + 1;

END_WHILE;


REPEAT ステートメント

名前：	REPEAT ... UNTIL ... END_REPEAT

意味：	ＳＴステートメントのグループの繰り返し

実行を行ないます。繰り返しの後に繰り返し

の条件の評価を行ないます

文法：	REPEAT

   <ステートメント> ;

   <ステートメント> ;

  ...

UNTIL <boolean_condition>

END_REPEAT ;

注意：	ＩＳａＧＲＡＦはサイクルタイムに同期するシステムなので、例えば入力変数はＲＥＰＥＡＴの繰り返し実行中には変化しません。即ち、定数や入力変数を直接、ＲＥＰＥＡＴ繰り返しの条件に使うことはできません。（無限ループができてしまいます。）

例：

(* REPEATステートメントを使ったＳＴプログラム *)

(* Ｃファンクションをシリアルポートからの文字の読み出しに使っています *)

string := ''; (* empty string *)

nbchar := 0;

IF ComIsReady ( ) THEN

REPEAT

string := string + ComGetChar ( );

nbchar := nbchar + 1;

UNTIL ( (nbchar >= 16) OR NOT (ComIsReady ( )) )

END_REPEAT;

END_IF;


FOR ステートメント

名前：	FOR ... TO ... BY ... DO ... END_FOR

意味：	有限回数分の繰り返し操作を整数型変数を

インデックス扱いにより行なう

文法：	FOR <index> := <mini> TO <maxi> BY <step> DO

    <ステートメント> ;

    <ステートメント> ;

END_FOR;

オペランド：	index:	内部整数型変数で毎回増加

mini:	indexの初期値

maxi:	indexの最大値

step:	indexの毎回の増加幅

[ BY step ] ステートメントはオプションです。何も指定が無ければ、STEPは１です。

注意：	ＩＳａＧＲＡＦはサイクルタイムに同期するシステムなので、例えば入力変数はＦＯＲの繰り返し実行中には変化しません。

以下にFORステートメントと等価なWHILEステートメントを示します。

index := mini;

while (step <= maxi) do

   <statement> ;

   <statement> ;

   index := index + step;

end_while;

例：

(* FORステートメントを使ったＳＴプログラム *)

(* 文字列から数値キャラクタを取り出します *)

length := mlen (message);

target := ''; (* empty string *)

FOR index := 1 TO length BY 1 DO

code := ascii (message, index);

IF (code >= 48) & (code <= 57) THEN

target := target + char (code);

END_IF;

END_FOR;


EXIT ステートメント

名前:	EXIT

意味：	FOR, WHILE, REPEAT 繰り返しステートメント

からのEXIT

文法：	EXIT;

オペランド：	(none)

EXITは通常、IF ステートメント内で使われます。

例：

(* EXITステートメントを使ったＳＴプログラム *)

(* 文字列からキャラクタの検索を行います *)

length := mlen (message);

found := NO;

FOR index := 1 TO length BY 1 DO

code := ascii (message, index);

IF (code  = searched_char) THEN

found := YES;

EXIT;

END_IF;

END_FOR;


ＳＴ拡張

以下にＳＴ言語の拡張部分について説明します。

TSTART - TSTOP: タイマコントロール

以下のステートメントやファンクションはチャイルドＳＦＣプログラムをコントロールする際に使われます。 ACTION(): ... END_ACTION; ＳＦＣステップ内で使われます。

GSTART	ＳＦＣプログラムの起動

GKILL	ＳＦＣプログラムの停止

GFREEZE	ＳＦＣプログラムの凍結

GRST	凍結されたＳＦＣプログラムの再起動

GSTATUS	ＳＦＣプログラムの現在のステータス取得

注意：	このファンクションはIEC 1131-3には含まれていません。IEC1131-3に準拠で行う場合はGSTARTとGKILLの代わりに、次の文法で得ることができます。

child_name(S); (*GSTART(child_name);と等価 *)

child_name(R); (*GKILL(child_name);と等価 *)

更に、ＳＦＣのステップのステータスを確認するには以下の例があります。

GSnnn.x	ステップの活性／非活性状態をブール値で得る

GSnnn.t	ステップが活性状態になってからの経過時間を得る

("nnn" はＳＦＣステップのリファレンス番号です。)

別のＳＦＣプログラムのステップの活性状態は次の表現で得ることができます。

GSnnn(progname).x

注意：	別のプログラムの参照に対しては、この表現はIEC1131-3には含まれていません。IEC1131-3に準拠で行う場合はグローバル変数（ref_step_X）を設けて、これに参照したいステップ状態をアサインさせます。即ち、ステップの中でＮアクションクオリファイアを使ってアクションを記述します (ref_step_X(N);)。このような状況でステップの状態をテスト（参照）したい場所でこのグローバル変数（ref_step_X）を使います。

以下に、プログラムを示します。

Progプログラム	Progプログラムのステップ状態を使いたい別プログラム


TSTART ステートメント

名前：	TSTART

意味：	タイマ型変数のカウントを現在値から更新します。

TSTART コマンドでタイマ型変数は変更されません

文法：	TSTART ( <timer_variable> );

オペランド：	非活性状態のタイマ変数

戻り値：	(none)

例：

(* TSTART 、 TSTOPステートメントを使ったＳＴプログラム *)

bi100が常時FALSEの時のタイムチャート:

タイマーはサイクル中は同じ値を保ちます。


TSTOP ステートメント

名前：	TSTOP

意味：	タイマ型変数の更新を停止します。

TSTOPコマンドでタイマ型変数は変更されません。

文法：	TSTOP ( <timer_variable> );

オペランド：	活性状態のタイマ変数

戻り値：	(none)

例：上記のTSTARTステートメントを参照願います。


GSTART ステートメント

名前：	GSTART

意味：	チャイルドＳＦＣプログラムを各初期ステップにトークンをセットすることにより起動させる

文法：	GSTART ( <child_program> );

オペランド：	起動されるチャイルドＳＦＣプログラムは、GSTARTステートメントが書かれているＳＦＣプログラムのチャイルドＳＦＣプログラムである必要があります。

戻り値：	(none)

チャイルドＳＦＣプログラムのチャイルド（孫ＳＦＣプログラム）は自動的には起動されません。

注意：	GSTARTはIEC 1131-3には含まれていません。以下のようにＳクオリファイアを使うことでチャイルドプログラムを起動します。

Child_name(S);

例： GSTART 、 GKILLステートメントの例

(*親ＳＦＣプログラム *)	(* チャイルドＳＦＣプログラム 'Schild' *)


GKILL ステートメント

名前：	GKILL

意味：	チャイルドＳＦＣプログラムに存在している実行トークンを取り除くことによりチャイルドＳＦＣプログラムを停止します。

文法：	GKILL ( <child_program> );

オペランド：	指定されるＳＦＣプログラムは、GKILLステートメントが書かれているＳＦＣプログラムのチャイルドＳＦＣプログラムである必要があります。

戻り値：	(none)

チャイルドＳＦＣプログラムのチャイルド（孫ＳＦＣプログラム）も自動的に停止されます。

注意：	GKILLはIEC 1131-3 normに含まれていません。以下のようにＲクオリファイアを使ってチャイルドSFCプログラムを停止させます。

Child_name(R);

例：上記GSTARTステートメントを参照


GFREEZE ステートメント

名前：	GFREEZE

意味：	チャイルドＳＦＣプログラムの実行を一時停止します。停止したプログラムはGRSTステートメントで再起動可能です。

文法：	GFREEZE ( <child_program> );

オペランド：	指定されるＳＦＣプログラムは、GFREEZEステートメントが書かれているＳＦＣプログラムのチャイルドＳＦＣプログラムである必要があります。

戻り値：	(none)

チャイルドＳＦＣプログラムのチャイルド（孫ＳＦＣプログラム）も自動的に凍結されます。

注意：	GFREEZEはIEC 1131-3には含まれません。

例：


GRST ステートメント

名前：	GRST

意味：	GFREEZEステートメントで一時停止されていたチャイルドＳＦＣプログラムを再起動します。

文法：	GRST ( <child_program> );

オペランド：	指定されるチャイルドＳＦＣプログラムは、GRSTステートメントが書かれているＳＦＣプログラムのチャイルドＳＦＣプログラムである必要があります。

戻り値：	(none)

凍結されていたチャイルドＳＦＣプログラムのチャイルド（孫ＳＦＣプログラム）も自動的に再起動されます。

注意：	GRSTはIEC 1131-3には含まれません。

例： 上記GFREEZEステートメントを参照


GSTATUS ステートメント

名前：	GSTATUS

意味：	チャイルドＳＦＣプログラムの現在の状態を戻します

文法：	<ana_var> := GSTATUS ( <child_program> );

オペランド：	指定されるチャイルドＳＦＣプログラムは、GSTATUSステートメントが書かれているＳＦＣプログラムのチャイルドＳＦＣプログラムである必要があります。

戻り値：	0 = プログラムが非活性状態 (killed)

1 = プログラムが活性状態 (started)

2 = プログラムが凍結状態 (frozen)

例：


 ＦＢＤ言語

ファンクションブロックダイアグラム（ＦＢＤ）はグラフィカルな言語です。ＩＳａＧＲＡＦライブラリに定義済みのファンクションを組み合わせて複雑な手続きをグラフィカルなエディタ上でプログラムすることができます。

FBDダイヤグラムフォーマット

RETURNステートメント

ジャンプとラベル

論理の反転

FBDからのファンクション、ファンクションブロックコール


ＦＢＤダイヤグラムフォーマット

ＦＢＤダイアグラムは入力変数と出力変数との間のファンクションといえます。このファンクションは基本のファンクションブロックが複数集まったセットのような形となります。入力や出力はブロックに接続ラインで接続されます。ブロックからの出力は更に別の入力の入力に接続されることがあります。

ファンクションブロックダイアグラム全体はＩＳａＧＲＡＦライブラリに登録済みの基本ファンクションブロックを組み合わせて作られています。各ファンクションブロックは固定数の入力接続ポイント及び出力接続ポイントを持っています。ファンクションブロックは一つの長方形で表現されます。入力は左側の境界線に接続され、出力は右側の境界線に接続されます。一つの基本ファンクションブロックはこのブロックに対する入力、出力間で一つのファンクションを実現します。基本のファンクションブロックの処理（ファンクションブロック名）は長方形の中にシンボルとして書かれます。各入力、出力の変数タイプは別に定義されています。

ＦＢＤプログラムの入力はファンクションブロックの入力接続ポイントに接続されなければなりません。各入力変数のタイプは各入力で定義されたタイプと一致していなければなりません。ＦＢＤダイアグラムの入力は定数、内部変数、外部入力変数、外部出力変数のいずれでも構いません。

ＦＢＤプログラムの出力はファンクションブロックの出力接続ポイントに接続されなければなりません。各出力変数のタイプは各出力で定義されたタイプと一致していなければなりません。ＦＢＤダイアグラムの出力は内部変数、外部出力変数、プログラム名（編集中のプログラムがサブプログラムである場合のサブプログラム名のみ）のいずれでも構いません。

出力が現在編集中であるサブプログラム名である場合は、プログラムの戻り値（出力パラメータ）への割り付けとなり、この出力値が親プログラムに戻されます。

入力変数とファンクションブロックの入力接続ポイント、出力変数とファンクションブロックの出力接続ポイントは接続線 で接続されます。

接続には以下の３通りがあります。

  入力変数からファンクションブロックの入力ポイントに接続

  ファンクションブロックの出力ポイントから別のファンクションブロックの入力ポイントに接続

  ファンクションブロックの出力ポイントから出力変数に接続

接続には方向性があります。即ち、データを左から右へ転送します。接続されるポイントの変数タイプは同じである必要があります。

マルチラインに接続して同じ状態を複数に分けて転送することもできます。


RETURN ステートメント

ＲＥＴＵＲＮステートメントはダイアグラムの出力として使われることがあります。ＲＥＴＵＲＮはファンクションブロックのブール出力ポイントに接続されなければなりません。ＲＥＴＵＲＮステートメントは論理出力がＴＲＵＥの時のみＲＥＴＵＲＮ以降の部分の実行を行なわずにＦＢＤダイアグラムを抜け出します。

(* RETURN ステートメント を使ったＦＢＤプログラムの例 *)

(* 等価なＳＴ言語: *)

If auto_mode OR alarm Then

Return;

End_if;

bo67 := (bi10 AND bi23) OR x_cmd;


Jumps and labels
ジャンプとラベル

ダイアグラムの実行をコントロールするためにラベルとジャンプが使われます。ジャンプやラベルのシンボルの右側には何も接続されません。以下の表記方法が使われます。

>>LAB	ラベルへのジャンプ (ラベル名は "LAB")

LAB:	ラベルの処理内容 (ラベル名は "LAB")

もし、ジャンプシンボルの左側の接続ラインのブール状態がＴＲＵＥの時、対応したラベル先にジャンプします。

(* ラベルとジャンプを使ったＦＢＤプログラムの例 *)

(* 等価なＩＬ言語: *)

ld	manual

and	b1

jmpc	NOMODIF

ld	input1

or	input2

st	result

NOMODIF:	ld	result

and	valid

st	cmd10


論理の反転

ファンクションブロックの入力ポイントに接続されるときに論理を反転 して接続することができます。この場合のシンボルとして入力ポイントに小さい○が表示されます。論理の反転（Ｂｏｏｌｅａｎ　Ｎｅｇａｔｉｏｎ）が使われるときは入力ポイントのタイプはブール型である必要があります。

(* FBDにおける論理反転の例 *)

(* 等価なＳＴ言語: *)

output1 := input1 AND NOT (input2);


ＦＢＤからのファンクション､ファンクションブロックコール

ＦＢＤダイアグラムからサブプログラム、ファンクションやファンクションブロックをコールすることができます。サブプログラム、ファンクション及びファンクションブロックはファンクションボックスとして表記されます。ボックス内の名前はサブプログラム、ファンクション及びファンクションブロック名となります。サブプログラムとファンクションの場合、ファンクションの戻り値（出力パラメータ）はファンクションボックスの出力のみとなり、ファンクションブロックでは、多くなります。

(* サブプログラムブロックを呼び出した例 *)

(* 等価なＳＴ言語 *)

net_weight := Weighing (mode, delta); (* call sub-program *)

If (net_weight = 0) Then Return; End_if;

weight := net_weight + tare_weight;


 ＳＦＣ 言語

ＳＦＣ言語はシーケンシャルなプロセスオペレーションを記述するときに使います。

プロセスのアクションを表現する部分（ステップ）と、ステップ間の遷移条件を表現する部分（トランジション）との２つのグラフィック記号から成り立っています。

ステップの中のアクションは他の言語（ＳＴ、ＩＬ、ＬＤ、ＦＢＤ）で詳細に記述されます。

SFCチャートメインフォーマット

SFC基本コンポーネント

分岐と結合

マクロステップ

ステップの中でのアクション

トランジションの条件

ＳＦＣダイナミックルール

ＳＦＣプログラム階層化


SFCチャートメインフォーマット
ＳＦＣ チャートメインフォーマット

ＳＦＣプログラムは，方向を持ったリンクによって接続されたステップとトランジションの組み合わせによって表されます。

マルチプルリンクは，分岐と結合を表すのに使用されます。

メインチャートのプログラムの一部分をマクロステップﾟと呼ばれる記号で置き換える事により、別の場所に分離して記述する事ができます。

SFCの基本的な規則は次の通りです。

 ステップのあとに別のステップを続けることはできません。

 トランジションのあとに別のトランジションを続けることはできません。


ＳＦＣ 基本コンポーネント

SFC言語の基本的なコンポーネント(グラフィックシンボル)は次の通りです。

ステップとイニシャルステップ

トランジション

方向を持ったリンク

ステップへジャンプ


ステップとイニシャルステップ

ステップはひとつの正方形によって表現され、各ステップは正方形の中に書かれたリファレンス番号によって参照されます。

ステップの主な内容を表すコメントが、ステップ記号にリンクされた長方形の中に記述されます。このコメントはプログラミング言語の一部分ではありませんので自由な記述が可能です。

このような表現方式をステップのレベル１表現と呼びます:

実行時には，活性化状態のステップにはトークンが示されます:

活性化ステップ	　非活性化ステップ

ＳＦＣプログラムの初期状態は、二重枠で囲まれたイニシャルステップ記号で表されます。プログラムは自動的に各イニシャルステップから実行開始されます。

イニシャルステップ

ＳＦＣプログラムは、少なくとも1つのイニシャルステップを含んでいなければなりません。 以下にステップの有する属性データを示します。

他のプログラム言語でもこれらのデータを使用する事ができます:

GSnnn．x　ステップの活性状態(ブール値)

GSnnn．t　ステップの活性持続時間(タイマ値)

（ここで、ｎｎｎはステップのリファレンス番号）


トランジション

トランジションは，接続リンクに交差する小さい水平のバーによって表されます。各トランジションはトランジションの記号の下に書かれたリファレンス番号で参照されます。

トランジションの主な内容はトランジション記号の右側にコメントとして記述できます。このコメントはプログラミング言語の一部分ではなく自由に記述できます。この様な記述のしかたをトランジションのLevel 1表現と呼びます:


リンク

ステップとトランジションを接続する為に、方向を持ったリンク（オリエンテッドリンク） と呼ばれる一本のラインが用いられます。

リンクの方向が明示的に与えられていないときは、上から下の向きにリンクされます。


ステップへのジャンプ

トランジションからステップにリンクを接続する際に常に接続線を描く必要はなく、ジャンプ記号を用いる事ができます。ジャンプ先として目的のステップ番号を記述する必要があります。

ステップからトランジションへのジャンプ記号を用いる事はできません。

ジャンプの例－	以下の２つのチャートは等価となります。


分岐と結合

分岐とは、1つのＳＦＣ記号(ステップかトランジション)からその他の複数のＳＦＣ記号に分岐する多重接続リンクを意味します。

結合とは、複数のＳＦＣ記号から1つのＳＦＣ記号に収束する多重接続リンクを意味します。

分岐と結合には、それぞれ選択（ＯＲ）と並列（ＡＮＤ）の２種類があります。

選択（ＯＲ）分岐

並列（AND）分岐


選択（ＯＲ）分岐

選択分岐とは1つのステップから複数のトランジションへの分岐で、複数の分岐の内の1つのみ選択する事を許します。

また選択結合は複数のトランジションからひとつのステップへの結合で、通常、選択分岐によって始められたＳＦＣ分岐をまとめる（結合させる）のに使用されます。

選択分岐と選択結合は、一本の水平の線によって表されます。

注意：	選択分岐の直後の複数のトランジションは暗示的な排他条件であってはなりません。排他性は、実行時に複数の分岐の内一つだけ選ばれる事を保証する様に、トランジションの条件中に明示的に記述される必要があります。

(* 選択分岐と選択結合ＳＦＣプログラム *)


並列（ＡＮＤ）分岐

並列分岐は1つのトランジションから複数のステップへの分岐であり、プロセスの並行実行を意味します。また並列結合は複数のステップからひとつのトランジションへの結合です．一般に並列結合は並列分岐によって始められたＳＦＣ分岐をまとめる（結合させる）のに使用されます。並列分岐と並列結合は、二重の水平線によって表されます。

並列分岐と並列結合の例:

(* 並列分岐と並列結合をもったＳＦＣプログラム *)


マクロステップ

マクロステップは，複数のステップとトランジションのユニークな組合わせからなるひとつのサブプロセスを表わします。マクロステップのボディ（内容）は、同じＳＦＣプログラム中のほかの場所に独立に記述します。

マクロステップはメインＳＦＣチャートに一個の記号で表されます。

下図がマクロステップに使用される記号です:

マクロステップ記号の中に書かれるリファレンス番号は，マクロステップ本体の先頭ステップのリファレンス番号です。マクロステップボディは開始ステップで始まって終了ステップで終わらなければならず、自己完結的でなければなりません。

開始ステップはいかなる上側のリンク(直前のトランジション)も持たず、また終了ステップはいかなる下側のリンク(直後のトランジション)も持ちません。マクロステップ記号を別のマクロステップの本体の中で用いることもできます。

注意:　マクロステップは複数のステップとトランジションのユニークな組み合わせであり、ひとつのＳＦＣプログラムにおいて同じマクロステップを２回以上読み出すことはできません。

マクロステップの例：


ステップの中でのアクション

ＳＦＣステップのレベル２表現は、そのステップが活性状態の間に実行すべきアクションの詳細な記述方式です。

この記述はＳＦＣの書式ルールや例えばＳＴの様な他の言語を用いて表現します。

アクションの基本的な型は：

ブールアクション

ST言語でプログラムされたパルスアクション

ST言語でプログラムされたノーマル（ノンストアード）アクション

SFCアクション

一つのステップの中に同じ型か異なった型の複数のアクションを記述することができます。

他の言語の使用を可能にする方法は以下の２通りがあります。

サブプログラムをコール

IL言語による表現


ブールアクション

ブールアクションとは現在のステップの状態を内部・外部のブール変数に割り当てることです。それはそのステップの活動が始まるか，または止まる度に毎回割り当てられます。

以下に基本的なブールアクションの文法を示します。（<>は入力しません）

<ブール型変数名> (N) ;	ステップのアクティビティ状態を変数に割当て

<ブール型変数名> ;	同上 (N 属性はオプション)

/ <ブール型変数名> ;	ステップのアクティビティ状態の反転を変数に割り当て

これらの他にも、ステップ状態が活性化になったとき変数の値をセットあるいはリセットすることもできます。

以下にこれらの文法を示します。

<ブール型変数名> (S) ;	ステップの状態がTRUEになったとき変数の値をTRUEにする。

<ブール型変数名> (R) ;	ステップの状態がTRUEになったとき変数の値をFALSEにする。

ブール型変数は内部あるいは出力変数でなければなりません。以下に示すプログラム例とその振る舞いを示します。

ブールアクションの例：

(* ブールアクションを使ったSFCプログラム例 *)


パルスアクション

パルスアクション（Ｐ）はステップの状態が活性化状態になったとき一回のみ実行されるＳＴ又はＩＬで書かれた命令です。次のような構文で書かれる必要があります。

ACTION (P) :

(* ＳＴインストラクション *)

END_ACTION ;

以下にパルスアクションの振る舞いを示します。

パルスアクションの例：


ノーマルアクション

ノーマルアクションはステップの状態が活性の時は毎ターゲットサイクル実行されるＳＴ又はＩＬで書かれた命令です。次のような文法で書かれる必要があります。

ACTION (N) :

(* インストラクション *)

END_ACTION ;

以下にノーマルアクションの振る舞いを示します：

ノーマルアクションの例：


ＳＦＣ アクション

ＳＦＣアクションではチャイルドＳＦＣのシーケンスをコントロールします。即ち、ステップの状態に応じて起動、停止を行ないます。　ＳＦＣアクションにはＮ（Normal）、Ｓ（Set）、Ｒ（Reset）識別子がつきます。以下に文法を示します。

<ﾁｬｲﾙﾄﾞﾌﾟﾛｸﾞﾗﾑ> (N) ;	ステップが活性状態になったときにチャイルドシーケンスを起動し、非活性状態になったときにチャイルドシーケンスを停止(Kill)させる。

<ﾁｬｲﾙﾄﾞﾌﾟﾛｸﾞﾗﾑ> ;	同上 (N 識別子はオプション)

<ﾁｬｲﾙﾄﾞﾌﾟﾛｸﾞﾗﾑ> (S) ;	ステップが活性状態になったときにチャイルドシーケンスを起動し、非活性状態になったときにはチャイルドシーケンスに対して何もしない。

<ﾁｬｲﾙﾄﾞﾌﾟﾛｸﾞﾗﾑ> (R) ;	ステップが活性状態になったときにチャイルドシーケンスを停止（kills）し、非活性状態になったときは何もしない。

アクションで指定されているＳＦＣシーケンスは現在編集中のプログラムのチャイルドＳＦＣプログラムである必要があります。

注意: 	ＳＦＣアクションで使用されるＳ（Set）、Ｒ（Reset）識別子はＳＴ言語によるパルスアクションとしてプログラムされたGSTART, GKILLステートメントと同様の意味を持ちます。

下記はＳＦＣアクションの一例です。親ＳＦＣプログラムは、ＳｅｑＭｌｘとＳｅｑＰｕｍｐという二つの子ＳＦＣを持っています。

(* ＳＦＣアクションを持ったＳＦＣプログラム *)


アクションからのファンクションとファンクションブロックの呼び出し

ＳＴ，ＩＬ，あるいはＦＢＤ言語で記述されたサブプログラム、ファンクション、ファンクションブロックまたは、C言語ファンクションやC言語ファンクションブロックは以下のような構文によりＳＦＣアクションブロックから直接コールすることができます。

ｻﾌﾞﾌﾟﾛｸﾞﾗﾑ、ﾌｧﾝｸｼｮﾝ、"C"ﾌｧﾝｸｼｮﾝ:

ACTION (P) :

result := sub_program ( ) ;

END_ACTION;

または

ACTION (N) :

result := sub_program ( ) ;

END_ACTION;

"C" または ST, IL, LD, FBD言語で記述されたﾌｧﾝｸｼｮﾝﾌﾞﾛｯｸ:

ACTION (P) :

Fbinst(in1, in2);

result1 := Fbinst.out1;

result2 := Fbinst.out2;

END_ACTION;

または

ACTION (N) :

Fbinst(in1, in2);

result1 := Fbinst.out1;

result2 := Fbinst.out2;

END_ACTION;

詳細の文法に関してはＳＴ言語のセクションを参照願います。

以下に、アクションブロックからサブプログラムコールを行った例を示します。

(* アクションブロック内からサブプログラムを読み出したＳＦＣプログラム *)


IL 規約

下記の構文を用いることによりＳＦＣアクションブロックの中にＩＬ言語で記述されたプログラムを直接はめ込むことができます。

ACTION (P) :	(* or N *)

#info=IL

     <instruction>

     <instruction>

     ....

#endinfo

END_ACTION;

"#info=IL" と "#endinfo"という特別なキーワードを使用する際には、正確に上記構文を守るようにして下さい。キーワードの前後にスペースやタブを挿入することは許されません。以下にアクションブロック中のＩＬプログラム例を示します。

(* アクションブロックからＩＬプログラムを読み出したＳＦＣプログラム例 *)


トランジションの条件

各トランジションには、トランジションをクリア（通過）するための条件を規定する論理式がアタッチされます。通常、この条件記述にはＳＴ言語が用いられます。

これをトランジションのレベル２表記と呼びます。

また他の言語を使用することも可能です。

ST言語

LD言語

IL言語

トランジションからのサブプログラムコール

注意: 	トランジションに条件記述がない場合、デフォルト条件としてＴＲＵＥが設定されます。


ST 規約

トランジションの条件を記述するためにＳＴ言語を使用することが出来ます。条件はブール（ｂｏｏｌｅａｎ）でなければならず、下記の構文規定に示すようにセミコロンで終わらねばなりません。

< ブール型変数 > ;

条件記述は、真／偽の常数，一つの入力または内部ブール型変数，あるいはブールを導出する変数の組合せで表されます。

以下にトランジションの条件を記述するＳＴプログラミング例を示します。

(* トランジションにＳＴプログラムを使ったＳＦＣプログラム例 *)


LD 規約

ﾄﾗﾝｼﾞｼｮﾝの条件を記述するためLD言語を使用することが出来ます。ここではＬＤプログラムは１つのラングのみとなります。コイルには変数名を割り当てる必要がありません。

以下にﾄﾗﾝｼﾞｼｮﾝの条件を記述するLDﾌﾟﾛｸﾞﾗﾐﾝｸﾞ例を示します:


IL 規約

下記の構文により、トランジションをＩＬ言語で直接記述することができます。

#info=IL

<instruction>

<instruction>

....

#endinfo

ＩＬシーケンスの実行結果（ＩＬレジスタ）に保持される値によってトランジション条件の判定結果が決定されます。

current result = 0 	 	condition is FALSE

current result <> 0	condition is TRUE

"#info=IL" と "#endinfo"という特別なキーワードを使用する際には、正確に上記構文を守るようにして下さい。キーワードの前後にスペースやタブを挿入することは許されません。以下にアクションブロック中のＩＬプログラム例を示します。

(* トランジションにＩＬプログラムを使ったSFCプログラム例 *)


トランジションからのサブプログラムの呼び出し

トランジション条件を評価判定するために、ＦＢＤやＬＤ，ＳＴ，ＩＬで記述されたサブプログラムをコールする事が出来ます。

構文は以下の通りです。

< sub_program > ( ) ;

サブプログラムの戻り値により条件判断が決定されます。

return value = 0	condition is FALSE

return value <> 0	condition is TRUE

トランジション中のサブプログラム例

(* トランジションでサブプログラムを読み出したＳＦＣプログラム例 *)


ＳＦＣ ダイナミックルール

ＳＦＣ言語の５つのダイナミックルールを以下に示します

 初期状態

初期状態は初期ステップで表現されます。処理の開始時はこのステップが活性状態になります。各ＳＦＣプログラムには少なくとも一つの初期ステップが無ければなりません。

 トランジションの通過

トランジションにはenable状態とdisable状態があります。ここで、enable状態とは、直前のステップが活性（トークンが存在）な状態の時をことを言います。直前のステップが活性でないときはdisable状態と言います。トランジションは以下の条件が整っているときにトークンが通過します。

  －　直前のステップが活性状態であること、かつ、

  －　トランジションの条件がＴＲＵＥであること。

 活性化ステップの状態変化

トランジションをトークンが通過することは同時に次のステップにトークンが移り、活性状態になります。この結果、トランジション直前のステップは非活性状態となります。

 トランジションの同時通過

並列分岐はトークンの遷移が同時に行なわれることを示します。トランジションが別に示されているときは、直前のステップの活性状態が条件としてとして使われます。

 ステップの同時活性化と非活性化

処理中にステップが同時に活性、非活性になるような場合は優先順位は活性化にあります。


ＳＦＣ プログラム階層化

ＩＳａＧＲＡＦではＳＦＣプログラムの階層的な構造を構築することができます。各ＳＦＣプログラムは別のＳＦＣプログラムに対して起動、停止などのコントロールを行なうことができます。コントロールされるプログラムはチャイルドＳＦＣプログラムと呼ばれます。ＳＦＣプログラムは“親－子”の関係で階層的にリンクされています。

階層的な構成には以下の基本的なルールがあります。

　親ＳＦＣプログラムを持たないＳＦＣプログラムはメインＳＦＣプログラムと呼ばれます。

　メインＳＦＣプログラムがシーケンシャルセクションで最初に実行されます。

　一つのＳＦＣプログラムは複数のチャイルドＳＦＣプログラムを持つことができます。

　チャイルドＳＦＣプログラムは２つ以上の親ＳＦＣプログラムを持つことはできません。（１つの親プログラムのみ）

　チャイルドＳＦＣプログラムは親ＳＦＣプログラムからのみコントロールされます。

　親ＳＦＣプログラムは自分のチャイルドＳＦＣプログラムのチャイルドＳＦＣプログラム（孫ＳＦＣプログラム）をコントロールすることはできません。

親ＳＦＣプログラムがそのチャイルドＳＦＣプログラムに対してコントロールできるアクションを以下に示します。

 Start	(GSTART) チャイルドＳＦＣプログラムの起動： チャイルドプログラムの各初期ステップを活性状態にします。孫のプログラムは自動的には起動されません。

 Kill	(GKILL) チャイルドＳＦＣプログラムの停止：チャイルドプログラムの活性状態ステップを全て非活性状態にします。この際、孫プログラムも同時に停止されます。

 Freeze	(GFREEZE) チャイルドＳＦＣプログラムの凍結：チャイルドプログラムの活性なステップを凍結状態にします。ただし、この状態をメモリに保管しておき後ほど再スタートが可能な状況にしておきます。孫プログラムも同時に凍結されます。

 Restart	(GRST) 凍結されたＳＦＣプログラムの再起動：凍結されていたステップを全て活性化することによりプログラムを再起動させます。孫プログラムは自動的には再起動はされません。

 Get status	(GSTATUS) チャイルドＳＦＣプログラムの現在の状況を取得します。（活性状態、非活性状態、凍結状態のいづれか）


 ＬＤ言語

ラダーダイアグラム（ＬＤ）はブール演算のグラフィックな表現方式です。入力（接点、あるいはコンタクト）と出力（コイル）の組み合わせから成り立っています。ＬＤダイアグラムは電気リレー回路と同様に扱うことができます。ＬＤダイアグラムは左右の垂直な母線に接続される必要があります。

母線と接続線

マルチプルコネクション

基本LD接点とコイル

RETURNステートメント

ジャンプとラベル

ＬＤの中でのブロック

以下にＬＤ言語に使われる基本のコンポーネントを示します。

左母線

右母線

水平接続線

垂直接続線

マルチプル接続線

接点

コイル


母線と接続線

ＬＤダイアグラムは左右の垂直なライン、即ち左右の母線に接続される必要があります。

ＬＤダイアグラムでのグラフィックシンボルは接続線 （コネクションライン）で母線または別のシンボルに接続されます。接続線は垂直又は水平なラインです。

各々のラインセグメントはブール状態のFALSE 又は TRUEの値を持ちます。この状態は直接接続されているセグメントは同じ値を持ちます。垂直な左母線に接続された水平なラインはTRUE状態を持ちます。


マルチプルコネクション

シングル水平ラインは左右に一本のラインが出ていますが、水平ラインと垂直ラインを組み合わせることで複数のラインをまとめること（マルチプルライン）が可能になります。マルチプルラインによるブール状態は以下のルールを持ちます。

左側にマルチプルラインを持つ場合、即ち、複数の水平ラインが左母線から接続されてシンボルを経由して右側で一本の水平ラインに接続される場合は右側のブール状態は左側の複数のラインの論理ＯＲを持つことになります。

(* 左側のマルチプルライン *)

(* 右側の状態は (v1 OR v2 OR v3) *)

右側のマルチプルコネクションの場合は、即ち、左側の一本の水平ラインが一つ以上のラインになって右側に接続される場合は左側の論理状態が右側に伝達されます。

(* 右側マルチプルライン *)

(* 等価なＳＴ言語 *)

output1 := input1;

output2 := input1;

左右のマルチプルラインの場合は、即ち、左側も右側も複数のラインで左右の垂直ラインに接続される場合は右側の論理状態は左側の複数のラインの論理ＯＲとなります。

(* 左右マルチプルラインの例 *)

(* 等価なＳＴ言語 *)

output1 := input1 OR input2;

output2 := input1 OR input2;

output3 := input1 OR input2;


基本ＬＤ接点とコイル

接点（コンタクト）にはいくつかの種類があります。

ａ接点

ｂ接点

立ち上がり接点

立ち下がり接点

コイルにはいくつかの種類があります。

コイル

反転コイル

セットコイル

リセットコイル

立ち上がり検出コイル

立ち下がり検出コイル

ブール変数名はこれらグラフィックシンボルの上に書かれます。


ａ接点

ａ接点はブール型変数と接続線との間でのブール操作を行ないます。

接点の右側の接続線の状態は接点の左側の接続線と接点に割り当てられた変数との論理的ＡＮＤの結果です。

(* ａ接点の例 *)

(* 等価なＳＴ言語 *)

output1 := input1 AND input2;


ｂ接点

ｂ接点は接続線とブール型変数の反転とのブール操作を行ないます。

接点の右側の接続線の状態は接点の左側の接続線と接点に割り当てられた変数の反転との論理的ＡＮＤの結果です。

(*ｂ接点の例 *)

(* 等価なＳＴ言語 *)

output1 := NOT (input1) AND NOT (input2);


立ち上がり接点

立ち上がり接点は接続線と論理変数の立ち上がりとのブール操作を行ないます。

接点の右側接続線は左側接続線がＴＲＵＥでかつブール型変数がＦＡＬＳＥからＴＲＵＥに変化したときのみＴＵＲＥになります。これ以外の状態ではＦＡＬＳＥとなります。

(* 立ち上がり接点の例 *)

(* 等価なＳＴ言語 *)

output1 := input1 AND (input2 AND NOT (input2prev));

(* input2prev is the value of input2 at the previous cycle *)


立ち下がり接点

立ち下がり接点は接続線と論理変数の立ち下がりとのブール操作を行ないます。

接点の右側接続線は左側接続線がＴＲＵＥでかつブール型変数がＴＲＵＥからＦＡＬＳＥに変化したときのみＴＵＲＥになります。これ以外の状態ではＦＡＬＳＥとなります。

(* 立ち下がり接点の例 *)

(* 等価なＳＴ言語 *)

output1 := input1 AND (NOT (input2) AND input2prev);

(* input2prev is the value of input2 at the previous cycle *)


コイル

コイルは接続線のブール状態をブール出力します。

左側接続線の状態がコイルに割り当てられた論理出力変数に割り当てられます。左側接続線の状態はそのまま右側接続線に伝えられます。右側接続線は通常右母線に接続されます。

コイルに割り当てられる論理出力変数は内部変数あるいは外部出力変数である必要があります。

変数名はプログラム名（ただし、サブプログラム名のみ）を使うことも可能です。この場合は変数名はサブプログラムの出力パラメータに一致している必要があります。

(* コイルの例 *)

(* 等価なＳＴ言語 *)

output1 := input1;

output2 := input1;


反転コイル

反転コイルは接続線のブール状態の反転をブール出力します。

左側接続線の反転状態がコイルに割り当てられた論理出力変数に割り当てられます。左側接続線の反転状態はそのまま右側接続線に伝えられます。右側接続線は通常右母線に接続されます。

コイルに割り当てられる論理出力変数は内部変数あるいは外部出力変数である必要があります。

変数名はプログラム名（ただし、サブプログラム名のみ）を使うことも可能です。この場合は変数名はサブプログラムの出力パラメータに一致している必要があります。

(* 反転コイルの例 *)

(* 等価なＳＴ言語 *)

output1 := NOT (input1);

output2 := input1;


セットコイル

セットコイルは接続線のブール状態をブール出力します。

割り当てられた出力変数は左側接続線の状態がＴＲＵＥになったときにＴＲＵＥにセットされます。出力変数はこの状態をリセットコイルで反転されるまで継続します。左側接続線の状態はそのまま右側接続線に伝えられます。右側接続線は通常、右母線に接続されます。

割り当てられる変数は内部変数あるいは外部出力変数である必要があります。

(* セット、リセットコイルの例 *)

(* 等価なＳＴ言語 *)

IF input1 THEN

   output1 := TRUE;

END_IF;

IF input2 THEN

   output1 := FALSE;

END_IF;


リセットコイル

リセットコイルは接続線のブール状態をブール出力します。

割り当てられた出力変数は左側接続線の状態がＴＲＵＥになったときにＦＡＬＳＥにリセットされます。出力変数はこの状態をセットコイルで反転されるまで継続します。左側接続線の状態はそのまま右側接続線に伝えられます。右側接続線は通常、右母線に接続されます。

割り当てられる変数は内部変数あるいは外部出力変数である必要があります。

(* セット、リセットコイルの例 *)

(* 等価なＳＴ言語 *)

IF input1 THEN

   output1 := TRUE;

END_IF;

IF input2 THEN

   output1 := FALSE;

END_IF;


立ち上がり検出コイル

立ち上がり検出コイルは接続線のブール出力を行います。このコイルはQuick LDエディタを使用した場合のみ有効です。

割り当てられた変数は左側接続線の状態がFALSEからＴＲＵＥに立ち上がったときにTRUEにセットされます。出力変数はFALSEにリセットされます。左側接続線の状態はそのまま右側接続線に伝えられます。右側接続線は通常、右母線に接続されます。

割り当てられる変数は内部変数あるいは外部出力変数である必要があります。

(* 立ち上がり検出コイルの例 *)

(* 等価なＳＴ言語 *)

IF (input1 and NOT(input1prev)) THEN

   output1 := TRUE;

ELSE

   output1 := FALSE;

END_IF;

(* input1prev is the value of input1 at the previous cycle *)


立ち下がり検出コイル

立ち下がり検出コイルは接続線のブール出力を行います。このコイルはQuick LDエディタを使用した場合のみ有効です。

割り当てられた変数は左側接続線の状態がTRUEからFALSEに立ち下がったときにTRUEにセットされます。出力変数はFALSEにリセットされます。左側接続線の状態はそのまま右側接続線に伝えられます。右側接続線は通常、右母線に接続されます。

割り当てられる変数は内部変数あるいは外部出力変数である必要があります。

(* 立ち下がり検出コイル*)

(* 等価なＳＴ言語 *)

IF (NOT(input1) and input1prev) THEN

   output1 := TRUE;

ELSE

   output1 := FALSE;

END_IF;

(* input1prev is the value of input1 at the previous cycle *)


RETURN ステートメント

RETURNラベル はプログラムの条件終了に使われます。RETURNの右側には何も接続されません。

RETURNラベルの左側のラインの論理状態がTRUEの時、プログラムは以下のプログラムを実行しないでリターンします。

注意：	ＬＤプログラムがサブプログラムの時はプログラム名と同一の名前をリターン値にセットして親プログラムにリターンする必要があります。

(* RETURNシンボルの例 *)

(* 等価なＳＴ言語 *)

If Not (manual_mode) Then RETURN; End_if;

result := (input1 OR input3) AND input2;


ジャンプ とラベル

ラベルや条件付き（条件無し）ジャンプを使ってダイアグラムの実行の制御を行なうことができます。ラベルやジャンプシンボルの右側にはラインの接続はできません。

>>LAB	ラベル名"LAB"へジャンプ

LAB:	ラベル名"LAB"の内容

ジャンプシンボルの左側の論理状態がTRUEの時、プログラムは対応したラベルシンボルへジャンプして、その後から実行されます。

(* ジャンプとラベルの例*)

(* 等価なＩＬ言語 *)

ldn	manual_mode

jmpc	other

ld	input1

st	result

jmp	END

OTHER:	ld	input2

st	result

END:	(* end of program *)


ＬＤの中でのブロック

ＱｕｉｃｋＬＤエディタを使うことにより、ファンクション（ブロック）をラインで接続することができます。ここでのファンクションは演算子、ファンクションブロック、ファンクションのことを指します。全てのブロックが必ずしもブール型入力、出力を持っているとは限らないために、新たにＥＮ、ＥＮＯパラメータを入出力インタフェースに追加します。ただし、ＦＢＤ／ＬＤエディタでは必要な型の変数を直接接続できるため、ＥＮ、ＥＮＯは表現されません。

EN入力

ENO出力

EN、ENOパラメータ


EN入力

演算子、ファンクションブロック、ファンクションの最初の入力パラメータがブール型でない場合は、自動的にＥＮと呼ばれる入力パラメータが挿入されます。このＥＮがTRUEの時のみ、ブロックが実行されます。以下に比較命令の例とこれに等価なＳＴ言語表現を示します。

	IF rung_state THEN    q := (value1 > value 2); ELSE    q := FALSE; END_IF; (* continue rung with q state *)


ENO出力

演算子、ファンクションブロック、ファンクションの最初の出力パラメータがブール型でない場合は、自動的にＥＮＯと呼ばれる出力パラメータが挿入されます。このＥＮＯは常に最初の入力パラメータの値を持ちます。以下に平均命令の例とこれに等価なＳＴ言語表現を示します。

	AVERAGE(rung_state, Signal, 100); OutSignal := AVERAGE.XOUT; eno := rung_state; (* continue rung with eno state *)


EN 、ENO パラメータ

ある場合は、ＥＮ、ＥＮＯの両方が必要な場合があります。以下に、算術演算の例とこれに等価なＳＴ言語表現を示します。

	IF rung_state THEN    result := (value1 + value2); END_IF; eno := rung_state; (* continue rung with eno state *)


 標準命令,ファンクションブロックとファンクション

標準命令

ファンクションブロック

ファンクション

アルファベット順


標準命令

以下にＩＥＣ１１３１で定義されている標準命令を示します。

データ操作:

1 gain	アサイン

Neg	符号反転

ブール操作:

& (AND)	論理積

>=1 (OR)	論理和

=1 (XOR)	排他的論理和

算術演算:

 + 	加算

 - 	減算

 * 	乗算

 / 	除算

論理操作:

AND_MASK	ビット毎のANDマスク

OR_MASK	ビット毎のORマスク

XOR_MASK	ビット毎のXORマスク

NOT_MASK	ビットの反転

比較テスト:

 < 	LT

 <= 	LE

 > 	GT

 >= 	GE

 = 	EQ

 <> 	NE

データ変換:

BOO	ブール型変換

ANA	整数型変換

REAL	実数型変換

TMR	タイマ型変換

MSG	可変長文字列型変換

その他:

CAT	文字列結合

SYSTEM	システムコール

OPERATE	Ｉ／Ｏチャネル操作


1 gain

引数:

IN	あらゆるタイプ

Q	あらゆるタイプ

説明:

ある変数を別変数にアサインします。

このブロックは入力と出力を直接接続するブロックです。論理の反転（○シンボル）もあわせて使うことができます。

(* Assignmentブロックを用いたＦＢＤ例 *)

(* 等価なＳＴ言語: *)

ao23 := ai10;

bo100 := NOT (bi1 AND bi2);

(*等価なIL言語: *)

LD	ai10

ST 	ao23

LD	bi1

AND	bi2

LDN	bo100


NEG　（符号反転）

引数:

IN	整数・実数型	入力、出力パラメータは同じタイプ

Q	整数・実数型

説明:

変数の反転（符号反転）のアサイン

(*Negationをブロックを用いたＦＢＤ例 *)

(* 等価なＳＴ言語: *)

ao23 := - (ai10);

ro100 := - (ri1 + ri2);

(*等価なIL言語: *)

LD	ai10

MUL	-1

ST 	ao23

LD	ri1

ADD	ri2

MUL	-1.0

LD	ro100


& AND　（論理積）

注意: この命令は拡張命令と呼ばれています。入力数の変更は可能です。

引数:

(inputs)	ブール型

output	ブール型	入力パラメータの論理積

説明:

２つ以上の入力パラメータの論理積

(*"AND" をブロックを用いたＦＢＤ例*)

(* 等価なＳＴ言語: *)

bo10 := bi101 AND NOT (bi102);

bo5 := (bi51 AND bi52) AND bi53;

(* 等価なＩＬ言語: *)

LD	bi101	(* current result := bi101 *)

ANDN	bi102	(* current result := bi101 AND not(bi102) *)

ST	bo10	(* bo := current result *)

LD	bi51	(* current result := bi51;

&	bi52	(* current result := bi51 AND bi52 *)

&	bi53	(* current result := (bi51 AND bi52) AND bi53 *)

ST	bo5	(* bo := current result *)


>=1 OR　（論理和）

注意: この命令は Enhanced operatorと呼ばれています。入力数の変更は可能です。

引数:

(inputs)	ブール型

output	ブール型	入力パラメータの論理和

説明:

２つ以上の入力パラメータの論理和

(*"OR" をブロックを用いたＦＢＤ例 *)

(* 等価なＳＴ言語: *)

bo10 := bi101 OR NOT (bi102);

bo5 := (bi51 OR bi52) OR bi53;

(* 等価なＩＬ言語: *)

LD	bi101

ORN	bi102

ST	bo10

LD	bi51

OR	bi52

OR	bi53

ST	bo5


=1 XOR　（排他的論理和）

引数:

IN1	ブール型

IN2	ブール型

Q	ブール型	２つのブール入力の排他的論理和

説明:

２つのブール入力の排他的論理和

(*"XOR" をブロックを用いたＦＢＤ例 *)

(* 等価なＳＴ言語: *)

bo10 := bi101 XOR NOT (bi102);

bo5 := (bi51 XOR bi52) XOR bi53;

(* 等価なＩＬ言語: *)

LD	bi101

XORN	bi102

ST	bo10

LD	bi51

XOR	bi52

XOR	bi53

ST	bo5


+　（加算）

注意: この命令は Enhanced operatorと呼ばれています。入力数の変更は可能です。

引数:

(inputs)	整数・実数型	(全入力は同一タイプ)

output	整数・実数型	全入力の符号付き加算

説明:

整数・実数型変数の符号付き加算.

(* 加算ブロックを用いたＦＢＤ例*)

(* 等価なＳＴ言語: *)

ao10 := ai101 + ai102;

ao5 := (ai51 + ai52) + ai53;

(* 等価なＩＬ言語: *)

LD	ai101

ADD	ai102

ST	ao10

LD	ai51

ADD	ai52

ADD	ai53

ST	ao5


-　（減算）

引数:

IN1	整数・実数型

IN2	整数・実数型	(IN1と IN2は同じタイプ)

Q	整数・実数型	減算結果 (IN1 - IN2)

説明:

２つの整数・実数型変数の減算（１番目－２番目）

(* 減算ロックを用いたＦＢＤ例 *)

 (* 等価なＳＴ言語: *)

ao10 := ai101 - ai102;

ao5 := (ai51 - 1) - ai53;

(* 等価なＩＬ言語: *)

LD	ai101

SUB	ai102

ST	ao10

LD	ai51

SUB	1

SUB	ai53

ST	ao5


*　（乗算）

注意: この命令は拡張型命令と呼ばれています。入力数の変更は可能です。

引数:

(inputs)	整数・実数型	(全入力は同じタイプ)

output	整数・実数型	入力の符号付き乗算

説明:

２つ以上の整数・実数型変数の乗算

(* 乗算ブロックを用いたＦＢＤ例*)

(* 等価なＳＴ言語: *)

ao10 := ai101 * ai102;

ao5 := (ai51 * ai52) * ai53;

(* 等価なＩＬ言語: *)

LD	ai101

MUL	ai102

ST	ao10

LD	ai51

MUL	ai52

MUL	ai53

ST	ao5


/　（除算）

引数:

IN1	整数・実数型

IN2	整数・実数型	０でないこと

(IN1と IN2は同じタイプ)

Q	整数・実数型	符号付き除算（IN1 ／ IN2）

説明:

２つの整数・実数型変数の除算（１番目／２番目）

(* 除算 ブロックを用いたＦＢＤ例*)

(* 等価なＳＴ言語: *)

ao10 := ai101 / ai102;

ao5 := (ai5 / 2) / ai53;

(* 等価なＩＬ言語: *)

LD	ai101

DIV	ai102

ST	ao10

LD	ai51

DIV	2

DIV	ai53

ST	ao5


AND_MASK

引数:

IN	整数型

MSK	整数型

Q	整数型	INとMSKのビット毎の論理積

説明:

整数型変数の論理積でINの各ビットとMSKの各ビットとの論理積

(*Analog AND_MASK ブロックを用いたＦＢＤ例*)

(* 等価なＳＴ言語: *)

parity := AND_MASK (xvalue, 1); (* 1 if xvalue is odd *)

result := AND_MASK (16#abc, 16#f0f); (* equals 16#a0c *)

(* 等価なＩＬ言語: *)

LD	xvalue

AND_MASK	1

ST	parity

LD	16#abc

AND_MASK	16#f0f

ST	result


OR_MASK

引数:

IN	整数型

MSK	整数型

Q	整数型	INとMSKのビット毎の論理和

説明:

整数型変数の論理和でINの各ビットとMSKの各ビットとの論理和

(*Analog OR_MASKブロックを用いたＦＢＤ例*)

(* 等価なＳＴ言語: *)

is_odd := OR_MASK (xvalue, 1); (* makes value always odd *)

result := OR_MASK (16#abc, 16#f0f); (* equals 16#fbf *)

(* 等価なＩＬ言語: *)

LD	xvalue

OR_MASK	1

ST	is_odd

LD	16#abc

OR_MASK	16#f0f

ST	result


XOR_MASK

引数:

IN	整数型

MSK	整数型

Q	整数型	INとMSKのビット毎の排他的論理和

説明:

整数型変数の排他的論理和でINの各ビットとMSKの各ビットとの排他的論理和

(*XOR_MASKブロックを用いたＦＢＤ例 *)

(* 等価なＳＴ言語: *)

crc32 := XOR_MASK (prevcrc, nextc);

result := XOR_MASK (16#012, 16#011); (* equals 16#003 *)

(* 等価なＩＬ言語: *)

LD	prevcrc

XOR_MASK	nextc

ST	crc32

LD	16#012

XOR_MASK	16#011

ST	result


NOT_MASK

引数:

IN	整数型

Q	整数型	３２ビット表現のINの各ビットの反転

説明:

整数型変数の各ビットの反転

(*NOT_MASK ブロックを用いたＦＢＤ例*)

(* 等価なＳＴ言語: *)

result := NOT_MASK (16#1234);

(* result is 16#FFFF_EDCB *)

(* 等価なＩＬ言語: *)

LD	16#1234

NOT_MASK

ST	result


<　（LT）

引数:

IN1	整数・実数型-

タイマ型-文字列型

IN2	整数・実数型-

タイマ型-文字列型	２つの入力は同一タイプ

Q	ブール型	もし、 IN1 < IN2ならTRUE

説明:

あらゆるタイプの２つの変数間での比較（LESS THAN）

(*"Less than" ブロックを用いたＦＢＤ例*)

(* 等価なＳＴ言語: *)

aresult := (10 < 25); (* aresult is TRUE *)

mresult := ('z' < 'B'); (* mresult is FALSE *)

(* 等価なＩＬ言語: *)

LD	10

LT	25

ST	aresult

LD	'z'

LT	'B'

ST	mresult


<=
<=　（LE）

引数:

IN1	整数・実数型-文字列型

IN2	整数・実数型-文字列型	２つの入力は同じタイプ

Q	ブール型	もし、 IN1 <= IN2ならTRUE

説明:

２つの整数、実数、文字列型変数間での比較（LESS THAN or EQUAL）

(*"Less or equal to" ブロックを用いたＦＢＤ例*)

(* 等価なＳＴ言語: *)

aresult := (10 <= 25); (* aresult is TRUE *)

mresult := ('ab' <= 'ab'); (* mresult is TRUE *)

(* 等価なＩＬ言語: *)

LD	10

LE	25

ST	aresult

LD	'ab'

LE	'ab'

ST	mresult


> （GT）

引数:

IN1	整数・実数型-

タイマ型-文字列型

IN2	整数・実数型-

タイマ型-文字列型 	２つは同じタイプ

Q	ブール型	 IN1 > IN2でTRUE

説明:

２つの変数間の比較（GREATER THAN）

(*"Greater than" ブロックを用いたＦＢＤ例*)

(* 等価なＳＴ言語: *)

aresult := (10 > 25); (* aresult is FALSE *)

mresult := ('ab' > 'a'); (* mresult is TRUE *)

(* 等価なＩＬ言語: *)

LD	10

GT	25

ST	aresult

LD	'ab'

GT	'a'

ST	mresult


>=　（GE）

引数:

IN1	整数・実数型-文字列型

IN2	整数・実数型-文字列型 	２つの入力は同じタイプ

Q	ブール型	 IN1 >= IN2でTRUE

説明:

２つの変数間での比較（GREATER THAN or EQUAL TO）

(*"Greater or Equal to"ブロックを用いたＦＢＤ例 *)

(* 等価なＳＴ言語: *)

aresult := (10 >= 25); (* aresult is FALSE *)

mresult := ('ab' >= 'ab'); (* mresult is TRUE *)

(* 等価なＩＬ言語: *)

LD	10

GE	25

ST	aresult

LD	'ab'

GE	'ab'

ST	mresult


=　（EQ）

引数:

IN1	整数・実数型-文字列型

IN2	整数・実数型-文字列型 	２つの入力は同じタイプ

Q	ブール型	 IN1 = IN2でTRUE

説明:

２つの変数間の比較（EQUAL TO）

(*"Is Equal to"ブロックを用いたＦＢＤ例*)

(* 等価なＳＴ言語: *)

aresult := (10 = 25); (* aresult is FALSE *)

mresult := ('ab' = 'ab'); (* mresult is TRUE *)

(* 等価なＩＬ言語: *)

LD	10

EQ	25

ST	aresult

LD	'ab'

EQ	'ab'

ST	mresult


<>　（NE）

引数:

IN1	整数・実数型-文字列型

IN2	整数・実数型-文字列型 	２つの入力は同じタイプ

Q	ブール型	IN1 <> IN2でTRUE

説明:

２つの変数間での比較（NOT EQUAL TO）

(*"Is Not Equal to" ブロックを用いたＦＢＤ例*)

(* 等価なＳＴ言語: *)

aresult := (10 <> 25); (* aresult is TRUE *)

mresult := ('ab' <> 'ab'); (* mresult is FALSE *)

(* 等価なＩＬ言語: *)

LD	10

NE	25

ST	aresult

LD	'ab'

NE	'ab'

ST	mresult


BOO　（ブール型変換）

引数:

IN	あらゆるタイプ	（ブール型以外）

Q	ブール型	TRUE：０以外の数値

FALSE：０

TRUE： 'TRUE' 文字列

FALSE： 'FALSE' 文字列

説明:

変数のブール型への変換

(*"ブール型変換"ブロックを用いたＦＢＤ例*)

(* 等価なＳＴ言語: *)

ares := BOO (10);	(* ares is TRUE *)

tres := BOO (t#0s);	(* tres is FALSE *)

mres := BOO ('false');	(* mres is FALSE *)

(* 等価なＩＬ言語: *)

LD	10

BOO

ST	ares

LD	t#0s

BOO

ST	tres

LD	'false'

BOO

ST	mres


ANA　（整数型変換）

引数:

IN	あらゆるタイプ	（整数型以外）

Q	整数型	0 ：INがFALSEの時、 1 ：INがTRUEの時

タイマのｍｓ数値

実数変数の整数部分

文字列の１０進数表現

説明:

変数の整数型への変換

(*"Convert to Analog"ブロックを用いたＦＢＤ例 *)

(* 等価なＳＴ言語: *)

bres := ANA (true);	(* bres is 1 *)

tres := ANA (t#1s46ms);	(* tres is 1046 *)

mres := ANA ('0198');	(* mres is 198 *)

(* 等価なＩＬ言語: *)

LD	true

ANA

ST	bres

LD	t#1s46ms

ANA

ST	tres

LD	'0198'

ANA

ST	mres


REAL　（実数型変換）

引数:

IN	ブール型-整数型-

タイマ型	実数、文字列型以外

Q	実数型	0.0 ：INが FALSE / 1.0 ： INが TRUE

タイマのｍｓ数値

整数型と同じ数値

説明:

変数の実数型への変換

(*"Convert to Real" ブロックを用いたＦＢＤ例 *)

(* 等価なＳＴ言語: *)

bres := REAL (true);	(* bres is 1.0 *)

tres := REAL (t#1s46ms);	(* tres is 1046.0 *)

ares := REAL (198);	(* ares is 198.0 *)

(* 等価なＩＬ言語: *)

LD	true

REAL

ST	bres

LD	t#1s46ms

REAL

ST	tres

LD	198

REAL

ST	ares


TMR　（タイマ型変換）

引数:

IN	整数・実数型	（タイマ以外）

Q	タイマ型	INで表現されるタイマ値ｍｓ表示

INが実数の時はその整数部分

説明:

整数・実数型変数のタイマ値への変換

(*"Convert to Timer"ブロックを用いたＦＢＤ例*)

 (* 等価なＳＴ言語: *)

ares := TMR (1256);	(* ares := t#1s256ms *)

rres := TMR (1256.3);	(*rres := t#1s256ms *)

(* 等価なＩＬ言語: *)

LD	1256

TMR

ST	ares

LD	1256.3

TMR

ST	rres


MSG　（可変長文字列型変換）

引数:

IN	ブール型-

整数型-実数型	（文字列型以外）

Q	文字列型	'false' 又は 'true' ： INがブール型の時

１０進数表現：INが整数、実数型の時

説明:

変数の文字列型への変換

(*"Convert to Message" ブロックを用いたＦＢＤ例 *)

(* 等価なＳＴ言語: *)

bres := MSG (true); (* bres is 'TRUE' *)

ares := MSG (125); (* ares is '125' *)

(* 等価なＩＬ言語: *)

LD	true

MSG

ST	bres

LD	125

MSG

ST	ares


CAT

注意: この命令は拡張型命令と呼ばれています。入力数の変更は可能です。

引数:

(inputs)	文字列型	(全文字列型変数の結合、出力の可変長文字列の最大長を越えないこと)

output	文字列型	入力文字列の結合

説明:

複数文字列を１つに結合

(*"Message Concatenation" ブロックを用いたＦＢＤ例*)

(*等価なＳＴ言語: use the + operator *)

myname := ('Mr' + ' ') + 'Jones';

(* means: myname := 'Mr Jones' *)

(* 等価なＩＬ言語: *)

LD	'Mr'

ADD	' '

ADD	'Jones'

ST	myname


SYSTEM

引数:

Mode	整数型	システムパラメータの識別子、あるいはアクセスモード

Arg	整数型-タイマ型

書き込みモード時の書き込む値

Param	整数型	アクセスした結果の値

説明:

システムパラメータへのアクセス

以下に扱えるＳＹＳＴＥＭファンクションのコマンド（モード）例を示します。これらのコマンドは定義済みのワードです。

コマンド	意味
SYS_TALLOWED	許容サイクルタイムの読み出し
SYS_TCURRENT	現在サイクルタイムの読み出し
SYS_TMAXIMUM	最大サイクルタイムの読み出し
SYS_TOVERFLOW	サイクルタイムのオーバーフロー回数読み出し
SYS_TRESET	タイミングカウンタのリセット
SYS_TWRITE	サイクルタイムの変更
SYS_ERR_TEST	ランタイムエラーのチェック
SYS_ERR_READ	最新のランタイムエラーの読み出し

以下にＳＹＳＴＥＭファンクションのそれぞれのコマンドに対する引数を示します。

コマンド	引数	戻り値
SYS_TALLOWED	0	許容サイクルタイム
SYS_TCURRENT	0	現在サイクルタイム
SYS_TMAXIMUM	0	最大サイクルタイム
SYS_TOVERFLOW	0	オーバーフロー回数
SYS_TRESET	0	0
SYS_TWRITE	新ｻｲｸﾙﾀｲﾑ	書き込まれたサイクルタイム
SYS_ERR_TEST	0	エラーがなければ０
SYS_ERR_READ	0	最新エラーコード

(*"System"ブロックを用いたＦＢＤ例*)

(* 等価なＳＴ言語: *)

alarm := (SYSTEM (SYS_TOVERFLOW, 0) <> 0);

If (alarm) Then

nb_err := nb_err + 1;

rc := SYSTEM (SYS_TRESET, 0);

End_If;


OPERATE

引数:

IO	全タイプ	入出力変数

Funct	整数型	指定アクション

Arg	整数型	I/Oアクションに対する引数

Q	整数型	戻り値

説明:

I/Oチャネルへのアクセス

ＯＰＥＲＡＴＥ処理内容はＩ／Ｏドライバにより決定されます。詳しくは、対応するＩ／Ｏドライバの技術メモなどを参照願います。


標準ファンクションブロック

ＩＳａＧＲＡＦによりサポートされている標準のファンクションブロックを以下に示します。これらは、標準で備わっているためにＩＳａＧＲＡＦライブラリに登録する必要がありません。

ブール操作：

SR	セット優先双安定

RS	リセット優先双安定

R_TRIG	立ち上がり検出

F_TRIG	立ち下がり検出

SEMA	セマフォ

カウンタ：

CTU	アップカウンタ

CTD	ダウンカウンタ

CTUD	アップダウンカウンタ

タイマ：

TON	オンディレイタイマ

TOF	オフディレイタイマ

TP	パルスタイマ

整数アナログ：

CMP	完全比較

STACKINT	整数アナログのスタック

実数アナログ：

AVERAGE	平均値

HYSTER	ヒステリシス

LIM_ALRM	ヒステリシスを持った上限／下限リミット

INTEGRAL	積分

DERIVATE	微分

信号発信：

BLINK	ブール型信号のブリンク

SIG_GEN	信号発生器

注意：	新しいＣ言語ファンクションブロックが作られた場合でもＦＢＤダイアグラムからコールすることができます。


SR（セット優先双安定）

引数:

SET1	ブール型	TRUEならQ1はTRUE (セット優先)

RESET	ブール型	TRUEならQ1をFALSEにリセット

Q1	ブール型	ブール型のメモリ状態

説明:

セット優先双安定：以下のテーブル参照

Set1	Reset	Q1	result Q1
0	0	0	0
0	0	1	1
0	1	0	0
0	1	1	0
1	0	0	1
1	0	1	1
1	1	0	1
1	1	1	1
(*"SR"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語: SR1は SRブロックのインスタンス *)

SR1((auto_mode & start_cmd), stop_cmd);

command := SR1.Q1;

(* 等価なＩＬ言語: *)

LD	auto_mode

AND	start_cmd

ST	SR1.set1

LD	stop_cmd

ST	SR1.reset

CAL	SR1

LD	SR1.Q1

ST	command


RS（リセット優先双安定）

引数:

SET	ブール型	TRUEで Q1をTRUEにセット

RESET1	ブール型	TRUEで Q1をFALSEにリセット (リセット優先)

Q1	ブール型	ブール型メモリ状態

説明:

リセット優先双安定：以下のテーブル参照

Set	Reset1	Q1	result Q1
0	0	0	0
0	0	1	1
0	1	0	0
0	1	1	0
1	0	0	1
1	0	1	1
1	1	0	0
1	1	1	0

(*"RS"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語: RS1は RSブロックのインスタンス *)

RS1(start_cmd, (stop_cmd OR alarm));

command := RS1.Q1;

(* 等価なＩＬ言語: *)

LD	start_cmd

ST	RS1.set

LD	stop_cmd

OR	alarm

ST	RS1.reset1

CAL	RS1

LD	RS1.Q1

ST	command


R_TRIG（立ち上がり検出）

引数:

CLK	ブール型

Q	ブール型	TRUE ： CLKがFALSEがTRUEへ立ち上がったとき

FALSE：これ以外の場合

説明:

ブール型変数の立ち上がり検出（１サイクル前の値との比較において）

(*"R_TRIG"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語: R_TRIG1は R_TRIGブロックのインスタンス *)

R_TRIG1(cmd);

nb_edge := ANA(R_TRIG1.Q) + nb_edge;

(* 等価なＩＬ言語: *)

LD	cmd

ST	R_TRIG1.clk

CAL	R_TRIG1

LD	R_TRIG1.Q

ANA

ADD	nb_edge

ST	nb_edge


F_TRIG（立ち下がり検出）

引数:

CLK	ブール型

Q	ブール型	TRUE：CLKがTRUEからFALSEへ立ち下がったとき

FALSE：これ以外の場合

説明:

ブール型変数の立ち下がり検出（１サイクル前の値との比較において）

(*"F_TRIG"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語: F_TRIG1は F_TRIGブロックのインスタンス *)

F_TRIG1(cmd);

nb_edge := ANA(F_TRIG1.Q) + nb_edge;

(* 等価なＩＬ言語: *)

LD	cmd

ST	F_TRIG1.clk

CAL	F_TRIG1

LD	F_TRIG1.Q

ANA

ADD	nb_edge

ST	nb_edge


SEMA（セマフォ）

引数:

CLAIM	ブール型	"テストと セット" コマンド

RELEASE	ブール型	セマフォのリリース

BUSY	ブール型	セマフォの状態

説明:

(* "x" はブール型 変数で FALSEに初期値化*)

busy := x;

If claim Then

x := True;

Else

If release Then

busy := False;

x := False;

End_if;

End_if;


CTU（アップカウンタ）

引数:

CU	ブール型	カウント入力 ( CU が TRUEでカウント)

RESET	ブール型	リセットコマンド（優先)

PV	整数型	最大設定値

Q	ブール型	オーバーフロー： CV = PVでＴＲＵＥ

CV	整数型	カウンタ結果

注意：	ＣＴＵは入力ＣＵの立ち上がり、立ち下がりを検出することができません。必ず "R_TRIG" あるいは "F_TRIG" を使ってパルスカウンタを作る必要があります。

説明:

カウント数（整数型）は０から１ずつ増加

(*"CTU"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語: R_TRIG1は R_TRIGブロックのインスタンス CTU1は CTUブロックのインスタンス*)

CTU1(R_TRIG1(command),NOT(auto_mode),100);

overflow := CTU1.Q;

result := CTU1.CV;

(* 等価なＩＬ言語: *)

LD	command

ST	R_TRIG1.clk

CAL	R_TRIG1

LD	R_TRIG1.Q

ST	CTU1.cu

LDN	auto_mode

ST	CTU1.reset

LD	100

ST	CTU1.pv

CAL	CTU1

LD	CTU1.Q

ST	overflow

LD	CTU1.cv

ST	result


CTD（ダウンカウンタ）

引数:

CD	ブール型	カウンタ入力

(CD が TRUEの時カウントダウン)

LOAD	ブール型	ロードコマンド (優先)

(CV = PV で LOAD が TRUE)

PV	整数型	初期カウンタ値

Q	ブール型	終了信号： CV = 0　で TRUE

CV	整数型	カウンタ結果

注意：	ＣＴＤは入力ＣＤの立ち上がり、立ち下がりを検出することができません。必ず "R_TRIG" あるいは "F_TRIG" を使ってパルスカウンタを作る必要があります。

説明:

カウント数（整数型）はPV値から１ずつ減少

(*"CTD"ブロックを用いたＦＢＤプログラム*)

 (*等価なＳＴ言語: F_TRIG1は F_TRIGブロックのインスタンス CTD1は CTDブロックのインスタンス*)

CTD1(F_TRIG1(command),load_cmd,100);

underflow := CTD1.Q;

result := CTD1.CV;

(* 等価なＩＬ言語: *)

LD	command

ST	F_TRIG1.clk

CAL	F_TRIG1

LD	F_TRIG1.Q

ST	CTD1.cd

LD	load_cmd

ST	CTD1.load

LD	100

ST	CTD1.pv

CAL	CTD1

LD	CTD1.Q

ST	underflow

LD	CTD1.cv

ST	result


CTUD（アップダウンカウンタ）

引数:

CU	ブール型	アップカウンタ入力 (CUがTRUEでカウント)

CD	ブール型	ダウンカウンタ入力 (CDがTRUEでカウント)

RESET	ブール型	リセットコマンド (優先)

(R がTRUEの時 CV = 0)

LOAD	ブール型	ロードコマンド(LD がTRUEの時 CV = PV)

PV	整数型	最大カウンタ値

QU	ブール型	オーバーフロー： TRUE when CV = PV

QD	ブール型	アンダーフロー： TRUE when CV = 0

CV	整数型	カウンタ結果

注意：	ＣＴＵＤは入力ＣＵ、ＣＤの立ち上がり、立ち下がりを検出することができません。必ず "R_TRIG" あるいは "F_TRIG" を使ってパルスカウンタを作る必要があります。

説明:

カウント数（整数型）は０からPV値まで１ずつ増加、あるいは、

カウント数（整数型）は現在値から１ずつ減少

(*"CTUD"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語: R_TRIG1と R_TRIG2は R_TRIGブロックのインスタンス、 CTUD1は CTUDブロックのインスタンス*)

CTUD1(R_TRIG1(add_elt), R_TRIG2(sub_elt), reset_cmd, load_cmd,100);

full := CTUD1.QU;

empty := CTUD1.QD;

nb_elt := CTUD1.CV;

(* 等価なＩＬ言語: *)

LD	add_elt

ST	R_TRIG1.clk

CAL	R_TRIG1

LD	R_TRIG1.Q

ST	CTUD1.cu

LD	sub_elt

ST	R_TRIG2.clk

CAL	R_TRIG2

LD	R_TRIG2.Q

ST	CTUD1.cd

LD	load_cmd

ST	CTUD1.load

LD	100

ST	CTUD1.pv

CAL	CTUD1

LD	CTUD1.QU

ST	full

LD	CTUD1.QD

ST	empty

LD	CTUD1.CV

ST	nb_elt


TON（オンディレータイマ）

引数:

IN	ブール型	立ち上がり検出でタイマ値のインクリメント

立ち下がり検出でタイマ値停止、リセット

PT	タイマ型	タイムアップ設定値

Q	ブール型	TRUE：タイムアップ設定値が経過

ET	タイマ型	現在経過タイマ値

説明:

内部タイマ値を指定された値（PT）までインクリメント

タイムチャート:


TOF（オフディレータイマ）

引数:

IN	ブール型	立ち下がり検出でタイマ値インクリメント

立ち上がり検出でタイマ値停止、リセット

PT	タイマ型	設定タイマ値

Q	ブール型	TRUE： 設定タイマ値まで経過していない

ET	タイマ型	現在経過タイマ値

説明:

内部タイマ値を指定された値（PT）までインクリメント

タイムチャート:


TP（パルスタイマ）

引数:

IN	ブール型	立ち上がり検出でタイマ値のインクリメント（インクリメント中でなければ）。　もし、FALSE状態でタイマ値が設定タイマ値が経過したときはタイマ値をリセット。タイマがインクリメント中はINの変化は無視されます。

PT	タイマ型	設定タイマ値

Q	ブール型	TRUE：タイマがインクリメント中

ET	タイマ型	現在経過タイマ値

説明:

内部タイマ値を指定された値（PT）までインクリメント

タイムチャート:


CMP（比較）

引数:

VAL1	整数型	符号付き整数

VAL2	整数型	符号付き整数

LT	ブール型	TRUE： VAL1 < VAL2

EQ	ブール型	TRUE： VAL1 = VAL2

GT	ブール型	TRUE： VAL1 > VAL2

説明:

２つの整数型値の比較：３つの結果のいずれかをとります。（＜、＝、＞）

(*"CMP"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語: CMP1は CMPブロックのインスタンス名 *)

CMP1(level, max_level);

pump_cmd:= CMP1.LT OR CMP1.EQ;

alarm:= CMP1.GT AND NOT(manual_mode);

(* 等価なＩＬ言語: *)

LD	level

ST	CMP1.val1

LD	max_level

ST	CMP1.val2

CAL	CMP1

LD	CMP1.LT

OR	CMP1.EQ

ST	pump_cmd

LD	CMP1.GT

ANDN	manual_mode

ST	alarm


STACKINT

引数:

PUSH	ブール型	プッシュコマンド：立ち上がり検出により、IN値をスタックのトップに追加

POP	ブール型	ポップコマンド ：立ち上がり検出により、スタックのトップ（最後にプッシュされた値）を削除

R1	ブール型	スタックを空の状態にリセットする

IN	整数型	プッシュされる値

N	整数型	スタックサイズ

EMPTY	ブール型	TRUE：スタックが空の時

OFLO	ブール型	TRUE：スタックが一杯の

OUT	整数型	スタックのトップの値

説明:

整数型値のスタックの管理

ＳＴＡＣＫＩＮＴファンクションブロックはＰＵＳＨ、ＰＯＰ両入力に対して立ち上がり検出機能も含んでいます。最大のスタックサイズは１２８です。スタックサイズＮは１から１２８の値でなければなりません。

OFLO値は一旦リセットされた後にのみ有効。（即ち、R1は一度はTRUEにセットされた後にFALSEに戻っている必要があります）

(*"STACKINT" ブロックを用いたＦＢＤプログラム : error management *)

(*等価なＳＴ言語: STACKINT1は STACKINTブロックのインスタンス *)

STACKINT1(err_detect, acknoledge, manual_mode, err_code, max_err);

appli_alarm:= auto_mode AND NOT(STACKINT1.EMPTY);

err_alarm:= STACKINT1.OFLO;

last_error:= STACKINT1.OUT;

(* 等価なＩＬ言語: *)

LD	err_detect

ST	STACKINT1.push

LD	acknoledge

ST	STACKINT1.pop

LD	manual_mode

ST	STACKINT1.r1

LD	err_code

ST	STACKINT1.IN

LD	max_err

ST	STACKINT1.N

CAL	STACKINT1

LD	auto_mode

ANDN	STACKINT1.empty

ST	appli_alarm

LD	STACKINT1.OFLO

ST	err_alarm

LD	STACKINT1.OUT

ST	last_error


AVERAGE（平均値）

引数:

RUN	ブール型	TRUE：実行 / FALSE：リセット

XIN	実数型	実数値入力

N	整数型	平均を取るべきサンプル数（毎サイクル１入力）

XOUT	実数型	 XIN値のサンプル個数（N個）の平均値

説明:

毎サイクルXINを取り込み、過去のサンプル値（サンプル数 N）の平均値を求めます。最新のN個データが蓄えられています。

サンプル数Ｎは最大１２８です。"RUN"コマンドがFALSEの時（リセットモード）、出力値は入力値と同じ値になります。

蓄えられたサンプル数がNになると、最初に蓄えられた値は削除されます。

(*"AVERAGE"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:AVERAGE1はAVERAGEブロックのインスタンス *)

AVERAGE1((auto_mode & store_cmd), sensor_value, 100);

ave_value:= AVERAGE1.XOUT;

(* 等価なＩＬ言語: *)

LD	auto_mode

AND	store_cmd

ST	AVERAGE1.run

LD	sensor_value

ST	AVERAGE1.xin

LD	100

ST	AVERAGE1.N

CAL	AVERAGE1

LD	AVERAGE1.XOUT

ST	ave_value


HYSTER（ヒステリシス）

引数:

XIN1	実数型	実数

XIN2	実数型	実数（XIN1が XIN2+EPSを越えたかテストされる）

EPS	実数型	ヒステリシス値(＞０)

Q	ブール型	TRUE： XIN1が XIN2+EPSを一度は越えて、まだ、 XIN2-EPSを下回っていない時

説明:

実数値の上限値のためのヒステリシス

タイムチャート例:


LIM_ALRM

引数:

H	実数型	上限設定値

X	実数型	入力値

L	実数型	下限設定値

EPS	実数型	ヒステリシス値 ( ＞０)

QH	ブール型	上限アラーム、TRUE： Xが上限値Hを越えて、次にH-EPSを下回るまで

Q	ブール型	アラーム、TRUE： QH又は QL

QL	ブール型	下限アラーム、TRUE： Xが下限値Lを下回って、次にL+EPSを越えるまで

説明:

実数値に対する上下限に対するヒステリシス

ヒステリシスが上限、下限リミットに与えられます。上限、下限に使われるヒステリシス－デルタ量はＥＰＳパラメータの半分になります。

タイムチャート :


INTEGRAL（積分）

引数:

RUN	ブール型	モード、TRUE=積分 / FALSE=ホールド

R1	ブール型	上書きリセット

XIN	実数型	入力値

X0	実数型	初期値

CYCLE	タイマ型	サンプリング周期

Q	ブール型	R1の反転

XOUT	実数型	積分結果

説明:

実数値の積分

"CYCLE"パラメータ値がＩＳａＧＲＡＦのサイクルタイムよりも短い場合はサンプリング間隔はサイクルタイムに合わせられます。

(*"INTEGRAL"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語: INTEGRAL1はINTEGRALブロックのインスタンス *)

INTEGRAL1(manual_mode, NOT(manual_mode), sensor_value, init_value, t#100ms);

controlled_value := INTEGRAL1.XOUT;

(* 等価なＩＬ言語: *)

LD	manual_mode

ST	INTEGRAL1.run

STN	INTEGRAL1.R1

LD	sensor_value

ST	INTEGRAL1.XIN

LD	init_value

ST	INTEGRAL1.X0

LD	t#100ms

ST	INTEGRAL1.CYCLE

CAL	INTEGRAL1

LD	INTEGRAL1.XOUT

ST	controlled_value


DERIVATE（微分）

引数:

RUN	ブール型	モード，TRUE=微分実行 / FALSE=リセット

XIN	実数型	入力値

CYCLE	タイマ型	サンプリング周期

XOUT	実数型	微分結果

説明:

実数値の微分

"CYCLE"パラメータ値がＩＳａＧＲＡＦのサイクルタイムよりも短い場合はサンプリング間隔はサイクルタイムに合わせられます。

(*"DERIVATE"ブロックを用いたＦＢＤプログラム *)

(*等価なＳＴ言語: DERIVATE1は DERIVATEブロックのインスタンス *)

DERIVATE1(manual_mode, sensor_value, t#100ms);

derivated_value := DERIVATE1.XOUT;

(* 等価なＩＬ言語: *)

LD	manual_mode

ST	DERIVATE1.run

LD	sensor_value

ST	DERIVATE1.XIN

LD	t#100ms

ST	DERIVATE1.CYCLE

CAL	DERIVATE1

LD	DERIVATE1.XOUT

ST	derivated_value


BLINK（ブリンク）

引数:

RUN	ブール型	モード、TRUE=ブリンク / FALSE=出力をリセット

CYCLE	タイマ型	ブリンク周期

Q	ブール型	ブリンクの出力信号

説明:

ブリンク信号の生成

タイムチャート:


SIG_GEN

引数:

RUN	ブール型	モード TRUE=実行 / FALSE=リセット

PERIOD	タイマ型	サンプル時間（パルスの幅）

MAXIMUM	整数型	最大カウント値

PULSE	ブール型	各サンプル時間毎に反転

UP	整数型	各サンプル時間毎のアップカウンタ

END	ブール型	TRUE：アップカウンタの終了時

SINE	実数型	サイン波形信号（波形半周期はアップカウント時間）

説明:

各種信号の同時発生（パルス波形、アップカウンタ、サイン波形）

カウンタが最大値になると、０からのリスタートを行います。END信号は１PERIOD分だけTRUEとなります。

タイムチャート:


標準ファンクション

ＩＳａＧＲＡＦでサポートされている標準のファンクションを以下に示します。これらは、標準で備わっているためにＩＳａＧＲＡＦライブラリに登録する必要がありません。

計算式：

ABS	絶対値

EXPT	指数関数

LOG	常用対数

POW	Power calculation

SQRT	平方根

TRUNC	小数点以下切り捨て

三角関数：

ACOS	アークコサイン

ASIN	アークサイン

ATAN	アークタンジェント

COS	コサイン

SIN	サイン

TAN	タンジェント

レジスタコントロール：

ROL	左回転

ROR	右回転

SHL	左シフト

SHR	右シフト

データ操作：

MIN	最小値

MAX	最大値

LIMIT	上下限

MOD	剰余算

MUX4	マルチプレクサ(4入力)

MUX8	マルチプレクサ(8入力)

ODD	奇数パリティ

RAND	ランダム値

SEL	バイナリ選択

データ変換：

ASCII	アスキー変換

CHAR	キャラクタ変換

文字列操作：

DELETE	文字列削除

INSERT	文字列挿入

FIND	文字列検索

MLEN	文字列長

LEFT	左側文字列抽出

MID	文字列抽出

REPLACE	文字列置換

RIGHT	右側文字列抽出

DAY_TIME	日時

配列操作：

ARCREATE	配列作成

ARREAD	配列要素読み出し

ARWRITE	配列要素書き出し

Binary file management:

F_ROPEN	読み出しモードでファイルオープン

F_WOPEN	書き込みモードでファイルオープン

F_CLOSE	ファイルクローズ

F_EOF	ファイルの最終検出

FA_READ	ファイルからの整数値読み出し

FA_WRITE	ファイルへの整数値書き込み

FM_READ	ファイルからの文字列読み出し

FM_WRITE	ファイルへの文字列書き込み


ABS（絶対値）

引数:

IN	実数型	実数値入力

Q	実数型	絶対値

説明:

実数の絶対値の計算

(*"ABS"ブロックを用いたＦＢＤプログラム *)

(*等価なＳＴ言語: *)

over := (ABS (delta) > range);

(* 等価なＩＬ言語: *)

LD	delta

ABS

GT 	range

ST	over


EXPT（指数関数）

引数:

IN	実数型	符号付き実数（ベース部）

EXP	整数型	整数（エキスポーネント部）

Q	実数型	(IN EXP)

説明:

実数の指数関数： (base exponent) 'base' が最初の引数、 'exponent' が２番目の引数で整数

(*"EXPT"*)

(*等価なＳＴ言語:*)

tb_size := ANA (EXPT (2.0, range) );

(* 等価なＩＬ言語: *)

LD	2.0

EXPT	range

ANA

ST	tb_size


LOG（常用対数）

引数:

IN	実数型	実数値（＞０）

Q	実数型	入力値の常用対数(ベース 10)

説明:

実数入力の常用対数(ベース 10)

(*"LOG"ブロックを用いたＦＢＤプログラム *)

(*等価なＳＴ言語:*)

xpos := ABS (xval);

xlog := LOG (xpos);

(* 等価なＩＬ言語: *)

LD	xval

ABS

ST	xpos

LOG

ST	xlog


POW

引数:

IN	実数型	実数値（ベース部）

EXP	実数型	実数値（エキスポネント部）

Q	実数型	(IN EXP)

1.0 ： IN<> 0.0、 EXP= 0.0

0.0 ： IN= 0.0 、 EXP < 0.0

0.0 ： IN =0.0 、 EXP = 0.0

0.0 ： IN < 0

説明:

実数の指数関数： (base exponent) 'base' が最初の引数、 'exponent' が２番目の引数で実数

(*"POW" ブロックを用いたＦＢＤプログラム *)

(*等価なＳＴ言語:*)

result := POW (xval, power);

(* 等価なＩＬ言語: *)

LD	xval

POW	power

ST	result


SQRT（平方根）

引数:

IN	実数型	実数値（>= 0）

Q	実数型	入力値の平方根

説明:

実数入力値の平方根

(*"SQRT"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

xpos := ABS (xval);

xroot := SQRT (xpos);

(* 等価なＩＬ言語: *)

LD	xval

ABS

ST	xpos

SQRT

ST	xrout


TRUNC（小数点以下切り捨て）

引数:

IN	実数型	実数値

Q	実数型	IN>0, 整数部分

IN<0, 整数部分

説明:

実数値の整数部分

(*"TRUNC"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

result := TRUNC (+2.67) + TRUNC (-2.0891);

(* means: result := 2.0 + (-2.0) := 0.0; *)

(* 等価なＩＬ言語: *)

LD	2.67

TRUNC

ST	temporary	(* temporary result of first TRUNC *)

LD	-2.0891

TRUNC

ADD	temporary

ST	result


ACOS（アークコサイン）

引数:

IN	実数型	[-1.0 .. +1.0]

Q	実数型	入力値のアークコサイン[0.0 .. PI]

= 0.0 ：不正な入力値の時

説明:

実数値のアークコサインの計算

(*"COS" と "ACOS"ブロックを用いたＦＢＤプログラム *)

(*等価なＳＴ言語:*)

cosine := COS (angle);

result := ACOS (cosine); (* result is equal to angle *)

(* 等価なＩＬ言語: *)

LD	angle

COS

ST	cosine

ACOS

ST	result


ASIN（アークサイン）

引数:

IN	実数型	 [-1.0 .. +1.0]

Q	実数型	入力値のアークサイン [-PI/2 .. +PI/2]

= 0.0：不正な入力の時

説明:

実数入力のアークサインの計算

(*"SIN" と "ASIN"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

sine := SIN (angle);

result := ASIN (sine); (* result is equal to angle *)

(* 等価なＩＬ言語: *)

LD	angle

SIN

ST	sine

ASIN

ST	result


ATAN（アークタンジェント）

引数:

IN	実数型	実数値

Q	実数型	入力値のアークタンジェント[-PI/2 .. +PI/2]

= 0.0：不正な入力値の時

説明:

実数値のアークタンジェントの計算

(*"TAN" と "ATAN" ブロックを用いたＦＢＤプログラム *)

(*等価なＳＴ言語:*)

tangent := TAN (angle);

result := ATAN (tangent); (* result is equal to angle*)

(* 等価なＩＬ言語: *)

LD	angle

TAN

ST	tangent

ATAN

ST	result


COS（コサイン）

引数:

IN	実数型	実数値

Q	実数型	入力値のコサイン[-1.0 .. +1.0]

説明:

実数値のコサインの計算

(*"COS" と "ACOS"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

cosine := COS (angle);

result := ACOS (cosine); (* result is equal to angle *)

(* 等価なＩＬ言語: *)

LD	angle

COS

ST	cosine

ACOS

ST	result


SIN（サイン）

引数:

IN	実数型	実数値

Q	実数型	入力値のサイン[-1.0 .. +1.0]

説明:

実数値のサインの計算

(*"SIN" と "ASIN"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

sine := SIN (angle);

result := ASIN (sine); (* result is equal to angle *)

(* 等価なＩＬ言語: *)

LD	angle

SIN

ST	sine

ASIN

ST	result


TAN（タンジェント）

引数:

IN	実数型	PI/2以外

Q	実数型	入力値のタンジェント

= 1E+38 ：不正な入力に対して

説明:

実数値のタンジェントの計算

(*"TAN" と "ATAN"ブロックを用いたＦＢＤプログラム *)

(*等価なＳＴ言語:*)

tangent := TAN (angle);

result := ATAN (tangent); (* result is equal to angle*)

(* 等価なＩＬ言語: *)

LD	angle

TAN

ST	tangent

ATAN

ST	result


ROL（左回転）

引数:

IN	整数型	整数値

NbR	整数型	回転させるビット数 [1..31]

Q	整数型	左回転した結果

変化無し： nb_rotation <= 0の時

説明:

整数値のビット左回転。回転は３２ビットで行われます。

(*"ROL"ブロックを用いたＦＢＤプログラム *)

(*等価なＳＴ言語:*)

result := ROL (register, 1);

(* register = 2#0100_1101_0011_0101*)

(* result    = 2#1001_1010_0110_1010*)

(* 等価なＩＬ言語: *)

LD	register

ROL	1

ST	result


ROR（右回転）

引数:

IN	整数型	整数値

NbR	整数型	回転させるビット数 [1..31]

Q	整数型	回転した結果

変化無し： nb_rotation <= 0の時

説明:

整数値のビット右回転。回転は３２ビットで行われます。

(*"ROR" ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

result := ROR (register, 1);

(* register = 2#0100_1101_0011_0101 *)

(* result    = 2#1010_0110_1001_1010 *)

(* 等価なＩＬ言語: *)

LD	register

ROR	1

ST	result


SHL（左シフト）

引数:

IN	整数型	整数値

NbS	整数型	ビットシフト数 [1..31]

Q	整数型	左シフトした結果

変化無し： nb_shift <= 0の時

（LSBには0が挿入されます）

説明:

整数値のビット表現で左シフトを行います。３２ビット単位で行います。

(*"SHL"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

result := SHL (register,1);

(* register = 2#0100_1101_0011_0101 *)

(* result    = 2#1001_1010_0110_1010 *)

(* 等価なＩＬ言語: *)

LD	register

SHL	1

ST	result


SHR（右シフト）

引数:

IN	整数型	整数値

NbS	整数型	ビットシフト数 [1..31]

Q	整数型	右シフトした結果

変化無し： nb_shift <= 0の時

（MSBには同じ値がコピーされます）

説明:

整数値のビット表現で左シフトを行います。３２ビット単位で行います。

(*"SHR"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

result := SHR (register,1);

(* register = 2#1100_1101_0011_0101 *)

(* result    = 2#1110_0110_1001_1010 *)

(* 等価なＩＬ言語: *)

LD	register

SHR	1

ST	result


MIN（最小値）

引数:

IN1	整数型	整数値

IN2	整数型	整数値

Q	整数型	２つの入力の最小値

説明:

２つの整数値の最小値

(*"MIN" と "MAX"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

new_value := MAX (MIN (max_value, value), min_value);

(* bounds the value to the [min_value..max_value] set *)

(* 等価なＩＬ言語: *)

LD	max_value

MIN	value

MAX	min_value

ST	new_value


MAX（最大値）

引数:

IN1	整数型	整数値

IN2	整数型	整数値

Q	整数型	２つの入力の最大値

説明:

２つの整数値の最大値

(*"MIN" と "MAX" ブロックを用いたＦＢＤプログラム *)

(*等価なＳＴ言語:*)

new_value := MAX (MIN (max_value, value), min_value);

(* bounds the value to the [min_value..max_value] set *)

(* 等価なＩＬ言語: *)

LD	max_value

MIN	value

MAX	min_value

ST	new_value


LIMIT（上下限）

引数:

MIN	整数型	最小値設定値

IN	整数型	整数入力値

MAX	整数型	最大値設定値

Q	整数型	入力値：入力値が範囲内（最大値－最小値）の時

最大値：入力値が最大値を超えた時

最小値：入力値が最小値を下回った時

説明:

入力値に上下限を設けます。入力値が最大値と最小値の間の時は入力値のまま。最大値を超えたときは最大値に、最小値を下回った時は最小値になります。

(*"LIMIT"ブロックを用いたＦＢＤプログラム *)

(*等価なＳＴ言語:*)

new_value := LIMIT (min_value, value, max_value);

(* bounds the value to the [min_value..max_value] set *)

(* 等価なＩＬ言語: *)

LD	min_value

LIMIT	value, max_value

ST	new_value


MOD（剰余算）

引数:

IN	整数型	入力値

Base	整数型	入力値（＞０）

Q	整数型	剰余算の計算

-1：Base <= 0の時

説明:

入力値(IN)をベース(Base)でわり算したときの剰余

(*"MOD" ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

division_result := (value / divider); (* integer division *)

rest_of_division := MOD (value, divider); (* rest of the division *)

(* 等価なＩＬ言語: *)

LD	value

DIV	divider

ST	division_result

LD	value

MOD	divider

ST	rest_of_division


MUX4（マルチプレクサ）

引数:

SEL	整数型	セレクト入力値 [0..3]

IN1..IN4	整数型	入力値

Q	整数型	= IN1：SEL = 0のとき

= IN2：SEL = 1のとき

= IN3：SEL = 2のとき

= IN4：SEL = 3のとき

= 0   ：SELが上記以外のとき

説明:

４点入力用マルチプレクサ：４つの整数入力値の中から１つを選択

(*"MUX4"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

range := MUX4 (choice, 1, 10, 100, 1000);

(* ４つの入力から１つを選択する。choiceが1のときは  range は 10 *)

(* 等価なＩＬ言語: *)

LD	choice

MUX4	1,10,100,1000

ST	range


MUX8（マルチプレクサ）

引数:

SEL	整数型	セレクト入力値 [0..7]

IN1..IN4	整数型	入力値

Q	整数型	= IN1：SEL = 0のとき

= IN2：SEL = 1のとき

= IN3：SEL = 2のとき

.....

= IN8：SEL = 7のとき

= 0   ：SELが上記以外のとき

説明:

８点入力用マルチプレクサ：８つの整数入力値の中から１つを選択

(*"MUX8"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

range := MUX8 (choice, 1, 5, 10, 50, 100, 500, 1000, 5000);

(* ８つの入力から１つを選択する。choiceが3 のときは  range は 50 *)

(* 等価なＩＬ言語: *)

LD	choice

MUX8	1,5,10,50,100,500,1000,5000

ST	range


ODD（奇数パリティ）

引数:

IN	整数型	整数入力

Q	ブール型	TRUE：入力値が奇数の時

FALSE：入力値が偶数の時

説明:

整数入力値のパリティチェック：奇数か偶数かの判断

(*"ODD"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

If Not (ODD (value)) Then Return; End_if;

value := value + 1;

(* makes value always even *)

(* 等価なＩＬ言語: *)

LD	value

ODD

RETNC

LD	value

ADD	1

ST	value


RAND（ランダム値）

引数:

base	整数型	ランダム値の最大値

Q	整数型	ランダム値の発生 [0..base-1]

説明:

整数値で与えられた範囲でのランダム値発生

(*"RAND" ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

selected := MUX4 ( RAND (4), 1, 4, 8, 16 );

(* 発生されるランダム値によって、４つの入力からの１つを任意に選択する。

RANDで発生される数値は [0..3],結果としてMUX4の 'selected' には以下の出力がでます

1： RAND出力が0,

4： RAND出力が1

8： RAND出力が 2

16： RAND出力が 3

*)

(* 等価なＩＬ言語: *)

LD	4

RAND

MUX4	1,4,8,16

ST	selected


SEL（バイナリ選択）

引数:

SEL	ブール型	選択用

IN1, IN2	整数型	整数値

Q	整数型	= IN1： SELがFALSEのとき

= IN2： SELがTRUEのとき

説明:

バイナリ選択：２つの整数値から１つを選択

(*"SEL" ブロックを用いたＦＢＤプログラム *)

(*等価なＳＴ言語:*)

ProcCmd := SEL (AutoMode, ManuCmd, InpCmd);

(* process command selection *)

(* 等価なＩＬ言語: *)

LD	AutoMode

SEL	ManuCmd,InpCmd

ST	ProCmd


ASCII（アスキー変換）

引数:

IN	文字列型	NULL以外の文字列

Pos	整数型	文字列中の選択されたキャラクタを指し示す番号

 [1.. len] (lenはIN文字列長)

Code	整数型	選択されたキャラクタのアスキーコード

 [0 .. 255]

=0 ：Posが文字列長を越えていた場合

説明:

入力文字列の中で指定されたキャラクタに対するアスキーコード

(*"ASCII"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

FirstChr := ASCII (message, 1);

(* FirstChr is the Ascii code of the first character of the string *)

(* 等価なＩＬ言語: *)

LD	message

ASCII	1

ST	FirstChr


CHAR（キャラクタ変換）

引数:

Code	整数型	キャラクタのアスキーコード [0 .. 255]

Q	文字列型	キャラクタ文字

アスキーコード（Code）に対応するキャラクタ

Codeは256の剰余算を使います

説明:

与えられたアスキーコードに対応するキャラクタ

(*"CHAR"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

Display := CHAR ( value + 48 );

(* value is in set [0..9] *)

(* 48 is the ascii code of '0' *)

(* result is one character string from '0' to '9' *)

(* 等価なＩＬ言語: *)

LD	value

ADD	48

CHAR

ST	Display


DELETE（文字列削除）

引数:

IN	文字列型	NULL以外の文字列

NbC	整数型	文字列から削除する文字数

Pos	整数型	削除する最初の文字列の場所を示す番号

(最初の文字はPos = 1)

Q	文字列型	指定文字列が削除されて修正された文字列

=空文字列： Pos < 1

=最初の文字： Pos > INの文字列長

=最初の文字： NbC <= 0

説明:

入力文字列から指定された連続した文字列を削除

(*"DELETE"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

complete_string := 'ABCD' + 'EFGH'; (* complete_string is 'ABCDEFGH' *)

sub_string := DELETE (complete_string, 4, 3); (* sub_string is 'ABGH' *)

(* 等価なＩＬ言語: *)

LD	'ABCD'

ADD	'EFGH'

ST	complete_string

DELETE	4,3

ST 	sub_string


INSERT（文字列挿入）

引数:

IN	文字列型	元になる文字列

Str	文字列型	挿入される文字列

Pos	整数型	挿入場所を指定する番号、挿入文字列は番号の前になります	(> 1 )

Q	文字列型	文字列が挿入された結果の文字列

=空の文字列： Pos <= 0

=２つの文字列の連結：PosがIN文字列長の長さを越えた場合

説明:

元の文字列に指定された文字列を挿入して新しい文字列の生成

(*"INSERT"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

MyName := INSERT ('Mr JONES', 'Frank ', 4);

(* MyName ：'Mr Frank JONES' *)

(* 等価なＩＬ言語: *)

LD	'Mr JONES'

INSERT	'Frank',4

ST 	MyName


FIND（文字列検索）

引数:

In	文字列型	入力文字列

Pat	文字列型	検索する文字列パターン

Pos	整数型	= 0：文字列パターンが見つからないとき

= 検索する文字列が最初に見つかった位置

　(１文字目であれば 1)

　大文字・小文字区別有り

説明:

文字列の中から指定した文字列を検索して、見つかった場合はその場所を返す。

(*"FIND"ブロックを用いたＦＢＤプログラム *)

(*等価なＳＴ言語:*)

complete_string := 'ABCD' + 'EFGH'; (* complete_string is 'ABCDEFGH' *)

found := FIND (complete_string, 'CDEF'); (* found is 3 *)

(* 等価なＩＬ言語: *)

LD	'ABCD'

ADD	'EFGH'

ST	complete_string

FIND	'CDEF'

ST 	found


MLEN（文字列長）

引数:

IN	文字列型	文字列

NbC	整数型	IN文字列の文字列長

説明:

文字列の文字列数（文字列長）

(*"MLEN" ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

nbchar := MLEN (complete_string);

If (nbchar < 3) Then Return; End_if;

prefix := LEFT (complete_string, 3);

(* このプログラムは文字列から左側３文字を抽出して、prefix　文字列に入れます。もし、文字列長が３未満のときは何も行われません。 *)

(*等価なＩＬ言語: *)

LD	complete_string

MLEN

ST	nbchar

LT	3

RETC

LD	complete_string

LEFT	3

ST	prefix


LEFT（左側文字列抽出）

引数:

IN	文字列型	空でない文字列

NbC	整数型	抽出される文字数

（<= IN文字列長）

Q	文字列型	IN文字列の左側文字列（文字列の長さはNbC）

=空の文字列：NbC <= 0

=完全なIN文字列： NbC >= IN文字列長

説明:

元の文字列から指定された文字数だけ左側から抜き出す

(*"LEFT" と "RIGHT"ブロックを用いたＦＢＤプログラム *)

(*等価なＳＴ言語:*)

complete_string := RIGHT ('12345678', 4) + LEFT ('12345678', 4);

(* complete_string ： '56781234'

RIGHTで抽出される文字列は  '5678'

LEFTで抽出される文字列は '1234'

*)

(* 等価なＩＬ言語: First done is call to LEFT *)

LD	'12345678'

LEFT	4

ST	sub_string 	(* intermediate result *)

LD	'12345678'

RIGHT	4

ADD	sub_string

ST 	complete_string


MID（文字列抽出）

引数:

IN	文字列型	空でない文字列

NbC	整数型	抽出される文字数

（ <= IN文字列長）

Pos	整数型	抽出される文字列の最初の番号

 (最初の文字番号は 1)

Q	文字列型	抽出された文字列 (NbCは文字列長)

=空の文字列：指定された引数が不正のとき

説明:

元の文字列から指定された場所から指定された文字数の文字列を抽出

(*"MID"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

sub_string := MID ('abcdefgh', 2, 4);

(* sub_string ： 'de' *)

(*等価なＩＬ言語: *)

LD	'abcdefgh'

MID	2,4

ST	sub_string


REPLACE（文字列置換）

引数:

IN	文字列型	もとの文字列

Str	文字列型	挿入される文字列(NbC文字を置き換える)

NbC	整数型	消去される文字数

Pos	整数型	挿入される最初の文字の場所の指定

(最初の文字はPos = 1)

Q	文字列型	指定文字列が置換された結果の文字列

- まず、NbC文字がPosの場所から削除されます。

- 次に、挿入される文字列 Strがこの場所に挿入されます。

 = 空の文字列：Pos <= 0

=２つの文字列の結合(IN + Str)： Pos > IN文字列長

=元の文字列：NbC <= 0

説明:

元の文字列の一部分を別の文字列で置換

(*"REPLACE" ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

MyName := REPLACE ('Mr X JONES, 'Frank', 1, 4);

(* MyName is 'Mr Frank JONES' *)

(*等価なＩＬ言語: *)

LD	'Mr X JONES'

REPLACE	'Frank',1,4

ST	MyName


RIGHT（右側文字列抽出）

引数:

IN	文字列型	空でない文字列

NbC	整数型	抽出される文字数

（<= IN文字列長）

Q	文字列型	IN文字列の右側文字列（文字列の長さはNbC）

=空の文字列：NbC <= 0

=完全なIN文字列： NbC >= IN文字列長

説明:

元の文字列から指定された文字数だけ右側から抜き出す

(*"LEFT" と "RIGHT"ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

complete_string := RIGHT ('12345678', 4) + LEFT ('12345678', 4);

(* complete_string is '56781234'

RIGHTで抽出される文字列 '5678'

LEFTで抽出される文字列 '1234'

*)

(*等価なＩＬ言語: First done is call to LEFT *)

LD	'12345678'

LEFT	4

ST	sub_string 	(* intermediate result *)

LD	'12345678'

RIGHT	4

ADD	sub_string

ST 	complete_string


DAY_TIME

引数:

SEL	整数型	出力の選択

　0= 日付

　1= 時刻

　2= 曜日

Q	文字列型	日時文字列

　'YYYY/MM/DD' ： SEL = 0

　'HH:MM:SS' ： SEL = 1

　曜日  ： SEL = 2 (例： 'Monday')

説明:

文字列で日時、曜日を返す

(*"DAY_TIME" ブロックを用いたＦＢＤプログラム*)

(*等価なＳＴ言語:*)

Display := Day_Time (0) + ' ; ' + Day_Time (1);

(* Displayフォーマット: 'YYYY/MM/DD ; HH:MM:SS' *)

(*等価なＩＬ言語: First done is call to day_time(1) *)

LD	1

DAY_TIME

ST	hour_str 	(* intermediate result *)

LD	0

DAY_TIME

ADD	' ; '

ADD	hour_str

ST 	Display


ARCREATE（配列作成）

引数:

ID	整数型	配列識別子　(0 ～15)

Size	整数型	配列の要素数

ok	整数型	実行結果 :

=1　正常に配列が作成されたとき

=2　不正な配列識別子、あるいは、既に配列作成済みのとき

=3　不正な配列要素数

=4　メモリ不足

説明:

整数の配列を作成

注意：	アプリケーションには最大１６の配列（ａｒｒａｙ）が定義できます。配列の要素は整数型値です。配列サイズが残りメモリ量に近い場合はシステムエラーを引き起こすことも考えられます。

(* FBD program creating an array of integers *)

(*等価なＳＴ言語:*)

array_error := (ARCREATE (ident, 16) <> 1));

(*等価なＩＬ言語:*)

LD	ident

ARCREATE	16

NE 	1

ST	array_error


ARREAD（配列要素の読み出し）

引数:

ID	整数型	配列識別子 (0 ～ 15)

Pos	整数型	配列内の要素のポジション

(0 ～ size-1)

value	整数型	要素の値

= 0 (引数が不正の時)

説明:

整数値の配列の中から指定した要素を読み出す

(* 配列を扱うＦＢＤプログラム*)

(*等価なＳＴ言語:*)

If (array_error) Then Return; End_if;

read_value := ARREAD (ident, index);

(* array_errorは ARCREATEコールからかえります *)

(*等価なＩＬ言語:*)

LD	array_error

RETC

LD	ident

ARREAD	index

ST	read_value


ARWRITE（配列要素の書き込み）

引数:

ID	整数型	配列識別子(0 ～ 15)

Pos	整数型	配列の要素のポジション

(0 ～ size-1)

IN	整数型	書き込まれる要素値

ok	整数型	実行結果

=1  書き込みが正常終了

=2  不正な配列識別子

=3  不正なポジション指定

説明:

整数値の配列の要素に値の書き込み

(* 配列を扱うＦＢＤプログラム*)

(*等価なＳＴ言語:*)

If (array_error) Then Return; End_if;

write_status := ARWRITE (Ident, Index, value);

(* array_errorはARCREATEコールからかえります *)

(*等価なＩＬ言語:*)

LD	array_error

RETC

LD	ident

ARWRITE	index,value

ST	write_status


F_ROPEN

引数：:

Path	文字列型	ファイル名

このファイル名にはパス名を示す記号（/  \）を含みます。

ID	整数型	ファイル番号

= 0エラー発生時（ファイルが見つからなかったなど）

説明：:

バイナリファイルをリードモードで開きます。FX_READ 、 F_CLOSEがオープン後に使われます。このファンクションはISaGRAFシミュレータ機能には含まれません。

(* ファイル管理用のＦＢＤプログラム*)

(* 等価なＳＴ言語:: *)

file_id := F_ROPEN('c:\data \data.bin');

error := (file_id=0);

(* 等価なＩＬ言語:: *)

LD	'c:\data\data.bin'

F_ROPEN

ST	file_id

EQ	0

ST	error


F_WOPEN

引数：:

Path	文字列型	ファイル名

このファイル名にはパス名を示す記号（/  \）を含みます。

ID	整数型	ファイル番号

= 0エラー発生時（ファイルが見つからなかったなど）

説明：:

バイナリファイルをライトモードで開きます。FX_READ 、 F_CLOSEがオープン後に使われます。このファンクションはISaGRAFシミュレータ機能には含まれません。

(* ファイル管理用のＦＢＤプログラム*)

(* 等価なＳＴ言語:: *)

file_id := F_WOPEN('c:\data \data.bin');

error := (file_id=0);

(* 等価なＩＬ言語:: *)

LD	'c:\data\data.bin'

F_WOPEN

ST	file_id

EQ	0

ST	error


F_CLOSE

引数：:

ID	整数型	ファイル番号（F_ROPEN、F_WOPEN戻り値）

ok	ブール型	戻り値

=TRUE：  正常にクローズ

=FALSE： エラー発生

説明：:

F_WOPEN 、 F_ROPENで開かれたバイナリファイルをクローズします。このファンクションはISaGRAFシミュレータ機能には含まれません。

(* ファイル管理用のＦＢＤプログラム*)

(* 等価なＳＴ言語:: *)

file_id := F_ROPEN('data.bin');

ok := F_CLOSE(file_id);

(* 等価なＩＬ言語:: *)

LD	'data.bin'

F_ROPEN

ST	file_id

F_CLOSE	(* file_id is already in the current IL result *)

ST 	ok


F_EOF

引数：:

ID	整数型	ファイル番号（F_ROPEN 、 F_WOPENの戻り値）

ok	ブール型	ファイルのエンドを示す

=TRUE：ファイル読み出し、書き込みファンクションでファイルの最後に到達したとき

（FM_READで読み出された最後の内容は、最後の文字がEOFでなければ、正しくない可能性があります。

説明：:

ファイルの最後に到達したかチェックします。ISaGRAFシミュレータには機能が含まれていません。

(* ファイル管理用のＦＢＤプログラム*)

(* 等価なＳＴ言語:: *)

file_id := F_ROPEN('data.bin');

WHILE not(F_EOF(file_id))

VAL := FA_READ(file_id);

END_WHILE;

MESSAGE := 'last val = ' + msg(VAL);

ok := F_CLOSE(file_id);

(* 等価なＩＬ言語:: *)

LD	'data.bin'

F_ROPEN

ST	file_id

LD 	file_id

F_EOF

JMPC	END_OF_FILE

NOT_EOF:	LD 	file_id

FA_READ

ST	VAL

LD 	file_id

F_EOF

JMPNC	NOT_EOF 	(* if not eof, go on reading *)

END_OF_FILE:	LD	VAL

MSG

ST	val_msg	(* conversion of VAL into a message *)

LD	'last val = '

ADD	val_msg

ST	MESSAGE

LD 	file_id

F_CLOSE

ST	ok


FA_READ

引数：:

ID	整数型	ファイル番号（F_ROPENの戻り値）.

Q	整数型	ファイルから読み出された整数値

説明：:

バイナリファイルから整数値を読み出します。 F_ROPEN 、 F_CLOSEと一緒に使います。前回の場所からシーケンシャル的にファイルにアクセスします。 F_ROPENコールの後の最初のコールではファイルの４バイトが読み出されます。

毎回のコールで読み出している場所をスタックにプッシュします。

ファイルの最後に到達したかチェックするために F_EOFを使います。

このファンクションはISaGRAFシミュレータには含まれません。

(* ファイル管理用のＦＢＤプログラム*)

(* 等価なＳＴ言語:: *)

file_id := F_ROPEN('voltramp.bin');

vstart := FA_READ(file_id);

vend := FA_READ(file_id);

vinc := FA_READ(file_id);

delta_tim := tmr(FA_READ(file_id));

ok := F_CLOSE(file_id);

(* 等価なＩＬ言語:: *)

LD	'voltramp.bin'

F_ROPEN

ST	file_id

FA_READ	(* read vstart *)

ST	vstart

LD 	file_id

FA_READ	(* read vend *)

ST	vend

LD 	file_id

FA_READ	(* read vinc *)

ST	vinc

LD 	file_id

FA_READ	(* read delta_tim *)

TMR	(* conversion into a timer *)

ST	delta_tim

LD 	file_id

F_CLOSE

ST	ok


FA_WRITE

引数：:

ID	整数型	ファイル番号（F_WOPENの戻り値）

IN	整数型	ファイルに書き込まれる整数値

OK	ブール型	実行結果

=TRUE：正常終了

説明：:

バイナリファイルに整数値を書き込みます。 F_WOPEN 、 F_CLOSEと一緒に使います。前回の場所からシーケンシャル的にファイルにアクセスします。 F_WOPENコールの後の最初のコールではファイルの４バイトを書き込みます。

毎回のコールで読み出している場所をスタックにプッシュします。

ファイルの最後に到達したかチェックするために F_EOFを使います。

このファンクションはISaGRAFシミュレータには含まれません。

(* ＦＢＤプログラム例 *)

(* 等価なＳＴ言語:: *)

file_id := F_WOPEN('voltramp.bin');

nb_written  := 0;

nb_written := nb_written + ana(FA_WRITE(file_id,vstart));

nb_written := nb_written + ana(FA_WRITE(file_id,vend));

nb_written := nb_written + ana(FA_WRITE(file_id,vinc));

nb_written := nb_written + ana(FA_WRITE(file_id,ana(delta_tim)));

ok := F_CLOSE(file_id);

IF ( nb_written <> 4) THEN

ERROR := ERR_FILE;

END_IF;

(* 等価なＩＬ言語:: *)

LD	'voltramp.bin'

F_ROPEN

ST	file_id

LD	0

ST	nb_written

LD 	file_id	(* write vstart *)

FA_WRITE	vstart

ANA

ADD	nb_written

ST	nb_written

LD 	file_id	(* write vend *)

FA_WRITE	vend

ANA

ADD	nb_written

ST	nb_written

LD 	file_id	(* write vinc *)

FA_WRITE	vinc

ANA

ADD	nb_written

LD	(* write delta_tim *)

ANA	(* convert it to an integer *)

ST	ana_delta_tim

LD 	file_id

FA_WRITE	ana_delta_tim

ANA

ADD	nb_written

ST	nb_written

F_CLOSE

ST	ok

LD	nb_written

EQ	4

RETC	(* return if equal 4 *)

LD	ERR_FILE	(* else error *)

ST	ERROR


FM_READ

引数：:

ID	整数型	ファイル番号（F_ROPENの戻り値）.

Q	文字列型	ファイルから読み出された文字列

説明：:

バイナリファイルからの文字列の読み出し。 F_ROPEN 、F_CLOSEと一緒に使います。

前回の場所からシーケンシャル的にファイルにアクセスします。 F_ROPENコールの後の最初のコールでは指定場所から、最初の文字列が読み出されます。

毎回のコールで読み出している場所をスタックにプッシュします。

文字列の最後にはNULL(0)、エンドオブライン ('\n') 又は、改行('\r')がついています。

ファイルの最後に到達したかチェックするために F_EOFを使います。

このファンクションはISaGRAFシミュレータには含まれません。

(* ファイル管理用のＦＢＤプログラム*)

(* 等価なＳＴ言語:: *)

file_id := F_ROPEN('voltramp.bin');

status1 := FM_READ(file_id);

status2 := FM_READ(file_id);

IF (F_EOF(file_id)) THEN

ERROR := ERR_FILE;

unused_eof_mes := FM_READ(file_id);

END_IF;

ok := F_CLOSE(file_id);

(* 等価なＩＬ言語:: *)

LD	'voltramp.bin'

F_ROPEN

ST	file_id

FM_READ	(* read status1 *)

ST	status1

LD 	file_id

FM_READ	(* read status2 *)

ST	status2

LD 	file_id

F_EOF

JMPNC	CLOSE_FILE (* if end of file jump not done *)

LD	ERR_FILE

ST	ERROR

LD 	file_id

FM_READ	(* read unused_eof_mes *)

ST	unused_eof_mes

CLOSE_FILE	LD 	file_id

F_CLOSE

ST	ok


FM_WRITE

引数：:

ID	整数型	ファイル番号（F_WOPENの戻り値）

IN	文字列型	ファイルに書き込む文字列

ok	ブール型	実行結果

=TRUE：正常終了

説明：:

バイナリファイルへ文字列の書き込み。 F_WOPEN 、F_CLOSEと一緒に使います。

文字列の最後はNULL(0)として書き込みます。

前回の場所からシーケンシャル的にファイルにアクセスします。 F_WOPENコールの後の最初のコールでは指定場所から、最初の文字列をファイルに書き込みます。

毎回のコールで読み出している場所をスタックにプッシュします。

このファンクションはISaGRAFシミュレータには含まれません。

(* ファイル管理用のＦＢＤプログラム*)

(* 等価なＳＴ言語:: *)

file_id := F_WOPEN('trace.txt');

ok := FM_WRITE(file_id,'First message');

ok := FM_WRITE(file_id,'Last message');

ok := F_CLOSE(file_id);

(* 等価なＩＬ言語:: *)

LD	'trace.txt'

F_WOPEN

ST	file_id

FM_WRITE	'First message'	(* write first msg *)

ST	ok

LD 	file_id

FM_WRITE	'Last message'	(* write second msg *)

ST	ok

LD 	file_id

F_CLOSE

ST	ok


アルファベット順

-	ARWRITE	F_ROPEN	MSG	SHR
& (AND)	ASCII	F_TRIG	MUX4	SIG_GEN
*	ASIN	F_WOPEN	MUX8	SIN
/	ATAN	FA_READ	Neg	SQRT
+	AVERAGE	FA_WRITE	NOT_MASK	SR
<	BLINK	FIND	ODD	STACKINT
<=	BOO	FM_READ	OPERATE	SYSTEM
<>	CAT	FM_WRITE	OR_MASK	TAN
=	CHAR	HYSTER	POW	TMR
=1 (XOR)	CMP	INSERT	R_TRIG	TOF
>	COS	INTEGRAL	RAND	TON
>=	CTD	LEFT	REAL	TP
>=1 (OR)	CTU	LIM_ALRM	REPLACE	TRUNC
1 gain	CTUD	LIMIT	RIGHT	XOR_MASK
ABS	DAY_TIME	LOG	ROL
ACOS	DELETE	MAX	ROR
ANA	DERIVATE	MID	RS
AND_MASK	EXPT	MIN	SEL
ARCREATE	F_CLOSE	MLEN	SEMA
ARREAD	F_EOF	MOD	SHL


 FC言語

フローチャート(FC) はシーケンシャルオペレーションを記述するグラフィカル言語です。フローチャートはアクションとテストと呼ばれるブロックから成り立っていて、これらのブロック間をリンクで接続しています。アクションとテストの内容はST, IL, LDのいずれかの言語で記述することができます。ファンクションやファンクションブロックセクションからプログラムを読み出すことも可能です。フローチャートは別のフローチャートを読み出すことができます。この際、読み出されるフローチャートをFCサブプログラムと呼びます。

FC基本要素

FC構造サンプル

FC実行ルール

FC文法チェック


FC基本要素

フローチャート言語は以下の基本エレメントから成り立っています。

FCチャートの開始

FCチャートの終了

FCフローリンク

FCアクション

FCテスト

FCサブプログラム

FC I/O操作ブロック

FCコネクタ

FCコメント


フローチャートの開始

"Begin"シンボルはフローチャートプログラムの開始として必ず必要となります。フローチャートが起動された時の最初の状態（最初のサイクル）を持ちます。以下に"Begin"シンボルを示します。

"Begin"シンボルは必ず下部よりチャート内の別のオブジェクトに接続されます。もし、この接続が行われていないようなフローチャートは実行されません。


フローチャートの終了

"End"シンボルはフローチャートに必ず必要になります。"End"シンボルは通常、チャート内の別のシンボルから上部へ接続されますが、他のオブジェクトから接続されない場合もあります。この場合はこのフローチャートは常にループの処理を行っていることになります。ただし、このような場合でも"End"シンボルはチャートの下部に表現されています。"End"シンボルはチャートの処理の終了を示します。このシンボルが処理されるとチャートの終了状態を持つことになります。以下に"End"シンボルを示します。


フローリンク

フローリンクはチャート内の２つのポイント間の処理の流れを意味します。フローリンクは必ず矢印を持ちます。以下にフローリンクを示します。

２本のフローリンクは同一のソースオブジェクトから引き出すことはできません。


フローチャートアクション

アクションシンボルは実行されるアクションを示します。アクションは番号と名前で識別されます。以下にアクションシンボルを示します。

チャート内で２つの異なるアクションシンボルが同一の名前または番号を持つことはできません。アクションのプログラム記述にはST, LD，ILのいずれかの言語が使えます。アクションシンボルは必ず１本のリンクが入り、１本のリンクが出て行きます。


フローチャートテスト

テスト（条件）シンボルはブール型のテストを行います。テストシンボルは番号と名前によって識別されます。テストのプログラムはST, LD, ILのいずれかの言語で記述されます。テストの評価内容によって、フローがYES或いはNOのパスへ流れます。以下にテストのシンボルの例を示します。

２つの異なるテストシンボルが同一の番号または名前を持つことはできません。テストの内容は以下のいずれかの言語で記述されます。

- ST言語による表現式

- 一行のラングで表現されるLD（この際、コイルには変数名を割り当てる必要はありません）

- 複数行からなるIL言語、ILレジスタの現在値がテスト（条件）の結果に使われます

ST言語でプログラムされた時は、表現式の最後にセミコロン（；）をつけることもできますが、つけなくてもエラーにはなりません。評価の結果と流れは以下のようになります。

- 0 或いは FALSE ： NO

- 1 或いは TRUE ：YES

テストシンボルは必ず一つのリンクが入り、YES、NOの２つのリンクが出て行きます。２つのリンクは必ず別のオブジェクトに接続されていなければなりません。


FCサブプログラム

フローチャートプログラムでは階層的にプログラムを構築することができます。各フローチャートプログラムは別のフローチャートを読み出すことができます。読み出されるプログラムはチャイルドプログラム、或いは、FCサブプログラムと呼ばれます。FCサブプログラムを読み出すプログラムは親プログラムと呼ばれます。FCサブプログラムは最大でも一つの親プログラムしか持つことができません。FCプログラムは以下のように階層構造を持つことができます。

フローチャート内でのサブプログラムシンボルはFCサブプログラムを読み出します。FCサブプログラムが実行されている時はこの処理が終了するまでの間、親プログラムの実行はサスペンドされます。FCサブプログラムは番号と名前によって識別されます。以下にFCサブプログラムを読み出すサブプログラムシンボルを示します。

同一のチャート内で２つの異なるサブプログラムは同一の番号を持つことはできません。FCプログラムの階層構造では以下のルールが用いられます。

- FCプログラムで親プログラムを持たないFCプログラムはメインFCプログラムと呼ばれます。

- メインFCプログラムはアプリケーションが実行した時に起動されます。（Beginセクションの実行の後で）

- プログラムは複数のFCサブプログラムを持つことができます。

- FCサブプログラムは１つの親プログラムしか持つことができません。

- FCサブプログラムは親プログラムからのみ読み出されます。

- FCサブプログラム間同士での読み出しはできません。

同一のFCサブプログラムが親プログラムのチャートの中から複数回にわたり読み出されることもあります。サブプログラムシンボルはチャート内のアクションシンボルと同様にフローリンクの接続ルールが適用されます。


FC I/O操作ブロック

FC I/O操作ブロックは、アクションシンボルと同様に扱われます。ただし、通常のアクションシンボルと形状が異なるために、プログラム内での処理を後で読みやすくするために区別して使うこともできます。以下にFC I/O操作ブロックの例を示します。

I/O操作ブロックのプログラムはアクションシンボルと同様に、ST、LD、ILのいずれかの言語で記述されます。

注意： I/O操作と呼ばれるブロックでは実行プラットフォームに依存する記述をするケースがあるために、このような名称がつけられています。特に、このブロックでI/O処理を行うという意味ではありません。


FCコネクタ

コネクタはチャート内の２つのポイントを直接フローリンクで接続する代わりに扱えるリンクです。コネクタは円形で表示され流れのソースから接続されます。リンクの先はチャート内のオブジェクトの番号と名前によって指定されます。以下にコネクタの例を示します。


FCコメント

コメントシンボルはフローチャートの実行とはまったく関連がありません。チャート内の空白の場所に配置することができます。プログラムの解説に使うことができます。以下にコメントシンボルの例を示します。


FC組み合わせ構造体の例

ここではフローチャートの組み合わせ構造体の例を示します。これらは基本オブジェクト（テスト、アクション、リンク）の組み合わせから成り立っています。

	IF / THEN / ELSE (1)  "THEN" アクションを挿入します。 (2)  "ELSE" アクションを挿入します。
	REPEAT / UNTIL (3) リピートするアクションを挿入します。
	WHILE / DO (4) リピートするアクションを挿入します。


FC実行ルール
FCの実行ルール

フローチャートのターゲット上での実行ルールは以下のように説明できます。

- Beginシンボルはターゲット上での最初の１サイクルを使います。

- Endシンボルはターゲット上での最後の１サイクルを使い、チャートの実行が終了します。 このシンボルに到達した次のターゲット上でのサイクルではチャート上のいかなるアクションも実行されません。

- BeginとEndシンボルの中間のターゲット上でサイクルではテストやアクションシンボルが実行されますが、１サイクル内で実行される処理はSFCと異なり、１つのテストやアクションブロックの実行に限られることはありません。処理の判断が成立している限り実行が続き、一度実行した処理を再度繰り返すようなループを検出するとサイクルを抜け出すことになります。具体的にはSFCで１ステップ内で記述されなければならない処理でもFCでは複数のテストやアクションシンボルで記述が可能になります。

- 実行されているテストやアクションシンボルはシミュレーションやデバッグ中にはSFCの場合と同様に色が付き他のシンボルと区別することができます。

注意: SFCが状態遷移を表現するのに対して、FCは判断フローを表現することになります。プログラムの際に実行ルール（アルゴリズム）を考慮した上でプログラムすることが必要です。ISaGRAFサンプルプロジェクトでSFC、FCの比較を行ってそれぞれの特徴を生かしたプログラムを行うことが必要となります。


FC文法チェック

レベル２プログラムを記述しているST,LD、ILプログラムの文法チェックとは別に、以下のようなフローチャート自体の文法チェックが存在します。

メイン文法チェック：

- 全てのシンボルにおける接続ポイントは必ずフローリンクで接続されていなければなりません。（但し、Endシンボルのみはこの接続を省略することができます。）

- 他のシンボルと独立したシンボルやチャートは存在するすることはできません。

- コネクタシンボルでの接続先に存在中の正しいオブジェクトが指定されていなければなりません。

その他のルール：

- 空のアクション（即ち、レベル２プログラムが存在しないアクションシンボル）は実行時には何も処理が行われません。

- 空のテスト（即ち、レベル２プログラムが存在しないテストシンボル）は実行時には常にTRUEとみなされます。