Step 7 Prozessvisualisierung: Daten in einem Datenbaustein sammeln

Reibekuchen

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo :)

Ich (SPS Neuling) habe im Rahmen meines Studiums die Aufgabe bekommen, ein Programm zu erarbeiten, welches für eine Prozessvisualisierung Daten aus einem externen Gerät in einem Datenbaustein sammelt.

Es ist ein Funktionsbaustein mit folgenden Parametern zu erstellen:
- Nummer des zu verwendenden Datenbausteins
- Ein Eingangsparameter für die Informationen es externen Gerätes
- Die Anzahl der abzuspeichernden Informationen

Die Daten sollen ab dem Datenwort ANF gespeichert werden.

Nunja, das Problem bei der Sache ist, dass SPS für mich absolutes Neuland sind und ich mich erst einige Tage damit beschäftige.
Mir fehlt insgesamt ein Ansatz, wie ich an dieses Problem herangehen gehen könnte.

Habt Ihr vielleicht einen Tipp oder Denkanstoß für mich, wie ich mich diesem Problem annehmen kann? Im Moment weiss ich wirklich nicht so richtig weiter...


Schon einmal herzlichen Dank :)
 
Hallo Reibekuchen,

wie neu ist denn das Thema für dich? Kannst du einen FB erstellen? Weißt du was IN, OUT, STAT, TEMP usw. heißt? Dann schau mal nach dem Thema "Indirekte Adressierung". Vielleicht reicht das schon für einen ersten Ansatz.
Die Aufgabenstellung ist aber schon nicht ohne für einen Einsteiger...

Gruß Christian
 
Nicht ganz unwichtig ist auch die Information, für welche SPS Du das Programm schreiben willst, welches Entwicklungssystem Du verwenden mußt und auf welchem Weg die Daten des "externen Gerätes" in Deine SPS kommen.

Harald
 
Danke Euch :)

@ Christian
Also, grundsätzlich ist Programmieren für mich kein Neuland, jedoch war ich bisher immer in 'Hochsprachen' unterwegs.
So ein Paar Basics kann ich schon, einen FB erstellen und ein Logikabfragen etc. das klappt schon.
Mir fehlt nur für weiterreichende Sachen einfach die Praxis bzw. das Verständnis, was wofür eingesetzt wird etc.
Gibt es zur indirekten Adressierung eine Literatur- bzw. Website empfehlung?

@ Ralle
Danke, das werde ich mir ansehen.

@ Harald
Grundsätzlich soll das Programm nicht auf Hardware laufen. Vorgabe ist, dass das Programm in AWL für ein SIMATIC S7 System gelöst wird. Dazu wird Step 7 verwendet.
Was die Daten des "externen Gerätes" angeht, habe ich relativ freie Hand. Es soll sich um Daten wie Stückzahlen o.ä. handeln. Den Datenbaustein soll ich dabei selber "füttern".


Sorry, wenn ich an einigen Stellen etwas 'dümmlich' beantwortet hab. Tretet mir notfalls nochmal auf die Füße :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Grundsätzlich soll das Programm nicht auf Hardware laufen.
Auf was denn dann? :confused:
Oder ist die ganze Aufgabe rein theoretisch?
Unterstützt Dein "nicht-Hardware-System" wenigstens eine wie auch immer geartete indirekte oder indizierte Adressierung?

Harald
 
Zuletzt bearbeitet:
Die Aufgabe soll zu Hause gelöst und anschließend ausgedruckt abgegeben werden.
Zur Simulation verwende ich S7-PLCSIM.

Mit 'nicht auf Hardware' meine ich, dass ich es nicht auf einer SPS teste :)
 
Können wir dann also davon ausgehen, daß Du das Programm in AWL oder SCL für eine theoretische S7-300-CPU in Step7 V5.x schreibst und zum Test simulierst?

Deine Aufgabenstellung hast Du leider sehr schwammig formuliert. Wenn ich Dich richtig verstehe, dann würde ich Dein Problem so lösen, daß ich mir einen ANY-Pointer auf das Speicherziel [DB_Nr].[ANF] zusammenbastle (in TEMP) und dann den SFC20 BLKMOV benutze. Schaue Dir mal das Format des Datentyps ANY an.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Für die ganze Aktion wird wenn man es ordentlich macht überhaupt keine Indirekte oder Absolutadressierung benötigt, und auch kein Any-Gefrickel.

Der Baustein der die Daten des Gerätes einsammelt, bekommt dazu einen Ausgang entweder als struct oder udt in dem die Daten liegen. In dem Datenbaustein wird ebenfalls ein identisch aufgebauter struct/udt angelegt, und der Sammelbaustein bekommt dieses als Parameter.
Wenn du von "Hochsprachen"-Seite her kommst würdest du das doch genau so machen. Und nicht einer Funktion eine Adresse übergeben, und dann manuell irgendwelche Offsets daraufrechnen.
 
Hallo Reibekuchen,

die indirekte Adressierung habe ich auch nur an Beispielen von Kollegen und viel googeln gelernt.
Interessant ist z.B. das Dokument:
https://people.fh-landshut.de/~sbr/Vorlesung_SPS_Okt_2010_Teil2.pdf

Oder auch hier im Forum gibts ne Menge, z.B. das hier:
http://www.sps-forum.de/simatic/25020-s7-indirekte-adressierung.html


Für die ganze Aktion wird wenn man es ordentlich macht überhaupt keine Indirekte oder Absolutadressierung benötigt, und auch kein Any-Gefrickel.

Der Baustein der die Daten des Gerätes einsammelt, bekommt dazu einen Ausgang entweder als struct oder udt in dem die Daten liegen. In dem Datenbaustein wird ebenfalls ein identisch aufgebauter struct/udt angelegt, und der Sammelbaustein bekommt dieses als Parameter.
Wenn du von "Hochsprachen"-Seite her kommst würdest du das doch genau so machen. Und nicht einer Funktion eine Adresse übergeben, und dann manuell irgendwelche Offsets daraufrechnen.

@ Thomas: Wenn ich das richtig verstanden habe funktioniert das doch nur, wenn du vorher den DB kennst? Wenn die DB-Nr. als Variable übergeben wird komm ich soweit ich weiß nicht um indirekte Adressierung herum.

Gruß Christian
 
Für die ganze Aktion wird wenn man es ordentlich macht überhaupt keine Indirekte oder Absolutadressierung benötigt, und auch kein Any-Gefrickel.

Der Baustein der die Daten des Gerätes einsammelt, bekommt dazu einen Ausgang entweder als struct oder udt in dem die Daten liegen. In dem Datenbaustein wird ebenfalls ein identisch aufgebauter struct/udt angelegt, und der Sammelbaustein bekommt dieses als Parameter.
Wenn du von "Hochsprachen"-Seite her kommst würdest du das doch genau so machen. Und nicht einer Funktion eine Adresse übergeben, und dann manuell irgendwelche Offsets daraufrechnen.

Stimmt, man kann es gleich und auch richtig machen.
Seit es Pointer in der PLC gibt denkt jeder man muss diese verwenden.
Auf Ein- und Ausgänge mit einem Zeiger zugreifen war das Schönste und kann als Beispiel wie man es nicht machen soll, dienen.


bike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Können wir dann also davon ausgehen, daß Du das Programm in AWL oder SCL für eine theoretische S7-300-CPU in Step7 V5.x schreibst und zum Test simulierst?

Genau. Wobei die Vorgabe ist, dass das Programm in AWL realisiert werden soll.

Ich habe jetzt den ganzen Nachmittag und Abend damit verbracht, mich über indirekte Adressierung, Pointer etc. zu informieren.
Grundsätzlich bedeutet das doch einfach ausgedrückt, dass ich z.B. ein Datenwort in eine Adresse schreibe, die eine Variable enthält, oder?

So richtig weitergekommen bin ich aber irgendwie noch nicht...

Ich bin mir beispielsweise nicht sicher, ob der Datenbaustein, in welchem ich die Daten sammeln möchte, schon im Vorfeld erstellt wird, oder ob dies erst in der Laufzeit des Programms passiert - falls das überhaupt möglich ist.

Zudem frage ich mich, in welcher Form ich die 'Daten des externen Gerätes' an den Funktionsbaustein übergebe. Dies soll laut Aufgabenstellung durch einen Parameter WERT des Funktionsbausteines geschehen. Um mehrere Werte aufzunehmen, muss ich doch für jeden Wert den FB neu aufrufen, oder?

@ Thomas
Lässt sich dieser Ansatz auch in AWL umsetzen?

Sorry, falls ich blöde Fragen stelle, so langsam raucht mir der Schädel...
 
Ich bin mir beispielsweise nicht sicher, ob der Datenbaustein, in welchem ich die Daten sammeln möchte, schon im Vorfeld erstellt wird, oder ob dies erst in der Laufzeit des Programms passiert - falls das überhaupt möglich ist.
Möglich wäre es schon aber warum solltest du das tun wollen. Du erstellst ganz einfach selbst einen DB der zum Beispiel ein Array von x-mal "WERT" enthält.

Zudem frage ich mich, in welcher Form ich die 'Daten des externen Gerätes' an den Funktionsbaustein übergebe. Dies soll laut Aufgabenstellung durch einen Parameter WERT des Funktionsbausteines geschehen. Um mehrere Werte aufzunehmen, muss ich doch für jeden Wert den FB neu aufrufen, oder?
Da die SPS zyklisch läuft, wird dein FB sowieso (sofern man ihn nicht durch logische Bedingungen überspringt) in jedem Zyklus aufgerufen.
Deinen Messwert übergibst du in gewünschtem Format (Int/Real) an den FB. Zusätzlich wäre noch einen Art Trigger (Abtastsignal) gut, damit du dem FB sagen kannst: "Jetzt bitte speichern"

Wenn der FB den Trigger bekommt, kopiert er die Zahl am Eingang "WERT" in die nächst Freie Stelle deines Arrays. Je nach dem wie dein Puffer beschaffen sein soll (FIFO, FILO, Ringpuffer etc.) lässt sich das über den ein oder anderen Weg bewerkstelligen. Wie meine Vorredner schon sagten mit indirekter Adressierung oder vielleicht auch irgendwas mit SFC20 Blockmove.
Erzähl uns mal genauer wie deine Auszeichnung aussehen soll.

@ Thomas
Lässt sich dieser Ansatz auch in AWL umsetzen?
JA.
 
Hallo,
so habe ich das ganze mal gelöst. Hier wird allerdings immer um 1 hochgezählt und wenn die Max Zahl an Datensätzen geschrieben wurde wird der erste wieder
überschrieben. Den DB wo die Werte gespeichert werden sollen musst du vorher anlegen.

Baustein: FC35 Gewichtswerte in DB speichern

Netzwerk: 1 Datenbaustein indirekt aufschlagen
L #DeBe //Nr. des DBs mit Gewichtswerten
T #DBNr
AUF DB [#DBNr]

Netzwerk: 2 Ist_Zahl und Max_Zahl verwalten
L DBB 0 //Max_Zahl an Gewichtswerten im DB
L DBB 1 //Ist_Zahl gespeicherter Gewichtswerte
+ 1 //um 1..
T DBB 1 //..erhöhen
>=I //wenn Max_Zahl >= Ist_Zahl
SPB weit //springen (neue Ist_Zahl im Akku1)
L 1 //ansonsten
T DBB 1 //Ist-_Zahl auf 1 setzen

Netzwerk: 3 Adressberechnung und Ablage des Gewichts
weit: L P#2.0 //Adressberechnung:
*D //Ist_Zahl * P#2.0 = DBW-Adresse
T #Zeiger //Adresse des DBWs, in das jetzt geschrieben wird
L #Gewicht //aktuelles Gewicht
T DBW [#Zeiger] //in DBW ablegen

Gruss Dirk
 
Zurück
Oben