PDA

Просмотр полной версии : Задание больших адресов в Конфигураторе ПЛК (Modbus Slave)



Nikita_
26.02.2019, 22:14
Всем здравствовать. Стоит задача связи SCADA и ПЛК 110-30М по Modbus TCP/IP.

Для отладки разрабатываемой SCADA, я создаю стенд (ПК+ПЛК) и мне необходимо в точности повторить адресацию переменных в памяти ввода/вывода контроллера, какую использует подрядчик на нижнем уровне. Знаю, что он работает с библиотеками типа SysLibSockets, но я пока так не умею: мне понятен лишь стандартный механизм конфигурирования ПЛК. Таким образом нужно адресовать порядка 600 переменных в пределах (c запасом) 21000 регистров.

Опытным путем обнаружил, что модуль Modbus (slave) позволяет создавать до 999 подэлементов вне зависимости от их типа. Также выяснил, что в корневом модуле Modbus slave можно создавать до 2 вложенных подмодулей того же типа: при большем числе начинает ругаться, не компилируется (да даже и во втором вложенном Modbus (slave) в элементе 8 bits при раскрытии его уже некорректно начинают отображаться символы % в адресах каналов, однако, падла, компилируется). Итого, вручную реализовал структуру разработчика нижнего уровня, широко задействуя принцип вложенности и копирования-вставки. (С используемой конфигурацией адресов и типов переменных при рациональном подходе это получилось не слишком сложно.) Причем в структуре Modbus[FIX] элемент ТСР[VAR] добавил лишь в корневой модуль Modbus (slave). В итоге получилось что-то вроде:

Modbus (slave)[VAR]

Modbus[FIX]


ТСР[VAR]

Float

Float

Float

...

Modbus (slave)[VAR]


Modbus[FIX]


2 byte


Float


4 byte


...


Modbus (slave)[VAR]



Modbus[FIX]



2 byte



Float



8 bits <при раскрытии битов в адресах на местах % нечитаемые знаки>



Float



...

Modbus (slave)[VAR]


Modbus[FIX]


Float


4 byte


...

Предварительно сделал пробный проект, повторяющий самый принцип вложенности (с двумя вхождениями Modbus (slave), с руганью в адресах 8 bits последнего). Проект работал, SCADA видела.

Для функционального проекта мне потребовалось в Настройках целевой платформы увеличить выделение памяти на область выходов и под стать тому -- общую память. 21000 регистров -- это 42000 байт: итого, учитывая запас, округлил до 16#A400 размер области выходов и 16#E400 взял как общий размер памяти. Проект стал компилироваться, но вот незадача. Загружает, падла, программу, загрузил, ждет, и тут Ошибка (#0), мол, произошло отключение. Нажимаю опять "Подключиться" и все как ни в чем не бывало. Даже, бывает, вижу значения дискретных входов, могу устанавливать дискретные выходы. Но SCADA при этом ни в какую не видит контроллер: выдает ошибку 10061.

Простой проект


с той же (по принципу) вложенностью,
с точно таким же выделением памяти,
но без программы
и с адресацией всего нескольких сотен регистров

видит, сука, а почти такой же проект, но с программой и с 21000 адресуемых регистров, падла, не видит. Читал, что размеры памяти входов и выходов с 16 кБ можно увеличить при желании до 32 кБ, но, что это предел, явно нигде не пишут. У меня, стало быть, с 16#A400+16#1FFF где-то за 49 кБ получается. Ну, 41 кБ на выходы мне железно надо использовать. Думал бы, что проблема именно в этом, но ведь, сука, простой проект с таким же выделением памяти работает, падла... и ошибки не появляется, да даже если и появляется, то при повторном включении SCADA все равно видит ПЛК, читает и пишет переменные, а вот с полнофункциональным проектом -- нет. Я начал искать границы применимости, удалил половину элементов в области ввода-вывода, порезал и связанные с этим POU и визуализацию: так вообще перестал загружаться: компилируется, заливается и сразу вылетает, и так постоянно. Последнее связываю с тем, что при удалении столь большого числа элементов неизбежно нарушается структура адресов и происходят ошибки выравнивания, о чем без стеснения предупреждает OWEN (cм. Рук-во).

Автоматическая адресация выставлена, проверка перекрытия тоже.

Очень надеюсь на вашу конструктивную помощь. Вожусь с этой проблемой несколько месяцев. Здесь какая-то принципиальная ошибка. Можно ли вообще задавать 42000 байта каналов используя стандартный механизм конфигурирования области ввода-вывода?

PS: Связываюсь и с CoDeSys, и cо SCADA напрямую через Ethernet. Как прямым шнуром, так и кроссом 8 pin (только 2 перекрестные пары) -- результат один.

capzap
26.02.2019, 22:22
потратили бы несколько месяцев на изучение работы с библиотекой, чем впихивать не впихуемое

Nikita_
27.02.2019, 20:35
Capzap, "невпихуемое" наверняка или вам неизвестно в точности о границах применимости такого подхода? Ведь с несколькими сотнями адресуемых регистров при том же "шаманстве" все работает. Тогда до какого предела, так сказать на скорую руку, можно пользоваться подобными извращениями, не прибегая к библиотекам?

capzap
27.02.2019, 20:42
я пользуюсь библиотеками, поэтому размер конфигуратора не знаю

Филоненко Владислав
28.02.2019, 08:02
Размер конфигурации (не ОЗУ под регистры, а описания) ограничен 100кБ. Вы многократно вышли за пределы, в результате ПЛК отбрасывает выходящую за пределы 100кБ информацию.
Вам правильно подсказали, что надо использовать библиотеку Slave.
А вот ругаться не следует.

P.S. А SCADA система с 21000 регистров - это прямой путь в ад отладки. Если Вы делаете реальный проект, а не пилите бабло - пора бы пересмотреть концепцию.
По опыту пользователи даже с 1000 регистров уже имели колоссальные проблемы с временем цикла, т.к. их надо обрабатывать, использовать в коде, менять значения. Либо эти тысячи были для галочки и реально никогда не использовались.
Да даже забить несколько сотен переменных, задать им имена (работа через %Q - это гарантия проблем со стабильностью кода), описать, добавить код контроля диапазона и др. банальные и нужные вещи - объём работы слишком велик.
И объект с 21000 (да пусть и с 600) переменными - это что-то типа большого курятника, свинарника с датчиками в каждой курице. Явно задача для распределённой системы, а не вешать всё на 1 ПЛК, экономя 100000 и потеряв миллионы, когда пьяный монтажник по ошибке залезет не в тот шкаф.
Не говоря уже об количестве труднообнаруживаемых ошибок в таком большом проекте.

Спорягин Кирилл
28.02.2019, 13:45
Вопрос старый. Почитайте, например, вот это (http://www.owen.ru/forum/showthread.php?t=25302&page=3&p=255741&viewfull=1#post255741).

Nikita_
02.03.2019, 12:30
Владислав, Кирилл, спасибо: это уже по делу. Действительно, использование вложенных модулей дает лишь мнимый выход за ограничение в 999 каналов на модуль. Но и это число для меня пока имеет мифический характер. Так, в моем случае, с ПЛК 110-30М и одним Modbus slave TCP, удалось (без усечения имен элементов) достичь предела в 817 каналов вне зависимости от их типов. Также выявлено, что при включении вложенных Modbus slave (по крайней мере, не для разграничения доступа, а в качестве своеобразных "папок" для структуризации области ввода-вывода) модуль первого уровня вложенности можно грубо считать за 1 kanal а модуль второго -- за 2. (О третьем уровне не идет и речи, т.к. вы попросту погубите свой проект.) При достаточно широком использовании вложенных модулей-папок вам, в силу набежавшей погрешности, таки удастся накинуть еще немного каналов к рассчитанному таким образом числу, но если (во всяком случае, с моим ПЛК), высчитав количество элементов, вы получили число за пределами 817, да даже и близкое к тому, -- лишний раз стоит задуматься, а стоит ли свеч шаманство с именами каналов или позволит вам пара-тройка лишних модулей или отказ от структуризации обеспечить должный задел к расширяемости вашей программы? Ибо уже с 817 сконфигурированными каналами программа загружается через раз. Обеспечит ли это подобающую надежность?! Поэтому отдельно попросил бы многоуважаемую публику тем же образом поделиться полезной ссылкой для освоения работы с "Бибками" практически с нуля.

Теперь по замечаниям. Еще раз: идеологию нижнего уровня придумал не я. Нижний уровень лежит на отдельной организации. В головном контроллере для обмена по сети в пределах 21000 регистров адресного пространства "размазано" порядка 1500 переменных, что называется мне на выбор. Разумеется, добрая их доля являются локальными в программе контроллера. При этом часть алгоритмах реализуется в подчиненных контроллерах для коих головной является лишь посредником для связи с верхним уровнем. Из предоставленного списка -- для обработки SCADA я выбрал немногим более 600 переменных. Объект во всех смыслах большой, сложный. Практически все данные в SCADA функциональны, а не заведены "на всякий случай". Основные технологические параметры, задания, уставки, тревоги и параметры работы алгоритмов ПЛК -- ничего, я считаю, не является лишним. Неужели вы видите принципиальную ошибку в таком подходе?

krollcbas
02.03.2019, 23:29
Nikita, возможно ли Вас попросить составить структурную схему?