Node-REDとチューリップ・タグを使ってエッジ・デバイスからマシンにデータを送信する方法
  • 04 Nov 2023
  • 2 読む分
  • 寄稿者

Node-REDとチューリップ・タグを使ってエッジ・デバイスからマシンにデータを送信する方法


Article Summary

Node-REDでTulipタグを使用して、エッジデバイスからTulipマシンにネイティブにデータを送信する方法をご紹介します。

OS 50.1以降、TulipはTulip Edge Devicesをマシン・データ・ソースとして使用することをネイティブにサポートしています。

Node REDを使用すると、新しいtulip-tagノードで任意の「タグ」を作成し、それらのタグにデータを送信できます。これらのタグは、マシン属性のマッピング時に、データソースとして特定のエッジデバイスの下に自動的に表示されます。

**新しいフローでは、マシンAPIよりもチューリップ・タグを使用することを推奨します。**チューリップ・タグを使用すると、デバイス固有の変更なしにデバイス間で共有できる再利用可能なフローを使用してマシン・データをレポートできるようになり、マシンAPIノードにマシン属性情報をコピー・ペーストする必要がなくなります。

概要

この記事では、Tulip Edgeデバイスにプリインストールされている新しいTulip Tagノードを使用して、Node-REDからTulip Machineにデータを送信する方法について説明します。

このガイドでは、以下の手順を説明します:

必要条件

チューリップ・タグを作成するには、以下のチューリップ・エッジ・デバイスが必要です:

  • Node-REDをサポートしていること(Edge MCまたはEdge IO)
  • Node-REDが有効になっている
  • ファームウェアのバージョンがOS50以上である

ユーザーガイド

このガイドでは、タグを作成し、タグにデータを送信し、そのタグを Tulip のマシン属性にマッピングするための Node-RED のワークフローを説明します。また、複数のタグに同時に書き込む方法も説明します(OS 51 以降のみ)。

Node-REDでタグを作成する

  1. TulipエッジデバイスでNode-REDを開き、ログインします。

    1. *Node-REDへのアクセス方法はこちらを参照してください:エッジIOでNode-REDを使う
    2. OS50以降であれば、Node-REDエディタの左サイドバーにTulip Tagノードが表示されます。

  1. tulip-tagノードをエディタにドラッグ&ドロップし、ダブルクリックしてノードエディタを開きます。このエッジデバイスのすべてのタグを含むタグリストを作成する必要があります。タグリストはエッジデバイスごとに1つだけ作成します。 **Edit]**をクリックして、新しいタグリストを作成します。

  1. タグリストノードでは、好きなだけタグを作成できます。タグを作成するには、[+add] をクリックします。

  1. 各タグには、ID、ラベル、タイプの3つの部分があります。

    1. **タグID:**タグを識別するコードのような識別子です。一度作成したら、変更することはできません。有効な文字はアルファベット、数字(数字で始まるものは不可)、アンダースコアです。例:part_countmyState1
    2. タグ・ラベル:これはタグに割り当てることができる、人間が読めるラベルです。タグの名前を変更するには、(IDではなく)ラベルを更新します。例「パートカウント
    3. タイプ:データ型(String、Integer、Float、Boolean)。マッピングされたマシン属性のタイプと一致する必要があります。

  1. タグの追加が完了したら、Addをクリックして変更を確定し、前のノードエディタに戻ります。保存する前にエラーがないことを確認します。

:::(Info) (注意)"Unmapped "はエラーではなく、タグをTulipのマシン属性にまだマッピングしていないという警告です:

Node-REDでのタグへのデータ送信

タグリストを作成すると、タグの選択ドロップダウンにすべてのタグ(人間が読めるラベル)が自動的に入力されます。

  1. このノードのタグを選択します。

  1. このタグにデータを書き込むには、このtulip-tagノードにメッセージを送信する必要があります。ノードに送信されたメッセージのペイロード(msg.payload)がタグに書き込まれます。

たとえば以下の例では、Inject ノードをmsg.payload=0でリンクし、タグ Part Count に整数 0 を書き込んでいます。

タグをマシン属性にマッピングする

最後に、Tulipでデータを表示するには、Tulipサイトにアクセスし、タグをマシン属性に マッピングする必要があります。

  1. マシン・ページに移動し、データを送信するマシンを選択し、[Configuration]タブを開きます。マシン属性のリストが表示されるので、属性をクリックしてマッピングします。データソースとしてエッジデバイス(シリアル番号)が表示されるはずです。このデータソースを作成する必要はありません。タグリストを含むフローをデプロイすると、自動的に作成されます。
  2. 右サイドバーのエッジデバイスをクリックし、Node-REDフォルダを展開します。属性と同じタイプの属性がすべて表示されるはずです。該当する属性の横にあるリンクボタンをクリックしてマッピングします。

  1. 属性がマップされ、マップされたタグのタグラベルがシグナルとして表示されます。

  1. さらに、Node-REDでは、Tulip Tagノードのステータスが "Unmapped "から "Connected "に変わっているはずです。

  1. タグにデータを書き込む(この例では "Inject "ノードをクリックする)と、マッピングされた属性のデータが表示されるようになります。

複数のタグにデータを送信する(詳細)

:::(Info) (注)この機能はOS51以降でのみ利用可能です:

一度に複数のタグに一括して書き込むことができます。

  1. Node-REDでTulip Tagノードを作成し、Select Tag from Listオプションのチェックを外します。

  1. このノードへの入力メッセージのペイロードには、書き込む値へのタグIDのマップを含める必要があります。 たとえば、idpart_countを持つ整数タグにパートカウント0を、idstateを持つ文字列タグに状態"Running"を書き込む場合、メッセージは次のようになります:

msg.payload = { "part_count":0, "state":msg.payload = { "part_count": 0, "state": "Running" }

例Edge IO と Node-RED によるマシン状態とパートカウントの管理

この例は、この記事で説明されている Node RED ライブラリフローの更新版です:Edge IOとNode-REDを使用したマシン状態と部品数の管理

このフローは、Machine Attributeノードの代わりにTulip Tagノードを使用するように更新されています。このフローは変更することなく、多くのEdgeデバイスに展開できます。

  1. Node-REDで、以下のフローをインポートしてデプロイします:


## 65CCB8", "icon": "font-awesome/fa-arrows-v"},{"id": "d99ec5b3.e9dfb8", "type": "function", "z": "85d16074.518e2", "name": "Convert values with scale/offset", "func": "const scale = env.get('SCALE');ⅳconst offset = env.get('OFFSET');ⅳconst prop = env.get('PROPERTY');ⅳif (Array.isArray(msg[prop])){msg[prop] = msg[prop].map((x) => (scale \* x + offset));ⅳ} else {n msg[prop] = scale \* msg[prop] + offset;ⅳ}nreturn msg;", "outputs": 1, "noerr": 0, "initialize":", "finalize":", "x": 250, "y": 60, "wires":[[]]},{"id": "71c9f8f2.7adf08", "type": "tab", "label": "Machine Visibility with Current Clamp and Breakbeam", "disabled": "false", "info": "This library flow is a basic machine monitoring application to gain visibility into the machine's state and part count using a current clamp and breakbeam.以下の2つのEdge IO入力を追跡します:パート・カウント:0から始まり、GPIOピン1がHighにトグルされるたびにカウントアップ。Reset Part Count'ノードで0にリセット可能。パートカウントが変更されるたびに、現在のパートカウントをTulip Machine Attributeに送信する。**\マシンステータス**:機械ステータス:CR-3111 電流クランプによってモニタされている機械の RMS 電流を Edge IO 差動 ADC に送信。RMS 読み取り値は、5 秒に 1 回サンプリングされた、1kHz で取り出されたデータの 1 秒バッファに対して与えられます。マシンのオン/オフ状態を決定するために、Node-RED または Tulip で閾値を設定できます。"},{"id":"256235b9.3bb72a","type":"subflow:85d16074.518e2","z":"71c9f8f2.7adf08","name":"CR-3111 Scaling","env":[{"name":"PROPERTY","value":"data","type":"str"},{"name":"SCALE","value":"3000","type":"num"},{"name":"OFFSET","value":"0","type":"num"}],"x":800,"y":360,"wires":[["88390763.49ad58", "b594a80b.7f3f18"]]},{"id":"daf59f31.d1ec8","type":"tulip-high-speed-analog","z":"71c9f8f2.7adf08","name":"Differential ADC Readings","analogConfig":"71b68226.a6568c","dataTypeIdx":"2","inputs":0,"mode":"continuous","dataMsgProperty":"data","refreshRate":"1","refreshFrames":"all","x":150,"y":380,"wires":[["96ef65ab.afba78"]]},{"id":"82a0d2e1.62cec","type":"inject","z":"71c9f8f2.7adf08","name":"Reset Part Count","props":[],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","x":130,"y":100,"wires":[["25bb1de8.b3e502"]]},{"id":"579dcfa3.596ad","type":"tulip-digital-input","z":"71c9f8f2.7adf08", "name": "モニターピン1", "runMode": "continuous", "configMode": "static", "outputMode": "object", "refreshRate": "1", "enabledPins":[true,false,false,false,false,false], "x": "110", "y": "160", "wires":[["27e78fe6.8e08c"]]},{"id":"27e78fe6.8e08c","type":"switch","z":"71c9f8f2.7adf08","name":"Filter for pinUp","property":"payload","propertyType":"msg","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":300,"y":160,"wires":[["f1b02903.a2f2b8"]]},{"id":"f1b02903.a2f2b8","type":"change","z":"71c9f8f2.7adf08", "name": "Increment Part Count", "rules":[{"t": "set", "p": "partCount", "pt": "flow", "to":"$flowContext('partCount') + 1", "tot": "jsonata"},{"t":"set","p":"payload","pt":"msg","to":"partCount","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":160,"wires":[["eed4e051.7bc12"]]},{"id":"25bb1de8.b3e502","type":"change","z":"71c9f8f2.7adf08", "name": "Set Part Count = 0", "rules":[{"t": "set", "p": "partCount", "pt": "flow", "to": "0", "tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":350,"y":100,"wires":[[]]},{"id":"dcb54611.9f7ca8", "type": "comment", "z": "71c9f8f2.7adf08", "name": "Monitor Part Count", "info": "Starts with Part Count = 0 and counts up whenever GPIO Pin 1 is toggled high.Part Countは、'Reset Part Count'ノードをクリックすることで0にリセットできます。部品カウントが変更されるたびに、設定されたチューリップ機械属性に現在の部品カウントを送信します。", "x":130, "y":40, "wires":[]},{"id": "9ff956ce.4ee9b8", "type": "comment", "z": "71c9f8f2.7adf08", "name": "Monitor RMS Current", "info": "CR-3111 電流クランプでモニターされている機械の RMS 電流を Edge IO 差分 ADC に送信します。RMS 読み取り値は、5 秒に 1 回サンプリングされた、1kHz で取得されたデータの 1s バッファに対して与えられます。マシンのオン/オフ状態を決定するために、Node-RED または Tulip で閾値を設定することができる。","x":140,"y":320,"wires":[]},{"id":"96ef65ab.afba78","type":"switch","z":"71c9f8f2.7adf08", "name": "Filter 1/5 readings", "property": "numReadings", "propertyType": "flow", "rules":[{"t": "eq", "v":"4","vt":"num"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":390,"y":380,"wires":[["41bac391.9beffc"],["78eb2b71.a4c2c4"]]},{"id":"41bac391.9beffc","type":"change","z":"71c9f8f2.7adf08","name":"Pass message","rules":[{"t":"set","p":"numReadings","pt":"flow","to":"0","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":600,"y":360,"wires":[["256235b9.3bb72a"]]},{"id":"78eb2b71.a4c2c4","type":"change","z":"71c9f8f2.7adf08", "name": "Drop message & increment", "rules":[{"t": "set", "p": "numReadings", "pt": "flow", "to":"$flowContext('numReadings') + 1", "tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":640,"y":400,"wires":[[]]},{"id":"88390763.49ad58","type":"switch","z":"71c9f8f2.7adf08","name":"Is Current > 100mA?","property":"data","propertyType":"msg","rules":[{"t":"gt","v":"0.1","vt":"num"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":540,"y":620,"wires":[["b0fc9af.9e90c68"],["b271da6d.f05098"]]},{"id":"53f44746.f831e8","type":"comment","z":"71c9f8f2.7adf08", "name": "Subflow to Calculate Machine State", "info": "This subflow can be enabled to calculate whether the machine is ON or OFF based on the configured threshold value.このマシン属性は、Tulipでテキスト属性として構成する必要があり、属性deviceInfoはTulipマシン属性ノードにコピーペーストする必要がある。", "x":240, "y":620, "wires":[]},{"id": "b0fc9af.9e90c68","type":"change","z":"71c9f8f2.7adf08","name":"State = ON","rules":[{"t":"set","p":"payload","pt":"msg","to":"ON","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":770,"y":600,"wires":[["a197e7f6.0d6c58"]]},{"id":"b271da6d.f05098","type":"change","z":"71c9f8f2.7adf08","name":"State = OFF","rules":[{"t":"set","p":"payload","pt":"msg","to":"OFF","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":770,"y":640,"wires":[["a197e7f6.0d6c58"]]},{"id":"eed4e051.7bc12","type":"tulip-tag","z":"71c9f8f2.7adf08","name":"","tagList":"58dfe1ff.615b","staticTag":true,"tagId":"part\_count","x":730,"y":160,"wires":[[]]},{"id":"b594a80b.7f3f18","type":"tulip-tag","z":"71c9f8f2.7adf08","name":"","tagList":"58dfe1ff.615b","staticTag":true,"tagId":"current","x":1020,"y":360,"wires":[[]]},{"id":"a197e7f6.0d6c58","type":"tulip-tag","z":"71c9f8f2.7adf08","name":"","tagList":"58dfe1ff.615b","staticTag":true,"tagId":"state","x":930,"y":620,"wires":[[]]},{"id":"80b0c03.326c84","type":"inject","z":"71c9f8f2.7adf08", "name": "Initialization", "props":[], "repeat":", "crontab":", "once": "true", "onceDelay": "0.1,"topic":"","x":110,"y":440,"wires":[["81df5e3e.f5126"]]},{"id":"81df5e3e.f5126","type":"change","z":"71c9f8f2.7adf08","name":"Initialize numReadings = 0","rules":[{"t":"set","p":"numReadings","pt":"flow","to":"0","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":340,"y":440,"wires":[[]]},{"id":"71b68226.a6568c", "type": "tulip-high-speed-analog-config", "name": "Differential ADC RMS @ 1kHZ", "bufferSize": "1000", "frequency": "1000", "adcId":"0", "diffAdcResistor": "200", "enableTime": "false", "enableFreq": "false", "enableRMS": "true", "enablePowerSpec": "false},{"id": "58dfe1ff.615b", "type": "tulip-tag-list", "name": "Part-Making Machine Tags", "tags":[{"id": "part\_count", "label": "Part Count", "type": "integer"},{"id": "current", "label": "Current (RMS)", "type": "float"},{"id": "state", "label": "State", "type": "string"}]}].


``` 2.フローは以下のように表示される:


![](https://cdn.document360.io/7c6ff534-cad3-4fc8-9583-912c4016362f/Images/Documentation/How%20to%20Send%20Data%20to%20Machines%20from%20Edge%20Devices%20using%20Node-RED%20and%20Tulip%20Tags_566767267.png){height="" width="550"}


このフローには、以下のTulipタグリストもあります:


![](https://cdn.document360.io/7c6ff534-cad3-4fc8-9583-912c4016362f/Images/Documentation/How%20to%20Send%20Data%20to%20Machines%20from%20Edge%20Devices%20using%20Node-RED%20and%20Tulip%20Tags_566767339.png){height="" width="350"}


1. このエッジデバイスは、3つのタグを持つデータソースとしてTulipに表示されます:


	1. 部品数:GPIO入力ピン1がHighにトグルするたびにインクリメントされます。ブレーク・ビームがこのピンに接続されていると仮定。
	2. 電流(RMS):CR3111-3000のRMS電流値(アンペア)を5秒ごとに書き込みます。この電流センサーが差動 ADC に接続されていると仮定します。
	3. 状態:これらのタグをチューリップの対応するマシン属性にマッピングできます:


![](https://cdn.document360.io/7c6ff534-cad3-4fc8-9583-912c4016362f/Images/Documentation/How%20to%20Send%20Data%20to%20Machines%20from%20Edge%20Devices%20using%20Node-RED%20and%20Tulip%20Tags_566767591.png){height="" width="350"}


1. ブレーク・ビームが切り替わるとき、または電流の測定値が5秒ごとに更新されるときに、データが表示されます:


![](https://cdn.document360.io/7c6ff534-cad3-4fc8-9583-912c4016362f/Images/Documentation/How%20to%20Send%20Data%20to%20Machines%20from%20Edge%20Devices%20using%20Node-RED%20and%20Tulip%20Tags_566767660.png){height="" width=""}




---


お探しのものは見つかりましたか?


[community.tulip.coで](https://community.tulip.co/?utm_source=intercom&utm_medium=article-link&utm_campaign=all)質問を投稿したり、他の人が同じような質問に直面していないか確認することもできます! 


この記事は役に立ちましたか?