PDA

Просмотр полной версии : Создание ActiveX элементов для masterSCADA



denprox
02.11.2012, 11:57
Доброго времени суток. У меня такой вопрос, есть ли у кого ни будь документация по созданию и по следующему внедрению ActiveX в masterSCADA. Т.е. начиная с того, что рисуем модель и заканчивая тем что настраиваем ее уже в SCADA.

SCADAMaster
02.11.2012, 12:02
Документация с примерами по созданию AcitveX и ФБ приложена к MasterSCADA - в разделе "документация" - "Разработка драйверов и ФБ".

denprox
02.11.2012, 12:05
Спасибо. Еще такой вопрос (пока сильно сам не успел вникнуть), эти элементы только на C# можно писать или С++ тоже подойдет ?

SCADAMaster
02.11.2012, 12:11
Лучше на C#. В будущем ФБ на С++ поддерживаться не будут.

denprox
02.11.2012, 12:11
Спасибо. Учту :)

42ia
07.11.2012, 11:22
ActiveX под MasterSCADA писал. Все компоненты довел до конца.
В документации все путево описано, читайте.
Вопросов было много конечно. Можете их тут поискать (апрель-июнь 2012).
В конце концов появилась мысль, что кое что из того что я реализовал как ActiveX было лучше сделать как Функциональный Блок MasterSCADA.

Если что спрашивайте, чем могу, помогу.

denprox
07.11.2012, 11:26
А у вас сохранился исходник какого ни будь компонента ? В качестве шаблона чтоб можно было использовать. С документацией я вроде как немного разобрался, но на практике немного пока не сходится с написанным.

Пробую в VS 2005 на C#

42ia
07.11.2012, 11:35
Исходники своих компонентов у меня сохранились, но показать их мне не позволяют некоторые соглашения.
Но совет дам.
В папке
%MasterSCADA%\API\MasterSCADA\Examples лежит решение с простыми примерами. Сам я в начале работы опирался на один из этих примеров.

Как основу для компонента с динамизацией свойств советую Examples.UserControls.PropertiesDynamization

denprox
07.11.2012, 11:36
Спасибо! :) Посмотрю, как появятся вопросы, отпишусь ))

denprox
07.11.2012, 12:20
Кст, есть вопрос :) В документации где то промелькнуло, что лучше использовать 2005 VS, обязательно ли это ? Или можно и 2010 без проблем использовать ?

И еще такой вопрос. По примеру описанному в документации начинаю делать все как написано, но возникает на начальном этапе проблема:

7337

Что означают эти восклицательные знаки ? Я думаю что, что то тут не так )

42ia
07.11.2012, 13:33
Я использую 2010. Проблема заключается в том что файл проекта немного отличается у версий 2005 и 2010. Но студия при первом запуске предлагает сконвертировать проект. Это занимает несколько секунд.

Восклицательные знаки, скорее всего, означают что студия не знает где искать эти библиотеки. Нужно ей показать. Они лежат в корневом каталоге MasterSCADA.

SCADAMaster
07.11.2012, 13:33
Кст, есть вопрос :) В документации где то промелькнуло, что лучше использовать 2005 VS, обязательно ли это ? Или можно и 2010 без проблем использовать ?

2005 не рекомендуем использовать - она уже устарела.
Используйте 2010.



Что означают эти восклицательные знаки ? Я думаю что, что то тут не так )
Это означает что не найдена ссылка на сборку.
Удалите ее и добавьте снова.

denprox
07.11.2012, 13:36
Удалите ее и добавьте снова.

я так и подумал ... удалил из списка, снова добавил, и та же ерунда ... но у меня 2005 VS. Возможно проблема в этом :) Завтра переставлю на 2010, отпишусь :)

denprox
09.11.2012, 11:45
Установил наконец то VS 2010, проблема с подключением dll ушла. Но появилась новая ... Начиню делать все как написано, все оформлено 1 в 1 как в примере, но функция "InitializeComponent();" отказывается восприниматься.

При добавлении dll вылазит такое сообщение:
7347

Может в этом причина?

Еще, когда открываю пример от разработчиков, то по началу все выглядит нормально, но если попытаться откомплировать проект, то появляются ошибки что не найдены эти dll.

SCADAMaster
09.11.2012, 13:25
Нужно в настройках проекта на вкладке Application выбрать "Target framework:" = ".Net Framework 4"
В приложении исправленная версия примеров под NetFramework 4.

denprox
09.11.2012, 13:50
Если поставить NET Framework 4 вместо 3.5 в настройках проекта, то ошибки с путями к dll уходят. Но пишет ошибку на счет функции "InitializeComponent" :

Error 1 The name 'InitializeComponent' does not exist in the current context F:\Denis_files\Denis\VS_project\Act iveX_project\Proba_3\Example\Exampl e\MasterSCADAAutomation\MyActiveX.c s 17 13 Example

Хотя все сделал по примеру, все dll и библиотеки в using прописаны как в примере.

SCADAMaster
09.11.2012, 14:28
Сверьтесь с примерами которые мы приложили в предыдущем сообщении.
Если не поможет - приложите ваш проект.

denprox
12.11.2012, 07:36
проверил ваш пример, когда пытаюсь запустить "Build Examples" вылазят такие ошибки:


Error 1 Predefined type 'Microsoft.CSharp.RuntimeBinder.Binder' is not defined or imported Examples
Warning 2 The using directive for 'System.ComponentModel' appeared previously in this namespace D:\Program Files\InSAT\MasterSCADA\API\MasterSCADA\Examples\E xamples\VFB\FormOpening\FormOpeningControl.cs 8 7 Examples
Error 3 One or more types required to compile a dynamic expression cannot be found. Are you missing references to Microsoft.CSharp.dll and System.Core.dll? D:\Program Files\InSAT\MasterSCADA\API\MasterSCADA\Examples\E xamples\FB\WorkWithOperator\WorkWithOperatorExampl e.cs 31 14 Examples
Error 4 One or more types required to compile a dynamic expression cannot be found. Are you missing references to Microsoft.CSharp.dll and System.Core.dll? D:\Program Files\InSAT\MasterSCADA\API\MasterSCADA\Examples\E xamples\FB\WorkWithOperator\WorkWithOperatorExampl e.cs 31 15 Examples

denprox
12.11.2012, 10:10
Вот мой проект (точнее его начало). Пока что одна ошибка. Не знает что такое "InitializeComponent();"

7360

---------

нашел проблему, проект не правильно создал :) Исправляю ))

SCADAMaster
12.11.2012, 12:06
Если выполнить пункт
Add- User Control
то должен создаться вспомогательный файл ControlName.Designer.cs
В вашем проекте у MyActiveX.cs такого файла нет. Возможно вы создавали новый класс не как "User Control". Попробуйте удалить его и создать снова.

denprox
12.11.2012, 12:08
да да :) я уже понял, все сделал ) Уже получилось вставить в SCADA ))

denprox
13.11.2012, 12:57
Ну слава богу с созданием картинки в качестве ActiveX для SCADA я разобрался )) Теперь появилось несколько практических вопросов. Например такой: когда в SCADA выбираю свой компонент, то передвигать его мышкой не получается. Правильно ли я понял, что нужно описывать вручную событие MouseMove для формы в VS ? Или как то проще это делается ?

SCADAMaster
13.11.2012, 13:09
Должен перемещаться.
Попробуйте выделить его не на самой мнемосхеме, а в дереве элементом мнемосхемы. Вокруг контрола должна появится граница, после этого уже начинайте перемещать его.

denprox
13.11.2012, 13:13
так тоже пробовал, не хочет. Даже выделяться не хочет. только через дерево.

p.s. добавляю его в демонстрационный проект "Бак"

p.s.s. исходным файлом ActiveX является только dll или или еще какие то файлы ? Я в SCADA закинул только dll

SCADAMaster
13.11.2012, 13:32
Я в SCADA закинул только dll
Только dll.
Сбросьте ваш проект Visual Studio, проект MasterSCADA и саму DLL.

denprox
13.11.2012, 13:41
Вот тут то что просили. Только в проект SCADA не стал добавлять свой компонент. В принципе любой другой может подойти, даже пустой )

Проект (http://rghost.ru/41540823)

SCADAMaster
13.11.2012, 13:53
У нас нормально перетаскивается.
У вас в органайзере ActiveX не стоит галочка "Редактируемый в схеме"? Снимите ее

denprox
13.11.2012, 13:56
хех) вот я балда :) Спасибо! ))

denprox
14.11.2012, 08:20
Назрел новый вопрос. Есть ли какие ни буль статьи, по графике на C#. Суть такая, в SCADA есть Объемные элементы, мне нужно сделать что то подобное, только свое )) Смысл в том что, при масштабировании эти объекты не изменяют свое качество, следовательно они прорисовываются в реальном времени. Было бы хорошо, если бы был пример на С#.

Нужно для создания более качественной модели.

SCADAMaster
14.11.2012, 08:39
У нас такого примера нет.
Поищите в интернете работу с графикой на .Net, статьи по WPF.

denprox
14.11.2012, 09:01
хм... пока выглядит сложновато ) А есть пример, с использованием анимации ? В том же объемном элементе "Цилиндр" можно наблюдать за уровнем. Уровень зависит от входных данных. Нужно что то подобное.

SCADAMaster
14.11.2012, 09:53
Это не совсем анимация - это простая динамизация.
На вход динамизации приходит значение, а контрол меняет что-то на рисунке.

denprox
15.11.2012, 12:48
Начал изучать графику на C#. Нашел подходящий пример, но суть не в этом. Для проверки нужно изменять параметр. В примерах в SCADA есть такой пример:

[DispId(1),
DisplayName("Текст")]
public string TextValue
{
get { return _textBox.Text; }
set { _textBox.Text = value; }
}

как я понял этот фрагмент и делает то что нужно.

А как описывается параметр простой переменной ? Или например значение Value у какого ни будь элемента типа trackbar

SCADAMaster
15.11.2012, 12:54
Value - это значение которое передает MasterSCADA в контрол.
Вы можете в секции set { _textBox.Text = value; } выполнить нужный вам набор действий. В данном примере присваивается значение текстовому полю, а вы можете изменить заполнение trackbar.

denprox
15.11.2012, 13:02
я пробовал так:
set { trackBar.Value = value; }

пишет: Cannot implicitly convert type 'string' to 'int'

SCADAMaster
15.11.2012, 13:05
Вы объявили переменную как строковую, а пытаетесь присвоить ее числовому параметру.

denprox
15.11.2012, 13:20
Точно ) Еще как я понял, данный пример должен добавлять в Свойства объекта в SCADA, параметр, который можно было бы изменять, правильно ?

SCADAMaster
15.11.2012, 13:27
Да, в свойства контрола тоже должно свойство добавится.

denprox
15.11.2012, 13:53
Тогда у меня вышла какая то проблема. Dll скомпилировалась без ошибок, но Свойство не появилось.

SCADAMaster
15.11.2012, 13:58
А во входах и выходах динамизации оно появилось?

denprox
15.11.2012, 14:06
Нет, там тоже не появилось ни чего.

SCADAMaster
15.11.2012, 14:17
Значит где то ошиблись - сравнивайте с примером из документации
Может быть сделали DispId() с уже существующим номером.

denprox
15.11.2012, 14:57
а как узнать какие номера уже есть? У меня стоит DispId(1), как и в примере. Других свойств я пока не добавлял.

SCADAMaster
15.11.2012, 15:02
Значит должно появится.
Приложите ваш проект.

denprox
16.11.2012, 06:58
Вот исходник пробного проекта
7401

SCADAMaster
16.11.2012, 08:53
У вас есть set, но нет get - в этом случае свойство не появится.

denprox
16.11.2012, 09:35
Понял) Спасибо!)

denprox
20.11.2012, 09:49
Доброго времени суток. Продолжаю потихоньку изучать особенности создания ActiveX. На днях решил все таки попробовать работать с WPF. Но есть проблема, проект не компилируется. От сюда вопрос, какие есть особенности создания ActiveX с использованием WPF интерфейса ?

SCADAMaster
20.11.2012, 12:31
Нужно сделать обычный ActiveX, а на него уже помещать WPF контрол в обработчике события Load
private void ControlLoad(object sender, EventArgs e)
{
var host = new ElementHost {Dock = DockStyle.Fill};

_controlWpf = new ObjectCallStatesSetWpfControl(); //Отдельно определенный WPF контрол

host.Child = _controlWpf;
this.Controls.Add(host);
}

Также можно использовать элемент ElementHost. Подробнее можно посмотреть здесь:
http://msdn.microsoft.com/ru-ru/vstudio/ff934550.aspx#q6

denprox
20.11.2012, 12:48
хм, спасибо. Попробую )

denprox
23.11.2012, 06:38
Снова здравствуйте ) С использованием WPF вроде бы разобрался) и снова есть вопрос. Например у меня такая задачка, средствами WPF нарисовать компонент, и сделать так чтобы область вокруг него, была прозрачной. На сколько сложно это сделать ?

SCADAMaster
23.11.2012, 07:11
Работать с прозрачностью в WPF можно. Вам нужно прочитать документацию по WPF.

denprox
23.11.2012, 07:26
Ну то что прозрачность есть, я знаю, но во всех примерах рассматривается один и тот же метод, с заранее нарисованной формой...

Вроде бы нашел то что нужно ))

Если добавить в свойства класса формы WPF параметры:

Background="{x:Null}" WindowStyle="None" AllowsTransparency="True"

Тогда форма полностью прозрачная, при этом если на нее добавить например Эллипс то отображается только эллипс)

SCADAMaster
23.11.2012, 17:34
Попробуйте запустить в режим исполнения - скорее всего она будет непрозрачной. Интерпретатор мнемосхем написан не на .Net.
Мы уточнили у программистов - на WPF сейчас в MasterSCADA прозрачный контрол сделать нельзя.
Просто сделайте чтобы у контрола был фон мнемосхемы.

denprox
23.11.2012, 19:35
А как быть со слоями ? Т.е. если два рядом контрола поставить, то один закроет другого

SCADAMaster
23.11.2012, 19:40
Непонятен вопрос.
Как мы написали прозрачность с WPF в MasterSCADA сделать нельзя.
Есть возможность создания безоконного контрола (в документации описано), но WPF в нем использовать нельзя

denprox
23.11.2012, 19:46
Это в документации Создание ФБ на C# описано?

SCADAMaster
23.11.2012, 20:22
"Создание ActiveX на C#" - в самом конце

denprox
23.11.2012, 20:45
Спасибо. Буду пробовать дальше )

kao
28.11.2012, 09:40
Добрый день,
у меня появилась пара вопросов во время создания ФБ:
1) описал входы/выходы ФБ в файле .xml , но почему MasterScada их не видит?
2) как удалить ненужный блок из органайзера ФБ (на скриншоте видно два ФБ с одинаковым именем)?

SCADAMaster
28.11.2012, 13:07
1) описал входы/выходы ФБ в файле .xml , но почему MasterScada их не видит?

Где то ошиблись.
Проверьте еще раз правильность xml. Теги должны совпадать полностью, вплоть до регистра. Например у вас написан MAP вместо Map




2) как удалить ненужный блок из органайзера ФБ (на скриншоте видно два ФБ с одинаковым именем)?
Возможно сменился Guid. Можно вручную из реестра удалить, поиском по имени ФБ найти запись вида
HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{9BE31822-FDAD-461B-AD51-BE1D1C159921} - для x64
HKEY_CLASSES_ROOT\CLSID\{9BE31822-FDAD-461B-AD51-BE1D1C159921} - для x86
Само значение CLSID приведено для примера. Нужно его искать по имени класса внутри этого раздела. А удалять весь раздел.

Shushbuch
07.02.2013, 13:56
Добрый день. В процессе создания ActiveX компонента в Visual Studio 2010 столкнулся со следующей проблемой: у вытащенного на мнемосхему компонента отсутствуют свойства. Ни общие свойства, ни объявленные в классе компонента не отображаются. При попытке перетащить компонент рамка перетаскивается, но сам компонент своего положения не меняет, так же не меняются размеры компонента на мнемосхеме (галочка "редактируемый в схеме" в органайзере ActiveX снята). Подскажите, пожалуйста, в чем может быть дело?

SCADAMaster
07.02.2013, 14:52
Без самого ActiveX ничего сказать нельзя.
Выложите ваш проект Visual Studio.

Shushbuch
07.02.2013, 15:02
Во вложении проект тестового компонента.

Shushbuch
08.02.2013, 14:07
Проблема решилась обновлением MasterSCADA до версии 3.5. Оказалось, была установлена 3.4.

rumiantsev_nv
25.02.2013, 10:04
Добрый день!
Возникли проблемы с переносом dll на другой компьютер. Создал актив икс, протестировал на машине с мастерскадой, но теперь надо перенести эту dll на комп. При этом студио ставить не хочется. При обычной регистрации dll выдает, что не может найти точку входа для dllregistersrver.
Подскажите, в чем может быть проблема? Всё сделано на vs2010 с фрэймворком4

SCADAMaster
25.02.2013, 10:51
В документации по написанию это описано - данную dll нужно зарегистрировать (обычно это делают через bat файл):
12. Чтобы перенести библиотеку на другой компьютер необходимо скомпилированный dll файл скопировать в папку с установленной MasterSCADA и в этой папке выполните команду netreg.exe имя_библиотеки.dll

m1x2ra
04.03.2013, 16:26
Здравствуйте!
При компелировании программы пишет следующие предупреждения:
8169
После добавления в мастерскада, кнопка не реагирует на нажатие, окно с сообщением не появляется. Подскажите пожалуйста, как решить эту проблему. Спасибо :)

SCADAMaster
04.03.2013, 17:11
Данные предупреждения можно проигнорировать.
Кнопка у вас не нажимается в режиме разработки или в режиме исполнения?

m1x2ra
05.03.2013, 07:56
В режиме отладки, и в режиме пуска. Вот проект:) :
8191

m1x2ra
05.03.2013, 08:07
И хотел еще спросить: Можно ли к символам в мастерскада привязать элементы ActiveX? Я надеюсь создать свой динамический элемент: задвижку, что бы она перекрашивалась в разные цвета в зависимости от режима работы, и при нажатии чтобы вылезало окно с двумя кнопками "Открыть", "Закрыть". И возможность рисования в мастерскада ограничена, насколько я понял. например я хочу нарисовать задвижку, как уже существующую "задвижку мнемоническую", только в мастерскада нельзя рисовать треугольники? или я не просто не знаю как? подскажите пожалуйста. спасибо :) Короче говоря, надеюсь научиться создавать свои динамки с окнами управления и настройки режимов работы.

SCADAMaster
05.03.2013, 09:12
Пришлите также скомпилированную DLL библиотеку и проект MasterSCADA.

m1x2ra
05.03.2013, 09:34
Вот то, что просили:
8192
8193

m1x2ra
05.03.2013, 12:29
И вот еще вопрос :(. Создал пустой ФБ, но в палитру мастерскада блок не добавляется. обновляю палитру, только в категории "Другие" он не появляется. Вылезли те же предупреждения при компеляции в С#. Вот программа:

8195

m1x2ra
05.03.2013, 13:51
Круто, с кнопкой я разобрался. Там в свойствах копки не было пункта button_Click и я в ручную прописал в коде. Сейчас кликнул по кнопке и автоматом создалась процедура обработки события в коде. В мастерскада работает.

SCADAMaster
05.03.2013, 15:36
И вот еще вопрос :(. Создал пустой ФБ, но в палитру мастерскада блок не добавляется.

Вы не включили что данный класс наследуется:
public class TestFB
пропишите:
public class TestFB: VisualFBBase

m1x2ra
05.03.2013, 16:07
Не получилось, VisualFBBase не определяется:
8196

m1x2ra
05.03.2013, 16:17
Теперь все нормально: там нужно было написать StaticFBBase
Спасибо, что подсказали SCADAMaster =)

kao
08.03.2013, 14:43
После того как отредактировал изображение функционального блока, оно изменилось в палитре ФБ, но при вставке его в дерево объектов, изображение остаётся прежним.

SCADAMaster
09.03.2013, 12:11
Да, после исправления рисунка в старых проектах остается старое изображение - это ошибка, она записана.
В новых проектах, рисунок будет уже новым.

kao
11.03.2013, 13:14
Думаю, что работу по созданию собственных функциональных блоков, можно считать законченной, при наличии файлов справки по ФБ. Но, к сожалению, не нашёл в документации "Создание ФБ на C#", что необходимо сделать для вызова файлов справки *.chm собственных ФБ, например, при нажатии указателем "справка" по ФБ в библиотеке в режиме разработки?

SCADAMaster
11.03.2013, 14:19
Нужно прописать у атрибута класса:
HelpTopic("MSPalette", 9603)
где MSPalette - название chm-файла, 9603 - Id топика.
То есть например:
[Serializable,
ComVisible(true),
Guid("FDCE629F-69C6-402c-BB7C-AA1E44B40EB5"),
CatID(CatIDs.CATID_FB_WITHOUT_PROPS),
HelpTopic("MSPalette", 9603),
DisplayName("Мой ФБ"),
FBOptions(FBOptions.EnableChangeConfigInRT),
]

Tarkus
23.05.2013, 13:11
Здравствуйте!
Подскажите, есть такая задача: Из АктивХ компонента необходимо открыть(вызвать) "Окно управления" (или же любой другой документ) в мастерскаде. Изучив поставляемые с пакетом MasterSCADA примеры и документацию ничего про это я не нашел.

Написал в ИнСат письмо, их специалист посоветовал отнаследовать мой контрол от класса MasterSCADA.GUI.WinFormsControlBase вместо NetActiveXBase (как указанно в их примерах). Но визуал студия говорит что в MasterSCADA.GUI нет класса WinFormsControlBase (или чего угодно похожего на него).

Может быть кто то сталкивался с подобной проблемой? Буду крайне признателен за любую помощь, заранее спасибо.

SCADAMaster
23.05.2013, 14:19
Данный класс появился только в версии 3.5 SP1 - скачайте свежую версию MasterSCADA, с нашего FTP.
В документации по разработке ФБ и ActiveX в документе "Создание ActiveX на C#" в конце добавлено описание этого класса.
Только мы не указали инструкции, что необходимо еще добавить атрибут, задающий раздел палитры, где будет контрол -
[CatID(MnemoCatIDs.Windows)]
В класс MnemoCatIDs определены и другие разделы палитры. Если его не задать, то контрол не появится в палитре.

Tarkus
24.05.2013, 10:58
Здравствуйте!
Скачал 3.5 SP1, все отлично, появились свойства _attribute и HostTreeItem, однако проблемы пока это не решило. Действительно через _attribute я могу управлять мнемосхемой на которой установлен мой контрол. Однако задача стояла в открытии из одной мнемосхемы окна другой посредством контрола. HostTreeItem дает мне возможность получить доступ к любому другому объекту скады, но свойств ITreeItemHlp связанных с документами (мнемосхемами) этого объекта я не нашел.

SCADAMaster
24.05.2013, 12:58
У класса ITreeItemHlp есть коллекция Attributes, можно индексировать по имени документа.
Например HostTreeItem.Attributes["Окно управления"].Open();

Tarkus
28.05.2013, 14:15
Спасибо, все заработало!

Столкнулся с еще одной проблемой. Если наследовать контрол от MasterSCADA.GUI.WinFormsControlBase то он не появляется в окне "Органайзер ActiveX..." и его невозможно добавить к проекту. Пока что решил эту проблему следующим способом:
делаю пустую библиотеку с контролом имя и Guid которого такие же как и у основного контрола, но наследуемого от NetActiveXBase. Регистрирую эту пустую библиотеку и добавляю контрол через Органайзер ActiveX в палитру. Далее закрываю скаду и переписываю поверх уже нормальную библиотеку с контролом наследованным от MasterSCADA.GUI.WinFormsControlBase. Все работает.

Интересно как можно было бы решить эту проблему штатно? Библиотеку регистрирую, атрибут вроде бы дописал (правда CatID заменил на Category(MnemoCatIDs.Windows) по причине отсутствия первого, может быть проблема в этом?).

SCADAMaster
28.05.2013, 16:35
Мы вам написали - необходимо еще добавить атрибут, задающий раздел палитры, где будет контрол -
[CatID(MnemoCatIDs.Windows)]

using InSAT.Library.Interop;

Tarkus
09.06.2013, 22:20
Здравствуйте!

Спасибо за вашу поддержку, всегда оперативно и по существу помогаете решить возникающие проблемы.
Возник новый вопрос:
В системе несколько компьютеров. Указанно что Объект исполняется на одном из них. Возможно ли получить доступ к нему в ActiveX контроле исполняемом на другом компьютере системы? (через HostTreeItem он к сожалению недоступен, если на Объекте не стоит "Выполнять на всех" или же он не выполняется на компьютере на котором запущен контрол)

SCADAMaster
10.06.2013, 09:45
Если нужно постоянно получать данные от удаленной переменной, то вот метод -
/// <summary>
/// Создает переменную, получающую значения данного параметра. Данный параметр может распологаться на другом компьютере.
/// После использования нужно вызвать RTPinHlp.Dispose, чтобы разъединить установленные связи.
/// Для получения уведомлений об изменении значения можно подписаться на событие RTPinHlp.PinValueChanged
/// </summary>
/// <returns></returns>
public RTPinHlp GetConnectedRTPin()

Если разово получить, то вот способ -
value = pin.Project.ScanManager.GetRTPinValues(new[] {pin})[0];
Можно передать массив переменных, чтобы за один вызов получить все данные

Tarkus
18.06.2013, 11:01
Спасибо, все получилось!

В ходе тестирования заметил такую особенность.
Контрол установлен на главной мнемосхеме. Мнемосхема открывается как документ при старте проекта. Контрол подписан на события RTPinHlp.PinValueChanged для ряда пинов. Все работает отлично. С мнемосхемы пользователь переходит на другой документ (допустим тренды) и далее возвращается на мнемосхему (стрелочкой в панели навигации "Назад"). Теперь все подписи теряются, контрол более не отрабатывает события PinValueChanged. Как отследить такую ситуацию? Пока что я просто открываю все прочие документы в новых окнах тем самым не меняя текущий открытый документ главного окна. Есть ли штатное решение подобной проблемы?

SCADAMaster
18.06.2013, 13:51
В документации "Разработка ActiveX" описаны методы ToRuntime/ToDesign. Контрол должен подписываться/отписываться от этих событий.

Tarkus
03.07.2013, 13:03
Разобрался, спасибо!

Подскажите как получить название единицы измерения указанную для пина (поле "Диапазон измерения")?

SCADAMaster
04.07.2013, 11:29
Подскажите как получить название единицы измерения указанную для пина (поле "Диапазон измерения")?

var pin = HostFB.TreeItemHlp.Parent.GetPin("Команда 1");
var scales = HostFB.TreeItemHlp.Project.Scale;
var interval = scales.GetAnalogType(pin.PinScale.ScaleIndex);
this.Message(interval.UnitName);
У класса interval можно получить и другие свойства диапазона изменения (название самого диапазона - Name)

kao
28.10.2013, 19:23
Добрый вечер. У моего ВФБ по действиям в контроле меняются выходы ФБ. Теперь необходимо, чтобы изменения выходов ФБ в дереве объектов отображались на контроле. Однако, при попытке присвоить выходу какое-либо значение появляется сообщение "Нет связи". Подскажите, как доработать код ВФБ?

SCADAMaster
29.10.2013, 11:57
Не видя проекта найти ошибку крайне сложно. Для начала сформируйте отчет об ошибках и в нем посмотрите файлы "MasterSCADA.log" и "MasterSCADA_net.log". В них попадают отловленные системой исключения. Так же попробуйте сделать простой проект вида "вход=выход" и посмотрите есть ли ошибка на нём (возможно у вас ошибка в синтаксисе). Так же посмотрите под отладчиком в студии, что происходит с ВФБ в момент вывода сообщения "Нет связи".

kao
01.11.2013, 06:14
Со входами и выходами визуального контрола разобрался. Мне не очень понятно как переопределить размер безоконного контрола. Привожу часть кода:
public partial class nameDisplay : VisualWindowlessControlBase
{
protected override void OnPaint(PaintEventArgs e)
{
int iheight = e.ClipRectangle.Height;
int iwidth = e.ClipRectangle.Width;
e.Graphics.DrawRectangle(new Pen(Color.Black, 1), 0, 0, iwidth, iheight);
if (FBConnector.DesignMode)
{
e.Graphics.DrawString("имя машиниста", SystemFonts.DefaultFont, Brushes.Black, 0, 0);
}
Если в режиме разработки я могу изменить его размер, то в режиме исполнения он отрисовывается 99*99.
Выражение e.ClipRectangle.Height=25; приводит к ошибке.

kao
01.11.2013, 10:44
Временно поступил так, переопределив желаемый размер контрола:
public override Size PrefferedSize
{
get { return new Size(175,25); }
}
По хорошему размер контрола в режиме исполнения должен быть таким же , как в режиме разработки, как это сделать до меня пока не дошло.

SCADAMaster
01.11.2013, 11:39
Посмотрите под отладчиком в какой момент времени размер становится равен 99 на 99, откуда берутся эти значения ? Так же посмотрите когда значение с вашего меняется на новое.

PustovoyKE
25.11.2013, 17:31
Здравствуйте, начинаю изучение написания собственных ActiveX-элементов на c#, изучив пример в папке ..\MasterSCADA\Examples\Examples\UserControls\Read ScaleOfValue (получение шкалы при переносе значения в textBox), возник такой вопрос: как получить величину шкалы (и различные ее атрибуты) не перетаскиванием значения в поле, а привязыванием этого значения к динамическому входу ActiveX-элемента.
вот пример кода (но видимо чего-то тут я не понимаю):
[DispId(2),
DisplayName("Вход2")]
public int ID
{
get { return trackBar1.Value; }
set
{
ITreePinHlp pinHlp = MasterSCADAHlp.Instance.CurrentProject.ItemByID(va lue) as ITreePinHlp;

int unitID;
double scaleLo, scaleHi;
string name;
short digits;
string UnitName;
string temp1;

pinHlp.PinScale.GetInterval(out scaleLo, out scaleHi, out name, out digits, out unitID);
label2.Text = scaleLo.ToString(); //нижняя граница шкалы
label3.Text = scaleHi.ToString(); //верхняя граница шкалы
pinHlp.PinScale.GetUnit(unitID, out UnitName, out temp1);
label4.Text = UnitName; //единицы измерения
label5.Text = digits.ToString(); //количество знаков после запятой
}
}
не знаю как получить ID этого значения, которое перетаскиваю на динамический вход. Узнать бы его и заменить им значение Value

SCADAMaster
26.11.2013, 15:32
В ActiveX шкалу отследить затруднительно.
Лучше напишите ВФБ - в нем это сделать можно.

PustovoyKE
26.11.2013, 16:48
Спасибо, буду думать. Хотелось конечно сделать ActiveX, чтоб его потом можно было на мнемосхемы пачками вставлять и в дереве проекта они не мешались

SCADAMaster
26.11.2013, 17:36
Ну какие то связи с деревом объектов ActiveX все равно будет иметь, так что разницы нет.
Если нормально строить проект, то элементы не будут мешаться.

Alex_31
13.03.2014, 23:02
У класса ITreeItemHlp есть коллекция Attributes, можно индексировать по имени документа.
Например HostTreeItem.Attributes["Окно управления"].Open();

А как быть в случае, если у меня в структуре 2 объекта и мне на мнемосхеме первого объекта необходимо открыть мнемосхему второго?

SCADAMaster
14.03.2014, 10:31
В этом случае нужно обратится к другому объекту. Например ITreeItemHlp.GetChild("относительный путь") или IProjectHlp.Item("абсолютный путь")

Alex_31
14.03.2014, 23:39
Извините за глупый вопрос: но что подразумевается под относительным и абсолютным путем?

SCADAMaster
15.03.2014, 09:12
Относительный - это короткий путь к объектам ниже иерархии (то есть вложенным в данный объект объектам).
Абсолютный - полный путь к объекту.

Alex_31
15.03.2014, 19:24
При попытке использовать данное свойство появляется ошибка вида: "Для нестатического поля, метода или свойства "MasterSCADA.Hlp.IProjectHlp.Item(string)" требуется ссылка на объект". Подскажите пожалуйста какие классы нужно подключить и как выглядит абсолютный путь объекта.
IProjectHlp.Item("Объект 2.Мнемосхема") или IProjectHlp.Item("Объект 2\Мнемосхема") или как-то иначе?

SCADAMaster
16.03.2014, 20:08
Мнемосхему в пути указывать не надо.
Для полного пути:
var Mnemo= ((ITreeItemHlp)Attribute.TreeItemHlp.Project.Item("Объект.Объект1")).Attributes["Мнемосхема"];
Mnemo.Open();

Для относительного пути:
var Mnemo=((ITreeItemHlp)Attribute.TreeItemHlp.GetChil d("Объект1")).Attributes["Мнемосхема"];
Mnemo.Open();

Alex_31
16.03.2014, 21:40
Мнемосхему в пути указывать не надо.
Для полного пути:
var Mnemo= ((ITreeItemHlp)Attribute.TreeItemHlp.Project.Item("Объект.Объект1")).Attributes["Мнемосхема"];
Mnemo.Open();

Для относительного пути:
var Mnemo=((ITreeItemHlp)Attribute.TreeItemHlp.GetChil d("Объект1")).Attributes["Мнемосхема"];
Mnemo.Open();

Сделал все как вы описали, однако не хочет компилировать:
"System.Attribute" не содержит определение для "TreeItemHlp"

Я наверное что-то делаю неправильно или не использую какой-то модуль в uses ?

Вот код ниже:
using MasterSCADA.GUI;
using MasterSCADA.Hlp;
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;

namespace Control
{
[ComVisible(true),
Guid("DCE97106-1B8C-4D61-81DF-BDA93083C180"),
DisplayName("Контрол")]
public partial class UserControl1 : WinFormsControlBase
{
public UserControl1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
var Mnemo = ((ITreeItemHlp)Attribute.TreeItemHlp.Project.Item("Объект.Объект1")).Attributes["Мнемосхема"];
Mnemo.Open();
}
}
}

SCADAMaster
17.03.2014, 13:29
var Mnemo = ((ITreeItemHlp)Attribute.TreeItemHlp.Project.Item("Объект.Объект1")).Attributes["Мнемосхема"];
}
Попробуйте так:
var Mnemo = ((ITreeItemHlp)HostTreeItem.Project.Item("Объект.Объект1")).Attributes["Мнемосхема"];

Alex_31
17.03.2014, 17:58
Спасибо, все заработало!

H9ko
18.03.2014, 07:50
Здравствуйте а как открыть окно отчета из контрола? Пробовал по примеру из темы не получается
var Mnemo = ((ITreeItemHlp)HostTreeItem.Project.Item("Объект.Объект1")).Attributes["Имя нужного отчёта"];

Пишет Ссылка на объект не указывает на экземпляр объекта.

SCADAMaster
18.03.2014, 08:11
Попробуйте так:
var Mnemo = ((ITreeItemHlp)HostTreeItem.Project.Item("Объект.Объект1")).Attributes["Отчеты~Имя нужного отчёта"];

ordmun
28.10.2016, 15:02
Здравствуйте, создаю по "Создание ФБ и ВФБ для MasterSCADA на платформе Microsoft .Net Framework" ФБ, при компилировании выдает следующее сообщение27329, в чем причина?

SCADAMaster
29.10.2016, 11:58
Попробуйте под администратором запустить студию.

Николай2
04.12.2018, 15:13
Документация с примерами по созданию AcitveX и ФБ приложена к MasterSCADA - в разделе "документация" - "Разработка драйверов и ФБ".

Я невнимательно смотрю, или к этому времени этот раздел исчез, в смысле разрботка драйверов и ФБ?

SCADAMaster
04.12.2018, 15:33
Да.
Папка:
c:\Program Files (x86)\InSAT\MasterSCADA\API\MasterSCADA\

Николай2
04.12.2018, 20:23
Спасибо, есть такая папка.

Zerox
25.02.2021, 16:02
Здравствуйте, создаю контрол, и надо к нему добавить как бы свойства типо окошечка свойств, где можно менять к примеру цвет контрола. С чего можно начать?

SCADAMaster
25.02.2021, 17:41
Вам нужно для режима разработки?
Посмотрите документацию.
c:\Program Files (x86)\Insat\MasterSCADA\API\MasterSCADA\Создание ФБ на C#.doc
Раздел Создание страницы свойств ФБ.

Zerox
25.02.2021, 18:06
Здравствуйте, создаю контрол, и надо к нему добавить как бы свойства типо окошечка свойств, где можно менять к примеру цвет контрола. С чего можно начать?

SCADAMaster
25.02.2021, 18:22
Посмотрите прошлый ответ

Роман_М
26.02.2021, 10:47
Всем привет.
1.Подскажите основное отличие ВФБ и Activex ?
2. В каких случаях использовать тот или иной способ добавления собственных компонентов?
3. В чем принципиальное различие в процессе разработки ВФБ и Activex ?

SCADAMaster
26.02.2021, 11:08
1.Подскажите основное отличие ВФБ и Activex ?

ВФБ представлен и в дереве и на мнемосхеме, Activex только на мнемосхеме



2. В каких случаях использовать тот или иной способ добавления собственных компонентов?

Как правило лучше ВФБ.
ActiveX пишут только если он не требует никакого взаимодействия с деревом объектов или взаимодействует через объектную модель скады



3. В чем принципиальное различие в процессе разработки ВФБ и Activex ?
Разработка схожа, просто разные базовые классы используются.

Роман_М
26.02.2021, 13:24
:) Спасибо. Оперативно!