Abfrage Merkerwort mit Pointer

A

Anonymous

Guest
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo
In meinem S7-Programm einer S7-300 frage ich ein Merkerwort auf dezimale Zustände ab und setze mit dem Ergebnis einen Merker mit dem ich im OP eine Betriebsmeldung anzeige.

L MW80
L 1
= I
= M130.0

...
...
...
L MW80
L 20
= I
= M132.3

Dadurch habe ich natürlich Netzwerke ohne Ende. Das Ganze müßte doch auch mit einem Pointer zu machen sein. Hat jemand eine Idee ?
 

sps-concept

Well-known member
Beiträge
2.235
Punkte Reaktionen
251
CODE

Na hallo, würde sagen so:

Code:
      L     P#M 130.0                   // Pointer auf Anfang
      LAR1  
      L     0
      T     D [AR1,P#0.0]               // zuerst löschen
      T     D [AR1,P#4.0]               // weitere DWORD?

      L     MW    80
      +AR1  
      SET   
      =      [AR1,P#0.0]                // entsprechendes Bit setzen  
                                                // MW80 = 0 -> M130.0

je nach Grösse des abzufragenden Bereichs sind entsprechend viele MW/MD vor beschreiben zu löschen. Eine Einschränkung des Wertes von MW80 ist auch zu empfehlen, um auch nur gewollte Bereiche zu beschreiben.

MfG
André Räppel
 
OP
A

Anonymous

Guest
Zuviel Werbung?
->Hier kostenlos registrieren
Re: CODE

sps-concept schrieb:
Code:
      ...
      LAR1  
      L     0
      T     D [AR1,P#0.0]               // zuerst löschen
      T     D [AR1,P#4.0]               // weitere DWORD?
      ...

Hallo Andre,
ich habe einen kleinen, aber feinen Schönheitsfehler entdeckt.
Du solltest beim Ablöschen eines Doppelwortes immer

L L#0

benutzen. Ansonsten kann es sein, dass das Doppelwort nicht richtig abgelöscht wird.

Gruß
Max
 

sps-concept

Well-known member
Beiträge
2.235
Punkte Reaktionen
251
Fehler?

Hallo Max,

eigentlich nicht. Es wird zwar nur ein Wort geladen... aber das "nicht geladene Wort" des Doppelworts ist trotzdem 0. Siehe auch Siemens-Hilfe:

L <Operand> lädt den Inhalt des adressierten Bytes, Wortes oder Doppelwortes in AKKU 1, nachdem zuvor der alte Inhalt von AKKU 1 in AKKU 2 gespeichert wurde und AKKU 1 auf "0" zurückgesetzt wurde.

Das L#0 gibts nur zu Schönheitszwecken oder für Abfragen zB CMP == D wenn mit Typprüfung von Operanden gearbeitet wird - in AWL nicht relevant.

MfG
André Räppel
 
OP
A

Anonymous

Guest
Hallo,
habe ein ähnliches Problem, aber genau umgekehrt.
Störmeldungen laufen auf mehrere MW bitweise auf.
z.B.
u e 0.0 reset
r m 80.0 stm xy
u e 5.0 eingang stm xy
s m 80.0 stm xy
...
bis m 84.7

Diese Merkerworte möchte ich BCD-codiert (als "Störzahl") am AB 10 darstellen.
Ist dies auch über eine Pointerprogrammierung möglich?

Vielen Dank für eure Mühe
sps-fuzzy
 

sps-concept

Well-known member
Beiträge
2.235
Punkte Reaktionen
251

Peter Wahlen

Well-known member
Beiträge
385
Punkte Reaktionen
128
Störbits als Nummer anzeigen

Hallo sps-fuzzy,

ich habe mir so einen Baustein schon vor mehreren Jahren als S5 Baustein geschrieben und auch für S7 angepaßt.


Funktionsbeschreibung:

Ein Zähler wird bis Anzahl der Meldungen in jeden SPS Zyklus um 1 erhöht, bei max auf 0 gesetzt.
Aus dem Zählerstand und der Anfangsadresse der Meldungen wird das jeweilige Meldungsmerkerbit berechnet.
Wenn das Bit=0 dann weiter
Wenn das Bit=1 dann starte eine Anzeigezeit und halte für die Dauer der Anzeigezeit den Zähler an und gib den Zählerstand (evtl. BCD codiert) als Meldungsnummer aus.

Die Berechnung und Abfrage erfolgt so (bei S7):

L #Anfangsadresse
SLD 3
T #MBit // Pointer für Merker-Bit
L #Zaehler // Zählerstand (MW oder DBW)
+D
T #MBit // Pointer für Merker-Bit
U M [#MBit] // U M (Meldungsmerkerbyte.Bit)


mfg Peter
 
OP
A

Anonymous

Guest
Hi sps-concept

Danke für dein Programm, funktioniert wunderbar.

Ich bräuchte aber noch eine kleine Abänderung: Statt der Abfrage eines Merkerwortes soll ein Wort aus eines Instanz-DB, also eine lokale Stat-Variable verwendet werden. Ebenso natürlich auch statt den Pointer auf ein Merkerbit einen Pointer auf ein Bit in der Instanz, lokale Stat-Variable.

Vielen Dank
 

sps-concept

Well-known member
Beiträge
2.235
Punkte Reaktionen
251
Zuviel Werbung?
->Hier kostenlos registrieren
Instanz-DB

Hallo,

danke für die Rückmeldung - das is nich immer so. Wenn du ne Variable in nem Instanz-DB nehmen willst dann ist es doch sicher eine Variable aus einem FB. Direkt würde ich diese Variable nicht ansprechen, sonst würde es bei einer Multiintanz nicht funktionieren.

Code:
      L     P##Variable                  // Pointer auf Anfang 
      LAR1  
      L     0 
      T     D [AR1,P#0.0]               // zuerst löschen 
      T     D [AR1,P#4.0]               // weitere DWORD? 

      L     #StoerNr
      +AR1  
      SET    
      =      [AR1,P#0.0]                // entsprechendes Bit setzen

Habs nich probiert, denke aber es geht so. Die statische Variable verweist ja automatisch auf die Variable im Instanz-DB.

MfG
André Räppel
 
Oben