TIA Analogwert verarbeiten SCL

EMZ

Level-2
Beiträge
232
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPSler,

bin momentan dabei SCL zu lernen.
Habe bisher nicht viel Erfahrung...


Ich möchste zur Übung einfach einen Analogwert z.B. Temperatur erfassen und ab bestimmte Unter-/ Obegrenzen ein digitalen Ausgang ein und ausschalten.

Ich habe schonmal einbisschen angefangen aber bin mir nicht sicher wie richtig es ist.
Mein Problem ist, dass ich diese ganze Sache nur simuliert testen kann.
ich weiß allerdings nicht, wie ich bei PLCSIM einen analogen Eingang simulieren kann.

Jemand evtl. ratschläge und tipps ?


Hier noch mein SCL CODE:


Code:
Input                    
    Temperatur_1_Ist_wert    Real    0.0    0.0    True    
    
    Output                    
    Ausgang Anzeige_1    Bool    6.0    false    True    
    Ausgang Anzeige_2    Bool    6.1    false    True    
                        
    InOut                    
                        
    Static                    
    obergrenze    Int    8.0       520    True    
    untergrenze    Int    10.0    500    True    
                        


IF #Temperatur_1_Ist_wert < #untergrenze THEN
  #"Ausgang Anzeige_1" := true;
ELSE IF #Temperatur_1_Ist_wert =512 THEN
    #"Ausgang Anzeige_1":=false;
    END_IF;
    
    IF #Temperatur_1_Ist_wert > #obergrenze THEN
      #"Ausgang Anzeige_2" := true;
    ELSE IF #Temperatur_1_Ist_wert = 512 THEN
        #"Ausgang Anzeige_2" := false;
         END_IF;
       END_IF;
END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
    Static                    
    obergrenze    Int    8.0       520    True    
    untergrenze    Int    10.0    500    True    

...
ELSE IF #Temperatur_1_Ist_wert =[COLOR=#ff0000]512[/COLOR] THEN
...
    ELSE IF #Temperatur_1_Ist_wert = [COLOR=#ff0000]512[/COLOR] THEN
...
Warum hast Du die 512 im Code nicht durch eine Variable dargestellt, wie Du es bei der Unter- oder Obergrenze völlig zu recht getan hast?
Wenn Du Deine Unter- oder Obergrenze anpassen musst, kannst Du diese direkt in der Bausteinschnittstelle ändern. Die 512 ist aber auch von diesen beiden abhängig. Im jetzigen Zustand musst Du also Dein Programm durchforsten und es besteht immer die Möglichkeit, das Du vlt. eine Stelle übersiehst und somit dann hinterher u.U. eine Fehlfunktion hast.

Besser ist es also, alle solche Werte durch Variablen darzustellen oder wenn möglich, sogar zu berechnen.
 
Was die "512" darstellen sollen hab ich mich auch schon gefragt.
Vom Code her sieht es ja aus als wäre das dein "OK-Wert"...

Aber warum mit "="?

Bei einem reellen Analogwert kann's gut sein das der Wert von 513 auf 511 geht...
Obwohl du hier wahrscheinlich nur einen KLIMA-RTD PEW-Wert nach REAL konvertiert hast. Gibt wenigsten nicht viele Kommastellen.
Wenn man bei anderen Anwendungen dann noch ein paar mehr Kommastellen hätte... ;)

Du kennst doch das Real-Kredo..
10.0 * 1.0 / 10.0 != 1.0
 
Was die "512" darstellen sollen hab ich mich auch schon gefragt.
Vom Code her sieht es ja aus als wäre das dein "OK-Wert"...
Ich vermute, einfach ein beliebig gewählter Wert ungefähr in der Mitte zw. 500 (Untergrenze) und 520 (Obergrenze).



Aber warum mit "="?
Weil er Anfänger ist und ihm daher die Erfahrung fehlt?
;)



Du kennst doch das Real-Kredo..
10.0 * 1.0 / 10.0 != 1.0
Vermutlich erst jetzt.
:ROFLMAO:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmals danke für die schnelle Antwort.

Ich bin schon froh dass es vom Programmaufbau keine fatalen fehler hat.

Was kann statt "=" denn hin??

Ja die werte sind nur frei gewählte werte.

Du kennst doch das Real-Kredo..
10.0 * 1.0 / 10.0 != 1.0.

Was darf ich darunter verstehen ?
:D
 
Zuletzt bearbeitet:
Ich bin schon froh dass es vom Programmaufbau keine fatalen fehler hat.
Auch wenn SCL einen Programmierer ziemlich leicht verführt, ohne große Vorüberlegung schnell ein paar IF... hinzutippseln, so muß man sich trotzdem um vollständige Logik bemühen, die immer zu einem geordneten Ergebnis führt, wozu nach Möglichkeit der Code zu unbedingten (immer ausgeführten) Zuweisungen umgeformt werden sollte.

Deinen Ausgängen wird nur etwas zugewiesen wenn Deine Temperatur außerhalb der Grenzwerte liegt (oder genau 512 ist). Wenn aber nichts zugewiesen wird - welchen Wert sollen die Ausgänge dann haben? In einer Function (FC) ist der Ausgang dann unbestimmt, in einem Function_Block (FB) hat er den Wert von der letzten Zuweisung, wird aber von TIA trotzdem angemeckert. Wenn ein Ausgang als Merkvariable benutzt wird dann muß er als IN_OUT deklariert werden.

Beschreibe doch mal, welche Funktion Dein Testprogramm haben soll.

Harald
 
Was kann statt "=" denn hin??
<= zum Rücksetzen des Max-Alarm
>= zum Rücksetzen des Min-Alarm


10.0 * 1.0 / 10.0 != 1.0.
Was darf ich darunter verstehen ?
Hahahaha... Da hab ich dich wohl verwirrt. :ROFLMAO:

Das beruht auf der prinzipbedingten Ungenauigkeit in der Zahldarstellung im IEEE754-Gleitpunktformat.
Nehmen wir zum Beispiel die Zahl 474.5, dann wird diese in Wirklichkeit wie folgt gespeichert:
2^8 * (1+ 1/2 + 1/4 + 1/16 + 1/32 + 1/128 + 1/512). Entspricht 2^8 * 1.853515625 -> ergibt genau 474.5
(Geht rauf bis 1/8388608 )

Diese Darstellung deckt einen sehr großen Teil der reellen Zahlenmenge ab, hat aber auch eine Ungenauigkeit.
Ein schönes Beispiel für diese Ungenauigkeit ist die Gleitpunktzahl 0.1
Reale Darstellung: 2^(-4) * 1.600000023841858
Laut IEEE754(Real) ist das 0.1, rechnet man es aber mit einem genaueren Format (Double) nach, bekommt man 0.10000000149011612.

In gewissen Fällen kann es dazu kommen dass man z.B. einen Wert nimmt, ihn mehrmals so verrechnet das am Schluss wieder der Anfangswert rauskommen sollte, man aber stattdessen den Ursprungswert mit einem Kommafehler (Ungenaugkeit) präsentiert bekommt.
Glücklicherweise ist das sehr selten.
In der Praxis hat mir das Real-Format schon ein paar mal Probleme gemacht (Endloszähler mit Real und 0.001 als Inkrementalwert)
Es reicht wenn man immer ein leichtes Misstrauen gegenüber dem REAL-Format im Hinterkopf hat, dann passt es. ;)

Wenn du noch mehr drüber lernen willst kannst du HIER selbst Hand anlegen.





@hucki eins weiter unten: Ja das war ein Rest.... weg isser! Und gleich noch ein paar andere "elegante" Formulierungen entfernt. :)
 
Zuletzt bearbeitet:
Hi ,

mir geht es bei der programmierung rein darum, mit analogwerten zu arbeiten.
die Funktion die ich haben wollte war die, dass ich eine Temperaturmessung habe. Wird die obere grenze überschritten, soll der Ausgang_1 schalten
Das selbe für die untere grenze nur an Ausgang_2.
Diese sollen dann z.B. eine einfache Regelstrecke darstellen, die über die dig. Ausgänge angesteuert wird.

Als weitere Funktion möchte ich dass zwei Analogausgänge programmieren, die mir den aktuellen Istwert herausgeben, damit habe ich allerdings noch nicht angefangen,
da ich nicht genau weiß wie ich einen analgen ausgang zuweise etc.
mache ich zum ersten mal, deshalb will ich dabei step for step vorangehen.


LG
EMZ

Danke im voraus für jegliche Hilfe :)))
 
Zuletzt bearbeitet:
Als weitere Funktion möchte ich dass zwei Analogausgänge programmieren, die mir den aktuellen Istwert herausgeben, damit habe ich allerdings noch nicht angefangen,
da ich nicht genau weiß wie ich einen analgen ausgang zuweise etc.

Du weist die Analogen Ausgänge genau so zu wie alle anderen Ausgänge


Code:
Input                    
    Temperatur_1_Ist_wert    Real    0.0    0.0    True    
    
    Output                    
    Ausgang Anzeige_1    Bool    6.0    false    True    
    Ausgang Anzeige_2    Bool    6.1    false    True
[B]    Ausgang_Ist_wert_1   Real
    Ausgang_Ist_wert_2   Real[/B]
                        
    InOut                    
                        
    Static                    
    obergrenze    Int    8.0       520    True    
    untergrenze    Int    10.0    500    True    
                        


IF #Temperatur_1_Ist_wert < #untergrenze THEN
  #"Ausgang Anzeige_1" := true;
ELSE IF #Temperatur_1_Ist_wert =512 THEN
    #"Ausgang Anzeige_1":=false;
    END_IF;
    
    IF #Temperatur_1_Ist_wert > #obergrenze THEN
      #"Ausgang Anzeige_2" := true;
    ELSE IF #Temperatur_1_Ist_wert = 512 THEN
        #"Ausgang Anzeige_2" := false;
         END_IF;
       END_IF;
END_IF;
     
[B]Ausgang_Ist_wert_1 :=   Temperatur_1_Ist_wert;
Ausgang_Ist_wert_2:=   Temperatur_1_Ist_wert;[/B]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi!

Deine Variablendeklaration stimmt meines erachtens nicht. Schau dir mal in der SCL-Hilfe an, wie das richtig aussehen soll.

Wenn du mit dem IF auf deine Ober- und Untergrenze vergleichst, brauchst du nur noch einen ELSE-Zweig in dem du den Anzeigeausgang wieder auf false setzt. Ein weiterer Vergleich ist hier unnötig.

Zudem solltest du deine Code-Einrückungen konsequenter machen. Ein IF-Block z.B. hat immer auf der selben Höhe zu sein, dessen Inhalt wird um einen Tab weiter eingerückt.


Gruß,

Ottmar
 
Deine Variablendeklaration stimmt meines erachtens nicht. Schau dir mal in der SCL-Hilfe an, wie das richtig aussehen soll.
Das ist von der TIA-Deklaration nur abgeschrieben (Copy & Past geht ja leider nicht mehr so einfach) und nicht als Quelle exportiert. Deshalb sieht das immer so komisch aus. Und Abschreibfehler können sich dabei natürlich auch mal einschleichen.
Da sollten wir also großzügig drüber hinweg sehen.
;)
 
Also das programm habe ich selbst geachrieben ...heisst von niemanden abgeschaut. Das einzige was ich nachgegooogelt habe sind, als welcher datentyp analogwerte deklariert werden.
Also ich habe jetzt unter einfügen ->alllgemein das eingefügt..und was muss ich dann beim simulieren an meinen eingang istwert deklarieren damit ich diese bei ser simu ändern kann?

Noch eine frage... Ich will z.b. das ganze über einen 0-10V wert auswerten.
Wie kann ich jetztbdas so skalieren, dass 0-10V zum beispiel den wert 400-520 oder so haben?

Lg
EMZ

Danke für eure Hilfe
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist von der TIA-Deklaration nur abgeschrieben (Copy & Past geht ja leider nicht mehr so einfach)
Also das programm habe ich selbst geachrieben ...heisst von niemanden abgeschaut.
Ich hab' ja auch nicht geschrieben, dass Du das von jemanden sondern dass Du das aus Deiner TIA-Deklarationstabelle (die Variablentabelle über Deinem Programmcode) abgeschrieben hast.
;)

Wenn Du Deinen Baustein als Quelle exportieren würdest, sehe die Deklaration wie bei SCL unter S7 Classic aus:
Code:
VAR_Input
    Temperatur_1_Ist_wert : Real;    
END_VAR
    
VAR_Output                    
    Ausgang Anzeige_1 :  Bool ;    
    Ausgang Anzeige_2 : Bool ;
    Ausgang_Ist_wert_1 : Real ;
    Ausgang_Ist_wert_2 : Real ;
END_VAR
                        
VAR_Static                    
    obergrenze : Int ;    
    untergrenze : Int ;
END_VAR

...
In der Quelle (Textdatei mit scl-Endung) kannst Du dann den ganzen Code einschließlich Deklaration und Einrückungen in einem Rutsch markieren (STRG+A), kopieren (STRG+C) und hier einfügen (STRG+V), was die Sache natürlich erheblich einfacher macht.
 
Zuletzt bearbeitet:
Dann hab ich dich falsch verstanden

Und wie mach ich das, dass ich meine bausteine als quelle exportiere?

Und wie mache ich das mit der 0-10v skalierung ?
Dass meine 0-10 Volt z.B. 400-520 sind?

LG
EMZ

PS: gibt es eine anleitung, wie ich bei simatic manager v5.5 scl verwenden kann??
Weil unter Quelle steht bei mir nur fup,kp,awl?
 
Und wie mach ich das, dass ich meine bausteine als quelle exportiere?
Baustein in der Projektnavigation mit rechts anklicken. Im aufgehenden Kontextmenü ist der 2. Eintrag "Quelle aus Bausteinen generieren".

Die Datei, die dann angelegt wird, kann man einfach mit dem Editor/Notepad öffnen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und wie mache ich das mit der 0-10v skalierung ?
Dass meine 0-10 Volt z.B. 400-520 sind?
Was meinst du?
Wie man einen 0..10V Analogwert generell einließt und verarbeitet?
Dazu der FAQ-Artikel: Analogwertverarbeitung
Da stehen alle Grundlagen die du Wissen musst drinnen.

Hier noch ein paar hilfreiche Links:
Empfehlung Link 1 mit TIA-Bordmitteln
Empfehlung Link 2 mit FCs und simpler Formel
 
Zuletzt bearbeitet:
Danke für eure Hilfe,
Versteh ich das so, dass wenn ich eine analogeingabebaugruppe mit 8bit habe und anschließe, dass ich z.B. einen temperaturfühler nur anschließend muss (0-10V)
Und die sps wertet dann von 0V= wertigkeit 0 bis10V = wertigkeit265 automatisch aus?
 
Zurück
Oben