Lesen und Schreiben von SPS Variablen

Voraussetzungen:

Dieses Beispiel-Programm demonstriert wie die COM-Schnittstellen der TcAdsDll von Delphi angesprochen werden können, um Variablen aus der SPS zu lesen bzw. in die SPS zu schreiben.

In der FormCreate-Ereignisfunktion wird mit CoTcClient.Create eine Verbindung zum Server auf dem lokalen System aufgebaut. Mit Hilfe der Methode Connect wird dann eine Verbindung zum ersten Laufzeitsystem der  SPS (port 801) auf dem lokalen Rechner (netid = '0.0.0.0.0.0') hergestellt.

Durch Betätigen des Read-Buttons werden die Variablen aus der SPS gelesen und beim Betätigen des Write-Buttons in die SPS geschrieben. 

Lesen und Schreiben von SPS Variablen 1:

Das Delphi Programm

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, TcAdsDll_TLB, OleServer, ComObj;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Bevel1: TBevel;
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
    ads     : ITcAdsSync;
    client  : ITcClient;
    netId   : AmsNetId;
    cbRead  : integer;
    valBool : Byte;     // PLCBoolVar
    valInt  : Smallint; // PLCIntVar
    valDint : Longint;  // PLCDIntVar
    valReal : Single;   // PLCRealVar
    valLReal : Double;  // PLCLRealVar
    valString : AnsiString;// PLCStringVar
  public
    { Public-Deklarationen }
  end;
var
  Form1: TForm1;

implementation
{$R *.DFM}
/////////////////////////////////////////////////////////////////////////
procedure TForm1.FormCreate(Sender: TObject);
begin
    netId.b[0] := 0;  // 172
    netId.b[1] := 0;  // 16
    netId.b[2] := 0;  // 4
    netId.b[3] := 0;  // 23
    netId.b[4] := 0;  // 1
    netId.b[5] := 0;  // 1
    try
    client := CoTcClient.Create;
    try
        OleCheck(client.Connect( netid, 801, ads ));
    except
        ShowMessage('client.Connect() failed!');
    end;
    except
    ShowMessage('CoTcClient.Create() failed!');
    end;
end;
/////////////////////////////////////////////////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);
begin
    SetLength( valString, 256);// make sure the string >= SIZEOF(PLCStringVar) variable
    try
    OleCheck(ads.Read($4020, 0, sizeof(valBool), cbRead, PByte(@valBool)^ ));
    OleCheck(ads.Read($4020, 2, sizeof(valInt), cbRead, PByte(@valInt)^ ));
    OleCheck(ads.Read($4020, 4, sizeof(valDint), cbRead, PByte(@valDint)^ ));
    OleCheck(ads.Read($4020, 8, sizeof(valReal), cbRead, PByte(@valReal)^ ));
    OleCheck(ads.Read($4020, 12, sizeof(valLReal), cbRead, PByte(@valLReal)^ ));
    OleCheck(ads.Read($4020, 100, Length(valString) + 1, cbRead, PByte(@valString[1])^ ));
    except
    ShowMessage('ads.Read(...) failed!');
    end;
    Edit1.Text := IntToStr( valBool );
    Edit2.Text := IntToStr( valInt );
    Edit3.Text := IntToStr( valDint );
    Edit4.Text := FloatToStr( valReal );
    Edit5.Text := FloatToStr( valLReal );
    Edit6.Text := String(valString);
end;
/////////////////////////////////////////////////////////////////////////
procedure TForm1.Button2Click(Sender: TObject);
begin
    valBool := StrToInt( Edit1.Text );
    valInt := StrToInt( Edit2.Text );
    valDint := StrToInt( Edit3.Text );
    valReal := StrToFloat( Edit4.Text );
    valLReal := StrToFloat( Edit5.Text );
    valString := AnsiString( Edit6.Text );
    if valString = '' then
    valString := #00;
    try
    OleCheck(ads.Write($4020, 0, sizeof(valBool), PByte(@valBool)^ ));
    OleCheck(ads.Write($4020, 2, sizeof(valInt), PByte(@valInt)^ ));
    OleCheck(ads.Write($4020, 4, sizeof(valDint), PByte(@valDint)^ ));
    OleCheck(ads.Write($4020, 8, sizeof(valReal), PByte(@valReal)^ ));
    OleCheck(ads.Write($4020, 12, sizeof(valLReal), PByte(@valLReal)^ ));
    OleCheck(ads.Write($4020, 100, Length(valString) + 1, PByte(@valString[1])^));
    except
    ShowMessage('ads.Write(...) failed!');
    end;
end;

initialization
    IsMultiThread := True;

end.

SPS-Programm

PROGRAM MAIN
VAR
  PLCBoolVar AT %MX0.0 : BOOL := TRUE;
  PLCIntVar AT %MB2 : INT := 75;
  PLCDIntVar AT %MB4 : DINT := 43234532;
  PLCRealVar AT %MB8 : REAL := 3.1415;
  PLCLRealVar AT %MB12 : LREAL := 3.141592654;
  PLCStringVar AT %MB100: STRING := '12345';
END_VAR

;

 

Sprache / IDE

Beispielprogram auspacken

Delphi XE2

Sample01.zip

Delphi 5 oder höher (classic)

Sample01.exe