Funktion/Befehl gehe zur nächsten Adresse

Rici

Level-2
Beiträge
128
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Kollegen,

ich bekomme eine Funktion nicht umgesetzt mit CODESYS 3.5
Aufgabe:
Eine Struktur mit unterschiedlichsten Datentypen und Unterstrukturen wobei alle nach Funktionen geordnet sind.
Hier gibt es keinen Muster.
Jede dieser Adressen soll über eine Visu einzeln überschrieben werden können.

Gedankengang:
Die betroffene Struktur mehrfach anlegen.
--------------------------------
Programm_st // Diese wird im Programmteil abgearbeitet
Force_st // Diese werte kommen direkt aus der Visu
Force_soll_aktiv_st // Diese Variable wird aus der Visu geschrieben, damit der Wert der Gleichnamigen Variable aus der Force_st genommen wird
Uebergabe_st // Diese nach dem abarbeiten des Programmteils ausgegeben
------------------------------------------

Uebergabe_st:=Programm_st;

IF Force_soll_aktiv_st.Var_1>1 then
Uebergabe_st.Var_1:=Uebergabe_st.Var_1;
End_IF

Die IF Anweisung müsste mit einer Schleife realisiert werden welche die komplette Struktur abarbeitet. Ich sehe hier jedoch keine Möglichkeit.

MfG Rici
 
wenn deine beiden Strukturen komplett identisch im Aufbau sind dann kannst du sie auch direkt zuweisen - also in etwa so :
Code:
if Force_Aktiv then
   Arbeits_Struktur := Uebergabe_Struktur ;
   Force_Aktiv := False ;
End_If ;
Da ich aus deinen Variablen-Namen nicht so recht schlau geworden bin habe ich mir dann selbst welche erdacht ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Strukturen sind identisch.

Force_Aktiv sollte ebenfalls eine Struktur sein, welche jeder Adresse innerhalb der Struktur sagt ob diese aus der Visu genommen werden soll.
Also es darf nicht die ganze Struktur übergeben werden sondern nur gezielte Adressen von dieser.
 
Hallo,

ich verstehe nicht ganz genau, wie Deine Strukturen aufgebaut sein sollen.
Ich hätte jetzt nach Deinen Ausführungen erwartet, daß Force_soll_aktiv_st nur boolesche Variablen enthält, um die in Force_st enthaltenen Werte zu aktivieren, das paßt aber nicht zu IF Force_soll_aktiv_st.Var_1>1 then.

Ich verstehe aber so richtig, die Komponenten in beiden Struturen die gleichen Namen haben sollen?

Was aber soll Uebergabe_st.Var_1:=Uebergabe_st.Var_1;?
Meinst Du Uebergabe_st.Var_1:=Force_st.Var_1;?

Wenn Du eine Schleife machen willst, kommst Du nicht um Arrays herum. Dann wird Deine Struktur aber flach.
Ich würde auch nicht zwei Strukturen für die Aktivierung und Werte getrennt machen, sondern jeden Force-Wert mit einer Struktur aus Aktiv und Wert repräsentieren.

Code:
STRUCT Force_ST
    Force : BOOL;    // false = SPS, true = HMI
    Value : REAL;    // Wert aus dem HMI, der übernommen wird bei Force = true
END_STRUCT

Var1 : Force_ST;
 
Nachtrag:
Mit der o.g. Struktur könnte man das dann noch verfeinern, um das auch besser nachvollziehbar zu machen und im ganzen Programm durchgängig zu nutzen:

Code:
STRUCT Force_ST
    Force         : BOOL;    // false = SPS, true = HMI
    HMI_Value     : REAL;    // Wert aus dem HMI, der übernommen wird bei Force = true
    PLC_Value    : REAL;       // Wert aus der SPS, der übernommen wird bei Force = false
    Output        : REAL;       // Der genutzte Wert
END_STRUCT

Var1 : Force_ST;

Dann läuft einmal ein FC über das Array und kopiert je nach Force-Zustand entweder HMI_Value oder PLC_Value auf den Output. Im Programm brauchst Du dann nur noch Output benutzen. Beim Debug kann man aber in die Struktur schauen und sieht alle Werte und was passiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Strukturen sind identisch.

Force_Aktiv sollte ebenfalls eine Struktur sein, welche jeder Adresse innerhalb der Struktur sagt ob diese aus der Visu genommen werden soll.
Also es darf nicht die ganze Struktur übergeben werden sondern nur gezielte Adressen von dieser.
Das hieße für jede Variable deiner Struktur müßte es einen Bool geben, der sagt ob sie übernommen werden soll oder nicht ...?
Ich bin jetzt in CodeSys nicht so fit, dass ich sagen könnte ob du über Reflektion (wie bei z.B. .Net möglich) an die Einzel-Elemente der Struktur kommen kannst ohne deren Namen zu wissen. Ich behaupte mal, dass das nicht geht. Das würde nur mit einem Array funktionieren ... (wie von @JSEngineering bereits erwähnt).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das hieße für jede Variable deiner Struktur müßte es einen Bool geben, der sagt ob sie übernommen werden soll oder nicht ...?
Ich bin jetzt in CodeSys nicht so fit, dass ich sagen könnte ob du über Reflektion (wie bei z.B. .Net möglich) an die Einzel-Elemente der Struktur kommen kannst ohne deren Namen zu wissen. Ich behaupte mal, dass das nicht geht. Das würde nur mit einem Array funktionieren ... (wie von @JSEngineering bereits erwähnt).
Ja, für jede Variable müsste es ein bool geben. Da ich jedoch nicht eine neue Struktur schreiben möchte, war hier der Gedanke nach >0 abzufragen. Hiermit würde man auch ein Real erschlagen. Wie es naher in der Visu gemacht werden soll ist erstmal zweitrangig.
 
Nachtrag:
Mit der o.g. Struktur könnte man das dann noch verfeinern, um das auch besser nachvollziehbar zu machen und im ganzen Programm durchgängig zu nutzen:

Code:
STRUCT Force_ST
    Force         : BOOL;    // false = SPS, true = HMI
    HMI_Value     : REAL;    // Wert aus dem HMI, der übernommen wird bei Force = true
    PLC_Value    : REAL;       // Wert aus der SPS, der übernommen wird bei Force = false
    Output        : REAL;       // Der genutzte Wert
END_STRUCT

Var1 : Force_ST;

Dann läuft einmal ein FC über das Array und kopiert je nach Force-Zustand entweder HMI_Value oder PLC_Value auf den Output. Im Programm brauchst Du dann nur noch Output benutzen. Beim Debug kann man aber in die Struktur schauen und sieht alle Werte und was passiert.
Ich habe die Idee hier noch nicht verstanden.

Soll jede Variable in der Struktur (Mit allen Variablen) als Datentyp die von dir vorgeschlagene Struktur bekommen.
Wie würde ich dies mit unterschiedlichen Datentypen machen können?
Bzw. wie kann der FC über alle Adressen laufen. Dieser müsste dann manuell jeder Adresse zugewiesen werden?
 
Zuletzt bearbeitet:
Ja, für jede Variable müsste es ein bool geben. Da ich jedoch nicht eine neue Struktur schreiben möchte, war hier der Gedanke nach >0 abzufragen. Hiermit würde man auch ein Real erschlagen. Wie es naher in der Visu gemacht werden soll ist erstmal zweitrangig.
Naja ... das funktioniert ja auch nicht ...
Du kannst natürlich jede Variable auf ungleich 0 abfragen - das geht ... aber wenn du ein Array of Struct hast (wie von @JSEngineering vorgeschlagen) dann kannst du in dem Array nicht unterschiedliche Strukturen mischen.
Willst du aber unterschiedliche Strukturen haben so klappt es wieder nicht mit der Schleife ...
 
Zurück
Oben