TIA Wie löse ich diese Aufgabe?

Dazai

Level-1
Beiträge
30
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen, ich habe ein paar Fragen zu dieser Aufgabe.

Zunächst einmal denke ich, dass die Variable AS als Eingang deklariert wird. Wie begrenze ich den Ausgang auf den Bereich -26000 bis 26000? Der Ausgang OUT wird wahrscheinlich mit einer Vergleichsfunktion (Größer/Kleiner Baustein) mit den Zahlen -26000 und 26000 verglichen. Muss ich diese 2 Zahlen dann einfach als constant deklarieren? Bei der Vergleichsfunktion wäre der OUT wiederum ein Eingang wenn er mit den Zahlen verglichen wird, deshalb bin ich mir da nicht sicher.
Meine zweite Frage wäre, wie die Variable GW zu definieren ist. Einfach ein Output? Vielen Dank im Voraus für die Hilfe.

1654763853448.png
 
IF AS Then
OUT := INP1 + INP2;
Else
OUT := INP1 - INP:
END_IF;

IF OUT > 26000 or OUT < -26000 THEN
GW := True;
Else
GW := False;
END_IF;

Ich weis jetzt nicht ob die Syntax 100% stimmt aber so oder so ähnlich könntest du das machen.
 
Ja das wäre ja dann von der Logik her das Selbe. Ein Addierbautein der bei "und AS" addiert und ein Subtraktionsbaustein der bei "und nicht AS" subtrahiert. Das Ergebnis jagst du dann durch zwei Vergleicher und setzt dann GW auf "1" wenn die Vergleichswerte unter- bzw. überschritten werden. Falls du den Wert auf die Grenzwerte begrenzen musst, kannst du noch mit einem Move den Max- bzw. Minwert in OUT laden.
 
Geh doch mal ganz in Ruhe an die Aufgabe ran.

Du sollst eine Funktion FC23 erstellen. Also erstelle diesen Baustein.

Dieser hat schon mal 2 Eingänge (INP1 und INP2) an denen INTEGER-Zahler addiert oder subtrahiert werden sollen. Also kennst du schonmal den Datentyp der zwei Eingangsvariablen.
Über ein Signal (AS = Bool) soll der Baustein intern addieren oder subtrahieren. Also macht es ja auch Sinn diesen als Eingang deines FC23 zu deklarieren.

Das Ergebnis der Addition oder Subtraktion soll als Ausgang OUT ausgegeben werden. Den Datentyp kannst du ja erraten :).
Weiterhin soll es einen Alarmausgang (GW) geben. Dieser soll anzeigen ob der Grenzwert verletzt wurde = also ja / nein = TRUE / FALSE = würde sich ja ein BOOL anbieten.

Um dein Rechenergebnis zwischen zu speichern, bevor du es an deinen Ausgang OUT gibst, könntest du eine TEMP-Variable deklarieren. Diese wird mit dem Rechenergebnis beschrieben.

Diese TEMP-Variable kannst du auf größer +26000 oder kleiner -26000 vergleichen. Wenn eines zutrifft = Alarmausgang schalten.
Weiterhin kann du mit der gleichen Auswertung bei z.B. größer+26000 den Wert +26000 auf den Ausgang OUT schreiben, bei kleiner -26000 den Wert -26000 ausgeben. Sollte der Wert im Bereich dazwischen liegen, dann direkt das Ergebnis auf den Ausgang OUT geben. Somit hat du eine Auswertung für die Grenzwertverletzung und gleichzeitig eine Begrenzung des Ausgangswertes.

Die Grenzwerte kannst du einfach als Zahl direkt an deinen Vergleich schreiben. Möchtest du dieses flexibel anpassen, kannst du diese auch als Eingangsvariablen deklarieren um diese später von außen dem Baustein zu übergeben. Das war aber aus der Aufgabenstellung so erstmal nicht gefordert.


-chris
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Beachte:
INT-Wertebereich ist -32768...32767.
Es kann also passieren das der Bereich verletzt wird, welches ein falsches Ergebnis liefern würde. Arbeite intern mit einem DINT
M302.0 müsste eigentlich true sein da das Ergebnis 40000 ist

1654773063539.png
 
@A3Q @volker Sorry dass ich mich nochmal etwas später melde, zunächst einmal vielen Dank für die Hilfe. Ich habe folgenden Weg genommen, ist er richtig? ZE ist der Merker und die Grenzen habe ich in Constant deklariert (wir dürfen sie nicht direkt verwenden).
1655229858043.png


1655229892211.png
 
Beachte noch den Hinweis von Volker.
Weiterhin sollst du ja noch den Ausgangswert begrenzen auf +26000 oder -26000 und nicht nur den Alarm "GW" ausgeben. Somit wird #OUT immer beschrieben.

-chris
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@A3Q Aber ist das nicht mit dem 4. Netzwerk getan? Der Alarm wird nur ausgegeben wenn man sich außerhalb der Grenzen befindet. Oder was verstehe ich da falsch?
Weiterhin sollst du ja noch den Ausgangswert begrenzen auf +26000 oder -26000 und nicht nur den Alarm "GW" ausgeben. Somit wird #OUT immer beschrieben
 
@A3Q Aber ist das nicht mit dem 4. Netzwerk getan? Der Alarm wird nur ausgegeben wenn man sich außerhalb der Grenzen befindet. Oder was verstehe ich da falsch?
Wir reden hier von zwei ganz verschiedenen Dingen:

- Meldung (BOOL), wenn der Wert kleiner Minimalwert oder grösser Maximalwert ist.

- Den eingelesen Wert (INT) ausgeben als INT oder besser DINT, wie Volker vorgeschlagen hat ...
. - begrenzt auf den Minimalwert, wenn der Minwert unterschritten wird oder
. - begrenzt auf den Maximalwert, wenn der Maxwert überschritten wird oder
. - ansonsten unverändert.

Gibt es eigentlich bei KOP keinen LIMIT-Baustein, den man dafür benutzen könnte?

Was macht eigentlich der MOVE, wenn sein EN = False ist? Wird weiterhin der letzte bei EN = True ausgegebene Wert ausgegeben?

Das Thema "Wert begrenzen" kam durch den Beitrag #4 ...
Falls du den Wert auf die Grenzwerte begrenzen musst, kannst du noch mit einem Move den Max- bzw. Minwert in OUT laden.
... erst nachträglich ins Gespräch.
 
Zuletzt bearbeitet:
@A3Q Aber ist das nicht mit dem 4. Netzwerk getan? Der Alarm wird nur ausgegeben wenn man sich außerhalb der Grenzen befindet. Oder was verstehe ich da falsch?

Ach, entschulde. Hatte das mit dem Move ZE>GW übersehen. Ich hatte das so verstanden, der Ausgang GW sollte als Bool verwendet werden um eine Art Alarm auszugeben. Du gibst aber den Wert aus. Hätte ich anders gelöst. Du möchtest ja evtl. später den Ausgang GW auf eine Warn- / Störmeldung legen. Somit wäre ein Bool dort besser. Sonst müsstest du das nachträglich für die Meldung nochmal auswerten.

Und schau dir mal die Variablen an deiner Bausteinschnittstelle an, wo du deinen Baustein aufrufst. Wenn du mal Simulierst mit Werten welche im Bereich sind und dann wieder welche ausserhalb des Bereichs, schaltest du ja die Ausgabe zwischen OUT und GW hin und her. Bleiben am jeweils anderen dann die alten Werte bestehen?


- Den eingelesen Wert (INT) ausgeben als INT oder besser DINT, wie Volker vorgeschlagen hat ...
- begrenzt auf den Minimalwert, wenn der Minwert unterschritten wird oder
- begrenzt auf den Maximalwert, wenn der Maxwert überschritten wird oder
- ansonsten unverändert.

Das hatte ich ihm ja auch schon vorgeschlagen

Diese TEMP-Variable kannst du auf größer +26000 oder kleiner -26000 vergleichen. Wenn eines zutrifft = Alarmausgang schalten.
Weiterhin kann du mit der gleichen Auswertung bei z.B. größer+26000 den Wert +26000 auf den Ausgang OUT schreiben, bei kleiner -26000 den Wert -26000 ausgeben. Sollte der Wert im Bereich dazwischen liegen, dann direkt das Ergebnis auf den Ausgang OUT geben. Somit hat du eine Auswertung für die Grenzwertverletzung und gleichzeitig eine Begrenzung des Ausgangswertes.


Gibt es eigentlich bei KOP keinen LIMIT-Baustein, den man dafür benutzen könnte?

Doch den gibt es unter "Mathematische Funktionen".



Man kann natürlich dem TE eine fertige Lösung geben. Aber mit den Hilfestellungen sollte der TE ja selber auf eine Lösung kommen. Soll ja was dabei lernen :).


-chris
 
Zurück
Oben