-> Hier kostenlos registrieren
Hallo zusammen,
ich komme gerade beim debuggen einer Funktion nicht weiter weil meine Wago 750-880 gleich die Kommunikation beim Starten des Programms beendet. Den Fehler konnte ich jedoch schon auf eine von mir geschriebene Funktion eingrenzen.
Ich möchte Daten in eine MySQL Datenbank schreiben. Das funktioniert vom Prinzip auch. Jetzt hab ich aber einen großen Datensatz mit über 20 Werten, dadurch wird der String den ich zusammenbasteln muss sehr lang. Stringoperationen gehen ja nur bis 255 Zeichen.
Der Baustein MySql_Execute aus der WagoLibMySql_03.lib ja ein Array of String. Vorher hatte ich eine Funktion am laufen, die das SQL Kommando zu einem String zusammengesetzt hat. Anschließend habe ich mit LEFT und MID den String auf das Array of String verteilt und versendet. Hat auch einwandfrei funktioniert bis mein Kommando String zu lange wurde.
Meine Idee war dann, meiner Funktion als Rückgabewert direkt das Array of String zu übergeben. In der Funktion prüfe ich dann während der Zusammenstellung des Kommandos immer ob die Stringlänge größer 100 ist, wenn ja kopiere ich die ersten 100 Zeichen auf die erste Position des Arrays und lösche 100 Positionen in meinem temporären Kommandostring usw...
Wenn ich jetzt die Funktion einspiele geht die SPS sofort auf Störung und es wird ausgeloggt. Ich kann keinen Fehler im Code erkennen. Fällt jemand von euch was auf?
Gibt es überhaupt eine Möglichkeit sowas zu debuggen? Ich sehe keine Diagnosemöglichkeit?
ich komme gerade beim debuggen einer Funktion nicht weiter weil meine Wago 750-880 gleich die Kommunikation beim Starten des Programms beendet. Den Fehler konnte ich jedoch schon auf eine von mir geschriebene Funktion eingrenzen.
Ich möchte Daten in eine MySQL Datenbank schreiben. Das funktioniert vom Prinzip auch. Jetzt hab ich aber einen großen Datensatz mit über 20 Werten, dadurch wird der String den ich zusammenbasteln muss sehr lang. Stringoperationen gehen ja nur bis 255 Zeichen.
Der Baustein MySql_Execute aus der WagoLibMySql_03.lib ja ein Array of String. Vorher hatte ich eine Funktion am laufen, die das SQL Kommando zu einem String zusammengesetzt hat. Anschließend habe ich mit LEFT und MID den String auf das Array of String verteilt und versendet. Hat auch einwandfrei funktioniert bis mein Kommando String zu lange wurde.
Meine Idee war dann, meiner Funktion als Rückgabewert direkt das Array of String zu übergeben. In der Funktion prüfe ich dann während der Zusammenstellung des Kommandos immer ob die Stringlänge größer 100 ist, wenn ja kopiere ich die ersten 100 Zeichen auf die erste Position des Arrays und lösche 100 Positionen in meinem temporären Kommandostring usw...
Wenn ich jetzt die Funktion einspiele geht die SPS sofort auf Störung und es wird ausgeloggt. Ich kann keinen Fehler im Code erkennen. Fällt jemand von euch was auf?
Gibt es überhaupt eine Möglichkeit sowas zu debuggen? Ich sehe keine Diagnosemöglichkeit?
Code:
FUNCTION SQL_Insert :ARRAY[0..10] OF STRING(100)
VAR_INPUT
sTable :STRING;
asColumns :ARRAY[0..30] OF STRING;
asValues :ARRAY[0..30] OF STRING;
iAmount :INT;
END_VAR
VAR
sTemp :STRING(500) := 'INSERT INTO ';
i : INT;
j :INT := 0;
END_VAR
j:= 0;
(*Tabellenname einfügen *)
sTemp := CONCAT(sTemp, sTable);
sTemp := CONCAT(sTemp, ' (');
(*Spaltennamen einfügen *)
FOR i := 0 TO iAmount DO
sTemp := CONCAT(sTemp, asColumns[i]);
(* Wenn Stringlänge größer gleich 100 umkopieren *)
IF LEN(sTemp) >= 100 THEN;
SQL_Insert[j] := LEFT(sTemp,100);
DELETE(sTemp,100,0);
j := j +1;
END_IF;
(* Solange noch nicht letzter Wert erreicht Trennzeichen ergänzen *)
IF i < iAmount THEN
sTemp := CONCAT(sTemp, ', ');
END_IF;
END_FOR;
sTemp := CONCAT(sTemp, ') VALUES (');
(* Wenn Stringlänge größer gleich 100 umkopieren *)
IF LEN(sTemp) >= 100 THEN;
SQL_Insert[j] := LEFT(sTemp,100);
DELETE(sTemp,100,0);
j := j +1;
END_IF;
(* Werte einfügen *)
FOR i := 0 TO iAmount DO
sTemp := CONCAT(sTemp, asValues[i]);
(* Wenn Stringlänge größer gleich 100 umkopieren *)
IF LEN(sTemp) >= 100 THEN;
SQL_Insert[j] := LEFT(sTemp,100);
DELETE(sTemp,100,0);
j := j +1;
END_IF;
IF i < iAmount THEN
sTemp := CONCAT(sTemp, ', ');
END_IF;
END_FOR;
(* Kommando fertig stellen *)
sTemp := CONCAT(sTemp, ')' );
(* Wenn Stringlänge größer gleich 100 umkopieren *)
IF LEN(sTemp) >= 100 THEN;
SQL_Insert[j] := LEFT(sTemp,100);
DELETE(sTemp,100,0);
j := j +1;
ELSE
SQL_Insert[j] := sTemp;
END_IF;
Zuletzt bearbeitet: