новый не работает в функциональном блоке узла-красного - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь использовать node7 в функциональном блоке, так как s7 недостаточно для моей цели (node7 является базовой библиотекой, используемой s7).

Пример, приведенный в node7, прекрасно работает как приложение для независимых узлов. Код приведен ниже.

var nodes7 = require('nodes7');  // This is the package name, if the repository is cloned you may need to require 'nodeS7' with uppercase S
var conn = new nodes7;
var doneReading = false;
var doneWriting = false;

var variables = { TEST1: 'MR4',         // Memory real at MD4
          TEST2: 'M32.2',       // Bit at M32.2
          TEST3: 'M20.0',       // Bit at M20.0
          TEST4: 'DB1,REAL0.20',    // Array of 20 values in DB1
          TEST5: 'DB1,REAL4',       // Single real value
          TEST6: 'DB1,REAL8',       // Another single real value
          TEST7: 'DB1,INT12.2',     // Two integer value array
          TEST8: 'DB1,LREAL4'       // Single 8-byte real value
};

conn.initiateConnection({port: 102, host: '192.168.0.2', rack: 0, slot: 1}, connected); // slot 2 for 300/400, slot 1 for 1200/1500
//conn.initiateConnection({port: 102, host: '192.168.0.2', localTSAP: 0x0100, remoteTSAP: 0x0200, timeout: 8000}, connected); // local and remote TSAP can also be directly specified instead.  The timeout option specifies the TCP timeout.

function connected(err) {
    if (typeof(err) !== "undefined") {
        // We have an error.  Maybe the PLC is not reachable.
        console.log(err);
        process.exit();
    }
    conn.setTranslationCB(function(tag) {return variables[tag];});  // This sets the "translation" to allow us to work with object names
    conn.addItems(['TEST1', 'TEST4']);
    conn.addItems('TEST6');
//  conn.removeItems(['TEST2', 'TEST3']);  // We could do this.
//  conn.writeItems(['TEST5', 'TEST6'], [ 867.5309, 9 ], valuesWritten);  // You can write an array of items as well.
    conn.writeItems('TEST7', [ 666, 777 ], valuesWritten);  // You can write a single array item too.
    conn.readAllItems(valuesReady);
}

function valuesReady(anythingBad, values) {
    if (anythingBad) { console.log("SOMETHING WENT WRONG READING VALUES!!!!"); }
    console.log(values);
    doneReading = true;
    if (doneWriting) { process.exit(); }
}

function valuesWritten(anythingBad) {
    if (anythingBad) { console.log("SOMETHING WENT WRONG WRITING VALUES!!!!"); }
    console.log("Done writing.");
    doneWriting = true;
    if (doneReading) { process.exit(); }
}

Однако я не могу использовать это в функциональном блоке. Я включил узлы7, как показано ниже, как рекомендовано сообществом «красные узлы», при этом требуется дополнительный пакет

    functionGlobalContext: {
        nodes7:require('nodes7')
        // os:require('os'),
        // jfive:require("johnny-five"),
        // j5board:require("johnny-five").Board({repl:false})
    },

Однако мой код не работает, когда я создаю объект, как показано ниже в примере.

var conn = new nodes7;

Я тоже пытался var conn = new nodes7();, но тщетно. Я получаю ошибку ниже.

"TypeError: nodes7 is not a constructor"

Таким образом, на переменную node7 ссылаются правильно, но красный узел жалуется, что он не конструктор. как мне тогда go опередить. Ниже весь мой код функционального блока выдает ошибку выше.

var nodes7 = global.get('nodes7');
var conn = new nodes7();

conn.initiateConnection({port: 102, host: '127.0.0.1', rack: 0, slot: 1}, connected); // slot 2 for 300/400, slot 1 for 1200/1500
node.log('This worked');

function connected(err) 
{
    if (typeof(err) !== "undefined") 
    {
        // We have an error.  Maybe the PLC is not reachable.
        node.log('Connection not successful');
    }

}

return msg;

Если поможет, я только что использовал узел инъекции до и после отладочного узла, просто для наблюдения. Я новичок ie в узел-красный. Пожалуйста помоги.

enter image description here

Обновление 1:

По запросу одного пользователя я вставил node.warn(nodes7) перед вызовом конструктора и заметил, что он не определен , Но почему? Я использую global.get, установленный в правильном напрямую (я мог видеть в папке node_modules на node-red), но это происходит.

enter image description here

Обновление 2

Я обновил настройки. Файл js, как и в каталоге usr, но все еще получает тот же ответ, что и неопределенный , Пожалуйста, найдите ниже фото.

Поиск настроек. js файл ..

enter image description here

Переход к этому файлу ...

enter image description here

Обновление этого файла путем открытия там кода против ..

enter image description here

Установленные узлы7, а затем и перезапуская нод-красный, я все еще получаю ту же ошибку .. ниже код ..

enter image description here

Обновление 3

Мое обновление 2 работает после закрытия всех и перезапуска ..

1 Ответ

0 голосов
/ 19 марта 2020
Модули

NPM, на которые ссылаются settings.js в functionGlobalContext, должны быть установлены в userDir, поскольку они загружены относительно активного файла settings.js.

Оба * 1007 Используемый файл * и settings.js регистрируется в первых нескольких строках вывода при запуске Node-RED.

Редактировать файл settings.js следует только в userDir. Версия в установочном каталоге Node-RED используется только при настройке новых userDir. Вам также нужно будет перезапустить Node-RED при редактировании этого файла.

...