 標準運算元、功能方塊及函數

標準運算元

標準的功能方塊

標準的函數

依字母順序排列


標準運算元

下列是IEC語言中的標準運算元。

資料處理：

1 gain	指定

Neg	類比值反相

布林運算元：

& (AND)	布林且 (boolean AND)

>=1 (OR)	布林或 (boolean OR)

=1 (XOR)	布林互斥或 (exclusive OR)

算術運算元：

 + 	加法

 - 	減法

 * 	乘法

 / 	除法

邏輯運算元：

AND_MASK	類比逐位元且遮罩 (AND mask)

OR_MASK	類比逐位元或遮罩 (OR mask)

XOR_MASK	類比逐位元互斥或遮罩 (Exclusive OR mask)

NOT_MASK	逐位元反相

比較測試：

 < 	小於

 <= 	小於等於

 > 	大於

 >= 	大於等於

 = 	等於

 <> 	不等於

資料轉換：

BOO	轉換成布林

ANA	轉換成整數類比

REAL	轉換成實數類比

TMR	轉換成時間

MSG	轉換成訊息

其他：

CAT	字串的連結

SYSTEM	直接操作

OPERATE	處理I/O接點


1 gain

引數：

IN	任何形態

Q	任何形態

描述﹕

將一變數指定到另一個變數。

此方塊對於圖形輸入與圖形輸出間的直接連結來說是非常有用的。它也可以用來反轉一個用線連結到圖形輸出的狀態（使用布林的反相線）。

(* FBD範例：使用指定方塊 *)

(* ST相等式：*)

ao23 := ai10;

bo100 := NOT (bi1 AND bi2);

(* IL相等式：*)

LD	ai10

ST 	ao23

LD	bi1

AND	bi2

STN	bo100


NEG

引數：

IN	整數，實數	輸入與輸出必須是相同的格式

Q	整數，實數

描述﹕

將變數設定成反相 (正變負，負變正)。

(* FBD範例：使用反相方塊 *)

(* ST相等式：*)

ao23 := - (ai10);

ro100 := - (ri1 + ri2);

(* IL相等式：*)

LD	ai10

MUL	-1

ST 	ao23

LD	ri1

ADD	ri2

MUL	-1.0

ST	ro100


& AND

註﹕此運算元輸入的數量可以擴展到多於兩個。

引數：

(輸入)	布林

輸出	布林	輸入的布林且 (boolean AND) 運算

描述﹕

將兩個或多於兩個的條件做布林且 (AND)。

(* FBD範例：使用 "AND" 方塊 *)

(* ST相等式：*)

bo10 := bi101 AND NOT (bi102);

bo5 := (bi51 AND bi52) AND bi53;

(* IL相等式：*)

LD	bi101	(* 目前結果 := bi101 *)

ANDN	bi102	(* 目前結果 := bi101 AND not(bi102) *)

ST	bo10	(* bo10 := 目前結果 *)

LD	bi51	(* 目前結果 := bi51 *)

&	bi52	(* 目前結果 := bi51 AND bi52 *)

&	bi53	(* 目前結果 := (bi51 AND bi52) AND bi53 *)

ST	bo5	(* bo5 := 目前結果 *)


>=1 OR

註﹕此運算元輸入的數量可以擴展到多於兩個。

引數：

(輸入)	布林

輸出	布林	輸入條件的布林或 (OR)

描述﹕

將兩個或多於兩個的條件做布林或 (OR)。

(* FBD範例：使用 "OR" 方塊 *)

(* ST相等式：*)

bo10 := bi101 OR NOT (bi102);

bo5 := (bi51 OR bi52) OR bi53;

(* IL相等式：*)

LD	bi101

ORN	bi102

ST	bo10

LD	bi51

OR	bi52

OR	bi53

ST	bo5


=1 XOR

引數：

IN1	布林

IN2	布林

Q	布林	兩個輸入條件的布林互斥或 (XOR)

描述﹕

將兩個條件做布林互斥或 (XOR)。

(* FBD範例：使用 "XOR" 方塊 *)

(* ST相等式：*)

bo10 := bi101 XOR NOT (bi102);

bo5 := (bi51 XOR bi52) XOR bi53;

(* IL相等式：*)

LD	bi101

XORN	bi102

ST	bo10

LD	bi51

XOR	bi52

XOR	bi53

ST	bo5


+

註﹕此運算元輸入的數量可以擴展到多於兩個。

引數：

(輸入)	整數，實數	可以是整數或實數

(所有的輸入必須有相同的格式)

輸出	整數，實數	輸入條件相加

描述﹕

將兩個或多於兩個的類比變數加起來。

(* FBD範例：使用加法方塊 *)

(* ST相等式：*)

ao10 := ai101 + ai102;

ao5 := (ai51 + ai52) + ai53;

(* IL相等式：*)

LD	ai101

ADD	ai102

ST	ao10

LD	ai51

ADD	ai52

ADD	ai53

ST	ao5


-

引數：

IN1	整數，實數	可以是整數或實數

IN2	整數，實數	(IN1與IN2必須有相同的格式)

Q	整數，實數	相減 (IN1-IN2)

描述﹕

將兩個類比變數相減 (第一引數減第二引數)。

(* FBD範例：使用減法方塊 *)

(* ST相等式：*)

ao10 := ai101 - ai102;

ao5 := (ai51 - 1) - ai53;

(* IL相等式：*)

LD	ai101

SUB	ai102

ST	ao10

LD	ai51

SUB	1

SUB	ai53

ST	ao5


*

註﹕此運算元輸入的數量可以擴展到多於兩個。

引數：

(輸入)	整數，實數	可以是整數或實數

(所有的輸入必須有相同的格式)

輸出	整數，實數	輸入條件的相乘

描述﹕

將兩個或多於兩個的類比變數相乘。

(* FBD範例：使用乘法方塊 *)

(* ST相等式：*)

ao10 := ai101 * ai102;

ao5 := (ai51 * ai52) * ai53;

(* IL相等式：*)

LD	ai101

MUL	ai102

ST	ao10

LD	ai51

MUL	ai52

MUL	ai53

ST	ao5


/

引數：

IN1	整數，實數	可以是整數或實數

IN2	整數，實數	非零類比數值

(IN1與IN2必須是相同的格式)

Q	整數，實數	IN1除以IN2整數或實數之值

描述﹕

將兩個類比變數相除 (第一個引數被第二個引數除)。

(* FBD範例：使用除法方塊 *)

(* ST相等式：*)

ao10 := ai101 / ai102;

ao5 := (ai5 / 2) / ai53;

(* IL相等式：*)

LD	ai101

DIV	ai102

ST	ao10

LD	ai51

DIV	2

DIV	ai53

ST	ao5


AND_MASK

引數：

IN	整數	必須是整數的格式

MSK	整數	必須是整數的格式

Q	整數	IN與MSK間做位元對位元的邏輯且 (AND)

描述﹕

整數類比值位元對位元且遮罩。

(* FBD範例：使用類比AND_MASK方塊 *)

(* ST相等式：*)

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

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

(* IL相等式：*)

LD	xvalue

AND_MASK	1

ST	parity

LD	16#abc

AND_MASK	16#f0f

ST	result


OR_MASK

引數：

IN	整數	必須是整數的格式

MSK	整數	必須是整數的格式

Q	整數	IN與MSK間做位元對位元的邏輯或 (OR)

描述﹕

整數類比值位元對位元或遮罩。

(* FBD範例：使用類比OR_MASK方塊 *)

(* ST相等式：*)

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

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

(* IL相等式：*)

LD	xvalue

OR_MASK	1

ST	is_odd

LD	16#abc

OR_MASK	16#f0f

ST	result


XOR_MASK

引數：

IN	整數	必須是整數的格式

MSK	整數	必須是整數的格式

Q	整數	IN與MSK間做位元對位元的邏輯互斥或 (XOR)

描述﹕

整數類比值位元對位元互斥或遮罩。

(* FBD範例：使用類比XOR_MASK方塊 *)

(* ST相等式：*)

crc32 := XOR_MASK (prevcrc, nextc);

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

(* IL相等式：*)

LD	prevcrc

XOR_MASK	nextc

ST	crc32

LD	16#012

XOR_MASK	16#011

ST	result


NOT_MASK

引數：

IN	整數	必須是整數的格式

Q	整數	對IN的32位元做位元對位元的補數運算

描述﹕

整數類比值位元對位元補數運算遮罩。

(* FBD範例：使用類比NOT_MASK方塊 *)

(* ST相等式：*)

result := NOT_MASK (16#1234);

(* result is 16#FFFF_EDCB *)

(* IL相等式：*)

LD	16#1234

NOT_MASK

ST	result


<

引數：

IN1	整數，實數，計時器，訊息

IN2	整數，實數，計時器，訊息	IN1與IN2必須是相同的格式

Q	布林	如果IN1 < IN2則為真

描述﹕

測試是否一值小於另一值 (對類比，計時器或訊息變數)。

(* FBD範例：使用 "小於" 方塊 *)

(* ST相等式：*)

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

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

(* IL相等式：*)

LD	10

LT	25

ST	aresult

LD	'z'

LT	'B'

ST	mresult


<=

引數：

IN1	整數，實數，訊息

IN2	整數，實數，訊息	IN1與IN2必須是相同的格式

Q	布林	如果IN1 <= IN2則為真

描述﹕

測試是否一值小於或等於另一值 (對類比或訊息變數)。

(* FBD範例：使用 "小於或等於" 方塊 *)

(* ST相等式：*)

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

mresult := ('ab' <= 'ab'); (* mresult is TRUE *)

(* IL相等式：*)

LD	10

LE	25

ST	aresult

LD	'ab'

LE	'ab'

ST	mresult


>

引數：

IN1	整數，實數，計時器，訊息

IN2	整數，實數，計時器，訊息	IN1與IN2必須是相同的格式

Q	布林	如果IN1 > IN2則為真

描述﹕

測試是否一值大於另一值 (對類比、計時器或訊息變數)。

(* FBD範例：使用 "大於" 方塊 *)

(* ST相等式：*)

aresult := (10 > 25); (* aresult is FALSE *)

mresult := ('ab' > 'a'); (* mresult is TRUE *)

(* IL相等式：*)

LD	10

GT	25

ST	aresult

LD	'ab'

GT	'a'

ST	mresult


>=

引數：

IN1	整數，實數，訊息

IN2	整數，實數，訊息	IN1與IN2必須是相同的格式

Q	布林	如果IN1 >= IN2則為真

描述﹕

測試是否一值大於或等於另一值 (對類比或訊息變數)。

(* FBD範例：使用 "大於或等於" 方塊 *)

(* ST相等式：*)

aresult := (10 >= 25); (* aresult is FALSE *)

mresult := ('ab' >= 'ab'); (* mresult is TRUE *)

(* IL相等式：*)

LD	10

GE	25

ST	aresult

LD	'ab'

GE	'ab'

ST	mresult


=

引數：

IN1	整數，實數，訊息

IN2	整數，實數，訊息	IN1與IN2必須是相同的格式

Q	布林	如果IN1 = IN2則為真

描述﹕

測試是否一值等於另一值 (對類比或訊息變數)。

(* FBD範例：使用 "等於" 方塊 *)

(* ST相等式：*)

aresult := (10 = 25); (* aresult is FALSE *)

mresult := ('ab' = 'ab'); (* mresult is TRUE *)

(* IL相等式：*)

LD	10

EQ	25

ST	aresult

LD	'ab'

EQ	'ab'

ST	mresult


<>

引數：

IN1	整數，實數，訊息

IN2	整數，實數，訊息	IN1與IN2必須是相同的格式

Q	布林	如果IN1 <> IN2則為真

描述﹕

測試是否一值不等於另一值 (對類比或訊息變數)。

(* FBD範例：使用 "不等於" 方塊 *)

(* ST相等式：*)

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

mresult := ('ab' <> 'ab'); (* mresult is FALSE *)

(* IL相等式：*)

LD	10

NE	25

ST	aresult

LD	'ab'

NE	'ab'

ST	mresult


BOO

引數：

IN	任何變數	任何非布林值

Q	布林	如果是非零的數值則得真

如果是為零的數值則得假

如果是 'TRUE' 的字串則得真

如果是 'FALSE' 的字串則得假

描述﹕

將任何變數轉換成布林形態。

(* FBD範例：使用 "轉換成布林" 方塊 *)

(* ST相等式：*)

ares := BOO (10);	(* ares為真 *)

tres := BOO (t#0s);	(* tres為假 *)

mres := BOO ('false');	(* mres為假 *)

(* IL相等式：*)

LD	10

BOO

ST	ares

LD	t#0s

BOO

ST	tres

LD	'false'

BOO

ST	mres


ANA

引數：

IN	任何變數	任何非整數的類比值

Q	整數	如果IN是假則得0 / 如果IN是真則得1

計時器變數轉換為以千分之一秒為單位的數值

實數類比值抽取出整數部分

字串轉為10進位整數

描述﹕

將任何變數轉換成整數形態。

(* FBD範例：使用轉換成整數方塊 *)

(* ST相等式：*)

bres := ANA (true);	(* bres is 1 *)

tres := ANA (t#1s46ms);	(* tres is 1046 *)

mres := ANA ('0198');	(* mres is 198 *)

(* IL相等式：*)

LD	true

ANA

ST	bres

LD	t#1s46ms

ANA

ST	tres

LD	'0198'

ANA

ST	mres


REAL

引數：

IN	布林，整數，計時器	任何非實數的類比值 (不允許字串)

Q	實數	如果IN是假則得0.0 / 如果IN是真則得1.0

計時器變數轉為以千分之一秒為單位的數值

整數類比值轉為同等數值

描述﹕

將任何變數轉換成實數形態。

(* FBD範例：使用 "轉換成實數" 方塊 *)

(* ST相等式：*)

bres := REAL (true);	(* bres is 1.0 *)

tres := REAL (t#1s46ms);	(* tres is 1046.0 *)

ares := REAL (198);	(* ares is 198.0 *)

(* IL相等式：*)

LD	true

REAL

ST	bres

LD	t#1s46ms

REAL

ST	tres

LD	198

REAL

ST	ares


TMR

引數：

IN	整數，實數	任何非計時器變數的值

IN是以千分之一秒為單位的數值 (如果IN是實數的話則取IN的整數部份)

Q	計時器	IN的值以時間數值來表現

描述﹕

將任何變數轉換成計時器形態。

(* FBD範例：使用轉換成時間方塊 *)

(* ST相等式：*)

ares := TMR (1256);	(* ares := t#1s256ms *)

rres := TMR (1256.3);	(*rres := t#1s256ms *)

(* IL相等式：*)

LD	1256

TMR

ST	ares

LD	1256.3

TMR

ST	rres


MSG

引數：

IN	布林，整數，實數	任何非字串的值

Q	訊息	如果IN為布林值則得 'false' 或 'true'

如果IN為類比值則以十進位字串來表示

描述﹕

將任何變數轉換成訊息型態。

(* FBD範例：使用 "轉換成訊息" 方塊 *)

(* ST相等式：*)

bres := MSG (true); (* bres is 'TRUE' *)

ares := MSG (125); (* ares is '125' *)

(* IL相等式：*)

LD	true

MSG

ST	bres

LD	125

MSG

ST	ares


CAT

註﹕此運算元，其輸入的數量可以擴展到多於兩個。

引數：

(輸入)	訊息	(將所有字串加起來，其長度必須不超過輸出訊息的容許量)

輸出	訊息	將輸入訊息連結起來

描述﹕

將數個訊息字串連結成一個訊息字串。

(* FBD範例：使用 "訊息連結" 方塊 *)

(* ST相等式：使用運算元 + *)

myname := ('Mr' + ' ') + 'Jones';

(* means: myname := 'Mr Jones' *)

(* IL相等式：*)

LD	'Mr'

ADD	' '

ADD	'Jones'

ST	myname


SYSTEM

引數：

Mode	整數	辨識系統參數以及執行模式

Arg	整數，計時器	寫入一個新值

Param	整數	執行參數之後的返回值

描述﹕

使用系統參數。

下面的明細表是SYSTEM功能中所允許的指令 (已定義過的關鍵字)﹕

命令	意義

SYS_TALLOWED	讀取允許的週期時間

SYS_TCURRENT	讀取現在的週期時間

SYS_TMAXIMUM	讀取最大的週期時間

SYS_TOVERFLOW	讀取週期時間溢位次數

SYS_TRESET	重置週期計數器

SYS_TWRITE	改變週期時間

SYS_ERR_TEST	檢查執行期錯誤

SYS_ERR_READ	讀取最早的執行期錯誤

下面是對SYSTEM功能中已定義過的函式，其所需要的參數﹕

命令	引數	返回值

SYS_TALLOWED	0	允許的週期時間

SYS_TCURRENT	0	現在的週期時間

SYS_TMAXIMUM	0	偵測到的最大週期時間

SYS_TOVERFLOW	0	溢位次數

SYS_TRESET	0	0

SYS_TWRITE	新的允許週期時間	寫入的時間值

SYS_ERR_TEST	0	如果未偵測到錯誤則為0

SYS_ERR_READ	0	最早的錯誤碼

(* FBD範例：使用 "System" 方塊 *)

(* ST相等式：*)

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接點。

OPERATE參數的意義取決於I/O介面的使用。參考您的硬體手冊或對應I/O板的技術註記，以學習更多有關OPERATE的功能。


標準的功能方塊

下面是由ISaGRAF系統所提供的標準功能方塊。這些功能方塊是已經被定義過，且不需要在程式庫中宣告。

布林：

SR	設定雙重觸發器

RS	重置雙重觸發器

R_TRIG	上升邊緣偵測

F_TRIG	下降邊緣偵測

SEMA	信號發送器

計數：

CTU	向上計數器

CTD	向下計數器

CTUD	向上及向下計數器

計時器：

TON	啟動延時

TOF	關閉延時

TP	脈沖定時

整數類比值：

CMP	完整比較的功能方塊

STACKINT	整數類比值的堆疊

實數類比值：

AVERAGE	對數個樣本求其平均

HYSTER	對不同的實數產生布林遲滯現象

LIM_ALRM	高 / 低限制警告

INTEGRAL	對時間的積分

DERIVATE	根據時間的微分

訊號產生：

BLINK	布林訊號的閃爍處理

SIG_GEN	訊號產生器

註﹕當新的 "C" 功能方塊被創造出來後，就可以從FBD語言中叫出來使用。


SR

引數：

SET1	布林	如果為真，則將Q1設為真 (支配端)

RESET	布林	如果為真，則將Q1重置為假

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

(* FBD範例：使用 "SR" 方塊 *)

(* ST相等式︰我們假設SR1是SR方塊的樣例 *)

SR1((auto_mode & start_cmd), stop_cmd);

command := SR1.Q1;

(* IL相等式：*)

LD	auto_mode

AND	start_cmd

ST	SR1.set1

LD	stop_cmd

ST	SR1.reset

CAL	SR1

LD	SR1.Q1

ST	command


RS

引數：

SET	布林	如果為真，則將Q1設為真

RESET1	布林	如果為真，則將Q1重置為假 (支配端)

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

(* FBD範例：使用 "RS" 方塊 *)

(* ST相等式︰我們假設RS1是RS方塊的樣例 *)

RS1(start_cmd, (stop_cmd OR alarm));

command := RS1.Q1;

(* IL相等式：*)

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	布林	當CLK的狀態由假變為真則得真

如果是其他情況則得假

描述﹕

偵測布林變數的上升邊緣。

(* FBD範例：使用 "R_TRIG" 方塊 *)

(* ST相等式︰我們假設R_TRIG1是R_TRIG方塊的樣例 *)

R_TRIG1(cmd);

nb_edge := ANA(R_TRIG1.Q) + nb_edge;

(* IL相等式：*)

LD	cmd

ST	R_TRIG1.clk

CAL	R_TRIG1

LD	R_TRIG1.Q

ANA

ADD	nb_edge

ST	nb_edge


F_TRIG

引數：

CLK	布林	任何布林變數

Q	布林	當CLK的狀態由真變為假則得真

如果是其他情況則得假

描述﹕

偵測布林變數的下降邊緣。

(* FBD範例：使用 "F_TRIG" 方塊 *)

(* ST相等式︰我們假設F_TRIG1是F_TRIG方塊的樣例 *)

F_TRIG1(cmd);

nb_edge := ANA(F_TRIG1.Q) + nb_edge;

(* IL相等式：*)

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" 是一個初始值為假的布林變數 *)

busy := x;

If claim Then

x := True;

Else

If release Then

busy := False;

x := False;

End_if;

End_if;


CTU

引數：

CU	布林	計數命令輸入 (當CU為真才計數)

RESET	布林	重置指令 (高優先權)

PV	整數	設定的最大計數值

Q	布林	溢位﹕當CV = PV時得真

CV	整數	計數器的結果

注意﹕	CTU方塊並不區分計數命令輸入 (CU) 的上升或下降邊緣，它必須結合一個 "R_TRIG" 或 "F_TRIG" 方塊來做出一個脈波計數器。

描述﹕

從0開始，每次計數加一到給予的值 (整數)。

(* FBD範例：使用 "CTU" 方塊 *)

(* ST相等式︰我們假設R_TRIG1是R_TRIG方塊的樣例，CTU1是CTU方塊的樣例 *)

CTU1(R_TRIG1(command),NOT(auto_mode),100);

overflow := CTU1.Q;

result := CTU1.CV;

(* IL相等式：*)

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為真才向下計數)

LOAD	布林	讀取指令 (高優先權)

(當LOAD為真時CV = PV )

PV	整數	程式設定的初始值

Q	布林	下溢位﹕當CV = 0時得真

CV	整數	計數器的結果

注意﹕	CTD方塊並不區分計數命令輸入 (CD) 的上升或下降邊緣，它必須結合一個 "R_TRIG" 或 "F_TRIG" 方塊來做出一個脈波計數器。

描述﹕

從給予的值 (整數) 開始，每次計數減一，直到0。

(* FBD範例：使用 "CTD" 方塊 *)

(* ST相等式︰我們假設F_TRIG1是F_TRIG方塊的樣例，CTD1是CTD方塊的樣例 *)

CTD1(F_TRIG1(command),load_cmd,100);

underflow := CTD1.Q;

result := CTD1.CV;

(* IL相等式：*)

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為真)

CD	布林	向下計數 (當CD為真)

RESET	布林	重置指令 (高優先權)

(當RESET為真時CV = 0 )

LOAD	布林	讀取指令 (當LOAD為真時CV = PV )

PV	整數	設定的最大計數值

QU	布林	溢位﹕當CV = PV時得真

QD	布林	下溢位﹕當CV = 0時得真

CV	整數	計數器的結果

注意﹕	CTUD方塊並不區分計數命令輸入 (CU與CD) 的上升或下降邊緣，它必須結合 "R_TRIG" 或 "F_TRIG" 方塊來做出一個脈波計數器。

描述﹕

從0開始，每次計數加一到給予的值 (整數)，或是從給予的值 (整數) 開始，每次減一計數到0為止。

(* FBD範例：使用 "CTUD" 方塊 *)

(* ST相等式︰我們假設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;

(* IL相等式：*)

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	reset_cmd

ST	CTUD1.reset

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	布林	如果得真，則表示已經計時到程式規劃的時間

ET	計時器	目前經過的延遲時間

描述﹕

啟動內部計時器，直到所設定的延遲時間。

時序圖﹕


TOF

引數：

IN	布林	如果訊號為下降邊緣，則開始內部計時器

如果訊號為上升邊緣，則停止並重置內部計時器

PT	計時器	程式規劃的最大時間值

Q	布林	如果得真﹕表示時間尚未計完

ET	計時器	目前經過的延遲時間

描述﹕

啟動內部計時器，直到所設定的延遲時間。

時序圖﹕


TP

引數：

IN	布林	如果訊號為上升邊緣，則開始內部計時器 (如果計時器並無動作)

如果訊號為假並且計時器已計時完畢，則停止並重置內部計時器

當計時器正在計時的時候，任何對IN所作的變動對計時器來說並無影響

PT	計時器	程式規劃的最大時間值

Q	布林	如果得真﹕表示計時器正在計時

ET	計時器	目前經過的延遲時間

描述﹕

啟動內部計時器，直到所設定的延遲時間。

時序圖﹕


CMP

引數：

VAL1	整數	任何含正負號的整數類比值

VAL2	整數	任何含正負號的整數類比值

LT	布林	如果val1小於val2則得真

EQ	布林	如果val1等於val2則得真

GT	布林	如果val1大於val2則得真

描述﹕

比較兩個值﹕兩值是否相等，或是第一個值小於或大於第二個值。

(* FBD範例：使用 "CMP" 方塊 *)

(* ST相等式︰我們假設CMP1是CMP方塊的樣例 *)

CMP1(level, max_level);

pump_cmd := CMP1.LT OR CMP1.EQ;

alarm := CMP1.GT AND NOT(manual_mode);

(* IL相等式：*)

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	布林	如果堆疊是空的話則得真

OFLO	布林	溢位﹕如果堆疊已滿則得真

OUT	整數	在堆疊最上層的值

描述﹕

管理整數值的堆疊。

"STACKINT" 功能方塊需要作一個上升訊號檢知用以作為PUSH和POP的輸入命令。最大的堆疊容量為128。應用程式定義的堆疊容量N不能小於1或大於128。

請注意OFLO的值只能在經過重置後才有作用 (R1至少為真過一次，且已變回假的狀態)。

(* FBD範例：使用 "STACKINT" 方塊做錯誤管理 *)

(* ST相等式︰我們假設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;

(* IL相等式：*)

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	布林	真則執行 / 假則復歸

XIN	實數	任何實數類比值變數

N	整數	應用程式定義的取樣數量

XOUT	實數	對XIN的值求其平均數

描述﹕

每個週期儲存一個值，並將所有已經儲存的值加以運算求其平均值。只儲存N個值。

取樣數量N的數目不能超過128。

如果 "RUN" 端的指令是假 (重置模式)，則輸入的值等於輸出的值。

當儲存的數目已到達最大之值N，則第一個被儲存的值會被最後一個儲存值取代。

(* FBD範例：使用 "AVERAGE" 方塊：*)

(* ST相等式︰我們假設AVERAGE1是AVERAGE方塊的樣例 *)

AVERAGE1((auto_mode & store_cmd), sensor_value, 100);

ave_value := AVERAGE1.XOUT;

(* IL相等式：*)

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


TP

引數：

IN	布林	如果訊號為上升邊緣，則開始內部計時器 (如果計時器並無動作)

如果訊號為假並且計時器已計時完畢，則停止並重置內部計時器

當計時器正在計時的時候，任何對IN所作的變動對計時器來說並無影響

PT	計時器	程式規劃的最大時間值

Q	布林	如果得真﹕表示計時器正在計時

ET	計時器	目前經過的延遲時間

描述﹕

啟動內部計時器，直到所設定的延遲時間。

時序圖﹕


CMP

引數：

VAL1	整數	任何含正負號的整數類比值

VAL2	整數	任何含正負號的整數類比值

LT	布林	如果val1小於val2則得真

EQ	布林	如果val1等於val2則得真

GT	布林	如果val1大於val2則得真

描述﹕

比較兩個值﹕兩值是否相等，或是第一個值小於或大於第二個值。

(* FBD範例：使用 "CMP" 方塊 *)

(* ST相等式︰我們假設CMP1是CMP方塊的樣例 *)

CMP1(level, max_level);

pump_cmd := CMP1.LT OR CMP1.EQ;

alarm := CMP1.GT AND NOT(manual_mode);

(* IL相等式：*)

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	布林	如果堆疊是空的話則得真

OFLO	布林	溢位﹕如果堆疊已滿則得真

OUT	整數	在堆疊最上層的值

描述﹕

管理整數值的堆疊。

"STACKINT" 功能方塊需要作一個上升訊號檢知用以作為PUSH和POP的輸入命令。最大的堆疊容量為128。應用程式定義的堆疊容量N不能小於1或大於128。

請注意OFLO的值只能在經過重置後才有作用 (R1至少為真過一次，且已變回假的狀態)。

(* FBD範例：使用 "STACKINT" 方塊做錯誤管理 *)

(* ST相等式︰我們假設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;

(* IL相等式：*)

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	布林	真則執行 / 假則復歸

XIN	實數	任何實數類比值變數

N	整數	應用程式定義的取樣數量

XOUT	實數	對XIN的值求其平均數

描述﹕

每個週期儲存一個值，並將所有已經儲存的值加以運算求其平均值。只儲存N個值。

取樣數量N的數目不能超過128。

如果 "RUN" 端的指令是假 (重置模式)，則輸入的值等於輸出的值。

當儲存的數目已到達最大之值N，則第一個被儲存的值會被最後一個儲存值取代。

(* FBD範例：使用 "AVERAGE" 方塊：*)

(* ST相等式︰我們假設AVERAGE1是AVERAGE方塊的樣例 *)

AVERAGE1((auto_mode & store_cmd), sensor_value, 100);

ave_value := AVERAGE1.XOUT;

(* IL相等式：*)

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	布林	如果XIN1大於XIN2+EPS並且還沒低於XIN2-EPS則得真

描述﹕

對高限幅的實數值作遲滯。

時序圖的例子﹕


LIM_ALRM

引數：

H	實數	高限制值

X	實數	輸入﹕任何實數類比值

L	實數	低限制值

EPS	實數	遲滯值 (必須大於零)

QH	布林	"高" 警告﹕如果X在高限制H之上則得真

Q	布林	警告輸出﹕如果X超出限制則得真

QL	布林	"低" 警告﹕如果X低於低限制H則得真

描述﹕

對高和低限制的實數值作遲滯。

可以對高和低限制作遲滯。高和低限制的遲滯delta是EPS參數的一半。下面是時序圖的例子﹕


INTEGRAL

引數：

RUN	布林	模式﹕真則積分 / 假則保持

R1	布林	溢位重置

XIN	實數	輸入﹕任何實數值

X0	實數	初始值

CYCLE	計時器	取樣週期

Q	布林	R1的反相

XOUT	實數	積分後的輸出

描述﹕

實數值的積分。

如果 "CYCLE" 的參數值小於ISaGRAF應用程式的週期時間，則取樣週期的時間將被應用程式的週期時間取代。

(* FBD範例：使用 "INTEGRAL" 方塊 *)

(* ST相等式︰我們假設INTEGRAL1是INTEGRAL方塊的樣例 *)

INTEGRAL1(manual_mode, NOT(manual_mode), sensor_value, init_value, t#100ms);

controlled_value := INTEGRAL1.XOUT;

(* IL相等式：*)

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	布林	模式﹕真則正常 / 假則重置

XIN	實數	輸入﹕任何實數值

CYCLE	計時器	取樣週期

XOUT	實數	微分輸出

描述﹕

實數值的微分。

如果 "CYCLE" 的參數值小於ISaGRAF應用程式的週期時間，則取樣週期的時間將被應用程式的週期時間取代。

(* FBD範例：使用 "DERIVATE" 方塊 *)

(* ST相等式︰我們假設DERIVATE1是DERIVATE方塊的樣例 *)

DERIVATE1(manual_mode, sensor_value, t#100ms);

derivated_value := DERIVATE1.XOUT;

(* IL相等式：*)

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	布林	模式﹕真則閃爍 / 假則將輸出重置為假

CYCLE	計時器	閃爍週期

Q	布林	輸出的閃爍訊號

描述﹕

產生閃爍訊號。

時序圖﹕


SIG_GEN

引數：

RUN	布林	模式﹕真則執行 / 假則復歸

PERIOD	計時器	取樣的持續時間

MAXIMUM	整數	最大的計數值

PULSE	布林	每次取樣之後將被反相

UP	整數	向上計數器，每次取樣都會增加

END	布林	當向上計數完成時得真

SINE	實數	正弦訊號 (週期=計數週期)

描述﹕

產生多種的訊號﹕布林的閃爍訊號、整數的向上計數訊號以及正弦波。

當計數到達最大值時，計數器將重新從零開始計數。因此END的值只能保持一個PERIOD的時間。

時序圖﹕


標準的函數

下面是由ISaGRAF系統所提供的標準的函式。這些函式是已經被定義過，且不需要在程式庫中宣告。

數學：

ABS	絕對值

EXPT	指數，乘冪運算

LOG	對數

POW	平方根

SQRT	刪除小數部份

TRUNC	刪除小數部份

三角運算：

ACOS	反餘弦

ASIN	反正弦

ATAN	反正切

COS	餘弦

SIN	正弦

TAN	正切

暫存器控制：

ROL	左旋

ROR	右旋

SHL	左移

SHR	右移

資料處理：

MIN	最小值

MAX	最大值

LIMIT	限制

MOD	餘數

MUX4	多路轉換器 (4個或8個輸入)

MUX8	二進位選擇器

ODD	奇數校驗

RAND	隨機值

SEL	二元選取器

資料轉換：

ASCII	字元ASCII碼

CHAR	ASCII碼字元

字串管理：

DELETE	刪除子字串

INSERT	插入字串

FIND	尋找子字串

MLEN	取得字串長度

LEFT	擷取字串的左邊字串

MID	中間字串

REPLACE	取代子字串

RIGHT	擷取字串的右邊字串

DAY_TIME	日期與時間

陣列管理：

ARCREATE	開啟整數值的陣列

ARREAD	讀取陣列元素

ARWRITE	寫入陣列元素

二進位檔案管理

F_ROPEN	在讀取模式下開啟二進位檔案

F_WOPEN	在寫入模式下開啟二進位檔案

F_CLOSE	關閉二進位檔案

F_EOF	測試二進位檔案結尾

FA_READ	在二進位檔案中讀取類比值

FA_WRITE	寫入類比值到二進位檔案中

FM_READ	在二進位檔案中讀取字串

FM_WRITE	寫入字串到二進位檔案中


ABS

引數：

IN	實數	任何含正負號的實數類比值

Q	實數	絕對值 (永遠為正值)

描述﹕

產生一實數值的絕對值 (正值)。

(* FBD範例：使用 "ABS" 方塊 *)

(* ST相等式︰*)

over := (ABS (delta) > range);

(* IL相等式︰*)

LD	delta

ABS

GT 	range

ST	over


EXPT

引數：

IN	實數	任何含正負號的實數類比值

EXP	整數	整數類比值的指數

Q	實數	(IN EXP)

描述﹕

產生此運算後的實數結果﹕(基底 指數) '基底' 當成第一個參數，而 '指數' 則為第二個。

(* FBD範例：使用 "EXPT" 方塊 *)

(* ST相等式︰*)

tb_size := ANA (EXPT (2.0, range) );

(* IL相等式︰*)

LD	2.0

EXPT	range

ANA

ST	tb_size


LOG

引數：

IN	實數	必須大於零

Q	實數	輸入值的對數 (基底10)

描述﹕

實數值的對數 (基底10) 運算。

(* FBD範例：使用 "LOG" 方塊 *)

(* ST相等式︰*)

xpos := ABS (xval);

xlog := LOG (xpos);

(* IL相等式︰*)

LD	xval

ABS

ST	xpos

LOG

ST	xlog


POW

引數：

IN	實數	將被加入的實數類比數字

EXP	實數	乘冪 (exponent)

Q	實數	(IN EXP)

如果IN不為0.0且EXP為0.0則得1.0

如果IN為0.0且EXP為負數則得0.0

如果IN為0.0且EXP為0.0則得0.0

如果IN為負數且Y不為整數則得0.0

描述﹕

產生此運算後的實數結果﹕(基底 指數) '基底' 當成第一個參數，而 '指數' 則為第二個。'指數' 為實數值。

(* FBD範例：使用 "POW" 方塊 *)

(* ST相等式︰*)

result := POW (xval, power);

(* IL相等式︰*)

LD	xval

POW	power

ST	result


SQRT

引數：

IN	實數	必須大於零或是等於零

Q	實數	輸入值的平方根

描述﹕

計算實數值的平方根。

(* FBD範例：使用 "SQRT" 方塊 *)

(* ST相等式︰*)

xpos := ABS (xval);

xroot := SQRT (xpos);

(* IL相等式︰*)

LD	xval

ABS

ST	xpos

SQRT

ST	xrout


TRUNC

引數：

IN	實數	任何實數類比植

Q	實數	如果IN>0，則為小於或等於輸入值的最大整數

如果IN<0，則為大於或等於輸入值的最小整數

描述﹕

將實數值的小數部份忽略，只保留其整數部份。

(* FBD範例：使用 "TRUNC" 方塊 *)

(* ST相等式︰*)

result := TRUNC (+2.67) + TRUNC (-2.0891);

(* means: result := 2.0 + (-2.0) := 0.0; *)

(* IL相等式︰*)

LD	2.67

TRUNC

ST	temporary	(* 第一次TRUNC的暫時結果 *)

LD	-2.0891

TRUNC

ADD	temporary

ST	result


ACOS

引數：

IN	實數	必須確定在 [-1.0_.+1.0]

Q	實數	對輸入值作反餘弦 (確定於 [0.0_.PI] )

對無效的輸入值則等於0.0

描述﹕

對實數值作反餘弦運算。

(* FBD範例：使用 "COS" 和 "ACOS" 方塊 *)

(* ST相等式︰*)

cosine := COS (angle);

result := ACOS (cosine); (* result is equal to angle *)

(* IL相等式︰*)

LD	angle

COS

ST	cosine

ACOS

ST	result


ASIN

引數︰

IN	實數	必須確定在 [-1.0_.+1.0]

Q	實數	對輸入值作反正弦 (確定於 [-PI/2_.+PI/2] )

對無效的輸入值則等於0.0

描述﹕

對實數值作反正弦運算。

(* FBD範例：使用 "SIN" 和 "ASIN" 方塊 *)

(* ST相等式︰*)

sine := SIN (angle);

result := ASIN (sine); (* result := angle; *)

(* IL相等式︰*)

LD	angle

SIN

ST	sine

ASIN

ST	result


ATAN

引數︰

IN	實數	任何實數類比值

Q	實數	對輸入值作反正切 (確定於 [-PI/2_.+PI/2] )

對無效的輸入值則等於0.0

描述﹕

對實數值作反正切運算。

(* FBD範例：使用 "TAN" 和 "ATAN" 方塊 *)

(* ST相等式︰*)

tangent := TAN (angle);

result := ATAN (tangent); (* result := angle; *)

(* IL相等式︰*)

LD	angle

TAN

ST	tangent

ATAN

ST	result


COS

引數︰

IN	實數	任何實數類比值

Q	實數	對輸入值作餘弦 (確定於 [-1.0_.+1.0] )

描述﹕

對實數值作餘弦運算。

(* FBD範例：使用 "COS" 和 "ACOS" 方塊 *)

(* ST相等式︰*)

cosine := COS (angle);

result := ACOS (cosine); (* result := angle; *)

(* IL相等式︰*)

LD	angle

COS

ST	cosine

ACOS

ST	result


SIN

引數︰

IN	實數	任何實數類比值

Q	實數	對輸入值作正弦 (須訂於 [-1.0_.+1.0] )

描述﹕

對實數值作正弦運算。

(* FBD範例：使用 "SIN" 和 "ASIN" 方塊 *)

(* ST相等式︰*)

sine := SIN (angle);

result := ASIN (sine); (* result := angle; *)

(* IL相等式︰*)

LD	angle

SIN

ST	sine

ASIN

ST	result


TAN

引數︰

IN	實數	不能等於PI/2至PI

Q	實數	對輸入值作正切

對無效的輸入值則等於1E+38

描述﹕

對實數值作正切運算。

(* FBD範例：使用 "TAN" 和 "ATAN" 方塊 *)

(* ST相等式︰*)

tangent := TAN (angle);

result := ATAN (tangent); (* result := angle; *)

(* IL相等式︰*)

LD	angle

TAN

ST	tangent

ATAN

ST	result


ROL

引數：

IN	整數	任何整數類比值

NbR	整數	位元旋轉的位數 (須介於 [1_.31] )

Q	整數	向左旋轉後的值

如果NbR<=0的話是沒有作用的

描述﹕

使整數中的位元向左旋轉，整個整數32位元皆一起旋轉﹕

(* FBD範例：使用 "ROL" 方塊 *)

(* ST相等式︰*)

result := ROL (register, 1);

(* register = 2#0100_1101_0011_0101*)

(* result    = 2#1001_1010_0110_1010*)

(* IL相等式︰*)

LD	register

ROL	1

ST	result


ROR

引數：

IN	整數	任何整數類比值

NbR	整數	位元旋轉的位數 (須位於 [1_.31] )

Q	整數	向右旋轉後的值

如果NbR<=0的話是沒有作用的

描述﹕

使整數中的位元向右旋轉，整個整數32位元皆一起旋轉﹕

(* FBD範例：使用 "ROR" 方塊 *)

(* ST相等式︰*)

result := ROR (register, 1);

(* register = 2#0100_1101_0011_0101 *)

(* result    = 2#1010_0110_1001_1010 *)

(* IL相等式︰*)

LD	register

ROR	1

ST	result


SHL

引數：

IN	整數	任何整數類比值

NbS	整數	位元移位的位數 (須介於 [1_.31] )

Q	整數	向左移位後的值

如果NbS<=0的話是沒有作用的

0用來置換最低的位元

描述﹕

使整數中的位元向左移位，整個整數32位元皆一起旋轉﹕

(* FBD範例：使用 "SHL" 方塊 *)

(* ST相等式︰*)

result := SHL (register,1);

(* register = 2#0100_1101_0011_0101 *)

(* result    = 2#1001_1010_0110_1010 *)

(* IL相等式︰*)

LD	register

SHL	1

ST	result


SHR

引數：

IN	整數	任何整數類比值

NbS	整數	位元移位的位數 (須介於 [1_.31] )

Q	整數	向右移位後的值

如果NbS<=0的話是沒有作用的

最高的位元在每次移位時都會被複製

描述﹕

使整數中的位元向右移位，整個整數32位元皆一起旋轉﹕

(* FBD範例：使用 "SHR" 方塊 *)

(* ST相等式︰*)

result := SHR (register,1);

(* register = 2#1100_1101_0011_0101 *)

(* result    = 2#1110_0110_1001_1010 *)

(* IL相等式︰*)

LD	register

SHR	1

ST	result


MIN

引數：

IN1	整數	任何帶正負號的整數類比值

IN2	整數	(不能為實數)

Q	整數	兩個輸入值中的最小值

描述﹕

在兩個整數值中產生最小的值。

(* FBD範例：使用 "MIN" 和 "MAX" 方塊 *)

(* ST相等式︰*)

new_value := MAX (MIN (max_value, value), min_value);

(* 將值限制在 [min_value�max_value] 間 *)

(* IL相等式︰*)

LD	max_value

MIN	value

MAX	min_value

ST	new_value


MAX

引數：

IN1	整數	任何帶正負號的整數類比值

IN2	整數	(不能為實數)

Q	整數	兩個輸入值中的最大值

描述﹕

在兩個整數值中產生最大的值。

(* FBD範例：使用 "MIN" 和 "MAX" 方塊 *)

(* ST相等式︰*)

new_value := MAX (MIN (max_value, value), min_value);

(* 將值限制在 [min_value�max_value] 間 *)

(* IL相等式︰*)

LD	max_value

MIN	value

MAX	min_value

ST	new_value


LIMIT

引數：

MIN	整數	最小的允許值

IN	整數	任何帶正負號的整數類比值

MAX	整數	最大的允許值

Q	整數	被限制在允許範圍內的輸入值

描述︰

將整數值限定在一個給予的範圍內。如果值介於最小與最大之間則保留其值，或是如果超過最大值則將值變成最大值，或是如果低於最小值則將值變成最小值。

(* FBD範例：使用 "LIMIT" 方塊 *)

(* ST相等式︰*)

new_value := LIMIT (min_value, value, max_value);

(* 將值限制在 [min_value�max_value] 間 *)

(* IL相等式︰*)

LD	min_value

LIMIT	value, max_value

ST	new_value


MOD

引數：

IN	整數	任何帶正負號的整數類比值

Base	整數	必須大於零

Q	整數	餘數計算 (輸入MOD基礎)

如果Base <= 0則返回-1

描述﹕

對整數值作餘數運算。

(* FBD範例：使用 "MOD" 方塊 *)

(* ST相等式︰*)

division_result := (value / divider); (* 整數除法 *)

rest_of_division := MOD (value, divider); (* 相除後的餘數 *)

(* IL相等式︰*)

LD	value

DIV	divider

ST	division_result

LD	value

MOD	divider

ST	rest_of_division


MUX4

引數：

SEL	整數	整數值選取器 (必須設定在 [0_3] 間)

IN1..IN4	整數	任何整數類比值

Q	整數	if SEL = 0，則 = IN1

if SEL = 1，則 = IN2

if SEL = 2，則 = IN3

if SEL = 3，則 = IN4

如果選取器收到0_.3以外的值則得零

描述﹕

含4個輸入的多路轉換器﹕從四個整數值中選取一值。

(* FBD範例：使用 "MUX4" 方塊 *)

(* ST相等式︰*)

range := MUX4 (choice, 1, 10, 100, 1000);

(* 從四個預先定義的範圍內選取一個，例如，如果choice是1，則range為10 *)

(* IL相等式︰*)

LD	choice

MUX4	1,10,100,1000

ST	range


MUX8

引數：

SEL	整數	整數值選取器 (必須設定在 [0_7] 間)

IN1..IN8	整數	任何整數類比值

Q	整數	if SEL = 0，則 = IN1

if SEL = 1，則 = IN2

...

if SEL = 7，則 = IN8

如果選取器收到0....7以外的值則得零

描述﹕

含8個輸入的多路轉換器﹕從八個整數值中選取一值。

(* FBD範例：使用 "MUX8" 方塊 *)

(* ST相等式︰*)

range := MUX8 (choice, 1, 5, 10, 50, 100, 500, 1000, 5000);

(* 從八個預先定義的範圍內選取一個，例如，如果choice是3，則range為50 *)

(* IL相等式︰*)

LD	choice

MUX8	1,5,10,50,100,500,1000,5000

ST	range


ODD

引數：

IN	整數	任何含正負號的整數類比值

Q	布林	如果輸入值為奇數則得真

如果輸入值為偶數則得假

描述﹕

測試整數的奇偶﹕結果是奇數或偶數。

(* FBD範例：使用 "ODD" 方塊 *)

(* ST相等式︰*)

If Not (ODD (value)) Then Return; End_if;

value := value + 1;

(* 使值永遠為偶數 *)

(* IL相等式︰*)

LD	value

ODD

RETNC

LD	value

ADD	1

ST	value


RAND

引數：

base	整數	定義允許數字的範圍

Q	整數	設定範圍內的亂數值

描述：

在允許的範圍內產生亂數值。

(* FBD範例：使用 "RAND" 方塊 *)

(* ST相等式︰*)

selected := MUX4 ( RAND (4), 1, 4, 8, 16 );

(*

隨意從已定義的四個值中選取一值

從RAND的輸出值設定為 [0...3] 之間，

因此從MUX4得到的值，將會到是下列四個值中的其中一個任意值

如果從RAND得到的值為0，則selected:=1;

如果從RAND得到的值為1，則selected:=4;

如果從RAND得到的值為2，則selected:=8;

如果從RAND得到的值為3，則selected:=16;

*)

(* IL相等式︰*)

LD	4

RAND

MUX4	1,4,8,16

ST	selected


SEL

引數：

SEL	布林	指定選取值

IN1, IN2	整數	任何整數類比值

Q	整數	如果SEL為假則得IN1

如果SEL為真則得IN2

描述：

二元選取器：從兩個整數值中選取一值。

(* FBD範例：使用 "SEL" 方塊 *)

(* ST相等式︰*)

ProCmd := SEL (AutoMode, ManuCmd, InpCmd);

(* 處理指令的選取 *)

(* IL相等式︰*)

LD	AutoMode

SEL	ManuCmd,InpCmd

ST	ProCmd


ASCII

引數：

IN	訊息	任何不是空的字串

Pos	整數	所選字元的位置

其範圍是 [0...字串長度]

Code	整數	選取位元的編碼 (其值為 [0...255] 間)

如果返回值為0就表示Pos超出字串的範圍

描述：

在字串中對字元產生其ASCII碼。

(* FBD範例：使用 "ASCII" 方塊 *)

(* ST相等式︰*)

FirstChr := ASCII (message, 1);

(* FirstChr是此字串中第一個字元的ASCII碼 *)

(* IL相等式︰*)

LD	message

ASCII	1

ST	FirstChr


CHAR

引數：

Code	整數	介於 [0...255] 間的碼

Q	訊息	字元字串

輸出字元為輸入ASCII碼的轉換

(ASCII碼為256的餘數)

描述：

從給予的ASCII碼中產生一相對應的字元。

(* FBD範例：使用 "CHAR" 方塊 *)

(* ST相等式︰*)

Display := CHAR ( value + 48 );

(* value的值設為 [0...9] 之間 *)

(* 48的ASCII碼為 '0' *)

(* 結果為從 '0' 到 '9' 的字元字串 *)

(* IL相等式︰*)

LD	value

ADD	48

CHAR

ST	Display


DELETE

引數：

IN	訊息	任何非空字串

NbC	整數	欲刪除的字元數量

Pos	整數	欲刪除第一個字元的位置

(字串中的第一個字元的位置為1)

Q	訊息	經修改後的字串

如果Pos <1則得空字串

如果Pos >IN字串長度，則得原始字串

如果NbC <=0則得原始字串

描述：

刪除字串的一部份。

(* FBD範例：使用 "DELETE" 方塊 *)

(* ST相等式︰*)

complete_string := 'ABCD' + 'EFGH'; (* complete_string為 'ABCDEFGH' *)

sub_string := DELETE (complete_string, 4, 3); (* sub_string為 'ABGH' *)

(* IL相等式︰*)

LD	'ABCD'

ADD	'EFGH'

ST	complete_string

DELETE	4,3

ST 	sub_string


INSERT

引數：

IN	訊息	原始字串

Str	訊息	欲插入字串

Pos	整數	欲插入的位置

字串將被插入在設定的位置之前

(第一個允許的位置為1)

Q	訊息	經修改後的字串

如果Pos<=0則得空字串

如果Pos的值大於IN的字串長度則字串將會互相連結

描述：

在一字串中插入另一個字串到給予的位置中。

(* FBD範例：使用 "INSERT" 方塊 *)

(* ST相等式︰*)

MyName := INSERT ('Mr JONES', 'Frank ', 4);

(* MyName為 'Mr Frank JONES' *)

(* IL相等式︰*)

LD	'Mr JONES'

INSERT	'Frank ',4

ST 	MyName


FIND

引數：

In	訊息	任何字串

Pat	訊息	任何非空字串 (樣品)

Pos	整數	如果找不到Pat的字串，則得0

=Pat字串中第一個出現的第一個字元的位置

(第一個位置為1)

此功能不分大小寫

描述：

尋找字串中的子字串。得到此子字串在字串中的位置。

(* FBD範例使用 "FIND" 方塊 *)

(* ST相等式︰*)

complete_string := 'ABCD' + 'EFGH'; (* complete_string為 'ABCDEFGH' *)

found := FIND (complete_string, 'CDEF'); (* fonud為3 *)

(* IL相等式︰*)

LD	'ABCD'

ADD	'EFGH'

ST	complete_string

FIND	'CDEF'

ST 	found


MLEN

引數：

IN	訊息	任何字串

NbC	整數	輸入字串的字元數量

描述：

計算一字串的長度。

(* FBD範例：使用 "MLEN" 方塊 *)

(* ST相等式︰*)

nbchar := MLEN (complete_string);

If (nbchar < 3) Then Return; End_if;

prefix := LEFT (complete_string, 3);

(* 此段程式將字串左邊的三個字元取出，並將結果指定給prefix這個訊息變數。如果字串長度小於三個字元，則將不會有任何作用。*)

(* IL相等式︰*)

LD	complete_string

MLEN

ST	nbchar

LT	3

RETC

LD	complete_string

LEFT	3

ST	prefix


LEFT

引數：

IN	訊息	任何非空字串

NbC	整數	欲被取出的字元數量

不能超過輸入字串的長度

Q	訊息	不能超過輸入字串的長度

如果NbC <= 0，則得空字串

如果NbC >= IN的字串長度，則得到完整的輸入字串

描述：

取出字串的左邊部份，其欲取出字元的數目是設計者給的。

(* FBD範例：使用 "LEFT" 與 "RIGHT" 方塊 *)

(* ST相等式︰*)

complete_string := RIGHT ('12345678', 4) + LEFT ('12345678', 4);

(* complete_string為 '56781234'

從RIGHT呼叫的值結果為 '5678'

從LEFT呼叫的值結果為 '1234'

*)

(* IL相等式：先作呼叫LEFT的部份 *)

LD	'12345678'

LEFT	4

ST	sub_string 	(* 中繼結果 *)

LD	'12345678'

RIGHT	4

ADD	sub_string

ST 	complete_string


MID

引數：

IN	訊息	任何非空字串

NbC	整數	欲被取出的字元數量

不能超過輸入字串的長度

Pos	整數	子字串的位置

子字串的第一個字元將是Pos所指的字元

(第一個允許位置為1)

Q	訊息	字串的中間部份 (其長度=NbC)

如果下的參數不被允許，則會得到一空字串

描述：

取出一字串的左邊部份，其欲取出字元的數目和第一個字元的位置是設計者給的。

(* FBD範例：使用 "MID" 方塊 *)

(* ST相等式︰*)

sub_string := MID ('abcdefgh', 2, 4);

(* sub_string為 'de' *)

(* IL相等式︰*)

LD	'abcdefgh'

MID	2,4

ST	sub_string


REPLACE

引數：

IN	訊息	任何字串

Str	訊息	欲插入的字串 (將置換NbC個字元)

NbC	整數	欲刪除的字元數目

Pos	整數	第一個被更改的字元位置

(第一個允許的位置是1)

Q	訊息	修改後的字串

- 於位置Pos處刪除NbC個字元

- 然後子字串Str被插入到位置Pos

如果Pos <= 0 則返回一空字串

如果Pos的值大於IN字串的長度則傳回兩個字串的結合(IN+Str)

如果NbC<= 0 則傳回原始字串

描述：

將字串中的一部份置換為新設定的字元。

(* FBD範例：使用 "REPLACE" 方塊 *)

(* ST相等式︰*)

MyName := REPLACE ('Mr X JONES, 'Frank', 1, 4);

(* MyName為 'Mr Frank JONES' *)

(* IL相等式︰*)

LD	'Mr X JONES'

REPLACE	'Frank',1,4

ST	MyName


RIGHT

引數：

IN	訊息	任何非空字串

NbC	整數	不能超過輸入字串的長度

Q	訊息	輸入字串的右邊部份(其長度=NbC)

如果NbC <= 0，則得一空字串

如果NbC >= IN的字串長度，則得到完整的輸入字串

描述：

取出字串的右邊部份，其欲取出字元的數目是設計者給的。

(* FBD範例：使用 "LEFT" 與 "RIGHT" 方塊 *)

(* ST相等式︰*)

complete_string := RIGHT ('12345678', 4) + LEFT ('12345678', 4);

(* complete_string為 '56781234'

從RIGHT呼叫的值結果為 '5678'

從LEFT呼叫的值結果為 '1234'

*)

(* IL相等式：先作呼叫LEFT的部份 *)

LD	'12345678'

LEFT	4

ST	sub_string 	(* 中繼結果 *)

LD	'12345678'

RIGHT	4

ADD	sub_string

ST 	complete_string


DAY_TIME

引數：

SEL	整數	輸出選擇

0 = 取得正確日期

1 = 取得正確時間

2 = 取得星期幾

Q	訊息	時間/日期以字串表示

如果SEL=0，則得 'YYYY/MM/DD'

如果SEL=1，則得 'HH:MM:SS'

如果SEL=2，則得日期名稱(例：'Monday')

描述：

將日期或時間以字串來表示。

(* FBD範例：使用 "DAY_TIME" 方塊 *)

(* ST相等式︰*)

Display := Day_Time (0) + ' ; ' + Day_Time (1);

(* Display的輸出格式為︰'YYYY/MM/DD ; HH:MM:SS' *)

(* IL相等式︰先作呼叫 day_time(1) 的部份 *)

LD	1

DAY_TIME

ST	hour_str 	(* 中繼結果 *)

LD	0

DAY_TIME

ADD	' ; '

ADD	hour_str

ST 	Display


ARCREATE

引數：

ID	整數	矩陣的編號 (必須設定在 [0...15] 間)

Size	整數	矩陣內的元素數量

ok	整數	執行狀態：

1 = 如果已成功創造一矩陣

2 = 不允許的矩陣數量或矩陣已創造

3 = 不允許的元素數量

4 = 記憶體不足

描述：

開啟整數矩陣。

注意：	應用程式最多只能容下16個矩陣。矩陣包含整數類比值。就如同動態配置記憶體一樣，如果矩陣的大小太接近可利用的記憶體大小的話，此函式可能會造成系統錯誤。

(* FBD範例：開啟整數矩陣 *)

(* ST相等式︰*)

array_error := (ARCREATE (ident, 16) <> 1));

(* IL相等式︰*)

LD	ident

ARCREATE	16

NE 	1

ST	array_error


ARREAD

引數：

ID	整數	矩陣的編號 (必須設定在 [0...15] 間)

Pos	整數	矩陣內的元素位置

必須設定在 [0...size-1] 間

value	整數	由元素所讀取的值

如果參數不被允許，則得0

描述：

在整數矩陣中，讀取一個元素。

(* FBD範例：使用矩陣管理方塊 *)

(* ST相等式︰*)

If (array_error) Then Return; End_if;

read_value := ARREAD (ident, index);

(* array_error是由ARCREATE呼叫而得 *)

(* IL相等式︰*)

LD	array_error

RETC

LD	ident

ARREAD	index

ST	read_value


ARWRITE

引數：

ID	整數	矩陣的編號 (必須設定在 [0...15] 間)

Pos	整數	矩陣內的元素位置 (必須設定在 [0...size-1] 間)

IN	整數	元素的新值

ok	整數	執行狀態：

1 = 如果已成功寫入

2 = 不允許的矩陣編號

3 = 不允許的元素位置

描述：

儲存 (寫入) 數值到整數矩陣中。

(* FBD範例：使用矩陣管理方塊 *)

(* ST相等式︰*)

If (array_error) Then Return; End_if;

write_status := ARWRITE (Ident, Index, value);

(* array_error是由ARCREATE呼叫而得 *)

(* IL相等式︰*)

LD	array_error

RETC

LD	ident

ARWRITE	index,value

ST	write_status


F_ROPEN

引數：

Path	訊息	檔案名稱

可以使用 \ 或 / 符號來表明的完整路徑。為使應用程式具有可攜性，/ 或 \ 是有同等功用的。

ID	整數	檔案編號

如果錯誤產生則得0：檔案並不存在。

描述：

以讀取模式開啟二進位檔案。必須和FX_READ和F_CLOSE一起使用。此函式並不包含在ISaGRAF的模擬器中。

(* FBD範例：使用檔案管理方塊 *)

(* ST相等式︰*)

file_id := F_ROPEN('c:\data \data.bin');

error := (file_id=0);

(* IL相等式︰*)

LD	'c:\data\data.bin'

F_ROPEN

ST	file_id

EQ	0

ST	error


F_WOPEN

引數：

Path	訊息	檔案名稱

可以使用 \ 或 / 符號來表明的完整路徑。為使應用程式具有可攜性，/ 或 \ 是有同等功用的。

ID	整數	檔案編號

如果錯誤產生則得0。假如檔案已經存在，將會被覆蓋掉。

描述：

以寫入模式開啟二進位檔案。必須和FX_WRITE和F_CLOSE一起使用。此函式並不包含在ISaGRAF的模擬器中。

(* FBD範例：使用檔案管理方塊 *)

(* ST相等式︰*)

file_id := F_WOPEN('c:\data \data.bin');

error := (file_id=0);

(* IL相等式︰*)

LD	'c:\data\data.bin'

F_WOPEN

ST	file_id

EQ	0

ST	error


F_CLOSE

引數：

ID	整數	檔案編號：其值經由F_ROPEN或F_WOPEN返回所得。

ok	布林	返回之狀態

如果檔案關閉成功，則返回真

如果錯誤產生，則返回假

描述：

關閉經由F_ROPEN或F_WOPEN開啟的二進位檔案。

此函式並不包含在ISaGRAF的模擬器中。

(* FBD範例：使用檔案管理方塊 *)

(* ST相等式︰*)

file_id := F_ROPEN('data.bin');

ok := F_CLOSE(file_id);

(* IL相等式︰*)

LD	'data.bin'

F_ROPEN

ST	file_id

F_CLOSE	(* file_id 已在目前的IL結果中 *)

ST 	ok


F_EOF

引數：

ID	整數	檔案編號：其值經由F_ROPEN或F_WOPEN返回所得。

ok	布林	檔案結束指示器

如果最後的讀或寫程序呼叫遇到檔案結尾時，則返回真。

和FM_READ一起使用時，如果最後一個字元並不是字串的結尾，最後讀取的訊息不一定是正確的。

描述：

測試檔案是否已到達結尾。

此函式並不包含在ISaGRAF的模擬器中。

(* FBD範例：使用檔案管理方塊 *)

(* ST相等式︰*)

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);

(* IL相等式︰*)

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 	(* 如果尚未eof則繼續讀取 *)

END_OF_FILE:	LD	VAL

MSG

ST	val_msg	(* 將VAL轉換為字串 *)

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的模擬器中。

(* FBD範例：使用檔案管理方塊 *)

(* ST相等式︰*)

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);

(* IL相等式︰*)

LD	'voltramp.bin'

F_ROPEN

ST	file_id

FA_READ	(* 讀取vstart *)

ST	vstart

LD 	file_id

FA_READ	(* 讀取vend *)

ST	vend

LD 	file_id

FA_READ	(* 讀取vinc *)

ST	vinc

LD 	file_id

FA_READ	(* 讀取delta_tim *)

TMR	(* 轉換成時間 *)

ST	delta_tim

LD 	file_id

F_CLOSE

ST	ok


FM_WRITE

引數：

ID	整數	檔案編號：其值經由F_WOPEN返回所得。

IN	訊息	欲寫入檔案的字串

ok	布林	執行狀態

成功則得真

描述：

寫入訊息變數到二進位檔案中。

須和F_WOPEN和F_CLOSE一起使用。

寫入到檔案中的字串以空字元作為結束。

此程序從先前位置開始，對檔案進行循序式的讀取。

在F_WOPEN動作後的第一次呼叫，將會寫入字串到檔案中的最前面，每次呼叫則會將寫入指標加上寫入字串的長度。

此函數並不包含在ISaGRAF的模擬器中。

(* FBD範例：使用檔案管理方塊 *)

(* ST相等式︰*)

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);

(* IL相等式︰*)

LD	'trace.txt'

F_WOPEN

ST	file_id

FM_WRITE	'First message'	(* 寫入第一個字串 *)

ST	ok

LD 	file_id

FM_WRITE	'Last message'	(* 寫入第二個字串 *)

ST	ok

LD 	file_id

F_CLOSE

ST	ok


FA_WRITE

引數：

ID	整數	檔案編號：其值經由F_WOPEN返回所得。

IN	整數	欲寫入檔案中的整數類比值

OK	布林	執行狀態：如果成功則得真

描述：

寫入類比變數到二進位檔案中。

此程序從先前位置開始，對檔案進行循序式的讀取。

在F_WOPEN動作後的第一次呼叫，將會寫入檔案的前面的四個位元組，每次呼叫則會將讀取指標加四。

此函式並不包含在ISaGRAF的模擬器中。

(* FBD範例 *)

(* ST相等式︰*)

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;

(* IL相等式︰*)

LD	'voltramp.bin'

F_ROPEN

ST	file_id

LD	0

ST	nb_written

LD 	file_id	(* 寫入vstart *)

FA_WRITE	vstart

ANA

ADD	nb_written

ST	nb_written

LD 	file_id	(* 寫入vend *)

FA_WRITE	vend

ANA

ADD	nb_written

ST	nb_written

LD 	file_id	(* 寫入vinc *)

FA_WRITE	vinc

ANA

ADD	nb_written

LD	(* 寫入delta_tim *)

ANA	(* 轉換成整數 *)

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	(* 若等於4就跳回 *)

LD	ERR_FILE	(* 否則錯誤 *)

ST	ERROR


FM_READ

引數：

ID	整數	檔案編號：其值經由F_ROPEN返回所得。

Q	訊息	從檔案讀取回來的字串

描述：

從二進位檔案讀取回來的訊息變數。

須和F_ROPEN和F_CLOSE一起使用。

此程序從先前位置開始，對檔案進行循序式的讀取。

在F_ROPEN動作後的第一次呼叫，將會讀取檔案的前面的字串，每次呼叫則會將讀取指標加上字串長度。

字串的結束可以是null(0)、列結束 ( '\n' )，或歸回 ( '\r' )。

要檢查是否已到達檔案的結尾，則使用F_EOF。

此函數並不包含在ISaGRAF的模擬器中。

(* FBD範例：使用檔案管理方塊 *)

(* ST相等式︰*)

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);

(* IL相等式︰*)

LD	'voltramp.bin'

F_ROPEN

ST	file_id

FM_READ	(* 讀取status1 *)

ST	status1

LD 	file_id

FM_READ	(* 讀取status2 *)

ST	status2

LD 	file_id

F_EOF

JMPNC	CLOSE_FILE	(* 若檔案結束則跳過不動作 *)

LD	ERR_FILE

ST	ERROR

LD 	file_id

FM_READ	(* 讀取unused_eof_mes *)

ST	unused_eof_mes

CLOSE_FILE	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