PascalScada - schreiben in eigenes Array
-
- Beiträge: 129
- Registriert: Sa 25. Mai 2013, 07:43
- OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
- CPU-Target: 32Bit
PascalScada - schreiben in eigenes Array
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.
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
-------------------------
-------------------------
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- 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
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
Wenn hingegen die Anzahl der Bytes variabel ist, so kann man ein dynamisches Array verwenden.
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;
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;
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- 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
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).
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).
-
- Beiträge: 129
- 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
Danke für die Antworten,
ich werde das mit ValueRaw mal versuchen.
ich werde das mit ValueRaw mal versuchen.
Vbxler
-------------------------
-------------------------
-
- Beiträge: 129
- 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
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!
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
-------------------------
-------------------------
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- 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
Wenn der Block zu Beispiel SPSBlock1 heisst
Statt einzelnen Elementen kann man das natürlich auch mit Array of TPLCBlockelement machen.
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;
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 129
- 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
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.
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
-------------------------
-------------------------
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- 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
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
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).