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