Addresiierung

Nico99

Level-1
Beiträge
134
Reaktionspunkte
12
Zuviel Werbung?
-> Hier kostenlos registrieren
CPU312
TP170B Mono
Step7 5.3

Hallo!
Ich m
öchte eine CPU312 mit OP TP170B als Anzeige für Störmeldungen verwenden. Die Störmeldungen sind an EB der SPS als 8 Bits angeschlossen. Liegt am EB eine 2 an, soll Meldung Nr. 2 aufgerufen werden, liegt am EB 109 an, soll Meldung 109 aufgerufen werden. Dazu soll jeweils Datenbit mit gleicher Nummer wie die Zahl am EB auf 1 gesetzt werden. Da ich mehr Mikrokontroller programmiere, sieht es da so aus (Operanden abgestimmt auf SPS)
EB=X
A32.X=1
Gibt es ein Funktion oder ein Befehl, der mir das ganze erleichtern würde? Sonst muss ich Ständig den Wert vergleichen und Entsprechendes Baustein oder Funktion aufrufen, was sich als zeitaufwändig erweisen würde.
mit freundlichen Grüssen,
Nico
 
Code:
FUNCTION FC 10 : VOID
TITLE =
VERSION : 0.1

BEGIN
NETWORK
TITLE =

      L     MW     0; //Fehlernummer
      L     8; 
      /I    ; 
      T     MW    10; //Anzahl Bytes ab Offset

      L     MW    10; 
      L     8; 
      *I    ; 
      T     MW    14; //Offset Bytes

      L     MW     0; 
      L     MW    14; 
      -I    ; 
      T     MW    12; //Anzahl Bits ab Offset

NETWORK
TITLE =Ausgangsbytes auf Null setzen

      L     20; //Anzahl Ausgangsbytes die Zurückgesetzt werden
NEXT: T     MW    20; 

      L     0; //Da Schleife bei MW20 = 0 sofort verlassen wird, AB32 immer rücksetzen
      T     AB    32; 

      L     MW    20; 
      SLD   3; 
      LAR2  ; 

      L     0; 
      T     AB [AR2,P#32.0]; 

      L     MW    20; 
      LOOP  NEXT; 

NETWORK
TITLE =Pointer bilden

      L     MW    10; 
      SLD   3; 
      L     MW    12; 
      OD    ; 
      LAR1  ; 

NETWORK
TITLE =

      U     M     99.0; //Freigabe Ausgabe
      =     A [AR1,P#32.0]; //Offset P#32.0 = ab A32.0

END_FUNCTION

Hat zwar noch experimentiercharakter, aber wenn man das noch ein wenig ausschmückt zu gebrauchen.
Ist eine AWL-Quelle, muss in Step7 als Baustein übersetzt werden.

Mfg
Manuel
 
Hallo!

Ich habe es gerade probiert, es klappt ja hervorragend! Vielen Dank!
Nur jetzt habe ich ein weiteres kleines Problemm, und zwar habe ich noch nie mit Pointers gearbeitet.
Wie muss ich es schreiben, damit die Bits nicht bei AB32 gesetzt werden, sondern in einem DB10 mit 9 DatenWords, und zwar ab dem erstem Bit?
Ich weiss, wahrscheinlich ist es bei mir ein Syntax-Fehler, aber ich kriege es nicht raus. Ich währe für die Hilfe Sehr dankbar!

bis dann,
Nico
 
Muss dann so aussehen:

Code:
NETWORK
TITLE =

      L     MW     0; //Fehlernummer
      L     8; 
      /I    ; 
      T     MW    10; //Anzahl Bytes ab Offset

      L     MW    10; 
      L     8; 
      *I    ; 
      T     MW    14; //Offset Bytes

      L     MW     0; 
      L     MW    14; 
      -I    ; 
      T     MW    12; //Anzahl Bits ab Offset
NETWORK
TITLE =Ausgangsbytes auf Null setzen

      L     17; //Anzahl Ausgangsbytes die Zurückgesetzt werden
NEXT: T     MW    20; 
      AUF   DB10

      L     0; //Da Schleife bei MW20 = 0 sofort verlassen wird, AB32 immer rücksetzen
      T     DBB0; //Erstest Byte im DB in dem die Bits geschrieben werden 

      L     MW    20; 
      SLD   3; 
      LAR2  ; 

      L     0; 
      T     DBB [AR2,P#0.0]; //P#0.0 entsprechen ersten Byte im DB ersetzen

      L     MW    20; 
      LOOP  NEXT; 

NETWORK
TITLE =Pointer bilden

      L     MW    10; 
      SLD   3; 
      L     MW    12; 
      OD    ; 
      LAR1  ; 

NETWORK
TITLE =
      AUF   DB10
      U     M     99.0; //Freigabe Ausgabe
      =     DBB [AR1,P#0.0]; //P#0.0 entsprechend durch erstes Byte ersetzten
Bei näheren Fragen, einfach noch mal melden.

P#0.0 ist der Offset zum AR1 bzw. AR2, gehen deine Bits im DB z.B. bei Byte 10 an schreibst du P#10.0

Was bei dieser Art noch zu empfehlen ist ist eine Limitierung der Fehlernummer, da ansonsten im schlimmsten Fall auch die CPU auf Stop gehen kann. (Falls es ein indirekt addressiertes Byte nicht gibt im DB)

Mfg
Manuel
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!Sollte es nicht im letztem Netzwerk nicht
= DIX [AR1,P#0.0] heissen? Ich kann ja nicht mit = ein Byte zuweisen.
Und wenn ich es so programmiere, geht meine 312 auf Stop :-(
Aber ich suche noch, woran es liegt.

bis dann,
Nico
 
Ich bin es nochmal.
Natürlich soll es nicht DIX, sondern DBX heissen, und dann klappt es auch!
 
Zurück
Oben