-> 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
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