Step 7 Symbolische Auswahl STRUCT FUP/SCL

neibeck

Level-2
Beiträge
168
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

hab folgendes Problem: Adressiere ich einen Eingang eines Bausteins in FUP symbolisch, akzeptiert der FUP Editor die Structur. Will ich das ganze exakt gleich im SCL Editor einfügen, kommt beim Übersetzen die Fehlermeldung "Ungültiger Datentyp.":

Vergleich.jpg

Hat jemand eine Idee an was das liegen könnte und einen Lösungsvorschlag?

Mit bestem Dank im Voraus,

neibeck
 
Mir ist schon ein paar mal aufgefallen, dass in SCL bei einem Fehler gerade in Bausteinaufrufen der Debugger in einer Zeile davor oder danach den Fehler anzeigt.
Wie ist es denn mit den Variablen "di_Length_Line1" und "di_Hight". Sind die wirklich als DINT angelegt und nicht als DWORD...?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ist das jetzt von Dir ein Gewinnspiel ala "Welche Variable meine ich wohl?" ;)

Um welche Variable/Zeile geht es bei Dir?
Prüfe genauestens den Aufbau der Strukturen in der FC-Parameter-Deklaration und der angeschalteten Struktur. Es könnte hilfreich sein die Struktur als TYPE bzw UDT zu verwenden.

In FUP kann man die Typprüfung abschalten, in SCL nicht.

Harald
 
In FUP wird nur der Aufbau der Struct geprüft, d.h. ob die geforderten Datentypen in der geforderten Reihenfolge vorhanden sind.

In SCL werden hingegen auch die Bezeichner geprüft.
 
In FUP kann man die Typprüfung abschalten, in SCL nicht.
Leider kann man die Typprüfung bei FUP nicht mehr einschalten... :p
Das wurde beim Hotfix 3 zu v5.5SP4 deaktiviert - Siehe HIER

Insofern fällt der Vergleich zwischen der Operandenprüfung von SCL und FUP schwer.
Ich würde auch mal dem Tipp von Thomas nachgehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In FUP wird nur der Aufbau der Struct geprüft, d.h. ob die geforderten Datentypen in der geforderten Reihenfolge vorhanden sind.

In SCL werden hingegen auch die Bezeichner geprüft.

Aber selbst die Bezeichner sind exakt gleich:

Bezeichner.jpg

Bleibt wohl nur der Versuch mit einem UDT...

EDIT: Selbst der Versuch mit einem UDT schlägt fehl! :(
 
Zuletzt bearbeitet:
Welche Zeile/welcher Parameter genau wird in SCL angemeckert?

Nachdem ich jetzt mühsam und abgespeckt Deine Bilder in mein SCL abgetippt habe, wird die Beschaltung mit dem STRUCT "Character_Sizes" fehlerfrei übersetzt.
Kannst Du mal die Deklaration der IN/OUT-Parameter des FC115 als SCL-Quelltext posten? Und den Aufruf des FC115 im FC160 in SCL?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Quelltext FC115:
Code:
VAR_INPUT
    Line            :   STRING; //Line to be calculated
    LineStruct AT Line  : STRUCT
        MaxLen  :   BYTE;
        ActLen  :   BYTE;
        Chars   :   ARRAY[1..254] OF CHAR;
    END_STRUCT;
    
    Font            :   CHAR;   //Used font ID
    Compression     :   INT;    //Line compression [%]
    Spacing         :   INT;    //Line spacing
        
    Head_Setup    :   STRUCT  //Input values for printer configuration    
        LPMD        :   BYTE;   //Lengthwise product moving direction (0= right to left, 1= left to right)    
        CPMD        :   BYTE;   //Crosswise product moving direction (0= top to bottom, 1= bottom to top)    
        HS          :   BYTE;   //Head setup (0=Combijet, 1=Classic, 2=MX)   
        SP3         :   BYTE;   //Spare    
        ENC1M       :   INT;    //Encoder 1 multiplication factor    
        ENC1D       :   INT;    //Encoder 1 divisor factor    
        ENC2M       :   INT;    //Encoder 2 multiplication factor    
        ENC2D       :   INT;    //Encoder 2 divisor factor    
        GATL        :   INT;    //Gun activation time low voltage [*50us]    
        VS          :   INT;    //Virtual speed [mm/s] (0-10000, 0 = deactivated)   
        TAT         :   INT;    //Thinner activation time [ms]    
        WAT         :   INT;    //Water addition time [ms]    
        BTA         :   INT;    //Break time for water addition [ms]    
        ICP         :   BYTE;   //Interval cleaning pulses    
        SPN         :   BYTE;   //Pulsation prior to marking    
        AAD         :   INT;    //Atomizing air distance (0: Permanent, >=1: Distance prior/after marking)    
        DSTT        :   INT;    //Drain section(s) of thinner time [ms]    
        TEN         :   INT;    //Time for emptying nozzles of paint [ms]    
        PNT         :   INT;    //Pulsation nozzle time [ms]    
        CNT         :   INT;    //Constant nozzle time [ms]    
        DSTP        :   INT;    //Time for draining sections of paint [ms]    
        DPST        :   INT;    //Depressurization of paint system [ms]    
        PSA         :   BYTE;   //Preset position action    
        HWI         :   BYTE;   //Hardware inputs (1 = Use hardware inputs)
        MPC         :   BYTE;   //Marking preparation config (0=Air off, 1=AirOn wPuls wMark wPause, 2=AirOn wPuls wMark w/oPause, 3=AirOn wPuls w/oMark, 4=AirOn)     
        NOS         :   BYTE;   //Number of sections
        NOG         :   BYTE;   //Number of guns per section
        SP43        :   BYTE;   //Spare   
        GDST        :   INT;    //Gun distance [1/10mm] (Combijet = 10mm, Classic section = 30mm)   
        ANGLE       :   INT;    //Section angle [1/10°]
        BLN         :   INT;    //MCU Baseline (No of first gun connected to this MCU)
        MXDST       :   INT;    //MX head distance [1/10mm]  
        SP52        :   DWORD;  //Spare
        SP56        :   DWORD;  //Spare          
    END_STRUCT;          
        
    Character_Sizes : UDT1115;
        

END_VAR

Aufruf in FC160:
Code:
//Berechnen der eizelnen Zeilenlänge"TOOL MCU LineLength"
    "TOOL MCU LineLength"(Line := "DH StampBlock MX1 -Temp".Temp.Data[1].DataLine_1 // IN: STRING
                         ,Font := 'A' // IN: CHAR
                         ,Compression := 80 // IN: INT
                         ,Spacing := 4 // IN: INT
                         ,Head_Setup := "Driver Control DB MX1".Head_Setup[1] // IN: STRUCT
                         ,Character_Sizes := "Driver Control DB MX1".Character_Sizes // IN: STRUCT
                         ,Length := di_LengthLine_1 // OUT: DINT
                         ,Height := di_Heigth // OUT: DINT
                         ,HalfDotLength := di_HalfDotLength // OUT: DINT
                         ,DotHeight := di_DotHeigth // OUT: DINT
                         ,Status := wo_Status // OUT: WORD
                         ); // VOID

Struktur UDT:
UDT.jpg
 
Code:
TYPE UDT1115
  STRUCT
    Fonts : ARRAY[1..20] OF STRUCT
      Font_ID : CHAR;
      Height : BYTE;
      Length : ARRAY[32..255] OF BYTE;
    END_STRUCT;
  END_STRUCT
END_TYPE
Code:
[COLOR="#008080"]//Berechnen der eizelnen Zeilenlänge"TOOL MCU LineLength"[/COLOR]
    "TOOL MCU LineLength"(Line := DataLine_1 //"DH StampBlock MX1 -Temp".Temp.Data[1].DataLine_1 [COLOR="#008080"]// IN: STRING[/COLOR]
                         ,Font := 'A' [COLOR="#008080"]// IN: CHAR[/COLOR]
                         ,Compression := 80 [COLOR="#008080"]// IN: INT[/COLOR]
                         ,Spacing := 4 [COLOR="#008080"]// IN: INT[/COLOR]
                         ,Head_Setup := "Driver Control DB MX1".Head_Setup[1] [COLOR="#008080"]// IN: STRUCT[/COLOR]
                         ,Character_Sizes := "Driver Control DB MX1".Character_Sizes [COLOR="#008080"]// IN: STRUCT[/COLOR]
[COLOR="#008080"](*                         ,Length := di_LengthLine_1 [COLOR="#008080"]// OUT: DINT[/COLOR]
                         ,Height := di_Heigth [COLOR="#008080"]// OUT: DINT[/COLOR]
                         ,HalfDotLength := di_HalfDotLength [COLOR="#008080"]// OUT: DINT[/COLOR]
                         ,DotHeight := di_DotHeigth [COLOR="#008080"]// OUT: DINT[/COLOR]
                         ,Status := wo_Status [COLOR="#008080"]// OUT: WORD[/COLOR]
*)[/COLOR]
                         ); [COLOR="#008080"]// VOID[/COLOR]
So läßt sich in meinem SCL (K5.3.6.0) der Aufruf des FC115 fehlerlos übersetzen. Also quasi ohne Änderung (nur die nicht deklarierten Outputs ausgeklammert).
Vielleicht bezieht sich der Compilerfehler auf eine andere Zeile?
Schließe mal alle Editoren und das Step7 und versuche es nochmal.
Prüfe mal die Bausteinkonsistenz.

Harald
 
Guten Morgen,

jetzt hab ich folgendes versucht:

Code:
TYPE UDT1115
  STRUCT
    Fonts : ARRAY[1..20] OF STRUCT
      Font_ID : CHAR;
      Height : BYTE;
      Length : ARRAY[32..255] OF BYTE;
    END_STRUCT;
  END_STRUCT
END_TYPE

FUNCTION FC118 : VOID
TITLE   =   'AMTasd,mfnamdsfline length calcneu' 


VAR_OUTPUT
// Baustein-Kommentar ...
//

    testval :   UDT1115;

BEGIN

END_FUNCTION

FUNCTION FC117 : VOID
TITLE   =   'AMT MCU Paint line length calcneu' 

VAR_INPUT
        Character_Sizes : UDT1115;
        

END_VAR

VAR_OUTPUT
END_VAR

VAR_TEMP

END_VAR

BEGIN
testfunc2(testval :=  Character_Sizes
          ); // VOID

END_FUNCTION

Bei mir tritt wieder der selbe Fehler auf. PN/DP, könntest du das ganze mal genau so bei dir einfügen und testen? Ich häng dir gleicht die SCL-Quelle an, einfach die Endung .txt entfernen und importieren.
Mein Ausgabestand ist K5.5.4.11

SG und besten Dank,

neibeck
 

Anhänge

  • Quelle.SCL.txt
    643 Bytes · Aufrufe: 3
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Irgend etwas war da mit dem "Durchreichen" von nicht trivialen Variablen.

1. Variante, Umkopieren der Daten (könnte Zeit kosten)
Code:
TYPE UDT1115
  STRUCT
    Fonts : ARRAY[1..20] OF STRUCT
      Font_ID : CHAR;
      Height : BYTE;
      Length : ARRAY[32..255] OF BYTE;
    END_STRUCT;
  END_STRUCT
END_TYPE


FUNCTION FC118 : VOID
TITLE   =   'AMTasd,mfnamdsfline length calcneu' 




VAR_OUTPUT
// Baustein-Kommentar ...
//


    testval :   UDT1115;


BEGIN


END_FUNCTION


FUNCTION FC117 : VOID
TITLE   =   'AMT MCU Paint line length calcneu' 


VAR_INPUT
        Character_Sizes : UDT1115;
        


END_VAR


VAR_OUTPUT
END_VAR


VAR_TEMP
    [COLOR=#ff0000]Character_Sizes_Temp : UDT1115;[/COLOR]


END_VAR


BEGIN
[COLOR=#ff0000]Character_Sizes_Temp := Character_Sizes;[/COLOR]


FC118(testval :=  [COLOR=#ff0000]Character_Sizes_Temp[/COLOR]
          ); // VOID


END_FUNCTION

2. Variante: nicht FC-FC sondern FB-FC-Aufruf

Code:
TYPE UDT1115
  STRUCT
    Fonts : ARRAY[1..20] OF STRUCT
      Font_ID : CHAR;
      Height : BYTE;
      Length : ARRAY[32..255] OF BYTE;
    END_STRUCT;
  END_STRUCT
END_TYPE


FUNCTION FC118 : VOID
TITLE   =   'AMTasd,mfnamdsfline length calcneu' 




VAR_OUTPUT
// Baustein-Kommentar ...
//


    testval :   UDT1115;


BEGIN


END_FUNCTION


[COLOR=#ff0000]FUNCTION_BLOCK FB117[/COLOR]
TITLE   =   'AMT MCU Paint line length calcneu' 


VAR_INPUT
        Character_Sizes : UDT1115;
        


END_VAR


VAR_OUTPUT
END_VAR


VAR_TEMP


END_VAR


BEGIN
FC118(testval :=  Character_Sizes
          ); // VOID


[COLOR=#ff0000]END_FUNCTION_BLOCK[/COLOR]

Wenn du die Step7-hilfe öffnest und unter "Suchen" --> "Parameterübergabe" eingibst, findest du mehr dazu.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@neibeck
Ich habe Deine Quelle aus #11 getestet. Die Quelle enthält diverse Fehler, die aber mit Deinem Problem nichts zu tun haben. Hier die korrigierte Quelle, welche nur noch den Fehler mit dem nicht möglichen Durchreichen der Struktur hat (und ein eigentlich fehlendes END_VAR). Die fehlerhafte Zeile auskommentieren oder löschen und schon wird der Rest bei mir fehlerfrei übersetzt:
Code:
//getestet mit S7-SCL K5.3.6.0 in STEP 7 Simatic Manager K5.5.4.8

TYPE UDT1115
  STRUCT
    Fonts : ARRAY[1..20] OF STRUCT
      Font_ID : CHAR;
      Height : BYTE;
      Length : ARRAY[32..255] OF BYTE;
    END_STRUCT;
  END_STRUCT
END_TYPE

FUNCTION FC118 : VOID
TITLE   =   'AMTasd,mfnamdsfline length calcneu' 

VAR_OUTPUT  //ist in original FC115 ein VAR_INPUT
  testval :   UDT1115;

BEGIN
[COLOR="#FF8C00"]//Interessant: das fehlende END_VAR nach VAR_OUTPUT wird nicht als Fehler angemeckert![/COLOR]
END_FUNCTION

FUNCTION FC117 : VOID
TITLE   =   'AMT MCU Paint line length calcneu' 

VAR_INPUT
  in_Character_Sizes : UDT1115;
END_VAR
VAR_TEMP
  tmp_Character_Sizes : UDT1115;
END_VAR

BEGIN

[COLOR="#FF0000"]//Fehler: "Ungültige Zuweisung" - weil von INPUT durchgereicht!
FC118(testval := in_Character_Sizes);[/COLOR]

//so wird fehlerfrei übersetzt:
FC118(testval := tmp_Character_Sizes);
FC118(testval := "Driver Control DB MX1".Character_Sizes);

END_FUNCTION



Ja, da war was. Allerdings verstehe ich trotzdem nicht, warum es bei PN/DP funktioniert...:confused:
Er hat die Variable an Line ersetzt, wahrscheinlich durch eine Temp vom Typ UDT115.
Ich habe extra nicht die Struktur durch eine Struktur aus TEMP ersetzt sondern den DB461 "Driver Control DB MX1" mit der Struktur "Character_Sizes" nachgebastelt und genauso wie original an den FC115 übergeben. Dabei habe ich die Struktur "Character_Sizes" im DB als Struktur deklariert und nicht als UDT - als UDT deklariert wird allerdings ebenfalls fehlerfrei übersetzt.

Harald
 
@PN/DP

Ich bezog mich auf deinen Beitrag #10

"TOOL MCU LineLength"(Line := DataLine_1 //"DH StampBlock MX1 -Temp".Temp.Data[1].DataLine_1 // IN: STRING

Da nahm ich an DataLine_1 ist eine Temp und damit geht es dann ja auch. Ist zwar ein String und nicht UDT115, aber dafür gilt Selbiges.

Das fehlende End_VAR vor dem BEGIN scheint der SCL-Compiler zu ergänzen, denn er übersetzt fehlerfrei.
Immerhin, soviel Comfort hätte ich von diesem minimalistischen Compiler gar nicht erwartet. :ROFLMAO:
 
Zuletzt bearbeitet:
Zurück
Oben