PascalScada - schreiben in eigenes Array

Rund um die LCL und andere Komponenten
Antworten
Vbxler
Beiträge: 125
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

PascalScada - schreiben in eigenes Array

Beitrag von Vbxler »

Hallo Leute,

ich habe diese Frage bereits im englischsprachigen Forum gestellt,
aber noch keine Antwort erhalten, daher will ich es auch hier versuchen.

Ich erforsche gerade PascalScada und bin in der Lage einige Byte von
einer S7-300 aus einem Datenbaustein auszulesen und auf einem THMIEdit
Control auszugeben. Funktioniert soweit ganz gut.

Ich würde jetzt gerne einen Block von Byte aus der Steuerung auslesen und
in einem Array von Byte, welches ich selbst deklariere, zu schreiben.
Ich habe keinen direkten Weg erkannt, wie ich das machen kann.

Danke für jeden Hinweis zur Spurensuche.
Vbxler
-------------------------

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: PascalScada - schreiben in eigenes Array

Beitrag von fliegermichl »

Geht es jetzt um das Auslesen des Gerätes oder um das Array mit Bytes?

Für den 2. Fall gibt es 2 Möglichkeiten
Wenn die Anzahl an Bytes bekannt und fix ist, so deklariert man ein statisches Array

Code: Alles auswählen

 
var ba : array[1..50] of Byte;
    i : integer;
begin
 for i := 1 to 50 do ba[i] := LeseEinByte();
end;
 


Wenn hingegen die Anzahl der Bytes variabel ist, so kann man ein dynamisches Array verwenden.

Code: Alles auswählen

 
var ba : array of byte;
    i : integer;
begin
 SetLength(ba, Ermittle_Groesse_der_Daten);
 for i := Low(ba) to High(ba) do
  ba[i] := LeseEinByte();
end;
 

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: PascalScada - schreiben in eigenes Array

Beitrag von af0815 »

Einen PLCBlock nehmen und den verwenden. Dann ValueRaw die Werte setzen bzw. lesen. Achtung du musst berücksichtigen das PascalSCADA mit Double-Werten arbeitet. Mit Read und WriteDirect die Werte dann holen oder schreiben.
Oder du Mappst den Block auf TPLCBlockelement (was ich meistens im Programm mache, nicht im Designer).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Vbxler
Beiträge: 125
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: PascalScada - schreiben in eigenes Array

Beitrag von Vbxler »

Danke für die Antworten,

ich werde das mit ValueRaw mal versuchen.
Vbxler
-------------------------

Vbxler
Beiträge: 125
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: PascalScada - schreiben in eigenes Array

Beitrag von Vbxler »

Hallo af0815,

nachdem ich die Swap-Funktionen ausgeschaltet und den TagType auf pttByte umgestellt habe,
kann ich jetzt mit 'DataModule1.DB10_DBB20.Value' auf die einzelnen Byte zugreifen.
Das Umschachteln der Byte bei Datentypen, die größer als ein Byte sind,mache ich in eigenen Funktionen (ByteToSingle, ....).

Könntest du mir bitte ein kleines Code-Beispiel geben, wie du eine Instanz von TPLCBlockElement während
der Laufzeit erstellst und verwendest?
Derzeit erzeuge ich die Instanzen zur Designzeit, was auch funktioniert, aber es würde mich interessieren wie das geht.

Auffallend ist auf einem Linux OS, dass, obwohl die PLCBlock.RefreshTime := 1500; beträgt, die CPU-Last auf 100% geht.
Ich werde mal versuchen, wie sich das auf einem Rechner mit Win-OS aussieht.

Leider gibt es zu dieser Komponente überhaupt keinerlei Doku.
Jedenfalls habe ich noch nichts brauchbares gefunden.

Danke für deine Hilfe!
Vbxler
-------------------------

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: PascalScada - schreiben in eigenes Array

Beitrag von af0815 »

Wenn der Block zu Beispiel SPSBlock1 heisst

Code: Alles auswählen

 
// irgendwo im Objekt
  ...
private
  Element1, Element2 : TPLCBlockElement;
  MyInt : integer;
  ....
 
// Erzeugen geht so (Ev. im Create)
  Element1 := TPLCBlockElement.Create(nil);
  Element1.PLCBlock:= MySPSBlock;
  Element1.Index:=0;
  Element2 := TPLCBlockElement.Create(nil);
  Element2.PLCBlock:= MySPSBlock;
  Element2.Index:=1;
 
  MyInt := trunc(Element1.Value)// Wennst du den Inhalt in eine integervariable schreiben willst
 
 
// Freigeben (meist in Destroy)
  Element2.Free;
  Element1.Free;
 
 

Statt einzelnen Elementen kann man das natürlich auch mit Array of TPLCBlockelement machen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Vbxler
Beiträge: 125
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: PascalScada - schreiben in eigenes Array

Beitrag von Vbxler »

Besten Dank,

das funktioniert bestens, jetzt werde ich mich mal
in diese Komponente einarbeiten.
Wenn noch weitere Fragen auftauchen sollten wäre es toll,
wenn ich mich nochmals an Sie wenden dürfte.
Vbxler
-------------------------

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: PascalScada - schreiben in eigenes Array

Beitrag von af0815 »

Null Problemo. Ich arbeite sehr viel damit.

Allgemein ist es egal welche Komponente man verwendet, das Prinzip ist immer gleich. Ich kann nur empfehlen einmal eine Komponent selbst zu erstellen, damit wird das Prinzip noch mehr verinnerlicht :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten