Страница 4 из 5 ПерваяПервая ... 2345 ПоследняяПоследняя
Показано с 31 по 40 из 46

Тема: Что почитать?

  1. #31
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,145

    По умолчанию

    Цитата Сообщение от Stan_1 Посмотреть сообщение
    Я посмотрел внимательно видео. Вроде бы так и делаю. Попробовал максимально упростить задачу. И прямо в PLC_PRG написал так:
    mqtt.i_xEnable := TRUE;
    mqtt.i_sBrokerAddress := 'subdomain.domain.com';
    mqtt.i_uiPort := 1883;
    mqtt.i_sUsername := 'user';
    mqtt.i_sPassword := 'password';
    mqtt.i_sPayload := 'starting';
    mqtt.i_sTopicPublish := '/topic11/plc';
    mqtt.i_xPublish := TRUE;

    И после запуска ничего не происходит Я указываю те же данные в приложении MQTT Explorer, и все нормально подключается. То есть коннективити есть, логин/пароль верные.

    По netstat вижу подключения к Gateaway (localhost:1217). Но не вижу обращений к адресу mqtt-брокера.
    Попробуйте для начала просто по видео повторить.

    - используйте CFC
    - используйте в качестве брокера www.mqtt-dashboard.com
    - не используйте логин и пароль
    - воздействуйте на переменные, привязанные к входам i_xPublish и i_xSubscribe "вручную", а не с помощью кода

    Когда в такой связке заработает (а я считаю, что оно должно работать - только что проверил у себя, см. скрин), то поэтапно начинайте адаптировать к своей задаче, после каждого этапа проверяя, сохранилась ли работоспособность. Если после очередного изменения связь пропадет - надо приступать к анализу изменений. Так обычно происходит отладка проектов.

    01-05-2021 8-36-29.png

  2. #32

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Попробуйте для начала просто по видео повторить.

    - используйте CFC
    - используйте в качестве брокера www.mqtt-dashboard.com
    - не используйте логин и пароль
    - воздействуйте на переменные, привязанные к входам i_xPublish и i_xSubscribe "вручную", а не с помощью кода

    Когда в такой связке заработает (а я считаю, что оно должно работать - только что проверил у себя, см. скрин), то поэтапно начинайте адаптировать к своей задаче, после каждого этапа проверяя, сохранилась ли работоспособность. Если после очередного изменения связь пропадет - надо приступать к анализу изменений. Так обычно происходит отладка проектов.

    01-05-2021 8-36-29.png
    Да, спасибо! Вчера весь вечер возился, и как-то оно заработало. Но очень нечетко. И есть нюансы, смысла которых я не понимаю, а описание очень скудное
    1. Первое, что выяснил - нельзя вызывать mqtt() внутри FB Изначально была логика иметь в PLC_PRG настроеный экземпляр, передавать его в FB, где указывать топик, payload, устанавливать i_xPublish в TRUE, и вызывать mqtt(). Это не работало. Как только я вынес все указанное за пределы FB в PLC_PRG - я увидел факт передачи. Уже успех. Но почему это не работает внутри FB - не понимаю. Видимо, аналогия из моего пограммисткого опыта, что FB - это просто функция, неверна. У FB есть какие-то ограничения, на описание которых я не натыкался.
    2. Долго не мог понять, почему MQTT_Client режет json, который я подготовил. Потом понял - передаю строку более 80 символов. Как указать STRING(250) для i_sPayload - не нашел Это вообще возможно, или начинать смотреть в сторону платных бибилиотек? Там у библиотеки 3S длина 1024 символа.
    3. Хотя я вызываю функцию mqtt() раз в 2 секунды, отправка данных идет ОДИН раз за запуск. Видимо, есть опят какие-то базовые нюансы, которые нужно просто знать Я пробовал по разному: пробовал после вызова mqtt() вызывать i_xPublis = FALSE. Пробовал менять Payload (была версия, что отправляются только измененные данные, хотя в исходниках вроде не так). Но ничего не помогло. И здесь мыслей вообще нет. Видимо, есть какие-то особенности именно работы PLC, которые я фундаментально не понимаю

  3. #33
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,145

    По умолчанию

    1. В описании ситуации не содержится вопроса, но для начала я бы вам рекомендовал для самого себя написать ТЗ на модуль работы с MQTT и нарисовать схему взаимодействия его элементов.
    2. Библиотека доступна в исходниках - можно подправить максимальную длину строк под себя.
    3. Это не функция, а ФБ. Разумный подход - вызывать этот ФБ в цикле ПЛК (без каких-либо условий) и по нужным событиям генерировать передний фронт в переменной, привязанной ко входу i_xPublish.

  4. #34

    По умолчанию

    Фух. Кажется, получилось. Спасибо большое! Даже удалось перенести все в FB. Не могу сказать, что понимаю четко почему заработало, скорее интуитивно. Но главное - что теперь можно уже экспериментировать, как Вы и советовали.

  5. #35

    По умолчанию

    Эх. Натолкнулся опять на моменты, которые пока не могу осознать. Теперь ситуация такова. Есть FB, от которого созданы два инстанса. В каждом инстансе свой MQTT Client, который настроен на разные Subscribe topic. Инстансы вызываются один за другим, в каждом раз в 3 секунды выставляется i_xSubsribe := TRUE; и затем в каждом инстансе на каждом цикле выполнения программы вызывается mqtt(); Что я наблюдаю в итоге?
    1. Допустим, в подписанных в MQTT_Client топиках установлены одинаковые значения (строка "ON"). В брокере я меняю один из топиков в "OFF". И вижу, что оба инстанса получили этот OFF, хотя ожидал, что только один инстанс должен был его получить. Если опять значение топика в брокере установить в ON - эту строку опять получат оба MQTT_Client.
    2. Через некоторое время (3-4 минуты) MQTT Client выбрасывает Exception. Какое - не могу понять (где вообще это увидеть?). При этом q_sDiagMsg принимает значение "$04$10", а в q_sLastReceivedMessage выводится полная абракадабра.



    Может ли такое произойти из-за одновременного запроса от двух клиентов к брокеру (вызов идет в одном цикле)? Как понять, в чем причина exception?
    Изображения Изображения

  6. #36
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,145

    По умолчанию

    Как понять, в чем причина exception?
    1. См. Device - Журнал.

    2.

    поэтапно начинайте адаптировать к своей задаче, после каждого этапа проверяя, сохранилась ли работоспособность. Если после очередного изменения связь пропадет - надо приступать к анализу изменений. Так обычно происходит отладка проектов.
    3. См. эту статью: https://oscat.ru/?p=382

  7. #37

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    поэтапно начинайте адаптировать к своей задаче, после каждого этапа проверяя, сохранилась ли работоспособность. Если после очередного изменения связь пропадет - надо приступать к анализу изменений. Так обычно происходит отладка проектов.
    В общем, есть какой-то баг библиотеки, который то-ли появляется только в симуляторе, то-ли имеет какие-то фундаментальные причины. Связан с тем, что два инстанса MQTT_Client, видимо, за счет использования шаринга сокета - читают данные друг друга, и когда это еще и приходится на совпадения циклов - вылетают с AccessViolation. Такой вопрос задавали автору в 2018 году, но вся помощь от него была в стиле "такого не может быть". Но описанный кейс - точно мой. Вот ссылка.

    Пока не понимаю, что делать. Для начала хочу попробовать две вещи:
    1. Понять, как игнорировать AccessViolation (если это вообще возможно)
    2. Попробовать через глобальные переменные разводить циклы чтения из разных топиков.

  8. #38
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,145

    По умолчанию

    1. Понять, как игнорировать AccessViolation (если это вообще возможно)
    Если вам выстрелили в ногу - это, конечно, можно попробовать игнорировать - но лучше обратиться в больницу.

    Связан с тем, что два инстанса...
    Есть FB, от которого созданы два инстанса. В каждом инстансе свой MQTT Client, который настроен на разные Subscribe topic.
    А зачем два инстанса?.. Что мешает подписать один инстанс на оба топика?

  9. #39

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    А зачем два инстанса?.. Что мешает подписать один инстанс на оба топика?
    Возможно, архитектурно делаю неправильно. Но опять же, иду из опыта обычного программирования. Есть функциональный блок. Допустим - обрабатывающий выключатель света, скажем, FB_LIGHT_SWITCH. Соответственно, из логики ООП я делаю его максимально самодостаточным, то есть в
    каждый из них добавляю mqtt: MQTT_Client.FB_MQTTClient. И затем делаю:
    switchKuhnya: FB_LIGHT_SWITCH;
    switchKoridor: FB_LIGHT_SWITCH;
    switchKabinet: FB_LIGHT_SWITCH;

    И потом,

    switchKuhnya(i_sTopic := '/rooms/kuhnya');
    switchKoridor(i_sTopic := '/rooms/koridor');
    switchKabinet(i_sTopic := '/rooms/kabinet');

    И соответственно, топик передается в экземпляр MQTT_Client внутри FB. Вроде бы нигде не сказано, что так нельзя. Также запрет на такую архитектуру не следует из ответа автора библиотеки по ссылке выше, где он пишет, что память каждого инстанса изолирована.

    Каких-то примером, и best practics по такому варианту я не нашел. Если прямо совсем не прав - то просьба поправить фокус.

  10. #40
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,145

    По умолчанию

    Соответственно, из логики ООП я делаю его максимально самодостаточным, то есть в каждый из них добавляю mqtt: MQTT_Client.FB_MQTTClient
    Я не знаю, что вы называете "логикой ООП", но ваша фраза не соответствует моим личным представлениям об ООП.
    https://ru.wikipedia.org/wiki/%D0%91...B5%D0%BA%D1%82

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

    Если задача носит сугубо практический характер - то проще перейти на один инстанс и подписать его на все нужные топики.
    Каждый фронт в i_xSubscribe осуществляет подписку на топик, который в данный момент задан в i_sTopicSubscribe.

Страница 4 из 5 ПерваяПервая ... 2345 ПоследняяПоследняя

Похожие темы

  1. Посоветуйте что почитать, чтобы научиться программировать
    от OAS1606 в разделе Программируемые реле
    Ответов: 44
    Последнее сообщение: 16.04.2021, 13:17
  2. Что интересного почитать? Канал на Яндекс.Дзен от датчиков ОВЕН!
    от Алексей Сидорцев в разделе Трёп (Курилка)
    Ответов: 0
    Последнее сообщение: 06.12.2019, 21:59
  3. Описание по энкодерам. Где почитать?
    от TV13M в разделе Трёп (Курилка)
    Ответов: 3
    Последнее сообщение: 26.01.2018, 09:02

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •