Bit in FB von IDB Word adressieren

Garog

Level-1
Beiträge
197
Reaktionspunkte
32
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.

Ich stehe gerade mit dem Kopf gegen die Wand.
Ich programmiere gerade einen FB indem ich einen anderen FB aufrufe und dieser einen Status als Wort ausgibt.
Dieses Wort ist als Var (Stat) angelegt im Haupt-FB.

Ein paar Programmzeilen weiter möchte ich nun auf einzelne Bits dieses Wortes zugreifen. :confused:
Das ganze sollte natürlich nicht mit einem absoluten Zugriff stattfinden.

Meine erste Suche ergab dieses hier:
Code:
LAR1 ##Temp_Word //Lade Adresse von Temp Word  
// Verknüpfung mit einem Bit: 
U L [AR1,P#0.0]  //Beim offset (P#0.0) kannst dir dann das bit aussuchen das du aus deinem Word benötigst 
U L [AR1,P#0.1] 
S L [AR1,P#0.2]    //Wenn erstes Bit und zweites Bit des Temp Word dann setze drittes Bit des Temp Word

Ich kann es leider nicht testen, da ich weder den Simulator zu Hand habe, noch eine SPS zur Zeit. Ich denke das ist es was ich suche oder gibt es noch andere "einfachere" Wege ?
 
Zuletzt bearbeitet:
Hallo,
Pointer auf die Variable bilden und den Inhalt auf diese Weise adressieren.
Bei Multi-Instanzen den möglichen Versatz (AR2) berücksichtigen.
Blöd ist hier nur, dass du den Pointer immer nur auf das Haupt-Element der Struktur (bei dir jetzt auf den FB im FB) bilden kannst und die Verschiebung zur Unter-Variablen (also dem OUT-Wort) handisch eintragen mußt. Das ist es dann wahrscheinlich wieder nicht, was du willst ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo was auch geht, in den Tempvaraibalen eine Array[0..15] of Bool anlegen und mit Sfc20 das Word (evtl. vorher das Word in eine andere TempVariable schieben) auf die Struktur des Arrays kopieren, dann kann jedes Bit über ArrayName[n] ausgelesen werden, es muss dabei nur die Byte-Eigenwiligkeit von Siemens berücksichtiugt werden w#16#0001 gibt halt ArrayName[8].
Es sieht nicht ganz so professionel aus wie wen man mit Pointer jongliert, aber es funktioniert einfach und transparent (und ist im Prinzip nichts anders).

Gruss Asab
 
Das hatte ich auch schon im Kopf, jedoch ist der Status nicht "nur" ein Status, es ist mehr ein INOUT Steuerwort.
Daher muss ich schon die entsprechenden Bits lesen und schreiben können.

AWL und Siemens.. ich werde mich nie dran gewöhnen ^^
 
wer hindert Dich daran die Bits nach dem zuweisen wieder zurück auf den INOUT zu schreiben (auch mit dem SFC20) evtl. auch über den Umweg über tempVar (das Ganze geht dann auch mit KOP oder FUB dann benötigts Du kein AWL)

ASAB
 
Wäre möglich, sollten aber keine NOPs drin sein und das ganze soll in AWL Quellen vorliegen, ob ich nun den Umweg gehe oder es direkt mache. Spielt hierbei keine große Rolle.

Eine andere Sache an der ich gerade arbeite.

Ich habe im Var Bereich folgendes
Code:
Recv_Buffer    : UDT3 ;

Der UDT3 besteht aus 24 Bytes.
In der Quelle möchte ich nun die ersten 4 Bytes auslesen, da sich dort ein REAL Wert befindet... :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Alles was du da vorhast ist eigentlich ein für SCL prädestiniertes Thema.
Vielleicht schluckt dein Kunde ja dies als Alternative zu AWL - manchmal kann man ja auch über Dinge reden ... denn ein AWL-Code, der von Pointern etc. nur so strotzt, ist auch keine tolle Lösung. Das Gleiche wäre in SCL dann aber wieder gut lesbar ...

Gruß
Larry
 
Larry, ich kann dir da nur zustimmen... du wirst lachen, aber ich programmiere gerade ein von mit erstelltes SCL Programm in AWL um.... aus bereits genannten Gründen.

Da ist leider nix mehr zu rütteln ;)
Auch wenn ich mir sicher bin, das der Kunde mit dem AWL Code genau so wenig anfangen kann
 
umprogrammieren?
das kann man auch einfacher haben: quelle ausm projektordner entfernen und den netzwerkkommentar des kompilats anpassen, fertig ist AWL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe ich getan... die Antwort kam 30 Minuten später per eMail ob das ein Witz sein sollte -.-*

Nunja.. ich habe eigentlich nur noch das Problem mit dem REAL aus dem UDT Bereich, der Rest ist fertig
 
Eine andere Sache an der ich gerade arbeite.

Ich habe im Var Bereich folgendes
Code:
Recv_Buffer    : UDT3 ;

Der UDT3 besteht aus 24 Bytes.
In der Quelle möchte ich nun die ersten 4 Bytes auslesen, da sich dort ein REAL Wert befindet... :confused:

Im Prinzip das gleiche Vorgehen wie mit den Bits, lege im Temp Bereich die gleiche Strucktur, an wenn es sogar eine UDT ist kannst du auch die UDT im temp Bereich definieren. Kopier mit SFC20 den ganzen Block in den temp und Greife über das Struckturelement auf das Element zu das Dich interesiert - alles ohne Pointer und in AWL leicht möglich und es bleibt "lesbar". Hinterher mit SFC 20 die ganzen Daten wieder auf den Ursprünglichen Speicherbereich und allles ist OK.

Gruss ASAB
 
Asab hat Recht ... ich halte seinen Vorschlag auch für einen sinnvollen Weg ein mögliches und sicher unübersichtliches herum-gepointere elegant zu umgehen. Ich denke auch mal nicht, dass sich dieses Vorgehen negativ auf die Zykluszeit des Programms auswirken würde.

Gruß
Larry
 
Zurück
Oben