>サイトトップへ >このカテゴリの一覧へ

B 3503

:2016 (IEC 61131-3:2013)

(1)

目  次

ページ

序文

1

1

  適用範囲

1

2

  引用規格

1

3

  用語及び定義

2

4

  アーキテクチャルモデル

10

4.1

  ソフトウェアモデル

10

4.2

  コミュニケーションモデル

12

4.3

  プログラミングモデル

13

5

  規格順守性

14

5.1

  概要

14

5.2

  項目表

15

5.3

  実装者の規格順守対照表

15

6

  共通要素

16

6.1

  印刷文字の使用法

16

6.2

  プラグマ

18

6.3

  リテラル−データの外部表現

18

6.4

  データ型

23

6.5

  変数

39

6.6

  プログラム構成ユニット(POU

50

6.7

  シーケンシャルファンクションチャート(SFC)の各要素

152

6.8

  コンフィグレーションの各要素

177

6.9

  名前空間

189

7

  テキスト形式言語

198

7.1

  共通要素

198

7.2

  命令リスト(IL 言語)

199

7.3

  構造化テキスト(ST 言語)

204

8

  グラフィック言語

211

8.1

  共通要素

211

8.2

  ラダー図(LD

218

8.3

  ファンクションブロック図(FBD

221

附属書 A(規定)言語要素の形式仕様

223

附属書 B(参考)第三版の主要変更点及び拡張リスト

236


B 3503

:2016 (IEC 61131-3:2013)

(2)

まえがき

この規格は,工業標準化法第 14 条によって準用する第 12 条第 1 項の規定に基づき,一般社団法人日本

電機工業会(JEMA)及び一般財団法人日本規格協会(JSA)から,工業標準原案を具して日本工業規格を

改正すべきとの申出があり,日本工業標準調査会の審議を経て,経済産業大臣が改正した日本工業規格で

ある。

これによって,JIS B 3503:2012 は改正され,この規格に置き換えられた。

この規格は,著作権法で保護対象となっている著作物である。

この規格の一部が,特許権,出願公開後の特許出願又は実用新案権に抵触する可能性があることに注意

を喚起する。経済産業大臣及び日本工業標準調査会は,このような特許権,出願公開後の特許出願及び実

用新案権に関わる確認について,責任はもたない。


日本工業規格

JIS

 B

3503

:2016

(IEC 61131-3

:2013

)

プログラマブルコントローラ−プログラム言語

Programmable controllers-Programming languages

序文

この規格は,2013 年に第 3 版として発行された IEC 61131-3 を基に,技術的内容及び構成を変更するこ

となく作成した日本工業規格である。

なお,この規格で点線の下線を施してある参考事項は,対応国際規格にはない事項である。

1

適用範囲

この規格は,JIS B 3501 に規定するプログラマブルコントローラに用いるプログラム言語の構文規則及

び意味論について規定する。

プログラム入力,試験,監視,オペレーティングシステムなどの機能は,JIS B 3501 に規定する。

この規格は,プログラマブルコントローラ(PLC)に用いる統一プログラム言語一式の構文規則及び意

味論について規定する。この規格のプログラム言語は,命令リスト(IL)及び構造化テキスト(ST)の二

つのテキスト言語,並びにラダー図(LD)及びファンクションブロックダイアグラム(FBD)の二つのグ

ラフィック言語で構成する。

プログラマブルコントローラプログラム及びファンクションブロックの内部構造を構築するためのシー

ケンシャルファンクションチャート(SFC)と名付けられた追加図式等価文字要素セットを規定する。ま

た,プログラマブルコントローラシステムへのプログラマブルコントローラプログラムのインストールを

支援する構成要素も規定する。

さらに,自動システムのプログラマブルコントローラとその他のコンポーネントとの通信を容易にする

項目も規定する。

注記  この規格の対応国際規格及びその対応の程度を表す記号を,次に示す。

IEC 61131-3:2013

,Programmable controllers−Part 3: Programming languages(IDT)

なお,対応の程度を表す記号“IDT”は,ISO/IEC Guide 21-1 に基づき,

“一致している”こ

とを示す。

2

引用規格

次に掲げる規格は,この規格に引用されることによって,この規格の規定の一部を構成する。これらの

引用規格は,その最新版(追補を含む。

)を適用する。

JIS B 3501

  プログラマブルコントローラ−一般情報

注記  対応国際規格:IEC 61131-1,Programmable controllers−Part 1: General information(MOD)

JIS C 0617-12

  電気用図記号−第 12 部:二値論理素子

注記  対応国際規格:IEC 60617-DB,Graphical symbols for diagrams(MOD)


2

B 3503

:2016 (IEC 61131-3:2013)

JIS X 0221

  国際符号化文字集合(UCS)

注記  対応国際規格:ISO/IEC 10646:2011,Information technology−Universal Coded Character Set

(UCS)(IDT)

IEC 60848

,GRAFCET specification language for sequential function charts

IEC 61131-5

,Programmable controllers−Part 5: Communications

ISO/IEC/IEEE 60559

,Information technology−Microprocessor Systems−Floating-Point arithmetic

3

用語及び定義

この規格で用いる主な用語及び定義は,JIS B 3501 によるほか,次による。

3.1

絶対時刻(absolute time)

日付と時刻とを組み合わせた情報。

3.2

アクセスパス(access path)

オープンコミュニケーションのための記号名と変数との関係。

3.3

アクション(action)

制御構造に連結されたブール変数又は実行する演算の集まり。

3.4

アクションブロック(action block)

あらかじめ決定された制御構造に従って,ブール入力変数を用いてブール出力変数値,又はアクション

を有効にする条件の値を決定するグラフィック言語要素。

3.5

集合体(aggregate)

一つのデータ型を型成する,構造化されたデータオブジェクトの集合。

ISO/AFNOR:1989 参照)

3.6

配列(array)

同一の属性をもつデータオブジェクトからなる集合体。それぞれのデータオブジェクトは,添字付けに

よって個別に参照する。

ISO/AFNOR:1989 参照)

3.7

代入(assignment)

値を変数又は集合体に与える仕組み。

ISO/AFNOR:1989 参照)

3.8

基本型(base type)

そこから追加型に継承される/派生するデータ型,ファンクションブロック型又はクラス。

3.9

底(based number)


3

B 3503

:2016 (IEC 61131-3:2013)

数が 10 の場合は省略し,10 以外の数の場合は明示する,底の数。

3.10

二進化十進数(binary coded decimal),BCD

それぞれの桁が固有の 2 進数列で表す 10 進数のコード化。

3.11

双安定ファンクションブロック(bistable function block)

一つ以上の入力で制御する二つの安定状態をもつファンクションブロック。

3.12

ビット列(bit string)

一つ以上のビットからなるデータ要素。

3.13

ビット列リテラル(bit string literal)

BOOL,BYTE,WORD,DWORD 又は LWORD のデータ型のビット列値を直接表すリテラル。

3.14

ボディ(body)

プログラム構成ユニットの演算の集合。

3.15

呼出し(call)

ファンクション及びファンクションブロックの実行を呼び出すための構文構造。

3.16

文字列(character string)

順序付けられた文字の集合体。

3.17

文字列リテラル(character string literal)

CHAR,WCHAR,STRING 又は WSTRING のデータ型の文字又は文字列値を直接表すリテラル。

3.18

クラス(class)

次で構成するプログラム構成ユニット。

a)

データ構造の定義

b)

データ構成の際に行われる一式のメソッド

3.19

コメント(comment)

テキストに含むが,プログラムの実行には影響しない構文要素。

ISO/AFNOR:1989 参照)

3.20

コンフィグレーション(configuration)

プログラマブルコントローラシステムに対応する言語要素。

3.21

定数(constant)

固定値のデータ要素を宣言する言語要素。


4

B 3503

:2016 (IEC 61131-3:2013)

3.22

カウンタファンクションブロック(counter function block)

一つ以上の入力から検知した変化の数を累積するファンクションブロック。

3.23

データ型(data type)

使用可能な演算の集合を伴う値の集合。

ISO/AFNOR:1989 参照)

3.24

日付及び時刻(date and time)

日付及び時刻を表す言語要素。

3.25

宣言(declaration)

言語要素の規定を構築するための仕組み。

3.26

区切り文字(delimiter)

プログラム言語要素を区切るために用いる文字及び文字の組合せ。

3.27

派生クラス(derived class)

もう一つのクラスからの継承によって作られるクラス(拡張クラス又は子クラスとも名付けられる。

3.28

派生データ型(derived data type)

もう一つのデータ型を用いて作られるデータ型。

3.29

派生ファンクションブロック型(derived function block type)

もう一つのファンクションブロック型からの継承によって作られるファンクションブロック型。

3.30

直接表現(direct representation)

実装が,物理又は論理位置への対応を直接に決定する,プログラマブルコントローラのプログラムにお

ける変数を表現する方法。

3.31

2

倍長ワード(double word)

32 ビットのデータ要素。

3.32

動的束縛(dynamic binding)

メソッド呼出しのインスタンスが,インスタンス又はインタフェースの実際の型に基づいて実行時に検

索される状況。

3.33

評価(evaluation)

プログラムが実行している間,式,ファンクション,ネットワークの出力及びファンクションブロック

インスタンスの出力の値を確立するプロセス。


5

B 3503

:2016 (IEC 61131-3:2013)

3.34

実行制御要素(execution control element)

プログラム実行の流れを制御する言語要素。

3.35

立下りエッジ(falling edge)

ブール型変数の 1 から 0 への変化。

3.36

ファンクション(function)

実行したとき,一般的に一つのデータ要素結果及び付加的な出力変数を返す言語要素。

3.37

ファンクションブロックインスタンス(function block instance)

ファンクションブロック型のインスタンス。

3.38

ファンクションブロック型(function block type)

次のものから構成する言語要素。

a)

入力,出力及び内部変数に分割されたデータ構造体の定義。

b)

ファンクションブロック型のインスタンスが呼び出されたときに,データ構造体に対して実行する演

算又はメソッドの集合。

3.39

ファンクションブロック図(function block diagram)

ノードがグラフィカルで表現されたファンクション,メソッド呼出し,変数,リテラル及びラベルから

なるネットワーク。

3.40

総称データ型(generic data type)

一つ以上のデータ型で表現するデータ型。

3.41

グローバル変数(global variable)

スコープがグローバルである変数。

3.42

階層的アドレス(hierarchical addressing)

物理的又は論理的階層の一部としてデータ要素を直接表現すること。例えば,盤内の一つのラック中の

あるモジュールの中の一点。

3.43

識別子(identifier)

1 文字又は下線記号で始まり,言語要素を名付ける文字,数字及び下線記号の組合せ。

3.44

実装(implementation)

PLC 又は実装者用が提供するプログラミングツール及びデバッグツールの製品版。

3.45

実装者(implementer)


6

B 3503

:2016 (IEC 61131-3:2013)

PLC 用途をプログラムするために使用者へ提供される PLC 又はプログラミングツール及びデバッグツ

ールの実装者。

3.46

継承(inheritance)

既存のクラス,ファンクションブロック又はインタフェースのそれぞれに基づいた新しいクラス,ファ

ンクションブロック又はインタフェースを作ること。

3.47

初期値(initial value)

システムの立上げ時に変数に設定する値。

3.48

入出力変数(in-out variable)

プログラム構成ユニットに値を与えるために用いられる変数であり,また,プログラム構成ユニットか

らの値を戻すためにも付加的に用いられる。

3.49

入力変数(input variable)

クラス以外のプログラム構成ユニットに対し値を与えるための変数。

3.50

インスタンス(instance)

個々に名付けられた,ファンクションブロック型,クラス又はプログラム型に関連付けられたデータ構

造のコピー。関連付けられた演算の一つの呼出しから次の呼出しまで持続する。

3.51

インスタンス名(instance name)

定義されたインスタンスに関連付けられる識別子。

3.52

インスタンス化(instantiation)

インスタンスの生成。

3.53

整数(integer)

正の値,0 及び負の値を含むことがある整数。

3.54

整数リテラル(integer literal)

整数値を直接表現するリテラル。

3.55

インタフェース(interface)

メソッドのプロトタイプの集合を含むオブジェクト指向のコンテキスト内の言語要素。

3.56

予約語(keyword)

言語要素を特性付ける字句単位。

3.57

ラベル(label)


7

B 3503

:2016 (IEC 61131-3:2013)

命令,ネットワーク及びネットワークのグループを名付ける,識別子をもつ構文要素。

3.58

言語要素(language element)

形式仕様において,生成規則の左辺の記号によって表す項目。

3.59

リテラル(literal)

値を直接表現する字句単位。

ISO/AFNOR:1989 参照)

3.60

論理位置(logical location)

プログラマブルコントローラの入力,出力及びメモリの物理構成の位置的関係に関係なく,概念上で階

層的にアドレスされた変数の位置。

3.61

64

ビット実数(long real)

ロングワードで表す実数。

3.62

ロングワード(long word)

64 ビットのデータ要素。

3.63

メソッド(method)

ファンクションブロック型の範囲内だけで定義できるファンクションに類似した言語要素であり,ファ

ンクションブロックインスタンス又はクラスインスタンスの静的変数に潜在的にアクセスできる。

3.64

メソッドのプロトタイプ(method prototype)

メソッドのシグネチャだけを含む言語要素。

3.65

名前付き要素(named element)

関連付けられた識別子によって名付けられた構造の要素。

3.66

ネットワーク(network)

ノードとノードとを相互に接続する枝の配置。

3.67

数値リテラル(numeric literal)

数値を直接表すリテラル,すなわち,整数リテラル又は実数リテラル。

3.68

演算(operation)

プログラム構成要素又はメソッドに属する基本的な機能性を表す言語要素。

3.69

オペランド(operand)

演算が実行される対象の言語要素。


8

B 3503

:2016 (IEC 61131-3:2013)

3.70

演算子(operator)

演算中に実行されるアクションを表す記号。

3.71

オーバライド(override)

新しいメソッドボディを用いる基底クラス又はブロックタイプのメソッドと同じシグネチャをもつメソ

ッドに用いる派生クラス又はファンクションブロック型のメソッドと一緒に用いられる予約語。

3.72

出力変数(output variable)

クラスを除くプログラム構成ユニットからの値を返すために用いられる変数。

3.73

パラメータ(parameter)

プログラム構成ユニットに(入力パラメータ又は入出力パラメータとして)値を提供するために用いら

れる変数,又はプログラム構成ユニットから(出力パラメータ又は入出力パラメータとして)値を戻すた

めに用いられる変数。

3.74

リファレンス(reference)

変数又は指定型のファンクションブロックのインスタンスへの位置アドレスを含むユーザ定義データ。

3.75

パワーフロー(power flow)

ラダー図において,論理的解法のアルゴリズムの進行状態を表すのに用いられる疑似的電力の流れ。

3.76

プラグマ(pragma)

プログラム構成ユニットの中でプログラムの実行の準備に影響するテキストを取り込むための言語要素。

3.77

プログラムする(program)

プログラムを設計,記述及び試験する。

注記  JIS X 0001 参照。

3.78

プログラム構成ユニット(program organization unit),POU

ファンクション,ファンクションブロック,クラス又はプログラム。

3.79

実数リテラル(real literal)

REAL

又は LREAL の値を直接表現するリテラル。

3.80

リソース(resource)

“信号処理機能”

,その“ヒューマンマシンインタフェース機能”

“センサ及びアクチュエータインタフ

ェース機能”などに対応する言語要素。

3.81

結果(result)


9

B 3503

:2016 (IEC 61131-3:2013)

ファンクション又はメソッドの結果として戻される値。

3.82

リターン(return)

あるプログラム構成ユニットにおいて,実行動作の終了を示す構文要素。

3.83

立上りエッジ(rising edge)

ブール型変数の 0 から 1 への変化。

3.84

スコープ(scope)

宣言又はラベルを適用するプログラム構成ユニットの集合。

3.85

意味論(semantics)

プログラム言語の記号要素と,その意味,解釈及び使用との間の関係。

3.86

セミグラフィック表現(semigraphic representation)

限定された一連の文字を用いたグラフィック表現。

3.87

シグネチャ(signature)

METHOD

のパラメータインタフェースの同一性を明確に定義する情報の集合であり,メソッド名並びに

全てのパラメータの名前,型及び順序(例えば,入力,出力,入出力変数及び結果型)で構成される。

3.88

単一要素変数(single-element variable)

単一データ要素を表現する変数。

3.89

静的変数(static variable)

呼び出される間,値を保持する変数。

3.90

ステップ(step)

シーケンシャルファンクションチャート(SFC)を表現する要素の一つで,プログラム構成ユニットの

入力及び出力に対して,ステップに連結されたアクションで定義される一組の規則に従って動作するプロ

グラム構成ユニットの状態。

3.91

構造データ型(structured data type)

STRUCT

宣言又は FUNCTION_BLOCK 宣言を用いて表現される集合型データ型。

3.92

添字付け(subscripting)

配列の参照及び評価時に要素位置を示す一つ以上の表現によって配列要素を参照する仕組み。

3.93

記号表現(symbolic representation)

変数に名前を付けるための識別子の使用法。


10

B 3503

:2016 (IEC 61131-3:2013)

3.94

タスク(task)

プログラム構成ユニットの一群の周期的又はトリガによる実行のために提供される実行制御要素。

3.95

時間リテラル(time literal)

TIME

,DATE,TIME_OF_DAY 又は DATE_AND_TIME のデータ型の値を直接表現するリテラル。

3.96

トランジション(transition)

シーケンシャルファンクションチャート(SFC)を表現する要素の一つで,有向接続線に沿って,一つ

以上の前置ステップから一つ以上の後置ステップへ制御を展開させる条件。

3.97

符号なし整数(16 ビット)(unsigned integer)

プラス又はマイナス符号を含むことがある整数リテラル。

3.98

符号なし整数(16 ビット)リテラル(unsigned integer literal)

先導プラス(+)又はマイナス(−)記号を含まない整数リテラル。

3.99

ユーザ定義データ型(user-defined data type)

使用者が定義するデータ型。

例  列挙,配列又は構造

3.100

変数(variable)

一度に一つのそれぞれ異なる値になるソフトウェア実体。

4

アーキテクチャルモデル

4.1

ソフトウェアモデル

基本的な上位言語要素及びその相関関係は,

図 による。

これらは,この規格で規定する言語でプログラムする要素,すなわち,プログラム及びファンクション

ブロック型,クラス,ファンクション及びコンフィグレーション要素,すなわち,コンフィグレーション,

リソース,タスク,グローバル変数,アクセスパス及びインスタンスごとの初期化などのプログラマブル

コントローラシステムへプログラムの導入をサポートする要素で構成する。


11

B 3503

:2016 (IEC 61131-3:2013)

注記 1  この図はイラスト的に表しており,このグラフィック表現は規定ではない。 
注記 2  一つだけリソースをもったコンフィグレーションの中では,リソースの明記は必要ない。

図 1−ソフトウェアモデル

コンフィグレーションは,JIS B 3501 に規定するプログラマブルコントローラシステムに相当する言語

要素である。リソースは,JIS B 3501 に規定する“信号処理機能”

“ヒューマンマシンインタフェース機

能”

“センサ,アクチュエータとのインタフェース機能”などに相当する。

一つのコンフィグレーションは,一つ以上のリソースを含む。それぞれのリソースに,0(ゼロ)又は一

つ以上のタスクの制御下で実行する一つ以上のプログラムを含む。

プログラムには,ファンクションブロック又はこの規格に規定する他の言語要素を含んでもよい。

タスクは,例えば,定期的にプログラム及びファンクションブロックインスタンスの集合を実行させる

ことができる。

コンフィグレーション及びリソースは,JIS B 3501 に規定する“ヒューマンマシンインタフェース”

“プ

ログラミング,試験及び監視”

,又は“オペレーティングシステム”などの機能によって,始動及び停止す

ることができる。コンフィグレーションの始動はそのグローバル変数を初期化させ,続いてコンフィグレ

ーション内の全てのリソースを始動させる。リソースの始動は,リソース内の全ての変数を初期化させ,

続いてリソース内の全てのタスクを実行可能にする。コンフィグレーションを停止すると全てのリソース

が停止し,リソースの停止は,全てのタスクを実行不可にする。

タスクを制御する仕組みは,この規格の 8.3.2 に規定する。さらに,通信機能経由でのコンフィグレーシ


12

B 3503

:2016 (IEC 61131-3:2013)

ョン及びリソースの始動及び停止の仕組みは,IEC 61131-5 に規定している。

プログラム,リソース,グローバル変数,アクセスパス(及びそれに対応するアクセス権)及びコンフ

ィグレーションは,JIS B 3501 に規定する“通信機能”によって,ロード又は消去される。コンフィグレ

ーション又はリソースのロード又は消去は,それに含まれる全ての要素のロード又は消去と等価である。

アクセスパス及びそれに対応するアクセス権は,この規格に規定する。

言語要素の通信オブジェクトへのマッピングは,IEC 61131-5 の規定による。

4.2

コミュニケーションモデル

変数の値をソフトウェア要素の間でやり取りする方法は,

図 による。

図 2  a)に表すとおり,プログラム内の変数の値は,一つのプログラム要素の出力と他のプログラム要素

の入力との接続で直接伝達している。この接続は,グラフィック言語では明示的に示されるが,テキスト

表現言語では暗黙的である。

変数の値は,

図 2 b)の変数“x”のように,グローバル変数を経て,同じコンフィグレーション中のプロ

グラム間を伝達する。これらの変数は,このコンフィグレーションの中で GLOBAL として,また,プログ

ラム中で EXTERNAL として宣言する。

図 2 c)に表すように,変数の値は,IEC 61131-5 に規定する“通信ファンクションブロック”を用いて,

一つのプログラムの異なる部分間,同じ若しくは異なるコンフィグレーション間,又はプログラマブルコ

ントローラプログラムとプログラマブルでないコントローラシステムとの間で通信することができる。

加えて,プログラマブルコントローラシステム又はプログラマブルでないコントローラシステムは,

2 d)

に表すように,アクセスパスによって,IEC 61131-5 に規定する仕組みを用いてデータを転送できる。


13

B 3503

:2016 (IEC 61131-3:2013)

PROGRAM A

a

FB1

FB_Y

b

FB2

a

F B_Y

b

x

x

CO N F IGU R AT IO N   C

VA R_ G LO B AL
  x: BO O L ; 
EN D_V A R

FB 2

1

F B_X

PR O G R AM A

AR _EX TE R NAL

: BO OL ;

EN D _V AR

PR O G RA M  B 
    V AR _EX TE R N A  
  x  BO OL; 
EN D _V AR

a)

  プログラム内のデータフロー接続 

b)

  グローバル変数経由の通信 

c)

  通信ファンクションブロック経由 

d)

  アクセスパス経由の通信 

注記 1  この図はイラスト的に表しており,このグラフィック表現は規定ではない。 
注記 2  これらの例では,コンフィグレーション C,D はそれぞれ一つのリソースをもつとみなす。 
注記 3  通信ファンクションブロックの詳細は,図 には示さない。 
注記 4  アクセスパスは,直接表現変数,グローバル変数,プログラム又はファンクションブロックインスタンスの

入出力又は内部変数に対して宣言できる。

注記 5  IEC 61131-5 は,PLC システム及び PLC 以外のシステムの両方が変数のリード及びライトのためのアクセス

パスの使用方法について規定している。

図 2−通信モデル

4.3

プログラミングモデル

PLC 言語要素の要約は,図 による。これらの要素の組合せは,次の規則による。

a)

データ型は,標準データ型又は先に定義したデータ型を用いて宣言しなければならない。

b)

ファンクションは,標準データ型又はユーザ定義データ型,標準ファンクション及び先に定義したフ

ァンクションを用いて宣言することができる。

この宣言は,IL,ST,LD 及び FBD 言語用に規定する仕組みを用いなければならない。

c)

ファンクションブロック型は,標準データ型又はユーザ定義データ型,ファンクション,標準ファン

クションブロック型及び先に定義したファンクションブロック型を用いて宣言することができる。

これらの宣言は,IL,ST,LD 又は FBD 言語用に定義された仕組みを用いなければならず,シーケ

ンシャルファンクションチャート(SFC)要素を含むことができる。

さらに,メソッド及びインタフェースを用いるオブジェクト指向のファンクションブロック型又は

クラスを定義してもよい。

d)

プログラムは,標準データ型又はユーザ定義データ型,ファンクション,ファンクションブロック及

びクラスを用いて宣言することができる。

この宣言は IL,ST,LD 及び FBD 言語用に定義された仕組みを用いなければならず,シーケンシャ

ルファンクションチャート(SFC)要素を含むことができる。

e)

プログラムは,要素(グローバル変数,リソース,タスク及びアクセスパス)を用いてコンフィグレ

ーションに組み込むことができる。

b

send1

RCV

プログラムA

FB1

コンフィグレーションC

SEND

a

SD1

FB_Y

FB2

コンフィグレーションD

rcv1

RD1

プログラムB

FB-X

プログラムA

FB_X

FB1

a

Z

VAR_ACCESS
CSX: P1.Z : REAL READ_ONLY;

P プログラムB

FB_Y

b

FB2

コンフィグレーション C

コンフィグレーション D

READ

TO_FB2

RD1

'CSX'

VAR_1

P1

コンフィグレーション C

プログラム A

 VAR_EXTERNAL

 x: BOOL

END_VAR

プログラム B

 VAR_EXTERNAL

 x: BOOL

END_VAR

FB1

FB2

FB_X

FB_Y

a

b

VAR_GLOBAL

 x: BOOL

END_VAR

x

x

FB_Y

FB_X

FB1

FB2

b

a

PROGRAM A

プログラム A


14

B 3503

:2016 (IEC 61131-3:2013)

上記の規則に従った“先に定義した”データ型,ファンクション及びファンクションブロックへの

リファレンスは,一度そのような先に定義した要素を宣言すれば,その定義が利用できることを意味

する。この宣言は,例えば,先に定義した要素の“ライブラリ”で更なる定義に利用できる。

この規格に定義されていないプログラム言語を,ファンクション,ファンクションブロック型及び

メソッドのプログラミングに用いてもよい。

先に定義した要素

作成手段

使用者定義要素

及びライブラリ要素

図 3PLC 言語要素の組合せ

5

規格順守性

5.1

概要

JIS B 3501

に規定した PLC プログラミングツール及びデバッグツール(PADT)が,完全に又は部分的

にこの規格の要求事項に順守していることを示すには,次のようにしなければならない。

a)

次に示す項目の一部,及び実装者の規格順守対照表を提供する。

b)

いずれかの項目を達成するために他の言語要素を代用又は追加してはならない。

c)

全ての実装者固有の拡張を記述したドキュメントを提供しなければならない。これらの拡張は,この

規格で禁止している又は規定しないシステム仕様のあらゆる項目である。

d)

全ての実装者依存を記述したドキュメントを提供しなければならない。これには,この規格において

明確に規定されている実装依存のパラメータ及びパラメータの範囲(例えば,最大長,数,値の大き

さ及び範囲)が含まれる。

e)

実装によって検出可能であり,また,報告される全てのエラーを記述したドキュメントを提供しなけ

ればならない。このドキュメントは,この規格において明確に規定されているエラー及びプログラム

の実行準備段階で検出可能なエラー及びプログラム実行時に検出可能なエラーを含む。

宣言

データ型

−  標準 
−  使用者定義

ファンクション 
−  標準

−  使用者定義

ファンクションブロック 
クラス,インタフェース

−  標準

−  使用者定義

メソッド 
−  使用者定義

プログラム

リソース

IL,ST,LD,FB,
その他での宣言

IL,ST,LD,FB,
SFC 要素,その他で
の宣言

IL,ST,LD,FB,
SFC 要素での宣言

宣言

グローバル変数 
アクセスパス

タスク

使用者定義 
データ型

使用者定義 
ファンクション

使用者定義

ファンクションブロック,

クラス,インタフェース

プログラム

コンフィグレーション

(1)

(2)

(3)

(4)

(5)


15

B 3503

:2016 (IEC 61131-3:2013)

注記  プログラム実行時に発生するエラーの一部分だけを,この規格で記述する。

f)

実装者が定める仕様項目がこの規格の規定と異なる場合は,この規格の標準のデータ型,ファンクシ

ョン及びファンクションブロックの名称を用いてはならない。

5.2

項目表

この規格の中の表は,共通の構造で専用の用途に用いる。最初の欄は,

“項目番号”を含み,2 番目の欄

は“項目の説明”を示し,3 番目以降の欄は,例又はより詳しい情報を含んでもよい。この表の構造は,

実装者の規格順守対照表で用いる。

5.3

実装者の規格順守対照表

実装者は,項目表に記載されている項目のどの一致部分を定義してもよく,その項目を“実装者規格順

守対照表”で公表する。

実装者の規格順守対照表は,そのシステムに添付する文書に含める,又はシステムから出力できるよう

にする。

実装者の規格順守対照表の書式には,次の情報がなければならない。一例は,

図 による。

・  実装者の名前及び住所,製品名及びバージョン,コントローラのタイプ及びバージョン,並びに発行

日を含む一般情報。

・  各実装項目について,対応する項目表の番号,項目番号及び適用可能なプログラム言語。

項目表のタイトル及びサブタイトル,項目の説明,例,実装者の備考などは,任意とする。

実装されていない表及び項目は,省略してもよい。


16

B 3503

:2016 (IEC 61131-3:2013)

JIS B 3503

“PLC プログラム言語”

 
実装者  :会社名,住所など 
製品

:製品名,バージョンなど。コントローラタイプ固有のサブセットなど

日付

:2012 年 5 月 01 日

この製品は,次の言語仕様に関してこの規格の要求事項に順守しています。

項目

番号

表番号及びタイトル/

項目説明

実装言語の順守性

(✔)

実装者備考

LD

FBD

ST

IL

表 1−文字セット

1

JIS X 0221

,国際符号化文字集合(UCS)

2a

小文字  :

a, b, c, …

“ß, ü, ä, ö”ではない

2b

数値記号: #

表 参照

2c

ドル記号: $

表 参照

表 2−識別子

1

大文字及び数字:

IW215

2

大文字及び小文字,数字,途中の下線(アンダースコア?)

3

大文字及び小文字,数字,先頭又は途中の下線(アンダースコ
ア?)

表 3−コメント 

1

一行コメント

//…

2a

複数行コメント

(*  …  *)

2b

複数行コメント

/*  …    */

3a

入れ子にされたコメント

(* ..(* .. *) ..*)

3b

入れ子にされたコメント

/* .. /* .. */ .. */

表 4−プラグマ

1

プラグマ

{  …  }

表 5−数値リテラル

1

整数リテラル:

−12

2

実数リテラル:

−12.0

3

指数付実数リテラル:

−1.34E−12

4 2 進リテラル:

2#1111_1111

5 8 進リテラル:

8#377

6 16 進リテラル:

6#FF

7

ブール 0 及び 1

8

ブール偽及び真

9

データ型指定リテラル:

INT#

−123

など

図 4−実装者の規格順守対照表(例)

6

共通要素

6.1

印刷文字の使用法

6.1.1

文字セット

テキスト表現言語及びグラフィック言語におけるテキスト表現要素の文字セットは,

表 による。文字

は,JIS X 0221 で表す。


17

B 3503

:2016 (IEC 61131-3:2013)

表 1−文字セット

No.

説明

1

JIS X 0221 

2a

小文字

a)

a, b, c

2b

数値記号: #

表 参照

2c

ドル記号: $

表 参照

a)

  小文字を用いるときは,大文字であるか小文字であるかは言語要素の中で意味をもってはならない。ただし,

6.1.5

に規定するコメント,6.3.3 に規定する文字列リテラル,並びに 6.3.3 に規定する STRING 型及び WSTRING

型の変数を除く。

6.1.2

識別子

識別子は,文字,数字及び下線で構成する文字列であり,文字又は下線で始まる。

大文字・小文字の区別は,識別子において意味をもってはならない。例えば,識別子の abcd,ABCD,

及び aBCd は,同様に解釈する。

下線は,識別子の中で意味をもち,例えば,A_BCD と AB_CD とは別の識別子と解釈する。多重の下線

は許されていない。例えば,文字列__LIM_SW5 及び LIM__SW5 は,有効な識別子でない。また,最終文

字に続く下線は許されない。例えば,文字列 LIM_SW5_は,有効な識別子ではない。

識別子の使用をサポートする全てのシステムでは,少なくとも 6 文字は区別する。このようなシステム

では,例えば,ABCDE1 と ABCDE2 とは別の識別子と解釈する。識別子に許される最大文字数は,実装者

に依存する。

識別子の仕様及び例は,

表 による。

表 2−識別子

No.

説明

1

大文字及び数字:

IW215

IW215

  IW215Z  QX75  IDENT

2

大文字及び小文字,数字,途中の下線

上記全てに加えて:

LIM_SW_5

  LimSw5  abcd  ab_Cd

3

大文字及び小文字,数字,先頭又は途中の下線

上記全てに加えて  _MAIN _12V7

6.1.3

予約語

予約語は,個々の構文規則要素として用いられる文字の特定の組合せである。予約語は,途中に空白を

含まない。大文字・小文字は,予約語では意味をもたない。例えば,予約語の“FOR”及び“for”は,

構文規則上同等である。予約語は,例えば,変数名又は拡張など,他のいかなる目的にも用いてはならな

い。

6.1.4

空白の使用

使用者が,一つ以上の“空白”文字をプログラマブルコントローラのプログラムテキストのどの位置に

でも挿入できるようにする。ただし,予約語,リテラル,列挙型値,識別子,直接表現変数又は区切り文

字列の組合せに空白を挿入してはならない。

“空白”は,タブ及び改行のような非印刷文字(JIS X 0221

でエンコーディングは定義されていない)と同様に,SPACE 文字[コード値:32(10 進)

]として定義す

る。

6.1.5

コメント

コメントには,

表 に記載する様々なものがある。

1)

一行コメントは,文字組合せ//で始まり,次の行へのラインフィード,改行,ページ送り(改ページ)


18

B 3503

:2016 (IEC 61131-3:2013)

又は復帰で終わる。

一行コメントでは, (* 及び *) 又は/*  及び */の特別な文字の組合せに特別な意味はない。

2)

複数行のコメントは,最初及び最後にそれぞれ特別な文字の組合せ (* 及び *) で区切る。

複数行のコメントは,特別な文字の組合せ/*  及び */を用いてもよい。

複数行コメントでは,特別な文字の組合せ//には特別な意味はない。

コメントは,文字列リテラルの間を除き,空白が使用できるプログラムのどこでも用いることができる

ようにしなければならない。

コメントは,この規格に規定する全ての言語中において,構文規則上でも又は意味論上でも無意味であ

り,空白のように処理する。

入れ子にされたコメントは,次の対応する対を用いる。

・ (*,

*)の対,例えば,(*... (*  入れ子*)...*),又は

・ /*,

*/の対,例えば,/*... /*  入れ子*/...*/

表 3−コメント

No.

説明

1

一行コメント

//…

X :=13; //

  一行のコメント

//

  一行のコメントは,

//

  一文字目から始めてもよい

2a

複数行コメント 
(*  …  *)

(*

コメント  *)

(***************************

3 行の枠付のコメント

****************************)

2b

複数行コメント

/*  …    */

/*

    一行又は複数行の

コメント  */

3a

入れ子にされたコメント 
(* .. (* .. *) ..*)

(* (*

  入れ子*) *)

3b

入れ子にされたコメント 
/* .. /* .. */ .. */

/* /*

入れ子*/ */

6.2

プラグマ

プラグマは,

表 に示すように,中括弧{及び}によって始め及び終わりを区切らなければならない。特

定のプラグマの構文規則及び意味論は,実装者に依存する。プラグマは,文字列リテラルの間を除いて,

空白の使用できるプログラムのどこでも使用できるようにしなければならない。

表 4−プラグマ

No.

説明

1

プラグマ

{ … }

{VERSION 2.0}

{AUTHOR JHC}

{x :=256, y :=384}

6.3

リテラル−データの外部表現

6.3.1

概要

種々のプログラマブルコントローラプログラム言語におけるデータの外部表現は,数値リテラル,文字

列リテラル及び時間リテラルからなる。

二つの異なる種類の時間関連データに関する外部表現を提供する必要性が認識されている。


19

B 3503

:2016 (IEC 61131-3:2013)

・  制御事象の経過時間を測定又は管理する持続時間型データ,及び

・  絶対時刻基準に対する制御事象の開始又は終了を同期させるためのデータ情報を含んでもよい日時デ

ータ

6.3.2

数値リテラル及びビット列リテラル

数値リテラルには,整数リテラル及び実数リテラルの 2 種類がある。数値リテラルは,10 進数又は底で

規定する。各種数値リテラルに関する数字の最大桁数は,規定した実装系のリテラルで表現した全データ

型の値の精度及び全範囲を表現するのに十分でなければならない。

数値リテラルの数字間に挿入した単一の下線(_)に意味をもたせてはならない。数値リテラルにおけ

る下線の他の使用は許されない。

10 進リテラルは,10 進法の通常の方法で表現しなければならない。実数リテラルは,小数点があること

で区別しなければならない。指数は,10 のべき乗を示し,それを先行する前の数字に掛け合わせて,表現

する値を得る。10 進リテラル及び指数は,先行符号(+又は−)を含むことができる。

整数リテラルは,2 進法,8 進法又は 16 進法でも表現できる。明示がない場合,底は 10 進表記でなけれ

ばならない。16 進法の場合は,従来の 10 進の 10∼15 に対応して,それぞれ大文字の A∼F からなる拡張

数字集合を用いる。底は,先頭符号(+又は−)を含んではならない。それらは,ビット列リテラルと解

釈する。

正の整数を表現する数値リテラルをビット列リテラルとして用いてもよい。

ブール型データは,0 又は 1 の整数リテラルによって表現するか,予約語 FALSE 又は TRUE でそれぞれ

表現しなければならない。

数値リテラルの項目及び例は,

表 による。

基本データ型の名前及び“#”記号を用いて,リテラルに型の接頭語を加えることによって,ブール又は

数値リテラルのデータ型を指定できる。例えば,

表 の項目 No.9 を参照。


20

B 3503

:2016 (IEC 61131-3:2013)

表 5−数値リテラル

No.

説明

解説

1

整数リテラル

−12, 0, 123_4, +986

2

実数リテラル

0.0, 0.4560, 3.14159_26

3

指数付実数リテラル

−1.34E−12, −1.34e−12

1.0E

+6, 1.0e+6

1.234E6, 1.234e6

4 2 進リテラル

2#1111_1111

2#1110_0000

2 進法リテラル 
255 10 進 
224 10 進

5 8 進リテラル

8#377

8#340

8 進法リテラル 
255 10 進 
224 10 進

6 16 進リテラル

16#FF

又は 16#ff

16#E0

又は 16#e0

16 進法リテラル 
255 10 進 
224 10 進

7

ブール 0 及び 1

0

又は 1

8

ブール偽及び真

FALSE

    TRUE

9

データ型指定リテラル

INT#

−123

10 進−123 の INT 表現

INT#16#7FFF

10 進 32767 の INT 表現

WORD#16#AFF

16 進 0AFF の WORD 表現

WORD#1234

10 進 1234=16#4D2 の WORD 表現

UINT#16#89AF

16 進 89AF の UINT 表現

CHAR#16#41

“A”の CHAR 表現

BOOL#0

BOOL#1

BOOL#FALSE

BOOL#TRUE

注記 1  予約語 FALSE 及び TRUE は,ブール値 0 及び 1 のそれぞれに相当する。 
注記 2  項目 No.5“8 進リテラル”は廃止され,この規格の次の版には含まれないかもしれない。

6.3.3

文字列リテラル

文字列リテラルには,1 バイト又は 2 バイト文字コードを含む。

・  1 バイト文字列リテラルは,シングルクォーテーション(')に挟まれた 0 文字以上の文字列である。

1 バイト文字列では,ドル記号($)に続く二つの 16 進数の文字,合わせて 3 文字の組合せは,表 6

の項目 No.1 に示すように,8 ビット文字コードの 16 進表記として解釈する。

・  2 バイト文字列は,ダブルクォーテーション(")で挟まれた JIS X 0221 からの 0 文字以上の文字列

である。2 バイト文字列において,ドル記号($)に続く四つの 16 進数の文字,合わせて 5 文字の組

合せは,

表 の項目 No.2 に示すように,16 ビット文字コードの 16 進表記として解釈する。

注記  JIS X 0221 とユニコードとの関係。

文字コード及び符号化形式は,ユニコードと JIS X 0221 との間で一致しているが,ユニコー

ド規格は,ユニコードがプラットフォーム及びアプリケーションを越えて文字を均一に扱うよ

うにするために実装に追加制約を課している。このため,ユニコード規格は,一連の広範な制

御文字仕様,文字データ,アルゴリズム及び JIS X 0221 にはないかなりの量の参考資料を提供

している。

ドル記号から始まる 2 文字の組合せが文字列中に現れた場合は,

表 に従って解釈する。


21

B 3503

:2016 (IEC 61131-3:2013)

表 6−文字列リテラル

No.

説明

1

バイト文字又は文字列

'   '

1a

空文字列(長さ 0)

''

1b

単一文字からなる長さ 1 の列又は文字 CHAR

'A'

1c

“空白”文字からなる長さ 1 の列又は文字 CHAR

' '

1d

“シングルクォーテーション”文字からなる長さ 1 の列又は文字 CHAR

'$''

1e

“ダブルクォーテーション”文字からなる長さ 1 の列又は文字 CHAR

'"'

1f

表 の二文字の組合せのサポート

'$R$L'

1g

“$”及び二つの 16 進文字表現のサポート

'$0A'

2

バイト文字又は文字列

“      ”

a)

2a

空文字列(長さ 0)

""

2b

単一文字からなる長さ 1 の列又は文字 WCHAR

"A"

2c

“空白”文字からなる長さ 1 の列又は文字 WCHAR

" "

2d

“シングルクォーテーション”文字からなる長さ 1 の列又は文字 WCHAR

"'"

2e

“ダブルクォーテーション”文字からなる長さ 1 の列又は“文字 WCHAR

"$""

2f

表 の二文字の組合せのサポート

"$R$L"

2h

“$”及び四つの 16 進文字表現のサポート

"$00C4"

1

バイトデータ型指定文字又は文字列リテラル #

3a

データ型指定文字列

STRING#'OK'

3b

データ型指定文字

CHAR#'X'

2

バイトデータ型指定文字列リテラル #

a)

4a

データ型指定 2 バイト文字列(

“ダブルクォーテーション”を用いる)

WSTRING#"OK"

4b

データ型指定 2 バイト文字(

“ダブルクォーテーション”を用いる)

WCHAR#"X"

4c

データ型指定 2 バイト文字列(

“シングルクォーテーション”を用いる)

WSTRING#'OK'

4d

データ型指定 2 バイト文字(

“シングルクォーテーション”を用いる)

WCHAR#'X'

a)

  特定の実装が,項目 No.2 でなく項目 No.4 をサポートする場合,実装者はダブルクォーテーションの文字の使

用に対して,実装者固有の構文規則及び意味論を指定してもよい。

表 7−文字列における 文字の組合せ

No.

説明

組合せ

1

ドル記号

$$

2

シングルクォーテーション $'

3

ラインフィード

$L 又は$l

4

改行

$N 又は$n

5

ページ送り

$P 又は$p

6

復帰

$R 又は$r

7

タブ

$T 又は$t

8

ダブルクォーテーション $"

注記 1  “改行”文字は実装固有のデータ行の終わりを定義する方法を提供する。印字に対しては,データ行を終了

して次行の先頭で印字を再開する効果がある。

注記 2 $'の組合せは,シングルクォーテーションの文字列リテラル内だけ有効である。 
注記 3 $"の組合せは,ダブルクォーテーションの文字列リテラル内だけ有効である。

6.3.4

持続時間型リテラル

持続時間型データは,予約語である T#,TIME#又は LTIME#によって,左側を区切らなければならない。

日数,時間数,分数,秒数及びミリ秒数,又はそれらの任意の組合せによる持続時間型データの表現は,


22

B 3503

:2016 (IEC 61131-3:2013)

表 による。最小の時間単位は,指数なしの実数表記として書くことができる。

持続時間型リテラルの単位は,アンダースコアによって分離できる。

持続時間型リテラルの最大単位の“オーバフロー”

,例えば,T#25h_15m は許される。

時間単位(例えば,秒,ミリ秒など)は,大文字及び小文字で表すことができる。

表 のように,正及び負の両方の値が持続時間型として許される。

表 8−持続時間型リテラル

No.

説明

持続時間型省略型 

1a

d

1b

h

時間

1c

m

1d

s

1e

ms

ミリ秒

1f

us

(μ は利用できない)

マイクロ秒

1g

ns

ナノ秒

アンダースコアなしの継続時間リテラル 

2a

省略型

T#14ms T#-14ms  LT#14.7s T#14.7m

T#14.7h t#14.7d

t#25h15m

lt#5d14h12m18s3.5ms

t#12h4m34ms230us400ns

2b

基本型

TIME#14ms TIME#-14ms  time#14.7s

アンダースコア付きの継続時間リテラル 

3a

省略型

t#25h_15m t#5d_14h_12m_18s_3.5ms

LTIME#5m_30s_500ms_100.1us

3b

基本型

TIME#25h_15m

ltime#5d_14h_12m_18s_3.5ms

LTIME#34s_345ns

6.3.5

日付及び時刻のリテラル

日付及び時刻リテラルの接頭予約語は,

表 に示すものでなければならない。

表 9−日付及び時刻のリテラル

No.

説明

1a

日付リテラル

(基本型)

DATE#1984-06-25, date#2010-09-22

1b

日付リテラル

(省略型)

D#1984-06-25

2a 64 ビット日付リテラル

(基本型)

LDATE#2012-02-29

2b 64 ビット日付リテラル

(省略型)

LD#1984-06-25

3a

時刻リテラル

(基本型)

TIME_OF_DAY#15:36:55.36

3b

時刻リテラル

(省略型)

TOD#15:36:55.36

4a

時刻リテラル(64 ビット)

(省略型)

LTOD#15:36:55.36

4b

時刻リテラル(64 ビット)

(基本型)

LTIME_OF_DAY#15:36:55.36

5a

日付及び時間リテラル

(基本型)

DATE_AND_TIME#1984-06-25-15:36:55.360227400

5b

日付及び時間リテラル

(省略型)

DT#1984-06-25-15:36:55.360_227_400

6a

日付及び時間リテラル(64 ビット)  (基本型)

LDATE_AND_TIME#1984-06-25-15:36:55.360_227_

400

6b

日付及び時間リテラル(64 ビット)  (省略型)

LDT#1984-06-25-15:36:55.360_227_400


23

B 3503

:2016 (IEC 61131-3:2013)

6.4

データ型

6.4.1

概要

データ型は,リテラル及び変数を対象にして,取り得る値,適用可能な演算及び値を格納する方法を定

義するものである。

6.4.2

基本データ型(BOOLINTREALSTRING など)

6.4.2.1

基本データ型の仕様

一連の(事前に定義している)基本データ型をこの規格によって規定する。

基本データ型,それぞれのデータ型の予約語,データ要素ごとのビット数及びそれぞれの基本データ型

の数値の範囲は,

表 10 による。

表 10−基本データ型

No.

説明

予約語

デフォルト値

N(ビット数)

a)

1

ブール型

BOOL 0

, FALSE 1

h)

2 8 ビット整数

SINT 0

8

c)

3

整数(16 ビット)

INT 0

16

c)

4 32 ビット整数

DINT 0

32

c)

5 64 ビット整数

LINT 0

64

c)

6

符号なし 8 ビット整数

USINT 0

8

d)

7

符号なし整数(16 ビット)  UINT 0

16

d)

8

符号なし 32 ビット整数

UDINT 0

32

d)

9

符号なし 64 ビット整数

ULINT 0

64

d)

10

実数(32 ビット)

REAL 0.0

32

e)

11 64 ビット実数

LREAL 0.0

64

f)

12a

持続時間型

TIME T#0s

b)

12b

持続時間型(64 ビット)

LTIME LTIME#0s

64

m), q)

13a

日付

DATE

実装依存(

注記参照)

b)

13b 64 ビット日付

LDATE LDATE#1970-01-01

64

n)

14a

時刻

TIME_OF_DAY or TOD

TOD#00:00:00

b)

14b

時刻(64 ビット)

LTIME_OF_DAY or LTOD

LTOD#00:00:00

64

p), q)

15a

日付と時刻

DATE_AND_TIME or DT

実装依存(

注記参照)

b)

15b

日付と時刻(64 ビット)

LDATE_AND_TIME or LDT

LDT#1970-01-01-00:00:00

64

o), q)

16a

可変長 1 バイト文字列

STRING ''

(空文字列) 8

i), g), k), l)

16b

可変長 2 バイト文字列

WSTRING ""

(空文字列) 16

i), g), k), l)

17a 1 バイト文字

CHAR '$00'

8

g), l)

17b 2 バイト文字

WCHAR "$0000"

16

g), l)

18 8 ビットのビット列

BYTE 16#00

8

j), g)

19 16 ビットのビット列

WORD 16#0000

16

j), g)

20 32 ビットのビット列

DWORD 16#0000_0000

32

j), g)

21 64 ビットのビット列

LWORD 16#0000_0000_0000_0000

64

j), g)

注記  デフォルト値が実装依存となっている欄は,0001-01-01 とは異なる特別な開始日があるためである。 

a)

  この列の入力は,脚注で指定するように解釈しなければならない。

b)

  これらのデータ型表現の値の範囲及び精度は,実装依存である。

c)

  このデータ型の変数の値の取り得る範囲は,−(2N−1)∼(2N−1)−1 である。

d)

  このデータ型の変数の値の取り得る範囲は,0∼(2N)−1 である。

e)

  このデータ型の変数の値の取り得る範囲は,基本的な単精度浮動小数点の形式として ISO/IEC/IEEE 60559 に規

定するとおりでなければならない。非正規化数,無限又は非数での演算結果は,実装依存である。


24

B 3503

:2016 (IEC 61131-3:2013)

表 10−基本データ型(続き)

f)

  このデータ型の変数の値の取り得る範囲は,基本的な倍精度浮動小数点の形式として ISO/IEC/IEEE 60559 に規

定するとおりでなければならない。非正規化数,無限又は非数での演算結果は,実装依存である。

g)

  値の取り得る数値の範囲は,このデータ型に適用しない。

h)

  このデータ型の変数の取り得る値は 0 又は 1 で,それぞれ予約語の FALSE 及び TRUE に相当する。

i)

  N の値は,このデータ型の 1 文字当たりのビット数を示す。

j)

  N の値は,このデータ型のビット列のビット数を示す。

k)

  STRING 変数及び WSTRING 変数の最大許容長は,実装依存である。

l)

  CHAR,STRING,WCHAR 及び WSTRING に用いられる文字符号化は,JIS X 0221 である(6.3.3 参照)。

m)

  データ型 LTIME は,単位がナノ秒である符号付 64 ビット整数である。

n)

  データ型 LDATE は,単位がナノ秒で開始日が 1970 年 1 月 1 日である符号付 64 ビット整数である。

o)

  データ型 LDT は,単位がナノ秒で開始日時が 1970 年 1 月 1 日 00:00:00 である符号付 64 ビット整数である。

p)

  データ型 LTOD は,単位がナノ秒で夜中の開始時間が TOD#00:00:00 である符号付 64 ビット整数である。

q)

  この時間書式の値の更新精度は,実装依存である。すなわち,値はナノ秒で示すが,マイクロ秒又はミリ秒ご

とに更新してもよい。 

6.4.2.2

基本文字列型(STRINGWSTRING

STRING

型及び WSTRING 型の要素のサポートされている最大長は実装で決める値であり,プログラミ

ングツール及びデバッグツールによって定義されている。

明示的な最大長は,所定の宣言の角括弧内に示す値によって指定する(この値は,実装によって異なる

最大値を越えてはならない。

データ型 CHAR 又は WCHAR の要素を用いる文字列の単一文字へは,角括弧内に 1 から始まる文字列内の

文字の位置を指定してアクセスする。

2 バイト文字列が 1 バイト文字を用いてアクセスする場合,又は 1 バイト文字列が 2 バイト文字を用い

てアクセスする場合はエラーとしなければならない。

例 1  STRING,WSTRING 及び CHAR,WCHAR

a)

宣言

VAR

String1: STRING[10]

:='ABCD';

String2: STRING[10]

:='';

aWStrings:  ARRAY [0..1] OF WSTRING :=[“1234”, “5678”];

Char1 :

CHAR;

WChar1 :

WCHAR;

END_VAR

b)  STRING

及び CHAR の使用法

Char1 :=String1[2];

//Char1 :='B';

と等しい。

String1[3]:=Char1; //

結果は String1 :='ABBD 'となる。

String1[4]:='B'; //

結果は String1 :='ABBB 'となる。

String1[1]:=String1[4]; //

結果は String1 :='BBBB 'となる。

String2 :=String1[2];

(*

暗黙の型変換 CHAR_TO_STRING を実装している場合,

結果は,String2 :='B'  となる。*)

c)

WSTRING

及び WCHAR の使用法

WChar1 :=aWStrings[1][2];

//WChar1 :='6';

と等しい。


25

B 3503

:2016 (IEC 61131-3:2013)

aWStrings[1][3]:=WChar1; //

結果は aWStrings[1] :="5668"となる。

aWStrings[1][4]:="6"; //

結果は aWStrings[1] :="5666"となる。

aWStrings[1][1]:=aWStrings[1][4]; //

結果は String1 :="6666"となる。

aWStrings[0] :=aWStrings[1][4];  (*

暗黙の型変換 WCHAR_TO_WSTRING を実装

している場合,結果は,

aWStrings[0]:="6";

となる。*)

d)

等価なファンクション(6.6.2.5.11 を参照)

Char1 :=String1[2];

これは,次と等価である。

Char1 :=STRING_TO_CHAR(Mid(IN :=String1, L :=1, P :=2));

aWStrings[1][3]:=WChar1;

これは,次と等価である。

REPLACE(IN1 :=aWStrings[1], IN2 :=WChar1, L :=1, P :=3 );

e)

エラー事例

WChar1 :=String1[2]; //WCHAR

及び STRING の混在

String1[2] :=String2;

//

暗黙の型変換 STRING_TO_CHAR が必要であるが,許容されていない。

注記  単一文字(CHAR 及び WCHAR)のデータ型は,一文字だけを含むことができる。文字列は,複

数の文字を含むことができる。したがって,文字列は単一文字には必要でない追加管理情報を

要求してもよい。

例 2  型 STR10 を次によって宣言すると,

TYPE STR10: STRING[10] :='ABCDEF'; END_TYPE

STR10

の最大長は 10 文字,デフォルト値は'ABCDEF'であり,型 STR10 の初期要素長は 6 文

字である。

6.4.3

総称データ型

表 10 の基本データ型に加えて,図 に示した総称データ型の階層は,標準ファンクション及び標準ファ

ンクションブロックの入出力の仕様で使用できる。総称データ型は,接頭語“ANY”によって識別する。

総称データ型の使用方法は,次の規則による。

a)

直接派生型の総称型は,派生元の基本データ型と同じ総称型でなければならない。

b)

部分範囲派生型の総称型は,ANY_INT でなければならない。

c)

表 11 に定義する他の全ての派生型の総称型は,ANY_DERIVED でなければならない。

ユーザ宣言プログラム構成ユニット内の総称データ型の使用法は,この規格の適用範囲外である。


26

B 3503

:2016 (IEC 61131-3:2013)

総称データ型

総称データ型

基本データ型グループ

ANY

ANY_DERIVED

ANY_ELEMENTARY

ANY_MAGNITUDE

ANY_NUM

ANY_REAL

REAL

,LREAL

ANY_INT ANY_UNSIGNED  USINT

,UINT,UDINT,ULINT

ANY_SIGNED SINT

,INT,DINT,LINT

ANY_DURATION

TIME

,LTIME

ANY_BIT

BOOL

,BYTE,WORD,DWORD,LWORD

ANY_CHARS

ANY_STRING

STRING

,WSTRING

ANY_CHAR

CHAR

,WCHAR

ANY_DATE

DATE_AND_TIME

,LDT,DATE,TIME_OF_DAY,LTOD

図 5−総称データ型の階層

6.4.4

ユーザ定義データ型

6.4.4.1

宣言(型)

6.4.4.1.1

概要

ユーザ定義データ型の目的は,他のデータ型の宣言及び変数宣言の中で用いるためである。

ユーザ定義データ型は,基底型を使用できる場所では,どこでも用いることができる。

ユーザ定義データ型は,テキスト表現構文 TYPE...END_TYPE を用いて宣言する。

型宣言は,次で構成する。

・  型の名前

・  一つの‘:’

(コロン)

・  次の条項に定める型自体の宣言

例  型宣言

TYPE

myDatatype1:

<オプションの初期化付のデータ型宣言>;

END_TYPE

6.4.4.1.2

初期化

ユーザ定義データ型は,ユーザ定義の値で初期化できる。この初期化は,デフォルトの初期値に優先す

る。

ユーザ定義データ型の初期化は,型宣言の後に代入演算子‘:=’が続き,その後に初期値が続く。

リテラル(例えば,−123,1.55,

“abc”

)又は定数式(例えば,12*24)を用いてもよい。使用する初期

値は,互換型,すなわち,同じ型又は暗黙の型変換を用いて変換できる型のものでなければならない。

データ型の初期化には

図 に準じた規則を適用しなければならない。


27

B 3503

:2016 (IEC 61131-3:2013)

総称データ型

リテラルによる初期化

結果

ANY_UNSIGNED

非負整数リテラル又は非負定数式

非負整数値

ANY_SIGNED

整数リテラル又は定数式

整数値

ANY_REAL

数値リテラル又は定数式

数値

ANY_BIT

符号なし整数(16 ビット)リテラル又は符号なし定数式

符号なし整数(16 ビット)値

ANY_STRING

文字列リテラル

文字列

ANY_DATE

日付及び時刻リテラル

日付及び時刻の値

ANY_DURATION

持続時間型リテラル

持続時間の値

図 6−リテラル及び定数式による初期化(規則)

ユーザ定義データ型の宣言の項目及び初期化は,

表 11 による。

表 11−ユーザ定義データ型の宣言及び初期化

No.

説明

解説

1a

列挙データ型

TYPE

1b

  ANALOG_SIGNAL_RANGE:

 (BIPOLAR_10V,

 UNIPOLAR_10V,

 UNIPOLAR_1_5V,

 UNIPOLAR_0_5V,

 UNIPOLAR_4_20_MA,

 UNIPOLAR_0_20_MA)

 :=UNIPOLAR_1_5V;

初期化

END_TYPE

2a

指定値をもつデータ型

TYPE

2b

Colors: DWORD

 (Red

:=16#00FF0000,

 Green

:=16#0000FF00,

 Blue

:=16#000000FF,

White  :=Red OR Green OR Blue,

Black  :=Red AND Green AND Blue)

 :=Green;

初期化

END_TYPE

3a

部分範囲データ型

TYPE

3b

 ANALOG_DATA:

INT(

−4095 .. 4095) :=0;

END_TYPE

4a

配列データ型

TYPE ANALOG_16_INPUT_DATA:

ANALOG_DATA

は,3a 及び

3b の例を参照

4b

ARRAY [1..16] OF ANALOG_DATA

 :=[8(

−4095), 8(4095)];

END_TYPE

初期化

5a

配列要素としてのファ

ンクションブロック型

及びクラス

TYPE

5b

 TONs:

ARRAY[1..50]

OF

TON

配列要素としてのファンク

ションブロック TON

 :=[50(PT:=T#100ms)];

END_TYPE

初期化


28

B 3503

:2016 (IEC 61131-3:2013)

表 11−ユーザ定義データ型の宣言及び初期化(続き)

No.

説明

解説

6a

構造データ型

TYPE ANALOG_CHANNEL_CONFIGURATION:

ANALOG_SIGNAL_RANGE

は,1a 及び 1b を参照

6b

 STRUCT

 RANGE:

  ANALOG_SIGNAL_RANGE;

 MIN_SCALE:

ANALOG_DATA

:=

−4095;

 MAX_SCALE:

ANALOG_DATA

:=4095;

 END_STRUCT;

END_TYPE

7a

構造体要素としてのフ

ァンクションブロック
型及びクラス

TYPE

構造体要素としてのファン

クションブロック TOF

7b

 Cooler:

STRUCT

 Temp:

INT;

Cooling: TOF :=(PT:=T#100ms);

END_TYPE

8a

相対アドレス指定 AT

付構造データ型

TYPE

重複なしの明示的レイアウ

8b

 Com1_data:

STRUCT

 head

AT%B0:

INT;

 length

AT%B2:

USINT

:=26;

 flag1

AT%X3.0:

BOOL;

 end AT%B25:

BYTE;

 END_STRUCT;

END_TYPE

9a

相対アドレス指定 AT
及び OVERLAP 付構造

データ型

TYPE

重複ありの明示的レイアウ

 Com2_data:

STRUCT

OVERLAP

head

AT%B0:

INT;

length  AT%B2:

USINT;

flag2   AT%X3.3:   BOOL;

data1   AT%B5:

BYTE;

data2   AT%B5:

REAL;

 end

AT%B19:

BYTE;

 END_STRUCT;

END_TYPE

10a

構造体の直接表現要素

−“*”を用いて部分
的に指定

TYPE

位置をまだ決められていな

い入出力に構造体要素を割
り当てる。

10b

 HW_COMP:

STRUCT;

IN  AT %I*: BOOL;

OUT_VAR

AT %Q*: WORD:=200;

ITNL_VAR: REAL :=123.0; //

位置が未決定

 END_STRUCT;

END_TYPE

11a

直接派生データ型

TYPE

11b

CNT:  UINT;

 FREQ:

REAL

:=50.0;

初期化

 ANALOG_CHANNEL_CONFIG:

 ANALOG_CHANNEL_CONFIGURATION

:=(MIN_SCALE :=0, MAX_SCALE :=4000);

新しい初期化

END_TYPE

12

定数式を用いた初期化

TYPE

定数式を用いる。

  PIx2: REAL :=2 * 3.1416;

END_TYPE


29

B 3503

:2016 (IEC 61131-3:2013)

表 11−ユーザ定義データ型の宣言及び初期化(続き)

注記  データ型の宣言は,初期化なし(項目 a)又は初期化付き(項目 b)で可能である。項目(a)だけがサポート

されている場合,データ型はデフォルト値を用いて初期化する。項目(b)がサポートされている場合,データ

型はユーザが指定した値を用いて初期化し,初期値が示されていない場合はデフォルト値を用いて初期化しな

ければならない。

構造体の直接表現要素を備えた変数(“  *  ”を用いて部分的に指定されている。)は,VAR_INPUT 又は

VAR_IN_OUT

の部分では使用できない。

6.4.4.2

列挙型

6.4.4.2.1

概要

列挙データ型の宣言は,列挙型のデータ要素の値が,

表 11 に示すように,識別子の関連リストに定義し

た値の一つしかとれないことを指定する。

列挙リストは,リストの最初の識別子から始まり,最後の識別子で終わる列挙データの順序集合を定義

する。

それぞれ異なる列挙データ型は,列挙した値に同じ識別子を用いてもよい。列挙値の許される最大個数

は,実装依存である。

特定の文脈で使用するときに,列挙リテラルを一意に識別するために,型付リテラルと同様に,関連デ

ータ型名及びハッシュ記号(番号記号)

“#”から成る接頭語によって修飾できる。そのような接頭語を列

挙リストの中で用いてはならない。

列挙リテラルの値を明確に決定するための十分な情報が与えられない場合はエラーである(次の

例を参

照)

例  列挙データ型

TYPE

 Traffic_light:   (Red,  Amber,  Green);

 Painting_colors: (Red, Yellow, Green, Blue) := Blue;

END_TYPE

VAR

 My_Traffic_light: Traffic_light := Red;

END_VAR

IF My_Traffic_light = Traffic_light#Amber THEN ...  // OK

IF My_Traffic_light = Traffic_light#Red   THEN ...  // OK

IF My_Traffic_light = Amber THEN ...

// OK

−Amber は一意に決まる

IF My_Traffic_light = Red   THEN ...

// ERROR

−Red は一意には決まらない

6.4.4.2.2

初期化

列挙データ型のデフォルト値は,関連付けられた列挙リストの最初の識別子である。

ユーザは,その列挙値のリストの中のユーザ定義の値を用いてデータ型を初期化できる。この初期化は

デフォルト値よりも優先する。

ANALOG_SIGNAL_RANGE

について

表 11 に示すように,列挙データ型のユーザ定義デフォルト値は,指

定された値 UNIPOLAR_1_5V である。


30

B 3503

:2016 (IEC 61131-3:2013)

データ型の初期値のユーザ定義代入は,

表 11 の項目である。

6.4.4.3

指定値をもつデータ型

6.4.4.3.1

概要

指定値をもつ列挙データ型は,列挙データ型の値がユーザに分からない場合に使用する,列挙データ型

の一種である。宣言はデータ型を指定し,

表 11 に図示するように指定値の値を代入する。

宣言する指定値は,これらのデータ型の変数値の範囲を限定しない。すなわち,他の定数で指定する,

又は計算によって指定できる。

指定値を特定の文脈で使用するときに,一意に識別を可能にするために,指定値は,型リテラルと同様

に,関連付けられるデータ型名及びハッシュ記号(番号記号)

“#”から成る接頭語によって修飾できる。

そのような接頭語を列挙リストの中で用いてはならない。指定値を明確に決定するための十分な情報が

与えられない場合はエラーである(次の

例を参照)。

例  指定値をもつデータ型

TYPE

 Traffic_light:   INT (Red :=1, Amber  :=2, Green :=3) :=Green;

 Painting_colors: INT (Red :=1, Yellow :=2, Green :=3, Blue :=4) :=Blue;

END_TYPE

VAR

 My_Traffic_light:  Traffic_light;

END_VAR

My_Traffic_light := 27;

//

  数値からの代入

My_Traffic_light := Amber

+1; //

数式からの代入

 //

注記:列挙値では不可能

My_Traffic_light := Traffic_light#Red

+1;

IF My_Traffic_light   =123 THEN ...

// OK

IF My_Traffic_light   =Traffic_light#Amber THEN ...  // OK

IF  My_Traffic_light   =Traffic_light#Red   THEN  ...  //  OK

IF My_Traffic_light   =Amber THEN ...  // OK Amber

が一意に決まるため

IF My_Traffic_light   =Red THEN ...

// Error Red

が一意に決まららないため

6.4.4.3.2

初期化

指定値をもつデータ型のデフォルト値は,列挙リストの中の最初のデータ要素である。Traffic_light

についての上記例では,この要素は Red である。

ユーザは,その列挙値のリストの中のユーザ定義の値を用いてデータ型を初期化できる。初期化は,指

定値に限定されていない,基本データ型の範囲内のどの値を使用してもよい。この初期化はデフォルト値

よりも優先する。

例では,Traffic_light についての列挙データ型のユーザ定義初期値は,Green である。

データ型の初期値のユーザ定義指定は,

表 11 の項目である。


31

B 3503

:2016 (IEC 61131-3:2013)

6.4.4.4

部分範囲データ型

6.4.4.4.1

概要

部分範囲宣言は,部分範囲データ型のどの要素の値も,

表 11 に表すとおり指定した上限及び下限を含む

その間の値しかとれないことを指定する。

部分範囲の上限及び下限は,リテラル又は定数式でなければならない。

TYPE

  ANALOG_DATA:  INT(

−4095 .. 4095) :=0;

END_TYPE

6.4.4.4.2

初期化

部分範囲のデータ型のデフォルト値は,部分範囲の最初の限度(下限)でなければならない。

ユーザは,部分範囲の中のユーザ定義の値を用いてデータ型を初期化できる。この初期化はデフォルト

値より優先する。

例えば,

表 11 の例に表すとおり,型 ANALOG_DATA の要素のデフォルト値は,−4095 であり,一方,

明示的初期化の場合は,デフォルト値はゼロ(宣言どおり)である。

6.4.4.5

配列データ型

6.4.4.5.1

概要

表 11 に示すとおり,配列データ型の宣言は,指定範囲の添字によって指定できる全てのデータを格納す

るために,個々の指定型の要素に対して十分な量のデータ領域を割り当てることを指定する。

配列は,同じデータ型のデータ要素の集合である。基本データ型及びユーザ定義データ型,ファンクシ

ョンブロック型及びクラスは,配列要素の型として使用できる。このデータ要素の集合は,括弧内の一つ

以上の添字によって参照され,複数の添字はコンマによって分けられる。添字の値が配列宣言に明記され

ている範囲の外側であればエラーである。

注記  インデックスを計算する場合,このエラーは実行時にだけ検出できる。

配列添字の最大個数,最大配列サイズ及び添字値の最大範囲は,実装依存である。

インデックス部分範囲の上限及び下限は,リテラル又は定数式でなければならない。可変長配列の定義

は,6.5.3 による。

ST 言語では,添字は総称型の部分型の一つ ANY_INT に対応する値をもたらす式でなければならない。

7.2

に規定する IL 言語及び箇条 に規定するグラフィック言語での添字の形式は,単一要素変数又は整

数リテラルに限定されている。

a)

配列の宣言

VAR myANALOG_16: ARRAY [1..16] OF ANALOG_DATA

 :=

[8(

−4095), 8(4095)];

//

ユーザ定義初期値

END_VAR

b) ST

言語での配列変数は,次のように用いることができる。

OUTARY[6,SYM] :=INARY[0]

+INARY[7]−INARY[i] *%IW62;

6.4.4.5.2

初期化

各配列要素のデフォルト値は,配列要素のデータ型に対して定義されている初期値である。

ユーザは,ユーザ定義の値を用いて配列型を初期化できる。この初期化は,デフォルト値によって優先


32

B 3503

:2016 (IEC 61131-3:2013)

する。

配列のユーザ定義初期値は,反復を表すために括弧を使用できるリスト形式で指定する。

配列データ型の初期化において,初期化のリストで配列を埋めていく場合,配列の最も右側の添字から

順番に変化していくように格納する。

例  配列の初期化

A: ARRAY [0..5] OF INT :=[2(1, 2, 3)]

これは,初期化シーケンス 1, 2, 3, 1, 2, 3 と同等である。

初期化リストに規定した初期値の数が,配列要素の数を超える場合,超過分(右端よりの)初期値は無

視する。初期値の数が,配列要素の数よりも少ない場合,残りの配列要素には,対応するデータ型のデフ

ォルトの初期値を代入する。いずれの場合も,ユーザには,実行前のプログラム準備段階において,この

状態の警告をしなければならない。

データ型の初期値のユーザ定義指定は,

表 11 の項目である。

6.4.4.6

構造データ型

6.4.4.6.1

概要

構造データ型(STRUCT)の宣言は,このデータ型が,

表 11 に表すとおり指定名によってアクセスでき

る指定型の部分要素の集合を含まなければならないことを明記する。

構造データ型の要素は,ピリオド“.”で区切る二つ以上の識別子又は配列アクセスで表す。最初の識別

子は,構造体要素の名前を表し,後の識別子は,データ構造中の実際のデータ要素をアクセスするための

要素名の並びを示す。基本データ型及びユーザ定義データ型,ファンクションブロック型及びクラスを構

造要素の型として使用できる。

例 え ば ,

表 11 に 宣 言 し た と お り デ ー タ 型 ANALOG_CHANNEL_CONFIGURATION の 要 素 が 型

ANALOG_SIGNAL_RANGE

の RANGE 下 位 要 素 , 型 ANALOG_DATA の MIN_SCALE 下 位 要 素 及 び 型

ANALOG_DATA

の MAX_SCALE 下位要素を含むことがある。

構造体要素の最大数,構造体に含むことができるデータの最大量,及び構造体要素の位置指定の階層最

大数は,実装によって異なる。

二つの構造化変数は,それらが同じデータ型である場合にだけ代入互換性があるものである。

例  構造データ型及び構造化変数の宣言及び使用

a)

構造データ型の宣言

TYPE

  ANALOG_SIGNAL_RANGE:

 (BIPOLAR_10V,

UNIPOLAR_10V);

  ANALOG_DATA:  INT  (

−4095 .. 4095);

  ANALOG_CHANNEL_CONFIGURATION:

    STRUCT

      RANGE:

ANALOG_SIGNAL_RANGE;

      MIN_SCALE:  ANALOG_DATA;

      MAX_SCALE:  ANALOG_DATA;

    END_STRUCT;

END_TYPE


33

B 3503

:2016 (IEC 61131-3:2013)

b)

構造化変数の宣言

VAR

 MODULE_CONFIG:  ANALOG_CHANNEL_CONFIGURATION;

 MODULE_8_CONF:  ARRAY [1..8] OF ANALOG_CHANNEL_CONFIGURATION;

END_VAR

c)

ST

言語での構造化変数の使用

MODULE_CONFIG.MIN_SCALE :=

−2047;

MODULE_8_CONF[5].RANGE :=BIPOLAR_10V;

6.4.4.6.2

初期化

構造体要素のデフォルト値は,個別のデータ型のデフォルト値によって決まる

ユーザは,ユーザによって定義された値を用いて構造体の構成要素を初期化できる。この初期化は,デ

フォルト値より優先する。

ユーザは,構造体の構成要素の割付リストを用いて既に定義された構造体も初期化できる。この初期化

は,デフォルト初期化及び構成要素の初期化より優先度が高い。

例  構造体の初期化

a)

構造データ型初期化の宣言

TYPE

  ANALOG_SIGNAL_RANGE:

 (BIPOLAR_10V,

UNIPOLAR_10V)

:=UNIPOLAR_10V;

  ANALOG_DATA:  INT  (

−4095 .. 4095);

  ANALOG_CHANNEL_CONFIGURATION:

    STRUCT

      RANGE:

ANALOG_SIGNAL_RANGE;

      MIN_SCALE: ANALOG_DATA  :=

−4095;

      MAX_SCALE: ANALOG_DATA  :=4096;

    END_STRUCT;

  ANALOG_8BI_CONFIGURATION:

    ARRAY  [1..8]  OF  ANALOG_CHANNEL_CONFIGURATION

      :=[8((RANGE:=BIPOLAR_10V))];

END_TYPE

b)

構造化変数の初期化の宣言

VAR

 MODULE_CONFIG:  ANALOG_CHANNEL_CONFIGURATION

   :=(RANGE:=BIPOLAR_10V,  MIN_SCALE:=

−1023);

 MODULE_8_SMALL:  ANALOG_8BI_CONFIGURATION

   :=[8  ((MIN_SCALE:=

−2047, MAX_SCALE:=2048))];

END_VAR


34

B 3503

:2016 (IEC 61131-3:2013)

6.4.4.7

構造データ型の構成要素に対する相対的位置(AT

6.4.4.7.1

概要

構造型の構成要素の位置(アドレス)は,構造体の先頭からの相対位置で定義できる。

この場合,この構造体のそれぞれの構成要素名の後に予約語 AT 及び相対位置がなければならない。宣

言は,メモリ配置内にギャップを含んでもよい。

相対位置は,

“%”

(パーセント)

,位置修飾子及びビット又はバイト位置で構成する。バイト位置は,バ

イトオフセットを示す符号なし整数(16 ビット)リテラルである。ビット位置はその後に“.”

(ポイント)

が続くバイトオフセット,及び 0 から 7 までの範囲からの符号なし整数(16 ビット)リテラルで構成する。

相対位置記述内では,スペースは認められない。

構造体の構成要素は,予約語 OVERLAP が宣言の中に示されている場合を除き,そのメモリ配置内で重

複してはならない。

文字列の重複は,この規格の適用範囲を超えている。

注記  ビットオフセットの計数は,右端のビットの 0 から始まる。バイトオフセットの計数は,バイ

トオフセットが 0 である構造体の初めから始める。

例  相対位置及び構造体内の重複

TYPE

  Com1_data:  STRUCT

   head

AT  %B0:

INT;

//

位置 0 を指定

   length

AT  %B2:

USINT  :=26; //

位置 2 を指定

   flag1

AT  %X3.0:   BOOL;

//

位置 3.0 を指定

   end

AT  %B25:

BYTE;

//

位置 25 を指定,一つのギャップを残す。

  END_STRUCT;

  Com2_data:  STRUCT  OVERLAP

   head

AT  %B0:

INT;

//

位置 0 を指定

   length

AT  %B2:

USINT;

//

位置 2 を指定

   flag2

AT  %X3.3:   BOOL;

//

位置 3.3 を指定

   data1

AT  %B5:

BYTE;

//

位置 5 を指定,重複している。

   data2

AT  %B5:

REAL;

//

位置 5 から 8 を指定

   end

AT  %B19:

BYTE;

//

位置 19 を指定,一つのギャップを残す。

  END_STRUCT;

  Com_data:  STRUCT  OVERLAP

//

C1 と C2 とが重複する。

   C1  at  %B0:  Com1_data;

   C2  at  %B0:  Com2_data;

 END_STRUCT;

END_TYPE

6.4.4.7.2

初期化

オーバラップされた構造体は明示的な初期化はできない。


35

B 3503

:2016 (IEC 61131-3:2013)

6.4.4.8

“*”

を用いて部分的に記述する,直接的に表現された構造体での構成要素

表 11 のアスタリスク表記“*”は,構造体の直接表現構成要素についてまだ完全に指定されていない位

置を示すために用いることができる。

例  構造体の構成要素をまだ位置指定されていない入出力へ割り付ける。

TYPE

  HW_COMP:  STRUCT;

   IN

AT  %I*:  BOOL;

   VAL

AT  %I*:  DWORD;

   OUT

AT  %Q*:  BOOL;

   OUT_VAR

AT  %Q*:  WORD;

   ITNL_VAR:  REAL;  //

位置なし

   END_STRUCT;

END_TYPE

構造体の直接表現構成要素を,プログラム,ファンクションブロック型又はクラスの宣言部の位置割付

けで用いている場合,直接表現がまだ完全には指定されていないことを示すために,アスタリスク“*”を,

連結の中でのサイズ接頭語,及び符号なし整数(16 ビット)の代わりに使用しなければならない。

この項目を使用するには,そのように宣言された構造化変数の位置が収納する型の全てのインスタンス

ごとに,コンフィグレーションの VAR_CONFIG…END_VAR 構文の中で完全に詳述することが必要となる。

この型の変数は,VAR_INPUT,VAR_IN_OUT 又は VAR_TEMP 部で用いてはならない。

プログラム又はファンクションブロック型のいかなるインスタンス内の,アスタリスク表記“*”で示す

不完全なアドレス記述に対して,VAR_CONFIG…END_VAR 構文の中の完全な記述が不足していればエラー

である。

6.4.4.9

直接派生データ型

6.4.4.9.1

概要

ユーザが定義するデータ型は,基本データ型又は既にユーザによって定義されたデータ型から直接派生

する。

これは,新しい型固有の初期値を定義するために使用してもよい。

例  直接派生データ型

TYPE

 myInt1123:     INT  :=123;

 myNewArrayType:  ANALOG_16_INPUT_DATA

:=[8(

−1023), 8(1023)];

 Com3_data:   Com2_data  :=(head:=3,  length:=40);

END_TYPE

.R1 : REAL :=1.0;

 R2 : R1;

6.4.4.9.2

初期化

デフォルト値は,そこから新しいデータ型が派生するデータ型の初期値である。

ユーザは,ユーザが定義する値を用いてデータ型を初期化できる。この初期化は優先される。


36

B 3503

:2016 (IEC 61131-3:2013)

構造体構成要素のユーザ定義初期値は,データ型識別子に続く括弧付きリストの中で宣言することがで

きる。初期値リストに記載されていない要素は,オリジナルデータ宣言においてそれらの要素に対して宣

言したデフォルト値をもっていなければならない。

この規則は,再帰的に適用することもできる。

例 1  ユーザ定義データ型−使用

表 11 の ANALOG_16_INPUT_DATA の宣言及び宣言 VAR INS: ANALOG_16_INPUT_DATA;

END_VAR

を規定する場合に,変数 INS[1]から INS[16]までは,INT 型の変数を使用できる

どの位置でも使用できる。

例 2  同様に,表 11 の Com_data の宣言,及び更に宣言 VAR telegram: Com_data; END_VAR

を規定する場合に,変数 telegram.length は USINT 型を使用できるどの位置でも使用でき

る。

例 3  表 11 の ANALOG_16_INPUT_CONFIGURATION, ANALOG_CHANNEL_CONFIGURATION,及び

ANALOG_DATA

,及び宣言 VAR CONF: ANALOG_16_INPUT_CONFIGURATION; END_VAR を

規定する場合に,変数 CONF.CHANNEL[2].MIN_SCALE は,INT 型を使用できるどの位置で

も使用できる。

6.4.4.10

リファレンス

6.4.4.10.1

リファレンス宣言

リファレンスは,変数に対するリファレンス又はファンクションブロックのインスタンスに対するリフ

ァレンスだけを含む変数である。リファレンスの値は NULL でもよい。つまり,何も参照しなくてもよい。

リファレンスは,予約語 REF_TO 及び被参照データ型を用いてあらかじめデータ型の宣言をしなければ

ならない。被参照データ型は,既定でなければならない。被参照データ型は,基本データ型又はユーザ定

義データ型でよい。

注記  データ型を束縛しないリファレンスは,この規格の適用範囲を超えている。

例 1

TYPE

 myArrayType:

ARRAY[0..999]OF  INT;

 myRefArrType:

REF_TO  myArrayType;

//

リファレンスの定義

 myArrOfRefType: ARRAY [0..12]OF myRefArrType;

//

リファレンスの配列の定義

END_TYPE

VAR

 myArray1:

myArrayType;

 myRefArr1:

myRefArrType;

//

リファレンスの宣言

 myArrOfRef:

myArrOfRefType;

//

リファレンスの配列の宣言

END_VAR

リファレンスは,特定の参照データ型の変数だけを参照しなければならない。直接派生するデータ型の

リファレンスは,基底データ型のリファレンスのエイリアスとして扱う。直接派生は,数回適用してもよ

い。

例 2

TYPE

 myArrType1:  ARRAY[0..999]OF  INT;


37

B 3503

:2016 (IEC 61131-3:2013)

 myArrType2:  myArrType1;

 myRefType1:  REF_TO  myArrType1;

 myRefType2:  REF_TO  myArrType2;

END_TYPE

myRefType1

及び myRefType2 は,型 ARRAY[0..999]OF INT の変数及び派生データ型

の変数を参照できる。

被参照データ型は,ファンクションブロック型又はクラスでもある。基底型へのリファレン

スは,この基底型から派生されたインスタンスも参照できる。

例 3

CLASS F1 ...

END_CLASS;

CLASS F2 EXTENDS F1 ...  END_CLASS;

TYPE

  myRefF1: REF_TO F1;

  myRefF2: REF_TO F2;

END_TYPE

myRefF1

型のリファレンスは,クラス F1 及びクラス F2 のインスタンス及び両方の派生型

のインスタンスを参照できる。F1 が拡張クラス F2 のメソッド及び変数をサポートしていない

ので,myRefF2 のリファレンスは F1 のインスタンスを参照できず,F2 及びその派生物のイ

ンスタンスだけを参照。

6.4.4.10.2

リファレンスの初期化

リファレンスは,値 NULL(デフォルト)又は既に宣言されている変数,ファンクションブロック又は

クラスのインスタンスのアドレスを用いて初期化できる。

FUNCTION_BLOCK F1 ... END_FUNCTION_BLOCK;

VAR

 myInt:

INT;

 myRefInt:  REF_TO INT :=REF(myInt);

 myF1:

F1;

 myRefF1:

REF_TO  F1  :=REF(myF1);

END_VAR

6.4.4.10.3

リファレンスに対する演算

REF()

演算子は,特定の変数又はインスタンスへのリファレンスを返す。返されたリファレンスの被参

照データ型は,特定の変数のデータ型である。一時変数(

例  VAR_TEMP 部の変数及びインサイドファン

クション変数)に対する REF()演算子の適用は認められない。

左辺に代入する被参照データ型が,右辺の被参照データ型と同じ又は右辺の被参照データ型の基底デー

タ型であれば,リファレンスを他のリファレンスに代入することができる。

ファンクション,ファンクションブロック及びメソッドのパラメータの被参照データ型が,実引数の被

参照データ型と同じ,又は実引数の被参照データ型の基底データ型であれば,リファレンスを呼出しの中

のパラメータに代入することができる。リファレンスは入出力変数として使用してはならない。


38

B 3503

:2016 (IEC 61131-3:2013)

リファレンスが同じデータ型のリファレンスに代入されれば,その後,後者は同じ変数をリファレンス

する。このような状況で,直接派生データ型はその基底データ型のように扱われる。

リファレンスが同じファンクションブロック型又は基底ファンクションブロック型のリファレンスに代

入されれば,このリファレンスは同じインスタンスを参照するが,リファレンスはそのファンクションブ

ロック型に結合したままである。すなわち,その参照データ型の変数及びメソッドだけを使用できる。

リファレンス解除を明示的に行わなければならない。

リファレンスは,後続‘^’

(キャレット)を用いてリファレンス解除できる。

解除されたリファレンスは,直接変数を用いるのと同じ方法で使用できる。

NULL

リファレンスの解除はエラーである。

注記 1  NULL リファレンスの評価は,コンパイルのときにランタイムシステム又はアプリケーショ

ンプログラムによって行うことができる。

REF()

構文及び解除演算子“^”は,グラフィック言語の中では,オペランドの定義で使用しなければな

らない。

注記 2  リファレンス算術は推奨できず,リファレンス算術は,この規格の適用範囲の対象外である。

例 1

TYPE

S1: STRUCT

  SC1:  INT;

  SC2:  REAL;

  END_STRUCT;

A1: ARRAY[1..99]OF INT;

END_TYPE

VAR

 myS1:  S1;

 myA1:  A1;

 myRefS1: REF_TO S1 :=REF(myS1);

 myRefA1: REF_TO A1 :=REF(myA1);

 myRefInt: REF_TO INT :=REF(myA1[1]);

END_VAR

myRefS1^.SC1 :=myRefA1^[12];  //

この場合,S1.SC1:=A1[12];と同等である

myRefInt:=REF(A1[11]);

S1.SC1:=myRefInt^; //

A1[11]

の値を S1.SC1 へ代入する

例 2

例 の文のグラフィック表現


39

B 3503

:2016 (IEC 61131-3:2013)

 +

----------

+

 |

MOVE

|

---------------

|

EN      ENO |

myRefA1^[12]---

|

IN      OUT | --- myRefS1^.SC1

 +

----------

+

 +

----------

+ +

---------+

| MOVE |

| MOVE

|

---------------

|

EN      ENO |------------------------ |EN      ENO|

 REF(A1[11])--- |

IN      OUT |---myRefInt  myRefInt^--- |IN      OUT|

--- S1.SC1

 +

----------

+ +

---------+

表 12 は,リファレンス演算の主要項目を定義する。

表 12−リファレンス演算

No.

説明

宣言 

1

リファレンス型の宣言

TYPE

  myRefType:  REF_TO  INT;

END_TYPE

代入及び比較 

2a

リファレンスへのリファレンス代入

<reference> :=<reference>

myRefType1 :=myRefType2;

2b

ファンクション,ファンクションブロック及びメソッ
ドパラメータへのリファレンス代入

myFB (a :=myRefS1);

型は等しくなければならない!

2c NULL との比較

IF myInt =NULL THEN ...

リファレンス化 

3a

REF

(<variable>)

データ型指定リファレンスを変数に提供する

myRefA1 :=REF (A1);

3b

REF

(<function block instance>)

データ型指定リファレンスをファンクションブロッ

ク又はクラスインスタンスへ提供する

myRefFB1 :=REF(myFB1)

リファレンス解除 

4 <reference>^

変数の内容又はリファレンス変数がリファレンスを

含むインスタンスの内容を提供する

myInt :=myA1Ref^[12];

6.5

変数

6.5.1

変数の宣言及び初期化

6.5.1.1

概要

変数は,例えば,プログラマブルコントローラの入力,出力,又はメモリと関連付けられたデータのよ

うに内容が変化するデータオブジェクトを識別する方法を提供する。

データ変数の外部表現であるリテラルとは対照的に,変数は時間とともにその値を変更できる。

6.5.1.2

宣言

変数は,複数の変数宣言部のうちの一つの中で宣言する。

変数は,次のいずれかを用いて宣言できる。

・  基本データ型


40

B 3503

:2016 (IEC 61131-3:2013)

・  既にユーザが定義した型

・  リファレンス型

・  変数宣言の中でユーザが定義した型

変数は,次のいずれかになることがある。

・  単一要素変数,すなわち,型が次のいずれかである変数

−  基本型

−  ユーザ定義列挙型又は部分範囲型

−  “系統図”で再帰的に定義するユーザ定義型は,基本データ型,列挙型又は部分範囲型までたどる

ことができる。

・  多要素変数,すなわち,ARRAY 又は STRUCT を表現する変数

・  リファレンス,すなわち,他の変数又はファンクションブロックインスタンスを参照する変数

変数宣言は,次で構成する。

・  宣言される変数名リスト

・  “:”

(コロン)

,及び

・  オプションの変数固有初期化によるデータ型

TYPE

myType: ARRAY [1..9]OF INT;

//

既にユーザ定義されたデータ型

END_TYPE

VAR

  myVar1,  myVar1a:  INT;

//

一つの基本データ型を用いた二つの変数

  myVar2:  myType;

//

既にユーザ定義された一つの型を用いる

  myVar3: ARRAY [1..8] OF REAL; //

変数宣言の中でユーザ定義した一つの型を用いる

END_VAR

6.5.1.3

変数の初期化

変数のデフォルト値は,次でなければならない。

a)

表 10 に定義された元となる基本データ型のデフォルト値

b)

変数がリファレンスの場合は NULL

c)

型に割り付けられたユーザの指定値  この値は,表 11 に定義された TYPE 宣言内の代入演算子“:=”

を用いて随意に指定する。

d)

変数のユーザ定義の値  この値は,VAR 宣言内の代入演算子“:=”を用いて随意に指定する(表 14 

照)

このユーザ定義の値は,リテラル(

例  −123, 1.55,  “abc”)又は定数式(例  12*24)となる。

初期値は,VAR_EXTERNAL 宣言の中に示すことはできない。

初期値は,VAR_CONFIG...END_VAR 構文で提供するインスタンス固有の初期化項目を用いても詳述さ

れる。インスタンス固有の初期値は,必ず型固有の初期値をオーバライドする。


41

B 3503

:2016 (IEC 61131-3:2013)

表 13−変数の宣言

No.

説明

解説

1

基本データ型の変数

VAR

 MYBIT:  BOOL; 

 OKAY:  STRING[10];

 VALVE_POS  AT  %QW28:  INT;

END_VAR

 
ブール型変数 MYBIT へメモリビットを
割り付ける。 
 
最大長が 10 文字である列を含むために
メモリを割り付ける。

2

ユーザ定義データ型の

変数

VAR

 myVAR:  myType;

END_VAR

ユーザデータ型の変数の宣言

3

配列型の変数

VAR

 BITS:  ARRAY[0..7]  OF  BOOL;

 TBT:  ARRAY [1..2, 1..3] OF INT;

 OUTA AT %QW6: ARRAY[0..9] OF INT;

END_VAR

4

リファレンス型の変数

VAR

 myRefInt:  REF_TO  INT;

END_VAR

リファレンス型の変数の宣言

表 14−変数の初期化

No.

説明

解説

1

基本データ型の変数の

初期化

VAR

 MYBIT:  BOOL

:=1;

 OKAY:  STRING[10]  :='OK';

 
 
 
 

 VALVE_POS AT %QW28: INT :=100;

END_VAR

 
初期値が 1 であるブール型変数 MYBIT

にメモリビットを割り付ける。 
最大長が 10 文字である文字列が入れる

メモリを割り付ける。

初期化後,文字列の長さが 2 であり,文
字列として印字するために適切な順序

の 2 バイト文字列'OK'(それぞれ 10 進で
79 及び 75)を含む。

2

ユーザ定義データ型の

変数の初期化

TYPE

  myType:  ...

END_TYPE

VAR

  myVAR:  myType  :=…  //

初期化

END_VAR

初期化付き又はなしのユーザデータ型

の宣言 
 
ユーザデータ型の変数の事前初期化の

宣言

3

配列型の変数の初期化

VAR

 BITS:  ARRAY[0..7]  OF  BOOL

:=[1,1,0,0,0,1,0,0];

 TBT: ARRAY [1..2, 1..3] OF INT

 :=[9,8,3(10),6];

 OUTARY AT %QW6: ARRAY[0..9]OF INT

 :=[10(1)];

END_VAR

 
初期値を含むためにメモリ 8 ビットを割

り付ける。

 BITS[0] :=1, BITS[1] :=1,...,

 BITS[6]  :=0,  BITS[7]  :=0.

2x3 の整数配列 TBT に初期値を割り付け
る。

 TBT[1,1]  :=9,  TBT[1,2]  :=8,

 TBT[1,3] :=10, TBT[2,1] :=10,

 TBT[2,2] :=10, TBT[2,3] :=6.


42

B 3503

:2016 (IEC 61131-3:2013)

表 14−変数の初期化(続き)

No.

説明

解説

4

定数の初期化

VAR CONSTANT

 PI:  REAL  :=3.141592;

 PI2:  REAL  :=2.0*PI;

END_VAR

 
定数 
記号定数 PI

5

定数式を用いた初期化

VAR

  PIx2: REAL :=2.0 * 3.1416;

END_VAR

 
定数式を使用する。

6

リファレンス型の変数
の初期化

VAR

 myRefInt:  REF_TO  INT

 :=REF(myINT);

END_VAR

 
変数 myINT を指すために myRefint を

初期化する。

6.5.2

変数宣言部

6.5.2.1

概要

各プログラム構成ユニット(POU)

(すなわち,ファンクションブロック,ファンクション及び追加とし

てメソッド)の宣言は,プログラム構成ユニット内で用いられる変数の名前,型(及び,必要に応じ物理

又は論理位置の宣言及び初期化宣言)を明記する複数の宣言部から始まる。

POU の宣言部は,POU の種類次第で複数の VAR 宣言部を含んでもよい。

変数は,該当する場合,RETAIN 又は PUBLIC のような識別子を含めて個々に VAR ... END_VAR テキ

スト表現構成内で宣言できる。変数部の識別子は,

図 に要約する。

予約語

変数の使用

VAR

宣言部:POU の型(ファンクション,ファンクションブロック,プログラムについて参照)

。又はメソッドによ

って使用可能なものが異なる。

VAR

実体(ファンクション,ファンクションブロックなど)の内部で使用する。

VAR_INPUT

外部から入力され,実体内では変更できない。

VAR_OUTPUT

実体内から外部呼出し元へ出力する。

VAR_IN_OUT

実体から入力され,呼出し先によって変更でき,外部呼出し元へ出力できる。

VAR_EXTERNAL

コンフィグレーションから VAR_GLOBAL を通じて入出力する。

VAR_GLOBAL

グローバル変数宣言

VAR_ACCESS

アクセスパス宣言

VAR_TEMP

ファンクションブロック,メソッド及びプログラムの内部変数のための一時記憶

VAR_CONFIG

インスタンス固有の初期化及び位置の割付け

(END_VAR)  上記の様々な VAR 宣言部の終了

修飾子:上記 VAR 宣言部に付随して使用できる。

RETAIN

保持属性変数

NON_RETAIN

非保持属性変数

PROTECTED

自身の呼出し先及びその派生(デフォルト)の内側からだけアクセス可能

PUBLIC

全ての実体からのアクセスが許可されている。

PRIVATE

その実体だけアクセス可能

INTERNAL

同じ名前空間内からだけアクセス可能

CONSTANT

a)

コンスタント(変数の値は変更できない。

注記  これらの予約語の使用の可否は,それらを使用するプログラム構成ユニット又はコンフィグレーション要素の

特性による。

a)

  ファンクションブロックインスタンスは,CONSTANT 修飾子宣言は許されていない。

図 7−変数宣言の予約語(概要)


43

B 3503

:2016 (IEC 61131-3:2013)

・  VAR  VAR ... END_VAR 構文で宣言された変数は,プログラム又はファンクションブロックインス

タンスからの呼出しから別の呼出しへ存続する。

ファンクション内で,この構文で宣言された変数は,ファンクションから呼出しから別の呼出しま

で存続しない。

・  VAR_TEMP  プログラム構成ユニット内で,変数は VAR_TEMP...END_VAR 構文の中で宣言できる。

ファンクション及びメソッドでは,予約語 VAR 及び VAR_TEMP は同等である。

これらの変数は,各呼出しで型固有のデフォルト値で指定され,また,初期化され,呼出し間で存

続しない。

・  VAR_INPUTVAR_OUTPUT

及び VAR_IN_OUT  これらの構文で宣言された変数は,ファンクション,

ファンクションブロック型,プログラム及びメソッドの正式なパラメータとなる。

・  VAR_GLOBAL

及び VAR_EXTERNAL  VAR_GLOBAL 構文内で宣言された変数は,これらが別の POU の

VAR_EXTERNAL

構文で再度宣言された場合,その POU 内で使用することができる。

VAR_GLOBAL

,VAR_EXTERNAL 及び CONSTANT の使用方法は,

図 に示す。

変数を含む要素の宣言

左記の変数を用いた要素の宣言

許可されている?

VAR_GLOBAL X

VAR_EXTERNAL CONSTANT X

はい

VAR_GLOBAL X

VAR_EXTERNAL X

はい

VAR_GLOBAL CONSTANT X

VAR_EXTERNAL CONSTANT X

はい

VAR_GLOBAL CONSTANT X

VAR_EXTERNAL X

いいえ

注記  変数宣言部内の VAR_EXTERNAL 宣言部の使用は,予期しない挙動をもたらすことがある。例えば,外部変数の

値が同じプログラム構成要素内の別の変数宣言部で変更する場合である。

図 8VAR_GLOBALVAR_EXTERNAL 及び CONSTANT の使用

・  VAR_ACCESS  VAR_ACCESS 宣言部内で宣言されている変数は,宣言内に示すアクセスパスを用いて

アクセスできる。

・  VAR_CONFIG  VAR_CONFIG...END_VAR 構文は,アスタリスク表記“*”を用いてシンボルで位置

を実体に割り当てる,若しくは表現されている変数にインスタンス固有の位置を代入する方法,変数

によって初期値を実体に割り当てる方法,又はその両方を提供する。

6.5.2.2

宣言の範囲

宣言部分に含まれる宣言のスコープ(有効範囲)は,宣言部を含むプログラム構成ユニットに対しての

ローカルなスコープとなる。それらのユニットの入力又は出力として宣言した変数をパラメータとして明

示的に渡す場合を除いて,宣言している変数は他のプログラム構成ユニットからアクセスできない。

この規則の例外は,グローバルとして宣言された変数の場合である。このような変数は,VAR_EXTERNAL

宣言によってだけプログラム構成ユニットでアクセスできる。VAR_EXTERNAL ブロックで宣言する変数の

型は,関連するプログラム,コンフィグレーション,又はリソースの VAR_GLOBAL ブロックで宣言する型

と一致しなければならない。

次の場合は,エラーになる。

・  プログラム構成ユニットが,CONSTANT 修飾子をもつ変数の値,又は VAR_INPUT 部で宣言されてい

る変数の値を変更しようとしたとき。

・  コンフィグレーション要素又はプログラム構成ユニット(以下,収納要素という。)において,

VAR_GLOBAL CONSTANT

で 宣 言 し た 変 数 が , 次 に 示 す よ う に 収 納 要 素 に 含 ま れ る 要 素 の

VAR_EXTERNAL

宣言(CONSTANT 修飾子なし)で使用したとき。


44

B 3503

:2016 (IEC 61131-3:2013)

変数宣言ブロックに許される変数の最大個数は,実装依存である。

6.5.3

可変長 ARRAY 変数

可変長配列は,次のいずれかの場合にだけ用いることができる。

・  ファンクション及びメソッドの入力変数,出力変数又は入出力変数として

・  ファクションブロックの入出力変数として

実パラメータ及び正式パラメータとで,配列の次元の数が同じでなければならない。各次元の添字の範

囲は,未定義であることを示すアスタリスクを用いて指定する。

可変長配列は,添字の範囲がそれぞれ異なるの配列を使用するための方法をプログラム,ファンクショ

ン,ファンクションブロック及びメソッドに提供する。

可変長配列を取り扱うには,次の標準ファンクションを提供しなければならない(

表 15 参照)。

表 15−可変長 ARRAY 型変数

No.

説明

1

*

  を用いた宣言

ARRAY [*, *, . . . ] OF data type

VAR_IN_OUT

  A:  ARRAY  [*,  *]  OF  INT;

END_VAR;

標準ファンクション LOWER_BOUND / UPPER_BOUND

2a

グラフィック表現

配列の添字の下限値を得る。

 +

----------- +

 !

LOWER_BOUND !

 ARRAY ----! ARR

! --- ANY_INT

 ANY_INT --! DIM

!

 +

----------- +

 
配列の添字の上限値を得る。

 +

----------- +

 !

UPPER_BOUND !

 ARRAY ----! ARR

! --- ANY_INT

 ANY_INT --! DIM

!

 +

----------- +

2b

テキスト表現表現

配列 A の 2 番目の添字の下限値を得る。

low2 :=LOWER_BOUND (A, 2);

配列 A の 2 番目の添字の上限値を得る。

up2 :=UPPER_BOUND (A, 2);

例 1

A1: ARRAY [1..10] OF INT :=[10(1)];

A2: ARRAY [1..20,

−2..2] OF INT :=[20(5(1))];

// 6.4.4.5.2(初期化)による初期化

LOWER_BOUND (A1, 1)

→ 1

UPPER_BOUND (A1, 1)

→ 10

LOWER_BOUND (A2, 1)

→ 1

UPPER_BOUND (A2, 1)

→ 20

LOWER_BOUND (A2, 2)

→  −2


45

B 3503

:2016 (IEC 61131-3:2013)

UPPER_BOUND (A2, 2)

→ 2

LOWER_BOUND (A2, 0)

→エラー

LOWER_BOUND (A2, 3)

→エラー

例 2  配列の合計

FUNCTION SUM: INT;

VAR_IN_OUT A: ARRAY [*] OF INT; END_VAR;

VAR i, sum2 : DINT; END_VAR;

sum2:=0;

FOR i:=LOWER_BOUND(A,1) TO UPPER_BOUND(A,1)

  sum2:=sum2  +  A[i];

END_FOR;

SUM:=sum2;

END_FUNCTION

// SUM (A1)

→ 10

// SUM (A2[2])

→ 5

例 3  行列の乗算

FUNCTION MATRIX_MUL

VAR_INPUT

  A: ARRAY [*, *] OF INT;

  B: ARRAY [*, *] OF INT;

END_VAR;

VAR_OUTPUT C: ARRAY [*, *] OF INT; END_VAR;

VAR i, j, k, s: INT; END_VAR;

FOR i:=LOWER_BOUND(A, 1)

TO UPPER_BOUND(A, 1)

  FOR j:=LOWER_BOUND(B, 2)

TO UPPER_BOUND(B, 2)

  s  :=0;

      FOR  k:=LOWER_BOUND(A,  2)  TO  UPPER_BOUND(A,  2)

      s:=s

+A[i, k] * B[k, j];

      END_FOR;

  C[i,  j]  :=s;

  END_FOR;

END_FOR;

END_FUNCTION

//

使い方:

VAR


46

B 3503

:2016 (IEC 61131-3:2013)

  A: ARRAY [1..5, 1..3] OF INT;

  B: ARRAY [1..3, 1..4] OF INT;

  C: ARRAY [1..5, 1..4] OF INT;

END_VAR

MATRIX_MUL (A, B, C);

6.5.4

コンスタント変数

コンスタント変数は,予約語 CONSTANT を含む変数部内で定義する変数である。表現定義規則を適用し

なければならない。

例  コンスタント変数

VAR CONSTANT

  Pi:

REAL  :=3.141592;

  TwoPi:

REAL  :=2.0*Pi;

END_VAR

6.5.5

直接表現変数(%

6.5.5.1

概要

単一要素変数の直接表現は,次の連結による特殊記号形式で与えられなければならない。

・  パーセント記号“%”

・  位置接頭語 I, Q 又は M,及び

・  サイズ接頭語 X(又はなし)

,B, W, D 又は L,及び

・  ピリオド(.)とによって分離された一つ以上の符合なし整数(次の階層的番地付けの

例を参照。)

%MW1.7.9

%ID12.6

%QL20

実装者は,変数の直接表現と,メモリ,入力又は出力において番地付けされた対象物の物理又は論理位

置との間の対応を指定しなければならない。

注記  ファンクション,ファンクションブロック,メソッド及びプログラムのボディ内での直接表現

変数の使用は,例えば,それぞれ異なる目的で物理的入出力を使用するプログラマブルコント

ローラシステム間でのプログラム構成ユニット型の再利用において制限となる。

直接表現変数の使用は,ファンクション,ファンクションブロック,プログラム及びメソッドのボディ,

並びにコンフィグレーション及びリソース内で許可される。

直接表現変数の項目の定義は,

表 16 による。

POU 及びメソッドのボディでの直接表現変数の使用は,非推奨である。


47

B 3503

:2016 (IEC 61131-3:2013)

表 16−直接表現変数

No.

説明

解説

位置

a)

1

入力位置

I

%IW215

入力ワード 215

2

出力位置

Q

%QB7

出力バイト 7

3

メモリ位置

M

%MD48

メモリ位置 48 での 2 倍長ワード

サイズ 

4a 1 ビットサイズ

X

%IX1

入力データ型 BOOL

4b 1 ビットサイズ

なし

%I1

入力データ型 BOOL

5

バイト(8 ビット)サイズ

B

%IB2

入力データ型 BYTE

6

ワード(16 ビット)サイズ

W

%IW3

入力データ型 WORD

7 2 倍長ワード(32 ビット)サイズ

D

%ID4

入力データ型 DWORD

8

ロング(4 倍長)ワード(64 ビット)サイズ

L

%IL5

入力データ型 LWORD

番地付け 

9

単純番地付け

IX1

%IB0

1 レベル

10

“.”を用いた階層的番地付け

%QX7.5

%QX7.5

%MW1.7.9

実装者定義,例 
2 レベル,範囲 0..7 
3 レベル,範囲 1..16

11

アスタリスク”*”を用いた部分指定変数

b)

%M*

a)

  各国の標準化機構は,これらの接頭語の翻訳表を発行できる。

b)

  この表中のアスタリスクを使用するには,項目 VAR_CONFIG を必要とする。逆も同様である。

6.5.5.2

直接表現変数−階層的アドレス

単純(1 レベル)直接表現がピリオドで分離された追加の整数フィールドによって拡張されたとき,最

も左側の整数フィールドが階層の最上位のレベルを表し,より低いレベルが右側に表れる階層的な物理又

は論理アドレスとして解釈しなければならない。

例  階層的アドレス

%IW2.5.7.1

例えば,この変数は,プログラマブルコントローラシステムの第 2“I/O バス”の第 5“ラック”の第 7

“モジュール”の第 1 番目の“チャンネル”

(ワード)を表す。階層的アドレスの最大レベル数は,実装者

によって異なる。

注記  あるプログラマブルコントローラシステム内のプログラムで他のプログラマブルコントローラ

内のデータをアクセスすることを可能にするための階層的アドレスの使用は,実装者固有の言

語拡張とみなす。

6.5.5.3

直接表現変数の宣言(AT

表 16 に規定する直接表現変数の宣言(例  %IW6)は,AT の予約語を用いて記号名及びデータ型を与え

ることができる。

例えば,配列のようなユーザ定義のデータ型の変数には,AT を用いて“絶対”メモリの割付けができる。

変数の位置はメモリ位置の開始アドレスを定義し,特定の直接表現よりも等しい,又は大きいサイズであ

る必要はない。すなわち,メモリのサイズが 0 又はメモリの割付けの重複は認められる。

例  直接表現の使用


48

B 3503

:2016 (IEC 61131-3:2013)

VAR

 INP_0 AT %I0.0: BOOL;

入力名及び型

 AT %IB12: REAL;

 PA_VAR AT %IB200: PA_VALUE;

%IB200

で始まる入力位置の名前及びユーザ定義

の型

 OUTARY AT %QW6: ARRAY[0..9] OF

INT;

END_VAR

%QW6

で始まる隣接する出力位置に代入する要素

数 10 の整数の配列

表 13 に規定する全種類の変数では,明示的(ユーザ定義)なメモリ割付けは,直接表現変数(例  %MW10)

と組み合わせた予約語 AT を用いて宣言できる。

この項目が一つ以上の変数宣言内でサポートされていない場合は,実装者の規格順守対照表の中にその

旨を記載しなければならない。

注記 1  変数が“%”を用いて明示的に位置指定する場合,変数は,PROGRAM 及び VAR_GLOBAL  宣

言内だけで使用することが望ましい。

注記 2  システム入力(例えば,%IW10)の初期化は,実装者によって異なる。

6.5.5.4

直接表現変数−“  *  ”を用いた部分指定

直接表現変数の位置がまだ完全に指定されていないことを示すために,プログラム及びファンクション

ブロック型の内部で,アスタリスク表記“*”をアドレス指定に使用することができる。

VAR

  C2 AT %Q*: BYTE;

END_VAR

まだ位置が指定されていない出力バイトを長さ 1
バイトのビット列変数に割り当てる。

直接表現変数が,プログラム又はファンクションブロック型の宣言部の内部変数への位置割付けで用い

られている場合,直接表現がまだ完全に指定されてないことを示すために,アスタリスク“*”を,連結

表現中のサイズ接頭語,及び符号なし整数の代わりに用いなければならない

この型の変数は,VAR_INPUT 及び VAR_IN_OUT 部で使用してはならない。

この仕様を用いるには,プログラム又はファンクションブロックのインスタンスごとに,コンフィグレ

ーションの VAR_CONFIG...END_VAR 構文の中で,宣言する変数の位置を完全に示さなければならない。

アスタリスク記法“*”で表現された不完全な位置指定を含むどのプログラム又はファンクションブロッ

ク型のインスタンスでも,

不完全なアドレス表現に対する完全な記述が VAR_CONFIG...END_VAR 構文に

ない場合は,エラーとしなければならない。

6.5.6

保持属性変数(RETAINNON_RETAIN

6.5.6.1

概要

構成要素(リソース又はコンフィグレーション)が JIS B 3501 に従って“ウォーム再始動”又は“コー

ルド再始動”として“始動”するとき,構成要素及びそのプログラムに関係した変数のそれぞれは,構成

要素の始動操作及び変数の保持の挙動の宣言に応じた値になる。

保持の挙動は,

図 に規定している RETAIN 又は NON_RETAIN 修飾子を用いることによって保持又は

非保持のいずれかであるファンクションブロック及びプログラムの変数部 VAR_INPUT,VAR_OUTPUT 及

び VAR に含まれる全ての変数で宣言できる。これらの予約語の使用は,オプション項目である。

変数の初期値の状態は,

図 による。


49

B 3503

:2016 (IEC 61131-3:2013)

図 9−変数の初期値の状態(規則)

1)

始動操作が,JIS B 3501 に規定する“ウォーム再始動”の場合,RETAIN 修飾子による変数部内の全

ての変数の初期値は,保持された値でなければならない。これらの初期値は,リソース又はコンフィ

グレーションが停止されたときの変数の値である。

2)

始動操作が“ウォーム再始動”の場合,NON_RETAIN 修飾子による変数部内の全ての変数の初期値は,

初期化しなければならない。

3)

始動操作が“ウォーム再始動”で RETAIN 及び NON_RETAIN 修飾子が加えられていない場合,初期

値は実装者によって異なる。

4)

始動操作が“コールド再始動”の場合,RETAIN 及び NON_RETAIN 修飾子による VAR 部内の全ての

変数の初期値は,次に規定するとおり初期化しなければならない。

6.5.6.2

初期化

変数は,ユーザ定義の変数ごとに固有な初期値を用いて初期化する。

初期値が指定されていないときは,ユーザ定義の型固有の初期値を用いる。ユーザ定義がない場合,

10

に規定する型固有のデフォルトの初期値を用いる。

さらに,次の規則を適用する。

・  JIS B 3501 に規定しているプログラマブルコントローラシステムへの入力を表現する変数は,実装者

固有の方法で初期化しなければならない。

・  RETAIN 及び NON_RETAIN 修飾子は,VAR_IN_OUT 部で宣言する変数で用いてはならないが,静的

な VAR,VAR_INPUT,VAR_OUTPUT 及び VAR_GLOBAL 部において宣言する変数に用いてもよい。

・  ファンクションブロック,クラス及びプログラムのインスタンスの宣言内での RETAIN 及び

NON_RETAIN

の使用を許す。この結果,次の場合を除いて,インスタンスの全ての変数を RETAIN 又

は NON_RETAIN として扱う。

−  ファンクションブロック,

クラス又はプログラム型定義において,

変数に RETAIN 又は NON_RETAIN

が明示的に宣言されている場合。

−  変数自体がファンクションブロック型又はクラスである場合。この場合,使用するファンクション

ブロック型又はクラスの保持宣言を適用する。

構造体データ型のインスタンスに RETAIN 及び NON_RETAIN の使用を許す。結果,全ての構造体要素

(入れ子にされた構造のものを含め)を RETAIN 又は NON_RETAIN として扱う。

VAR RETAIN

 AT %QW5: WORD :=16#FF00;

始動操作?

ウォーム再始動

保持属性は?

RETAIN

NON_RETAIN

コールド再始動

a)  保持された値

b),d)  初期化された値

宣言なし

c)  実装者固有値


50

B 3503

:2016 (IEC 61131-3:2013)

  OUTARY AT %QW6: ARRAY[0..9] OF INT :=[10(1)];

 BITS: ARRAY[0..7] OF BOOL :=[1,1,0,0,0,1,0,0];

END_VAR

VAR NON_RETAIN

 BITS: ARRAY[0..7]OF BOOL;

 VALVE_POS AT %QW28: INT :=100;

END_VAR

6.6

プログラム構成ユニット(POU

6.6.1

POU

の共通項目

6.6.1.1

概要

この規格に規定するプログラム構成ユニット(POU)とは,ファンクション,ファンクションブロック,

クラス及びプログラムのことである。ファンクションブロック及びクラスはメソッドを含んでもよい。

POU は,モジュール化及び構造化のために明確に定義されたプログラムを含んでいる。POU は,入出力

とのインタフェースをもち,複数回呼び出し,実行してもよい。

注記  上述のパラメータインタフェースは,オブジェクト指向との関連で定義するインタフェースと

同じものではない。

POU 及びメソッドは,実装者が提供するか,使用者がプログラムする。

宣言済みの POU は,

図 に示すように他の POU で使用できる。

POU 及びメソッドの再帰的呼出しの可否は,実装依存である。

特定のリソースに対する POU,メソッド及びインスタンスの最大数は,実装者固有のものである。

6.6.1.2

代入及び式

6.6.1.2.1

概要

代入及び式の言語構成要素は,テキスト言語及び(部分的に)グラフィック言語の中で使用する。

6.6.1.2.2

代入

代入は,リテラル,定数式,変数又は式(次を参照。

)の値を別の変数に書き込むために用いる。代入す

る変数は,例えば,ファンクション,メソッド,ファンクションブロックなどの入力変数,又は出力変数

のようなどんな種類の変数でもよい。

同じデータ型の変数は,常に代入することができる。追加的に次の規則を適用する。

・  STRING 型又は WSTRING 型の変数又は定数は,それぞれ STRING 型又は WSTRING 型の変数に個々に

代入できる。代入元となる文字列の長さが代入先となる変数の定義よりも長ければ,結果は実装依存

による。

・  範囲指定型の変数は,その基本データ型の変数を使用できる箇所で,どこでも用いることができる。

範囲指定型の値が,指定された範囲外となる場合は,エラーである。

・  派生型の変数は,その基本データ型の変数を使用できる箇所で,どこでも用いることができる。

・  配列に関する追加規則を,実装依存で定義してもよい。

代入元のデータ型を代入先のデータ型に合致させるために,暗黙的又は明示的なデータ型変換を適用し

てもよい。

a)

テキスト表現(又はグラフィック言語に部分的に適用可能な形式)では,代入演算子は,次でもよい。

“:=”は,演算子の右側の式の値が演算子の左側の変数に書き込まれることを意味する。

“=>”は,演算子の左側の値が演算子の右側の変数に書き込まれることを意味する。


51

B 3503

:2016 (IEC 61131-3:2013)

“=>”演算子は,ファンクション,メソッド,ファンクションブロックなどの呼出しのパラメータ

リストの中だけで使用でき,かつ,VAR_OUTPUT パラメータの値を呼出し側に戻すためだけに用いる。

A :=B

+C/2;

Func (in1 :=A, out2=> x);

A_struct1 :=B_Struct1;

注記  ユーザ定義データ型(STUCTURE,ARRAY)の代入については,表 72 参照。

b)

グラフィック表現では,代入は代入元から代入先へのグラフィック接続線として視覚化する。一般的

には,左から右,例えば,ファンクションブロック出力からファンクションブロック入力,又は変数

/定数のグラフィック“位置”からファンクション入力,又はファンクション出力から変数のグラフ

ィック“位置”まで視覚化する。

標準ファンクション MOVE は,代入のグラフィック表現の一つである。

6.6.1.2.3

式は,リテラル,変数及びファンクション呼出しのようなオペランドと,

(+,−,*,/)のような演

算子の定義済み組合せとで構成され,

複数の値をもつ場合がある一つの値を生み出す言語構成要素である。

暗黙的及び明示的データ型変換は,式の演算のデータ型を合致させるために適用してもよい。

a)

テキスト表現(又はグラフィック言語に部分的に適用可能な形式)では,式は言語で定義された順位

に応じて既定順序で実行する。

例  ... B+C / 2 * SIN(x)...

b)

グラフィック表現では,ラインに接続されている図式ブロック(ファンクションブロック,ファンク

ション,ほか)のネットワークとして視覚化する。

6.6.1.2.4

定数式

定数式は,リテラル,コンスタント変数及び列挙値のようなオペランドと,

(+,−,*)のような演算

子の定義された組合せとで構成され,多値をもつ場合がある一つの値を生み出す言語構成要素である。

6.6.1.3

ANY_BIT

変数への部分的なアクセス  

ANY_BIT

(BYTE,WORD,DWORD,LWORD)データ型の変数では,変数のビット,バイト,ワード及び

ダブル・ワードデータへの部分的なアクセスが可能で,

表 17 に定義する。

変数の部分的なデータをアドレス指定するには,整数リテラル(0 から最大値)と合わせ,記号“%”及

表 16 の直接表現変数を対象にして定義されているサイズ接頭語(X,B,W,D,L)を用いる。リテラ

ル 0 は,最下位の部分を参照し,最大値は最上位部分を参照することになる。

“%X”は,ビットデータに

アクセスする場合は省略可能である。

例  ANY_BIT への部分的アクセス

VAR

  Bo:  BOOL;

  By:  BYTE;

  Wo:  WORD;

  Do:  DWORD;

  Lo:  LWORD;

END_VAR;

Bo :=By.%X0; // By

の 0 ビット目


52

B 3503

:2016 (IEC 61131-3:2013)

Bo :=By.7;

// By

の 7 ビット目;%X がデフォルトであり,省略可能

Bo :=Lo.63

// Lo

の 63 ビット目;

By :=Wo.%B1; // Wo

の 1 バイト目;

By :=Do.%B3; // Do

の 3 バイト目;

表 17ANY_BIT 変数の部分的アクセス

No.

説明

データ型

例及び構文

次へアクセスするデータ型 

myVAR_12.%X1; yourVAR1.%W3;

1a

BYTE

−ビット

VB2.%X0

BOOL

<variable_name>.%X0 から<variable_name>.%X7 へ

1b

WORD

−ビット

VW3.%X15

BOOL

<variable_name>.%X0 から<variable_name>.%X15 へ

1c

DWORD

−ビット

BOOL

<variable_name>.%X0 から<variable_name>.%X31 へ

1d

LWORD

−ビット

BOOL

<variable_name>.%X0 から<variable_name>.%X63 へ

2a

WORD

−バイト

VW4.%B0

BYTE

<variable_name>.%B0 から<variable_name>.%B1 へ

2b

DWORD

−バイト

BYTE

<variable_name>.%B0 から<variable_name>.%B3 へ

2c

LWORD

−バイト

BYTE

<variable_name>.%B0 から<variable_name>.%B7 へ

3a

DWORD

−ワード

WORD

<variable_name>.%W0 から<variable_name>.%W1 へ

3b

LWORD

−ワード

WORD

<variable_name>.%W0 から<variable_name>.%W3 へ

4

LWORD

−2 倍長ワード

VL5.%D1

DWORD

<variable_name>.%D0 から<variable_name>.%D1 へ

ビットアクセス接頭語%X は,

表 16 に従って省略してもよい。例  By1.%X7 は By1.7 と同じである。

部分的アクセスは,直接変数には用いてはならない。

例  %IB10

6.6.1.4

呼出し表現及び規則

6.6.1.4.1

概要

ファンクション,ファンクションブロックインスタンス又は(ファンクションブロック又はクラスの)

メソッドを実行するために呼出しを用いる。

図 10 に示すように,呼出しは,テキスト表現又はグラフィ

ック表現で表示できる。

a)

標準ファンクションで入力変数に名前が定められていない場合,上から下に向かってデフォルト名

IN1

,IN2 を付けなければならない。標準ファンクションがただ一つの名前未設定入力をもつ場合,

デフォルト名 IN を適用しなければならない。

b) POU

内の呼出しの VAR_IN_OUT 変数が“正しくマップされていない”ときは,エラーとしなければ

ならない。

VAR_IN_OUT

変数が“正しくマップされている”とは,次のいずれかをいう。

・  左側でグラフィカルに接続されている。

・  所 属するプロ グラム構成 ユニット内 でのテキス ト表現の呼 出しで“ :=” 演算 子を 用いて,

VAR_IN_OUT

,VAR,VAR_TEMP,VAR_OUTPUT,VAR_EXTERNAL ブロックにて(ただし,CONSTANT

修飾子なしに)宣言された変数に代入されているか,又は他のファンクション,ファンクションブ

ロック,メソッドの呼出しの正しくマップされた“VAR_IN_OUT”変数に代入されている。

c)

呼出しの“正しくマップされた”

(上記規則に示すとおりに)VAR_IN_OUT 変数は,次のいずれかを

いう。

・  右側でグラフィカルに接続できる。

・  テキスト表現の代入文内で“:=”演算子を用いて,所属するプログラム構成ユニットの VAR,

VAR_OUTPUT

又は VAR_EXTERNAL ブロックで宣言された変数に代入できる。

そのように接続された変数値が明確に定まらない場合には,エラーとしなければならない。


53

B 3503

:2016 (IEC 61131-3:2013)

d)

ファンクションブロックインスタンスの名前は,それが VAR_INPUT 又は VAR_IN_OUT として宣言さ

れていれば,呼出しの入力として用いることができる。

呼び出された側の内部では,入力として引き渡されたインスタンスを次のように利用できる。

・  インスタンスが VAR_INPUT として宣言されている場合は,そのファンクションブロック変数は読

み取ることだけができる。

・  インスタンスが VAR_IN_OUT として宣言されている場合は,そのファンクションブロック変数は読

み取ることも書き込むことも,また,ファンクションブロックを呼び出す(実行する)こともでき

る。

6.6.1.4.2

テキスト言語

テキスト表現の呼出しの項目を

表 20 に規定する。テキスト表現の呼出しは,呼び出される側の名前に続

けてパラメータのリストを記述する形式で構成する。

ST 言語では,パラメータはコンマで分離し,また,このリストは括弧によって左右で区切らなければな

らない。

呼出しのパラメータリストは実効値を提供しなければならず,また,正式パラメータ名がある場合には

それらに代入することができる。

・  正式呼出し  パラメータリストは,一連の正式パラメータ名に対する実効値の代入の表記(正式パラ

メータリスト)を備えている。代入の表記には,次の二つがある。

a)

“:=”演算子を用いた入力変数及び入出力変数への値の代入

b)

“=>”演算子を用いた変数への出力変数の値の代入

正式パラメータリストは,完全でも不完全でも差し支えない。リストによって値が代入されない変数に

対しては,呼び出された側に初期値が宣言されている場合はその値が,初期値宣言がない場合はその変数

のデータ型のデフォルト値が適用されなければならない。

リスト内のパラメータの順序付けは,意味があってはならない。

実行制御パラメータ EN 及び ENO を使用してもよい。

例 1

A :=LIMIT(EN:=COND, IN:=B, MN:=0, MX:=5, ENO => TEMPL);

//

  完全

A :=LIMIT(IN:=B, MX:=5);

//

  不完全

略式呼出し  パラメータリストは,実行制御パラメータ EN 及び ENO を除き,ファンクション定義に

示すものと同じパラメータ数,正確に同じ順序及び同じデータ型をそのとおりに含まなければならな

い。

例 2

A :=LIMIT(B, 0, 5);

この呼出しは,

例 の完全な呼出しに相当するが,EN/ENO はない。

6.6.1.4.3

グラフィック言語

グラフィック言語において,ファンクションの呼出しは,次の規則に従ってグラフィックブロックとし

て表現しなければならない。

a)

ブロックの型は,長方型でなければならない。

b)

ブロックの大きさ及び縦横比は,表示する入力及びその他の情報によって変わってもよい。

c)

ブロックを通しての処理の方向は,左から右(入力変数が左側で出力変数が右側)でなければならな

い。


54

B 3503

:2016 (IEC 61131-3:2013)

d)

呼び出された要素の名称又は記号は,ブロックの中に表示しなければならない。

e)

ブロックの左右内側にそれぞれ,入力及び出力変数の名前を表示しなければならない。

f)

付加的な入力 EN 及び/又は付加的な出力 ENO を用いてもよい。その場合,それぞれブロックの左側

最上部,右側最上部に表示しなければならない。

g)

ENO

出力がない場合,ファンクションの結果は,右側の最上部に示さなければならない。ENO 出力が

ある場合は,ファンクションの結果は,ENO 出力のすぐ下に示さなければならない。呼び出された要

素の名自体がその出力値,すなわち,ファンクションの結果の代入で使用するので,出力変数名をブ

ロックの右側に表示してはならない。

h)

パラメータの接続(ファンクションの結果を含む。

)は,信号線で示さなければならない。

i)

ブール信号の否定は,ブロック及びその入出力線の交点のすぐ外側に白抜きの円を置くこととで示さ

れなければならない。文字セットでは,

図 10 に示すように大文字アルファベット“O”で表現しても

よい。否定は POU の外側で行う。

j)

グラフィック表現で表現されたファンクションの全ての入力及び出力(ファンクションの結果を含

む。

)は,データ要素が多要素変数だとしても,ブロックの対応する側の外側に一本線で表さなければ

ならない。

k)

結果及び出力(VAR_OUTPUT)は,変数に接続し他の呼出しへの入力として使用することができるが,

何も接続しなくてもよい。

グラフィック表現例

(FBD)

テキスト表現例

(ST)

解説

a)

 +

------

+

| ADD |

 B--

| |

--A

 C--

| |

 D--

| |

 +

------ +

A :=ADD(B, C, D); //

ファン

クション 
 

A :=B

+C+D; //演算式

 
略式パラメータリスト

(B, C, D)

b)

 +

------

+

| SHL |

 B--

| IN |

--A

 C--

| N |

 +

------ +

A :=SHL(IN :=B, N :=C);

 
正式パラメータ名

IN

, N

c)

 +

------

+

| SHL |

 ENABLE--

|

EN

・ENO | O-NO_ERR

 B--

| IN |

--A

 C--

| N |

 +

------ +

A :=SHL(

 EN

:=ENABLE,

 IN

:=B,

 N

:=C,

 NOT

ENO=>

NO_ERR);

 
正式パラメータ名 
 

EN

入力及び否定 ENO 出力の使用

図 10−呼出しの正式及び略式表示(例)


55

B 3503

:2016 (IEC 61131-3:2013)

グラフィック表現例

(FBD)

テキスト表現例

(ST)

解説

d)

 +

------

+

| INC |

 |

|

--A

 X--

|

V----V

| --X

 +

------

+

A :=INC(V :=X);

 
ユーザ定義 INC ファンクション 
 

VAR_IN_OUT

の正式パラメータ名

V

注記  上記例は,正式パラメータ名がない標準ファンクション(ADD),正式パラメータ名がある標準ファンクション

(SHL)

,それに EN 入力及び ENO 出力の否定を付加的に使用したファンクション,正式パラメータ名をもつユ

ーザ定義ファンクション(INC)におけるファンクションのグラフィック表現,並びにそれと同等なテキスト表

現の使用の両方を示す。

図 10−呼出しの正式及び略式表示(例)(続き)

6.6.1.5

実行制御(ENENO

表 18 に示すように,実装者又は使用者は,付加的なブール型の EN(イネーブル)入力若しくは ENO(イ

ネーブル・アウト)出力のいずれか又はその両方を,宣言によって提供できる。

VAR_INPUT EN:

BOOL

:=1; END_VAR

VAR_OUTPUT ENO: BOOL;

END_VAR

これらの変数を用いるとき,POU で定義している演算の実行は,次の規則で制御しなければならない。

a)

EN

が FALSE であれば,POU が実行されてはならない。さらに,ENO は FALSE にリセットされなけ

ればならない。実装者は,この場合の挙動を詳細に明記しなければならない。次の例を参照。

b)  EN

の値が TRUE であれば,ENO は TRUE にセットされ,POU に実装された処理が実行されなければ

ならない。また,POU は,実行結果に応じて ENO にブール値をセットしてもよい。

c) POU

の一つを実行中にエラーが発生した場合,プログラマブルコントローラシステムによって POU

の ENO 出力を FALSE(0)にリセットするか,又は実装者はそのようなエラーに対する処理を明記しな

ければならない。

d)  ENO

出力が FALSE(0)と評価される場合,POU の全ての出力値(VAR_OUTPUT,VAR_IN_OUT 及び

ファンクションの結果)は,実装依存である。

e)

入力 EN は,POU の呼出しの一部として実効値をセットされるだけでなければならない。

f)

出力 ENO は,POU の呼出しの一部として変数に値を渡すだけでなければならない。

g)

出力 ENO は,その POU 内部で値をセットしなければならない。

h)  EN/ENO

を参照する場合のファンクション REF()におけるパラメータ EN/ENO の使用は,エラーであ

る。

EN

が FALSE の場合には,通常の POU 実行とは異なる挙動を実装できる。この挙動は,実装者が明記し

なければならない。次の例を参照。

例 1  内部実装

入力 EN を POU 内で評価する。

EN

が FALSE であれば,ENO を FALSE にセットし,POU は直ちに戻る。

又は

POU は,状況次第で演算の一部を行ってもよい。

特定の入力及び入出力パラメータを全て評価し,POU のインスタンスにセットする(ファン


56

B 3503

:2016 (IEC 61131-3:2013)

クションを除く。

入出力パラメータの有効性を確認する。

例 2  外部実装

入力 EN を外部で評価する。EN が FALSE であれば,ENO だけを FALSE にセットし,POU

を呼出ししない。

入力及び入出力パラメータは評価せず,POU のインスタンスにセットしない。入出力パラメ

ータの有効性は,確認しない。

入力 EN は,呼出しとは別に POU 外で割り付けない。

次の図及び式は,EN/ENO がある場合とない場合の使用法を図示したものである。

 myInst

 +

-------- +

 cond

|

myFB

|

X

 ----

|

    | ---- | EN ENO

|

--------(

  )

 v1

--

|

A B

|

-- v2

 v3

--

| C------C |

--

 +

-------- +

例 3  内部実装

myInst (EN:=cond, A:=v1, C:=v3, B=> v2, ENO=> X);

mylnst

のボディは,次から始まる。

IF NOT EN THEN... //

状況次第で演算の一部を行う。

ENO:=0; RETURN; END_IF;

例 4  外部実装

IF cond THEN myInst (A:=v1, C:=v3, B=> v2, ENO=> X)

ELSE X:=0; END_IF;

EN/ENO

なし及びありの POU の呼出しの項目は,

表 18 による。


57

B 3503

:2016 (IEC 61131-3:2013)

表 18EN 及び ENO をグラフィック表現で用いた実行制御

No.

説明

a)

b)

1

EN

及び ENO なしでの使用 FBD 及び ST のファンクションを表示

 +

--------

+

 A--

| + |

--C

 |

|

 +

--------

+

C :=ADD(IN1 :=A, IN2 :=B);

2

EN

だけの使用

(ENO なし)

FBD 及び ST のファンクションを表示

 +

--------

+

 ADD_EN--

| EN |

 A--

| + |

--C

 B--

| |

 +

--------

+

C :=ADD(EN :=ADD_EN. IN1 :=A, IN2 :=B);

3

ENO

だけの使用

(EN なし)

FBD 及び ST のファンクションを表示

 +

--------

+

 |

ENO

| --ADD_OK

 A--

| + |

--C

 B--

| |

 +

--------

+

C :=ADD(IN1 :=A, IN2 :=B, ENO=> ADD_OK);

4

EN

及び ENO の使用 ST 及び LD のファンクションを表示

 +

--------

+ |

| ADD_EN

| + |

ADD_OK |

+ --|

  |-- | EN ENO

| --(

  )-- +

| | |  |

| A--

| |

--C |

| B--

| |  |

 +

--------

+ |

C :=ADD(EN :=ADD_EN, IN1 :=a, IN2 :=IN2, EN=> ADD_OK);

a)

  どの言語において項目がサポートされているかを実装者は明記する。すなわち,実装において EN,ENO のいず

れか又は両方の使用を禁止することもできる。

b)

  上記項目を明示するために選ばれた言語は,例にすぎない。

6.6.1.6

データ型変換

データ型変換は,式,代入及びパラメータ割付けにおいて,データ型を合致させるために使用する。

変数に保持されている情報の表示及び解釈は,宣言された変数のデータ型によって決まる。型変換を用

いる二つのケースがある。

a)

異なるデータ型の変数への変数のデータ値の代入  代入演算子“:=”及び“=>”並びにファンクショ

ン,ファンクションブロック,メソッド,及びプログラムのパラメータとして宣言された変数(すな

わち,入力,出力など)の代入にこれを適用できる。変換元データ型から変換先データ型への変換規

則は,

図 11 による。

例 1  A :=B;

//

変数代入

FB1(x :=z, v=> W);

//

パラメータ割付け

b)

式の中(ST 言語については 7.3.2 参照)  “+”のような演算子と,データ型が同じ又は異なった変数

及びリテラルといったオペランドとで構成する式。


58

B 3503

:2016 (IEC 61131-3:2013)

例 2  … SQRT[B+(C * 1.5)];

//

c)

明示的データ型変換は,変換ファンクションを用いて行う。

d)

暗黙のデータ型変換には,次の適用規則がある。

1)

データ型の値及び精度を維持しなければならない。

2)

型付ファンクションに適用できる。

3)

変数への式の代入に適用できる。

例 3

myUDInt :=myUInt1 * myUInt2;

/*

  乗算の結果は UINT 型となるが,この結果は代入時に UDINT へ暗黙のうちに変

換される。*/

4)

入力パラメータの割付けに適用できる。

5)

出力パラメータの割付けに適用できる。

6)

入出力パラメータへの割付けに適用してはならない。

7)

演算又は多重定義されたファンクションの結果とオペランドとが,同じデータ型になるように適用

できる。

例 4

myUDInt :=myUInt1 * myUDInt2;

//myUInt

は UDINT へ暗黙のうちに変換し,乗算の結果は UDINT である。

8)

実装者は,非型付リテラルの規則を定義しなければならない。

注記  使用者が,曖昧さを避けるために型付リテラルを使用できる。

例 5

IF myWord=NOT (0) THEN …;

//16#FFF, 16#0001

, 16#00FF,などとの曖

昧な比較

IF myWord=NOT (WORD#0) THEN …;  //16#FFFF

との曖昧な比較

図 11 は,変換元データ型から変換先データ型への変換において,“暗黙的変換”又は“明示的変換”の

いずれかを選択するべきかを示すものである。


59

B 3503

:2016 (IEC 61131-3:2013)

変換元

データ型

変換先データ型

実数

整数

符号なし

ビット列

日付及び時刻

文字

 LREAL

 REAL

 LINT

 DINT

 INT

 SINT

 ULINT

 UDINT

 UINT

 USI

N

T

 L

W

ORD

 DW

ORD

 WO

RD

 BYTE

 BOOL

 LT

IM

E

 TIME

 LDT

 DT

 LDA

T

E

 DA

TE

 LT

O

D

 TO

D

 WS

TRIN

G

 STRING

 W

C

HAR

 CHAR

実数

LREAL

  e e e

e e e e e

e

e − − − − − − − − −  −  −  −  −  − − −

REAL

i    e e

e e e e e

e − e − − − − − − − −  −  −  −  −  − − −

整数

LINT

e

e

e

e

e

e

e

e

e

e

e

e

e − − − − − −  −  −  −  −  − − −

DINT

e

e

e

e

e

e

e

e

e

e

e − − − − − −  −  −  −  −  − − −

INT

i

i

i

i

e  e  e  e

e

e

e

e

e − − − − − −  −  −  −  −  − − −

SINT

i

i

i

i

e  e  e

e

e

e

e

e − − − − − −  −  −  −  −  − − −

符号なし

ULINT

e

e

e

e

e

e

e

e

e

e

e

e

e − − − − − −  −  −  −  −  − − −

UDINT

i

e

i

e

e

e

e

e

e

e

e

e − − − − − −  −  −  −  −  − − −

UINT

i

i

i

i

e  e

i

i

e

e

e

e

e − − − − − −  −  −  −  −  − − −

USINT

i

i

i

i

e

i

i

i

e

e

e

e − − − − − −  −  −  −  −  − − −

ビット列

LWORD e

− e e

e e e e e

e

e

e

e − − − − − −  −  −  −  −  − − −

DWORD

− e e e

e e e e e

e

i

e

e − − − − − −  −  −  −  −  − − −

WORD

−  − e e

e e e e e

e

i

i

e − − − − − −  −  −  −  −  − e −

BYTE

−  − e e

e e e e e

e

i

i

i

− − − − − −  −  −  −  −  − − e

BOOL

−  −  e

e

e

e

e

e

e

e

i

i

i

i

− − − − −  −  −  −  −  − − −

日付及び時刻

LTIME

−  −  −  −  −  −  −  −  − − − − − − −

e − − −  −  −  −  −  − − −

TIME

−  −  −  −  −  −  −  −  − − − − − − −

i

− − −  −  −  −  −  − − −

LDT

−  −  −  −  −  −  −  −  − − − − − − − − −

e

e e e e −  − − −

DT

−  −  −  −  −  −  −  −  − − − − − − − − −

i

e e e e −  − − −

LDATE

−  −  −  −  −  −  −  −  − − − − − − − − − − −

e  −  −  −  − − −

DATE

−  −  −  −  −  −  −  −  − − − − − − − − − −

i  −  −  −  − −

LTOD

−  −  −  −  −  −  −  −  − − − − − − − − − − − −  −   e −  − − −

TOD

−  −  −  −  −  −  −  −  − − − − − − − − − − − −  − i    −  − − −

文字

WSTRING  −  −  −  −  −  −  −  −  − − − − − − − − − − − −    −  −

e − −

STRING

a)

  −  −  −  −  −  −  −  −  − − − − − − − − − − − −    −  − e

− e

WCHAR

−  −  −  −  −  −  −  −  − − e

e

e − − − − − − −    −  − i −

e

CHAR

a)

−  −  −  −  −  −  −  −  − e

e

e

e

e − − − − − −    −  −  −  i

e

記号

データ型変換不要

−  この規格で規定する暗黙的又は明示的データ型変換なし。実装者が独自仕様のデータ型変換をサポートして

もよい。

i

暗黙的データ型変換。ただし,明示的データ変換も追加的に認める。

e

使用者が適用する明示的データ型変換(標準変換ファンクション)は,精度低下又は値域の不一致を受け入
れるため,又は考えられる実装者依存挙動を達成するために使用してもよい。

a)

  WSTRING への STRING の変換及び WCHAR への CHAR の変換は,使用されている文字セットとの矛盾を避け

るために暗黙的ではない。

図 11−データ型変換規則−暗黙的及び/又は明示的(要約)

図 12 は,暗黙的型変換がサポートするデータ型変換を示すものである。矢印は,考えられる変換パスを

示す。例えば,BOOL は BYTE に変換でき,BYTE は WORD に変換できる。


60

B 3503

:2016 (IEC 61131-3:2013)

図 12−サポートされた暗黙的データ変換

次の例は,データ型変換の例を示すものである。

例  明示的型変換及び暗黙的型変換

a)

型宣言

VAR

  PartsRatePerHr:  REAL;

  PartsDone:

INT;

  HoursElapsed:

REAL;

  PartsPerShift:

INT;

  ShiftLength:

SINT;

END_VAR

b)  ST

言語での使用

1)

明示的型変換

PartsRatePerHr  :=INT_TO_REAL(PartsDone) / HoursElapsed;

PartsPerShift

 :=REAL_TO_INT(SINT_TO_REAL(ShiftLength)*PartsRatePerHr);

2)

明示的多重定義型変換

PartsRatePerHr  :=TO_REAL(PartsDone) / HoursElapsed;

PartsPerShift :=TO_INT(TO_REAL(ShiftLength)*PartsRatePerHr);

3)

暗黙的型変換

PartsRatePerHr  :=PartsDone / HoursElapsed;

PartsPerShift  :=TO_INT(ShiftLength * PartsRatePerHr);

c)

FBD

言語での使用

1)

明示的型変換

USINT

SINT

INT

DINT

LINT

UINT

UDINT

ULINT

REAL

LREAL

TIME

LTIME

DT

LDT

TOD

LTOD

CHAR

STRING

WCHAR

WSTRING

BOOL

BYTE

WORD

DWORD

LWORD

DATE

LDATE


61

B 3503

:2016 (IEC 61131-3:2013)

 +

-----------

+ +

--------

+ +--+  +

-----------

+

PartsDone -

|

INT_TO_REAL

|

--

|

DIV_REAL

|

--

| * | --

|

REAL_TO_INT

|

--PartsPerShift

 +

-----------

+ |

| | | |

|

|

| | | +

-----------

+

HoursElapsed

----------------

| |

|

|

 +

--------

+ | |

 |

|

 +

----------

+  |

|

ShiftLength -

|

SINT_TO_REAL

|--------------| |

 +

----------

+  +

--

+

2)

明示的多重定義型変換

 +

-----------

+ +

--------

+ +--+  +

-------

+

PartsDone -

|

TO_REAL |

--

|

DIV_REAL

|

--

| * | --

| TO_INT | --PartsPerShift

 +

-----------

+ |

| | | |

|

|

| | | +

-------

+

HoursElapsed

----------------

| |

|

|

 +

--------

+ | |

 |

|

 +

----------

+  |

|

ShiftLength -

|

TO_REAL |--------------|

|

 +

----------

+  +

--

+

3)

暗黙的型変換

 +

--------

+ +---------+ +

-------

+

PartsDone-------

|

DIV_REAL

|

--

| MUL_REAL |

--

| TO_INT | --PartsPerShift

 |

|

|

|

 |

|

+

-------

+

HoursElapsed----

| |

|  |

 +

--------

+ |

|

 |

|

 |

|

ShiftLength

-----------------

| |

 +---------+

6.6.1.7

多重定義

6.6.1.7.1

概要

言語要素が,総称データ型,例えば,ANY_NUM 及び ANY_INT に含まれる様々な型の入力データ要素で

の演算を可能とした場合,それを多重定義されているという。

実装者が提供する次の標準言語要素は,特殊項目として総称多重定義をしてもよい。

標準ファンクション  標準ファンクションには,多重定義された標準ファンクション(例  ADD,MUL),


62

B 3503

:2016 (IEC 61131-3:2013)

及び多重定義された標準変換ファンクション(

例  TO_REAL,TO_INT)がある。

標準メソッド  この規格は,標準クラス又はファンクションブロック型内の標準メソッドを定義しな

いが,それらは実装者が提供してもよい。

標準ファンクションブロック  この規格は,カウンタのような幾つかの単純なものを除き,標準ファ

ンクションブロックを定義しない。

しかしながら,実装者が提供してもよい。

標準クラス  この規格は,標準クラスを定義しないが,実装者が提供してもよい。

演算子  演算子には,例えば,ST 言語では“+”及び  “*”があり,IL 言語では ADD,MUL がある。

6.6.1.7.2

データ型変換

プログラマブルコントローラシステムが,多重定義言語要素をサポートするとき,その言語要素はその

システムがサポートしている総称型のうち適用可能な全てのデータ型に適用しなければならない。

各言語要素に対して適用可能なデータ型は,関連項目表に定義する。次の例で詳細を説明する。

例 1  この規格では,ADD ファンクションに関して,同じ種類の入力及び一つの結果出力に対する総

称データ型 ANY_NUM を定義する。

実装者は,PLC システムのこの総称データ型 ANY_NUM に関して,関連する基本データ型

REAL 及び INT を明記する。

例 2  この規格では,ビットシフトファンクション LEFT について,一つの入力及び結果出力に関す

る総称データ型 ANY_BIT 及び他の入力に関する ANY_INT を定義する。

実装者は,PLC システムのこれら二つの総称データ型の具体的なデータ型を明記する

ANY_BIT

に対しては,例えば,基本データ型 BYTE 及び WORD。

ANY_INT

に対しては,例えば,基本データ型 INT 及び LINT。

多重定義言語要素は,次に従って定義済み基本データ型で演算しなければならない。

・  入力,及び出力又は結果が同じ種類である場合には,それらのデータ型は同一でなければならない。

入力,及び出力又は結果が同じ種類とは,加算又は乗算の入力のように,同じように使用するパラメ

ータ,オペランド及び結果であることを意味する。

より複雑な組合せは,実装者固有のものである。

・  同じ種類の入力及び出力のデータ型が同じでない場合は,言語要素における変換は実装者固有のもの

である。

・  式及び代入の暗黙的型変換は,式の評価順序に従う。次の例を参照。

・  多重定義ファンクションの結果を保存するための変数のデータ型は,ファンクション又は演算の結果

のデータ型に影響を及ぼさない。

注記  使用者は,型付ファンクションを用いて演算の結果型を明示的に指定できる。

例 3

int3 :=int1

+int2  (*整数演算として加算を行う*)

dint1 :=int1

+int2; (*整数演算として加算を行い,その後結果を DINT に変換し,

dint1 に代入する*)

dint1 :=dint2

+int3; (*int3 を DINT に変換し,DINT 加算として加算を行う*)


63

B 3503

:2016 (IEC 61131-3:2013)

6.6.2

ファンクション

6.6.2.1

概要

ファンクションは,その状態(入力,インターナル及び出力/結果)を保存しないプログラム構成ユニ

ット(POU)である。

POU の共通項目は,別段に記載されていない場合にファンクションに適用する。

ファンクションの実行

・  一般的に,1 データ要素,多値配列又は構造である一時的な結果をもたらす。

・  場合によって,多値である出力変数をもたらす。

・  入出力及び VAR_EXTERNAL 変数の値を変更してもよい。

結果があるファンクションは,式の中で呼出し,又は文として呼出しする。

結果がないファンクションは,式の内部で用いることはできない。

6.6.2.2

ファンクション宣言

ファンクションの宣言は,

表 19 に規定する次の要素で構成しなければならない。これらの項目は,ファ

ンクションブロックの宣言と同じ方法で宣言する。

ファンクションの宣言に関する次の規則を

表 19 に定義するように適用しなければならない。

a)

宣言は,予約語 FUNCTION で始まり,続いてファンクション名を示す識別子を続ける。

b)

ファンクション結果を得られる場合,コロン(:)

,及びファンクションから戻される値のデータ型は,

規定しなければならず,又はファンクション結果を得られない場合,コロン及びデータ型は省略しな

ければならない。

c)

必要な場合,VAR_INPUT,VAR_OUTPUT 及び VAR_IN_OUT 構文,ファンクションパラメータの名前

及びデータ型を明記する。

d)  VAR_EXTERNAL

構文を通じてファンクションに渡す変数の値は,ファンクションの中で変更できる。

e)

VAR_EXTERNAL CONSTANT

構文を通じてファンクションに渡す定数の値は,ファンクションの中で

変更できない。

f)

VAR_IN_OUT

構文を通じてファンクションに渡す変数の値は,ファンクションの中で変更できる。

g)

可変長配列は,VAR_INPUT,VAR_OUTPUT 及び VAR_IN_OUT として使用してもよい。

h)

入力,出力及び一時的変数は初期化してもよい。

i)

EN

入力及び ENO 出力は,

表 18 に記載したとおりに使用してもよい。

j)

VAR...END_VAR

構文及び VAR_TEMP...END_VAR 構文で,必要であれば内部一時的変数の名前及び

型を指定する。ファンクションブロックとは異なり,VAR...END_VAR 構文で宣言した変数の値は保

存されない。

k)

総称データ型(

例  ANY_INT)が標準ファンクションの変数の宣言中で用いられている場合,そのよ

うなファンクションのパラメータの実際の型をファンクションに定義しなければならない。

l)

変数初期化構文は,ファンクション入力の初期値の宣言として,また,ファンクションの内部変数及

び出力変数の初期値の宣言として使用できる。

m)

予約語 END_FUNCTION は,宣言を終了させる。


64

B 3503

:2016 (IEC 61131-3:2013)

表 19−ファンクション宣言

No.

説明

1a

結果なし

FUNCTION <name> ... END_FUNCTION

FUNCTION myFC ... END_FUNCTION

1b

結果あり

FUNCTION <name> : <data type>

END _FUNCTION

FUNCTION myFC: INT ... END_FUNCTION

2a

入力

VAR_INPUT...END_VAR

VAR_INPUT IN: BOOL; T1: TIME; END_VAR

2b

出力

VAR_OUTPUT...END_VAR

VAR_OUTPUT OUT: BOOL; ET_OFF: TIME; END_VAR

2c

入出力

VAR_IN_OUT...END_VAR

VAR_IN_OUT A: INT; END_VAR

2d

一時的変数

VAR_TEMP...END_VAR

VAR_TEMP I: INT; END_VAR

2e

一時的変数

VAR...END_VAR

VAR B: REAL; END_VAR  
 
互換性の理由から,ファンクションブロックの VAR と差異がある。

ファンクションブロックでは VAR は静的である(保存)

2f

外部変数

VAR_EXTERNAL...END_VAR

VAR_EXTERNAL B: REAL; END_VAR

次に対応する。

VAR_GLOBAL B: REAL...

2g

外部定数

VAR_EXTERNAL CONSTANT...END_VAR

VAR_EXTERNAL CONSTANT B: REAL; END_VAR

次に対応する。

VAR_GLOBAL B: REAL

3a

入力の初期化

VAR_INPUT  MN:  INT  :=0;

3b

出力の初期化

VAR_OUTPUT RES: INT :=1;

3c

一時的変数の初期化

VAR I: INT :=1;

EN

  入力及び ENO 出力

表 18 に規定する。


65

B 3503

:2016 (IEC 61131-3:2013)

//  パラメータインタフェースの記述

 FUNCTION  SIMPLE_FUN:  REAL

 VAR_INPUT

      A,  B:  REAL;

      C:   REAL  :=  1.0;

 END_VAR

  VAR_IN_OUT  COUNT:  INT;

 END_VAR

//  パラメータインタフェースの記述

 FUNCTION

 +

------------

+

| SIMPLE_FUN |

 REAL-- |

A |

--REAL

 REAL-- |

B |

 REAL-- |

C |

 INT--

|

COUNT--COUNT|

--INT

 +

------------

+

//ファンクションボディの記述

 VAR COUNTP1: INT; END_VAR

 COUNTP1  :=ADD(COUNT,  1);

 COUNT   :=COUNTP1

 SIMPLE_FUN :=A*B/C; //

結果

 END_FUNCTION

//  ファンクションボディの記述

 +

--- +

 |

ADD |

-- +

--

+

 COUNT--

| |

--COUNTP1--

|

:=

|

--COUNT

 1--

| |

+

--

+

 +

--- + +

--

+

 A--

| * |

+ --

+

 B--

| |

--

| / | -SIMPLE_FUN

 +

--

+ | |

 C---------

| |

 +

--

+

END_FUNCTION

a)

  ファンクション宣言及びボディ(ST 及び FBD)−備考


66

B 3503

:2016 (IEC 61131-3:2013)

VAR_GLOBAL DataArray: ARRAY [0..100] OF INT;

END_VAR

FUNCTION SPECIAL_FUN

VAR_INPUT

  FirstIndex:  INT;

  LastIndex:  INT;

END_VAR

VAR_OUTPUT

  Sum:  INT;

END_VAR

VAR_EXTERNAL DataArray:

    ARRAY  [0..100]  OF  INT;

END_VAR

VAR I: INT; Sum: INT:=0; END_VAR

  FOR  i  :=FirstIndex  TO  LastIndex

    DO Sum :=Sum + DataArray[i];

  END_FOR

END_FUNCTION

//

外部インタフェース

//

ファンクション結果はないが,Sum を出

+-------------- +

 |

SPECIAL_FUN

|

INT--- | FirstIndex Sum

|

----INT

INT--- | LastIndex |

 +--------------

+

//

ファンクションボディ−グラフィック表

現で示さず

b)

  ファンクション宣言及びボディ(ファンクション結果なし−出力変数あり)

注記  a)では,デフォルト値 1.0 を規定している。そのファンクションへのグラフィカルな入力が未

接続など,入力が未指定のままファンクションが呼び出されたときに“0 除算”を防ぐためで

ある。

6.6.2.3

ファンクション呼出し

ファンクションの呼出しは,テキスト表現又はグラフィック表現で表す。

入力変数,出力変数及びファンクション結果は保存されないので,入力への代入,出力へのアクセス及

び結果へのアクセスはファンクションの呼出しの直前,直後でなければならない。

パラメータを可変長配列として用いる場合,パラメータは静的変数に接続しなければならない。

ファンクションは,内部状態情報を含んではならない,すなわち,

・  ファンクションは,呼出しごとの入力,内部(一時的)及び出力要素のいずれも保存しない。

・  同じパラメータ(VAR_INPUT 及び VAR_IN_OUT)及び VAR_EXTERNAL に同じ値を与えるファンク

ションの呼出しは,常にその出力変数,入出力変数,外部変数及び(ある場合には)そのファンクシ

ョン結果に同じ値を返す。

注記 1  一般的に実装によってシステムファンクションとして提供されるファンクションの中には,

それぞれ異なる値,例えば,TIME(),RANDOM()をもたらすものがある。


67

B 3503

:2016 (IEC 61131-3:2013)

表 20−ファンクション呼出し

No.

説明

1a

完全な正式呼出し(テキスト表現だけ) 
 
注記 1  EN/ENO が呼出しで必要な場合にこれを用いる。

A :=LIMIT(EN :=COND,

 IN

:=B,

 MN

:=0,

 MX

:=5,

 ENO=>

TEMPL);

1b

不完全な正式呼出し(テキスト表現だけ) 
 
注記 2  EN/ENO が呼出しで必要でない場合にこれを用い

る。

A :=LIMIT(IN :=B,

 MX

:=5);

注記 3  MN 変数の値はデフォルト値の 0(ゼロ)

になる。

2

略式呼出し(テキスト表現だけ)

(引数は定義された順序どおりに全て記述する。

 
注記 4  名前なしのパラメータをもつ標準ファンクショ

ンの呼出しにこれを用いる。

A :=LIMIT(B, 0, 5);

 
注記 5  この呼出しは 1a に相当するが,EN/ENO

はない。

3

ファンクション結果がないファンクション

FUNCTION myFun

//

型宣言なし

VAR_INPUT  x:  INT;

END_VAR;

VAR_OUTPUT y: REAL;  END_VAR;

myFun(150, var);

//

呼出し

4

グラフィック表現

 +

--------

+

 |

FUN

|

 a--

| EN ENO

| --

 b--

| IN1 |

--result

 c--

| IN2 Q1

| --out

 |

Q2

|

 +

-------- +

5

グラフィック表現の否定ブール型入力及び出力の使用

+

--------

+

 |

FUN

|

 a-o

| EN ENO

| --

 b--

| IN1 |

--result

 c--

| IN2 Q1

| o-out

 |

Q2

|

 +

--------

+

注記 6  これらの構文は,入出力変数には使用禁

止である。

6

VAR_IN_OUT

のグラフィック表現方法

 +------------+

 |

myFC1

|

 a--

|In1      Out1| --d

 b--

|Inout--Inout| --c

 +------------+

例  ファンクション呼出し

呼出し

VAR

  X, Y, Z, Res1, Res2: REAL;

  En1,  V:  BOOL;

END_VAR

Res1  :=DIV(In1 :=COS(X), In2 :=SIN(Y), ENO=> EN1);


68

B 3503

:2016 (IEC 61131-3:2013)

Res2 :=MUL(SIN(X),

COS(Y));

Z

:=ADD(EN :=EN1, IN1 :=Res1, IN2 :=Res2, ENO=> V);

 +----+ +

-------

+ +

-------

+

 X--

+

--

| COS |

--

+

- | EN  ENO |----- | EN  ENO | -- V

  |

| |

| |

|

|

|

| +----+ +----| DIV |-----

| ADD |

-- Z

|

| |

| |

 |

+

---

+ | |

+-

| |

Y- +----| SIN |

-------

| |

|

-------

+

 |

| |  |

+

-------

+ |

 |

| +----+

|

 |

|

|

 |

| +----+

+

-------

+ |

 |

+

--

| SIN |

--

+

- | EN  ENO |-

|

| | |

| |

|

|

 |  +----+ +

--- | MUL |

-- +

 |

|

|

|

+----+ | |

 +----|

COS |

-------

| |

 |

| +

-------

+

 +----+

a)

  結果及び EN/ENO による標準ファンクション

宣言

FUNCTION My_function

//

型指定なし,  結果なし

 VAR_INPUT

In1:

REAL;

END_VAR

VAR_OUTPUT Out1, Out2:  REAL; END_VAR

VAR_TEMP Tmp1:

REAL; END_VAR  //VAR_TEMP

使用可

VAR_EXTERNAL Ext:

BOOL; END_VAR

//ファンクションボディ

END_FUNCTION

テキスト表現及びグラフィック表現呼出し

My_Function (In1 :=a, Out1=> b; Out2=> c);

 +--------------+

 |

My_Function

|

//

結果なし

 a

--

|

In1 Out1

|

-- b

 |

Out2

|

-- c

//

出力 2 点

 +--------------+

b)

  ファンクション宣言及び結果はないが出力変数による呼出し


69

B 3503

:2016 (IEC 61131-3:2013)

テキスト表現及びグラフィック表現呼出し

myFC1 (In1 :=a, Inout :=b, Out1=> Tmp1);   //

一時的変数の用い方

d:=myFC2 (In1 :=Tmp1, Inout:=b);

//b

を Inout に設定; c に代入

c:=b; //b

を c に代入

 +--------------+

+--------------+

| myFC1 |

| myFC2 |

 a

--

|

In1 Out1

|

--

| In1 |

-- d

//

結果 Result

 b

--

| Inout--Inout |

--

| Inout--Inout |

-- c

//c

に代入

 +--------------+

|

|

 +--------------+

c)

  入出力変数のグラフィック表現を伴うファンクション呼出し

テキスト表現呼出し及びグラフィック表現呼出し

My_Function (In1 :=a, Out1+Out2=> d);

//ST

では可能ではない

My_Function (In1 :=a, Out1=> Tmp1, Out2=> Tmp2);

d :=Tmp1

+Tmp2;

 +--------------+

+--------------+

|

My_Function

|

| + |

-- d

 a

--

|

In1 Out1

|

--

|

In1 |

 |

Out2

|

--

|

In2 |

 +--------------+

+--------------+

d)

  結果はないが出力変数式を伴うファンクション呼出し

注記 2  これらの例は,二つの同じ機能性のそれぞれ異なる表現を示す。二つの表現形式間の自動変

換をサポートする必要はない。

6.6.2.4

データ型指定ファンクション及び多重定義ファンクション

多重定義演算子を通常表しているファンクションは,データ型を指定する。これを行うには,

表 21 に示

すように,必要な型を“_”

(アンダースコア)に続けて付加しなければならない。データ型指定ファンク

ションは,型をその入力及び出力のデータ型として用いることによって行う。明示的又は暗黙的型変換を

適用してもよい。

基本データ型 xxx を出力型とする TO_xxx 又は TRUNC_xxx 形式の多重定義変換ファンクションは,ア

ンダースコアの前に必要な基本データ型を指定する。


70

B 3503

:2016 (IEC 61131-3:2013)

表 21−データ型指定ファンクション及び多重定義ファンクション

No.

説明

1a

多重定義ファンクション

  ADD(ANY_Num to ANY_Num)

 +

-----------

+

 |

ADD

|

 ANY_NUM

--

| |

-- ANY_NUM

 ANY_NUM

--

| |

 .

--

| |

 .

--

| |

 ANY_NUM

--

| |

 +

-----------

+

1b

入力の変換 
  ANY_ELEMENT TO_INT 

 +

-----------

+

 ANY_ELEMENTARY

-- | TO_INT

| ---INT

 +

-----------

+

2a

a)

  データ型指定ファンクション:

  ADD_INT

 +

-----------

+

| ADD_INT |

 INT

--

| |

-- INT

 INT

--

| |

 .

--

| |

 .

--

| |

 INT

--

| |

 +

-----------

+

2b

a)

  データ型変換

  WORD_TO_INT

 +

-----------

+

 WORD

|WORD_TO_INT

| ---INT

 +

-----------

+

注記  標準以外のファンクション又はファンクションブロック型の多重定義は,この規格の適用範囲外である。 

a)

  項目 No.2 をサポートする場合,実装者は,その実装においてどのファンクションが多重定義で,どのファンク

ションがデータ型指定であるのかの表を提供しなければならない。

例 1  データ型指定ファンクション及び多重定義ファンクション

VAR

  A:  INT  ;

  B:  INT  ;

  C:  INT  ;

END_VAR

 +

----

+

A --

| + |

-- C

B --

| |

 +

----

+

C :=A

+B;

注記 1  上記例では,データ型変換は必要なし。


71

B 3503

:2016 (IEC 61131-3:2013)

VAR

  A:  INT  ;

  B:  REAL  ;

  C:  REAL;

END_VAR

 +-----------

+ +

--

+

A --

|INT_TO_REAL |

--

| + | -- C

 +-----------

+ | |

B -----------------

| |

 +

--

+

C :=INT_TO_REAL(A)+B;

 +

-------

+ +

---+

A --

|TO_REAL

|

--

| ADD|

-- C

 +

-------

+ |  |

B

--------------| |

 +

---

+

C :=TO_REAL(A) + B;

VAR

  A:  INT  ;

  B:  INT  ;

  C:  REAL;

 END_VAR

 +

--

+ +-----------

+

A --

| + | --

|INT_TO_REAL |

-- C

B --

| | +

-----------+

 +

--

+

C :=INT_TO_REAL(A

+B);

 +---

+ +

------- +

A --

|ADD

|

--

|TO_REAL

|

-- C

B --

| |

+

------- +

 +---

+

C :=TO_REAL(A

+B);

a)

  データ型宣言(ST

b)

  用法(FBD 及び ST

例 2  データ型指定ファンクションによる暗黙的及び明示的入力データ型変換

VAR

  A:  INT  ;

  B:  INT  ;

  C:  INT  ;

END_VAR

 +

------- +

A --

|

ADD_INT

|

-- C

B --

| |

 +

------- +

C :=ADD_INT(A, B);

注記 2  上記例では,データ型変換は必要なし。

VAR

  A:  INT;

  B:  REAL;

  C:  REAL;

END_VAR

明示的なデータ型変換

 +-----------

+ +--------

+

A --

|INT_TO_REAL |

--

|ADD_REAL

|

-- C

 +-----------

+ |

|

B------------------ | |

 +--------

+

C :=ADD_REAL(INT_TO_REAL(A), B);

VAR

  A:  INT;

  B:  REAL;

  C:  REAL;

END_VAR

暗黙的なデータ型変換

 +---------+

A

--------------| ADD_REAL |

-- C

 |

|

B

--------------| |

 +---------+

C :=ADD_REAL(A,B);


72

B 3503

:2016 (IEC 61131-3:2013)

VAR

  A:  INT;

  B:  INT;

  C:  REAL;

END_VAR

明示的なデータ型変換

 +

-------

+ +-----------

+

A --

|ADD_INT

|

--

|INT_TO_REAL |

-- C

 |

|

+-----------

+

B --

| |

 +

-------|

C :=INT_TO_REAL(ADD_INT(A, B));

VAR

  A:  INT;

  B:  INT;

  C:  REAL;

END_VAR

暗黙的なデータ型変換

 +

------- +

A --

|

ADD_INT

|

-- C

 |

|

B --

| |

 +

-------|

C :=ADD_INT(A, B);

a)

  データ型宣言(ST

b)

  用法(FBD 及び ST

6.6.2.5

標準ファンクション

6.6.2.5.1

概要

この箇条で拡張可能と記している標準ファンクションでは,二つ以上の個数の入力に対して,指示され

た演算を適用することができる。例えば,拡張可能な加算では,全ての入力の和を出力しなければならな

い。拡張可能なファンクションに対する最大入力数は,実装に依存する。拡張可能なファンクションの正

式呼出し中で有効な実際の入力数は,変数名の順番で最大番号が付いている正式入力パラメータ名で決定

する。

例 1  文    X :=ADD(Y1, Y2, Y3);

は次の文に等しい。X :=ADD(IN1 :=Y1, IN2 :=Y2, IN3 :=Y3);

例 2  文  I :=MUX_INT(K:=3, IN0 :=1, IN2 :=2, IN4 :=3);

は次の文に等しい。I :=0;

6.6.2.5.2

データ型変換ファンクション

表 22 に示すように,データ型変換ファンクションは,*_TO_**の型でなければならない。例えば,

INT_TO_REAL

のように,

“*”は入力変数 IN の型,

“**”は出力変数 OUT の型である。データ型変換の

精度への影響,及びデータ型変換演算実行中に起き得るエラーの種類は,実装に依存する。


73

B 3503

:2016 (IEC 61131-3:2013)

表 22−データ型変換ファンクション

No.

説明

グラフィック表現

1a

データ型変換 
input_TO_output

+

----------

+

 B

--

| *_TO_** |

-- A

 +

----------

+

    (*)  -入力データ型,例えば,INT など 
 (**)  -出力データ型,例えば,REAL など

A :=INT_TO_REAL(B);

1b

a), b), e)

  多重定義変換

TO_output

+

----------

+

 B

--

| TO_** |

-- A

 +

----------

+

-入力データ型,例えば,INT など

 (**)  -出力データ型,例えば,REAL など

A :=TO_REAL(B);

2a

c)

“旧”多重定義小数切捨て 
TRUNC

 +

----------

+

ANY_REAL

--

| TRUNC |

-- ANY_INT

 +

----------

+

非推奨

2b

c)

データ型指定小数切捨て 
input_TRUNC_output

 +

----------

+

ANY_REAL

-- |

*_TRUNC_**

| -- ANY_INT

 +

----------

+

A :=REAL_TRUNC_INT(B);

2c

c)

多重定義小数切捨て 
TRUNC_output

 +

----------

+

ANY_REAL

--

| TRUNC_** | -- ANY_INT

 +

----------

+

A :=TRUNC_INT(B);

3a

d)

データ型指定 
input_BCD_TO_output

 +

----------

+

 *

--|*_BCD_TO_**| -- **

 +

----------

+

A :=WORD_BCD_TO_INT(B)

;

3b

d)

多重定義 
BCD_TO_output

 +

----------

+

 *

-- | BCD_TO_** | -- **

 +

----------

+

A :=BCD_TO_INT(B);

4a

d)

データ型指定 
input_TO_BCD_output

 +

----------

+

 *

--|*_TO_BCD_**| -- **

 +

----------

+

A :=INT_TO_BCD_WORD(B)

;

4b

d)

多重定義 
TO_BCD_output

 +

----------

+

 *

-- | TO_BCD_** | -- **

 +

----------

+

A :=TO_BCD_WORD(B);

注記  用例は,ST 言語によっている。 

a)

  この表の項目 No.1 に対する順守表には,サポートする特定のデータ型変換のリストを含まなければならない。

また,それぞれの変換の実行の作用についても記述する必要がある。

b)

  REAL 型又は LREAL 型から SINT,INT,DINT 又は LINT 型への変換では,ISO/IEC/IEEE 60559 の変換方法に

従って丸めなければならない。それによると,二つの整数に等しく近い場合,その変換結果は最も近い偶数整
数にならなければならない。次に,例を示す。

REAL_TO_INT(1.6)

は 2 に等価である。

REAL_TO_INT(

−1.6)は−2 に等価である。

REAL_TO_INT(1.5)

は 2 に等価である。

REAL_TO_INT(

−1.5)は−2 に等価である。

REAL_TO_INT(1.4)

は 1 に等価である。

REAL_TO_INT(

−1.4)は−1 に等価である。

REAL_TO_INT(2.5)

は 2 に等価である。

REAL_TO_INT(

−2.5)は−2 に等価である。


74

B 3503

:2016 (IEC 61131-3:2013)

表 22−データ型変換ファンクション(続き)

c)

  TRUNC_*ファンクションは,REAL 型,LREAL 型の切捨てのために使用され,整数をもたらさなければならな

い。例えば,

TRUNC_INT(1.6)

は INT#1 に等価である。

TRUNC_INT(

−1.6)は INT#−1 に等価である。

TRUNC_SINT(1.4)

は SINT#1 に等価である。

TRUNC_SINT(

−1.4)は SINT#−1 に等価である。

d)

  変換ファンクション*_BCD_TO_**及び*_TO_BCD_**は,BYTE,WORD,DWORD 及び LWORD 型の変数と,USINT,

UINT

,UDINT 及び ULINT 型の変数との間の変換を実行しなければならない(*及び**は,それぞれの型を示

す。

。このとき,対応するビット列変数のデータは,BCD フォーマットでエンコードしているとみなす。例え

ば,USINT_TO_BCD_BYTE(25)の値は,2#0010_0101 になる。また,

WORD_BCD_TO_UINT(2#0011_0110_1001)

は,369 になる。

e)

  データ型変換ファンクションの入力又は出力の型が,STRING,WSTRING 型である場合,文字列データの外部

表現は,6.3.3 に規定したとおり,6.1.1 に規定する文字セットに合致しなければならない。 

6.6.2.5.3

数値データ型のデータ型変換

数値データ型の変換には,次の規則を用いる。

a)

変換元データ型は,その値を保持しながら同じデータ型カテゴリの最大データ型に拡張する。

b)

次に,変換先データ型が属するデータ型カテゴリの最大データ型に結果を変換する。

c)

その後,結果を変換先データ型に変換する。

変換元変数の値が,例えば,値範囲が小さすぎるなどのように,変換先データ型に合致しない場合,

変換先変数の値は実装固有の値である。

注記  変換ファンクションの実行は,より効率的な手順を用いてもよい。

X :=REAL_TO_INT (70_000.4)

1. REAL 値(70_000.4)を LREAL 値(70_000.400_000..)に変換 
2. LREAL 値(70_000.4000_000..)を LINT 値(70_000)に変換。ここで整数に丸める。 
3. LINT 値(70_000)を INT 値に変換。ここでは,INT が最大 32_767 まで保持できるので,実装

固有の値になる。

変換先データ型がこの値を保持できれば,これは変換元変数と同じ値を維持する変換先データ型の変数

になる。浮動小数点に変換する場合,通常の丸め規則を適用する。すなわち,最も近い整数に丸める,こ

れが不明確であれば,最も近い偶数整数に丸める。

変換元データ型として用いられるデータ型 BOOL は,0 及び 1 の値だけを保持できる符号なし整数デー

タ型のように扱う。

変換ファンクションの詳細は,

表 23 による。

表 23−数値データ型のデータ型変換

No.

変換ファンクション

変換詳細

1

LREAL _TO_ REAL

丸めによる変換,値範囲エラーは実装固有の結果になる。

2

LREAL _TO_ LINT

丸めによる変換,値範囲エラーは実装固有の結果になる。

3

LREAL _TO_ DINT

丸めによる変換,値範囲エラーは実装固有の結果になる。

4

LREAL _TO_ INT

丸めによる変換,値範囲エラーは実装固有の結果になる。

5

LREAL _TO_ SINT

丸めによる変換,値範囲エラーは実装固有の結果になる。

6

LREAL _TO_ ULINT

丸めによる変換,値範囲エラーは実装固有の結果になる。

7

LREAL _TO_ UDINT

丸めによる変換,値範囲エラーは実装固有の結果になる。


75

B 3503

:2016 (IEC 61131-3:2013)

表 23−数値データ型のデータ型変換(続き)

No.

変換ファンクション

変換詳細

8

LREAL _TO_ UINT

丸めによる変換,値範囲エラーは実装固有の結果になる。

9

LREAL _TO_ USINT

丸めによる変換,値範囲エラーは実装固有の結果になる。

10

REAL _TO_

LREAL

値維持変換

11

REAL _TO_

LINT

丸めによる変換,値範囲エラーは実装固有の結果になる。

12

REAL _TO_

DINT

丸めによる変換,値範囲エラーは実装固有の結果になる。

13

REAL _TO_

INT

丸めによる変換,値範囲エラーは実装固有の結果になる。

14

REAL _TO_

SINT

丸めによる変換,値範囲エラーは実装固有の結果になる。

15

REAL _TO_

ULINT

丸めによる変換,値範囲エラーは実装固有の結果になる。

16

REAL _TO_

UDINT

丸めによる変換,値範囲エラーは実装固有の結果になる。

17

REAL _TO_

UINT

丸めによる変換,値範囲エラーは実装固有の結果になる。

18

REAL _TO_

USINT

丸めによる変換,値範囲エラーは実装固有の結果になる。

19

LINT _TO_

LREAL

精度低下含みの変換

20

LINT _TO_

REAL

精度低下含みの変換

21

LINT _TO_

DINT

値範囲エラーは実装固有の結果になる。

22

LINT _TO_

INT

値範囲エラーは実装固有の結果になる。

23

LINT _TO_

SINT

値範囲エラーは実装固有の結果になる。

24

LINT _TO_

ULINT

値範囲エラーは実装固有の結果になる。

25

LINT _TO_

UDINT

値範囲エラーは実装固有の結果になる。

26

LINT _TO_

UINT

値範囲エラーは実装固有の結果になる。

27

LINT _TO_

USINT

値範囲エラーは実装固有の結果になる。

28

DINT _TO_

LREAL

値維持変換

29

DINT _TO_

REAL

精度低下含みの変換

30

DINT _TO_

LINT

値維持変換

31

DINT _TO_

INT

値範囲エラーは実装固有の結果になる。

32

DINT _TO_

SINT

値範囲エラーは実装固有の結果になる。

33

DINT _TO_

ULINT

値範囲エラーは実装固有の結果になる。

34

DINT _TO_

UDINT

値範囲エラーは実装固有の結果になる。

35

DINT _TO_

UINT

値範囲エラーは実装固有の結果になる。

36

DINT _TO_

USINT

値範囲エラーは実装固有の結果になる。

37

INT _TO_

LREAL

値維持変換

38

INT _TO_

REAL

値維持変換

39

INT _TO_

LIN

T

値維持変換

40

INT _TO_

DINT

値維持変換

41

INT _TO_

SINT

値範囲エラーは実装固有の結果になる。

42

INT _TO_

ULINT

値範囲エラーは実装固有の結果になる。

43

INT _TO_

UDINT

値範囲エラーは実装固有の結果になる。

44

INT _TO_

UINT

値範囲エラーは実装固有の結果になる。

45

INT _TO_

USINT

値範囲エラーは実装固有の結果になる。

46

SINT _TO_

LREAL

値維持変換

47

SINT _TO_

REAL

値維持変換

48

SINT _TO_

LINT

値維持変換

49

SINT _TO_

DINT

値維持変換

50

SINT _TO_

INT

値維持変換

51

SINT _TO_

ULINT

値範囲エラーは実装固有の結果になる。

52

SINT _TO_

UDINT

値範囲エラーは実装固有の結果になる。

53

SINT _TO_

UINT

値範囲エラーは実装固有の結果になる。


76

B 3503

:2016 (IEC 61131-3:2013)

表 23−数値データ型のデータ型変換(続き)

No.

変換ファンクション

変換詳細

54

SINT _TO_

USINT

値範囲エラーは実装固有の結果になる。

55

ULINT _TO_ LREAL

精度低下含みの変換

56

ULINT _TO_ REAL

精度低下含みの変換

57

ULINT _TO_ LINT

値範囲エラーは実装固有の結果になる。

58

ULINT _TO_ DINT

値範囲エラーは実装固有の結果になる。

59

ULINT _TO_ INT

値範囲エラーは実装固有の結果になる。

60

ULINT _TO_ SINT

値範囲エラーは実装固有の結果になる。

61

ULINT _TO_ UDINT

値範囲エラーは実装固有の結果になる。

62

ULINT _TO_ UINT

値範囲エラーは実装固有の結果になる。

63

ULINT _TO_ USINT

値範囲エラーは実装固有の結果になる。

64

UDINT _TO_ LREAL

値維持変換

65

UDINT _TO_ REAL

精度低下含みの変換

66

UDINT _TO_ LINT

値維持変換

67

UDINT _TO_ DINT

値範囲エラーは実装固有の結果になる。

68

UDINT _TO_ INT

値範囲エラーは実装固有の結果になる。

69

UDINT _TO_ SINT

値範囲エラーは実装固有の結果になる。

70

UDINT _TO_ ULINT

値維持変換

71

UDINT _TO_ UINT

値範囲エラーは実装固有の結果になる。

72

UDINT _TO_ USINT

値範囲エラーは実装固有の結果になる。

73

UINT _TO_

LREAL

値維持変換

74

UINT _TO_

REAL

値維持変換

75

UINT _TO_

LINT

値維持変換

76

UINT _TO_

DINT

値維持変換

77

UINT _TO_

INT

値範囲エラーは実装固有の結果になる。

78

UINT _TO_

SINT

値範囲エラーは実装固有の結果になる。

79

UINT _TO_

ULINT

値維持変換

80

UINT _TO_

UDINT

値維持変換

81

UINT _TO_

USINT

値範囲エラーは実装固有の結果になる。

82

USINT _TO_ LREAL

値維持変換

83

USINT _TO_ REAL

値維持変換

84

USINT _TO_ LINT

値維持変換

85

USINT _TO_ DINT

値維持変換

86

USINT _TO_ INT

値維持変換

87

USINT _TO_ SINT

値範囲エラーは実装固有の結果になる。

88

USINT _TO_ ULINT

値維持変換

89

USINT _TO_ UDINT

値維持変換

90

USINT _TO_ UINT

値維持変換

6.6.2.5.4

ビットデータ型のデータ型変換

このデータ型変換は,次の規則を用いる。

a)

データ型変換は,バイナリ転写として行う。

b)

変換元データ型が変換先データ型より小さい場合,変換元の値は変換先の変数の右端のバイトに格納

し,左端のバイトをゼロにセットする。

c)

変換元データ型が変換先データ型より大きい場合,変換元の変数の右端のバイトだけを変換先データ

型に格納する。


77

B 3503

:2016 (IEC 61131-3:2013)

左バイト

右バイト

変換元:

x

v

変換先: 0 0 x v

ビットデータ型変換の詳細は,

表 24 による。

表 24−ビットデータ型のデータ型変換

No.

変換ファンクション

変換詳細

1

LWORD _TO_ DWORD

右端の数バイトを変換先へバイナリ転写

2

LWORD _TO_ WORD

右端の数バイトを変換先へバイナリ転写

3

LWORD _TO_ BYTE

右端の数バイトを変換先へバイナリ転写

4

LWORD _TO_ BOOL

右端のビットを変換先へバイナリ転写

5

DWORD _TO_ LWORD

変換先の右端の数バイトへバイナリ転写,変換先の左端の数バイトをゼロに

セットする。

6

DWORD _TO_ WORD

右端の数バイトを変換先へバイナリ転写

7

DWORD _TO_ BYTE

右端の数バイトを変換先へバイナリ転写

8

DWORD _TO_ BOOL

右端のビットを変換先へバイナリ転写

9

WORD _TO_

LWORD

変換先の右端の数バイトへバイナリ転写,変換先の左端の数バイトをゼロに

セットする。

10

WORD _TO_

DWORD

変換先の右端の数バイトへバイナリ転写,変換先の左端の数バイトをゼロに

セットする。

11

WORD _TO_

BYTE

右端の数バイトを変換先へバイナリ転写

12

WORD _TO_

BOOL

右端のビットを変換先へバイナリ転写

13

BYTE _TO_

LWORD

変換先の右端の数バイトへバイナリ転写,変換先の左端の数バイトをゼロに

セットする。

14

BYTE _TO_

DWORD

変換先の右端の数バイトへバイナリ転写,変換先の左端の数バイトをゼロに

セットする。

15

BYTE _TO_

WORD

変換先の右端の数バイトへバイナリ転写,変換先の左端の数バイトをゼロに

セットする。

16

BYTE _TO_

BOOL

右端のビットを変換先へバイナリ転写

17

BYTE _TO_

CHAR

バイナリ転写

18

BOOL _TO_

LWORD

値は 16#0 又は 16#1 になる。

19

BOOL _TO_

DWORD

値は 16#0 又は 16#1 になる。

20

BOOL _TO_

WORD

値は 16#0 又は 16#1 になる。

21

BOOL _TO_

BYTE

値は 16#0 又は 16#1 になる。

22

CHAR _TO_

BYTE

バイナリ転写

23

CHAR _TO_

WORD

変換先の右端の数バイトへバイナリ転写,変換先の左端の数バイトをゼロに

セットする。

24

CHAR _TO_

DWORD

変換先の右端の数バイトへバイナリ転写,変換先の左端の数バイトをゼロに
セットする。

25

CHAR _TO_

LWORD

変換先の右端の数バイトへバイナリ転写,変換先の左端の数バイトをゼロに
セットする。

26

WCHAR _TO_ WORD

バイナリ転写

27

WCHAR _TO_ DWORD

変換先の右端の数バイトへバイナリ転写,変換先の左端の数バイトをゼロに
セットする。

28

WCHAR _TO_ LWORD

変換先の右端の数バイトへバイナリ転写,変換先の左端の数バイトをゼロに

セットする。


78

B 3503

:2016 (IEC 61131-3:2013)

6.6.2.5.5

ビットの数値データ型へのデータ型変換

これらの型変換は,次の規則を用いる。

a)

データ型変換は,バイナリ転写として行う。

b)

変換元データ型が変換先データ型より小さい場合,変換元の値は変換先変数の右端のバイトに格納さ

れ,左端のバイトをゼロにセットする。

例 1  X: SINT :=18; W: WORD; W=SINT_TO_WORD(X);すると W  は 16#0012 になる。

c)

変換元データ型が変換先データ型より大きい場合,変換元変数の右端のバイトだけが変換先データ型

を格納する。

例 2  W: WORD: =16#1234; X: SINT; X :=W;すると X は 54 (=16#34)になる。

変換ファンクションの詳細は,

表 25 による。

表 25−ビット及び数値データ型のデータ型変換

No.

変換ファンクション

変換詳細

1

LWORD _TO_ LREAL

バイナリ転写

2

DWORD _TO_ REAL

バイナリ転写

3

LWORD _TO_ LINT

バイナリ転写

4

LWORD _TO_ DINT

右端の数バイトを変換先へバイナリ転写

5

LWORD _TO_ INT

右端の数バイトを変換先へバイナリ転写

6

LWORD _TO_ SINT

右端の 1 バイトを変換先へバイナリ転写

7

LWORD _TO_ ULINT

バイナリ転写

8

LWORD _TO_ UDINT

右端の数バイトを変換先へバイナリ転写

9

LWORD _TO_ UINT

右端の数バイトを変換先へバイナリ転写

10

LWORD _TO_ USINT

右端の 1 バイトを変換先へバイナリ転写

11

DWORD _TO_ LINT

変換先の数バイトへバイナリ転写

12

DWORD _TO_ DINT

バイナリ転写

13

DWORD _TO_ INT

右端の数バイトを変換先へバイナリ転写

14

DWORD _TO_ SINT

右端の 1 バイトを変換先へバイナリ転写

15

DWORD _TO_ ULINT

変換先の数バイトへバイナリ転写

16

DWORD _TO_ UDINT

バイナリ転写

17

DWORD _TO_ UINT

右端の数バイトを変換先へバイナリ転写

18

DWORD _TO_ USINT

右端の 1 バイトを変換先へバイナリ転写

19

WORD _TO_

LINT

変換先の数バイトへバイナリ転写

20

WORD _TO_

DINT

変換先の数バイトへバイナリ転写

21

WORD _TO_

INT

バイナリ転写

22

WORD _TO_

SINT

右端の 1 バイトを変換先へバイナリ転写

23

WORD _TO_

ULINT

変換先の数バイトへバイナリ転写

24

WORD _TO_

UDINT

変換先の数バイトへバイナリ転写

25

WORD _TO_

UINT

バイナリ転写

26

WORD _TO_

USINT

右端の 1 バイトを変換先へバイナリ転写

27

BYTE _TO_

LINT

変換先の数バイトへバイナリ転写

28

BYTE _TO_

DINT

変換先の数バイトへバイナリ転写

29

BYTE _TO_

INT

変換先の数バイトへバイナリ転写

30

BYTE _TO_

SINT

バイナリ転写

31

BYTE _TO_

ULINT

変換先の数バイトへバイナリ転写

32

BYTE _TO_

UDINT

変換先の数バイトへバイナリ転写

33

BYTE _TO_

UINT

変換先の数バイトへバイナリ転写


79

B 3503

:2016 (IEC 61131-3:2013)

表 25−ビット及び数値データ型のデータ型変換(続き)

No.

変換ファンクション

変換詳細

34

BYTE _TO_

USINT

バイナリ転写

35

BOOL _TO_

LINT

値は 0 又は 1 になる

36

BOOL _TO_

DINT

値は 0 又は 1 になる

37

BOOL _TO_

INT

値は 0 又は 1 になる

38

BOOL _TO_

SINT

値は 0 又は 1 になる

39

BOOL _TO_

ULINT

値は 0 又は 1 になる

40

BOOL _TO_

UDINT

値は 0 又は 1 になる

41

BOOL _TO_

UINT

値は 0 又は 1 になる

42

BOOL _TO_

USINT

値は 0 又は 1 になる

43

LREAL _TO_ LWORD

バイナリ転写

44

REAL _TO_

DWORD

バイナリ転写

45

LINT _TO_

LWORD

バイナリ転写

46

LINT _TO_

DWORD

右端の数バイトを変換先へバイナリ転写

47

LINT _TO_

WORD

右端の数バイトを変換先へバイナリ転写

48

LINT _TO_

BYTE

右端の 1 バイトを変換先へバイナリ転写

49

DINT _TO_

LWORD

変換先の数バイトへバイナリ転写,残りは 0

50

DINT _TO_

DWORD

バイナリ転写

51

DINT _TO_

WORD

右端の数バイトを変換先へバイナリ転写

52

DINT _TO_

BYTE

右端の 1 バイトを変換先へバイナリ転写

53

INT _TO_

LWORD

変換先の数バイトへバイナリ転写,残りは 0

54

INT _TO_

DWORD

変換先の数バイトへバイナリ転写,残りは 0

55

INT _TO_

WORD

バイナリ転写

56

INT _TO_

BYTE

右端の 1 バイトを変換先へバイナリ転写

57

SINT _TO_

LWORD

変換先の数バイトへバイナリ転写,残りは 0

58

SINT _TO_

DWORD

変換先の数バイトへバイナリ転写,残りは 0

59

SINT _TO_

WORD

バイナリ転写

60

SINT _TO_

BYTE

バイナリ転写

61

ULINT _TO_ LWORD

バイナリ転写

62

ULINT _TO_ DWORD

右端の数バイトを変換先へバイナリ転写

63

ULINT _TO_ WORD

右端の数バイトを変換先へバイナリ転写

64

ULINT _TO_ BYTE

右端の 1 バイトを変換先へバイナリ転写

65

UDINT _TO_ LWORD

変換先の数バイトへバイナリ転写,残りは 0

66

UDINT _TO_ DWORD

バイナリ転写

67

UDINT _TO_ WORD

右端の数バイトを変換先へバイナリ転写

68

UDINT _TO_ BYTE

右端の 1 バイトを変換先へバイナリ転写

69

UINT _TO_

LWORD

変換先の数バイトへバイナリ転写,残りは 0

70

UINT _TO_

DWORD

変換先の数バイトへバイナリ転写,残りは 0

71

UINT _TO_

WORD

バイナリ転写

72

UINT _TO_

BYTE

右端の 1 バイトを変換先へバイナリ転写

73

USINT _TO_ LWORD

変換先の数バイトへバイナリ転写,残りは 0

74

USINT _TO_ DWORD

変換先の数バイトへバイナリ転写,残りは 0

75

USINT _TO_ WORD

バイナリ転写

76

USINT _TO_ BYTE

バイナリ転写


80

B 3503

:2016 (IEC 61131-3:2013)

6.6.2.5.6

日付及び時刻のデータ型変換

日付及び時刻のデータ型変換は,

表 26 による。

表 26−日付及び時刻のデータ型変換

No.

変換ファンクション

変換詳細

1

LTIME _TO_ TIME

値範囲エラーは実装固有の結果になり,起こり得る精度低下が起こってもよ

い。

2

TIME _TO_

LTIME

値範囲エラーは実装固有の結果になり,起こり得る精度低下が起こってもよ
い。

3

LDT _TO_

DT

値範囲エラーは実装固有の結果になり,起こり得る精度低下が起こってもよ
い。

4

LDT _TO_

DATE

収納されている日付だけを変換する。値範囲エラーは実装固有の結果になる。

5

LDT _TO_

LTOD

収納されている時刻だけを変換する。

6

LDT _TO_

TOD

収納されている時刻だけを変換する。起こり得る精度低下が起こってもよい。

7

DT _TO_

LDT

値範囲エラーは実装固有の結果になり,起こり得る精度低下が起こってもよ

い。

8

DT _TO_

DATE

収納されている日付だけを変換する。値範囲エラーは実装固有の結果になる。

9

DT _TO_

LTOD

収納されている時刻だけを変換する。値範囲エラーは実装固有の結果になる。

10

DT _TO_

TOD

収納されている時刻だけを変換する。値範囲エラーは実装固有の結果になる。

11

LTOD _TO_

TOD

値保持変換

12

TOD _TO_

LTOD

値範囲エラーは実装固有の結果になり,起こり得る精度低下が起こってもよ

い。

6.6.2.5.7

文字型のデータ型変換

文字型のデータ型変換は,

表 27 による。

表 27−文字型のデータ型変換

No.

変換ファンクション

変換詳細

1

WSTRING _TO_ STRING

データ型 STRING で実装によってサポートされた文字を変換する。他の文字
は実装依存で変換する。

2

WSTRING _TO_ WCHAR

文字列の最初の文字を転送する。すなわち,文字列が空の場合,変換先の変

数は不定である。

3

STRING _TO_

WSTRING

実装によって定義された文字列の文字を,適切な JIS X 0221(UTF-16)文字に

変換する。

4

STRING _TO_

CHAR

文字列の最初の文字を転送する。すなわち,文字列が空の場合,変換先の変

数は不定である。

5

WCHAR _TO_

WSTRING

一文字の実際のサイズ分の文字列を与える。

6

WCHAR _TO_

CHAR

データ型 CHAR で実装によってサポートされた文字を変換する。他の文字は実

装によって指定する方法で変換する。

7

CHAR _TO_

STRING

一文字の実際のサイズ分の文字列を与える。

8

CHAR _TO_

WCHAR

実装によって定義された文字列の文字を,適切な JIS X 0221(UTF-16)文字に

変換する。

6.6.2.5.8

数値演算ファンクション及び算術演算ファンクション

一つの数値変数に対するファンクションの標準のグラフィック表現,ファンクション名,入力,出力変

数の型,及び機能仕様は,

表 28 に規定するとおりでなければならない。これらのファンクションは,そ

こで規定する総称型に対して多重定義されなければならない。また,データ型指定されてもよい。これら

のファンクションでは,入力及び出力の型は同一でなければならない。


81

B 3503

:2016 (IEC 61131-3:2013)

二つ以上の変数に対する算術演算ファンクションの標準のグラフィック表現,ファンクション名,記号

及び仕様は,

表 29 に示しているとおりでなければならない。これらのファンクションは,全ての数値型

に対して多重定義されなければならない。また,データ型指定されてもよい。

数値演算ファンクションの精度は実装者が説明しなければならない。

これらのファンクションのいずれかの演算結果が,ファンクション出力のデータ型で定まる値の範囲を

超えた場合,又は 0 除算が行われようとした場合はエラーである。

表 28−数値演算ファンクション及び算術演算ファンクション

No.

説明(ファンクション名) I/O 型

解説

グラフィック表現 

+

-----

+

 *--

| ** |

-- *

 +

-----

+

(*) -入出力(I/O)のデータ型

(**) -ファンクション名

 ST 言語の用例

A :=SIN(B);

(ST 言語)

一般ファンクション

1

ABS(x) ANY_NUM

絶対値

2

SQRT(x) ANY_REAL

平方根

対数ファンクション

3

LN(x) ANY_REAL

自然対数

4

LOG(x) ANY_REAL

常用対数

5

EXP(x) ANY_REAL

自然指数関数

三角関数ファンクション

6

SIN(x) ANY_REAL

ラジアン値を入力とする正弦

7

COS(x) ANY_REAL

ラジアン値を入力とする余弦

8

TAN(x) ANY_REAL

ラジアン値を入力とする正接

9

ASIN(x) ANY_REAL

逆正弦(主値)

10

ACOS(x) ANY_REAL

逆余弦(主値)

11

ATAN(x) ANY_REAL

逆正接(主値)

12

ATAN2(y

,x)

 +

-----

+

 |

ATAN2

|

ANY_REAL

-- | Y |

-- ANY_REAL

ANY_REAL

-- | X |

 +

-----

+

ANY_REAL

面のプラス x 軸とその上の座標(x,y)によって

与えられる点の間の角度。角度は反時計回り角
(上半面,y>0)はプラスで,時計回り角(下半

面,y<0)ではマイナスである。


82

B 3503

:2016 (IEC 61131-3:2013)

表 29−算術演算ファンクション

No.

a), b)

説明

名前

記号

(演算子)

解説

グラフィック表現 

+

-----

+

ANY_NUM --

| *** |

-- ANY_NUM

ANY_NUM --

| |

 .  --

| |

 .  --

| |

ANY_NUM --

| |

+

-----

+

 (***) -名前又は記号

ST の用例 
ファンクション呼出しとして

 A :=ADD(B, C, D);

又は 
演算子(記号)として

 A :=B + C + D;

拡張可能な算術演算ファンクション

1

c)

加算

ADD

+ OUT

:=IN1

+IN2+...+ INn

2

乗算

MUL

*

OUT :=IN1 * IN2 *... * INn

拡張できない算術演算ファンクション

3

c)

減算

SUB

− OUT

:=IN1

−IN2

4

d)

除算

DIV

/

OUT :=IN1 / IN2

5

e)

剰余

MOD

OUT :=IN1 modulo IN2

6

f)

べき乗

EXPT **

OUT

:=IN1

IN2

7

g)

代入

MOVE :=

OUT

:=IN

注記 1  空でない記号列の項目は,テキスト言語の演算子として使用するのに適している。 
注記 2  記法 IN1,IN2,...,INn は,上から下の順の入力を指している。OUT は,出力を示している。 
注記 3  用例及び解説は,ST 言語による。 

a)

  ファンクションの名前表現をサポートする場合,規格順守対照表では,添字“n”で示さなければならない。

例えば,

“1n”は,記法“ADD”を表す(1n は No.1 の Name を意味し名前列を示す。

b)

  ファンクションの記号表現をサポートする場合,規格順守対照表では,添字“s”で示さなければならない。

例えば,

“1s”は,記法“+”を表す(1s は No.1 の Symbol を意味し記号列を示す。

c)

  これらのファンクションの入力及び出力の総称型は,ANY_MAGNITUDE である。

d)

  整数の除算結果は,その型の数を 0 方向に切り捨てた整数でなければならない。

例えば,7/3 = 2,(−7)/3=−2 となる。

e)

  このファンクションでは,IN1 及び IN2 は,総称型 ANY_INT でなければならない。この MOD ファンクションの

演算結果は,ST 言語で書かれた次の文と等価でなければならない。

IF (IN2=0)

  THEN  OUT:=0;

  ELSE  OUT:=IN1

−(IN1/IN2)*IN2;

END_IF

f)

  このファンクションでは,IN1 は ANY_REAL 型,IN2 は ANY_NUM 型でなければならない。出力は IN1 と同じ型

でなければならない。

g)

  MOVE ファンクションは,ただ一つの ANY 型の入力 IN 及び一つの ANY 型の出力 OUT をもつ。

6.6.2.5.9

ビット列ファンクション及びビットごとのブールファンクション

一つのビット列変数に対するシフトファンクションの標準のグラフィック表現,ファンクション名及び

記述は,

表 30 に規定するとおりでなければならない。これらのファンクションは,全てのビット列型に

対して多重定義しなければならない。また,データ型指定されてもよい。

ビットごとのブール演算ファンクションの標準のグラフィック表現,ファンクション名,記号及び仕様

は,

表 31 に規定しているとおりでなければならない。これらのファンクションは,NOT を除き拡張可能

でなければならず,全てのビット列型に対して多重定義されなければならず,また,データ型指定されて


83

B 3503

:2016 (IEC 61131-3:2013)

もよい。

表 30−ビットシフトファンクション

No.

説明

名前

解説

グラフィック表現

用例

a)

+

----

+

| *** |

ANY_BIT --

| IN |

-- ANY_BIT

ANY_INT --

| N |

+

----

+

 (***) -ファンクション名

A :=SHL(IN:=B, N:=5);

(ST 言語)

1

左シフト

SHL OUT

:=IN

を N ビット左にシフトし,右は 0 で埋めた値。

2

右シフト

SHR OUT

:=IN

を N ビット右にシフトし,左は 0 で埋めた値。

3

左ローテート

ROL OUT

:=IN

を N ビット左にローテートした値。

4

右ローテート

ROR OUT

:=IN

を N ビット右にローテートした値。

注記 1  表記 OUT は,ファンクション出力を指す。

IN :=2#0001_1001 of type BYTE, N=3

SHL(IN, 3)=2#1100_1000

SHR(IN, 3)=2#0000_0011

ROL(IN, 3)=2#1100_1000

ROR(IN, 3)=2#0010_0011

注記 2  型 BOOL(1 ビット)の IN は,意味をなさない。 

a)

N

の値が 0 未満の場合,エラーになる。

表 31−ビットごとのブールファンクション

No.

a), b)

説明

名前

記号

解説

c)

グラフィック表現 

+

-----

+

ANY_BIT --

| *** |

-- ANY_BIT

ANY_BIT --

| |

 :  --

| |

 :  --

| |

ANY_BIT --

| |

+

-----

+

 (***) -名前又は記号

用例

d)

A :=AND(B, C, D);

又は

A :=B & C & D;

1

論理積

AND &

e)

OUT :=IN1 & IN2 &... & INn

2

論理和

OR >=1

f)

OUT :=IN1 OR IN2 OR... OR INn 

3

排他的論理和

XOR =2k

+1

f)

OUT :=IN1 XOR IN2 XOR... XOR INn

4

否定

NOT

OUT :=NOT IN1

g)

a)

  ファンクションの名前表現をサポートする場合,規格順守対照表では,添字“n”で示さなければならない。例

えば,

“1n”は,記法“AND”を表す(1n は No.1 の Name を意味し名前列を示す。

b)

  ファンクションの記号表現をサポートする場合,規格順守対照表では,添字“s”で示さなければならない。例

えば,

“1s”は,記法“&”を表す(1s は No.1 の Symbol を意味し記号列を示す。

c)

  記法 IN1,IN2,...,INn は,上から下の順の入力を指している。OUT は,出力を指している。

d)

  用例及び説明は,ST 言語による。

e)

  この記号は,表 68 及び表 71 に示すようにテキスト言語の演算子としての使用に適している。

f)

  この記号は,テキスト言語の演算子としての使用に適していない。

g)

  ブール型記号のグラフィック表現の否定も遂行される。


84

B 3503

:2016 (IEC 61131-3:2013)

6.6.2.5.10

選択ファンクション及び比較ファンクション

選択ファンクション及び比較ファンクションは,全てのデータ型に対して多重定義されなければならな

い。選択ファンクションの標準のグラフィック表現,ファンクション名及び記述は,

表 32 に示すとおり

とする。

比較ファンクションの標準のグラフィック表現,ファンクション名,記号及び内容は,

表 33 に規定する

とおりとする。全ての比較ファンクション(NE を除く。

)は,拡張可能でなければならない。

ビット列データの比較は,最も左側のビットから最も右側のビットまでビットごとにされなければなら

ず,短いビット列を,それより長いビット列と比較するときは,左側が 0 で埋められていると仮定して行

う。すなわち,ビット列変数の比較は,符号なし整数変数の比較と同じ結果にならなければならない。

表 32−選択ファンクション

No.

説明

名前

グラフィック表現

解説/例

1

代入

a), d)

MOVE

+

-----

+

 |

MOVE |

 ANY

--

| IN |

- ANY

 +

-----

+

OUT :=IN

2 2 入力マル

チプレクサ

d)

SEL

+

-----

+

| SEL |

 BOOL

--

| G |

- ANY

 ANY

--

| IN0 |

 ANY

--

| IN1 |

 +

-----

+

OUT :=IN0 if G= 0

OUT :=IN1 if G= 1

A  :=  SEL  (G   :=0,

 IN0

:=X,

 IN1

:=5);

3

拡張可能最

大値ファン
クション

MAX

+

-----

+

| MAX |

ANY_ELEMENTARY - | IN1 |

- ANY_ELEMENTARY

 :

|

|

ANY_ELEMENTARY - | INn |

 +

-----

+

OUT :=

MAX(IN1, IN2, ..., INn);

A :=MAX(B, C , D);

4

拡張可能最

小値ファン

クション

MIN

+

-----

+

| MIN |

ANY_ELEMENTARY - |IN1

| - ANY_ELEMENTARY

 :

| |

ANY_ELEMENTARY - |INn

|

 +

-----

+

OUT :=

MIN (IN1, IN2,..., INn)

A :=MIN(B, C, D);

5

リミッタ

LIMIT

 +

-----

+

 |

LIMIT

|

ANY_ELEMENTARY - |MN

| - ANY_ELEMENTARY

ANY_ELEMENTARY - |IN

|

ANY_ELEMENTARY - |MX

|

 +

-----

+

OUT :=MIN

(MAX(IN, MN),MX);

A :=LIMIT(IN :=B,

 MN

:=0,

 MX

:=5);

6

拡張可能マ

ルチプレク

b), c), d), e)

MUX

+

-----

+

| MUX |

ANY_ELEMENTARY - |K

| - ANY_ELEMENTARY

ANY_ELEMENTARY - |IN0

|

ANY_ELEMENTARY - |IN1

|

 +

-----

+

a), b), c)

:

入力 K に応じて N 個の入力か

ら一つを選択する。 

A :=MUX(0, B, C, D);

は,次の文と同じ結果になる。

A :=B;


85

B 3503

:2016 (IEC 61131-3:2013)

表 32−選択ファンクション(続き)

注記 1  記法 IN0,IN1,...,INn(No.2 及び No.6)及び記法 IN1,IN2,...,INn(No.2 及び No.6 以外の項目)は,

上から下の順の入力を指している。OUT は,出力を指している。

注記 2  用例は,ST 言語による。 

a)

  MOVE ファンクションは,ただ一つの ANY 型入力 IN 及び ANY 型の出力 OUT をもつ。

b)

  MUX ファンクションの名前付けをしていない入力は,上から順番に,デフォルト名 IN0,IN1,...,INn-1 が

付けられているとしなければならない。ただし,n を総入力数とする。これらの名前のグラフィック表現を表示

してもよいが,その必要はない。

c)

  MUX ファンクションは,MUX_*_**の形式でデータ型指定できる。ここで,*は入力 K の型,**はその他の入力

及び出力の型である。

d)

  実装者がユーザ定義データ型変数の選択機能をサポートすることは認められるが,この機能に順守するために

はそのサポートは必須ではない。

e)

  MUX ファンクションの入力 K の実際の値が{0..n-1}の範囲でない場合,エラーである。

表 33−比較ファンクション

No.

説明

名前

a)

記号

b)

解説

(2 個以上のオペランドが拡張可能な場合)

グラフィック表現 

+

---

+

ANY_ELEMENTARY -- |

***

| -- BOOL

 :

--

| |

ANY_ELEMENTARY -- | |

 +

---

+

(***) 名前又は記号

用例

A :=GT(B, C, D);

//

名前

  又は

A :=(B>C) & (C>D); //

記号

1

より大

GT >

OUT

:=

(IN1>IN2)& (IN2>IN3) &.. & (INn-1 > INn)

2

より大きいか又は等しい

GE >=

OUT

:=

(IN1>=IN2)&(IN2>=IN3)&.. & (INn-1

>=INn)

3

等しい

EQ =

OUT

:=

(IN1=IN2)&(IN2=IN3) &..  & (INn-1= INn)

4

より小さいか又は等しい

LE <=

OUT

:=

(IN1<=IN2)&(IN2<=IN3)&.. & (INn-1

<=INn)

5

より小

LT <

OUT

:=

(IN1<IN2)& (IN2<IN3) &.. & (INn-1 < INn)

6

等しくない

NE <>

OUT

:=(IN1<>IN2)

(拡張可能でない)

注記 1  記法 IN1,IN2,...,INn は,上から下の順の入力を指している。OUT は,出力を指している。 
注記 2  この表の全ての記号は,テキスト言語の演算子としての使用に適している。 
注記 3  用例及び解説は,ST 言語による。 
注記 4  標準比較ファンクションは,例えば,ラダーのような定義言語依存でもよい。 

a)

  ファンクションの名前表現をサポートする場合,規格順守対照表では,添字“n”で示さなければならない。例

えば,

“1n”は,記法“GT”を表す(1n は,No.1 の Name を意味し名前列を示す。

b)

  ファンクションの記号表現をサポートする場合,規格順守対照表では,添字“s”で示さなければならない。例

えば,

“1s”は,記法“>”を表す(1s は,No.1 の Symbol を意味し記号列を示す。

6.6.2.5.11

文字列ファンクション

表 33 は,文字列に適用できなければならない。単一文字列の代わりに,データ型 CHAR 又は WCHAR

の変数をそれぞれ使用してもよい。


86

B 3503

:2016 (IEC 61131-3:2013)

異なる長さの二つの文字列の比較では,短い方の文字列の右側に長い方の文字列の長さまで値が 0 であ

る文字が付け加えられているとみなされなければならない。比較は,左から右に向かって,文字セットの

文字コードの数値比較に基づいて行わなければならない。

例  文字列“Z”は,文字列'AZ' ('Z' > 'A')より大きく,また,

“AZ”は,'ABC' ('A' = 'A'及び  'Z'

> 'B'

)より大きい。

付加的な文字列ファンクションの標準のグラフィック表現,ファンクション名及び説明は,

表 34 に示し

たとおりでなければならない。この演算では,L を文字列長とすると,文字列中の文字位置は,最も左側

の文字から 1,2,...,L と番号付けられなければならない。

次のいずれかの場合,エラーとしなければならない。

表 34 で ANY_INT と指定されたいずれかの入力の実際の値が 0 未満であるとき。

・  ファンクションの評価で(1)文字列中の存在しない文字位置にアクセスしようとしたか,又は(2)

実装固有の最大文字列長よりも長い文字列を生成しようとしたとき。

・  データ型 STRING 又は CHAR の引数及びデータ型 WSTRING 又は WCHAR の引数が,同じファンクショ

ンに混在したとき。

表 34−文字列ファンクション

No.

説明

グラフィック表現

1

文字列長

 +

--------

+

ANY_STRING --

| LEN |

-- ANY_INT

 +

--------

+

文字列長

A :=LEN('ASTRING');

は,次と等価。

A :=7;

2

左 端 文 字

抽出

 +

--------

+

 |

LEFT

|

ANY_STRING --

| IN |

-- ANY_STRING

ANY_INT --

| L |

 +

--------

+

IN

の最も左側の L 文字

A :=LEFT(IN:='ASTR', L:=3);

    は,次と等価。A :='AST';

3

右 端 文 字

抽出

 +

--------

+

 |

RIGHT

|

ANY_STRING --

| IN |

-- ANY_STRING

ANY_INT --

| L |

 +

--------

+

IN

の最も右側の L 文字

A :=RIGHT(IN:='ASTR', L:=3);

    は,次と等価。A :='STR';

4

中 間 文 字

抽出

 +

--------

+

| MID |

ANY_STRING --

| IN |

-- ANY_STRING

ANY_INT --

| L |

ANY_INT --

| P |

 +

--------

+

IN

の P 番目の文字から始まる L 文字

A :=MID(IN:='ASTR', L:=2, P:=2); 
    は,次と等価。A :='ST';

5

拡 張 可 能
な連結

 +

--------

+

 |

CONCAT |

ANY_CHARS --

| |

-- ANY_STRING

 : --

| |

ANY_CHARS --

| |

 +

--------

+

拡張可能な連結

A :=CONCAT('AB','CD','E');

    は,次と等価。A :='ABCDE';


87

B 3503

:2016 (IEC 61131-3:2013)

表 34−文字列ファンクション(続き)

No.

説明

グラフィック表現

6

挿入

 +

--------

+

 |

INSERT |

ANY_STRING --

| IN1 |

-- ANY_STRING

ANY_CHARS --

| IN2 |

ANY_INT --

| P |

 +

--------

+

IN1

の P 番目の文字位置の後に IN2 を挿入す

る。

A:=INSERT(IN1:='ABC', IN2:='XY',

P=2);

    は,次と等価。A :='ABXYC' ;

7

削除

 +

--------

+

 |

DELETE |

ANY_STRING --

| IN |

-- ANY_STRING

ANY_INT --

| L |

ANY_INT --

| P |

 +

--------

+

IN

の P 番目の文字位置から始まる L 文字を

削除する。

A :=DELETE(IN:='ABXYC', L:=2,

P:=3);

    は,次と等価。A :='ABC';

8

置換

+

--------

+

 |

REPLACE |

ANY_STRING --

| IN1 |

-- ANY_STRING

ANY_CHARS --

| IN2 |

ANY_INT --

| L |

ANY_INT --

| P |

 +

--------

+

IN1

の P 番目の文字位置から始まる L 文字を

IN2

で置き換える。

A :=REPLACE(IN1:='ABCDE',

IN2:='X', L:=2, P:=3);

    は,次と等価。A :='ABXE';

9

検索

+

--------

+

| FIND |

ANY_STRING --

| IN1 |

-- ANY_INT

ANY_CHARS --

| IN2 |

 +

--------

+

IN1

中に最初に見つかった文字列 IN2 の文字

位置。IN2 が見つからない場合は,OUT :=0.
  A :=FIND(IN1:='ABCBC',

IN2:='BC');

    は,次と等価。A :=2;

注記 1  例は,ST 言語による。 
注記 2  CONCAT の入力は全て ANY_CHARS である。すなわち,CHAR 型又は WCHAR 型であることもある。 
注記 3  ファンクション INSERT,REPLACE,FIND の入力 IN2 は,ANY_CHARS の入力である。すなわち,CHAR 型

又は  WCHAR 型であることもある。

6.6.2.5.12

日付ファンクション及び継続時間ファンクション

比較ファンクション,

選択ファンクションのほか,

表 35 に示す時間データ型の入力及び出力の組合せが,

対応するファンクションで可能でなければならない。

これらのファンクションを評価した結果が出力データ型の実装固有の値の範囲を超えていた場合,エラ

ーとしなければならない。


88

B 3503

:2016 (IEC 61131-3:2013)

表 35−時間データ型ファンクション及び継続時間データ型の数値演算ファンクション

No.

説明(ファンクション名)

記号 IN1

IN2

OUT

1a

ADD

TIME,

LTIME TIME,

LTIME TIME,

LTIME

1b

ADD_TIME

TIME TIME TIME

1c

ADD_LTIME

LTIME LTIME LTIME

2a

ADD

+ TOD,

LTOD

LTIME

TOD,

LTOD

2b

ADD_TOD_TIME

+ TOD

TIME

TOD

2c

ADD_LTOD_LTIME

+ LTOD

LTIME

LTOD

3a

ADD

DT, LDT

TIME, LTIME

DT, LDT

3b

ADD_DT_TIME

+ DT

TIME

DT

3c

ADD_LDT_LTIME

+ LDT

LTIME

LDT

4a

SUB

TIME,

LTIME TIME,

LTIME TIME,

LTIME

4b

SUB_TIME

TIME TIME TIME

4c

SUB_LTIME

LTIME LTIME LTIME

5a

SUB

DATE DATE TIME

5b

SUB_DATE_DATE

DATE DATE TIME

5c

SUB_LDATE_LDATE

LDATE LDATE LTIME

6a

SUB

TOD, LTOD

TIME, LTIME

TOD, LTOD

6b

SUB_TOD_TIME

− TOD

TIME

TOD

6c

SUB_LTOD_LTIME

− LTOD

LTIME

LTOD

7a

SUB

TOD, LTOD

TOD, LTOD

TIME, LTIME

7b

SUB_TOD_TOD

TOD TOD TIME

7c

SUB_TOD_TOD

LTOD LTOD LTIME

8a

SUB

DT, LDT

TIME, LTIME

DT, LDT

8b

SUB_DT_TIME

− DT

TIME

DT

8c

SUB_LDT_LTIME

− LDT

LTIME

LDT

9a

SUB

DT, LDT

DT, LDT

TIME, LTIME

9b

SUB_DT_DT

DT DT TIME

9c

SUB_LDT_LDT

LDT LDT LTIME

10a

MUL *

TIME,

LTIME

ANY_NUM

TIME,

LTIME

10b

MUL_TIME *

TIME

ANY_NUM

TIME

10c

MUL_LTIME *

LTIME

ANY_NUM

LTIME

11a

DIV /

TIME,

LTIME

ANY_NUM

TIME,

LTIME

11b

DIV_TIME /

TIME

ANY_NUM

TIME

11c

DIV_LTIME /

LTIME

ANY_NUM

LTIME

注記  これらの標準ファンクションは多重定義をサポートするが,データ型(TIME,DT,DATE,TOD)及びデータ型

(LTIME,LDT,LDATE,LTOD)の両方の集合の中だけである。

例 ST 言語文

X :=DT#1986-04-28-08:40:00;

Y :=DT_TO_TOD(X);

W :=DT_TO_DATE(X);

は,

“抽出”データと同じ結果になる。

X :=DT#1986-04-28-08:40:00;

Y :=TIME_OF_DAY#08:40:00;

W :=DATE#1986-04-28;

表 36 に示すように,結合ファンクション及び分割ファンクションは,日時を扱うために定義する。さら


89

B 3503

:2016 (IEC 61131-3:2013)

に,曜日を得るために定義する。

これらのファンクションを評価した結果が出力データ型の実装者の固有値の範囲を超えていた場合,エ

ラーとしなければならない。

表 36−時間データ型 CONCAT 及び SPLIT の追加ファンクション

No.

説明

グラフィック表現

結合時間データ型

1a

CONCAT_DATE_

TOD

 +

---------------

+

 |

CONCAT_DATE_TOD

|

 DATE

--

| DATE

| --DT

 TOD

--

| TOD

|

 +

---------------

+

日付を結合する:

VAR

  myD: DT;

END_VAR

myD :=CONCAT_DATE_TOD

 (D#2010-03-12,  TOD#12:30:00);

1b

CONCAT_DATE_

LTOD

 +

---------------

+

 |CONCAT_DATE_LTOD|

 DATE

--

| DATE

| --LDT

 LTOD

--

| LTOD

|

 +

---------------

+

日付と時刻とを結合する:

VAR

 myD:  LDT;

END_VAR

myD :=CONCAT_DATE_LTOD

 (D#2010-03-12,

   TOD#12:30:12.1223452);

2

CONCAT_DATE

+

---------------

+

| CONCAT_DATE |

ANY_INT --

| YEAR

| --DATE

ANY_INT --

| MONTH

|

ANY_INT --

| DAY

|

 +

---------------

+

日付を結合する:

VAR

 myD:  DATE;

END_VAR

myD :=CONCAT_DATE (2010,3,12);

3a

CONCAT_TOD

+

---------------

+

 |

CONCAT_TOD

|

ANY_INT --

| HOUR |

--TOD

ANY_INT --

| MINUTE |

ANY_INT --

| SECOND |

ANY_INT --

| MILLISECOND |

 +

---------------

+

時刻を結合する:

VAR

 myTOD:  TOD;

END_VAR

myTD :=CONCAT_TOD (16,33,12,0);

3b

CONCAT_LTOD

+

---------------

+

 |

CONCAT_LTOD

|

ANY_INT --

| HOUR |

--LTOD

ANY_INT --

| MINUTE |

ANY_INT --

| SECOND |

ANY_INT --

| MILLISECOND |

 +

---------------

+

時刻を結合する:

VAR

 myTOD:  LTOD;

END_VAR

myTD :=CONCAT_LTOD (16,33,12,0);

4a

CONCAT_DT

+

---------------

+

 |

CONCAT_DT

|

ANY_INT --

| YEAR |

--DT

ANY_INT --

| MONTH |

ANY_INT --

| DAY |

ANY_INT --

| HOUR |

ANY_INT --

| MINUTE |

ANY_INT --

| SECOND |

ANY_INT --

| MILLISECOND |

 +

---------------

+

日時を結合する:

VAR

 myDT:  DT;

 Day:  USINT;

END_VAR

Day  :=17;

myDT :=CONCAT_DT

 (2010,3,Day,12,33,12,0);


90

B 3503

:2016 (IEC 61131-3:2013)

表 36−時間データ型 CONCAT 及び SPLIT の追加ファンクション(続き)

No.

説明

グラフィック表現

4b

CONCAT_LDT

+

---------------

+

 |

CONCAT_LDT

|

ANY_INT --

| YEAR |

--LDT

ANY_INT --

| MONTH |

ANY_INT --

| DAY |

ANY_INT --

| HOUR |

ANY_INT --

| MINUTE |

ANY_INT --

| SECOND |

ANY_INT --

| MILLISECOND |

 +

---------------

+

日時を結合する:

VAR

 myDT:  LDT; 

 Day:  USINT;

END_VAR

Day  :=17;

myDT :=CONCAT_LDT

 (2010,3,Day,12,33,12,0);

分割時間データ型

5

SPLIT_DATE

+

---------------

+

 |

SPLIT_DATE

|

DATE -- |

IN           YEAR | -- ANY_INT

 |

MONTH

| -- ANY_INT

 |

DAY

| -- ANY_INT

 +

---------------

+

注記 参照

日付を分割する:

VAR

myD: DATE:=DATE#2010-03-10;

 myYear:  UINT;

 myMonth,

 myDay:  USINT;

END_VAR

SPLIT_DATE

(myD,myYear,myMonth,myDay);

6a

SPLIT_TOD   +

---------------

+

 |

SPLIT_TOD

|

 TOD --

|

IN           HOUR | -- ANY_INT

 |

MINUTE

| -- ANY_INT

 |

SECOND

| -- ANY_INT

 |

MILLISECOND

| -- ANY_INT

 +

---------------

+

注記 参照

時刻を分割する:

VAR myTOD: TOD:=TOD#14:12:03;

 myHour, myMin, mySec: USINT;

 myMilliSec:  UINT;

END_VAR

SPLIT_TOD(myTOD, myHour, myMin,

   mySec,myMilliSec);

6b

SPLIT_LTOD

+

---------------

+

 |

SPLIT_LTOD

|

LTOD -- |

IN           HOUR | -- ANY_INT

 |

MINUTE

| -- ANY_INT

 |

SECOND

| -- ANY_INT

 |

MILLISECOND

| -- ANY_INT

 +

---------------

+

注記 参照

時刻を分割する:

VAR myTOD: LTOD:=TOD#14:12:03;

 myHour, myMin, mySec: USINT;

 myMilliSec:  UINT;

END_VAR

SPLIT_LTOD(myTOD, myHour,

myMin,

   mySec,myMilliSec);


91

B 3503

:2016 (IEC 61131-3:2013)

表 36−時間データ型 CONCAT 及び SPLIT の追加ファンクション(続き)

No.

説明

グラフィック表現

7a

SPLIT_DT   +

---------------

+

 |

SPLIT_DT

|

 DT--

| IN YEAR

| -- ANY_INT

 |

MONTH

| -- ANY_INT

 |

DAY

| -- ANY_INT

 |

HOUR

| -- ANY_INT

 |

MINUTE

| -- ANY_INT

 |

SECOND

| -- ANY_INT

 |

MILLISECOND

| -- ANY_INT

 +

---------------

+

注記 参照

日時を分割する:

VAR myDT: DT

   :=DT#2010-03-10-14:12:03:00;

 myYear, myMilliSec: UINT;

 myMonth, myDay, myHour, myMin,

  mySec:  USINT;

END_VAR

SPLIT_DT(myDT, myYear, myMonth,

myDay,

myHour,myMin,mySec,myMilliSec);

7b

SPLIT_LDT   +

---------------

+

 |

SPLIT_LDT

|

 LDT

-- |

IN           YEAR | -- ANY_INT

 |

MONTH

| -- ANY_INT

 |

DAY

| -- ANY_INT

 |

HOUR

| -- ANY_INT

 |

MINUTE

| -- ANY_INT

 |

SECOND

| -- ANY_INT

 |

MILLISECOND

| -- ANY_INT

 +

---------------

+

注記 参照

日時を分割する:

VAR myDT: LDT

   :=DT#2010-03-10-14:12:03:00;

 myYear, myMilliSec: UINT;

 myMonth, myDay, myHour, myMin,

  mySec:  USINT;

END_VAR

SPLIT_LDT(myDT, myYear,

myMonth, myDay,

myHour,myMin,mySec,myMilliSec);

曜日を得る

8

DAY_OF_WEEK

+

---------------

+

 |

DAY_OF_WEEK

|

 DATE--

| IN |

- ANY_INT

 +

---------------

+

注記 参照

曜日を得る:

VAR myD: DATE:=DATE#2010-03-10;

 myDoW:  USINT;

END_VAR

myDoW:=DAY_OF_WEEK(myD);

ファンクション DAY_OF_WEEK は,日曜日は 0,月曜日は 1,…,土曜日は 6 を戻す。

注記 1  入力 YEAR でのデータ型は,有効な年値をサポートするため,少なくとも 16 ビットでなければならない。 
注記 2  実装者は,ANY_INT 出力に提供するデータ型を指定する。 
注記 3  実装者は,サポートされている精度,例えば,マイクロ秒及びナノ秒に従って追加入力又は出力を定義して

もよい。

6.6.2.5.13

エンディアン変換ファンクション

エンディアン変換ファンクションは,実装者が指定する,PLC の内部使用エンディアンから要求されて

いるエンディアンへ又はその逆に変換する。

エンディアンは,より長いデータ型又は変数内のバイトの順序付けである。

ビッグエンディアンのデータのデータ値は,メモリ配置上の左端バイトに先頭,右端バイトに終端が配

置される。

リトルエンディアンのデータのデータ値は,メモリ配置上の右端バイトに先頭,左端バイトに終端が配

置される。

エンディアンと関係なく,ビットオフセット 0 は,データ型の最も右側のビットをアドレス指定する。

元の数字より小さい数字で部分アクセスを用いることによって,指定エンディアンと関係なく,より右


92

B 3503

:2016 (IEC 61131-3:2013)

側の部分を返す。

例 1  エンディアン

TYPE D: DWORD :=16#1234_5678; END_TYPE;

メモリ配置

  ビッグエンディアンの場合:

16#12, 16#34, 16#56, 16#78

  リトルエンディアンの場合:

16#78, 16#56, 16#34, 16#12.

例 2  エンディアン

TYPE L: ULINT :=16#1234_5678_9ABC_DEF0; END_TYPE;

メモリ配置

  ビッグエンディアンの場合:

16#12, 16#34,16#56, 16#78, 16#9A, 16#BC,

16#DE, 16#F0

  リトルエンディアンの場合:

16#F0, 16#DE, 16#BC, 16#9A, 16#78, 16#56,

16#34, 16#12.

次のデータ型は,エンディアン変換ファンクションの入力又は出力としてサポートする。

・ 16 ビット以上のサイズの ANY_INT

・ 16 ビット以上のサイズの ANY_BIT

・  ANY_REAL

・  WCHAR

・  TIME

・  これらのデータ型の配列

・  これらのデータ型の構成要素を含む構造体

他のデータ型は変換されないが,変換するために構造内に含まれてもよい。

エンディアン変換ファンクションは,

表 37 による。

表 37−エンディアン変換ファンクション

No.

説明

グラフィック表現

テキスト表現

1

TO_BIG_ENDIAN   +------------------

+

 |

TO_BIG_ENDIAN

|

 ANY

-- | IN |

--ANY

 +------------------

+

ビッグエンディアンデータ書式への変

A:=TO_BIG_ENDIAN(B);

2

TO_LITTLE_ENDIAN

 +------------------

+

 |

TO_LITTLE_ENDIAN

|

 ANY

-- | IN |

--ANY

 +------------------

+

リトルエンディアンデータ書式への変

B:=TO_LITTLE_ENDIAN(A);

3

BIG_ENDIAN_TO   +------------------

+

 |

FROM_BIG_ENDIAN

|

 ANY

-- | IN |

--ANY

 +------------------

+

ビッグエンディアンデータ書式からの

変換

A:=FROM_BIG_ENDIAN(B);

4

LITTLE_ENDIAN_TO

 +------------------

+

 |FROM_LITTLE_ENDIAN

|

 ANY

-- | IN |

--ANY

 +------------------

+

リトルエンディアンデータ書式からの

変換

A:=FROM_LITTLE_ENDIAN(B);

注記 1  入力側及び出力側のデータ型は同じでなければならない。 
注記 2  変数が既に要求されたデータ書式の場合,ファンクションはデータ表現を変更しない。


93

B 3503

:2016 (IEC 61131-3:2013)

6.6.2.5.14

列挙データ型ファンクション

表 38 に記載した選択ファンクション及び比較ファンクションは,列挙データ型の入力にも適用できる。

表 38−列挙データ型ファンクション

No.

説明/ファンクション名

記号

表 y の中の項目番号 x

1

SEL

なし

表 32 の項目 No.2

2

MUX

なし

表 32 の項目 No.6

3

a)

EQ =

表 33 の項目 No.3

4

a)

NE <>

表 33 の項目 No.6

注記  表 33 の注記 及び注記 の規定は,この表に適用する。 

a)

  表 33 の注

a)

及び

b)

の規定は,この項目に適用する。

6.6.2.5.15

バリデートファンクション

バリデートファンクションは,入力パラメータが有効な値を含むか確認する。

多重定義ファンクション IS_VALID は,

データ型 REAL 及び LREAL に対して定義する。

実数が非数

(NaN)

又は無限(+Inf,−Inf)の場合,バリデートファンクションの結果は FALSE である。

実装者は,バリデートファンクション IS_VALID による追加データ型をサポートしてもよい。これらの

式の結果は,実装固有のものである。

多重定義ファンクション IS_VALID_BCD は,データ型 BYTE,WORD,DWORD 及び LWORD に対して定義

する。値が BCD 定義に合致しない場合,バリデートファンクションの結果は FALSE である。

バリデートファンクションの項目のリストは,

表 39 による。

表 39−バリデートファンクション

No.

説明

グラフィック表現

テキスト表現

1

IS_VALID

+------------+

 |

IS_VALID

|

ANY_REAL

-- | IN |

--BOOL

 +------------+

REAL の有効性確認

VAR R: REAL; END_VAR

IF IS_VALID(R) THEN ...

2

IS_VALID_BCD

+------------+

 |IS_VALID_BCD|

ANY_BIT --

| IN |

--BOOL

 +------------+

BCD ワードの有効性確認

VAR W: WORD; END_VAR

IF IS_VALID_BCD(W) THEN ...

6.6.3

ファンクションブロック

6.6.3.1

概要

ファンクションブロックは,プログラムの明確に定義された部分をモジュール化及び構造化する目的で

表現するプログラム構成ユニット(POU)である。

ファンクションブロックの概念は,ファンクションブロック型及びファンクションブロックインスタン

スによって実現される。

・  ファンクションブロック型は,次で構成する。

−  入力,出力及び内部変数に分割されたデータ構造の定義,及び

−  ファンクションブロック型のインスタンスが呼び出されたときに,データ構造に対して実行される

演算の集合。

・  ファンクションブロックインスタンス


94

B 3503

:2016 (IEC 61131-3:2013)

−  ファンクションブロックインスタンスは,ファンクションブロック型の複数の名称付き使用(イン

スタンス)

−  個々のインスタンスは,対応する識別子(インスタンス名)

,静的入力,出力及び内部変数を包含す

るデータ構造をもたなければならない。

静的変数は,ファンクションブロックインスタンスの実行から次の実行までその値を保持しなけ

ればならない。したがって,入力パラメータが同じファンクションブロックの呼出しは,必ずしも

同じ出力値を返す必要はない。

POU の共通特性をファンクションブロックに適用する。

・  オブジェクト指向ファンクションブロック  ファンクションブロックは,オブジェクト指向特性群に

よって拡張できる。

オブジェクト指向ファンクションブロックは,クラスに準じている。

6.6.3.2

ファンクションブロック型宣言

ファンクションブロック型は,ファンクションの宣言と同じように宣言しなければならない。

ファンクションブロック型宣言の項目は,

表 40 に規定する。

a)

予約語 FUNCTION_BLOCK に続けて,宣言するファンクションブロック名を示す識別子を指定

b)

ボディを構成する演算の集合

c)

ファンクションブロックボディの後に終了予約語 END_FUNCTION_BLOCK

d)

必要な場合は,VAR_INPUT,VAR_OUTPUT 及び VAR_IN_OUT による構文,変数名及び型を明記する。

e)

VAR_EXTERNAL

構文を通じて宣言する変数の値は,ファンクションブロック内から変更できる。

f)

VAR_EXTERNAL CONSTANT

構文を通じて宣言する変数の値は,ファンクションブロック内から変更

できない。

g)

可変長配列は,VAR_IN_OUT として使用してもよい。

h)

入力,出力及び静的変数は初期化してもよい。

i)

EN/ENO

入力及び出力は,入力変数及び出力変数と同じように宣言しなければならない。

次の項目は,ファンクションブロック固有のものである(ファンクションとは異なる。

j)

必要であれば,VAR...END_VAR 構文及び VAR_TEMP...END_VAR 構文,ファンクションブロックの

内部変数の名前及び型を明記する。

k)  VAR

部の(静的)変数は,PUBLIC 又は PRIVATE と宣言できる。アクセス修飾子 PRIVATE がデフォ

ルトである。PUBLIC 変数は,FB 出力へのアクセスと同様な構文法を用いて FB の外側からアクセス

してもよい。

l)

RETAIN

又は NON_RETAIN 修飾子は,

表 40 に示すように,ファンクションブロックの入力,出力及

び内部変数に使用できる。

m)

テキスト表現の宣言では,R_EDGE 及び F_EDGE 修飾子は,ブール入力のエッジ検出ファンクション

を示すために使用しなければならない。これは,必要なエッジ検出を行うためにこのファンクション

ブロックにおいて型 R_TRIG 又は F_TRIG のファンクションブロックそれぞれの暗黙の宣言をもたら

さなければならない。

この構成の例については,

表 40 参照。

n)

立上りエッジ及び立下りエッジ検出のグラフィック表現の宣言では,図示構文を用いなければならな

い。文字セットを使用するときは,ファンクションブロックの縁に“より大きい”

(>)か,

“より小

さい”

(<)がなければならない。


95

B 3503

:2016 (IEC 61131-3:2013)

o)

表 16 に定義するアスタリスク表記が,ファンクションブロックの内部変数の宣言で使用可能である。

p)

標準ファンクションブロックの入力,出力の宣言で総称データ型が用いられる場合,そのようなファ

ンクションブロック型の実際の出力の型を推測するための規則がファンクションブロック型定義の一

部でなければならない。

q)

他のファンクションブロック,クラス及びオブジェクト指向ファンクションブロックのインスタンス

は,VAR_TEMP 部を除く全ての変数部で宣言できる。

r)

ファンクションブロック型内のファンクションブロックインスタンスは,曖昧さを避けるために同じ

名前解決スコープ内のファンクションと同じ名前を使用してはならない。

表 40−ファンクションブロック型宣言

No.

説明

1

ファンクションブロック型の宣言

FUNCTION_BLOCK ...

END_FUNCTION_BLOCK

FUNCTION_BLOCK myFB ...

END_FUNCTION_BLOCK

2a

入力の宣言

VAR_INPUT ... END_VAR

VAR_INPUT IN: BOOL; T1: TIME; END_VAR

2b

出力の宣言

VAR_OUTPUT ... END_VAR

VAR_OUTPUT OUT: BOOL; ET_OFF: TIME;

END_VAR

2c

入出力の宣言

VAR_IN_OUT ... END_VAR

VAR_IN_OUT A: INT; END_VAR

2d

一時的変数の宣言

VAR_TEMP  ...  END_VAR

VAR_TEMP I: INT; END_VAR

2e

静的変数の宣言

VAR ... END_VAR

VAR B: REAL; END_VAR

2f

外部変数の宣言

VAR_EXTERNAL ... END_VAR

VAR_EXTERNAL B: REAL; END_VAR

次に対応する。

VAR_GLOBAL B: REAL

2g

外部変数の宣言

VAR_EXTERNAL CONSTANT ... END_VAR

VAR_EXTERNAL CONSTANT B: REAL; END_VAR

次に対応する。

VAR_GLOBAL B: REAL

3a

入力の初期化

VAR_INPUT  MN:  INT  :=0;

3b

出力の初期化

VAR_OUTPUT RES: INT :=1;

3c

静的変数の初期化

VAR B: REAL :=12.1;

3d

一時変数の初期化

VAR_TEMP I: INT :=1;

EN/ENO

  入力及び出力

表 18 に定義

4a

入力変数に対する RETAIN 修飾子の宣言

VAR_INPUT  RETAIN  X:  REAL;  END_VAR

4b

出力変数に対する RETAIN 修飾子の宣言

VAR_OUTPUT  RETAIN  X:  REAL;  END_VAR

4c

入力変数に対する NON_RETAIN 修飾子の宣言

VAR_INPUT NON_RETAIN  X: REAL; END_VAR

4d

出力変数に対する NON_RETAIN 修飾子の宣言

VAR_OUTPUT NON_RETAIN X: REAL; END_VAR

4e

静的変数に対する RETAIN 修飾子の宣言

VAR RETAIN X: REAL; END_VAR

4f

静的変数に対する NON_RETAIN 修飾子の宣言

VAR NON_RETAIN X: REAL; END_VAR

5a

ローカル FB インスタンスに対する RETAIN 修飾子の

宣言

VAR RETAIN TMR1: TON; END_VAR

5b

ローカル FB インスタンスに対する NON_RETAIN 修飾

子の宣言

VAR NON_RETAIN TMR1: TON; END_VAR


96

B 3503

:2016 (IEC 61131-3:2013)

表 40−ファンクションブロック型宣言(続き)

No.

説明

6a

立上りエッジ入力のテキスト表現宣言

FUNCTION_BLOCK AND_EDGE

VAR_INPUT  X: BOOL R_EDGE;

Y: BOOL F_EDGE;

END_VAR

VAR_OUTPUT Z: BOOL; END_VAR

 Z :=X AND Y; (* ST language example *)

END_FUNCTION_BLOCK

6b

立下りエッジの入力(テキスト表現)

上記を参照

7a

立上りエッジ入力のグラフィック表現宣言(>)

FUNCTION_BLOCK

(*外部インタフェース*)

 +

--------

+

 |

AND_EDGE

|

 BOOL --  > X Z

| --BOOL

 | |

 BOOL --  < Y |

 | |

 +

--------

+

(* FB  ボディ*)

 +

----

+

| & |

 X

--

| |

--Z

 Y

--

| |

 +

----

+

END_FUNCTION_BLOCK

7b

立下りエッジ入力のグラフィック表現宣言(<)

上記を参照

注記  この表の項目 No.1∼No.3 は,ファンクションと同等。表 19 参照。

FB 型宣言の例は,次による。

例 1  ファンクションブロック型宣言

FUNCTION_BLOCK DEBOUNCE

(*** 外部インタフェース ***)

  VAR_INPUT

    IN:  BOOL;

(* デフォルト値=0 *)

        DB_TIME: TIME :=t#10ms; (*  デフォルト値=t#10ms *)

  END_VAR

  VAR_OUTPUT

    OUT:  BOOL;

(* デフォルト値=0 *)

    ET_OFF  :  TIME;

(* デフォルト値=t#0s *)

  END_VAR

    VAR DB_ON: TON;

(** 内部変数 **)

    DB_OFF:  TON;

(** FB  インスタンス **)

    DB_FF:   SR;


97

B 3503

:2016 (IEC 61131-3:2013)

  END_VAR

(***ファンクションブロックボディ***)

  DB_ON (IN :=IN, PT :=DB_TIME);

  DB_OFF(IN :=NOT IN, PT :=DB_TIME);

  DB_FF (S1 :=DB_ON.Q, R :=DB_OFF.Q);

  OUT  :=DB_FF.Q1;

  ET_OFF  :=DB_OFF.ET;

 END_FUNCTION_BLOCK

a)

  テキスト表現宣言(ST 言語)

FUNCTION_BLOCK

(* 外部パラメータ  インタフェース *)

 +

-----------------

+

 |

DEBOUNCE

|

 BOOL---

|

IN OUT

|

---BOOL

 TIME---

|

DB_TIME ET_OFF

|

---TIME

 +

-----------------

+

(* ファンクションブロック型ボディ  *)

 DB_ON

DB_FF

 +------

+ +

-----

+

 |

|

|

|

 IN---

+ -----

|

IN Q

|

-----

|

S1 Q

|

---OUT

 |

--

|

PT ET

| +

--

|

R |

| |  +

----

+ | +

-----

+

 |

|

|

 |

|

DB_OFF

|

 |

|

+---- +

|

|

|

| TON |

|

+ - |--O |

IN Q

|----+

 DB_TIME--

+

---

|

PT

ET

|

--------------ET_OFF

 +---- +

 END_FUNCTION_BLOCK

b)

  グラフィック表現宣言(FBD 言語)

次の例は,

表 40 に示すファンクションブロックにおける入出力変数の宣言及びグラフィック表現使用法

の例を示す。


98

B 3503

:2016 (IEC 61131-3:2013)

例 2

 +-----------

+

 |

ACCUM

|

 INT---

|

A---------A

|

--INT

 INT---

|

X |

 +-----------

+

 +

--- +

 A--- | + |

---A

 X---

| |

 +

--- +

FUNCTION_BLOCK ACCUM

  VAR_IN_OUT A: INT; END_VAR

  VAR_INPUT  X:  INT;  END_VAR

  A  :=A

+X;

END_FUNCTION_BLOCK

a)

  ファンクションブロック型及びファンクションのグラフィック表現宣言及びテキスト表現宣言

 ACC1

 +

-----

+

 |

ACCUM

|

 ACC-------

|

A---A

|

---ACC

 +

--

+ |

|

X1--

| * | --

|

X |

X2--

| | +

-----

+

 +

--

+

VAR

  ACC:  INT;

  X1:  INT;

  X2:  INT;

END_VAR

この宣言の実行の作用は次のとおり。

ACC :=ACC

+X1*X2 ;

b)

  ファンクションブロックインスタンス及びファンクションの正しい使用例

 ACC1

ACC2

 +

-----

+ +

-----

+

 |

ACCUM

| |

ACCUM

|

 ACC-----

|

A---A

| ----------- | A---A

|

--ACC

 +

--

+ |

|

+

--

+ |

|

X1--

| * | --

|

X |

X3--

| * | --

|

X |

X2--

| | +------+

X4--

| | +

-----

+

 +

--

+ +

--

+

b)

のような宣言が既に行われて

いるとする。

ACC

,X1,X2,X3 及び X4;

実行の作用は次のとおり。

ACC :=ACC+X1*X2+X3*X4;

c)

  ファンクションブロックインスタンスの正しい使用例


99

B 3503

:2016 (IEC 61131-3:2013)

 ACC1

 +

-----

+

 |

ACCUM

|

 X3-------

|

A---A

|

--- X4

 +

--

+ |

|

X1--

| * | --

|

X |

X2--

| | +

-----

+

 +

--

+

VAR

  X1:  INT;

  X2:  INT;

  X3:  INT;

  X4:  INT;

END_VAR

この宣言の実行の作用は次のとおり。

X3 :=X3

+X1*X2;

X4 :=X3;

d)

  ファンクションブロックインスタンス及びファンクションの正しい使用例−出力への代入による

 ACC1

 +

--

+ +

-----

+

 X1-- | * |

| ACCUM

|

 X2-- | |

--

|

A---A

|

--ACC

 +

--

+ |

|

 X3---------

|

X----

|

 +

-----

+

不正な使用法

入出力変数 A への接続が変数でもファ

ンクションブロック名でもない。

e)

  FB インスタンスの不正な使用例

次の例は,

表 40 で用いられているファンクションブロック AND_EDGE を示す。

例 3  ファンクションブロック型宣言 AND_EDGE

表 40(項目 No.6a,項目 No.7a)の上記例でのファンクションブロック AND_EDGE の宣言は,

次に等しい。

FUNCTION_BLOCK AND_EDGE

  VAR_INPUT

    X:  BOOL;

    Y:  BOOL;

  END_VAR

  VAR

    X_TRIG:  R_TRIG;

    Y_TRIG:  F_TRIG;

  END_VAR

  VAR_OUTPUT

    Z:  BOOL;

  END_VAR

  X_TRIG(CLK  :=X);

  Y_TRIG(CLK  :=Y);

  Z :=X_TRIG.Q AND Y_TRIG.Q;


100

B 3503

:2016 (IEC 61131-3:2013)

END_FUNCTION_BLOCK

エッジ検出ファンクションブロック R_TRIG 及び F_TRIG については,

表 44 参照。

6.6.3.3

ファンクションブロックインスタンス宣言

ファンクションブロックインスタンスは,構造化変数についての記述と同じように宣言しなければなら

ない。

ファンクションブロックインスタンスを宣言するとき,ファンクションブロックインスタンスの入力,

出力又はパブリック変数の初期値は,

表 41 に示すようにファンクションブロック型識別子の後ろの代入

演算子に続く,括弧付きリストの中で宣言することができる。

初期値が上記の初期化リストの中に記載されていない要素は,ファンクションブロック型宣言の中で宣

言されたデフォルト値をもつ。

表 41−ファンクションブロックインスタンスの宣言

No.

説明

1 FB インスタンスの宣言

VAR

FB_instance_1, FB_instance_2: my

FB_Type;

 T1, T2, T3: TON;

END_VAR

2

その変数を初期化した FB インスタンスの宣言

VAR

TempLoop: PID :=(PropBand :=2.5,

Integral :=T#5s);

END_VAR

初期値をファンクションブロックインスタンスの入

力及び出力に割り当てる。

6.6.3.4

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

6.6.3.4.1

概要

ファンクションブロックのインスタンスの呼出しは,

テキスト表現又はグラフィック表現で表現できる。

ファンクションブロック呼出し(正式呼出し及び略式呼出しを含む。

)の特性は,ファンクションの特性

に次の拡張を加えたものと同じである。

a) FB

のテキスト表現呼出しは,ファンクションブロックのインスタンス名に続くパラメータリストで構

成する。

b)

グラフィック表現では,ファンクションブロックのインスタンス名はブロックの上に位置しなければ

ならない。

c)

ファンクションブロックのインスタンスの入力変数及び出力変数は格納され,構造データ型の要素と

して表現できる。したがって,ファンクションブロックの入力への代入及び出力へのアクセスは,次

ができなければならない。

1)

ファンクションブロックの呼出し時;これは代表的な使用法である。

2)

呼出しから分離できる。これらの分離代入は,ファンクションブロックの次の呼出しで有効になら

なければならない。

3)

割り付けられていない又は接続されていないファンクションブロックの入力は,それぞれの初期値,

又はある場合には,その一つ前の呼出しからの値を保持しなければならない。

入出力変数又は別のファンクションブロック型の入力変数に対しては実パラメータを指定しないことが


101

B 3503

:2016 (IEC 61131-3:2013)

可能である。しかしながら,インスタンスは,例えば,ファンクションブロック(ボディ)で用いられる

前に初期化若しくは前の呼出しによって保存される,又はメソッドによって保存される有効値を備えてい

なければならない。そうでなければ,ランタイムエラーの原因になる。

ファンクションブロック呼出しには更なる規則を適用する。

d)

ファンクションブロックが EN=0 で呼び出される場合,実装者は,インスタンスに入力及び入出力変

数がセットされるか明記しなければならない。

e)

ファンクションブロックインスタンス名は,VAR_INPUT 宣言の中で入力変数として宣言されている

場合,又は VAR_IN_OUT 宣言の中でファンクションブロックインスタンスの入出力変数として宣言さ

れている場合,ファンクションブロックインスタンスに対する入力として使用できる。

f)

VAR_INPUT

,VAR_IN_OUT 又は VAR_EXTERNAL 構文経由で名前がファンクションブロックに渡され

るそれぞれ異なるファンクションブロックインスタンスの出力値は,アクセスできるが,ファンクシ

ョンブロックの中で変更できない。

g)

ファンクションブロックに VAR_IN_OUT 又は VAR_EXTERNAL 構文でファンクションブロックのイン

スタンス名を渡すと,それをファンクションブロックの中から呼び出すことができる。

h)

変数及びファンクションブロックインスタンス名だけが,VAR_IN_OUT 構文を用いてファンクション

ブロックに渡すことができる。

表 42 は,ファンクションブロック呼出しの項目を含む。

表 42−ファンクションブロック呼出し

No.

説明

1

完全な正式呼出し(テキスト表現だけ) 
 
呼出しで EN/ENO が必要な場合に用いられる。

YourCTU(EN :=not B,

 CU

:=r,

 PV

:=c1,

 ENO=>

next,

Q => out,

 CV=>

c2);

2

不完全な正式呼出し(テキスト表現だけ)

YourCTU(Q => out,

 CV=>

c2);

EN

,CU,PV 変数は,直前の呼出しの値又は以前に呼

出しがなければ初期値をもつことになる。

3

グラフィック表現呼出し

 YourCTU

 +

------

+

| CTU |

 B

--

| EN ENO | -- next

 r

--

| CU Q

| -- out

 c1

--

| PV CV

| -- c2

 +

------

+

4

否定されたブール入力及び出力によるグラフィック
表現呼出し

 YourCTU

 +

------

+

| CTU |

 B

-0

| EN ENO | -- next

 r

--

| CU Q

| 0- out

 c1

--

| PV CV

| -- c2

 +

------

+

これらの構文の使用は入出力変数には禁止されてい

る。


102

B 3503

:2016 (IEC 61131-3:2013)

表 42−ファンクションブロック呼出し(続き)

No.

説明

5a

VAR_IN_OUT

によるグラフィック表現呼出し

5b

変数への VAR_IN_OUT の代入によるグラフィック表

現呼出し

6a

入力の分離代入によるテキスト表現呼出し

FB_Instance.Input :=x;  YourTon.IN :=r;

YourTon.PT :=t;

YourTon(not Q=> out);

6b

入力の分離代入によるグラフィック表現呼出し

 +

------

+

 r--

| MOVE |

--YourCTU.CU

 +

------

+

 +

------

+

 c--

| MOVE |

--YourCTU.PV

 +

------

+

 YourCTU

 +

------

+

| CTU |

 1

--

| EN ENO | -- next

 --

| CU Q

| 0- out

 --

| PV CV

| --

 +

------

+

7 FB 呼出し後のテキスト表現出力読出し

x:=FB_Instance.Output;

8a FB 呼出しに代入したテキスト表現出力

8b

否定による FB 呼出しに代入したテキスト表現出力

9a

入力としてのファンクションブロックインスタンス
名によるテキスト表現呼出し

VAR_INPUT I_TMR: TON; END_VAR

EXPIRED :=I_TMR.Q;

 
変数 EXPIRED 及び A_VAR は,この中及び次の例の中
でブール型の宣言をされていると仮定する。

9b

入力としてのファンクションブロックインスタンス
名によるグラフィック表現呼出し

10a

VAR_IN_OUT

としてファンクションブロックインス

タンス名によるテキスト表現呼出し

VAR_IN_OUT IO_TMR: TOF; END_VAR

 IO_TMR (IN :=A_VAR, PT :=T#10S);

 EXPIRED  :=IO_TMR.Q;

10b

VAR_IN_OUT

としてファンクションブロックインス

タンス名によるグラフィック表現呼出し

11a

外部変数としてファンクションブロックインスタン
ス名によるテキスト表現呼出し

VAR_EXTERNAL EX_TMR: TOF; END_VAR

 EX_TMR(IN :=A_VAR, PT :=T#10S);

 EXPIRED  :=EX_TMR.Q;

11b

外部変数としてファンクションブロックインスタン

ス名によるグラフィック表現呼出し


103

B 3503

:2016 (IEC 61131-3:2013)

例  直接及び分離パラメータ代入によるファンクションブロック呼出し

 YourCTU

 +

-------

+

| CTU |

 B-0

|

EN ENO

|

--

 r--

|

CU Q

|

0-out

 c--

|

PV CV

|

--

 +

-------

+

YourCTU (EN :=not b,

 CU

:=r,

 PV

:=c,

not Q=> out);

a)

  入力の直接代入による FB 呼出し(代表的な使用法)

 +

-----

+

 r--

| MOVE | --YourCTU.CU

 +

-----

+

 +

-----

+

 c--

| MOVE | --YourCTU.PV

 +

-----

+

 YourCTU

 +

----- +

 |

CTU

|

 --

|

EN ENO

|

--

 --

|

CU Q

|

0-out

 --

|

PV CV

|

--

 +

-------

+

YourCTU.CU :=r;

 YourCTU.PV  :=V;

 YourCTU(not Q=> out);

b)

  入力の分離代入による FB 呼出し

 YourCTU

 +

----- +

 +

--

+ |

CTU

|

 a--

|

NE

| --0 |

EN ENO

|

--

 b--

| |

r--

|

CU Q

|

0-out

 +

--

+ --

|

PV CV

|

--

 +

-------

+

VAR a, b, r, out: BOOL;

     YourCTU:  CTU;  END_VAR

  YourCTU  (EN  :=NOT  (a  <>  b),

CU  :=r,

NOT Q=> out);

c)

  出力への直接アクセスによる FB 呼出し(代表的な使用法)

また,否定の入力及び出力も許される。


104

B 3503

:2016 (IEC 61131-3:2013)

 FF75

 +

-------

+

 |

SR

|

 bIn1

--

|

S1 Q1

|

-- bOut3

 bIn2

--

|

R |

 +

-------

+

VAR FF75: SR; END_VAR (*

宣言*)

 FF75(S1  :=bIn1,     (*

呼出し *)

 R

:=bIn2);

 bOut3  :=FF75.Q1;

(*

出力の代入 *)

d)

  テキスト表現分離出力代入による FB 呼出し(呼出し後)

 TONs[12]

 +

-------

+

 |

TON

|

 bIn1

--

|

IN Q

|

--

 T#10ms --

|

PT ET

|

--

 +

-------

+

 TONs[i]

 +

-------

+

 |

TON

|

 bIn1

--

|

IN Q

|

--

 T#20ms --

|

PT ET

|

--

 +

-------

+

VAR

  TONs: array [0..100] OF TON;

  i:  INT;

END_VAR

 TON[12](IN:=bIn1,  PT:=T#10ms);

 TON[i](IN:=bIn1,  PT:=T#20ms);

e)

  インスタンス配列を用いた FB 呼出し

 myCooler.Cooling

 +

-------

+

 |

TOF

|

 bIn1

--

|

IN Q

|

--

 T#30s

-- |

PT ET

|

--

 +

-------

+

TYPE

  Cooler:  STRUCT

    Temp:  INT;

    Cooling:  TOF;

  END_STRUCT;

END_TYPE

VAR

  myCooler:  Cooler;

END_VAR

 myCooler.Cooling(IN:=bIn1, PT:=T#30s);

f)

  構造体要素としてインスタンスを用いた FB 呼出し

6.6.3.4.2

入力パラメータ及び出力パラメータの使用法

図 13 及び図 14 は,ファンクションブロックの呼出しに関連したファンクションブロックの入力及び出

力パラメータの使用規則を要約したものである。

入力及び入出力パラメータへの代入は,

ファンクションブロックが次に呼び出されたときに有効になる。


105

B 3503

:2016 (IEC 61131-3:2013)

FUNCTION_BLOCK FB_TYPE

VAR_INPUT In:  REAL;

END_VAR

VAR_OUTPUT Out:  REAL;

END_VAR

VAR_IN_OUT In_out:

REAL;

END_VAR

VAR M:

REAL;

END_VAR

END_FUNCTION_BLOCK

VAR FB_INST: FB_TYPE; A, B, C: REAL; END_VAR

使用法 a)  ファンクションブロックの内部 b)  ファンクションブロックの外部

1)  入力読出し

M :=In;

A:= FB_INST.In;

不許可

a)

及び

b)

2)  入力代入

不許可

a)

//即時パラメータ代入による呼出し

FB_INST(In :=A);

 
//分離代入

FB_INST.In :=A;

3)  出力読出し

M :=Out;

//即時パラメータ代入による呼出し

FB_INST(Out=> B);

 
//分離代入

B :=FB_INST.Out;

4)  出力代入

Out :=M;

不許可

a)

5)  入出力読出し

M :=In_out;

FB_INST(In_out=> C);

  不許可

C := FB_INST.In_out;

  不許可

6)  入出力代入

In_out :=M;

 c)

//即時パラメータ代入による呼出し

FB_INST(In_out :=C);

FB_INST.In_out := C;

  不許可

a)

  この表で“不許可”となっている使用は,実装者固有の予期せぬ副作用を起こし得る。

b)

  ファンクションブロックの入力,出力パラメータ及び内部変数は,JIS B 3501 に規定する“通信機能の特性”,

“ヒューマンマシンインタフェース機能(HMI 機能)の特性”又は“プログラミング,デバッグ,監視,試験

及び文書化機能の特性”に従って読み書きしてもよい。

c)

  VAR_IN_OUT ブロックで宣言された変数は,ファンクションブロック内で変更してもよい。

図 13−ファンクションブロック入力及び出力パラメータの使用法(規則)

図 13 の規則によって定義する入力及び出力パラメータの使用法は,図 14 による。

タグ 1a,1b などは,

図 13 の規則である。

図 14−ファンクションブロック入力及び出力パラメータの使用法(規則の図解)

入力

出力

入出力

入出力

1a

4a

2a

3a

5a

6a

1b

FB_INST

B

4b

3b

C

5b

6b

2b

 : 不許可 

 : 許可

タグ

X

X


106

B 3503

:2016 (IEC 61131-3:2013)

次の例は,パラメータ及び外部変数としてのファンクションブロック名のグラフィック表現使用例であ

る。

例  パラメータ及び外部変数としてのファンクションブロック名のグラフィック表現使用法

FUNCTION_BLOCK

(* 外部インタフェース *)

 +--------------+

 |

INSIDE_A

|

 TON--

|

I_TMR EXPIRED

|

--BOOL

 +--------------+

(* ファンクションブロックボディ *)

 +----+

 |MOVE|

 I_TMR.Q--

| |

--EXPIRED

 +----+

END_FUNCTION_BLOCK

FUNCTION_BLOCK

(* 外部インタフェース *)

 +--------------+

 |

EXAMPLE_A

|

 BOOL-- |

GO DONE

|

--BOOL

 +--------------+

(* ファンクションブロックボディ  *)

 E_TMR

 +------

+ I_BLK

 |

TON

|

+--------------+

 GO--

|

IN Q

| |

INSIDE_A

|

 t#100ms--

|

PT ET

| E_TMR--

|

I_TMR EXPIRED

|

--DONE

 +------ + +--------------+

END_FUNCTION_BLOCK

a)

  入力変数としてのファンクションブロックのインスタンス(注記参照)

FUNCTION_BLOCK

(* 外部インタフェース *)

 +--------------+

 |

INSIDE_B

|

 TON-- |I_TMR----I_TMR|

--TON

 BOOL-- |TMR_GO EXPIRED|

--BOOL

 +--------------+


107

B 3503

:2016 (IEC 61131-3:2013)

(* ファンクションブロックボディ *)

 I_TMR

 +------

+

 |

TON

|

 TMR_GO--

|

IN Q

|

--EXPIRED

 |

PT ET

|

 +------

+

END_FUNCTION_BLOCK

FUNCTION_BLOCK

(* 外部インタフェース *)

 +--------------+

 |

EXAMPLE_B

|

 BOOL-- |

GO DONE

|

--BOOL

 +--------------+

(* ファンクションブロックボディ  *)

 E_TMR

 +------ + I_BLK

 |

TON

|

+--------------+

 |

IN Q

| |

INSIDE_B

|

 t#100ms--

|

PT ET

| E_TMR--

|I_TMR----I_TMR|

 +

------

+ GO--

|

TMR_GO EXPIRED|

--DONE

 +--------------+

END_FUNCTION_BLOCK

b)

  入出力変数としてのファンクションブロックのインスタンス名

FUNCTION_BLOCK

(* 外部インタフェース *)

 +--------------+

 |

INSIDE_C

|

 BOOL-- |TMR_GO EXPIRED|

--BOOL

 +--------------+

VAR_EXTERNAL X_TMR: TON; END_VAR


108

B 3503

:2016 (IEC 61131-3:2013)

(* ファンクションブロックボディ  *)

 X_TMR

 +------

+

 |

TON

|

 TMR_GO--

|

IN Q

|

--EXPIRED

 |

PT ET

|

 +------

+

END_FUNCTION_BLOCK

PROGRAM

(* 外部インタフェース  *)

 +--------------+

 |

EXAMPLE_C

|

 BOOL-- |

GO DONE

|

--BOOL

 +--------------+

VAR_GLOBAL X_TMR: TON; END_VAR

(* プログラムボディ  *)

 I_BLK

 +--------------+

 |

INSIDE_C

|

 GO

-- |TMR_GO EXPIRED|

-- DONE

 +--------------+

END_PROGRAM

c)

  外部変数としてのファンクションブロックのインスタンス名

注記  これは図 13 規則 3)及び 4)によって禁止されている INSIDE_A 内の I_TMR の呼出しを示唆して

いるので,I_TMR は,ここではグラフィック表現はしない。

6.6.3.5

標準ファンクションブロック

6.6.3.5.1

概要

全てのプログラマブルコントローラ用プログラム言語で共通な標準ファンクションブロックの定義は,

次による。実装者は,追加の標準ファンクションブロックを規定してもよい。

この箇条で標準ファンクションブロックのグラフィック表現を宣言しているところでは,

表 44 の例のよ

うに,同等のテキスト表現宣言も同時に記載している場合もある。

標準ファンクションブロックは,多重定義をしてもよく,拡張入力及び拡張出力をもっていてもよい。

そのようなファンクションブロック型の定義では,これらの入力及び出力の数及びデータ型に関する制約

を記載しなければならない。非標準のファンクションブロックでこのような機能を使用することは,この

規格の適用範囲外である。

6.6.3.5.2

双安定要素

標準の双安定要素のグラフィック表現及びファンクションブロックボディは,

表 43 による。


109

B 3503

:2016 (IEC 61131-3:2013)

表 43−標準双安定ファンクションブロック

a)

No.

説明/グラフィック表現

ファンクションブロックボディ

1a

双安定ファンクションブロック(セット優先)

:SR(S1, R, Q1)

 +

------

+

 |

SR

|

 BOOL -- | S1 Q1

| -- BOOL

 BOOL -- | R |

 +

------

+

 +

---

+

 S1 --------------

|

>=1

| -- Q1

 +

---

+ |  |

 R ------O | & |

-- | |

 Q1 ------ | |

| |

 +

---

+ +

---

+

1b

ロング入力名による双安定ファンクションブロック(セット優先)

SR(SET1, RESET, Q1)

 +

--------

+

| SR |

 BOOL -- | SET1 Q1

| -- BOOL

 BOOL -- | RESET |

 +

--------

+

 +

---

+

 SET1 ------------

|

>=1

| -- Q1

 +

---

+ |  |

 RESET --O | & |

-- | |

 Q1 ------ | |

| |

 +

---

+ +

---

+

2a

双安定ファンクションブロック(リセット優先)

:RS(S, R1, Q1)

 +

------

+

 |

RS

|

 BOOL -- | S Q1

| -- BOOL

 BOOL -- | R1 |

 +

------

+

 +

---

+

 R1 -------------O

| & |

-- Q1

 +

---

+ |  |

 S ------- |

>=1

| -- | |

 Q1 ------ | |

| |

 +

---

+ +

---

+

2b

ロング入力名による双安定ファンクションブロック(リセット優
先)

:  RS(SET, RESET1, Q1)

 +

--------

+

| RS |

 BOOL -- | SET Q1

| -- BOOL

 BOOL -- | RESET1 |

 +

--------

+

 +

---

+

 RESET1 ---------0

| & |

-- Q1

 +

---

+ |  |

 SET ----- |

>=1

| -- | |

 Q1 ------ | |

| |

 +

---

+ +

---

+

a)

  出力変数 Q1 の初期状態は,ブール型変数の通常のデフォルト値である 0 でなければならない。

6.6.3.5.3

エッジ検出(R_TRIG 及び F_TRIG

標準の立上りエッジ,立下りエッジ検出ファンクションブロックのグラフィック表現は,

表 44 に示すと

おりでなければならない。これらのブロックの挙動は,この表の規定と等価でなければならない。この挙

動は,次の規則に一致する。

a)

R_TRIG

ファンクションブロックの Q 出力は,CLK 入力が 0 から 1 に変化した直後のファンクション

ブロックの実行から次の実行まで,値が BOOL#1 にならなければならない。また,次の実行で値が 0

に戻らなければならない。

b)  F_TRIG

ファンクションブロックの Q 出力は,CLK 入力が 1 から 0 に変化した直後のファンクション

ブロックの実行から次の実行まで,値が BOOL#1 にならなければならない。また,次の実行で値が 0

に戻らなければならない。


110

B 3503

:2016 (IEC 61131-3:2013)

表 44−標準エッジ検出ファンクションブロック

No.

説明/グラフィック表現

定義(ST 言語)

1

立上りエッジ検出器:R_TRIG(CLK, Q)

 +

------

+

 |

R_TRIG

|

 BOOL -- |

CLK Q

| -- BOOL

 +

------

+

FUNCTION_BLOCK R_TRIG

  VAR_INPUT  CLK:  BOOL;  END_VAR

  VAR_OUTPUT  Q:  BOOL;   END_VAR

  VAR  M:  BOOL;  END_VAR

   Q  :=CLK  AND  NOT  M;

   M  :=CLK;

END_FUNCTION_BLOCK

2

立下りエッジ検出器:F_TRIG(CLK, Q)

 +

------

+

 |

F_TRIG

|

 BOOL -- |

CLK Q

| -- BOOL

 +

------

+

FUNCTION_BLOCK F_TRIG

  VAR_INPUT  CLK:  BOOL;  END_VAR

  VAR_OUTPUT  Q:  BOOL;  END_VAR

  VAR  M:  BOOL;   END_VAR

   Q  :=NOT  CLK  AND  NOT  M;

   M  :=NOT  CLK;

END_FUNCTION_BLOCK

注記  R_TRIG 型インスタンスの CLK 入力が値 BOOL#1 に接続している場合,

“コールド再始動”からの最初の実行で

Q

出力が BOOL#1 になる。Q 出力は,その後の実行では BOOL#0 になる。同じことは,CLK 入力が未接続又は

FALSE

に接続している F_TRIG のインスタンスに対しても当てはまる。

6.6.3.5.4

カウンタ

標準カウンタファンクションブロックのグラフィック表現並びにその関係する入力及び出力は,

表 45

に示すとおりでなければならない。これらのファンクションブロックの演算は,対応するファンクション

ブロックボディに記述しているとおりでなければならない。

表 45−標準カウンタファンクションブロック

No.

説明/グラフィック表現

ファンクションブロックボディ(ST 言語)

アップカウンタ

1a

CTU_INT(CU, R, PV, Q, CV)

又は CTU(..)

 +

------

+

 |

CTU

|

 BOOL -- > CU Q

| -- BOOL

 BOOL -- | R |

 INT --

| PV CV

| -- INT

 +

------

+

次のグラフィック表現でもよい。

 +

--------

+

 |

CTU_INT |

 BOOL -- > CU Q

| -- BOOL

 BOOL -- | R |

 INT --

| PV CV

| -- INT

 +

--------

+

VAR_INPUT CU: BOOL R_EDGE; ...

/*

データ型 R_EDGE によって内部的にエッジが検出

される。*/ 

IF R

THEN CV :=0;

ELSIF CU AND (CV < PVmax)

   THEN

   CV  :=CV+1;

END_IF;

 Q  :=(CV  >=PV);

1b

CTU_DINT

PV, CV: DINT

1a 参照

1c

CTU_LINT

PV, CV: LINT

1a 参照

1d

CTU_UDINT

PV, CV: UDINT

1a 参照

1e

CTU_ULINT(CD, LD, PV, CV) PV, CV: ULINT

1a 参照


111

B 3503

:2016 (IEC 61131-3:2013)

表 45−標準カウンタファンクションブロック(続き)

No.

説明/グラフィック表現

ファンクションブロックボディ(ST 言語)

ダウンカウンタ

2a

CTD_INT(CD, LD, PV, Q, CV)

又は CTD

 +

------

+

 |

CTD

|

 BOOL -- > CD Q

| -- BOOL

 BOOL -- | LD |

 INT --

| PV CV

| -- INT

 +

------

+

次のグラフィック表現でもよい。

 +

--------

+

 |

CTD_INT |

 BOOL -- > CU Q

| -- BOOL

 BOOL -- | LD |

 INT --

| PV CV

| -- INT

 +

--------

+

VAR_INPUT CU: BOOL R_EDGE; ...

//

データ型 R_EDGE によって内部的にエッジが検出

される。 

IF LD

THEN  CV  :=PV;

ELSIF CD AND (CV > PVmin)

   THEN  CV  :=CV-1;

END_IF;

 Q  :=(CV  <=0);

2b

CTD_DINT

PV, CV: DINT

2a 参照

2c

CTD_LINT

PV, CV: LINT

2a 参照

2d

CTD_UDINT

PV, CV: UDINT

2a 参照

2e

CTD_ULINT

PV, CV: UDINT

2a 参照

アップダウンカウンタ

3a

CTUD_INT(CD, LD, PV, Q, CV)

又は CTUD(..)

 +

--------

+

 |

CTUD

|

 BOOL -- > CU QU

| -- BOOL

 BOOL -- > CD QD

| -- BOOL

 BOOL -- | R |

 BOOL -- | LD |

 INT --

| PV CV

| -- INT

 +

--------

+

次のグラフィック表現でもよい。

 +

--------

+

 |

CTUD_INT

|

 BOOL -- > CU QU

| -- BOOL

 BOOL -- > CD QD

| -- BOOL

 BOOL -- | R |

 BOOL -- | LD |

 INT --

| PV CV

| -- INT

 +

--------

+

VAR_INPUT CU, CD: BOOL R_EDGE; ...

//

データ型 R_EDGE によって内部的にエッジが検出

される。 

IF R

THEN CV :=0;

ELSIF LD

  THEN  CV  :=PV;

  ELSE

    IF  NOT  (CU  AND  CD)

    THEN

      IF  CU  AND  (CV  <  PVmax)

      THEN  CV  :=CV

+1;

      ELSIF  CD  AND  (CV  >  PVmin)

        THEN  CV  :=CV-1;

      END_IF;

    END_IF;

 END_IF;

 QU  :=(CV  >=PV);

 QD  :=(CV  <=0);

3b

CTUD_DINT

PV, CV: DINT

3a 参照

3c

CTUD_LINT

PV, CV: LINT

3a 参照

3d

CTUD_UDINT

PV, CV: UDINT

3a 参照

3e

CTUD_ULINT

PV, CV: ULINT

3a 参照

注記  リミット変数 PVmin 及び PVmax の数値は,実装者依存である。


112

B 3503

:2016 (IEC 61131-3:2013)

6.6.3.5.5

タイマ

標準タイマファンクションブロックのグラフィック表現は,

表 46 のとおりでなければならない。これら

のファンクションブロックの演算は,

図 15 に示したタイミングダイアグラムに規定するとおりとする。

標準タイマファンクションブロックは,TIME 又は LTIME で多重定義して使用できる。又は標準タイマ

の基本データ型は,TIME 又は LTIME として指定できる。

表 46−標準タイマファンクションブロック

No.

説明

記号

グラフィック表現

1a

多重定義パルス

TP

***: TP

+

------

+

 |

***

|

 BOOL -- | IN Q

| -- BOOL

 TIME -- | PT ET

| -- TIME

 +

------

+

PT

注記を参照

IN

:  入力(開始)

PT

:  プリセット時間

Q

:  出力

ET

:  経過時間

1b

TIME

を用いたパルス

TP_TIME

1c

LTIME

を用いたパルス

TP_LTIME

2a

多重定義オン・ディレイ

TON

TON

2b

TIME

を用いたオン・ディレイ

TON_TIME

2c

LTIME

を用いたオン・ディレイ

TON_LTIME

2d

a)

多重定義オン・ディレイ(グラフィック表現)

T---0

3a

多重定義オフ・ディレイ

TOF

TOF

3b

TIME

を用いたオフ・ディレイ

TOF_TIME

3c

LTIME

を用いたオフ・ディレイ

TOF_LTIME

3d

a)

多重定義オフ・ディレイ(グラフィック表現)

0---T

注記  計時動作中に PT の値を変更したときの効果,例えば,PT を t#0s にセットすると TP インスタンスの動作がリ

セットするなどは,実装者依存パラメータである。

a)

  テキスト言語では,項目 No.2d 及び 3d を使用しない。

図 15 は,標準タイマファンクションブロックのタイミングダイアグラムを示す。

 +

--------- + ++ ++

+---------+

 IN

|

|

||

||  |

|

 --

+ +

--

++--++ --- + +

------

 t0

t1

t2

t3

t4

t5

 +

------

+ +

-----

+ +

-----

+

Q

|  | | |

| |

 --

+ +

-----

+ +

--

+ +

---------

 t0

t0

+PT t2

t2

+PT t4

t4

+PT

 PT

+

--

+ + +

--

+

 :

/

|

/|

/

|

ET

:

/

| /

| /

|

:

/ |

/

|

/ |

:

/

| /

| /

|

 0-

+ +

--

+ +

--

+ +

------

t0  t1

t2 t4 t5

a)

  パルス(TP)のタイミングダイアグラム 

図 15−標準タイマファンクションブロック−タイミングダイアグラム(規則)


113

B 3503

:2016 (IEC 61131-3:2013)

 +---------+

+

--

+ +

----------

+

 IN  |

|

| | |

|

 --

+

+

-----

+ +

--

+ +

------

 t0  t1

t2

t3

t4

t5

 +

--

+ +

--

+

  Q

| |

| |

 -------- + +

--------------------

+ +

------

 t0

+PT t1

t4

+PT t5

 PT

+

--+ +

--

+

: /

|

+ /

|

ET

:

/ |

/|

/ |

 : /

|

/

| /

|

: /

|

/ | /

|

 0

--

+ +

-----

+ +

--

+ +

------

t0 t1

t2

t3

t4 t5

b)

  オン・ディレイ(TON)のタイミングダイアグラム 

 +---------+

+

---

+ +

------- +

 IN  |

|

|  |

|

|

 --

+ +

-----

+ +

---- + +

-------------

 t0  t1

t2

t3

t4 t5

 +

------------

+ +------------------------

+

 Q  |

| |

|

 --

+ +

--

+ +

------

 t0  t1

+PT t

t5

+PT

 PT

+

--

+ +

------

: /

|

+ /

ET :

/

|

/|

/

: /

|

/

| /

: /

|

/

| /

 0---------+

+

--

+ +

-------- +

 t1

t3

t5

c)

  オフ・ディレイ(TOF)のタイミングダイアグラム 

図 15−標準タイマファンクションブロック−タイミングダイアグラム(規則)(続き)

6.6.3.5.6

通信ファンクションブロック

IEC 61131-5

で,プログラマブルコントローラ用の標準通信ファンクションブロックを規定している。

これらのファンクションブロックは,装置の確認,ポーリングによるデータ収集,プログラムによるデー

タ収集,パラメトリック制御,インタロック制御,プログラムによる警報の通知及び接続の管理及び保護

といった通信機能を提供する。


114

B 3503

:2016 (IEC 61131-3:2013)

6.6.4

プログラム

JIS B 3501

で,プログラムは“全てのプログラム言語要素の論理的組合せで,PLC システムによる機械

又はプロセスの制御のために必要な,

意図された信号処理のためのプログラムの集合体”

と規定している。

プログラムの宣言及び利用法は,

表 47 に示す付加的な項目及び次に示す違いのほかは,ファンクション

ブロックと全く同じである。

a)

プログラム宣言の区切り予約語は,PROGRAM...END_PROGRAM とする。

b)

プログラムは,VAR_ACCESS...END_VAR 構文を含むことができる。それは,IEC 61131-5 で詳細に

規定している通信サービスの幾つかでアクセスできる名前付き変数を指定する方法を提供する。アク

セスパスによって,それらの変数をプログラムの入力,出力及び内部変数に関連付ける。

c)

プログラムは,リソースの中だけでインスタンス化できる。他方,ファンクションブロックは,プロ

グラム又はファンクションブロックの中でだけインスタンス化できる。

d)

プログラムは,そのグローバル変数及び内部変数の宣言の中で位置の割付けを含むことができる。不

完全な指定の直接表現による位置の割付け(例えば,6.5.5.4 参照)は,プログラムの内部変数の宣言

でだけ使用できる。

e)

プログラムのオブジェクト指向項目は,この規格の適用範囲外である。

表 47−プログラム宣言

No.

説明

1

プログラムの宣言

PROGRAM ... END_PROGRAM

PROGRAM myPrg ... END_PROGRAM

2a

入力の宣言

VAR_INPUT ... END_VAR

VAR_INPUT IN: BOOL; T1: TIME; END_VAR

2b

出力の宣言

VAR_OUTPUT ... END_VAR

VAR_OUTPUT OUT: BOOL; ET_OFF: TIME;

END_VAR

2c

入出力の宣言

VAR_IN_OUT ... END_VAR

VAR_IN_OUT A: INT; END_VAR

2d

一時的変数の宣言

VAR_TEMP  ...  END_VAR

VAR_TEMP I: INT; END_VAR

2e

静的変数の宣言

VAR ... END_VAR

VAR B: REAL; END_VAR

2f

外部変数の宣言

VAR_EXTERNAL ... END_VAR

VAR_EXTERNAL B: REAL; END_VAR

次に対応する。

VAR_GLOBAL B: REAL

2g

外部変数(定数)の宣言

VAR_EXTERNAL CONSTANT ... END_VAR

VAR_EXTERNAL CONSTANT B: REAL; END_VAR

次に対応する。

VAR_GLOBAL B: REAL

3a

入力の初期化

VAR_INPUT  MN:  INT  :=0;

3b

出力の初期化

VAR_OUTPUT RES: INT :=1;

3c

静的変数の初期化

VAR B: REAL :=12.1;

3d

一時的変数の初期化

VAR_TEMP I: INT :=1;

4a

入力変数に対する RETAIN 修飾子の宣言

VAR_INPUT  RETAIN  X:  REAL;  END_VAR

4b

出力変数に対する RETAIN 修飾子の宣言

VAR_OUTPUT  RETAIN  X:  REAL;  END_VAR

4c

入力変数に対する NON_RETAIN  修飾子の宣言

VAR_INPUT NON_RETAIN  X: REAL; END_VAR

4d

出力変数に対する NON_RETAIN  修飾子の宣言

VAR_OUTPUT NON_RETAIN X: REAL; END_VAR

4e

静的変数に対する RETAIN 修飾子の宣言

VAR RETAIN X: REAL; END_VAR

4f

静的変数に対する NON_RETAIN 修飾子の宣言

VAR NON_RETAIN X: REAL; END_VAR


115

B 3503

:2016 (IEC 61131-3:2013)

表 47−プログラム宣言(続き)

No.

説明

5a

ローカル FB インスタンスに対する RETAIN 修飾子の

宣言

VAR RETAIN TMR1: TON; END_VAR

5b

ローカル FB インスタンスに対する NON_RETAIN 修飾
子の宣言

VAR NON_RETAIN TMR1: TON; END_VAR

6a

立上りエッジ入力のテキスト表現宣言

PROGRAM AND_EDGE

VAR_INPUT X: BOOL R_EDGE;

Y: BOOL F_EDGE;

END_VAR

VAR_OUTPUT Z: BOOL; END_VAR

 Z :=X AND Y; (* ST

言語の例 *)

END_PROGRAM

6b

立下りエッジ入力のテキスト表現宣言

上記を参照。

7a

立上りエッジ入力のグラフィック表現宣言(>)

PROGRAM

      (*

外部インタフェース *)

 +

--------- +

 |

AND_EDGE

|

 BOOL--

> X Z

| --BOOL

 |

|

 BOOL--

< Y |

 |

|

 +

--------- +

      (* FB

ボディ *)

 +

-- +

 |

|

 X--

| |

--Z

 Y--

| |

 +

-- +

END_PROGRAM

7b

立下りエッジ入力のグラフィック表現宣言(<)

上記を参照。

8a

PROGRAM

内での VAR_GLOBAL...END_VAR 宣言

VAR_GLOBAL  z1:  BYTE;  END_VAR

8b

PROGRAM

型宣言内での VAR_GLOBAL CONSTANT 宣言

VAR_GLOBAL  CONSTANT  z2:  BYTE;  END_VAR

9

PROGRAM

内での VAR_ACCESS...END_VAR 宣言

VAR_ACCESS

  ABLE: STATION_1.%IX1.1: BOOL READ_ONLY ;

  BAKER:

STATION_1.P1.x2:

UINT

READ_WRITE;

END_VAR

注記  項目 No.2a から No.7b までは,ファンクションブロックに関する表 40 の同じ項目に相当する。

6.6.5

クラス

6.6.5.1

概要

クラスは,オブジェクト指向の考え方を取り入れた言語要素であり,次の概念が特徴である。

・  公開される変数と隠蔽される変数とに区別したデータ構造の定義

・  データ構造の要素の下で実行されるメソッド

・  メソッド(アルゴリズム)及びデータ構造からなるクラス

・  メソッドのプロトタイプをもつインタフェース及びインタフェースの実装


116

B 3503

:2016 (IEC 61131-3:2013)

・  インタフェース及びクラスの継承

・  クラスのインスタンス化

注記 C#,C++,Java,UML などのような IT プログラム言語で用いる用語であるクラス及びオブジ

ェクトは,この規格の PLC プログラム言語で用いる用語である型及びインスタンスに相当する。

これを次に示す。

IT プログラム言語:C#,C++,Java,UML

標準の PLC 言語

クラス

(=クラスの型)

ファンクションブロック及びクラスの型

オブジェクト  (=クラスのインスタンス)

ファンクションブロック及びクラスのイ
ンスタンス

実装及び拡張メカニズムを用いたインタフェース及びクラスの継承は,

図 16 による。

図 16−継承及びインタフェース実装の概要

クラスは,オブジェクト指向プログラミングのために用意した POU である。クラスは,基本的に変数及

びメソッドを含む。クラスは,メソッドの呼出し又は変数へのアクセスの前にインスタンス化しなければ

ならない。

6.6.5.2

クラス宣言

クラス宣言の項目は,

表 48 に規定する。

a)

予約語 CLASS に続けて,宣言するクラス名を示す識別子

b)

終了予約語 END_CLASS

c)

VAR_EXTERNAL

構文によって宣言される変数の値は,クラス内から変更できる。

d)  VAR_EXTERNAL CONSTANT

構文によって宣言される定数の値は,クラス内から変更できない。

e)

必要であれば,VAR...END_VAR 構文でクラスの変数の名前と型とを指定する。

f)

変数は初期化してもよい。

g)

VAR

構文(静的)の変数は,PUBLIC 宣言してもよい。パブリック変数は,FB 出力へのアクセスと同

じ構文を用いて,クラス外からアクセスしてもよい。

h)  RETAIN

又は NON_RETAIN 修飾子は,クラスの内部変数に使用できる。

i)

表 16 に規定するアスタリスク“*”表記は,クラスの内部変数の宣言で使用してもよい。

j)

変数には,PUBLIC,PRIVATE,INTERNAL 又は PROTECTED を指定してもよい。アクセス修飾子

PROTECTED

がデフォルトである。

k)

クラスは,基底クラスを拡張するために,他のクラスの継承をサポートしてもよい。

l)

クラスは,複数のインタフェースを実装してもよい。

m)

他のファンクションブロック,クラス及びオブジェクト指向ファンクションブロックのインスタンス

インタフェース

  クラス

ファンクションブロック

拡張する

拡張する

拡張する

実装する

実装する


117

B 3503

:2016 (IEC 61131-3:2013)

は,変数宣言部 VAR 及び VAR_EXTERNAL 内で宣言できる。

n)

クラス内で宣言したクラスインスタンスは,曖昧さを排除するために(同じ名前解決範囲の)ファン

クションと同じ名前を使用しないほうがよい。

クラスは,ファンクションブロックとは,次の差異がある。

1)

予約語 FUNCTION_BLOCK 及び END_FUNCTION_BLOCK は,それぞれ CLASS 及び END_CLASS に

よって置き換えられる。

2)

変数は,VAR 構文の中でだけ宣言できる。VAR_INPUT,VAR_OUTPUT,VAR_IN_OUT 及び VAR_TEMP

では宣言できない。

3)

クラスにはボディはない。クラスはメソッドだけを定義してもよい。

4)

クラスのインスタンスの呼出しはできない。クラスのメソッドだけが呼出しできる。

クラスの実装者は,

表 48 に規定する項目の本質的に一貫したサブセットを提供しなければならない。

表 48−クラス

No.

説明

解説

1

CLASS ... END_CLASS

クラス定義

1a

FINAL

指定子

クラスは,基底クラスとして使用できない。

ファンクションブロックから適用 

2a

変数 VAR ... END_VAR の宣言

VAR B: REAL; END_VAR

2b

変数の初期化

VAR B: REAL :=12.1; END_VAR

3a

内部変数に対する RETAIN 修飾子

VAR RETAIN X: REAL; END_VAR

3b

内部変数に対する NON_RETAIN 修飾子

VAR NON_RETAIN X: REAL; END_VAR

4a

クラス型宣言内での VAR_EXTERNAL 宣言

等価例については,

表 40 参照

4b

ク ラ ス 型 宣 言 内 で の VAR_EXTERNAL

CONSTANT

宣言

等価例については,

表 40 参照

メソッド及び指定子 

5

METHOD...END_METHOD

メソッド定義

5a

PUBLIC

指定子

メソッドはどこから呼び出してもよい。

5b

PRIVATE

指定子

メソッドは,定義された POU の内側からだけ呼出しできる。

5c

INTERNAL

指定子

メソッドは,同じ名前空間の内側からだけ呼出しできる。

5d

PROTECTED

指定子

メソッドは,定義された POU の内側及びその派生物からだけ呼

出しできる(デフォルト)

5e

FINAL

指定子

メソッドはオーバライドされない。

継承 

これらの項目は,

表 53 の継承と同じである。

6

EXTENDS

クラスから継承したクラス(

注記  FB からの継承はできない。)

7

OVERRIDE

メソッドは基底メソッドにオーバーライドする(6.6.7.3 参照)

8

ABSTRACT

抽象クラス−少なくとも一つのメソッドが抽象的である。

抽象メソッド−このメソッドが抽象的である。

アクセス参照 

9a

THIS

自身のメソッドの参照に用いる。

9b

SUPER

基底クラス内のメソッドのアクセス参照に用いる。

変数アクセス修飾子 

10a

PUBLIC

指定子

変数は,どこからアクセスしてもよい。

10b

PRIVATE

指定子

変数は,定義された POU の内側からだけ呼出しできる。

10c

INTERNAL

指定子

変数は,同じ名前空間の内側からだけ呼出しできる。

10d

PROTECTED

指定子

変数は,定義された POU の内側及びその派生物からだけ呼出し

できる(デフォルト)


118

B 3503

:2016 (IEC 61131-3:2013)

表 48−クラス(続き)

No.

説明

解説

多態性 

11a

VAR_IN_OUT

による多態性

(基底)クラスの VAR_IN_OUT は,派生クラスのインスタンス

を代入してもよい。

11b

参照による多態性

(基底)クラスの参照は,派生クラスのインスタンスの参照を

代入してもよい。

次の例は,クラス宣言及びその使用法を示すものである。

例  クラス宣言

Class CCounter

    VAR

    m_iCurrentValue:  INT;

(* デフォルトは 0 である  *)

    m_bCountUp:  BOOL:=TRUE;

  END_VAR

  VAR  PUBLIC

    m_iUpperLimit:  INT:=

+10000;

    m_iLowerLimit:  INT:=

−10000;

  END_VAR

METHOD Count

(* ボディだけ  *)

    IF (m_bCountUp AND m_iCurrentValue < m_iUpperLimit) THEN

        m_iCurrentValue:=m_iCurrentValue

+1;

    END_IF;

    IF (NOT m_bCountUp AND m_iCurrentValue > m_iLowerLimit) THEN

        m_iCurrentValue:=m_iCurrentValue-1;

    END_IF;

END_METHOD

METHOD SetDirection

  VAR_INPUT

     bCountUp:  BOOL;

  END_VAR

  m_bCountUp:=bCountUp;

END_METHOD

END_CLASS

6.6.5.3

クラスインスタンス宣言

クラスインスタンスは,構造体変数の定義と同じように宣言しなければならない。

クラスインスタンスを宣言するとき,

表 49 に示すとおり,クラスインスタンスのパブリック変数は,ク

ラス識別子の後に,代入演算子に続けて括弧でくくった初期化リストで初期化できる。


119

B 3503

:2016 (IEC 61131-3:2013)

・  初期化リストに指定されていない要素は,クラス宣言の初期値をもたなければならない。

表 49−クラスインスタンス宣言

No.

説明

1

デフォルト初期化を伴うクラスインスタンスの宣

VAR

 MyCounter1:  CCounter;

END_VAR

2

パブリック変数の初期化を伴うクラスインスタン

スの宣言

VAR

MyCounter2: CCounter :=

 (m_iUpperLimit:=20000,

m_iLowerLimit:=

−20000);

END_VAR

6.6.5.4

クラスのメソッド

6.6.5.4.1

概要

プログラマブルコントローラ言語では,オブジェクト指向プログラミングでよく知られているメソッド

の概念は,クラス定義の中に定める付加的な言語要素として採用する。

メソッドは,

クラスインスタンスのデータに対して行う演算を定義するために採用してもよい。

詳細は,

次の細分箇条に定義する。

6.6.5.4.2

シグネチャ

この規格では,3.87 で定義するシグネチャは,METHOD のパラメータインタフェースの同一性を明確に

定義する情報の集合である。

シグネチャは,次で構成する。

・  メソッド名

・  結果型

・  変数名,データ型及び全てのそのパラメータの順序,すなわち,入力,出力及び入出力変数

ローカル変数は,シグネチャの一部ではない。VAR_EXTERNAL 及びコンスタント変数は,シグネチャに

関係しない。

PUBLIC

又は PRIVATE のようなアクセス修飾子は,シグネチャには関係しない。

6.6.5.4.3

メソッドの宣言及び実行

クラスは,メソッドをもってもよい。

メソッドの宣言は,次の規則を順守しなければならない。

a)

メソッドは,クラスのスコープ内で宣言する。

b)

メソッドは,この規格で指定するいずれかのプログラム言語で定義してもよい。

c)

テキスト形式の宣言では,メソッドはクラスの変数宣言の後に記載する。

d)

メソッドは,自身の VAR_INPUT,内部一時変数 VAR 及び VAR_TEMP,VAR_OUTPUT,VAR_IN_OUT

及びメソッド結果を宣言してもよい。

予約語 VAR_TEMP 及び VAR は同じ意味をもち,両方共内部変数用に許される(VAR はファンクシ

ョンで用いる。

e)

メソッドの宣言は,アクセス修飾子 PUBLIC,PRIVATE,INTERNAL 又は PROTECTED の一つを含ま

なければならない。アクセス修飾子が与えられていなければ,メソッドはデフォルトで PROTECTED

とする。


120

B 3503

:2016 (IEC 61131-3:2013)

f)

メソッドの宣言は,追加の予約語 OVERRIDE 又は ABSTRACT を含んでもよい。

注記 1  メソッドの多重定義は,この規格の適用範囲外である。

メソッドの実行は,次の規則を順守しなければならない。

g)

実行するとき,メソッドはその入力を読み込み,一時変数を用いて,その出力及び結果を計算する。

h)

メソッドの結果は,メソッド名に代入する。

i)

全てのメソッドの変数及び結果は(ファンクションの変数のように)一時的なものである。すなわち,

値はあるメソッドの実行から次のメソッドの実行まで保存されない。したがって,メソッド出力変数

の評価は,メソッド呼出しの直接のコンテキスト内だけで可能である。

j)

各メソッドの変数名及びクラスの変数名は,それぞれ異なる(固有の)ものでなければならない。

それぞれ異なるメソッドのローカル変数名は,同じでもよい。

k)

全てのメソッドは,クラス内で宣言された静的変数及び外部変数への読出し/書込みのアクセスをも

つ。

l)

全ての変数及び結果は,多値でもよい。すなわち,配列又は構造体でもよい。

ファンクションと同様に定義されるので,メソッドの結果は式内のオペランドとして用いてもよい。

m)

実行するとき,メソッドはこのクラス内で定める別のメソッドを使用してもよい。このクラスインス

タンスのメソッドは,予約語 THIS を用いて呼び出さなければならない。

次の例は,クラスの簡略化された宣言を二つのメソッド及びメソッドの呼出しで,図解する。


121

B 3503

:2016 (IEC 61131-3:2013)

例 1

注記 2

メソッドのアルゴリズムは,

それら自身のデータ及びクラ

ス デ ー タ へ の ア ク セ ス を も

つ。

(一時パラメータは括弧でく

くる。

メソッドをもつクラス(型)の宣言

CLASS name

 VAR vars; END_VAR

 VAR_EXTERNAL externals; END_VAR

METHOD name_1

 VAR_INPUT  inputs;  END_VAR

 VAR_OUTPUT outputs; END_VAR

END_METHOD

METHOD name_i

 VAR_INPUT  inputs;  END_VAR

 VAR_OUTPUT outputs; END_VAR

END_METHOD

END_CLASS

注記 3

メソッドのこのグラフィック

表現は,図解のためだけのも

のである。

メソッドの呼出し

a)  結果の使用法(結果は宣言されている)
  R1:= I.method1(inm1 :=A, outm1=>

Y);

b)  呼出しの使用法(結果の宣言は任意で

ある。

  I.method1(inm1 :=A, outm1=> Y);

外部からのメソッド入力の代入

I.inm1  :=  A;//

  認められない;

外部からのメソッド出力の読出し

Y := I.outm1;//

  認められない,

例 2  カウントアップのための二つのメソッドをもつクラス COUNTER。メソッド UP5 は同じクラス

のメソッドの呼出し方法を示す。

CLASS COUNTER

  VAR

    CV:  UINT;

    Max:  UINT  :=1000;

  END_VAR

//  カウンタの現在値

Class 

(形) 

externals

vars

Object (インスタンス)

(vars)

(inputs)

(result)

m_1 algorithm

(outputs)

(vars)

Method name_i 

(inputs)

(result)

m_i algorithm

(outputs)

Method name_1 

(in-outs)

inm1

I

ClassX.name_1

outm1

A

Y


122

B 3503

:2016 (IEC 61131-3:2013)

  METHOD  PUBLIC  UP:  UINT

  VAR_INPUT INC: UINT; END_VAR

  VAR_OUTPUT QU: BOOL; END_VAR

    IF  CV  <=Max  -  INC

       THEN  CV  :=CV  +  INC;

 QU

:=FALSE;

       ELSE  QU  :=TRUE;

    END_IF

    UP  :=CV;

  END_METHOD

  METHOD PUBLIC UP5: UINT

  VAR_OUTPUT QU: BOOL; END_VAR

   UP5 :=THIS.UP(INC :=5, QU=> QU);

  END_METHOD

END_CLASS

// INC によるカウントアップのメソッド

//  インクリメント

//  上限の検出

//  現在値のカウントアップ

//  上限に到達

//  メソッドの結果

// 5 カウントアップ

//  上限に到達

//  内部のメソッド呼出し

6.6.5.4.4

メソッドの呼出し表現

メソッドは,テキスト言語(

表 50)及びグラフィック言語で呼び出すことができる。

全ての言語表現で,メソッドの呼出しには二つの異なるケースがある。

a)

内部呼出し  自身のクラスインスタンスのメソッドの内部呼出し。メソッド名は,

“THIS.”の後にな

ければならない。この呼出しは,自身のクラスインスタンス内の,別のメソッドから実行してもよい。

b)

外部呼出し  別のクラスのインスタンスのメソッドの外部呼出し。テキスト言語では,メソッド名は,

インスタンス名及び“.”の後になければならない。この呼出しは,インスタンスが宣言されるメソッ

ド又はファンクションブロックボディから実行してもよい。

注記  次の構文を用いる。

−  構文 A()は,グローバルファンクション A を呼び出すために用いる。

−  構文 THIS.A()は,自身のインスタンスのメソッドを呼び出すために用いる。

−  構文 I1.A()は,別のインスタンス I1 のメソッド A を呼び出すために用いる。

6.6.5.4.5

テキスト形式の呼出し表現

結果を伴うメソッドは,式のオペランドとして呼び出す。

結果を伴わないメソッドは,式の内部で呼び出さない。

メソッドは,正式又は略式で呼び出すことができる。

メソッドの外部呼出しは,外部クラスインスタンスの名前も必要とする。

例 1  ... class_instance_name.method_name (parameters)

メソッドの内部呼出しは,インスタンス名の代わりに THIS を用いる。

例 2  ... THIS.method_name (parameters)


123

B 3503

:2016 (IEC 61131-3:2013)

表 50−メソッドのテキスト形式の呼出し−正式及び略式パラメータリスト

No.

説明

1a

完全な正式呼出し(テキスト形式だけ)

A :=COUNTER.UP(EN:=TRUE, INC :=B,

START:=1, ENO=>%MX1, QU=> C);

1b

不完全な正式呼出し(テキスト形式だけ)

A :=COUNTER.UP(INC :=B, QU=> C); 
 
START 変数のデフォルト値は 0(ゼロ)になる。

2

略式呼出し(テキスト形式だけ)

(順序どおり全てのパラメータを記述する。

EN/ENO

を使用する場合には,項目 No.1a 又は項目

No.1b を使用する。

A :=COUNTER.UP(B, 1, C);

 
この呼出しは項目 No.1a に等しいが,EN/ENO はない。

6.6.5.4.6

グラフィック表現

メソッド呼出しのグラフィック表現は,ファンクション又はファンクションブロックの表現と類似して

いる。メソッド呼出しのグラフィック表現は,ブロックの左側に入力があり,ブロックの右側に出力があ

る長方型のブロックである。

メソッド呼出しは,

表 18 に定義する EN 及び ENO をサポートしてもよい。

・  内部呼出しは,ピリオドによって分けられたクラス名及びメソッド名をブロックの内側に示す。

予約語 THIS は,ブロックの上に位置しなければならない。

・  外部呼出しは,ピリオドによって分けられたクラス名及びメソッド名をブロックの内側に示す。

クラスインスタンス名は,ブロックの上に位置しなければならない。

6.6.5.4.7

エラー

メソッド呼出しと無関係であるメソッド出力の使用は,エラーとして扱わなければならない。

次の例を参照。

例  内部及び外部メソッド呼出し

    VAR

  CT:

COUNTER;

  LIMIT: BOOL;

  VALUE: UINT;

  END_VAR

a)

構造化テキスト(ST)では

1)

メソッドの内部呼出し

VALUE :=THIS.UP (INC :=5, QU=> LIMIT);

2)

メソッドの外部呼出し

VALUE :=CT.UP (INC :=5, QU=> LIMIT);


124

B 3503

:2016 (IEC 61131-3:2013)

b)

ファンクションブロック図(FBD)では

1)

メソッドの内部呼出し

 THIS

 +

----------

+

 On

--

|

COUNTER.UP

| -- VALUE

 |

----------

|

 5

--

| INC |

 |

QU

| -- LIMIT

 +

----------+

別のメソッドによってクラス内で呼ばれる。

THIS

は必須である。

メソッド UP は結果を返す。

グラフィック表現は,図解のためだけのもの

である。

変数 On は,メソッド呼出しを有効にする。

2)

メソッドの外部呼出し

CT

 +

----------

+

 On

--

|

COUNTER.UP

| -- VALUE

 |

----------

|

 5

--

| INC |

 |

QU

| -- LIMIT

 +

----------

+

CT は,別のクラス又は FB 内で宣言されたク

ラスインスタンスである。

メソッド又はファンクションブロックボディ

によって呼び出す。

メソッド UP は結果を返す。

グラフィック表現は,図解のためだけのもの

である。

変数 On は,メソッド呼出しを有効にする。

c)

エラー:グラフィック形式及びテキスト形式の呼出しがないメソッド出力の使用

 |

CT.UP

VALUE

 |

-----

| |

-----(  )---

 |

 VALUE := CT.UP;

メソッドがある実行から次の実行までその出

力を保存しないため,メソッド出力のこの評

価は不可能である。

6.6.5.5

クラス継承(EXTENDSSUPEROVERRIDEFINAL

6.6.5.5.1

概要

PLC 言語では,一般オブジェクト指向プログラミングに定める継承の概念を,新しい要素を作り出す方

法として適用させる。

クラスの継承は,

図 17 に示す。既存のクラスに基づいて,一つ以上のクラスは派生してもよい。これは,

複数回繰り返してもよい。

注記  “多重継承“は,サポートされていない。

派生(子)クラスは,一般的に追加メソッドによって基底(親)クラスを拡張する。

用語である“基底”クラスは,全ての“祖先”

,すなわち,親及びそれらの親クラスなどを表す。


125

B 3503

:2016 (IEC 61131-3:2013)

図 17−クラスの継承(図解)

6.6.5.5.2

クラスの EXTENDS

クラスは,予約語 EXTENDS を用いた一つの既存のクラス(基底クラス)から派生してもよい。

例  CLASS X1 EXTENDS X;

次の規則を適用しなければならない。

a)

派生クラスは,次の例外を除いて,更なる宣言なしにその基底クラスから全てのメソッド(ある場合

には)を継承する。

・  PRIVATE メソッドは,継承されない。

・  INTERNAL メソッドは,名前空間の外側からは継承されない。

b)

派生クラスは,その基底クラスから全ての変数(ある場合には)を継承する。

c)

派生クラスは,一つの基底クラスからだけ継承する。

多重継承は,この規格ではサポートしていない。

注記  クラスは,(予約語 IMPLEMENTS を用いて)一つ以上のインタフェースを実装してもよい。

d)

派生クラスは,基底クラスを拡張してもよい。すなわち,派生クラスは基底クラスの継承したメソッ

ド,変数に加えて,自身のメソッド及び変数をもってもよい。したがって,新しい機能をつくりだし

てもよい。

e)

基底クラスとして用いられるクラスは,自身が派生クラスでもよい。そのとき,クラスは継承してい

たメソッド及び変数も派生クラスに渡す。

これは複数回繰り返してもよい。

f)

基底クラスの定義を変更すれば,全ての派生クラス(及びそれらの子クラス)もそれらの機能を変更

する。

6.6.5.5.3

メソッドの OVERRIDE

派生クラスは,メソッドの自身の実装によって,一つ以上の継承したメソッドをオーバライド(置換)

してもよい。基底メソッドをオーバライドするには,次の規則を適用する。

a)

継承したメソッドをオーバライドするメソッドは,派生クラスのスコープ内で同じシグネチャ(メソ

ッド名及び変数)をもたなければならない。

b)

継承したメソッドをオーバライドするメソッドは,次の特性をもたなければならない。

・  予約語 OVERRIDE が予約語 METHOD の後に続く。

・  派生クラスは,同じ名前空間内の PUBLIC,PROTECTED 又は INTERNAL である基底のメソッドに

CLASS X11 EXTENDS X1

METHOD

(ma), (mb), (mc), (md), mf

CLASS X12 EXTENDS X1

METHOD

(ma), (mb), (mc), (md), mg 

CLASS C

METHOD mf

EXTENDS

を用いた

クラス継承

CLASS C1 EXTENDS C

METHOD

(mf), mg

EXTENDS

CLASS X

METHOD

(ma), (mb), (mc), md 

CLASS X1 EXTENDS X

METHOD OVERRIDE mb

METHOD

(ma), mb, (mc), (md)

EXTENDS


126

B 3503

:2016 (IEC 61131-3:2013)

アクセスする。

・  新しいメソッドは,同じアクセス修飾子をもたなければならない。FINAL 指定子は,オーバライド

されたメソッドに使用してもよい。

例  METHOD OVERRIDE mb;

6.6.5.5.4

クラス及びメソッドの FINAL

FINAL

指定子をもつメソッドは,オーバライドしてはならない。

FINAL

指定子をもつクラスは,基底クラスにはなれない。

例 1  METHOD FINAL mb;

例 2  CLASS FINAL c1;

6.6.5.5.5

EXTENDS

SUPEROVERRIDEFINAL

のエラー

次の状況は,エラーとして扱わなければならない。

a)

派生クラスが,その基底クラスの中で定義又は継承されている変数の名前を用いて,変数を定義して

いる。この規則は,PRIVATE 変数には適用しない。

b)

派生クラスが,その基底クラスの中に既に含まれている変数名を用いて,メソッドを定義している。

c)

派生クラスが,直接であれ間接的であれ,それ自身の派生クラスから派生している。すなわち,再帰

は認められない。

d)

クラスは,基底クラスのメソッドをオーバライドしていないメソッドを予約語 OVERRIDE を用いて定

義している。

例  継承及びオーバライド

クラス LIGHTROOM を拡張するクラス

CLASS LIGHTROOM

VAR LIGHT: BOOL; END_VAR

METHOD PUBLIC DAYTIME

  LIGHT  :=FALSE;

END_METHOD

METHOD PUBLIC NIGHTTIME

  LIGHT  :=TRUE;

END_METHOD

END_CLASS

CLASS LIGHT2ROOM EXTENDS LIGHTROOM

VAR LIGHT2: BOOL; END_VAR  //

二つ目の LIGHT

METHOD PUBLIC OVERRIDE DAYTIME

  LIGHT  :=FALSE;

//

親クラスの変数へのアクセス

  LIGHT2  :=FALSE;

//

    固有の実装

END_METHOD


127

B 3503

:2016 (IEC 61131-3:2013)

METHOD PUBLIC OVERRIDE NIGHTTIME

  LIGHT  :=TRUE;

//

親クラスの変数へのアクセス

  LIGHT2  :=TRUE;

//

  固有の実装

END_METHOD

END_CLASS

6.6.5.6

動的名前束縛(OVERRIDE

名前束縛は,メソッド名とメソッド実装との関連付けである。プログラムを実行する前の名前の束縛(例

えば,コンパイラによる。

)は静的又は“事前”束縛と呼ぶ。プログラム実行中に行われる束縛は,動的又

は“実行時”束縛と呼ぶ。

内部メソッドの呼出しの場合,予約語 OVERRIDE によるオーバライド機能は,名前束縛の静的形式と動

的形式との違いを生じる。

静的束縛  内部メソッド呼出しを用いてメソッド名をクラスのメソッド実装に結び付ける,又は内部

メソッド呼出しを行うメソッドを含む。

動的束縛  メソッド名をクラスインスタンスの実際の型のメソッド実装に結び付ける。

例 1  動的名前束縛

束縛に影響を及ぼすオーバライド

//

宣言

CLASS CIRCLE

METHOD PUBLIC PI: LREAL

//

メソッドは,より正確でない PI を与える。

  PI  :=3.1415;

END_METHOD

METHOD PUBLIC CF: LREAL

//

メソッドは,円周を与える。

  VAR_INPUT DIAMETER: LREAL; END_VAR

  CF :=THIS.PI() * DIAMETER;

//

メソッド PI の内部呼出し

END_METHOD //

PI

の動的束縛を使用

END_CLASS

CLASS CIRCLE2 EXTENDS CIRCLE

// PI

をオーバライドするメソッドをもつクラス

METHOD PUBLIC OVERRIDE PI: LREAL

  // メソッドは,より正確な PI を与える。

  PI  :=3.1415926535897;

END_METHOD

END_CLASS

PROGRAM TEST

VAR


128

B 3503

:2016 (IEC 61131-3:2013)

    CIR1: CIRCLE;

// CIRCLE

のインスタンス

    CIR2: CIRCLE2;

// CIRCLE2

のインスタンス

    CUMF1: LREAL;

  CUMF2:

LREAL;

  DYNAMIC:  BOOL;

END_VAR

    CUMF1 :=CIR1.CF(1.0);

// CIR1

のメソッドの呼出し

    CUMF2 :=CIR2.CF(1.0);

// CIR2

のメソッドの呼出し

    DYNAMIC :=CUMF1 <> CUMF2;

//

 動的束縛の結果,真となる。

END_PROGRAM

この例では,クラス CIRCLE は円の円周を計算(CF)する精度が低いメソッド PI の内部呼出しを含む。

派生クラス CIRCLE2 は,より正確な PI の精度でこのメソッドをオーバライドする。

メソッド PI の呼出しは,CF の呼出しが実行されたインスタンスの型によって,CIRCLE.PI 又は

CIRCLE2.PI

のいずれかを参照。ここでは CUMF2 が CUMF1 より正確である。

例 2  上記テキスト形式の例の簡略図

6.6.5.7

自クラス及び基底クラスのメソッド呼出し(THISSUPER

6.6.5.7.1

概要

自クラスの内側又は外側で定義されたメソッドにアクセスするために,予約語 THIS 及び SUPER が利用

できる。

CLASS CIRCLE2 EXTENDS CIRCLE

METHOD PUBLIC CF //

継承された

VAR_INPUT Diameter

 CF  :

=THIS.PI()*Diameter;

CLASS CIRCLE

METHOD PUBLIC PI

 PI  :

=3.1415;

METHOD PUBLIC CF

VAR_INPUT Diameter

 CF  :

=THIS.PI()*Diameter;

(CIR1)

(CIR2)

PROGRAM TEST

VAR

CIR1:CIRCLE;

CIR2:CIRCLE2; 

... 

EXTENDS 

宣言

METHOD PUBLIC OVERRIDE PI

 PI  :

=3.1415926535897;

 CUMF1  :

=CIR1.CF(1.0);

    //  CUMF1

=3.1415

 CUMF2  :

=CIR2.CF(1.0);

// CUMF2

=3.1415926535897


129

B 3503

:2016 (IEC 61131-3:2013)

6.6.5.7.2

THIS

THIS

は,自クラスインスタンスへの参照である。

予約語 THIS を用いて,このクラスのインスタンスの別のメソッドによって自クラスインスタンスのメ

ソッドを呼び出すことができる。

THIS

は,INTERFACE の型の変数に渡してもよい。

予約語 THIS は,別のインスタンス付きで使用できない。例えば,式 myInstance.THIS は許されない。

例  予約語 THIS の使用

これらの例は,便宜のために上記例をコピーしたものである。

INTERFACE ROOM

   METHOD  DAYTIME   END_METHOD

//

昼の間に呼び出す。

   METHOD  NIGHTTIME  END_METHOD

//

夜の間に呼び出す。

END_INTERFACE

FUNCTION_BLOCK ROOM_CTRL

//

  VAR_INPUT

    RM:  ROOM; //

入力変数の型としてのインタフェース ROOM

  END_VAR

  VAR_EXTERNAL

    Actual_TOD:  TOD; //

グローバルの時間定義

  END_VAR

  IF  (RM=NULL)

//

重要:有効なリファレンスをテストしてください!

  THEN  RETURN;

  END_IF;

  IF Actual_TOD >=TOD#20:15 OR Actual_TOD <=TOD#6:00

  THEN  RM.NIGHTTIME();

//  RM

のメソッド呼出し

  ELSE  RM.DAYTIME();

  END_IF;

END_FUNCTION_BLOCK

//

自インスタンスを割付けるために予約語 THIS を適用する

CLASS DARKROOM IMPLEMENTS ROOM

//

上記の ROOM 参照

VAR_EXTERNAL

  Ext_Room_Ctrl:  ROOM_CTRL;

//

上記の ROOM_CTRL 参照

END_VAR

METHOD PUBLIC DAYTIME;

END_METHOD

METHOD PUBLIC NIGHTTIME;

END_METHOD

METHOD PUBLIC EXT_1

  Ext_Room_Ctrl(RM  :=THIS); //

自身のインスタンスで Ext_Room_Ctrl を呼び出す。


130

B 3503

:2016 (IEC 61131-3:2013)

END_METHOD

END_CLASS

6.6.5.7.3

SUPER

SUPER

は,基底クラス実装のメソッドに対するアクセスを提供する。

予約語 SUPER を用いて,基底(親)クラスインスタンスで有効なメソッドを呼び出すことができる。し

たがって,静的名前束縛が行われる。

予約語 SUPER は,別のインスタンス付きで使用できない。例えば,式 myRoom.SUPER.DAYTIME()は

許されない。

予 約 語 SUPER は , さ ら な る 派 生 メ ソ ッ ド に ア ク セ ス す る た め に 使 用 で き な い 。 例 え ば ,

SUPER.SUPER.aMethod

はサポートされていない。

例  予約語 SUPER の使用及び多態性

上記例への代替実装として SUPER を用いた LIGHT2ROOM

便宜上,前述の例の一部を転記する。

INTERFACE ROOM

   METHOD  DAYTIME   END_METHOD

//

昼の間に呼び出す。

   METHOD  NIGHTTIME  END_METHOD

//

夜の間に呼び出す。

END_INTERFACE

CLASS LIGHTROOM IMPLEMENTS ROOM

VAR LIGHT: BOOL; END_VAR

METHOD PUBLIC DAYTIME

  LIGHT  :=FALSE;

END_METHOD

METHOD PUBLIC NIGHTTIME

  LIGHT  :=TRUE;

END_METHOD

END_CLASS

FUNCTION_BLOCK ROOM_CTRL

  VAR_INPUT

    RM:  ROOM; //

変数の型としてのインタフェース ROOM

  END_VAR

  VAR_EXTERNAL

    Actual_TOD:  TOD; //

グローバルの時間定義

  END_VAR

  IF  (RM=NULL)

//

重要:有効なリファレンスをテストしてください!

  THEN  RETURN;


131

B 3503

:2016 (IEC 61131-3:2013)

  END_IF;

    IF  Actual_TOD >=TOD#20:15 OR

 Actual_TOD

<=TOD#06:00

  THEN  RM.NIGHTTIME();

//  LIGHTROOM.NIGHTTIME

又は

 //

LIGHT2ROOM.NIGHTTIME

に対する

 //

RM

(動的束縛)のメソッドを呼び出す。

  ELSE  RM.DAYTIME();

  END_IF;

END_FUNCTION_BLOCK

//  基底クラスのメソッドを呼び出すために予約語 SUPER を適用する

CLASS LIGHT2ROOM EXTENDS LIGHTROOM

//

  上記参照

VAR LIGHT2: BOOL; END_VAR

//

  二つ目の LIGHT

METHOD PUBLIC OVERRIDE DAYTIME

  SUPER.DAYTIME();

//  LIGHTROOM

のメソッドの呼出し

  LIGHT2  :=TRUE;

END_METHOD

METHOD PUBLIC OVERRIDE NIGHTTIME

  SUPER.NIGHTTIME()  //  LIGHTROOM

のメソッドの呼出し

    LIGHT2 :=FALSE;

END_METHOD

END_CLASS

//

多態性及び動的束縛の使用

PROGRAM C

VAR

  MyRoom1:  LIGHTROOM;

//

上記参照

  MyRoom2:  LIGHT2ROOM;

//

上記参照

  My_Room_Ctrl:  ROOM_CTRL;  //

上記参照

END_VAR

  My_Room_Ctrl(RM :=MyRoom1);

// LIGHTROOM

のメソッドを呼び出す。

 My_Room_Ctrl

の呼出し

 My_Room_Ctrl(RM :=MyRoom2);

// LIGHT2ROOM

のメソッドを呼び出す。

 My_Room_Ctrl

の呼出し

END_PROGRAM

6.6.5.8

ABSTRACT

クラス及び ABSTRACT メソッド

6.6.5.8.1

概要

ABSTRACT

モディファイアは,クラス又は単一メソッドと一緒に使用してもよい。実装者は,

表 48 

従ってこれらの項目の実装を宣言しなければならない。


132

B 3503

:2016 (IEC 61131-3:2013)

6.6.5.8.2

抽象クラス

クラス宣言内での ABSTRACT モディファイアの使用は,クラスは継承で用いられる別のクラスの基底型

になるように作られていることを示す。

例  CLASS ABSTRACT A1

抽象クラスは,次の特性をもつ。

・  抽象クラスは,インスタンス化できない。

・  抽象クラスは,少なくとも一つの抽象メソッドを含まなければならない。

抽象クラスから派生した(非抽象)クラスは,全ての継承した抽象メソッドの実際の実装を含まなけれ

ばならない。

抽象クラスは,入力又は入出力パラメータの型として使用してもよい。

6.6.5.8.3

抽象メソッド

抽象クラスから派生するクラスは,派生クラス自身が ABSTRACT と示されていない限り,抽象クラス内

の ABSTRACT と示される,全てのメソッドを実装しなければならない。

インタフェースからクラスに引き継がれるメソッドは,実装されていなければ,予約語 ABSTRACT を

使用しなければならない。

予約語 ABSTRACT は,予約語 OVERRIDE を組み合わせて使用してはならない。

予約語 ABSTRACT は,抽象クラスのメソッドに対してだけ使用できる。

例  METHOD PUBLIC ABSTRACT M1

6.6.5.9

メソッドアクセス修飾子(PROTECTEDPUBLICPRIVATEINTERNAL

メソッドごとに,どこからメソッドの呼出しが許容されるかを定義しなければならない。それらは,予

約語 METHOD に続けて,次のアクセス修飾子の一つを用いて定義する。

・  PROTECTED  継承を実装する場合に,アクセス修飾子 PROTECTED が適用できる。それらのメソッド

はクラスの内側から及び全ての派生クラスの内側からだけアクセス可能であることを示している。

PROTECTED

はデフォルトであり,省略できる。

注記  継承を実装しない場合,デフォルトのアクセス修飾子 PROTECTED は,PRIVATE と同じ結果

になる。

・  PUBLIC  アクセス修飾子 PUBLIC は,クラスを使用できる任意の場所からアクセスできるメソッド

であることを示す。

・  PRIVATE  アクセス修飾子 PRIVATE は,クラス自身の内側からだけアクセスできるメソッドである

ことを示す。

・  INTERNAL  名前空間を実装する場合,アクセス修飾子 INTERNAL が適用できる。INTERNAL は,ク

ラスを宣言する NAMESPACE 内からだけメソッドにアクセスできないことを表す。

メソッドのプロトタイプへのアクセスは,暗黙で常に PUBLIC である。したがって,メソッドのプロト

タイプに対してはアクセス修飾子を用いない。

不適切な使用は,全てエラーとして扱わなければならない。

例  メソッド用アクセス修飾子

クラス C で定義されているメソッドのアクセス可否(呼出し)の図

a)

アクセス修飾子:PUBLIC,PRIVATE,INTERNAL,PROTECTED

−  PUBLIC  クラス B(クラス C でも)の内側からの呼出し M1 によって M1 にアクセス可


133

B 3503

:2016 (IEC 61131-3:2013)

−  PRIVATE  クラス C の内側だけからの呼出し M2 によって M2 にアクセス可能

−  INTERNAL  NAMESPACE A(クラス B,クラス C でも)の内側からの呼出し M3 によ

って M3 にアクセス可能

−  PROTECTED  クラス C_derived(クラス C でも)の内側からの呼出し M4 によって M4

にアクセス可能

b)

内側又は外側からのメソッド呼出し

− M2 は,クラス C の内側から予約語 THIS を付けて呼び出す。

− M1,M3 及び M4 は,クラス C の外側から呼び出す。ただし,M4 の場合は,予約語 SUPER

を付けて呼び出す。

6.6.5.10

変数アクセス修飾子(PROTECTEDPUBLICPRIVATEINTERNAL

VAR

構文では,どこから変数のアクセスが許容されるかを定義しなければならない。それらは,予約語

VAR

に続けて,次のアクセス修飾子の一つを用いて定義する。

注記  アクセス修飾子は,RETAIN 又は CONSTANT のような別の指定子と任意の順番で組み合わせて

もよい。

・  PROTECTED  継承を実装する場合,アクセス修飾子 PROTECTED が適用できる。アクセス修飾子

PROTECTED

は,クラスの内側から又は全ての派生クラスの内側からだけ変数にアクセスできること

を表す。PROTECTED はデフォルトであり,省略できる。

継承が実装されていても使用されない場合,PROTECTED は PRIVATE と同じ結果になる。

・  PUBLIC  アクセス修飾子 PUBLIC は,クラスを使用できる任意の場所からアクセスできる変数であ

ることを示す。

・  PRIVATE  アクセス修飾子 PRIVATE は,クラス自身の内側からだけアクセスできる変数であること

を示す。

継承が実装されない場合,PRIVATE はデフォルトであり,省略してもよい。

・  INTERNAL  名前空間を実装する場合,アクセス修飾子 INTERNAL が適用できる。INTERNAL は,ア

クセス修飾子クラスが宣言されている NAMESPACE 内からだけ変数にアクセスできることを表す。

不適切な使用は,全てエラーとして扱わなければならない。

呼出し M1

NAMESPACE

 A

CLASS

 B

CLASS C

  PRIVATE METHOD M2

  PUBLIC METHOD M1

  INTERNAL METHOD M3

  PROTECTED METHOD M4

CLASS C_derived

呼出し M2

呼出し M3

a)メソッド呼出し

My_Class

My_Class_derived

METHOD

 Mx

呼出し M4

SUPER

THIS 


134

B 3503

:2016 (IEC 61131-3:2013)

6.6.6

インタフェース

6.6.6.1

概要

オブジェクト指向プログラミングでは,インタフェースの概念は,クラスとしてのその実装からインタ

フェース仕様の分離を規定するために導入する。これによって,共通のインタフェース仕様に対し,異な

る実装が可能になる。

インタフェースの定義は,予約語 INTERFACE とそれに続くインタフェース名から始まり,予約語

END_INTERFACE

で終わる(

表 51 参照)。

インタフェースは,

(暗黙的にパブリックな)メソッドプロトタイプの集合を含んでもよい。

6.6.6.2

インタフェースの使用法

インタフェース仕様は,二つの方法で使用してもよい。

a)

クラス宣言内において  これらは,クラスがどのメソッドを実装しなければならないかを指定する。

例えば,

図 18 に示すようにインタフェース仕様の再使用に用いる。

b)

変数の型として  型がインタフェースである変数は,

(実装)クラスのインスタンスのリファレンスで

あり,使用前に代入しなければならない。インタフェースは,入出力変数として使用してはならない。

表 51−インタフェース

No.

説明

予約語

解説

1

INTERFACE ... END_INTERFACE

インタフェースの定義

メソッド及び指定子 

2

METHOD ... END_METHOD

メソッドの定義

継承 

3

EXTENDS

インタフェースを継承したインタフェースであることを示す。

インタフェースの使用法 

4a

IMPLEMENTS

  インタフェース

クラス宣言においてインタフェースを実装する。

4b

IMPLEMENTS

  複数のインタフェース

クラス宣言において複数のインタフェースを実装する。

4c

変数の型としてのインタフェース

インタフェースの実装(ファンクションブロックインスタンス)

へのリファレンス。

6.6.6.3

メソッドプロトタイプ

メソッドプロトタイプは,インタフェースとともに使用される限定的なメソッド宣言である。メソッド

プロトタイプは,メソッド名,VAR_INPUT,VAR_OUTPUT 及び VAR_IN_OUT 変数,並びにメソッドの(型)

を含む。メソッドプロトタイプの定義は,アルゴリズム(コード)及び一時変数を含まない。すなわち,

メソッドプロトタイプは,実装を含むものではない。

メソッドプロトタイプへのアクセスは,暗黙的に常に PUBLIC である。そのため,メソッドプロトタイ

プではアクセス修飾子は使用しない。

INTERFACE general_drive

についての図解

a)

メソッドプロトタイプ(アルゴリズムなし)

b)

クラス drive_A 及びクラス drive_B(INTERFACE general_drive を実装する。

これらのクラスは,アルゴリズムが異なるメソッドをもつ。


135

B 3503

:2016 (IEC 61131-3:2013)

図 18−派生クラスを伴うインタフェース(図解)

6.6.6.4

クラス宣言でのインタフェースの使用法(IMPLEMENTS

6.6.6.4.1

概要

クラスは,予約語 IMPLEMENTS を用いて一つ以上の INTERFACE を実装できる。

例  CLASS B IMPLEMENTS A1, A2;

クラスは,INTERFACE 仕様に含まれるメソッドプロトタイプによって指定される全てのメソッドアル

ゴリズムを実装しなければならない。

実装しないメソッドプロトタイプがあるクラスは,ABSTRACT を付す必要があり,インスタンス化もで

きない。

注記  メソッドプロトタイプの実装は,メソッド内に追加の一時変数をもつことができる。

6.6.6.4.2

エラー

次の状況は,エラーとして扱わなければならない。

a)

基底(親)インタフェースで定義された全て又は一部のメソッドを実装していないクラスをインスタ

ンス化する場合

b)

インタフェースでの定義と同名ではあるが,シグネチャが異なるメソッドをクラスが実装する場合

c)

インタフェースでの定義と同名ではあるが,アクセス修飾子 PUBLIC 又は INTERNAL が付いていない

メソッドをクラスが実装する場合

6.6.6.4.3

次の例は,クラス内のインタフェースの宣言及びメソッドの外部呼出しによる使用法を示す。

例  クラスがインタフェースを実装する。

//  宣言

INTERFACE ROOM

  METHOD  DAYTIME   END_METHOD

//

日中に呼び出される

  METHOD  NIGHTTIME  END_METHOD

//

夜間に呼び出される

END_INTERFACE

b

) 

クラスがインタフェースを実装する 

a

) 

メソッドプロトタイプ

それぞれ異なるアルゴリズムの

メソッド

METHOD stop 

入力及び出力及び入出力

アルゴリズムY

INTERFACE

general_drive

METHOD start 

入力及び出力及び入出力

(アルゴリズムなし)

CLASS drive_A 

IMPLEMENTS general_drive

METHOD start 

入力及び出力及び入出力

アルゴリズム X

CLASS drive_B 

IMPLEMENTS general_drive

METHOD start 

入力及び出力及び入出力

アルゴリズム V

METHOD stop 

入力及び出力及び入出力

アルゴリズム W

METHOD stop

入力及び出力及び入出力

(アルゴリズムなし)


136

B 3503

:2016 (IEC 61131-3:2013)

CLASS LIGHTROOM IMPLEMENTS ROOM

  VAR  LIGHT:  BOOL;  END_VAR

  METHOD  PUBLIC  DAYTIME

    LIGHT  :=FALSE;

  END_METHOD

  METHOD  PUBLIC  NIGHTTIME

    LIGHT  :=TRUE;

  END_METHOD

END_CLASS

//

使用法(メソッドの外部呼出しによる。

PROGRAM A

  VAR  MyRoom  :  LIGHTROOM;  END_VAR;

//

クラスのインスタンス化

  VAR_EXTERNAL Actual_TOD: TOD; END_VAR;

// TOD

型のグローバル変数を参照。

  IF Actual_TOD >=TOD#20:15 OR Actual_TOD <=TOD#6:00

   THEN  MyRoom.NIGHTTIME();

   ELSE  MyRoom.DAYTIME();

  END_IF;

END_PROGRAM

6.6.6.5

変数の型としてのインタフェースの使用法

6.6.6.5.1

概要

インタフェースは,変数の型として使用してもよい。その変数は,このインタフェースを実装するクラ

スのインスタンスへのリファレンスである。その変数は,使用前にクラスのインスタンスを代入しなけれ

ばならない。この規則は,変数を使用可能な全ての場合に適用する。

次の値は,INTERFACE 型の変数に代入してもよい。

a)

インタフェースを実装するクラスのインスタンス

b)

インタフェースを実装するクラスから(EXTENDS によって)派生したクラスのインスタンス

c)

INTERFACE

と同じ型又は派生した型の別の変数

d)

無効なリファレンスを示す特殊な値 NULL。他に初期化されていなければ変数の初期値にもなる。

INTERFACE

型の変数は,等価性について,同じ INTERFACE 型の別の変数と比較してもよい。変数が

同じインスタンスを参照する場合,又は両方の変数が NULL に等しい場合,結果は TRUE でなければなら

ない。

6.6.6.5.2

エラー

インタフェース型の変数は,使用前に値が代入され,適切なクラスのインスタンスが代入されたことが

検証されなければならない。そうでない場合,実行時エラーが発生する。

注記  実行時エラーを避けるために,プログラミングツールは,デフォルトの“ダミー”手段を提供


137

B 3503

:2016 (IEC 61131-3:2013)

してもよい。もう一つの方法は,代入されたかどうかを前もって確認することである。

6.6.6.5.3

例 及び例 は,変数の型としてのインタフェースの宣言及び使用法を示す。

例 1  インタフェースのメソッドの呼出しを伴うファンクションブロック型

//

宣言

INTERFACE ROOM

  METHOD  DAYTIME   END_METHOD

//

日中に呼び出される。

  METHOD  NIGHTTIME  END_METHOD

//

夜間に呼び出される。

END_INTERFACE

CLASS LIGHTROOM IMPLEMENTS ROOM

  VAR  LIGHT  :  BOOL;  END_VAR

  METHOD  PUBLIC  DAYTIME

    LIGHT  :=FALSE;

  END_METHOD

  METHOD  PUBLIC  NIGHTTIME

    LIGHT  :=TRUE;

  END_METHOD

END_CLASS

FUNCTION_BLOCK ROOM_CTRL

  VAR_INPUT RM: ROOM; END_VAR

 //

(入力)変数の型としてのインタフェース

  VAR_EXTERNAL

   Actual_TOD:  TOD;  END_VAR

//  TOD

型のグローバル変数を参照。

  IF  (RM=NULL)

//

重要:有効なリファレンスのテスト

  THEN  RETURN;

  END_IF;

  IF  Actual_TOD  >=TOD#20:15  OR

      Actual_TOD  <=TOD#06:00

  THEN  RM.NIGHTTIME();

//  RM

のメソッドの呼出し

  ELSE  RM.DAYTIME();

  END_IF;

END_FUNCTION_BLOCK


138

B 3503

:2016 (IEC 61131-3:2013)

//

使用法

PROGRAM B

  VAR

//

インスタンス化

    My_Room:

LIGHTROOM;

//  LIGHTROOM

が ROOM を実装することを参照

    My_Room_Ctrl:  ROOM_CTRL;

//

上記の ROOM_CTR 参照

  END_VAR

  My_Room_Ctrl(RM  :=My_Room);

 //

クラスのインスタンスを入力とする FB の呼出し

END_PROGRAM

この例では,ファンクションブロックは,インタフェース型の変数をパラメータとして宣言

している。ファンクションブロックインスタンスの呼出しは,インタフェースを実装するクラ

スのインスタンス(参照)を(ファンクションブロックの入力,出力,入出力又は結果として)

この変数に渡す。その後,クラス内で呼び出されたメソッドは,渡されたクラスのインスタン

スのメソッドを使用する。この使用によって,インタフェースを実装するそれぞれ異なるクラ

スのインスタンスを渡すことができる。

宣言:

二つのメソッドをもつインタフェース ROOM 及びそのインタフェースを実装するクラス

LIGHTROOM

インタフェース ROOM 型の入力変数 RM をもつファンクションブロック ROOM_CTRL

ROOM_CTRL

は,入力変数 RM に代入されたインスタンスのメソッドを呼び出す。

使用法:

プログラム B は,クラス LIGHTROOM 及びファンクションブロック ROOM_CTRL をインスタ

ンス化し,クラスインスタンス My_Room をインタフェース ROOM 型の入力変数 RM へ渡してフ

ァンクションブロックインスタンス My_Room_Ctrl を呼び出す。


139

B 3503

:2016 (IEC 61131-3:2013)

例 2  上記例 における関係の図解

注記  ファンクションブロックには実装されたメソッドはないが,渡されたクラスインスタン

スのメソッドを呼び出す。

6.6.6.6

インタフェースの継承(EXTENDS

6.6.6.6.1

概要

PLC 言語では,一般のオブジェクト指向プログラミングで定義する継承及び実装の概念を,図 19 a),b)

又は c)のいずれかに示す新しい要素を作り出すために採用する。

FB ROOM_CTRL

 VAR_INPUT  
          RM  :  ROOM; 
 
... RM.DAYTIME ... 
... RM.NIGHTTIME ...

(クラス形)

METHOD

 DAYTIME

METHOD

 NIGHTTIME

CLASS

 LIGHTROOM

(FB 形)

METHOD

 DAYTIME

METHOD

 NIGHTTIME

INTERFACE

 ROOM

宣言:

使用法:

a)FB 宣言内の INTERFACE

FB がインタフェースを実装する

使用法:

b)変数 RM の形としての INTERFACE ROOM

FB ROOM_CTRL

VAR_INPUT  
  RM  :  ROOM; 
 
... RM.DAYTIME ... 
... RM.NIGHTTIME ...

My_Room

使用法:

My_Room_Ctrl

d)インスタンス化:ROOM_CTRL

c)インスタンス化:My_Room

METHOD

 DAYTIME

METHOD

 NIGHTTIME

CLASS

 LIGHTROOM

My_Room

e)呼出し:

FB インスタンスを渡す


140

B 3503

:2016 (IEC 61131-3:2013)

a)

インタフェースの継承  派生(子)インタフェースは,既に定義された基底(親)インタフェースを

継承(EXTENDS)する。

b)

クラスでの実装  派生クラスは,既に定義された一つ以上のインタフェースを実装(IMPLEMENTS)

する。

c)

クラスの継承  派生クラスは,既に定義された基底クラスを継承(EXTENDS)する。

継承の階層の図解

a)

予約語 EXTENDS を用いたインタフェースの継承

b)

予約語 IMPLEMENTS を用いたクラスでのインタフェースの実装

c)

予約語 EXTENDS 及び OVERRIDE を用いたクラスの継承

図 19−インタフェース及びクラスの継承(図解)

図 19 a)に示すインタフェースの継承では,既存のインタフェースに基づいて,一つ以上のインタフェー

スを派生させることができる。

インタフェースは,予約語 EXTENDS を用いて,一つ以上の既存のインタフェース(基底インタフェー

ス)から派生してもよい。

例  INTERFACE A1 EXTENDS A

次の規則を適用しなければならない。

1)

派生(子)インタフェースは,追加の宣言なしにその基底(親)インタフェースから全てのメソッド

プロトタイプを継承する。

2)

派生インタフェースは,任意の数の基底インタフェースを継承できる。

CLASS X EXTENDS B

METHOD

 (ma), (mb), (mc), md 

CLASS X1 EXTENDS X 
METHOD OVERRIDE mb

METHOD

(ma), mb, (mc), (md)

CLASS X11 EXTENDS X1

METHOD

(ma), (mb), (mc), (md), mf

CLASS X12 EXTENDS X1

METHOD

(ma), (mb), (mc), (md), mg 

INTERFACE A

METHOD ma

INTERFACE A1 EXTENDS A

METHOD

(ma), mb

INTERFACE A2 EXTENDS A

METHOD

(ma), mc

CLASS C

METHOD mf

c

クラスの継承

  (EXTENDS)

b

クラスでの実装

    (IMPLEMENTS)

IMPLEMENTS 

EXTENDS 

EXTENDS

多重継承は禁止

多重実装

CLASS B IMPLEMENTS A1, A2

METHOD

(ma),  (mb),  (mc) 

EXTENDS 

a

インタフェースの継承

    (EXTENDS)

(ABSTRACTとして部分

的に実装する場合もあ

る。

 

CLASS C1 EXTENDS C

METHOD

(mf), mg


141

B 3503

:2016 (IEC 61131-3:2013)

3)

派生インタフェースは,メソッドプロトタイプの集合を拡張してもよい。すなわち,派生インタフェ

ースは,その基底インタフェースにないメソッドプロトタイプを追加してもよい。これによって新た

な機能を追加できる。

4)

基底インタフェースとして使用されるインタフェースは,それ自身派生インタフェースでもよい。す

なわち,そのようなインタフェースは,その派生インタフェースとして継承したメソッドプロトタイ

プも渡す。これを複数回繰り返してもよい。

5)

基底インタフェースの定義を変更した場合,全ての派生インタフェース(及びそれぞれの子)もこの

変更した機能をもつ。

6.6.6.6.2

エラー

次の状況はエラーとして扱わなければならない。

a)

インタフェースが,その基底インタフェースのメソッドプロトタイプと同じ名前である追加のメソッ

ドプロトタイプを[6.6.6.6.1 の 3)の規則に従って]定義する。

b)

インタフェースが,直接又は間接的にかかわらず,その自身の基底インタフェースである。すなわち,

再帰は認められない。

注記  クラスに関して 6.6.5.5 に規定する OVERRIDE 特性は,インタフェースには適用しない。

6.6.6.7

実装評価代入

6.6.6.7.1

概要

実装評価代入は,

インスタンスが特定のインタフェースを実装するかどうかを評価するために用いる

52

参照)

。これはクラス及びファンクションブロック型に適用できる。

参照したインスタンスがインタフェースを実装するクラス又はファンクションブロック型のものであれ

ば,実装評価代入の結果はこのインスタンスに対して有効なリファレンスになる。そうでない場合,実装

評価代入の結果は NULL である。

実装評価代入構文は,インタフェースのリファレンスからクラス(又はファンクションブロック)のリ

ファレンスへ安全な型変換(キャスト)

,又は基底型の一つのリファレンスから派生型のリファレンスへの

安全な型変換(ダウンキャスト)のためにも使用できる。

実装評価代入の結果は,使用する前に NULL と同じでないことを評価しなければならない。

6.6.6.7.2

テキスト表現

命令リスト(IL)では,演算子“ST?”

(保存)は,次の例に示すように用いる。

例 1

LD interface2

//

IL の場合

ST? interface1

構造化テキスト(ST)では,演算子“?=”は,次の例に示すように用いる。

例 2

interface1 ?=interface2;

// ST

の場合

6.6.6.7.3

グラフィック表現

グラフィック言語では,次のファンクションを使用する。

例 1

 +

------------

+

 interface2 --

| ?= |

-- interface1

 +

------------

+


142

B 3503

:2016 (IEC 61131-3:2013)

例 2  インタフェースのリファレンスによる実装評価代入

インタフェースのリファレンスによる実装評価代入の成功例及び失敗例

//

  宣言

CLASS C IMPLEMENTS ITF1, ITF2

END_CLASS

//

使用法

PROGRAM A

  VAR

     inst  :  C;

     interf1  :  ITF1;

     interf2  :  ITF2;

     interf3  :  ITF3;

  END_VAR

interf1 :=inst;

// interf1

に有効なリファレンスを代入する。

interf2  ?=interf1;  // interf2 :=inst;

と同様に,interf2 に有効なリファレン

スが代入される。

interf3 ?=interf1;  // interf3

には NULL が代入される。

END_PROGRAM

例 3  リファレンスによる実装評価代入

//

  宣言

CLASS ClBase IMPLEMENTS ITF1, ITF2

END_CLASS

CLASS ClDerived EXTENDS ClBase

END_CLASS

//

  使用法

PROGRAM A

  VAR

     instBase  :  ClBase;

     instDerived  :ClDerived;

     rinstBase1,  rinstBase2  :  REF_TO  ClBase;

     rinstDerived1,  rinstDerived2  :  REF_TO  ClDerived;

     rinstDerived3,  rinstDerived4  :  REF_TO  ClDerived;


143

B 3503

:2016 (IEC 61131-3:2013)

          interf1 : ITF1;

     interf2  :  ITF2;

     interf3  :  ITF3;

  END_VAR

rinstBase1 :=REF(instBase);

//  rinstBase1

に 基 底 ク ラ ス を 参 照 。

rinstBase2 :=REF(instDerived);

// rinstBase2

に派生クラスを参照。

rinstDerived1 ?=rinstBase1;

// rinstDerived1==NULL

rinstDerived2 ?=rinstBase2;

// rinstDerived2

には instDerived の有効

なリファレンスが代入される。

interf1 := instBase;

// interf1

に基底クラスを参照。

interf2 := instDerived;

// interf2

に派生クラスを参照。

rinstDerived3 ?=interf1;  // rinstDerived3==NULL

rinstDerived4 ?=interf2;  // rinstDerived4

には instDerived の有効なリファ

レンスが代入される。

END_PROGRAM

実装評価代入の結果は,使用する前に NULL に等しくないことを評価しなければならない。

表 52−実装評価代入

No.

説明

解説

1

?=

を用いるインタフェースによる実装評価代入

上記参照

2

?=

を用いる参照による実装評価代入

上記参照

6.6.7

ファンクションブロックのオブジェクト指向特性

6.6.7.1

概要

クラスに関して定義する概念を用いたオブジェクト指向パラダイムに対応するため,JIS B 3503:2012 の

ファンクションブロック概念を拡張する。

・  ファンクションブロックにメソッドを追加

・  ファンクションブロックによるインタフェースの実装を追加

・  ファンクションブロックの継承を追加

オブジェクト指向ファンクションブロックでは,

表 40 に規定するファンクションブロックの全ての項目

を適用できる。

さらに,オブジェクト指向ファンクションブロックの実装者は,

表 53 に規定するオブジェクト指向ファ

ンクションブロック項目の,本質的に一貫性があるサブセットを提供しなければならない。


144

B 3503

:2016 (IEC 61131-3:2013)

表 53−オブジェクト指向ファンクションブロック

No.

説明

予約語

解説

1

オブジェクト指向ファンクション
ブロック

ファンクションブロック概念のオブジェクト指向拡張

1a

FINAL

指定子

ファンクションブロックは,基底ファンクションブロックとして使用でき

ない。

メソッド及び指定子 

5

METHOD...END_METHOD

メソッド定義

5a

PUBLIC

修飾子

メソッドは,どこからでも呼び出すことができる。

5b

PRIVATE

  修飾子

メソッドは,そのメソッドを定義する POU の内側からだけ呼出しできる。

5c

INTERNAL

  修飾子

メソッドは,同じ名前空間の内側からだけ呼び出すことができる。

5d

PROTECTED

  修飾子

メソッドは,そのメソッドを定義する POU とその派生物の内側からだけ呼

び出すことができる(デフォルト)

5e

FINAL

指定子

メソッドは,オーバライドしてはならない。

インタフェースの使用法 

6a

IMPLEMENTS

インタフェース

ファンクションブロック宣言内でインタフェースを実装する。

6b

IMPLEMENTS

複数のインタフェ

ース

ファンクションブロック宣言内で複数のインタフェースを実装する。

6c

変数の型としてのインタフェース  インタフェースの実装(ファンクションブロックインスタンス)のリファ

レンス。

継承 

7a

EXTENDS

ファンクションブロックは基底ファンクションブロックを継承する。

7b

EXTENDS

ファンクションブロックは基底クラスを継承する。

8

OVERRIDE

メソッドは基底メソッドをオーバライドする−動的名前束縛をリファレン
ス。

9

ABSTRACT

抽象ファンクションブロック−少なくとも一つのメソッドが抽象メソッ

ド。

抽象メソッド−このメソッドは未実装である。

アクセス参照 

10a  THIS

自己のメソッドの参照に用いる。

10b  SUPER

基底ファンクションブロック内のメソッドのアクセス参照に用いる。

10c  SUPER()

基底ファンクションブロックのボディへのアクセス参照。

変数アクセス修飾子 

11a  PUBLIC 修飾子

変数は,どこからアクセスしてもよい。

11b  PRIVATE 修飾子

変数は,定義された POU の内側からだけアクセスできる。

11c  INTERNAL 修飾子

変数は,同じ名前空間の内側からだけアクセスできる。

11d  PROTECTED 修飾子

変数は,

定義された POU の内側及びその派生物からだけアクセスできる

(デ

フォルト)

多態性 

12a  VAR_IN_OUT による多態性

シグネチャが同一の場合

(基底)FB 型の VAR_IN_OUT は,追加の VAR_IN_OUT, VAR_INPUT 又

は VAR_OUTPUT-変数がない派生 FB 型のインスタンスを代入してもよい。

12b  VAR_IN_OUT による多態性

シグネチャが互換の場合

(基底)FB 型の VAR_IN_OUT は,追加の VAR_IN_OUT-変数がない派生
FB 型のインスタンスを代入してもよい。

12c  リファレンスによる多態性

シグネチャが同一の場合

(基底)FB 型のリファレンスは,追加の VAR_IN_OUT,VAR_INPUT 又は

VAR_OUTPUT-

変数がない派生 FB 型のリファレンスを代入してもよい。

12d  リファレンスによる多態性

シグネチャが互換の場合

(基底)FB 型のリファレンスは,追加の VAR_IN_OUT-変数がない派生 FB
型のリファレンスを代入してもよい。


145

B 3503

:2016 (IEC 61131-3:2013)

6.6.7.2

ファンクションブロックのメソッド

6.6.7.2.1

概要

ファンクションブロック型定義内に追加できる言語要素の集合として,メソッドの概念を採用する。

メソッドは,ファンクションブロックインスタンスのデータに対して行う演算を定義するために適用し

てもよい。

6.6.7.2.2

ファンクションブロックの類型

ファンクションブロックは,ファンクションブロックボディ及び追加としてメソッドの集合をもっても

よい。FB ボディ及び/又はメソッドが省略できることから,ファンクションブロックには三つの類型があ

る。これを

図 20 a),b)及び c)に例示する。

a)

FB

ボディ本体だけを伴うファンクションブロック  これは,JIS B 3503:2012 から知られているファ

ンクションブロックである。

この場合,ファンクションブロックにはメソッドは実装されていない。ファンクションブロックの

要素(入力,出力など)及びファンクションブロックの呼出しは,

図 20 a)の例に示す。

b)  FB

ボディ及びメソッドを伴うファンクションブロック  メソッドは,メソッド内定義変数だけでな

く,ファンクションブロック宣言部内に定義する入力変数,出力変数又は内部変数へのアクセスをサ

ポートしなければならない。

c)

メソッドだけを伴うファンクションブロック  この場合,ファンクションブロックは,空のファンク

ションブロックのボディが実装されている。ファンクションブロックの要素及びメソッドの呼出しを

図 20 b)に示す。

この場合,このファンクションブロックもクラスとして宣言できる。


146

B 3503

:2016 (IEC 61131-3:2013)

ボディ及び/又はメソッドを伴うファンクションブロックの要素及び呼出しの図解。

例は,代入及び入出力の読出しの可否を示す。

a)

ボディだけを伴うファンクションブロック/ファンクションブロックの呼出し

− FB 入力,出力は静的であり,外部からアクセス可能である。

−  また,FB 呼出しに依存しない。

この FB 呼出しのグラフィック表現
は,図解のためだけのものである。
 
一時パラメータは括弧でくくる。

I (in1 :=A, inout :=B, out1=> Y);

 
外部からの入力の代入

I.in1   :=A;

I.inout := B;//

禁止  呼出しの中だけ

許される。 
 
外部からの出力の読出し。

Y :=I.out1;

//

許 さ れ る 。 c) と 違

う。

 
c)

メソッドだけを伴うファンクションブロック(すなわち,空のボディ)/メソッド呼出し

−  メソッドの入力,出力,変数及び結果は,一時的である(静的でない。

−  しかし外部からアクセス可能である−呼出しの中だけで許される。

a)

の FB の続き 

このメソッド呼出しのグラフィック
表現は,図解のためだけのものであ

る。 
 
一時パラメータは括弧でくくる。

R1:=I.method1(inm1:=A, outm1=>Y); 
      //結果の使用は任意のものである。 

I.method1(inm1 :=A, outm1=> Y); 
 
外部からのメソッド入力の代入

I.inm1  :=  A;//

禁止  呼出しの中だけで

許される。 
 
外部からのメソッド出力の読出し

Y := I.outm1; //

禁止  呼出しの中だけ

で許される。

b)

ボディ及びメソッドを伴うファンクションブロック。a)及び c)を含む。

図 20−ボディ及びメソッドを伴うファンクションブロック(図解)

6.6.7.2.3

メソッド宣言及び実行

ファンクションブロックは,

図 20 c)に表すようにメソッドの集合をもってもよい。

メソッドの宣言は,クラスのメソッドに関する規則に加えて,次の規則を順守しなければならない。

a)

メソッドは,ファンクションブロック型の範囲内で宣言する。

b)

テキスト表現宣言では,メソッドはファンクションブロック宣言とファンクションブロックボディと

の間に記載する。

メソッドの実行は,クラスのメソッドに対する規則に加えて,次の規則を順守しなければならない。

c)

メソッドは,ファンクションブロック内で宣言する静的変数を読み書きできなければならない。

対象となるのは,

(データ型 BOOL R_EDGE 又は BOOL F_EDGE を除く。

)入力変数,出力変数,静

的変数及び外部変数である。

d)

メソッドは,FB の一時変数である VAR_TEMP 及び VAR_IN_OUT にアクセスできない。

m_1 アルゴリズム

(内部

変数)

method_i

(入力

変数)

(結果)

m_i アルゴリズム

(出力変数)

(入出力変数)

(内部

変数)

(入力

変数)

(結果)

method_1

(出力変数)

inm1

I

FB.method1

outm1

A

Y

FB 形

FB ボディ

アルゴリズム

外部変数

内部変数

(一次変数)

出力

変数

入力

変数

FB インスタンス

(入出力変数)

in1

inout

I

T

out1

inout

Y

A

B


147

B 3503

:2016 (IEC 61131-3:2013)

e)

メソッド内の変数は,FB ボディ(アルゴリズム)によってアクセスできない。

6.6.7.2.4

メソッド呼出し表現

メソッドは,テキスト言語及びグラフィック言語でクラスに対して定義したのと同様に呼び出すことが

できる。

6.6.7.2.5

メソッドアクセス修飾子(PROTECTEDPUBLICPRIVATEINTERNAL

メソッドごとに,どこからメソッドの呼出しが許容されるかを定義しなければならない。

6.6.7.2.6

変数アクセス修飾子(PROTECTEDPUBLICPRIVATEINTERNAL

VAR

構文では,どこから変数のアクセスが許容されるかを定義しなければならない。

入力変数及び出力変数へのアクセスは,暗黙的に常に PUBLIC である。したがって,入力変数部及び出

力変数部にはアクセス修飾子は用いない。出力変数は,暗黙的に読出し専用である。入出力変数は,ファ

ンクションブロックボディ内及び呼出し文内だけで使用する。VAR_EXTERNAL 部の変数へのアクセスは,

暗黙的に常に PROTECTED である。したがって,これらの変数にはアクセス修飾子は用いない。

6.6.7.2.7

ファンクションブロックの継承(EXTENDSSUPEROVERRIDEFINAL

6.6.7.2.8

概要

ファンクションブロックの継承は,クラスの継承に似ている。既存のクラス又はファンクションブロッ

ク型に基づいて,一つ以上ファンクションブロック型を派生させることができる。これは,複数回繰り返

してもよい。

6.6.7.2.9

派生ファンクションブロックのボディでの SUPER()

派生ファンクションブロック及びそれらの基底ファンクションブロックは,それぞれがファンクション

ブロックボディをもってもよい。ファンクションブロックボディは,基底ファンクションブロックを自動

的に継承するのではなく,デフォルトでは空である。基底ファンクションブロックのボディは,SUPER()

を用いて呼び出すことができる。

この場合,ファンクションブロックの EXTENDS に対する上記規則に加えて,次の規則を適用する。

a)

派生ファンクションブロック型のボディ(ある場合)は,ファンクションブロックが呼び出されたと

きに実行される。

b)

派生ファンクションブロック内で基底ファンクションブロック(ある場合)のボディを追加として実

行するには,SUPER()の呼出しを使用しなければならない。SUPER()の呼出しにはパラメータはない。

注記  SUPER()の呼出しは,ファンクションブロックボディの中で一回だけ発生するものであり,

ループ内にあってはならない。

c)

基底及び派生ファンクションブロック内の変数名は,一意でなければならない。

d)

ファンクションブロックの呼出しは,動的に束縛されなければならない。

1)

派生ファンクションブロック型は,その基底ファンクションブロック型を使用できる全ての場所で

用いることができる。

2)

派生ファンクションブロック型は,その基底クラス型が使用できる全ての場所で用いることができ

る。

e)

SUPER()

は,ファンクションブロックボディ内だけで呼び出すことができ,ファンクションブロック

のメソッド内で呼び出すことはできない。

SUPER()

の例は,

図 21 による。


148

B 3503

:2016 (IEC 61131-3:2013)

図 21SUPER()を用いたファンクションブロックボディの継承(例)

6.6.7.2.10

メソッドの OVERRIDE

派生ファンクションブロック型は,

一つ以上の継承されるべきメソッドを自らの実装でオーバライド

(差

替え)してもよい。

6.6.7.2.11

ファンクションブロック及びメソッドの FINAL

指定子 FINAL を伴うメソッドは,オーバライドしてはならない。

指定子 FINAL を伴うファンクションブロックは,基底ファンクションブロックにはならない。

6.6.7.3

動的名前束縛(OVERRIDE

名前束縛は,メソッド又はファンクションブロックの名前と実装との関連付けであり,ファンクション

ブロックのメソッドについても 6.6.5.6 に規定するとおりに用いる。

6.6.7.4

自己の及び基底 FBTHISSUPER)のメソッド呼出し及び多態性

自己のファンクションブロック内及び外部で定めるメソッドにアクセスする際,予約語 THIS 及び

SUPER

を利用できる。

  VAR_INPUT  a: INT;

 VAR_OUTPUT  x:  INT;

 (* body:*) 
 x  :

=a+1;

 NIGHTTIME

(FB 形)

  VAR_INPUT b: INT;

 SUPER

(); 

 (* includes here the

body  of    BASE*

)

 x  :

=3*x+b;

FB DERIVED_1

EXTENDS BASE

(FB 形)

FB BASE 

 VAR_INPUT  a:  INT;

 VAR_INPUT  b:  INT;

 VAR_OUTPUT  x:  INT;

 x := a+1;

 x  :

=3*x+b; 

FB DERIVED_1

EXTENDS BASE

左記の FB DERIVED_1 を展開すると

(FB 形)

(FB 形)

FB DERIVED_2

EXTENDS DERIVED_1

  VAR_IN_OUT c: INT;

 SUPER

();(*includes here

the body of DERIVED_1 *

)

 c  :

=x/c;

 a  :

=a+1;

 x  :

=3*x+b;

 c  :

=x/c;   

 VAR_INPUT  a:  INT;

 VAR_INPUT  b:  INT;

 VAR_IN_OUT  c:  INT;

 VAR_OUTPUT  x:  INT; 

FB DERIVED_2

EXTENDS DERIVED_1

左記の FB DERIVED_2 を展開すると 

(FB 形)


149

B 3503

:2016 (IEC 61131-3:2013)

6.6.7.5

ABSTRACT

ファンクションブロック及び ABSTRACT メソッド

ABSTRACT

モディファイアはファンクションブロックにも用いることができる。ファンクションブロッ

クの実装者は,これらの項目の実装を宣言しなければならない。

6.6.7.6

メソッドアクセス修飾子(PROTECTEDPUBLICPRIVATEINTERNAL

クラスでの定義と同様に,メソッドごとに,どこからメソッドの呼出しが許容されるかを定義しなけれ

ばならない。

6.6.7.7

変数アクセス修飾子(PROTECTEDPUBLICPRIVATEINTERNAL

クラスへの参照での定義と同様に,VAR 構文では,どこから変数のアクセスが許容されるかを定義しな

ければならない。

入力変数及び出力変数へのアクセスは,暗黙的に常に PUBLIC である。したがって,入力変数部及び出

力変数部にはアクセス修飾子は用いない。出力変数は,暗黙的に読出し専用である。入出力変数は,ファ

ンクションブロックボディ内及び呼出し文内だけで使用する。VAR_EXTERNAL 構文の変数へのアクセスは,

暗黙的に常に PROTECTED である。したがって,これらの変数にはアクセス修飾子は用いない。

6.6.8

多態性

6.6.8.1

概要

6.6.8.2

6.6.8.36.6.8.4 及び 6.6.8.5 で示す四つの場合で多態性が生じる。

6.6.8.2