String in die SPS schreiben oder aus der SPS lesen
Systemvoraussetzungen:
- Delphi 7.0 oder höher;
- TwinCAT v2.11 Build 2034 oder höher;
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 | |
Delphi 7 oder höher (classic) |