Funktion "daveSetPLCTimeToSystime" setzt falsches Datum

Buster

Level-2
Beiträge
24
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Frohes neues Jahr an alle im Forum

Habe seit ein paar Jahren eine Software, geschrieben mit Visualbasic 6.0, im Einsatz. Sie basiert auf Libnodave und liest Daten aus 5 CPUs (3x 317 DP/PN und 2x 319 DP/PN. Alles funkfionierte bis zum 1.1.2010 einwandfrei. Um die Uhren in den CPUs zu synconisieren benutze ich die Funktion "daveSetPLCTimeToSystime" (bei Abweichungen >5s). Seit dem 1.1.2010 setzt die Funktion das Jahr der CPUs auf 2000 statt auf 2010. Habe die aktuelle Libnodave drauf (0.8.4.5). Ist das Problem bekannt und gibt es evtl. eine Lösung?

Gruß Buster
 
Bist du dir sicher, das du alle Stellen der Jahreszahl mit deinem Programm verarbeitest und nicht nur die letzte?Was passiert bei 1999 und vorher?
Thomas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Keine Verarbeitung notwendig

Hallo thomass5,

die Funktion "daveSetPLCTimeToSystime" hat keine Parameter und setzt die
SPS-Uhr auf die Systemzeit des Servers. Deshalb brauche ich nichts verarbeiten. Die Systemzeit des Servers ist ok (2010).

Gruß Buster
 
Oh, ich habe mich heute noch mit jemanden über die ganzen Jahr 2010 Bugs unterhalten.
Libnodave ist davon wohl auch betroffen.

Das Problem liegt in der fehlerhaften BCD Kodierung der Jahreszahl.

Einen Fehler darin habe ich letztens schon bemerkt, siehe hier:
http://www.sps-forum.de/showthread.php?t=28848

Das 19. Jahrhundert ist aber nicht das Problem hier, sondern der Modulo Operator.
Um beide Probleme zu beheben kann man die nodave.c folgendermaßen korrigieren:
Ab Zeile 5722 mal als diff
Code:
5722c5722,5728
<     ts[2]=daveToBCD(t1.wYear % 10);
---
>     if (t1.wYear > 2000) {
>               ts[1]=daveToBCD(20);
>               ts[2]=daveToBCD((t1.wYear - 2000));
>       } else {
>               ts[1]=daveToBCD(19);
>               ts[2]=daveToBCD((t1.wYear - 1900));
>       }
Zottel sagt ja, ab 2038 ist mit S7 sowieso schluss ;-)

Der Linux Part ist ebenso davon betroffen.
Übrigens ist so ein BCD-Fehler auch der Grund gewesen warum Anfang 2010 einige EC-Karten nicht mehr funktionierten:
http://www.heise.de/newsticker/meld...r-ist-Grund-fuer-EC-Karten-Aerger-895187.html

Gruß
 
Danke für die Info Thomas V2.1, hatte mir schon so was gedacht.Generell schein die Computerwelt ein Problem bei der Berechnung vom Datum zu haben. 2000...2010 was kommt noch?:cry:
Habe leider keine Erfahrung mit C und der Compilierung, kann das Problem
ohne Hilfe nicht beheben. Trotzdem Danke:)

Gruß Buster
 
Nur DLL

Ja brauche nur die DLL. Wäre wirklich klasse wenn Du sie mir übersetzen könntest und zukommen lassen würdest. Würde mir sehr helfen, da ich in Kürze die Software im Ausland benötige. Da es um die Protokollierung von Vorgängen geht, ist die richtige SPS-Zeit wichtig für mich. Die SPS protokolliert in DB und meine Software liest über Libnodave die Protokolle aus. Ausserdem über wacht sie die SPS-Zeit und stellt sie auch.

Danke im Vorraus für Deine Hilfe:D

Gruß Buster
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
5722c5722,5728
<     ts[2]=daveToBCD(t1.wYear % 10);
---
>     if (t1.wYear > 2000) {
>               ts[1]=daveToBCD(20);
>               ts[2]=daveToBCD((t1.wYear - 2000));
>       } else {
>               ts[1]=daveToBCD(19);
>               ts[2]=daveToBCD((t1.wYear - 1900));
>       }

Ich glaube, über ts[1] (19 oder 20) haben wir schon mal gesprochen. Ergebnis meiner Versuche war, daß die CPU das Jahrhundert ignoriert, wenn ich mich richtig erinnere.
Den Fehler mit %10 bedaure ich.
Meiner Ansicht nach sollte es
Code:
ts[2]=daveToBCD(t1.wYear % 100);
heißen.
 
Ich glaube, über ts[1] (19 oder 20) haben wir schon mal gesprochen. Ergebnis meiner Versuche war, daß die CPU das Jahrhundert ignoriert, wenn ich mich richtig erinnere.

Ich verstehe aber trotzdem nicht warum man nicht auch 2010 schickt. 1910 zu senden ist einfach falsch. Kostet doch kein Geld aus der 0x19 eine 0x20 zu machen.
Wer weiß wie sich zukünftige Siemens CPUs verhalten.
 
@Zottel

Habe die neue Libnodave.dll getestet, das Problem besteht noch immer. Die SPS-Uhr (319 PN/DP + 317 PN/DP) wird immer noch auf 2000 gesetzt.

Gruß Buster
Uihh! Ich lese das erst jetzt!
Bis du sicher, daß du die neue Dll getestet hast? Ich frage das, weil die mitgelieferten Testprogramme die dll garnicht nutzen...
 
Habe real getestet

Hallo Zottel,

habe die neue DLL real mit meiner Software auf dem Server getestet. Da die SPSen in einem Puffer zwischenspeichern, kann ich meine Protokolierungssoftware problemlos mal beenden oder neu starten. Habe die vorhandene DLL aus dem Programmverzeichnis meiner Software (habe sie vorher beendet, da die DLL sonst gesperrt ist) gegen die neue ausgetauscht. Meine Software hat eine abschaltbare Syncronisation der SPS-Uhrzeit mit der Serverzeit. Momentan ist diese abgeschaltet wegen dem Problem mit 2010. Es gibt aber auch einen Button um die Syncronisation per Hand anzustoßen. Damit habe ich getestet. Betätige ich diesen, wird die Funktion "daveSetPLCTimeToSystime" aufgerufen. Auch mit der neuen DLL wird die SPS-Uhrzeit auf das Jahr 2000 gesetzt. An der Software habe ich seit zwei Jahren keine Änderung vorgenommen und die Funktion hat bis 1.1.2010 funktionert. Habe den Server auch noch nach der Libnodave.dll durchsucht um auszuschließen das im System von Windows irgendwo noch eine alte rumliegt und den Server auch neu gestartet.
Die Uhrzeit in der SPS wird immer noch auf 2000 gesetzt.

Gruß Buster
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

anbei ein Auszug aus der Datei nodave.c, mit korrigiertem Uhrzeit stellen. Einen äquivalenten Code wird vermutlich auch die aktualisierte DLL von Zottel enthalten. Das Stellen mit diesem Code funktioniert bei mir einwandfrei. Die aktuell von mir verwendete libnodave DLL basiert auf der Version 0.8.4.3

Zusätzlich habe ich noch ein paar Happen visual Basic Code reingestellt, da ich das Uhrzeit Stellen zunächst auf dieser Seite gefixt habe.

Ich hoffe die Codeschnippsel sind hilfreich.

mfG. klaly
 

Anhänge

  • Libnodave Urzeit Stellen.ZIP
    2,8 KB · Aufrufe: 25
Habe noch mal nachgesehen: Es gibt unterschiedlichen Code für Windows und Linux, weil beide Systeme die Uhrzeit verschieden zurückliefern. Ich hatte nur den Linux-Code korrigiert. Sorry.
Im Anhang noch einmal die DLL.
 

Anhänge

  • libnodave.zip
    67,4 KB · Aufrufe: 30
Zurück
Oben