Всем здравствовать. Стоит задача связи 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]FloatFloatFloat...Modbus (slave)[VAR]Modbus[FIX]2 byteFloat4 byte...Modbus (slave)[VAR]Modbus[FIX]2 byteFloat8 bits <при раскрытии битов в адресах на местах % нечитаемые знаки>Float...Modbus (slave)[VAR]Modbus[FIX]Float4 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 перекрестные пары) -- результат один.