PDA

Просмотр полной версии : Modbus(master) не читает входные переменные



vojt
10.02.2010, 13:25
Подскажите, в чем причина, почему в конфигурации ПЛК150ІМ (прошивка 2.07.02, таргет 2.07) Modbus(Master) не отображается входная переменная T2 .Протокол Modbus(RTU). Сниффером обмен просматривается нормально. Внешний прибор принимает и отвечает, реагирует на изменения выходного регистра С2r по команде 0х06, отвечает и на запрос 0х03:
01 03 00 7C 00 02 05 D3
01 03 04 13 88 00 00 7E 9D - что соответствует значению 5000,
а во входном регистре ПЛК не отображается . Пробовал и Real и Registr.
Менял и время опроса и фрейм тайм. Last error показывает 81, при изменении выходного регистра кратковременно меняется на 0.
Прибор также нормально подключается через AC-4 и Lectus к Simp Light, читает и записывает по тем же адресам.
По RS-485 даный ПЛК нормально работает с МДВВ, поэтому мне кажется
порт здесь ни причем.

Филоненко Владислав
10.02.2010, 15:03
порт Dbgu в режиме Rtu не работает как мастер.

vojt
10.02.2010, 15:21
Порт Dbgu на даный момент я не использую, , поскольку в этом ПЛК 150ІМ (2008г.в.) не развязан Dbgu, и дает помехи на аналоговые входы. Связь с ПК по ТСР как установлено в праметрах связи.

vojt
10.02.2010, 16:24
<порт Dbgu в режиме Rtu не работает как мастер>
Владислав, я не совсем понял ответ. Обмен идет по RS-485, а на сколько я понимаю, порт Dbgu это Debug RS-232, или иначе?

vojt
12.02.2010, 03:33
Вспомнил, что с этой прошивкой 2.07.02 были проблемы по связи с МДВВ, пока не изменил минимальное время цикла до 10. Может причина в этом? Еще вопрос, на форуме я нашел здесь: http://www.owen.ru/forum/showthread.php?t=2915
что изменения на 7-битный режим работы порта в Вашем мастере не предусмотрено, а у меня в настройках установлено 8 но 2 стоп-бита (такие заводские настройки внешнего прибора УБЗ-302) , от этого работа мастера не может нарушаться?

Филоненко Владислав
12.02.2010, 12:32
1. 2 стоп бита должны стоять и у мастера, и у ВСЕХ приборов в сети.
2. Framing time для мастера ставим в 0.

vojt
18.02.2010, 21:06
Все равно Modbus(Master) не читает. Не знаю, может дело в этом ПЛК может в прошивке, перепрошивать не хочу, потому, что он установлен в рабочей установке . Для этой задачи буду покупать новый ПЛК150ИМ, может в нем будет все нормально.
Как резервный вариант пробую использовать библиотеку Unm. Нормально идет передача, нормально прием только не знаю как перевести символы в принятой строке в числовое значение.

vojt
19.02.2010, 18:54
с расшифровкой символов я разобрался через указатели. но, что делать если в строке идет символ $00, после которого строка обрывается и последующии символы не записываются ни в строку ни адресное пространство указанное указателем. на форуме обсуждался такой вопрос http://www.owen.ru/forum/showthread.php?p=6561&
но я так и не понял каким образом прочитать и расшифровать всю строку в которой встречаются нулевые символы?
При передаче с библиотекой UNM нулевые символы все-таки передаются, их видно сниффером (01 03 00 7C 00 02 05 D3 ) , да и внешний прибор не выдал бы ответную посылку, если б не получил полную команду включая и CRC. В СоDeSys эта строка в онлайне выглядит так trans_str:='$01 $03' , хотя задается вот так trans_str:STRING(80):='$01 $03 $00 $7C $00 $01 $45 $D2';
Если нулевые символы передаются, не смотря на то, что их в онлайне не видно, то значит они все-таки где-то храняться?

vojt
22.02.2010, 13:08
Я уже сам спрашиваю, сам и отвечаю. Может не правильно формулирую вопросы ,или нужно сменить раздел или тему ?
Подскажите будет ли работать такой скрипт с библиотекой UNM и структурой RBDATE, чтоб вместо принятия строки принимать байты, тем самым обойти нулевые символы в строке:
<
VAR
LockDevise: RBDATA;
RB_0: BYTE; (*Принятые байты *)

RB_8: BYTE;
i2:INT;
END _VАR
….
(*побайтно а не в строку*)
CASE i2 OF
0:
dat:=GetByte(DeviceNumber :=id_dev);
RB_0:=LockDevise.data;
i2:=1;
1:
dat:=GetByte(DeviceNumber :=id_dev);
RB_1:=LockDevise.data;
i2:=2;


8:
dat:=GetByte(DeviceNumber :=id_dev);
RB_8:=LockDevise.data;
i2:=0
END_CASE
……
>
Вместо принятия строки:
<
FOR i:=1 TO 9 DO
dat:=GetByte(DeviceNumber :=id_dev);
rcv_str:=CONCAT(rcv_str,RBDATA_TO_STRING(dat));
END_FOR
>
Или ‘date’ в структуре ‘RBDATE’ не являеться байтом принятой посылки?