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つのプログラムファイルに用いることも可能です。

戻り値を使用したい場合、ファンクション名と同名の変数に値を代入してから、関数を終了させてください。

ファンクションの呼び出し方法には以下があります。

  1. Xqtの引数として指定する。 別タスクとしてファンクションを呼び出します。Xqt は、指定されたファンクションを開始し、すぐに戻ります。
  2. Callの引数として指定する。 サブルーチンとしてファンクションを呼び出します。Call は指定されたファンクションに、プログラム制御を移します。
  3. ファンクション名を記入する。 Callによる呼び出しとみなされます。戻り値が文字列の場合はエラーになります。
  4. コマンドの引数として指定する。 サブルーチンとしてファンクションが実行され、その戻り値が呼び出し元のコマンドへの引数として代入されます。 Quitなどタスク識別子を引数とするコマンドにタスク名として指定する場合は、引数や前後の括弧を記載しません。

参照
Call, 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