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

Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 31

Thema: Strukturen an Funktionen übergeben

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von patx Beitrag anzeigen
    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.
    Hi patx, danke auch für deine Beteiligung und Hilfestellung.

    Wieso muss im DB und im FB eine PLC-Datentyp(UDT) verwendet werden? Die Struktur ist doch immer die gleiche, ob als Struct oder als UDT ausgelegt. Hat das noch einen anderen Hintergrund?
    Macht es denn viel aus, wenn man INOUT benutzt? Denn im Grunde sollen ja die Werte in den FB kopiert werden.

    Wie meinst du das folgende?
    Zitat Zitat von patx Beitrag anzeigen
    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.
    Die Eingangsparameter haben ja durch den IDB ja sowieso schon ein Startwert und sind somit belegt oder versteh ich es falsch?

  2. #12
    Registriert seit
    25.02.2016
    Beiträge
    124
    Danke
    6
    Erhielt 20 Danke für 18 Beiträge

    Standard

    Hallo SPS EK

    mal ganz andere Frage was hat die 1500er aktuell ohne dein Programm für eine Zykluszeit?

    noch was lädtst du das Programm über Konsistent laden oder über Selektion laden? Hast du nach den Programm laden evtl im Stop mal einen Online Offline vergleich gemacht?

    Gruß TIA

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

    Standard

    Bei mir würde dein Aufruf also wie folgt aussehen:
    Code:
    #AVC.AIVC1_1.errorcode := "analogue_input_converting"(I_analog_value_input_channel := #I_temp_TR_1,
                                                          IO_parameters := <global>.EHE.AIVC_1,
                                                          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);
    Tip für das Debugging:
    Klammere sukzessive Codeteile aus, um den Teil einzukreisen, der den Fehler verursacht.
    In diesem Fall: stürzt dein Programm auch ab, wenn du den FB-Call auskommentierst?
    Wenn ja, dann klammere mal innerhalb deines FB erst den gesamten Code, dann immer weniger Code aus, um auf die selbe Weise festzustellen wo der Fehler genau steckt.

  4. Folgender Benutzer sagt Danke zu patx für den nützlichen Beitrag:

    SPS-EK (31.08.2016)

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

    Standard

    Du hattest geschrieben, dass du einen UDT definiert hattest, unbedingt notwendig ist das nicht. Aber wenn du eine unbenannte Struktur verwendest, dann musst du diese auch die selbe STRUCT in deinem FB deklarieren. Bisher hast du auf die Einzelelemente der Struktur referenziert.
    Der Vorteil im INOUT-Bereich ist, dass der Instanz-DB nur eine Adresse enthält, aber keine Kopie der Daten, was Fehler durch falsche Zugriffe schon mal ausschließt.
    das mit den Vorbelegungen gilt ja nur, wenn du die variablen einzeln deklarierst, was ja aber genau NICHT erwünscht ist. Bei UDTs stecken die "Vorbelegungen" in der Deklaration des UDT und sind damit global.

  6. Folgender Benutzer sagt Danke zu patx für den nützlichen Beitrag:

    SPS-EK (31.08.2016)

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

    Standard

    Zitat Zitat von Wincctia Beitrag anzeigen
    Hallo SPS EK

    mal ganz andere Frage was hat die 1500er aktuell ohne dein Programm für eine Zykluszeit?

    noch was lädtst du das Programm über Konsistent laden oder über Selektion laden? Hast du nach den Programm laden evtl im Stop mal einen Online Offline vergleich gemacht?

    Gruß TIA
    Puh...da bin ich überfragt. Momentan läuft sie mit Auskommentieren bei 3ms wie simuliert und längste Zeit ist 5ms. Offline wie Online im STOP modus sind beide gleich. Keine Unterschiede feststellbar.

    Zitat Zitat von patx Beitrag anzeigen
    Bei mir würde dein Aufruf also wie folgt aussehen:
    Code:
    #AVC.AIVC1_1.errorcode := "analogue_input_converting"(I_analog_value_input_channel := #I_temp_TR_1,
                                                          IO_parameters := <global>.EHE.AIVC_1,
                                                          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);
    Tip für das Debugging:
    Klammere sukzessive Codeteile aus, um den Teil einzukreisen, der den Fehler verursacht.
    In diesem Fall: stürzt dein Programm auch ab, wenn du den FB-Call auskommentierst?
    Wenn ja, dann klammere mal innerhalb deines FB erst den gesamten Code, dann immer weniger Code aus, um auf die selbe Weise festzustellen wo der Fehler genau steckt.
    Bei deinem Aufruf hätte ich aber das Problem, dass ich den FB intern anpassen müsste, falls nachträglich der EInstellwerte-DB geändert wird. Daher habe ich den über den Eingangsparameter des FB angelegt. Nachteil auch wieder ich müsste die analogauswertfuntion FC ändern, will ich die irgendwann mal ohne UDT verwenden geht das nicht.

    Gerade habe ich den FB mal auf false gesetzt, CPU läuft dann auch im RUN. Beim einzeln auskommentieren springt die CPU auf STOP sobald der FC gecallt wird:
    Code:
    #AVC.AIVC1_1.errorcode := "analogue_input_converting"(I_analog_value_input_channel := #I_temp_rec_cleanair_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);
    Jetzt ist die Frage stimmt was mit der Wertübergabe nicht oder mit Funktion?
    Geändert von SPS-EK (31.08.2016 um 09:37 Uhr)

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

    Standard

    Ok, du musst dich mit dem Prinzip UDT erst noch anfreunden...

    Nach deiner Klammeraktion steht also fest: der Fehler liegt im FB-Aufruf selbst.
    Woher kommen eigentlich die Übergabewerte #I_aivc_1_1_adj_values. ... ? Das müssten doch nach meinem Verständnis die Werte deiner globalen Struktur EHE.AIVC_1. ... sein? Werden die vorher nochmal auf lokale (temporäre) Variablen übertragen? Genau hier könnte sich ein Fehler einschleichen, wenn die Struktur nicht exakt die selbe ist, z.B. ein Datentyp nicht passt. Grundsätzlich solltest du versuchen, Variablen nicht zig mal durchzureichen, das ist auch ein Vorteil von INOUT, man kann die Werte einer Sub-Funktion wieder weitergeben.

  9. #17
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    11.871
    Danke
    500
    Erhielt 2.604 Danke für 1.877 Beiträge

    Standard

    Den gesamten Code in deinem FC mal deaktivieren (löschen oder überspringen).
    Wie ich schon schrieb, Datentyp(UDT) verwenden, sowohl im DB, als auch in der Schnittstelle des FB, das verringert die Fehlermöglichkeit und erleichtert Ä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

  10. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    SPS-EK (31.08.2016)

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

    Standard

    Zitat Zitat von SPS-EK Beitrag anzeigen
    ...Bei deinem Aufruf hätte ich aber das Problem, dass ich den FB intern anpassen müsste, falls nachträglich der EInstellwerte-DB geändert wird. Daher habe ich den über den Eingangsparameter des FB angelegt.
    Genau deshalb definiert man dafür ja den Datentyp als UDT und NICHT als STRUCT im DB.

    Zitat Zitat von SPS-EK Beitrag anzeigen
    Nachteil auch wieder ich müsste die analogauswertfuntion FC ändern, will ich die irgendwann mal ohne UDT verwenden geht das nicht.
    Wozu brauchst du die Analogfunktion ohne UDT? Wenn du die Funktion in anderen Programmen verwenden willst, dann kopier einfach die Funktion UND den Datentyp dorthin, dann klappt's perfekt, UND du kannst immer sicher sein, dass es sich um die selbe Struktur (die hat ja dann einen Namen, z.B. "analogue_parameters") handelt. Ich gehe da sogar noch einen Schritt weiter und definiere sowas in einer globalen Bibliothek, denn genau das ist ja beabsichtigt: die Funktion soll immer gleich einsetzbar sein, ohne über Details nachdenken zu müssen. Mit der Zeit programmierst du dann nur noch sauber definierte "Module", die sich wie Legoklötzchen zusammenfügen lassen. Es überlegt ja auch kein C-Programmierer mehr, wie die Funktion printf() intern abläuft. Wichtig ist, schon bei der Definition solcher Bausteine eine exakte Analyse der Anforderungen zu machen, also Sonderfälle zu berücksichtigen (z.B. der Analogwert für high_limit ist kleiner als low_limit) und das ganze gut zu dokumentieren.
    Ich bin heute noch auf der Suche nach Codequellen für solche sauber programmierten "Module", die man einfach nur einzusetzen braucht, ohne über die Interna nachdenken zu müssen. Aber leider schafft das nicht mal Siemens selber, ganz blöd, wenn dann solcher Bausteincode geschützt ist.

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

    Standard

    Zitat Zitat von patx Beitrag anzeigen
    Ok, du musst dich mit dem Prinzip UDT erst noch anfreunden...

    Nach deiner Klammeraktion steht also fest: der Fehler liegt im FB-Aufruf selbst.
    Woher kommen eigentlich die Übergabewerte #I_aivc_1_1_adj_values. ... ? Das müssten doch nach meinem Verständnis die Werte deiner globalen Struktur EHE.AIVC_1. ... sein? Werden die vorher nochmal auf lokale (temporäre) Variablen übertragen? Genau hier könnte sich ein Fehler einschleichen, wenn die Struktur nicht exakt die selbe ist, z.B. ein Datentyp nicht passt. Grundsätzlich solltest du versuchen, Variablen nicht zig mal durchzureichen, das ist auch ein Vorteil von INOUT, man kann die Werte einer Sub-Funktion wieder weitergeben.
    Genau das habe ich vor bzw mache ich mit den Strukturen bzw mittlerweile UDT.
    Nein, mit PLC-Datentypen(UDTs) muss ich mich nicht anfreunden. Mit denen bin ich schon angefreundet , weil ich die auch für Profibus/net-Funktionen bzw. die PZDs und die Aufschlüsselung von PZD1 (Steuer und auch Zustandwort) verwende.
    Im DB und im FB macht das durch aus Sinn, dass verstehe ich. In der Analogfunktion FC für mich weniger. Hier habe ich lieber eine Funktion die simple funktioniert und auch etwaige Arbeitskollegen die solche Sachen garnicht kennen noch mit der Funktion klarkommen und man simple erweitern kann. Da können die auch bis ich mich durchgerungen habe auch ihre Merker nutzen Ich setze lieber nur auf Daten aus globalen oder lokalen DBs, um genau solche Vorteile wie das nutzen vom Bausteinen wo sich das Programm wie Lego zusammen setzt zu nutzen, daher verwende ich auch nirgends in meinem Programm Merker.

    Zitat Zitat von Ralle Beitrag anzeigen
    Den gesamten Code in deinem FC mal deaktivieren (löschen oder überspringen).
    Wie ich schon schrieb, Datentyp(UDT) verwenden, sowohl im DB, als auch in der Schnittstelle des FB, das verringert die Fehlermöglichkeit und erleichtert Änderungen.
    Alles klar, dass habe ich schon wie zuvor beschrieben gemacht. Danke.

    Zitat Zitat von patx Beitrag anzeigen
    Genau deshalb definiert man dafür ja den Datentyp als UDT und NICHT als STRUCT im DB.


    Wozu brauchst du die Analogfunktion ohne UDT? Wenn du die Funktion in anderen Programmen verwenden willst, dann kopier einfach die Funktion UND den Datentyp dorthin, dann klappt's perfekt, UND du kannst immer sicher sein, dass es sich um die selbe Struktur (die hat ja dann einen Namen, z.B. "analogue_parameters") handelt. Ich gehe da sogar noch einen Schritt weiter und definiere sowas in einer globalen Bibliothek, denn genau das ist ja beabsichtigt: die Funktion soll immer gleich einsetzbar sein, ohne über Details nachdenken zu müssen. Mit der Zeit programmierst du dann nur noch sauber definierte "Module", die sich wie Legoklötzchen zusammenfügen lassen. Es überlegt ja auch kein C-Programmierer mehr, wie die Funktion printf() intern abläuft. Wichtig ist, schon bei der Definition solcher Bausteine eine exakte Analyse der Anforderungen zu machen, also Sonderfälle zu berücksichtigen (z.B. der Analogwert für high_limit ist kleiner als low_limit) und das ganze gut zu dokumentieren.
    Ich bin heute noch auf der Suche nach Codequellen für solche sauber programmierten "Module", die man einfach nur einzusetzen braucht, ohne über die Interna nachdenken zu müssen. Aber leider schafft das nicht mal Siemens selber, ganz blöd, wenn dann solcher Bausteincode geschützt ist.
    Das UDT ist aber ein Detail des FC und wie zuvorbeschrieben für mich weniger sinnvoll aber das liegt im Auge des betrachters und die 4 Variablen bekommt man auch noch so schnell programmiert
    Genau solche Module programmiere ich grundsätzlich. Ich seh es auch nicht ein, ständig das selbe nue zuprogrammieren. Jede einzeln FUnktion wird so allgemein wie möglich gehalten. Die FBs sind da wieder etwas anders...da kommt es auf die Anlagenteile an...Ich nutze auch weitere Multiinstanzen um zb die Timer in den Lokaldaten zu haben und die FUnktion allgemein gehalten direkt einzubinden ohne nachzudenken. Vielen Dank aber trotzdem für deine Tipps!

    Euch allen schonmal vielen Dank für die Denkansätze und Hilfestellungen, dass hilft mir ungemein manchmal sieht man ja auch vor lauter Bäumen den Wald nich

    So habe es weiter eingegrenzt und herausgefunden wann die CPU in Stop springt und zwar wenn ich die High und Low limit werte auf 16220.0 und -2700.0 setze. Ist mir aufgefallen weil die Analogfunktion mehrmals kein STOP verursacht hat und bei drei Analogwerten trotzdem, da konnte es ja nur noch ein Einstellwert sein.
    Die Frage ist wieso die dabei auf STOP geht, gibt es da eine Beschränkung für die SCALE-Funktion? Ich meine da wären die Grenzen 27648 und -27648?

    EDIT: Habe gerade ein Analogwert der 32767 in die Funktion gibt und die CPU auf Stop geht, dabei dürfte das doch bei der SCALE-SFC nicht passieren oder?
    Geändert von SPS-EK (31.08.2016 um 11:37 Uhr)

  13. #20
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    11.871
    Danke
    500
    Erhielt 2.604 Danke für 1.877 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Was für eine SPS hast du genau?
    Vielleicht löscht du noch mal den FC105 (Scale) und ziehst ihn aus der Library in deinen Bausteinordner.
    Irgendwas stimmt da nicht, der Baustein hat meine Steuerung noch nie zum Absturz gebracht.
    Außerdem solltest du mal eine Konsistenzprüfung machen.
    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

Ä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
  •