PDA

Просмотр полной версии : ПЛК63+RS485



uvwxyz
27.06.2012, 23:35
Уважаемые специалисты! Помогите разобраться со следующей проблемой.
ПЛК63-РРРРРР-М пытаюсь соединить с МДВВ по интерфейсу RS485. Протокол Modbus RTU. 9600N1.
Я воспользовался примерами и написал пробную программу, которая раз в 200 мс читает состояние регистра дискретных входов(0х33) МДВВ и раз в следующие 200 мс записывает это состояние в регистр дискретных выходов(0х32) МДВВ.
Но к сожалению:

1) функция
(*Открываем COM-порт*)
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
НЕ открывает порт.

2)
В разделе описания типов переменных есть строка
com_num: PORTS:=0;(*0 - RS-485, 1 - RS-232*)

При выполнении программы она подсвечивается красным цветом и добавляется надпись ***INVALID: 0***
Видимо поэтому Com-порт не открывается

Перечисление PORTS объявляется в библиотеке SysLibCom.lib в следующем виде
TYPE PORTS : (COM1:=1, COM2, COM3, COM4, COM5, COM6, COM7, COM8);
END_TYPE
Из этого следует, что переменная типа PORTS не может принимать значение 0. Тогда не понятно как я смогу работать с RS-485, ведь для этого я должен присвоить переменной com_num значение 0(Что следует из комментария к строке описания переменной ).

capzap
27.06.2012, 23:46
:) принимает же. Вот потому что в перечислении отсутствует ноль у Вас и светится красным. Но это не показатель что порт не открылся, другие симптомы есть?

uvwxyz
27.06.2012, 23:56
Симптомы есть.
COM_SERVICE1.ready при открытии порта должно принять значение TRUE, а этого не происходит. Отсюда я делаю вывод, что порт не открывается.
Кроме того, МДВВ не принимает посылки(светодиод RS-485 не мигает).

ДЕНИС74
04.07.2012, 13:33
Уважаемые специалисты!пытаюсь соединить ПЛК-63-РРРРРР-М С МДВВ-Р.Вхожу в конфигурирование плк и пытаюсь прикрепить к нему подэлемент.но это не получается.слово подэлемент есть но оно не выделено черным цветом.проект написан на LD.помогите пожалуйста.

ASo
04.07.2012, 14:31
Надо написать свою процедуру.
На LD я не стал бы это делать. На ST у меня давно реализовано - и на вход и на выход.

ДЕНИС74
04.07.2012, 16:15
Спасибо.Буду пробовать.

uvwxyz
08.07.2012, 11:11
Уважаемые специалисты! Помогите разобраться со следующей проблемой.
ПЛК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 прежде получить правильный ответ.
Это настораживает. Я подсчитал отношение числа запросов к числу правильных ответов. Это отношение оказывается постоянным, значит, эти сбои не являются случайными, а связаны с какой-то моей ошибкой. Прошу ответить тех, кто имеет какие-то соображения на этот счёт.

ivan.korolev
07.12.2012, 20:52
Но требуется 4 раза подряд обратиться к функции get04_modbus прежде получить правильный ответ, и требуется 3 раза подряд обратиться к функции send16_modbus прежде получить правильный ответ.
Правильность чтения/записи можно проверять с помощью выходного параметра Complete соответствующего функц блока.