PDA

Просмотр полной версии : ПЛК73 и RS-485



Денис_Гуливатенко
24.11.2013, 22:52
Здравствуйте уважаемые специалисты. Прежде всего, хочу сказать спасибо компании "Овен" за возможность тестирования ПЛК73.
В попытках "наладить" связь с частотником LS по интерфейсу RS-485, столкнулся с ошибкой:10839

В примерах написано: 10840

А в документации: 10841

Плата у меня точно ПИ73-2: 10842

Помогите пожалуйста разобраться!

Николаев Андрей
25.11.2013, 10:00
Особенность CODESYS - при использовании порта 0 - пишет invalid, хотя обмен идет.
Проверьте получаете ли Вы данные.

kgsh82
25.11.2013, 14:09
Возможно неправильно организован обмен, так как заявлены два ФБ для обмена. Используйте конструкцию CASE. Если используете один ФБ, а второй чтобы было, то на вход enable подавайте сразу TRUE, а по завершению работы ФБ (Complete=TRUE) разбирайте ответ

Денис_Гуливатенко
25.11.2013, 19:51
Спасибо! Попробую что нибудь получить по сети, так как отправка ничего не изменила на периферийном оборудовании. Может я с адресами напутал что-то?
Я тоже заметил, что передача Complete.

kgsh82
25.11.2013, 20:53
Спасибо! Попробую что нибудь получить по сети, так как отправка ничего не изменила на периферийном оборудовании. Может я с адресами напутал что-то?
Я тоже заметил, что передача Complete.

Судить по кусочку картинки очень неудобно

Денис_Гуливатенко
26.11.2013, 15:25
Судить по кусочку картинки очень неудобно

Так на картинке весь код. А переменная S1 - это кнопочка.

Прочитать тоже ничего не получилось((.

Давайте по порядку, может я что-то не так понял.

В документации прописаны следующие настройки:
10860
У меня в программе


F port_opened=0 THEN
Settings.Port:=com_num;
Settings.dwBaudRate:=9600;
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=2;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF
*******************************
read1modbus(
Enable:=SR1.Q1 ,
Mode:=MB_RTU ,
DevAddr:=10 ,
FirstAddr:=6 ,
Quantity:=1 ,
ComHandle:=Settings.Port ,
TimeOut:=T#50ms ,
Buffer:=Buffer,
Exception=>err ,
Complete=>cmpl );


При этом выскакивает ошибка err=255. В документации написано OxFF - Ошибка таймаута.

Может я неправильно ввожу адреса :confused:
10861

kgsh82
26.11.2013, 18:12
Так на картинке весь код. А переменная S1 - это кнопочка.

Прочитать тоже ничего не получилось((.

Давайте по порядку, может я что-то не так понял.

В документации прописаны следующие настройки:
10860
У меня в программе


При этом выскакивает ошибка err=255. В документации написано OxFF - Ошибка таймаута.

Может я неправильно ввожу адреса :confused:
10861


Для начала давайте пробежимся по настройкам. Проверьте скорость и адрес частотника. Остальное вроде как надо

Когда удостоверитесь в корректности настройки, перепишите кусок открытия порта вот так:

port_opened: BOOL:=FALSE;
***************************
IF NOT port_opened THEN
(****)
здесь настройка
(****)
COM_SERVICE1(Enable:=TRUE, Settings:=Settings, Task:=OPEN_TSK);
port_opened:=COM_SERVICE1.Ready;
END_IF

дальше сам обмен

IF port_opened THEN
read1modbus(Enable:=TRUE, Mode:=MB_RTU, DevAddr:=10, FirstAddr:=6, ComHandle:=Settings.Port, TimeOut:=500ms);

IF read1modbus.Complete THEN

IF read1modbus.Exception THEN

Здесь ставьте точку останова и просматривайте буфер

END_IF

END_IF
END_IF


Если не зафурычит - попробуйте увеличить время цикла контроллера

Денис_Гуливатенко
26.11.2013, 18:33
Как на языке ST сделать точку останова? Вроде нашел.

Спасибо за ответ. Завтра попробую. Вроде еще количество стоп-бит не совпадает.

А скажите, длина стоп-бита и количество стоп-битов это одно и тоже, или нет?

kgsh82
26.11.2013, 19:55
Как на языке ST сделать точку останова? Вроде нашел.

Спасибо за ответ. Завтра попробую. Вроде еще количество стоп-бит не совпадает.

А скажите, длина стоп-бита и количество стоп-битов это одно и тоже, или нет?

Это синоним. Кому как нравится....

kgsh82
26.11.2013, 19:59
Сделал опечатку. Надо так

IF read1modbus.Exception=0 THEN
Здесь ставьте точку останова и просматривайте буфер
END_IF

Денис_Гуливатенко
27.11.2013, 21:21
Увеличил таймаут(до 500мс), вроде как получилось прочитать данные. Но какая-то ерунда.
Значение буфера разное, в зависимости от состояния read1modbus.Complete

Когда тру:
10891

И когда фальш, к сожалению картинка пропала. Но в буфере появляется Buffer[0]=10, которое в х не записывается, так как read1modbus.Complete=false

Я читал регистр с адресом 0(модель преобразователя).
10890

И на самом деле, модель моего преобразователя соответствует значению регистра 0: А в hex, то есть 10 в dec.
Почему так происходит не пойму...

kgsh82
28.11.2013, 07:01
До того момента, как ФБ закончит работу, в буфере данные запроса, а не ответа. В модбасе первый байт - это адрес устройства. В данном случае как раз 10.
Что можно сделать? Попробовать считать другой регистр. Если те же яйца, То можно попробовать подслушать "переговоры". Нужен будет преобразователь RS485 на USB или RS232. Ну а программ для прослушки полно.

Денис_Гуливатенко
28.11.2013, 12:51
К сожалению, ничего прочитать правильно не удается(. Результат не совпадает с заявленным в документации. Может я неправильные блоки чтения использую или неправильно задаю количество ячеек?

Можно подробнее про подслушку. Какое оборудование использовать, что можно этим добиться?

kgsh82
28.11.2013, 18:04
Цикл контроллера чему равен?

Денис_Гуливатенко
28.11.2013, 18:21
Цикл контроллера чему равен?

Цикл 10 мс

Денис_Гуливатенко
28.11.2013, 18:33
Смотрите, мне кажеться в ячейке с адресом 0х006 храниться так называемое командное слово, которое состоит из 12 бит.
10898

Для того чтобы их считать, использовал фб MB_RD_INP_REGS. Какое значение в Quantity мне нужно подставить, чтобы считать эти 12бит?

Я ставил 2, и вот что получилось:
10899

Из первого изображения следует, что привод должен вращаться в прямом направлении (БИТ2=1), но он не вращается...

Денис_Гуливатенко
29.11.2013, 17:30
Есть небольшие продвижения. В преобразователе есть 8 адресов для чтения и 8 для записи, через которые можно получить доступ ко всем параметрам.
Но теперь при попытке что нибудь считать Exception =2

Где можно расшифровать, что это за ошибка?

AlexCrane
29.11.2013, 18:37
Сегодня столкнулся точно с такой-же проблемой, при чтении регистров по модбас из сигнализатора загазованности СТМ-30М получаю в буфере хаотичные значения.




get1_modbus: MB_RD_HOLD_REGS;

Buffer: ARRAY[0..255] OF BYTE;
cmpl: BOOL;
port_opened: BYTE := 0;
Init: BOOL;
Settings:COMSETTINGS;

enabl: BOOL;
err: INT;
TimeOut: TIME:=T#50ms;
Exception: BYTE;
DataSize: WORD;
master1: BYTE:= 0;
x1: WORD;
x2: WORD;
x3: WORD;
x4: WORD;
x5: WORD;
COM_SERVICE1: COM_SERVICE;




IF port_opened=0 THEN
Settings.Port:=0;
Settings.dwBaudRate:=9600;
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );


IF COM_SERVICE1.ready THEN port_opened:=2; END_IF

IF port_opened=2 THEN
CASE master1 OF

0: (* читаем из прибора с адресом 4 начиная с регистра 0 по протоколу MB-RTU*)
get1_modbus(
Enable:=enabl ,
Mode:=MB_RTU ,
DevAddr:=4 ,
FirstAddr:=0 ,
Quantity:=2,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer ,
Complete=>cmpl ,
Exception=>err ,
ByteCnt=>DataSize );



IF cmpl THEN
IF err=0 THEN
x1:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
x2:=BYTE_TO_WORD(BUFFER[3]) OR SHL(BYTE_TO_WORD(BUFFER[2]),8);
IF ((x1)AND(4096))=4096 THEN AVARIA_DVK_RESERV:=TRUE; END_IF;
END_IF

master1:=0;
END_IF

END_CASE

IF enabl = FALSE THEN enabl := TRUE; END_IF
IF err <> 0 THEN enabl := FALSE; END_IF

END_IF

Как только cmpl становится TRUE - err равен 255, т.о. в x1 никогда не записывает значения из буфера. Что только не пробовал уже.

kgsh82
29.11.2013, 20:53
Есть небольшие продвижения. В преобразователе есть 8 адресов для чтения и 8 для записи, через которые можно получить доступ ко всем параметрам.
Но теперь при попытке что нибудь считать Exception =2

Где можно расшифровать, что это за ошибка?

Полагаю в документации на Modbus. Гугл, яндекс - в помощь.

Я бы вот что сделал:
Установил бы OPC-сервер Лектус (или аналог). Собрал бы конфигурацию, согласно описанию на частотник и на сервер. Изучая лог работы, проще понять, что куда записывается и что откуда считывается. Потом бы перенес полученные знания на ПЛК.
Дополнительно почитайте описание протокола Modbus

kgsh82
29.11.2013, 21:00
Сегодня столкнулся точно с такой-же проблемой, при чтении регистров по модбас из сигнализатора загазованности СТМ-30М получаю в буфере хаотичные значения.




get1_modbus: MB_RD_HOLD_REGS;

Buffer: ARRAY[0..255] OF BYTE;
cmpl: BOOL;
port_opened: BYTE := 0;
Init: BOOL;
Settings:COMSETTINGS;

enabl: BOOL;
err: INT;
TimeOut: TIME:=T#50ms;
Exception: BYTE;
DataSize: WORD;
master1: BYTE:= 0;
x1: WORD;
x2: WORD;
x3: WORD;
x4: WORD;
x5: WORD;
COM_SERVICE1: COM_SERVICE;




IF port_opened=0 THEN
Settings.Port:=0;
Settings.dwBaudRate:=9600;
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );


IF COM_SERVICE1.ready THEN port_opened:=2; END_IF

IF port_opened=2 THEN
CASE master1 OF

0: (* читаем из прибора с адресом 4 начиная с регистра 0 по протоколу MB-RTU*)
get1_modbus(
Enable:=enabl ,
Mode:=MB_RTU ,
DevAddr:=4 ,
FirstAddr:=0 ,
Quantity:=2,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer ,
Complete=>cmpl ,
Exception=>err ,
ByteCnt=>DataSize );



IF cmpl THEN
IF err=0 THEN
x1:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
x2:=BYTE_TO_WORD(BUFFER[3]) OR SHL(BYTE_TO_WORD(BUFFER[2]),8);
IF ((x1)AND(4096))=4096 THEN AVARIA_DVK_RESERV:=TRUE; END_IF;
END_IF

master1:=0;
END_IF

END_CASE

IF enabl = FALSE THEN enabl := TRUE; END_IF
IF err <> 0 THEN enabl := FALSE; END_IF

END_IF

Как только cmpl становится TRUE - err равен 255, т.о. в x1 никогда не записывает значения из буфера. Что только не пробовал уже.

255 - таймаут.

Попробуйте увеличить время ожидания, ну и....электрическое соединение проверить. Про настройки не пишу - очевидно.
Контроллер какой? ПЛК73? Минимальное время цикла сколько?

Денис_Гуливатенко
29.11.2013, 22:00
Полагаю в документации на Modbus. Гугл, яндекс - в помощь.

Я бы вот что сделал:
Установил бы OPC-сервер Лектус (или аналог). Собрал бы конфигурацию, согласно описанию на частотник и на сервер. Изучая лог работы, проще понять, что куда записывается и что откуда считывается. Потом бы перенес полученные знания на ПЛК.
Дополнительно почитайте описание протокола Modbus

В той документации, что дает ОВЕН описаны только 3 ошибки:

0x00 – ошибок или исключений не обнаружено,
0xFE – аппаратная ошибка ПЛК,
0xFF – ошибка таймаута

Если коды ошибок стандартизированы, то тупик:
02 Адрес данных указанный в запросе не доступен данному подчиненному.

Вы наверное догадались, что я совсем новичок. Если не трудно, расскажите что за сервер, какое оборудование нужно для организации того, что Вы написали. И почему на нем легче собрать конфигурацию?

capzap
29.11.2013, 22:05
вики читали

AlexCrane
29.11.2013, 22:38
255 - таймаут.

Попробуйте увеличить время ожидания, ну и....электрическое соединение проверить. Про настройки не пишу - очевидно.
Контроллер какой? ПЛК73? Минимальное время цикла сколько?

Контроллер ПЛК63. Почему таймаут именно 255 сделать? Минимальное время цикла менял от 1 до 50 - не помогло. И как увеличить время ожидания, хочется понять этот модбас просто.

kgsh82
29.11.2013, 23:32
Контроллер ПЛК63. Почему таймаут именно 255 сделать? Минимальное время цикла менял от 1 до 50 - не помогло. И как увеличить время ожидания, хочется понять этот модбас просто.

255, ну или FF - код ошибки. Говорит о том, что за время ожидания, указанного в вызове ФБ ответ не пришел. Прижился к этой ошибке термин "таймаут". Если всё остальное правильно, то в таких случаях увеличивают время ожидания
Заведомо рабочее устройство с Modbus есть? Проверить, вдруг порт у плк дуба дал

kgsh82
29.11.2013, 23:48
В той документации, что дает ОВЕН описаны только 3 ошибки:


Если коды ошибок стандартизированы, то тупик:

Вы наверное догадались, что я совсем новичок. Если не трудно, расскажите что за сервер, какое оборудование нужно для организации того, что Вы написали. И почему на нем легче собрать конфигурацию?

Про сервер Лектус лучше всего объяснит его производитель. Ну и как собрать конфигурацию - там же
Из оборудования: компьютер естественно и преобразователь интерфейса USB-RS485 или RS232-RS485 - в зависимости от конфигурации эвм. Я пользуюсь I-7561 - вполне рабочая железяка.

Почему так легче: лектус пишет лог обмена - можно будет изучить и понять какие регистры считывать, какие записывать и в каком порядке. Возможно эту инфу можно нарыть в доке про частотник - просто не читал.

ЗЫ: Не надо ленится искать информацию в интернете. Помогайте гуглу и яндексу зарабатывать на пропитание )))

kgsh82
30.11.2013, 00:23
Хорошая мысля приходит опосля....Может просто функция чтения №4 не поддерживается и следует воспользоваться №3?

Денис_Гуливатенко
30.11.2013, 10:55
Хорошая мысля приходит опосля....Может просто функция чтения №4 не поддерживается и следует воспользоваться №3?

MB_RD_HOLD_REGS - это же №3 функция.

ASo
30.11.2013, 11:15
Все это говорит о том, что пример в руководстве у ОВЕНа - с ошибкой.
А так - библиотеки работают.

kgsh82
30.11.2013, 18:34
MB_RD_HOLD_REGS - это же №3 функция.

Да, это №3. Вот только из картинки приложенной это не видно

AlexCrane
30.11.2013, 19:31
Все это говорит о том, что пример в руководстве у ОВЕНа - с ошибкой.
А так - библиотеки работают.

Можете дать кусок своего кода как пример, а то смотрю многие сталкиваются с данной проблемой.

ASo
30.11.2013, 19:55
Я уже выдавал, поищите на форуме.
Краткая суть.
Очевидно, что MODBUS - это протокол типа запрос-ответ. Тогда библиотечная функция чтения работает следующим образом.
1. По стартовому сигналу, зачемто названному Enable, происходит формирование пакета передачи путем добавления заголовка и контрольной суммы, постановка данного пакета в очередь отправки. Далее данная очередь обрабатывается драйвером КДС и выталкивается в физический порт.
2. Теперь надо дождаться получения ответного пакета (или события тайм-аута) для этого в цикле ПЛК вызывать функцию со значением Enable:= false до получения complete = true. В это время функция анализирует входную очередь порта, заполняемую драйвером КДС, проверяет контрольную сумму, распаковывает результат в буфер.
3. Только после этого анализировать Exeption и буфер результата.

В принципе, это можно увидеть, проанализировав код библиотеки.
В примере.... эээээ. все совсем не так.

Денис_Гуливатенко
01.12.2013, 12:47
Можете дать кусок своего кода как пример, а то смотрю многие сталкиваются с данной проблемой.

плюсую+++!!!

ASo
01.12.2013, 13:03
http://www.owen.ru/forum/showthread.php?t=8556&page=2&p=47595&viewfull=1#post47595

kgsh82
01.12.2013, 17:21
To Денис_Гуливатенко:

Попробуйте считывать регистр с заранее известным значением, например 0х0000 или 0х0001. Необходимо проверить настройки обмена у частотника.

Денис_Гуливатенко
01.12.2013, 18:12
Я считывал эти адреса. Но результат не тот, что должен был бить(

kgsh82
01.12.2013, 20:24
Я считывал эти адреса. Но результат не тот, что должен был бить(

Повторюсь: попробуйте считать через комп. Вдруг частотник бракованный или контроллер (что более вероятно). А лектус - 100% рабочее решение. Что бы не выглядело как реклама - есть и другие программы, просто я ими не пользовался. Удостоверитесь в работоспособности - и рывком программировать плк.

ЗЫ: Каким проводом подключены частотник и плк и какова длина?

Денис_Гуливатенко
02.12.2013, 10:09
Витая пара. Длина 4м.

Хорошо, я обязательно попробую Лектус. Переходник на ОВЕНе покупать?

kgsh82
02.12.2013, 11:48
Витая пара. Длина 4м.

Хорошо, я обязательно попробую Лектус. Переходник на ОВЕНе покупать?

Как будет проще...

Денис_Гуливатенко
02.12.2013, 14:14
Как будет проще...
Заказал такой как у Вас. Завтра должен приехать. Надеюсь на Вашу помощь в этом "Лектусе")))

kgsh82
02.12.2013, 14:46
Заказал такой как у Вас. Завтра должен приехать. Надеюсь на Вашу помощь в этом "Лектусе")))

Предлагаю освоить заодно программу teamviewer
http://www.teamviewer.com

Денис_Гуливатенко
02.12.2013, 14:51
Предлагаю освоить заодно программу teamviewer
http://www.teamviewer.com

Я пользовался этой программой. А зачем?

kgsh82
02.12.2013, 14:56
Я пользовался этой программой. А зачем?

Для помощи.....Или нравится форум загромождать?

Денис_Гуливатенко
02.12.2013, 16:40
Для помощи.....Или нравится форум загромождать?

Я понял. Ок!

Денис_Гуливатенко
02.12.2013, 23:18
На сайте Овен Лектус в демо-версии. Ее достаточно будет?

kgsh82
03.12.2013, 07:59
На сайте Овен Лектус в демо-версии. Ее достаточно будет?

Вполне. Да и в течение месяца - это всё таки полная версия. А в случае чего, в данном случае хватит даже ограниченного функционала.

Денис_Гуливатенко
03.12.2013, 23:32
Нашел интересный ответ на глобальном сайте производителя преобразователя:

Be careful. If you want write the parameter, these address are different.
Modbus address=Inv address – 1
If you want write Frequency to Inverter(0x0005), you must use 0x0004 (modbus)
And, you want write operation command to INV (address : 0x0006), you must use 0x0005 (Modbus).
Moreover, operation command has bit segments.
So, you use MOVE function.
For example, [MOV 1 m0] means PLC make INV being forward running status.
[MOV 16 m0] means PLC make INV being emergency stop status.


IG5A address for Modbus RTU should be IG5A address minus 1.
So if you want to write frequency command address 5, you have to set 0x40004.
And you have to set 0x40005 for RUN command like forward RUN, reverse RUN and STOP command.

Почему "address 5" minus "1" = "0x40004", объясните пожалуйста?

ASo
04.12.2013, 00:04
Вы этого не знали? Что адрес регистра и адрес по сети различаются на 1???

Денис_Гуливатенко
04.12.2013, 00:30
Вы этого не знали? Что адрес регистра и адрес по сети различаются на 1???

Я забыл об этом, но мне непонятно, почему 5-1=0х40004?

ferret_maybe
04.12.2013, 01:10
Потому что кто-то считает, что счет начинается с 0, а кто-то с 1.

ASo
04.12.2013, 04:36
Потому, что 1-я четверка - тип регистра. См. описание протокола.

Денис_Гуливатенко
06.12.2013, 17:05
Всем спасибо, все получилось! Проблема была в том, что нужно значение частоты (переменной типа WORD), умножать на 100
40.00 Гц нужно записать 4000
у ПЛК73 тоже смог записать значение и запустить частотник

С помощью ЛЕКТУС, я пришел к этом решению.