タスク3.2 - エリア制限PLCロジックを追加する
タスクの概要
このタスクでは、[変数を取得]アクティビティを使用してフォトアイ変数の状態を取得する方法について学習します。フォトアイ同士が互いにやり取りし、特定のエリアへのアイテムのフローを制限するエミュレーションシステムを設計します。[変数を取得]アクティビティはフォトアイで使用され、制限エリアがクリアになっていて、フローアイテムを受け取ることができるかどうかを判断します。そうでない場合は、エリアが再びクリアになるまでモーターが停止します。
作業が完了すると、シミュレーションモデルは次の画像のように実行します。
ステップ1 3Dモデルを編集する
このステップでは、3Dモデルを編集して、最初のコンベヤラインに交差する2つ目のコンベヤラインを追加します。また、このコンベヤをコントロールする別のモーターのほかに、そのソース、プロセッサ、シンクも追加します。最後に、2つのコンベヤを異なる色にして、視覚的に簡単に区別できるようにします。作業が終了すると、モデルは次の画像のようになります。
このモデルを構築するには:
- 3Dモデルウィンドウが開いていてアクティブであることを確認します。ライブラリから、次の3Dオブジェクトをモデルにドラッグします。
- [ソース]
- [直線コンベヤ]([コンベヤ]の下)
- [プロセッサ]
- [シンク]
- [モーター]([コンベヤ]の下)
- Conveyor2(新たに追加されたコンベヤ)の終点を、他のコンベヤに対して垂直になるように90度回転させます。
- Conveyor2とConveyor1を交差させます。
- [Processor2]をクリックして選択します。[プロパティ]で、[Z回転]を「
-90.00
」に変更します。 - 1つの[フォトアイ]([コンベヤ]の下)をConveyor1に追加し、Conveyor2の交差点の少し後ろに配置します。
- 2つの[フォトアイ]オブジェクトをConveyor2に追加し、Conveyor1の交差点の少し前と少し後ろに配置します。
- 分かりやすくするために、フォトアイの名前を次のように変更します。
- 次のオブジェクト間でポート接続(A接続)を作成します。
- Motor2からConveyor2
- Source2からConveyor2
- Conveyor2からProcessor2
- Processor2からSink2
- [Source2]をクリックして、右側でそのプロパティを表示します。[プロパティ]の[ソース]セクションで、[時刻0に到着]ボックスをオンにします。
- [到着時間間隔]ボックスで、現在のテキストを削除し、「
10
」と入力します。 - [ツールボックス]の[コンベヤシステム]グループで、[ConveyorType1]を右クリックしてメニューを開きます。[複製]を選択して、このコンベヤタイプのコピーを作成します。
- コピーしたコンベヤタイプをクリックして、右側でそのプロパティを開きます。[直線コンベヤ]セクションで、[プロパティ]ボタンをクリックして[コンベヤタイプのプロパティ]ウィンドウを表示します。
- 上部の名前ボックスで、このコンベヤタイプの名前を「ConveyorType2」に変更します。
- [ビジュアル]タブの[サイドスカート]グループで、[色]を赤に変更します。
- [OK]ボタンをクリックして変更を保存し、ウィンドウを閉じます。
- [ツールボックス]で[ConveyorType1]をダブルクリックして、プロパティウィンドウを開きます。
- [ビジュアル]タブの[サイドスカート]グループで、[色]を水色に変更します。
- [OK]ボタンをクリックして変更を保存し、ウィンドウを閉じます。
- 3Dモデルで、[Conveyor2]をクリックして選択します。[プロパティ]で、[コンベヤタイプ]メニューをクリックし、[ConveyorType2]を選択します。
オブジェクト | 新しい名前 |
---|---|
Conveyor1の交差点の前のフォトアイ | PhotoEye1A |
Conveyor1の交差点の後のフォトアイ | PhotoEye1B |
Conveyor2の交差点の前のフォトアイ | PhotoEye2A |
Conveyor2の交差点の後のフォトアイ | PhotoEye2B |
シミュレーションモデルがこのステップの冒頭に表示した画像のようになっていることを確認します。
ステップ2 アクティビティと変数を処理フローに追加する
このステップでは、最初のコンベヤのシミュレーションロジックをコントロールする処理フローを編集します。さまざまな形状、アクティビティ、エミュレーション変数を追加して名前を変更します。作業が完了すると、処理フローは次の画像のようになります。
現時点では、これらのアクティビティの追加と処理フローへの接続のみを行います。後のステップで、プロパティを編集して機能を追加します。
これらのアクティビティと変数を追加するには:
- 処理フローを開いてアクティブにした状態で、[センサー(入力)]形状の名前を「Conveyor1:チェックエリアがクリア」に変更します。
- この形状の直下に、別の[処理]形状を追加します。
- 新しい形状の名前を「Conveyor1:エリアがクリアになったときに通知」に変更します。
- [Conveyor1:チェックエリアがクリア]形状で、アクティビティのスタックブロックをクリックし、[リンク解除]ボタン をクリックして[変数を設定:モーターを0]、[遅延:5秒間]アクティビティのリンクを取り、以後はスタックブロックに接続されないようにします。
- [遅延:5秒間]アクティビティを削除します。
- まず[ソース:フォトアイのアイテム]アクティビティで始まる新規のスタックブロックを作成します。次のアクティビティを最後に追加します。
- [変数を取得]([共有アセット]の下)
- [決定]([ベーシック]の下)
- 今度は[変数を設定:モーターを0]アクティビティで始まるスタックブロックをもう1つ作成します。[イベントを待つ]([ベーシック]の下)を後ろに追加します。
- [変数を設定:モーターを1]で始まるスタックブロックをこのスタックブロックの最後まで動かします。
- 次のアクティビティを使用して別のスタックブロックを作成します。
- 1つの[イベントトリガーソース]([トークンの作成]の下)
- [変数を設定]([共有アセット]の下)
- 1つの[シンク]([ベーシック]の下)
- アクティビティの右側に[シンク]([ベーシック]の下)を追加します。
- アクティビティと共有アセットの名前を次のように変更します。
- [決定:PhotoEye 2Aがクリアかどうか]アクティビティから出る2つのコネクターを作成します。最初のコネクターは[変数を設定:Motor1を0]アクティビティに続きます。2番目のコネクターは[シンク:アイテム続行]アクティビティに続きます。
- コネクター1をクリックして選択します。[プロパティ]の[名前]ボックスに「
No
」と入力します。 - コネクター2をクリックして選択します。[プロパティ]の[名前]ボックスに「
Yes
」と入力します。 - [Conveyor1:エリアがクリアになったときに通知]形状で、次のアクティビティを使用してアクティビティのスタックブロックを作成します。
- 1つの[イベントトリガーソース]([トークンの作成]の下)
- [変数を設定]([共有アセット]の下)
- 1つの[シンク]([ベーシック]の下)
- この新しいアクティビティのスタックブロックの右側に、[変数]([共有アセット]の下)を追加します。
- これらのアクティビティの名前を次のように変更します。
- [コントロール(出力)]形状で、[変数:モーター]をクリックして選択します。名前を「変数:Motor1]をコピーします。
- Ctrl + Cキーを押して[変数:Motor1]をコピーします。形状の空白部分をクリックし、Ctrl + Vキーを押してコピーを貼り付けます。新しい変数の名前が[変数:Motor2]であることを確認します。
アクティビティ | 新しい名前 |
---|---|
ソース:フォトアイのアイテム | ソース:PhotoEye 1Aのアイテム |
変数を取得 | 変数を取得:PhotoEye 2Aの状態 |
決定 | 決定:PhotoEye 2Aがクリアかどうか |
変数を設定:モーターを0 | 変数を設定:Motor1を0 |
イベントを待つ | イベントを待つ:PhotoEye2Aがクリア |
変数を設定:モーターを1 | 変数を設定:Motor1を1 |
変数:フォトアイ | 変数:PhotoEye1A |
シンク | シンク:アイテム続行 |
アクティビティ | 新しい名前 |
---|---|
ソース | ソース:PhotoEye1Bがクリア |
変数を設定 | 変数を設定:PhotoEye1Aをクリア |
シンク | シンク:Conveyor1エリアがクリア |
変数 | 変数:PhotoEye 1B |
この時点でシミュレーションモデルを保存することをおすすめします。
ステップ3 コンベヤ2のロジックをコピーおよび適応する
このステップでは、最初のコンベヤのシミュレーションロジックをコントロールする処理フローのセクションをコピーし、これを2つ目のコンベヤに適合させます。作業が完了すると、処理フローのコピーしたセクションは次のような画像になります。
現時点では、これらのアクティビティの追加と処理フローへの接続のみを行います。後のステップで、プロパティを編集して機能を追加します。
これらのアクティビティと変数をコピーして名前を変更するには:
- [Conveyor1:チェックエリアがクリア]形状をクリックして選択します。Ctrl + Cキーを押してコピーします。処理フローの空白部分をクリックし、Ctrl + Vキーを押してコピーを作成します。
- 新たにコピーした形状の名前を「Conveyor2:チェックエリアがクリア」に変更します。
- [プロパティ]で、新たにコピーした形状の[色]を赤に変更します(Conveyor2の色に合わせる)。
- [Conveyor2:チェックエリアがクリア]形状で、次のアクティビティと共有アセットの名前を次のように分かりやすく変更します。
- [Conveyor1:エリアがクリアになったときに通知]形状をクリックして選択します。Ctrl + Cキーを押してコピーします。処理フローの空白部分をクリックし、Ctrl + Vキーを押してコピーを作成します。
- 新たにコピーした形状の名前を「Conveyor2:エリアがクリアになったときに通知」に変更します。
- [プロパティ]で、新たにコピーした形状の[色]を赤に変更します(Conveyor2の色に合わせる)。
- 今回は単に[変数:PhotoEye 1B1]変数を削除します。この変数は後で作成します。
- [Conveyor2:エリアがクリアになったときに通知]形状で、次のアクティビティと共有アセットの名前を次のように分かりやすく変更します。
アクティビティ | 新しい名前 |
---|---|
変数:PhotoEye 1A1 | 変数:PhotoEye 2A |
ソース:PhotoEye 1Aのアイテム | ソース:PhotoEye 2Aのアイテム |
変数を取得:PhotoEye 2Aの状態 | 変数を取得:PhotoEye 1Aの状態 |
決定:PhotoEye 2Aがクリアかどうか | 決定:PhotoEye 1Aがクリアかどうか |
変数を設定:Motor1を0 | 変数を設定:Motor2を0 |
イベントを待つ:PhotoEye2Aがクリア | イベントを待つ:PhotoEye1Aがクリア |
変数を設定:Motor1を1 | 変数を設定:Motor2を1 |
アクティビティ | 新しい名前 |
---|---|
ソース:PhotoEye 1Bがクリア | ソース:PhotoEye 2Bがクリア |
変数を設定:PhotoEye1Aをクリア | 変数を設定:PhotoEye2Aをクリア |
シンク:Conveyor1エリアがクリア | シンク:Conveyor2エリアがクリア |
この時点でシミュレーションモデルを保存することをおすすめします。
ステップ4 変数のリンクと接続を更新する
このステップでは、すべてのエミュレーション変数共有アセットを更新して、OPC DA接続変数に接続します。また、すべての変数が3Dモデル内の正しいオブジェクトにリンクされていて、正しく設定されていることを確認します。これらの更新を行うには:
- [コントロール(出力)]形状で、[変数:Motor2]をクリックして選択してください。選択したときに、[OPC DA接続]変数にリンクする青い線が表示されることを確認します。
- [プロパティ]で、[関連オブジェクト]ボックスの横にある[サンプラー]ボタンをクリックして、サンプリングモードに入ります。
- 3Dモデルで[モーター2](赤いコンベヤに接続されたモーター)をクリックしてサンプリングします。
- [Conveyor1:チェックエリアがクリア]形状で、[変数:PhotoEye 1A]をクリックして選択します。選択したときに、[OPC DA接続]変数にリンクする青い線が表示されることを確認します。
- [プロパティ]で、[関連オブジェクト]ボックスに[
PhotoEye1A
]が表示されていることを確認します。 - [アンカバー時]イベントの横にある[イベントを書き込む]グループで、[削除]ボタン をクリックして、このイベントを削除します。
- [Conveyor2:チェックエリアがクリア]形状で、[変数:PhotoEye 2A]をクリックして選択します。選択したときに、[OPC DA接続]変数にリンクする青い線が表示されることを確認します。
- [プロパティ]で、[関連オブジェクト]ボックスの横にある[サンプラー]ボタンをクリックして、サンプリングモードに入ります。
- 3Dモデルで、[PhotoEye2A](赤いコンベヤの最初のフォトアイ)をクリックしてサンプリングします。
- [アンカバー時]イベントの横にある[イベントを書き込む]グループで、[削除]ボタン をクリックして、このイベントを削除します。
- [Conveyor1:エリアがクリアになったとき通知]形状で[変数:PhotoEye 1B]をクリックして選択します。[プロパティ]で、[変数または値]ボックスの横にある矢印をクリックしてメニューを開きます。[内部エミュレーション変数]をポイントし、[OPC DAセンサータグ]を選択します。
- [接続]ボックスの横にある[サンプラー]ボタン をクリックして、サンプリングモードに入ります。
- [サーバー接続]形状で、[OPC DA接続]変数をクリックしてサンプリングします。
- [関連オブジェクト]ボックスの横にある[サンプラー]ボタン をクリックし、サンプリングモードにします。
- 3Dモデルで、[PhotoEye1B](青いコンベヤの2つ目のフォトアイ)をクリックしてサンプリングします。
- [イベントを書き込む]グループで、[追加]ボタン をクリックしてメニューを開きます。[アンカバー時]を選択します。
- [書き込み値]ボックスで、現在のテキストを削除し、「
0
」と入力します。 - [PhotoEye 1B]を選択した状態で、Ctrl + Cキーを押してこの変数をコピーします。[Conveyor2:エリアがクリアになったときに通知]形状で空白スペースをクリックし、Ctrl + Vキーを押して変数をこの形状に貼り付けます。
- コピーした変数の名前を「変数:PhotoEye 2B」に変更します。
- [変数:PhotoEye 2B]をクリックして選択します。[プロパティ]で、[関連オブジェクト]ボックスの横にある[サンプラー]ボタンをクリックして、サンプリングモードに入ります。
- 3Dモデルで、[PhotoEye2B](赤いコンベヤの2つ目のフォトアイ)をクリックしてサンプリングします。
この時点でシミュレーションモデルを保存することをおすすめします。
ステップ5 エリア制限ロジックを作成する
このステップでは、プロパティを編集して、コンベヤ1のエリア制限ロジックを追加します。[チェックエリアがクリア]形状の各アクティビティの機能の概要を次に示します。
アクティビティ | 説明 |
---|---|
ソース:Photo Eye 1Aのアイテム | これは、最初のコンベヤ上のPhotoEye1Aにリンクされている変数のイベントをリッスンするイベントリスニングアクティビティです。このステップではこのロジックを変更しないため、変更時イベントをリッスンします。つまり、PhotoEye1Aがフローアイテムでカバーされるタイミングをリッスンします。フォトアイがカバーされると、サーバーに1の値が書き込まれます。ソースは、フォトアイ変数の変更をリッスンします。サーバーに1の値が書き込まれると、ソースは次の下流アクティビティにトークンをリリースします。すでにロジックを設定してあるため、このアクティビティを変更する必要はありません。 |
変数を取得:PhotoEye 2Aの状態 | [変数を取得]アクティビティは、サーバーに接続されている他の変数から情報を取得できます。この場合、PhotoEye2A変数の値を取得し、その値をPhotoEyeStateという名前のトークンのラベルに格納します。値が1の場合は、PhotoEye2Aがカバーされることを意味します。値が0の場合は、PhotoEye2Aがクリアになっていることを意味します。 |
決定:PhotoEye2Aがクリアかどうか | このアクティビティではPhotoEyeStateラベルを使用して、現在のトークンを送信するコネクターを決定します。PhotoEyeStateラベルの値が1の場合は、値がtrueで、PhotoEye2Aがカバーされることを意味します。つまり、制限エリアはクリアではありません。[決定]は一連のアクティビティにトークンを送信してモーターを停止させ、エリアがクリアになるまでフローアイテムを待機させます。ラベルの値が0の場合、フローアイテムは続行し、トークンはコネクター2に接続された[シンク]アクティビティに送信されます。 |
変数を設定:モーターを0 | このアクティビティでは、モーター変数が0に設定され、3Dモデルのコンベヤモーターが停止します。すでにロジックを設定してあるため、このアクティビティを変更する必要はありません。 |
イベントを待つ:PhotoEye2Aがクリア | このアクティビティは、PhotoEye2Aが0(クリア)に変わるまでトークンを保持します。PhotoEye2Aが0に変わると、トークンは次の下流アクティビティにリリースされます。 |
変数を設定:モーターを1 | このアクティビティでは、モーター変数が1に戻され、コンベヤの実行が再開します。すでにロジックを設定してあるため、このアクティビティを変更する必要はありません。 |
[エリアがクリアになったときに通知]形状の各アクティビティの機能の概要を次に示します。
アクティビティ | 説明 |
---|---|
ソース:PhotoEye 1Bがクリア | このアクティビティは、PhotoEye 1Bがクリアから変わるタイミング、またはカバーに変わるタイミングをリッスンします。その変更が発生すると、トークンがリリースされます。 |
変数を設定:PhotoEye1Aをクリア | このアクティビティはトークンを受け取ると、PhotoEye 1Aをクリアするように設定します。 |
シンク:Conveyor1エリアがクリア | このアクティビティでは、処理フローからトークンが削除され、フローアイテムはコンベヤに沿って継続します。このアクティビティにはデフォルト設定を使用します。 |
このロジックは、2つ目のコンベヤのアクティビティにもコピーします。
これらの変更を行うには:
- [Conveyor1:チェックエリアがクリア]形状で、[変数を取得:PhotoEye 2Aの状態]アクティビティをクリックして選択します。[プロパティ]で、[変数参照]ボックスの横にある[サンプラー]ボタンをクリックして、サンプリングモードに入ります。
- [Conveyor2:チェックエリアがクリア]形状で、[変数:PhotoEye 2A]変数をクリックしてサンプリングします。
- [割り当て先]オプションの下にあるボックスで、現在のテキストを削除し、「
token.PhotoEyeState
」と入力します。 - 以上のステップを繰り返し[変数の取得:PhotoEye 1Aの状態]アクティビティ([Conveyor2:チェックエリアがクリア]形状内)に適用し、[変数参照]を[変数:PhotoEye1A」に変更します。[割り当て先]ラベル名も「
token.PhotoEyeState
」に変更します。 - [決定:PhotoEye2Aがクリアかどうか]アクティビティをクリックして選択します。[プロパティ]で、[トークンを送信]ボックスの横にある矢印をクリックして、メニューを開きます。[条件付きで決定]を選択してピックリストオプションを開きます。
- [条件]ボックスで、現在のテキストを削除し、「
token.PhotoEyeState
」と入力します。 - 前のステップを繰り返し[決定:PhotoEye1Aがクリアかどうか]アクティビティ([Conveyor2:チェックエリアがクリア]形状内)に適用します。
- [イベントを待つ:PhotoEye2Aがクリア]アクティビティをクリックして選択します。[プロパティ]で、[オブジェクト]ボックスの横にある[サンプラー]ボタンをクリックして、サンプリングモードに入ります。
- [Conveyor2:チェックエリアがクリア]形状で、[変数:PhotoEye 2A]変数をクリックしてメニューを開きます。[変数:PhotoEye 2A:変更時]を選択します。
- [プロパティ]の[ラベルの割り当て/値に一致]テーブルで、[ラベル名または値]列の[新しい値]行にあるセルをクリックします。「0」を入力します。
- [オペレーション]列の[新しい値]行にあるセルをクリックして、メニューを開きます。[値を一致]を選択します。
- 前のステップを繰り返し[イベントを待つ:PhotoEye1Aがクリア]アクティビティ([Conveyor2:チェックエリアがクリア]形状内)に適用し、[オブジェクト]を[変数:PhotoEye 1A]に変更します。
- [Conveyor1:エリアがクリアになったら通知]形状で、[ソース:PhotoEye 1Bがクリア]アクティビティをクリックして選択します。このアクティビティの横にある[感嘆符]ボタン をクリックして、サンプリングモードに入ります。
- [変数:PhotoEye 1B]をクリックしてメニューを開きます。[変数:PhotoEye 1B:変更時]を選択します。
- 前のステップを繰り返し[ソース:PhotoEye 2Bがクリア]アクティビティ([Conveyor2:チェックエリアがクリア]形状内)に適用し、[変数:PhotoEye2B]を代わりにサンプリングします。
- [Conveyor1:エリアがクリアになったら通知]形状で、[変数を設定:PhotoEye 1Aをクリア]アクティビティをクリックして選択します。このアクティビティの横にある[感嘆符]ボタン をクリックして、サンプリングモードに入ります。
- [変数:PhotoEye 1A]([Conveyor1:チェックエリアがクリア]形状内)をクリックしてサンプリングします。
- 前のステップを繰り返し[変数を設定:PhotoEye 2Aをクリア]([Conveyor2:チェックエリアがクリア]形状内)に適用し、[変数:PhotoEye2A]を代わりにサンプリングします。
モデルをリセットして実行します。
フローアイテムがコンベヤ2(赤いコンベヤ)の最初のフォトアイに到達すると、モーター停止ロジックがトリガーされます。その後、コンベヤ1(青いコンベヤ)の2番目のフォトアイがクリアになると、モーターが再開します。さまざまなソースの到着時間を試してみて、キュー時間にどのように影響するか確認してください。
結論
これで、FlexSimで基本的なPLCロジックをエミュレートする方法を学びました。実際の製造システムを構築する場合は、このようにさまざまなPLCに任意の数の変数をプログラムした後、これをPLCプログラマーに引き渡して最終的にシステムで使用される実際のPLCロジックをプログラムします。
PLCがプログラムされたら、製造システムに実際に実装する前に、FlexSimを使用してPLCが正しくプログラムされているかどうかを検証できます。このロジックを検証するには、OPC DA接続のプロパティを使用して、FlexSimを実際のOPC DAサーバーに接続する必要があります。また、すべてのエミュレーション変数をサーバー上の適切なタグIDに割り当てる必要もあります。次に、FlexSimでOPC DA接続の共有アセットを「アクティブ」に変更して、実際のサーバーで値を読み取りまたは書き込みするようにします。
この時点で、シミュレーションモデルを実行し、想定した動作をPLCが実際のシステムで行っていることをテストできます。理論的には、将来的なビジネスシステムのシミュレーションをFlexSimで作成したことになります。したがって、PLCはシミュレーションモデルの要素を直接コントロールします。実際のPLCがどのようにプログラムされているかを観察し、PLCが3Dモデルに直接接続される前のシミュレーションモデルの実行方法と比較できます。詳細については、「PLCロジックを検証する」を参照してください。