Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

INTEGRAL

2009-01-21
2009-01-26
  • KingNothing - 2009-01-21

    Hallo!

    Ich habe ein kleines Problem, vielleicht kann mir jemand helfen...

    Meine Hardware: Wago 750-841

    Ich versuche über einen Durchflussmesser das Volumen zu errechnen. Dieser Durchflussmesser gibt ein analoges Spannungssignal aus (0-3,5V) über das ich dann den aktuellen Durchfluss (l/min) errechne.

    Um das Volumen und später auch die Wärmemenge zu errechnen benötige ich einen INTEGRAL-Baustein. Leider bekomme ich nie ein realistisches Ergebnis. Die Abweichung beträgt ca. 40%.

    Der Integrator benötigt die aktuelle Zykluszeit, die ich über GET_PLC_ACT_CYLCE ermittle.

    Ich habe auch schon einen eigenen Integrator programmiert, bei dem ist aber ungefähr der selbe Fehler. Es muss also an der Zycluszeit liegen.

    Hilfe!!!

    Gruß Tom

     
  • gravieren - 2009-01-21

    Hier gibt es den Baustein MIT ST-Quellcode: w www.oscat.de w

     
  • KingNothing - 2009-01-22

    Habe jetzt die Variante von OSCAT auch getestet. Es kommt wieder nur "irgendwas" raus.

    Dort ist eine Variabele K, wofür soll die sein? Muss man die Intergralfunktion selbst kalibrieren? Habe ich auch schon versucht, aber wenn sich die Zykluszeit verändert, bekomme ich wieder eine Abweichung.

     
  • KingNothing - 2009-01-22

    Problem gelöst!

    Die Integration muss separat in einem eigenem Programm ablaufen ohne weiter Applikationen.

    Desweiteren muss dieses Programm die höchste Priorität haben und zyklisch nach fest eingestellten Intervall aufgerufen werden. (Bei mir Prio 0 und Intervall 10ms). Die Zeit des Intervalls kann dann für die Berechnung der Elementarfläche genutzt werden.

    Für das Integral habe ich folgende Formel verwendet:Volumen:=Volumen+Q/6000; wobei Q der Durchfluss in l/min ist. 6000, da in einer Minute der Task 6000 mal aufgerufen wird.

     
  • hugo - 2009-01-22

    ein paar hinweise zu integratoren (im speziellen die aus oscat)

    1. die integrationsformel ist: out := out_last + in * delta t.

    diese formel kann noch verfeinert werden mit der trapezformel, welche gute integratoren auch benutzen: out := out_last + (in_last + in)/2 * delta T

    1. delta T misst normalerweise ein integrator selber, voellig egal wie regelmässig oder unregelmässig er auferufen wird kennt der integrator die zeit seit dem letzten aufruf und berechnet den neuen wert entsprechend.

    2. K ist ein proportionalfaktor der in der regelungstechnik absoluter standard ist und in deinem fall z.b. dazu benutzt werden kann aus l/min l/sekunde zu machen (k = 60) denn die grundeinheit eines integrators ist die si einheit sekunde und nicht etwa minuten oder sonst etwas.

    wenn du z.b. den eingang von 0 auf 120l/sec schaltest, und nach 10 ms den integrator aufruft wird folgendes passieren:

    out := out_last + (0 + 120)/2 * 20 ms ergibt out_last + 1.2 liter.

    in 20 millisekunden sind 60 / 50 = 1,2 liter geflossen.

    die trapezregel stellt sicher das bei veränderung des eingangswertes ein trapez am eingang berechnet wird, den da man nicht kennt wann zwischen dem letzten aufruf sich der eingang verändert hat nimmt man an das es in der mitte der zeit war um den absolut möglichen fehler möglichst gering zu halten.

    die taskzeit für den integrator hat nur in soweit bedeutung das die genauigkeit leidet je weniger oft der integrator aufgerunfen wird.

    eine spezielle task benötigst du dafür nicht, auch kann der integrator mit beliebigen anderen code aufgerufen werden.

    allerdings musst du sicherstellen das er zyklisch aufgerufen wird.

     
  • KingNothing - 2009-01-22

    Selbstverständlich ist die Trapezformel genauer, ich werde meinen FB auch noch umschreiben.

    Das der Integrator die Zeit selbst misst hat nicht funktioniert. Weder die Methode von Oscat mit der TIME()-Funktion, noch die mit der GET_PLC_ACT_CYCLE() aus der SYSTEM.lib von Wago.

    Nun, ich habe mich eingehend damit beschäftigt und Tests mit der SPS und dem Durchflussmesser durchgeführt. Nur auf diese Weise habe ich exakte Ergebnisse bekommen.

     
  • hugo - 2009-01-23

    der integrator aus der oscat läuft in hunderten von projekten einwandfrei, es ist also unverständlich warum er das bei dir nicht tut. kannst du mal dein projekt posten dann kann ich es mir ansehen

     
  • KingNothing - 2009-01-26

    Sorry, aber das Projekt in dem es nicht lief gibt es nichtmehr, da ich es umgeschrieben habe, so dass es läuft. Und noch mal alles rekonstruieren ist mir zu viel Aufwand...

    Werde schließlich nicht fürs posten bezahlt!

     
  • Ralph Holz - 2009-01-26

    Sollen wir ihn gleich rauswerfen oder einfach nicht mehr antworten?

     
  • hugo - 2009-01-26

    gib ihm noch eine chance

     

Log in to post a comment.