Страница 5 из 5 ПерваяПервая ... 345
Показано с 41 по 46 из 46

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

  1. #41
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,583

    По умолчанию

    FB используют общую память, насколько помню всегда и везде, не только в Овен ПЛК.
    А вот изолированы как раз FUNC (Функции)...

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

    Точнее когда FB объявляется несколько раз, то под каждый используется свой блок памяти, возможно в конкретном FB есть использование каких-то переменных, что при вызове нескольких FB дает пересечение памяти.

  2. #42

    По умолчанию

    Уфффф. Кажется методом проб и ошибок понял, что не так. Есть разное поведение при публикации и подписке. Смысл в том, что сначала я писал код с публикацией. И она долго не шла. Поэтому в общем случае я делал такую логику:

    Код:
    mqtt.i_xPublish := FALSE;
    tonInterval(IN := NOT(tonInterval.Q), PT := T#3S);
    IF tonInterval.Q THEN
      // Формируем json
      mqtt.i_sPayload := json;
      mqtt.i_xPublish := TRUE;
    END_IF
    mqtt();
    И такая логика чудесно работает. Примерно по такой же логике я пытался сделать и i_xSubscribe.

    Код:
    mqtt.i_xSubscribe := FALSE;
    tonInterval(IN := NOT(tonInterval.Q), PT := T#3S);
    IF tonInterval.Q THEN
      result := mqtt.q_sLastReceivedMessage;
      mqtt.i_xSubscribe := TRUE;
    END_IF
    mqtt();
    И на этом он падал в Access Violation. В общем, строчка: mqtt.i_xSubscribe := FALSE; - является лишней. Как только ее убрал - все стало отлично.
    Последний раз редактировалось Stan_1; 05.05.2021 в 17:55.

  3. #43

    По умолчанию

    Нет, все-таки все оказывается не так просто. Сейчас закомментировал абсолютно все. Оставил только такой код в PLC_PRG:

    Код:
    PROGRAM PLC_PRG
    VAR
    	mqtt: MQTT_Client.FB_MQTTClient;
    	iTest: INT := 0;
    END_VAR
    
    mqtt.i_xEnable := TRUE;
    mqtt.i_sBrokerAddress := sHost;
    mqtt.i_uiPort := iPort;
    mqtt.i_sUsername := sUsername;
    mqtt.i_sPassword := sPassword;
    
    mqtt.i_sPayload := INT_TO_STRING(iTest);
    mqtt.i_sTopicPublish := 'broker/test/step1';
    IF (mqtt.q_udiState = 60) THEN 
    	mqtt.i_xPublish := TRUE;
    ELSE
    	mqtt.i_xPublish := FALSE;
    END_IF
    mqtt();
    
    iTest := iTest + 1;
    Итог - после примерно 1300-1500 итераций, падение в AccessViolation. В чем может быть проблема?

    mqtt_exception 2.jpg
    mqtt_exception_log.jpg

  4. #44

  5. #45

    По умолчанию

    Да, там стабильно работает. Буду выяснять в чем разница.

  6. #46

    По умолчанию

    Вчера экспериментально выяснили, что замена MQTT-брокера с mosquitto на hivemq проблему AccessViolation снимает. Но в чем root cause - осталось непонятным. В логах mosquitto (полных) все нормально, ничего не видим. Продолжу работу с hivemq.

Страница 5 из 5 ПерваяПервая ... 345

Похожие темы

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

Ваши права

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