TIA Messwerte aufnehmen

christian_87

Level-1
Beiträge
33
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo bin Neuling was das Thema SPS-Programmierung.Ich möchte 100 Messwerte aufnehmen und das wollte ich in SCL mit einer For-Schleife realisieren wo dort die Werte in ein Array geschrieben werden aber irgendwie komm ich da nicht weiter:confused: Oder gibts eine andere Möglichkeit das in KOP zu machen ?

A Array [1..100] of Bool
i int
Messwert int


FOR #i:= 0 TO 100 BY 1 DO
#A[#i] := #Messwert;


END_FOR;
 
Hallo Christian_87,

ich bin zwar auch ein Anfänger aber ich versuch mal zu helfen.

Ich gehe mal davon aus, dass du Zahlen (int) und kein BOOL aufnehmen willst.

Wo bekommst du denn deine Messwerte her?
VAR_IN?
Wenn ja dann kannst du keine For-Schleife nehmen, da du den Baustein öfter aufrufen musst um Werte einzulesen.

Mal ein Beispiel:

Function_Block FB1

CONST
Laenge := 100;
END_CONST

VAR_INPUT
Messwert : INT;
END_VAR

VAR
Messwerte : Array[0..Laenge] of INT;
i : INT;
END_VAR

IF i > Laenge then
i :=0;
END_IF;

Messwerte := Messwert;
i := i+1;

End_Funktion_Block

Ich hoffe es hat geholfen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Welche CPU benutzt Du?
Willst Du in jedes Element des Arrays den gleichen Wert schreiben? :confused: Jedenfalls würde das Deine FOR-Schleife machen.

Die Idee ein Array für die Speicherung von 100 Meßwerten zu nutzen ist schonmal gut, doch muß das Array dann vom Typ der einzuspeichernden Meßwerte sein - also wohl eher REAL als BOOL.

Daß eine SPS das Anwenderprogramm zyklisch bearbeitet weißt Du schon?
Wo kommen Deine Meßwerte her?

Ich schätze, Du brauchst eher einen Trigger oder ein Event, wenn ein neuer Meßwert vorliegt. Dann speicherst Du den Meßwert an die nächste (freie) Stelle in das Array und erhöhst einen Zähler (Pointer), der Dir anzeigt, wie weit das Array nun gefüllt ist. Wenn das Array voll ist (der Zähler also bis 100 gekommen ist), dann darfst Du nicht weiter in das Array schreiben, denn dann zeigt Array[#pointer] schon außerhalb des Arrays.

Harald
 
Danke erstmal für die Antworten!
Das ist eine CPU 1215 DC/DC/DC mit zusätlichem analogen signal board wo ich ein Signal von 0...10V auswerte.Es dient zur Drehmomentenaufnahme von einem Motor,ich möchte um die 100 Messwerte + - aufnehmen und dann auswerten ob das Drehmoment im Toleranzbereich liegt.Es wird ein Schraubvorgang überwacht.Also der Wert ändert sich.Eventuell will ich auch noch einen Mittelwert bilden.Einen Trigger selbstständig zu setzen hab ich mir auch schon so überlegt aber ich dachte die For Schleife springt oben immer wieder rein :confused:
 
Eine FOR-Schleife wird in einem Rutsch komplett durchlaufen (so oft wie angegeben). So sind FOR-Schleifen nun mal ... ;)

Du müßtest festlegen, wie oft (alle wieviel ms) Du den Meßwert vom Signal Board in das Array speichern willst/mußt --> danach richtet sich, wie Du den Speicherungs-Trigger erzeugst. Und wielange die Gesamt-Aufzeichnungsdauer sein soll --> danach richtet sich die Größe des Arrays.
Das Programmbeispiel vom Florian würde bei jedem Baustein-Aufruf (also wahrscheinlich in jedem OB1-Zyklus einmal) den Meßwert in das Array schreiben. Nach 101 Aufrufen - vielleicht nach 345ms? - wäre das Array voll. Je länger das komplette Programm wird, desto länger und unberechenbarer würde es dauern.

Und ein spezieller Tip für Programmier-Anfänger: beim Programmieren kommt es durchaus auf die Details drauf an. Wenn ein Array[1..100] deklariert ist, dann sollte man nicht versuchen die Elemente Array[0] bis Array[100] anzusprechen. Eine SPS mag das überhaupt nicht. Weiters: ein Array[0..100] enthält 101 Elemente, nicht nur 100.

Harald
 
Danke!
Zwei Fragen hab ich noch.Beispielsweilse ich setze den Trigger alle 5ms selber dann bekomm ich ja den Messwert immer nur alle 5ms oder wenn der Zyklus länger dauert dann mehr als 5ms, wäre es besser den Schraubvorgang dauerhaft zu überwachen?und die Messwerte nur Mittelwertübergabe zu nutzen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gibt es von dem Meßvorgang ein Ende-Signal? Oder ein Jetzt-Speichern-Signal?
Oder willst Du kontinuierlich alle 5ms den aktuellen Meßwert wegspeichern?
Beschreibe doch mal, was Du da eigentlichen messen und speichern willst.

Wenn man in einem (kurzen) festen Zeitraster Werte erfassen will, dann nutzt man üblicherweise Weckalarme (OB3x) (ich habe keine Ahnung, wie die bei S7-1200 heißen). Der Weckalarm unterbricht das laufende Programm, speichert den Wert und setzt das unterbrochene Programm fort. So bekommt man die Werte in einen genauen festen Zeitraster.

Harald
 
Also ich steuere einen Motor über FU an. An der Welle des Motor befindet sich der Drehmomenten-Sensor von dem ich das Signal auswerten will. Beim Einschrauben gebe ich den FU einen bestimmten Winkel vor das er abfahren soll, und über einen Drehwinkelgeber errechne ich mir den Winkel. Von einem Winkel x kurz vor Ende des Schraubvorgangs bis zum Ende des abzufahrenen Profil des FU´s möchte ich das Drehmoment auswerten.
 
Also ich habs heute probiert so wie Florian es beschrieben hat,wo bekomm ich denn die in das Array geschriebenen Werte her bzw. wo werden Sie hinterlegt? Ich wollte jetzt noch den Mittelwert bilden aber dazu brauch ich ja die Werte, muss ich dazu einen extra DB anlegen oder wie wird das gemacht? :confused: Danke im VorrausUnbenannt.jpg
 
Zurück
Oben