Просмотр полной версии : Modbus опрос ПЛК
В Овене ПЛК100 в конфигурации Modbus Slave есть 6 регистров 4ех байтовые. При просмотре лог Lectus OPC контроллер опрашивает каждый регистр отдельным запросом. Как можно реализовать один запрос, если регистры идут все подряд?
Александр Приходько
05.04.2011, 11:27
В настройках узла в лектусе необходимо выставить галочку групповой опрос. Регистры, которые в самом лектусе добавлены последовательно(очень помогает функция тиражирования) будут отрашиваться групповым запросом. Если регистры расположены хаотично, то будут опрашиваться последовательно.
3789
3790
Нет не помогло.
Может из-за того что регистры 32 битные в Modbus??
И еше одинг вопрос адресс переменной как можно самому назначить?
Александр Приходько
06.04.2011, 10:45
Попробуйте версию с сайта 3,9:
http://www.owen.ru/catalog/64467020
Очень похожая ситуация.Есть плк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
Нашел решение проблемы.Для работы с байтами, нужно поставить в лектусе размер 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
Выдается ошибка 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 говорит о том, что адрес данных, указанный в запросе, не доступен данному слейву, могу предположить что читать надо так чтоб значения начального адреса и количество бит было кратным восьми
Удалил из запроса переменные 7D,7E,7F - то есть как вы и написали.Начальный адрес должен быть кратным 8, т.е. получается начало 128. http://s12.radikal.ru/i185/1208/71/0846534aa4c6.jpg
А вот что теперь делать с переменными которые пришлось удалить даже не знаю, их же читать все равно надо.Спасибо за подсказку.
Удалил из запроса переменные 7D,7E,7F - то есть как вы и написали.Начальный адрес должен быть кратным 8, т.е. получается начало 128. http://s12.radikal.ru/i185/1208/71/0846534aa4c6.jpg
А вот что теперь делать с переменными которые пришлось удалить даже не знаю, их же читать все равно надо.Спасибо за подсказку.
незнаю зачем Вам нужно читать побитно, в любой скаде есть функционал разбра слова на биты, грузите все регистрами в ОРС, а в визуализации разбирайте поразрядно, меньше времени уйдет на доставку инфы, а разбор на ПК несущественно времени займет
Байтами не так наглядно будет.А проблему скорости хотелось решить групповым опросом. А opc сервер как оказалось не опрашивает в группе одним запросом больше 125бит(.
Подскажите пожалуйста как записать/прочитать 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)
Нужно производить запись/чтение бита, а носителем информации о бите должно быть слово.Не получается присвоение %QX8.1.0.0, если в конфигурации modbus tcp массив из word.
Подскажите пожалуйста как записать/прочитать 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
Так Вы узнаете состояние тринадцатого бита переменной бар
Это все понятно. Проблема в другом, как одновременно читать и писать в переменную.Пример:
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 проблемы бы не было.
Проблема в записи чтении одной и той же переменной через другую.
я честно от Вашей логики в шоке, Вы слышали что нибудь о таких логических функциях как AND и OR, ищите библиотеку на oscat.de, в ней функцию BIT_LOAD_BYTE и будет Вам счастье :)
Вы меня не поняли.Ну ладно, я пошел по другому пути.Я пишу в байты, а читаю OPC сервером Word.Спасибо.
я про байты начал, потому что указатели обращаются к байтам, а с ними (указателями) Вам еще придется столкнуться в свое время. А если бы не поленились и заглянули в указанную бибку то нашли бы там рядом такие функции, как BIT_LOAD_B2, BIT_LOAD_W, BIT_LOAD_W2, BIT_LOAD_DW и BIT_LOAD_DW2, а так же всевозможные обратные преобразования
Спасибо за библиотеку, довольно полезная штука. Я теперь понял ход ваших мыслей, я почти об этом и спрашивал. Но без использования операций над битами, думал в codesys есть возможность просто обращаться к битам типо есть %DW8.1.0 ,а что бы к биту обратиться %DX8.1.0.0 но увы я так понял что нельзя, 500 переменных через функции это " некрасиво" получается.Все всем спасибо, буду дальше работать.
думал в codesys есть возможность просто обращаться к битам типо есть %DW8.1.0
и это тоже возможно, то о чем я написал в первую очередь, ну раз это прпустили повторю подробнее, открываем документ http://www.kipshop.ru/CoDeSys/steps/owen_plc-configuration.pdf, последний абзац на 13 странице и рисунок 1.6 на 14 странице, канал станет с обычным названием переменной, к котрой можно обращаться через точку чтоб считать или записать разряд
и это тоже возможно, то о чем я написал в первую очередь, ну раз это прпустили повторю подробнее, открываем документ 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. Если что не так сделал поправьте, может проще как можно сделать.
Я в 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. Если что не так сделал поправьте, может проще как можно сделать.
Все равно не уловил, чего Вы пытаетесь добиться. У меня нажатие управляющей кнопки записывается по отдельному каналу, а отображение этого состояния принимается из плк по другому каналу, по этому при включении скады я всегда вижу реальное состояние плк. И таких дискретных сигналов может быть сколько угодно, я их пакую в двойное слово, а в визуализации распаковываю
Все равно не уловил, чего Вы пытаетесь добиться. У меня нажатие управляющей кнопки записывается по отдельному каналу, а отображение этого состояния принимается из плк по другому каналу, по этому при включении скады я всегда вижу реальное состояние плк. И таких дискретных сигналов может быть сколько угодно, я их пакую в двойное слово, а в визуализации распаковываю
Т.е. у вас получается Dword- на запись, Dword- на чтение.Ну с чтением понятно, а вот с записью не очень. Если нужно изменить один бит , например пустить двигатель, вы передаете 32бита?Я правильно понял?
да, а Вы думаете что затраты на передачу одно бита по модбас существенно отличаться от передачи двух регистров?
Зато при таком раскладе, я передаю 32 состояния каких нибудь дискретных сигналов за один раз, а при передаче конкретного бита, вдруг в следующее мгновение необходимо будет передать еще битовый сигнал, начнет появляться очередь на отправку, начнет ощутимое торможение визуализации и т.п.
естественно , я забочусь о том, чтоб сигналы не изменили реальный сигнал на исполнительный механизм, если управляющая команда его некасается
А Dword в котором содержатся биты для записи читаете scada-ой ?
если я скадой записываю, зачем мне его читать, читаю я обратные связи на свои действия, но это уже другое двойное слово
у меня следующая ситуация - из программы передаю в лектус переменные (4 byte DWORD). В лектусе задаю адрес переменной и тип данных Double Word, но значение отображается совсем не то что в программе, почему так? С word все нормально проходит
Проблема такая же как в теме http://www.owen.ru/forum/showthread.php?t=11804, только так и не понял как решить ее.. Там написано что необходимо указать другой порядок, как это сделать? Адреса переменной какие будут?
Sergey666
22.10.2013, 09:34
Стандартная проблемма с пресловутым выравниванием.
Переменные типа DWORD прописываете в конце списка WORD регистров , при этом DWORD прописывать после четного WORD регистра модбас слэйв.
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot