MY_SQL: Codesys2 / 750-8202

Begonnen von mg, 06. Juli 2015, 08:29:04

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

mg

Hallo Leute

Habe MY_SQL mit dem 750-8202 Codesys 2 aufprobiert.
Zumindest ab und zu ging es, aber irgendwann kam der Status:
COM.SQL_RCV_STATE = 0 zurück.
Dann hängte der MYSQL_CONTROL im Step 199 fest. Soweit ist das logisch.
Aber was hat das Byte  COM.SQL_RCV_STATE für eine Funktion?

... und noch was:
Für eine korrekte Funktion fehlt folgende Zeile ... siehe Code
(*████████████████████████ DIESE ZEILE FEHLT ████████████████████████*) X.ADD_DATA_REQ:=FALSE;


X.DTI := DTI; (* Datum / Zeit eintragen *)
X.CLOCK_TRIG := DTI <> dti_last;
dti_last := DTI;
trig_auto := FALSE;
IF X.CLOCK_TRIG THEN (* Impuls in jeder Sekunde *)
del_start := DT_TO_UDINT(DTI) - del_dt > AUTO_DELETE AND AUTO_DELETE > UDINT#0;
IF TRIG_T >= T#1000ms THEN (* automatischer Trigger *)
trig_auto := DT_TO_UDINT(DTI) MOD (TIME_TO_UDINT(TRIG_T) / UDINT#1000) = UDINT#0;
END_IF;
END_IF;
X.ADD_COM := 00;

CASE step OF

00: IF ENABLE AND enable_last = FALSE THEN
COM.SQL_URL := URL;
COM.TIMEOUT := TIMEOUT;
COM.DNS_IP4 := DNS_IP4;
COM.SQL_CON := TRUE;

X.UCB.D_MODE := 99; (* Buffer reset - Alles löschen *)
UCB(DATA:=X.UCB);

X.ID_MAX := USINT#00;
X.STORE_TYPE := BYTE#5; (* MySQL-Modus *)
X.ADD_COM := 01; (* ADD INFO *)

step := 05;
END_IF;

05: X.ADD_COM := 02; (* ADD HEADER *)
step := 10;

10: IF SQL_INFO.SQL_CONNECTED THEN
sql_command := BYTE#3; (* CREATE DATABASE IF NOT EXISTS `db_name` *)
snd_text :=  CONCAT('CREATE DATABASE IF NOT EXISTS `' ,DB_NAME);
snd_text :=  CONCAT(snd_text, '`');
next_step := 20;
END_IF;

20: sql_command := BYTE#2; (* 0x02 COM_INIT_DB mysql_select_db *)
snd_text := DB_NAME;
next_step := 30;

30: (* CREATE TABLE IF NOT EXISTS tb_name (Timestamp TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, n1,n2) *)
sql_command := BYTE#0;
idx := 5;
n := USINT#0;
WHILE sql_command = BYTE#0 DO
IF n = USINT#0 THEN
snd_text := CONCAT('CREATE TABLE IF NOT EXISTS `', TB_NAME);
snd_text := CONCAT(snd_text,'` (`ID` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY ,');
snd_text := CONCAT(snd_text,' store_timestamp TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP');
ELSIF n <= X.ID_MAX THEN
X.UCB.D_MODE := 12; (* Element lesen und löschen *)
UCB(DATA:=X.UCB);
snd_text := CONCAT(', `',X.UCB.D_STRING);
CASE WORD_TO_INT(SHR(X.UCB.D_HEAD,8)) OF
02: snd_text := CONCAT(snd_text, '` FLOAT'); (* REAL *)
06: snd_text := CONCAT(snd_text, '` BOOL'); (* BOOL *)
08: snd_text := CONCAT(snd_text, '` INT'); (* DINT *)
13: snd_text := CONCAT(snd_text, '` DATETIME'); (* DT *)
ELSE
snd_text := CONCAT(snd_text, '` VARCHAR(80)'); (* STRING(80) *)
END_CASE;
ELSE
snd_text := ')';
sql_command := BYTE#3;
snd_size := idx + LEN(snd_text);
next_step := 40;
END_IF;
_STRING_TO_BUFFER(str:=snd_text,pos:=idx,pt:=ADR(COM.S_BUF.BUFFER),size:=SIZEOF(COM.S_BUF.BUFFER)); (* String in puffer kopieren *)
idx := idx + LEN(snd_text);
n := n + USINT#1;

(*####################  DEBUG-MESSAGE  ###################################*)
(*IF _debug_enable THEN
LOG_CL.NEW_MSG := 'dlog_mysql: create >~1<';
LOG_CL.PRINTF[1] := snd_text;
LOG_MSG();
END_IF;*)
(*########################################################################*)
END_WHILE;

40: IF del_start THEN
del_start := FALSE;
sql_command := BYTE#3; (* DELETE FROM `tb_name` WHERE TIMESTAMPDIFF(SECOND, Timestamp, NOW()) > xxx *)
snd_text := CONCAT('DELETE FROM `', TB_NAME);
snd_text := CONCAT(snd_text, '` WHERE TIMESTAMPDIFF(SECOND, store_timestamp, NOW()) > ');
snd_text := CONCAT(snd_text, UDINT_TO_STRING(AUTO_DELETE));
next_step := 40;
del_dt := DT_TO_UDINT(DTI);
(*####################  DEBUG-MESSAGE  ###################################*)
(*IF _debug_enable THEN
LOG_CL.NEW_MSG := 'dlog_mysql: # delete time:~1 >~2<';
LOG_CL.PRINTF[1] := UDINT_TO_STRING(AUTO_DELETE);
LOG_CL.PRINTF[2] := snd_text;
LOG_MSG();
END_IF;*)
(*########################################################################*)

         (* INSERT INTO `tb_name` VALUES (CURRENT_TIMESTAMP,  "n1","n2") *)
ELSIF X.UCB.BUF_COUNT >= USINT_TO_INT(X.ID_MAX) AND step > 0 THEN (* Neue Datenreihe(n) vorhanden *)
idx := 5;
n := USINT#0;
sql_command := BYTE#0;
WHILE sql_command = BYTE#0 DO
IF n = USINT#0 THEN
snd_text := CONCAT('INSERT INTO `', TB_NAME);
snd_text := CONCAT(snd_text,'` VALUES (NULL, CURRENT_TIMESTAMP');
ELSIF n <= X.ID_MAX THEN
X.UCB.D_MODE := 12; (* Element lesen und löschen *)
UCB(DATA:=X.UCB);
snd_text := CONCAT(', "',X.UCB.D_STRING);
snd_text := CONCAT(snd_text, '"');
ELSE
snd_text := ')';
sql_command := BYTE#3;
snd_size := idx + LEN(snd_text);
next_step := 40;
END_IF;
_STRING_TO_BUFFER(str:=snd_text,pos:=idx,pt:=ADR(COM.S_BUF.BUFFER),size:=SIZEOF(COM.S_BUF.BUFFER)); (* String in puffer kopieren *)
idx := idx + LEN(snd_text);
n := n + USINT#1;

(*####################  DEBUG-MESSAGE  ###################################*)
(*IF _debug_enable THEN
LOG_CL.NEW_MSG := 'dlog_mysql: insert >~1<';
LOG_CL.PRINTF[1] := snd_text;
LOG_MSG();
END_IF;*)
(*########################################################################*)
END_WHILE;
END_IF;

IF ENABLE THEN (* LOG-Trigger verarbeiten *)
trig_tmp := (TRIG_M AND NOT trig_m_last) OR trig_auto OR X.ADD_DATA_REQ;

IF trig_tmp THEN (* manueller, automatischer oder externer Trigger *)
X.ADD_COM := 03; (* ADD DATA *)
(* ---------------- Debug-Message -----------------------*)
(*IF _debug_enable THEN
LOG_CL.NEW_MSG := 'dlog_mysql: Trigger: DATE [~2]';
LOG_CL.PRINTF[2] := DT_TO_STRING(DTI);
LOG_MSG();
END_IF;*)
(* -----------------------------------------------------------------*)
ELSE
X.ADD_COM := 04; (* ADD DATA REQ *)
END_IF;
ELSE
COM.SQL_CON := FALSE; (* MySQL Verbindung beenden *)
step := 0;
END_IF;
(*████████████████████████ DIESE ZEILE FEHLT ████████████████████████*) X.ADD_DATA_REQ:=FALSE;
(* ~~~~~~~~~~~~~~~~~~~~~~ *)

199:IF COM.SQL_RCV_STATE = BYTE#1 THEN (* OK *)
step := next_step;
ELSIF COM.SQL_RCV_STATE = BYTE#2 THEN  (* FEHLER *)
step := 0;
END_IF;

END_CASE;

(* ########################## *)
(* SQL-Kommando ausführen *)
IF sql_command > BYTE#0 THEN
IF snd_size > 0 THEN
COM.S_BUF.SIZE := INT_TO_UINT(snd_size);
snd_size := 0;
ELSE
_STRING_TO_BUFFER(str:=snd_text,pos:=5,pt:=ADR(COM.S_BUF.BUFFER),size:=SIZEOF(COM.S_BUF.BUFFER)); (* String in puffer kopieren *)
COM.S_BUF.SIZE := INT_TO_UINT(5 + LEN(snd_text));
snd_text := '';
END_IF;

i2 := UINT_TO_INT(COM.S_BUF.SIZE) - 1; (* alle " zeichen mit ' ersetzen *)
FOR i1 := 5 TO i2 DO
IF COM.S_BUF.BUFFER[i1] = BYTE#34 THEN
COM.S_BUF.BUFFER[i1] := BYTE#39;
END_IF;
END_FOR;

COM.S_BUF.BUFFER[4] := sql_command;
COM.SQL_PACKET_NO := BYTE#255;
sql_command := BYTE#0;
step := 199;
END_IF;

(* ########################## *)

MYSQL_CONTROL(COM:= COM, INFO:=SQL_INFO);
ERROR_C := COM.ERROR_C;
ERROR_T := COM.ERROR_T;

IF COM.ERROR_T > BYTE#0 THEN  (* FEHLER *)
step := 0;
END_IF;

(* ########################## *)

trig_m_last := TRIG_M;
enable_last := ENABLE;
run := step > 0;

(* revision history
ks 20. apr. 2012 rev 1.0
original version

*)


Mg

peewit

#1
hallo

das es mit dem baustein ein problem gibt ist mir neu

hast du auch schon die letzte beta mal ausprobiert
http://www.oscat.de/community/index.php/topic,1872.msg9862.html#msg9862


es kann auch sein das es eine kleine inkompatibilität deiner sps zu den testplattformen gibt (wäre nichts neues...)

wenn deine codeänderung zu einen dauerhaft besseren ergebnis führt, dann lass es drinnen....
aber wahrscheinlich bekämpfst du damit nur den fehlerhaften zustand und nicht die ursache


mg

#2
Hallo Peewit

...  wie soll ich wissen ob ich nur ein Symtom bekämpfe oder ob es ein Fehler ist. ...
Leider fehlt bei vielen Variablen die Beschreibung und dann ist es halt ein bisserl kompliziert.

TROTZDEM ... glaube ich eher an einen Fehler aus folgendem Grund:
Ich hatte die selben DLOG_REAL mit RRD probiert. FUNKTIONIERTE !!!
Danach habe ich das Ganze mit MYSQL gemacht. Der Baustein hat nicht aufgehört zu senden (4 Meldungen pro sec auf die Datenbank)
Danach habe ich erkannt, daß das Problem im Baustein liegen muss und bin der ganzen Sache nachgegangen und habe erkannt daß X.ADD_DATA_REQ immer auf TRUE ist.
Jetzt habe ich den RRD mit dem SQL verglichen und gesehen, daß am Ende des Sendens beim RRD das Flag X.ADD_DATA_REQ auf FALSE gesetzt wird. Beim SQL nicht. Dann habe ich es dort auch reingeschrieben und es funktionierte.

Mg

peewit

hi

ich stimme dir zu das ein fremder code nicht immer leicht zu verstehen ist

da ich das ganze vor fast 2 jahren erfunden habe, ist es komischerweise auch für mich nicht mehr so leicht :-)


ich kenne viele leute die den mysql logger problemlos im einsatz haben, deshalb wundert mich das von dir geschilderte problem.

ich habe nun in meinem originalcode nachgesehen und siehe da...

deine geänderte codezeile ist bei mir sowieso vorhanden

prüf doch mal welche version du verwendest, denn irgendwas passt da nicht

entweder hast du eine alte version oder versehentlich verändert ?

ich habe dir vorhin schon einen link geschickt mit der letzten beta version

das ist meine letzversion
version 1.1      17. jan. 2014
programmer      ks
tested by      ks

mg

#4
Hallo Peewit

oscat_netlib130_de

... sieht aktuell aus IST ES ABER NICHT ....
im Baustein selbst hat es folgende Änderung gegeben

ks   14. oct. 2013   rev 1.1
   DNS_CLIENT Fehler durch zugriffskonflikt zwischen dns_client und mySQL auf S_BUF

... naja dann gibt es wohl was neueres.

anscheindend ist die aktuelle Nr. die 1.32
oscat_version returns the version number in dword format
132 is library version 1.32
if IN = true, the release date will be returned

Danke Mg