понедельник, 10 октября 2016 г.

ФБ "Скрипт C#" и его использование в MasterSCADA. Отладка скриптов

В данной статье мы рассмотрим такой важный элемент разработки скриптов как отладка.

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

2. В списке процессов находим MasterSCADA, в которой уже должен быть открыт наш проект. Жмем Attach.

3. Visual Studio переключиться в режим отладки.
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. Появится окно ошибки. Нажимаем в нем Повтор.

Перехват сработал – весь наш код теперь в Visual Studio.

Нажимаем Debug – Continue, для продолжения исполнения (SCADA сейчас находится в остановленном состоянии).

7. Теперь можно отлаживать скрипт.
Например, добавим в методе 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:
По окончании отладки можно закрыть Visual Studio или остановить отладку, а строчку
System.Diagnostics.Debug.Assert(false);  
удалить или закомментировать. 



Комментариев нет:

Отправить комментарий

Поделиться