Прием изображения по MQTT

Просмотр 15 сообщений - с 1 по 15 (из 16 всего)
  • Автор
    Записи
  • #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»? Какая должна быть длина данных в настройках канала для корректной работы?

    Примера работы с изображениями в документации не нашла. Может быть есть какой-то более цивилизованный способ решения моей задачи?

    Спасибо!

    #36875
    manjey73
    Участник

    Обратите внимание на длину канала, она как раз указывает на массив в 6-й версии.
    А так же посмотрите в скриптах определение индекса массива

    ArrIdx int Индекс обрабатываемого элемента массива

    Элемент данных имеет формат double и занимает 8 байт. Соответственно Unicode будет занимать 4 символа. Если у вас 10 байт — то длины 2 для массива будет достаточно.
    Если 10 символов, то это 20 байт, соответственно длина будет 3.

    Ну с остальным я не очень понял, каким образом это картинка?

    #36876
    manjey73
    Участник

    Да, еще момент. Указывая формулу в массиве данных (длина канала > 1) она действует на каждый последующий канал в массиве.
    Вам надо в формуле проверять, что ArrIdx = 0 и выполнять все действия со всем массивом, чтобы в остальных элементах массива формула не работала.

    Так проще.

    #36877
    Mikhail
    Модератор

    Добрый день!
    Один входящий пакет по MQTT — это одна картинка или картинка складывается из нескольких пакетов?

    Учитывая, что сохраняются только 16-ричные символы, то будет оптимальнее использовать строку ASCII, чем Unicode. В один канал поместится 8 символов. Хотя записывать в тип Integer будет наилучшим решением, я думаю, т.к. поместится 8 байт картинки в канал.

    #36878
    Mikhail
    Модератор

    Примера работы с изображениями в документации не нашла.

    Да, получение изображений по MQTT — это что-то новое, но почему бы и нет.

    Тут есть небольшая проблема — существующий драйвер MQTT не работает со строками, только с числами Double. Поэтому при приёме пакета нужно как-то закодировать полученные данные в тип Double.

    #36880
    ellen_medvedeva
    Участник

    Ну с остальным я не очень понял, каким образом это картинка?

    Пока что это не картинка, а просто поток данных — я хотела научиться работать с маленьким кусочком, прежде чем передавать целое изображение.

    Один входящий пакет по MQTT — это одна картинка или картинка складывается из нескольких пакетов?

    Картинка должна была передаваться одним пакетом. Размер картинки — около 3Мб. Теперь я понимаю, что в Rapid SCADA при помощи одного канала так много данных за раз передать не получится.

    Подскажите, пожалуйста, может быть есть смысл как-то передавать данные на канал по 8 байт (8 символов при ASCII string), запоминать их в какой-то файл и потом считывать его в web-интерфейсе по ссылке? Я правильно понимаю, что при своевременном сохранении данных канала (8 байт), можно будет передать целое изображение за счет одного канала?

    #36881
    JurasskPark
    Участник

    А это вы лучше расскажите какой у вас план и что вы хотите в итоге получить?
    Ради чего всё это задумывается?

    #36882
    ellen_medvedeva
    Участник

    Ради чего всё это задумывается?

    Все задумывается ради успешной защиты дипломной работы. Я в рамках диплома разрабатываю электронное устройство, которое должно уметь передавать изображение по протоколу MQTT. Хочу подключить свое устройство к SCADA и настроить отображение картинки с целью показать, что мой диплом может работать с реальным ПО в рамках производственного процесса. Так, SCADA-систему планируется использовать исключительно для демонстрации работоспособности устройства. Для отображения хочу использовать представление в виде web-страницы, при получении SCADA-системой пакета от устройства картинка на странице должна обновляться.

    #36883
    manjey73
    Участник

    В принципе через один канал возможно передать что угодно. Вопрос как будете сравнивать например одинаковые данные в канале?
    Ну скажем 8 байт FF если будут 3 раза подряд?
    Как определите, что передача завершена и больше поступления байт не будет?

    Через скрипты Scada возможно сохранять и обрабатывать файлы.

    #36884
    JurasskPark
    Участник

    Вопрос как будете сравнивать например одинаковые данные в канале?

    Тогда надо 2 канала. Один говорит статус передачи, а второй данные. 🙂

    #36887
    ellen_medvedeva
    Участник

    В принципе через один канал возможно передать что угодно.
    Обратите внимание на длину канала, она как раз указывает на массив в 6-й версии.

    Если сделать канал длиной 2, т.е. рассчитанный на 16 байт, нужно ли будет каждые 8 байт передавать в виде нового MQTT-пакета? При этом не будет ли создано два отдельных канала по 8 байт каждый?

    ArrIdx int Индекс обрабатываемого элемента массива.

    Подскажите, пожалуйста, где можно посмотреть примеры использования переменных и функций, обозначенных в документации (https://rapidscada.net/docs/ru/latest/configuration/scripts)? Пробовала с ними работать в файле .js, расположенном в папке «Конфигурационные файлы» Коммутатора, но ничего не получилось — появляется ошибка, что переменные и функции не определены. Пробовала вызывать функции столбцах «Входная формула» и «Выходная формула» в настройках канала, но результата снова не увидела.

    Через скрипты Scada возможно сохранять и обрабатывать файлы.

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

    В журнале линии связи при поступлении данных в канал отображается вся строка, какой бы длинной она не была, но оперировать мы можем только одним значением размером Double (передавать его на веб-страницу при помощи setValue(), например). Значит эта длинная строка где-то сохраняется? Как это возможно, если канал вмещает максимум 8 байт?

    #36888
    manjey73
    Участник

    Потому что это БД, в которой для значения определена длина в 8 байт, double в который вы можете впихнуть что-то.
    Фактически длина канала >1 сервером создаёт требуемое количество каналов.
    Формулы будут работать только в скриптах сервера, они не имеют отношения к js.

    Может вам проще все сделать в js, приняв все байты, а в канал вывести результат ок или не ок?

    #36889
    ellen_medvedeva
    Участник

    Может вам проще все сделать в js, приняв все байты, а в канал вывести результат ок или не ок?

    Что Вы подразумеваете под «вывести в канал»? У нас же в канал приходят данные? Или данные приходят не в канал, а куда-то еще, а сохраняются в БД через канал?

    К сожалению, мне не достаточно видеть только статус о наличии или отсутствии принятых данных от устройства, нужно отображать сами данные. Я буду рада все сделать в js-файле, но может быть есть способ (или пример), как сохранить принятые и обработанные данные в файл? Наверное, тогда получится открыть его по ссылке на веб-странице представления.

    #36890
    manjey73
    Участник

    Посмотрите в скриптах делал retain переменные, станет понятно, как открывать и записывать файлы из скриптов.
    Вам надо будет дописывать файл поступающими данными.

    Я с mqtt не особо знаком, если там есть js, значит можно что-то при помощи него делать. Если при помощи js можно изменять поступающую переменную в канале, значит можно вместо переменной выводить в канал служебную информацию, например о количестве принятых байт, а принятые байты писать в обход самим js.

    #36895
    Mikhail
    Модератор

    Нужно использовать JS-скрипты, которые поддерживаются драйвером, чтобы перекодировать данные рисунка в значения каналов. Кодировать нужно наиболее простым способом. Например, хранить в одном канале 4 байта от рисунка, чтобы они точно не исказились.

Просмотр 15 сообщений - с 1 по 15 (из 16 всего)
  • Для ответа в этой теме необходимо авторизоваться.