- Распечатать
Как отправлять данные на машины с пограничных устройств с помощью 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.
В данном руководстве будут рассмотрены следующие шаги:
- Требования к использованию меток Tulip в качестве источника данных для машин
- Руководство пользователя
- Пример: Управление состоянием станка и количеством деталей в Node-RED
Требования
Для создания тегов Tulip необходимо иметь устройство Tulip Edge, которое:
- поддерживает Node-RED (Edge MC или Edge IO)
- имеет включенную функцию Node-RED
- имеет версию прошивки >= OS50
Руководство пользователя
В этом руководстве рассматривается рабочий процесс в Node-RED для создания метки, отправки данных на нее, а затем демонстрируется, как сопоставить эту метку с атрибутом машины в Tulip. Мы также опишем, как записывать данные в несколько тегов одновременно (только для ОС 51 и более поздних версий).
Создание меток в Node-RED
Откройте Node-RED на устройстве Tulip Edge и войдите в систему.
- *Для получения справки по доступу к Node-RED: Использование Node-RED на Edge IO
- Если вы работаете на OS50 или более поздней версии, вы увидите узел Tulip Tag в левой боковой панели редактора Node-RED.
- Перетащите узел
tulip-tag
в редактор и дважды щелкните на нем, чтобы открыть редактор узлов. Вы должны увидеть свойство "Tag List" (Список тегов), которое является обязательным - вам необходимо создать список тегов, содержащий все теги для данного Edge Device. Для каждого пограничного устройства следует создавать только один список тегов. Нажмите кнопку Edit (Редактировать ), чтобы создать новый список тегов, как показано ниже.
- В узле Список тегов можно создать любое количество тегов. Нажмите +add, чтобы создать метку.
Каждый тег состоит из трех частей: идентификатора, метки и типа.
- ID тега: это идентификатор, похожий на код, который идентифицирует тег. После создания он не должен меняться. Допустимыми символами являются буквы, цифры (не могут начинаться с цифры) и символы подчеркивания. Примеры:
part_count
,myState1
. - Метка тега: Это человекочитаемая метка, которую можно присвоить тегу. Чтобы переименовать метку, достаточно обновить метку (а не идентификатор). Пример: "Part Count".
- Type (Тип): Тип данных - String, Integer, Float или Boolean. Должен совпадать с типом сопоставленного атрибута машины.
- ID тега: это идентификатор, похожий на код, который идентифицирует тег. После создания он не должен меняться. Допустимыми символами являются буквы, цифры (не могут начинаться с цифры) и символы подчеркивания. Примеры:
- По окончании добавления тегов нажмите кнопку Add, чтобы подтвердить изменения и вернуться в предыдущий редактор узлов. Перед сохранением убедитесь в отсутствии ошибок.
:::(Info) (ПРИМЕЧАНИЕ) "Unmapped" - это не ошибка, а предупреждение о том, что тег еще не сопоставлен с машинным атрибутом в Tulip. :::
Отправка данных в теги в Node-RED
После создания списка тегов раскрывающийся список Select Tag автоматически заполняется всеми тегами (по человекочитаемым меткам).
- Выберите тег для данного узла.
- Чтобы записать данные в этот тег, необходимо отправить сообщения в этот узел
tulip-tag
. Полезная нагрузка любого сообщения, отправленного узлу (т.е.msg.payload
), будет записана в тег.
Например, ниже мы связали узел Inject с msg.payload=0
, который запишет целое число 0 в тег Part Count.
Сопоставление тегов с атрибутами машины
Наконец, чтобы просмотреть данные в Tulip, необходимо посетить свой сайт Tulip и сопоставить тег с атрибутом машины.
- Перейдите на страницу машины, выберите машину, на которую необходимо отправить данные, и откройте вкладку Configuration (Конфигурация). Должен появиться список атрибутов машины; щелкните на атрибуте, чтобы отобразить его. В качестве источника данных должно появиться устройство Edge Device (по серийному номеру). Создавать этот источник данных не нужно, он будет создан автоматически при развертывании потока со списком тегов.
- Щелкните на краевом устройстве в правой боковой панели и раскройте папку Node-RED. Вы должны увидеть все атрибуты того же типа, что и атрибут. Нажмите кнопку ссылки рядом с соответствующим атрибутом, чтобы отобразить его.
- Теперь атрибут отображается как сопоставленный, а метка сопоставленного тега - как сигнал.
- Кроме того, в Node-RED статус узла Tulip Tag должен измениться с "Unmapped" на "Connected".
- Запись данных в тег (т.е. щелчок на узле "Inject" в данном примере) теперь приводит к появлению данных для сопоставленного атрибута.
Отправка данных в несколько тегов (расширенный вариант)
:::(Info) (ПРИМЕЧАНИЕ) Эта функция доступна только в OS51 и более поздних версиях. :::
Существует возможность пакетной записи данных сразу в несколько тегов.
- В Node-RED создайте узел Tulip Tag и снимите флажок с опции Select Tag from List.
- Теперь полезная нагрузка входного сообщения для этого узла должна содержать карту идентификаторов тегов для записи значений. Например, если вы хотите записать количество деталей 0 в целочисленный тег с идентификатором
part_count
, а состояние"Running"
в строковый тег с идентификаторомstate
, то ваше сообщение должно иметь вид:
msg.payload = { "part_count": 0, "state": "Running" }
Пример: Управление состоянием машины и количеством деталей с помощью Edge IO и Node-RED
Данный пример представляет собой обновленную версию потока библиотеки Node RED, описанного в этой статье, на которую следует ориентироваться при настройке оборудования: Managing Machine States and Part Counts with Edge IO and Node-RED.
Ниже поток был обновлен, чтобы использовать узел Tulip Tag вместо узла Machine Attribute. Этот поток может быть развернут на многих пограничных устройствах без изменений.
- В 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": "Отправляет среднеквадратичное значение тока станка, контролируемого токовым клещом 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), чтобы задать свой вопрос или узнать, сталкивались ли другие с подобным вопросом!