Детектор рачьего свиста
Работаю программистом по автоматизации производства. Есть большой проект, который уже несколько лет хорошо и стабильно работает, но в него регулярно нужно вносить небольшие изменения в связи с модернизацией оборудования. И был в свое время у меня помошник, в образовании которого есть ряд существенных пробелов.
Итак, одно из таких изменений было внесено и шел процесс финального тестирования на экспериментальном стенде - все отлично, все работает и радует глаз. И тут понадобилось мне отлучиться. Прихожу - оборудование стоит, никаких аварийных сообщений нет. Ненормально и совершенно непригодно для реальной эксплуатации. Пробую еще несколько раз: оборудование останавливается в произвольные моменты времени без всяких на то причин! А надо сказать, что проект сделан в среде UltraLogik, у которой с возможностями отладки большие проблемы. Поэтому самый верный способ поиска ошибок - это медленное и вдумчивое курение исходников. И вот при очередной итерации этого увлекательного процесса я обнаруживаю следующую процедуру, написанную моим горе-помошником.
procedure FBD_BLOCK(var Input : integer;
var FromValue : integer;
var ToValue : integer;
var Output : boolean);
var
prev_value : integer;
begin
Output:=false;
if (Input=ToValue) and (prev_value=FromValue) then Output:=true;
prev_value:=Input;
end;
Фанфары, мат и желание дать в репу! У него оборудование выключается, когда на систему снизойдёт вселенская благодать и случайное значение неинициализированной переменной совпадёт с нужным!
Хорошо, что это был первый раз, когда эта процедура реально использовалась.