Speichern in eine CSV Datei

Stanku

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Mion Moin,

ich versuche gerade Zeitlich gesteuert Verschiedene Strings in eine CSV datei einzuspeichern. Habe aber das Prohlem das die Bausteine FB_FilePuts einmal angesprochen dauerhaft busy bleiben. Dadurch kann ich nur Eine Zeile einlesen, da ich mit 6 Verschieden instanzierten Bausteinen 3 Werte im String Format einlese und mit dem Letzten einen Zeilenumbruch machen will.
Hat einer eine Idee was ich dabei falsch gemacht haben könnte?

Gruß Stanku

Code:
//Funktionsbaustein zum Speichern der Werte in einer CSV Datei
Zeit:=TIME_TO_STRING(Gesamtzeit_messung);
// Erstellen/Öffnen einer Leeren CSV Datei
IF Gesamtzeit_messung<T#0.2S
    THEN 
    FB_FileOpen_0(
    sNetId:=NetID , 
    sPathName:= PathName, 
    nMode:= FOPEN_MODEWRITE OR FOPEN_MODEPLUS, 
    ePath:= Tc2_System.PATH_GENERIC, 
    bExecute:= TRUE, 
    tTimeout:= T#5S, 
    bBusy=> , 
    bError=> , 
    nErrId=> , 
    hFile=> hFile);
    bBusy:=TRUE;
END_IF

//Impuls zum Einlesen des Nächsten Wertes

IF Startimpulse
    
    THEN
    Zaehler:=0;
    IF NOT FB_FilePuts_0.bBusy
    THEN
    FB_FilePuts_0(
    sNetId:= NetID, 
    hFile:= hFile, 
    sLine:= Zeit, 
    bExecute:= Startimpulse, 
    tTimeout:= T#5S, 
    bBusy=> , 
    bError=> , 
    nErrId=> );
//    Zaehler:=Zaehler+1;
    END_IF

    IF NOT FB_FilePuts_1.bBusy 
        THEN
        FB_FilePuts_1(
        sNetId:= NetID, 
        hFile:= hFile, 
        sLine:= Spaltenumbruch, 
        bExecute:=Startimpulse , 
        tTimeout:= T#2S, 
        bBusy=> , 
        bError=> , 
        nErrId=> );
         Zaehler:=Zaehler+1;    
    END_IF
    

    IF NOT FB_FilePuts_2.bBusy 
        THEN
        FB_FilePuts_2(
        sNetId:= NetID, 
        hFile:= hFile, 
        sLine:= Uebergabewert1, 
        bExecute:= Startimpulse, 
        tTimeout:= T#2S, 
        bBusy=> , 
        bError=> , 
        nErrId=> );
        Zaehler:=Zaehler+1;
    END_IF
    
      IF NOT FB_FilePuts_3.bBusy 
        THEN
        FB_FilePuts_3(
        sNetId:= NetID, 
        hFile:= hFile, 
        sLine:= Spaltenumbruch, 
        bExecute:=Startimpulse , 
        tTimeout:= T#2S, 
        bBusy=> , 
        bError=> , 
        nErrId=> );
        Zaehler:=Zaehler+1;    
    END_IF
    
    
    IF NOT FB_FilePuts_4.bBusy 
        THEN
    FB_FilePuts_4(
    sNetId:= NetID, 
    hFile:= hFile, 
    sLine:= Uebergabewert2, 
    bExecute:= Startimpulse, 
    tTimeout:= T#3S, 
    bBusy=> , 
    bError=> , 
    nErrId=> );
     Zaehler:=Zaehler+1;
    END_IF        
    
    IF NOT FB_FilePuts_5.bBusy 
        THEN
    FB_FilePuts_5(
    sNetId:= NetID, 
    hFile:= hFile, 
    sLine:= Zeilenumbruch, 
    bExecute:= Startimpulse, 
    tTimeout:= T#2S, 
    bBusy=> , 
    bError=> , 
    nErrId=> );
     Zaehler:=Zaehler+1;
    END_IF
         
END_IF
IF Gesamtzeit_messung>T#2M
    THEN FB_FileClose_0(
    sNetId:= NetID, 
    hFile:= hFile, 
    bExecute:= TRUE, 
    tTimeout:= T#2S, 
    bBusy=> , 
    bError=> , 
    nErrId=> );
    bBusy:=FALSE;
END_IF
 
Hallo Stanku,

so wie ich das sehe solltest du deine Variable "Zähler" mit dem jeweils entsprechenden Wert in die Startbedingung deiner IF Anweisung einbauen da sonst deine Bausteine jedesmal sofort neu starten wenn der eigene Busy-Ausgang auf FALSE ist. Wofür hast du eigentlich dem Ausgang des FileOpen ein "TRUE" zugewiesen?

Gruß
Pinky
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Pinky,

die Idee hatte ich auch schon hab meinen Baustein dahingehend schon angepasst. Nützt leider nichts. Auch wenn der Baustein schon längst nicht mehr angesprochen wird bleibt mein FB_FilePuts auf Busy.
Das b_Busy dem ich TRUE zugewiesen habe ist nicht das vom FB_FileOpen, das war eine Ausgangsvarriable von meinen Baustein. Der soll später in Mehreren Projekten schnell eingebunden werden. Um ein paar Messungen abzugreifen.

Hier noch einmal das Angepasste Programm:
Code:
//Funktionsbaustein zum Speichern der Werte in einer CSV Datei
Zeit:=TIME_TO_STRING(Gesamtzeit_messung);
// Erstellen/Öffnen einer Leeren CSV Datei
IF Gesamtzeit_messung<T#0.2S
    THEN 
    FB_FileOpen_0(
    sNetId:=NetID , 
    sPathName:= PathName, 
    nMode:= FOPEN_MODEAPPEND, 
    ePath:= Tc2_System.PATH_GENERIC, 
    bExecute:= TRUE, 
    tTimeout:= T#5S, 
    bBusy=> , 
    bError=> , 
    nErrId=> , 
    hFile=> hFile);
    
    //b_Busy Baustein Save_CSV beschäftigt
    b_Busy:=TRUE;
END_IF

//Impuls zum Einlesen des Nächsten Wertes

IF Startimpulse
THEN    
Zeile:=Tc2_Standard.CONCAT(Zeit,';');
Zeile:=Tc2_Standard.CONCAT(Zeile,uebergabewert1);
Zeile:=Tc2_Standard.CONCAT(Zeile,';');
Zeile:=Tc2_Standard.CONCAT(Zeile,uebergabewert2);
Zeile:=Tc2_Standard.CONCAT(Zeile,Zeilenumbruch);    

    IF NOT bBusy_0 AND Startimpulse
    THEN
    FB_FilePuts_0(
    sNetId:= NetID, 
    hFile:= FB_FileOpen_0.hFile, 
    sLine:= Zeile, 
    bExecute:= TRUE, 
    tTimeout:= T#5S, 
    bBusy=> bBusy_0, 
    bError=> bErr_0, 
    nErrId=> udErrID);
    END_IF

END_IF
IF Gesamtzeit_messung>T#2M
    THEN
    FB_FileClose_0(
    sNetId:= NetID, 
    hFile:= FB_FileOpen_0.hFile, 
    bExecute:= TRUE, 
    tTimeout:= T#5S, 
    bBusy=> bBusy_Close, 
    bError=> bErr_Close, 
    nErrId=> udErrID_Close);
    b_Busy:=FALSE;
END_IF
 
Es läuft jetzt. Irgentwie hatten der FB_FilePuts ein Problem damit in der IF-Anweisung angesprochen zu werden. Warum genau weiß ich auch noch nicht.
 
Hallo Stanku

Der Code eines FB's wird nur durchlaufen, wenn du den FB auch aufrufst. Wenn du den FB in der IF-Anweisung nur einmal aufrufst, dann werden die Parameter zwar übergeben, allerdings wird der Code nur einmal durchlaufen. Das genügt nicht, sonst hätte man ja eine Funktion erstellen können anstelle eines FB's.

Ich würde dir empfehlen, eine kleine Schrittkette zu programmieren:
1. State: warten auf dein Start-Signal.
2. State: Init-Werte an den FB übergeben und FB einmal aufrufen
3. State: FB aufrufen, solange busy = TRUE. Wenn busy = FALSE in nächsten State wechseln
4. State: End-State. Hier kannst du evtl noch Auswertungen vornehmen.

Ich weiss, das ganze war etwas rudimentär erklärt. Melde dich wenn du genauere Ausführungen brauchst. Natülich gibt es auch andere Ansätze. Obigen "Standard-Ansatz" habe ich schon bei diversen FB-Aufrufen eingesetzt.

Gruss
Gargoil
 
Zurück
Oben