![]() |
|
|
Регистрация | << Правила форума >> | 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); т.е. (возможно, задача усложняется тем, что нет под рукой контроллера, а возможность предоставиться его пощупать только на объекте) я получу весь массив переменных ПЛК, но никак конкретноые значения конкретных тэгов... |