|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
COM объект S7ProSim
Никто не сталкивался с COM объектом S7ProSim? У фирмы Siemens есть программа PLCSim эмулятора контроллеров Simatic, с которой должна общаться моя программа (3-хмерная графика техпроцесса). Немцы примеры дают на Бейсике и Си. В Delphi я не вижу такого ActiveX объекта, но удалось сделать TLB файл из библиотеки s7wspsmx.dll.
Удалось подключиться через: Код:
MySim: OleVariant; ... MySim:= CreateOleObject('S7wspsmx.S7ProSim'); MySim.Connect; MySim.SetScanMode(ContinuousScan); MySim.SetState('RUN'); BeginScanNotify() после каждой команды должна вызываться callback ф-я ConnectionError() с указанием кода ошибки, а после каждого скана - callback ф-я ScanFinished(). Как это реализовать? |
#2
|
||||
|
||||
поздравляю, коллега! с подобным вопросом я пришел на этот форум) как видно ответов небыло скинь TLB.
Пишу программы за еду. __________________ |
#3
|
|||
|
|||
Код:
unit S7PROSIMLib_TLB; // ************************************************************************ // // WARNING // ------- // The types declared in this file were generated from data read from a // Type Library. If this type library is explicitly or indirectly (via // another type library referring to this type library) re-imported, or the // 'Refresh' command of the Type Library Editor activated while editing the // Type Library, the contents of this file will be regenerated and all // manual modifications will be lost. // ************************************************************************ // // PASTLWTR : 1.2 // File generated on 23.03.2011 0:05:10 from Type Library described below. // ************************************************************************ // // Type Lib: C:\Program Files\Siemens\Plcsim\s7wsi\s7wspsmx.dll (1) // LIBID: {83CC0D80-FEDA-11D1-BE76-0060B06816CF} // LCID: 0 // Helpfile: // HelpString: Siemens S7ProSim COM Object // DepndLst: // (1) v2.0 stdole, (C:\Windows\system32\stdole2.tlb) // Errors: // Error creating palette bitmap of (TS7ProSim) : Server C:\Program Files\Siemens\Plcsim\s7wsi\s7wspsmx.dll contains no icons // ************************************************************************ // // *************************************************************************// // NOTE: // Items guarded by $IFDEF_LIVE_SERVER_AT_DESIGN_TIME are used by properties // which return objects that may need to be explicitly created via a function // call prior to any access via the property. These items have been disabled // in order to prevent accidental use from within the object inspector. You // may enable them by defining LIVE_SERVER_AT_DESIGN_TIME or by selectively // removing them from the $IFDEF blocks. However, such items must still be // programmatically created via a method of the appropriate CoClass before // they can be used. {$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. {$WARN SYMBOL_PLATFORM OFF} {$WRITEABLECONST ON} {$VARPROPSETTER ON} interface uses Windows, ActiveX, Classes, Graphics, OleServer, StdVCL, Variants; // *********************************************************************// // GUIDS declared in the TypeLibrary. Following prefixes are used: // Type Libraries : LIBID_xxxx // CoClasses : CLASS_xxxx // DISPInterfaces : DIID_xxxx // Non-DISP interfaces: IID_xxxx // *********************************************************************// const // TypeLibrary Major and minor versions S7PROSIMLibMajorVersion = 1; S7PROSIMLibMinorVersion = 0; LIBID_S7PROSIMLib: TGUID = '{83CC0D80-FEDA-11D1-BE76-0060B06816CF}'; IID_IS7ProSimEvents: TGUID = '{83CC0D82-FEDA-11D1-BE76-0060B06816CF}'; IID_IS7ProSim: TGUID = '{83CC0D81-FEDA-11D1-BE76-0060B06816CF}'; CLASS_S7ProSim: TGUID = '{83CC0D83-FEDA-11D1-BE76-0060B06816CF}'; // *********************************************************************// // Declaration of Enumerations defined in Type Library // *********************************************************************// // Constants for enum __MIDL___MIDL_itf_S7wspsmx_0000_0002 type __MIDL___MIDL_itf_S7wspsmx_0000_0002 = TOleEnum; const S7Byte = $00000002; S7Word = $00000003; S7DoubleWord = $00000004; // Constants for enum __MIDL___MIDL_itf_S7wspsmx_0000_0003 type __MIDL___MIDL_itf_S7wspsmx_0000_0003 = TOleEnum; const S7_Bit = $00000001; S7_Byte = $00000002; S7_Word = $00000003; S7_DoubleWord = $00000004; // Constants for enum __MIDL___MIDL_itf_S7wspsmx_0000_0001 type __MIDL___MIDL_itf_S7wspsmx_0000_0001 = TOleEnum; const SingleScan = $00000000; ContinuousScan = $00000001; // Constants for enum __MIDL___MIDL_itf_S7wspsmx_0000_0004 type __MIDL___MIDL_itf_S7wspsmx_0000_0004 = TOleEnum; const Running = $00000000; Paused = $00000001; Disabled = $00000002; // Constants for enum __MIDL___MIDL_itf_S7wspsmx_0000_0005 type __MIDL___MIDL_itf_S7wspsmx_0000_0005 = TOleEnum; const WarmStart = $00000000; HotStart = $00000001; ColdStart = $00000002; type // *********************************************************************// // Forward declaration of types defined in TypeLibrary // *********************************************************************// IS7ProSimEvents = interface; IS7ProSim = interface; IS7ProSimDisp = dispinterface; // *********************************************************************// // Declaration of CoClasses defined in Type Library // (NOTE: Here we map each CoClass to its Default Interface) // *********************************************************************// S7ProSim = IS7ProSim; // *********************************************************************// // Declaration of structures, unions and aliases. // *********************************************************************// POleVariant1 = ^OleVariant; {*} ImageDataTypeConstants = __MIDL___MIDL_itf_S7wspsmx_0000_0002; PointDataTypeConstants = __MIDL___MIDL_itf_S7wspsmx_0000_0003; ScanModeConstants = __MIDL___MIDL_itf_S7wspsmx_0000_0001; PauseStateConstants = __MIDL___MIDL_itf_S7wspsmx_0000_0004; RestartSwitchPositionConstants = __MIDL___MIDL_itf_S7wspsmx_0000_0005; // *********************************************************************// // Interface: IS7ProSimEvents // Flags: (256) OleAutomation // GUID: {83CC0D82-FEDA-11D1-BE76-0060B06816CF} // *********************************************************************// IS7ProSimEvents = interface(IUnknown) ['{83CC0D82-FEDA-11D1-BE76-0060B06816CF}'] function ScanFinished(ScanInfo: OleVariant): HResult; stdcall; function ConnectionError(const ControlEngine: WideString; Error: Integer): HResult; stdcall; function PLCSimStateChanged(const NewState: WideString): HResult; stdcall; function PauseStateChanged(const NewState: WideString): HResult; stdcall; function ScanModeChanged(const NewState: WideString): HResult; stdcall; end; |
#4
|
|||
|
|||
Код:
// *********************************************************************// // Interface: IS7ProSim // Flags: (4416) Dual OleAutomation Dispatchable // GUID: {83CC0D81-FEDA-11D1-BE76-0060B06816CF} // *********************************************************************// IS7ProSim = interface(IDispatch) ['{83CC0D81-FEDA-11D1-BE76-0060B06816CF}'] procedure ReadOutputImage(StartIndex: Integer; ElementsToRead: Integer; DataType: ImageDataTypeConstants; var pData: OleVariant); safecall; procedure WriteInputImage(StartIndex: Integer; var pData: OleVariant); safecall; procedure ReadOutputPoint(ByteIndex: Integer; BitIndex: Integer; DataType: PointDataTypeConstants; var pData: OleVariant); safecall; procedure WriteInputPoint(ByteIndex: Integer; BitIndex: Integer; var pData: OleVariant); safecall; procedure ExecuteSingleScan; safecall; procedure Connect; safecall; procedure Disconnect; safecall; procedure BeginScanNotify; safecall; procedure EndScanNotify; safecall; procedure ExecuteNmsScan(MsNumber: Integer); safecall; procedure ExecuteNScans(NScanNumber: Integer); safecall; function GetScanMode: ScanModeConstants; safecall; procedure SetScanMode(newVal: ScanModeConstants); safecall; procedure Pause; safecall; procedure Continue; safecall; function GetPauseState: PauseStateConstants; safecall; procedure SavePLC(const FileName: WideString); safecall; procedure HotStartWithSavedValues(val: Integer); safecall; function GetState: WideString; safecall; procedure SetState(const newVal: WideString); safecall; procedure StartPLCSim(const plcFile: WideString); safecall; procedure SetStartUpSwitch(postion: RestartSwitchPositionConstants); safecall; function GetStartUpSwitch: RestartSwitchPositionConstants; safecall; procedure ReadDataBlockValue(BlockNum: Integer; ByteIndex: Integer; BitIndex: Integer; DataType: PointDataTypeConstants; var pData: OleVariant); safecall; procedure WriteDataBlockValue(BlockNum: Integer; ByteIndex: Integer; BitIndex: Integer; var pData: OleVariant); safecall; procedure ReadFlagValue(ByteIndex: Integer; BitIndex: Integer; DataType: PointDataTypeConstants; var pData: OleVariant); safecall; procedure WriteFlagValue(ByteIndex: Integer; BitIndex: Integer; var pData: OleVariant); safecall; procedure ConnectExt(InstanceNumber: Integer); safecall; procedure StartPLCSimExt(const plcFile: WideString); safecall; end; // *********************************************************************// // DispIntf: IS7ProSimDisp // Flags: (4416) Dual OleAutomation Dispatchable // GUID: {83CC0D81-FEDA-11D1-BE76-0060B06816CF} // *********************************************************************// IS7ProSimDisp = dispinterface ['{83CC0D81-FEDA-11D1-BE76-0060B06816CF}'] procedure ReadOutputImage(StartIndex: Integer; ElementsToRead: Integer; DataType: ImageDataTypeConstants; var pData: OleVariant); dispid 1; procedure WriteInputImage(StartIndex: Integer; var pData: OleVariant); dispid 2; procedure ReadOutputPoint(ByteIndex: Integer; BitIndex: Integer; DataType: PointDataTypeConstants; var pData: OleVariant); dispid 3; procedure WriteInputPoint(ByteIndex: Integer; BitIndex: Integer; var pData: OleVariant); dispid 4; procedure ExecuteSingleScan; dispid 5; procedure Connect; dispid 6; procedure Disconnect; dispid 7; procedure BeginScanNotify; dispid 8; procedure EndScanNotify; dispid 9; procedure ExecuteNmsScan(MsNumber: Integer); dispid 10; procedure ExecuteNScans(NScanNumber: Integer); dispid 11; function GetScanMode: ScanModeConstants; dispid 12; procedure SetScanMode(newVal: ScanModeConstants); dispid 13; procedure Pause; dispid 14; procedure Continue; dispid 15; function GetPauseState: PauseStateConstants; dispid 16; procedure SavePLC(const FileName: WideString); dispid 17; procedure HotStartWithSavedValues(val: Integer); dispid 18; function GetState: WideString; dispid 19; procedure SetState(const newVal: WideString); dispid 20; procedure StartPLCSim(const plcFile: WideString); dispid 21; procedure SetStartUpSwitch(postion: RestartSwitchPositionConstants); dispid 22; function GetStartUpSwitch: RestartSwitchPositionConstants; dispid 23; procedure ReadDataBlockValue(BlockNum: Integer; ByteIndex: Integer; BitIndex: Integer; DataType: PointDataTypeConstants; var pData: OleVariant); dispid 24; procedure WriteDataBlockValue(BlockNum: Integer; ByteIndex: Integer; BitIndex: Integer; var pData: OleVariant); dispid 25; procedure ReadFlagValue(ByteIndex: Integer; BitIndex: Integer; DataType: PointDataTypeConstants; var pData: OleVariant); dispid 26; procedure WriteFlagValue(ByteIndex: Integer; BitIndex: Integer; var pData: OleVariant); dispid 27; procedure ConnectExt(InstanceNumber: Integer); dispid 29; procedure StartPLCSimExt(const plcFile: WideString); dispid 30; end; // *********************************************************************// // The Class CoS7ProSim provides a Create and CreateRemote method to // create instances of the default interface IS7ProSim exposed by // the CoClass S7ProSim. The functions are intended to be used by // clients wishing to automate the CoClass objects exposed by the // server of this typelibrary. // *********************************************************************// CoS7ProSim = class class function Create: IS7ProSim; class function CreateRemote(const MachineName: string): IS7ProSim; end; TS7ProSimScanFinished = procedure(ASender: TObject; ScanInfo: OleVariant) of object; TS7ProSimConnectionError = procedure(ASender: TObject; const ControlEngine: WideString; Error: Integer) of object; TS7ProSimPLCSimStateChanged = procedure(ASender: TObject; const NewState: WideString) of object; TS7ProSimPauseStateChanged = procedure(ASender: TObject; const NewState: WideString) of object; TS7ProSimScanModeChanged = procedure(ASender: TObject; const NewState: WideString) of object; |
#5
|
|||
|
|||
Код:
// *********************************************************************// // OLE Server Proxy class declaration // Server Object : TS7ProSim // Help String : S7ProSim Class // Default Interface: IS7ProSim // Def. Intf. DISP? : No // Event Interface: IS7ProSimEvents // TypeFlags : (2) CanCreate // *********************************************************************// {$IFDEF LIVE_SERVER_AT_DESIGN_TIME} TS7ProSimProperties= class; {$ENDIF} TS7ProSim = class(TOleServer) private FOnScanFinished: TS7ProSimScanFinished; FOnConnectionError: TS7ProSimConnectionError; FOnPLCSimStateChanged: TS7ProSimPLCSimStateChanged; FOnPauseStateChanged: TS7ProSimPauseStateChanged; FOnScanModeChanged: TS7ProSimScanModeChanged; FIntf: IS7ProSim; {$IFDEF LIVE_SERVER_AT_DESIGN_TIME} FProps: TS7ProSimProperties; function GetServerProperties: TS7ProSimProperties; {$ENDIF} function GetDefaultInterface: IS7ProSim; protected procedure InitServerData; override; procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Connect; override; procedure ConnectTo(svrIntf: IS7ProSim); procedure Disconnect; override; procedure ReadOutputImage(StartIndex: Integer; ElementsToRead: Integer; DataType: ImageDataTypeConstants; var pData: OleVariant); procedure WriteInputImage(StartIndex: Integer; var pData: OleVariant); procedure ReadOutputPoint(ByteIndex: Integer; BitIndex: Integer; DataType: PointDataTypeConstants; var pData: OleVariant); procedure WriteInputPoint(ByteIndex: Integer; BitIndex: Integer; var pData: OleVariant); procedure ExecuteSingleScan; procedure Connect1; procedure Disconnect1; procedure BeginScanNotify; procedure EndScanNotify; procedure ExecuteNmsScan(MsNumber: Integer); procedure ExecuteNScans(NScanNumber: Integer); function GetScanMode: ScanModeConstants; procedure SetScanMode(newVal: ScanModeConstants); procedure Pause; procedure Continue; function GetPauseState: PauseStateConstants; procedure SavePLC(const FileName: WideString); procedure HotStartWithSavedValues(val: Integer); function GetState: WideString; procedure SetState(const newVal: WideString); procedure StartPLCSim(const plcFile: WideString); procedure SetStartUpSwitch(postion: RestartSwitchPositionConstants); function GetStartUpSwitch: RestartSwitchPositionConstants; procedure ReadDataBlockValue(BlockNum: Integer; ByteIndex: Integer; BitIndex: Integer; DataType: PointDataTypeConstants; var pData: OleVariant); procedure WriteDataBlockValue(BlockNum: Integer; ByteIndex: Integer; BitIndex: Integer; var pData: OleVariant); procedure ReadFlagValue(ByteIndex: Integer; BitIndex: Integer; DataType: PointDataTypeConstants; var pData: OleVariant); procedure WriteFlagValue(ByteIndex: Integer; BitIndex: Integer; var pData: OleVariant); procedure ConnectExt(InstanceNumber: Integer); procedure StartPLCSimExt(const plcFile: WideString); property DefaultInterface: IS7ProSim read GetDefaultInterface; published {$IFDEF LIVE_SERVER_AT_DESIGN_TIME} property Server: TS7ProSimProperties read GetServerProperties; {$ENDIF} property OnScanFinished: TS7ProSimScanFinished read FOnScanFinished write FOnScanFinished; property OnConnectionError: TS7ProSimConnectionError read FOnConnectionError write FOnConnectionError; property OnPLCSimStateChanged: TS7ProSimPLCSimStateChanged read FOnPLCSimStateChanged write FOnPLCSimStateChanged; property OnPauseStateChanged: TS7ProSimPauseStateChanged read FOnPauseStateChanged write FOnPauseStateChanged; property OnScanModeChanged: TS7ProSimScanModeChanged read FOnScanModeChanged write FOnScanModeChanged; end; {$IFDEF LIVE_SERVER_AT_DESIGN_TIME} // *********************************************************************// // OLE Server Properties Proxy Class // Server Object : TS7ProSim // (This object is used by the IDE's Property Inspector to allow editing // of the properties of this server) // *********************************************************************// TS7ProSimProperties = class(TPersistent) private FServer: TS7ProSim; function GetDefaultInterface: IS7ProSim; constructor Create(AServer: TS7ProSim); protected public property DefaultInterface: IS7ProSim read GetDefaultInterface; published end; {$ENDIF} procedure Register; resourcestring dtlServerPage = 'ActiveX'; dtlOcxPage = 'ActiveX'; |
#6
|
|||
|
|||
Код:
implementation uses ComObj; class function CoS7ProSim.Create: IS7ProSim; begin Result := CreateComObject(CLASS_S7ProSim) as IS7ProSim; end; class function CoS7ProSim.CreateRemote(const MachineName: string): IS7ProSim; begin Result := CreateRemoteComObject(MachineName, CLASS_S7ProSim) as IS7ProSim; end; procedure TS7ProSim.InitServerData; const CServerData: TServerData = ( ClassID: '{83CC0D83-FEDA-11D1-BE76-0060B06816CF}'; IntfIID: '{83CC0D81-FEDA-11D1-BE76-0060B06816CF}'; EventIID: '{83CC0D82-FEDA-11D1-BE76-0060B06816CF}'; LicenseKey: nil; Version: 500); begin ServerData := @CServerData; end; procedure TS7ProSim.Connect; var punk: IUnknown; begin if FIntf = nil then begin punk := GetServer; ConnectEvents(punk); Fintf:= punk as IS7ProSim; end; end; procedure TS7ProSim.ConnectTo(svrIntf: IS7ProSim); begin Disconnect; FIntf := svrIntf; ConnectEvents(FIntf); end; procedure TS7ProSim.DisConnect; begin if Fintf <> nil then begin DisconnectEvents(FIntf); FIntf := nil; end; end; function TS7ProSim.GetDefaultInterface: IS7ProSim; begin if FIntf = nil then Connect; Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation'); Result := FIntf; end; constructor TS7ProSim.Create(AOwner: TComponent); begin inherited Create(AOwner); {$IFDEF LIVE_SERVER_AT_DESIGN_TIME} FProps := TS7ProSimProperties.Create(Self); {$ENDIF} end; destructor TS7ProSim.Destroy; begin {$IFDEF LIVE_SERVER_AT_DESIGN_TIME} FProps.Free; {$ENDIF} inherited Destroy; end; {$IFDEF LIVE_SERVER_AT_DESIGN_TIME} function TS7ProSim.GetServerProperties: TS7ProSimProperties; begin Result := FProps; end; {$ENDIF} procedure TS7ProSim.InvokeEvent(DispID: TDispID; var Params: TVariantArray); begin case DispID of -1: Exit; // DISPID_UNKNOWN 1: if Assigned(FOnScanFinished) then FOnScanFinished(Self, Params[0] {OleVariant}); 2: if Assigned(FOnConnectionError) then FOnConnectionError(Self, Params[0] {const WideString}, Params[1] {Integer}); 3: if Assigned(FOnPLCSimStateChanged) then FOnPLCSimStateChanged(Self, Params[0] {const WideString}); 4: if Assigned(FOnPauseStateChanged) then FOnPauseStateChanged(Self, Params[0] {const WideString}); 5: if Assigned(FOnScanModeChanged) then FOnScanModeChanged(Self, Params[0] {const WideString}); end; {case DispID} end; procedure TS7ProSim.ReadOutputImage(StartIndex: Integer; ElementsToRead: Integer; DataType: ImageDataTypeConstants; var pData: OleVariant); begin DefaultInterface.ReadOutputImage(StartIndex, ElementsToRead, DataType, pData); end; procedure TS7ProSim.WriteInputImage(StartIndex: Integer; var pData: OleVariant); begin DefaultInterface.WriteInputImage(StartIndex, pData); end; procedure TS7ProSim.ReadOutputPoint(ByteIndex: Integer; BitIndex: Integer; DataType: PointDataTypeConstants; var pData: OleVariant); begin DefaultInterface.ReadOutputPoint(ByteIndex, BitIndex, DataType, pData); end; procedure TS7ProSim.WriteInputPoint(ByteIndex: Integer; BitIndex: Integer; var pData: OleVariant); begin DefaultInterface.WriteInputPoint(ByteIndex, BitIndex, pData); end; procedure TS7ProSim.ExecuteSingleScan; begin DefaultInterface.ExecuteSingleScan; end; procedure TS7ProSim.Connect1; begin DefaultInterface.Connect; end; procedure TS7ProSim.Disconnect1; begin DefaultInterface.Disconnect; end; procedure TS7ProSim.BeginScanNotify; begin DefaultInterface.BeginScanNotify; end; procedure TS7ProSim.EndScanNotify; begin DefaultInterface.EndScanNotify; end; procedure TS7ProSim.ExecuteNmsScan(MsNumber: Integer); begin DefaultInterface.ExecuteNmsScan(MsNumber); end; procedure TS7ProSim.ExecuteNScans(NScanNumber: Integer); begin DefaultInterface.ExecuteNScans(NScanNumber); end; function TS7ProSim.GetScanMode: ScanModeConstants; begin Result := DefaultInterface.GetScanMode; end; procedure TS7ProSim.SetScanMode(newVal: ScanModeConstants); begin DefaultInterface.SetScanMode(newVal); end; procedure TS7ProSim.Pause; begin DefaultInterface.Pause; end; procedure TS7ProSim.Continue; begin DefaultInterface.Continue; end; function TS7ProSim.GetPauseState: PauseStateConstants; begin Result := DefaultInterface.GetPauseState; end; procedure TS7ProSim.SavePLC(const FileName: WideString); begin DefaultInterface.SavePLC(FileName); end; procedure TS7ProSim.HotStartWithSavedValues(val: Integer); begin DefaultInterface.HotStartWithSavedValues(val); end; function TS7ProSim.GetState: WideString; begin Result := DefaultInterface.GetState; end; procedure TS7ProSim.SetState(const newVal: WideString); begin DefaultInterface.SetState(newVal); end; procedure TS7ProSim.StartPLCSim(const plcFile: WideString); begin DefaultInterface.StartPLCSim(plcFile); end; procedure TS7ProSim.SetStartUpSwitch(postion: RestartSwitchPositionConstants); begin DefaultInterface.SetStartUpSwitch(postion); end; function TS7ProSim.GetStartUpSwitch: RestartSwitchPositionConstants; begin Result := DefaultInterface.GetStartUpSwitch; end; procedure TS7ProSim.ReadDataBlockValue(BlockNum: Integer; ByteIndex: Integer; BitIndex: Integer; DataType: PointDataTypeConstants; var pData: OleVariant); begin DefaultInterface.ReadDataBlockValue(BlockNum, ByteIndex, BitIndex, DataType, pData); end; procedure TS7ProSim.WriteDataBlockValue(BlockNum: Integer; ByteIndex: Integer; BitIndex: Integer; var pData: OleVariant); begin DefaultInterface.WriteDataBlockValue(BlockNum, ByteIndex, BitIndex, pData); end; procedure TS7ProSim.ReadFlagValue(ByteIndex: Integer; BitIndex: Integer; DataType: PointDataTypeConstants; var pData: OleVariant); begin DefaultInterface.ReadFlagValue(ByteIndex, BitIndex, DataType, pData); end; procedure TS7ProSim.WriteFlagValue(ByteIndex: Integer; BitIndex: Integer; var pData: OleVariant); begin DefaultInterface.WriteFlagValue(ByteIndex, BitIndex, pData); end; procedure TS7ProSim.ConnectExt(InstanceNumber: Integer); begin DefaultInterface.ConnectExt(InstanceNumber); end; procedure TS7ProSim.StartPLCSimExt(const plcFile: WideString); begin DefaultInterface.StartPLCSimExt(plcFile); end; {$IFDEF LIVE_SERVER_AT_DESIGN_TIME} constructor TS7ProSimProperties.Create(AServer: TS7ProSim); begin inherited Create; FServer := AServer; end; function TS7ProSimProperties.GetDefaultInterface: IS7ProSim; begin Result := FServer.DefaultInterface; end; {$ENDIF} procedure Register; begin RegisterComponents(dtlServerPage, [TS7ProSim]); end; end. |
#7
|
||||
|
||||
целиком бы не помешало прикрепить
Пишу программы за еду. __________________ |
#8
|
|||
|
|||
здесь ограничение на количество символов. Можно скопировать (в блокнот или Delphi) подряд эти куски.
|
#9
|
||||
|
||||
так если попробовать?
Код:
unit Unit1; interface uses S7PROSIMLib_TLB, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure S7ProSimConnectionError(ASender: TObject; const ControlEngine: WideString; Error: Integer); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var S7ProSim: TS7ProSim; begin S7ProSim:=TS7ProSim.Create(Self); S7ProSim.OnConnectionError:=S7ProSimConnectionError; S7ProSim.Connect; S7ProSim.SetScanMode(ContinuousScan); S7ProSim.SetState('RUN'); end; procedure TForm1.S7ProSimConnectionError(ASender: TObject; const ControlEngine: WideString; Error: Integer); begin // обработчик OnConnectionError end; end. Пишу программы за еду. __________________ |
#11
|
||||
|
||||
таким образом работает?
Код:
uses S7PROSIMLib_TLB, var S7ProSim: IS7ProSim; begin S7ProSim:=CreateComObject(CLASS_S7ProSim) as IS7ProSim; S7ProSim.Connect; S7ProSim.SetScanMode(ContinuousScan); S7ProSim.SetState('RUN'); end; Пишу программы за еду. __________________ |
#12
|
|||
|
|||
Так работает (это я тоже раньше пробовал).
Ещё заметил, что команда записи входов (WriteInputImage) ничего не делает,а команда чтения выходов (ReadOutputImage) выдаёт пустые значения, но если сделать Connect, то всё получается. Кстати, это я тоже видел на одном примере (чтение / запись шли в событии OnTimer и каждый раз Connect). Почему бы это? Последний раз редактировалось AlexSku, 24.03.2011 в 11:19. |
#13
|
||||
|
||||
прикрутить события можно так попробовать:
Код:
uses InterfacedObjectDispatch, S7PROSIMLib_TLB, ComObj, type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } procedure InvokeEvent(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer); public { Public declarations } end; procedure TForm1.Button1Click(Sender: TObject); var S7ProSim: IS7ProSim; FEventsConnection: Integer; FEventDispatch: TInterfacedObjectDispatch; begin FEventDispatch:=TInterfacedObjectDispatch.Create; FEventDispatch.OnInvokeEvent:=InvokeEvent; S7ProSim:=CreateComObject(CLASS_S7ProSim) as IS7ProSim; InterfaceConnect(S7ProSim, IID_IS7ProSimEvents, FEventDispatch, FEventsConnection); S7ProSim.Connect; S7ProSim.SetScanMode(ContinuousScan); S7ProSim.SetState('RUN'); // для отключения обработчика // InterfaceDisconnect(S7ProSim, IID_IS7ProSimEvents, FEventsConnection); end; procedure TForm1.InvokeEvent(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer); begin // события case DispID of 1: begin // OnScanFinished end; 2: begin // OnConnectionError end; 3: begin // OnPLCSimStateChanged end; 4: begin // OnPauseStateChanged end; 5: begin // OnScanModeChanged end; end; end; а чего там с Connect я вообще понятия не имею что такое S7ProSim Пишу программы за еду. __________________ |
#14
|
|||
|
|||
Нет, не вызывается InvokeEvent. Пробовал разные комбинации (может, и не все). Как соберусь с силами, попробую какой-то другой интерфейс (IConnectionPoint что-ли).
|
#15
|
||||
|
||||
еще вариант. пробовал на похожем объекте:
Код:
unit Unit1; interface uses InterfacedObjectDispatch, S7PROSIMLib_TLB, ComObj, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } procedure InvokeEvent(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer); public { Public declarations } S7ProSim: IS7ProSim; FEventDispatch: TInterfacedObjectDispatch; FEventsConnection: Longint; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var punk: IUnknown; begin FEventDispatch:=TInterfacedObjectDispatch.Create(InvokeEvent, IS7ProSimEvents); punk:=CreateComObject(CLASS_S7ProSim); InterfaceConnect(punk, IS7ProSimEvents, FEventDispatch, FEventsConnection); S7ProSim:=punk as IS7ProSim; S7ProSim.Connect; S7ProSim.SetScanMode(ContinuousScan); S7ProSim.SetState('RUN'); // завершение работы // InterfaceDisconnect(S7ProSim, IID_IS7ProSimEvents, FEventsConnection); // FEventDispatch.Free; end; procedure TForm1.InvokeEvent(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer); begin // события case DispID of 1: begin // OnScanFinished end; 2: begin Memo1.Text:='close'; // OnConnectionError end; 3: begin // OnPLCSimStateChanged end; 4: begin // OnPauseStateChanged end; 5: begin // OnScanModeChanged end; end; end; end. InterfacedObjectDispatch.pas: http://data.cod.ru/94902 Пишу программы за еду. __________________ |