-> Hier kostenlos registrieren
Ich muss morgen selber schauen, was ich da fabriziert hab und meld mich dann. Dein Code leuchtet mir jedenfalls ein.
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
Moin,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.
Der Baustein berechnet nur etwas und muss sich nichts merken: typische Anwendung für eine FUNCTION (FC)Ich hab tatsächlich einen SCL FB geschrieben
Grüß dich klar,Moin,
Das ist Korrekt. Ich habe mich nochmal rangemacht, über den Code gebeugt und das noch angepasst.
Da könnte ich tatsächlich eine Erklärung brauchen. Ich schreibe fast alles in FBs, weil ich damit immer gut gefahren bin. Hat das Nachteile oder gibt es Regeln was mit FC oder FB zu programmieren ist.Der Baustein berechnet nur etwas und muss sich nichts merken: typische Anwendung für eine FUNCTION (FC)
Da könnte ich tatsächlich eine Erklärung brauchen. Ich schreibe fast alles in FBs, weil ich damit immer gut gefahren bin. Hat das Nachteile oder gibt es Regeln was mit FC oder FB zu programmieren ist.
Franz
FUNCTION "Volumen_Silo" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
h_sensor : Real;
END_VAR
VAR_OUTPUT
V_gesamt : Real;
END_VAR
VAR_TEMP
h_temp : Real;
r_level : Real;
V_zylinder : Real;
V_kegelstumpf : Real;
END_VAR
VAR CONSTANT
r1 : Real := 1.75;
r2 : Real := 0.2;
h1 : Real := 7.0;
h2 : Real := 2.8;
pi : Real := 3.14;
END_VAR
BEGIN
#V_zylinder := 0.0;
#V_kegelstumpf := 0.0;
IF #h_sensor <= #h1 THEN
#V_zylinder := (#pi * SQR(#r1) * (#h1 - #h_sensor));
#V_kegelstumpf := ((#r1 * #r2) + SQR(#r1) + SQR(#r2)) * #h2 * #pi * 1 / 3;
ELSE
#h_temp := #h2 - (#h_sensor - #h1);
#r_level := (#r1 - #r2) * #h_temp / #h2 + #r2;
#V_kegelstumpf := ((#r2 * #r_level) + SQR(#r_level) + SQR(#r2)) * #h_temp * #pi * 1 / 3;
END_IF;
#V_gesamt := #V_zylinder + #V_kegelstumpf;
END_FUNCTION
Ein FB muss immer zusätzlich eine Instanz haben (Multiinstanz oder eigenen Instanz-DB), auch wenn er gar keine lokalen Variablen oder Aufrufparameter hat (von tricky Aufrufen in AWL abgesehen). Da können schon mal DB-Nummern knapp werden. Auf FB-Übergabeparameter kann man global zugreifen, entweder um bequem per Variablentabelle zu beobachten oder um dirty Sachen zu machen. In FB muss man sehr umsichtig vorgehen, wenn man das AR2-Register verwenden will (enthält den Multiinstanz-Offset, den der Programmcode beim Zugriff auf lokale Instanz-Variablen benötigt).Ich schreibe fast alles in FBs, weil ich damit immer gut gefahren bin. Hat das Nachteile oder gibt es Regeln was mit FC oder FB zu programmieren ist.
y := FUNCTION(x);
mit Rückgabewert verwendet. Dann kann man den Rückgabewert in SCL direkt zum Verknüpfen oder Weiterrechnen verwenden. Z.B. so einen Silo-Volumen-Berechnungsbaustein, der nur eine Formel berechnet, den könnte man in SCL dann so verwenden:Gesamtvorrat_m3 := MySiloVol(Fuellhoehe := Fh_Silo1) + MySiloVol(Fuellhoehe := Fh_Silo2) + MySiloVol(Fuellhoehe := Fh_Silo3);
FUNCTION "MySiloVol" : REAL
VAR_INPUT
Fuellhoehe : REAL;
END_VAR
BEGIN
MySiloVol := Fuellhoehe * .... ; //irgendeine Formel ... für Rückgabe des Volumens
END_FUNCTION
würde ich so schreiben (ohne Output, aber dafür Return-Wert):Code:FUNCTION "Volumen_Silo" : Void { S7_Optimized_Access := 'TRUE' } VERSION : 0.1 VAR_INPUT h_sensor : Real; END_VAR VAR_OUTPUT V_gesamt : Real; END_VAR ... BEGIN ... #V_gesamt := #V_zylinder + #V_kegelstumpf; END_FUNCTION
FUNCTION "Volumen_Silo" : Real
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
h_sensor : Real;
END_VAR
...
BEGIN
...
#"Volumen_Silo" := #V_zylinder + #V_kegelstumpf;
END_FUNCTION
??? Hast du mal ein Bild davon? Für welche CPU ist der Code - für die CPU 317?Alle vier Quadrieroperationen sind gelb mit drei Fragezeichen.
(...)die Fragezeichen sind geblieben
SQR(#r1)
auch einfach schreiben (#r1 * #r1)
Stimmt, ist eigentlich logisch. Hab es umgeschrieben und alles passt.Übrigens kann man anstattSQR(#r1)
auch einfach schreiben(#r1 * #r1)
Dankeschön kiar, dein Code ist viel kompakter als meiner, den bau ich in meinen Baustein ein. Eine kleine Änderung war notwendig, mein Sensor ist ja umgekehrt eingestellt, er ist bei Silo leer null.hier als FC
Wir verwenden essentielle Cookies, damit diese Website funktioniert, und optionale Cookies, um den Komfort bei der Nutzung zu verbessern.
Siehe weitere Informationen und konfiguriere deine Einstellungen