ich mach gerade meine ersten Gerversuche mit ST in Codesys.
ich bin dabei ein Array of Byte mit auf asci Zeichen zu durchsuchen
dafür habe ich folgenden Code erstellt
FORI:=0TOsizeDO
  IFPT^[I]=13ORPT^[I] =10THEN
    zahl:=zahl+1;
  END_IF
  IFzahl=52THEN
    anfang:=PT^[I-1];
    feld_anfang:=I;
    zahl_anfang:=zahl;
  END_IF
  IFzahl=53THEN
    ende:=PT^[I-1];
    feld_ende:=I;
    zahl_ende:=zahl;
  END_IFEND_FOR
Jetzt habe ich nur ein Problem:
Die For-Schleife wird ordnungsgemäß durchlaufen, allerding wird obwohl die For-schleife schon fertig ist der Int "zahl" zwischen der If Abfrage
IFPT^[I]=13ORPT^[I] =10THEN
    zahl:=zahl+1;
  END_IF
weiterhin aufaddiert und fängt deswegen natürlich nach einem Überlauf wieder von Vorne an.
Kann mir jemand helfen, warum "zahl" weiterhin aufaddiert wird?
Vielen Dank.
Ich sehr hier nämlich keinen Fehler!
Gruß Michael
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I kann doch nicht gleichzeitig Dein Pointer und Dein Schleifenzähler sein. Wenn das Array vorher schon festgelegt ist sollte das eher so aussehen:
FORI:=0TOsizeDOÂ Â IFMeinArray[I]=13ORMeinArray[I]=10THENÂ Â Â Â zahl:=zahl+1;Â Â END_IFÂ Â IFzahl=52THENÂ Â Â anfang:=MeinArray[I-1];Â Â Â feld_anfang:=I;Â Â Â zahl_anfang:=zahl;Â Â END_IFÂ Â IFzahl=53THENÂ Â Â ende:=MeinArray[I-1];Â Â Â feld_ende:=I;Â Â Â zahl_ende:=zahl;Â Â END_IFEND_FOR
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Leider ist aus Deinem Posting nicht ersichtlich, wie Dein Array definiert ist (ich nehme mal an, es ist ein Pointer-Array), was size ist und was Du da eigentlich genau überprüfst.
Ausserdem wird eine Schleife pro Zyklus vollständig durchlaufen. So wie es aussieht, stimmt eben der Vergleich in jedem Zyklus, um den IF -> End_If Rumpf zu verarbeiten.
Wenn während des Zykluses der wert in dem durch den Pointer referenzierten Speicherbereich nicht ändert, dereferenziert eben jeder Zyklus, immer wieder den gleichen Feld-Inhalt. Somit wird die Zahl auch weiter hochgezählt, bis eben ein anderer Wert dereferenziert wird. dieser Wert ändert sich sehr wahrscheinlich nicht.
Du müsstest eher definieren(auch mit einen If-Anweisung), ob die Schleife durchlaufen werden soll oder nicht. Eventuell mit einer Flanken-Triggerung oder dergleichen.
Mit freundlichen Grüssen! Pitsch
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Das mit der Flankentriggerung habe ich auch schon überlegt.
ich poste mal den kompletten FB, damit man sich einen überblick verschaffen kann.
FUNCTION_BLOCKstring_auslesenVAR_INPUT  PT:POINTERTOARRAY[0..  MAX_RECEIVE_TCP_CLIENT]OFBYTE;  size:INT;END_VARVAR_OUTPUT  anfang:BYTE;  ende:BYTE;  feld_anfang:INT;  feld_ende:INT;  zahl_anfang:INT;  zahl_ende:INT;END_VARVAR  I:INT:=0;  zahl:WORD:=0;END_VAR
FORI:=0TOsizeDO
  IFPT^[I]=13ORPT^[I] =10THEN
    zahl:=zahl+1;
  END_IF
  IFzahl=52THEN
    anfang:=PT^[I-1];
    feld_anfang:=I;
    zahl_anfang:=zahl;
  END_IF
  IFzahl=53THEN
    ende:=PT^[I-1];
    feld_ende:=I;
    zahl_ende:=zahl;
  END_IFEND_FOR
Der Baustein bekommt bei "PT" die Adresse eines Arrays of Byte. Dieses Array ist 4000 Byte lang, allerdings nur bis zum Feld "size" gefüllt.
Jedes Byte beinhaltet den ASCI Code eines Zeichnes einer Datei.
Ich will jetzt das Array auf Zeilenumbrüche durchsuchen und mit einige Zeilen später dann ausgeben.
=> Deswegen der Zähler "zahl" dieser soll mir die gefundenen Zeilenumbrüche herausfiltern und das Startfeld und Endefeld der z.B. 54. zeile ausgeben.
Damit ich nicht das Array durchsuchen muss, wollte ich eben die Suche auf die gefüllten Zellen des Arrays begrenzen indem ich nur bis "size" durchsuche.
Ich versuche es jetzt mal mit einer Triggerflanke, allerdings wollte ich später dann nur immer "I" auf 0 zurücksetzen damit es wieder durchlaufen wird.
Mich wundert halt nur, das die Forschleife weiter durchlaufen wird obwohl bereits "I" = "size" ist.
Vielen dank für eure Unterstützung.
Gruß Michael
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I ist im nächsten Zyklus, da die Schleife wieder von vorne beginnt, natürlich wieder null! Dein Problem, ist wirklich nur, Du vergisst, dass ein SPS-Programm Zyklisch abgearbeitet wird. Das kannst Du nicht mit einem Komputerprogramm z.B. VB oder VBA vergleichen.
Vielleicht hilft es ja, wenn Du im Codeteil, in der ersten Zeile die Variable Zahl auf null setzst.
Zahl := 0;FOR I:=0 TO size DO(*etc.*)
Mit freundlichen Grüssen! Pitsch
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo liebes Forum,
ich mach gerade meine ersten Gerversuche mit ST in Codesys.
ich bin dabei ein Array of Byte mit auf asci Zeichen zu durchsuchen
dafür habe ich folgenden Code erstellt
Jetzt habe ich nur ein Problem:
Die For-Schleife wird ordnungsgemäß durchlaufen, allerding wird obwohl die For-schleife schon fertig ist der Int "zahl" zwischen der If Abfrage
weiterhin aufaddiert und fängt deswegen natürlich nach einem Überlauf wieder von Vorne an.
Kann mir jemand helfen, warum "zahl" weiterhin aufaddiert wird?
Vielen Dank.
Ich sehr hier nämlich keinen Fehler!
Gruß Michael
I kann doch nicht gleichzeitig Dein Pointer und Dein Schleifenzähler sein. Wenn das Array vorher schon festgelegt ist sollte das eher so aussehen:
Hallo danke.
Aber I ist doch nicht mein Pointer sondern PT und I ist mein Schleifenzähler.
Oder stehe uch auf der Leitung?
Danke
Gruß Michael
Hallo
Leider ist aus Deinem Posting nicht ersichtlich, wie Dein Array definiert ist (ich nehme mal an, es ist ein Pointer-Array), was size ist und was Du da eigentlich genau überprüfst.
Ausserdem wird eine Schleife pro Zyklus vollständig durchlaufen. So wie es aussieht, stimmt eben der Vergleich in jedem Zyklus, um den IF -> End_If Rumpf zu verarbeiten.
Wenn während des Zykluses der wert in dem durch den Pointer referenzierten Speicherbereich nicht ändert, dereferenziert eben jeder Zyklus, immer wieder den gleichen Feld-Inhalt. Somit wird die Zahl auch weiter hochgezählt, bis eben ein anderer Wert dereferenziert wird. dieser Wert ändert sich sehr wahrscheinlich nicht.
Du müsstest eher definieren(auch mit einen If-Anweisung), ob die Schleife durchlaufen werden soll oder nicht. Eventuell mit einer Flanken-Triggerung oder dergleichen.
Mit freundlichen Grüssen! Pitsch
Hallo vielen Dank.
Das mit der Flankentriggerung habe ich auch schon überlegt.
ich poste mal den kompletten FB, damit man sich einen überblick verschaffen kann.
Der Baustein bekommt bei "PT" die Adresse eines Arrays of Byte. Dieses Array ist 4000 Byte lang, allerdings nur bis zum Feld "size" gefüllt.
Jedes Byte beinhaltet den ASCI Code eines Zeichnes einer Datei.
Ich will jetzt das Array auf Zeilenumbrüche durchsuchen und mit einige Zeilen später dann ausgeben.
=> Deswegen der Zähler "zahl" dieser soll mir die gefundenen Zeilenumbrüche herausfiltern und das Startfeld und Endefeld der z.B. 54. zeile ausgeben.
Damit ich nicht das Array durchsuchen muss, wollte ich eben die Suche auf die gefüllten Zellen des Arrays begrenzen indem ich nur bis "size" durchsuche.
Ich versuche es jetzt mal mit einer Triggerflanke, allerdings wollte ich später dann nur immer "I" auf 0 zurücksetzen damit es wieder durchlaufen wird.
Mich wundert halt nur, das die Forschleife weiter durchlaufen wird obwohl bereits "I" = "size" ist.
Vielen dank für eure Unterstützung.
Gruß Michael
Hallo
I ist im nächsten Zyklus, da die Schleife wieder von vorne beginnt, natürlich wieder null! Dein Problem, ist wirklich nur, Du vergisst, dass ein SPS-Programm Zyklisch abgearbeitet wird. Das kannst Du nicht mit einem Komputerprogramm z.B. VB oder VBA vergleichen.
Vielleicht hilft es ja, wenn Du im Codeteil, in der ersten Zeile die Variable Zahl auf null setzst.
Mit freundlichen Grüssen! Pitsch
Stimmt ich bin die ganze zit davon ausgegangen, dass I erst wieder auf 0 gesetzt wird wenn ic es auf 0 setze.
Vielen dank für die Erklärung.
Gruß Michael