![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Никто не сталкивался с 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 |