Spannungsausfälle protokollieren

Hans_J

Level-1
Beiträge
33
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen!

Ich brauche dringend Hilfe!
Und zwar soll ich Mikrospannungsausfälle in meinem Programm dokumentieren, indem ich den Zeitpunkt (Datum und Uhrzeit) in einem Datenbaustein hinterlege. Insgesamt sollen 100 solcher Datensätze aufgenommen werden können.

Das Internet schreibt immer was von einer "READ_CLK" Funktion aber da steige ich nicht ganz durch...

Daten:
-S7 v5.5 2010
-CPU 417-4
 
Klemmts momentan daran, dass du die Uhrzeit nicht ermitteln kannst wenn du einen "Mikrospannungsausfall" detektiert hast? Oder klemmts daran, dass du den Zeitstempel nicht in dein Array mit den Datensätzen einsortieren kannst?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
An dem Ersten-Teil.

Leider habe ich noch nichts gefunden, wie man überhaupt Spannungsausfälle detektiert.
Des Weiteren finde ich nicht eine einfache Erklärung für das Auslesen von Zeit und Datum.
Es ist immer die Rede von der SFC1 und der READ_CLK Funktion aber wie genau ich daraus einen Datensatz bekomme ist mir schleierhaft.

Es tut mir leid ich steh noch am Anfang meiner Programmierlaufbahn...
 
OK, das ist doch noch relativ einfach.

wenn du die SFC1 aufrufst sieht das erstmal so aus:
Code:
      CALL  "READ_CLK"
       RET_VAL:=
       CDT    :=

Somit hast du zwei Aktualparameter anzugeben.
RET_VAL ist der Rückgabewert der SFC und gibt meistens Informationen über den Bearbeitungsstatus der SFC aus. Da beim Auslesen der Uhrzeit meines Wissens kein Fehler auftreten kann empfehle ich dir, eine Lokalvariable vom Typ Integer anzuparametrieren und diese nicht weiter zu beachten. Du musst aber eine Variable anparametrieren das dies bei SFC´s und FC´s zwingend notwendig ist.
Der Parameter CDT verlangt nach einer Variable vom Typ "Date and Time". Also deklarierst du eine Lokalvariable Systemzeit vom Typ DT und parametrierst diese an die SFC.
Die SFC1 schreibt dir jetzt zyklisch die Systemzeit in deine Variable Systemzeit.

Ihmo wird dein größtes Problem die Detektion deiner "Mikrospannungsausfälle". Möchtest du die auf der 24V-Seite - also nach dem Netzteil - oder auf der Netzseite erkennen?
 
Okay das hilft schon sehr weiter danke!

Ich kämpfe gerade noch mit dem vorletzten Satz.
Heißt das, dass die Variable vom Typ "Date and Time" jetzt immer die aktuelle Zeit und das Datum mit sich führt?

Zu den Mikrospannungsausfällen: Wo ich sie erkenne ist egal (je nach dem was einfacher umzusetzen ist
;))
 
Heißt das, dass die Variable vom Typ "Date and Time" jetzt immer die aktuelle Zeit und das Datum mit sich führt?

Genau das heißt es. wenn du jetzt einen Spannunseinbruch detektiert hast musst du dir nur noch die Systemzeit merken... ;-)

Ich denke, du wirst dir ein Ringpuffer aufbauen wollen und den Zeitstempel indirekt Adressiert in den Puffer eintragen wollen, oder?
 
Wie genau kann ich denn den Spannungsausfall detektieren?
Macht dort eine analoge Baugruppe zum messen der Netzteilspannung Sinn?

Zu dem Ringpuffer habe ich folgendes gefunden:

Code:
[COLOR=#000000][FONT=Arial]data_block Ringpuffer[/FONT][/COLOR]
[COLOR=#000000][FONT=Arial]  struct[/FONT][/COLOR]
[COLOR=#000000][FONT=Arial]     index : INT;[/FONT][/COLOR]
[COLOR=#000000][FONT=Arial]     zeiten : array [0..100] of DATE_AND_TIME;[/FONT][/COLOR]
[COLOR=#000000][FONT=Arial]  end_struct[/FONT][/COLOR]
[COLOR=#000000][FONT=Arial]end_data_block[/FONT][/COLOR]

[COLOR=#000000][FONT=Arial]Zugriff in SCL:[/FONT][/COLOR]

[COLOR=#000000][FONT=Arial]   Ringpuffer.zeiten[Ringpuffer.index] := uhrzeit_als_DATE_AND_TIME;[/FONT][/COLOR]
[COLOR=#000000][FONT=Arial]   Ringpuffer.index := Ringpuffer.index + 1

[/FONT][/COLOR]

Dann bräuchte ich nur noch so etwas wie:

Code:
 IF Ringpuffer.index > 99 THEN
Ringpuffer.index := 1;
END_IF;
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Hans.

Könntest du das wort "Mikrospannungsausfälle" mal genauer erklären?
Da gibt´s bestimmt 100 Möglichkeiten,
Vom Relais oder Schütz auf einen Di bis zum
Spannungswandler am Ai.

Gruß
Timo
 
Bei ganz kurzen Aussetzern oder Schwankungen könnte es schwierig werden das zu erfassen. Und wenn der Mikrospannungsausfall mal etwas länger dauert ist ja dann auch die Steuerung zum Erfassen aus ;)
 
Zuletzt bearbeitet:
Das ist nicht genau vorgegeben. Auf die Idee ein Signal am (Hilfs-) Schütz abzugreifen bin ich noch nicht gekommen. Ich hatte mir jetzt überlegt einfach eine Analoge Steckkarte zu verwenden und die Spannung des 24V-NT zu überprüfen. Hat die SPS-CPU denn eine Art mini-USV mit der sie einen Stromausfall von <1s überbrücken kann? Sonst könnte ich die Daten ja gar nicht verarbeiten.

*edit*
@Hohlkörper:
es sollen ausdrücklich NUR Spannungsausfälle mit <1s berücksichtigt werden. Alles da drüber interessiert uns nicht.;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du könntest ein Netzteil von Siemens mit Puffermodul verwenden, ich glaube damit kannst du 1-2 s überbrücken.

Wenn du deinen Zugriff auf den Ringpuffer schon in SCL proggst empfehle ich den Aufruf des SFC1 auch in die SCL-Quelle zu schmeissen.
 
Das kommt natürlich auch darauf an, was du für eine CPU hast,
bzw die Stromaufnahme dieser wäre interessant.
Um netzausfälle <1s zu überbrücken, nimmt man normalerweise sowas in der art:


Du kannst natürlich auch eine USV mit Akkus einsetzen,
wie gesagt, das ist alles von Stromverbrauch und der Überbrückungszeit abhängig.
http://shop.tohisparts.de/product_info.php?cPath=33&products_id=106
(Das nur mal als Beispiel)

Zu der "Schützvariante" muss ich noch sagen:
Das ist natürlich die einfachste, aber auch unzuverlässigste Methode!
Da kann es je nach Relais schon mal passieren, dass andere Geräte ausgehen,
bevor das Relais abfällt.
Das kann man aber an einem regelbaren Netzteil vorher mal versuchen, bei wieviel Volt
das Relais oder Schütz dann abfällt.


Gruß
Timo
 
Vielen Dank !
Mit dem detektieren des Stromausfalls ist jetzt alles in bestern Ordnung :)

Den Ringpuffer würde ich jetzt so gestalten:

Code:
DATA_BLOCK Zeiten_Spannungsausfall
STRUCT
Spannungsausfall : BOOL;
index : INT;
zeiten : ARRAY [0..100] OF DATE_AND_TIME;
END_STRUCT
BEGIN
END_DATA_BLOCK


FUNCTION ZeitenMerken : VOID
VAR_TEMP
x : INT;
jetzt : DATE_AND_TIME;
rv : INT;
reti: INT;
END_VAR
BEGIN

CALL "READ_CLK"(


IF Spannungsausfall THEN
rv := Read_Clk (CDT := jetzt);
x := Zeiten_Spannungsausfall.index;
Zeiten_Spannungsausfall.zeiten[x] := jetzt;
IF x = 100 THEN
Zeiten_Spannungsausfall.index := 0;
Stromausfall:= FALSE;
ELSE
Zeiten_Spannungsausfall.index := x+1;
Stromausfall:=FALSE;
END_IF;
END_IF;
END_FUNCTION

Berichtigungen sind erwünscht;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast du schon mal versucht das zu übersetzen?

Code:
DATA_BLOCK Zeiten_Spannungsausfall
STRUCT
    ZeigerRingpuffer : INT; // Zeiger auf Ringpuffer
    FHV_Sromausfall : BOOL; // Flankenhilfsvariable Stromausfall
    Zeiten : ARRAY [0..100] OF DATE_AND_TIME;
END_STRUCT
BEGIN
END_DATA_BLOCK

FUNCTION ZeitenMerken : VOID
VAR_INPUT
    Stromausfall : BOOL;
END_VAR
VAR_TEMP
    // temporäre Variablen
    
END_VAR
    // Zeiger auf Güligkeit prüfen
    IF Zeiten_Spannungsausfall.ZeigerRingpuffer < 0 OR Zeiten_Spannungsausfall.ZeigerRingpuffer > 100 THEN
        Zeiten_Spannungsausfall.ZeigerRingpuffer := 0;
    END_IF;
    
    // Daten sichern
    IF Stromausfall AND NOT Zeiten_Spannungsausfall.FHV_Stromausfall THEN
        rv := READ_CLK(CDT :=Zeiten_Spannungsausfall.Zeiten[Zeiten_Spannungsausfall.ZeigerRingpuffer]);
         
        // Zeiger inkrementieren
        Zeiten_Spannungsausfall.ZeigerRingpuffer := Zeiten_Spannungsausfall.ZeigerRingpuffer + 1;
        
    END_IF;
    
    // Flankenhilfsvariable sichern
    Zeiten_Spannungsausfall.FHV_Stromausfall := Stromausfall; 
END_FUNCTION
Hätte auch mal einen Versuch....
 
Bei diesem Code kommt bei mir die Fehlermeldung, dass die Komponente nicht vorhanden ist (bezogen auf die Funktion Zeiten_Spannungsausfall).
Es ist doch richtig, dass ich die Funktion in der Symboltabelle deklariere oder?
 
Es gibt keine Funktion Zeiten_Spannungsausfall. Das wäre dann ein Datenbaustein. Die Funtkion heißt ZeitenMerken. Aber das hab ich von dir so übernommen...
 
Ich finds ärgerlich, dass ich mir hier für ein (Hoch)Schulprojekt gedanken mache ohne das zu wissen. Der Fairness halber hättest du das schon erwähnen können. :-(
 
Zurück
Oben