PDA

Просмотр полной версии : MasterScada и СОМ-сервер.



Kostic77
18.09.2013, 12:43
Добрый день.
Возможно ли получить данные с СОМ-сервера запущенного на одной машине с MasterScadой?
Если да, то как это сделать?
Из инструментов имеется dll библиотека функций для работы с данным сервером, скомпилированная для TraceMode.

SCADAMaster
18.09.2013, 13:09
Откуда конкретно нужно получить данные?
Можно попробовать использовать для этой задачи ФБ "Скрипт C#".

Kostic77
18.09.2013, 13:49
Такое ощущение, что СОМ-сервер самописный.
Вот описание:
Сервер БД СиУ ОД реализован на основе технологии COM (Component Object Model) (CLSID: 36972D4B 3A1F 4346 8BD9 5F2B252E54D4, LocalServer: DataLinkDriver.exe, ProgID: Data Link Driver) и предоставляет следующие программные интерфейсы:
 IDataLink (IID: 1EB93CD5 248A 41B4 9D15 E388CB39020B)
Предоставляет данные объектов диспетчеризации; обеспечивает отправку команд диспетчера объектам диспетчеризации, предоставляет информацию о состоянии связи с объектами диспетчеризации и т.д.)
 IDebugWindow (IID: 98D266B4 4032 4986 A6E0 4CF20F1F38EB)
Обеспечивает управление окном вывода отладочной информации сервера БД СиУ ОД.
 IFunctions (IID: 4313B408 5A5D 4A18 B79F 4A4C720EFAAB)
Обеспечивает преобразование данных, которое сложно или невозможно выполнить средствами SCADA-системы.
Все функции сервера БД СиУ ОД доступны SCADA-системе посредством использования динамически-линкуемой библиотеки «DataLinkDriverProxy.dll», которая предоставляет доступ к интерфейсам сервера БД СиУ ОД посредством экспортируемых функций.

Он постоянно работает на машине и принимает данные с объекта.
Разработчик достает данные из него TraceModой посредством C# с помощью данной библиотеки функций.

Я попробовал подключить данную библиотеку в скрипте и напоролся на ошибку:
10156

SCADAMaster
18.09.2013, 14:27
Вы уверены что данная библиотека написана на C#?

Kostic77
18.09.2013, 14:48
судя по названию функций в ней - да.
 unsigned char Initialize
 unsigned char DataLink_GetServerConnectionStatus
 unsigned char DataLink_GetBackupConnectionStatus
...
 void DebugWindow_Show
 void DebugWindow_Hide
...
и т.п. в принципе могу её прислать.

SCADAMaster
18.09.2013, 15:47
Скорее всего это все же не Net библиотека - пришлите ее нам или проверьте сами через Visual Studio
Но даже если она не .Net то можно сделать для нее оболочку. Примеры есть:
http://msdn.microsoft.com/ru-ru/library/c3fd4a20.aspx

Kostic77
19.09.2013, 12:23
Вы уверены что данная библиотека написана на C#?
скорее всего библиотека написана на Visual С++ 9.0.
библиотеку выслал.

SCADAMaster
19.09.2013, 13:05
Да, программа написана не .Net.
Вам нужно будет написать оболочку (dll библиотеку) в Visual Studio для обращения к этой библиотеке. А из скрипта уже будете обращаться к этой dll.
Либо напишите ФБ. Документация прилагается к MasterSCADA

Kostic77
25.09.2013, 13:09
Добрый день.
Опробован способ импорта функций библиотеки.

using System;
using MasterSCADA.Script.FB;
using MasterSCADA.Hlp;
using FB;
using System.Linq;
using System.IO;

using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;


public partial class ФБ : ScriptBase
{
[DllImport(@"c:\DataLinkDriver\DataLinkProxy", SetLastError = true,
EntryPoint = "DebugWindow_Show", CharSet = CharSet.Unicode)]
private static extern void DebugWindow_Show();

[DllImport(@"c:\DataLinkDriver\DataLinkProxy", SetLastError = true,
EntryPoint = "DebugWindow_Hide", CharSet = CharSet.Unicode)]
private static extern void DebugWindow_Hide();

public override void Execute()
{
if (Параметр1 == true) {
DebugWindow_Show();
Параметр2 = true; }
else {
DebugWindow_Hide();
Параметр2 = false;}
}
}


Компиляция прошла успешно. Но при вызове импортированной функции ничего не происходит и прерывается выполнение кода скрипта...
т.е. при изменении Параметра1 не происходит изменение Параметра2...
если убрать вызовы импортированных функций в комментарии, то всё нормально - Параметр2 изменяется согласно Параметру1.

Что я делаю не так?

SCADAMaster
25.09.2013, 14:11
Попробуйте вызывать DebugWindow_Show() и DebugWindow_Hide() в BeginInvoke.
Пример такой:
RTManager.Instance.ThreadHolder.BeginInvoke(new ThreadStart(delegate
{
//ваш код
}));

В секцию using добавьте:
using System.Threading;

Kostic77
27.09.2013, 08:46
Добрый день.
Заработал способ описанный мной. Проблема была в неправильном пути к импортируемой библиотеке.

Остался вопрос - скада запускает сервер подключаемый в данной библиотеке (DATALI~1). После остановки выполнения проекта процесс DATALI~1 остается в памяти и работает. Можно ли после или перед остановкой выполнения проекта принудительно выгрузить из памяти данный процесс?

SCADAMaster
27.09.2013, 09:10
Добавьте в код метод
public override void Stop()
{

}
В нем разместите код для выгрузки вашей библиотеки.