Звонок раздался во вторник, в 11:43. Запомнил, потому что как раз допивал кофе.
— Ребята, выручайте. Станок встал. Контроллер Modicon M340 виден, но проект не открывается. Unity Pro пишет какую-то ошибку памяти. Наверное, софт слетел. Может, приедете переустановите?
Голос главного инженера звучал устало. Понятно: производство стоит, начальство давит, а тут еще и программисты разводят руками.
— Привозите контроллер, — сказал я. — Только сразу предупрежу: скорее всего, дело не в Unity.
Он не поверил. Привез.
Глава 1: Что нам рассказал контроллер
Модуль — Schneider Modicon M340 с процессором BMX P34 2030. Внешне идеальный: царапин нет, клеммы не обожжены, индикаторы молчат.
Подключаемся через USB. Unity Pro действительно видит контроллер. Пытаемся прочитать программу — ошибка: "Inconsistent application checksum".
Клиент стоял рядом и смотрел через плечо:
— Ну вот, я же говорил — софт глючит. Переустановите Unity, и все заработает.
— Подождите, — сказал я. — Unity здесь ни при чем. Это контроллер говорит, что программа внутри него повреждена. Он не отдает нам проект, потому что контрольная сумма не сходится.
— А что, так бывает?
— Бывает. Особенно после скачков питания в момент записи проекта или просто со временем, когда флэш-память начинает "сыпаться".
Он посмотрел на контроллер с подозрением. Контроллер молчал, но явно что-то скрывал.
Глава 2: Вскрытие и первые улики
Разбираем процессор. Снимаем верхнюю крышку, плата под микроскопом.
Первая улика: чип флэш-памяти (Spansion S29GL128P) стоит ровно, пайка чистая, но вокруг него — микроскопические следы перегрева. Не копоть, нет. Просто цвет маски чуть темнее, чем у соседних элементов. Тепловизор бы это не взял — слишком слабый нагрев. Но под увеличением видно.
Вторая улика: кварцевый резонатор на 25 МГц (рядом с Ethernet-физикой) имеет микротрещину в корпусе. Совсем крошечную, волосяную. Трясли, видимо, контроллер при монтаже.
Третья улика (и главная): напряжение на шине 3.3V — 3.1V. Вроде немного, но для цифры это катастрофа. Флэш-память при таком питании начинает читать ячейки с ошибками.
— Так, — сказал я клиенту. — У нас три проблемы: память, которая грелась, резонатор, который треснул, и питание, которое просело. Будем искать, кто из них главный виновник.
— А может, просто перезагрузить? — спросил он с надеждой.
— Может. Но не поможет.
Глава 3: Расследование продолжается
Включаем лабораторный блок питания. Подаем 24V на вход контроллера (через его родной блок питания, чтобы не искажать картину).
Смотрим осциллографом на шину 3.3V.
То, что мы увидели, объяснило всё: пульсации 200 мВ при норме не более 50. Питание "грязное", как вода после стирки.
Лезем в цепь стабилизатора 3.3V. На плате стоит DC/DC-преобразователь (на базе LM2676) и пара электролитических конденсаторов на выходе.
Выпаиваем конденсаторы. Меряем ESR.
Первый: ESR = 12 Ом (должен быть < 0.5 Ом).
Второй: ESR = 8 Ом.
Оба конденсатора — трупы. Внешне — идеальные, не вздутые, с четкой маркировкой. Но внутри — пустыня.
— Вот она, причина номер один, — показал я клиенту. — Конденсаторы высохли. Они не фильтруют питание. Процессор получает "грязное" напряжение, флэш-память читается с ошибками, контрольная сумма не сходится, проект не открывается.
— А резонатор? — спросил он.
— А резонатор — это вторая проблема. Но, возможно, он просто треснул от вибрации или перепада температур. Ethernet при таком резонаторе работать не будет, но проект бы читался. Так что главный убийца — конденсаторы.
Глава 4: Операция и пересадка органов
Меняем конденсаторы на новые, низкоимпедансные, с запасом по температуре (105°C вместо стандартных 85°C). Это наша стандартная практика — ставим лучше, чем было.
Заодно меняем резонатор. Мелочь, а приятно.
Подаем питание. Осциллограф показывает чистые 3.3V, пульсации 30 мВ — идеально.
Подключаемся через Unity Pro. Контроллер виден. Пытаемся читать проект — и тут...
Ошибка. Другая: "Application corrupted, please clear memory".
— Неужели память умерла? — клиент побледнел.
— Нет, — сказал я. — Это просто защита. Контроллер помнит, что в памяти была ошибка, и блокирует чтение. Нужно сделать полный сброс.
Делаем сброс через меню Unity. Контроллер перезагружается. Пытаемся заново считать проект.
И — о чудо! Проект открылся. Все блоки на месте, все переменные, все настройки.
Клиент выдохнул. Я выдохнул. Контроллер, кажется, тоже.
Глава 5: Что мы узнали из дампа (и чего не узнает клиент)
Пока клиент пил чай и успокаивал нервы, я успел сделать дамп памяти на всякий случай.
Интересная деталь: в журнале ошибок контроллера было 47 записей о сбоях чтения флэш-памяти за последние полгода. Первая появилась 8 месяцев назад. Клиент их не видел — они не выводились на пульт, просто писались в системный лог.
То есть контроллер умирал медленно, по миллиметру, а никто не замечал. Пока однажды не встал намертво.
— Вы бы прислали его полгода назад, — сказал я клиенту, — мы бы поменяли конденсаторы за 25 000, и вы бы не потеряли ни дня простоя. А сейчас вы потеряли три дня и чуть не купили новый контроллер за 85 000.
— Теперь буду знать, — сказал он. — А что, так можно было?
— Можно. Просто мало кто знает, что контроллеры умеют сигналить о проблемах заранее. Надо только уметь читать их сигналы.
Глава 6: Чек-лист для тех, кто не хочет терять проект
Если ваш Modicon M340 или M580 вдруг перестал открывать проект:
Шаг 1. Не вините Unity.
Софт тут ни при чем. В 95% случаев проблема в железе.
Шаг 2. Посмотрите на питание.
Измерьте напряжение 3.3V на процессоре. Если пульсации больше 50 мВ — ищите конденсаторы.
Шаг 3. Проверьте температуру.
Потрогайте корпус контроллера (осторожно, если он работал). Горячий? Возможно, перегрузка или проблемы с охлаждением.
Шаг 4. Не пытайтесь перепрошить самостоятельно.
Если память действительно "сыплется", неудачная перепрошивка может убить загрузчик. Тогда контроллер превратится в кирпич.
Шаг 5. Сделайте бэкап сейчас.
Если контроллер еще работает, но вы подозреваете неладное — сохраните проект на компьютер. Серьезно. Прямо сейчас.
Глава 7: Другие истории из нашей практики
История 1. Контроллер зависал раз в сутки. Клиент грешил на программистов. Мы повесили осциллограф на питание на сутки. В 3:15 ночи (когда включался ночной тариф на электроэнергию и проседало напряжение в сети) увидели просадку 24V до 18V. Контроллер уходил в сброс. Поставили стабилизатор — проблема ушла.
История 2. Modicon M580 не видел удаленную стойку. Перепробовали все настройки связи. Оказалось — сгорела оптопара в интерфейсном модуле. Замена за 350 рублей решила проблему за 45 000 рублей.
История 3. Контроллер работал, но "забывал" время. Меняли батарейку — не помогало. Оказалось, умер чип часов реального времени (RTC) внутри процессора. Пришлось менять процессор. Но мы хотя бы смогли объяснить клиенту, почему так вышло, и спасти его программу.
Эпилог
Через неделю клиент позвонил снова.
— Слушай, а вы можете приехать и посмотреть еще три контроллера? Профилактически? Я теперь после вашей истории на все свои M340 смотрю с подозрением.
— Можем, — сказал я. — Но сначала пришлите нам их логи. Посмотрим, кто из них уже пишет жалобы в системный журнал.
Он прислал. У одного из трех нашли те же ошибки чтения памяти. Привезли его к нам, поменяли конденсаторы профилактически. До простоя дело не дошло.
Экономия для клиента: один новый контроллер (85 000 руб.) + три дня простоя (около 200 000 руб.) = 285 000 руб.
Стоимость профилактики: 25 000 руб.
Клиент остался доволен. А мы — еще одной историей.
P.S. Для тех, кто дочитал до конца
Контроллеры Schneider Modicon M340 и M580 — отличные машины. Они умеют предупреждать о своих проблемах задолго до того, как встанут. Нужно только знать, куда смотреть.
Мы знаем. У нас есть осциллографы, тепловизоры и 5 лет опыта чтения сигналов, которые подает умирающее железо.
Если ваш Modicon ведет себя странно — не ждите, пока он встанет. Пришлите его нам на бесплатную диагностику. Мы либо скажем, что все в порядке, либо найдем проблему, пока она не убила ваш проект.
А если проект уже не открывается — не надо переустанавливать Unity. Просто привезите контроллер. Разберемся.