TIA Silo Linearisierung programmieren

Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank an alle.
das landet dann ja schlussendlich alles im I-DB des Bausteins und du hast alles zusammen ...
Ja das stimmt, dann mach ich das so. Muss ich nächstes Wochenende weitermachen, muss auch mal ins Bett.
Hier schon mal das Netzwerk für den Zylinder.
Dankeschön, meines schaut fast so aus, nur hab ich leider die Sonde auf Füllstand eingestellt. Bei mir wird 0,0 angezeigt, wenn der Silo leer ist,
hat das bestimmte Gründe, dass man das umgekehrt einstellt?
Wenn ich nächstes Wochenende eine SCL Lösung zusammenbringe, brauchst du dich nicht mehr mit dem umschreiben bemühen.
 
na ja: Physikalisch ist das 0 bei leerem Silo sicher kein Fehler (mach ich meist auch so) da das bei Problemen meist leichter zur Fehlersuche ist (Messwert Sonde mit Peglestab, . . . vergleichen)
Im Programm/HMI wird dann skaliert, da sollte dann deine Umrechnung stattfinden.
parallel könnte man ev. noch den Füllstand als mm, cm, m (was halt besser passt) ausgeben -> wie oben Fehlersuche vereinfachen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dankeschön, meines schaut fast so aus, nur hab ich leider die Sonde auf Füllstand eingestellt. Bei mir wird 0,0 angezeigt, wenn der Silo leer ist,
hat das bestimmte Gründe, dass man das umgekehrt einstellt?
Kommt auf die Sonde an.

Wenn du den 0-Abgleich an der Sonde direkt eingeben kannst, macht eine direkte Ausgabe der Füllhöhe durchaus Sinn.
Am besten den Einstellwert im Schaltplan vermerken, die Instandhaltung ist für sowas meist Recht dankbar.

Gibt aber auch Sensoren die du nur teachen kannst.
Beim Austauschen des Sensors ist das dann ggf. doof, wenn du erst einmal das Silo leer brauchst um den Sensor korrekt einzurichten.
Bei solchen Fällen nehme ich vom Sensor die Grundkonfiguration (für gewöhnlich Abstand Sensor zu Füllgut) und rechne in der SPS auf den Füllstand um.
Wie @winnman richtigerweise empfohlen hat am besten noch zusätzlich irgendeine größe angeben, die man ohne großen Aufwand gegenprüfen kann.
 
Grüß euch noch schnell vor Weihnachten,
so, es ist endlich geschafft. Habs doch im FUP geschrieben, weil ich nicht jetzt SCL lernen will, kommt sicher auch noch.
Hallo grüß dich kiar, ich glaube, dass bei deinem Code zwar der Konus berechnet wird, wenn er voll ist, aber z.B. halb leer
hab ich einen anderen r1.Das habe ich mit Linearisierung gemeint. Ich habe das wie gesagt mit dem INVENTOR gezeichnet
und berechnet. Diese "Linearzugabe" (NW2) ändert mit der Formel h * 0,5536 +r2 den r1.
Das einzige was ich noch mach wenn ich mal Zeit hab, ist, mir was zum Einschüttkegel und zum Auslauftrichter einfallen zu lassen.
Oder hat von euch schon wer sowas gelöst?
 

Anhänge

  • Bildschirmfoto 2023-12-24 um 11.29.30.png
    Bildschirmfoto 2023-12-24 um 11.29.30.png
    873,6 KB · Aufrufe: 29
aber wenn du schon einen FB hast dann kannst du deine Variablen auch sehr schön im STAT-Bereich desselben anlegen
Der DB ist dann doch geblieben, weil er ja schon da war, das war einfacher. Aber für das nächste Mal ist das ein guter Tipp.
Vielen Dank für die Hilfe und allen ein schönes Weihnachtsfest.
 

Anhänge

  • Bildschirmfoto 2023-12-24 um 11.32.00.png
    Bildschirmfoto 2023-12-24 um 11.32.00.png
    689,3 KB · Aufrufe: 20
Zuviel Werbung?
-> Hier kostenlos registrieren
So ich hab mich bemüht, einen SCL Code zu schreiben. Da ich sowieso den Schüttkegel und den Leerlauftrichter einrechnen und anzeigen will, hat sich das gleich angeboten. In der Simulation funktioniert alles hervorragend. Meine Frage nun an euch: kann man den Code so schreiben oder sollte das anders aussehen? Ich frage deshalb, weil ich insgesamt 4 identische Silos hab, da soll es jetzt verbessert werden, wenns nicht gut ist. Danke

Code:
REGION HMI Anzeige Silo 1
  IF
                // Diese 2 Variablen sind bei Füllen Silo 1 true und setzen ("Silovolumen".Füllen_Setzen_Silo1 := TRUE) auf true und startet das Dazurechnen des Schüttkegels zum Silovolumen
    "Siloanlage_Füllen"."Füllen_Silo1,2,3,4_OK" AND "DrehrohrSilo1END_Schliesser_NO" THEN
    "Silovolumen".Füllen_Setzen_Silo1 := TRUE;
  ELSIF "Siloanlage_Leeren"."Leeren_Silo1,2,3,4_OK" AND "Siloanlage_Leeren".L_FLIPFLOP[0] OR "Siloanlage_Leeren".L_FLIPFLOP[1] OR "Siloanlage_Leeren".L_FLIPFLOP[2] THEN
    "Silovolumen".Füllen_Setzen_Silo1 := FALSE;
  END_IF;
  IF
             // Diese 2 Variablen sind bei entleeren Silo 1 true und setzen ("Silovolumen".Leeren_Setzen_Silo1 := TRUE) auf true und startet das Abrechnen der Leerlauftrichters vom Silovolumen
    "Siloanlage_Leeren"."Leeren_Silo1,2,3,4_OK" AND  "Siloanlage_Leeren".L_FLIPFLOP[0] OR "Siloanlage_Leeren".L_FLIPFLOP[1] OR "Siloanlage_Leeren".L_FLIPFLOP[2] THEN
    "Silovolumen".Leeren_Setzen_Silo1 := TRUE;
    ELSIF "Siloanlage_Füllen"."Füllen_Silo1,2,3,4_OK" AND "DrehrohrSilo1END_Schliesser_NO" THEN;
    "Silovolumen".Leeren_Setzen_Silo1 := FALSE;
  END_IF;
 
  IF
      // Wenn Elevator 1 läuft und Drehrohr auf Silo 1 steht, wird der Schüttkegel dazugerechnet und im HMI angezeigt
    "Silovolumen".Füllen_Setzen_Silo1   THEN
    "Silovolumen".Schüttkegel_Silo_1 := (("Silovolumen".r1Kegelstumpf_Quadrat_1 * "Silovolumen".pi * (2 * "Silovolumen".r1Kegelstumpf_1 / 3.2) / 3) / 2);
    "Silovolumen"."Volumen+Schüttkegel_Silo_1" := "Silovolumen".Volumen_Silo1 + "Silovolumen"."Schüttkegel_Silo_1";
    "Silovolumen".HMI_Anzeige_Silo_1 := "Silovolumen"."Volumen+Schüttkegel_Silo_1";
    
    ELSIF "Silovolumen".Leeren_Setzen_Silo1  THEN
    
      // Wenn Elevator 2 läuft und leeren Silo 1 ("Siloanlage_Leeren".L_FLIPFLOP[0], L_FLIPFLOP[1], L_FLIPFLOP[2]) läuft,
      // wird der Leerlauftrichter abgerechnet und im HMI angezeigt
    "Silovolumen".Leerlauftrichter_Silo_1 := (("Silovolumen".r1Kegelstumpf_Quadrat_1 * "Silovolumen".pi * (2 * "Silovolumen".r1Kegelstumpf_1 / 4.5) / 3) / 2);
    "Silovolumen"."Volumen-Leerlauftrichter_Silo_1" := "Silovolumen".Volumen_Silo1 - "Silovolumen".Leerlauftrichter_Silo_1;
    "Silovolumen".HMI_Anzeige_Silo_1 := "Silovolumen"."Volumen-Leerlauftrichter_Silo_1";
 
  ELSE
     //Wenn beide Bedingungen erfüllt sind, nämlich gefüllt und geleert wird, oder ausgeschaltet ist, soll das lineare Volumen des Silos angezeigt werden
    "Silovolumen".HMI_Anzeige_Silo_1 := "Silovolumen".Volumen_Silo1;
  END_IF;

END_REGION
 
Ich frage deshalb, weil ich insgesamt 4 identische Silos hab, da soll es jetzt verbessert werden, wenns nicht gut ist.
Ohne mal auf deinen Code einzugehen, wenn du vier volkommen identische Silo´s hast, bei denen auch alles gleich behandelt werden soll, dann würde ich die Variablen alle als Array aufbauen und dann den Code in einer For-Schleife abarbeiten.

Also statt z.B.
Code:
"Silovolumen".Füllen_Setzen_Silo1
so:
Code:
"Silovolumen".Füllen_Setzen_Silo[1]

Dann den gesammten Code in eine FOR Schleife und alle Variablen indexieren.
Code:
FOR i := 1 TO 4 DO
    ... dein Code
    "Silovolumen".Füllen_Setzen_Silo[i] ....
    ... dein Code
END_FOR;

Ansonsten:
Wenigstens Umlaute und Sonderzeichen aus den Variablennamen entfernen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@DeltaMikeAir und @Mrtain haben soweit die gröbsten Punkte angesprochen.

Für die Einrückungen gibt es oben in der Tool-Zeile einen Button um die Einrückungen automatisch anzupassen.
Code markieren => Button drücken => deutlich übersichtlicher.

Wenn du solche Silos öfters hast, könnte es auch Sinn machen die ganze Berechnungsformel in einen eigenen FC zu packen.
Macht das Abspeichern in Bibliotheken einfacher.
Den kannst du dann auch innerhalb einer Schleife wiederholt mit neuen Aktualparametern aufrufen.

Und schau dir Mal im Siemens Programmierleitfaden die Empfehlungen zu Variablennamen an.
 
Für die Einrückungen gibt es oben in der Tool-Zeile einen Button um die Einrückungen automatisch anzupassen.
Guten Abend,
nach dem Hinweis von Mrtain hab ich gleich gesucht und den Button gefunden und formatiert.
dann würde ich die Variablen alle als Array aufbauen und dann den Code in einer For-Schleife abarbeiten.
leider hab ich den Code bereits fertig, aber ein paar Arrays hab ich noch aufgebaut. Das mit der FOR Schleife muss ich mir mal mit einem kleinen Code erarbeiten, der hier ist dazu etwas zu umfangreich. Die Namen der Variablen hab ich bis jetzt immer so gemacht wie mans eben schreibt,
da werde ich jetzt besser aufpassen.
Dankeschön für eure Tipps.
Viel Glück und Freude im Neuen Jahr
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Normalerweise bin ich morgen eh früh fit, weil ich nichts trinke, da ist es auch ruhig und da geht am meisten weiter. Da probier ich dann zu optimieren. Hab ich das richtig verstanden, in FOR arbeite ich den Code für ein Silo vier mal hintereinander ab, nur eben mit den Array Variablen mit den entsprechenden Nummern zu den Silo Nummern passend.
Dankeschön und allen Glück und Freude im Neuen Jahr von Franz
 
Hab ich das richtig verstanden, in FOR arbeite ich den Code für ein Silo vier mal hintereinander ab, nur eben mit den Array Variablen mit den entsprechenden Nummern zu den Silo Nummern passend.
Eine For Schleife wird in der vorgegebenen Anzahl durchlaufen.
Bei z.b. For i := 1 TO 4 DO also 4x. Die Variable i ( INT ) hat beim ersten Durchlauf die Wertigkeit 1, beim zweiten 2....

Wenn du statt 1,2,3,4 z.b. 2,4,6,8 benötigst, dann lautet der Code:
FOR i := 2 TO 8 BY 2 DO

Die Hilfsvariable i nutzt du innerhalb der FOR Schleife zum indexieren der einzelnen Variablen ( DeineVariable[ i ] ).
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend, wollte einen strukturierten Code schreiben und zwar mit Region Region End. Das funktionierte aber nur für den ersten Silo, als ich die zweite, dritte und vierte Region dranhängte, ging das Übersetzen nicht mehr (Interner Fehler). Dann hab ich die Regions gelöscht und alles lief. aber ich hätte es gern übersichtlich, Wie arbeitet man mit diesem Tool?
 
Ja genau das hab ich in der Hilfe gesehen, glaub das ich das auch so gemacht hab, hat aber internen Fehler gemeldet, als es dann 4 Regions waren. Wollte dann nicht weiter rumspielen um den Code nicht zu ruinieren. Gibt es irgendwelche Vorgaben, Abstände oder so?
 
Tia hat ein Problem damit wenn die Strukturierung mit Regions sich über mehrere Teile einer Funktion erstreckt.

Code:
Case #i of
   1:
     Region Test
         //Code
     End_Region Test
   2:
     //Noch mehr Code
END_Case;

Das funktioniert zum Beispiel.
Genauso funktioniert es das komplette Case mit einer Region zu umschließen.
Was aber nicht funktioniert wäre folgendes:

Code:
Case #i of
   1:
     Region Test
         //Code
   2:
     //Noch mehr Code
     End_Region Test
END_Case;

Hier Beginnt die Region "Test" in "1", endet aber erst in "2".
Sowas mag TIA gar nicht.
 
Zurück
Oben