diff --git a/01. Перечень сигналов.xlsx b/01. Перечень сигналов.xlsx new file mode 100644 index 0000000..075255e Binary files /dev/null and b/01. Перечень сигналов.xlsx differ diff --git a/modbus_nodered_base.cmtp b/EBProject1_MT8121XE3_template.emtp similarity index 54% rename from modbus_nodered_base.cmtp rename to EBProject1_MT8121XE3_template.emtp index ea24b9d..05646f0 100644 Binary files a/modbus_nodered_base.cmtp and b/EBProject1_MT8121XE3_template.emtp differ diff --git a/cmtp/MT8121XE3/EBProject1_MT8121XE3.emtp b/cmtp/MT8121XE3/EBProject1_MT8121XE3.emtp new file mode 100644 index 0000000..05646f0 Binary files /dev/null and b/cmtp/MT8121XE3/EBProject1_MT8121XE3.emtp differ diff --git a/diagrams/PlantUML/package.puml b/diagrams/PlantUML/package.puml new file mode 100644 index 0000000..6ca1361 --- /dev/null +++ b/diagrams/PlantUML/package.puml @@ -0,0 +1,58 @@ +@startuml +title Подсистемы АСУ ГА для главного меню + +package "АСУ ГА" { + package "ГА (общие)" as GA + package "ГБ + АРЗ" as GB + package "НА" as NA + package "ТУРБ" as TURB + package "МУЛ" as MUL + package "ГЕН" as GEN + package "ПЧ" as PCC + package "КРУ" as KRU +} + +package "Вспомогательные системы" { + package "СМС" as SMS + package "СОП" as SOP + package "ТВС" as TVS + package "СОГ" as VENT + package "СТВ (тормоз)" as SH + package "ПРОТ (протечки)" as LEAK +} + +package "Инфраструктура" { + package "ПИТ (эл.питание)" as PS + package "G51 (dc-dc)" as G51 +} + +package "Служебные данные" { + package "АСУ (алгоритмы/команды)" as ASU + package "ДИАГ" as DIAG + package "РУЧН (кнопки/переключатели)" as MAN + package "СТАТ (статистика)" as STAT +} + +GA -- NA +GA -- TURB +GA -- MUL +GA -- GEN +GA -- PCC +GA -- KRU + +GA -- SMS +GA -- SOP +GA -- TVS +GA -- VENT +GA -- SH +GA -- LEAK + +GA -- PS +GA -- G51 + +GA -- ASU +GA -- DIAG +GA -- MAN +GA -- STAT + +@enduml \ No newline at end of file diff --git a/export/HMI_new.xls b/export/HMI_new.xls new file mode 100644 index 0000000..32619e5 Binary files /dev/null and b/export/HMI_new.xls differ diff --git a/nodered/flows_10_1_3_120.json b/nodered/flows_10_1_3_120.json new file mode 100644 index 0000000..6d36067 --- /dev/null +++ b/nodered/flows_10_1_3_120.json @@ -0,0 +1,609 @@ +[ + { + "id": "e970d5dc70d18347", + "type": "tab", + "label": "СОП", + "disabled": false, + "info": "", + "env": [] + }, + { + "id": "e62ac17e6b1c9dfc", + "type": "modbus-write", + "z": "e970d5dc70d18347", + "name": "СОП. Температура в баке", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "HoldingRegister", + "adr": "1110", + "quantity": "1", + "server": "dca8f54c186084c0", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 660, + "y": 340, + "wires": [ + [], + [] + ] + }, + { + "id": "508420e43be333ce", + "type": "function", + "z": "e970d5dc70d18347", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('WS_T_TANK') || 50;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 50 ? 40 : v + 1);\n\n// Сохраняем обновленное значение в поток\nflow.set('WS_T_TANK', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 6; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1100; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 410, + "y": 340, + "wires": [ + [ + "e62ac17e6b1c9dfc" + ] + ] + }, + { + "id": "2d17db7509e196c3", + "type": "inject", + "z": "e970d5dc70d18347", + "name": "tick", + "props": [], + "repeat": "1", + "crontab": "", + "once": true, + "onceDelay": 1, + "topic": "", + "x": 210, + "y": 340, + "wires": [ + [ + "508420e43be333ce", + "f6c0bd60f7ccd6ef", + "db13f2e72e433d76", + "4ab024b1aff02ed1", + "56c8dc122932bed2", + "3a020fc62ad49e57", + "074962eb71d9e17b", + "d6138c7ab7ea1ab2" + ] + ] + }, + { + "id": "7e1660490b2d2753", + "type": "modbus-server", + "z": "e970d5dc70d18347", + "name": "", + "logEnabled": true, + "hostname": "0.0.0.0", + "serverPort": 10502, + "responseDelay": 100, + "delayUnit": "ms", + "coilsBufferSize": 10000, + "holdingBufferSize": 10000, + "inputBufferSize": 10000, + "discreteBufferSize": 10000, + "showErrors": true, + "showStatusActivities": true, + "x": 200, + "y": 120, + "wires": [ + [], + [], + [], + [], + [] + ] + }, + { + "id": "9be14f7aeb1445fc", + "type": "modbus-write", + "z": "e970d5dc70d18347", + "name": "СОП. Температура после т/об", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "HoldingRegister", + "adr": "1111", + "quantity": "1", + "server": "dca8f54c186084c0", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 670, + "y": 400, + "wires": [ + [], + [] + ] + }, + { + "id": "f6c0bd60f7ccd6ef", + "type": "function", + "z": "e970d5dc70d18347", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('WS_T_OUT') || 50;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 50 ? 40 : v + 1);\n\n// Сохраняем обновленное значение в поток\nflow.set('WS_T_OUT', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 6; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1111; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 410, + "y": 400, + "wires": [ + [ + "9be14f7aeb1445fc" + ] + ] + }, + { + "id": "7c0b98f0d6da4d67", + "type": "modbus-write", + "z": "e970d5dc70d18347", + "name": "СОП. Температура внешнего контура", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "HoldingRegister", + "adr": "1112", + "quantity": "1", + "server": "dca8f54c186084c0", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 700, + "y": 460, + "wires": [ + [], + [] + ] + }, + { + "id": "db13f2e72e433d76", + "type": "function", + "z": "e970d5dc70d18347", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('WS_T_REC') || 50;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 50 ? 40 : v + 1);\n\n// Сохраняем обновленное значение в поток\nflow.set('WS_T_REC', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 6; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1112; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 410, + "y": 460, + "wires": [ + [ + "7c0b98f0d6da4d67" + ] + ] + }, + { + "id": "4fed1bc2370508fb", + "type": "modbus-write", + "z": "e970d5dc70d18347", + "name": "СОП. Давление после насоса", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "HoldingRegister", + "adr": "1113", + "quantity": "1", + "server": "dca8f54c186084c0", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 670, + "y": 520, + "wires": [ + [], + [] + ] + }, + { + "id": "4ab024b1aff02ed1", + "type": "function", + "z": "e970d5dc70d18347", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('WS_P_PUMP') || 50;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 50 ? 40 : v + 1);\n\n// Сохраняем обновленное значение в поток\nflow.set('WS_P_PUMP', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 6; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1113; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 430, + "y": 520, + "wires": [ + [ + "4fed1bc2370508fb" + ] + ] + }, + { + "id": "126135a5c0a3e97b", + "type": "modbus-write", + "z": "e970d5dc70d18347", + "name": "СОП. Давление в контуре", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "HoldingRegister", + "adr": "1114", + "quantity": "1", + "server": "dca8f54c186084c0", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 660, + "y": 580, + "wires": [ + [], + [] + ] + }, + { + "id": "56c8dc122932bed2", + "type": "function", + "z": "e970d5dc70d18347", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('WS_P_OUT') || 50;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 50 ? 40 : v + 1);\n\n// Сохраняем обновленное значение в поток\nflow.set('WS_P_OUT', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 6; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1114; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 430, + "y": 580, + "wires": [ + [ + "126135a5c0a3e97b" + ] + ] + }, + { + "id": "7254c3bb1d448b39", + "type": "modbus-write", + "z": "e970d5dc70d18347", + "name": "СОП. Уровень в баке", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "HoldingRegister", + "adr": "1115", + "quantity": "1", + "server": "dca8f54c186084c0", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 640, + "y": 640, + "wires": [ + [], + [] + ] + }, + { + "id": "3a020fc62ad49e57", + "type": "function", + "z": "e970d5dc70d18347", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('WS_L') || 50;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 50 ? 40 : v + 1);\n\n// Сохраняем обновленное значение в поток\nflow.set('WS_L', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 6; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1115; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 430, + "y": 640, + "wires": [ + [ + "7254c3bb1d448b39" + ] + ] + }, + { + "id": "a35cf32802b244bd", + "type": "modbus-write", + "z": "e970d5dc70d18347", + "name": "СОП. WS_RESERVE1", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "Coil", + "adr": "1116", + "quantity": "1", + "server": "dca8f54c186084c0", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 660, + "y": 800, + "wires": [ + [], + [] + ] + }, + { + "id": "3271b1ce681c99a9", + "type": "modbus-write", + "z": "e970d5dc70d18347", + "name": "СОП. WS_RESERVE2", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "Coil", + "adr": "1117", + "quantity": "1", + "server": "dca8f54c186084c0", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 660, + "y": 880, + "wires": [ + [], + [] + ] + }, + { + "id": "074962eb71d9e17b", + "type": "function", + "z": "e970d5dc70d18347", + "name": "increment register", + "func": "// Получаем текущее состояние, по умолчанию 0\nlet state = flow.get('WS_DSC1') || 0;\n\n// Гарантируем, что state — это строго 0 или 1 (на случай мусора в контексте)\nstate = (state === 1) ? 1 : 0;\n\n// Переключаем 0 <-> 1\nstate = (state === 0) ? 1 : 0;\n\n// Сохраняем новое состояние\nflow.set('WS_DSC1', state);\n\n// Жёстко привязываем payload к state (только 0 или 1)\n// Жёсткое условие через if/else\nif (state === 0) {\n msg.payload = 0;\n} else {\n msg.payload = 1;\n}\n\nreturn msg;\n\n", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 350, + "y": 960, + "wires": [ + [ + "402b15cf9cc8430d", + "2382660d4ddd0147", + "a35cf32802b244bd", + "3271b1ce681c99a9" + ] + ] + }, + { + "id": "d6138c7ab7ea1ab2", + "type": "function", + "z": "e970d5dc70d18347", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('LIION_U') || 60;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 60 ? 40 : v + 2);\n\n// Сохраняем обновленное значение в поток\nflow.set('LIION_U', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 6; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1100; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v*10];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 410, + "y": 260, + "wires": [ + [ + "4f8c16d6f02ebe0c" + ] + ] + }, + { + "id": "4f8c16d6f02ebe0c", + "type": "modbus-write", + "z": "e970d5dc70d18347", + "name": "LIION_U", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "HoldingRegister", + "adr": "91", + "quantity": "1", + "server": "dca8f54c186084c0", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 560, + "y": 160, + "wires": [ + [], + [] + ] + }, + { + "id": "ca4aa3c10d91cadf", + "type": "inject", + "z": "e970d5dc70d18347", + "name": "", + "props": [ + { + "p": "payload" + }, + { + "p": "topic", + "vt": "str" + } + ], + "repeat": "", + "crontab": "", + "once": false, + "onceDelay": 0.1, + "topic": "", + "payload": "0", + "payloadType": "num", + "x": 990, + "y": 760, + "wires": [ + [ + "d6b2b79bd3900995" + ] + ] + }, + { + "id": "d6b2b79bd3900995", + "type": "modbus-write", + "z": "e970d5dc70d18347", + "name": "1", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "Coil", + "adr": "1118", + "quantity": "1", + "server": "dca8f54c186084c0", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 1230, + "y": 760, + "wires": [ + [], + [] + ] + }, + { + "id": "e4c8d4dd168e0307", + "type": "inject", + "z": "e970d5dc70d18347", + "name": "", + "props": [ + { + "p": "payload" + }, + { + "p": "topic", + "vt": "str" + } + ], + "repeat": "", + "crontab": "", + "once": false, + "onceDelay": 0.1, + "topic": "", + "payload": "1", + "payloadType": "num", + "x": 990, + "y": 840, + "wires": [ + [ + "045d9a6b99355d8f" + ] + ] + }, + { + "id": "045d9a6b99355d8f", + "type": "modbus-write", + "z": "e970d5dc70d18347", + "name": "1", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "Coil", + "adr": "1118", + "quantity": "1", + "server": "dca8f54c186084c0", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 1230, + "y": 840, + "wires": [ + [], + [] + ] + }, + { + "id": "2382660d4ddd0147", + "type": "debug", + "z": "e970d5dc70d18347", + "name": "debug 3", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 560, + "y": 1200, + "wires": [] + }, + { + "id": "402b15cf9cc8430d", + "type": "modbus-write", + "z": "e970d5dc70d18347", + "name": "СОП. Дискретные сигналы водяной станции", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "Coil", + "adr": "1118", + "quantity": "1", + "server": "dca8f54c186084c0", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 740, + "y": 960, + "wires": [ + [], + [] + ] + }, + { + "id": "dca8f54c186084c0", + "type": "modbus-client", + "name": "", + "clienttype": "tcp", + "bufferCommands": true, + "stateLogEnabled": false, + "queueLogEnabled": false, + "failureLogEnabled": true, + "tcpHost": "0.0.0.0", + "tcpPort": "10502", + "tcpType": "DEFAULT", + "serialPort": "/dev/ttyUSB", + "serialType": "RTU-BUFFERD", + "serialBaudrate": "9600", + "serialDatabits": "8", + "serialStopbits": "1", + "serialParity": "none", + "serialConnectionDelay": "100", + "serialAsciiResponseStartDelimiter": "0x3A", + "unit_id": 1, + "commandDelay": 1, + "clientTimeout": 1000, + "reconnectOnTimeout": true, + "reconnectTimeout": 2000, + "parallelUnitIdsAllowed": true, + "showErrors": false, + "showWarnings": true, + "showLogs": true + } +] \ No newline at end of file diff --git a/nodered/flows_149_154_66_246.json b/nodered/flows_149_154_66_246.json new file mode 100644 index 0000000..2b90e92 --- /dev/null +++ b/nodered/flows_149_154_66_246.json @@ -0,0 +1,541 @@ +[ + { + "id": "80472c6f5ab0ceb1", + "type": "tab", + "label": "СОП", + "disabled": false, + "info": "", + "env": [] + }, + { + "id": "82fa300ca05c4568", + "type": "function", + "z": "80472c6f5ab0ceb1", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('WS_T_TANK') || 50;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 50 ? 40 : v + 1);\n\n// Сохраняем обновленное значение в поток\nflow.set('WS_T_TANK', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 6; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1100; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 410, + "y": 340, + "wires": [ + [ + "791aea74bb391beb", + "782ffc62b6685ef5" + ] + ] + }, + { + "id": "72ede930ebd8e9ae", + "type": "inject", + "z": "80472c6f5ab0ceb1", + "name": "tick", + "props": [], + "repeat": "1", + "crontab": "", + "once": true, + "onceDelay": 1, + "topic": "", + "x": 210, + "y": 340, + "wires": [ + [ + "82fa300ca05c4568", + "0ea8a7cec8595723", + "18284d5de921917f", + "503edbe326920db4", + "a00a9797429ad64e", + "8656df9f506874b5", + "0600f89cbbef760f", + "233784632d9af852", + "3368d6dd4d245c14", + "b70f9de01e3737a7" + ] + ] + }, + { + "id": "782ffc62b6685ef5", + "type": "debug", + "z": "80472c6f5ab0ceb1", + "name": "debug 3", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 860, + "y": 260, + "wires": [] + }, + { + "id": "0ea8a7cec8595723", + "type": "function", + "z": "80472c6f5ab0ceb1", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('WS_T_OUT') || 50;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 50 ? 40 : v + 1);\n\n// Сохраняем обновленное значение в поток\nflow.set('WS_T_OUT', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 6; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1111; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 410, + "y": 400, + "wires": [ + [ + "3e733d4f4f7c7eca" + ] + ] + }, + { + "id": "18284d5de921917f", + "type": "function", + "z": "80472c6f5ab0ceb1", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('WS_T_REC') || 50;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 50 ? 40 : v + 1);\n\n// Сохраняем обновленное значение в поток\nflow.set('WS_T_REC', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 6; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1112; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 410, + "y": 460, + "wires": [ + [ + "66749e276ed8f774" + ] + ] + }, + { + "id": "503edbe326920db4", + "type": "function", + "z": "80472c6f5ab0ceb1", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('WS_P_PUMP') || 50;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 50 ? 40 : v + 1);\n\n// Сохраняем обновленное значение в поток\nflow.set('WS_P_PUMP', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 6; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1113; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 430, + "y": 520, + "wires": [ + [ + "0ae0d2efc3157ffb" + ] + ] + }, + { + "id": "a00a9797429ad64e", + "type": "function", + "z": "80472c6f5ab0ceb1", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('WS_P_OUT') || 50;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 50 ? 40 : v + 1);\n\n// Сохраняем обновленное значение в поток\nflow.set('WS_P_OUT', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 6; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1114; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 430, + "y": 580, + "wires": [ + [ + "16fefaf576d59dad" + ] + ] + }, + { + "id": "8656df9f506874b5", + "type": "function", + "z": "80472c6f5ab0ceb1", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('WS_L') || 50;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 50 ? 40 : v + 1);\n\n// Сохраняем обновленное значение в поток\nflow.set('WS_L', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 6; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1115; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 430, + "y": 640, + "wires": [ + [ + "45f23a96185e8194" + ] + ] + }, + { + "id": "0600f89cbbef760f", + "type": "function", + "z": "80472c6f5ab0ceb1", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('WS_RESERVE1') || 50;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 50 ? 40 : v + 1);\n\n// Сохраняем обновленное значение в поток\nflow.set('WS_RESERVE1', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 5; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1116; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 430, + "y": 700, + "wires": [ + [ + "f0817ef1fe6a7c7b" + ] + ] + }, + { + "id": "233784632d9af852", + "type": "function", + "z": "80472c6f5ab0ceb1", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('WS_RESERVE2') || 50;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 50 ? 40 : v + 1);\n\n// Сохраняем обновленное значение в поток\nflow.set('WS_RESERVE2', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 5; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1117; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 430, + "y": 760, + "wires": [ + [ + "f8997f5372daf09b" + ] + ] + }, + { + "id": "3368d6dd4d245c14", + "type": "function", + "z": "80472c6f5ab0ceb1", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('WS_DSC1') || 50;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 50 ? 40 : v + 1);\n\n// Сохраняем обновленное значение в поток\nflow.set('WS_DSC1', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 5; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1118; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 430, + "y": 820, + "wires": [ + [ + "c1298450172d3598" + ] + ] + }, + { + "id": "791aea74bb391beb", + "type": "modbus-write", + "z": "80472c6f5ab0ceb1", + "name": "СОП. Температура в баке", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "HoldingRegister", + "adr": "1110", + "quantity": "1", + "server": "", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 660, + "y": 340, + "wires": [ + [], + [] + ] + }, + { + "id": "3e733d4f4f7c7eca", + "type": "modbus-write", + "z": "80472c6f5ab0ceb1", + "name": "СОП. Температура после т/об", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "HoldingRegister", + "adr": "1111", + "quantity": "1", + "server": "", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 670, + "y": 400, + "wires": [ + [], + [] + ] + }, + { + "id": "66749e276ed8f774", + "type": "modbus-write", + "z": "80472c6f5ab0ceb1", + "name": "СОП. Температура внешнего контура", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "HoldingRegister", + "adr": "1112", + "quantity": "1", + "server": "", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 700, + "y": 460, + "wires": [ + [], + [] + ] + }, + { + "id": "0ae0d2efc3157ffb", + "type": "modbus-write", + "z": "80472c6f5ab0ceb1", + "name": "СОП. Давление после насоса", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "HoldingRegister", + "adr": "1113", + "quantity": "1", + "server": "", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 670, + "y": 520, + "wires": [ + [], + [] + ] + }, + { + "id": "16fefaf576d59dad", + "type": "modbus-write", + "z": "80472c6f5ab0ceb1", + "name": "СОП. Давление в контуре", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "HoldingRegister", + "adr": "1114", + "quantity": "1", + "server": "", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 660, + "y": 580, + "wires": [ + [], + [] + ] + }, + { + "id": "45f23a96185e8194", + "type": "modbus-write", + "z": "80472c6f5ab0ceb1", + "name": "СОП. Уровень в баке", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "HoldingRegister", + "adr": "1115", + "quantity": "1", + "server": "", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 640, + "y": 640, + "wires": [ + [], + [] + ] + }, + { + "id": "f0817ef1fe6a7c7b", + "type": "modbus-write", + "z": "80472c6f5ab0ceb1", + "name": "СОП. WS_RESERVE1", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "Coil", + "adr": "1116", + "quantity": "1", + "server": "", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 640, + "y": 700, + "wires": [ + [], + [] + ] + }, + { + "id": "f8997f5372daf09b", + "type": "modbus-write", + "z": "80472c6f5ab0ceb1", + "name": "СОП. WS_RESERVE2", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "Coil", + "adr": "1117", + "quantity": "1", + "server": "", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 640, + "y": 760, + "wires": [ + [], + [] + ] + }, + { + "id": "c1298450172d3598", + "type": "modbus-write", + "z": "80472c6f5ab0ceb1", + "name": "СОП. Дискретные сигналы водяной станции", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "Coil", + "adr": "1118", + "quantity": "1", + "server": "", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 720, + "y": 820, + "wires": [ + [], + [] + ] + }, + { + "id": "95b003fc392fcadd", + "type": "modbus-server", + "z": "80472c6f5ab0ceb1", + "name": "", + "logEnabled": true, + "hostname": "0.0.0.0", + "serverPort": 10502, + "responseDelay": 100, + "delayUnit": "ms", + "coilsBufferSize": 10000, + "holdingBufferSize": 10000, + "inputBufferSize": 10000, + "discreteBufferSize": 10000, + "showErrors": true, + "showStatusActivities": true, + "x": 200, + "y": 120, + "wires": [ + [], + [], + [], + [], + [] + ] + }, + { + "id": "5c728bfa2fcb05c1", + "type": "modbus-write", + "z": "80472c6f5ab0ceb1", + "name": "xxx. LIION_U", + "showStatusActivities": false, + "showErrors": false, + "showWarnings": true, + "unitid": "1", + "dataType": "HoldingRegister", + "adr": "91", + "quantity": "1", + "server": "aa6c3b71da0ea2b8", + "emptyMsgOnFail": false, + "keepMsgProperties": false, + "delayOnStart": false, + "startDelayTime": "", + "x": 630, + "y": 180, + "wires": [ + [], + [] + ] + }, + { + "id": "b70f9de01e3737a7", + "type": "function", + "z": "80472c6f5ab0ceb1", + "name": "increment register", + "func": "// Получаем текущее значение из хранилища или задаём начальное значение 10\nlet v = flow.get('LIION_U') || 60;\n\n// Увеличиваем значение на единицу и применяем циклическое изменение в диапазоне от 10 до 30\nv = ((v + 1) > 60 ? 40 : v + 2);\n\n// Сохраняем обновленное значение в поток\nflow.set('LIION_U', v);\n\n// Формируем сообщение для передачи данных\nmsg.payload = {\n value: v,\n register: 0\n};\n\n// Устанавливаем дополнительные параметры сообщения\nmsg.fc = 6; // Тип операции Modbus (запись одиночного регистра)\nmsg.unitid = 1; // Идентификатор устройства\nmsg.address = 1100; // Адрес регистра\nmsg.quantity = 1; // Количество регистров\nmsg.payload = [v*10];// Значение, которое будет записано\n\n// Возвращаем сформированное сообщение\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 410, + "y": 240, + "wires": [ + [ + "5c728bfa2fcb05c1" + ] + ] + }, + { + "id": "aa6c3b71da0ea2b8", + "type": "modbus-client", + "name": "", + "clienttype": "tcp", + "bufferCommands": true, + "stateLogEnabled": false, + "queueLogEnabled": false, + "failureLogEnabled": true, + "tcpHost": "0.0.0.0", + "tcpPort": "10502", + "tcpType": "DEFAULT", + "serialPort": "/dev/ttyUSB", + "serialType": "RTU-BUFFERD", + "serialBaudrate": "9600", + "serialDatabits": "8", + "serialStopbits": "1", + "serialParity": "none", + "serialConnectionDelay": "100", + "serialAsciiResponseStartDelimiter": "0x3A", + "unit_id": "1", + "commandDelay": "1", + "clientTimeout": "1000", + "reconnectOnTimeout": true, + "reconnectTimeout": "2000", + "parallelUnitIdsAllowed": true, + "showErrors": false, + "showWarnings": true, + "showLogs": true + } +] \ No newline at end of file diff --git a/out/diagrams/PlantUML/package/package.png b/out/diagrams/PlantUML/package/package.png new file mode 100644 index 0000000..25bfbab Binary files /dev/null and b/out/diagrams/PlantUML/package/package.png differ diff --git a/Список регистров Modbus v1.xlsx b/Список регистров Modbus v1.xlsx deleted file mode 100644 index e50eaa1..0000000 Binary files a/Список регистров Modbus v1.xlsx and /dev/null differ