Realzahl runterzählen

Chris48

Level-1
Beiträge
30
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry dass ich so blöde frage, aber ich hab in der Suchfunktion nichts gefunden.
ich will quasi eine sehr einfache Durchflussmengensteuerung Programmieren in dem ich den ausgangswert eine Realzahl abhängig von zu hohem oder zu niedrigem Durchfluss, hob beziehungsweise runterzähle.
Das hochzählen klappt auch einwandfrei, du runterzählen geht nicht :/ wobei es doch genau gleich gehen müsste oder nicht


Hochzählen

U "Ferm1_Pu_Vor"
U(
U M 255.5
FP "Fest_Flanke_Durchfluss"
)
U(
L "Fest_allgemein_Betriebsd".Pumpenleistung_Vorgabe
L "Fest_allgemein_Betriebsd".Pumpenleistung_Aktual
>R
)
SPBNB _001
L "Fest_allgemein_Betriebsd".FU_Pumpe
L 1.0
+R
T "Fest_allgemein_Betriebsd".FU_Pumpe
_001: NOP 0



Runterzählen

U "Ferm1_Pu_Vor"
U(
U M 255.5
FP "Fest_Flanke_Durchfluss"
)
U(
L "Fest_allgemein_Betriebsd".Pumpenleistung_Vorgabe
L "Fest_allgemein_Betriebsd".Pumpenleistung_Aktual
<R
)
SPBNB _002
L "Fest_allgemein_Betriebsd".FU_Pumpe
L 1.000000e+00
-R
T "Fest_allgemein_Betriebsd".FU_Pumpe
_002: NOP 0
 
Zuletzt bearbeitet:
Du hast jeweils gleiche Bedingungen für das Hoch- sowie für das Runterzählen.
Also wird erstmal hoch- und dann gleich wieder runtergezählt.
 
Hallo,

bin leider nicht der AWL-Profi, vielleicht findet sich hier noch jemand, der da was sieht.
Aber prinzipiell hast Du hier einen I-Regler gebaut. Daher hier noch einige Hinweise von mir:
1. das ganze in einem festen Zyklus aufrufen (am besten Weckalarm OB35 oder so)
2. es fehlt noch eine Min und Max-Begrenzung des Stellsignals (Stichwort Anti Windup) sonst läuft Dein Regler riesig ins Negative oder Positive wenn der Sollwert mal nicht erreicht wird. evtl. ist das auch schon das Problem beim runterzählen dass Du negative Werte bekommst?
3. Den Parameter welchen Du addierts bzw. subtrahierts (1,0) sollte variabel sein, weil das ist genau Dein Reglerparameter (Ki) des I-Reglers

Gruß.

PS: für einen Regler muss noch die Soll-Ist Differenz in den Algorithmus eingehen...

Warum nimmst Du nicht einfach einen fertigen Regler (z.B. FB 41 Cont_C) oder Programmierst selbst einen PI-Regler: http://books.google.de/books?id=FdO...r mit antiwindup differenzengleichung&f=false

da gibts dann auch Einstellregeln dafür.
 
Zuletzt bearbeitet:
ja aber er soll doch immer springen wenn der Vergleich negativ ausfällt, verschieden is runter und hochzählen ja durch den verschiedenen vergleich, oder sehe ich das falsch
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist der Vergleich auf "kleiner als" erfüllt, ist das VKE = 1, sonst 0
Ist ein Vergleich auf "grösser als" erfüllt, ist das VKE = 1, sonst 0

Der Sprung wrd ausgeführt bei VKE = 1, sonst nicht

SPBNB wird ausgeführt, wenn VKE = 0 gem. dem gelieferten Link
SPB wird ausgeführt, wenn VKE = 1 gem. dem gelieferten Link
 
sorry ich weiß nich warum ichs net hinbekomm, aber bei mir ändert sich das VKE garnicht ob nun der Vergleich erfüllt is oder nicht, aber dass kann doch garnicht sein, weil es sind ja immer und-Verknüpfungen ...
:confused::confused::confused:
 
sorry ich weiß nich warum ichs net hinbekomm, aber bei mir ändert sich das VKE garnicht ob nun der Vergleich erfüllt is oder nicht, aber dass kann doch garnicht sein, weil es sind ja immer und-Verknüpfungen ...
:confused::confused::confused:

Was machst du denn mit M 255.5, der beeinflusst doch deine Flanke FP "Fest_Flanke_Durchfluss" in beiden Fällen ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Chris48
Dein Problem: für beide Flankenerkennungen benutzt Du den gleichen Flankenhilfsmerker "Fest_Flanke_Durchfluss". Beim zweiten mal kann nie eine Flanke erkannt werden. Also entweder zwei verschiedene Flankenhilfsmerker benutzen oder die Flankenerkennung vor den beiden Netzwerken nur einmal extra programmieren und das Ergebnis verknüpfen.
Code:
//Hochzählen
U "Ferm1_Pu_Vor"
U(
U M 255.5
FP "[COLOR="#FF0000"]Fest_Flanke_Durchfluss[/COLOR]"
)
U(
...

//Runterzählen
U "Ferm1_Pu_Vor"
U(
U M 255.5
FP "[COLOR="#FF0000"]Fest_Flanke_Durchfluss[/COLOR]" // <-- hier musst Du einen anderen Merker benutzen
)
U(
...

oder
Code:
//Auswertetakt
U M 255.5
FP "Fest_Flanke_Durchfluss"
= #Flanke

//Hochzählen
U "Ferm1_Pu_Vor"
U #Flanke
U(
...

//Runterzählen
U "Ferm1_Pu_Vor"
U #Flanke
U(
...

Mit einem Konnektor müsste es auch gehen (wird aber vielleicht nicht in FUP/KOP dargestellt):
Code:
//Hochzählen
U "Ferm1_Pu_Vor"
U(
U M 255.5
FP "Fest_Flanke_Durchfluss"
= #Flanke
U #Flanke
)
U(
...

//Runterzählen
U "Ferm1_Pu_Vor"
U #Flanke
U(
...


(@SoftMachine: für M 255.5 tippe ich mal auf Taktmerker 1Hz)

Harald
 
Taktmerkerbyte ist asynchron zum OB1!

Beim zweiten mal kann nie eine Flanke erkannt werden.
Wenn meine Vermutung richtig ist, daß es sich beim M255.5 um einen Merker aus dem CPU-Taktmerkerbyte handelt, dann wird es doch - allerdings ziemlich selten - vorkommen, daß bei der zweiten Flankenerkennung eine Flanke erkannt wird. Nämlich dann, wenn sich der M255.5 genau zwischen den beiden Verwendungsstellen ändert.

Merke: Mehrfachzugriff auf die CPU-Taktmerker vermeiden! Wenn doch nötig, dann am Anfang des OB1 auf andere Merker umkopieren, damit sie für den gesamten Zyklus gleich bleiben.

Harald
 
Harald,
das hast du doch schon in Beitrag #12 erledigt...:ROFLMAO:

Code:
//Auswertetakt
U M 255.5F
P "Fest_Flanke_Durchfluss"
=#F[U]lanke

[/U]//Hochzählen
U "Ferm1_Pu_Vor"
[U]U#Fl[U]anke
[/U][/U]U(...

//Runterzählen
U "Ferm1_Pu_Vor"
U [U]#Flanke
U([/U]...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich wollte eigentlich nur meine Aussage mit dem "nie erkannt" richtigstellen, für den wahrscheinlichen Fall, daß M255.5 Teil des CPU-Taktmerkerbytes ist. Oder anderweitig durch Multitasking oder Alarm-OB beeinflußt wird.

Aber OK, nochmal ganz ausführlich:

Auch die Verwendung von zwei Flankenhilfsmerkern (Code 1 in #12) ist noch nicht ganz korrekt, denn dann wird es passieren, daß gelegentlich (*) ein eigentlich erwartetes Hochzählen nicht erfolgt, wenn sich M255.5 genau zwischen den beiden Verwendungsstellen von 0 auf 1 ändert. Der Taktmerker M255.5 darf nur einmal abgefragt werden vor dieser mehrfachen Verwendung. Es muß eine Programmsequenz wie Code 2 in #12 verwendet werden oder mit einer Kopie des Taktmerkers gearbeitet werden. Es könnte z.B. auch der ganze Regelkram in einen eigenen Baustein (FB oder FC) verlagert werden, an den das Taktbit als Eingangsparameter angelegt wird; dann arbeitet der Baustein automatisch mit einer "konsistenten" Kopie des Taktmerkers.

Harald

(*) gelegentlich = hochsporadisch (c) Siemens AG ;)
 
also danke vielmals für die antworten, ich habe mir dann aber heute nachmittag doch noch selbst eine andere variante überlegt, die jetzt funktioniert.

Hochzählen

O(
L "Fest_allgemein_Betriebsd".Pumpenleistung_Vorgabe
L "Fest_allgemein_Betriebsd".Pumpenleistung_Aktual
<R
)
O(
L "Fest_allgemein_Betriebsd".FU_Pumpe
L 8.000000e+04
>=R
)
SPB _003

U M 255.5
FP "Fest_Flanke_Durchfluss"
SPBN _004

L "Fest_allgemein_Betriebsd".FU_Pumpe
L 1.000000e+03
+R
T "Fest_allgemein_Betriebsd".FU_Pumpe

_004: NOP 0
_003: NOP 0

Runterzählen

O(
L "Fest_allgemein_Betriebsd".Pumpenleistung_Vorgabe
L "Fest_allgemein_Betriebsd".Pumpenleistung_Aktual
>R
)
O(
L "Fest_allgemein_Betriebsd".FU_Pumpe
L 0.000000e+00
<=R
)
SPB _001

U M 255.5
FP "Fest_Flanke_Durchfluss"
SPBN _002

L "Fest_allgemein_Betriebsd".FU_Pumpe
L 1.000000e+03
-R
T "Fest_allgemein_Betriebsd".FU_Pumpe

_002: NOP 0
_001: NOP 0

hab da jetzt auch die begrenzungen drin ;)

wobei ich immer noch meine dass dass mit dem Taktmerker und der gleichen Flankenauswertung kein Problem sein dürfte, ich habe es mir nämlich so gedacht, dass ich am Anfang des jeweiligen Netzwerkes, jeweils den gleichen Takt "anstehen" und diesen dann abhängig vom Ergebnis des Vergleichs auf den Zähler "durchschalte", wo lag hier mein denkfehler, dass die Sprünge nicht so funktioniert haben wie ich es vorhatte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
also mit dem von dir zuletzt geposteten Code glaube ich auch nicht, daß es bei dieser wahrscheinlich doch recht trägen Anwendung zu Problemen kommen kann.
ich denke das wichtige und spannende an den Beiträgen, sind die Sätze wie z.B.:

Merke: Mehrfachzugriff auf die CPU-Taktmerker vermeiden! Wenn doch nötig, dann am Anfang des OB1 auf andere Merker umkopieren, damit sie für den gesamten Zyklus gleich bleiben.

also darauf achten, daß die Operanden ihren Zustand während des Zykluses nicht ändern.
Und mit der Sequenz
l "taktmerkerbyte_CPU"
t "taktmerkerbyte_Prog"
im OB1, NW1, tut man ja auch keinem Weh

gruß Thomas

P.S. habe darüber selbst noch nicht nachgedacht, werde es mir merken
 
ich habe mir dann aber heute nachmittag doch noch selbst eine andere variante überlegt, die jetzt funktioniert.
:confused: Das überrascht mich dann doch einigermaßen, denn:
Hochzählen
[...]

SPB _003

U M 255.5
FP "Fest_Flanke_Durchfluss"
//FP vergleicht das VKE mit "Fest_Flanke_Durchfluss" und speichert danach das VKE in "Fest_Flanke_Durchfluss" !
//ab hier hat "Fest_Flanke_Durchfluss" den gleichen Inhalt wie M 255.5
SPBN _004
[...]
Runterzählen
[...]
SPB _001

//wie soll hier eine Flanke festgestellt werden, wenn "Fest_Flanke_Durchfluss" = M 255.5 ?!
U M 255.5
FP "Fest_Flanke_Durchfluss"
SPBN _002
[...]

Harald

PS:
zum CODE einfügen besser die CODE-Tags benutzen, bekommt man mit dem #-Button
 
hi,

Code:
O(
L "Fest_allgemein_Betriebsd".Pumpenleistung_Vorgabe
L "Fest_allgemein_Betriebsd".Pumpenleistung_Aktual
<R
)
O(
L "Fest_allgemein_Betriebsd".FU_Pumpe
L 8.000000e+04
>=R
)
SPB _003                   //Bedingung zum erhöhen wenn vke 0

U M 255.5
FP "Fest_Flanke_Durchfluss"
SPBN _004

L "Fest_allgemein_Betriebsd".FU_Pumpe
L 1.000000e+03
+R
T "Fest_allgemein_Betriebsd".FU_Pumpe

_004: NOP 0
_003: NOP 0
bedingt durch die sprungbedingungen kommt er nicht in schwulitäten, er nutzt die Flanke nur einmal bei erhöhen,
oder einmal bei verringern.
Interessant wird das ganze aber bei

L "Fest_allgemein_Betriebsd".Pumpenleistung_Vorgabe == L "Fest_allgemein_Betriebsd".Pumpenleistung_Aktual

da wird die Leistung wahrscheinlich erhöht, je nach dem welchen Zustand der Taktmerker hat

gruß Thomas
 
Zurück
Oben