Datei erzeugen und Variablen in Excel

Zuviel Werbung?
-> Hier kostenlos registrieren
ja habe ich gemacht aber er erzeugt die Datei nicht so wie du und ich es vielleicht gedacht haben, obwohl ich das mit eingefügt habe. Aber ich will da mal noch etwas probieren dran, um auch etwas dafür zu tun. Damit du stolz sein kannst auf mich. smilie

Bin nebenbei noch mit einem Emailversand und einer Sprachen umschaltung beschäftigt die ich ebenfalls noch mit einbinden möchte.

Bei der Emailerstellung ist halt das Problem das er keine 2 Empfänger akzeptiert. Zumindest nicht in meiner Schreibweise. Die Email kommt immer nur bei dem ersten an. Obwohl ich es so schreibe

VAR
bSend: BOOL;
bResult: BOOL;
stServerName: STRING(80):= '172.16.24.187';
szFrom: STRING(80):= 'mustermann@mustermann.de';
szTo: STRING(80):= 'chef@mustermann.de;techniker@mustermann.de';
szSubject: STRING(80):= 'Dies ist eine Fehlermeldung';
szBody: STRING(255):= 'Die Temperatur der Anlage ist überschritten';
END_VAR


IF bSend THEN
bResult:= FALSE;
bResult:= SendMail(
stServerName:= stServerName,
stFrom:= szFrom,
stTo:= szTo,
stSubject:= szSubject,
stBody:= szBody);
bSend:= FALSE;
END_IF

Normalerweise kannst du ja im Email Prog wenn du mehrere Emails hast sie alle mit einem ; hintereinander schreiben. Aber das Programm setzt nicht beide Emails ab.

Und bei der Sprachenumschaltung hab ich noch eine genau Idee wie ich das hinbekommen könnte. Ich da was gelesen das du ne xml datei erzeugen musst. Allerdings weis ich noch nicht wie ich dann jeweils die Button beschriften muss. Ob %s in dem Dialogfenster Text ausreicht oder nicht. Das probiere ich am Wochenende noch ein wenig rum. Weil es für mich immer noch darum geht ich brauch ja ein Querverweis auf die XML Datei. Mal schauen.
 
Zoto jetzt läuft es. Kann es aber sein das er zuviel Zeit braucht. Denn wenn ich ihm das Signal gebe und ihm es ca. 5 sekunden später wieder nehme dann sollten ja 2 Einträge in der Datei sein aber es immer nur eine. Muss ich jetzt mit einem Merker arbeiten der das im nachhinein noch reinschreibt, das er wieder geschaltet hat?

MFG Dennis
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zoto jetzt läuft es. Kann es aber sein das er zuviel Zeit braucht. Denn wenn ich ihm das Signal gebe und ihm es ca. 5 sekunden später wieder nehme dann sollten ja 2 Einträge in der Datei sein aber es immer nur eine. Muss ich jetzt mit einem Merker arbeiten der das im nachhinein noch reinschreibt, das er wieder geschaltet hat?

MFG Dennis
Ja das schreiben Dateien kann je nach Plattform richtig lange dauern. Ich hatte vor kurzem Messwerte auf einer WAGO 750-841 geschrieben die in einer kurzen abfolge kamen. Dann hat das Schreiben der Datei auch zu einer "Pause" des SPS-Zyklus geführt (ich hatte so ca. 3s).

Die Lösung hat sich dann aus zwei Bestandteilen zusammen gesetzt.

1. Nicht direkt alles schreiben sondern einen FIFO Buffer dazwischen bauen.

2. Habe ich einen Ereignisgesteuerten Task verwendet der eine geringere Priorität hatte als der bei mir Zyklische (also nicht Freilaufende) SPS Zyklus.

Ein Ereignisgesteuerter Task wird über den Flankenwechsel 0->1 einer Boolvariable gesteuert.

hier mal die Bilder zur Einstellung der Tasks.
 

Anhänge

  • Task10ms.jpg
    Task10ms.jpg
    99,2 KB · Aufrufe: 17
  • WriteDataTask.jpg
    WriteDataTask.jpg
    98,9 KB · Aufrufe: 17
Hi Zotos

Ich habe das Programm soweit fertig. Allerdings habe ich noch ein Problem welches ich ja schon versucht habe zu klären in meinem Programm aber es funktioniert nicht richtig.

Ich möchte an erster Stelle feststellen ob der Client Online ist. Das ganze versuche ich mit der xConnectionOk_client_1 Variable. Sollte der Client offline sein soll er es mir in die Datei schreiben. Jetzt ist es mittlerweile so das er es mir schreibt, aber auch schreibt er mir das das Thermometer nicht angeschlossen ist. Obwohl das ja noch nicht bekannt ist, weil der Client ja offline ist. Darüber kann ja nur eine genaue Auskunft erteielt werden in der Datei wenn der Client online ist.

Vielleicht kannst du dort mal drüber schauen wo mein Fehler ist. Ich selbst habe da das ganze Wochenende dran verbracht.

Hier die Variablen Deklaration:


PROGRAM Dateierzeugung
VAR
FileHandel : DWORD; (*Handel*)
FilePath : STRING := 'disk_mmc\'; (* Ich nutze die CoDeSysRTE und habe daher ein Dateisystem ala Windows *)
CurrentString : STRING; (*Temp String zum aufbauen der zu schreibenden Zeile*)
RetValWritten : DWORD; (*Rückgabewert der Schreibfunktion*)

Thermo_ort : STRING := 'SPS 1'; (*Inhalt Spalte Nr.3*)
Thermo_ok : STRING := 'Temperatur im grünen Bereich'; (*Inhalt Spalte Nr.4*)
Thermo_not : STRING := 'Thermometer nicht angeschlossen'; (*Inhalt Spalte Nr.4*)
Temp_ueber : STRING := 'Temperatur überschritten'; (*Inhalt Spalte Nr.4*)
Temp_unter : STRING := 'Temperatur unterschritten'; (*Inhalt Spalte Nr.4*)
Netzwerk_client_1_ok : STRING := 'Client 1 online'; (*Inhalt Spalte Nr.4*)
Netzwerk_client_1_not : STRING := 'Client 1 offline'; (*Inhalt Spalte Nr.4*)

MonatString : ARRAY[1..12] OF STRING(10) := 'Januar', 'Februar', 'Maerz', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember';
Monat_alt: INT := 0;

Thermometer_angeschlossen: BOOL;
Temperatur_ueberschritten: BOOL;
Temperatur_unterschritten: BOOL;
DatenString : STRING; (*Temp String zum schreiben der Zeile*)
DatenString_old : STRING; (*Temp String zum schreiben der Zeile*)
xConnectionOk_client_1_old: BOOL;
END_VAR



Hier das Programm:

(*Hilfsvariablen Deklaration*)
Thermometer_angeschlossen:=eingang_client_1[4]; (*Die eingang_client_1[] sind global Variablen*)
Temperatur_ueberschritten:=eingang_client_1[2];
Temperatur_unterschritten:=eingang_client_1[1];

DatenString:='test'; (*Hier wird ein DatenString festgelegt zum Schreiben der Datei*)

IF Monat <> Monat_alt THEN (*Hier wird der Monat für den DateiNamen festgelegt*)
FilePath := '\disk_mmc\Fehlermeldedatei_';
FilePath := CONCAT(FilePath, MonatString[Monat]);
FilePath := CONCAT(FilePath, '_');
FilePath := CONCAT(FilePath, INT_TO_STRING(Jahr));
FilePath := CONCAT(FilePath, '.csv');
Monat_alt := Monat;
END_IF

(* Öffne die Datei um Daten anzufügen *)
FileHandel:= SysFileOpen(FilePath, 'a');

(* Erkennen ob es eine neue Datei ist *)
IF SysFileGetPos(FileHandel) = 0 THEN
(* Belibige Gesamtüberschrift *)
CurrentString:= 'Fehlermeldedatei';
CurrentString:= CONCAT(CurrentString, '$R$N'); (* Zeilenumbruch *)
CurrentString:= CONCAT(CurrentString, '$R$N'); (* Zeilenumbruch *)
RetValWritten:= SysFileWrite(FileHandel, ADR(CurrentString), LEN(CurrentString));

(* Spaltenüberschrift *)
CurrentString:= 'Datum;Uhrzeit;Ort;Beschreibung';
CurrentString:= CONCAT(CurrentString, '$R$N'); (* Zeilenumbruch *)
RetValWritten:= SysFileWrite(FileHandel, ADR(CurrentString), LEN(CurrentString));
END_IF

(* Datei schließen *)
SysFileClose(FileHandel);


(* --Zeile zusammenbauen-- *)

(* Spalte 1: DATUM *)
CurrentString:= CONCAT(INT_TO_STRING(Tag), '.');
CurrentString:= CONCAT(CurrentString, INT_TO_STRING(Monat));
CurrentString:= CONCAT(CurrentString, '.');
CurrentString:= CONCAT(CurrentString, INT_TO_STRING(Jahr));
CurrentString:= CONCAT(CurrentString, ';');

(* Spalte 2: UHRZEIT *)
CurrentString:= CONCAT(CurrentString, INT_TO_STRING(Stunde));
CurrentString:= CONCAT(CurrentString, ':');
CurrentString:= CONCAT(CurrentString, INT_TO_STRING(Minute));
CurrentString:= CONCAT(CurrentString, ':');
CurrentString:= CONCAT(CurrentString, INT_TO_STRING(Sekunde));
CurrentString:= CONCAT(CurrentString, ';');

(* Spalte 3: NAME *)
CurrentString:= CONCAT(CurrentString, Thermo_ort);
CurrentString:= CONCAT(CurrentString, ';');

(* Spalte 4: MELDUNG *)

IF xConnectionOk_client_1 <> xConnectionOk_client_1_old THEN
(* Öffne die Datei um Daten anzufügen *)
FileHandel:= SysFileOpen(FilePath, 'a');
(* --Zeile zusammenbauen-- *)

(* Spalte 1: DATUM *)
CurrentString:= CONCAT(INT_TO_STRING(Tag), '.');
CurrentString:= CONCAT(CurrentString, INT_TO_STRING(Monat));
CurrentString:= CONCAT(CurrentString, '.');
CurrentString:= CONCAT(CurrentString, INT_TO_STRING(Jahr));
CurrentString:= CONCAT(CurrentString, ';');

(* Spalte 2: UHRZEIT *)
CurrentString:= CONCAT(CurrentString, INT_TO_STRING(Stunde));
CurrentString:= CONCAT(CurrentString, ':');
CurrentString:= CONCAT(CurrentString, INT_TO_STRING(Minute));
CurrentString:= CONCAT(CurrentString, ':');
CurrentString:= CONCAT(CurrentString, INT_TO_STRING(Sekunde));
CurrentString:= CONCAT(CurrentString, ';');

(* Spalte 3: NAME *)
CurrentString:= CONCAT(CurrentString, Thermo_ort);
CurrentString:= CONCAT(CurrentString, ';');

(* Spalte 4: MELDUNG *)
IF xConnectionOk_client_1 = TRUE THEN (*Hier soll überprüft werden ob Client 1 online ist und in die Datei geschrieben werden*)

CurrentString:= CONCAT(CurrentString, Netzwerk_client_1_ok);
CurrentString:= CONCAT(CurrentString, '$R$N'); (* Zeilenumbruch *)
END_IF

IF xConnectionOk_client_1 = FALSE THEN (*Hier wird festgestellt das Client 1 offline ist und in die Datei geschrieben*)
CurrentString:= CONCAT(CurrentString, Netzwerk_client_1_not);
CurrentString:= CONCAT(CurrentString, '$R$N'); (* Zeilenumbruch *)
END_IF

(* Zeile in die Datei schreiben *)
RetValWritten:= SysFileWrite(FileHandel, ADR(CurrentString), LEN(CurrentString));
(* Datei schließen *)
SysFileClose(FileHandel);
END_IF

IF xConnectionOk_client_1 = xConnectionOk_client_1_old THEN

IF Temperatur_ueberschritten AND Thermometer_angeschlossen THEN
CurrentString:= CONCAT(CurrentString, Temp_ueber);
CurrentString:= CONCAT(CurrentString, '$R$N'); (* Zeilenumbruch *)
DatenString:= CONCAT(DatenString, Temp_ueber);
END_IF

IF Temperatur_unterschritten AND Thermometer_angeschlossen THEN
CurrentString:= CONCAT(CurrentString, Temp_unter);
CurrentString:= CONCAT(CurrentString, '$R$N'); (* Zeilenumbruch *)
DatenString:= CONCAT(DatenString, Temp_unter);
END_IF

IF Thermometer_angeschlossen AND NOT Temperatur_ueberschritten AND NOT Temperatur_unterschritten THEN
CurrentString:= CONCAT(CurrentString, Thermo_ok);
CurrentString:= CONCAT(CurrentString, '$R$N'); (* Zeilenumbruch *)
DatenString:= CONCAT(DatenString, Thermo_ok);
END_IF

IF Thermometer_angeschlossen = FALSE THEN
CurrentString:= CONCAT(CurrentString, Thermo_not);
CurrentString:= CONCAT(CurrentString, '$R$N'); (* Zeilenumbruch *)
DatenString:= CONCAT(DatenString, Thermo_not);
END_IF

(* Neue Daten ? *)

IF DatenString <> DatenString_old THEN

(* Öffne die Datei um Daten anzufügen *)
FileHandel:= SysFileOpen(FilePath, 'a');

(* Zeile in die Datei schreiben *)
RetValWritten:= SysFileWrite(FileHandel, ADR(CurrentString), LEN(CurrentString));

(* Datei schließen *)
SysFileClose(FileHandel);

END_IF
END_IF
(* Flankenauswertung *)
DatenString_old:=DatenString;
xConnectionOk_client_1_old:=xConnectionOk_client_1;


Auch läuft das FileHandle permanent. Ich habe das bisher so verstanden das es sich nur verändert wenn ein neuer Eintrag in der Datei erfolgt ist.

Also wie gesagt vielleicht findest den Fehler in meiner Schreibweise.

MFG Dennis
 
Zurück
Oben