Wie funktioniert SD_WRITE von ABB

Guts2
2007-12-26
2008-01-03
  • Guts2 - 2007-12-26

    Hallo, ich bin gerade bei meiner Diplomarbeit und soll für eine Aufgabe eine Schreibfunktion benutzen. Diese ist die aus der ABB Bausteinbibliothek vorhandene SD_WRITE Funktion.

    Leider habe ich niemanden der mit erklären kann wie dieser Baustein wirklich funktioniert, und auch meine Suche im Internet war nicht wirklich erfolgreich.

    Einen Teil der Eingänge dieses Bausteins kann ich mir ja erklären.

    Aber die zwei Eingänge SEG und ADRVAR erschließen sich mir nicht wirklich.

    In dem Handbuch sind vor beide Eingänge ein ADR Baustein geschaltet. warum?

    Ich hoffe das trotz der Weihnachtszeit mir jemand helfen könnte.

    Schon mal danke.

    PS.: Ja ich könnte in der Hilfedatei nach schauen, aber das ist eine komplizierte sache das zu erklären.

    Um es kurz zu fassen ich habe die Bausteine von ABB nicht in meiner Hilfedatei

     
  • gravieren - 2007-12-26

    HAllo

    Suche doch mal auf deinem REchner nach PDF-Dateien.

    Normalerweise findest du unter

    C:/Programme/3S Software/Codesys2.3/Targets/???/Help

    PDF oder CHM Dateien.

    Auch eine suche nach .pdf und .chm kann weiterhelfen.

     
  • Oberchefe - 2007-12-26

    Zitat:
    Aber die zwei Eingänge SEG und ADRVAR erschließen sich mir nicht wirklich.
    In dem Handbuch sind vor beide Eingänge ein ADR Baustein geschaltet. warum?

    ADR wird im Allgemeinen verwendet um eine Adresse zu ermitteln, der Baustein erwartet wohl einen Pointer.[/code]

     
  • hapeter - 2007-12-27

    Auf der ABB-CD sind in der folgenden Datei

    [url]\CD_AC500\Documentation\German\6-Bausteinbibliotheken-AC500\Interne-System-Bibliothek.pdf

    [/url]

    ab Seite 74 die Bausteine beschrieben.

    Gruss

     
  • Guts2 - 2007-12-27

    Oberchefe hat geschrieben:
    ADR wird im Allgemeinen verwendet um eine Adresse zu ermitteln, der Baustein erwartet wohl einen Pointer.[/code]

    Heißt das das ich ein Array vorgebe und dieser Baustein dann die Addresse des Arrays als Pointer an den Write Baustein wieterleitet? Aus der Beschreibung der Hilfedatei zu dem ADR Baustein werde ich nicht sehr schlau

     
  • Oberchefe - 2007-12-27

    Zitat:
    Heißt das das ich ein Array vorgebe und dieser Baustein dann die Addresse des Arrays als Pointer an den Write Baustein wieterleitet?

    Ich kenne SD_Write nicht, vermute aber mal: sehr warscheinlich ja.

     
  • Guts2 - 2007-12-30

    So ich habe mal etwas mit Write gearbeitet, habe aber das Problem das die Daten die in meine Datei geschrieben werden irgendwie Müll sind

    Schaut euch mal das Programm (ist nur zum verstehen von Write) an. vielleicht fällt euch was auf was ich nicht gesehen habe.

    FUNCTION_BLOCK SD_WRITE
    VAR_INPUT
       EN: BOOL;   (*  *)
       ATTRIB : BYTE;
       FILENO : BYTE;
       SEG : DWORD;
       FORMAT : BYTE;
       NVAR : WORD;
       ADRVAR : DWORD;
    END_VAR
    VAR_OUTPUT
       DONE : BOOL;
       ERR : BOOL;
       ERNO : WORD;
    END_VAR
    VAR
       DATEI_NAME : STRING;
       DATEI_NAME_1 : STRING :=  'F:\USRDAT';
       DATEI_NAME_2 : STRING := '.csv';
       H_FILE : DWORD;
       EINGANG : R_TRIG;
       START: BOOL;
       dwWritten : DWORD;
       Counter1 : INT;
       szSeperator: STRING(1):= ';';
       VARIABLE : STRING;
    END_VAR
    EINGANG(CLK := EN);
    START := EINGANG.Q;
    IF START THEN
    DATEI_NAME := CONCAT(DATEI_NAME_1, CONCAT(BYTE_TO_STRING(FILENO), DATEI_NAME_2));
    H_FILE := SysFileOpen(DATEI_NAME, 'w');
    FOR Counter1:= 0 TO 5 DO
    VARIABLE := BYTE_TO_STRING(TEST_ARRAY[Counter1]);
    dwWritten := SysFileWrite(H_FILE, ADR(VARIABLE), SIZEOF (TEST_ARRAY));
    dwWritten := SysFileWrite(H_FILE, ADR(szSeperator), 1);
    END_FOR;
    SysFileClose(H_FILE);
    DONE := TRUE;
    ELSE
    DONE := FALSE;
    END_IF;
    

    Sieht soweit ja mal ganz schön aus, nur ohne Komentar

    Jetzt kommt aber der Hammer was in der Datei steht.

    Array: TEST_ARRAY : ARRAY[0..5] OF BYTE:=0,1,2,4,5,6;

    0csv; 1\USR; 2csv; 4csv; 5\USR; 6cs
    

    Wo kommen jetzt diese anhänge her?? ich kann mir diese nämlich nicht erklären.

     
  • gravieren - 2007-12-30

    Hi

    Zitat:
    Sieht soweit ja mal ganz schön aus, nur ohne Komentar

    HÄ, schaut irgendwie verwirrend aus.

    Zitat:
    dwWritten := SysFileWrite(H_FILE, ADR(VARIABLE), SIZEOF (TEST_ARRAY));

    Versuche es doch mal mit:

    dwWritten := SysFileWrite(H_FILE, ADR(VARIABLE), SIZEOF (VARIABLE));

     
  • Guts2 - 2007-12-31

    Danke, der Tip hat geholfen

     
  • gravieren - 2007-12-31

    Freut mich.

     
  • Guts2 - 2008-01-03

    Hm jetzt hab ich das Problem das ich aus der Selben Datei, die die ich erstellt und geschrieben habe jetzt wieder einlesen will.

    Also öffne ich die datei wieder:

    H_FILE := SysFileOpen(DATEI_NAME, 'r');

    und will diese jetzt lesen.

    Wie müsste der Befehl normal aussehen wenn ich in den Array:

    ARRAY_TEST2 schreiben möchte? das müsste doch dann so aussehen:

    dwRead := SysFileRead(H_FILE, ADR(ARRAY_TEST2), NVAR1);

    NVAR1 = Anzahl der gelesenen Daten in der Datei.

    Oder??

    Denn bei mir wird nix in den Array geschrieben.

    Muß dann noch mit einer for Schleife gearbeiten werden???

     
  • gravieren - 2008-01-03

    Hi

    Zitat:
    dwRead := SysFileRead(H_FILE, ADR(ARRAY_TEST2), NVAR1);
    NVAR1 = Anzahl der gelesenen Daten in der Datei.
    Oder??

    Deine Datei hat z.b. 10000 Zeichen.

    Gibst du jetzt NVAR1 mit 10000 Zeichen an, so muss die Grösse von ARRAY_TEST2 ebenfalls PLATZ für 10000 Zeichen haben ! ! !

    Was machst du bei 2 MB ?

    Möglichkeit 1:

    Platz für z.b 80 Zeichen herstellen (ARRAY_TEST)

    dann mit

    dwRead := SysFileRead(H_FILE, ADR(ARRAY_TEST2), sizeof(ARRAY_TEST2) );

    die Zeichen einlesen.

    Der Inhalt der ARRAY kann jetzt werwendet werden.

    Alles widerholen, bis dwRead 0 zurückgibt, dann hast du alles ausgelesen.

    Du kannst natürlich auch Zeichen für Zeichen auslesen.

    Abfrage ob das Semikolon empfangen wurde.

    Falls JA, --> Umkopieren /Wandeln.

     
  • Guts2 - 2008-01-03

    gravieren hat geschrieben:
    Hi
    Deine Datei hat z.b. 10000 Zeichen.
    Gibst du jetzt NVAR1 mit 10000 Zeichen an, so muss die Grösse von ARRAY_TEST2 ebenfalls PLATZ für 10000 Zeichen haben ! ! !
    Was machst du bei 2 MB ?

    Möglichkeit 1:
    Platz für z.b 80 Zeichen herstellen (ARRAY_TEST)
    dann mit
    dwRead := SysFileRead(H_FILE, ADR(ARRAY_TEST2), sizeof(ARRAY_TEST2) );
    die Zeichen einlesen.
    Der Inhalt der ARRAY kann jetzt werwendet werden.
    Alles widerholen, bis dwRead 0 zurückgibt, dann hast du alles ausgelesen.
    Du kannst natürlich auch Zeichen für Zeichen auslesen.
    Abfrage ob das Semikolon empfangen wurde.
    Falls JA, --> Umkopieren /Wandeln.

    Danke für den Tip, probier ich ich gleich mal aus.

    Der Funktionsblock beinhaltet eine Möglichkeit das der Benutzer angibt wieviele Daten eingelesen werden sollen darum wird es bei mir so gemacht das in NVAR1 die anzahl der Daten steht.

    Aber jetzt erst mal danke ^^

     
  • gravieren - 2008-01-03

    Hi

    Zitat:
    Der Funktionsblock beinhaltet eine Möglichkeit das der Benutzer angibt wieviele Daten eingelesen werden sollen darum wird es bei mir so gemacht das in NVAR1 die anzahl der Daten steht.

    Hä, füll doch mal 1 Liter Milch in ein Schnapsglas.

    Irgenwie läuft die Milch über.

    NVAR1 ist quasi die Angabe, wieviel Milch da reinpasst

    Habe ich nur 1 Schnappsglas, so fülle ich dieses so oft nach, bis der 1 Liter Milch leer ist.

    (dwRead = 0 --> 0 ml Milch im Glas )

     

Log in to post a comment.