<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Владислав Иванов</title>
    <description>The latest articles on DEV Community by Владислав Иванов (@__8b2edba0).</description>
    <link>https://dev.to/__8b2edba0</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4077496%2F9ab08643-8c48-4b94-b986-012b081d9cd4.jpg</url>
      <title>DEV Community: Владислав Иванов</title>
      <link>https://dev.to/__8b2edba0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/__8b2edba0"/>
    <language>en</language>
    <item>
      <title>Контрольные суммы проектов в экосистеме Siemens Step7 Classic</title>
      <dc:creator>Владислав Иванов</dc:creator>
      <pubDate>Fri, 14 Aug 2026 10:13:00 +0000</pubDate>
      <link>https://dev.to/__8b2edba0/kontrolnyie-summy-proiektov-v-ekosistiemie-siemens-step7-classic-3oie</link>
      <guid>https://dev.to/__8b2edba0/kontrolnyie-summy-proiektov-v-ekosistiemie-siemens-step7-classic-3oie</guid>
      <description>&lt;p&gt;&lt;strong&gt;Автор: Владислав Иванов, инженер АСУ ТП компании UDV Group&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;С 1 октября 2025 года Siemens официально перевёл SIMATIC S7-300 и ET 200M в стадию Product Phase-Out: новых заказов не принимают, более 260 модулей доступны только как запчасти, поддержка постепенно сворачивается. S7-400 идёт тем же путём с горизонтом до 2030 года. Для российских предприятий картина ещё жёстче: вендор ушёл с рынка в 2022-м, официальных обновлений и патчей нет уже несколько лет, а парк S7-300/400 продолжает управлять энергоблоками, насосными, химией и металлургией. В этой ситуации у главного инженера и службы ИБ остаётся один вопрос: программа, которая сейчас реально работает на контроллере, соответствует утверждённой версии проекта? И как это доказать без вендорской поддержки? Ответ на уровне первичного контроля лежит в четырёх байтах.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Что показывает checksum&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;В S7-300/400 контроллер хранит два коротких значения: контрольную сумму аппаратной конфигурации (System Data) и контрольную сумму пользовательской программы (User Program). По четыре байта каждая, например A4 00 25 10 и A0 37 E0 41. Увидеть их можно через Simatic Manager: правой кнопкой на папке Blocks, Object Properties, вкладка Checksums. Открывается и для проекта на инженерной станции, и для проекта, снятого с контроллера. Практическая ценность простая: суммы совпадают, значит программа в ПЛК соответствует утверждённой версии. Суммы разошлись, это повод разобраться, что и когда изменилось. Это самый лёгкий индикатор целостности, который можно снять с работающего контроллера. Не требует остановки процесса, не грузит канал, снимается по расписанию. Для парка S7-300/400 без вендорской поддержки это часто единственный доступный сенсор изменений на уровне самого ПЛК.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Сначала предупреждение&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Прежде чем строить на checksum систему мониторинга целостности, нужно понимать, к чему он чувствителен, а к чему слеп. Если этого не сделать, получится один из двух плохих сценариев. Первый: постоянные ложные тревоги, из-за которых операторы и инженеры перестанут реагировать вообще. Второй: тишина в консоли мониторинга при реальных изменениях, которые checksum просто не увидит.&lt;/p&gt;

&lt;p&gt;Ниже три поведенческие особенности, о которые чаще всего спотыкаются на практике.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Особенность 1. Изменение значений в реальном времени контрольную сумму не трогает&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Если инженер зайдёт в контроллер онлайн и через таблицу PLC, Monitor/Modify Variables изменит текущее значение переменной в блоке данных (например, запишет новое значение в DB127.DBW0), контрольная сумма ПЛК останется прежней. Правка данных в рабочей памяти на checksum не отражается. Это осмысленное поведение. Значения переменных в DB - это текущие показания процесса: уровень в резервуаре, температура, положение задвижки, уставка регулятора. Они меняются десятки раз в секунду просто потому, что процесс работает. Если бы checksum реагировал на каждое такое изменение, он бы менялся непрерывно и терял смысл как индикатор целостности. Поэтому он чувствителен к самой программе и конфигурации, а не к результатам их работы.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Практический вывод:&lt;/strong&gt; checksum не покажет, что оператор изменил уставку прямо на ПЛК. Это ограничение, а не баг. Его нужно закрывать отдельно: журналами системы диспетчеризации, регламентом изменений уставок, разграничением прав.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Особенность 2. Правка Actual Value в проекте на инженерной станции меняет сумму&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Обратная сторона той же логики. Если открыть тот же блок данных в проекте на инженерной станции (режим Data View) и изменить поле Actual Value той же переменной, а затем сохранить блок, контрольная сумма User Program поменяется. Причина: в исходнике блока Actual Value хранится наравне с Initial Value и является частью описания блока, а не текущего состояния. С точки зрения среды разработки это изменение проекта.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Практический вывод:&lt;/strong&gt; если инженер поправил что-то в проекте на своём ПК, а на ПЛК ничего не заливал, суммы разойдутся. Это не инцидент, но это разбег между эталоном и контроллером, который нужно фиксировать в журнале работ, иначе система мониторинга поднимет ложную тревогу.&lt;/p&gt;

&lt;p&gt;Особенность 3. Upload одного блока и Upload всей станции ведут себя по-разному&lt;/p&gt;

&lt;p&gt;Здесь нужно различать два похожих на первый взгляд действия.&lt;/p&gt;

&lt;p&gt;Upload to PG для конкретного блока (правой кнопкой на блоке, PLC, Upload to PG) - это выгрузка одного DB. При таком поблочном Upload среда Step7 заставляет ПЛК собрать блок «на лету», внедрив в его структуру текущие значения из рабочей памяти. Результат: в проекте на инженерной станции поле Actual Value обновляется, значит и контрольная сумма User Program у проекта меняется. В самом ПЛК сумма при этом остаётся прежней, потому что Upload читает данные из контроллера, но ничего не пишет обратно в его память.&lt;/p&gt;

&lt;p&gt;Upload Station to PG (выгрузка всей станции целиком) работает иначе. При полной выгрузке актуальные значения из рабочей памяти в проект не переносятся. Среда считывает блоки из загрузочной памяти ПЛК, и выгруженные DB получают старые Initial-значения вместо живых значений из рабочей памяти. Контрольная сумма проекта после такой операции не меняется.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Практический вывод: *&lt;/em&gt;одинаковое по смыслу действие «синхронизировать проект с контроллером» может как изменить checksum на инженерной станции, так и оставить его прежним. Для системы мониторинга это значит, что событие «инженер снял бэкап» должно фиксироваться регламентом отдельно, а не выводиться из показаний checksum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Почему checksum ведёт себя именно так&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Вся эта механика объясняется устройством памяти S7-300/400. В контроллере есть три различных области хранения программы.&lt;/p&gt;

&lt;p&gt;Загрузочная память (Load memory). Сюда попадает вся программа при Download из Simatic Manager: блоки OB, FB, FC, DB целиком, с комментариями, символикой и полными Initial Value. Физически это либо встроенная память CPU, либо съёмная карта MMC. Загрузочная память энергонезависима, программа не пропадает при отключении питания.&lt;/p&gt;

&lt;p&gt;Рабочая память (Work memory). Это RAM, из которой CPU исполняет программу в цикле. Сюда копируется только то, что нужно для выполнения: без комментариев и символьных имён, но с актуальными значениями переменных. Здесь живут те правки, которые делает Monitor/Modify Variables.&lt;/p&gt;

&lt;p&gt;Проект на инженерной станции. Отдельная третья сущность. Синхронизируется с загрузочной памятью ПЛК через Download и Upload, но напрямую с рабочей памятью не связана.&lt;/p&gt;

&lt;p&gt;Checksum считается только по одному из трёх слоёв: по загрузочной памяти. Отсюда вся логика поведения, которую разобрали выше.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Отдельный риск: Download блока данных может обнулить актуальные уставки&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Из той же трёхслойной архитектуры вытекает нюанс, о который на практике спотыкались многие инженеры-наладчики. И это уже не тонкость поведения checksum, а сценарий с прямыми последствиями для производства.&lt;/p&gt;

&lt;p&gt;Когда инженер выполняет Download блока данных из проекта в ПЛК (например, чтобы залить исправленную логику или новую версию DB), в рабочую память вместе с блоком записываются и значения переменных. Особенность S7-300/400: офлайн-блок DB хранит собственное поле Actual Value, и именно оно, а не Initial Value, попадает в ПЛК как новое рабочее значение. По сути, проект на инженерной станции хранит замороженный снимок Actual Value с момента последней синхронизации или с момента создания блока. Если с тех пор процесс эксплуатировался, а оператор менял уставки прямо на ПЛК, эти изменения в проекте никак не отражаются.&lt;/p&gt;

&lt;p&gt;Если такой устаревший проект заливается обратно в контроллер, актуальные уставки регулятора, заданные за месяцы или годы эксплуатации, безвозвратно затираются замороженными значениями из проекта.&lt;/p&gt;

&lt;p&gt;На практике безобидная операция «перезалить один блок, чтобы поправить логику» способна одномоментно сбросить уставки температуры, давления, скорости, положения задвижек и других технологических параметров к значениям многолетней давности. Для непрерывного производства это может обернуться скачком технологических параметров и аварийной остановкой по срабатыванию защит, повреждением оборудования из-за резкого изменения режима, прямым ущербом, если процесс критичен к плавности переходов (энергетика, химия, металлургия).&lt;/p&gt;

&lt;p&gt;С точки зрения информационной безопасности это полноценный вектор атаки: заливка «правильно выглядящего» блока с подменёнными Actual Value позволяет незаметно вывести процесс из штатного режима, вообще не трогая логику программы. Для внешнего аудита checksum User Program такого блока будет выглядеть просто как результат легитимного Download.&lt;/p&gt;

&lt;p&gt;Причина в самой механике загрузки. Блок данных в S7-300/400 не редактируется дельтой (по принципу «поменялось только это поле, остальное не трогаем»). При загрузке блок целиком перезаписывается заново, как единый объект. У CPU нет встроенного механизма построчной сверки, и компилятор Step7 формирует блок так, как он описан в исходнике проекта. Значение из поля Actual Value офлайн-блока записывается в работающий ПЛК как новое рабочее значение, полностью заменяя то, что было в рабочей памяти.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Практическая рекомендация:&lt;/strong&gt; перед любым Download блока данных на действующий ПЛК критично убеждаться, что проект на инженерной станции синхронизирован с актуальными уставками (например, через предварительный Upload актуального состояния). Полагаться на «старую» версию в репозитории или на диске одного инженера, значит планово идти к инциденту.&lt;/p&gt;

&lt;p&gt;Отдельно стоит упомянуть, что в более новых S7-1200 и S7-1500 (TIA Portal) поле Actual Value в офлайн-блоке данных убрали. Проект хранит только Initial Value, а фактические рабочие значения живут исключительно в памяти ПЛК. Это архитектурное решение снимает описанный класс рисков. Проблема остаётся именно на парке S7-300/400, который вероятно на многих российских предприятиях ещё долго будет частью действующей инфраструктуры. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Как снимать checksum по сети&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Для системы непрерывного мониторинга ручной способ через Simatic Manager не подойдет. И заходить в инженерное ПО каждый раз не требуется: ПЛК отдаёт контрольные суммы прямо по протоколу S7COMM в ответ на запрос [CPU functions], Read SZL с ID=0x0132, Index=0x0004. Нужные значения лежат в полях ken_ver1_hw / ken_ver2_hw (аппаратная часть) и ken_ver1_awp / ken_ver2_awp (пользовательская программа).&lt;/p&gt;

&lt;p&gt;Автоматизация через python-snap7 сводится к трём шагам. Установить соединение с ПЛК командой client.connect(ip, rack, slot). Выполнить client.read_szl(306, 4) - это тот же запрос SZL ID=0x132 (306 в десятичном виде), Index=4. Распарсить полученные байты по смещениям с 16 по 23, где лежат пары байт контрольных сумм.&lt;/p&gt;

&lt;p&gt;Такой подход позволяет снимать checksum по расписанию с любого числа контроллеров в сети и сравнивать с эталонными значениями. По сути, получается лёгкий сенсор целостности логики ПЛК без нагрузки на канал и без остановки процесса. Для парка S7-300/400 без вендорской поддержки это, вероятно, единственный доступный способ автоматизировать хотя бы первичный контроль изменений.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Итого: с чего начать на своём парке&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Прежде чем ставить мониторинг контрольных сумм на боевой парк, стоит пройти четыре шага.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Инвентаризация. Зафиксировать, какие S7-300 и S7-400 работают на объекте, какие версии CPU и прошивки, где хранятся эталонные проекты, кто из инженеров имеет доступ к загрузке.&lt;/li&gt;
&lt;li&gt;Синхронизация эталонов. Перед первой фиксацией эталонных значений убедиться, что проекты в репозитории соответствуют реальному состоянию контроллеров. Это отдельная и часто недооценённая работа: во многих организациях эталонный проект последний раз обновлялся в момент ввода в эксплуатацию.&lt;/li&gt;
&lt;li&gt;Фиксация эталонных оценок. Снять и задокументировать контрольное количество системных данных и пользовательской программы для каждого контроллера. Хранить не в файле на диске одного инженера, а в системе с контролируемым доступом.&lt;/li&gt;
&lt;li&gt;Регламент состояния. Прописать, что делать при рассчете суммы. Какие изменения проекта являются законными и как они зафиксированы заранее. Кто расследует несанкционированное прохождение. В каком порядке проводится проверка и восстановление.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Вместо вывода&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Контрольная сумма в S7-300/400 не заменяет полноценную систему контроля целостности, но даёт то, чего в российской промышленности сейчас часто не хватает: доказуемый первичный ответ на вопрос «программа в контроллере та же, что была принята в эксплуатацию, или нет». Без вендора, без дорогого инструментария, по обычному сетевому запросу.&lt;/p&gt;

&lt;p&gt;У главного инженера и руководителя службы ИБ вопрос обычно шире. Какая программа реально работает в контроллере прямо сейчас? Известно ли, где хранятся эталонные проекты и совпадают ли они с ПЛК? Есть ли регламент, согласно которому фиксируется каждое легитимное изменение логики? Кто расследует расхождение контрольной суммы и в какой срок? Что произойдёт, если инженер зальёт устаревший проект на работающий контроллер и обнулит уставки?&lt;/p&gt;

&lt;p&gt;Если на эти вопросы точных ответов нет, снимать контрольную сумму бесполезно: индикатор без регламента реагирования, это просто число на экране. Если есть, четыре байта становятся первой линией контроля логики контроллера, работающего без поддержки вендора. Для парка S7-300/400 в российской критической инфраструктуре - это рабочий сценарий, а не теория.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>cybersecurity</category>
      <category>security</category>
    </item>
  </channel>
</rss>
