![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добрый день! Господа, подскажите, пожалуйста, как узнать из библиотеки нужную мне функцию.
Постановка задачи: считывание/ запись данных (тэгов) из/в программируемый контроллер Unitronics. Исходные данные: 1. Есть ПЛК Unitronics. 2. Есть OPC-Server. 3. Есть библиотека к OPC-Server "UniOpcWriteReq.dll" 4. При помощи программы DLLExport Viewer я прочитал 4 имеющиеся функции (DllCanUnloadNow , DllGetClassObject, DllregisterServer и DllUnregisterServer). Вопросы: 1. Какую из функций мне использовать для обмена с ПЛК? (по идее должны быть функции, непосредственно связаны с именами GetTag/ SetTag , а таких не вижу...) Спасибо. |
|
#2
|
||||
|
||||
|
Судя по наличию функций DllregisterServer и DllUnregisterServer библиотеку нужно зарегисть с помощью Regsrv32.exe.
Затем в программе делаем CreateOleObject и пользуемся. Наверное так... |
| Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение: | ||
Nautilus (13.03.2012)
| ||
|
#3
|
||||
|
||||
|
стандартный экспорт ActiveX Library:
Код:
library Project1;
uses
ComServ;
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
{$R *.RES}
begin
end.выложи на обменник где-то. либо сам попробуй Import Type Library. |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Nautilus (13.03.2012)
| ||
|
#4
|
|||
|
|||
|
Т.е. вставив данный код в свой проект, я "увижу" дополнительные функции для связи с тэгами?
Выложу библиотеку (навсяк случай ) |
|
#5
|
|||
|
|||
|
Цитата:
Импортировав библиотеку, как ActiveX (COM-объект), ты получишь исходник, описывающий некоторый класс, который содержит методы для работы с контроллером. Просто добавляешь этот исходик в свой проект и работаешь с ним как с любым другим COM-объектом. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Nautilus (13.03.2012)
| ||
|
#6
|
||||
|
||||
|
импорт библиотеки типов дал следующее:
Код:
_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; |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Nautilus (13.03.2012)
| ||
|
#7
|
|||
|
|||
|
Спасибо, люди добрые...
|
|
#8
|
|||
|
|||
|
Извиняюсь, а я могу данный кусок вставить в общую программу? (не делая отдельного модуля)...
|
|
#9
|
|||
|
|||
|
Уж простите далёкого, получается, что подключив модуль "UniOpcWriteReq" и вызвав функцию "function TclsWriteRequestProperties.Get_Value: OleVariant" я получу свой тэг?
В любом случае- спасибо Вам... |
|
#10
|
||||
|
||||
|
нужно создать Com-объект, реализующий интерфейс _clsWriteRequest с TGUID = CLASS_clsWriteRequest. это уже сделано в классе TclsWriteRequest.
судя по его названию ему нужно передать какой-то Request, можно проверять результат выполнения Seccess (возможно тут очепятка от Success), передавать довольны ли Done, ну и получать какие-то значения Value. но все это мои предположения))) |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Nautilus (13.03.2012)
| ||
|
#11
|
|||
|
|||
|
Цитата:
А у вас нет описания? Я-то шёл обычным путём: 1. Почитайте OPC. Новый подход UA пока можно не изучать. У стандартного подхода надо определиться с версией (2 или 3). 2. Надо запастись файлами со стандартными интерфейсами OPC. 3. Подключаемся к IOPCServer. Можно вызывать его метод GetStasus и прочитать кучу информации. 4. Создать группу и получить ссылку на IOPCItemMgt. 5. Потом в группу можно добавлять тэги. Но надо знать, как писать их названия (у группы может быть любое название). Названия тэгов можно узнать заранее через браузер, но у меня это не получилось, поэтому самое лучшее - запустить OPC-клиент (напр., от Matrikon) и проверить, как этот клиент работает с вашим сервером и контроллером. |
| Этот пользователь сказал Спасибо AlexSku за это полезное сообщение: | ||
Nautilus (13.03.2012)
| ||
|
#12
|
|||
|
|||
|
А вам же 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
|
|||
|
|||
|
"Импортировав библиотеку, как 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
|
|||
|
|||
|
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); т.е. (возможно, задача усложняется тем, что нет под рукой контроллера, а возможность предоставиться его пощупать только на объекте) я получу весь массив переменных ПЛК, но никак конкретноые значения конкретных тэгов... |