-
FB используют общую память, насколько помню всегда и везде, не только в Овен ПЛК.
А вот изолированы как раз FUNC (Функции)...
Возможно когда вы включаете свет на Кухне и тут же в Кабинете, FB не понимает, что от него хотят, ну или где-то происходит сбой из-за этого.
Думаю вся проблема в FB и как ее вызывают, но тут только отладкой.
Точнее когда FB объявляется несколько раз, то под каждый используется свой блок памяти, возможно в конкретном FB есть использование каких-то переменных, что при вызове нескольких FB дает пересечение памяти.
-
Уфффф. Кажется методом проб и ошибок понял, что не так. Есть разное поведение при публикации и подписке. Смысл в том, что сначала я писал код с публикацией. И она долго не шла. Поэтому в общем случае я делал такую логику:
Код:
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; - является лишней. Как только ее убрал - все стало отлично.
-
Вложений: 2
Нет, все-таки все оказывается не так просто. Сейчас закомментировал абсолютно все. Оставил только такой код в 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. В чем может быть проблема?
Вложение 55011
Вложение 55012
-
Вложений: 1
У меня с вашим кодом и облачным брокером проблема не воспроизводится.
Вложение 55013
Попробуйте тоже с www.mqtt-dashboard.com ваш эксперимент повторить.
-
Да, там стабильно работает. Буду выяснять в чем разница.
-
Вчера экспериментально выяснили, что замена MQTT-брокера с mosquitto на hivemq проблему AccessViolation снимает. Но в чем root cause - осталось непонятным. В логах mosquitto (полных) все нормально, ничего не видим. Продолжу работу с hivemq.