Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 26

Thema: Structured Text gemäß IEC 61131-3)

  1. #11
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    752
    Danke
    27
    Erhielt 165 Danke für 143 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Dem ist nicht viel hinzuzufügen.
    Zitat Zitat von Ralle Beitrag anzeigen
    Deine FB ist so aufgebaut, dass er immer, wenn ein neuer Wert eingelesen werden soll genau einmal aufgerufen wird, ist das so gewollt? Wenn nicht wäre noch eine Eingang möglichm der dann im FB über eine Flankenbildung den Eintrag und die Berechnung veranlaßt.
    Wie weit man die strikt zyklische Bearbeitung des gesamten Programms durch bedingte FB-Aufrufe aufweicht, ist sicher eine Frage der Philosophie. Für diesen FB würde ich schon einen bedingten Aufruf vorziehen, denn wenn kein neuer Messwert eingetragen werden muss, hat der FB ja auch nichts weiter zu tun.
    Zitat Zitat von Ralle Beitrag anzeigen
    Ich würde den Mittelwert jedes Mal berechenen, du hast ja praktisch einen Ringbuffer gebaut, so dass immer ein alter Wert überschrieben wird.
    Das muss er sogar, denn genau das ist doch die Aufgabenstellung. Dabei kann man auch gleich überlegen, ob man unbedingt den "index_read" braucht. Schliesslich zeigt "index_write" vor dem Überschreiben auf genau den ältesten Wert, den man zunächst von der Summe abziehen muss.
    Zitat Zitat von Ralle Beitrag anzeigen
    Aufpassen, du mußt dann am Anfang einen Zählwert mitführen, wie viele Werte du überhaupt schon im Buffer hast, da ja bei den ersten (z.Bsp. 4) Werten nicht durch "IN_ucFitergrad" getteilt werden darf, sondern nur durch 4!
    Dieser Zählwert, sozusagen der Füllstand des Ringpuffers, könnte auch für den Anwender interessant sein. Ich würde ihn deshalb auch als VAR_OUTPUT deklarieren.

  2. Folgender Benutzer sagt Danke zu StructuredTrash für den nützlichen Beitrag:

    megni (10.06.2013)

  3. #12
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.620
    Danke
    777
    Erhielt 647 Danke für 493 Beiträge

    Standard

    Zitat Zitat von MasterOhh Beitrag anzeigen
    Du brauchst nen Array und ne FOR-Schleife.
    Ist der Befehl MEMMOVE erlaubt?
    Braucht man für die Aufgabenstellung überhaupt ein Array bzw. Ringbuffer?
    ich hätte das jetzt so gemacht:
    Mittelwert := LetzterMittelwert + ((Messwert - LetzterMittelwert) / AnzMesswerte);

    und jedesmal wenn ein neuer Wert in eingeschoben werden soll
    Letztermittelwert := Mittelwert;

    mfG René
    Geändert von vollmi (10.06.2013 um 14:36 Uhr)

  4. #13
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    752
    Danke
    27
    Erhielt 165 Danke für 143 Beiträge

    Standard

    Laut Aufgabenstellung ist der FB-Ausgang der Mittelwert der letzen n Messwerte. Vor jedem Neueintrag eines Wertes muss also der älteste Wert aus der Summe herausgerechnet werden. Ich wüsste nicht, wie das ohne Ringpuffer gehen soll.

  5. Folgender Benutzer sagt Danke zu StructuredTrash für den nützlichen Beitrag:

    megni (10.06.2013)

  6. #14
    Registriert seit
    09.08.2006
    Beiträge
    3.629
    Danke
    912
    Erhielt 656 Danke für 542 Beiträge

    Standard

    Zitat Zitat von vollmi Beitrag anzeigen
    Braucht man für die Aufgabenstellung überhaupt ein Array bzw. Ringbuffer?
    ich hätte das jetzt so gemacht:
    Mittelwert := LetzterMittelwert + ((Messwert - LetzterMittelwert) / AnzMesswerte);

    und jedesmal wenn ein neuer Wert in eingeschoben werden soll
    Letztermittelwert := Mittelwert;

    mfG René
    Hmm, da gebe ich StructuredTrash recht. Ich glaube auch, dass Deine Variante eher der Mittelwert seit Beginn der (Wetter-)Aufzeichnung ist...

  7. Folgender Benutzer sagt Danke zu ducati für den nützlichen Beitrag:

    megni (10.06.2013)

  8. #15
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.620
    Danke
    777
    Erhielt 647 Danke für 493 Beiträge

    Standard

    Verdammt. Jetzt fällt mir wieder ein. Ich war nie gut in Textverständnis

  9. #16
    megni ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    27.05.2013
    Beiträge
    17
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke zuerst an alle. Ich habe meine Code nochmal geändert.
    FUNCTION_BLOCK GMBerechnung
    VAR_INPUT
    IN_nx : INT; (* zu filternder Wert*)
    IN_ucFitergrad: BYTE; (*Anzahl abzuspeichernder Werte*)
    END_VAR
    VAR_OUTPUT
    OUT_y: INT; (* Mittelwert: gefilterter Wert*)
    Out_Pufferstand:INT; (*Anzahl gelieferternder Werte*)
    END_VAR
    VAR
    Messwerte:ARRAY[1..20] OF INT;
    index_Write:INT:=1;
    index_Read:INT:=1;
    Sum:INT:=0;
    Zähler:INT=0;
    END_VAR

    IF IN_ucFitergrad <= 20

    (*zu filternder Wert im FIFO schreiben*)
    Messwerte[index_Write:INT]:=IN_nx;

    IF index_Write >= IN_ucFitergrad THEN
    index_Write:=1;

    ELSE

    index_Write:=index_Write+1;

    END_IF;

    (*zu filternder Wert im FIFO auslesen*)

    IF index_Read < index_Write THEN
    Sum:= Sum + Messwerte[index_Read];
    index_Read:=index_Read+1;
    Zähler:= Zähler+1;
    Out_Pufferstand:= Zähler;
    END_IF;

    (*Mittelwert Berechnung*)
    IF Zähler>= 20 THEN
    OUT_y:=Sum\IN_ucFitergrad;
    index_Read:=Zähler%20 +1;
    Sum:=Sum-Messwerte[index_Read];

    END_IF;
    END_IF;
    ich habe noch folgende Frage:
    1) kann jemand mir den Befehl Schicken mit denen man die Code bei dem Post formatieren kann
    2) Laut die Aufgabstellung soll die Variable IN_ucFitergrad ein BYTE groß sein d.h ein Wert zwischen 1 und und 2^8 -1 sein, wenn ich mich gut an meine Grundvorlesungen erinnert. Bei mir habe ich das Array größe auf 20 Werte beschränkt, welche meine Meinung nach die Aufgabestellung nicht entspricht, denn die Array Größe muss zwischen 1 und 2^8 -1 sein und nicht irgendwelche Kontante. Kann Jemand mir weiter helfen?
    3) Zum Schluß bitte ich euch nochmal meine Code zu lesen, um zu überprüfern ob sie noch viele Lücke enthält.
    Geändert von megni (10.06.2013 um 20:12 Uhr)

  10. #17
    megni ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    27.05.2013
    Beiträge
    17
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Es kann vorkommen das der Mittelwert ein Real Wert ist. Gibt es bei ST eine implizite Konvertierung von Real to INT oder soll man explizit machen?

  11. #18
    Registriert seit
    05.10.2005
    Beiträge
    188
    Danke
    31
    Erhielt 16 Danke für 14 Beiträge

    Standard

    ein codesys kompiler (V3.X) würde den code nicht akzeptieren.
    ladt dir irgendwo eine demo oder ähnliches runter und jag ihn da durch. ist ja je egal was du nimmst aber er zeigt dir an was ihm nicht schmeckt. (ein beispiel:http://www.microinnovation.com/en/de...8/26_view-374/ )
    Zähler:INT=0;
    ä kann/macht nicht jeder kompiler
    IF IN_ucFitergrad <= 20
    fehlt then
    Messwerte[index_Write:INT]:=IN_nx;
    INT ist ein schlüsselwort
    usw...

    mein tipp

  12. Folgender Benutzer sagt Danke zu Fanta-Er für den nützlichen Beitrag:

    megni (10.06.2013)

  13. #19
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.227
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Du mußt den erweiterten Editor einstellen und öffnen (unten Rechts, zwischen Antworten und Abbrechen). Dann kannst du deinen Code markieren und oben bei den Funktionsicons die Raute (#) wählen. Daraufhin werden die Codetags vor und nach deinem Code eingefügt. Wenn du dien Code einrückst

    Code:
    IF XY = 1 THEN
       IF Z = 2 THEN
          tu_was := True;
       END_IF
    END_IF
    bleiben die Einrückungen erhalten, der Code ist besser lesbar.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  14. #20
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    752
    Danke
    27
    Erhielt 165 Danke für 143 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von megni Beitrag anzeigen
    2) Laut die Aufgabstellung soll die Variable IN_ucFitergrad ein BYTE groß sein d.h ein Wert zwischen 1 und und 2^8 -1 sein, wenn ich mich gut an meine Grundvorlesungen erinnert. Bei mir habe ich das Array größe auf 20 Werte beschränkt, welche meine Meinung nach die Aufgabestellung nicht entspricht, denn die Array Größe muss zwischen 1 und 2^8 -1 sein und nicht irgendwelche Kontante. Kann Jemand mir weiter helfen?
    3) Zum Schluß bitte ich euch nochmal meine Code zu lesen, um zu überprüfern ob sie noch viele Lücke enthält.
    Zu 2)
    Du kannst die Arraygrösse nicht zur Laufzeit ändern, sondern musst sie schon vor dem Übersetzen festlegen. Das Array muss also von vornherein so gross sein wie maximal benötigt. Dann kann IN_ucFiltergrad auch nicht zu gross werden. Du solltest allerdings den Fall IN_ucFiltergrad = 0 bedenken. Ersetze mal gedanklich jedes Vorkommen dieser Variable durch den Wert 0 und überlege, was dann passiert. Oder noch besser, befolge den Rat von Fanta-Er und besorge Dir eine IEC61131-Entwicklungsumgebung, am besten eine wie Beckhoff TwinCat2, mit der Du das Programm auch auf Deinem PC laufen lassen kannst.
    Zu 3)
    Bei der Summen- und Mittelwertbildung ist Dir einiges durcheinandergeraten, das wird überhaupt nicht funktionieren. Da sah die erste Version noch besser aus. Die erfüllte zwar nicht ganz die Aufgabenstellung, hätte aber wohl das getan, was Du Dir vorgestellt hast. Auch dabei wirst Du besser vorankommen, wenn Du Dein Programm testen kannst.

Ähnliche Themen

  1. Structured Text (ST)
    Von nourdine im Forum PC- und Netzwerktechnik
    Antworten: 6
    Letzter Beitrag: 29.11.2009, 17:13
  2. [ ST - Structured Text ] Pointer Casten
    Von caret im Forum CODESYS und IEC61131
    Antworten: 3
    Letzter Beitrag: 16.10.2009, 22:38
  3. Structured Text RSLogix
    Von kammi-kaze im Forum Sonstige Steuerungen
    Antworten: 1
    Letzter Beitrag: 20.07.2009, 15:01
  4. SCL oder ST und EN 61131-3/IEC 61131-3
    Von McCowsky im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 03.03.2009, 15:05
  5. IEC 61131-3
    Von arcis im Forum Stammtisch
    Antworten: 1
    Letzter Beitrag: 24.12.2005, 11:52

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •