Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 6 von 6

Thema: UDT als Input --> Fehlverhalten

  1. #1
    Registriert seit
    25.01.2012
    Beiträge
    125
    Danke
    28
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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....

    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
    Software:
    STEP 7 5.5 + SP4 + HF6
    TIA Portal V13 SP1 Update 4
    TwinCAT V3.1
    Hardware:
    S7-400 CPU 414-3 PN/DP
    CPU 1516-3 PN/DP
    CX5020-0110
    Zitieren Zitieren UDT als Input --> Fehlverhalten  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.186
    Danke
    923
    Erhielt 3.291 Danke für 2.660 Beiträge

    Standard

    Ein Stück Programmcode sagt mehr als tausend Worte ...
    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #3
    TimeOUT ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.01.2012
    Beiträge
    125
    Danke
    28
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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..
    Geändert von TimeOUT (01.08.2014 um 10:28 Uhr)
    Software:
    STEP 7 5.5 + SP4 + HF6
    TIA Portal V13 SP1 Update 4
    TwinCAT V3.1
    Hardware:
    S7-400 CPU 414-3 PN/DP
    CPU 1516-3 PN/DP
    CX5020-0110

  4. #4
    Registriert seit
    23.10.2009
    Beiträge
    391
    Danke
    58
    Erhielt 113 Danke für 87 Beiträge

    Standard

    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

  5. #5
    TimeOUT ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.01.2012
    Beiträge
    125
    Danke
    28
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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...

    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
    Software:
    STEP 7 5.5 + SP4 + HF6
    TIA Portal V13 SP1 Update 4
    TwinCAT V3.1
    Hardware:
    S7-400 CPU 414-3 PN/DP
    CPU 1516-3 PN/DP
    CX5020-0110

  6. #6
    Registriert seit
    23.10.2009
    Beiträge
    391
    Danke
    58
    Erhielt 113 Danke für 87 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von TimeOUT Beitrag anzeigen
    ...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...

    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
    Geändert von LargoD (01.08.2014 um 18:36 Uhr)

Ähnliche Themen

  1. TIA Zeit in Tagen als Input eingeben
    Von kuti im Forum Simatic
    Antworten: 24
    Letzter Beitrag: 15.09.2013, 23:02
  2. Step 7 Datentyp als Input von FC beschreiben
    Von TomDrom im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 17.07.2013, 15:06
  3. Bool wird als input nicht akzeptiert
    Von Bensen83 im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 23.10.2012, 11:02
  4. B&R Bibliothek Var Input als Pointer
    Von rudl im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 27.04.2010, 16:31
  5. UDT Array Input an einem FC
    Von TagebauCoder im Forum Simatic
    Antworten: 17
    Letzter Beitrag: 04.10.2009, 02:29

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •