4 merkbits in 4 ausgangsbits schreiben

Gerri

Level-1
Beiträge
822
Reaktionspunkte
37
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo,
ich habe 4 Merker Bits (M 8.0 bis M 8.3) und muß diese in einen Ausgang (A352.2 bis A 352.5 schreiben).

Gibt es die Möglichkeit dies ohne der direkten variante zu machen

U M8.0
= A352.2
...
...
...
 
es wurde ein profibus devicenet gatway verwendet bei dem das schweissprogramm eines roboters von der sps zu eben diesem roboter gesendet wird. da aber ein kollege immer irgendwo anfängt und es auch mal 16 bits sein können würde ich gern wissen wie man aus 32 zeilen (im schlimmsten fall) vielleicht ´weniger machen kann.
 
Wie immer gibt es mehrere Varianten, hier mal Vorschläge, so aus dem Hut gezogen:

1.
MW8 nehmen
um 2 Bit nach links schieben
Maske für Bit 2-5 (16 Bit, Bit 2-5 auf 1, alle anderen auf 0)
verunden
in #Zwischenspeicher 1

AW352 nehmen
Maske für Bit 2-5 (16 Bit, Bit 2-5 auf 0, alle anderen auf 1)
verunden
#Zwischenspeicher 1 nehmen
verodern
Transfer in AW352

2.
indirekte Adressierung

indirekte Adresse AR1 auf Bit 0 MW 8 berechnen
indirekte Adresse AR2 auf Bit 2 AW 352 berechnen

Schleife über 4
Bit Adressiert über AR2 = Bit Adressiert über AR1
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ein Beispiel
Code:
L     MW     8
SLW   2
L     2#11100
UW    
T     AW     352

[EDIT]
Muss noch verbessert werden, da dann alle anderen Ausgänge vom AW352 mit 0 überschrieben werden :-(
[\EDIT]
 
Zuletzt bearbeitet:
8bits: L MB x; T AB y;
16bits: L MW x; T AW y;
32bits: L MD x; T AD y;

du kannst natürlich auch maskieren und so nur abschnittsweise übertragen, mußt dann aber den ausgangsstatus der übrigbleibenden bits wiederherstellen, denn sonst sind die einfach mal weg

eine andere möglichkeit siehst du hier:

Code:
*
FUNCTION "COPY_Memory_to_Output" : VOID
//DATE:     01.10.2008
//AUTHOR:   4lagig
//VERSION:  V0.1 BasicVer
AUTHOR : '4lagig'
FAMILY : BoolGF
VERSION : 0.1

VAR_INPUT
  iSourceByte : INT ;    
  iSourceBit : INT ;    
  iDestinationByte : INT ;    
  iDestinationBit : INT ;    
  iElements : INT ;    
END_VAR
VAR_TEMP
  dAR1Save : DWORD ;    
  dAR2Save : DWORD ;    
  iLoop : INT ;    
END_VAR
BEGIN
NETWORK
TITLE =

//adressregister sichern

      TAR1  ; 
      T     #dAR1Save; 
      TAR2  ; 
      T     #dAR2Save; 

//byte-startadresse quelle
      L     #iSourceByte; 
      SLD   3; 
      L     #iSourceBit; 
      +D    ; 
      LAR1  ; 

//byte-startadresse ziel
      L     #iDestinationByte; 
      SLD   3; 
      L     #iDestinationBit; 
      +D    ; 
      LAR2  ; 

      L     #iElements; //anzahl der zu schreibenden elemente
next: T     #iLoop; 
      U     M [AR1,P#0.0]; //quelle
      =     A [AR2,P#0.0]; //ziel (mit versatz)
      +AR1  P#0.1; //nächstes element
      +AR2  P#0.1; 
      L     #iLoop; 
      LOOP  next; 

//adressregister zurückschreiben
      L     #dAR1Save; 
      LAR1  ; 
      L     #dAR2Save; 
      LAR2  ; 

END_FUNCTION
aber ich würde den jenigen erschlagen, der undokumentiert mit einem pointer wild auf irgendwelche ausgänge schreibt
 
MW 8 -> Die letzten 2 bits werden nicht verwendet

ich denke ich habs:

// -- adresse ins adressregister laden

L 352
LAR1

// -- altes program löschen

L 1110 0000 0000 0000
L AW [AR1,P#0.2]
UW
T L AW [AR1,P#0.2]

// -- neues program überschreiben

L MW 8
L AW [AR1,P#0.2]
OW
L AW [AR1,P#0.2]
 
Also wenn ich das richtig interpretiere
solltest du mit diesem Code eine rote Lampe erhalten!

Du lädst ein Wort mit einem Bit-Offset im AR1, das kann so nicht funktionieren ... abgesehen davon fehlt das "berühmte" SLD 3 fürs AR1 ...

Mfg
Manuel
 
Dann solltest du auch mit Bitzuweisungen arbeiten,
in einem Wort gibt es kein Bit-Offset ...

Also sozusagen es gibt kein Wort 352.2 ...

Ansonsten siehe den Post von 4L,
das ist die AWL "High-End" Lösung ...

Mfg
Manuel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ja, stimmt schon, 4L Version ist besser. Nur alles abschrieben ohne Gedanken darüber zu machen ist auch nicht sinnvoll.
Warum ist es notwendig das adressregister zu speichern bzw wieder zu überschreiben?
 
Zum Thema Adressregister ein Auszug aus der Siemens FAQ
  • Die Verwendung der folgenden höheren Sprachkonstrukte kann dazu führen, dass die Inhalte von DB-Register und Adressregister AR1 verändert werden:
  • vollqualifizierter DB-Zugriff (z.B. DB20.DBW10) als Aktualparameter für FC's
  • FB- und Multiinstanz-CALL
  • Strukturkomponente eines Formalparameters als Operand innerhalb eines FC's oder FB's
  • Strukturkomponente eines Formalparameters als Aktualparameter für FC oder FB
  • Beim FB-, FC-, Multiinstanz-CALL dürfen VKE oder AKKU1 und AKKU2 nicht als zusätzliche (implizite) Parameter verwendet werden.
  • Das DI-Register und das Adressregister AR2 wird systemseitig für den FB- und Multiinstanz-CALL verwendet und dürfen deshalb innerhalb von FB's nicht verändert werden (siehe hierzu auch Beitrags-ID 22531225).
  • Das Adressregister AR1 wird von einem Teil der ladbaren Standardbausteine verwendet.
  • Der Befehl "L P#Parametername" lädt innerhalb eines FBs den Adressoffset des angegebenen Parameters, relativ zum Adressregister AR2. Um in multiinstanzfähigen FB's den absoluten Offset im Instanzdatenbaustein zu ermitteln, muss zu diesem Wert noch der bereichsinterne Zeiger (nur Adresse) des AR2-Registers addiert werden.
 
Zurück
Oben