PDA

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



Len_ss
05.04.2011, 09:27
В Овене ПЛК100 в конфигурации Modbus Slave есть 6 регистров 4ех байтовые. При просмотре лог Lectus OPC контроллер опрашивает каждый регистр отдельным запросом. Как можно реализовать один запрос, если регистры идут все подряд?

Александр Приходько
05.04.2011, 11:27
В настройках узла в лектусе необходимо выставить галочку групповой опрос. Регистры, которые в самом лектусе добавлены последовательно(очень помогает функция тиражирования) будут отрашиваться групповым запросом. Если регистры расположены хаотично, то будут опрашиваться последовательно.
3789
3790

Len_ss
05.04.2011, 13:56
Нет не помогло.
Может из-за того что регистры 32 битные в Modbus??
И еше одинг вопрос адресс переменной как можно самому назначить?

Александр Приходько
06.04.2011, 10:45
Попробуйте версию с сайта 3,9:
http://www.owen.ru/catalog/64467020

sink3d
31.08.2012, 07:56
Очень похожая ситуация.Есть плк110, в конфигурации выходов создан массив modbus TCP в котором расположено 28регистров по 8бит.Если лектусом опрашивать по битно то это долго. 224 бита последовательно за 1с опросить это не реально. А вот опросить группой вполне. Поставив галочку в лектусе групповой опрос обнаружил следующее:
1. С настройками по умолчанию с максимальным размером пакета 256байт читается только 124 переменные.Первые 124 переменные отображаются нормально- остальные ошибка приема/передачи.Причем "плохие" переменные
сохраняют возможность на запись.Т.е. чтение не проходит , а запись в них проходит.
2. Если поставить размер максимального пакета 10байт вместо 256 то все нормально.
Пробовал массивы не по 8бит(байт) х 28шт (224), а по 2байта(word) х259штук все нормально, т.е. проблема только при чтении битов.
Пробовал контроллер без программы и с большой программой.
Это глюк контроллера или я делаю что-то не так?http://i020.radikal.ru/1208/94/5e0b37472536.jpg

sink3d
31.08.2012, 08:32
Нашел решение проблемы.Для работы с байтами, нужно поставить в лектусе размер 1го регистра = 1байт.По спецификации modbus 1регистр = 2байта.Но при таком раскладе, перестают читаться регистры размером word(. Ответ представителей Lectus OPC :

Выдается ошибка 2 - некорректный адрес.

15:56:27.968 [3752] (10.0.0.10:502) Tx: [12] 01 87 00 00 00 06 01 01 00 7D 00 22
15:56:27.968 [3752] (10.0.0.10:502) Rx: [9] 01 87 00 00 00 03 01 81 02
15:56:27.968 [3752] Ошибка приема/передачи (10.0.0.10:502 Адрес:1)

Если в настройках кол-во промежуточных регистров = 0, то значит в конфигурации
задан какой-то некорректный адрес с 0x7D до 0x9E.

За подробностями обращайтесь к разработчикам Modbus устройства (Овен).
На Fastwel opc - наблюдается такая же картина.http://s018.radikal.ru/i514/1208/00/08eb266cde1e.jpg

capzap
31.08.2012, 12:46
Выдается ошибка 2 - некорректный адрес.

15:56:27.968 [3752] (10.0.0.10:502) Tx: [12] 01 87 00 00 00 06 01 01 00 7D 00 22
15:56:27.968 [3752] (10.0.0.10:502) Rx: [9] 01 87 00 00 00 03 01 81 02
15:56:27.968 [3752] Ошибка приема/передачи (10.0.0.10:502 Адрес:1)

Если в настройках кол-во промежуточных регистров = 0, то значит в конфигурации
задан какой-то некорректный адрес с 0x7D до 0x9E.

За подробностями обращайтесь к разработчикам Modbus устройства (Овен).

непонятно какое решение проблемы Вы нашли, я так понимаю что виноват ОВЕН :)
01 87 00 00 00 06 01 01 00 7D 00 22 это групповое чтение битов с 125 адреса в количестве 34 булевых значений. Если всё это сложить то Вы должны у себя в конфигурации иметь как минимум 10 регистров модбас или 20 модулей по 8 бит
01 87 00 00 00 03 01 81 02 говорит о том, что адрес данных, указанный в запросе, не доступен данному слейву, могу предположить что читать надо так чтоб значения начального адреса и количество бит было кратным восьми

sink3d
31.08.2012, 13:23
Удалил из запроса переменные 7D,7E,7F - то есть как вы и написали.Начальный адрес должен быть кратным 8, т.е. получается начало 128. http://s12.radikal.ru/i185/1208/71/0846534aa4c6.jpg
А вот что теперь делать с переменными которые пришлось удалить даже не знаю, их же читать все равно надо.Спасибо за подсказку.

capzap
31.08.2012, 15:33
Удалил из запроса переменные 7D,7E,7F - то есть как вы и написали.Начальный адрес должен быть кратным 8, т.е. получается начало 128. http://s12.radikal.ru/i185/1208/71/0846534aa4c6.jpg
А вот что теперь делать с переменными которые пришлось удалить даже не знаю, их же читать все равно надо.Спасибо за подсказку.

незнаю зачем Вам нужно читать побитно, в любой скаде есть функционал разбра слова на биты, грузите все регистрами в ОРС, а в визуализации разбирайте поразрядно, меньше времени уйдет на доставку инфы, а разбор на ПК несущественно времени займет

sink3d
31.08.2012, 16:18
Байтами не так наглядно будет.А проблему скорости хотелось решить групповым опросом. А opc сервер как оказалось не опрашивает в группе одним запросом больше 125бит(.

sink3d
03.09.2012, 10:34
Подскажите пожалуйста как записать/прочитать bit в word. Получается только через byte %QB8.1.0 --> %QX8.1.0.0. С word такая фишка не прокатывает(%QW8.1.0 --> %QX8.1.0.0, x:=temp.0;temp.0:=x не вариант( ), как быть?

Николаев Андрей
03.09.2012, 10:41
Есть библиотека Util.lib посмотрите.
byte в ворд переводится либо оператором byte_to_word либо складыванием двух байтов (старший перед этим умножаем на 255)

sink3d
03.09.2012, 10:45
Нужно производить запись/чтение бита, а носителем информации о бите должно быть слово.Не получается присвоение %QX8.1.0.0, если в конфигурации modbus tcp массив из word.

capzap
03.09.2012, 13:23
Подскажите пожалуйста как записать/прочитать bit в word. Получается только через byte %QB8.1.0 --> %QX8.1.0.0. С word такая фишка не прокатывает(%QW8.1.0 --> %QX8.1.0.0, x:=temp.0;temp.0:=x не вариант( ), как быть?

Во первых переходите на именование канала, чтоб обращаться к нормальной переменной а не через процент, далее делаете такую запись foo:= (SHR(bar,13) & 0x01)>0
Так Вы узнаете состояние тринадцатого бита переменной бар

sink3d
03.09.2012, 13:42
Это все понятно. Проблема в другом, как одновременно читать и писать в переменную.Пример:
var
Value1:bool;
end_var;
------------------------
Value AT %QW8.1.0:word;
Value1:=Value.0; \\Все прекрасно работает, теперь как записать значение из переменной Value1 в Value.0?
Если сюда же вписать:
Value.0:=Value1; // Тоже все ок.А вот если бы переменная Value1 имела бы общую память с Value.0 проблемы бы не было.

Но не одновременно:
Value1:=Value.0;
Value.0:=Value1;
// Здесь ерунда получается.А вот если бы переменная Value1 имела бы общую память с Value.0 проблемы бы не было.
Проблема в записи чтении одной и той же переменной через другую.

capzap
03.09.2012, 13:53
я честно от Вашей логики в шоке, Вы слышали что нибудь о таких логических функциях как AND и OR, ищите библиотеку на oscat.de, в ней функцию BIT_LOAD_BYTE и будет Вам счастье :)

sink3d
03.09.2012, 16:03
Вы меня не поняли.Ну ладно, я пошел по другому пути.Я пишу в байты, а читаю OPC сервером Word.Спасибо.

capzap
03.09.2012, 16:11
я про байты начал, потому что указатели обращаются к байтам, а с ними (указателями) Вам еще придется столкнуться в свое время. А если бы не поленились и заглянули в указанную бибку то нашли бы там рядом такие функции, как BIT_LOAD_B2, BIT_LOAD_W, BIT_LOAD_W2, BIT_LOAD_DW и BIT_LOAD_DW2, а так же всевозможные обратные преобразования

sink3d
03.09.2012, 20:13
Спасибо за библиотеку, довольно полезная штука. Я теперь понял ход ваших мыслей, я почти об этом и спрашивал. Но без использования операций над битами, думал в codesys есть возможность просто обращаться к битам типо есть %DW8.1.0 ,а что бы к биту обратиться %DX8.1.0.0 но увы я так понял что нельзя, 500 переменных через функции это " некрасиво" получается.Все всем спасибо, буду дальше работать.

capzap
03.09.2012, 20:43
думал в codesys есть возможность просто обращаться к битам типо есть %DW8.1.0

и это тоже возможно, то о чем я написал в первую очередь, ну раз это прпустили повторю подробнее, открываем документ http://www.kipshop.ru/CoDeSys/steps/owen_plc-configuration.pdf, последний абзац на 13 странице и рисунок 1.6 на 14 странице, канал станет с обычным названием переменной, к котрой можно обращаться через точку чтоб считать или записать разряд

sink3d
03.09.2012, 22:46
и это тоже возможно, то о чем я написал в первую очередь, ну раз это прпустили повторю подробнее, открываем документ http://www.kipshop.ru/CoDeSys/steps/owen_plc-configuration.pdf, последний абзац на 13 странице и рисунок 1.6 на 14 странице, канал станет с обычным названием переменной, к котрой можно обращаться через точку чтоб считать или записать разряд

Я в 11 посту писал об этом.Через переменную не вариант.т.к. Мне нужно одновременно писать и читать ее. Смотрите что получается, через opc я обратился к переменной, записал значение, присвоил это значение через точку переменной.Например Auto:bool . А в переменная в разделе modbus tcp имеет имя Auto_to_scada AT %QW8.0.1. Т.о. Auto:=Auto_to_scada.1;
Все прекрасно, на SCADA нажал кнопку Auto, в плк переменная auto приняла значение TRUE.Далее выключаем компьютер со SCADA, плк при этом работает.После загрузки SCADA указатель режима работы в SCADA отображает False, потому что SCADA не знает о том, что переменная Auto была переведена в true(до ее выключения).Что бы такого неопределенного состояния не возникало нужно считать переменную с плк в SCADA. Каким образом?
Auto_to_scada.1:=Auto;- уже не катит.(Поэтому как вариант я записал переменную auto в регистр byte изменив 1й бит,т.е. ушел от еще одной переменной в плк(без присвоения) и сэкономил память.Далее считал 2байта через opc.Ну а в SCADA через скрипт C# расшифровал каждый бит регистра Word. Если что не так сделал поправьте, может проще как можно сделать.

capzap
03.09.2012, 22:58
Я в 11 посту писал об этом.Через переменную не вариант.т.к. Мне нужно одновременно писать и читать ее. Смотрите что получается, через opc я обратился к переменной, записал значение, присвоил это значение через точку переменной.Например Auto:bool . А в переменная в разделе modbus tcp имеет имя Auto_to_scada AT %QW8.0.1. Т.о. Auto:=Auto_to_scada.1;
Все прекрасно, на SCADA нажал кнопку Auto, в плк переменная auto приняла значение TRUE.Далее выключаем компьютер со SCADA, плк при этом работает.После загрузки SCADA указатель режима работы в SCADA отображает False, потому что SCADA не знает о том, что переменная Auto была переведена в true(до ее выключения).Что бы такого неопределенного состояния не возникало нужно считать переменную с плк в SCADA. Каким образом?
Auto_to_scada.1:=Auto;- уже не катит.(Поэтому как вариант я записал переменную auto в регистр byte изменив 1й бит,т.е. ушел от еще одной переменной в плк(без присвоения) и сэкономил память.Далее считал 2байта через opc.Ну а в SCADA через скрипт C# расшифровал каждый бит регистра Word. Если что не так сделал поправьте, может проще как можно сделать.

Все равно не уловил, чего Вы пытаетесь добиться. У меня нажатие управляющей кнопки записывается по отдельному каналу, а отображение этого состояния принимается из плк по другому каналу, по этому при включении скады я всегда вижу реальное состояние плк. И таких дискретных сигналов может быть сколько угодно, я их пакую в двойное слово, а в визуализации распаковываю

sink3d
07.09.2012, 12:46
Все равно не уловил, чего Вы пытаетесь добиться. У меня нажатие управляющей кнопки записывается по отдельному каналу, а отображение этого состояния принимается из плк по другому каналу, по этому при включении скады я всегда вижу реальное состояние плк. И таких дискретных сигналов может быть сколько угодно, я их пакую в двойное слово, а в визуализации распаковываю

Т.е. у вас получается Dword- на запись, Dword- на чтение.Ну с чтением понятно, а вот с записью не очень. Если нужно изменить один бит , например пустить двигатель, вы передаете 32бита?Я правильно понял?

capzap
07.09.2012, 13:11
да, а Вы думаете что затраты на передачу одно бита по модбас существенно отличаться от передачи двух регистров?
Зато при таком раскладе, я передаю 32 состояния каких нибудь дискретных сигналов за один раз, а при передаче конкретного бита, вдруг в следующее мгновение необходимо будет передать еще битовый сигнал, начнет появляться очередь на отправку, начнет ощутимое торможение визуализации и т.п.
естественно , я забочусь о том, чтоб сигналы не изменили реальный сигнал на исполнительный механизм, если управляющая команда его некасается

sink3d
07.09.2012, 13:21
А Dword в котором содержатся биты для записи читаете scada-ой ?

capzap
07.09.2012, 13:31
если я скадой записываю, зачем мне его читать, читаю я обратные связи на свои действия, но это уже другое двойное слово

capzap
07.09.2012, 14:09
нет, такого опыта нет

Igor.m
22.10.2013, 07:23
у меня следующая ситуация - из программы передаю в лектус переменные (4 byte DWORD). В лектусе задаю адрес переменной и тип данных Double Word, но значение отображается совсем не то что в программе, почему так? С word все нормально проходит

Igor.m
22.10.2013, 08:11
Проблема такая же как в теме http://www.owen.ru/forum/showthread.php?t=11804, только так и не понял как решить ее.. Там написано что необходимо указать другой порядок, как это сделать? Адреса переменной какие будут?

Sergey666
22.10.2013, 09:34
Стандартная проблемма с пресловутым выравниванием.
Переменные типа DWORD прописываете в конце списка WORD регистров , при этом DWORD прописывать после четного WORD регистра модбас слэйв.