Kopierfehler SFC20 (BLKMOV) ??

Wastel

Level-1
Beiträge
77
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
In meinem Programm werden Strings innerhalb eines FB´s (Instanz-DB)mittels SFC20 umkopiert. Dabei ist mir aufgefallen, dass sporadisch (sehr selten) komische Zeichen im Ziel-String landen. z.B.:

Quell-String: 2008123456
Ziel-String: 200812□456


Als Bereichsangabe verwende ich Pointer z.B. DB20.DBX80.0 Byte 34


Hat jemand von Euch schonmal etwas ähnliches beobachten können?


Das Programm läuft übrigens in einem Weck-OB (OB31).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das dumme daran ist, dass ich diesen Wert nur ganz kurz in der Visualisierung (WinCC) lesen konnte. Leider wurde der Wert dann schon überschrieben bevor ich mir die Variable im Simatic-Manger anschauen konnte.

Mein eigentliches Problem an dieser Stelle ist, dass diese String-Variablen an einen Simatic-Batch relavanten SFC-Typ als Rückmeldung dienen (Sting.AI). Da das Simatic-Batch keine "Sonderzeichen" auswerten kann, ist dann diese Charge fehlerhaft! Diese kann weder archiviert werden, noch kann man sich den Batch-Report erstellen. Mein Problem ist nun, dass in der Simatic-Batch Datenbank zwei Chargen vorhanden sind, die man nicht löschen kann. Dieses ist jetzt zwei mal inerhalb eines Monats aufgetreten.

Meine "Notlösung" wäre alle String Variablen (insgesammt 34) vor dem SFC auf "Sonderzeichen" zu überprüfen.
 
Bist du dir sicher, dass du den String (wenn das sporadisch auftritt) nicht mitten in der Aktualisierung einliest ? Vielleicht wäre es ein Ansatz, dass die das Einlesen des String erst dann durchführst, wenn dein Zeit-OB durchgelaufen ist ... Du könntest hier ein Triggerbit toggelen und dieses in der Visu abfragen und daraufhin die Strings lesen ...

Gruß
LL
 
Bist du dir sicher, dass du den String (wenn das sporadisch auftritt) nicht mitten in der Aktualisierung einliest ?
LL

Meinst Du das einlesen für die Batch-Funktion?
Da bin ich mir 100%ig sicher, dass der String währenddessen unberührt ist.

Oder habe ich deinen Denkansatz jetzt falsch verstanden?

Gruß Wastel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Hintergrund war :
Bestimmt die Visu den Zeitpunkt des Einlesens des Strings oder tut das die SPS ?
Falls es die Visu (von sich aus) bestimmt, so könnte ich es mir vorstellen wie schon von mir beschrieben ...

Gruß
LL
 
Also ich versuche mal die Funktions meines FB´s zu erklären:

34 String-Variablen sind als Eingänge deklariert:

String_01
String_02
...usw. bis 34

35 String-Variablen sind als Ausgange deklariert:

String_Temp
String_Out_01
String_Out_02
...usw. bis 34

Alle 34 + 35 String-Variablen werden Visualisiert.

Die Eingangs-Strings werden vom Batch-System als Sollwerte vorgegeben.
In einer Bedienmaske wählt der Anlangenbediener eine String-Variable aus (Datensatz: Integer 1-34). Jetzt wird dieser Strings mittels SFC20 in die Ausgangsvariable "String-Temp" kopiert.

Wenn dann anschließend auf der Anlage der jeweilige Prozess abgeschlossen ist, wird über einen weiteren Befehl die "String-Temp"-Variable in den nächste freien String_Out_(01-34) kopiert.

Die jeweiligen SFC20 Aufrufe, dauern immer nur einen Zyklus.

Die Batch-Funktion ließt erst nach Abschluss des gesammten Prozesses, während keine Änderung der String-Werte mehr erfolgt, die Werte ein.

Ich konnte während meiner Beobachtung feststellen, dass sich das "Sonderzeichen" auf einer der String_OUT_(01-34) eingeschlichen hat.
In dem Eingangsbereich String_(01-34) war aber noch kein Sonderzeichen zu erkennen. Müßte also bedeuten, dass bei irgendeinen SFC-20 Aufruf etwas schief gegangen ist, oder?
 
Zuletzt bearbeitet:
Ich konnte während meiner Beobachtung feststellen, dass sich das "Sonderzeichen" auf einer der String_OUT_(01-34) eingeschlichen hat.
In dem Eingangsbereich String_(01-34) war aber noch kein Sonderzeichen zu erkennen. Müßte also bedeuten, dass bei irgendeinen SFC-20 Aufruf etwas schief gegangen ist, oder?

Das ist mir bisher noch nicht vorgekommen. Wenn der SFC20 verantwortlich wäre (AR-Register verbogen oder so) dann ist es sehr unwahrscheinlich, dass ab dem "falschen" Zeichen wieder die "normalen richtigen" Zeichen kommen. Das wäre dann Zufall.

Mich hatte das stutzig gemacht :
Das Programm läuft übrigens in einem Weck-OB (OB31).
Welches Intervall hast du hier ? 2 Sekunden oder etwas anderes ?

Wie auch immer ... ich würde den "Fehler" in dem Drum-herum um den SFC suchen ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist mir bisher noch nicht vorgekommen. Wenn der SFC20 verantwortlich wäre (AR-Register verbogen oder so) dann ist es sehr unwahrscheinlich, dass ab dem "falschen" Zeichen wieder die "normalen richtigen" Zeichen kommen. Das wäre dann Zufall.

Das hat mich ja auch verwundert.

Mich hatte das stutzig gemacht :Welches Intervall hast du hier ? 2 Sekunden oder etwas anderes ?

Der Zyklus ist auf 1000ms eingestellt.
Warum macht es dich stutzig, dass ich meinen FB in einen Weckalarm eingebaut habe?

Was ich dabei nur nicht ganz verstehe, dass mein Programm "reibungslos" läuft und irgendwann sporadisch dieses "Sonderzeichen" drinn ist.
Alle Versuche den "Fehler" zu provozieren scheiterten bereits.

Gruß Wastel
 
Ich denke mal, du hast deinen Fehler selber schon wunderschön beschrieben:
Dein String_Temp befindet sich in einer "OUT"-Variablen. Das klappt so nicht - es muss eine INOUT sein, da du den Wert ja erst in einem der folgenden Aufrufe verwendest, der Wert muss also wieder in den FB geladen werden.
 
Erstmal vielen Dank für dein Tip Hovonlo,

aber wieso funktioniert es dann zu 95% meiner SFC20 Aufrufe?

Gruß Wastel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Zyklus ist auf 1000ms eingestellt.
Warum macht es dich stutzig, dass ich meinen FB in einen Weckalarm eingebaut habe?
Das, dür sich genommen, ist nicht schlimm. Das kommt bei mir auch vor ...

Was ich dabei nur nicht ganz verstehe, dass mein Programm "reibungslos" läuft und irgendwann sporadisch dieses "Sonderzeichen" drinn ist.
In diesem Zusammenhang fällt halt nur die Sache mit dem Zeit-OB auf.
Der Ansatz von mir ist im Grunde nicht belegbar ... es ist nur das, was mir sofort (quasi spontan) dazu eingefallen ist ...

Vielleicht noch eine Idee so am Rande ...
Wie hoch schätzt du den Zeit-Bedarf deines FB ein ? (Speicher-Bedarf in der CPU ?)
Wie ist er erstellt ? SCL ? oder AWL und Pointer-Handarbeit ?
 
Dein String_Temp befindet sich in einer "OUT"-Variablen. Das klappt so nicht - es muss eine INOUT sein, da du den Wert ja erst in einem der folgenden Aufrufe verwendest, der Wert muss also wieder in den FB geladen werden.

Das halte ich bei einem FB für nicht so kritisch ... die OUT's sind ja Teile des Instanz-DB's und bleiben somit zugewiesen. Ein IN_OUT hingegen wäre ein Pointer auf eine andere Variable, die nicht zum FB gehört, was für mich wesentlich kritischer wäre ...
 
Vielleicht noch eine Idee so am Rande ...
Wie hoch schätzt du den Zeit-Bedarf deines FB ein ? (Speicher-Bedarf in der CPU ?)

Habe leider gerade das Projekt nicht vor mir, ich kann Dir aber sagen, dass es sich um eine CPU 417-4 handelt.


Wie ist er erstellt ? SCL ? oder AWL und Pointer-Handarbeit ?

In einer SCL-Quelle wird die Programmsteuerung abgearbeitet, bzw. die FOR-Schleifen für die String Abfragen. Aus diesen Abfragen ermittle ich eine Datensatz-Nummer. Diese Datensatz-Nummer wird einem anderen FB übergeben der aus der SCL-Quelle aufgerufen wird.

Dieser FB ist in AWL geschrieben. In diesem FB wird mittel der Datensatz-Nummer der Pointer für den SFC20 erzeugt. Der SFC20 wird auch aus diesem mit AWL erstellten FB aufgerufen.

Ich hoffe ich konnte das so halbwegs rüberbringen :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Daß der SFC20 Mist baut, würde ich mal ausschließen. Könnte der FB und damit der SFC20 durch andere OB unterbrochen werden?

@hovonlo

In einem FB werden ja die Out im Instanz-DB abgelegt, haben also nach der ersten Zuweisung einen definierten Wert und zwar bis zur nächsten Zuweisung. Davor ist die Out natürlich mit dem Startwert aus den IDB belegt. Da sehe ich das Problem auch nicht.
 
In diesem FB wird mittel der Datensatz-Nummer der Pointer für den SFC20 erzeugt. Der SFC20 wird auch aus diesem mit AWL erstellten FB aufgerufen.

Ich mache das eigentlich nicht gerne, aber in diesem Fall :
Warum machst du das mit dem ANY-Pointer in einem anderen Baustein ? Das könnte doch dein SCL-FB genauso schön erledigen und du hättest eine potentielle Fehlerquelle weniger ... Vielleicht resultiert dein Problem auch genau aus dieser Situation ...

...
 
Jetzt wird dieser Strings mittels SFC20 in die Ausgangsvariable "String-Temp" kopiert.

Wenn dann anschließend auf der Anlage der jeweilige Prozess abgeschlossen ist, wird über einen weiteren Befehl die "String-Temp"-Variable in den nächste freien String_Out_(01-34) kopiert.

String_Temp ist aber keine Temp (Lokaldaten) oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Ralle,

wenn ich Dich richtig verstehe, vermutest Du, das der SFC20 Aufruf evtl. durch höherwertige Weckalarme, bzw. Alarm-OB´s unterbrochen wird.

Wäre dann evtl. ein SFC81 (UBLKMOV) besser?

Gruß Wastel
 
... ich würde vielleicht doch erstmal an der Verschachtelung ein bißchen herum-feilen ... alleine schon wegen meinem anfänglichem Bauch-Gefühl ...
 
Zurück
Oben