B&R Strukturen und deren Elemente vergleichen

Ronny1981

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Ich habe folgendes Problem:

ich möchte sehr gern nach einem Import eines Rezeptes über mappRecipe und RegPar die Parameter auf über-/ unterschreiten von Grenzwerte prüfen und ggf. einen Default Wert setzen.
Hierzu habe ich folgende Strukturen:

Rezept_TMP.Parametersatz_1.Par1 ( Bool)
Rezept_TMP.Parametersatz_1.Par2 ( UDINT)
Rezept_TMP.Parametersatz_1.Par3 ( INT)
Rezept_TMP.Parametersatz_2.Par1 ( INT)

Rezept_STD.Parametersatz_1.Par1 ( Bool)
Rezept_STD.Parametersatz_1.Par2 ( UDINT)
Rezept_STD.Parametersatz_1.Par3 ( INT)
Rezept_STD.Parametersatz_2.Par1 ( INT)

Rezept_GWO.Parametersatz_1.Par1 ( Bool)
Rezept_GWO.Parametersatz_1.Par2 ( UDINT)
Rezept_GWO.Parametersatz_1.Par3 ( INT)
Rezept_GWO.Parametersatz_2.Par1 ( INT)

Rezept_GWU.Parametersatz_1.Par1 ( Bool)
Rezept_GWU.Parametersatz_1.Par2 ( UDINT)
Rezept_GWU.Parametersatz_1.Par3 ( INT)
Rezept_GWU.Parametersatz_2.Par1 ( INT)

Diese Strukturen sind identisch aufgebaut.


Nach dem Laden des Rezeptes stehen die Daten in der Rezept_TMP Strukur.
Nun möchte ich über eine Schleife (habe ca. 200 Parameter zu Prüfen) die Temp Werte mit den GWU und GWO Werten vergleichen und beim über- / unterschreiten
der Grenzwerte den entsprechenden STD Wert setzen.

Mitt "ADR" bekomme ich die jeweilige Adresse der Struktur im Speicher und über "SIZEOFF" auch deren Größe.
Wie kann ich jetzt die Anzahl der Elemente bestimmen (bestimmt mir ja die Anzahl der Schleifendurchläufe) und dann in der Schleife auf deren Werte zugreifen (fürs Vergleichen).

Des weiteren würde mich interessieren, wie ich den Variablennamen der aktuell geladenen Variablen aus der TMP Struktur, dann in einen String umkopieren kann.

Ich habe schon mal die Sys_Lib angeschaut, finde dort allerdings keinen so rechten Ansatz für mein Problem.
Arbeiten aktuell mit dem AS4.2.5 und programmieren in ST.

Ich bin für jeden Ansatz dankbar, da ich es eigentlich nicht mit 200 If/Elsif Anweisungen realisieren möchte.
Man will sich ja auch weiter entwickeln :)


Mit Besten Grüßen
Ronny
 
Zuletzt bearbeitet:
Kenne die Recept Read Routine nicht.
Kannst du den Datensatz nicht als Array anlegen und laden. Zumindest beim Lesen des Datensatzen muß die Info über die Anzahl der gelesenen Daten bekommen.

Hast du dir im sys_lib auch die variable services angesehen (PV_ident.....). Hier bekommt man Infos über die Variablen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der komplette Datensatz wird aus einer CSV Datei geladen. Leider möchte der Kunde nicht, dass der Datensatz als Array hinterlegt wird.
Werde mir mal den Funktionsblock PV_Ident anschauen.
Danke.
 
Zuletzt bearbeitet:
Hallo Ronny

Eine Struktur zerpflücken geht mit der SysLib sehr gut. Du brauchst als Startpunkt einzig einen PV Namen.

Wenn du also mit "task:Rezept_TMP" startest, findest du mit der Funktion "PV_ninfo()" heraus, ob es sich um eine Struktur handelt und wie viele Felder sie beinhaltet.
Mit der Funktion "PV_item()" findest du dann die Namen deiner Strukturfelder. Diese bastelst du hinter deinen Startnamen und entscheidest dann mit "PV_ninfo()" wie weiter vorzugehen ist.

Das ganze lässt sich also wunderbar mit einer rekursiven Funktion lösen. Wenn du bei einem Feld angekommen bist, welches kein Array und auch keine Struktur mehr ist, ermittelst du mit "PV_xgetadr()" seine Adresse und accessierst sie mit dem entsprechenden Datentyp. Mit dem Adressoffset zu deiner Startvariable ("task:Rezept_TMP") weisst du auch bereits, wo relativ zur Startadresse von "Rezept_GWO", "Rezept_GWU" und "Rezept_STD" deine Referenzdaten liegen.

Viel Erfolg
Ulumulu1510
 
Hallo

nach dieser möglichen Vorgehensweise habe ich gesucht. Das es diese Funktionen gibt, war mir bekannt. Allerdings wusste ich nicht, in welcher Reihenfolge diese anzuwenden sind und vor allem welche Funktionen ich genau für mein Fall brauche.
Von daher vielen Dank. Werde mir mal den beschriebenen Ablauf genauer anschauen und mich dann an die Umsetzung wagen ;)


Gruß Ronny
 
Zuletzt bearbeitet:
Zurück
Oben