Уважаемые специалисты! Помогите разобраться со следующей проблемой.
ПЛК63-РРРРРР-М пытаюсь соединить с МДВВ по интерфейсу RS485. Протокол Modbus RTU. 9600N1.
Я воспользовался примерами и написал пробную программу, которая читает состояние регистра дискретных входов(0х33) МДВВ и записывает это состояние в регистр дискретных выходов(0х32) МДВВ.
В прикреплённом файле prb120708_1 приведён исходный текст отлаженной работоспособной программы. Но имеется несколько вопросов и комментариев.
1. В примерах программ дан следующий фрагмент кода, открывающий порт
(*Открываем COM-порт*)
(*COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );*)
COM_SERVICE1(Enable:=TRUE , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE1.ready
THEN
port_opened:=2;
ELSE
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=CLOSE_TSK );
END_IF;
При таком коде порт у меня не открывается. Для открытия порта использую следующий фрагмент кода
COM_SERVICE1(Enable:=TRUE , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE1.ready
THEN
port_opened:=2;
END_IF;
2. Библиотечная функция COM_SERVICE1, оказывается, пытается открывать порт только при каждом сотом обращении к ней. В начале этой функции есть следующий текст
Delay := Delay + 1;
IF (Delay MOD 100) = 0 THEN ..
Этот недостаток для моего приложения не является существенным, просто система начнёт работать на 15-20 секунд позже включения питания
3. Функции
get04_modbus: MB_RD_INP_REGS; (*функция 04 - чтение параметров типа INT*)
send16_modbus: MB_WR_REGS; (*функция 16 - запись параметров*)
используются для чтения и записи параметров в MДВВ.
Но требуется 4 раза подряд обратиться к функции get04_modbus прежде получить правильный ответ, и требуется 3 раза подряд обратиться к функции send16_modbus прежде получить правильный ответ.
Это настораживает. Я подсчитал отношение числа запросов к числу правильных ответов. Это отношение оказывается постоянным, значит, эти сбои не являются случайными, а связаны с какой-то моей ошибкой. Прошу ответить тех, кто имеет какие-то соображения на этот счёт.




Ответить с цитированием