[TwinCat 3] FileOpen, FileWrite, FileClose

naheliegend

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

leider muss ich euch nerven. :grin:

Ich habe keinen Ansprechpartner und ich bin mit meinem Latein am Ende. Ihr seid meine einzige Hilfe.

Zu meinem Problem: Ich möchte Daten, die als LREAL,INT oder ähnliches in einem Array vorliegen in eine Datei schreiben, die ich dann im Nachhinein mit MATLAB oder Excel auswerten kann. Mir fallen nur .txt und .csv ein.

Ich habe mir dieses Beispiel von Beckhoff sehr genau angeschaut und mich daran orientiert: https://infosys.beckhoff.com/englis...libsystem/html/tcplclibsys_fileio_example.htm

Ich habe anfangs einen Array mit INTs von 0-10 erstellt und habe dann eine .txt Datei erstellt. Ich warte bei jedem FB_ .. darauf, dass die Flag auf FALSE geht mit den IF-Abfragen. Das File wird erstellt, es wird aber nichts darein geschrieben...

i need some help :)


Code:
FOR iState := 0 TO 10 DO
    aArray[iState] := iState;
END_FOR


CASE i OF
    
0:    fb_FileOpen( bExecute := FALSE );
    fb_FileOpen(sNetId:='',sPathName:='C:\Users\Desktop\test.txt',nMode:=FOPEN_MODEWRITE,tTimeout:=T#3S,bExecute:=TRUE);
    i:=5;
        
    
    
5:        fb_FileOpen( bExecute := FALSE );
        
        IF NOT fb_FileOpen.bBusy THEN
            i := 10;
        END_IF

        
        
        
10:    fb_FileWrite( bExecute := FALSE );
    fb_FileWrite(sNetId:='',hFile:=fb_FileOpen.hFile,pWriteBuff:=ADR(aArray),cbWriteLen:=SIZEOF(aArray),tTimeout:=T#3S,bExecute:=TRUE);
    i:=15;
    
    
        
15:        fb_FileWrite( bExecute := FALSE );

        IF NOT fb_FileWrite.bBusy THEN
            i := 20;
        END_IF

        
20: fb_FileClose( bExecute := FALSE );
    fb_FileClose(sNetID:='',hFile:=fb_FileOpen.hFile,bExecute:=bStart);
    i:=25;
    
25: fb_FileClose( bExecute := FALSE );
     i:=30;


30: //.... ende

    
    END_CASE
 
Schau Dir mal die Größe der Datei an, ist diese nicht null wurde etwas geschrieben, nur kannst Du es im Editor eventuell nicht sehen. Du möchtest gerne Deine Zahlen lesbar in eine Textdatei schreiben, dafür musst Du die Zahlen aber erst in ein String umwandeln und dieses dann in die Datei schreiben. Dein Array besteht, wenn ich den Namen richtig deute, aus Integer-Werten, diese nehmen 2 Byte im Speicher ein. FB_FileWrite schreibt nun für jedes Array Element 2 Bytes in eine Datei mehr nicht. Öffnest Du diese Datei jetzt mit einem Editor, werden die einzelnen geschriebenen Werte als ASCII-Code angesehen und, soweit es Druckbare Zeichen sind, angezeigt, eine 65 wird so zum A und eine 66 zum B.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Muss man das immer so machen, dass man die Zahlen in einen STRING umwandeln muss, um diese dann in ein .txt File zu schreiben?

Kennt jemand die csv Befehle? Kann ich damit irgendwie eine Struktur der zu schreibenden Daten anlegen? Steige da nicht ganz durch
 
Zum Thema csv formatieren hatten wir erst im letzten Jahr ausführlichste Beiträge.
zahlen musst Du nur dann in Strings konvertieren, wenn diese anschließend zum Beispiel in Text- oder Tabellenprogrammen auch lesbar sein sollen. Andernfalls wäre die Dateierweiterung .bin wohl angebrachter.

Willst Du eine 1 im File haben, schreib eine 1. Willst Du eine 1 in excel oa angezeigt haben schreib 0x31 ins File.
Twincat hat speziell für das csv-Handling ein paar Hilfsfunktionen im Programm.
 
...in eine Datei schreiben, die ich dann im Nachhinein mit MATLAB oder Excel auswerten kann.

es ginge noch viiiieeeel einfacher, zumindest wenn ihr in Eurer Firma ohnehin Matlab/ Simulink und die beiden Coder von Mathworks (Simulink Coder und Matlab Coder) habt. Dann machst du dir ein Mini-Simulink-Model, mit den Daten die du wegschreiben willst als Eingang und hängst am Ende ein ToFile-Block ran. Dann generierst du daraus mit dem TE1400 ein TcCom-Modul, dass du beliebig oft in TwinCAT instanziieren kannst.
Ende vom Lied: Du instanziierst das generierte Modul in TwinCAT soft wie du es benötigst und verbindest die Daten die Du wegschreiben willst per Mapping (wo auch immer die herkommen, dazu benötigst du noch nicht mal eine SPS). Das im TE1400 enthaltene FileWrite TcCom-Modul schreibt die Daten dann direkt im .mat Format auf die Festplatte und du kannst sie ohne Formatierungsaufwand in Matlab importieren. Das Modul macht auch das komplette Filehandling automatisch. Du kannst einstellen, wie groß die Dateien maximal sein sollen und es erstellt dir dann automatisiert immer neue Dateien, die so heißen wie du willst mit einer _x angehängt für die Dateinummer. Ist elegant, chick und kann immer wieder verwendet werden. Einziger Nachteil .. wenn man die oben genannten Tools nicht hat, ist es eventuell ein etwas teurer Workflow :)
 
Zurück
Oben