# autom. Absiebung bei geringer Gewichtsänderung und dadurch langsamer Istwertänderung



## raz (18 Januar 2021)

Hallo,
ich habe ein vermutlichkleines Problem mit einer Aufgabenstellung und habe noch keinen richtigenAnsatz.
Zur Situation: Ein Behältermit Pulver steht auf einer Waage. Darunter ist eine Rüttelrinne die über eineStromeingang 0-20mA gesteuert werden kann. Darunter ist ein Sieb und darunterwieder ein Container.
Aufgabe ist es die Menge dieüber das Sieb läuft zu steuern. Die Menge wird über ein HMI als Sollwerteigegeben. Die eigentliche Steuerung der Menge erfolgt über die Rüttelrinne.

Nun zum eigentlichen Problem.Die Waage ist eine 1,5t Waage. Das Pulver hat eine sehr spezifische Dichte. D.h.die Abnahme des Pulvers und die daraus folgende Gewichtsänderung ……das dauerteine Weile. Die Rüttelrinne muss mindestens 2min laufen bevor ich eineGewichtsabnahme von 1kg an der Waage habe. (Das ist quasi die Zeitbasis bis icheine auswertbare Gewichtsabnahme von der Waage bekomme.)

Mein Lösungsansatz: Ichschreibe das Startgewicht (Real Zahl ) in ein Merker-Doppelwort (MD1).
Nach 2 min verschriebe ich dasMD Startgewicht in ein nächstes MD2 und lese ein neues Gewicht ein.
Jetzt subtrahiere ich das MD1vom MD2 und habe die Menge die in dieser Zeit durchgelaufen ist und steuere daraufhinmeine Rüttelrinne schneller oder langsamer an, je nach dem wie der Istwert vomSollwert abweicht.

Mir fehlt jetzt so ein bisschender Ansatz zur Lösung. Kann ich einfach zeitgesteuert (2min) die Merkworte hinund her schieben und dann die Subtraktion durchführen oder gibt es eineeinfachere praktikablere Lösung und wie könnte sie eures Erachtens aussehen?

Ist es möglich anschließendden integrierten PID Regler der S7-1200 zur Steuerung zu verwenden? Wie gesagter würde nur alle 2 min einen neuen Istwert bekommen und das ist ein sehr langsamesRegelverhalten.
Oder könnte man daraufverzichten und die Ansteuerung des Analogausgangs (0-20mA) anderweitigrealisieren? 

Danke schon mal.

raz


----------



## Larry Laffer (18 Januar 2021)

Mit einer 1,5 t - Waage (1500 kg !!!) eine Gewichtänderung von 1 kg einigermaßen zu erfassen ist eher ein Schätzen als ein Wiegen.
Du befindest dich hier in einem Bereich der Wägezelle wo diese gar nicht mehr sinnvoll arbeitet - somit ist eine Regelung aus meiner Sicht eher fragwürdig. Da ist jedes Schätzen schon besser ... 8)
Hast du denn nicht die Möglichkeit, das Rüttelband alleine zu verwiegen ? (wobei von den Schwingungen her auch schon nicht ohne)

Was deinen Programmieransatz angeht :
Bedenke bitte, dass das MD1 das MD2 zum größten Teil beinhaltet. Schick wäre hier MD0 und MD4 oder MD2 und MD6 - dann hättest du prinzipiell eine Chance ...

Gruß
Larry


----------



## Frohnius (18 Januar 2021)

hi,
wie lange läuft die anlage denn, bis der behälter leer ist .. so ca ?
ich denke dass deine waage ungeeignet ist um eine regelung sinnvoll zu gestalten ... die auflösung (wenn ich das richtig verstanden habe) von 1kg ist wohl zu wenig.


----------



## Larry Laffer (18 Januar 2021)

Und noch eine Frage :
Was machst du wenn der Behälter mal aufgefüllt wird ? Vor Allem, wenn das ggf, langsam passiert und du keine schlagartige Positiv-Gewichtsänderung bekommst ...?


----------



## Unimog-HeizeR (18 Januar 2021)

Larry Laffer schrieb:


> Mit einer 1,5 t - Waage (1500 kg !!!) eine Gewichtänderung von 1 kg einigermaßen zu erfassen ist eher ein Schätzen als ein Wiegen.
> 
> Gruß
> Larry



Hi Larry

Das sehe ich etwas anders...
Eine Geeichte Waage in Handelsklasse 3 hat in der Geeichten Ausführung i.d.r. 3000 Teilungen.
Das ergibt dann einen Ziffernschritt von 0,5kg.
In ungleicher Ausführung hat so eine Waage einen Ziffernschritt von 0,2kg.
Es gibt natürlich noch genauere Wägezellen mit mehr Teilungen, da wäre dann ein noch kleinerer Ziffernschritt machbar.

Gruß
Timo


----------



## Larry Laffer (18 Januar 2021)

Hallo Timo,
ich habe in der Vergangenheit viel mit Wiege- und Kraftzellen herumgemacht. Eigentlich alle Hersteller empfehlen, den Regel-Betriebsbereich einer Wiegezelle im Bereich > 10 % zu halten - hier sind wir aber bei unter 1 °/oo 
Und du hast ja auch gelsen, was der TE schreibt - es dauert Minuten bis überhaupt etwas erkannt wird ... 
Sorry ...


----------



## Unimog-HeizeR (18 Januar 2021)

Hallo Larry

Da ich in einer Firma Arbeite, die Waagen und Wägezellen baut,
bildete ich mir ein, mich hier ein bisschen auszukennen...
Sorry...


----------



## raz (18 Januar 2021)

Larry Laffer schrieb:


> Und noch eine Frage :
> Was machst du wenn der Behälter mal aufgefüllt wird ? Vor Allem, wenn das ggf, langsam passiert und du keine schlagartige Positiv-Gewichtsänderung bekommst ...?



Es werden immer nur volle Container auf die Waage gestellt. d.h. die Befüllung erfolgt am Boden.


----------



## Blockmove (18 Januar 2021)

@raz

Dein Ansatz geht schon in die richtige Richtung.
Anstelle der MD würde ich die Daten in einen DB schreien und dort ein Array of Real verwenden.
Den PID der 1200er kannst du natürlich auch verwenden und vielleicht einen I-Anteil dazugeben.

Wichtig ist erstmal, dass du dir eine vernünftige Protokollierung deiner Werte schaffst damit du siehst was überhaupt passiert.
Danach kannst du mit den Reglern spielen.

@Larry
<1kg bei einer 1,5t-Zelle kann schon problemlos funktionieren.
Allerdings nicht mit Hufschmidmechanik, 08/15-Wiegezelle und 08/15-Auswertung.

Gruß
Blockmove


----------



## raz (18 Januar 2021)

Hallo, und danke schon mal für die rege Diskussion über mein Problem.
Also die Waage hängt an einem Wäagecontroller der die µV der Messzellen in ein verwertbares Signal umsetzt. Der Wäagecontroller ist per Industrial-Ethernet an die S7-1200 angeschlossen und funktioniert top! Ich kann alles einstellen was man für das wiegen benötigt.(z.B. Tara einstellen,0stellen etc.) Die Auflösung des Wäagecontrollers geht bis 1.Stelle hinter dem Komma, als 0.X kg.Diese Stelle kann ich schlecht verwenden, da sie nicht ruhig stehen bleibt. Durch den Materialabfluß ist sie ständig am zappeln. 
Die Variante von Larry den Waagenwert mehrfach zu schieben um eine größere Differenz zu erhalten hatte ich auch schon und finde es schön wenn andere auch so denken. Werde es wohl so machen.
Bleibt die Frage der Regelung. Wie denkt Ihr über den integrierten PID Regler der S7-1200? Ob das möglich ist meine Rüttelrinne darüber gut zu steuern?

Gruß raz


----------



## raz (18 Januar 2021)

Blockmove schrieb:


> @raz
> 
> Dein Ansatz geht schon in die richtige Richtung.
> Anstelle der MD würde ich die Daten in einen DB schreien und dort ein Array of Real verwenden.
> ...




Array of Real damit hatte ich noch nichts zu tun. Kannst du ganz kurz beschreiben wie du das meinst?


----------



## Unimog-HeizeR (18 Januar 2021)

Das solltest Du mit dem PID Regler in der 1200er hinbekommen.

Gruß
Timo


----------



## Onkel Dagobert (18 Januar 2021)

Wie groß sind denn die zu erwartenden Dosiermengen? Und wie genau muss dosiert werden?

Warum willst du alle x Minuten einen Wert abspeichern? Genauer wird es dadurch nicht. Im einfachsten Fall speicherst du beim Start das Startgewicht und berechnest das Stoppgewicht. Aus diesen beiden Werten bildest du die Differenz, multiplizierst diese mit einem Faktor x, begrenzt das Produkt auf einen MaxWert y und gibst das Ergebnis normiert auf dem Analogausgang aus. Geht dieser Wert gegen Null, nimmst du die Freigabe für die Rüttelrinne weg, falls diese ansonsten auf einem Minimalwert weiter läuft.

Das selbe Ergebnis erreichst du mit einem PID-Regler, welcher als P-Regler parametriert ist. Eine bleibende Regelabweichung kann man bei hinreichend großer Verstärkung vermutlich vernachlässigen. Beim PID-Regler kannst du aber anschließend vorsichtig mit dem I-Anteil spielen, um auf den Punkt genau zu dosieren. Es darf nur nicht über-schwingen.


----------



## Larry Laffer (18 Januar 2021)

Unimog-HeizeR schrieb:


> Da ich in einer Firma Arbeite, die Waagen und Wägezellen baut,
> bildete ich mir ein, mich hier ein bisschen auszukennen...


  und ...


Blockmove schrieb:


> @Larry
> <1kg bei einer 1,5t-Zelle kann schon problemlos funktionieren.
> Allerdings nicht mit Hufschmidmechanik, 08/15-Wiegezelle und 08/15-Auswertung.



Wie ihr meint ... Ich verwiege meine Briefe auch in der Firma immer auf der LKW-Waage ... 8)
Und eine 1,5 t Waage ist Präzisions-Mechanik ... 8)
Wobei ich zugeben muss, dass eine Piezo-Wägezelle möglicherweise einen größeren Spielraum hat als eine DMS-Wägezelle ... was kam hier jetzt zum Einsatz ?

Aber mal Spaß beiseite :
Ich habe so etwas schon mal an den Hacken gehabt - nur ein paar Dimensionen kleiner (eine Puderwaage). Da sollte mit einer Waage, die schätzungsweise 50 kg brutto gewogen hat, mit einer Rüttelrinne (also gleiches Verfahren) einige Gramm Puder ausdosiert werden. Hat auch nicht funktioniert. Der Lieferant hat es nicht hinbekommen und ich dann auch nicht. Letztlich haben wir gut geschätzt, ermittelt, bei welcher Frequenz die Rinne wieviel ausfördert (das war sogar ziemlich linear) und es über den Frequenz-Sollwert gesteuert (!!!). Die Waage diente dann lediglich dazu, den Inhalt des Behälters zu überprüfen und frühzeitig Bescheid zu geben wann nachgefüllt werden muss. Das hat dann hinterher auch richtig gut funktioniert (im Gegensatz zu vorher) - dem Lieferanten hat es allerdings nicht gefallen ...

Gruß
Larry


----------



## Frohnius (18 Januar 2021)

hi,
also wenn deine waage 0,1 kg auflösung hat ... sehe ich das (über einen filter) gar nicht mehr so kritisch ...
nur kann man wohl nicht erwarten, dass das in 3 minuten ausgeregelt ist ...
deshalb die frage .. wie lange es ca. dauert bis so ein container leer ist ...


----------



## Onkel Dagobert (18 Januar 2021)

Frohnius schrieb:


> ... deshalb die frage .. wie lange es ca. dauert bis so ein container leer ist ...


Müsste man nicht besser fragen, welche Masse dosiert werden soll?


----------



## Frohnius (18 Januar 2021)

ja oder so ... aber anscheinend nur ca. 1 kg in etwa 2 minuten ...
wir haben einige siebanlagen in der anlage ... 
die menge in tonnen/ stunde was die jeweilige siebanlage schafft ist bekannt, vom laboranten überprüft, eingestellt - fertig 

den sinn der regelung verstehe ich noch nicht genau ... 
um zu wissen, ob gut genug gesiebt worden ist bleibt ja nur das beproben ....
bei der nächsten charge kann das schon wieder anders sein ...


----------



## Onkel Dagobert (18 Januar 2021)

Aha, ich dachte fälschlicherweise an Dosierung. Es geht aber darum, den Materialfluss zu steuern oder zu regeln.


----------



## Blockmove (19 Januar 2021)

Larry Laffer schrieb:


> und ...
> 
> 
> Wie ihr meint ... Ich verwiege meine Briefe auch in der Firma immer auf der LKW-Waage ... 8)
> ...



Ich hab vor zig Jahren bei einem Bekannten eine Futtermischanlage umgebaut.
Die dort verbauten Teile haben mich hinsichtlich der Auflösung und Genauigkeit überrascht.
Lag bei den von Unimog-Heizer angesprochenen 200g bei 1Tonne.
Kannte ich so vorher auch nicht.


----------



## raz (19 Januar 2021)

Moin,

Rege Diskussion, freut mich. Ja, es geht nicht um eine Dosierung sondern um die Steuerung des  Materialflusses durch das Sieb. Wir reden da von ca.100kg/h bis max.300kg/h die durch das Sieb fließen sollen. So eine Absiebung kann je nach Pulversorte 3-4h dauern. Soweit noch mal zu den Randbedingungen.


----------



## raz (19 Januar 2021)

Onkel Dagobert schrieb:


> Wie groß sind denn die zu erwartenden Dosiermengen? Und wie genau muss dosiert werden?
> 
> Warum willst du alle x Minuten einen Wert abspeichern? Genauer wird es dadurch nicht. Im einfachsten Fall speicherst du beim Start das Startgewicht und berechnest das Stoppgewicht. Aus diesen beiden Werten bildest du die Differenz, multiplizierst diese mit einem Faktor x, begrenzt das Produkt auf einen MaxWert y und gibst das Ergebnis normiert auf dem Analogausgang aus. Geht dieser Wert gegen Null, nimmst du die Freigabe für die Rüttelrinne weg, falls diese ansonsten auf einem Minimalwert weiter läuft.
> 
> Das selbe Ergebnis erreichst du mit einem PID-Regler, welcher als P-Regler parametriert ist. Eine bleibende Regelabweichung kann man bei hinreichend großer Verstärkung vermutlich vernachlässigen. Beim PID-Regler kannst du aber anschließend vorsichtig mit dem I-Anteil spielen, um auf den Punkt genau zu dosieren. Es darf nur nicht über-schwingen.



Das ist ein echt guter Gedankenansatz. Den lasse ich mir bei einer Tasse Kaffee noch mal durch den Kopf gehen und werde das mal durchsimulieren. Danke für den Tipp.

Gruß raz


----------



## Frohnius (19 Januar 2021)

ich würde z.b. ein real array mit 60 messwerten im sekundentakt:
1. rotieren
2. aktuellen wert an die erste stelle schreiben
3. durchschnitt errechnen als istwert für pid-regler

pid regler mit startwert 60 sekunden auf hold beim start ...

für das rotieren des arrays mit beliebiger länge habe ich mir erst kürzlich eine funktion erstellt (mit dem tipp pointer zu verwenden hier aus dem forum)


```
FUNCTION rotateRealArray : BOOL // Rotate Real Array beliebiger Länge um eins nach oben 
VAR_INPUT
	pt: POINTER TO ARRAY [1..32000] OF REAL ;
	size: UINT;
	new:REAL; // Neuer Wert für array[1]
END_VAR
VAR
	i: UINT;
	ende: UINT;
END_VAR

ende:=size/4  ;
FOR i:=ende TO 2 BY -1 DO
 pt^[i]:=pt^[i-1];
END_FOR
pt^[1]:=new;
rotateRealArray:=TRUE;
```

somit kannst du mit aufruf von 
fertig:=rotateRealArray(ADR(a),SIZEOF(a));
nachträglich problemlos abtastrate und zeit anpassen ... unabhängig wie sich die arraygröße ändert ...

mittelwert auch mit pointer ...

```
FUNCTION mittelArray: REAL; // gibt den errechneten mittelwert  des real-arrays zurück
// Aufruf mit mittelwert:=mittelArray(ADR(a),SIZEOF(a));
VAR_INPUT
	pt: POINTER TO ARRAY [1..32000] OF REAL ;
	size: UINT;
END_VAR


VAR
	i:UINT;
	summ: REAL;
	ende: UINT;


END_VAR
ende:=size/4;
summ:=0;
FOR i:= 1 TO ende DO
	summ:=summ+pt^[i];
END_FOR
mittelArray:=summ/UINT_TO_REAL(ende);
```

und dann würde ich erst einmal die istwerte ansehen, was sinnvolle messzyklen und dauer sind


----------



## Onkel Dagobert (19 Januar 2021)

raz schrieb:


> Das ist ein echt guter Gedankenansatz. ...


Natürlich ist er das, passt aber leider nicht zu deiner Aufgabe  !

Ich war irgend wie auf "Dosierung" gekommen. Du aber willst den Materialfluss regeln. Hierfür benötigst du eine entsprechende Regelgröße. Deine Ableitung nach der Zeit ging schon in die richtige Richtung.

Da sich das Gewicht nur sehr langsam ändert, wäre eine hohe Auflösung und ein präziser, langzeitstabiler Verlauf der Messung für diese Regelung schon sehr wichtig. Ansonsten vielleicht besser mit dem Vorschlag von Frohnius (#17) anfreunden.


----------



## Onkel Dagobert (19 Januar 2021)

Da fällt mir noch etwas ein. Du könntest das Gesamtgewicht regeln und den Sollwert von Max bis Min über eine Rampe vorgeben. Ich stelle mir vor, eventuelle Messwertsprünge würden sich über eine vorgegebene Rampe besser ausgleichen, als wenn fortlaufend Differenzen über der Zeit berechnet und geregelt werden.


----------



## Frohnius (19 Januar 2021)

Ja, beides...Den Mittelwert aus Zeit x mit dem letzten Mittelwert... Gibt gewicht/Zeit... Als istwert... 
Aber erst mal messen... Vll liefert ja eine Abtastung alle 500ms über 10s scho vernünftige Werte...


----------



## raz (23 Januar 2021)

Hallo, ich bin erst einmal ein Stück weiter beim probieren.Ich habe mir jetzt erst einmal einen Ringspeicher gebaut mit 60 Messwerten. Also einen DB „Gewichtwerte“ mit einem Array [0..59] im Realformat. Dann ein paar Zeilen im FB von YouTube abgeschrieben und das ganze in einen OB30 (Cyclic interrupt) (1000ms)geschoben. Das funktioniert schon mal gut.Alle Sekunde ein Messwert und das fortlaufend. Schon mal ein Teilerfolg da ich noch nie etwas mit SCL zu tun hatte.Dun habe ich das Problem-wie bekomme ich nun aus dem DB Array einen Mittelwert gebildet? Gibt es da einen fertigen Baustein oder kann man das ggf. in SCL mit ein paar Zeilen realisieren?

Gruss raz


----------



## Larry Laffer (23 Januar 2021)

Du baust dir eine Schleife und addierst damit die einzelnen Messwerte auf. Nach der Schleife dividierst du durch die Anzahl der Messwerte. Wenn dein Baustein nur jede Sekunde einmal durchlaufen wird kannst du das nach jedem Durchlauf machen - das wird dein System nicht über Gebühr belasten ...
Da dur natürlich irgendwann einmal anfängst, dein Array zu befüllen, würde ich mit nach dem "Init" des Bausteins (wo das Array ja alles Nullwerte beinhaltet) merken, wieviele Werte dort bereits hinein geschrieben worden sind und dann entsprechend halt nicht durch 60 sondern durch diue tatsächliche Anzahl von Werten dividieren ...
Brauchst du dafür ein Beispiel ?

Gruß
Larry


----------



## raz (23 Januar 2021)

Das wäre schön, wenn du mir eines geben könntest. das ist natürlich ein anderer Ansatz. Alles addieren über 60sek und dann durch 60 teilen. Macht auch den Durchschnitt.
Ich dachte es gäbe einen fertigen Baustein Namens "Averager" der das für mich komfortabel macht.
Auf der Siemens Seite gibt es eine Anleitung für Step 7 wie man so einem FB man sich basteln kann. Werde dort auch noch mal nachsehen.

raz


----------



## Larry Laffer (23 Januar 2021)

Naja ... du kannst dir natürlich überall so etwas wegkopieren - der Code dafür ist ja kein Hexenwerk. Du kannst dir selbstverständlich auch einen Baustein (so quasi als Universal-Baustein) dafür bauen - alles denkbare ist machbar - der einfachst Code kommt aber dabei heraus wenn du es einfach integrierst ...

```
Array_Gesamt := 0.0 ;
FOR i:= 0 to Anzahl_Werte_im_Array BY 1 DO
   Array_Gesamt := Array_Gesamt + Array_Element[i] ;
END_FOR ;
Array_Mittelwert := Array_Gesamt / INT_to_REAL(Anzahl_Werte_im_Array) ;
```
Zur Erläuterung :
Array_Gesamt und Array_Mittelwert ist ein REAL
Array_Element ist dein Array 
Anzahl_Werte_im_Array ist ein INT und wird von dir beim Auffüllen des Array hochgezählt. Du musst dann hier nur beachten, dass du nicht über 60 kommst. Im Code (beim Befüllen) wäre das dann etwa so :

```
Anzahl_Werte_im_Array := Anzahl_Werte_im_Array +1 ;
if Anzahl_Werte_im_Array > 60 then Anzahl_Werte_im_Array := 60 ; END_IF ;
```
Gruß
Larry


----------



## raz (23 Januar 2021)

Hallo Larry, Danke für die Hilfe. Ich habe wie gesagt noch nie etwas in SCL gemacht und benötige weitere Hilfe.Du siehst ja oben meine paar Zeilen in SCL und den DB dazu.
Ich habe im DB das Array erstellt und den Zähler. Im FC stehen mein Zeilen.
Kann ich jetzt deinen Code so ohne weiteres damit rein basteln?
D.h. das ich für Array_Gesamt und Array_Mittelwert erst noch mal eine REAL Variable in meinem DB anlegen muss. Ist das so richtig?

Bei den Programzeilen nicht wundern das da "Poti Istwert" steht. Der Potiwert kommt von einem Merkerdoppelwort als Realzahl.
Ich habe an die SPS ein Poti am anlogen Eingang angeschlossen um mir Eingangswerte zu simulieren, da ich die Waage im Moment nicht da habe. Funktioniert ganz gut um Werte zu simulieren.


----------



## Larry Laffer (24 Januar 2021)

Also erstmal würde ich dir hierfür ganz dringend einen FB empfehlen. Dieser Baustein hat den Vorteil, dass du alle benötigten Variablen direkt mit ihm "verheiraten" kannst. Du musst halt nur die Variablen, die du wieder benötigst im STAT-Bereich des Bausteins anlegen ...

Nachtrag:
Ich hatte mir deinen Code bisher gar nicht angesehen ... aber ja : du kannst meinen Code da im Prinzip einfach dazubasteln (nur halt die Variablennamen des Arrays anpassen) ...

Gruß
Larry


----------

