Case Statement

Beiträge
431
Reaktionspunkte
18
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi zusammen,

eine Frage an die Profis.
Ich versuche gerade einen FB zu programmieren.

Bei einer Case Anweisung setzt man die Bedingungsvariable ja Grundsätzlich als INT an.
Das geht doch mit dem Datentyp WORD genau so, oder spricht da was dagegen?
Ich habe nämlich aktuell den Fall, dass ich eine Bedingungsvariable einer CASE Anweisung die ich über eine VAR_IN_OUT beziehe, verwende.
Nutze ich den Datentyp INT muss ich die IN_OUT Variable nach WORD konvertieren, weil Modbus ja WORD-basiert ist, dass mag aber Codesys nicht.
Also wäre Word für mich als Bedingungsvariable sehr günstig.

Mir fällt aktuell keine andere Lösung für das Problem ein.

Danke.
 
Die CASE Bedingung verlangt nach einem ANY_INT, da musst du dir vorher überlegen ob dein WORD was du über Modbus bekommst mit oder ohne Vorzeichen ist. Dagegen den Wert zu konvertieren spricht direkt nichts, ob es sinnvoller ist, das außerhalb deiner Funktion oder innerhalb (CASE WORD_TO_UINT(x)) zu realisieren hängt vom Anwendungsfall ab.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Word kommt ohne Vorzeichen Wert 0 bis 32.
Ich möchte nur meine Struktur einhalten, also alle Case Anweisung mit INT.

Ich wollte ja konvertieren, aber stelle mich anscheinend zu doof an.

Das Word was Konvertiert werden soll, liegt auf einem Var_IN_OUT eines FB,s. Diese Var_IN_OUT ist dann im FB die Bedingungsvariable in der Case Anweisung.
Will ich das Word außerhalb oder innerhalb vom FB konvertieren TO_INT(myWord) dann meckert der compiler.

Kann ich das irgendwie konvertieren?
Es muss auf alle Fälle eine VAR_IN_OUT sein.
 
Wenn es unbedingt In-Out sein muss, dann wirst du die Konvertierung im Case-Ausdruck vornehmen müssen. Außerhalb wäre vermutlich auch möglich mit einer Zwischenvariable, also erst WORD_TO_UINT -> an die Funktion -> danach UINT_TO_WORD zurückschreiben. Finde ich aber nicht sonderlich elegant, und würde eher zum Ersteren tendieren von dem was ich bisher weiß.
 
Die CASE Bedingung verlangt nach einem ANY_INT, ... das außerhalb deiner Funktion oder innerhalb (CASE WORD_TO_UINT(x)) zu realisieren hängt vom Anwendungsfall ab.
Laut CodeSys FehlerMeldungsBeschreibung :
4264 "Der Selector der CASE-Anweisung muß vom Typ INT sein"
Stellen Sie sicher, daß der Selektor ein Integer- oder Bitstring Datentyp ist (z.B. DINT, DWORD).
Daraus lese ich, dass WORD oder DWORD auch als "ANY_INT" akzeptiert wird!?
Das Word kommt ohne Vorzeichen Wert 0 bis 32.
Also wäre der von Thomas vorgeschlagene Typ UINT für Dich allemal geeignet.
Will ich das Word außerhalb oder innerhalb vom FB konvertieren TO_INT(myWord) dann meckert der compiler.
Dass der Compiler wegen 'TO_INT' meckert, kann ich gut verstehen - da fehlt doch etwas ganz Wichtiges! Wie wär's mit WORD_TO_INT?

Aber laut der Erläuterung der FehlerMeldung "Der Selector der CASE-Anweisung muß vom Typ INT sein", sollte WORD auch ohne jegliche Konvertierung funktionieren, s.o..

... mit einer Zwischenvariable, also erst WORD_TO_UINT -> an die Funktion -> danach UINT_TO_WORD zurückschreiben. Finde ich aber nicht sonderlich elegant, und würde eher zum Ersteren tendieren von dem was ich bisher weiß.
Oder innerhalb der Funktion mit einer ZwischenVariablen arbeiten.
Könnte mir vorstellen, dass innerhalb der CASE-Selektion der "Selektor" verändert wird, sonst wäre es ja der "Out-Anteil" von VAR_IN_OUT verzichtbar.
 
Zuletzt bearbeitet:
So werden es aussieht ist das problem das zu die Konvertierung direkt am Eingang drangehängt hast.
Diese hat nur eine leseberchtigung.
Schreib die KonvertierungBaustein auf eine Variable mit den Typ Int und schreib diese Variable dann auf den Eingang hin. dann sollte die Meldung weg sein.
 
Zurück
Oben