Sonstiges S7 200 libnodave

Lutz99999

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe eine S7 200 mit 12 Analogeingängen, woran 12 Sensoren angeschlossen sind.
Ich möchte von den 12 Sensoren 8 mal ein Screenshot machen und dann mit libnodave in den PC einlesen.
Ich bräuchte mal einen Denkanstoß wie ich die 12 Sensorenwerte zwischenspeichere, damit ich sie dann auslesen kann.
Mit MerkerWörtern wäre es ja ein ziemlich grosser Aufwand. Ich denke das man irgendwie einen Zähler benutzen sollte, aber wie speichere ich die Werte zählergesteuert zwischen z.B. in einer Datenseite?
Hat jemand eine Idee wie ich das effektiv löse?
Das einzige was ich beherrsche ist FUP.

Danke Lutz
 
Wann soll denn die SPS die Werte speichern?
Du brauchst einen Trigger, der das Speichern auslöst, wahrscheinlich mußt Du den Trigger per Flankenauswertung auf 1 Zyklus verkürzen.
Zwischenspeichern kannst Du die Werte im Variablenspeicher V...

Am schnellsten und besten lesbar programmierst Du, wenn Du alle 8x die 12 Werte speichern komplett ausprogrammierst:
Code:
//Network
LD     V1.0              //Trigger 1
MOVW   AEW0, VW100
MOVW   AEW2, VW102
//...
MOVW   AEW22, VW122

//Network
LD     V1.1              //Trigger 2
MOVW   AEW0, VW124
MOVW   AEW2, VW126
//...
MOVW   AEW22, VW146

//...

//Network
LD     V1.7              //Trigger 8
MOVW   AEW0, VW268
MOVW   AEW2, VW270
//...
MOVW   AEW22, VW290

Etwas kürzer aber komplizierter geht es per indirekter Adressierung.
In der S7-200 geht indirekte Adressierung auch in FUP:
Code:
LD     V2.0                        //Trigger
MOVW   VW10, AC1                   //VW10: Zähler 1..8
DECW   AC1                         //0..7
*I     +2, AC1                     //*2 wegen Word-Abstand
MOVD   &VB100, AC0                 //Anfangsadresse VB100
+D     AC0, AC1                    //dazuaddieren
MOVW   AEW0, *AC1
+D     2, AC1                      //nächste Speicheradresse
MOVW   AEW2, *AC1
//...
+D     2, AC1
MOVW   AEW22, *AC1
Für FUP schalte in MicroWin die Ansicht auf AWL, kopiere den AWL-Code von hier in MicroWin und schalte danach die Ansicht auf FUP.

Das Auslesen mit Libnodave mußt Du manuell anstoßen oder Deine PC-Applikation muß zyklisch eine Variable lesen, welche vom Programm gesetzt wird, wenn neue Werte gespeichert wurden.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

vielen Dank für deine Antwort . Ich werde wohl die längere Variante bevorzugen, weil es irgendwann leichter lesbar ist.
Ist es ein Unterschied ob ich ein MW nehme oder ein VW?

Gruß Lutz
 
Bemüht man sich, einen vernünftigen Kommentar zur "kurzen" Variante zu verfassen, so ist dieser Weg noch in vielen Jahren les- und vorallem nachvollziehbar!

Der wesentliche Unterschied zwischen Variablenspeicher(V) und Merkerbereich(M) ist die Menge verfügbarer Speicherzellen.
Der remanente Merkerbreich ist nur 32Byte lang.
 
Bemüht man sich, einen vernünftigen Kommentar zur "kurzen" Variante zu verfassen, so ist dieser Weg noch in vielen Jahren les- und vorallem nachvollziehbar!
Das ist korrekt, aber:
Das einzige was ich beherrsche ist FUP.
Deshalb habe ich zuerst die direkt ausprogrammierte Variante gezeigt. Wenn man nur FUP kann, dann ist indirekte Adressierung eher eine Stufe zu hoch. Womöglich auch noch in einer Schleife...

Ich werde wohl die längere Variante bevorzugen, weil es irgendwann leichter lesbar ist.
Das bestätigt meine Vermutung.

Mit BLKMOV_W geht es sogar noch kürzer. Bei nur 8x 12 Werten kopieren übersteigt der Aufwand für die Pointerberechnung die direkte Geradeaus-Programmierung, welche nur 16 Operationen erfordert:
Code:
//Network
LD     V1.0              //Trigger 1
BMW    AEW0, VW100, 12

//Network
LD     V1.1              //Trigger 2
BMW    AEW0, VW124, 12

//...

//Network
LD     V1.7              //Trigger 8
BMW    AEW0, VW268, 12

Libnodave muß dann VW100 bis VW290 auslesen, der VW-Speicher wird als DB1 adressiert: DB1, DBB100, 192 Byte
Code:
daveReadBytes(dc, daveDB, 1, 100, 192, 0)

Harald
 
Du wolltest doch sicher bemerken, dass der gesamte Merkerbereich nur so groß ist, oder?
Egal ob remanent oder nicht.
;)

ich wollte bemerken, dass der gesamte Merkerbereich remanent ist ... geschriebenes Wort - Teufelszeug!

@PN/DP: ich möchte keine Grundsatzdiskussion zu Darstellungsformen der Programmierung und deren Verständnis vom Zaun brechen, halte es aber für angezeigt, dem Fragensteller nahezulegen sich in näherer Zukunft neben FUP auch mit einer reinen Textdarstellung, z.B. AWL auseinanderzusetzen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich wollte bemerken, dass der gesamte Merkerbereich remanent ist ... geschriebenes Wort - Teufelszeug!
Auch nicht.


Man kann den gesamten Merkerbereich remanent einstellen, wenn man möchte. Standardmäßig sind die ersten 14 Byte nicht remanent, um deren (im Gegensatz zu den restlichen 18 Byte) nullspannungsfestes Speichern bei Spannungsunterbrechung nur bei bewusster Remanenzeinstellung herbeizuführen.
[/Klugscheißermodus]

:ROFLMAO:
 
@Harald

vielen Dank für die genaue Beschreibung, ich benutze eine SPS nur sehr selten, deshalb kenne ich auch nur die einfachen Bausteine.
Sonst lese ich die Analogeingänge immer direkt mit Libnodave, jetzt erfolgt der Screenshot aber so schnell, das ich mit dem direkten Auslesen zeitlich nicht hin komme.
Ich habe es jetzt so gemacht das ich die VW in der Symboltabelle deklariert habe.
Ist es sinnvoller sie in einer Datenseite zu deklarieren oder ist es egal?

Gruß Lutz
 
Zurück
Oben