Digitalen Wahlschalter

Zuviel Werbung?
-> Hier kostenlos registrieren
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 ?


Refactoring steht nicht als Wahl :unsure:
Kann man die Adresse des Geräts ändern?
Ich befürchte der Controller kann nur 6 I/O Module...

1716819096719.png
 

Anhänge

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?
Du liegst nicht ganz falsch. Ich habe mich mit einem Programmierer unterhalten der schon länger mit Schneider/Elau zu tun hat, er meinte nur das kommt aus Codesys 2.xx. Auch er hat Empfohlen die AT Deklaration nicht mehr zu verwenden.
 
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?
Sorry, wenn ich vielleicht mit meinen Fragen nerve, aber zum ersten Mal benutze ich diese Funktion.

Warum zeigt er mir Fehler?

Es hat funktioniert, nachdem ich meine Eingänge in meiner Funktion von IN zu VAR geändert habe.

Aber wie greife ich auf meine Eingänge zu? Durch Kbus?
1.png
ich habe so versucht, funktioniert auch nicht.
doch jzt hat funktioniert, aber mein Wert kann ich nicht in meinem FUN sehen hmmm :unsure:
 

Anhänge

  • 14.png
    14.png
    142,5 KB · Aufrufe: 13
  • 15.png
    15.png
    84,9 KB · Aufrufe: 13
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
1) Weil du die Function ohne Parameterübergabe verwendest, bei einer Function müssen aber die (Eingangs/)Übergabeparameter angegeben werden.
2) In der Zeile weiter oben rufst du fWahlschalter(i_x...); auf, ohne den Rückgabewert zu verwenden.
Richtig wäre:
Code:
iResult := fWahlschalter(i_xWahl_1:=..., i_xWahl_2:=...);
...
IF (iResult = 1 XOR iResult = 2) ...

Wenn du lieber fWahlschalter() so verwenden willst wie oben, dann erstelle fWahlschalter() als Function_Block mit einem Output, dann kannst du ohne Parameter-Übergabe aufrufen und später beliebig oft den Output abfragen. Dann musst du aber fWahlschalter instanzieren.

PS: Die Logik von deinem fWahlschalter(...) würde ich als "nicht korrekt" oder zumindest nicht konsequent bezeichnen. Der Rückgabewert 1 kommt wenn i_xWahl_1 true ist, egal ob i_xWahl_2 true oder false ist. Der Rückgabewert 2 kommt nur, wenn nur i_xWahl_2 alleine true ist.
 
1) Weil du die Function ohne Parameterübergabe verwendest, bei einer Function müssen aber die (Eingangs/)Übergabeparameter angegeben werden.
2) In der Zeile weiter oben rufst du fWahlschalter(i_x...); auf, ohne den Rückgabewert zu verwenden.
Richtig wäre:
Code:
iResult := fWahlschalter(i_xWahl_1:=..., i_xWahl_2:=...);
...
IF (iResult = 1 XOR iResult = 2) ...
ich habe es so auch probiert

fWahlschalter(i_xWahl_1:=..., i_xWahl_2:=...);
iResult:= fWahlschalter();

hat nicht funktioniert, aber jzt habe ich es so gemacht
1.pngund dann den Rückwert in Programm abgefragt so2.png
was denkst ?
Wenn du lieber fWahlschalter() so verwenden willst wie oben, dann erstelle fWahlschalter() als Function_Block mit einem Output, dann kannst du ohne Parameter-Übergabe aufrufen und später beliebig oft den Output abfragen. Dann musst du aber fWahlschalter instanzieren.

PS: Die Logik von deinem fWahlschalter(...) würde ich als "nicht korrekt" oder zumindest nicht konsequent bezeichnen. Der Rückgabewert 1 kommt wenn i_xWahl_1 true ist, egal ob i_xWahl_2 true oder false ist. Der Rückgabewert 2 kommt nur, wenn nur i_xWahl_2 alleine true ist.
Aber es kann nicht beides sein. Und wenn der Drehschalter gedreht wird, dann wird ELSE den Wert auf 0 setzen, bevor er zu 2 oder 1 kommt, oder?
 
()
bedeutet immer einen Aufruf.
Aber es kann nicht beides sein. Und wenn der Drehschalter gedreht wird, dann wird ELSE den Wert auf 0 setzen, bevor er zu 2 oder 1 kommt, oder?
Denkst du nur dass es nicht so sein kann oder ist es mechanisch unmöglich dass es so ist?

Ein paar Zeilen mehr um alle Möglichkeiten genau abzufangen hat noch niemandem geschadet. Gibt ja nur vier Möglichkeiten:
00
01
10
11

Das sollte für dich umsetzbar sein.

ich habe es so auch probiert

fWahlschalter(i_xWahl_1:=..., i_xWahl_2:=...);
iResult:= fWahlschalter();

hat nicht funktioniert
Bei mir in Twincat funktionierts. Du musst dich schon an die Syntax halten.
Screenshot 2024-05-28 105654.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
()
bedeutet immer einen Aufruf.
aso ja dann klar wird nicht funktionieren
Denkst du nur dass es nicht so sein kann oder ist es mechanisch unmöglich dass es so ist?
genau Mechanisch nicht möglich
Ein paar Zeilen mehr um alle Möglichkeiten genau abzufangen hat noch niemandem geschadet. Gibt ja nur vier Möglichkeiten:
00
01
10
11

Das sollte für dich umsetzbar sein.
Soll ich es trotzdem machen?

Ich frage nicht aus Faulheit, sondern weil es nie dazu kommen wird. Oder was sagst du? Kann es mal vorkommen?

Bei mir in Twincat funktionierts. Du musst dich schon an die Syntax halten.
Anhang anzeigen 78454
hmmm so habe ich es davor versucht
16.png
 
Ich frage nicht aus Faulheit, sondern weil es nie dazu kommen wird. Oder was sagst du? Kann es mal vorkommen?
Zumindest beide 1 kann mal vorkommen, wenn Du einen Querschluß o.ä. hast. Mechanisch mag es unmöglich sein, elektrisch durch Fehler kann es auftreten.
Damit hast Du dann schon alle Fälle... beide 0, einer gewählt, beide 1.
Was dann im Fehler passieren soll, mußt Du selber definieren: Entweder auf einen sicheren Wert (z.B. 0) setzen oder Fehler ausgeben, oder eine Auswahl priorisieren... je nachdem, was bei Dir passieren soll.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
genau Mechanisch nicht möglich

Soll ich es trotzdem machen?

Ich frage nicht aus Faulheit, sondern weil es nie dazu kommen wird. Oder was sagst du? Kann es mal vorkommen?
In der Zeit in der du überlegst ob ja oder nein, haste das schon fünfmal herunterprogrammiert ;) Es geht ja auch nicht nur um den jetzigen Fall, sondern generell.. eine saubere Funktion lässt sich ja in mehr als nur ein Projekt implementieren und kann dann immer weitergereicht werden.
 
In der Zeit in der du überlegst ob ja oder nein, haste das schon fünfmal herunterprogrammiert ;)
haha stimmt habe ich gemacht danke
01.png
Es geht ja auch nicht nur um den jetzigen Fall, sondern generell.. eine saubere Funktion lässt sich ja in mehr als nur ein Projekt implementieren und kann dann immer weitergereicht werden.
ai ai Chef 🫡
danke euch allen, mir macht echt viel spaß von euch zu lernen danke.

könnt ihr mir noch bitte sagen wie ich es in #24 mache ? danke
 
Zurück
Oben