Page 1 of 4
SerialLib Klasse für VO 2.8
Posted: Wed Jun 08, 2022 8:59 am
by lagraf
Hallo,l
gibt es irgendwo die SerialLib Klasse von Ginny für VO 2.8?
Ich habe eine VO 2.7 App mit dieser Klasse auf VO 2.8 umstellen müssen, weil eine Änderung gewünscht wurde und ich VO 2.7 nicht mehr installiert habe. Die diversen Fehler und Warnings beim Compilieren der App und der SerialLib mit VO 2.8 habe ich ausgebessert und die App auf den Kundenrechner überspielt. Sie stürzt aber leider beim Zugriff auf die ser. Schnittstellen ab. Ich gehe daher davon aus, dass ich beim Ausbessern der Meldungen in der SerialLib irgendwas falsch gemacht habe.
Das Problem dabei ist, dass die App auf 4 ser. Schnittstellen (2 Waagen und 2 Magnetkartenleser) zugreift und ich diese Hardware bei mir nicht habe und deshalb nichts testen kann. Der Kundenrechner ist per Fernwartung nicht erreichbar und hat ausserdem einen 24/7 Betrieb, sodaß ich darauf keine Tests durchführen kann. Ich hatte gehofft, dass die App mit VO 2.8 genauso funktioniert wie mit VO 2.7. Für jeden Test muss ich die App per Mail an den Kunden schicken, der spielt sie in einer ruhigen Minute ein und gibt mir dann die Rückmeldung.
Vielleicht gibt es irgendwo schon eine mit VO 2.8 kompilierte SerialLib, die funktioniert.
SerialLib Klasse für VO 2.8
Posted: Wed Jun 08, 2022 9:10 am
by wriedmann
Hallo Franz,
siehe hier:
Wolfgang
SerialLib Klasse für VO 2.8
Posted: Wed Jun 08, 2022 9:46 am
by lagraf
Danke Wolfgang!
Ich habe die Lib eingebunden in meine App und das EXE an den Kunden geschickt, bin gespannt.
LG Franz
SerialLib Klasse für VO 2.8
Posted: Wed Jun 08, 2022 9:51 am
by wriedmann
Hallo Franz,
hast Du auch kontrolliert, was in Deiner Lib anders ist als in der, die ich Dir geschickt habe?
Einfach beide Klassen in ein prg-File exportieren und dann mit einem Tool vergleichen.....
Ich vermute, da ist ein cast falsch gemacht.
Wolfgang
SerialLib Klasse für VO 2.8
Posted: Wed Jun 08, 2022 10:44 am
by lagraf
Hallo Wolfgang,
ich habe nichts Auffälliges bemerkt. Was könnte den Fehler
- image001.png (11.46 KiB) Viewed 779 times
bewirken, der Code von Logging is folgender:
Code: Select all
FUNCTION Logging(dwParam AS DWORD) AS INT PASCAL
LOCAL oDta AS dtaSocket
LOCAL t1 AS TParams
LOCAL cLine AS STRING
LOCAL nError := 0 AS DWORD
t1 := dwParam
oDta := OBJECT(_CAST,t1.MainDlg)
WHILE TRUE
oDta:oSocket:listen(1) // --> Zeile 11
cLine := oDta:oSocket:GetLine()
// Wenn Codes 10050 bzw. 10056 wieder zurückgehen auf 0 ist CRDServer gestorben
IF nError > 0 .AND. oDta:oSocket:Error == 0
oDta:DoAnswer(TRUE, "CRDServer Fehler")
oDta:EndWindow()
ExitVOThread(0)
EXIT
ENDIF
nError := oDta:oSocket:Error
IF !Empty(cLine)
oDta:Speichern(cLine)
ENDIF
IF oDta:lStop
oDta:DoAnswer(TRUE, "Thread beendet")
oDta:oSocket:Disconnect()
oDta:oSocket := NULL_OBJECT
ExitVOThread(0)
EXIT
ENDIF
ApplicationExec(EXECWHILEEVENT)
END
RETURN 0
Hast du vielleicht eine Idee?
SerialLib Klasse für VO 2.8
Posted: Wed Jun 08, 2022 11:14 am
by g.bunzel@domonet.de
Hallo Franz,
es wird ein Object oDta (das ist wohl dtaSerial) aus einem Parameter erstellt.
Von diesem dtaSerial wäre der Code von :DoAnswer() und auch was oSocket dort macht interessant zu sehen, um da etwas mehr Info zu bekommen.
Wozu wird da ein Thread verwendet, der in der Funktion mit ExitVOThread(0) beendet wird?
Ich mache sehr viel mit seriellen Schnittstellen - auch mehrere gleichzeitig. Dazu war aber noch nie ein oder mehrere Threads erforderlich.
Gruss
Gerhard
SerialLib Klasse für VO 2.8
Posted: Wed Jun 08, 2022 11:45 am
by lagraf
Hallo Gerhard,
zur Funktion Logging kommt es wie folgt (hier nur die relevanten Teile aus dem Sourcecode):
Code: Select all
CLASS dtaSocket INHERIT dtaSerial // dtaSerial ist ein generiertes Form mit MLEs zur Protokollierung der Vorgänge
PROTECT _oSocket as CSocket
PROTECT _cIP AS STRING
PROTECT _nPort AS WORD
PROTECT _lStop AS LOGIC
PROTECT _t1 AS TParams
PROTECT _cCard AS STRING // CRDServer Kommando Lead-In: *@*#Card?#
METHOD Setup(nIndex) CLASS dtaSocket
LOCAL nID AS DWORD
LOCAL pTask AS PTR
// Socket erstellen
_oSocket := CSocket{SOCK_STREAM}
_oSocket:Timeout:=100
IF !_oSocket:connect(_cIP, _nPort)
SELF:DoAnswer(TRUE, "Keine Verbindung zum CRDServer")
ELSE
SELF:DoAnswer(TRUE, "Verbindung zum CRDServer")
// Thread starten für Listening
_lStop := FALSE
_t1:=MemAlloc(_SIZEOF(TParams))
RegisterKid(_t1,1,FALSE)
_t1.MainDlg:=PTR(_CAST,SELF)
pTask:=CreateVOThread(NULL,0,@Logging(),_t1,0,@nID)
IF pTask <> NULL_PTR
SELF:DoAnswer(TRUE, "Thread Listener gestartet")
ELSE
SELF:DoAnswer(TRUE, "Thread Listener nicht gestartet")
ENDIF
CloseHandle(pTask)
// INFO-Nachricht senden
SELF:GenerateEvent(_cCard+"INFO#")
ENDIF
RETURN SELF
METHOD GenerateEvent(cMsg) CLASS dtaSocket
IF _oSocket:Sendline(cMsg) > 0
SELF:DoAnswer(FALSE, cMsg+"...OK")
ELSE
SELF:DoAnswer(FALSE, cMsg+"...Error")
ENDIF
RETURN SELF
STRUCTURE TParams
MEMBER MainDlg AS PTR
METHOD DoAnswer(lShow, cStr) CLASS dtaSerial
SELF:oDCmleCommLog:TextValue += cStr + CHR(13) + CHR(10)
SELF:MleKuerzen()
RETURN SELF
Das Originalprogramm ist inzwischen 25-30 Jahre alt und stammt wahrscheinlich noch aus der VO 1.x Zeit, hat seitdem bis VO 2.7 funktioniert. Ob dafür ein Thread notwendig ist, weiß ich auch nicht. DoAnswer protokolliert nur Meldungen in den MLEs von dtaSerial.
SerialLib Klasse für VO 2.8
Posted: Wed Jun 08, 2022 12:50 pm
by g.bunzel@domonet.de
Hallo Franz,
...ok. Dieser Code hat ja aber gar nix mit der seriellen Schnittstelle zu tun.
Der Grund für die Fehlermeldung liegt wohl eher an Änderungen in der cSocket-Klasse. von VO2.7 auf VO2.8.
In den 'WhatsNew-Dokumenten' zu den VO28-Versionen habe ich nur das hier zu Sockets gefunden:
· Resolved memory problems in CSocket:getpeername() and CSocket:getsockname()
Gruss
Gerhard
SerialLib Klasse für VO 2.8
Posted: Wed Jun 08, 2022 1:38 pm
by lagraf
Hallo Gerhard,
der Kunde hat noch immer den uralten XP Rechner im Einsatz. Kann es ev. daran liegen, dass die mit VO 2.8 compilierte Version deshalb beim Zugriff auf die ser. Schnittstelle abstürzt?
Ich versuche mal auf einer alten Platte die VO 2.7 zu installieren, was war die letzte Version davon? Allerdings habe ich seit 2.0 lauter Upgrades, wie kann ich da am Besten vorgehen, damit ich nicht mit 1.0 starten muß?
SerialLib Klasse für VO 2.8
Posted: Wed Jun 08, 2022 2:20 pm
by g.bunzel@domonet.de
Hallo Franz,
>deshalb beim Zugriff auf die ser. Schnittstelle abstürzt?
Dein Programmcode nutzt KEINE SERIELLE SCHNITTSTELLE!!!
Zumindest nicht der Code, den du hier gezeigt hast.
Gruss
Gerhard