Step 7 Datentyp wird beim Bausteinaufruf in SCL nicht erkannt

Eduard Schleich

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

ich habe ein kleines Problem bei dem ich Hilfe benötige.

In meinem Programm habe ich einen SCL-Baustein mit dem ich zwei identische Achsen steuern möchte.
Dieser wird in FUP aufgerufen und mit den DB´s beschalten. (Achsaufruf.png)


In meinem Programm möchte ich nun auf die Positionsvariable noch den Fräserradius aufrechen.


Das habe ich so gelöst:
MC_MoveAbsolute.Position :=DWORD_TO_REAL(DB_Par.DBD20) - (DB_Par_Grp4.FraeserDurchmesser/2);


So nur der Baustein soll ja für zwei Fräser sein. Darum dachte ich mir ich erzeuge nen neuen Input Namens DB_Grp_Par und über geb diesem dann den eigentlichen DB.
MC_MoveAbsolute.Position :=DWORD_TO_REAL(DB_Par.DBD20) - (DB_Grp_Par.FraeserDurchmesser/2);


Dann wird mir aber der Fehler angezeigt das dies ein ungültiger Datentyp ist. (Fehler.png)
FraeserDurchmesser ist aber eine REAL und wenn ich den DB direkt aufrufe gehts ja auch.
Ich hab auch schon versucht DWORD_TO_REAL davor zu setzen aber das bringt auch keine Änderung.

Könnt ihr mir da bitte ne Hilfestellung geben. Ich checks grad nicht wirklich.

Grüße
Edi
 

Anhänge

  • Achsaufruf.png
    Achsaufruf.png
    12,3 KB · Aufrufe: 23
  • Fehler.png
    Fehler.png
    10 KB · Aufrufe: 22
Falls Du "DB_Grp_Par" als DB-Nummer übergibst, dann kann der Compiler nicht wissen, welche Struktur der Parameter bzw. der DB hat. Du müßtest als UDT oder STRUCT übergeben.

PS: Wie übergibst Du eigentlich "DB_Par"? Und gibt es da einen Member mit dem Name "DBD20"?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
DB_Par übergebe ich genauso wie den DB_GRP_Par als Block_DB. (SCL Aufruf.png)

Der DBD20 ist eine Variable die auf einen UDT zeigt.(DB_Par.png UDT_Position.png)


Mein DB_Grp_Par sieht folgendermaßen aus. DB_Grp_Par.png



Wie kann ich den Als Struct übergeben? Muss ich da alles einfach in eine Struct packen und diese dann an meinen SCL-Baustein übergeben?
Muss ich dann nicht

DB_Grp_Par:BLOCK_DB;

sondern

DB_Grp_Par:STRUCT;

schreiben?


Grüße
Edi
 
Dein Problem ist objektiv ja zunächst mal nur der SCL-Baustein.

Wie wo, und womit du den aufrufst wären dann hächstens Fehler zur Laufzeit, davon bist du aber in Ermangelung einer Fehlerfreien Übersetzung noch 3 Fehler entfernt.
 
DB_Par übergebe ich genauso wie den DB_GRP_Par als Block_DB. (Anhang anzeigen 34363)

Der DBD20 ist eine Variable die auf einen UDT zeigt.(Anhang anzeigen 34364 Anhang anzeigen 34365)
"DB_Par.DBD20" greift da absolut auf die Adresse [DB_Par].DBD20 zu, egal was da für ein Symbol deklariert ist. (komisch daß Dein SCL auch DBDxx akzeptiert, lt. Doku müsste das DD20 heißen)
"DB_Grp_Par.FraeserDurchmesser" soll auf ein Symbol zugreifen, was der Compiler nicht auflösen kann, weil die symbolische Struktur des Block_DB unbekannt ist.


Wie kann ich den Als Struct übergeben?
Code:
VAR_INPUT
  DB_Grp_Par : STRUCT
    V_Fraeser : WORD;
    Werkzeuglaenge : REAL;
    FraeserDurchmesser : REAL;
    ...
  END_STRUCT;
oder statt STRUCT einen UDT nehmen, dann braucht die Struktur des UDT nur einmal deklariert werden.

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich denke mal das der absolute Zugriff auf das DBD20 vom damaligen Programmierer so gemacht wurde weil er das gleiche Problem hatte wie ich. Ich habs meinen Zusatz jetzt auch mal absolut gemacht. Damit funktioniert zumindestens. Auch wenns nicht gut ist.

Harald, in deinem Codebeispiel müsste die zweite Zeile ja eigentlich DB_Grp_Par sein oder? Dann würd ichs verstehen.
Seh ich das richtig?


Weil wenn ich die Struct anlege meckert der SCL_Baustein nicht mehr. Dann muss ich jetzt aber den DB_Par_Grp4 den ich beim aufrufen übergebe in eine Struct packen oder?
 
Zuletzt bearbeitet:
Harald, in deinem Codebeispiel müsste die zweite Zeile ja eigentlich DB_Grp_Par sein oder? Dann würd ichs verstehen.
Seh ich das richtig?
Ja richtig, Tippfehler (Kopierfehler aus Deinem #1) von mir (ich korrigiere den mal nachträglich)
Es muß natürlich der Name sein, wie der INPUT-Parameter heißt.

wenn ich die Struct anlege meckert der SCL_Baustein nicht mehr. Dann muss ich jetzt aber den DB_Par_Grp4 den ich beim aufrufen übergebe in eine Struct packen oder?
Ja, Du müsstest in dem DB_Par_Grp4 einen STRUCT mit der selben Struktur wie bei VAR_INPUT DB_Grp_Par anlegen und diese Struktur an DB_Grp_Par übergeben.

Alternativ: brauchst Du denn die ganze Struktur in Deinem Baustein? Du könntest auch nur den "DB_Par_Grp4".FraeserDurchmesser als einzelnen REAL übergeben.
Code:
VAR_INPUT
  ...
  DB_Par : Block_DB;
  FraeserDurchmesser : REAL;

Harald
 
Zuletzt bearbeitet:
Ich habs jetzt so gemacht und ich glaub auch endlich verstanden.

Code:
    DB_Grp_Par:STRUCT        
        V_Fraeser:WORD;
        Werkzeuglaenge:REAL;
        FraeserDurchmesser:REAL;
        FraeserPlattenstaerke:REAL;
    END_STRUCT;

Hab dann um den DB komplett eine Struct rumgelegt und diese übergebe ich beim Aufruf dem Baustein. Jetzt gibts mal keine Fehler mehr daher denk ich das es funktioniert.

Danke für die geduldige Hilfe.

Edi
 
Zurück
Oben