Step 7 UDT als Input --> Fehlverhalten

TimeOUT

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

ich habe einen Baustein FB1 programmiert. Dieser hat einen UDT-Eingang (vom Typ UDT1), an welchem ich die E-A/Adressen der Kommunikationsmodule (aus der HW-Konfig) des anzusteuernden Gerätes entgegennehme.

Als Variable für diesen UDT-Input habe ich eine Variable IO1, in einem globalen DB5, mit dem Datentyp des UDT1 deklariert und schreibe diese an den Eingang. Die Werte der E/A-Adressen übergebe ich vor dem Bausteinaufruf mittels Lade/Transfer im OB1.

Für ein Gerät funktioniert das ganze Prima, allerdings gibt es bei einem weiteren Gerät Probleme.

Dazu kopiere ich meinen FB1 zu FB2 und lass einen neune InstanzDB (DB2) erzeugen. Erstelle eine weitere Variable IO2 im globalen DB5 (ebenfalls vom Typ UDT1). Rufe im OB1 nach meinem FB1 den FB2 auf und übergebe die IO2 Variable an den UDT-Eingang von FB2. Die E/A-Adressen des zweiten Geräts übergebe ich ebenfalls mittels Lade/Transfer, vor dem Bausteinaufruf von FB2, in OB1.

Ich sehe auch in den jeweiligen instanz DB's, dass die aus OB1 zugewisenen E/A-Adressen für die beiden Geräte, korrekt übernommen worden sind.

Allerdings ist es jetzt egal, welchen Baustein (FB1 oder FB2) ich ansteuer. Trotz unterschiedliocher E/A-Adressen wird IMMER das gleiche Gerät angesteuert.... :confused::confused::confused::confused:

Dieses Verhalten erschließt sich mir in keinster Weise...

Mir ist nicht klar wo genau mein Fehler liegt?!
Ich vermute, es hat etwas mit dem UDT zu tun, aber was..hmmm

Gruß
Timeout
 
Ein Stück Programmcode sagt mehr als tausend Worte ... :cool:
Zeige uns doch mal den relevanten Programmcode Deiner FBs.

Hast Du alle DBs in die Steuerung geladen? (DB1, DB2, DB5)
Rufst Du FB1 mit DB1 und FB2 mit DB2 als Instanz auf?
Was meinst Du mit "ansteuern"?

Sieht Dein Code etwa so aus? Der funktioniert bei mir wie erwartet.
Code:
      L     111
      T     "DB5".IO1.Adr

      CALL  "FB1" , "DB1"
       Input :="DB5".IO1
       Output:=MW2              // --> 111


      L     222
      T     "DB5".IO2.Adr

      CALL  "FB2" , "DB2"
       Input :="DB5".IO2
       Output:=MW4              // --> 222

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

Habe alle FB, DB, UDT, etc in die Steuerung geladen.
Ebenso Rufe ich FB1 und FB2 mit den zugehörigen Instanzdatenbausteinen (DB1 und DB2) auf.
Diese lasse ich mir beim Aufruf des FB's im OB1 autom. erzeugen.

Genau so sieht es bei mir in etwa aus.

"MyUDT" ist evtl. bissl verwirrend. Dabei handelt es sich um den globalen DB, welcher meine Variablen (IO1, IO2) vom Typ UDT1 enthält.

Mein OB1: (die Lade-Werte für den IO2 sind hier erfunden, da ich im Moment meinen Code wieder abgeänder habe. Aber im Grunde genommen sieht es so bei mir aus.

Code:
// Move address to DB Device 1
      L     552
      T     "MyUDT".IO1.Result12Byte
      L     548
      T     "MyUDT".IO1.Module2
      L     554
      T     "MyUDT".IO1.Module3
      L     546
      T     "MyUDT".IO1.Module4
      L     512
      T     "MyUDT".IO1.Module5
      L     512
      T     "MyUDT".IO1.Module6

// Move address to DB Device 2
      L     525
      T     "MyUDT".IO2.Result12Byte
      L     555
      T     "MyUDT".IO2.Module2
      L     562
      T     "MyUDT".IO2.Module3
      L     564
      T     "MyUDT".IO2.Module4
      L     570
      T     "MyUDT".IO2.Module5
      L     574
      T     "MyUDT".IO2.Module6

      CALL  "FB1" , "iDB_FB1"
       Start            :="Start"
       IO_Module_Address:="MyUDT".IO1
       Busy             :="Busy"
       Done             :="Done"     
       Error            :="Error"
       ErrorStatus      :="ErrorStatus"

CALL  "FB2" , "iDB_FB2"
       Start            :="Start2"
       IO_Module_Address:="MyUDT".IO2
       Busy             :="Busy2"
       Done             :="Done2"     
       Error            :="Error2"
       ErrorStatus      :="ErrorStatus2"

FB2 ist einfach ne Kopie von FB1.

Im FB1 speicher ich die übergebenen Anfangsadressen aus der UDT in temp-Variablen vom Typ Dint, damit ich diese später als "Wert" für die Transfer/Ladefunktion (siehe weiter unten: T PAW bzw. L PEW) übergeben kann.

Auszug FB1:

Code:
      L     #IO_Module_Address.Module2
      SLD   3
      T     #dAddress_SoftwareTrigger  (<-- tmp-Variable vom Typ Dint)

      L     #IO_Module_Address.Result12Byte
      T     #Save_ResultString


//später im FB- nur "Codeschnipsel"

// Send 

      L     #TrigVal // ist ne alternierende Int-Variable um den SoftwareTrigger des Geräts auszulösen
      T     PAW [#dAddress_SoftwareTrigger]    // Set up Softwaretrigger

// receive
      CALL  "DPRD_DAT"
       LADDR  :=#Save_ResultString
       RET_VAL:=#Ret_Val_SFC14
       RECORD :=#Recv_Code.InData

Also wie gesagt, die Ansteuerung eines einzigen Geräts funktioniert einwandfrei und das Verhalten des FB's ist auch so, wie ich es mir vorstelle.
Nur sobald ich Gerät 2 mit dem FB2 ansteuern möchte wird wieder nur Gerät 1 angesteuert. Total seltsam das Verhalten...

Gruß

Timeout

/edit: Irgendwie werde ich das Gefühl nicht los, dass meine temp_Variablen, welche meine Moduladressen speichern, irgendetwas damit zu tun haben..
 
Zuletzt bearbeitet:
Zwei Tipps:
1. Schau mal in der Symboltabelle nach, dass die beiden Instanz-DBs den richtigen Typ haben.
2. In der Konsistenzprüfung mal alles neu übersetzen und in die Steuerung laden.

Mal ne Frage: wenn FB2 eine exakte Kopie von FB1 ist, wieso benutzt Du dann nicht gleich FB1?

Gruß
Erich
 
Hey,

Das Problem scheint behoben zu sein...

@LargoD: Zunächst war es mir seltsamer nicht möglich den FB1 nochmals mit einem neuen Instand-DB im OB1 aufzurufen...
Simatic Manager hat mir das dann immer rot angekreidet.
Ich habe den OB1 dann einfach mal geschlossen und siehe da...es funktioniert auf einmal doch... :rolleyes:

Solch ein seltsames Verhalten hatte ich auch beim Erzeugen einer neuen globalen Variable -"MyUDT".IO2- für mein zweites Gerät
Wollte ich diese an den UDT-Input beim Bausteinaufruf schreiben hat der Simatic Manager das verweigert. Schließe ich den Ob1 allerdings und öffne ihn erneut, war es plötzlich kein Problem mehr...?!?!


Jetzt funktioniert das Ansteuern beider Geräte aber korrekt.

Ich danke euch für die Hilfe!

Gruß
TimeOut
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...Zunächst war es mir seltsamer nicht möglich den FB1 nochmals mit einem neuen Instand-DB im OB1 aufzurufen...
Simatic Manager hat mir das dann immer rot angekreidet.
Ich habe den OB1 dann einfach mal geschlossen und siehe da...es funktioniert auf einmal doch... :rolleyes:

Solch ein seltsames Verhalten hatte ich auch beim Erzeugen einer neuen globalen Variable -"MyUDT".IO2- für mein zweites Gerät
Wollte ich diese an den UDT-Input beim Bausteinaufruf schreiben hat der Simatic Manager das verweigert. Schließe ich den Ob1 allerdings und öffne ihn erneut, war es plötzlich kein Problem mehr...?!?!
Was Du beschreibst deutet darauf hin, dass Du die Bausteine alle gleichzeitig im KOP/FUP/AWL-Editor geöffnet hatttest und dann z. B. am UDT Änderungen vorgenommen hast. Dann entstehen leicht inkonsistente Zustände zwischen UDT und Bausteinen. Deshalb mein Hinweis mit der Konsistenzprüfung.
Wenn Du so arbeitest, solltest Du, wenn der KOP/FUP/AWL-Editor sich weigert, bestimmte Einträge anzunehmen, zuerst mal <Datei/Zugriffe prüfen und aktualisieren> ausführen. Häufig geht's danach.

Gruß
Erich
 
Zuletzt bearbeitet:
Zurück
Oben