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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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]
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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_BLOCKSD_WRITEVAR_INPUT
  EN: BOOL;  (* *)
  ATTRIB : BYTE;
  FILENO : BYTE;
  SEG : DWORD;
  FORMAT : BYTE;
  NVAR : WORD;
  ADRVAR : DWORD;END_VARVAR_OUTPUT
  DONE : BOOL;
  ERR : BOOL;
  ERNO : WORD;END_VARVAR
  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_VAREINGANG(CLK :=EN);START :=EINGANG.Q;IFSTARTTHENDATEI_NAME :=CONCAT(DATEI_NAME_1, CONCAT(BYTE_TO_STRING(FILENO), DATEI_NAME_2));H_FILE :=SysFileOpen(DATEI_NAME, 'w');FORCounter1:=0TO5DOVARIABLE :=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;ELSEDONE :=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.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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 ^^
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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 )
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
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.
ADR wird im Allgemeinen verwendet um eine Adresse zu ermitteln, der Baustein erwartet wohl einen Pointer.[/code]
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
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
Ich kenne SD_Write nicht, vermute aber mal: sehr warscheinlich ja.
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.
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;
Wo kommen jetzt diese anhänge her?? ich kann mir diese nämlich nicht erklären.
Hi
HÄ, schaut irgendwie verwirrend aus.
Versuche es doch mal mit:
dwWritten := SysFileWrite(H_FILE, ADR(VARIABLE), SIZEOF (VARIABLE));
Danke, der Tip hat geholfen
Freut mich.
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???
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.
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 ^^
Hi
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 )