Счётчики и таймеры написанные для программ ПЛК должны быть проверены на корректность, в том числе на обработку обратных отсчётов и значений меньше нуля.  Технически таймеры и счетчики могут быть настроены на любое значение. Следовательно, допустимый диапазон для установки таймера или счетчика должен быть ограничен для удовлетворения эксплуатационным требованиям.  Если удаленные средства, такие как HMI, записывают значения в таймер или счетчик, то:  нельзя позволять HMI напрямую писать в таймер или счетчик, а только после прохождения проверки нужно проверить предустановки и значения тайм-аута в ПЛК Проверка уставок для таймеров и счетчиков легко выполняется непосредственно в ПЛК, поскольку ПЛК “знает” состояние процесса и контекста. Он может проверять, “что” и “когда” он получает. Во время запуска ПЛК -- таймерам и счетчикам обычно задаются определённые уставки.   Если есть таймер, который запускает сигнал тревоги через 1.3 секунды, но этот таймер злонамеренно настроен на 5 минут, то сигнал тревоги может не сработать.   Если есть счетчик, который заставляет процесс останавливаться, когда он достигает 10 000, но он установлен на 11 000 во время запуска, то процесс может не остановиться.  Если ввод/вывод, таймеры или предустановки записываются непосредственно и не проверяются (уровень проверки ПЛК игнорируется), то HMI (или другие сетевые устройства) получает необоснованный уровень доверия.  ПЛК может контролировать, когда оператор случайно устанавливает неверные значения таймера или счетчика. Документирование и автоматическая проверка допустимых диапазонов для таймеров и счетчиков может помочь при обновлении логики.  Убедитесь, что парные сигналы не задаются одинаково. Оповещайте оператора, если состояние входов/выходов физически невозможно или недопустимо. Подумайте, как сделать парные сигналы независимыми или добавьте таймеры для переключений, которые могут нанести повреждения. Парные входы или выходы – это сигналы, которые физически не могут включаться одновременно; они исключают друг друга. Несмотря на то, что парные сигналы не могут включаться одновременно, если не произойдет сбоя или злонамеренной активности – программисты ПЛК часто не предотвращают этой возможности.  Валидацию проще всего выполнить непосредственно в ПЛК, потому что он знает о состоянии процесса и контексте. Парные сигналы легче распознать и отследить, если они имеют последовательные адреса (например, вход 1 и вход 2).  Другой сценарий, при котором парные входы или выходы могут вызвать проблемы – это когда они не задаются одновременно, а быстро переключаются таким образом, что может привести к повреждению исполнительных механизмов.  Примеры парных сигналов:  ПУСК и СТОП  Независимый пуск и стоп: настройте пуск и стоп как дискретные выходы вместо того, чтобы иметь один выход, который можно включать / выключать. По своей конструкции это не допускает одновременных срабатываний. Для злоумышленника гораздо сложнее быстро включать/выключать, если нужно установить два разных выхода. Таймер для перезапуска: также рассмотрите возможность добавления таймера для перезапуска после подачи сигнала об остановке, чтобы избежать быстрого переключения сигналов пуск и стоп. ВПЕРЁД и НАЗАД ОТКРЫТЬ и ЗАКРЫТЬ Примеры переключения парных сигналов, которые могут быть опасными:  Если ПЛК принимает дискретный вход, это дает злоумышленнику простой вариант нанести физический ущерб исполнительным элементам. Быстрое переключение выходов может вызвать реальный ущерб. Проведённый Национальной лабораторией Айдахо Aurora Generator Test в 2007 году продемонстрировал, что переключение выходов вне синхронизации приводит к повреждению автоматического выключателя.  Если программы ПЛК не учитывают вариант, когда оба парных входных сигнала будут поданы одновременно, то это хороший вариант для атаки.  Одновременное включение парных входных сигналов является предупреждением о том, что произошла ошибка в работе, ошибка программы или что-то вредоносное. Это позволяет избежать сценария атаки, при котором приводы могут быть повреждены.  Парные входные сигналы могут указывать на неисправность датчика, неправильное подключение или механическую проблему, например, заедание переключателя.  Быстрое переключение пуск и стоп может произойти по ошибке, поэтому это также предотвращает случайные повреждения.  Многие устройства для предотвращения несчастных случаев имеют специальные входы - интерлоки. В основном это сухие контакты или дискретные входы (5, 12 или 24 В), которые необходимо замкнуть или подать напряжение для разрешения работы устройства. Если интерлок зависит от датчика (температуры, давления, закрытия двери) и стоит обычное условие больше-меньше порога, то при колибании значений около порога "дребезг" интерлока может повредить устройства быстрыми переключениями. Рекомендую использовать небольшую задержку(500 мс) между включением-выключением интерлоков и других управляющих сигналов. Приглашаю всех в telegram чат и telegram канал для специалистов в области промышленной автоматизации. Здесь можно напрямую задать очень узкоспециализированный вопрос и даже получить ответ. Жду ваше мнение и опыт относительно данного пункта в комментариях. Всего будет 20 пунктов из "Top 20 Secure PLC Coding Practices", надеюсь на каждый получить как можно больше комментариев, чтобы составить свой список рекомендаций по программированию для ПЛК. Безопасность ПЛК: 4,5) Используйте переменные-флаги, хеши и контрольные суммы для проверки целостности проекта Безопасность ПЛК: 8,9) Проверяйте входные переменные, следите за косвенными обращениями Software Developer