IEC61449を話す前に、みなさんよく知ってるPLCはおそらく小さなControllerでInput/OuputがありMotorやValveなどを制御します。でもIT BackgroundがあるエンジニアならPLCと言われたら、彼らが思い出すのはRaspberry PiやArduinoなど、入出力点数を持つ組み込みボードかもしれません。
でも、PLCは産業界で使用するために特別に用意されたもので普通は以下のルールに従ってプログラムする必要があります。
PLCは、さまざまなメーカーからも作られています。通常のパソコンと異なり、PLCは特定の用途に向けて効率的に稼働するのが目的で、各PLCメーカーはこの3つの部分を開発しています。
- ハードウェア(SiemensならS7-1500、OmronならNX1のような)
- PLC上で動作する基本ソフトウェア(ファームウェア)
- IDE(統合開発環境、SiemensならTIA、BeckhoffならTwinCAT3、三菱ならGxwrok3のような)
PLCをプログラムするには、PLC ベンダーの IDEが必要です。
簡単に言うと、PLCを使用し装置を作るとき、大体このような流れです:
- メーカのHPから IDE をDownload>インストール>場合によったライセンス購入
- PLCの機能をManualを調べてながら理解する
- IDEの機能を勉強してプログラムを作成する
- PCとPLCを繋がいて、プログラムをDownloadしDebugを始める

IEC61131-3
PLCのプログラミングにはIEC61131-3という国際標準があります。それは各 PLCにも独自のIDEが提供されていますが、PLC のプログラミング言語は IEC 61131-3 で標準化されました。この規格には、5種類のプログラミング言語が含まれています:
- ラダーダイアグラム(LD)、グラフィカル
- ファンクションブロックダイアグラム(FBD)、グラフィカル
- 構造化テキスト(ST)、テキスト
- 命令リスト(IL)、テキスト(非推奨)
- シーケンシャルファンクションチャート(SFC)、グラフィカル。
例えばFBDの場合はこのようなプログラムを書きますね。
IDEでこのアプリケーションを作成したあと>コンパイルし>エラーなしを確認したらPLCにそのコンパイルされたコードをDownloadする必要があります。そして、実際のシステムで動作を確認するためには、PLCの物理的な入出力を実際のセンサーやモーターに接続する必要があります。各PLCメーカーは、プログラミング時の物理的な入出力の表現方法を独自に定めています。(例えば三菱はXY、SiemensはIQ、Beckhoffは%I*と%Q*)

これらの言語は、C、C++、Java、Python などの高級言語とは大きく異なり、特にグラフィカル的な要素が強いイメージがあります。ですが、一部の PLCでもこのような高級プログラミング言語でアプリケーションを作成できます。
IEC 61499
いままでの制御システムは中央制御のイメージが強いですが、IEC61499はそれを違って
分散型産業制御 Solutionを提供するアプローチです。
Distributed system?
分散システムとは個々の部品がインテリジェンスを持ち、互いにスムーズに通信しシステムを全体としてます。わかりやすく言いますと各デバイスも自分のロジックをもってると理解しやすいでしょう。IEC 61499は、このような分散型産業制御ソリューションを開発するためのモデリング言語を標準化します。
- 再利用性を高めるのSoftwareカプセル化
- ベンダーに依存しないFormat
- コントローラ間通信のサポートを簡単にする
- IEC 61131-3を拡張

Function Block
ではIEC61499のMain部品、FBを紹介していきたいと思います。
Interface
IEC 61499におけるFBの新しい外観を示したものです。Function Blockの基本的な考え方はIEC61131-3と同じく、必要な機能をカプセル化するのが目的です。

Input/Output
ここでも入力は左、出力は右です。

Interface
Interface部分はEvent IntefaceとData Intefaceに分かれています。赤色、上にあるのはEvent Interface、青い色、下にあるのはData Interfaceです。

Event Interface
Event IntefaceはFBの機能をTriggerし、必要なデータ入力をFB内部に渡します。
注意するにはEvent IntefaceとData Intefaceは互換性がないため、接続可能な部分も限られています。

Data Interface
Data interfaceにも出力(FunOut)と入力(FunIn)に分かれてます。
出力(FunOut)というのは次のFBに接続される入力のことです。
入力(FunIn)というのは1つ前のFBやStateからもらったデータになります。

Flag
IntefaceのPinには線と小さな四角があると気が付きましたか?
Event InputとEvent Outputがこのように接続されると、Input/Output Eventが発生した場合どんなデータを更新するかを定義できます。
なので、Function Blockの動作はECCに左右され>ECCは自分の状態をもっており>Event受信>そしてEventと現在の状態に沿ってカプセルされたアルゴリズムのみ実行
のようなクリアな流れになります。

Internal Sequence
IEC61449のFunction Block Interfaceを説明し終わったら、今度実際にFBイベントがきたら、どういう順番で実行するかを見てみましょう。

Step-1 Events arrives
最初にイベントがFBに到着します。

Step-2 Refresh Data
該当するEventにひもついてるデータを更新します。

Step-3 Passed to ECC
イベントをECC(Event Execution Control)に渡します。

Step-4 Trigger
内部機能をTriggerされます。

Step-5 Finish and Provided
内部機能が終わり、新たなOutputデータを提供します。

Step6 Refresh Output
該当するEventに紐付けられた出力を更新します。

Step7 Event Output
Output Eventが出力されます。

Configuration Example
この規格では分散システムのモデリングが可能なため、アプリケーションは1つのデバイスだけで実行する必要はありません。その代わりに、複数のデバイス(PLC)に分割してデプロイすることができます。多くのアプリケーションを用意し、多くのデバイスに分散させることも可能です。

実際IEC61449を使用する装置はこのようになるかもしれません。ラインで様々なPLCが接続され、その中でFunction Blockが作られています。(あくまで参考図なので、例えば接続が問題あるときの勝利、もしくはハードウェアの入出力のアクセス方法などは書いてません)

Types of Function Blocks
IEC 61499では、アプリケーションを開発する際に使用できるFBを3種類定義しています:
Basic Function Block (BFB):
IEC61499の中で一番使われている部品です。
BFBでは更に2つの部品に分かれています。
- Execution Control Chart(ECC)
- こちらの部品を使ってState machineを定義することができます。ECCは状態や入力イベントに基づいて、どのアルゴリズムを実行するかを決定する。
- Algorithms(Alg)
- こちらの部品アルゴリズムは、IEC 61131で定義されたプログラミング言語などを用いてアプリケーションの制御部分を作成します。

下図では簡単なBFBの構造を示しています。

灰色のは状態のBoxで下図ではSTART・State1・State2が3つあります。
そしてEI1・EI2のような状態を遷移するための条件です。
例えばEI2がV1=5になるとState1からState2に移動すると理解しやすいでしょう

EO1とEO2のPink Boxは該当する状態が遷移されたときにドリガーされてしまうイベント出力になります。

例えば、FBがSTART状態にあるときにEI1イベントが到来すると、FBはState1にジャンプしてAlg1を実行し、EO1イベントを出力する。

ECC内のグレーのボックス(Alg1~Alg3)は、関数ブロック内にカプセル化されたアルゴリズムです。

Composite Function Block (CFB)
CFBは複数のFBとの内部ネットワークで繋いでるイメージです。

Service Function Block (SFB):
SFBは、ハードウェアの特定の部分にアクセスするために必要なFBです(例えばK-Bus経由でWagoのIO Moduleをアクセス)そして同じアプリケーションを複数のデバイスに展開することができます。
SFBはBFBやCFBではできない、直接プラットフォームへのアクセスが必要なものに使われます。このタイプのFBは、入力されるイベントだけでなく、ハードウェアによっても起動できます。なので、レスポンダFBは、パケットが到着するたびにイベントをトリガするような理解でいいでしょう。

4diac Framework
IEC 61499で開発されたアプリケーションは、FB(Function Blocks)を使用し、FBを作成・定義から実際に物理的なものを制御するまでのロジックを実装する必要があります。
それはIDEです。さらに、実際アプリケーションを稼働させるにはRuntimeが必要です。
これからの環境構築にも触れられますが、実際Function BlockをMappingするデバイスを選択でき、IDEはそれらのプログラムを一括更新するような機能もできます。
今回記事では4diac Frameworkを使用しIEC61499を試したいと思っています。

IDEではFBを作成し各Runtimeを接続することができるツールになります。

Runtime環境はPLCや制御用ハードウェア、Raspberry Piなどの実機を示しています。これらのデバイスでは、言及したランタイム環境を実行する必要があります。分散システムから情報を受け取り、FBのネットワークを作り、実行し、イベント処理などを行います。さらに、デバイスには通常、ランタイム環境がハードウェアの入力と出力にアクセスします。

Components of Eclipse 4diac
Eclipse 4diacは、IEC 61499規格に準拠した分散制御システムを開発・実行するための2つの主要コンポーネントを提供します。

4diac FORTE
4diac FORTEは、小型の組み込み機器上でIEC 61499 FBネットワークを実行することをIEC 61499ランタイムです(C++実装)。注意するのは4diac FORTEは、通常リアルタイムOSの上で使用します。そしてWindows、Linux (i386, amd64, ppc, xScale, arm)、NetOS、eCos、Hilscher社のrcX、vxWorks、freeRTOSなど、いくつかの異なるOSでテストされています。

4diac IDE
4diac IDEはEclipseフレームワークをベースにした統合開発環境で(Java)、IEC 61499規格のエンジニアリング環境を提供します。4diac IDEを使用して、FB・アプリケーションの作成、デバイスの設定、その他IEC 61499に関連する作業ができます。
4diac IDE内で開発したアプリケーションを4diac FORTE(Runtime)や他のIEC61499に準じるRuntimeを実行できます。

Play with Windows
これから実際にWindows環境から4diacを使用しIEC61499を実際に体験してみましょう。
Download
下記のLinkから4diac Winodws VersionのIDEとRuntime FORTEをDownloadしてください。
https://www.eclipse.org/4diac/en_dow.php

2つのZipがDownloadされ解凍してください。

Start the IDE
4diac-ide.exeをダブルクリックしIDEを起動します。

少々お待ち下さい…

作業の場所(Workspace)を設定しLaunchします。

Done! IDEが起動しました。

次の起動を早くできるように、”Always show Welcome at startup”とHideをクリックしてください。

Done! IDEを起動しました。

Configure Runtime
次はRuntimeを設定する必要があります。Windows>Preferencesを開きます。

4diac IDE>FORTE Prefereneceを開き、FORTE locationのFieldにあるBrowseボタンをクリックします。

先ほどDownloadした”forte_2.0.1.win32”を解凍した”forte.exe”を選び>Openします。

Apply and Closeをクリックし設定を適用します。

Start new Project
File>New>4diac IDE Projectで新規プロジェクトを作成します。

プロジェクト名を入力しFinishボタンで新規プロジェクトを作成しましょう。

Done!新規プロジェクトが作成されました。

Type Navigatorに使用できるライブラリを一覧できます。

Create Program
これから一番簡単なLチカプログラムを作成します。
Type NavigatorからStartを検索すると、E_RESTART FBが表示されます。

そのE_RESTART FBを右のあるエリアにDropします。

Done!E_RESTART FBが追加されました。

FBのPropertiesを開くとInstance Nameという項目からInstance名を変更できます。

E_RESTART FBのInstance名はStartに変わりました。

同じ操作でCycleを検索しE_CYCLEを作業エリアにDropします。

実際に各FBにInterface Listを開くと該当するFBの入出力を確認できます。

最初にFBのInterfaceで説明したように、赤色はEvent Interfaceです。StartのCOLD・WARMTH EVENTをE_CYCLEのSTART Event 入力と繋がりましょう。

このような操作です。

同じ操作でE_SWITCH FBを追加し次はCycle FBのEvent 出力をSwtich FBのEvent 入力(EI)と繋がりってください。

いまCycleのEO(E_CYCLE FBのDT、つまりData InterfaceからそのE_CYCLEのTrigger時間を設定できる)をE_SWITCHのFB Event 入力と接続します。

最後はFB E_SRを追加し、Swtich EO0とEO1(Event 出力0と1)をE_SRのEvent 入力SとRと繋がりましょう。

Done!

最後はQの Data Interface FeedbackをSwitch FBのGにFeedbackします。

FB間の線は位置調整できます。

このような操作です。

See Source Code
各FBのSource Codeを確認でき、Cycle FBをダブルクリックします。

実際E_CYCLEの内部回路を確認できます。

FB Properies
前も書きましたが、Propertiesから各FBの細かい設定を行うことできます。もしProperties画面がなければWindows>Show View>Propertiesをクリックします。

このように選択されたFBのPropertiesを一覧できます。

今回はFB CYCLEのDtat Interface DTの初期値を設定します。Initial ValueのFieldをクリックして、ここはT#1sを入れます。

Done!いまDTはT#1sになり、FB_Cycleは1秒ごとにEO(Event output)を出力します。

Start Runtime
Runtimeを起動するためOpen Perspeiveをクリックします。

4diac IDE Debugを選択しOpenします。

次はDebug>Open Simulation Devices Managerを開きます。

Simulation Devices Manager画面が表示されます。

Launch Local FORTEで Runtimeを起動します。

よし、FORTEが起動しました。

Hardware Configuration
System Configurationをクリックし、先程起動されたFORTE Runtimeを追加します。

System Configuration画面が表示されます。

右のPaletteからFORRE_PCを追加します。

Done!FORTE_PCが追加されました。いまのFORTE_PCのPortは61499ですが、もし先程”Start Runtime”のStepで61499以外のPortを設定したらこちらも合わせてください。

Mapping
FBを先程追加したLocal FORTEと紐つけます。例えばCycle FBを右クリック>Map To..>FORTE PC>EMB_RESを選びます。

MappingされたFBがオレンジ色になります。

よし、3つのFBもMappingされました。

Deloy
最後はアプリケーションをデバイスにDownloadします。プロジェクト>右クリック>Deployします。

Watch
MonitorしたいBlockを選択し>右クリック>Watchします。

各FBの現在値も表示されました。

CycleのStartにある小さな黄色エリア(現在値表示されているところ)を右クリック>TriggerEventします。

START=1、Cycleが実行開始で、SRのEO1は1sサイクルでON/OFF繰り返しします。

Monitor終了したい場合、右クリック>Remove Watchesします。

Done.

Result
こちらは実際の結果です。
