-> Hier kostenlos registrieren
Hallo Leute,
ich stehe vor folgender Aufgabe:
Ein Teilnehmer wird mittels TCP/IP Kommunikation abgefragt.
Ich habe alles am Laufen, es funktioniert alles zufriedenstellend, ABER:
mein Bautein hat in SCL 1200 Zeilen, und auf einer IM151-8F PN/DP eine Zykluszeit von 21ms.
Was wird dort gemacht, bzw. was ist die Bremse?
Ganz einfach:
Ich werte ein Array of Char aus, in dem 4000 Chars kommen.
Die ersten 280 Char werden nicht angeguckt, da sie unwichtige Header-Infos enthalten.
Die Daten die danach kommen, sehen etwa so aus:
Wenn nun Variable 1 nicht 123456 ist, sonder nur 1.0 dann verschieben sich die Positionen von Variable 2-n natürlich in meinem Array.
Wie ist mein vorgehen bisher:
Ich weis wo meine Daten ungefähr ankommen.
Dann füge ich eine FOR-Schleife ein, die an dieser Position +-20 Zeichen eine Bestimmte zeichenkette sucht, das ende der Variable sucht, die Variable in einen String kopiert und dann in ein passendes Datenformat konvertiert... etwa so:
(Wichtige Info: Code ist grad aus dem Kopf runtergetippt, muss nicht 100% korrekt sein, es geht ums Prinzip)
Dieser ganze Code ist
1. Total aufgebläht und meiner Meinung nach recht "unschön" und schwer verständlich
2. Frisst er abartig Zykluszeit, weil ich durch diverste Schleifen renne
Diesen Code führe ich für etwa 20 Variablen durch, entsprechend erhöht sich die Zykluszeit.
Jetzt wäre es für mich interessant zu wissen wie ihr sowas löst! Ich denke, dass ich nicht der Einzige sein kann der eine recht große Menge von CHARS sinnvoll auslesen muss. Ich denke bei einem IPC würde mich das nicht interessieren, da fällt mir die Zykluszeit vermutlich nicht mal auf, bei der kleinen Muckelkiste von IM-CPU ist es aber relevant (und bevor jemand es vorschlägt: NEIN, ich kann keine andere CPU verwenden!)
Ich freue mich auf eure Ideen und Vorschläge! Ich habe von puzzlefreak schon einmal ein paar Ansätze bekommen, und habe die Zykluszeit von 58ms auf 21ms senken können, ich hoffe nun das noch mehr geht. (ich brauche hier keine 2ms Zykluszeit, aber je schneller der Code wird, desto mehr Abfragen könnte ich noch machen)
Grüße
Marcel
ich stehe vor folgender Aufgabe:
Ein Teilnehmer wird mittels TCP/IP Kommunikation abgefragt.
Ich habe alles am Laufen, es funktioniert alles zufriedenstellend, ABER:
mein Bautein hat in SCL 1200 Zeilen, und auf einer IM151-8F PN/DP eine Zykluszeit von 21ms.
Was wird dort gemacht, bzw. was ist die Bremse?
Ganz einfach:
Ich werte ein Array of Char aus, in dem 4000 Chars kommen.
Die ersten 280 Char werden nicht angeguckt, da sie unwichtige Header-Infos enthalten.
Die Daten die danach kommen, sehen etwa so aus:
Code:
Variable1=123456.123456,Variable2=4321.1,Variable3=123
Wenn nun Variable 1 nicht 123456 ist, sonder nur 1.0 dann verschieben sich die Positionen von Variable 2-n natürlich in meinem Array.
Wie ist mein vorgehen bisher:
Ich weis wo meine Daten ungefähr ankommen.
Dann füge ich eine FOR-Schleife ein, die an dieser Position +-20 Zeichen eine Bestimmte zeichenkette sucht, das ende der Variable sucht, die Variable in einen String kopiert und dann in ein passendes Datenformat konvertiert... etwa so:
(Wichtige Info: Code ist grad aus dem Kopf runtergetippt, muss nicht 100% korrekt sein, es geht ums Prinzip)
Code:
// Suchen nach Variable 1
FOR I:=280 TO 320 DO
// Finden der Zeichenfolge
IF CHARARRAY(i) = 'V' AND
CHARARRAY(i+1) = 'A' AND
CHARARRAY(i+2) = 'R' AND
CHARARRAY(i+3) = '1' AND
CHARARRAY(i+4) = '='
THEN
// Ich weis wo meine Variable anfängt (nach dem "=")
TMP_FOUND:=i+5;
END_IF;
// Wenn der Anfang der Variablen gefunden wurde...
IF_TMP_FOUND > 0 THEN
// Die Variable bis zum Punkt auslesen und in einen String kopieren(vereinfacht, eigentlich suche ich an dieser Stelle von i ab
//nach dem Punkt oder Komma, je nachdem ob ich Nachkommastellen brauche oder nicht)
TMP_EXIT:=FALSE;
TMP_STRING:=' ';
FOR J:=i TO i+6 DO
TMP_STRING:=CONCAT(IN1:=TMP_STRING, IN2:=CHARARRAY(J);
END_FOR;
// Nach dem erstellen des String den String in DINT wandeln
MY_DINT:= STRING_TO_DINT(TMP_STRING);
TMP_EXIT:=TRUE;
EXIT; // Spart nen Haufen Zykluszeit
END_IF;
IF TMP_EXIT:=TRUE THEN
EXIT; // Nach verlassen der ersten FOR-Schleife auch die Verschachlte verlassen)
END_IF;
END_FOR;
Dieser ganze Code ist
1. Total aufgebläht und meiner Meinung nach recht "unschön" und schwer verständlich
2. Frisst er abartig Zykluszeit, weil ich durch diverste Schleifen renne
Diesen Code führe ich für etwa 20 Variablen durch, entsprechend erhöht sich die Zykluszeit.
Jetzt wäre es für mich interessant zu wissen wie ihr sowas löst! Ich denke, dass ich nicht der Einzige sein kann der eine recht große Menge von CHARS sinnvoll auslesen muss. Ich denke bei einem IPC würde mich das nicht interessieren, da fällt mir die Zykluszeit vermutlich nicht mal auf, bei der kleinen Muckelkiste von IM-CPU ist es aber relevant (und bevor jemand es vorschlägt: NEIN, ich kann keine andere CPU verwenden!)
Ich freue mich auf eure Ideen und Vorschläge! Ich habe von puzzlefreak schon einmal ein paar Ansätze bekommen, und habe die Zykluszeit von 58ms auf 21ms senken können, ich hoffe nun das noch mehr geht. (ich brauche hier keine 2ms Zykluszeit, aber je schneller der Code wird, desto mehr Abfragen könnte ich noch machen)
Grüße
Marcel