
Когда речь заходит о C++, многие сразу представляют игровые движки или высоконагруженные торговые системы, но в промышленной автоматизации этот язык раскрывается с другой стороны. Мне не раз приходилось сталкиваться с ситуацией, когда выбор в пользу C++ обусловлен не столько производительностью, сколько необходимостью тонкой работы с оборудованием.
На одном из проектов для китайского производителя функциональных материалов - ООО Шаньдун Инжуй Новые Материалы, мы как раз использовали C++ для системы контроля качества. Особенность была в том, что нужно было обрабатывать данные с спектрометров в реальном времени, при этом обеспечивая совместимость с устаревшим ПО немецкого производства.
Интересно получилось с многопоточностью - пришлось отказаться от стандартных решений в пользу самописного пула потоков. Обнаружили, что при анализе данных о дисперсности пирогенного диоксида кремния стандартные mutex-ы давали просадку производительности на 15-20%. Пришлось переписывать на атомарных операциях, хотя изначально казалось, что это избыточно.
Кстати, на их сайте https://www.sdyingrui.ru упоминается контроль качества на всех этапах - вот как раз наш модуль и отвечал за автоматизацию этого процесса. Особенно сложно было с алгоритмами определения однородности смесей - здесь пригодились все возможности шаблонов C++ для работы с матрицами.
Работая над системой для контроля производства силановых связующих агентов, столкнулись с интересным нюансом. Оборудование использовало протокол Modbus TCP, но с нестандартными расширениями. Пришлось писать низкоуровневый драйвер на C++, поскольку готовые библиотеки не поддерживали эти особенности.
Запомнился случай с обработкой данных от датчиков температуры в реакторах. Использовали boost::asio для асинхронной работы с сокетами, но столкнулись с проблемой - при высокой нагрузке начинались потери пакетов. Оказалось, дело в настройках буферизации сокетов в ОС, а не в коде.
Еще один важный момент - работа с ПЛК Siemens. Через C++ пришлось реализовывать протокол S7, причем без использования сторонних библиотек из-за требований безопасности предприятия. Кстати, именно здесь особенно пригодилась RAII идиома - ресурсы освобождались корректно даже при обрывах связи.
При моделировании процессов синтеза альдегидных смол столкнулись с необходимостью оптимизации численных методов. Использовали SIMD инструкции через интринсики C++, что дало выигрыш в 3-4 раза по сравнению с обычной реализацией на STL.
Интересный момент обнаружили при работе с большими объемами данных о свойствах поликетоновых смол. Кэш-локальность оказалась критически важной - переписали структуры данных, разместив часто используемые поля ближе друг к другу, что сократило время обработки на 25%.
Особенно сложно было с алгоритмами прогнозирования характеристик хлорированного полипропилена. Применяли метапрограммирование на C++ для генерации специализированного кода под разные типы сырья. Кстати, это как раз соответствовало философии ООО Шаньдун Инжуй - поставка стабильной продукции через точный контроль параметров.
Для операторских станций писали на C++ модуль визуализации технологических процессов. Использовали Qt, но с собственными расширениями для отображения реальных данных с оборудования. Столкнулись с тем, что стандартные виджеты не подходили для специализированных графиков.
Пришлось реализовывать кастомные элементы для отображения динамики изменения параметров кремниевых материалов. Особенно сложно было с масштабированием - при переходе от секундных интервалов к часовым возникали артефакты отрисовки.
Интересно, что для международных клиентов компании, о которых говорится в описании Шаньдун Инжуй, пришлось делать поддержку Unicode в реальном времени. Обнаружили, что стандартные строки C++ работают медленнее специализированных решений при частом изменении языка интерфейса.
В системах управления производственными линиями исключения C++ используются особым образом. Пришлось разработать собственную систему обработки ошибок, поскольку стандартные механизмы не обеспечивали необходимой детализации для диагностики сбоев.
Запомнился инцидент с утечкой памяти в модуле расчета рецептур - обнаружили только через полгода эксплуатации. После этого ввели строгий регламент использования умных указателей, хотя изначально считали это избыточным для такого, казалось бы, простого модуля.
При интеграции с АСУ ТП верхнего уровня использовали механизмы сериализации Google Protobuf, но с модификациями для работы в реальном времени. Обнаружили, что при высокой нагрузке лучше показывают себя собственные решения на основе шаблонов C++.
За годы работы с системами для химического производства пришло понимание, что C++ нужно использовать выборочно. Не везде оправдана его сложность - иногда лучше взять более простые инструменты.
Сейчас, глядя на описание продукции Шаньдун Инжуй Новые Материалы, понимаю, что для многих задач их производства подошел бы и Python. Но для систем реального времени, где важны детерминированные временные характеристики, C++ остается безальтернативным вариантом.
Интересно наблюдать, как меняются требования к ПО - если раньше важна была чистая производительность, то теперь на первый план выходит надежность и предсказуемость поведения. И здесь C++ с его строгой типизацией и контролем ресурсов оказывается как нельзя кстати.