Как отправлять данные на машины с пограничных устройств с помощью Node-RED и меток Tulip
  • 08 Jan 2025
  • 8 Минуты для чтения
  • Авторы

Как отправлять данные на машины с пограничных устройств с помощью Node-RED и меток Tulip


Вводный текст

Узнайте, как использовать метки Tulip в Node-RED для нативной отправки данных с пограничных устройств на машины Tulip

Начиная с OS 50.1, Tulip поддерживает использование пограничных устройств Tulip в качестве источников данных для машин.

Используя Node RED, вы можете создавать произвольные "теги" с помощью нового узла tulip-tag и отправлять данные в эти теги. Эти теги будут автоматически отображаться под конкретным пограничным устройством в качестве источника данных при сопоставлении атрибутов машины.

В новых потоках рекомендуется использовать Tulip Tags вместо Machine API. Метки Tulip позволяют сообщать данные о машинах с помощью многократно используемых потоков, которые можно использовать на разных устройствах без каких-либо изменений, связанных с конкретным устройством, и устраняют необходимость копировать-вставлять информацию об атрибутах машины в узлы Machine API.

Обзор

В этой статье описывается, как отправлять данные из Node-RED в Tulip Machines с помощью нового узла Tulip Tag, который предустановлен на устройствах Tulip Edge.

В этом руководстве мы рассмотрим следующие шаги:

Требования

Для создания тегов Tulip необходимо иметь устройство Tulip Edge Device, которое:

  • поддерживает Node-RED (Edge MC или Edge IO)
  • имеет включенную функцию Node-RED
  • имеет версию прошивки >= OS50

Руководство пользователя

В этом руководстве мы рассмотрим рабочий процесс в Node-RED для создания тега, отправки данных на него, а затем продемонстрируем, как сопоставить этот тег с атрибутом машины в Tulip. Мы также опишем, как записывать данные в несколько тегов одновременно (только для ОС 51 и более поздних версий).

Создание тегов в Node-RED

  1. Откройте Node-RED на вашем устройстве Tulip Edge и войдите в систему.

    1. *Для справки о доступе к Node-RED: Использование Node-RED на Edge IO
    2. Если вы находитесь на OS50 или более поздней версии, вы увидите узел Tulip Tag в левой боковой панели редактора Node-RED.

  1. Перетащите узел tulip-tag в редактор и дважды щелкните на нем, чтобы открыть редактор узлов. Вы должны увидеть свойство "Список тегов", которое является обязательным - вам нужно создать список тегов, который содержит все теги для этого Edge Device. Для каждого Edge Device следует создавать только один список тегов. Нажмите кнопку Edit, чтобы создать новый список тегов, как показано ниже.

  1. В узле Список тегов вы сможете создать столько тегов, сколько захотите. Нажмите +добавить, чтобы создать тег.

  1. Каждый тег состоит из трех частей: идентификатора, метки и типа.

    1. ID тега: это идентификатор, похожий на код, который идентифицирует тег. После создания он не должен меняться. Допустимыми символами являются буквы, цифры (не могут начинаться с цифры) и символы подчеркивания. Примеры: part_count, myState1.
    2. Метка тега: Это человекочитаемая метка, которую можно присвоить тегу. Чтобы переименовать тег, просто обновите метку (не идентификатор). Пример: "Part Count".
    3. Тип: Тип данных - строка, целое число, плавающая запятая или булево. Должен совпадать с типом сопоставленного атрибута машины.

  1. После добавления тегов нажмите кнопку Добавить, чтобы подтвердить изменения и вернуться в предыдущий редактор узлов. Перед сохранением убедитесь в отсутствии ошибок.
NOTE

"Unmapped" is not an error, just a warning that you have not yet mapped the tag to a machine attribute in Tulip.

Отправка данных в теги в Node-RED

После создания списка тегов выпадающий список Select Tag автоматически заполняется всеми тегами (по человекочитаемым меткам).

  1. Выберите тег для этого узла.

  1. Чтобы записать данные в этот тег, вам нужно будет отправить сообщения этому узлу tulip-tag. Полезная нагрузка любого сообщения, отправленного узлу (т. е. msg.payload), будет записана в тег.

Например, ниже мы связали узел Inject с msg.payload=0, который запишет целое число 0 в тег Part Count.

Сопоставление тегов с атрибутами машины

Наконец, чтобы просмотреть данные в Tulip, вы должны посетить свой сайт Tulip и сопоставить тег с атрибутом машины.

  1. Перейдите на страницу машин, выберите машину, на которую нужно отправить данные, и откройте вкладку "Конфигурация". Вы увидите список атрибутов машины; нажмите на атрибут, чтобы сопоставить его. Вы должны увидеть устройство Edge Device (по серийному номеру) в качестве источника данных. Создавать этот источник данных не нужно, он будет создан автоматически при развертывании потока со списком тегов.
  2. Нажмите на краевое устройство в правой боковой панели и раскройте папку Node-RED. Вы должны увидеть все атрибуты того же типа, что и атрибут. Нажмите кнопку ссылки рядом с соответствующим атрибутом, чтобы отобразить его.

  1. Теперь атрибут отображается как сопоставленный, а метка сопоставленного тега - как Сигнал.

  1. Кроме того, в Node-RED статус узла Tulip Tag должен был измениться с "Unmapped" на "Connected".

{height="" width="400"}.

  1. Запись данных в тег (т. е. щелчок по узлу "Inject" в этом примере) теперь приводит к появлению данных для сопоставленного атрибута.

Отправка данных в несколько тегов (расширенный вариант)

NOTE

This feature is only available on OS51 and later.

Можно осуществлять пакетную запись в несколько тегов одновременно.

  1. В Node-RED создайте узел Tulip Tag и снимите флажок Выбрать тег из списка.

  1. Например, если вы хотите записать количество деталей 0 в целочисленный тег с id part_count, а состояние "Running" в строковый тег с id state, ваше сообщение должно быть таким:

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

Пример: Управление состоянием машины и количеством деталей с помощью Edge IO и Node-RED

Этот пример представляет собой обновленную версию потока библиотеки Node RED, описанного в этой статье, на которую следует ссылаться при настройке оборудования: Управление состояниями машины и количеством деталей с помощью Edge IO и Node-RED.

Ниже поток был обновлен, чтобы использовать узел Tulip Tag вместо узла Machine Attribute. Этот поток может быть развернут на многих пограничных устройствах без изменений.

  1. В Node-RED импортируйте и разверните следующий поток:

``[{"id": "85d16074.518e2", "type": "subflow", "name": "Scale ADC to Sensor Value (2)", "info": "Масштабирует показания АЦП Edge IO в показания датчика, подключенного к фронтэнду АЦП.\n\nСвойство для изменения масштаба должно быть задано настроенным свойством 'prop'. msg.prop должно быть числовым значением или массивом числовых значений.\n\nМасштаб и смещение применяются к msg.prop (к каждому элементу, если это массив) следующим образом:\n\nmsg.prop = msg.prop * scale + offset\n", "category": "Tulip", "in":[{"x":40, "y":60, "wires":[{"id": "d99ec5b3.e9dfb8"}]}],"out":[{"x":460,"y":60,"wires":[{"id":"d99ec5b3.e9dfb8","port":0}]}],"env":[{"name":"PROPERTY","type":"str","value":"payload","ui":{"label":{"en-US":"property"},"type":"input","opts":{"types":["str","env"]}}},{"name":"SCALE","type":"num","value":"","ui":{"label":{"en-US":"scale"},"type":"input","opts":{"types":["num","env"]}}},{"name":"OFFSET","type":"num","value":"","ui":{"label":{"en-US":"offset"},"type":"input","opts":{"types":["num","env"]}}}],"color":"

65CCB8", "icon": "font-awesome/fa-arrows-v"},{"id": "d99ec5b3.e9dfb8", "type": "function", "z": "85d16074.518e2", "name": "Преобразование значений с помощью масштаба/смещения", "func": "const scale = env.get('SCALE');\nconst offset = env.get('OFFSET');\nconst prop = env.get('PROPERTY');\nif (Array.isArray(msg[prop])) {\n msg[prop] = msg[prop].map((x) => (scale * x + offset));\n} else {\n msg[prop] = scale * msg[prop] + offset;\n}\nreturn msg;", "outputs":1, "noerr":0, "initialize":"", "finalize":"", "x":250, "y":60, "wires":[[]]},{"id": "71c9f8f2.7adf08", "type": "tab", "label": "Видимость станка с токовым зажимом и лучом прерывания", "disabled":false, "info": "Этот поток библиотеки представляет собой базовое приложение для мониторинга станка с целью получения видимости его состояния и количества деталей с помощью токового зажима и луча прерывания. Он отслеживает следующие два входа Edge IO:\n\n * Количество деталей: Начинается с 0 и ведет отсчет каждый раз, когда на вывод 1 GPIO подается высокий уровень, например, когда срабатывает луч прерывания. Может быть сброшен в 0 с помощью узла 'Reset Part Count'. Отправляет текущее количество деталей в атрибут машины Tulip при каждом изменении количества деталей. \n \n * Состояние станка: Отправляет среднеквадратичное значение тока станка, контролируемого токовым клещом CR-3111, в дифференциальный АЦП Edge IO. Среднеквадратичное значение передается для буфера данных длительностью 1 с, снятых с частотой 1 кГц, с дискретизацией раз в 5 с. Порог может быть установлен либо в 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": "Monitor Pin 1", "runMode": "continuous", "configMode": "static", "outputMode": "object", "refreshRate":1, "enabledPins":[true,false,false,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": "Начинается с Part Count = 0 и ведет отсчет каждый раз, когда на вывод 1 GPIO подается высокий сигнал. Счетчик деталей можно сбросить до 0, щелкнув по узлу 'Reset Part Count'. Отправляет текущее количество деталей на сконфигурированный атрибут Tulip Machine Attribute при каждом изменении количества деталей. ", "x":130, "y":40, "wires":[]},{"id": "9ff956ce.4ee9b8", "type": "comment", "z": "71c9f8f2.7adf08", "name": "Monitor RMS Current", "info": "Отправляет RMS тока станка, контролируемого токовым клещом CR-3111, в дифференциальный АЦП Edge IO. Среднеквадратичное значение передается для буфера данных длительностью 1 с, снятых с частотой 1 кГц, с дискретизацией раз в 5 с. Порог может быть установлен либо в 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": "Подпоток для вычисления состояния машины", "info": "Этот подпоток может быть включен для вычисления того, включена или выключена машина на основе настроенного порогового значения.\n\nВычисленное состояние отправляется в виде строки в атрибут машины. Этот атрибут машины должен быть настроен в Tulip как текстовый атрибут, а атрибут deviceInfo должен быть скопирован в узел Tulip Machine Attribute.", "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": "Метки станков для изготовления деталей", "tags":[{"id": "part_count", "label": "Количество деталей", "type": "integer"},{"id": "current", "label": "Ток (RMS)", "type": "float"},{"id": "state", "label": "Состояние", "type": "string"}]}]



![](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 Tag:


![](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. Это устройство Edge Device отображается в Tulip как источник данных с тремя тегами:


	1. Part Count: Увеличивается всякий раз, когда входной контакт 1 GPIO переключается на высокий уровень. Предполагается, что к этому выводу подключен прерывающийся луч.
	2. Current (RMS): записывает показания среднеквадратичного тока (в амперах) CR3111-3000 каждые 5 секунд. Предполагается, что этот датчик тока подключен к дифференциальному АЦП.
	3. Состояние: Сообщает "ON", если ток >100 мА, и "OFF", если ток <=100 мА. Вы можете сопоставить эти теги с соответствующими атрибутами машины в 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_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), чтобы задать свой вопрос или узнать, сталкивались ли другие с подобным вопросом! 


Была ли эта статья полезной?