SCL symbolischer Name übergeben

dentech

Level-1
Beiträge
577
Reaktionspunkte
39
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

ich möchte über eine SCL Quelle den symbolischen Namen eines FB's auch mit generieren. Das Problem ist, ich kann den nur übergeben wenn er schon in der Symboltabelle steht. Ich gehe aber in meinem Fall davon aus das die Tabelle leer ist. Wie kann ich das lösen?


Mfg dentech
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
zu deiner ersten Frage :
den Baustein-Namen in "" setzen und in den Compiler-Optionen "Extras-Einstellungen-Bausteine erzeugen" die Checkbox "Bausteinnummer automatisch erzeugen" anwählen.

zu deiner zweiten Frage :
"Einfügen-Bausteinvorlage-DB" - ggf. speziellere Dinge noch anhand der SCL-Hilfe ...

Hier mal ein UDT, den ich symbolisch so erzeuge - für das Andere habe ich gerade kein Beispiel :
Code:
TYPE "ZSB_Daten"         // Struktur der ermittelten ZSB-Daten
STRUCT     
   St107_Fettmenge    : REAL ;
   St114_Hoehe        : REAL ;
   
   St106_IO           : BOOL ;
   St107_IO           : BOOL ;
   St114_Hoehe_IO     : BOOL ;
   St114_RM_IO        : BOOL ;
   Teil_IO            : BOOL ;
END_STRUCT ;    
END_TYPE
Gruß
Larry
 
ich möchte über eine SCL Quelle den symbolischen Namen eines FB's auch mit generieren. Das Problem ist, ich kann den nur übergeben wenn er schon in der Symboltabelle steht. Ich gehe aber in meinem Fall davon aus das die Tabelle leer ist. Wie kann ich das lösen?

Du kannst in den Einstellungen den Haken bei "Bausteinnummer automatisch erzeugen" setzen, dann wird das Symbol automatisch in die Symboltabelle eingetragen.

Leider lässt sich das zu verwendende Nummernband nicht einstellen, es wird immer bei der niedrigsten freien Nummer begonnen. Das kann unter bestimmten Umständen zu Fehlern führen, beispielsweise wenn man 4 FCs damit erzeugen lässt, und dann in einem nächsten Baustein z.B. CONCAT aufruft. Da FC Nummer 2 schon belegt ist, kann dieser Baustein nicht mehr automatisch eingefügt werden.
 
Super, hat funktioniert. Aber eine Frage habe ich noch, wenn ich in SCL das Format Daten_AND_Time in einem DB speichern will. Wie kann ich das lösen?

Ich habe z.B. die Variable OB80_DATE_TIME im Format DT und möchte sie im DB11 ab Adresse 8 speichern.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
du willst die aus dem OB80 heraus in den DB11 bringen ?
Dann müßtest du den OB80 selbst in SCL schreiben - besser wäre aber das mit Blockmove (SFC20) zu dem DB zu übertragen ...

Gruß
Larry
 
... dann zeig doch mal das zugehörige Script-Teil ... (mit dem Code mit dem du dachtest, das in den DB11 zu bringen) ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
//Erzeugen der Vorlage für den Datenbaustein
TYPE    UDT1
TITLE = 'UDT:Fehler_OBs'
VERSION : 0.1
NAME : Fehl_OBs
FAMILY : 'Fehler'
AUTHOR : ''

       STRUCT
        
        Fehler_OB80: STRUCT                                             //Zeitfehler OB80
                        OB_Zykl_ueber   :   BOOL;                       //Zykluszeitüberschreitung 
                        OB_bearbeitung  :   BOOL;                       //Der angeforderte OB ist noch in Bearbeitung
                        OB_Uhr_Sprg     :   BOOL;                       //abgelaufener Uhrzeitalarm durch Uhrzeitsprung
                        OB_Uhr_Wdr      :   BOOL;                       //abgelaufener Uhrzeitalarm bei Wiedereintritt in RUN nach HALT
                        OB_Puffer       :   BOOL;                       //Überlauf des OB-Anforderungspuffers für die aktuelle Prio Klasse
                        OB_Taktsync     :   BOOL;                       //Taktsynchronalarm-Zeitfehler
                        OB_Alarmlast    :   BOOL;                       //Alarmverlust durch zu hohe Alarmlast
                        OB_Wiedertritt  :   BOOL;                       //Wiedereintritt in RUN nach CiR
                        OB_Tech_Sync    :   BOOL;                       //Technologiesynchronalarm-Zeitfehler
                        OB_Error_Info   :   WORD;                       //Fehlerinformation
                        OB_Err_Ev_Class :   BYTE;                       //Klasse des Ereignisses, das den Fehler ausgelöst hat
                        OB_Err_EV_Num   :   BYTE;                       //Nummer des Ereignisses, das den Fehler ausgelöst hat
                        OB_Prio         :   BYTE;                       //Fehlerinformation
                        OB_Num          :   BYTE;                       //Fehlerinformation
                        OB_SFC20        :   INT;
                        OB_Date         :   DATE_AND_TIME;              //Datum und Uhrzeit des Ereignisses 
                        Reserve         :   ARRAY[16..28] OF BYTE;      //Reserve
                     END_STRUCT;
                                                                
       END_STRUCT
END_TYPE
//Erzeugen des Datenbausteins mit Vorlage aus dem UDT
DATA_BLOCK DB11 UDT1
BEGIN
END_DATA_BLOCK
//Erzeugen des Organisationsbausteins OB80
ORGANIZATION_BLOCK OB80
VAR_TEMP
    OB80_EV_CLASS       :   BYTE;
    OB80_FLT_ID         :   BYTE;
    OB80_PRIORITY       :   BYTE;
    OB80_OB_NUMMER      :   BYTE;
    OB80_RESERVED_1     :   BYTE; 
    OB80_RESERVED_2     :   BYTE;
    OB80_ERROR_INFO     :   WORD;
    OB80_ERR_EV_CLASS   :   BYTE;
    OB80_ERR_EV_NUM     :   BYTE;
    OB80_OB_PRIORITY    :   BYTE;
    OB80_OB_NUM         :   BYTE;
    OB80_DATE_TIME      :   DATE_AND_TIME;
END_VAR
BEGIN
    IF    OB80_FLT_ID=b#16#01 THEN           //Zykluszeitüberschreitung 
        db11.dbx0.0 := true;
        db11.dbw2   := OB80_ERROR_INFO;      //Laufzeit des letzten Zyklus
        db11.dbb4   := OB80_ERR_EV_CLASS;    //Klasse des Ereignisses, das den Alarm ausglöst hat
        db11.dbb5   := OB80_ERR_EV_NUM;      //Nummer des Ereignisses, das den Alarm ausgelöst hat 
        db11.dbb6   := OB80_OB_PRIORITY;     //Prioritätsklasse des OB, der bearbeitet wurde
        db11.dbb7   := OB80_OB_NUM;          //Nummer des OB, der bearbeitet wurde, als der Fehler auftrat                                                               
        
    ELSIF OB80_FLT_ID=b#16#02 THEN           //Der angeforderte OB ist noch in Bearbeitung
        db11.dbx0.1 := true;
        db11.dbw2   := OB80_ERROR_INFO;      //Die zugehörige temporäre Variable des angeforderten OB
        db11.dbb4   := OB80_ERR_EV_CLASS;    //Klasse des Ereignisses, das den Alarm ausglöst hat
        db11.dbb5   := OB80_ERR_EV_NUM;      //Nummer des Ereignisses, das den Alarm ausgelöst hat
        db11.dbb6   := OB80_OB_PRIORITY;     //Prioritätsklasse des Fehler verursachenden OBs
        db11.dbb7   := OB80_OB_NUM;          //Nummer des Fehler verursachenden OB  
        
    ELSIF OB80_FLT_ID=b#16#05 THEN           //abgelaufener Uhrzeitalarm durch Uhrzeitsprung
        db11.dbx0.2 := true;
        db11.dbw2   := OB80_ERROR_INFO;      //Für den Uhrzeitalarm liegt der Startzeitpunkt in der Vergangenheit 
   
    ELSIF OB80_FLT_ID=b#16#06 THEN           //abgelaufener Uhrzeitalarm bei Wiedereintritt in RUN nach HALT
        db11.dbx0.3 := true;
        db11.dbw2   := OB80_ERROR_INFO;      //Für den Uhrzeitalarm liegt der Startzeitpunkt in der Vergangenheit
        
    ELSIF OB80_FLT_ID=b#16#07 THEN           //Überlauf des OB-Anforderungspuffers für die aktuelle Prio Klasse
        db11.dbx0.4 := true;
        db11.dbw2   := OB80_ERROR_INFO;      //Die zugehörige temporäre Variable des angeforderten OB
        db11.dbb4   := OB80_ERR_EV_CLASS;    //Klasse des Ereignisses, das den Alarm ausglöst hat
        db11.dbb5   := OB80_ERR_EV_NUM;      //Nummer des Ereignisses, das den Alarm ausgelöst hat
        db11.dbb6   := OB80_OB_PRIORITY;     //Prioritätsklasse des Fehler verursachenden OBs
        db11.dbb7   := OB80_OB_NUM;          //Nummer des Fehler verursachenden OB
        
    ELSIF OB80_FLT_ID=b#16#08 THEN           //Taktsynchronalarm-Zeitfehler
        db11.dbx0.5 := true;
        db11.dbw2   := OB80_ERROR_INFO;      //Die zugehörige temporäre Variable des angeforderten OB
        db11.dbb4   := OB80_ERR_EV_CLASS;    //Klasse des Ereignisses, das den Alarm ausglöst hat
        db11.dbb5   := OB80_ERR_EV_NUM;      //Nummer des Ereignisses, das den Alarm ausgelöst hat
        db11.dbb6   := OB80_OB_PRIORITY;     //Prioritätsklasse des Fehler verursachenden OBs
        db11.dbb7   := OB80_OB_NUM;          //Nummer des Fehler verursachenden OB
        
    ELSIF OB80_FLT_ID=b#16#09 THEN           //Alarmverlust durch zu hohe Alarmlast
        db11.dbx0.6 := true;
        db11.dbw2   := OB80_ERROR_INFO;      //Die zugehörige temporäre Variable des angeforderten OB
        db11.dbb4   := OB80_ERR_EV_CLASS;    //Klasse des Ereignisses, das den Alarm ausglöst hat
        db11.dbb5   := OB80_ERR_EV_NUM;      //Nummer des Ereignisses, das den Alarm ausgelöst hat
        db11.dbb6   := OB80_OB_PRIORITY;     //Prioritätsklasse des Fehler verursachenden OBs
        db11.dbb7   := OB80_OB_NUM;          //Nummer des Fehler verursachenden OB
        
    ELSIF OB80_FLT_ID=b#16#0A THEN           //Wiedereintritt in RUN nach CiR
        db11.dbx0.7 := true;
        db11.dbw2   := OB80_ERROR_INFO;      //CiR-Synchronisationszeit in ms
        
    ELSIF OB80_FLT_ID=b#16#0B THEN           //Technologiesynchronalarm-Zeitfehler
        db11.dbx1.0 := true;
        db11.dbb5   := OB80_ERR_EV_NUM;      //Nummer des Ereignisses, das den Alarm ausgelöst hat
        db11.dbb6   := OB80_OB_PRIORITY;     //Prioritätsklasse des Fehler verursachenden OBs
        db11.dbb7   := OB80_OB_NUM;          //Nummer des Fehler verursachenden OB
    END_IF;  
      
END_ORGANIZATION_BLOCK


Das ist der Code, im OB80 möchte ich vergleichen und dann das Datum des Bausteinaufrufs im DB speichern.
 
Schön wäre es nun, wenn du den DB11 symbolisch ansprechen könntest - dann würde es ein Einzeiler werden :
Code:
"DB11".myDateTime := Fehler_OB80.OB_Date ;  // ich hoffe ich habe die Var's richtig geschrieben 8)
Gruß
Larry
 
Kann ich das denn nicht absolut machen? Wenn ich das alles symbolisch mache nimmt er irgendeine DB Nummer und das möchte ich eigentlich nicht
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann ich das denn nicht absolut machen? Wenn ich das alles symbolisch mache nimmt er irgendeine DB Nummer und das möchte ich eigentlich nicht

Irgendeine? Er nimmt die Nummer die zum Symbol dazugehört.

Ich würde das ja komplett so machen:
Code:
TYPE "tOB80_Local"
    STRUCT
      OB80_EV_CLASS : BYTE ;    //16#35, Event class 3, Entering event state, Internal fault event
      OB80_FLT_ID : BYTE ;    //16#XX, Fault identifcation code
      OB80_PRIORITY : BYTE ;    //Priority of OB Execution
      OB80_OB_NUMBR : BYTE ;    //80 (Organization block 80, OB80)
      OB80_RESERVED_1 : BYTE ;    //Reserved for system
      OB80_RESERVED_2 : BYTE ;    //Reserved for system
      OB80_ERROR_INFO : WORD ;    //Error information on event
      OB80_ERR_EV_CLASS : BYTE ;    //Class of event causing error
      OB80_ERR_EV_NUM : BYTE ;    //Number of event causing error
      OB80_OB_PRIORITY : BYTE ;    //Priority of OB causing error
      OB80_OB_NUM : BYTE ;    //Number of OB causing error
      OB80_DATE_TIME : DATE_AND_TIME ;    //Date and time OB80 started   
    END_STRUCT
END_TYPE

DATA_BLOCK "OB_DATEN"
STRUCT
    OB80_DATA : tOB80_Local;
END_STRUCT
BEGIN    
END_DATA_BLOCK

ORGANIZATION_BLOCK "CYCL_FLT"

VAR_TEMP
  OB80_Local : tOB80_Local;
END_VAR
BEGIN

"OB_DATEN".OB80_DATA := OB80_Local;

END_ORGANIZATION_BLOCK
 
ich habe das ganze jetzt auf absolut umgestellt:

"Fehler_OBs"."OB_Date" := OB80_DATE_TIME; //Das Symbol wurde nicht gefunden
"Fehler_OBs".OB_Date := OB80_Date_TIME; //Die Komponente ist nicht vorhanden

Das sind die Fehler die ich jeweils bekomme.

Anhang anzeigen Test.zip
 
Zuletzt bearbeitet:
Hallo,
"Fehler_OBs" wäre das Symbol für den DB11 ?
"OB_Date" der Name der Variablen im DB11 ?

Wenn beides ja dann müßte die zugewiesene Variable (zumindest gemäß deinem letzten Code in Beitrag #9) dann "Fehler_OB80.OB_Date" heißen ...

Gruß
Larry
 
Du hast aber schon meinen Beitrag gelesen ?
Gibt es bei dir in der Deklaration (des OB80) die Variable "OB80_DATE_TIME" ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
du mußt (vielleicht auch mal in dem DB) schauen, wie deine Variable WIRKLICH heißt.
In dem Fall funktioniert es wenn du das Folgende schreibst :
Code:
 "Fehler_OBs".Fehler_OB80.OB_Date := OB80_DATE_TIME;
Der Fehler war nicht die Quell-Variable sondern die Ziel-Variable - und der SCL-Compiler springt auch auf die richtige Stelle ...!

Anmerkung:
Eine SCL-Quelle, die so viele unterschiedliche Sachen enthält, finde ich persönlich nicht unbedingt übersichtlich.

Gruß
Larry
 
Zurück
Oben