Step 7 Any Pointer in AR1 für globales DB

Zuviel Werbung?
-> Hier kostenlos registrieren
Sooooo, so funktioniert das ganze jetzt erst Mal.
Danke für die Hilfe bis hierhin!
Code:
      UN    #FLANKENMERKER
      =     #POS_FLANKE                 //Taktprüfer
      U     #POS_FLANKE
      SPB   THEN                        //Bei positiver Flanke wird gearbeitet
      SPA   ELSE                        //Sonst übergeht SPB Befehl undspringt hier absolut zu ELSE
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
THEN: AUF   "DB_DATA"
      L     #ZAEHLER                    //Lade Durchlaufzähler in AR1 --> 4Byte Schritte (0..4..8..12..etc.)
      +     1                           //Gehe auf nächstes Array-Element
      L     11                          //Anzahl Einträge im Array_1[0..10] OF REAL
      MOD                               //auf 0..10 begrenzen siehe S7 HILFE
      T     #ZAEHLER                    //Merke den Wert
      L     4                           //REAL ist 4 Byte
      *D                                //Mulipliziere mit 4 --> 0*4=0, 1*4=4, 2*4=8, ...
      SLD   3                           //Byteoffset --> P# Bitadresse --> Siehe Aufbau S7 Hilfe
      L     P#0.0                       //AnfangsOffset ARRAY_1 in DB1 hier eintragen
      +D                                //ergibt Offset von ARRAY_1[ZAEHLER] --> 0, 4, 8, etc.
      LAR1
      L     #IN                         //Testwert statt Eingabewert, zum Testen
      T     DBD [AR1,P#0.0]
      L     44                          //Lade Startwert 44 in AR2 --> Zählt 11 mal runter weil Array[0..10]
      SLD   3
      LAR2
      L     P#0.0
      LAR1
      L     11                          //Lade 11 als LOOP Länge in ForZähler (Zwischenspeicher)
SPRG: T     #tForZaehler
      AUF   "DB_DATA"
      TAR2                              //AR2 in AKKU1 abspeichern
      L     P#4.0                       //4Byte in AKKU1 laden
      -D                                //AKKU1 von AKKU2 subtrahieren (AR2-4)
      LAR2
      L     DBD [AR1,P#0.0]
      AUF   "DB_DATA_REVERSE"
      T     DBD [AR2,P#0.0]             //Schreibe Wert von AR1 DB1 auf AR2 DB2
      +AR1  P#4.0                       //Erhöhen von AR1 um 4Byte (nur eine 4 wären nur 4 Bit)
      L     #tForZaehler
      LOOP  SPRG
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ELSE: U     M      0.5
      SPB   EIN
      R     #FLANKENMERKER              //Resete den Flankenmerker
      SPA   ENDE                        //Wenn TAKT FALSE wird SPB übergangen und absolut auf AUS gesprungen
EIN:  S     #FLANKENMERKER              //Setze den Flankenmerker
      SPA   ENDE
ENDE: L     0

Ein letztes Problem habe ich noch:
Kann ich denn im FC die INOUT nicht als REAL deklarieren?
Habe versucht #IN (REAL) im OB1 meine ED 6 aus der Symbolliste zuzuweisen wie in meinem anderen FB Programm, und er lässt mich nur Daten aus DBs auswählen.

Wenn ich die #IN als INT deklariere wie den #ZAEHLER kann ich auch nur die Variable vom ZAEHLER aus der Symbolliste zuweisen, obwohl ich davor extra zum testen noch andere EW Variablen in der Symbolliste erstellt habe.
1730358093106.png
1730358194439.png
 
Natürlich kann man auch einen INOUT als REAL deklarieren, mach es einfach.
An einen REAL Übergabeparameter kann man nur REAL-Variablen verschalten, also deklariere die Variable ED6 in der Symboltabelle als REAL und nicht als DWORD. (Bist du sicher, dass das ED6 einen REAL-Wert liefert?)
Genauso an INT-Parametern muss die Aktualparameter-Variable als INT deklariert sein.

Ich habe Dir schon mehrmals geschrieben dass die CPU-Taktmerker asynchron sind und nur einmal gelesen werden dürfen. Du liest M0.5 trotzdem wieder zweimal. Beim zweiten Mal kann da ein anderer Wert drin stehen.
Und was findest du an dieser verschwurbelten Art mit dem überaus umständlichen S + R zum kopieren des M0.5 in den Flankenmerker? Sowas zu sehen tut weh ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Natürlich kann man auch einen INOUT als REAL deklarieren, mach es einfach.
An einen REAL Übergabeparameter kann man nur REAL-Variablen verschalten, also deklariere die Variable ED6 in der Symboltabelle als REAL und nicht als DWORD. (Bist du sicher, dass das ED6 einen REAL-Wert liefert?)
Genauso an INT-Parametern muss die Aktualparameter-Variable als INT deklariert sein.

Ich habe Dir schon mehrmals geschrieben dass die CPU-Taktmerker asynchron sind und nur einmal gelesen werden dürfen. Du liest M0.5 trotzdem wieder zweimal. Beim zweiten Mal kann da ein anderer Wert drin stehen.
Und was findest du an dieser verschwurbelten Art mit dem überaus umständlichen S + R zum kopieren des M0.5 in den Flankenmerker? Sowas zu sehen tut weh ...
Achso danke, ich hab noch nicht genau herausgefunden wie man mit der Symbolliste arbeitet.
Ja das füge ich gleich noch ein, ich wollte erst testen ob das ganze überhaupt funktioniert und hab mich nicht auf die Taktzeit fokussiert.
Selbige mit dem Set/Reset dahinter. Mir ging es gerade größtenteils darum das Programm für mich verständlich zum funktionieren zu bekommen, wenn auch hässlich.,
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ZAEHLER EW 4 INT Zähler für DB1 ?
Ich verstehe nicht bzw. es verwirrt mich. Benutzt Du 'ZAEHLER' als Variable, deren Inhalt Du hochzählen willst?
Und legst die dann in einen Bereich, der zum EingangsProzessAbbild gehört, der vor jedem OB1-Zyklus aus den "realen" Eingängen aktualisiert (=überschrieben) wird?
Wie gesagt beginne ich komplett von einem Wissensstand 0 und das war eine Erklärung die ich zur Symbolliste auf YT gefunden habe.
Ja das ist natürlich Käse. Funktioniert aber, wenn auf die E-Adresse keine Baugruppe projektiert ist. "Auf die Schnelle" ohne extra eine Variable in einem DB anzulegen wäre aber ein MW sinnvoller gewesen.
Wofür steht MW? Merkwort?
Dann ändere ich das noch um, danke!

P.S.: Ich nehme gerne allerlei Input an solange ich nicht als Idiot betitelt werde. Es ist leider teilweise extrem schwer und kompliziert im Internet die passenden Antworten bzw. Erklärungen zu finden um sich im S7 Manager auszukennen.
Zu TIA findet man da schon mehr, aber leider kann man nicht alles von TIA genauso im S7 Manager anwenden.

Lg
 
Zuletzt bearbeitet:
MW ist Merker Wort gemeint. "Old Style Standard" für Speichervariablen, weil man dafür nicht extra Variablen in DB anlegen muss. Heutzutage verpönt, weil der Anwender da z.B. selber aufpassen muss, dass sich Variablen-Adressen nicht überlappen.
EW sind Adressen im Speicherbereich der Eingänge, die sich üblicherweise nichts merken können, weil sie vor jedem OB1-Aufruf mit den Werten der realen Eingangsbaugruppen überschrieben werden, außer wenn auf die E-Adresse keine Baugruppe projektiert ist. Solche unbelegten E-Adressen kann man wie Merker benutzen, z.B. wenn Speicher knapp ist. Solche Tricks kennen TIA-Anwender/Anfänger üblicherweise nicht, gehen da aber auch. Eigentlich bestehen zwischen TIA und Classic nur wenige Unterschiede, außer dass TIA den unbedarften Anwender mehr vor seinen Dummheiten schützen will und wie in der "Kindergartengruppe" ;) mehr gängelt. Ansonsten kann TIA funktional eher weniger als Classic. Ist halt mehr für nicht extra ausgebildete Leute gedacht.
 
MW ist Merker Wort gemeint. "Old Style Standard" für Speichervariablen, weil man dafür nicht extra Variablen in DB anlegen muss. Heutzutage verpönt, weil der Anwender da z.B. selber aufpassen muss, dass sich Variablen-Adressen nicht überlappen.
EW sind Adressen im Speicherbereich der Eingänge, die sich üblicherweise nichts merken können, weil sie vor jedem OB1-Aufruf mit den Werten der realen Eingangsbaugruppen überschrieben werden, außer wenn auf die E-Adresse keine Baugruppe projektiert ist. Solche unbelegten E-Adressen kann man wie Merker benutzen, z.B. wenn Speicher knapp ist. Solche Tricks kennen TIA-Anwender/Anfänger üblicherweise nicht, gehen da aber auch. Eigentlich bestehen zwischen TIA und Classic nur wenige Unterschiede, außer dass TIA den unbedarften Anwender mehr vor seinen Dummheiten schützen will und wie in der "Kindergartengruppe" ;) mehr gängelt. Ansonsten kann TIA funktional eher weniger als Classic. Ist halt mehr für nicht extra ausgebildete Leute gedacht.
Ahhh ok verstehe danke!
Darf ich noch kurz fragen was mit "Baugruppen" gemeint ist?

Ich verstehe darunter ja eher sowas wie z.B. aus der Elektrik: CPU, I/O, Versorgung, etc.

Zum Punkt TIA und SIMATIC wurde mir gesagt, es wäre besser mit SIMATIC anzufangen, da man in TIA alles versteht, wenn man sich in SIMATIC auskennt. Also ist der Gedankengang korrekt?

Lg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Richtig. Mit "Baugruppen" sind Eingabe/Ausgabe-Signal-Baugruppen/Module (SM) gemeint. Können aber auch andere Geräte sein (z.B. Frequenzumrichter als Profibus-Teilnehmer), die auf Adressen im Speicherbereich der Eingänge projektiert sind.
 
Zurück
Oben