Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 16

Тема: C# в МастерСКАДА

  1. #1

    По умолчанию C# в МастерСКАДА

    С каждым ответом 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 Посмотреть сообщение
    Но есть вариант лучше, посмотрите эту статью:
    http://blog.insat.ru/2016/10/script-csharp8.html
    опять же постараюсь проверить завтра.


    Я прекрасно понимаю, что никто мне ничем не обязан, поэтому заранее благодарю за любую помощь.
    Изображения Изображения

  2. #2

    По умолчанию

    Цитата Сообщение от Кулаков Андрей Посмотреть сообщение
    Почему мы используем "using" в середине кода?
    https://msdn.microsoft.com/ru-ru/library/yh598w02.aspx

    Цитата Сообщение от Кулаков Андрей Посмотреть сообщение
    На строчке "using (dynamic obj = Скрипт.CompileAndGetScriptObject(true))" компиляция выдаёт ошибку:
    Установите текущую версию 3.8. Код измените на:
    var Скрипт = (ScriptFB)HostFB.TreeItemHlp.Project.Item("Объект. DT.Test").FBObject; //получаем ссылку на первый скрипт
    System.Reflection.Assembly tt;
    using (dynamic obj = Скрипт.CompileAndGetScriptObject(out tt,true))
    {
    obj.DoAction();
    }

    Цитата Сообщение от Кулаков Андрей Посмотреть сообщение
    bool? M = false; - гугл говорит, что "bool?" это тип, который может принимать значение NULL. Почему мы не используем тип "bool"?
    Потому что входы могут иметь неопределенный тип - если значения на них нет.

    Цитата Сообщение от Кулаков Андрей Посмотреть сообщение
    1) HostFB.TreeItemHlp.Project.ErrorTracer.ReportError ("Ваша строка");
    Сообщения будут выводится в лог скады. Для открытия окна лога нажмите красную кнопку в правом нижнем углу скады.
    Работает только в режиме исполнения, не работает в режиме отладки.
    У нас все работает.

    Цитата Сообщение от Кулаков Андрей Посмотреть сообщение
    2) using System.Windows.Forms;
    MessageBox.Show("Ваша строка");
    Работает только в режиме исполнения, не работает в режиме отладки.
    Это вообще в режиме исполнения использовать нельзя. Только в режиме разработки.
    Спасибо.

  3. #3

    По умолчанию

    Цитата Сообщение от Кулаков Андрей Посмотреть сообщение
    прошу отвечать последовательно и подробно, не пропуская мои вопросы.

    Я вообще могу создавать классы вне библиотечных скриптов? Компилятор постоянно ругается. Если да, то в какой части скрипта происходит объявление пользовательских классов?

    Ваше сообщение слишком короткое.

  4. #4

    По умолчанию

    Цитата Сообщение от Кулаков Андрей Посмотреть сообщение
    Я вообще могу создавать классы вне библиотечных скриптов? Компилятор постоянно ругается. Если да, то в какой части скрипта происходит объявление пользовательских классов?
    Можете. Создавать нужно вне класса ФБ


    public class MyClass
    {
    bool k=false;
    MyClass()
    {
    k=true;
    }
    }

    public partial class ФБ : ScriptBase
    {
    public override void DoAction()
    {

    }
    }
    Спасибо.

  5. #5

    По умолчанию

    Остаётся открытым вопрос - можно ли определить класс в одном скрипте, а создавать и использовать объект этого класса в другом? Определить класс именно в скрипте, а не в библиотечном скрипте и не в подключаемой сборке. Если это принципиально возможно - хотелось бы увидеть пример. Спасибо.

  6. #6

    По умолчанию

    Нет, так сделать нельзя.
    Спасибо.

  7. #7

    По умолчанию

    Таки добрался до visual studio и пишу свою библиотеку. Сейчас такой вопрос - я не могу в ней использовать HostFB.TreeItemHlp.Project.ErrorTracer.ReportError ("Ваша строка"), компилятор ругается "Имя "HostFB" не существует в текущем контексте". Я добавил в ссылки (references) проекта те же библиотеки, что указаны в "настройки/ссылки на сборки" у скриптов в мастерскада, а так же добавил те же пространства имён
    Код:
    using MasterSCADA.Script.FB;
    using MasterSCADA.Hlp;
    using FB;
    using FB.FBAttributes;
    using MasterSCADALib;
    using MasterSCADA.Common;
    но это не дало результата. Я что-то делаю не так? Это вообще реализуемо? Или мне смотреть в сторону событий C#?

  8. #8

    По умолчанию

    Попробуйте this вместо HostFB
    Спасибо.

  9. #9

    По умолчанию

    Нет, все равно не видит.

  10. #10

    По умолчанию

    Должно работать. Вот пример кода:
    using System;
    using System.ComponentModel;
    using System.Runtime.InteropServices;
    using FB;
    using FB.VisualFB;
    using InSAT.Library.Interop;
    .......
    this.TreeItemHlp.Project.ErrorTracer.ReportError(" Пишу всякое и это ошибка по умолчанию");
    this.TreeItemHlp.Project.ErrorTracer.ReportError(" Пишу всякое и это ошибка",true);
    this.TreeItemHlp.Project.ErrorTracer.ReportError(" Пишу всякое Не ошибка", false);

    Вот видео работы:
    https://www.screencast.com/t/2MB4ze4dl6
    Спасибо.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Мастерскада 4Д
    от Dima1991 в разделе Master SCADA 3
    Ответов: 1
    Последнее сообщение: 17.10.2016, 17:05
  2. График в Мастерскада
    от Dimur в разделе Master SCADA 3
    Ответов: 5
    Последнее сообщение: 20.12.2012, 14:35
  3. скрипт для МастерСкада
    от yurgin_777 в разделе Помощь Разработчикам
    Ответов: 17
    Последнее сообщение: 06.12.2012, 19:41
  4. Отчет в Мастерскада
    от Tola в разделе Master SCADA 3
    Ответов: 3
    Последнее сообщение: 03.09.2012, 21:32
  5. МастерСкада и МДВВ
    от uagd в разделе Master SCADA 3
    Ответов: 18
    Последнее сообщение: 05.02.2009, 10:54

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •