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

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 31

Thema: Strukturen an Funktionen übergeben

  1. #1
    Registriert seit
    23.10.2015
    Ort
    Hessen
    Beiträge
    51
    Danke
    12
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo liebes Forum,

    ich habe eine Frage bezüglich Strukturübergaben an Funktionen/Funktionsbausteinen.
    Das System ist einer CPU 1512C-1 PN und wird aus dem TIA-Portal projektiert.

    Ich möchte in einem Funktionbaustein mehrere Analogwerte auswerten.
    Dafür habe ich eine Funktion programmiert in der ich die SCALE-Funktion calle und noch ein paar anschließende Auswertungen mache wie Drahtbruch, Warnwert und Fehlerwert. Die SCALE-Funktion benötigt bekanntlich Grenzwerte, Bipolareinstellung und den entsprechenden Analogwert. Um die Daten leichter zu händeln habe ich eine Struktur(UDT) erstellt und in einem globalen DB abgelegt, da diese mehrmals genutzt wird. Weiter habe ich so den Vorteil, dass ich einfach die Einstellwerte wie die Grenzwerte ändern kann und die Struktur nicht jedesmal neu programmieren muss.
    Wie oben beschrieben möchte ich mehrere Analogwerte und weiteres in einem Funktionsbaustein auswerten. Den Funktionsbaustein kann man sich so vorstellen, dass dieser ein Anlagenteil darstellt.
    Also habe ich ein Eingangsparameter im Integerformat und die Analogstruktur(oben beschrieben) für jeden Analogwert im Eingangsbereich des FB erstellt. Das sind in der Summe 8 Analogwerte und somit 8 Strukturen. Die Anlogwerte lege ich im OB mit der Adresse %IWxxx an und an die IN-Struktur entsprechend DB10.StructX an den FB an. So habe ich den Vorteil das ich immer nur die Struktur an den FB anlegen muss und nicht ständig die Werte für die SCALE-Funktion einzeln als Übergabeparameter angeben muss.

    Simuliert klappt das Fehlerfrei, aber lade ich dies nun in die CPU springt diese mir auf STOP.

    Nun ist meine Frage, was habe ich falsch gemacht oder gibt es eine bessere Möglichkeit?
    Weiter interessiert mich ob es eine Beschränkung bezüglich Strukturen als Übergabeparameter im IN und OUT Bereich von Funktionen gibt?
    Gibt es eine Wertbeschränkung bei Strukturen?


    Ich hoffe mir kann jemand auf die Sprünge helfen und mir mit Rat beistehen.
    Zitieren Zitieren Strukturen an Funktionen übergeben  

  2. #2
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.686
    Danke
    208
    Erhielt 413 Danke für 331 Beiträge

    Standard

    Was kommt für eine Stop Ursache?

  3. #3
    Registriert seit
    12.12.2013
    Ort
    Kaiserslautern
    Beiträge
    1.262
    Danke
    359
    Erhielt 203 Danke für 162 Beiträge

    Standard

    Zitat Zitat von SPS-EK Beitrag anzeigen
    Nun ist meine Frage, was habe ich falsch gemacht oder gibt es eine bessere Möglichkeit?
    Ein ausschnitt von Code ist auch hilfreich zum auswerten.

    Bram
    Zonder smering, loopt alles naar de tering!

  4. #4
    SPS-EK ist offline Benutzer
    Themenstarter
    Registriert seit
    23.10.2015
    Ort
    Hessen
    Beiträge
    51
    Danke
    12
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Zitat Zitat von Jochen Kühner Beitrag anzeigen
    Was kommt für eine Stop Ursache?
    Leider gerade nicht zu Hand. Werde ich morgen direkt schauen und posten. Danke für deine Beteiligung.


    Zitat Zitat von de vliegende hollander Beitrag anzeigen
    Ein ausschnitt von Code ist auch hilfreich zum auswerten.

    Bram
    Codeausschnitt gestalltet sich schwierig, ich zieh ja die Werte aus einem globalen DB über die IN-Parameter des FBs aber ich probiere es:

    Struktur der Einstellwerte im globalen DB:
    Code:
        Static 
                       EHE    Struct        
                                 M_fan    Struct
                                              //...Struktur für andere Funktion
                                 AIVC_1  Struct
                                               HI_LIM    Real   1000.0
                                               LO_LIM   Real       20.0
                                               Warn       Real     800.0
                                               Fehler      Real     900.0
                                               BIPOLAR  Bool     true
                                 AIVC_2  Struct
                                               HI_LIM    Real   1000.0
                                               LO_LIM   Real       20.0
                                               Warn       Real     800.0
                                               Fehler      Real     900.0
                                               BIPOLAR  Bool     true
    // weitere Strukturen
    Codeausschnitt im FB der im OB gecallt wird(AVC ist eine Struktur bestehend aus mehreren Strukturen von AIVC1_1-8 im static-Bereich des FBs damit die Werte geschrieben werden zur weiteren Verarbeitung für HMI zb):
    Code:
    #AVC.AIVC1_1.errorcode := "analogue_input_converting"(I_analog_value_input_channel := #I_temp_TR_1,
                                                          I_scale_high_limit := #I_aivc_1_1_adj_values.scale_high_limit,
                                                          I_scale_low_limit := #I_aivc_1_1_adj_values.scale_low_limit,
                                                          I_scale_bipolar := #I_aivc_1_1_adj_values.scale_bipolar,
                                                          I_av_monitoring_first_limit := #I_aivc_1_1_adj_values.monitoring_first_limit,
                                                          I_av_monitoring_second_limit := #I_aivc_1_1_adj_values.monitoring_second_limit,
                                                          I_reset := #I_reset,
                                                          O_analog_value_scaled => #AVC.AIVC1_1.analoguevalue_scaled,
                                                          O_av_fault_wire_fracture => #AVC.AIVC1_1.fault_wire_fracture,
                                                          O_av_monitored_first_limit => #AVC.AIVC1_1.first_limit,
                                                          O_av_monitored_second_limit => #AVC.AIVC1_1.second_limit);
    
    #O_temp_TR_1.actvalue := #AVC.AIVC1_1.analoguevalue_scaled;
    Die SCALE-Funktion in dem eigenen FC "analogue_input_converting":
    Code:
    // analogue value scale 
    #t_av_scale_error_code := SCALE(IN := #I_analog_value_input_channel,
                                    HI_LIM := #I_scale_high_limit,
                                    LO_LIM := #I_scale_low_limit,
                                    BIPOLAR := #I_scale_bipolar,
                                    OUT => #t_analogue_value_scaled);
    // ...Fehlerauswertung...
    
    // Return functionvalue
    #analogue_input_converting := #t_av_scale_error_code;
    Im OB1 übergebe ich dann die Struktur an den IN-Parameter I_aivc_1_1_adj_values(Struktur im Eingangsbereich(IN) des FB, diese entspricht wieder der selben Struktur wie aus dem globalen DB) und an #I_temp_TR_1 übergebe ich im OB1 diw Adresse %IWxxx des Analogkanals der SPS.

    Reicht das für eine Einschätzung? Weiß nicht wie ich das sonst darstellen soll...
    Geändert von SPS-EK (30.08.2016 um 22:41 Uhr)

  5. #5
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.017
    Danke
    511
    Erhielt 2.648 Danke für 1.910 Beiträge

    Standard

    Ich würde sagen, wir warten mal darauf, dass du uns die Diagnose aus der CPU schreibst. Die wird sicherlich aufschlußreicher sein.
    Was genau macht du mit dem IWxxx im FB? Das scheint mir eher der entscheidende Punkt zu sein.

    PS: Ich würde keine Structs im DB und in INPUT des FB verwenden, sondern einen Datentyp (früher UDT) dafür anlegen. Das ist übersichtlicher und einfacher bei Änderungen!
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  6. #6
    SPS-EK ist offline Benutzer
    Themenstarter
    Registriert seit
    23.10.2015
    Ort
    Hessen
    Beiträge
    51
    Danke
    12
    Erhielt 1 Danke für 1 Beitrag

    Standard

    @ Ralle: Die Adresse verwende ich nicht im FB, sondern lege sie an den Eingangsparameter des FBs im OB1 um den Wert zu übergeben.

    So gerade den Diagnosepuffer ausgelesen folgendes steht drin:

    Ereignis-ID: 16# 02:3500
    Temporärer CPU-Fehler: Max. freie Zykluszeit zweifach überschritten
    parametrierter Wert: 6000 Millisekunden
    CPU wechselt in STOP-Zustand (Systemreaktion)


    Ereignis-ID: 16# 02:3501
    Temporärer CPU-Fehler: Max. freie Zykluszeit überschritten
    parametrierter Wert: 6000 Millisekunden
    Zeitfehler, Start von OB 80 angefordert


    Die Zykluszeit hatte ich gestern mal auf max von 6000 eingestellt zum testen, aber geht ja trotzdem nicht.
    Mit dem OB80 bin ich mir unsicher. Den werde ich mal einfügen, nur wüsste ich auch nicht was man in dem OB80 genau machen muss.

  7. #7
    Registriert seit
    14.01.2015
    Beiträge
    953
    Danke
    277
    Erhielt 160 Danke für 144 Beiträge

    Standard

    Im OB80 ( Zeitfehler OB ) kann man eine Reaktion auf eine Zykluszeitüberschreitung programmieren.
    Dies hiflt dir aber nicht bei deinem Problem. Es scheint eine Endlosschleife programmiert zu sein.

    Mit Grüßen

  8. #8
    Registriert seit
    25.02.2016
    Beiträge
    183
    Danke
    8
    Erhielt 38 Danke für 35 Beiträge

    Standard

    Hallo SPS-EK

    andere Frage wenn du das Prgramm simulierst hast du dann auf der Simulierten CPU eine SF ??

    Mit freundlichen Grüßen TIA

  9. #9
    Registriert seit
    13.02.2012
    Ort
    Münsingen
    Beiträge
    14
    Danke
    2
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Entweder ich habe deinen Code noch nicht durchschaut oder du hast wohl das Prinzip eines UDT nicht richtig umgesetzt. Im globalen DB müsste nämlich AVIC_1 nicht als STRUCT sondern als dein definierter Datentyp deklariert sein und bei der Deklaration im FB ebenso. Damit stellst du schon mal sicher, dass die Struktur immer die selbe ist. Es ist dann auch sinnvoller, diese Struktur im FB als INOUT zu deklarieren, denn dann wird sie in der Instanz nur als ein Zeiger auf deinen globalen DB referenziert und nicht als gesamte Struktur kopiert.
    Der häufigste Fehler beim Aufruf von FBs ist meiner Erfahrung nach, den Eingangsparameter im CALL falsch oder gar nicht zu belegen, so dass die CPU auf's Nirvana referenziert.

  10. #10
    SPS-EK ist offline Benutzer
    Themenstarter
    Registriert seit
    23.10.2015
    Ort
    Hessen
    Beiträge
    51
    Danke
    12
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke schon mal euch allen, dass ihr euch alle beteiligt.

    @ DeltaMikeAir: Es ist keine Endlosschleife programmiert. Schleifen an sich schonmal garnicht, im Grunde nur die Analogfunktionen und ein paar Funktionen für Sicherheitskette und co.

    @ Wincctia: Nein, bei der Simulation wird garkein Fehler auch kein Sammelfehler angezeigt und die Zykluszeit beträgt 3ms.

Ähnliche Themen

  1. Step 7 Vergleichen von Strukturen
    Von Chräshe im Forum Simatic
    Antworten: 21
    Letzter Beitrag: 01.06.2015, 21:04
  2. Step 7 Strukturen ergänzen un verändern
    Von lion1702 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 19.10.2014, 13:17
  3. Step 7 L P#..... mit Strukturen ?
    Von Waelder im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 21.05.2013, 11:37
  4. Flexible und Strukturen
    Von Farinin im Forum HMI
    Antworten: 5
    Letzter Beitrag: 02.08.2012, 13:40
  5. Funktionen in Funktionen aufrufen
    Von Baldaro im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 21.06.2009, 16:17

Lesezeichen

Berechtigungen

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