Connext DDSによるファクトリーオートメーションの高速化と信頼性の向上

はじめに

RTI Connext DDSはリアルタイム性の高いピアツーピア型ミドルウェア ソリューションで、現実の世界に存在するオブジェクトの状態を表し、そのモニタリングを行うことを可能にします。 これにより、あらゆるワークフローを通過しているオブジェクトの状態を監視し更新するシステムの構築が容易になります。 そのためディスクリート製造プロセス フローにおいて、単一または複数の制御アプリケーションで処理されているバッチやロットを制御し、ロット状態をその処理中に更新するシステムを構築することができます。 ここでディスクリート プロセスの実装を例示する目的で、システム全体にわたるエラーの検出とレポーティングを行いながら、シンプルなロットの発送と最新のロット状態のモニタリングの管理が可能な製造実行システムの設計をサポートする、簡単な一連のユースケースを作成しながら説明します。

この一連のユースケースは、ワークフローを含むあらゆるタイプのシステムに適用されます。

  • ディスクリート型ファクトリー オートメーション システム
  • ケミカル バッチプラントの処理フロー
  • 医薬品製造フロー
  • 医療検体処理と分析
  • 分散制御システム (DCS) を使用して製造ラインで品目を処理するあらゆる製造システム、または製造実行システム (MES) を使用して状態情報の送信と監視を行うあらゆる製造システム。

マニュファクチャリングサービス バス (MSB: Manufacturing Service Bus) としてのDDS

市場競争力を維持するためには、その製造システムが市場投入までの時間が短縮可能なもので、かつ需要、市場競争の状況、法規制に即して生産を調整できるように俊敏性と再構成可能性に優れているシステムである必要があります。 同様に、サプライヤーのコンポーネントとITシステムの両方を統合するニーズは、柔軟性と拡張性が向上した製造アーキテクチャのニーズを高めています。

サービス指向アーキテクチャ (SOA) を用いて構築されたシステムは、エンタープライズ システム内の同様のニーズに対応するために効果的に使用されています。 エンタープライズでは、SOAシステムは、Microsoft WFC、J2EE、エンタープライズ サービス バス (ESB) などのテクノロジーを使用して構築されています。 しかし、これらのテクノロジーは、一般に製造システムのより高度な分散性と処理能力、そして実質的なリアルタイムの決定性のニーズへの十分な適合性に欠けています。 たとえば、ESBは、パフォーマンス、ロバスト性、決定性に影響を与える、 HTTP、XMLのような Webテクノロジーを使用して構築された集中型ブローカです。 それに対して、製造システムはマニュファクチャリングサービス バス (MSB) を必要とします。

OMG(オブジェクト マネジメント グループ)によりデータ配信サービス (DDS) 規格に規定されているように、データ中心的なパブリッシュ・サブスクライブ型テクノロジーは、マニュファクチャリングサービスバスを実装するための新しいプラットフォームです。 RTI Connext DDSは、OMG DDS規格で高パフォーマンス、かつ高度に拡張可能な実装です。

DDSテクノロジーは、各コンポーネントに使用されるプログラミング言語、ハードウェア、オペレーティング システムから独立した製造制御システムのモニタリングと統合のための技術層を提供します。 自動サービス検出、データ標準化、健全性モニタリング、媒介、その他多くのSOAサービスを直接インフラストラクチャに提供します。 さらに、RTI Connext DDSは、生産ループにおける運用に必要な拡張性、パフォーマンス、決定性、リアルタイムのQoS(サービス品質)のサポートを備えています。 それに加え、サーバレス ピアツーピア型アーキテクチャは工場での展開を簡素化するほか、追加のサービスやコンピュータの管理が不要です。

このサンプルでは、チョコレート製造プロセスを例に、MSBを実装する際のDDSの使用方法について説明します。

Chocolate factory workflow
チョコレートのバッチは、製造実行システムによって制御されているワークフローに従います。

DDSアプリケーションのセットとして構築された製造実行システムは、異なる種類のチョコレートのレシピを設定し、製造される必要のあるバッチ(ロット)を定義し、各作業セルへのバッチ経路を制御し、さらに製造プロセスの状態を監視するのに使用されます。 このサンプルは、異なる作業セルにロットを発送し、各作業セルの動作パラメータの設定とモニタリングを行うことにより、同様に動作するその他のディスクリート製造プロセスにも当てはめることができます。

このサンプルで説明すること

このサンプルでは、3つのアプリケーションについて説明します。これらのアプリケーションは同じマシンまたは同じネットワーク上の異なるマシン上で実行できます。このサンプルでは仮説としてチョコレート工場のシンプルなサブセクションをモデリングしていますが、データモデリングとサービス品質 (QoS) の調整に関する概念は、ワークフローに従うさまざまなシステムに適用できます。

3つのアプリケーションは、以下のとおりです:

device-data-replay.png

レシピ ジェネレータ (RecipeGenerator):

  • チョコレートを製造するためのレシピを提供します
device-data-replay.png

製造実行システム (ManufacturingExecutionSystem):

製造実行システム (ManufacturingExecutionSystem):

  • チョコレートの最初の状態の最新情報を提供して、以下を含むロットを配信します。
    • ロットを処理すべき最初のコントローラ
    • 使用すべきレシピの名前
  • システムを通過中のチョコレート ロットを監視します
device-data-replay.png

ステーション コントローラ (StationController):

ステーション コントローラ (StationController):

  • チョコレート ロットの状態の最新情報を受信します
  • すべてのレシピを受信します
  • チョコレート ロットの状態の更新情報をフィルタリングし、ステーション コントローラに割り当てられたチョコレート ロットまたは完了状態にあるチョコレート ロットのみを処理します
  • レシピに基づいてチョコレートを「処理」します
  • チョコレート ロットの状態を更新し、レシピの次のステーション コントローラに割り当てます
  • ロットが完了状態にあるという通知をMESシステムが受信すると、ロットの登録が解除され、処理中の特定のロットに対するメモリの消去とその状態情報の削除が可能になります。

Tこのサンプルにおけるデータ フローは、製造実行システムが次に実行すべきレシピを決定した時点で開始します。使用すべきレシピに関する情報を含む、ChocolateLotState(チョコレート ロット状態)トピックに最新情報を送信し、その処理を行うべきステーション コントローラにそのロットを割り当てます。すべてのステーション コントローラはチョコレート ロットの状態をリッスンし、コンテンツ フィルタリングを使用して、ロットを処理すべきときのみ確実に更新を確認します。

Manufacturing Execution System data flow diagram
すべてのステーション コントローラは、ChocolateLotState(チョコレート ロットの状態)トピックをリッスンして更新します。ステーション コントローラは、コンテンツ フィルタリングを使用して、そのコントローラに割り当てられたチョコレート ロットの最新情報のみを確実に受信します。

サンプルの実行

サンプルをダウンロード

サンプルファイルをダウンロードし [ Windows  |  Linux ] 、選択した場所に解凍します。このドキュメントの場所をEXAMPLE_HOMEとして参照します。

このドキュメントの場所をEXAMPLE_HOMEとして参照します。 RTI Community DDS使用例リポジトリGitHub.

このダウンロードには以下が含まれます:

  • チョコレート工場の分散アプリケーションをシミュレーションする実行可能な事前ビルド済みのアプリケーション
  • WindowsおよびLinuxシステム用のソースコードとプロジェクト ファイルのサンプル

RTI Connext DDS Professionalのダウンロード

RTI Connext DDS Professionalをまだインストールしていない場合は、ダウンロードしてインストールしてください。 30日間の試用ライセンス で、製品を試すことができます。 ダウンロードには、サンプルを実行するために必要なライブラリと、分散システムの可視化およびデバッグに使用できるツールが含まれています。

サンプルの実行

Windowsシステムでは、EXAMPLE_HOME\ExampleCode\scriptsディレクトリに移動します。 このディレクトリには、アプリケーションを開始するためのバッチファイルが4つあります::

  • AllStationControllers.bat
  • MES.bat
  • RecipeGenerator.bat
  • StationController.bat(単一のステーション コントローラの起動用)
 

ファクトリー オートメーション:Windowsでの実行 [ビデオ ファイルのダウンロード]

Linuxシステムでは、EXAMPLE_HOME/ExampleCode/scriptsディレクトリに移動します。このディレクトリには、アプリケーションを開始するためのスクリプトファイルが4つあります。

  • AllStationControllers.sh
  • MES.sh
  • RecipeGenerator.sh
  • StationController.sh(単一のステーション コントローラの起動用)

これらのスクリプトまたはバッチファイルは、同じマシンで実行することも、このサンプルをコピーして複数のマシンで実行することもできます。 同じマシンで実行すると、共有メモリ トランスポート を介して通信します。 複数のマシンで実行すると、UDPを介して通信します。

 

ファクトリー オートメーション: Linuxでの実行 [ビデオ ファイルのダウンロード]

同じネットワークの複数のマシンにアクセスできる場合は、これらのアプリケーションを別々のマシンで実行してください。

マルチキャストなしでサンプルを実行する

ネットワークがマルチキャストをサポートしていない場合、ユニキャストデータのみを使用してこのサンプルを実行できます。 ユニキャストのみで実行するには、次の2つの手順を実行する必要があります。

  • パラメータ「--no-multicast」を使用して、3つのすべてのアプリケーションを実行します。これにより、アプリケーションはネットワークのマルチキャストに依存しない.xmlファイルをロードします。
  • 通信したいマシンのアドレスを追加するように、 base_profile_no_multicast.xmlファイルを編集します。これらのアドレスは、有効なUDPv4またはUDPv6アドレスです。
<discovery>
  <initial_peers>
    <!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
    <!-- Insert addresses here of machines you want -->
    <!-- to contact                                 -->
    <!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
    <element>127.0.0.1</element>
    <!-- <element>192.168.1.2</element> -->
  </initial_peers>
</discovery>

サンプルのビルド

ディレクトリの概要

EXAMPLE_HOME
|-- Docs
`-- ExampleCode
    |-- make
    |-- win32
    |-- scripts
    `-- src
        |-- CommonInfrastructure
        |-- Config
        |-- Generated
        |-- Idl
        `-- . . .

ソースコードは次のように分かれています:

  • make - Linux makefile
  • win32 - Windowsプロジェクトとソリューションファイル
  • scripts - アプリケーションを実行するスクリプト
  • src - ソースコード
    • CommonInfrastructure - すべてのアプリケーションがRTI Connext DDSを使用してデータの送受信を開始するために使用するコード
    • Config - XML QoS設定ファイル
    • Generated - Idlから生成されたソースファイル
    • Idl - ネットワーク経由で送信されるデータ型の説明
    • その他のディレクトリ - 特定のアプリケーションのソースコード。RTI Connext DDSのパブリッシュとサブスクライブ コードは、FooInterface.hとFooInterface.cxxに含まれています

サンプルのビルド

すべてのプラットフォームで、まず、NDDSHOMEという環境変数を設定する必要があります。 この環境変数は、RTI Connext DDSインストール内のndds.5.xxディレクトリを指している必要があります。 環境変数の設定方法の詳細については、 RTIコアライブラリとユーティリティ入門ガイドを参照してください。

Windowsシステム

Windowsシステムでは、EXAMPLE_HOME\ExampleCode\win32\ChocolateFactory-.slnファイルを開いて開始します。このコードは、アプリケーションへのインターフェイスを表すライブラリ、ソース、およびIDLファイルの組み合わせで構成されています。Visual Studioのソリューションファイルは、必要なコードと必要なライブラリとのリンクを自動的に生成するように設定されています。

 

ファクトリー オートメーション: Windowsでのビルド [ビデオ ファイルのダウンロード]

Linuxシステム

Linuxシステムでアプリケーションをビルドするには、ディレクトリをExampleCodeディレクトリに変更し、次のコマンドを使用します。

gmake -f make/Makefile.<platform>

 

選択するプラットフォームは、プロセッサ、OS、およびコンパイラ バージョンの組み合わせになります。 現時点では、このサンプルは、i86Linux2.6gcc4.5.5のプラットフォームのみに対応しています

 Linuxでサンプルをビルドする 」ビデオを YouTube でご覧になるか、 MP4 ビデオ ファイルをダウンロードしてください。

その他の重要点

データモデルの考慮事項

The Manufacturing Execution System uses IDL to represent language-independent data types

DDSでデータをモデリングする際にもっとも重要な考慮事項のひとつは、「データ ストリームに含まれる、ひとつのエレメントまたは現実の世界のオブジェクトを表すものは何か?」です。  ロットの状態をその処理中に更新するシステムでは、ロットはシステムにおいて個別のオブジェクトであることは明らかです。  このサンプルでは、ChocolateFactory.idlファイルのデータタイプをモデリングしています。RTI Connext DDSは、IDL(Interface Definition Language: OMGによって定義されるインタフェース定義言語)を使用して、言語非依存型のデータタイプを定義します。IDLの詳細は、 RTIコアライブラリとユーティリティ入門ガイド で参照できます。

DDSでは、これらの現実の世界に存在する固有のオブジェクトは[2]インスタンス としてモデリングされます。. インスタンスは、//@キーの記号で示される、 キーと呼ばれる固有識別子のセットによって記述されます。  各インスタンスに対して個別の論理キューを保持するミドルウェアなど、システム内に固有のインスタンスを持つことによる メリットは数多く あります。

このサンプルでは、キーフィールドとして、lotIDを使用します。

// ID of the lot whose status is being updated
long lotID; //@key

各チョコレートロットは、固有のオブジェクトとして表されるというこの前提においてはひとつの弱点があります。それは、ロットが複数のステーションコントローラに従って動作するということです。 これは選択するオプションがあることを意味します。このデータはロットIDのみに対応付けることができます。これは、異なるステーションからの同じロットの更新情報が同じ論理キューに保管され、キューを適切に設定しないと、更新情報が相互に上書きされる可能性があるということです。 別のオプションとして、このデータをロットIDとステーション コントローラIDの両方に対応付けることができます。2番目のオプションでは、キューのサイズを1に設定し、さらに異なるステーション コントローラから受信する同じロットの更新情報が相互に上書きされないことを確信できます。

// ID of the lot whose status is being updated
long lotID; //@key

// ID of the Station Controller producing the status
StationControllerKind controller; //@key

データモデルの考慮事項 - QoS

The Manufacturing Execution System quality of service (QoS) is configured using XML files

このサンプルのデータはすべて、以下の特性を持つ、Occasionally Changing State Data(状況によって変化する状態のデータ)としてモデリングされています。

  • このデータは一部のオブジェクトの状態が変化したときのみ更新されます。このケースでは、ロットの状態の変化に従って状態の変化が発生します。
  • そのオブジェクトの状態は常に変化しているというわけではありません
  • その他のアプリケーションは、起動前にオブジェクトがパブリッシュされたとしても、各オブジェクトの最新の状態を知る必要があります

このデータは常に送信されているわけではないため、信頼性をもって送信される必要があります。Reliability QoS(信頼性QoS)は、レシピ プロファイルのXMLファイルで設定されています。これらの設定は、確実な配信を確保するために、DataWriterとDataReaderの両方で有効化されている必要があることに注意してください。

<reliability>
  <kind>RELIABLE_RELIABILITY_QOS</kind>
</reliability>

状態データの送信のためにRTI Connext DDSを使用するメリットのひとつは、状態が変化すると同時にデータを送信できるだけでなく、後で接続された関連アプリケーションも起動直後に最新の状態データを確実に受信できる機能です。これが意味することは、チョコレートロットの状態は変化の発生時に送信が可能ということです。関連アプリケーションは、まだ起動していないとしても、起動直後に最新のロット状態を受信します。後で接続されたアプリケーションへの送信を可能にするには、データは一時的にローカルで送信されるか、より高いレベルの耐久性をもって送信される必要があります。

<reliability>
  <kind>TRANSIENT_LOCAL_DURABILITY_QOS</kind>
</reliability>

各ステーション コントローラにロット状態の最新情報のみを送信するために、このXMLはロット状態インスタンス毎に1つのサイズ履歴を保持するように、DataWriterで履歴キャッシュを設定します。

<history>
  <kind>KEEP_LAST_HISTORY_QOS</kind>
  <depth>1</depth>
</history>

このデータは極めて高いスループットに対応するように調整する必要はありませんが、安定した信頼性を得るように調整します。詳細は、 FactoryStateData XMLのプロファイルに記述されています。

ステーション コントローラ (C++)

ステーション コントローラは、以下の役割を果たします:

  • 処理すべきロットをリッスンする
  • ロットを処理中であることを伝えるためにロット状態を更新する
  • ロットの更新情報を送信して、レシピに含まれる次のステーション コントローラがそのロットを処理すべきことを伝える
  • そのステーション コントローラがレシピに含まれる最後のステーションである場合、完了したことを伝えるためにロットの更新情報を送信する

ステーション コントローラを実行する際、このアプリケーションが表すStationController(ステーション コントローラ)のタイプを指定できます。

--controller-type [number]

 

有効な数字は — 1:砂糖コントローラ、2: ココアバター コントローラ、3: カカオ リカー コントローラ、4:バニラ コントローラ、5: ミルク コントローラ。

アプリケーションのDDSインタフェースを作成するコードは、StationControllerInterfaceクラスに含まれています。このクラスは、以下の4つのオブジェクトで構成されています:

  • DDSCommunicator
  • ChocolateRecipeReader
  • ChocolateLotStateWriter
  • ChocolateLotStateReader

DDSCommunicatorオブジェクトは、 ChocolateRecipeReader、ChocolateLotStateWriter、ChocolateLotStateReaderエンティティを作成するのに使用される必要なDDSエンティティを作成します。

ChocolateLotStateReaderクラスは、チョコレートロットの状態データの最新情報をすべて受信するDDS DataReaderのラッパーです。また、更新情報が取得可能になるまで、スレッドをブロックするのに使用されるDDS WaitSetオブジェクトを含みます。 このクラスは、ステーションコントローラが受信すべき、チョコレートロットの状態データを指定するコンテンツベースのフィルタを作成します。 このフィルタは、Station Controllerがこの例ではチョコレートロット情報にのみ関心があるため、以下の場合に便利です:

  • その情報を処理する必要がある、または
  • チョコレートロットが完了している(したがって、このステーションコントローラがチョコレート ロットの情報を削除できる)。

チョコレートロットの更新情報の受信を待機するために、以下の呼び出しを実行します:

void WaitForChocolateLotUpdates(
    std::vector<
    DdsAutoType<com::rti::chocolatefactory::generated::ChocolateLotState> >
        *lotState);

ChocolateLotStateWriterクラスは、DDS DataWriterのラッパーです。ステーションコントローラは、ロットを処理中、またロットの処理が完了した時点で、ロット状態の更新情報をパブリッシュします。チョコレートロットの更新情報は、PublishChocolateLotState() メソッドを使用して書き込まれます。さらに、このクラスは、ロットが完了したという通知を受信したときにステーションコントローラが使用するUnregisterChocolateLotState()メソッドを提供します。UnregisterChocolateLotState()メソッドは、以下の2つを実行する、DataWriter's unregister_instance()コールを呼び出します。

  • このDataWriterが特定のインスタンスを作成しなくなったことを、すべてのリッスンしているアプリケーションに通知する
  • このDataWriterがそのインスタンスに関連付けられた内部メモリリソースを消去することを可能にする

チョコレートロット状態のパブリッシュと登録解除のメソッドは:

void PublishChocolateLotState(
    DdsAutoType<com::rti::chocolatefactory::generated::ChocolateLotState>
        &lotState);
void UnregisterChocolateLotState(
    DdsAutoType<com::rti::chocolatefactory::generated::ChocolateLotState>
        &lotState);

ChocolateRecipeReaderクラスは、アプリケーションが名前別に各レシピを容易にクエリすることを可能にするDDS DataReaderのラッパーです。ステーションコントローラはチョコレートロットの処理を完了すると、このクラスを使用して、チョコレート レシピの次のステップのクエリを実行します。その後、チョコレートロットの状態を更新し、その更新情報をレシピの次のステーションコントローラに送信します。

void GetRecipe(
    std::string recipeName,
    DdsAutoType<com::rti::chocolatefactory::generated::ChocolateRecipe>
        *recipe);

製造実行システム (C++)

大抵の場合、MESシステムでははるかに複雑な論理が取り入れられていますが、DDSの概念を実例で説明するために、このサンプルでは非常にシンプルにまとめられています。このサンプルでは、製造実行システム (MES) は各ロットの最初の状態の最新情報を送信します。こうして、間もなくロットを処理することを最初のステーションコントローラに通知します。以下に示すように、ロット数といつ処理を開始したいかを指定できます。

MESが開始すべきロット数:

--num-lots [number]

 

ロット処理をどれくらい早く開始するか:

--time-between [time-in-ms]

 

また製造実行システムは、そのシステム自身を含め、すべてのステーションントローラから更新情報を受信するように、チョコレートロットの状態をサブスクライブします。

アプリケーションのDDSインタフェースを作成するコードは、MESInterfaceクラスに含まれています。このクラスは、以下の3つのオブジェクトで構成されています:

  • DDSCommunicator
  • ChocolateLotStateWriter
  • ChocolateLotStateReader

DDSCommunicatorオブジェクトは、 ChocolateLotStateWriterとChocolateLotStateReaderエンティティを作成するのに使用される必要なDDSエンティティを作成します。

ChocolateLotStateWriterクラスは、チョコレートロットの最初の最新情報を送信するDDS DataWriterのラッパーです。ChocolateLotStateReaderクラスは、チョコレートロットの状態データの最新情報をすべて受信するDDS DataReaderのラッパーです。

レシピ ジェネレータ (C++)

レシピ ジェネレータアプリケーションは、3つの事前に設定済みのチョコレートレシピを送信します。これは3つのアプリケーションの中でもっともシンプルです。

アプリケーションのDDSインタフェースを作成するコードは、RecipePublisherInterfaceクラスに含まれています。このクラスは、以下の2つのオブジェクトで構成されています:

  • DDSCommunicator
  • ChocolateRecipeDataWriter

DDSCommunicatorオブジェクトは、 ChocolateRecipeDataWriterエンティティを作成するのに使用される必要なDDSエンティティを作成します。

ChocolateRecipeDataWriterクラスは、レシピを送信するDDS DataWriterのラッパーです。これらのレシピは、状態データとしてモデリングされています。各レシピは、キーフィールドとしての役割を果たすレシピ名を持つ、独立したインスタンスです:

 string<MAX_STRING_LENGTH> recipeName; //@key

次のステップ

コミュニティに参加する

RTIコミュニティフォーラム に、質問を投稿してください。

これらの RTIコミュニティGitHub でCase + Codeでのサンプルに貢献してみましょう。 指示を使用して、