Wago 750 Messwerte in Array schreiben

emsbootsmann

Level-1
Beiträge
25
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich möchte ,wenn ein Triggersignal anstand, die Messwerte erst in einen Array schreiben und dann wenn die eingestellte Zeit abgelaufen ist den Array auslesen und in eine CSV Datei schreiben.
Wenn ich die Messwerte direkt in eine CSV Datei schreibe wird es zu langsam.Das dauert dann um die 60-80ms.Ich erhoffe mir das es beim Array schreiben schneller geht.Ziel ist es um die 10ms.
Wenn jemand eine andere Idee hat wäre es auch super.Kenne mich nicht so gut mit Wago aus,muss es aber realisieren.
Danke im vorraus.
 
Code:
HM_TRIG : P_TRIG;
Array[0..100] of INT; (War schon lange net mehr an der Wago, Syntax muss nicht stimmen)
Index : INT

HM_TRIG(Eingangstrigger); // Flanke erzeugen



IF HM_TRIG.OUT THEN

    Array[Index]:= Sensorwert; // Wert in Array schreiben
    Index:= Index + 1; // Index inkrementieren

END_IF

IF Index == 101 THEN

// CSV Schreiben (darfste selbst machen)

Index:=0; // Index rücksetzen


// Optional, nicht nötig aber "sauber"

While Index <= 100 DO // Array initialisieren
    Array[Index]:='';
    Index:= Index + 1;

END_WHILE

Index:=0; // Index rücksetzen

END_IF
Denke das sollte in groben Zügen stimmen, kein Gewähr!

MfG

Marcel

Edit: Ach ja, das Array ist hier auf 100 begrenzt, kannst du aber gern anpassen! Natürlich muss dann auch die 101 vor dem CSV schreiben angepasst werden
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
du möchtest also einen Kurvenverlauf oder ähnlich erst aufzeichnen und am Schluß dan abspeichern ?
Wenn ja ... ich gehe hierbei auch grundsätzlich so vor, dass ich solche Werte für die Dauer einer Freigabe in ein Array einlese und dann nach der Aufzeichnung damit arbeite. Dein Vorhaben ist also in dieser Form praktikabel.
Du solltest aber 1. berücksichtigen, dass du beim Aufzeichnen nicht über die Array-Grenzen hinaus schreibst und 2. dass du ein sinnvolles Aufzeichnungs-Intervall (also z.B. jede Millisekunde oder alle 5 ms oder ...) wählst.

Gruß
Larry
 
Erst mal danke an alle.
Was ist ein Fifo Buffer?

Ich will eigendlich so ca. alle halbe Stunde für ca. 2-3min Daten mitschreiben.Es werden dann 10 DI und 4AI mitgeschrieben.Es soll so schnell wie möglich Daten aufzeichen um im Fehlerfall der Anlage genau Daten zur Fehleranalyse zu bekommen.
Wenn ich jeden Zyclus die Daten direkt in die Datei schreibe dauert ein Datensatz ca.60-80ms.Das ist mir zu lang.Ziel ist es um die 10ms zu kommen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
FiFo - First in First out

Kannst ja mal Wikipedia bemühen.

Das brächstest du wenn du kontinuirlich aufzeichnest!

Ansonsten könnte man mein Programm um ein Array erweitern, wenn das erste Array voll ist es in das zweite Array schieben... dieses dann in die CSV... und wenn Schreiben fertig und Array1 wieder voll das selbe von vorn.

MfG

Marcel
 
...
Wenn ich die Messwerte direkt in eine CSV Datei schreibe wird es zu langsam.Das dauert dann um die 60-80ms.
...

Ich hatte vor einiger Zeit mal das Vergnügen mit einer Wago 750-841 eine Textdatei zu erstellen.

Der Trick bestand darin die Geschichte aufzuteilen in Programm Abarbeitung und Filehandling.
Das eigentliche SPS-Programm lief in einem zeitgesteuerten Task (z.B. 10ms) das Filehandling, erzeugen der Datei und in meinem Fall auch noch das versenden via FTP lief in einem zweiten Task der über die Prioritätssteuerung von dem SPS Task unterbrochen wurde.
 
timing Analog Eingang?

Ahoi EmsBootsMann,

Leider kenne ich die WAGO nur aus Hochglanzprospekten.

Aber, ganz allgemein:
Was für Analogeingänge hast Du?
Successive Approximation?
Bekommst Du die Analogwerte mit dieser hohen Geschwindigkeit?

Das Lesen eines Analogeingangs ist ein kleiner Ablauf, der entweder durch die Leseanweisung ausgelöst wird oder zyklisch über das Prozessabbild mit dem Timing der Haupttask.

Im ersten Fall (spontaner Zugriff) sollte die Reaktionszeit (Konversionszeit) in den technischen Daten des Analogmoduls dokumentiert sein.

Im zweiten Fall wird eine schnelle Leseschleife zum Laden eines Arrays während eines SPS Zyklus nur immer die gleichen Werte in das Array eintragen. Nur bei jedem neuen SPS Zyklus erhältst Du einen neuen Wert. Die von Dir beobachteten 60 - 80 ms riechen stark nach einer gemütlichen SPS Zykluszeit


BFlat
 
Guten Morgen.

Das mit den nach verschiedenen Prioritäten aufgerufenen Tasks kann man eher schlecht als Codebeispiel zeigen.

Schau mal im Reiter "Ressourcen" unter dem Knotenpunkt "Taskkonfiguration"

Dort kannst Du in der rechten Hälfte freilaufende, zyklische und ereignisgesteuerte Tasks (Unter-Programmaufrufe) definieren.

Wichtig ist , dass man nicht so wahnsinnig zeitkritischen Prozessen, wie z. B. Netzwerkkommunikation über SNMP eine Priorätät >13 zuordnet, damit diese nicht das System ausbremsen.

Ich meine noch zu wissen, dass die interne Visualisierung etwa eine Priorität von 11 hat.


Vielleicht hilft das schon mal ein wenig

Gruss

McNugget
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo

schau doch mal bei www.oscat.de vorbei , dort gibt auch eine oscat_network.lib (kostenlos, open source ...)
die enthält ein datalogger paket

also aufzeichnen von verscheidensten werte in eine datei (csv,html,xml)
versenden der datei per email, ftp usw...
 
Zurück
Oben