BIT aus einer WORD Variablen verarbeiten

ziede

Level-1
Beiträge
44
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

ich habe da ein Problem bei der erstellung eines FC`s in dem ich den Basistyp 1 eines SentronWL mit COM10 Profibus Modul.

Der Basistyp 1 besteht aus
2 Byte Statusinformationen
sowie 4 Datenbloecken mit je einem Eigenschaftsbyte.

Die Eigenschaftsbytes interessieren nicht weiter, die Datenbloecke werden eines Ausgangsvariablen zugewiesen (soweit kein Problem)
und die 2 Bytes Statusinformationen muessen "aufgedroeselt" werden um dann mehrere BIT Ausgaenge daraus zu machen.

Da faengt dann auch mein Problem an!
Da ich mehrere der SentronWL habe will ich nur einen FC schreiben, an dem ich dann das 1. PEW eines Sentron als IN Variable habe und die Daten sowie bestimmte Statusinformationen als OUT Variablen. Soweit auch noch Problemlos.

Mein Problem ist, dass ich auf einzelne BITs aus den Statusbytes schauen muss um die Statusinformationen zu bilden.

z.B. Bit 0=0, Bit 1=0 entspricht Trennstellung
Bit 0=1, Bit 1=0 entspricht Betriebsstellung
Bit 0=0, Bit 1=1 entspricht Teststellung
Bit 0=1, Bit 1=1 entspricht Schalter nicht anwesend

Dieses zu Programmieren waere ja nicht schwer, wenn ich es schaffen wuerde die auf einzelne Bits der Temp Variable (in die das Byte liegt) zuzugreifen. Dieses bekomme ich jedoch leider nicht hin und hoffe das ihr mir da weiterhelfen koennt.
Wuerde ich die Bytes nicht in eine Temp Variable schreiben sondern in ein MB oder ein DB waere das weiterverarbeiten wieder einfach, geht aber ja leider nicht, da ich den FC dann nicht mehrfach aufrufen koennte. :-(

Mfg
Bjeorn
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin, moin,

du musst nur das Status-Byte auf ein temporäres Byte kopieren. Dann kannst du die einzelnen Bit's wie im Beispiel addressieren und verknüpfen. Die richtige Byte-Adresse wird in der Variablentabelle angezeigt. Das funktioniert genauso mit WORD usw.

Beispiel - Baustein:

FUNCTION "Beispiel" : VOID
TITLE =Beispiel
VERSION : 0.1


VAR_INPUT
Statusbyte : BYTE ;
END_VAR
VAR_OUTPUT
Trennstellung : BOOL ;
Betrieb : BOOL ;
Test : BOOL ;
Nicht_anwesend : BOOL ;
END_VAR
VAR_TEMP
Status : BYTE ;
END_VAR
BEGIN
NETWORK
TITLE =
//Eingangsbyte auf temporäre Variable (Lokalbyte 0) kopieren
L #Statusbyte;
T #Status;
NETWORK
TITLE =
//Lokal - Bit's auf Ausgänge
UN L 0.0;
UN L 0.1;
= #Trennstellung;

U L 0.0;
UN L 0.1;
= #Betrieb;

UN L 0.0;
U L 0.1;
= #Test;

U L 0.0;
U L 0.1;
= #Nicht_anwesend;

END_FUNCTION



Gruß Rainer
 
Ich würde davon abraten, auf Temp-Variablen absolut adressiert zuzugreifen. Es wäre meines Erachtens sinnvoller, das Wort per SFC20 in ein Struct umzukopieren, das entsprechend deklariert ist.
 
Oder mit einer Maske:

L #Statuswort
L 2#0000 0100 0000 0000
UW
L 0
<>I
= #Bit 10
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Besten Dank fuer eure Hilfe, habe das ganze jetzt (hoffentlich) geloest.

Die als Int vorliegende IN Variable wird in WORD gewandelt und dann werden die Daten Mittels SFC14 aus dem SentronWL ausgelesen und in TEMP Variable
gespeichert.

U(
L #pew
T #Temp_Status
SET
SAVE
CLR
U BIE
)
SPBNB _001
CALL "DPRD_DAT"
LADDR :=#Temp_Status
RET_VAL:=#dummy
RECORD :=P#L 0.0 BYTE 14
_001: NOP 0

Hoffe das es so auch Fuktioniert.

Den gasammten Baustein habe ich mal als PDF angehaengt.

Wuerde mich ueber eure Meinung zu dem ganzen freuen.

Bjoern
 

Anhänge

  • FC25.pdf
    27 KB · Aufrufe: 19
Das Funktioniert nicht. Sie Schrieben mit SFC14 die daten in dass Temp bereich ab temp 0.0 aber die declaration start ad byte 2.Wehn Sie ein strct declarieren mit alle daten aus der Sentron muchte sie die struct als record an der SFC14 declarieren.
 

Anhänge

  • fc25.JPG
    fc25.JPG
    89,7 KB · Aufrufe: 34
Ich würde es auch genau wie Joop machen. Es sieht erstmal professioneller aus und hat 2. auch noch den Vorteil, dass bei einer Verschiebung von Deklarationen im Temp-Bereich das Ganze immer noch funktioniert weil der SFC ja auf eine symbolische Adresse zugreift.
 
Zurück
Oben