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

Seite 3 von 5 ErsteErste 12345 LetzteLetzte
Ergebnis 21 bis 30 von 41

Thema: Zeitschaltuhr Pulse

  1. #21
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @Onkel: Perfekt! Genau die Prüfungen gemacht die ich auch erwähnt hatte! Bleibt nur noch die Frage ob der TE den Code auch versteht. Ich hätte mir die Adresse mithilfe des Schleifenindex berechnet, aber das ist dann wohl Geschmackssache. Weißt du vielleicht wieso es beim ANY-Pointer diese ID gibt? Oder ist das für die Steuerung nur eine Unterscheidung zwischen ANY-Pointer und Pointer??

    EDIT: Eventuell könnte man bei den Überprüfungen einen Fehlercode zurückgeben--- etwa so : Fehler = 1 wenn Datentyp nicht korrekt, Fehler = 2 wenn Speicherbereich nicht korrekt, Fehler = 3 wenn UDT Länge nicht passend , usw.

  2. #22
    Registriert seit
    06.10.2003
    Beiträge
    3.413
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard

    Zitat Zitat von nutellahase Beitrag anzeigen
    ..Bleibt nur noch die Frage ob der TE den Code auch versteht..
    Ich denke, es kann jeder verstehen. Man muß sich halt ein bisschen mit der Materie befassen.

    Zitat Zitat von nutellahase Beitrag anzeigen
    .. Ich hätte mir die Adresse mithilfe des Schleifenindex berechnet, aber das ist dann wohl Geschmackssache..
    Verstehe ich nicht ganz. Zeig doch mal!

    Zitat Zitat von nutellahase Beitrag anzeigen
    .. Weißt du vielleicht wieso es beim ANY-Pointer diese ID gibt?..
    Die ID sagt etwas über den Ursprung aus. Ich weiß auch nur daß die 16#10 für Siemens steht.

    Zitat Zitat von nutellahase Beitrag anzeigen
    ..EDIT: Eventuell könnte man bei den Überprüfungen einen Fehlercode zurückgeben..
    Ja natürlich. Wenn du Lust hast, kannst du es gerne übernehmen. Ich lehne mich jetzt zurück .
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  3. #23
    Registriert seit
    10.08.2010
    Beiträge
    770
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    Hallo super gemacht.
    Ich hätte noch mal eine frage dazu. Da ich nur Hobbymässig SPS Programmiere bin ich nicht so der Freund von Berechnungen der Adresse. Es gibt doch auch die Möglichkeit mit Namen zu adressieren ?

    z.b Berechnest du die Adresse der Start und Endzeit. Dies müsste dich auch per Nahmen und einer For schleife funktionieren ?

  4. #24
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard

    Zitat Zitat von Onkel Dagobert Beitrag anzeigen
    Verstehe ich nicht ganz. Zeig doch mal!
    Nun ja mihilfe der Startadresse ... der Einfachkeit halber ist die Startadresse jetzt bei 0.0! Dann beginnt (um bei deinen Beispiel aus Post #16 zu bleiben) myarray[1].Wochentag_Start ebenfalls im DB bei Adresse 0.0 alle weiteren Komponenten ergeben sich anhand deren Datentypen bzw. sind halt dann der Offset zu Wochentag_Start.

    Jetzt kann ich mithilfe des Array Index meinen Adressenbezug herstellen:
    Code:
    myAdresse := ((n-1)*UDT_Groesse) + Startadresse => das wäre die Adresse von myarray[n].Wochentag_Start
    oder auch:
    Code:
    myAdresse := ((n* UDT_Groesse) - UDT_Groesse) + Startadresse
    wobei dein Code sicher weniger Verarbeitungszeit benötigt.

    Alternativ könnte man statt dem ANY-Pointer auch das Array in den IN_OUT Bereich verlegen ... damit gibt man aber die dynamische Berechnung auf (würde nur was bringen wenn das Array immer gleich groß ist)

    EDIT:
    Zitat Zitat von emilio20 Beitrag anzeigen
    Hallo super gemacht.
    Ich hätte noch mal eine frage dazu. Da ich nur Hobbymässig SPS Programmiere bin ich nicht so der Freund von Berechnungen der Adresse. Es gibt doch auch die Möglichkeit mit Namen zu adressieren ?

    z.b Berechnest du die Adresse der Start und Endzeit. Dies müsste dich auch per Nahmen und einer For schleife funktionieren ?
    Hallo emilio!

    Das wäre dann ein Fall für die Anwendung im IN/OUT Bereich! Oder du legst dir im temp. Bereich nochmals eine UDT an und kopierst dir am Beginn der Schleife deine Adressen dort hinein! Danach kannst du symbolisch darauf zugreifen! Würde die Leserlichkeit erheblich verbessern sobald man davon ausgehen kann, dass die Adressberechnung stimmt.
    Geändert von nutellahase (28.12.2012 um 22:13 Uhr)

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

    Onkel Dagobert (28.12.2012)

  6. #25
    Registriert seit
    06.10.2003
    Beiträge
    3.413
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard

    Zitat Zitat von emilio20 Beitrag anzeigen
    Hallo super gemacht...
    Danke.

    Zitat Zitat von emilio20 Beitrag anzeigen
    .. bin ich nicht so der Freund von Berechnungen der Adresse...
    Nun ja, wer das Eine will muß das Andere mögen .

    Zitat Zitat von emilio20 Beitrag anzeigen
    .. Es gibt doch auch die Möglichkeit mit Namen zu adressieren ?...
    Man könnte eine Variable vom Typ UDT1 tempörär anlegen, die die man die Daten der jeweiligen Schaltzeit hinein kopiert. Dann könnte man mit dieser UDT-Variable symbolisch hantieren. Allerdings ist zum Kopieren ebenfalls eine Adressberechnung notwendig. Man gewinnt dabei nichts.



    Gruß, Onkel
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  7. #26
    Registriert seit
    06.10.2003
    Beiträge
    3.413
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard

    Zitat Zitat von Onkel Dagobert Beitrag anzeigen
    BYTE_INDEX := WORD_TO_INT(DWORD_TO_WORD(SHR(IN:=SZP.ZEIGER, N:=3)) AND 16#FFFF); // korrigiert, 29.12.2012
    Hiermit hat sich die Bastelei auch für mich gelohnt. Den Fehler habe ich höchst wahrscheinlich auch in anderen Bausteinen.
    Geändert von Onkel Dagobert (29.12.2012 um 16:24 Uhr)
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  8. #27
    Registriert seit
    10.08.2010
    Beiträge
    770
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    Hallo

    Kannst du mir diesen Teil mal genauer erklären ?

    Code:
    // Überprüfung Datenbereich
    
      
    IF SHR(IN:=SZP.ZEIGER, N:=24) <> 2#10000100 OR         // kein DB ????
       SZP.TYP <> 16#02 OR                                 // Typ nicht Byte       ?????
       SZP.ANZAHL_TYP MOD 10 <> 0                          // Länge Datenbereich nicht plausibel  ?????
       THEN RETURN;
    END_IF;
    Geändert von emilio20 (30.12.2012 um 14:40 Uhr)

  9. #28
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard

    Zitat Zitat von emilio20 Beitrag anzeigen
    Hallo

    Kannst du mir diesen Teil mal genauer erklären ?

    Code:
    // Überprüfung Datenbereich
    
      
    IF SHR(IN:=SZP.ZEIGER, N:=24) <> 2#10000100 OR         // kein DB ????
       SZP.TYP <> 16#02 OR                                 // Typ nicht Byte       ?????
       SZP.ANZAHL_TYP MOD 10 <> 0                          // Länge Datenbereich nicht plausibel  ?????
       THEN RETURN;
    END_IF;
    Das sind im Prinzip nur Sicherheitschecks, damit du nicht jeden beliebigen Datenbereich von außen anlegen kannst (denn das könntest du bei einen ANY-Pointer ohne weiteres tun). Mithilfe dieser Abfrage ist der Bereich zumindest eingegrenzt.

  10. #29
    Registriert seit
    06.10.2003
    Beiträge
    3.413
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard

    Hallo Emilio,

    generell kannst du auf diesen Programmteil verzichten. Er dient eigentlich nur dazu, nach Möglichkeit zu überprüfen ob an dem Bausteinparameter tatsächlich der richtige ANY angetragen ist.

    Mit dem Aufbau von Pointern und ANY-Pointern hast du dich schon angefreundet?

    In der Variable "SZP.ZEIGER" steht ein bereichsübergreifender Zeiger, so wie er in dem ANY-Pointer enthalten ist. Dieser besteht aus vier Byte.

    Code:
    00000000_00000yyy_yyyyyyyy_yyyyyxxx - bereichsinterner Zeiger (der Vollständigkeit halber)
    10000zzz_00000yyy_yyyyyyyy_yyyyyxxx - bereichsübergreifender Zeiger
    Die "1" ganz links unterscheidet die beiden.
    "zzz" kennzeichnet den Operandenbereich, "100" steht für Globaldaten (DBX).
    Die y.. bilden die Byte-Adresse und x.. bilden die Bit-Adresse.
    Die Nullen haben keine Bedeutung.

    Durch "SHR" wird das Bitmuster um 24 Stellen (N:=24) nach rechts verschoben, frei werdende Stellen werden mit Nullen aufgefüllt. Das linke Byte steht jetzt rechtsbündig im Akku. Wenn dieses Byte nicht "10000100" beinhaltet, wird die Bearbeitung des Bausteins abgebrochen. Das dient u.a. auch dazu, die Dummheit zu verhindern, Parameter wie Schaltzeiten in den Lokaldaten ab zu legen. Manche Leute machen so etwas.

    Mit "SZP.TYP <> 16#02"wird überprüft, ob der Datentyp als "Byte" angegeben ist. Symbolisch angelegte ANY-Pointer werden vom Compiler mit dem Datentyp "Byte" generiert. Die Erkennung des Datentyps ist wichtig, da er zur Ermittlung der Anzahl der Datensätze von Bedeutung ist. Greift man auf einen Datenbereich zu, der nicht in ein ARRAY oder STRUCT verpackt ist, dann kann man den Parameter auch absolut angeben und auch mit anderen Datentypen (z.Bsp. "P#DB1.DBX0.0 WORD 100"). Der Baustein würde jeden ANY-Pointer annehmen. Daher macht eine Überprüfung generell schon Sinn.

    Mit "SZP.ANZAHL_TYP MOD 10" wird ganz einfach noch mal überprüft, ob der Datenbereich genau durch 10 teilbar ist. Bei verschachtelten STRUCTs können leicht mal Schreibfehler am ANY passieren, die u.U. hierdurch erkannt werden.

    Man kann diese Überprüfung weglassen. Man könnte aber auch, wie es nutellahase schon genannt hat, Fehlercodes erzeugen und an RET_VAL als INT ausgeben. Für den Schaltuhr-Ausgang dann einen normalen OUT verwenden.

    "RETURN" beendet die Bearbeitung des Bausteins. Bei einer FC ist wichtig dass vorher, bzw. generell in jedem Zyklus, alle Ausgänge beschrieben werden, "SCHALTZEITUHR := false" steht deswegen ganz weit oben!


    Gruß, Onkel
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  11. #30
    Registriert seit
    10.08.2010
    Beiträge
    770
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    OK vielen dank erst mal .
    habe mich mit Zeigern bisher noch nicht beschäftigt da ich in SCL eine Symbolische Addresierung verwendet habe.

    Also verschiebst du hier den Zeiger um 3 nach rechts
    BYTE_INDEX := WORD_TO_INT(DWORD_TO_WORD(SHR(IN:=SZP.ZEIGER, N:=3)) AND 16#00FF);

    somt erhäst du
    Code:
    10000zzz_00000yyy_yyyyyyyy_yyyyy
    Und was bedeute jetzt "AND 16#00FF" ?

    wie erhälst du hier die Startadresse ?

    Ein Zeiger sie doch so aus P#DB1.DBX0.0 WORD 100"
    Das kenne ich ja
    Jetzt mochte ich doch diesen Teil erhalten
    0.0
    Geändert von emilio20 (30.12.2012 um 17:28 Uhr)

Ähnliche Themen

  1. Frequenzumrichter Yaskawa 676VG3 ohne Pulse Generator
    Von lindnerlars im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 01.03.2011, 22:26
  2. Beckhoff EL2521 Pulse Train Klemme
    Von Daberer im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 01.09.2010, 07:56
  3. Zeitschaltuhr
    Von bille1806 im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 29.07.2009, 21:54
  4. Zeitschaltuhr
    Von BastiMG im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 12.10.2006, 10:23
  5. S7-200 Pulse Timer
    Von Golf2 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 23.12.2005, 08:41

Lesezeichen

Berechtigungen

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