TwinCat WriteStruct() Methode Problem

brausefüllung

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich versuche Momentan im Ramen eines Projekts, Daten in eine selbst erstellte .csv Datei zu loggen, was prinzipiell auch funktioniert.
Das Problem ist nun, dass mein Programm nur jeden 4. Zyklus in die .csv Datei schreibt. Gewünscht ist dass jede Sekunde einmal geschrieben wird. Dafür habe ich 2 Counter, wobei der erste immer eine Sekunde hochzählt und der zweite dann jede Sekunde um 1 erhöht wird. Dabei wird jedes mal wenn counter2 erhöt wird ein Flag auf true gesetzt sodass der WriteStruct() Befehl ausgeführt wird. In meiner Theorie sollte so jede Sekunde geloggt werden, woraus leider alle 4 Sekunden wird.
Es ändert übrigens nichts ob ich 1 mal pro Sekunde oder 10 mal pro Sekunde loggen möchte, es werden immer 3 Zyklen übersprungen.
Ich habe ein Testprogramm geschrieben wo nur der counter2 geloggt wird um das Problem zu veranschaulichen.

st_DataTest.Counter := Counter2;

counter1 := counter1 +1;
IF counter1 >=100
THEN counter1 := 0;
Counter2 := Counter2 +1;
bFlag := TRUE;
ELSE
bFlag := FALSE;
END_IF

IF bFlag THEN
fbPLCDBWrite1.WriteStruct( hDBID:= 1,
sTableName:= sTableNameTest,
pRecord:= ADR(st_DataTest),
cbRecord:= SIZEOF(st_DataTest),
pColumnNames:= ADR(ColumnNameTest) ,
cbColumnNames:= SIZEOF(ColumnNameTest));
END_IF
Unbenannt.PNG
Liegt das Problem and meiner Programierung oder habe ich etwas nicht bedacht?
Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist mal wieder einer der Klassiker. FBs zum Dateizugriff gehören zu den Befehlen, die mehr als einen Zyklus zur Ausführung brauchen, Du rufst den FB aber nur einen Zyklus auf. Du musst den Schreibbefehl so lange aufrufen bis er zurückmeldet, dass er fertig ist, oder einen Fehler hat.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mal ein kleiner Tipp am Rande:

Zeitmessungen anhand der vergangenen SPS-Zyklen haben den Nachteil, wenn man mal die Zykluszeit ändern muss, kommt das ganze Programm durcheinander. Außerdem kann es durch Zykluszeitüberschreitungen zu Ungenauigkeiten kommen.

Nimm dafür immer einen IEC-Timer, der prüft anhand der internen Echtzeituhr, ob die Zeit abgelaufen ist.

Code:
fbOneSecondTick    : TON;

fbOneSecondTick(IN:=NOT fbOneSecondTick.Q,PT:=T#1S);
IF fbOneSecondTick.Q THEN
    //Do something every second
END_IF
 
du kannst auch gut die controller-read-struct für sowas nehmen ...

PLC_R.i_x1sClk
^^ wäre 1 sek-takt
Da hast Du mich jetzt aber aus dem Takt gebracht. :cool:

Ich musste erst mal alle Suchmaschinen aktivieren, in der Hoffnung was Neues zu lernen.
Aber das Ende vom Lied ist - wir sind hier beim TwinCAT. Das gibt es offensichtlich beim TwinCAT nicht.
Ich habe Deiner Beschreibung folgend nur einen Hinweis für CodeSYS und dort den Schneider M251-Controller gefunden, der diese Struktur hat. Möglicherweise unterstützen das auch noch andere CodeSYS-Geräte - aber dazu habe ich erstmal nichts weiter gefunden. Ist das ein Schneider-Standard?
 
haben den Nachteil, wenn man mal die Zykluszeit ändern muss, kommt das ganze Programm durcheinander. Außerdem kann es durch Zykluszeitüberschreitungen zu Ungenauigkeiten kommen.
uch gut die controller-read-struct für sowas nehm
Da hast Du mich jetzt aber aus dem Takt gebracht. :cool:

Ich musste erst mal alle Suchmaschinen aktivieren, in der Hoffnung was Neues zu lernen.
Aber das Ende vom Lied ist - wir sind hier beim TwinCAT. Das gibt es offensichtlich beim TwinCAT nicht.
Ich habe Deiner Beschreibung folgend nur einen Hinweis für CodeSYS und dort den Schneider M251-Controller gefunden, der diese Struktur hat. Möglicherweise unterstützen das auch noch andere CodeSYS-Geräte - aber dazu habe ich erstmal nichts weiter gefunden. Ist das ein Schneider-Standard?
Sowas gibt es schon...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe Deiner Beschreibung folgend nur einen Hinweis für CodeSYS und dort den Schneider M251-Controller gefunden, der diese Struktur hat. Möglicherweise unterstützen das auch noch andere CodeSYS-Geräte - aber dazu habe ich erstmal nichts weiter gefunden. Ist das ein Schneider-Standard?
ups ...
das gibt es genau bei der schneider m251 die ich hier verwende ....
könnte tatsächlich sein, dass es controller-spezifisch ist :unsure:
gibt auch noch 10 und 100ms - takt soweit ich mich erinnere .. sehr praktisch ...
evtl kein codesys standard ...
 
ups ...
das gibt es genau bei der schneider m251 die ich hier verwende ....
könnte tatsächlich sein, dass es controller-spezifisch ist :unsure:
gibt auch noch 10 und 100ms - takt soweit ich mich erinnere .. sehr praktisch ...
evtl kein codesys standard ...
Wobei es schön wäre, wenn das Standard werden würde. Ich arbeite nur mit Codesys basierten Steuerungen, aber das ist ein Punkt, der mir bei Siemens wirklich gefällt. Natürlich sollte jeder nicht völlig unerfahrene SPS-Programmierer in der Lage sein sich einen Blink-Baustein selber zu schreiben, aber man ist halt bequem.
 
Wobei es schön wäre, wenn das Standard werden würde. Ich arbeite nur mit Codesys basierten Steuerungen, aber das ist ein Punkt, der mir bei Siemens wirklich gefällt. Natürlich sollte jeder nicht völlig unerfahrene SPS-Programmierer in der Lage sein sich einen Blink-Baustein selber zu schreiben, aber man ist halt bequem.
Das sind Dinge, die ich in meiner eigenen SystemState-Struktur habe. Genauso wie der IO-Status, die Druckluft, der Not-Halt und weitere sicherheitsrelevanten Dinge, Status der Steuerspannungen usw. Was es nicht gibt, baut man sich halt einmal sebst und verwendet es ab dann in allen Projekten - das ist dann der eigene Standard. Der Pointer auf die SystemStruktur ist dann in fast allen meinen FB's verfügbar.

Ich bin halt auch bequem. o_O
 
Zurück
Oben