AWL Problem in Step 7

bullimen

Level-1
Beiträge
45
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute
Ich bin ein Neuling was SPS Programmierung angeht, und verstehe nur sehr wenig AWL. Ich habe da eine Bitte. Könntet ihr euch mal folgende AWL anschauen und mir kurz beschreiben worum es geht. Der Teil stammt aus einer Störmelde-Erfassung und ich bin mir nicht im klaren was genau hier gemacht wird.

L P#0.0
T #sm_pointer1
Auf "DB2_Störungen"
L 14
schl: T #schleife1
L DBB [#sm_pointer1]
L 0
<> I
SPB sto1
L #sm_pointer1
L P#1.0
+D
T #sm_pointer1

L #schleife1
Loop schl
U "m_eins"
R "m_sammelstoer"
SPA end1
stol: SET
S "m_sammelstoer"

end1: NOP o

Ich kann zwar erkennen das es irgendwie um den Pointer und den DB2 geht aber der vollständige Sinn wird mir nicht klar.
Würde mich freuen wenn mir jemand auf die Sprünge helfen könnte.

Vielen Dank vorab!
Heiko:confused:
 
Code:
L P#0.0				//Pointerformat
T #sm_pointer1			//in Schmier-Variable kopieren
Auf "DB2_Störungen"		//DB2 mit den Bit-Störmeldungen öffnen
L 14					//Zahl 14 laden
schl: T #schleife1		//in den Schleifenzähler kopieren
L DBB [#sm_pointer1]	//Byte aus Störmelde-DB, auf welches der pointer zeigt laden
L 0					//0 laden
<> I					//Vergleich, ob das geladene Byte aus dem Störmelde-DB 0 ist
SPB sto1				//Wenn ja liegt eine Störung vor, Sprung zur Marke sto1
L #sm_pointer1			//Wenn nein, geht es hier weiter, Pointer laden
L P#1.0				//der Pointer soll um 1 erhöht werden, dazu diesen Pointer laden
+D					//addieren der beiden Pointer
T #sm_pointer1			//Pointer zurückschreiben, damit wurde der Pointer um 1 erhöht

L #schleife1			//Schleifenzähler laden
Loop schl				//wenn der noch nicht null ist, Sprung zur Marke schl und verrringern des schleifenzählers #schleife um 1 (macht alles der Befehl Loop!)
U "m_eins"			//dieser Merker ist wohl in deinem Programm immer auf 1 gesetzt
R "m_sammelstoer"		//Sammelstörung auf False, denn wenn das Programm bis zu dieser Stelle kommt, wurde die Loop-Schleife komplett durchlaufen, 14 Mal das jeweilige Byte auf Null vergleichen und kein Sprung nach stol ausgeführt, da alle Byte 0 waren!
SPA end1				//Sprung zum Ende
stol: SET				//hier wird hergesprungen, wenn der Vergleich feststellt, daß ein Byte <> 0 ist nd somit ein Fehler vorliegt
S "m_sammelstoer"		//setzen der Sammelstörmeldung

end1: NOP o

Kurz: Es werden die ersten 14 Byte des DB2 auf 0 vergleichen. Sind alle 0, wird die Sammelstörung auf False gesetzt, ist eines <> 0, wird die Sammelstörung auf True gesetzt.

PS: Diese Codedarstellung mit Kommentaren ist in unserem Forum leider der letzte Scheiß, ich die Kommentare einfach nicht an die gleiche Position :confused:
Hätte da mal irgendwer einen Tip? In der Textverarbeitung, in der ich die Kommentare eingefügt habe paßt es jedenfalls.

Hier nochmal eine Code-Version mit ungleicher Formatierung: :confused:, aber richtiger Anzeige:

Code:
L P#0.0			//Pointerformat
T #sm_pointer1		//in Schmier-Variable kopieren
Auf "DB2_Störungen"	//DB2 mit den Bit-Störmeldungen öffnen
L 14			//Zahl 14 laden
schl: T #schleife1	//in den Schleifenzähler kopieren
L DBB [#sm_pointer1]	//Byte aus Störmelde-DB, auf welches der pointer zeigt laden
L 0			//0 laden
<> I			//Vergleich, ob das geladene Byte aus dem Störmelde-DB 0 ist
SPB sto1		//Wenn ja liegt eine Störung vor, Sprung zur Marke sto1
L #sm_pointer1		//Wenn nein, geht es hier weiter, Pointer laden
L P#1.0			//der Pointer soll um 1 erhöht werden, dazu diesen Pointer laden
+D			//addieren der beiden Pointer
T #sm_pointer1		//Pointer zurückschreiben, damit wurde der Pointer um 1 erhöht

L #schleife1		//Schleifenzähler laden
Loop schl		//wenn der noch nicht null ist, Sprung zur Marke schl und verrringern des schleifenzählers #schleife um 1 (macht alles der Befehl Loop!)
U "m_eins"		//dieser Merker ist wohl in deinem Programm immer auf 1 gesetzt
R "m_sammelstoer"	//Sammelstörung auf False, denn wenn das Programm bis zu dieser Stelle kommt, wurde die Loop-Schleife komplett durchlaufen, 14 Mal das jeweilige Byte auf Null vergleichen und kein Sprung nach stol ausgeführt, da alle Byte 0 waren!
SPA end1		//Sprung zum Ende
stol: SET		//hier wird hergesprungen, wenn der Vergleich feststellt, daß ein Byte <> 0 ist nd somit ein Fehler vorliegt
S "m_sammelstoer"	//setzen der Sammelstörmeldung

end1: NOP o
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@ralle: benutze in deinem editor die schriftart courier new oder eine andere nichtproportionale schriftart (alle zeichen gleich breit). dann passt es auch im forum.

ich mach es meistens direkt mit step7, dann stimmt auch der abstand von befehl und operand :rolleyes:

[edit] und nicht den tabulator benutzen, das verstehts forum nicht [/edit]
 
Zuletzt bearbeitet:
Hallo zusammen
Ich kann mir nicht verkneifen hier meinen Senf dazuzugeben, auch wenn mich die Freunde der indirekten Addressierung wahrscheinlich dafür steinigen werden.
Bis vor ein paar Monaten habe ich diese Funktion so programmiert:
L DB2.DBD 0 // Störmeldungen 1...32
L 0
<>D
S "Sammelstörung"

L DB2.DBD 4 //Störmeldungen 33...64
L 0
<>D
S "Sammelstörung"

L DB2.DBD 8 //Störmeldungen 65...96
L 0
<>D
S "Sammelstörung"

L DB2.DBD 12 //Störmeldungen 97...128
L 0
<>D
S "Sammelstörung"



U "Quitt_Signal" //bei Quittierung Sammelstörung rücksetzen
R "Sammelstörung"

U "Quitt_Signal" //Störungen quittieren
SPBN M001
L 0
T DB2.DBD 0 // Störmeldungen 1...32
T DB2.DBD 4 // Störmeldungen 33...64
T DB2.DBD 8 // Störmeldungen 65...96
T DB2.DBD 12 // Störmeldungen 97...128
M001: NOP 0
Weniger Programmcode, einfacher zu programmieren und JEDER BLICKT DURCH!!!

Ich habe in der Zwischenzeit meine Arbeitsstelle gewechselt, und bin seitdem ständig mit indirekter Addressierung konfrontiert, bis auf wenige Ausnahmen sehe ich darin keinen Vorteil, mal ganz zu schweigen davon daß die Referenzdaten dir nicht mehr helfen können, wenn etwas "in unerklärlicher Weise" überschrieben wird.

Wie gesagt, die Freunde der indirekten Addressierung werden mich wahrscheinlich dafür in der Luft zerreissen (altmodischer S5-Kram etc.) aber vielleicht kann mir ja jemand mal anschaulich die Vorteile aufzeigen.

Mfg
Paul
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen
Ich kann mir nicht verkneifen hier meinen Senf dazuzugeben, auch wenn mich die Freunde der indirekten Addressierung wahrscheinlich dafür steinigen werden.
Bis vor ein paar Monaten habe ich diese Funktion so programmiert:

Weniger Programmcode, einfacher zu programmieren und JEDER BLICKT DURCH!!!

Ich habe in der Zwischenzeit meine Arbeitsstelle gewechselt, und bin seitdem ständig mit indirekter Addressierung konfrontiert, bis auf wenige Ausnahmen sehe ich darin keinen Vorteil, mal ganz zu schweigen davon daß die Referenzdaten dir nicht mehr helfen können, wenn etwas "in unerklärlicher Weise" überschrieben wird.

Wie gesagt, die Freunde der indirekten Addressierung werden mich wahrscheinlich dafür in der Luft zerreissen (altmodischer S5-Kram etc.) aber vielleicht kann mir ja jemand mal anschaulich die Vorteile aufzeigen.

Mfg
Paul


moin,

bei der indirekten Version sparst du Zeit, da bei der ersten gefundenen Störmeldung die Sammelstörung erkannt wird, und der Rest nicht mehr bearbeitet wird.

Ausserdem ist es flexibler, was die Länge des Störmeldebereiches angeht.
wenn z.B. im obigen Beispiel der Störmeldebereich nicht 14Byte lang ist, sondern 300Byte müsste mann nur
Code:
L 14
durch
Code:
L 300
ersetzen (oder man könnte es gleich parametrierbar machen, bzw Bausteinlänge vom Programm ermitteln lassen).
Damit hast du mit deiner Variante schon mehr Arbeit..

Micha
 
ich frag mich wirklich, wie man sich noch so konsequent gegen die indirekte adressierung wehren kann ... die vorteile hat dir SPSKILLER aufgezeigt ... bei anlagen mit mehr als 100 störmeldungen gehst du mit deinem weg einfach mal einen sehr unbequemen weg!

die nachvollziehbarkeit hängt auch immer stark mit der dokumentation des codes zusammen!
natürlich kann man hier und da indirekt adressieren, auch ein- undausgänge, und das mal unkommentiert so stehen lassen ... manchmal hat man halt nen schlechten tag, aber eigentlich geht es darum komfortablen code zu schreiben und die anwendung soweit zu optimieren, dass sie im grundkonstrukt wiederverwendbar ist (s.d.a. aus 14 einfach mal 300 byte machen), dieser gehört kommentiert und gut ist.

dazu kommt, dass hier nicht geschrieben, sondern nur gelesen wird und da ist die schleife über die entsprechenden bytes wirklich einfach nur praktikabel!

indirekte adressierung tut nicht weh! - sie erleichtert uns nur den täglichen wahnsinn...
 
Hallo 4L
ich frag mich wirklich, wie man sich noch so konsequent gegen die indirekte adressierung wehren kann
Ich wehre mich nicht grundsätzlich gegen indirekte Adressierung, ich denke nur manchmal "weniger ist mehr".

PS: Ich arbeite seit den Zeiten der S3 (nein nicht S5)nach dem Prizip "Learning by doing", manchmal ist das ganz schön hart.

MfG
Paul
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich frag mich wirklich, wie man sich noch so konsequent gegen die indirekte adressierung wehren kann
Wehren ist der falsche Ausdruck. Indirekt dort wo es Sinn macht aber nicht alles und jedes indirekt zu adressieren versuchen

indirekte adressierung tut nicht weh! - sie erleichtert uns nur den täglichen wahnsinn...
Ja, dem Entwickler, doch werden denkt an die Instandhalter? In einem fremden Programm einen Fehler zu finden ist nicht immer einfach und wenn dann noch indrekt jeder Mist adressiert wird, dann haben die Jungs keine Chance.

Ich bin der Meinung ich programmiere für den Kunden, dass der mit der Anlage produzieren kann und bei Störung schnell die Ursache erkennen kann und weiter Geld verdient, dann kann er neue Anlagen auch kaufen ;-)

bike
 
PS: Ich arbeite seit den Zeiten der S3 (nein nicht S5)nach dem Prizip "Learning by doing", manchmal ist das ganz schön hart.

ich habe in den 90ern mit S5 und S7-200 angefangen und bis heut nicht einen S- oder anderen progkurs besuchen dürfen :rolleyes:

@bike: ...und ich war auch mal instandhalter :ROFLMAO:
 
Zurück
Oben