Обновить

Таймер на 5 минут вместо 10 секунд: как сверка с руководством по эксплуатации нашла отказавшую защиту в чужом коде

Уровень сложностиСредний
Время на прочтение19 мин
Охват и читатели10K
Всего голосов 5: ↑4 и ↓1+7
Комментарии12

Комментарии 12

Честно начал читать, но иишность текста просто не даёт продвинуться дальше нескольких абзацев.

Меня этот клод слог бесит. Чатгпт намного более человечно разговаривает, особенно после доп инструкций.

Понял, спасибо. Текст я правда писал с моделью и сказал об этом в первом абзаце — но это не отменяет того, что читается он как модель. Для меня это плохой результат: хотел рассказать про конкретный таймер, а получил претензию к слогу.

Пробежал текст, как АСУТПшник с 15 летним опытом могу сказать - Вы создали монстра который будет довольно сложно поддерживать если только не сами будете его фиксить... Cross reference утерян из за не прямой адресации, так же я бы рекомендовал вывести циклы индексации в отдельное прерывания исполняемое с постоянной цикличностью. Так же надеюсь в DB с поинтерами не используется temp переменные, они могут просачиваться между циклами.

Спасибо, это самый полезный комментарий за оба моих текста. Прошёлся по всем четырём пунктам, отвечаю по порядку.

Cross reference. Вы правы, и дыра тут не только в проекте, но и в самой статье: я показал выигрыш data-driven и не показал счёт. Индексы вычисляются в рантайме, разрешать среде нечего, и наладчик на объекте остаётся без основного инструмента поиска. Дописал в текст отдельный раздел «За что data-driven берёт плату» — раньше его не было.

Temp в блоках с индексным доступом. Прогнал все семь блоков файла статическим проходом: искал переменные VAR_TEMP, которые читаются раньше, чем в них что-то записали. Не нашёл ни одной, в этом файле temp чистые.

Но по следу вашего замечания вылезло другое. В fbCyclogram на ветке раннего выхода (cycleNo вне диапазона 1..12) сбрасывались solMask и finished, а выход stepIdx — нет. Он не мусорный, он хуже: сохраняет значение прошлого вызова, и верхний уровень видит залипший номер шага у неактивной циклограммы. Одна строка, поправил.

То есть само замечание не подтвердилось, а проверка по нему нашла ошибку. За это отдельное спасибо — я бы туда не полез.

Прерывания с постоянной цикличностью. Не сделано, всё в OB1. Замера худшего времени цикла у меня нет, ни разу не снимал. Записал в статью как дыру, а не как решённый вопрос. На другом стенде цикличность меня уже кусала: программный счётчик энкодера на 10 мс цикле терял импульсы, и лечилось это аппаратным счётчиком, а не аккуратным кодом.

Про монстра. Спорить не буду. Меньше кода и проще в поддержке — разные вещи, а я их в тексте склеил. У оригинала 95 блоков, там всё плохо, но всё на виду; у меня меньше строк, но сначала надо понять схему. Порог входа я поднял и написал об этом только сейчас, после вашего комментария.

Если найдёте время расписать про непрямую адресацию подробнее — прочитаю внимательно. 300-500 IO это ровно тот масштаб, где мои решения и должны начать ломаться.

Рад что пригодилось, анализ временем цикла встроен в TIA portal. Энкодеры должны исполняться с постоянным пребыванием и должны быть подключены на скоростные входы. Про Адресацию мне кажется и так все понятно - как по мне, массивы в PLC должны использоваться только для хранения данных, а каждое устройство (например кран или мотор) FB должен иметь свой DB и вызываться отдельно, так и cross-references будет цел. SCL только для манипуляции с данными... Все остальное Ladder или FBD. Короче - Я старовер - у меня такая религия...;)

Про анализ времени цикла в самой TIA — спасибо, это неприятно полезно. Три месяца работал в среде и не знал, что инструмент лежит внутри. Сниму, как доберусь до машины с лицензией.

Про архитектуру понял и записал. Экземплярный DB на устройство вместо массива — это ровно тот размен, который я не сделал: я получил правку логики в одном месте и потерял перекрёстные ссылки, вы предлагаете обратное. Спорить не буду, у вас пятнадцать лет сопровождения таких проектов, у меня три месяца.

Про энкодеры я знал, но узнал дорого: на другом стенде программный счётчик на 10 мс цикле терял импульсы, лечилось аппаратным счётчиком. Вы это назвали сразу, не наступая.

И честно предупреждаю: ваш разбор я процитировал в следующей статье, она вышла только что — https://habr.com/ru/articles/1077270/ Там отдельный раздел про то, что первое за 98 дней внешнее ревью моих архитектурных решений пришло из комментариев, а не изнутри. С ником и ссылкой на эту ветку. Если против — скажите, уберу.

Староверы в АСУТП — это, по-моему, не религия, а профессиональная деформация в хорошем смысле. Тут за красивое решение платит не автор, а наладчик через пять лет.

Имею дело сейчас с молодыми AI программистами - они очень весело и бодро пишут, но отладка превращается в бесконечность даже на средних системах в 300-500 IO.

Что такое 300-500 IO?

Inputs/Outputs

По отладке согласен, и цифра у меня похожая по ощущению.

Конкретный случай из этой же работы: один SCL-источник при импорте в TIA дал 37 ошибок компиляции, после моих правок стало 51. Все вокруг вызова инструкции Modbus-клиента: несоответствие типов, неизвестный формальный параметр, неверное число аргументов. Гипотеза сложилась мгновенно и выглядела убедительно — несовместимость версии инструкции. Полдня я сверял версии и пробовал варианты вызова.

Оказалось, в TIA импортировалась устаревшая копия файла. Я правил один файл, а компилировался другой. Все 51 ошибка были абсолютно корректными, просто относились к тексту, который я уже исправил.

Ассистент такое не ловит вообще. Он честно и правдоподобно объясняет каждую из 51 ошибки — а предпосылку «а тот ли файл вообще собирается» проверять некому, кроме вас. Проверяется за минуту: вставить заведомо ошибочную строку и посмотреть, сообщит ли о ней компилятор.

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

Спасибо, что написали на тридцатом часу. Идите спать, серьёзно, ответ подождал бы.

Про «где надо было думать самому — делегировали агенту» очень хочу подробностей, когда будут силы. Это ровно то, чего я по себе не вижу: я знаю, где я думал, и не знаю, где мне только казалось, что я думал. Со стороны это видно, изнутри нет.

Про «как из-под учебника» — назовите хотя бы одно конкретное место, где есть более простой общепринятый путь. Я пришёл в TIA из CODESYS и из Mitsubishi FX, и общепринятого в S7 мог просто не знать: у меня нет за спиной ни одного человека, который бы сказал «так не делают».

С монстром согласен и уже дописал это в статью. Меньше кода я посчитал за проще в поддержке, а это разные вещи. У оригинала 95 блоков, всё плохо, но всё на виду. У меня меньше строк, но сначала надо понять схему, а потом уже что-то менять. Плюс перекрёстные ссылки перестают работать из-за индексного доступа — на это указал другой комментатор, и он прав.

Про «дикий ужас и позорище» в оригинале я бы всё-таки смягчил. Судя по коду, его писали итерациями лет десять, разные люди, без ревью и без времени. Мне было легче: у меня был готовый эталон в виде РЭ и никакого срока сдачи над головой.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации