Не знаю, возможно, я открыл Америку и изобрел велосипед, но хочу поделиться методами отладки скриптов, чтобы другие начинающие меньше топтались на граблях.
Надо создать
глобальный модуль и в нем определить процедуру вывода отладочной информации
procedure Dbg(S : string);
begin
if DEBUG_OFF then exit;
// тут в зависимости от намерений либо создать сообщение функцией AddMessageToGroup с передачей строки S (хороший вариант),
// либо вывести строку в файл (приемлемый вариант),
// либо передать строку в отдельное текстовое поле (плоховатый вариант)
end;
Первый вариант требует уже подключенной базы данных, зато имеет большой плюс: сообщения видны на любой странице SCADA, могут сопровождаться звуком и выделяться цветом.
Второй вариант требует большего количества телодвижений: открыть файл, спозиционироваться в конец файла, дописать строку, закрыть файл, желательно контролировать ошибки ввода-вывода. Отладочный вывод полностью невидимый, т.е. посмотреть отладочный вывод можно только постфактум, да и чтобы посмотреть требуются телодвижения... Зато такой вывод можно не отключать и в переданной заказчику системе, чтобы время от времени отслеживать возможные ошибки.
Третий вариант плох тем, что текстовое поле может быть только одно на весь проект, и, соответственно, только на одной странице видимо.
Конечно, можно еще и сразу в базу писать сообщения, но это вообще неудобный вариант, имхо.
DEBUG_OFF - это так же глобальная константа типа boolean, установив которую в true можно выключить отладочный вывод.
В скриптах по мере надобности используется процедура Dbg, в результате мы всегда контролируем то, как скрипт выполняется.
Например, функции поиска объектов и переменных могут возвращать NIL, если не нашли ничего. И в скрипте мы всегда должны проверить, найден ли объект или нет. При этом, если объект не найден, попытка доступа к нему просто прерывает исполнение скрипта без видимых последствий, и узнать об этом можно только посмотрев логи на сервере, что довольно неудобно.
Я для всех функций, которые ищут объекты, создал в глобальном модуле функции-обертки такого типа
function GetVar(Nm : string) : TM_Variable;
// поиск переменной по имени
begin
Result := GetVariableByName(Nm);
if Result = NIL then Dbg('Переменная "'+Nm+'" не найдена');
end;
Теперь я могу не проверять в своих скриптах результат поиска, т.к. если я ошибся в имени переменной, я увижу сообщение сразу (у меня вариант с базой, т.е. пользуюсь сообщениями SCADA). Аналогично для поиска объектов, в т.ч. в шаблонах и окнах.
Надеюсь, это кому-нибудь пригодится...