В своей практике я встречался со множеством башенных кранов, начиная от “советских” КБ различных моделей и их модификаций, заканчивая современными кранами, в том числе Liebherr. Причем, среди последних я сейчас встречаюсь не только с новыми, а и со старичками, которые иногда старше меня)
Если с новыми кранами все более-менее хорошо (мощная система диагностики практически всех компонентов электросхемы, большой экран с отображением множества параметров, современная схемотехника с использованием ПЧ), то со старичками часто приходится повозиться. Да, релейно-контакторная схема не сложна, но годы дают знать свое.
Отдельным пунктом стоит выделить экран в кабине оператора - ящик с маленьким сегментным экраном, показывающим только значение вылета тележки на стреле. И табличка с грузовой характеристикой, которую нужно выбрать и прикрутить к корпусу в соответствии со смонтированной длиной стрелы.

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

Естественно, возникла идея заменить старое на что-то более-менее современное. Т.к. для модернизации нужно разрешение завода-изготовителя, получить которое практически невозможно, то решено было сделать систему мониторинга параметров, которая никак не влияет на имеющуюся электрическую схему. По сути, - систему, являющуюся надстройкой.
Имея опыт программирования HMI (ЧМИ) и PLC с PLR, в голове прикинул проект, предложил руководству компании - и получил положительное решение. Значит, пора строить испытательный прототип. И приниматься за программирование.
В качестве HMI я использовал панель DOP-107EV производителя Delta Electronics.
Устройством, отвечающим за логику работы, решил выбрать хорошо знакомое мне программируемое реле EasyE4 от Eaton Electric - выбрал вариант с пружинными клеммами и без дисплея EASY-E4-AC-12RCX1P, и с модулем расширения 4AI+2AO - EASY-E4-DC-6AE1. О них, кстати, писал здесь ранее.
Запитывать панель HMI и модуль расширения было решено от блока питания Delta DRC-24V60W-1AZ - более гармонично смотрится рядом с EasyE4. Да и в надежности и помехозащищённости БП данного производителя я уверен на все 100%.
Вообще, конкретные модели оборудования выбирались исходя из наличия: возможны различные комбинации HMI - PLR, но наличие подводит) Кризис в полупроводниковой сфере и пандемия значительно влияют на ситуацию с ассортиментом и доступностью.
PLR и HMI соединяются при помощи обычного Ethernet-кабеля, протокол связи - Modbus TCP.
Схему прототипа составил следующую:

Для создания схем я использовал (и рекомендую его) продукт QElectroTech - хорошее, постоянно обновляемое бесплатное ПО с огромной базой компонентов - для небольших схем отличный вариант: я на нем проект на 16 листов с перекрестными ссылками нарисовал как-то:)
Дополнительно для тестового образца была закуплена периферия - различные разъёмы, клеммы, корпуса для панели и PLR, кабели для подсоединения датчиков, монтажные принадлежности (подбиралась периферия, опять же, в близлежащем магазине электротоваров и исходя из наличия).

Пока компоненты закупались, я начал программировать. Т.к. с рисованием и программированием интерфейсов у меня опыта больше, чем с программированием PLC/PLR, и в программе DIAScreen для HMI есть встроенный эмулятор - принялся за интерфейс.
Все экраны рисовал в фирменных “либхеровских” цветах - желтом и сером.
Получилось как-то так:

Главный экран имеет 2 варианта отображения - желтый на сером и серый на желтом. Дневной и ночной режимы, если можно так сказать. Выбирается в настройках.
Общий вид и функционал экрана для крановщика (скриншоты из режима офлайн эмуляции панели, поэтому везде в значениях нули):

Секция А: тележка стрелы.
А1 - актуальное положение;
А2, А3 - минимальное и максимальное значение вылета согласно смонтированному варианту стрелы;
А4 - максимальное допустимое положение тележки с актуальным грузом согласно установленной грузовой характеристике.
Секция В: Масса груза
В1 - актуальный груз;
В2 - допустимая масса груза на текущем вылете согласно установленной грузовой характеристике;
В3 - процент загрузки - отношение актуального груза к допустимому при текущем положении тележки (В1/В2).
Секция С: Глубина опускания крюка.
С1 - актуальная глубина опускания;
С2, С3 - минимальная и максимальная глубины опускания крюка.
Секция D: Анемометр.
Отображение текущей скорости ветра в м/с и км/ч. Настраиваемая подсветка раздела (предупреждение и запрет работы - оранжевый и красный фон раздела).
Секция E: дополнительная.
На данный момент в ней реализовано отображение грузовой характеристики.
Координаты А1, В1, С1 дублируются в виде прогресс-бара.
В качестве датчика высоты используется потенциометр, аналогичный испоьзуемому для тележки - блоки концевых выключателей однотипны, есть место под установку потенциометра.
В качестве датчика груза будет использован (пока ничего подходящего нет в наличии) датчик линейного положения. Рассматриваемая модель - KL 500-5K0/M-SE.
Среди базовых настроек, доступных оператору, можно установить яркость экрана, дату, время, выбрать светлый либо темный режим отображения.

Доступ к настройкам для сервисного персонала защищен динамическим паролем: две нижние кнопки становятся видимыми только после ввода корректного пароля.
Сервисные настройки состоят из двух экранов: экран выбора модели башенного крана и экран настроек датчиков.
При выборе и сохранении новой конфигурации башенного крана предыдущие настройки координат (параметры масштабирования датчиков) сбрасываются.
Перед настройкой системы необходимо корректно настроить механические концевые выключатели.
Настройка системы мониторинга сводится к выбору модели и смонтированной длины стрелы крана, при необходимости редактировании данных анемометра, уставок скорости ветрового предупреждения и запрета работы.

После данных настроек нужно перейти на страницу настроек датчиков.
Необходимо последовательно настроить 3 координаты: длину стрелы (предельные значения выставляются автоматически исходя из выбранной конфигурации на предыдущей странице), глубину опускания (устанавливается необходимая) и массу - в качестве эталонной массы вводится масса контрольного груза, который необходим для приемочных испытаний.

В нижней строке отображаются значения датчиков в Вольтах - при настройке необходимо следить, чтобы сигнал с датчиков был в пределах 0..10В на всем диапазоне работы.
Программирование PLR было увлекательным :)
Программа написана на языке ST (структурированный текст) - наиболее подошедший из имеющихся для использования с циклами условий, например "IF-THEN-ELSE" или "WHILE-DO".
Предварительно была произведена настройка "железа". В частности, установлен тип сигнала и размерность аналоговых входов и выходов модуля расширения.

Настроена передача слов (MW) через Modbus TCP.

На входы программируемого реле (см. схему ранее) подал дискретные сигналы от аварийной кнопки (“гриб”, I01), включения управления крана (I02), а также сигнал “флюгерного” положения (I03) - когда в нерабочем состоянии кран может вращаться под действием ветра в любую сторону.
После изучения возможностей PLR и имеющихся стандартных функциональных блоков, для отображения актуальных координат были использованы блоки “LS” - блок масштабирования значений. Блок преобразует входной сигнал (в нашем случае сигнал в Вольтах с аналогового входа) в нужную нам величину - метры, тонны, метры в секунду. Ниже пример для преобразования сигнала от потенциометра тележечной лебедки стрелы.
LS01 (
EN := I01 AND I02,
I1 := IA05,
X1 := MW11,
Y1 := MW12,
X2 := MW13,
Y2 := MW14,
QV => MW15
);
EN - разрешение работы блока. Работает при сигналах на дискретных входах I01 и I02 - аварийная кнопка не нажата и управление крана включено, чтобы не загружать реле расчетами во время простоя.
I1 - источник сигнала для масштабирования. В данном случае это первый аналоговый вход модуля расширения.

Координаты X1, X2 - значения сигнала аналогового входа для крайних положений.
Координаты Y1, Y2 - соответствующие значения в метрах.
QV - выход блока - переменная, в которую будет записываться масштабированное значение.
В качестве значений используются слова - их можно перезаписывать и считывать из PLR при помощи HMI при настройке. Например, слову MW15 соответствует координата А1 на главном экране, MW12 и MW14 - координаты А2 и А3.
Аналогичным образом идет расчет координат для глубины опускания, массы груза, скорости ветра.
Еще одно использование блока LS - для формирования сигнала, пропорционального вылету стрелы, на аналоговом выходе. Данный сигнал необходим в случае установки и использования на кране системы антистолкновений при работе нескольких машин на одной стройплощадке с пересекающимися зонами работы (Anti Collision system). Для этой системы используется сигнал 0..3,3В. Данная реализация кода всегда дает сигнал 0,3В при минимальном вылете, и 3,0В при максимальном.
LS05 (
EN := I01 AND I02,
I1 := MW15,
X1 := MW12,
Y1 := 300,
X2 := MW14,
Y2 := 3000,
QV => QA05
);
Отдельного упоминания заслуживает грузовая характеристика. Представляет она собой кривую зависимости допустимой массы от положения тележки на стреле.

Проштудировав инструкцию к EasyE4, нашел функциональный блок PM - блок кривой нагрузки. "Идеально подходящий" -, подумал я. Настройка данного блока заключается во внесении данных в таблицу. Первый столбец - вылет, второй - соответствующая масса. Запустил эмуляцию, проверил - работает.

Но не тут-то было. Всего таких блоков в памяти реле можно использовать аж 4 штуки. А учитывая, что на каждую из кривых надо 2 блока (зависимость массы от вылета и обратная зависимость - вылета от массы), получается, что можно внести только 2 характеристики. А для кранов может быть и 4, и 6, и даже 10 вариантов характеристик, зависящих от смонтированной длины стрелы и запасовки. И самый большой минус - данные в табличную часть можно занести только вручную (правая часть скриншота выше - задаваемые точки). Обращался по этому поводу в официальную техподдержку - на данный момент возможности вносить данные через протокол связи нету. А каждый раз загружать новую программу, отличающуюся только внесенными данными - не самый лучший вариант. Тем более, если в планах расширять функционал, вносить правки во множество программ, отличающихся только значениями в таблицах - не самый разумный подход.
Что ж, пришлось искать выход из положения. Фактически, кривую нагрузки можно рассматривать как последовательность прямых отрезков. Разница значений на малых радиусах между кривой и спрямленной линией небольшая, а на конце стрелы так вообще кривую нагрузки не отличить от прямой.
Что дает возможность использования все того же блока LS, передавая в него ближайшие меньшую и бОльшую известные координаты кривой нагрузки. А вот данные конкретной характеристики можно загружать из панели. Для этого я использовал такой инструмент, как наборы рецептов.

Именно эту функцию делает страница настроек с выбором модели крана и длины его стрелы - загружает в PLR нужный набор значений вылета стрелы и соответствующих им грузоподъемностей. Как дополнительное удобство - данные в “рецепты” можно импортировать через csv-файл, подготовленный во внешнем редакторе. Но нужно учитывать, что тот же Excel, либо Google Sheets, при открытии по умолчанию производят конвертацию форматов данных в csv, и нужно либо отключать эти конвертации, либо использовать другие редакторы.
Каждый из рецептов представляет собой строку длиной 50 слов, первые 25 ипользуются для значений вылетов, остальные - для соотвествующих значений. Если в конкретной кривой нагрузки меньше 25 значений, то оставшиеся ячейки заполняются нулями. При вызове всплывающего экрана проверяется условие “значение > 0”, что является условием видимости значения на экране.
if (screen.IsOpen(10) == 1) then
if (mem.static.Read(101) == 0) then
mem.inter.WriteBit(1, 1, 0)
else
mem.inter.WriteBit(1, 1, 1)
end
if (mem.static.Read(102) == 0) then
mem.inter.WriteBit(1, 2, 0)
else
mem.inter.WriteBit(1, 2, 1)
end
… и т.д. для первых 25 байтов данных активного рецепта (байт 26 содержит значение массы для первого байта с вылетом, 27-й для 2-го, и т.д., поэтому проверять все 50 байтов нету смысла).
Таким образом, при построении характеристики видны только значащие цифры.

В зависимости от комбинации сигналов на входах I01..I03 возможно отображение всплывающих экранов состояния крана.

На данный момент тестовый вариант системы смонтирован на башенном кране и проходит обкатку. Уже есть несколько мыслей по добавлению функционала, которые будут реализованы с ближашем будущем.
Автор: Дмитрий