# Delay Funktion in µs



## ysh032 (12 September 2011)

Hallo Alles
Ich möchte eine Funktion zur Zeitverzögerung mit µs erstellen, diese Funktion kann als ein Zeitintervall in While-Struktur zwischen zwei Schleifen funktionieren, d.h. nächste While-Schleife kann erst  XX µs nach Ende aktueller Schleife starten. Wie kann ich diese Funktion mit "ST" schreiben.

Vielen Dank


----------



## MasterOhh (13 September 2011)

Was hast du denn für eine SPS?
Ich glaube eine Zeitverzögerung in µs wird schon allein daran scheitern, dass die meisten Steuerungen Zykluszeiten im ms Bereich haben. 

Und While Schleifen sind in der SPS-Programmierung allgmein eine sehr ungünstige Lösung. So wie ich dein Anliegen deute versuchst du eine SPS wie einen PC zu programmieren ? 

In der Regel werden für Zeitverzögerungen  Funktionen wie Ein-/Ausschaltverzögerungstimer oder Impulstimer verwendet, aber wie gesagt alles in ms.


----------



## ysh032 (13 September 2011)

Vielen Dank für Ihre schnelle Antwort
Ich habe momentar einen Laptop, darauf wird ein SPS-Programm  installiert, mit dem einige Daten in CSV-Format auf Computer gespeichert werden können. In dem Programm werden Funktionsblöcke "fbFileOpen,  fbFilePuts und  fbFileClose" geruft, um die Pfad der Datei zu geben. Nach Anrufen dieser Funktionsblöcke
muss Programm warten  bis zu die boolsche Variable "fbFileOpen.bBusy, fbFilePuts.bBusy sowie fbFileClose.bBusy" nicht "TRUE" sind. Ich möchte While-Schleife benutzen, um diese Warten-Funktion zu realisieren: 
                                     WHILE fbFileClose.bBusy DO
                                               XXXXXXX
                                     END_WHILE
Der Teil XXXX in Schleife muss die Verzögerung mit µs funktionieren, weil die Zykluszeit meines Programm 1ms ist.

Haben Sie noch bessere Idee, soweise Warten-Funktion zu realisieren.


----------



## Aventinus (13 September 2011)

Überspring doch den nächsten Teil des Programms und bearbeite es im nächsten Zylus.


----------



## ysh032 (13 September 2011)

Aber das Programm muss die Überprüfung und Bearbeitung in derselbem Zyklus durchgeführt werden, um die zu speichende Daten und übernommene Daten synchron sein zu können.


----------



## Aventinus (13 September 2011)

Ok, ich persönlich halte ja gar nix davon, den Prozessor mit nichts zu beschäftigen. Kannst du andere Programmteile dazwischenschieben?

Aber insgesamt ist mir das ganze zu PC-lastig, und da hab ich nicht so viel Ahnung, sorry.


----------



## MasterOhh (13 September 2011)

Selbst wenn da eine Soft SPS auf dem PC läuft, hat diese immer noch eine definierte Zykluszeit. Die SPS muss in einem Zyklus den gesamten Programcode abarbeiten können, sonst gibts Fehler. 
Wenn du jetzt in einer While-Schleife für einen unbestimmten Zeitraum das Programm blockierst, ist Ärger vorprogrammiert.

Also besser mit jedem Zyklus abfragen ob die FBs noch Busy sind oder nicht. Das synchronisieren der Daten kann doch auch anders gelöst werden (z.B. in dem man keine neuen Daten speichert bis die Übertragung an den PC abgeschlossen ist, oder du nimmst 2 Dateien und speicherst in der 2ten während die 1te gesendet wird .... ) 

Ohne genauer zu wissen was du vor hast kann dir da auch keiner wirklich weiter helfen.


----------



## ysh032 (13 September 2011)

Vielen Dank für Ihre wichtige Tipps!

Momentar habe ich einen Buskoppler EK1100 mit XFC A/D-Klemmer EL3702, die an meinem Laptop über Netzkarte "Broadcom NetXtreme Gigabit Ethernet" angeschlossen. Jetzt habe ich schon das Beispielprogramm von Beckhoff, mit dem die von EL3702 genommene Daten eines jeden Zyklus in einen Puffer im Programm geschoben damit  übergeordnet werden.  Jetzt möchte ich diese Beispielprogramm erweitern, um die in Puffer geordnete Daten in einer bestimmten CSV-Datei gespeichert werden zu können.

An Anhang finden Sie dieses Beispielprogramm ,die zugehörende .tsm Datei
und von mir selbst geschriebenes Test-programm, um CSV-datei zu schreiben


----------



## Kollo (13 September 2011)

Also ich stelle mir das echt schwierig vor - gerade da die meisten File Bausteine asynchron zum zyclus in einer speziellen Task abgearbeitet werden.

Du fängst dir also möglicherweise einen Watchdog ein ... oder du legst keinen Wert auf die eingestellte Zykluszeit - kann ja auch sein.

Hast du schon mal nachgefragt ob die Bausteine asynchron zu den Anwendertasken abgearbeitet werden?

Gruß,
Kollo.


----------



## automation-consult (13 September 2011)

Ich realisiere eigentlich genau diese Aufgabenstellung in einem Projekt.
Also die XFC-Klemme übermittelt ein Array mit Daten pro PLC-Cycle (z.B. 10 Werte bei 100µs Task oder 100 Werte alle ms-Task) Ich glaube es geht nicht parallel die Datenmenge in ein CSV File zu schreiben. Also in einer ms File Open/Write/Close geht bestimmt nicht. Ich speichre mir die Daten in einem grossen Array und schiebe dann das ganze Array auf einmal in die CSV (20000 Werte). War das ein Ansatz?


----------



## ysh032 (13 September 2011)

Ich denke, das Programm bracht zu min 3 Zykluen, um die File Bausteine vollstandig bearbeiten zu können, Fileopen=> Fileputs=> FileClose. Aber in meinen Anwendungstask muss in jeden Zyklus eine Paket Daten aus Klemmer übernommen werden. Also diese File Bausteine können nicht synchron sein. Um die Datenpaket im jeden Zyklus speichern zu können, denke ich, muss zusätzliche min 3 Zwischenspeicherplatz (Puffer) für übernommene Daten eingesezt werden.


----------



## ysh032 (13 September 2011)

Vielen Dank für deine Tipps automation-consult, wenn es möglich kannst du deine Programme hochladen?


----------



## automation-consult (13 September 2011)

also ein FIFI Read-Array von XFC-Datensätzen  und ein FIFO Write Array, also für das File Write werden sicher 20ms realisteisch sein (Excecute, Busy=True und Busy=False und das 3x und auf die Harddisk muss es ja auch noch -> Lesekopf... ... ) also müssen immer viele Datensätze gesammelt werden für einen Write-Befehl


----------



## automation-consult (13 September 2011)

Code geht nicht - Kundenapplikation


----------



## ysh032 (13 September 2011)

In meine Aufgabe. Die Anfoderung für die Abtastungsrate muss 100kHz sein. Aber meiner Computer kann nur unter Zykluszeit >= 1ms arbeiten, sonst entsteht die DC-Fehler. Also muss ich die Oversamplingsfakor in 100 stellen, d.h in jedem Zyklus wird ein Daten-Array mit Länge 100 übernommen und jede Sekunde 1000 so lange Array. Wie groß soll die Speicher-Array in meinem Prgramm sein?


----------



## automation-consult (13 September 2011)

ich bau mal was - some minutes


----------



## automation-consult (13 September 2011)

so schau mal . macht en bussi


----------



## ysh032 (13 September 2011)

Vielen Dank automation-consult

In "XFC_Control" werden die Datenmenge in 100ms gespeichert oder?


----------



## automation-consult (13 September 2011)

ja 100ms - aber einfach die Array-Grenze vergrössern oder verkleinern, aber selbst 1s macht für TwinCAT kein Problem, (wenn man die 64k Grenze in Step7 kennt ist TwinCAT wie das grosse Universum) - geht denn die Echtzeit auf dem Rechner ?? XFC-Counter


----------



## ysh032 (13 September 2011)

Mein Betreuer erfordet, die Datenmenge in 5s in CSV-Daten zu speichern. Jetzt habe ich die Array für Datenspeicherung in Länge 5000 erweitert. Das Problem jetzt ist, wie kann ich eine Array mit 5000 Elemente (Element ist eine 100 lange Array) in CSV-Format konventieren, geht es die Funktion "ARG_TO_CSVFIELD"


----------



## automation-consult (13 September 2011)

kiek mal - müsste alles drin stehen - XFC ist schon nicht mehr Automation -> da pass die Beckhoff-Aussagen "scientific-automation"


----------



## ysh032 (14 September 2011)

Vielen Dank automation-consult
Ich versuche gerade eine Array mit Elemente in Format Struktur, welche selbst 5 Elemente beeinhaltet, in eine bestimmte CSV-Datei mit deinem Programm zu schreiben. Aber weiß ich nicht warum sind alle geschriebene Daten in CSV-datei Chaos Code.


----------



## automation-consult (14 September 2011)

Sorry habe ich vergessen - jetzt wir es richtig kompliziert
ein grosses STRING-Array deklarieren - wie schon gesagt 
1. Schritt das Array mit einem 256 Leer-String füllen - müssen alle Bytes belegt sein
2. eine Software bauen, die alle Struktur-Elemente in den STRING kopiert
REPLACE-Function,  die DINT/REAL/... müssen in STRING konvertieren
dann muss man mit LEN immer nachschauen ob der nächste Werte noch rein passt -> nur die Struktur pro STRING wird sicher gehen
3. $N am Ende als Zeilenumbruch dann hätte man in Tabellencalc eine Zeile pro Struktur-Inhalt

aber das ist schon echt anspruchsvoll für ein Neueinsteiger


----------



## ysh032 (14 September 2011)

Ich danke dir automation-consult
Ich habe gesehen, es gibt 2 Funktionen in IEC61131, welche die Konvertierung zur CSVdatei beschäftigen. Einmal ist STRING_TO_CSVFIELD, um diese Funktion zu benutzen, wie dir gesagt, muss alle andere Datentype wie UINT, REAL, BOOL zurerst in STRING konvertiert werden. Die Andere Funktion ist ARG_TO_CSVFIELD, kann man diese Funktion benutzen?


----------



## automation-consult (14 September 2011)

man lernt ja nie aus - wo sind die Bausteine in TwinCAT in OSCAT ??


----------



## Wutbürger (14 September 2011)

automation-consult schrieb:


> man lernt ja nie aus - wo sind die Bausteine in TwinCAT in OSCAT ??


Ist dein GOOGLE kaputt?


----------



## automation-consult (14 September 2011)

cool - muss ich mir mal anschauen, vor Jahren einen Baustein programmiert wo es die FC's noch nicht gab und später hinterfragt man es nicht - aber siehe Forumseite ganz oben "Wissen ist ..."


----------

