С каждым ответом SCADAMaster у меня возникает всё больше вопросов, поэтому я создаю отдельную тему, в которой надеюсь докопаться до истины. На данный момент задача разобраться как внутри одного скрипта создавать объекты класса объявленного в другом скрипте или использовать методы другого скрипта. Как я уже говорил - я начинающий и в МастерСКАДА, и в C#, поэтому прошу отвечать последовательно и подробно, не пропуская мои вопросы.
В качестве примера мне был предложен следующий проект:
Скрипт вызова скрипта из другого скрипта.zip
Я правильно понимаю, что RT это RunTime, (скрипт, который должен выполняться в режиме исполнения)? С DT вообще неясно.
RT скрипты вроде работают, но DT - нет.
DT/Test
Код:
using System;
using MasterSCADA.Script.FB;
using MasterSCADA.Hlp;
using FB;
using System.Linq;
using MasterSCADALib;
using MasterSCADA.Common;
using System.Windows.Forms;
public partial class ФБ : ScriptBase
{
public override void DoAction()
{
MessageBox.Show("Метод выполнен");
}
}
DT/Проверка вызова скрипта
Код:
using System;
using MasterSCADA.Script.FB;
using MasterSCADA.Hlp;
using FB;
using System.Linq;
using MasterSCADALib;
using MasterSCADA.Common;
public partial class ФБ : ScriptBase
{
public override void DoAction()
{
var Скрипт = (ScriptFB)HostFB.TreeItemHlp.Project.Item("Объект.DT.Test").FBObject; //получаем ссылку на первый скрипт
using (dynamic obj = Скрипт.CompileAndGetScriptObject(true))
{
obj.DoAction();
}
}
}
Насколько я понимаю задумку - в первом скрипте в методе DoAction() мы вызываем метод MessageBox.Show(), который становится доступным после подключения using System.Windows.Forms;
Второй скрипт сначала получает ссылку на первый скрипт, потом должен обратиться к методу DoAction() первого скрипта. Синтаксис мне не понятен. Почему мы используем "using" в середине кода?
На строчке "using (dynamic obj = Скрипт.CompileAndGetScriptObject(true))" компиляция выдаёт ошибку:
Код:
DT.Проверка вызова скрипта" : (CS1061) 'MasterSCADA.Script.FB.ScriptFB' does not contain a definition for 'CompileAndGetScriptObject' and no extension method 'CompileAndGetScriptObject' accepting a first argument of type 'MasterSCADA.Script.FB.ScriptFB' could be found (are you missing a using directive or an assembly reference?)
RT/Скрипт
Код:
using System;
using MasterSCADA.Script.FB;
using MasterSCADA.Hlp;
using FB;
using FB.FBAttributes;
using System.Linq;
public partial class ФБ : ScriptBase
{
bool? M = false;
public override void Execute()
{
HostFB.TreeItemHlp.Project.ErrorTracer.ReportError ("Ваша строка");
if (Параметр1==true && M==false)
{
var Скрипт = (ScriptFB)HostFB.TreeItemHlp.Project.Item("Объект.RT.Test").FBObject; //получаем ссылку на первый скрипт
dynamic obj = Скрипт.ScriptObject;
obj.DoAction();
}
M = Параметр1;
}
}
RT/Test
Код:
using System;
using MasterSCADA.Script.FB;
using MasterSCADA.Hlp;
using FB;
using System.Linq;
using MasterSCADALib;
using MasterSCADA.Common;
public partial class ФБ : ScriptBase
{
public override void DoAction()
{
Параметр1="Метод выполнен";
}
}
Здесь по переднему фронту "Параметр1" скрипта "RT/Скрипт" происходит вызов метода DoAction() скрипта "RT/Test" и "Параметр1" скрипта "RT/Test" навсегда принимает значение "Метод выполнен".
bool? M = false; - гугл говорит, что "bool?" это тип, который может принимать значение NULL. Почему мы не используем тип "bool"?
Для обращения к скрипту мы используем иной синтаксис (dynamic obj = Скрипт.ScriptObject; ), не как в DT, хотелось бы увидеть пояснения по этому поводу.
Я вообще могу создавать классы вне библиотечных скриптов? Компилятор постоянно ругается. Если да, то в какой части скрипта происходит объявление пользовательских классов?
Что касается
Сообщение от
SCADAMaster
1. Напишите на в Visual Studio библиотеку с нужными вам классами, скомпилируйте, положите в папку скады, пропишите в скрипте на вкладке Настройки и обращайтесь к ней.
постараюсь проверить завтра, когда установлю Visual Studio. Но это не тот путь, которым я хотел бы идти.
Сообщение от
SCADAMaster
Зачем нужно назначать несколько библиотечных скриптов одному скрипту? Пропишите в библиотечном скрипте все нужные классы и работайте.
- чтобы не лепить все классы в одну кучу, а иерархически их разнести по объектам структуры самой МастерСкада.
Дополнительный вопрос был про отладку, на данный момент вижу три способа:
1) HostFB.TreeItemHlp.Project.ErrorTracer.ReportError ("Ваша строка");
Сообщения будут выводится в лог скады. Для открытия окна лога нажмите красную кнопку в правом нижнем углу скады.
Работает только в режиме исполнения, не работает в режиме отладки.
2) using System.Windows.Forms;
MessageBox.Show("Ваша строка");
Работает только в режиме исполнения, не работает в режиме отладки.
3)
Сообщение от
SCADAMaster
опять же постараюсь проверить завтра.
Я прекрасно понимаю, что никто мне ничем не обязан, поэтому заранее благодарю за любую помощь.