Schrittkette und speicherindirkete Adressierung eines DB

tl666

Level-1
Beiträge
11
Reaktionspunkte
0
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 :confused: )

Grüße,
Christian
 

Anhänge

  • indirekt.jpg
    indirekt.jpg
    70,7 KB · Aufrufe: 45
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

// 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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für das Feedback dtsclipper! :)
Ich hab deine Hinweise soweit eingearbeitet und es funktioniert ganz gut.

Was meinst du mit zweitem Schritt???
...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!
 
Vielen Dank für das Feedback dtsclipper! :)

Gern geschehen.

Sorry für so viele dummer Fragen, bin halt Anfänger

Gibt keine dummen Fragen, nur blöde Antworten:ROFLMAO: Und Anfänger war jeder mal...

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.

Aber geht das überhaupt in S7-Graph

Da muss ich leider passen, in Graph kenne ich mich nun überhaupt nicht aus...
 
Zurück
Oben