Array in die SPS schreiben oder aus der SPS lesen

Systemvoraussetzungen:

Benutzen Sie die für bestimmte Datentypen "aufgelösten" Methoden. Wenn Sie z. B. ein Array in der SPS vom Typ INT lesen wollen, können, abhängig von der Zugriffsart, z. B. folgende Methoden benutzt werden:

AdsSyncReadIntegerVarReq( hVar : Integer, length : Integer, var pData : Smallint )

AdsSyncReadIntegerReq( indexGroup : Integer, indexOffset : Integer, length : Integer, var pData : Smallint )

AdsSyncWriteIntegerVarReq(hVar : Integer, length : Integer, var pData : Smallint )

AdsSyncWriteIntegerReq(  indexGroup : Integer, indexOffset : Integer, length : Integer, var pData : Smallint  )

AdsReadIntegerReq( nInvokeId : Integer, nIndexGroup : Integer, nIndexOffset : Integer, cbLength : Integer )

AdsWriteIntegerReq( nInvokeId : Integer, nIndexGroup : Integer, nIndexOffset : Integer, cbLength : Integer, var pData : Smallint  )

Auf String-Arrays kann auf diese Weise nicht zugegriffen werden. Die Länge der Daten, die gelesen oder geschrieben werden sollen, ergibt sich aus der Anzahl der zu lesenden oder zu schreibenden Elemente, multipliziert mit der Byte-Größe eines Elementes.  Diese Länge muss in dem length- oder cbLength-Parameter übergeben werden. Über den Parameter pData wird das erste Element des Delphi-Arrays übergeben. 

Beispiel:

PROGRAM MAIN
VAR
    varIntArray :ARRAY[1..9] OF INT:=9(1);
END_VAR

Delphi 6 Programm:

Array aus der SPS lesen:

procedure TForm1.SyncReadArrayVarButtonClick(Sender: TObject);
var i, hVar, AdsResult:integer;
    varIntArray       : ARRAY[1..9] OF Smallint;
begin
    AdsResult := AdsOcx1.AdsCreateVarHandle( 'MAIN.VARINTARRAY', hVar );
    if AdsResult = 0 then
    begin
    AdsResult := AdsOcx1.AdsSyncReadIntegerVarReq( hVar, sizeof(varIntArray), varIntArray[1] );
    if AdsResult = 0 then
    begin
        ListBox1.Clear();
        for i:=1 to 9 do
        ListBox1.Items.Add( Format('varIntArray[%d] = %d', [i, varIntArray[i]] ) );
    end
    else Label1.Caption := Format('AdsSyncReadIntegerVarReq error:%d', [AdsResult] );
    AdsOcx1.AdsDeleteVarHandle( hVar );
    end
    else Label1.Caption := Format('AdsCreateVarHandle error:%d', [AdsResult] );
end;

Array in die SPS schreiben:

procedure TForm1.SyncWriteArrayVarButtonClick(Sender: TObject);
var i, hVar, AdsResult:integer;
    varIntArray       : ARRAY[1..9] OF Smallint;
begin
    for i:=1 to 9 do
    varIntArray[i] := i;

    AdsResult := AdsOcx1.AdsCreateVarHandle( 'MAIN.VARINTARRAY', hVar );
    if AdsResult = 0 then
    begin
    AdsResult := AdsOcx1.AdsSyncWriteIntegerVarReq( hVar, sizeof(varIntArray), varIntArray[1] );
    if AdsResult > 0 then
        Label1.Caption := Format('AdsSyncWriteIntegerVarReq error:%d', [AdsResult] );
    AdsOcx1.AdsDeleteVarHandle( hVar );
    end
    else Label1.Caption := Format('AdsCreateVarHandle error:%d', [AdsResult] );
end;

Sprache / IDE

Beispielprogramm auspacken

Delphi XE2

Sample03.exe

Delphi 6 oder höher (classic)