Step 7 Vergleich Merkerdoppelwort auf ungleich Null

Zuviel Werbung?
-> Hier kostenlos registrieren
Einfach den Code 4-mal eintippen, und fertig.

Wenn du willst, kannst du dich üben eine Schleife zu programmieren.
Es lohnt sich wenn du irgendwann in den Zukunft nicht 2, 4 oder 8 Bytes behandeln muss, sondern 1000.
#ALARMMEM muss dann aber 4x unterschiedlich sein, richtig?

Hm ja - ich versuche (nachdem es auf die andere Weise klappt) das mal mit einer Schleife zu lösen... bin ja neugierig! ;)
 
Da es also tatsächlich um die Signalisierung von Neustörung bei mehr als 32 Bit geht: schau dir mal diese Diskussion mit Beispielcode an.

Harald

Naja, es geht um Meldungen (wichtig für Bedienpersonal), wobei aber die Maschine weiterarbeiten kann. Es sind sozusagen keine Störungen und werden in einer Meldeanzeige dargestellt. Soweit funktioniert das jetzt auch mit der 4x-Abfrage prima!

Etwas eleganter wäre es nun noch (wie von JesperMP vorgeschlagen) das Ganze in eine Schleife zu packen. Wäre dann vermutlich auch weniger Code...

Mal sehen ob mir das gelingt... habe da so meine Zweifel! :confused:
 
Hallo Ihr,

ich glaube ich brauche euch doch nochmal... habe mich gestern noch etwas mit Loop-Schleifen in AWL beschäftigt. Bin jetzt zumindest soweit, dass ich eine einfache Schleife hinbekomme, die z.B. in einem MW eine Subtraktion durchführt.

Aber für mein eigentliches Problem finde ich keinen Ansatz.

Ich habe jetzt folgenden Code bei mir programmiert:

Code:
      L     MD70
      INVD  
      L     DB30.DBD16
      UD    
      L     L#0
      <>D   
      S     A2.0
      L     DB30.DBD16
      T    MD70

      L     MD74
      INVD  
      L     DB30.DBD20
      UD    
      L     L#0
      <>D   
      S     A2.0
      L     DB30.DBD20
      T     MD74

Das Ganze zwar 4x, ist aber erst mal unerheblich.

Nun kam ja von JesperMP der Vorschlag, man könnte das auch in eine Schleife packen. Lohnt wohl bei dem kurzen Code nicht wirklich, es geht mehr um das WIE?

Ich überblicke gar nicht, was ich da z.B. Laden muss - in einer Loop-Schleife wird ja am Ende immer um Eins erniedrigt und solange gesprungen, wie der Inhalt vom Akku <>0 ist.

Lieben Dank!


Nachtrag... Bin grad an so ner Pointer-Sache mit Schleife dran und möchte gerne das Datendoppelwort laden:

Code:
L DBD [#pointer1]

Bekomme aber die Meldung: Keine indirekten Operationen erlaubt für FC-Parameter pointer1

Sollte aber doch eigentlich klappen, oder?
 
Zuletzt bearbeitet:
Aber für mein eigentliches Problem finde ich keinen Ansatz.

Ich habe jetzt folgenden Code bei mir programmiert:
Funktioniert Dein Code nicht wie gewünscht?

Ich glaube nicht, daß man folgende kurze Codesequenz durch eine Schleife mit indirekter Adressierung irgendwie kürzer fassen könnte:
Code:
      L     MD    70
      INVD  
      L     DB30.DBD   16
      T     MD    70
      UD    
      U     <>0
      S     A      2.0

      L     MD    74
      INVD  
      L     DB30.DBD   20
      T     MD    74
      UD    
      U     <>0
      S     A      2.0

      L     MD    78
      INVD  
      L     DB30.DBD   24
      T     MD    78
      UD    
      U     <>0
      S     A      2.0

      L     MD    82
      INVD  
      L     DB30.DBD   28
      T     MD    82
      UD    
      U     <>0
      S     A      2.0


Nachtrag... Bin grad an so ner Pointer-Sache mit Schleife dran und möchte gerne das Datendoppelwort laden:

Code:
L DBD [#pointer1]

Bekomme aber die Meldung: Keine indirekten Operationen erlaubt für FC-Parameter pointer1
#pointer1 muß in FC ein DINT oder DWORD in TEMP oder MD... oder DB... sein - also eigentlich ist nur TEMP sinnvoll. #pointer1 muß vor Verwendung zur speicherindirekten Adressierung von FC-IN nach TEMP kopiert werden.

Was soll Deinem FC denn übergeben werden? Du bräuchtest ja 2 Pointer auf 2 (Bit-)Felder (oder 1 Pointer, wenn die Adressen von Jetzt-Feld und Vorher-Feld in einem günstigen/berechenbaren Zusammenhang stehen) und eine Bereichs-Längenangabe (oder halt feste Anzahl für soundsoviele Byte).
Allerdings: alleine die Pointererstellung und -incrementierung ist schon viel aufwendiger als obiger direkter Code. Außerdem verlierst Du dadurch die Referenzdaten auf die bearbeiteten Speicheradressen.

Harald
 
Funktioniert Dein Code nicht wie gewünscht?

Ich glaube nicht, daß man folgende kurze Codesequenz durch eine Schleife mit indirekter Adressierung irgendwie kürzer fassen könnte.

Danke Harald,

doch mein Code funktioniert prima! ;)

Wobei ja aber auch noch 4x die Abfrage hinzukommt, ob die DBD's = 0 sind und der Ausgang rückgesetzt werden kann. Ist ja auch noch a bisserl Code.

Das Schleifen-Konstrukt soll "nur" eine Übung sein...


#pointer1 muß in FC ein DINT oder DWORD in TEMP oder MD... oder DB... sein - also eigentlich ist nur TEMP sinnvoll. #pointer1 muß vor Verwendung zur speicherindirekten Adressierung von FC-IN nach TEMP kopiert werden.

Harald

Habe nun anstatt

Code:
L DBD [#pointer1]

einfach

Code:
L DBD [MD20]

programmiert. Nun klappt mein Konstrukt sogar; toll oder? :D


Nachfrage: Angenommen ist würde das mit #pointer1 und TEMP machen; kann ich dann nicht direkt

Code:
L DBD [#pointer1]  // pointer_1 ist eine TEMP-Var!

programmieren? :confused:
 
Wobei ja aber auch noch 4x die Abfrage hinzukommt, ob die DBD's = 0 sind und der Ausgang rückgesetzt werden kann. Ist ja auch noch a bisserl Code.
Welchen Sinn soll die Abfrage der DBD auf 0 haben? :confused:
Entweder Du setzt den Ausgang zurück, weil die Meldung(en) gesehen und quittiert wurde, unabhängig davon ob die Meldung noch ansteht.
Oder Du kannst Dir den ganzen Flankenerkennungs-Aufwand sparen und aktivierst den Ausgang dann wenn irgendein Bit in den Meldungs-Doppelworten 1 ist, z.B. per ODER (OD) über alle Melde-Doppelwörter.

Ausgang Ein wenn irgendein Meldungsbit 1 ist:
Code:
      L     DB30.DBD   16
      L     DB30.DBD   20
      OD    
      L     DB30.DBD   24
      OD    
      L     DB30.DBD   28
      OD    
      U     <>0
      =     A      2.0

Das "bisserl Code" zum Rücksetzen wenn alle DBD 0 sind:
Code:
      L     DB30.DBD   16
      L     DB30.DBD   20
      OD    
      L     DB30.DBD   24
      OD    
      L     DB30.DBD   28
      OD    
      U     ==0
      U     "gesehen"
      R     A      2.0

Eventuell macht es Sinn, wenn Du uns die gewünschte Funktion für den Ausgang komplett beschreibst, dann können wir nach der passenden Lösung suchen.


Nachfrage: Angenommen ist würde das mit #pointer1 und TEMP machen; kann ich dann nicht direkt

Code:
L DBD [#pointer1]  // pointer_1 ist eine TEMP-Var!

programmieren? :confused:
Ja. Doch. Die Anweisung kannst Du genau so schreiben (vorher AUF DB nicht vergessen).
Kommt natürlich noch darauf an, was in #pointer1 drinsteht. Wenn Du DBD16 laden willst, dann muß in #pointer1 drinstehen: 16 * 8 = 128 dez = P#16.0 = DW#16#xx000080 (die obersten 8 bit xx sind egal / werden ignoriert)

Harald
 
Welchen Sinn soll die Abfrage der DBD auf 0 haben? :confused:
Entweder Du setzt den Ausgang zurück, weil die Meldung(en) gesehen und quittiert wurde, unabhängig davon ob die Meldung noch ansteht.
Oder Du kannst Dir den ganzen Flankenerkennungs-Aufwand sparen und aktivierst den Ausgang dann wenn irgendein Bit in den Meldungs-Doppelworten 1 ist, z.B. per ODER (OD) über alle Melde-Doppelwörter.

Lieben Dank Harald für die Hilfe!

Alsoooo, bei den Meldungen handelt es sich um keine Störmeldungen, bei denen die Maschine z.B. angehalten werden muss - sondern um eine Art Betriebsmeldungen, die den Bediener einfach nur über best. Situationen informieren. D.h. die Meldungen erscheinen in einer Meldeanzeige und können weggedrückt werden oder blenden von selbst aus, wenn keine Meldung mehr anliegt. Insoweit funktioniert das so alles schon sehr gut!

Ja. Doch. Die Anweisung kannst Du genau so schreiben (vorher AUF DB nicht vergessen).
Kommt natürlich noch darauf an, was in #pointer1 drinsteht. Wenn Du DBD16 laden willst, dann muß in #pointer1 drinstehen: 16 * 8 = 128 dez = P#16.0 = DW#16#xx000080 (die obersten 8 bit xx sind egal / werden ignoriert)
Harald

Ok, habe jetzt #pointer1 als TEMP im FC deklariert und wie folgt programmiert:

Code:
L DBD [#pointer1]


Soweit klappt das nun alles - hoffe, dass ich durch die Temp-Var später nicht einmal ein Problem bekomme? :confused:

Im #pointer1 steht Folgendes:

Code:
L P#16.0
T #pointer1
 
Zurück
Oben