OSCAT-NETWORK-LIB 1.30 Release Candidate 1

Begonnen von rrbd, 13. November 2012, 07:36:34

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

linsenpago

die Fehlermeldung habe ich doch schon geschrieben...

Fehler: 1156 SQLSTATE: 08S01
(ER_NET_PACKETS_OUT_OF_ORDER)


Ich habe jetzt dem Support von meinem Webspace geschrieben:

Hallo liebes Supportteam!

Ich habe zu meinem Account einen externen Zugriff auf eine
mysql-Datenbank einrichten lassen.

Ich bekomme aber leider keine funktionierende Verbindung zu
der Datenbank.

Ich bekomme als Fehlermeldung beim Connect:

Fehler: 1156 SQLSTATE: 08S01
(ER_NET_PACKETS_OUT_OF_ORDER)

Meldung: Pakete nicht in der richtigen Reihenfolge empfangen

Ich habe andere Datenbanken getestet, und dort klappt der
Connect ohne Probleme. (z.b. freesqldatabase.com oder eine
lokale xampp installation).

Aber sobald ich mich auf ihre mysql Datenbank verbinden
möchte bekomme ich die oben genannte Fehlermeldung.


Als Antwort kam dies zurück:

Sehr geehrte Kundin, sehr geehrter Kunde,

vielen Dank für die Mitteilung.

Wann passiert dies, bei uns ist der

max_allowed_packet= 16M ist dies bei Ihrem Client auch so eingestellt.

Wie können wird dies testen oder Produzieren ?


Mit freundlichen Grüßen

Ihr Team von ...

peewit

#16
das muss ich mir erst mal in ruhe ansehen, was man da an parameter noch ändern kann

aber das ist meiner meinung nach eine einstellung die man auf der mysql-server machen kann, und nur festlegt welche maximale länge die datenpakete haben dürfen/können

wir schicken aber nur maximal 4000 bytes grosse datenpakete

also denke ich das dies kein lösungsweg ist !


(z.b. freesqldatabase.com oder eine lokale xampp installation).
hast du wirklich nun andere ausprobiert und dort kein problem gehabt



hast du schon mal die WagoLibMySQL_03.lib probiert
wäre interessant ob hier das gleiche problem bei dir besteht

linsenpago

#17
Zitat von: peewit in 15. Februar 2013, 20:30:18
hast du wirklich nun andere ausprobiert und dort kein problem gehabt
Ja, dort läuft es mehr oder weniger ohne Probleme.
Das einzige Problem, dass ich dort noch habe - wenn mein ADSL Anschluss seine 24h Zwangstrennung macht, dann bekomme ich am mysql Baustein einen Fehler und er baut die Verbindung nicht mehr auf und ich muss ihn manuell auf false und wieder true setzen, dann funktioniert er wieder. Ich habe gestern Abend mal das Timeout erhöht.. mal schaub ob das was gebracht hat.

Zitat von: peewit in 15. Februar 2013, 20:30:18
hast du schon mal die WagoLibMySQL_03.lib probiert
wäre interessant ob hier das gleiche problem bei dir besteht


Nein, habe ich noch nicht versucht. Ich werde mir die lib aber mal ansehen und wenn ich es verstehe ausprobieren. ;-)

Ich könnte mir auch einen HUB besorgen und mal einen TCP-Dump machen... nur leider habe ich nur Switches daheim und komme daher im Moment noch nicht an die Kommunikation der SPS mit dem Internet.


edit: Ich habe gerade nachgesehen.. ich habe wieder einen Fehler bekommen heute Nacht:
error_t: 2
error_c: 4244635648

Wenn ich das mit dem Umrechnen richtig verstanden habe, müsste das dann 0xfd00 und 0x0000 sein...

peewit

solange der baustein aktiv geschalten ist, bleibt auch die tcp-verbindung bestehen
wenn dann bei dir dein router einen reset durchführt, dann wird diese verbindung zerstört und es kommt zum fehler
und das behebt man durch einmaliges enable off/on

also genauso so wie du es gemacht hast
soweit ist alles normal !

---------------------------------------

error_t: 2
error_c: 4244635648

Wenn ich das mit dem Umrechnen richtig verstanden habe, müsste das dann 0xfd00 und 0x0000 sein...
0x fd00_0000 -> das hast du richtig interpretiert

-> die verbindung wurde von der remote seite getrennt bzw. von der gegenseite bewusst beendet

entweder hat dein router die verbindung beendet, oder der sql_server wegen inaktivität, oder netzwerkproblem


linsenpago

#19
alles klar!

Hast du eine Ahnung wie ich das automatisiert disablen/enablen kann wenn es zum Fehler kommt?

Oder irgendjemand?

PS: jetzt Fehlen mir zu meinem Glück die oben genannte Überwachung und, dass ich auch die Kommawerte in die DB geschrieben bekomme...

Hast du eine Ahnung peewit?

wie man im Screenshot sehen kann übergebe ich den dlog Bausteinen die Kommastellen in der DB stehen aber nur ganze Werte...

[gelöscht durch Administrator]

peewit

#20
error reset

gefällt mir zwar selber nicht, aber vielleicht hilft es dir (das beispiel ist nicht getestet, aber es wird schon passen ....)
damit man die chance hat einen fehler auch zu sehen bzw. zu verarbeiten habe ich den reset zeitverzögert !
erzeugt bei einen vorhandenen fehler , nach der eingestellter zeit eine negative flanke am enable

siehe bild im anhang


keine komma werte ?

baustein: dlog_real

Der Eingang D legt fest mit welchem Zeichen der Dezimalpunkt dargestellt wird. Wir bei Parameter D kein Zeichen übergeben, so wird automatisch ',' verwendet.
das heisst wenn du dort das zeichen "." übergibst , dann kann der sql_server dies eventuell besser interpretieren
dass kannst du ja mal probieren !


[gelöscht durch Administrator]

mbruck

#21
Any chance for english documentation ?   :-\

So far, I copy/paste to google translate and use... ;)


skateman

Hallo,

ich habe gerade den Modbus-Client getestet und dabei einen Fehler in der Doku gefunden:

Bei Verwendung von Functioncode 4 (Read Input Register) muss natürlich auch die Anzahl der zu lesenden Datenpunkte mit R_POINTS definiert werden!

Siehe Anhang - fehlender Eintrag in der Doku-Matrix!


[gelöscht durch Administrator]

peewit


amos

Hallo peewit,

vielen Dank für Deine geniale Open Source Library. Habe DLOG_STORE_MYSQL erfolgreich mit einer Wago 750-881 getestet, läuft absolut performant (6 inserts per second) und CPU schonend. Ich werde nun versuchen die Messergebnisse eines Sick DS-60 perfomant in die Datenbank zu loggen.
Ich hoffe früher oder später wird auch noch postgresql den Weg in die  OSCAT-NETWORK-LIB finden.

Viele Grüße
amos

amos

Hi, im Projekt NET_VAR darf ich nicht antworten, darum hier mein Vorschlag:

Bitte das Rad nicht neu erfinden, sondern bezüglich der Kommunikation von mehreren Steuerungen untereinander  besser auf bewährte Open Source Lösungen zurück greifen.

http://www.oscat.de/community/index.php/topic,2106.0.html

Der kostenfreie Message Broker:

http://activemq.apache.org/

kann in weniger als 10 Minuten installiert werden und kommt meiner Erfahrung nach auch mit Millionen von Nachrichten <1500 Byte pro Sekunde klar.

rrbd

Wann gibt's eigentlich mal ein Release? Die 1.21 war ja für mich jedenfalls eher unbrauchbar, während ich die 1.30 schon seit längerem erfolgreich nutze.

Gruß

Rainer

arsh0r

Hi,

wir nutzen einige Funktionen der network.lib 1.30RC1 auf der PC WORX SRT Soft-SPS.

Da die Soft-SPS auf Windows läuft ergeben sich zusätzliche Probleme, die für eine normale SPS höchstwahrscheinlich nicht relevant sind (z.B, können andere Prozesse Dateien locken). Trotzdem stelle ich hier meine Patches mal rein.

FILE_SERVER:
Falls eine Datei nicht existiert brincht FILE_REMOVE mit einem Fehler ab, siehe: http://www.oscat.de/community/index.php/topic,2248.0.html

@@ -528,6 +561,11 @@
IF command = BYTE#7 THEN
IF FILE_REMOVE.Done THEN
error := FILE_REMOVE.Error;
+ IF FSD.MODE = BYTE#3 AND FILE_REMOVE.ErrorID = UINT#21 THEN
+ error := FALSE; (*Wenn die Datei nicht existiert kommt bei SRT ein Fehler*)
+ END_IF;
command := BYTE#0;
error_code := SEL_BYTE(error,BYTE#00,UINT_TO_BYTE(FILE_REMOVE.ErrorID + UINT#140)); (* Errorcode basis verschieben *)
(* ---------------------- Debug-Message ----------------------------*)


Nur zur vorsicht, es gibt nämlich funktionen, die Error=TRUE setzen aber am crror_code "0" schreiben. Im Handbuch steht hier: "Keine Fehlerinformation vorhanden."

@@ -327,6 +355,11 @@

30000: (* Befehl fertig *)
FSD.MODE := BYTE#0;
+ IF error AND error_code = BYTE#0 THEN (*Keine Fehlerinformation vorhanden?!*)
+ error_code := BYTE#1;
+ END_IF;
FSD.ERROR := error_code;
step := 0;
(* ---------------------- Debug-Message ----------------------------*)


Eher suboptimal, aber ich weiss mir aktuell nicht anders zu helfen. Ich hatte den Fehler, dass Dateien trotz  FSD.OFFSET = UDINT#4294967294 trotzdem überschrieben wurden anstatt am Ende anzuhängen. Die genaue Ursache konnte ich noch nicht eingrenzen. Ich gehe einfach nochmal sicher, dass der Zeigen am Dateiende sitzt.

@@ -238,6 +238,11 @@
IF FSD.OFFSET = UDINT#4294967294 THEN (* 16#FFFF_FFFE -> Zeiger auf Dateiende stellen *)
command := BYTE#5; (* File-Seek *)
seek_position := FSD.FILE_SIZE;
seek_mode := UINT#0; (* Positionierung relativ zum Dateianfang *)
step := 210;
+ seek_mode := UINT#2;  (* Positionierung relativ zum Dateiende *)
+ seek_position := UDINT#0;
+ step := 201;
ELSIF FSD.OFFSET > FSD.FILE_SIZE THEN (* prüfe auf gültige offset-vorgabe *)
error_code := BYTE#255;
step := 30000; (* Beenden *)
@@ -249,7 +254,30 @@
ELSE
step := 300;
END_IF;
+201: (* File Seek *)
+ IF command = BYTE#0 THEN
+ IF Error THEN
+ step := 30000; (* Beenden *)
+ ELSE
+ step := 202;
+ END_IF;
+ END_IF;

+202: (* File Tell - Position des Schreib/Lesezeiger auslesen *)
+ command := BYTE#6; (* File Tell *)
+ step := 203;
+
+203: (* File Tell *)
+ IF command = BYTE#0 THEN
+ IF Error THEN
+ step := 30000; (* Beenden *)
+ ELSE
+ seek_position := tell_position;
+ step := 210;
+ END_IF;
+ END_IF;
210: (* File Seek *)
IF command = BYTE#0 THEN
file_position := seek_position;


DLOG_STORE_FILE_CSV

Ich will auf keinen Fall das irgendwelche Logfiles überschrieben werden (nur anhängen) und ich will ein Logfile pro Tag mit 1-Minuten Werten. Ich nehme dafür in Kauf, dass bei einem Neustart der Soft-SPS die Kopfzeile noch einmal geschrieben wird. Ohne das Patch (retry on error) landen alle neuen Zeilen im Nirvana, falls die CSV von einem anderen Prozess (in meinem Fall WinSCP) gelockt ist. Kann der Puffer nicht ins CSV geschrieben werden, dann probiert er es im 5 Sekunden Abstand erneut. Läuft der Puffer (4096 Zeichen) über gibt es eine unschöne Zeile und alle zusätzlichen Daten sind fort. Die CSV wir bei mir aber nur einmal pro Stunde für ca. 20 Sekunden gelockt (ungünstigerweise wollte er genau da eine neue Zeile schreiben)...

@@ -68,6 +68,7 @@
total_bytes : UDINT;
buf_totalsize : INT := 4096;
workaround : WORD;
+ err_retry : TON;
END_VAR

@@ -217,6 +221,10 @@

FSD.MODE := WORD_TO_BYTE(workaround); (* 0X00 -> 000X = 3 create + write / 2 open + write *)
FSD.OFFSET := UDINT#0; (* Start bei Dateianfang *)
+ FSD.MODE := BYTE#2; (* File_Open_Exist + File_Write *)
+ FSD.OFFSET := UDINT#4294967294; (* 16#FFFF_FFFE ->Spezialcode: Daten automatisch an Dateiende anhängen *)
FSD.FILENAME := X.UCB.D_STRING; (* Dateiname *)
PT.SIZE := UINT#0;
SAVE_DATA.FN_REM := FSD.FILENAME; (* aktuellen Dateinamen remanent sichern *)

@@ -297,7 +305,15 @@
END_IF;
step_2 := 20;

-20: IF FSD.MODE = BYTE#0 THEN
+20:
+ IF err_retry.Q THEN (*Falls ein Fehler aufgetreten ist, nach 5s noch einmal probieren*)
+ FSD.ERROR := BYTE#0;
+ FSD.MODE := BYTE#2; (* File_Open_Exist + File_Write *)
+ FSD.OFFSET := UDINT#4294967294; (* 16#FFFF_FFFE ->Spezialcode: Daten automatisch an Dateiende anhängen *)
+ END_IF;
+ IF FSD.MODE = BYTE#0 AND FSD.ERROR = BYTE#0 THEN
total_bytes := FSD.FILE_SIZE;
X.NEW_FILE_SIZE := total_bytes + INT_TO_UDINT(idx);
IF log_stop OR aw_aktiv THEN

@@ -333,6 +349,9 @@
ERROR_T := SEL(FSD.ERROR > BYTE#0,BYTE#0,BYTE#1);

trig_m_last := TRIG_M;
+err_retry(IN:=FSD.ERROR > BYTE#0,PT:=t#5s);

(* revision history
ks 01. jan. 2011 rev 1.0


Wenn der Puffer einmal überläuft kommt er nie wieder in die Spur zurück, wenn hier nicht initialisiert wurde.

@@ -201,6 +202,9 @@
ELSE
wd_ton(IN:= FALSE, PT:= wd_time);
wd_ton(IN:= TRUE);
+ n := USINT#0; (*falls UCB mal voll war.*)
WHILE X.UCB.BUF_COUNT > 0 AND step_2 = 0 AND wd_ton.Q = FALSE DO
X.UCB.D_MODE := 10;
UCB(DATA:=X.UCB); (* Element lesen , aber noch nicht entfernen *)

peewit

hallo arsh0r

ich danke dir für den guten konstruktiven input

leider gibt es bei den verschiedenen plattformen immer wieder "extrawürste" zu berücksichtigen

da ich aber genau das eingeplant und den file_server gemacht habe , kann man nun relativ einfach für jede plattform einen angepassten file_server machen und der rest der bausteine ist nicht betroffen.