Step 7 Unitialisierte Strings in einem DB auf der SPS

Ralle

Super-Moderator , User des Jahres 2006-2007
Teammitglied
Beiträge
15.414
Reaktionspunkte
4.043
Zuviel Werbung?
-> Hier kostenlos registrieren
Mir ist heute eine eigenartige Sache untergekommen:

1. CPU 317-2PN/DP, 1 Jahr alt
2. SCL-Baustein (FC), der Strings umkopiert und zwar aus einem Datenbaustein in einen anderen. Dazu gibt es einige IN-Strings und einige OUT-Strings, dort werden außen die Strings angelegt
und bei Aufruf des FC wird umkopiert:

template_db := template;
send_key_01_db := send_key_01;
send_value_01_db := send_value_01;
send_key_02_db := send_key_02;
send_value_02_db := send_value_02;
send_key_03_db := send_key_03;
send_value_03_db := send_value_03;
...

SCL: generiert vom SCL Übersetzer Version: SCLCOMP K05.03.08.00_01.05.00.01 release

3. Das hat in einer alten Anlage 10 Jahre funktioniert Vipa Speed7, in einer neueren Anlage läuft die selbe Software seit 3 Jahren (auch 317). Nun haben wir die VIPA gegen eine 317
getauscht und es läuft seit mehreren Monaten.

Heute ab 10 Uhr ging mitten im Betrieb, während der Produktion plötzlich nichts mehr.
Nach langer Suche habe ich dann festgestellt, dass einige (nicht alle!!!) Strings von obigem SCL-Baustein offensichtlich nicht mehr umkopiert werden.
In den betreffenden Teilen des Ziel-DB stand alles auf hex00, also auch die max. String-Länge, die String-Länge und die Chars. Der Quell-DB enthielt komplett alle korrekten Daten.
Nun sind doch Strings in DB normalerweise initialisiert, also zumindest die max. Stringlänge sollte immer darin stehen oder sehe ich das falsch?

Für mich sieht das so aus, als ob ein Teil des DB plötzlich keinerlei Daten mehr enthielt, also auch die max. Stringlänge nicht.
Das hätte dann evtl. den gleichen Effekt, wie bei nicht initalisierten Temp-Strings, die werden ja auch nicht umkopiert.

Zusatz: SCL erzeugt Code, der nicht den Block_Move nutzt. Leider kann ich den erzeugten Pseudo-AWL-Code nicht posten, er ist so lang, dass der Editor meldet, "zu viele Zeilen". Ich kann durchscrollen,
aber nichts kopieren. :)

Hab ich einen Denkfehler, muß ich auch die DB-Strings immer erst initialisieren, das wäre echt komisch, dann das geht seit Jahren in vielen meiner Programme völlig klaglos ohne Initialisierung von DB-Strings.

PS: Ich hab dann als schnelle Lösung einfach die max. Länge, eine tatsächliche Länge und ein paar Chars auf die entsprechenden DB-Bytes kopiert, seitdem scheibt er dort wieder korrekt Daten hin. :roll:
 
Könnte es nicht sein, dass der Speicher in dem der DB liegt am kaputt gehen ist?
Manchmal geht der Speicher ja nicht sofort komplett Hopps sondern erst ein paar Speicherzellen. Wenn nun die die den Teil des DBs gespeichert haben der weg war, am kaputt gehen sind und ihren Speicher verloren haben?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab ich einen Denkfehler, muß ich auch die DB-Strings immer erst initialisieren, das wäre echt komisch, dann das geht seit Jahren in vielen meiner Programme völlig klaglos ohne Initialisierung von DB-Strings.

Ich initialisiere DB-Strings auch nicht.
Das Problem würde ich eher bei einem Zugriff auf den Ziel-DB sehen.
Was passiert mit den Ziel-Daten? Bügelt da etwas die max. Stringlänge nieder?
 
Ich vermute ebenfalls, daß irgendwas auf den Ziel-DB schreibt. Vielleicht sogar eine andere SPS via Netzwerk per PUT? Oder ein HMI/Visu? Oder irgendein anderer Netzwerkteilnehmer, der das S7-Protokoll beherrscht?


Könnte es nicht sein, dass der Speicher in dem der DB liegt am kaputt gehen ist?
:roll: Siemens SPS-Speicher geht nicht unbemerkt kaputt

Harald
 
Ich hab dann als schnelle Lösung einfach die max. Länge, eine tatsächliche Länge und ein paar Chars auf die entsprechenden DB-Bytes kopiert, seitdem scheibt er dort wieder korrekt Daten hin. :roll:

Hallo Ralle,
wo hast du das denn gemacht ? In dem Umkopier-Baustein bevor du den eigentlichen Kopiervorgang auslößt ?

Das Initialisieren von Strings mache ich auch an vielen Stellen so, dass ich einen schon vorhandenen String dem un-initialisierten Temp-String zuweise. Das ist auch völlig OK, da der Speicherbereich des Zielstrings ja schon vorhanden ist und nicht erst in dem Moment erzeugt wird.

Hast du mal die Einstellungen für die max. Lokaldaten der CPU kontrolliert ? Vielleicht kommt es ja durch ein geändertes Zeitverhalten (PRG schneller oder langsamer) und einen Interrupt-OB zu diesem Problem (und anschließend passt dann möglicherweise etwas nicht mehr).

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Larry

Nein, die schnelle Lösung, habe ich per Variablentabelle direkt im DB gemacht, auch um zu Profen, ob es das wirklich ist.
Die Bytes im DB waren leer, also somit auch nciht als String deklariert, dann schent gar keine Zuweisung zu funktionieren.
Nachdem ich max. Länge und Länge eingetragen hab lief alles wieder.


@PN/DP

Ja, auf den Ziel-DB lese und schreibe ich tatsächlich und zwar mit WinCC 7.2.
Auch hier kann natürlich etwas schief gehen, allerdings muß ich ebenfalls sagen, das ist in 10 Jahren noch nie vorgekommen, schon gar nicht im normalen Produktionsprozess,
also ohne Start/Stop der Runtime, der Servers, der SPS etc.
Das komische ist, das WinCC erst die Daten liest, dann teilweise ergänzt und anschließend schreibt. Aber möglich wäre so etwas schon.
 
auf den Ziel-DB lese und schreibe ich tatsächlich und zwar mit WinCC 7.2.
Auch hier kann natürlich etwas schief gehen, allerdings muß ich ebenfalls sagen, das ist in 10 Jahren noch nie vorgekommen, schon gar nicht im normalen Produktionsprozess,
also ohne Start/Stop der Runtime, der Servers, der SPS etc.
Das komische ist, das WinCC erst die Daten liest, dann teilweise ergänzt und anschließend schreibt. Aber möglich wäre so etwas schon.

Oh ja ... da kannst du die tollsten Effekte erzielen.
Woher weiß die Visu, dass die Daten zu SPS schreiben sollte ? Eventuell dadurch, dass sie schaut, ob die Daten, die sie hat ungleich den Daten auf der SPS sind ...?
Ich beführchte, dass du dir eine Art Zyklus-Kontrollpunkt erstellen mußt bzw. den jetzt nicht mehr hast, durch den Einsatz der neueren CPU.
Der Datenaustausch Visu - SPS-Programm findet nicht mehr am Ende des SPS-Programms statt sondern irgendwann (auch mittendrin).

Mein Vorschlag zum Versuchen wäre :
Du schreibst mit dem SPS-Programm in einen Zwischen-DB und schreibst den anschließend mit Blockmove auf den Ziel-DB.

Gruß
Larry
 
Hab ich einen Denkfehler, muß ich auch die DB-Strings immer erst initialisieren, das wäre echt komisch, dann das geht seit Jahren in vielen meiner Programme völlig klaglos ohne Initialisierung von DB-Strings.

Frage:
Schreibst du da mit einem Siemens Panel drauf?
Ich hatte ziemlich exakt dasselbe Problem auf einer 414H CPU. Und zwar nur wenn der Unterhalt das Testpanel (TP170) direkt an die CPU angehängt hat (Ich hab das aufgebaut um Parameter UND Strings zu ändern). Die Anlage lief immer wunderbar nur manchmal haben die Printerausgaben (Serieller Printer direkt an der 400H) völlig falsche Texte ausgegeben. Als ich da ein Handshake eingebaut habe. Sie also nicht mehr direkt auf meinen Arbeitsdb schreiben konnten sondern ich den zu schreibenden String erst im Programm überprüft habe bevor er kopiert wurde, hatte ich keine Probleme mehr. Interessanterweise hat die überprüfung nie wegen fehlerhafter Strings angeschlagen. Das hat wirklich nur im Arbeitsdb Probleme gemacht.

mfG René
 
Ne 317 sollte aber im Zykluskontrollpunkt mit dem WinCC 7 kommunizieren... (zumindest, wenn in der HW-Konfig der Haken für "priorisiertes Bedienen/Beobachten" nicht gesetzt ist)...

Gruß.
 
Die Vipa ist ja raus, da ist das i.Ü. nie passiert. Allerdings mußte ich da die Größe des lokalen Stack der Ebene erhöhen, das braucht die 317 nicht, die hat ohnehin gleich mehr.
Priorisiertes B&B ist Ein.

@Larry

Ja, genau das wäre wohl eine Möglichkeit, mit aber irgendwie zu aufwendig.
Dann ist es einfacher (weil nur wenige Strings gelesen und geschrieben werden) in jedem SPS-Zyklus einfach die max. Länge neu zu setzen. Ich will mal testen, ob die Max-Länge ausreicht, denn die tatsächliche Länge hängt ja ohnehin vom String selbst ab.
 
@Larry

Ja, genau das wäre wohl eine Möglichkeit, mit aber irgendwie zu aufwendig.
Dann ist es einfacher (weil nur wenige Strings gelesen und geschrieben werden) in jedem SPS-Zyklus einfach die max. Länge neu zu setzen. Ich will mal testen, ob die Max-Länge ausreicht, denn die tatsächliche Länge hängt ja ohnehin vom String selbst ab.

Für das Zuweisen mit SCL reicht - meines Wissens - wirklich die Max-Länge zu initialisieren.
Wenn ich mir bisher irgendwelche Strings zu Fuss aus Chars zusammengebaut hab, hab ichs zumindest immer so gemacht und noch nie Probleme gehabt.

Gruß
Blockmove
 
Zuviel Werbung?
-> Hier kostenlos registrieren
also wenn Du in der 300 das "priorisierte Bedienen und Beobachten" ein hast, dann kommuniziert das WinCC parallel zum OB1. Da hat mein Kollege in der Woche auch irgend ein Problem bei der 300er gehabt. Also ich wuerd das lieber ausschalten, also den Haken wegnehmen!
Gruss
 
also wenn Du in der 300 das "priorisierte Bedienen und Beobachten" ein hast, dann kommuniziert das WinCC parallel zum OB1. Da hat mein Kollege in der Woche auch irgend ein Problem bei der 300er gehabt. Also ich wuerd das lieber ausschalten, also den Haken wegnehmen!
Gruss

Mit dem priorisierten BuB hast du dann dann das gleiche Verhalten wie bei 400er und 1500er?
Siemens macht einem das Leben wirklich nicht leicht.
Letztlich bleibt einem nix anderes mehr übrig, als sich ein Prozessabbild für Kommunikationsdaten zu erstellen.
Meine Kollegen suchen gerade zusammen mit Softing nach einem ähnlichen Problem.

Gruß
Blockmove
 
Mit dem priorisierten BuB hast du dann dann das gleiche Verhalten wie bei 400er und 1500er?

Naja zumindest prinzipiell...

Für die o. g. CPUs aktivieren Sie die Funktion "priorisierte BuB-Kommunikation" in der Hardware-Konfiguration.
In der Hardware-Konfiguration doppelklicken Sie auf die projektierte CPU, um den Eigenschaftsdialog zu öffnen. Im Register "Zyklus / Taktmerker" aktivieren Sie die Funktion "priorisierte BuB-Kommunikation".

priorisierte_bub_kommunikation_01_d.png

Bild 01

Hinweis

  • Die Konsistenz der Daten zum Anwenderprogramm ist nicht mehr gegeben. Die Konsistenz muss per Anwenderprogramm sichergestellt werden.
  • Die Zykluszeit verlängert sich.
Datenkonsistenz bei PUT/GET-Funktionen

  • Wenn Sie die Funktion "priorisierte BuB-Kommunikation" aktivieren, dann ist die angegebene Datenkonsistenz nicht mehr gegeben, da die Kommunikationsvariablen in Blöcken bis maximal 240 Byte nicht im Zykluskontrollpunkt des Betriebssystems konsistent in den bzw. aus dem Anwenderspeicher kopiert werden. Die Kommunikationsvariablen werden während der Laufzeit des Anwenderprogramms in den bzw. aus dem Anwenderspeicher kopiert. Die Konsistenz muss per Anwenderprogramm sichergestellt werden.
    Weiterhin konsistent sind:
    • Byte-, Wort-, Doppelwortzugriffe
    • SFC14 "DPRD_DAT"
    • SFC15 "DPWR_DAT"
    • SFC81 "UBLKMOV"
  • Wenn eine definierte Datenkonsistenz gefordert ist, dann dürfen die Kommunikationsvariablen im Anwenderprogramm der CPUs nicht größer als 240 Byte sein.

https://support.industry.siemens.com/cs/ww/de/view/49749632

also prinzipiell wird dann parallel zum OB1 kommuniziert!

Aber wir haben hier festgestellt, dass sich die 300er dann aber trotzdem (etwas) anders verhält als die 1500er. Kann aber auch an anderen Dingen liegen, wie z.B. andere Zykluszeit etc. Wir konnten's bisher noch nicht genau nachvollziehen, haben auch grad nicht viel Zeit dafür.

Gruß.

PS: mit dem Haken kommuniziert die 300er dann aber genauso schnell wie ne 1500er. Also die Geschwindigkeitssteigerung der 1500er liegt nicht an dem neuen tollen TIA sondern dass einfach die "Defaulteinstellungen" geändert wurden.
Wenn man viel Kommunikationsdaten hat, dann kommuniziert die 300er mit "Haken" ungefähr 10 mal so schnell wie ohne gesetztem "Haken".

PPS:
Letztlich bleibt einem nix anderes mehr übrig, als sich ein Prozessabbild für Kommunikationsdaten zu erstellen.


Jo, nur mir ist unverständlich, warum Siemens da keine Lösung mitliefert. Abgeblich soll ja das Engineering beim TIA deutlich einfacher sein. In de Realität darf sich um sowas jetzt der Anwender extra kümmern. Und die Anwender, welche darüber garnicht erst nachdenken, wundern sich nur über "komisches Verhalten"... Man Man Man ;)
F
 
Zuletzt bearbeitet:
Zurück
Oben