C#で簡単な開発をしてみよう

はじめまして。Emulate3Dの技術担当の小嶋です。ブログ記事を書くのは初めてになります。

今週から、定期的にEmulate3Dの技術をブログ記事として執筆していきます。
今回のテーマは、『C#で簡単な開発をしてみよう』です。プログラミング初心者の方でも分かりやすい解説をしていこうと考えているので、ぜひ最後までご覧ください。

 

モデリング

手順1… 画像のようなEmulate3Dのモデルを用意します。

Emulate3D コンベヤ

コンベヤは、カタログ(Emulate3D上の画面左のCatalogs)からQuickStart 2020>Carton Systems>Single Zone Carton Beltを配置します。

Load Creatorからは、”Red Box”と”Blue Box”が出てくるように設定します。

Emulate3D コンベヤ

そのまま再生すると、ワーク(Load Creatorから発生する)が流れてきて終点に到達すると Load Deleter でワークが消える、 という動作を繰り返します。
今回は、「どの種類のワークが何個流れたか」をカウントする Script を C#で書いていきます。
 

センサーでワークの検出

手順2…カタログからSampleCatalog>Sensorをコンベヤ上に配置します。 

(下記画像をクリックすると高解像度でご覧いただけます)

Emulate3D コンベヤ センサー

手順3…配置したSensorにScriptを追加します。

Sensorのプロパティウインドウから、Script>New Jscriptを選択すると下記画像のようなポップアップが開きます。  C#を選択しているのを確認し、Create&Editをクリックします。
(下記画像をクリックすると高解像度でご覧いただけます)

Emulate3D コンベヤ

ここまでの手順で、Visual Studioが自動的に開きます。

手順4…Visual Studio上にC#のScriptを記載します。

    // Sensorにワークが触れた時に、このメソッドは実行される。
    [Auto]
    void OnBlocked(PhysicsObject sender, Visual load)
    {
        // 下記のScriptで、ワークの種類を出力する。
        print(load.Type);
    }


上記のコードを記載するとVisual Studio上では下記画像のようになります。
(下記画像をクリックすると高解像度でご覧いただけます)

Emulate3D コンベヤ

この状態でEmulate3Dのモデル再生をすると、ワークがSensorに触れるたびに、OnBlockedメソッドが実行されます。そのため、MessageLog上に、ワークのプロパティである”Red Box” もしくは”Blue Box” と出力されます。
しかし、この状態では、「RedBoxが2つ、BlueBoxが1つ・・・」何個通過したのか?を目で追って、計算しないといけません。 集計をScriptで行うことができたら、もっと楽で便利ですよね。

集計を行うためにScriptを記載する

手順5…カウント用変数を独自のカスタムプロパティとして定義します。

    // Red Boxをカウントする用の変数を独自カスタムプロパティとして付与
    [Auto] CustomPropertyValue<int> countRedBox;
    // Blue Boxをカウントする用の変数を独自カスタムプロパティとして付与
    [Auto] CustomPropertyValue<int> countBlueBox;


プロパティウインドウに countRedBox、countBlueBoxの2つのプロパティが追加されました。

手順6…OnBlockedメソッドにScriptを追加します。

    // Sensorにワークが触れた時に、このメソッドは実行される。
    [Auto]
    void OnBlocked(PhysicsObject sender, Visual load)
    {
        // ワークのプロパティTypeがRed Boxの場合
        if(load.Type == "Red Box")
        {
            // countRedBoxの値を1加算する
            countRedBox.Value++;
        }
        // ワークのプロパティTypeがBlue Boxの場合
        else if (load.Type == "Blue Box")
        {
            // countBlueBoxの値を1加算する
            countBlueBox.Value++;
        }
    }


OnBlockedメソッドで、ワークが “Red Box”か”Blue Box” のどちらであるかを判定するScriptを追加します。”Red Box” ならcountRedBoxの値を、”Blue Box” ならcountBlueBoxの値を1加算することで、ワークのカウントができるようになりました。

モデル再生中に一時停止し、プロパティウインドウから現在の通過数を確認できます。下記画像の例のcountRedBox、countBlueBoxがそれぞれ7となっています。
(下記画像をクリックすると高解像度でご覧いただけます)

Emulate3D コンベヤ
Emulate3D プロパティ

しかし、モデルをリセットすると、前回実行時のcountRedBox、countBlueBoxの値がそのまま残ってしまいます。再度再生しなおしても、値が7からスタートしてしまうため、正しい値をカウントすることができません。


手順7…モデル再生時に初期化する処理を定義します。

    // モデル再生時に、このメソッドは実行される。
    [Auto]
    void OnInitialize(Visual sender)
    {
        // モデル再生時、値をリセットする
        countRedBox.Value = 0;
        countBlueBox.Value = 0;
    }

モデル再生時に実行される初期化処理であるOnInitializeメソッドの中でcountRedBox、countBlueBoxの値を0にする処理を定義します。
完成したScriptは下記の通りです。

[Auto] public class SensorScript : NativeObject {
    public SensorScript(Visual sender) : base(sender) {}

    // Red Boxをカウントする用の変数を独自カスタムプロパティとして付与
    [Auto] CustomPropertyValue<int> countRedBox;
    // Blue Boxをカウントする用の変数を独自カスタムプロパティとして付与
    [Auto] CustomPropertyValue<int> countBlueBox;

    // モデル再生時に、このメソッドは実行される。
    [Auto]
    void OnInitialize(Visual sender)
    {
        // モデル再生時、値をリセットする
        countRedBox.Value = 0;
        countBlueBox.Value = 0;
    }

    // Sensorにワークが触れた時に、このメソッドは実行される。
    [Auto]
    void OnBlocked(PhysicsObject sender, Visual load)
    {
        // ワークのプロパティTypeがRed Boxの場合
        if(load.Type == "Red Box")
        {
            // countRedBoxの値を1加算する
            countRedBox.Value++;
        }
        // ワークのプロパティTypeがBlue Boxの場合
        else if (load.Type == "Blue Box")
        {
            // countBlueBoxの値を1加算する
            countBlueBox.Value++;
        }
    }
}


 

おわりに

いかがでしたでしょうか。
Emulate3DでScriptを使うと、できることは無限大に広がっていきます。  あらゆる悩みを解決できるEmulate3Dソリューションに、今後もご期待ください。

サポートサイトには簡単なScriptの使い方も掲載しています。こちらも併せてご活用ください。