String in die SPS schreiben oder aus der SPS lesen

Systemvoraussetzungen:

Aufgabe

Ein String soll in die SPS geschrieben oder aus der SPS gelesen werden.

Beschreibung

Damit ein String in die SPS geschrieben oder oder aus der SPS gelesen werden kann, benötigt man die Länge des SPS-Strings. Die tatsächliche Länge eines SPS-Strings kann mit dem SPS-Operator SIZEOF ermittelt werden. In der SPS werden die Strings mit einer Null terminiert und die tatsächliche String-Länge errechnet sich aus der definierten Länge plus 1. Wurde bei der Stringdefinition keine Länge angegeben, dann besitzt der String eine tatsächliche Länge von 81 Zeichen inklusive der abschließenden Null.

SPS-Programm

PROGRAM MAIN
VAR
    strColor    :STRING(10)     :='Blue';
    strState    :STRING(20)     :='STOP';
    strMessage  :STRING         :='TwinCAT ADS-OCX';
END_VAR

 strColor hat die Länge 11 Zeichen;

strState hat die Länge 21 Zeichen;

strMessage hat die Länge 81 Zeichen; 

Delphi 7 Programm

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, ADSOCXLib_TLB, Grids, ValEdit, ComCtrls;

type
  TForm1 = class(TForm)
    btnWrite: TButton;
    AdsOcx1: TAdsOcx;
    Label1: TLabel;
    Edit1: TEdit;
    btnRead: TButton;
    procedure btnReadClick(Sender: TObject);
    procedure btnWriteClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    adsResult   : Integer;// Ads return code
    hVar    : Integer;// PLC variable handle
    varString   : WideString;// PLC variable value
  public
    { Public declarations }
  end;

var
   Form1: TForm1;

implementation

{$R *.dfm}

String aus der SPS lesen

procedure TForm1.btnReadClick(Sender: TObject);
begin
   SetLength(varString, 7 );//Realocate string space to a given length// Read string from PLC 
   adsResult := AdsOcx1.AdsSyncReadStringVarReq( hVar, Length(varString) * 2, varString );
   if  adsResult = 0 then
      edit1.Text := varString
   else ShowMessage( Format( 'AdsSyncReadStringVarReq() error:%d', [adsResult] ) );
end;

In dem oberen Beispiel werden 7 Zeichen eines SPS-Strings in Delphi eingelesen. Die dynamischen String-Typen haben nach der Initialisierung die Länge Null. Damit das ADS-OCX den SPS-String in die Delphi-Stringvariable hineinkopieren kann, muss vorher die Delphi-Stringvariable auf die gewünschte Länge lokiert werden. Eine WideString-Variable in Delphi benötigt zwei Bytes pro Zeichen.  Die  Length-Funktion liefert die lokierte Anzahl der Zeichen im String. Der Length-Parameter im Methodenaufruf benötigt aber die Byte-Länge, deshalb wird die mit Length-Funktion ermittelte Länge verdoppelt. 

String in die SPS schreiben

procedure TForm1.btnWriteClick(Sender: TObject);
begin
   varString := Edit1.Text;
   // Write string to the PLC
   adsResult := AdsOcx1.AdsSyncWriteStringVarReq( hVar, Length(varString)*2, varString );
   if adsResult <> 0 then
      ShowMessage( Format( 'AdsSyncWriteStringVarReq() error:%d', [adsResult] ) );
end; 

Verbindung zur SPS aufbauen, variable handle holen

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Connection Setup
  AdsOcx1.AdsAmsServerNetId := AdsOcx1.AdsAmsServerNetId;
  AdsOcx1.AdsAmsServerPort := 801;

  // Create variable handle
  adsResult := AdsOcx1.AdsCreateVarHandle( 'MAIN.STRMESSAGE', hVar );
  if adsResult <> 0 then
     ShowMessage( Format( 'AdsCreateVarHandle() error:%d', [adsResult] ) );
end; 

Resourcen (variable handle) freigeben

procedure TForm1.FormDestroy(Sender: TObject);
var adsResult : Integer;
begin
   // Delete variable handle
   adsResult := AdsOcx1.AdsDeleteVarHandle( hVar );
   if AdsResult <> 0 then
      ShowMessage( Format( 'AdsDeleteVarHandle() error:%d', [adsResult] ) );
   hVar := 0;
end;
Initialization
   IsMultiThread := True;// Setting this system variable makes Delphi's memory manager thread-safe

end. 

Sprache / IDE

Beispielprogramm auspacken

Delphi XE2

Sample06.exe

Delphi 7 oder höher (classic)