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

Ergebnis 1 bis 4 von 4

Thema: Schrittkette und speicherindirkete Adressierung eines DB

  1. #1
    Registriert seit
    18.02.2009
    Beiträge
    11
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    In S7-Graph erstellt: 2 parallele Schrittketten, die synchronisiert ablaufen:

    Wenn Schrittkette „Ventile“ in einem Schritt „Ventil_X“ ist, werden die „Spülschritte_a bis c“ durchlaufen, danach schaltet die Schrittkette „Ventile“ ein Ventil weiter und wieder werden die „Spülschritte_a bis c“ durchlaufen… usw.

    Die Ventile werden an anderer Stelle im Programm als Zustandsautomaten nachgebildet und schreiben ihre Daten (Zustand: AUF, ZU, STÖRUNG) in einen Datenbaustein und lesen allerdings auch Ansteuerungsdaten(Bedienschalter ÖFFNE, SCHLIEßE, LAUFZEITEN) aus dem DB.

    (siehe BILD!)

    Um das „Spülprogramm“ flexibel zu gestalten und beliebig viele Ventile in die Spülliste aufnehmen zu können dachte ich mir das folgendermaßen:

    - Ventilschritt ruft eine FC (Nummer des Ventils als IN-Parameter) auf, die dafür sorgt, dass in den Merkern die jeweils richtigen Adressen stehen
    - Somit können die Spülschritte immer auf dieselben Merker zugreifen, die jeweils die richtigen Adressen beinhalten (speicherindirekte Adressierung)

    Meine Fragen:
    Funktioniert das Schreiben der Adressen in die Merker folgendermaßen? :
    L „Ventil_Nr“ // laden der übergebenen Ventilnummer
    L 10 // Offset für die unterschiedlichen „switch_on“
    *I // Bilden der Byteadresse
    SLW 3 // Formatieren des Zeigers
    T „Merker_switch_on“ // Transferieren des Zeigers ins Merkerdoppelwort

    Für „state“ sollte der Offset dann 11 sein, für „runtime_open“ 12 und für „runtime_close“ 16. Oder?

    Wenn ich nun auf die Variablen im DB innerhalb der Spülschritte zugreifen möchte, mach ich das dann so? :
    AUF DB10 // angenommen die Daten liegen in DB 10

    // fürs Lesen
    L DBX [„Merker_switch_on“] // für Zugriffe auf das Datenbit
    L DBB [„Merker_state“] //für Zugriffe auf das Datenbyte
    L DBD [„Merker_runtime_open“] // für Zugriffe auf das Datendoppelwort
    …dann weiterverarbeiten…

    // fürs Schreiben
    …vorher wurden die jeweiligen Daten in den AKKU geladen…
    Genauso wie lesen, nur eben statt „L“ ein „T“ in der Anweisung, oder?

    Ich habe leider sehr wenig Erfahrung bei der Umsetzung mittels AWL und in Sachen indirekte Adressierung ist meine Erfahrung gleich NULL, deshalb meine Hauptfrage, bevor ich anfange das so umzusetzen:
    So wie ich mir das überlegt habe klingt das sehr umständlich…geht das auch einfacher, oder ist das durchaus zu empfehlen das so zu machen? (wenn das überhaupt so geht wie ich das beschreiben habe )

    Grüße,
    Christian
    Angehängte Grafiken Angehängte Grafiken
    Zitieren Zitieren Schrittkette und speicherindirkete Adressierung eines DB  

  2. #2
    Registriert seit
    11.09.2007
    Ort
    Suedwestpfalz
    Beiträge
    917
    Danke
    81
    Erhielt 209 Danke für 192 Beiträge

    Standard

    Zitat Zitat von tl666 Beitrag anzeigen
    Meine Fragen:
    Funktioniert das Schreiben der Adressen in die Merker folgendermaßen? :
    L „Ventil_Nr“ // laden der übergebenen Ventilnummer
    L 10 // Offset für die unterschiedlichen „switch_on“
    *I // Bilden der Byteadresse
    SLW 3 // Formatieren des Zeigers
    T „Merker_switch_on“ // Transferieren des Zeigers ins Merkerdoppelwort
    Guter Ansatz, leider nicht ganz richtig.
    Für die indirekt adressierung wird - wie von Dir schon richtig gesagt.
    Deswegen müssen auch Doppelwörter verwendet werden:
    L L#10 // Offset für die unterschiedlichen „switch_on“
    *D // Bilden der Byteadresse
    SLD 3 // Formatieren des Zeigers

    Zitat Zitat von tl666 Beitrag anzeigen
    // fürs Lesen
    L DBX [„Merker_switch_on“] // für Zugriffe auf das Datenbit
    L DBB [„Merker_state“] //für Zugriffe auf das Datenbyte
    L DBD [„Merker_runtime_open“] // für Zugriffe auf das Datendoppelwort
    …dann weiterverarbeiten…

    // fürs Schreiben
    …vorher wurden die jeweiligen Daten in den AKKU geladen…
    Genauso wie lesen, nur eben statt „L“ ein „T“ in der Anweisung, oder?
    Auch hier ein Hinweis:

    Für die Bitoperation ist der Ladebefehl nicht so gut...

    Sollte heißen U DBX ... bzw. O DBX ...
    Beim Schreiben dann = DBX...

    Ansonsten sehe ich erst mal keine Probleme, die Feinheiten kommen dann im zweiten Schritt, hier wäre ein Vorgehen mit Adressregister durchaus angebracht.

    dtsclipper
    Das Grauen lauert in der Zwischenablage !!

  3. #3
    tl666 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.02.2009
    Beiträge
    11
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Vielen Dank für das Feedback dtsclipper!
    Ich hab deine Hinweise soweit eingearbeitet und es funktioniert ganz gut.

    Was meinst du mit zweitem Schritt???
    Zitat Zitat von dtsclipper Beitrag anzeigen
    ...die Feinheiten kommen dann im zweiten Schritt, hier wäre ein Vorgehen mit Adressregister durchaus angebracht. dtsclipper
    Momentan mach ich es so, dass ich im S7-Graph ne FC aufrufe, die mir den jeweiligen "Datensatz" in globale Variablen kopiert.
    Beim Lesen kein Problem, beim Schrieben muss ich natürlich zurückkopieren...umständlich!
    Die Variablen sind wichtig für die Transitionen und am liebsten wäre es mir wenn ich keine Funktionen aufrufen müsste, sondern die Transitionen gleich mit den Werten aus dem DB versorgen könnte...also so ne Schweinerei wie DB10.[MD 24] an nem UND-Gatter-Eingang ...das würde mir das umkopieren sparen.
    Aber geht das überhaupt in S7-Graph (beim Versuch gings nich, oder is die Syntax falsch)? Und wenns doch gehn sollte, is das eher schlechter Programmierstil?
    Sorry für so viele dummer Fragen, bin halt Anfänger *grins*
    Grüße und nen schönen Feierabend allerseits!

  4. #4
    Registriert seit
    11.09.2007
    Ort
    Suedwestpfalz
    Beiträge
    917
    Danke
    81
    Erhielt 209 Danke für 192 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von tl666 Beitrag anzeigen
    Vielen Dank für das Feedback dtsclipper!
    Gern geschehen.

    Zitat Zitat von tl666 Beitrag anzeigen
    Sorry für so viele dummer Fragen, bin halt Anfänger
    Gibt keine dummen Fragen, nur blöde Antworten Und Anfänger war jeder mal...

    Zitat Zitat von tl666 Beitrag anzeigen
    Was meinst du mit zweitem Schritt???
    Der zweite Schritt wäre z.B. die radikale Kürzung des Programmes auf eine Schrittkette in einem FB, der dann entsprechend parametriert wird und seine Datenbasis sowie die Freischaltung für das nächste Ventil selber erteilt.

    Zitat Zitat von tl666 Beitrag anzeigen
    Aber geht das überhaupt in S7-Graph
    Da muss ich leider passen, in Graph kenne ich mich nun überhaupt nicht aus...
    Das Grauen lauert in der Zwischenablage !!

Ähnliche Themen

  1. Antworten: 50
    Letzter Beitrag: 01.08.2011, 12:57
  2. Aufruf eines Date_and_Time eines DB's
    Von hank12 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 08.07.2009, 10:33
  3. Antworten: 11
    Letzter Beitrag: 12.12.2007, 15:00
  4. Indirekte Adressierung eines Pointers
    Von merlin im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 12.04.2007, 13:30
  5. indirekte Adressierung eines Datenbausteins
    Von linax im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 20.11.2003, 17:12

Lesezeichen

Berechtigungen

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