Стартовая страница › Форумы › Понять, как работает ПО › Прием изображения по MQTT
- В этой теме 15 ответов, 4 участника, последнее обновление 1 год, 6 месяцев назад сделано
Mikhail.
-
АвторЗаписи
-
21.02.2025 в 16:32 #36874
ellen_medvedeva
УчастникЗдравствуйте!
Пытаюсь решить следующую задачу: Rapid SCADA принимает по MQTT от устройства поток байтов (данные в 16-ричной системе счисления) — это данные изображения установленного размера в RGB565. Нужно отобразить картинку.
Если честно, никогда раньше со SCADA не работала, поэтому ознакомившись с документацией, ответами на форуме и примерами на GitHub, решила действовать так:
1. В настройках канала указала тип данных «Unicode string». В свойствах устройства добавила файл JavaScript, который преобразует приходящие данные (payload) в массив.Листинг скрипта:
let hexString = payload.trim().replace(/\s+/g, »);
log(«Получены данные: » + hexString);
log(«Длина строки в байтах: » + (hexString.length / 2));// Проверка строки hex
if (!/^[0-9A-Fa-f]+$/.test(hexString)) {
log(«Ошибка: данные содержат недопустимые символы!»);
} else if (hexString.length % 2 !== 0) {
log(«Ошибка: строка содержит неполный байт!»);
} else {
// Преобразуем строку в массив байтов
log(«Создаем массив байтов…»);
let data = [];
for (let i = 0; i < hexString.length; i += 2) {
data.push(parseInt(hexString.substr(i, 2), 16));
}
log(«Принятые байты: » + JSON.stringify(data));
log(«Количество байтов в массиве: » + data.length);
}Статистика линии при приеме данных:
2025-02-21 16:15:55 Приём Ellen_topic = FF F5 FF F6 FF FF F7…
Подписанные устройства: 1
Получены данные: FFF5FFF6FFFFF7FFF8FF
Длина строки в байтах: 10
Создаем массив байтов…
Принятые байты: [255,245,255,246,255,255,247,255,248,255]
Количество байтов в массиве: 10Данные принимаются и даже успешно преобразуются.
2. В виде представления выступает web-страница, на которой должны отображаться полученные данные. Получение данных страницей писала по следующему примеру (https://github.com/RapidScada/scada-v6/tree/master/ScadaWeb/OpenPlugins/PlgMain/wwwroot/custom).
Проблема: не получается передать на страницу более одного элемента созданного массива data. Функция setValue() работает только для одного элемента массива, строку также передать не получается.
Подскажите, пожалуйста:
1. Куда сохраняются данные, полученные Rapid SCADA (т.е. данные FFF5FFF6FFFFF7FFF8FF)? В каких директориях искать архивы по умолчанию?
2. Как (при помощи какой функции) и где правильно сохранить преобразованные при помощи скрипта данные изображения, чтобы потом к ним обращаться в скрипте на web-странице представления?
3. Правильно ли был выбран тип данных канала «Unicode string»? Какая должна быть длина данных в настройках канала для корректной работы?Примера работы с изображениями в документации не нашла. Может быть есть какой-то более цивилизованный способ решения моей задачи?
Спасибо!
21.02.2025 в 16:58 #36875
manjey73УчастникОбратите внимание на длину канала, она как раз указывает на массив в 6-й версии.
А так же посмотрите в скриптах определение индекса массиваArrIdx int Индекс обрабатываемого элемента массива
Элемент данных имеет формат double и занимает 8 байт. Соответственно Unicode будет занимать 4 символа. Если у вас 10 байт — то длины 2 для массива будет достаточно.
Если 10 символов, то это 20 байт, соответственно длина будет 3.Ну с остальным я не очень понял, каким образом это картинка?
21.02.2025 в 17:00 #36876
manjey73УчастникДа, еще момент. Указывая формулу в массиве данных (длина канала > 1) она действует на каждый последующий канал в массиве.
Вам надо в формуле проверять, что ArrIdx = 0 и выполнять все действия со всем массивом, чтобы в остальных элементах массива формула не работала.Так проще.
21.02.2025 в 17:42 #36877
MikhailМодераторДобрый день!
Один входящий пакет по MQTT — это одна картинка или картинка складывается из нескольких пакетов?Учитывая, что сохраняются только 16-ричные символы, то будет оптимальнее использовать строку ASCII, чем Unicode. В один канал поместится 8 символов. Хотя записывать в тип Integer будет наилучшим решением, я думаю, т.к. поместится 8 байт картинки в канал.
21.02.2025 в 17:45 #36878
MikhailМодераторПримера работы с изображениями в документации не нашла.
Да, получение изображений по MQTT — это что-то новое, но почему бы и нет.
Тут есть небольшая проблема — существующий драйвер MQTT не работает со строками, только с числами Double. Поэтому при приёме пакета нужно как-то закодировать полученные данные в тип Double.
22.02.2025 в 13:39 #36880ellen_medvedeva
УчастникНу с остальным я не очень понял, каким образом это картинка?
Пока что это не картинка, а просто поток данных — я хотела научиться работать с маленьким кусочком, прежде чем передавать целое изображение.
Один входящий пакет по MQTT — это одна картинка или картинка складывается из нескольких пакетов?
Картинка должна была передаваться одним пакетом. Размер картинки — около 3Мб. Теперь я понимаю, что в Rapid SCADA при помощи одного канала так много данных за раз передать не получится.
Подскажите, пожалуйста, может быть есть смысл как-то передавать данные на канал по 8 байт (8 символов при ASCII string), запоминать их в какой-то файл и потом считывать его в web-интерфейсе по ссылке? Я правильно понимаю, что при своевременном сохранении данных канала (8 байт), можно будет передать целое изображение за счет одного канала?
22.02.2025 в 18:27 #36881
JurasskParkУчастникА это вы лучше расскажите какой у вас план и что вы хотите в итоге получить?
Ради чего всё это задумывается?22.02.2025 в 19:18 #36882ellen_medvedeva
УчастникРади чего всё это задумывается?
Все задумывается ради успешной защиты дипломной работы. Я в рамках диплома разрабатываю электронное устройство, которое должно уметь передавать изображение по протоколу MQTT. Хочу подключить свое устройство к SCADA и настроить отображение картинки с целью показать, что мой диплом может работать с реальным ПО в рамках производственного процесса. Так, SCADA-систему планируется использовать исключительно для демонстрации работоспособности устройства. Для отображения хочу использовать представление в виде web-страницы, при получении SCADA-системой пакета от устройства картинка на странице должна обновляться.
22.02.2025 в 19:39 #36883
manjey73УчастникВ принципе через один канал возможно передать что угодно. Вопрос как будете сравнивать например одинаковые данные в канале?
Ну скажем 8 байт FF если будут 3 раза подряд?
Как определите, что передача завершена и больше поступления байт не будет?Через скрипты Scada возможно сохранять и обрабатывать файлы.
22.02.2025 в 20:01 #36884
JurasskParkУчастникВопрос как будете сравнивать например одинаковые данные в канале?
Тогда надо 2 канала. Один говорит статус передачи, а второй данные. 🙂
23.02.2025 в 15:37 #36887ellen_medvedeva
УчастникВ принципе через один канал возможно передать что угодно.
Обратите внимание на длину канала, она как раз указывает на массив в 6-й версии.Если сделать канал длиной 2, т.е. рассчитанный на 16 байт, нужно ли будет каждые 8 байт передавать в виде нового MQTT-пакета? При этом не будет ли создано два отдельных канала по 8 байт каждый?
ArrIdx int Индекс обрабатываемого элемента массива.
Подскажите, пожалуйста, где можно посмотреть примеры использования переменных и функций, обозначенных в документации (https://rapidscada.net/docs/ru/latest/configuration/scripts)? Пробовала с ними работать в файле .js, расположенном в папке «Конфигурационные файлы» Коммутатора, но ничего не получилось — появляется ошибка, что переменные и функции не определены. Пробовала вызывать функции столбцах «Входная формула» и «Выходная формула» в настройках канала, но результата снова не увидела.
Через скрипты Scada возможно сохранять и обрабатывать файлы.
Вот вроде бы понятно, что такая возможность есть, но где найти об этом более подробную информацию? Узнала из документации, что данные записываются в архивы, которые можно выбрать при настройке канала. Непонятно, как взаимодействовать с этими архивами, где они располагаются, как настроить отправку данных в файл.
В журнале линии связи при поступлении данных в канал отображается вся строка, какой бы длинной она не была, но оперировать мы можем только одним значением размером Double (передавать его на веб-страницу при помощи setValue(), например). Значит эта длинная строка где-то сохраняется? Как это возможно, если канал вмещает максимум 8 байт?
23.02.2025 в 15:51 #36888
manjey73УчастникПотому что это БД, в которой для значения определена длина в 8 байт, double в который вы можете впихнуть что-то.
Фактически длина канала >1 сервером создаёт требуемое количество каналов.
Формулы будут работать только в скриптах сервера, они не имеют отношения к js.Может вам проще все сделать в js, приняв все байты, а в канал вывести результат ок или не ок?
23.02.2025 в 16:17 #36889ellen_medvedeva
УчастникМожет вам проще все сделать в js, приняв все байты, а в канал вывести результат ок или не ок?
Что Вы подразумеваете под «вывести в канал»? У нас же в канал приходят данные? Или данные приходят не в канал, а куда-то еще, а сохраняются в БД через канал?
К сожалению, мне не достаточно видеть только статус о наличии или отсутствии принятых данных от устройства, нужно отображать сами данные. Я буду рада все сделать в js-файле, но может быть есть способ (или пример), как сохранить принятые и обработанные данные в файл? Наверное, тогда получится открыть его по ссылке на веб-странице представления.
23.02.2025 в 19:07 #36890
manjey73УчастникПосмотрите в скриптах делал retain переменные, станет понятно, как открывать и записывать файлы из скриптов.
Вам надо будет дописывать файл поступающими данными.Я с mqtt не особо знаком, если там есть js, значит можно что-то при помощи него делать. Если при помощи js можно изменять поступающую переменную в канале, значит можно вместо переменной выводить в канал служебную информацию, например о количестве принятых байт, а принятые байты писать в обход самим js.
24.02.2025 в 18:16 #36895
MikhailМодераторНужно использовать JS-скрипты, которые поддерживаются драйвером, чтобы перекодировать данные рисунка в значения каналов. Кодировать нужно наиболее простым способом. Например, хранить в одном канале 4 байта от рисунка, чтобы они точно не исказились.
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.