Eingangsänderungen erkennen und Speichern

Topse

Level-1
Beiträge
34
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo da draußen,

Da ich mich noch nicht lange mit SPS Programmierung beschäftige, fällt mir folgende Aufgabenstellung reichlich schwer.
Aufgabenstellung:
Ich muss eine bestimmt Anzahl an Eingängen überwachen. Sobald sich einer der Eingänge ändert muss das geänderte Eingangsbyte das Datum und die Uhrzeit gespeichert werden.
*********************************************************
Auswertung der Zustandänderung der Eingänge
*********************************************************
L EB 0 //zu überwachendes Eingangsbyte
L MB 10
<>I
= M 20.0 //sobald das alte EB nicht mit dem aktuellen übereinstimmt
L EB 0 // wird m20.0 gesetzt
T MB 10
********************************************************

Mit dem SFC1 lese ich Datum und Zeit aus und schreibe es auf die Variable
#OUT_UHRZEIT_DATUM (Variable umfasst 8Bytes)

Anschließend wird mit dem SFC20 die Variable #OUT_UHRZEIT_DATUM in den DB100.DBX0.0 kopiert.
Soweit funktioniert es ja auch.

Mein Problem ist jetzt das ich bei jeder Änderung die alten Daten im DB mit den neuen Werten überschreibe. Wie kann ich das Programm ändern das sich die DB Adresse erhöt?????????????:twisted:

Das Eingangsbyte wird über den SFC20 in den DB100.DBB8 kopiert.
D.h. Bei der ersten Eingangsänderung sollen Datum und Zeit auf die Bytes
0 bis 7 im DB100geschrieben werden. Das Eingangsbyte soll auf das Byte 8geschrieben werden.
Bei der zweiten Änderung Datum u. Zeit auf Byte 10 bis 17 im DB100 und das EB auf Byte 18.
USW....

Danke schon mal.
Mfg Topse:-D
 
Wenn du es mit dem SFC20 kopierst ist es eigentlich kein Problem. Du mußt den Any für das Ziel selbst zusammenbauen und die Adresse entsprechend berechnen. Siehe dazu hier im Forum in der FAQ unter Any und Pointer, sowie FIFO und LIFO. Auch in der Forums-Suche findest du unter diesen Stichwörtern alles, was du brauchst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Ralle,

das mit dem Any Pointer habe ich jetzt verstanden. Das klappt soweit auch.
Jetzt müsste ich nur noch die Sache mit dem automatisch hochzählen in den Griff bekommen.:-D

Gibt es da so etwas wie FOR-Schleifen zum automatischen zählen bei S7???
Oder muss man das wieder selber zusammen bauen?

Vielleicht kann mir da jemand weiterhelfen.

Grüße
 
Bau Dir am besten einen UDT zusammen, 10 BYte lang mit deine Daten und ein bisschen Reserve und bau dann einen Pointer der immer 10 Byte weitertaktet.
Sehe kein Problem darin.
 
Danke Ralle,

das mit dem Any Pointer habe ich jetzt verstanden. Das klappt soweit auch.
Jetzt müsste ich nur noch die Sache mit dem automatisch hochzählen in den Griff bekommen.:-D

Gibt es da so etwas wie FOR-Schleifen zum automatischen zählen bei S7???
Oder muss man das wieder selber zusammen bauen?

Vielleicht kann mir da jemand weiterhelfen.

Grüße

Den einzigen Automatismus für Schleifen in AWL stellt die Loop-Anweisung dar, ansonsten macht man das "von Hand" mit Zählvariablen, Vergleichern und Sprüngen. In SCL gibt es die meißten der aus Pascal allgemein bekannten Sprachelemente.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmal danke,

das waren alles heiße Tipps di mir weiter geholfen haben.
Ihr müßt wissen ich beschäftige mich erst seit knapp 2 Monaten mit S7.
Die ganzen Themen Pointer, DB, ... wende ich das erste mal an, doch dank diesem Forum geht das recht gut.

Hallo dtsclipper,

das mit dem weitertakten ist klar aber ich bin bisher mit meinen Ansätzen immer gescheitert. Das ist mein variabler Pointer.

L B#16#10 //10h für s7
T LB 10

L B#16#E //Typ Date and Time
T LB 11

L 1 //Anzahl (Wiederholungsfaktor)
T LW 12

L 100 //Datenbaustein
T LW 14
Hier ist mein Knackpunkt, wie sage ich Ihm das er bei jeder Änderung 10Bytes weiterspringen soll???????:twisted:
L 0 //Anfangsadresse des Datenbausteins
SLD 3 //Pointer bauen
T LD 16

L B#16#84 //Speicherbereich (Datenbaustein)
T LB 16
 
Stimmt, ich gebe Dir recht, so gehts nicht.

Im Moment sehe ich nur Lokalvariablen, willst Du die Daten in der Instanz ablegen?
Oder gibt es einen DatenDB dafür?
Wennja, welche Struktur?

Poste auch mal wie der SFC 20 bei Die anparametriert ist, das könnte mir helfen.

Ansonsten :
Du hast die Anfangsadress ja schon geposted.
ES gelt doch nur noch darum den Pointer dann weiterzuschieben.

L B#16#10 //10h für s7
T LB 10

L B#16#E //Typ Date and Time
T LB 11

L 1 //Anzahl (Wiederholungsfaktor)
T LW 12

L 100 //Datenbaustein
T LW 14
Hier ist mein Knackpunkt, wie sage ich Ihm das er bei jeder Änderung 10Bytes weiterspringen soll???????
L mw128
L 10
+I
T mw128
SLD 3 //Pointer bauen
T LD 16

L B#16#84 //Speicherbereich (Datenbaustein)
T LB 16

Ich hätte es aber ganz anders gemacht, gebe keine Garantie auf die Lösung!!!!

;) ÜBERNAHME NICHT FÜR SCHULAUFGABEN ZUGELASSEN :ROFLMAO:
 
Danke dtsclipper,

des war wieder ein heißer Tipp. Ich hab des jetzt mit bestimmten Sprungen gemacht. Er soll immer dann wenn er eine Eingangsänderung erkennt den Wert des MW um 10 erhöhen. So wie es ausschaut klappt es. Ich hab des über einen DB gemacht.

Herzlichen dank.

Gruß Topse
 
Zurück
Oben