Digitalen Wahlschalter

der_NooB

Level-2
Beiträge
285
Reaktionspunkte
8
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ihr Lieben,

leider habe ich niemanden außer euch, den ich fragen kann. Danke, dass ihr mir seit mehr als einem Monat helft.

Ich habe einen digitalen Wahlschalter und habe ihn in einen Funktionsbaustein (FB) eingebunden, mit dem Hintergedanken, ihn mehrmals aufzurufen. Allerdings habe ich ihn nur einmal initialisiert, daher macht es nicht viel aus, wie ich meine Eingänge verbunden habe. Nichtsdestotrotz ist es falsch.

Wie kann ich es richtig machen?

Anbei findet ihr meinen FB für den Wahlschalter, wie ich die Variablen benutzt habe und meine DI-Verbindungen.

danke
 

Anhänge

  • 8.png
    8.png
    122,3 KB · Aufrufe: 35
  • 9.png
    9.png
    20,8 KB · Aufrufe: 35
  • 10.png
    10.png
    91 KB · Aufrufe: 35
Hallo,

grundsätzlich würde ich, wenn ich schon einen Baustein dafür baue, die Fehlerabfrage "beide TRUE" mit abfangen.
Da Du nichts speichern mußt, sondern nur den "Status" haben willst, würde ich das dann in einen FC legen und der Rückgabewert des FC ist dann Dein Selectorstate.

Deine Function heißt dann z.B. "FUNCTION Selector : INT".
Intern machst Du das Gleiche, wie jetzt, nur den Selectorstate weist Du dann am Ende des Bausteins dem Rückgabewert der Funktion zu:
Selector := Selectorstate;

Dann rufst Du den nur noch auf
IF Selector() = 1 THEN
oder
CurrentState := Selector();

Ich habe Deinen Code nun nicht komplett durchgelesen, was ist denn falsch, was funktioniert nicht?
Ich sehe keinen Aufruf Deines Selector-FBs... kann es daran liegen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

grundsätzlich würde ich, wenn ich schon einen Baustein dafür baue, die Fehlerabfrage "beide TRUE" mit abfangen.
Da Du nichts speichern mußt, sondern nur den "Status" haben willst, würde ich das dann in einen FC legen und der Rückgabewert des FC ist dann Dein Selectorstate.

Deine Function heißt dann z.B. "FUNCTION Selector : INT".
Intern machst Du das Gleiche, wie jetzt, nur den Selectorstate weist Du dann am Ende des Bausteins dem Rückgabewert der Funktion zu:
Selector := Selectorstate;

Dann rufst Du den nur noch auf
IF Selector() = 1 THEN
oder
CurrentState := Selector();
Also, wenn ich den Wahlschalter nur einmal benutze, macht es mehr Sinn, ihn als Funktion zu implementieren.

Ein weiteres Problem, das ich habe, ist: Wo soll ich meine tatsächlichen Eingänge mit meiner Funktion verbinden? Soll ich das in der Funktion selbst tun oder lieber dort, wo ich die Funktionsbausteine aufrufe, wie in diesem Beispiel hier?
11.png
und hier wenn ich meine Programm aufrufe kann nicht an die Eingänge von meinem FB zugreifen, dann soll das lieber in den Programm gemacht werden stimmt ?
Ich habe Deinen Code nun nicht komplett durchgelesen, was ist denn falsch, was funktioniert nicht?
Ich sehe keinen Aufruf Deines Selector-FBs... kann es daran liegen?
Aufruf habe ich in meinem Programm drinnen gemacht

danke dir
 
Also, wenn ich den Wahlschalter nur einmal benutze, macht es mehr Sinn, ihn als Funktion zu implementieren.

Ein weiteres Problem, das ich habe, ist: Wo soll ich meine tatsächlichen Eingänge mit meiner Funktion verbinden? Soll ich das in der Funktion selbst tun oder lieber dort, wo ich die Funktionsbausteine aufrufe, wie in diesem Beispiel hier?
Anhang anzeigen 78426
und hier wenn ich meine Programm aufrufe kann nicht an die Eingänge von meinem FB zugreifen, dann soll das lieber in den Programm gemacht werden stimmt ?

Aufruf habe ich in meinem Programm drinnen gemacht

danke dir
E/As werden in den GVLs deklariert, damit sind diese global erreichbar.

Du deklarierst deine Funktion dort wo du diese benötigst. Dementsprechend rufst du diese auch auf und weißt die Eingänge dort dann auch zu
 
Also, wenn ich den Wahlschalter nur einmal benutze, macht es mehr Sinn, ihn als Funktion zu implementieren.
Das hat nichts mit "einmal" zu tun... Einen FB benutzt Du, wenn Du entweder interne Werte hast, die Du bis zum nächsten Zyklus zwischenspeichern mußt (Beispiel: Filter eines Eingangssignals, brauchst Du im nächsten Zyklus den alten Wert vom letzten Zyklus) oder wenn der Baustein mehrere Ausgangswerte hat, die Du nicht als Struktur, sondern einzeln ausgeben möchtest.

Ein weiteres Problem, das ich habe, ist: Wo soll ich meine tatsächlichen Eingänge mit meiner Funktion verbinden? Soll ich das in der Funktion selbst tun oder lieber dort, wo ich die Funktionsbausteine aufrufe, wie in diesem Beispiel hier?
Das ist Geschmackssache: Hast Du mehrere Wahlschalter? Dann machst Du es in jedem Funktionsaufruf. Damit schreibst Du eine Funktion, die Du mit mehreren Wahlschaltern benutzen kannst. Willst Du den Code wiederverwenden (Bibliothek, in neues Projekt kopieren), machst Du es genauso.
Hast Du nur einen Wahlschalter und willst den Aufruf im Code schlank halten, machst Du es intern, so wie Du es jetzt gemacht hast.

und hier wenn ich meine Programm aufrufe kann nicht an die Eingänge von meinem FB zugreifen, dann soll das lieber in den Programm gemacht werden stimmt ?
verstehe ich nicht.
 
verstehe ich nicht.
Ich meine, wenn ich meine Funktion aufrufe, wo weise ich ihr dann meine tatsächlichen Variablen zu?
Soll ich am Anfang des Programms Selector(x_iwahl_1 := xSchalter1) verwenden oder die Variablen gleich in meinen GVL, die mit den DIs verbunden sind, zuweisen?
9.png
Hallo,

grundsätzlich würde ich, wenn ich schon einen Baustein dafür baue, die Fehlerabfrage "beide TRUE" mit abfangen.
Da Du nichts speichern mußt, sondern nur den "Status" haben willst, würde ich das dann in einen FC legen und der Rückgabewert des FC ist dann Dein Selectorstate.

Deine Function heißt dann z.B. "FUNCTION Selector : INT".
Intern machst Du das Gleiche, wie jetzt, nur den Selectorstate weist Du dann am Ende des Bausteins dem Rückgabewert der Funktion zu:
Selector := Selectorstate;

Dann rufst Du den nur noch auf
IF Selector() = 1 THEN
oder
CurrentState := Selector();

Ich habe Deinen Code nun nicht komplett durchgelesen, was ist denn falsch, was funktioniert nicht?
Ich sehe keinen Aufruf Deines Selector-FBs... kann es daran liegen?
 
Ich meine, wenn ich meine Funktion aufrufe, wo weise ich ihr dann meine tatsächlichen Variablen zu?
Soll ich am Anfang des Programms Selector(x_iwahl_1 := xSchalter1) verwenden oder die Variablen gleich in meinen GVL, die mit den DIs verbunden sind, zuweisen?
Du deklarierst deine Funktion dort wo du diese benötigst. Dementsprechend rufst du diese auch auf und weißt die Eingänge dort dann auch zu
 
Zuviel Werbung?
-> Hier kostenlos registrieren
:unsure: Was soll denn passieren, wenn Dein FB bzw. FC richtig arbeitet???
Was ich gemacht habe, führt dazu, dass ich meinen FB nur einmal benutzen kann, da ich meine DIs darin definiert habe. Meine Frage wäre: Wo kann ich meine Variablen mit meinen Eingängen verbinden?
wie du hier sehen kannst
10.png
 
Warum überhaupt (noch) die E/A im GVL deklarieren > AT Deklaration ?
Ich deklariere (mappe) die E/A´s in der Hardware und fertig, dann hast auch überall zugriff auf die E/A´s...


1716815323769.png
 
Für diesen Fall gibt es bei WAGO den * Operator beim AT. Anstatt "AT %IX0.0" gibst Du "AT %I*" an. Dann musst Du noch eine GVL vom Typ VAR_CONFIG anlegen.
Details findest Du hier. Dann kannst Du in Deinem FB die I/Os direkt angeben.
Ansonsten wie @rar-101 es vorgeschlagen hat.
An alle Experten: Wenn das direkt über die Hardware geht, wofür nimmt man überhaupt noch das AT Konstrukt? Bei Beckhoff ist das ja noch Pflicht, weil es anders nicht geht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was ich gemacht habe, führt dazu, dass ich meinen FB nur einmal benutzen kann, da ich meine DIs darin definiert habe.
..und warum hast du das so gemacht? Ich frage, nicht um dich zu ärgern sondern damit du dein Handeln besser verstehen kannst.

Wo kann ich meine Variablen mit meinen Eingängen verbinden?
Du deklarierst deine Funktion dort wo du diese benötigst. Dementsprechend rufst du diese auch auf und weißt die Eingänge dort dann auch zu
Screenshot 2024-05-27 151220.png
 
Warum überhaupt (noch) die E/A im GVL deklarieren > AT Deklaration ?
Ich deklariere (mappe) die E/A´s in der Hardware und fertig, dann hast auch überall zugriff auf die E/A´s...


Anhang anzeigen 78429
Das habe ich am Anfang auch gemacht, aber dann habe ich gesehen, dass die anderen es in GVL so machen. Deswegen habe ich es dann auch so gemacht.

Zwischenfrage: Weißt du vielleicht, warum ich kein weiteres Gerät anhängen kann?

Und wie benenne ich meine Geräte nach Zeichnung?12.png
 
..und warum hast du das so gemacht? Ich frage, nicht um dich zu ärgern sondern damit du dein Handeln besser verstehen kannst.
Nein, alles gut. Deswegen habe ich auch hier gefragt, weil ich weiß, dass es so nicht sein soll.

Ich habe es so gemacht, weil mir nichts anderes eingefallen ist.
Genau, im Programm kann ich darauf zugreifen, aber wenn ich sie mit meinen I/Os verbinden möchte, hatte ich am Input nur meine Funktionsbausteine, so wie hier.
ganz unten
11.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das habe ich am Anfang auch gemacht, aber dann habe ich gesehen, dass die anderen es in GVL so machen. Deswegen habe ich es dann auch so gemacht.

Zwischenfrage: Weißt du vielleicht, warum ich kein weiteres Gerät anhängen kann?

Und wie benenne ich meine Geräte nach Zeichnung?Anhang anzeigen 78431

Welches Gerät möchtest du denn hinzufügen, eine "Klemme" an den Kbus oder einen neuen Knoten?

Das Umbenennen geht über die rechte Maustaste und Refactoring, aber das mit Vorsicht und bedacht durchführen, das kann durchaus mal Spacken...
 
Nein, alles gut. Deswegen habe ich auch hier gefragt, weil ich weiß, dass es so nicht sein soll.

Ich habe es so gemacht, weil mir nichts anderes eingefallen ist.

Genau, im Programm kann ich darauf zugreifen, aber wenn ich sie mit meinen I/Os verbinden möchte, hatte ich am Input nur meine Funktionsbausteine, so wie hier.
ganz unten
Anhang anzeigen 78432
Die Ansicht kenne ich nicht. Ist die Codesys spezifisch? Hab nur Berührungen mit Codesys in Form von Twincat
 
Welches Gerät möchtest du denn hinzufügen, eine "Klemme" an den Kbus oder einen neuen Knoten?
Ich möchte noch einen DO hinzufügen, eigentlich an meinem Controller.

soweit ich bis jzt gelernt habe, hängt man seine DI/DO geräte an Kbus an, und so kann mein Controller mit denen kommunizieren oder ?

Das Umbenennen geht über die rechte Maustaste und Refactoring, aber das mit Vorsicht und bedacht durchführen, das kann durchaus mal Spacken...
Refactoring steht nicht als Wahl :unsure:
Kann man die Adresse des Geräts ändern?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Ansicht kenne ich nicht. Ist die Codesys spezifisch? Hab nur Berührungen mit Codesys in Form von Twincat
Ich kenne mich sehr schlecht aus, da ich nur von euch und den Büchern lerne.
Aber ich habe es versucht, wie du siehst, und es hat mir gezeigt, dass der Funktionsbaustein nur einen einzigen Eingang hat.
Ich werde es so versuchen, wie es @oliver.tonn oben erwähnt hat.
danke euch
 
Aber ich habe es versucht, wie du siehst, und es hat mir gezeigt, dass der Funktionsbaustein nur einen einzigen Eingang hat.
Naja, der wird ja auch in einem unter kaskadiertem File aufgerufen, natürlich zeigt er dir in dem übergeordneten Baustein es so an.

Wahrscheinlich hast du den Wahlschalter als Input in Tagesbunker deklariert, oder?

Machs doch einfach mal im Tagesbunker so, wie ich es dir in meinem Screenshot gezeigt hab.
 
An alle Experten: Wenn das direkt über die Hardware geht, wofür nimmt man überhaupt noch das AT Konstrukt? Bei Beckhoff ist das ja noch Pflicht, weil es anders nicht geht.
Das habe ich mich auch schon gefragt... Ich nutze das nur in der Hardware, genau so wie @rar-101 das in #10 gezeigt hat.
Ich vermute einfach mal: Das ist drin, um mit allen kompatibel zu sein (z.B. Beckhoff)... oder liege ich da falsch?

@der_NooB
Damit das nicht durcheinander geht: Auch ich würde den E/As die Namen in der Hardware geben. In einer GVL ist das einfach nur mehr Arbeit, nochmal ein Zwischenschritt, bei dem Fehler gemacht werden können.

Wo Du endgültig Deine E/As an den Baustein schreibst, kommt immer darauf an, wie allgemein und wiederverwendbar Dein Baustein sein soll.
Du kannst es bis ins Extrem treiben und die E/As nur im PLC_PRG (oberster Baustein) zuweisen. Wenn dann aber Dein Wahlschalter in 10. Ebene erst aufgerufen wird, heißt das, Du mußt die E/As für diesen Baustein durch alle darüber liegenden 9 Ebenen druchschleppen. Das macht nicht immer Sinn. Wenn der Baustein spezifisch für dieses Projekt ist und Du die E/As in den darüber liegenden Bausteinen nicht benötigst, kann es durchaus Sinn machen, die erst beim Aufruf des Wahlschalter-Bausteins zuzuweisen.
Sofern die nirgendwo anders benötigt werden, kann es sogar Sinn machen, sie garnicht über Inputs in den Baustein zu holen, sondern darin fest zu codieren, wie ich in #2 schonmal vorgeschlagen hatte.
Um das jetzt allgemein zu beantworten, kenne ich Dein Projekt nicht. Das sind Entscheidungen, die Du selbst treffen mußt. Das wird auch durchaus von verschiedenen Programmierern verschieden gehandhabt.

Der K-Bus ist der Bus, der über die seitlichen Kontakte an den Baugruppen durch den gesamten Knoten läuft und über den der Controller mit den einzelnen Scheiben kommuniziert. Diese Scheiben projektierst Du genau so, wie sie gesteckt sind, in CoDeSys. Sonst beschwert er sich, daß die HW nicht mit der Config übereinstimmt. (Wenn man nicht symbolisch programmiert, muß man die Hardware in CoDeSys auch gar nicht anlegen, anderes Thema). Und nein, die Adressen kannst Du nicht ändern. Der Controller (und auch ein Koppler) holt sich die Karten in der Reihenfolge, wie sie gesteckt sind, ins Prozeßabbild. Zuerst die analogen, dann die digitalen Karten. Dadurch kann es, wenn Du Karten in der Mitte ergänzt/austauschst, zu Adressverschiebungen kommen. Die damit verbundenen Probleme verhindert man, wenn man die Symbole für die E/As nicht in einer GVL sondern direkt an der Hardware vergibt.
 
Zurück
Oben