Step 7 Strukturen an Funktionen übergeben

SPS-EK

Level-1
Beiträge
68
Reaktionspunkte
1
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.
 
Was kommt für eine Stop Ursache?

Leider gerade nicht zu Hand. Werde ich morgen direkt schauen und posten. Danke für deine Beteiligung.


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... :confused:
 
Zuletzt bearbeitet:
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!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@ 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.
 
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
 
Hallo SPS-EK

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

Mit freundlichen Grüßen TIA
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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.
 
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?
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Bei mir würde dein Aufruf also wie folgt aussehen:
Code:
[COLOR=#333333][FONT=Courier]#AVC.AIVC1_1.errorcode := "analogue_input_converting"(I_analog_value_input_channel := #I_temp_TR_1,
[/FONT][/COLOR][COLOR=#333333][FONT=Courier]                                                      IO_parameters := <global>.EHE.AIVC_1,
[/FONT][/COLOR][COLOR=#333333][FONT=Courier]                                                      I_reset := #I_reset,
[/FONT][/COLOR][COLOR=#333333][FONT=Courier]                                                      O_analog_value_scaled => #AVC.AIVC1_1.analoguevalue_scaled,
[/FONT][/COLOR][COLOR=#333333][FONT=Courier]                                                      O_av_fault_wire_fracture => #AVC.AIVC1_1.fault_wire_fracture,
[/FONT][/COLOR][COLOR=#333333][FONT=Courier]                                                      O_av_monitored_first_limit => #AVC.AIVC1_1.first_limit,
[/FONT][/COLOR][COLOR=#333333][FONT=Courier]                                                      O_av_monitored_second_limit => #AVC.AIVC1_1.second_limit);[/FONT][/COLOR]

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.
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

Bei mir würde dein Aufruf also wie folgt aussehen:
Code:
[COLOR=#333333][FONT=Courier]#AVC.AIVC1_1.errorcode := "analogue_input_converting"(I_analog_value_input_channel := #I_temp_TR_1,
[/FONT][/COLOR][COLOR=#333333][FONT=Courier]                                                      IO_parameters := <global>.EHE.AIVC_1,
[/FONT][/COLOR][COLOR=#333333][FONT=Courier]                                                      I_reset := #I_reset,
[/FONT][/COLOR][COLOR=#333333][FONT=Courier]                                                      O_analog_value_scaled => #AVC.AIVC1_1.analoguevalue_scaled,
[/FONT][/COLOR][COLOR=#333333][FONT=Courier]                                                      O_av_fault_wire_fracture => #AVC.AIVC1_1.fault_wire_fracture,
[/FONT][/COLOR][COLOR=#333333][FONT=Courier]                                                      O_av_monitored_first_limit => #AVC.AIVC1_1.first_limit,
[/FONT][/COLOR][COLOR=#333333][FONT=Courier]                                                      O_av_monitored_second_limit => #AVC.AIVC1_1.second_limit);[/FONT][/COLOR]

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?
 
Zuletzt bearbeitet:
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.
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...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.

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

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.

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 :ROFLMAO:

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?
 
Zuletzt bearbeitet:
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.
 
Zurück
Oben