Problem mit dem Abspeichern von Daten im Zusammenhang mit der Systemzeit.

Cerberus

Level-1
Beiträge
2.839
Reaktionspunkte
269
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Ich will die Windows-Systemzeit auslesen und diese alle 500ms in einer Textdatei abspeichern.

Das Auslesen der Windows-Systemzeit funktioniert auch einwandfrei, allerdings habe ich noch Probleme beim Abspeichern. Und zwar wird die Uhrzeit nur einmal nach dem Urlöschen abgespeichert und dann nie wieder. Woran kann das liegen?

Ich arbeite mit TwinCAT v2.10.0 Build 1330. Hardware habe ich keine. Simuliere das Ganze nur auf dem PC.

Im Anhang mal mein Programm.

Schon mal vielen Dank für eure Hilfe.

MfG Cerberus
 

Anhänge

  • Read_SystemTime_Test.rar
    27,4 KB · Aufrufe: 19
Die Bausteine

fbFileOpen: FB_FileOpen;
fbFileWrite: FB_FileWrite;
fbFileClose: FB_FileClose;

müssen immer durchlaufen werde und über eine positive Flanke am bExecute Signal gestartet werden.

So wie es programmiert wurde gibt es nur eine positive bExecute Flanke also es wird nur einmal abgearbeitet.

Gruss

Thomas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Bausteine

fbFileOpen: FB_FileOpen;
fbFileWrite: FB_FileWrite;
fbFileClose: FB_FileClose;

müssen immer durchlaufen werde und über eine positive Flanke am bExecute Signal gestartet werden.

So wie es programmiert wurde gibt es nur eine positive bExecute Flanke also es wird nur einmal abgearbeitet.

Gruss

Thomas

Stehe gerade ein bisschen auf dem Schlauch. Durch die CASE-Schleife wird doch sichergestellt, dass sie ständig durchlaufen werden, oder sehe ich das falsch?

Zusätzlich bekommen alle Bausteine nach deren Abarbeitung eine negative Flanke. Damit gibt es auch wieder positive Flanken und das ganze müsste mehrmals ablaufen?!
 
Durch die CASE-Schleife wird doch sichergestellt, dass sie ständig durchlaufen werden

Die Funktionsblöcke werden nur durchlaufen wenn der richtige State aktive ist. Wenn der State nicht aktive ist, wird der Funktionsblock nicht durchlaufen.

Das Hauptproblem ist aber der bExecute Eingang. Für den Funktionsblock ist der immer TRUE. Er wird zwar zurückgesetzt, wird aber wieder auf TRUE gestetzt bevor der Ablauf des Funktionsblocks gestartet wird.
 
Kannst du mir erklären warum folgendes Programm funktioniert? Ist doch eigentlich das Gleiche, aber da funktionierts! Echt komisch!
Code:
PROGRAM PRG_SDO1003
VAR_INPUT
   Start: BOOL;
END_VAR
VAR
   fbAdsReadSDO: ADSREAD;
   fbSDO1003Read: R_TRIG;
   bSDO1003Read: BOOL;
   Error:DWORD;
   SDO1003Read_Data: ARRAY [1..256] OF BYTE;
   SDO1003Read_SubIndex: DWORD := 16#0001;
   fbAdsWriteSDO: ADSWRITE;
   bSDO1003Write: BOOL;
   SDO1003Write_Data: ARRAY [1..4] OF BYTE := 16#00;
   AntriebSteht: BOOL;
   fbLocalSystemTime: FB_LocalSystemTime;
   Fehler: WORD;
   Antrieb: BYTE;
   FehlerAlt: WORD;
   AntriebAlt: BYTE;
   DatenSchreiben: BOOL;
   i: INT;
END_VAR
VAR CONSTANT
   SDO1003Read_Index: DWORD := 16#1003;
   SDO1003Read_DataLength: DWORD := 16#0004;
   SDO1003Write_Index: DWORD := 16#1003;
   SDO1003Write_SubIndex: DWORD := 16#0000;
   SDO1003Write_DataLength: DWORD := 16#0004;
END_VAR
 
 
(*********************************************)
(*             SDO 1003 Read Single             *)
(*********************************************)

(* Check Rising Edge *)
fbSDO1003Read(CLK:= Start);
IF fbSDO1003Read.Q THEN
   bSDO1003Read := TRUE;
   MEMSET( ADR(SDO1003Read_Data), 16#00, SIZEOF(SDO1003Read_Data) );
   Error := 0;
   SDO1003Read_SubIndex := 16#0001;
END_IF
FOR i := 1 TO 8 DO
   IF bSDO1003Read THEN
      fbAdsReadSDO( NETID:= sADSNetIdCanOpenMaster,
         PORT:= ADSPort,
         IDXGRP:= SDO1003Read_Index,
         IDXOFFS:= SDO1003Read_SubIndex,
         LEN:= SDO1003Read_DataLength,
         DESTADDR:= ADR(SDO1003Read_Data),
         READ:= TRUE,
         TMOUT:= t#5s);
       IF fbAdsReadSDO.ERR THEN
          Error := fbAdsReadSDO.ERRID;
          bSDO1003Read := FALSE;
          Start := FALSE;
       ELSE
          IF NOT fbAdsReadSDO.BUSY THEN
             bSDO1003Read := FALSE;
             Start := FALSE;
          END_IF
       END_IF
   ELSE
      fbAdsReadSDO( NETID:= sADSNetIdCanOpenMaster,
         PORT:= ADSPort,
         IDXGRP:= SDO1003Read_Index,
         IDXOFFS:= SDO1003Read_SubIndex,
         LEN:= SDO1003Read_DataLength,
         DESTADDR:= ADR(SDO1003Read_Data),
         READ:= FALSE,
         TMOUT:= t#5s);
   END_IF
 
   IF SDO1003Read_Data[3] <> 0 THEN
      CASE SDO1003Read_Data[1] OF
         16#00:
            CASE SDO1003Read_Data[2] OF
               16#20:
                  Fehler := 16#2000;
               16#30:
                  Fehler := 16#3000;
               16#40:
                  Fehler := 16#4000;
               16#73:
                  Fehler := 16#7300;
            END_CASE
         16#12:
            IF SDO1003Read_Data[2] = 16#86 THEN
               Fehler := 16#8612;
            END_IF
         16#21:
            IF SDO1003Read_Data[2] = 16#71 THEN
               Fehler := 16#7121;
            END_IF
         16#30:
            IF SDO1003Read_Data[2] = 16#55 THEN
               Fehler := 16#5530;
            END_IF
         16#31:
            IF SDO1003Read_Data[2] = 16#55 THEN
               Fehler := 16#5531;
            END_IF
         16#41:
            IF SDO1003Read_Data[2] = 16#55 THEN
               Fehler := 16#5541;
            END_IF
         16#80:
            IF SDO1003Read_Data[2] = 16#50 THEN
               Fehler := 16#5080;
            END_IF
         16#81:
            IF SDO1003Read_Data[2] = 16#50 THEN
               Fehler := 16#5081;
            END_IF
         16#82:
            IF SDO1003Read_Data[2] = 16#50 THEN
               Fehler := 16#5082;
            END_IF
      END_CASE

      Antrieb := SDO1003Read_Data[3];
  ELSE
     Fehler := 0;
  END_IF
 
  IF Antrieb = 25 THEN
     HRA08Steht := TRUE;
  END_IF
 
  CASE Fehler OF
     16#2000, 16#3000, 16#4000, 16#7121, 16#8612, 16#7300, 16#5530, 16#5080, 16#5081, 16#5082, 16#5531, 16#5541:
        AntriebSteht := TRUE;
     ELSE
        AntriebSteht := FALSE;
  END_CASE
 
  IF AntriebSteht AND Antrieb = 25 THEN
     (* SDOs löschen *)
     bSDO1003Write := TRUE;
     (* Datum und Uhrzeit auslesen *)
     fbLocalSystemTime(bEnable:= TRUE, dwCycle:= 1);
     IF fbLocalSystemTime.bValid THEN
        LogDaten := SYSTEMTIME_TO_STRING(fbLocalSystemTime.systemTime);
        LogDaten := CONCAT(LogDaten, '; Zyklus: ');
        LogDaten := CONCAT(LogDaten, UDINT_TO_STRING(zaehler));
        LogDaten := CONCAT(LogDaten, '; Antrieb: ');
        LogDaten := CONCAT(LogDaten, BYTE_TO_STRING(Antrieb));
        LogDaten := CONCAT(LogDaten, '; Fehler: ');
        LogDaten := CONCAT(LogDaten, WORD_TO_STRING(Fehler));
        LogDaten := CONCAT(LogDaten, '; Index: ');
        LogDaten := CONCAT(LogDaten, BYTE_TO_STRING(SDO1003Read_Data[4]));
        LogDaten := CONCAT(LogDaten, '$n');
        DatenSchreiben := TRUE;
        bWriteData := TRUE;
     END_IF
 
     AntriebSteht := FALSE;
 
     CASE zvLogger OF
        0: (*  *)
           IF DatenSchreiben THEN
              zvLogger := 10;
              DatenSchreiben := FALSE;
           END_IF
        10: (* Datei öffnen *)
           fbLogFileOpen( sNetId:= '',
              sPathName:= LogFileName,
              nMode:= FOPEN_MODEWRITE OR FOPEN_MODETEXT,
              ePath:= PATH_GENERIC,
              bExecute:= TRUE,
              tTimeout:= t#2s,
              bBusy=> ,
              bError=> ,
              nErrId=> ,
              hFile=> hFile);
           IF NOT fbLogFileOpen.bBusy THEN
              fbLogFileOpen(bExecute := FALSE);
              zvLogger := 20;
           END_IF
        20: (* Datei schreiben *)
           IF NOT PRG_HRunLog.fbFtrigBtnRunLog.Q THEN
              IF bWriteData THEN
                 fbLogFileWrite( sNetId:= '',
                    hFile:= hFile,
                    pWriteBuff:= ADR(LogDaten),
                    cbWriteLen:= LEN(LogDaten),
                    bExecute:= TRUE,
                    tTimeout:= t#3s,
                    bBusy=> ,
                    bError=> ,
                    nErrId=> ,
                    cbWrite=> );
                 IF NOT fbLogFileWrite.bBusy THEN
                    fbLogFileWrite(bExecute := FALSE);
                    bWriteData := FALSE;
                 END_IF
              END_IF
           ELSE
              zvLogger := 30;
           END_IF
        30: (* Datei schließen *)
           fbLogFileClose( sNetId:= '',
              hFile:= hFile,
              bExecute:= TRUE,
              tTimeout:= t#3s,
              bBusy=> ,
              bError=> ,
              nErrId=> );
           IF NOT fbLogFileClose.bBusy THEN
              fbLogFileClose(bExecute := FALSE);
              zvLogger := 0;
           END_IF
     END_CASE
  END_IF
 
  SDO1003Read_SubIndex := SDO1003Read_SubIndex + 1;
  IF SDO1003Read_SubIndex < 8 THEN
     bSDO1003Read := TRUE;
  END_IF
END_FOR
 
IF bSDO1003Write THEN
   fbAdsWriteSDO( NETID:= sADSNetIdCanOpenMaster,
      PORT:= ADSPort,
      IDXGRP:= SDO1003Write_Index,
      IDXOFFS:= SDO1003Write_SubIndex,
      LEN:= SDO1003Write_DataLength,
      SRCADDR:= ADR(SDO1003Write_Data),
      WRITE:= TRUE,
      TMOUT:= t#5s);
   IF fbAdsWriteSDO.ERR THEN
      Error := fbAdsWriteSDO.ERRID;
      bSDO1003Write := FALSE;
   ELSE
      IF NOT fbAdsWriteSDO.BUSY THEN
         bSDO1003Write := FALSE;
         HRA08Steht := FALSE;
      END_IF
   END_IF
ELSE
   fbAdsWriteSDO( NETID:= sADSNetIdCanOpenMaster,
      PORT:= ADSPort,
      IDXGRP:= SDO1003Write_Index,
      IDXOFFS:= SDO1003Write_SubIndex,
      LEN:= SDO1003Write_DataLength,
      SRCADDR:= ADR(SDO1003Write_Data),
      WRITE:= FALSE,
      TMOUT:= t#5s);
END_IF
 
Zuviel Werbung?
-> Hier kostenlos registrieren
fbFileOpen.bExecute := FALSE; (* Funktionsblock wird nicht abgearbeitet *)

und

fbFileOpen(bExecute := FALSE); (* Funktionsblock wird abgearbeitet *)

ist nicht das Gleiche oder ?

Gruss

Thomas
 
Dankeschön! Das war mir nicht klar. Für mich war das das Gleiche. Bis jetzt!

Jetzt funktionierts! Noch mal Danke!!!!
 
Zurück
Oben