Array für Histogramm

Zuviel Werbung?
-> Hier kostenlos registrieren
Für die Datenreihe bietet sich ja geradezu ein zweidimensionales Array an.
Damit kann man dann z.B. 20 Messreihen mit je 100 Messwerten erfassen.
Das Problem ist nun aber das Histogramm das bei mir ums Verrecken keinen Zugriff auf einen Teil des Array macht.

An der Vorgehensweise ist überhaupt nichts auszusetzen und gerade für diese Sachen sind Pointer gemacht. Aber ich will trotzdem noch auf eine zweite Möglichkeit der Array-Deklaration hinweisen, mit der man hier vielleicht das erreicht was Zotos gerne möchte.

Code:
PROGRAM PLC_PRG
VAR
    MyArray : ARRAY[0..19] OF ARRAY [0..99] OF REAL;
    MyArray1 : ARRAY[0..19] OF REAL;
    i : INT;     (* aktuelle Messreihe *)
    x :INT;  (* aktueller Messpunkt *)
END_VAR

(* Die FOR-Schleife ist nur zum testen damit da Daten reinkommen *)
FOR x := 0 TO 99 DO
 MyArray[i][x] :=  MyArray[i][x] + 0.1; (*zweimaliger Indexzugriff*)
END_FOR;

MyArray1 := MyArray[i]; (* Kopiere Messreihe i: Deutlich langsamer als Pointerzuweisung !!*)
Ich habe es nicht ausprobiert, aber das sollte auch funktionieren.
 
Code:
    MyArray : ARRAY[0..19] OF ARRAY [0..99] OF REAL;
@Werner:
Danke für den Hinweis ... den Trick kannte ich noch nicht und der funktioniert auch in SCL ... und das ermöglicht mir einen Programm-Code in einer Aufgabenstellung eleganter zu gestalten bei dem ich mich aktuell anders beholfen habe ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok.. Jetzt wird´s mir deutlich zu hoch:

Wenn ich es nur einkopiere, erhalte ich in Codesys die Fehlermeldung:
Fehler 4010:History_03 (24): Unverträgliche Typen: Kann 'Array [0..] OF REAL' nicht in 'ARRAY [9..19] OF REAL' konvertieren.

Sehe ich das richtig, dass es sich hierbei um ein "verschachteltes" Array handelt?


@Zotos: Ich hatte mich mehr auf Deinen Code mit dem zweidimensionalen Array bezogen.

Ich hoffe, es kommt nicht so rüber, dass ich erwarte, dass man ALLES für mich macht, aber aktuell kann ich nur kleine Trippelschritte machen und noch muss man mir leider alles vorkauen.
Ich weiss selber, wie anstrengend es ist, wenn man immer wieder das gleiche runterbetet, und der dem man es erklärt.,immer wieder mit dem selben Problem ankommt, ohne zu lernen.
Ich möchte ja lernen, und es stört mich selber, Euch mit so´nem Kleinsch... zu behelligen. Ich wüsste nur nicht, wo und wie ich die Fragen besser anbringen kann.
Da bitte ich ehrlich um Verständnis.

Es ist noch kein Autodidakt vom Himmel gefallen.. ;-)
Daher fragte ich ja nach Infos für Dummies, in denen ich erst mal weiter lernen/lesen kann, ohne Eure Ressourcen zu verschwenden.

Verstehe weder, was Du in Deinem Array-Code machst, geschweige denn, das Werner da schreibt.
Und daher wüsste ich eben gerne, wie ich diese Code-Teile bei mir mit Daten belegen kann, um zu sehen, wie es läuft.

Gruss

McNugget
 
Code:
    MyArray : ARRAY[0..19] OF ARRAY [0..99] OF REAL;
@Werner:
Danke für den Hinweis ... den Trick kannte ich noch nicht und der funktioniert auch in SCL ... und das ermöglicht mir einen Programm-Code in einer Aufgabenstellung eleganter zu gestalten bei dem ich mich aktuell anders beholfen habe ...

Gruß
LL
Ach du scheisse, habe ich jetzt unbeabsichtigt Hilfestellung für Siemens Programmierer gegeben?

@McNugget: Es funktioniert, wenn du die Dimensionen vertauschst
MyArray : ARRAY [0..99] OF ARRAY [0..19] OF REAL;
MyArray1 : ARRAY[0..19] OF REAL;
Es ist zugegebenermassen verwirrend.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@McNugget:
Das was du in Werner's Code nicht verstehst ist, dass ST (und auch SCL) gleich ganze Strukturen oder Datenblöcke mit gleichem Aufbau quasi in einem Rutsch von einem Element an das andere übergeben kann. Letztlich wird zwar Element für Element übergeben - aber das läuft intern.
Code:
PROGRAM PLC_PRG
VAR
    MyArray : ARRAY[0..19] OF ARRAY [0..99] OF REAL;
    MyArray1 : ARRAY[0..99] OF REAL;
    i : INT;     (* aktuelle Messreihe *)
    x :INT;  (* aktueller Messpunkt *)
END_VAR

MyArray[i] := MyArray1;
Im korrigierten Beispiel von Werner :
Das MyArray1 ist genau gleich aufgebaut wie der 2.Teil der Deklaration von MyArray. Deshalb kannst du das Unter-Element so übergeben.

Gruß
LL
 
Guten Morgen Larry,

das hatte ich in Groben Zügen verstanden.

Was nach wie vor meine Frage ist:

Wie belege ich das Array mit REAL-Werten?

Wie gebe ich die ein, dass sie abgelegt werden?

Gruss

McNugget
 
Hallo Mac,
kann sein, das ich irgendwo etwas überlesen haben ... deswegen (vielleicht noch einmal) die Frage : Woher kommen die Werte, mit denen du das Array füllen möchtest. Das mit dem Trigger und dem "Schiebe-Register" hatte ich ja in meinem ersten Posting schon mal gebracht ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo LSL. ;-)

Im Prinzip ist in der Diskussion hier die Variable "neue_Daten" aus Deinem ersten Post verschwunden...

Die Werte sind (aktuell noch) einzelne REAL-Werte, die ich von aussen an den Baustein lege.

Sobald der Trigger kommt, sollen der (später die) Wert(e) in das Array geschrieben werden.

Sobald ich mehrere Werte reingebe, möchte ich ein Struct reingeben:
Timestamp; REAL_01;Real_02;..;Real_20;



Gruss

McNugget
 
Zuletzt bearbeitet:
... ich würde dir schon gerne weiterhelfen nur verstehe ich gerade nicht so genau wo es hängt ...

Aber prinzipiell :
Wenn du mehrere Einzelwerte nacheinander in ein ARRAY schreiben willst, so geht das wie in meinem ersten Beispiel. Hier gibt der Trigger den Befehl "Weret übernehmen". Gleichzeitig mußt du den Speicher weiterschieben ... oder aber du merkst dir (für direktes Befüllen) die Position (Index) an die du den letzten Werte geschrieben hast und erhöhst denselben dann für den nächsten Wert usw. ...

Gruß
LL
 
Zurück
Oben