Function...Fend
1つのファンクションは、Functionステートメントで始まりFendステートメントで終わる、実行可能なプログラムの最小単位となります。
書式
Function ファンクション名 [(引数リスト)] [As 型(関数)]
ステートメント
Fend
パラメーター
- ファンクション名
- Functionで始まりFend命令で終わるステートメントのグループに対する名前を、アルファベット64文字以内で指定します。アンダースコアを用いることも可能です。
- 引数リスト
- 呼び出されて、ファンクションに渡される引数の変数のリストです。複数の変数の場合は、カンマで区切ります。省略可能です。
引数の書式は下記のとおりです。[ {ByRef | ByVal} ] 変数名[( )] As 型(引数)
変数の渡し方は、ByRef/ByValのいずれかを指定します。省略した場合はByValを指定したとみなします。
- ByRef
- 呼び出すファンクションの変数を参照する場合は、ByRefを指定します。この場合、ファンクション内での引数の変更を、呼び出し側の変数に反映させることができます。
- ByVal
- デフォルト設定です。呼び出すファンクションで参照する変数の値の変更をしない場合は、ByValを指定します。省略可能です。
- 変数名[()]
- 引数の変数名で、必須パラメーターです。変数名のつけ方の規則にしたがってください。配列変数を引数として使用する場合は、ByRefを必ず指定した上で、配列を示す"()"中抜きの括弧を変数の後ろに付加してください。
- As 型(引数)
- 必須パラメーターです。引数の型を宣言してください。
- As 型(関数)
- 戻り値を取得したい場合に付加するパラメーターです。戻り値の型を宣言してください。
戻り値
ファンクション宣言の最後にAsで指定されたデータ型です (As 型(関数))。宣言がない場合は数値の0が戻り値になります。
解説
Functionステートメントは、SPEL+ステートメントグループの始まりを示します。1つのファンクションの終わりは、Fendステートメントで示します。FunctionとFendステートメントの間にあるステートメントは、すべてそのファンクションの一部と考えます。
FunctionとFendステートメントは、その間にあるすべてのステートメントを含む、それ自体が1つのファンクションである、入れ物のようなものだと考えられます。複数のファンクションを、1つのプログラムファイルに用いることも可能です。
戻り値を使用したい場合、ファンクション名と同名の変数に値を代入してから、関数を終了させてください。
ファンクションの呼び出し方法には以下があります。
- Xqtの引数として指定する。 別タスクとしてファンクションを呼び出します。Xqt は、指定されたファンクションを開始し、すぐに戻ります。
- Callの引数として指定する。 サブルーチンとしてファンクションを呼び出します。Call は指定されたファンクションに、プログラム制御を移します。
- ファンクション名を記入する。 Callによる呼び出しとみなされます。戻り値が文字列の場合はエラーになります。
- コマンドの引数として指定する。 サブルーチンとしてファンクションが実行され、その戻り値が呼び出し元のコマンドへの引数として代入されます。 Quitなどタスク識別子を引数とするコマンドにタスク名として指定する場合は、引数や前後の括弧を記載しません。
参照
Call, Function...Fend, Halt, Quit, Return, Xqt
Function...Fend使用例
[例 1]
下記は、1つのファイルに3つのファンクションを含む例です。task2とtask3は、mainから呼び出され、mainと同時に実行されます。
Function main
Xqt 2, task2 'タスク2を同時に実行
Xqt 3, task3 'タスク3を同時に実行
.
.
.
Fend
Function task2
Do
On 1
On 2
Off 1
Off 2
Loop
Fend
Function task3
Do
On 10
Wait 1
Off 10
Loop
Fend
[例 2] 下記は、周辺装置の圧力制御シーケンスを引数として与え、外部装置に送信したときの結果を戻り値として画面表示する場合の、ファンクション例です。
Function main
Integer iResult
Real Sequence1(200)
.
.
iResult = PressureControl(ByRef Sequence1()) '引数は配列
.
Print "Result:", iResult
.
Fend
Function PressureControl(ByRef Array1() As Real) As Integer
.
(Array1配列に基づいて、周辺装置を圧力制御)
.
PressureControl = 3 '戻り値
.
.
Fend
[例 3]
下記は、ファンクションの呼び出し方による違いの例です。
Function main
' 戻り値も引数も定義がないファンクション
Print TaskInfo(SubFunction0, 0) ' タスク名"SubFunction0"の情報を取得します。
Print TaskInfo((SubFunction0), 0) ' サブルーチンとして実行した後、戻り値の"0"が範囲外となりエラーになります。
' 戻り値が定義されているファンクション
Print TaskInfo(SubFunction1, 0) ' タスク名"SubFunction0"の情報を取得します。
Print TaskInfo((SubFunction1), 0) ' サブルーチンとして実行した後、戻り値に相当するタスク番号の情報を取得します。
' 戻り値と引数の両方が定義されているファンクション
Print TaskInfo(SubFunction2, 0) ' タスク名"SubFunction2"の情報を取得します。
Print TaskInfo(SubFunction2(0), 0) ' サブルーチンとして実行した後、戻り値に相当するタスク番号の情報を取得します。
' 戻り値が文字列で定義されているファンクション
Print TaskInfo(SubFunction1$, 0) ' タスク名"SubFunction1$"の情報を取得します。
Print TaskInfo((SubFunction1$), 0) ' 第一引数のデータ型が異なるためビルドエラーになります。
Fend
Function SubFunction0
・
Fend
Function SubFunction1 As Integer
・
SubFunction1 = 1
Fend
Function SubFunction2(i As Integer) As Integer
・
SubFunction2 = 1
Fend
Function SubFunction1$ As String
・
SubFunction1$ = "main"
Fend
← FreeFile関数 G →