Step 7 Fehler 294:23 beim Laden des OB1, welcher aus einer SCL-Quelle erzeugt wurde.

sinumerik.user

Level-1
Beiträge
21
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Community,
ich möchte ein kleines SCL Programm mit PLCSim simulieren und testen, da ich noch keine Hardware habe.

Die SCL Quelle lässt sich fehlerfrei übersetzen und erzeugt die Bausteine FC10 und OB1.
Wird nun versuche den Baustein OB1 in PLCSim zu laden, wird folgende Fehlermeldung von Step 7 angezeigt:

294:23 Der Baustein OB1 konnte nicht kopiert werden.
Soll der Kopiervorgang fortgesetzt werden?

Wird in der SCL Quelle die Erzeugung des OB1 auskommentiert und dieser stattdessen manuell als FUP Baustein erstellt, so kommt es beim Laden nicht zu dem angegebenen Fehler. Das Programm funktioniert dann auch wie gewünscht.
Ich habe schon lange im Internet recherchiert um eine Lösung für mein Problem zu finden. Die Lösungsansätze für ähnliche Probleme, welche hier im Forum gepostet wurden, habe ich ebenfalls versucht umzusetzen. Leider blieben meine Bemühungen bisher erfolglos.
Daher bitte ich nun hier um Hilfe zur Lösung dieses Problems.

Das Programm soll die positive Flanke eines Tasters (Eingang E 1.0) erkennen und eine Lampe (Ausgang A 1.0) einschalten. Bei erneuter Betätigung des Tasters soll die Lampe dann wieder ausgeschaltet werden.

Symboltabelle:

SymbolAdresseDatentyp
AusgangA 1.0BOOL
EingangE 1.0BOOL
HandFC 10FC 10
ZyklusOB 1OB 1

SCL Quelle:

Code:
FUNCTION Hand : VOID
 
VAR_INPUT
    in1 : BOOL;
END_VAR
 
VAR_OUTPUT
    out1 : BOOL;
END_VAR
 
VAR_TEMP
    // temporäre Variablen
    flag : BOOL;
    imph : BOOL;
    zaehler : INT;
   
END_VAR
 
imph := in1 AND NOT flag ;
flag := in1 ;
 
IF imph THEN
    zaehler := zaehler + 1;
   
END_IF;
 
 
    CASE zaehler OF
        1 :
            out1 := true;
        2 :
            out1 := false;
            zaehler := 0;
           
    ELSE:
        // Anweisungen_ELSE
        ;
    END_CASE;
 
 
END_FUNCTION
 
 
 
ORGANIZATION_BLOCK Zyklus
 
VAR_TEMP
    // reserviert
    // temporäre Variablen
 
END_VAR
 
    // Anweisungen
   
    Hand(in1:= Eingang,out1 := Ausgang);
 
END_ORGANIZATION_BLOCK

Vielen Dank für die Hilfe im Voraus

Gruß

sinumerik.user
 
Zuletzt bearbeitet:
Hallo, kann es sein das du dem OB1 die temporären Daten verweigerst ? Versuch mal die SCL-Quelle so zu schreiben:

VAR_TEMP

OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
OB1_PRIORITY : BYTE ; //Priority of OB Execution
OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
OB1_RESERVED_1 : BYTE ; //Reserved for system
OB1_RESERVED_2 : BYTE ; //Reserved for system
OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started

END_VAR
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit welcher Step7-Version willst Du welche CPU programmieren?
Hast Du die Hardware Konfig in die PLCSIM-CPU geladen?

Versuche mal bei ORGANIZATION_BLOCK das "Zyklus" in doppelte Hochkomma zu setzen.
Stehen mehr Details zur Fehlermeldung im Diagnosepuffer der PLCSIM-CPU?
Kannst Du nach der SCL-Generierung den OB1 mit dem FUP/KOP/AWL-Editor öffnen ("Datei öffnen") und uns den von SCL erzeugten AWL-Code posten?

Hat mit Deinem Problem nichts zu tun, aber:
in der Function "zaehler" und "flag" als VAR_TEMP geht gar nicht, weil temporäre Variablen können sich nichts merken. Die haben bei jedem Aufruf der Function einen mehr oder weniger zufälligen unkontrollierten Inhalt.
PS: außerdem muß out1 immer etwas zugewiesen werden und nicht nur wenn zaehler 1 oder 2 ist.

Harald
 
Zuletzt bearbeitet:
Wird nun versuche den Baustein OB1 in PLCSim zu laden, wird folgende Fehlermeldung von Step 7 angezeigt:

294:23 Der Baustein OB1 konnte nicht kopiert werden.
Soll der Kopiervorgang fortgesetzt werden?
Ist Dir aufgefallen, daß in der Meldung auch eine Schaltfläche "Details" vorhanden ist? Da klicke mal drauf, sehr wahrscheinlich wird der detaillierte Grund dieser sein:
"(D21A) Die Länge der Lokaldaten oder Schreibschutzkennung ist fehlerhaft."
Das meint: für den OB1 mußt Du mindestens 18 Byte, besser 20 Byte Lokaldaten unter VAR_TEMP deklarieren, am besten so wie TP-Inc in Beitrag #2 empfiehlt.

Harald
 
Hallo,

zuerst möchte ich allen meinen Dank für die schnelle und kompetente Hilfe aussprechen.
Außerdem bitte ich zu entschuldigen, dass ich erst jetzt antworte.
Mein oben beschriebenes Problem konnte gelöst werden.
Aus Gründen der Vollständigkeit möchte ich hier kurz eure Lösung für mein Problem zusammenfassen.
Ich verwende Step 7 in Version 5.5 SP 2 und PLCSim in Version 5.4 SP 5 Upd 2.
Wie an meinem Programm unschwer zu erkenne ist, beginne ich gerade erst SCL zu erlernen.
Eine CPU und einige Aus- und Eingänge habe ich noch nicht.

Hat mit Deinem Problem nichts zu tun, aber:
in der Function "zaehler" und "flag" als VAR_TEMP geht gar nicht, weil temporäre Variablen können sich nichts merken.

Danke für den Hinweis, ich habe die Variablendeklaration nun zwischen VAR und END_VAR vorgenommen. Außerdem habe ich der Variablen „out1“ schon bei der Deklaration den Wert „false“ zugewiesen.

294:23 Der Baustein OB1 konnte nicht kopiert werden. Soll der Kopiervorgang fortgesetzt werden?"

Mir ist aufgefallen, daß in der Meldung auch eine Schaltfläche "Details" vorhanden ist. Klickt man darauf, ist folgende Erläuterung zu lesen:
Laden (33:53786): (D21A) Die Länge der Lokaldaten oder Schreibschutzkennung ist fehlerhaft.
Laden (294:23): Der Baustein XX\S7-Programm(1)\Bausteine\OB1 konnte nicht kopiert werden.
Soll der Kopiervorgang fortgesetzt werden?

Hilfe zur Meldung 33:53786
Beschreibung:
Die Datenlänge im Bausteinkopf ist fehlerhaft oder der Lokaldatenstack ist nicht ausreichend.
Behebung:
Beachten Sie die Einschränkungen der verwendeten CPU.

Das meint: für den OB1 musst Du mindestens 18 Byte, besser 20 Byte Lokaldaten unter VAR_TEMP deklarieren.

Ich habe dem OB1 die temporären Daten freigegeben wie TP-Inc in Beitrag #2 empfohlen hat. Doch woher wisst ihr die konkreten und korrekten Werte wie vielen KB Speicher für die Lokaldaten benötigt werden?

Nachfolgend noch einmal das nun korrigierte und für mich funktionsfähige Programm.
Für weitere Hinweise und oder Dokumentation zu den Zeilen OB1_xxxx zwischen Var_Temp und End_Var im OB1 wäre ich dankbar.
Was bedeuten diese Angaben und wo kann ich das nachlesen?

Symboltabelle:

SymbolAdresseDatentyp
EingangE 1.0BOOL
AusgangA 1.0BOOL
HandFC 10FC 10
ZyklusOB 1OB 1

Code:
FUNCTION Hand : VOID
 
VAR_INPUT
    in1 : BOOL;
END_VAR
 
VAR_OUTPUT
    out1 : BOOL := false;
END_VAR
 
VAR
    // temporäre Variablen
    flag : BOOL;
    imph : BOOL;
    zaehler : INT;
END_VAR
 
imph := in1 AND NOT flag ;
flag := in1 ;
 
IF imph THEN
    zaehler := zaehler + 1;
   
END_IF;
 
 
    CASE zaehler OF
        1 :
            out1 := true;
        2 :
            out1 := false;
            zaehler := 0;
 
    ELSE:
        // Anweisungen_ELSE
        ;
    END_CASE;
 
 
END_FUNCTION
 
 
 
ORGANIZATION_BLOCK Zyklus
 
VAR_TEMP
 
OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
OB1_PRIORITY : BYTE ; //Priority of OB Execution
OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
OB1_RESERVED_1 : BYTE ; //Reserved for system
OB1_RESERVED_2 : BYTE ; //Reserved for system
OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
 
END_VAR     // Anweisungen
   
    Hand(in1:= Eingang,out1 := Ausgang);
 
END_ORGANIZATION_BLOCK

Nochmals vielen Dank für die Hilfe!

Macht weiter so!

Gruß

sinumerik.user
 
Zurück
Oben