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

 



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.03.2011, 20:19
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию 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  
Старый 23.03.2011, 16:31
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59585
По умолчанию

поздравляю, коллега! с подобным вопросом я пришел на этот форум) как видно ответов небыло скинь TLB.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 23.03.2011, 16:43
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Код:
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;
Нужно как-то написать обработчики к IS7ProSimEvents.
Ответить с цитированием
  #4  
Старый 23.03.2011, 16:45
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Код:
// *********************************************************************//
// 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  
Старый 23.03.2011, 16:46
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Код:
// *********************************************************************//
// 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  
Старый 23.03.2011, 16:47
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Код:
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  
Старый 23.03.2011, 16:48
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59585
По умолчанию

целиком бы не помешало прикрепить
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #8  
Старый 23.03.2011, 16:54
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

здесь ограничение на количество символов. Можно скопировать (в блокнот или Delphi) подряд эти куски.
Ответить с цитированием
  #9  
Старый 23.03.2011, 16:59
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59585
По умолчанию

так если попробовать?
Код:
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.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #10  
Старый 23.03.2011, 18:34
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Пробовал (и раньше тоже). Если используется тип TS7ProSim, то Create (можно и без него) и Connect проходят, а дальше любой метод вызывает ошибку:
error.jpg
Ответить с цитированием
  #11  
Старый 24.03.2011, 11:06
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59585
По умолчанию

таким образом работает?
Код:
uses
  S7PROSIMLib_TLB,

var
  S7ProSim: IS7ProSim;
begin
  S7ProSim:=CreateComObject(CLASS_S7ProSim) as IS7ProSim;
  S7ProSim.Connect;
  S7ProSim.SetScanMode(ContinuousScan);
  S7ProSim.SetState('RUN');
end;
а чтобы написать "обработчик" IS7ProSimEvents его для начала не плохо было бы "прикрутить" к IS7ProSim) ну тут тожа есть вариант.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #12  
Старый 24.03.2011, 11:16
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Так работает (это я тоже раньше пробовал).
Ещё заметил, что команда записи входов (WriteInputImage) ничего не делает,а команда чтения выходов (ReadOutputImage) выдаёт пустые значения, но если сделать Connect, то всё получается. Кстати, это я тоже видел на одном примере (чтение / запись шли в событии OnTimer и каждый раз Connect). Почему бы это?

Последний раз редактировалось AlexSku, 24.03.2011 в 11:19.
Ответить с цитированием
  #13  
Старый 24.03.2011, 12:00
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59585
По умолчанию

прикрутить события можно так попробовать:

Код:
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;
http://data.cod.ru/94750

а чего там с Connect я вообще понятия не имею что такое S7ProSim
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #14  
Старый 24.03.2011, 19:08
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Нет, не вызывается InvokeEvent. Пробовал разные комбинации (может, и не все). Как соберусь с силами, попробую какой-то другой интерфейс (IConnectionPoint что-ли).
Ответить с цитированием
  #15  
Старый 25.03.2011, 09:24
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59585
По умолчанию

еще вариант. пробовал на похожем объекте:
Код:
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
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ



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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter