Как сложить несколько входов? - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь зачитать 5 микровыключателей в LuvitRED (другая форма красного узла).Чтобы быть полезной в остальной части программы, 5 датчиков должны объединиться в 1 целое число.

enter image description here

Изображение выше - схема расположения узла-красный.Сначала я собирался преобразовать каждый вход в отдельную функцию.В нижней части показана вторая идея, где все микропереключатели считываются и суммируются в 1 функции.

Идея:

  • Микропереключатель 1 = 1 (когда активен)
  • Микропереключатель 2 = 10
  • Микропереключатель 3 = 100 и т. Д.

Таким образом, когда я их всех суммирую, конечное число будет между 00000 и 11111 в зависимости от того, какие из них активны и облегчают распознавание того, какие микропереключатели активны.

В нижней части изображения используются простые кнопки, которые при нажатии нажимают msg.payload = 1 для быстрого тестирования.Ниже приведен код этой функции.

Я гуглил об этой проблеме, и многие форумы утверждали, что использование функции изменения (для изменения от 1 до 10 и более) в сочетании с функцией соединенияРабота.К сожалению, в LuvitRED нет функции соединения, потому что это измененная версия Node-RED.

if not msg then
-- called on startup
return
end

flow.microswitch1 = 0;
flow.microswitch2 = 0;
flow.microswitch3 = 0;
flow.microswitch4 = 0;
flow.microswitch5 = 0;

if (msg.topic == 'microswitch1') then
  flow.microswitch1 = msg.payload;
 elseif (msg.topic == 'microswitch2') then
  flow.microswitch2 = msg.payload * 10;
 elseif (msg.topic == 'microswitch3') then
  flow.microswitch3 = msg.payload * 100;
 elseif (msg.topic == 'microswitch4') then
  flow.microswitch4 = msg.payload * 1000;
 elseif (msg.topic == 'microswitch5') then
  flow.microswitch5 = msg.payload * 10000;
end

global.availableSpaces = flow.microswitch1 + flow.microswitch2 +                     
flow.microswitch3 + flow.microswitch4 + flow.microswitch5
msg.payload = global.availableSpaces

return msg

Я ожидал, что это сработает, поскольку сейчас я работаю только с кнопками, чтовсегда отправлять 1 msg.payload при нажатии.Однако по какой-то причине я получаю ошибку ввода при нажатии кнопок без какого-либо результата в отладчике.У всех вас есть идеи относительно того, как я могу решить эту проблему?

1 Ответ

0 голосов
/ 25 марта 2019

Предполагая, что вы не можете использовать узел join (что было бы нормальным способом сделать это), вы можете использовать переменные потока.Хотя вам нужно проверить, поддерживает ли LuvitRed flow.get и flow.set и имеется ли постоянное хранилище между перезапусками.

При считывании микропереключателя вы просто сохраните его в переменную потока:

flow.set('microswitch1', msg.payload); // or however you're getting the value

Тогда каждая строка в func будет выглядеть следующим образом:

var microswitch1 = flow.get('microswitch1') || 0;
// etc

Таким образом, если микровыключатель 2 еще не изменился, вместо него будет использоваться 0.

Но в итоге вы должны учитывать окончательный func, который запускается для каждого отдельного сообщения, которое он получает.Единственный способ дождаться всех сообщений - использовать join.

...