TwinCat Struktur Zuweisung/ Zuordnung

pedikon

Level-1
Beiträge
27
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Bin ein Siemens Umsteiger und kämpfe gerade mit TwinCat PLC.

Habe eine Struktur definiert: (hier ein PNOZ Statusbyte)

TYPE typPnozStatus :
STRUCT
OFAULT: BOOL;
IFAULT: BOOL;
FAULT: BOOL;
DIAG: BOOL;
RUN: BOOL;
KOM: BOOL;
BIT6: BOOL;
BIT7: BOOL;
END_STRUCT
END_TYPE

Formal gesehen handelt sich es hier ja um 1 Byte.

Frage 1: Bekomme keine direkte Byte Zuweisung hin
strtypPnozStatus := "Byte X" oder 16#FF etc.

Frage 2: Kann ich diese Struktur direkt einem Prozesseingangsbyte zuordnen oder geht das nur bitweise.

Danke
 
Hallo,

warum willst du diese Struktur anlegen ?

Was ist dein eigentliches Problem, ich denke das kann man anders lösen.

Gruß, Voxe
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

warum willst du diese Struktur anlegen ?

Was ist dein eigentliches Problem, ich denke das kann man anders lösen.

Gruß, Voxe

Logisch kann man immer alles anders lösen.

Datentypen deshalb weil man die mehrfach verwenden kann!


Eigentliches Problem:

Habe ein Prozesseingangsbyte; möchte aber auf die einzelnen Bits direkt symbolisch zugreifen.

z.B. PNOZ.RUN


Aktuelle Lösung: Ordne dem Eingangsbyte eine Byte Variable "PNOZ" zu und greife dann über PNOZ.0 usw. darauf zu.
bzw. definiere Einzelvariablen mit Zuordnung zum Prozess (PNOZ_RUN, PNOZ_FAULT oä.)


Eleganter wäre doch aber ich nehme die Struktur und mache eine Zuordnung des Eingangsbyte auf die Struktur bzw. kopier z.B. TEST in die Struktur.

Bei Siemens geht das problemlos.

L EB0
T DB1.DBB1 (z.B. Struktur mit 8 BIT)

Aber wie gesagt bin da Anfänger und denke da vielleicht noch um die Ecke
 
Bei TwinCat/CoDeSys sind BOOL-Variablen Bytes, von denen nur Bit 0 genuzt wird. Die Struktur hat also 8 Bytes. Eine Ausnahme sind die EIn-/Ausgangs-Prozessabbilder, dort werden die Bits gepackt. Du könntest also einzelne BOOL-Variablen deklarieren und auf das Eingangsabbild legen.
Code:
OFAULT AT %IX0.0:BOOL;
IFAULT AT %IX0.1:BOOL;
FAULT AT %IX0.2:BOOL;
(* usw. *)
Schöner ist es natürlich, das gesamte Statusbyte als einzelne Variable zu haben. Auch das ist möglich.
Code:
VAR CONSTANT
OFAULT:BYTE:=0;
IFAULT:BYTE:=1;
FAULT:BYTE:=2;
(* usw.
Mit den Konstanten kann man dann auf die einzelnen Bits einer Byte-Variable zugreifen *)
VAR
PNOZStatus:BYTE;
END_VAR

IF PNOZStatus.FAULT  (* Zugriff auf Bit 2 *)
THEN
(*...*)
Dazu muss man allerdings mit symbolischen Konstanten arbeiten, was nicht die Standardeinstellung ist. Zum Umstellen im PLC-Control im Fenster "Projekt/Optionen/Übersetzungsoptionen" den Eintrag "Konstanten ersetzen" einschalten.
 
Bei TwinCat/CoDeSys sind BOOL-Variablen Bytes, von denen nur Bit 0 genuzt wird. Die Struktur hat also 8 Bytes. Eine Ausnahme sind die EIn-/Ausgangs-Prozessabbilder, dort werden die Bits gepackt. Du könntest also einzelne BOOL-Variablen deklarieren und auf das Eingangsabbild legen.
Code:
OFAULT AT %IX0.0:BOOL;
IFAULT AT %IX0.1:BOOL;
FAULT AT %IX0.2:BOOL;
(* usw. *)
Schöner ist es natürlich, das gesamte Statusbyte als einzelne Variable zu haben. Auch das ist möglich.
Code:
VAR CONSTANT
OFAULT:BYTE:=0;
IFAULT:BYTE:=1;
FAULT:BYTE:=2;
(* usw.
Mit den Konstanten kann man dann auf die einzelnen Bits einer Byte-Variable zugreifen *)
VAR
PNOZStatus:BYTE;
END_VAR
 
IF PNOZStatus.FAULT  (* Zugriff auf Bit 2 *)
THEN
(*...*)
Dazu muss man allerdings mit symbolischen Konstanten arbeiten, was nicht die Standardeinstellung ist. Zum Umstellen im PLC-Control im Fenster "Projekt/Optionen/Übersetzungsoptionen" den Eintrag "Konstanten ersetzen" einschalten.


Danke für die Info. Bool Variablen sind Byte habe ich zwischenzeitlich
bemerkt.

Werde mir das mit den symbolischen Konstanten mal näher anschauen.

Bei Testen habe ich folgendes probiert:

Habe die Struktur folgendermaßen declariert:
strPnozStatus AT %I*: typPnozStatus;

Im Systemmanager bekomme ich die Struktur nun korrekt angezeigt.
Eine Zuordung des Eingangsbyte auf die einzelenen Bits funzt aber bis jetzt noch nicht.

Vielleicht geht das ja über diesen Zuordnungsdialog "Variablengrößendifferenz" mit Offsets o.ä.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

mir ist das alles unnötig kompliziert.

Wenn du dein Eingangsbyte im Systemmanager verlinkt hast, ist es eine globale Variable. Dann kannst du überall deine Bits aus der Variable lesen.

Hoffe, ich habe das richtig verstanden.

Gruß, Voxe
 
Hallo,

mir ist das alles unnötig kompliziert.

Wenn du dein Eingangsbyte im Systemmanager verlinkt hast, ist es eine globale Variable. Dann kannst du überall deine Bits aus der Variable lesen.

Hoffe, ich habe das richtig verstanden.

Gruß, Voxe


Also sieht einfach so aus .....

Eingangsbyte => Bytevariable => Bitzugriff über Bytevarible.n
(Keine Symbolik für n; vielleicht über Symbolkonstante für n ???)

oder

Eingangsbyte => Bitvariablen ( Zuordnung geht glaube ich nur über den Offsetdialog oder jemand kann mr da auf die Sprünge helfen)

Bei vielen Bits aber ziemlich Aufwendig.
Muss man das nicht so oft machen sicher OK.

Ich habe aber mehrere Geräte mit gleichen Bitfeldern welche als Eingangsbytes vorliegen z.B. 3 Geräte mit 4Byte = 3 x 32 Bitfeld

Bei Verwendung einer Struktur könnten die Bits einmal mit Namen definiert
und den Geräten zugeordnet werden.
d.h. Geraet1.Fault, Gerät2.Fault, Gerätx.Fault usw.

Strukturen sind doch geradezu prädestiniert für so was.
Gerade bei Funktionsbausteinen mit mehreren Instanzen.
Bitfeld > Struktur > FB (Symbolischer Zugriff immer gleich)

Werde jetzt mal den Vorschlag mit den Symbolischen Konstanten testen.
 
Hallo,

eine andere Lösung wäre dir eine Funktion zu schreiben:
Code:
FUNCTION PnozStat : BOOL
VAR_IN_OUT
    iq_Byte               :BYTE;    
    iq_typPnozStatus  :typPnozStatus;
END_VAR[I]
Implementation:[/I]
iq_typPnozStatus.OFAULT :=iq_Byte.0;
iq_typPnozStatus.IFAULT  :=iq_Byte.1;
iq_typPnozStatus.FAULT   :=iq_Byte.2;
iq_typPnozStatus.DIAG     :=iq_Byte.3;
iq_typPnozStatus.RUN      :=iq_Byte.4;
iq_typPnozStatus.KOM     :=iq_Byte.5;
iq_typPnozStatus.BIT6     :=iq_Byte.6;
iq_typPnozStatus.BIT7     :=iq_Byte.7;
Diese Funktion rufst du irgendwo am Anfang deiner Applikation zyklisch auf.
Code:
PnozStat(MyBytePNOZ1,MyTypePNOZ1);
 
Hallo,

eine andere Lösung wäre dir eine Funktion zu schreiben:
Code:
FUNCTION PnozStat : BOOL
VAR_IN_OUT
    iq_Byte               :BYTE;    
    iq_typPnozStatus  :typPnozStatus;
END_VAR
[I]Implementation:[/I]
iq_typPnozStatus.OFAULT :=iq_Byte.0;
iq_typPnozStatus.IFAULT  :=iq_Byte.1;
iq_typPnozStatus.FAULT   :=iq_Byte.2;
iq_typPnozStatus.DIAG     :=iq_Byte.3;
iq_typPnozStatus.RUN      :=iq_Byte.4;
iq_typPnozStatus.KOM     :=iq_Byte.5;
iq_typPnozStatus.BIT6     :=iq_Byte.6;
iq_typPnozStatus.BIT7     :=iq_Byte.7;

Das Ganze dann noch universell über ne Schleife und Pointer etc. dynamisch!?
Dann bräuchte man die einzelen Strukturvaris nicht noch mal in die Hand nehmen. Hab aber bis jetzt noch nix mit Pointern in TwinCatPlc gemacht.

Aber hoffe immer noch das jemand weiss wie das direkt mit einer
Zuweisung funzt oder eben nicht!

Grüße vom nebligen Bodensee
 
Hallo,
also die Geschichte mit Pointer und Schleife ist bei deinem Problem vielleicht etwas übertrieben, aber wer 's mag:
Code:
FUNCTION PnozStat : BOOL
VAR_IN_OUT
    iq_Byte                :BYTE;
    iq_typPnozStatus    :typPnozStatus;
END_VAR
VAR
    byAux:BYTE;
    uiLoop:UINT;
    pType:POINTER TO BOOL;
END_VAR

pType:=ADR(iq_typPnozStatus);
FOR uiLoop:= 0 TO 7 DO
    byAux:=ROR(iq_Byte,uiLoop);
    pType[uiLoop]:=byAux.0;
END_FOR
Gewinn hat man bei den paar Zeilen aber nicht, eher im Gegenteil!

Wegen der direkten Zuweisung, ist meines Wissens nicht möglich. Du hast quasi eine 8-Bit breite Variable die Du in eine 8 Byte breite Structure kopieren willst. Irgend eine Logic musst du dir dafür programmieren.
Schönes WE...
 
Zurück
Oben