Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.03.2012, 16:15
Nautilus Nautilus вне форума
Новичок
 
Регистрация: 07.02.2012
Сообщения: 53
Репутация: 10
По умолчанию Разгадка функций из библиотек

Добрый день! Господа, подскажите, пожалуйста, как узнать из библиотеки нужную мне функцию.
Постановка задачи: считывание/ запись данных (тэгов) из/в программируемый контроллер Unitronics.
Исходные данные:
1. Есть ПЛК Unitronics.
2. Есть OPC-Server.
3. Есть библиотека к OPC-Server "UniOpcWriteReq.dll"
4. При помощи программы DLLExport Viewer я прочитал 4 имеющиеся функции (DllCanUnloadNow , DllGetClassObject, DllregisterServer и DllUnregisterServer).
Вопросы:
1. Какую из функций мне использовать для обмена с ПЛК?
(по идее должны быть функции, непосредственно связаны с именами GetTag/ SetTag , а таких не вижу...)
Спасибо.
Ответить с цитированием
  #2  
Старый 11.03.2012, 16:50
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Судя по наличию функций DllregisterServer и DllUnregisterServer библиотеку нужно зарегисть с помощью Regsrv32.exe.
Затем в программе делаем CreateOleObject и пользуемся.
Наверное так...
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение:
Nautilus (13.03.2012)
  #3  
Старый 11.03.2012, 18:45
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

стандартный экспорт ActiveX Library:
Код:
library Project1;

uses
  ComServ;

exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;

{$R *.RES}

begin
end.

выложи на обменник где-то. либо сам попробуй Import Type Library.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Nautilus (13.03.2012)
  #4  
Старый 11.03.2012, 23:48
Nautilus Nautilus вне форума
Новичок
 
Регистрация: 07.02.2012
Сообщения: 53
Репутация: 10
По умолчанию

Т.е. вставив данный код в свой проект, я "увижу" дополнительные функции для связи с тэгами?



Выложу библиотеку (навсяк случай )
Вложения
Тип файла: 7z UniOpcWriteReq.7z (3.3 Кбайт, 3 просмотров)
Ответить с цитированием
  #5  
Старый 12.03.2012, 04:30
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Nautilus
Т.е. вставив данный код в свой проект, я "увижу" дополнительные функции для связи с тэгами?
Выложу библиотеку (навсяк случай )

Импортировав библиотеку, как ActiveX (COM-объект), ты получишь исходник, описывающий некоторый класс, который содержит методы для работы с контроллером. Просто добавляешь этот исходик в свой проект и работаешь с ним как с любым другим COM-объектом.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Nautilus (13.03.2012)
  #6  
Старый 12.03.2012, 09:34
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

импорт библиотеки типов дал следующее:
Код:
  _clsWriteRequest = interface(IDispatch)
    ['{9E481700-31AB-4CB8-B976-53BBDAC225E9}']
    procedure Set_Done(Param1: WordBool); safecall;
    function Get_Done: WordBool; safecall;
    procedure Set_Request(const Param1: WideString); safecall;
    function Get_Request: WideString; safecall;
    procedure Set_Seccess(Param1: WordBool); safecall;
    function Get_Seccess: WordBool; safecall;
    procedure Set_Value(Param1: OleVariant); safecall;
    function Get_Value: OleVariant; safecall;
    property Done: WordBool read Get_Done write Set_Done;
    property Request: WideString read Get_Request write Set_Request;
    property Seccess: WordBool read Get_Seccess write Set_Seccess;
    property Value: OleVariant read Get_Value write Set_Value;
  end;

Код:
TclsWriteRequest = class(TOleServer)

т.е. работать примерно так:

Код:
uses
  UniOpcWriteReq,
...
var
  clsWriteRequest: TclsWriteRequest;
begin
  clsWriteRequest:=TclsWriteRequest.Create(Self);
  try
//    clsWriteRequest.Done;
//    clsWriteRequest.Request;
//    clsWriteRequest.Seccess;
//    clsWriteRequest.Value;
  finally
    clsWriteRequest.Free;
  end;
end;
Вложения
Тип файла: rar UniOpcWriteReq.rar (3.1 Кбайт, 2 просмотров)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Nautilus (13.03.2012)
  #7  
Старый 12.03.2012, 10:40
Nautilus Nautilus вне форума
Новичок
 
Регистрация: 07.02.2012
Сообщения: 53
Репутация: 10
По умолчанию

Спасибо, люди добрые...
Ответить с цитированием
  #8  
Старый 12.03.2012, 10:42
Nautilus Nautilus вне форума
Новичок
 
Регистрация: 07.02.2012
Сообщения: 53
Репутация: 10
По умолчанию

Извиняюсь, а я могу данный кусок вставить в общую программу? (не делая отдельного модуля)...
Ответить с цитированием
  #9  
Старый 12.03.2012, 10:53
Nautilus Nautilus вне форума
Новичок
 
Регистрация: 07.02.2012
Сообщения: 53
Репутация: 10
По умолчанию

Уж простите далёкого, получается, что подключив модуль "UniOpcWriteReq" и вызвав функцию "function TclsWriteRequestProperties.Get_Value: OleVariant" я получу свой тэг?





В любом случае- спасибо Вам...
Ответить с цитированием
  #10  
Старый 12.03.2012, 13:03
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

нужно создать Com-объект, реализующий интерфейс _clsWriteRequest с TGUID = CLASS_clsWriteRequest. это уже сделано в классе TclsWriteRequest.

судя по его названию ему нужно передать какой-то Request, можно проверять результат выполнения Seccess (возможно тут очепятка от Success), передавать довольны ли Done, ну и получать какие-то значения Value. но все это мои предположения)))
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Nautilus (13.03.2012)
  #11  
Старый 12.03.2012, 13:50
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Цитата:
Сообщение от Nautilus
Уж простите далёкого, получается, что подключив модуль "UniOpcWriteReq" и вызвав функцию "function TclsWriteRequestProperties.Get_Value: OleVariant" я получу свой тэг?
Тэг это название. Скорее всего вы хотите получить значение тэга.
А у вас нет описания?
Я-то шёл обычным путём:
1. Почитайте OPC. Новый подход UA пока можно не изучать. У стандартного подхода надо определиться с версией (2 или 3).
2. Надо запастись файлами со стандартными интерфейсами OPC.
3. Подключаемся к IOPCServer.
Можно вызывать его метод GetStasus и прочитать кучу информации.
4. Создать группу и получить ссылку на IOPCItemMgt.
5. Потом в группу можно добавлять тэги. Но надо знать, как писать их названия (у группы может быть любое название). Названия тэгов можно узнать заранее через браузер, но у меня это не получилось, поэтому самое лучшее - запустить OPC-клиент (напр., от Matrikon) и проверить, как этот клиент работает с вашим сервером и контроллером.
Ответить с цитированием
Этот пользователь сказал Спасибо AlexSku за это полезное сообщение:
Nautilus (13.03.2012)
  #12  
Старый 12.03.2012, 14:18
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

А вам же Unitronics предлагает ActiveX с примерами:
COM Object ActiveX .dll
This zip file contains an ActiveX .dll file that can be used to implement SCADA. UnCmDrv1.dll file contains methods and properties for invoking the PLC, read / write, locally or remotely, implementation examples, and an explanation of accessing Data Tables.
Ответить с цитированием
Этот пользователь сказал Спасибо AlexSku за это полезное сообщение:
Nautilus (13.03.2012)
  #13  
Старый 13.03.2012, 10:25
Nautilus Nautilus вне форума
Новичок
 
Регистрация: 07.02.2012
Сообщения: 53
Репутация: 10
По умолчанию

"Импортировав библиотеку, как ActiveX (COM-объект), ты получишь исходник, описывающий некоторый класс, который содержит методы для работы с контроллером. Просто добавляешь этот исходик в свой проект и работаешь с ним как с любым другим COM-объектом."- так точно, я получил СОМ объект, но его свойств и методов недостаточно для обращения к конкретному тегу.
Что касается "А вам же Unitronics предлагает ActiveX с примерами:
COM Object ActiveX .dll
This zip file contains an ActiveX .dll file that can be used to implement SCADA. UnCmDrv1.dll file contains methods and properties for invoking the PLC, read / write, locally or remotely, implementation examples, and an explanation of accessing Data Tables.", то библиотека UnCmDrv1.dll написана под .Net, а с этим не знаком...
Люди, в любом случае- спасибо огромное, ещё буду перебровывать все Ваши советы.
Ответить с цитированием
  #14  
Старый 13.03.2012, 10:34
Nautilus Nautilus вне форума
Новичок
 
Регистрация: 07.02.2012
Сообщения: 53
Репутация: 10
По умолчанию

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleServer, UniOpcWriteReq_TLB, StdCtrls;

type
TForm1 = class(TForm)
clsWriteRequest1: TclsWriteRequest;
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
clsWriteRequest: TclsWriteRequest;
// myOLEStr:= OLEVariant;

begin
clsWriteRequest:=TclsWriteRequest.Create(Self);
try
clsWriteRequest.RemoteMachineName:= "fff";
clsWriteRequest.Connect;
Label1.Caption:= String(clsWriteRequest.Value);


clsWriteRequest.Done;
clsWriteRequest.Request;
clsWriteRequest.Seccess;
clsWriteRequest.Value;
finally
clsWriteRequest.Free;
end;
end;

end.

Создав модуль "UniOpcWriteReq_TLB", я могу использовать только
clsWriteRequest:=TclsWriteRequest.Create(Self);
try
clsWriteRequest.RemoteMachineName:= "fff";
clsWriteRequest.Connect;
Label1.Caption:= String(clsWriteRequest.Value);
т.е. (возможно, задача усложняется тем, что нет под рукой контроллера, а возможность предоставиться его пощупать только на объекте) я получу весь массив переменных ПЛК, но никак конкретноые значения конкретных тэгов...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:56.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025