TIA SFC14/SFC17 Problem mit RECORD

TimeOUT

Level-1
Beiträge
125
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich bin gerade dabei ein bereits bestehenden und funktionierenden Baustein, der ursprünglich für 1200/1500er CPU's mit optimierten Busteinzugriff erstellt wurde, auch für 300/400er CPU's lauffähig zu machen.

An sich ist es, außer dem Entfernen des optimierten Zugriffes für den FB und dessen verwendeten DI bzw. einen globalen DB, kein größerer Aufwand...dachte ich :sad:

Intern verwendet der FB den SFC14/15 und SFC20. Zur Ausgabe der gelesenen bzw. geschriebenen Daten besitzt der FB eine Struktur "Data" als In/Output Variable. InData, OutData und Memory sind jeweils Byte Arrays von 64. "Hardware_IO" der hexadezimale Wert der E/A Adresse des 64 Byte Moduls aus der Hardware-Config.

Das seltsame ist jetzt, dass er mir beim SFC14 und SFC20 immer an der RECORD Variable meckert "Ungültige Parameterzuweisung". Allerdings verstehe ich nicht wieso!?

So verwende ich die SFC's:

Code:
#Ret_Val_SFC15 := DPWR_DAT(LADDR:=#Hardware_IO, RECORD := #Data.OutData);
#Ret_Val_SFC14 := DPRD_DAT(LADDR:= #Hardware_IO, RECORD =>#Data.Memory);
#Ret_Val_SFC20 :=BLKMOV(SRCBLK:=#Data.#Memory, DSTBLK=>#Data.InData);

SFC15 funktioniert dabei ohne irgendeine Fehlermeldung, wohingegen er mir bei SFC14 und SFC20 RECORD bzw. DSTBLK nicht zuweisen lässt.

Er akzeptiert es nur (und es funktioniert auch), wenn ich den globalen DB direkt verwende, der am In/Output "Data" steht.
Also:

Code:
#Ret_Val_SFC14 := DPRD_DAT(LADDR:= #Hardware_IO, RECORD =>"CommunicationDB".Data.Memory);
#Ret_Val_SFC20 :=BLKMOV(SRCBLK:=#Data.#Memory, DSTBLK=>"CommunicationDB".Data.InData);

Dies ist allerdings keine Lösung für mich, da ich den Baustein gerne in eine Bibliothek packen möchte und das mit globalen Datenzugriff nicht funktioniert.

Was mache ich falsch?

Viele Grüße
 
Wie sieht denn Deine Deklaration der INPUTS und der Struktur Data genau aus?
Nennt die Fehlermeldung "Ungültige Parameterzuweisung" vielleicht noch irgendwelche Details?
Vielleicht muß der FB (oder UDT?) zunächst einmal gespeichert und übersetzt werden, bevor der STRUCT (oder UDT?) verwendet werden kann?

Ich habe jetzt kein TIA greifbar, doch in SCL classic gibt es kein Problem:
Code:
FUNCTION_BLOCK FBxxx

VAR_INPUT
    Hardware_IO : WORD ;
END_VAR

VAR_IN_OUT
    Data : STRUCT
        InData  : ARRAY[0..63] OF BYTE ;
        OutData : ARRAY[0..63] OF BYTE ;
        Memory  : ARRAY[0..63] OF BYTE ;
    END_STRUCT ;
END_VAR

VAR_TEMP
    Ret_Val_SFC14 : INT ;
    Ret_Val_SFC15 : INT ;
    Ret_Val_SFC20 : INT ;
END_VAR

    Ret_Val_SFC15 := DPWR_DAT(LADDR := Hardware_IO, RECORD := Data.OutData);
    Ret_Val_SFC14 := DPRD_DAT(LADDR := Hardware_IO, RECORD := Data.Memory);
    Ret_Val_SFC20 := BLKMOV(SRCBLK := Data.Memory, DSTBLK := Data.InData);

END_FUNCTION_BLOCK

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also mein In/Output ist eine UDT. Die UDT besteht aus:

OutData - Array [0..63] of Byte
InData - Array [0..63] of Byte
Memory - Array [0..63] of Byte

Den Baustein, welchen ich an den In/Output schreibe besteht aus der gleichen UDT
Er zeigt mir außer "Ungültige Parameterzuweisung" nichts anderes an.

Das seltsame ist auch, dass die Zuweisung vorher genau so problemlos funktioniert hat.

Auch wenn ich meinen In/Output so abändere (eine reine Struktur raus machen), wie bei dir im Beispiel, bekomme ich immer noch den selben Fehler. :(

Seltsamerweise aber keine Probleme bei der SFC15, mit den Elementen aus der Struktur bzw. der UDT :?:
 
Zuletzt bearbeitet:
Gibt es in TIA sowas wie eine Baustein-Konsistenzprüfung oder Alles-übersetzen?
Du könntest auch mal versuchen, mein obiges SCL-classic-Beispiel oder eine eigene SCL-Quelle in TIA zu importieren.

Muß dieser Output-Zuweisungsoperator unbedingt => sein oder kann man auch := verwenden?

( Dein UDT an IN_OUT ist hoffentlich kein "von einem UDT abgeleiteter DB" (da gibt es schon immer Schwierigkeiten), sondern eine UDT- oder STRUCT-Variable, welche zusammen mit anderen Variablen in einem DB deklariert wurde. )

Harald
 
Das Problem scheint wohl an dem In/Output zu liegen.
Ich habe die Struktur mal im STAT_Bereich deklariert und aus dem In/Output gelöscht.
Dann nimmt er ohne zu meckern die RECORD und DSTBLK Zuweisung an und führt den Bustein auch korrekt aus.

Würde im Notfall auch gehen, allerdings gefällt mir das nicht so sehr und ich kann mir einfach nicht vorstellen, dass es auch nicht anders möglich ist (siehe dein Beispiel)

Die Zuweisung "=>" macht er autom. in TIA. ":=" lässt er nicht zu
 
Zurück
Oben