27
« am: 06. Juli 2015, 08:29:04 »
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