При разработке небольших скриптов, объемом в пару десятков строк широкие возможности отладки не требуются – можно обойтись выводом диагностических сообщений и значений в лог или на специальный выход скрипта. Однако если скрипт крупный, использует сложные функции (например перехват сообщений) или проблема в скрипте проявляется стохастически, то тогда отладка жизненно необходима.
Сам ФБ «Скрипт» не имеет каких-либо встроенных функций отладки, но существует достаточно простой способ использовать для отладки Visual Studio, со всеми ее необъятными функциями.
В качестве примера рассмотрим скрипт из статьи посвященной отслеживанию сообщений:
/blog/fb-skript-c-i-ego-ispolzovanie-v-masterscada-otslezhivanie-soobshcheni/
Откроем проект с данным скриптом и попробуем включить отладку скрипта. Для этого нужно сделать всего несколько шагов.
1. Запустить Visual Studio. Не создавая проект выбрать пункт меню Debug – Attach to Proccess.


4. Теперь нужно добавить в код нашего скрипта специальный метод:
System.Diagnostics.Debug.Assert(false);
Когда скрипт исполняет данную функцию, срабатывает исключение и код скрипта перехватывается Visual Studio, после чего можно начинать отладку.Как правило данный метод размещают в методе Start – исключение появится сразу при старте скады, после этого можно будет нажать продолжение исполнения, а уже затем добавлять точки останова и т.д.
Добавим данный метод в конце метода Start:
public override void Start() { var project = HostFB.TreeItemHlp.Project; //фильтр по определенным категориям foreach (var cat in project.SystemTreeRootItem.EventCategories.Values) { if (cat.Name=="Авария") { Category.Add((uint)cat.ID); //добавляем в список ID категории } } //подписка на изменение сообщений HostFB.TreeItemHlp.Project.AlarmManager.OnRecordsChangeEvent += AlarmManager_OnRecordsChangeEvent; //подписка на добавление сообщений HostFB.TreeItemHlp.Project.AlarmManager.OnRecordsAddEvent += AlarmManager_OnRecordsChangeEvent; System.Diagnostics.Debug.Assert(false); } |
5. Компилируем скрипт и запускаем MasterSCADA в режим отладки (кнопка Рука). Если запустить в режим исполнения, перехвата исключения не будет.
6. Появится окно ошибки. Нажимаем в нем Повтор.



Например, добавим в методе AlarmManager_OnRecordsChangeEvent точку останова.


Также можно увидеть состояние всех свойств.

Например сделаем, чтобы в коде
foreach (var NewEvent in events) { if (NewEvent.Source=="Отключение защиты") { //сообщение было квитировано if (NewEvent.AckTime!=null && (NewEvent.InactiveTime==null || NewEvent.InactiveTime<NewEvent.AckTime)) { Квитирование=true; } //сообщение стало активным if (NewEvent.ActiveTime!=null && NewEvent.InactiveTime==null && NewEvent.AckTime==null) //сообщение активно { Срабатывание=true; } } } |
Остановка происходила только тогда, когда категория NewEvent будет «Авария». Для этого у сообщения есть свойство AlarmCategory.Name. Добавим точку останова и вызовем у нее контекстное меню:


Теперь вызовем сообщение в скаде – произойдет остановка на указанной строчке.

Подробнее про различные способы работы с точками остановка можно прочитать на сайте Microsoft:
https://msdn.microsoft.com/ru-ru/library/5557y8b4.aspx
По окончании отладки можно закрыть Visual Studio или остановить отладку, а строчку
System.Diagnostics.Debug.Assert(false);
удалить или закомментировать.