Step 7 Any-Zeiger funktionieren nur in eine Richtung

Mindrover

Level-2
Beiträge
48
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe Anhand des Themas Any-Zeiger für Datentypen einen FC(2) erstellt.
Dieser enthält 2 Pointer und einen Blockmove um Werte von DB22 nach DB32 zu kopieren.
myZeiger und my Zeiger2 werden erstellt, dann wird Blkmove und dann geht das ganze mit dem nächsten Offset weiter.
Ich definiere insgesamt 12x myZeiger und myZeiger2 und blkmove diese dann.
Der DB22 hat mehrere Array [1..500] und ich möchte dort 18 Werte(im gleichen Array) rauspicken und diese in den DB32 welcher mehrere Array[1..17] enthält.
Ich gebe einen "Index" INT vor um die richtigen Zeilen auszuwählen. Dieser Index gibt den Offset für DB22 vor.
Dies funktioniert auch wunderbar.

FC2 und FC3 haben die gleichen Inputs und Temps und werden gleich aufgerufen. Nur die Variable, die die Bearbeitung auslöst ist unterschiedlich.

Jetzt möchte ich die Werte wieder zurück nach DB22 laden und habe die Pointer in einem weiteren Baustein(FC3) einfach vertauscht.
Das funktioniert beim ersten Blockmove(Umdrehungen) noch, aber sobald ich einen zweiten (Drehzahl) einfüge, trägt es mir komische Werte im falschen Bereich ein.

Ich verstehe überhaupt nicht warum 12x kopieren von DB22 auf DB32 tadellos funktioniert, aber die umgekehrte Version in einem neuen Baustein
nicht.

Bitte um Hilfestellung.

Danke im Voraus.
 

Anhänge

  • Beim speichern mit Drehzahl in FC3.JPG
    Beim speichern mit Drehzahl in FC3.JPG
    114,6 KB · Aufrufe: 23
  • DB22.JPG
    DB22.JPG
    110,5 KB · Aufrufe: 21
  • DB32.JPG
    DB32.JPG
    94,4 KB · Aufrufe: 23
  • FC2Inhalt.jpg
    FC2Inhalt.jpg
    47,9 KB · Aufrufe: 30
  • FC2Online.jpg
    FC2Online.jpg
    61,9 KB · Aufrufe: 29
  • FC3_2.JPG
    FC3_2.JPG
    50,8 KB · Aufrufe: 30
  • FC3Inhalt.jpg
    FC3Inhalt.jpg
    61,3 KB · Aufrufe: 26
Bist Du sicher, daß die komischen Werte durch FC3 eingetragen werden? Schreiben vielleicht mehrere Programmstellen in den DB22?
Kommt im #retval ein Fehlercode?

Tipp: "T LB 0" sieht scheixxe aus und man darf die TEMP-Variablen nicht verschieben. Besser:
Code:
      LAR1  P##myZeiger
      L     W#16#1007
      T     LW [AR1,P#0.0]
      L     18
      T     LW [AR1,P#2.0]
      L     22
      T     LW [AR1,P#4.0]
      L     #IndexU
      SLD   3
      L     P#DBX 0.0                   //Bereichskennung DB: 16#84
      OD   
      T     LD [AR1,P#6.0]

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bist Du sicher, daß die komischen Werte durch FC3 eingetragen werden? Schreiben vielleicht mehrere Programmstellen in den DB22?
Kommt im #retval ein Fehlercode?

Tipp: "T LB 0" sieht scheixxe aus und man darf die TEMP-Variablen nicht verschieben. Besser:
Code:
      LAR1  P##myZeiger
      L     W#16#1007
      T     LW [AR1,P#0.0]
      L     18
      T     LW [AR1,P#2.0]
      L     22
      T     LW [AR1,P#4.0]
      L     #IndexU
      SLD   3
      L     P#DBX 0.0                   //Bereichskennung DB: 16#84
      OD 
      T     LD [AR1,P#6.0]

Harald
Hallo Harald,

erstmal Danke für deine schnelle Antwort.

Bin ziemlich sicher, dass die komischen Werte vom FC3 kommen, da ich die Übertragung mit einem Taster vom Touch anstoße die ich ausschliesslich am Enable des FC3 verwende und die Werte vor Betätigung des Tasters nicht erscheinen.

Der #retval hat mir immer 0 angezeigt.

Ich habe, hoffentlich in deinem Sinne, den FC angepasst. Umdrehungen und Drehzahl werden nun wie beabsichtigt in den DB22 geschrieben.

Kommt der Fehler möglicherweise durch meine "schlampige" Adressierung Zustande? LB 0 usw.?

Eigenartig finde ich es trotzdem, dass das ganze in FC2 funktioniert.

Danke für deine Hilfe, ich werde nun versuchen die restlichen Parameter anhand deines Beispiels zu kopieren.

Gruß Nico
 

Anhänge

  • FC3_1.JPG
    FC3_1.JPG
    62,4 KB · Aufrufe: 10
  • FC3_2.JPG
    FC3_2.JPG
    37,3 KB · Aufrufe: 11
Kommt der Fehler möglicherweise durch meine "schlampige" Adressierung Zustande? LB 0 usw.?
Nein, das muss genauso funktionieren. Solange #myZeiger und #myZeiger2 an L0.0 und L10.0 liegen. Der Code passt sich nur nicht an und funktioniert nicht mehr, falls mal die TEMP-Variablen verschoben werden.

In FC3 NW4+5 hast/hattest Du als Datentyp-Kennung B#16#5 (für INT) verwendet, in den anderen gezeigten Netzwerken hast Du B#16#7 (für DINT) verwendet. Vielleicht war das B#16#5 falsch?

Funktioniert Dein Code nun wie gewünscht? Oder besteht das Problem immer noch?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, das muss genauso funktionieren. Solange #myZeiger und #myZeiger2 an L0.0 und L10.0 liegen. Der Code passt sich nur nicht an und funktioniert nicht mehr, falls mal die TEMP-Variablen verschoben werden.

In FC3 NW4+5 hast/hattest Du als Datentyp-Kennung B#16#5 (für INT) verwendet, in den anderen gezeigten Netzwerken hast Du B#16#7 (für DINT) verwendet. Vielleicht war das B#16#5 falsch?

Funktioniert Dein Code nun wie gewünscht? Oder besteht das Problem immer noch?

Harald
Danke für deine tollen Infos. Jetzt funktioniert mein Code.

Habe den Fehler nun an einer anderen Stelle gefunden.
Den Index den ich erzeugt habe, wurde nur beim Aufruf der HMI-Seite erzeugt und war somit zum Zeitpunkt des Rückkopierens unbestimmt.
Da bei Umdrehungen der Offset 0 ist, war es kein Problem. Erst ab dem zweiten Wert wurde es dann problematisch.
Das erklärt dann auch die komischen Werte an der falschen Stelle.

Wie immer sitzt der Fehler zwischen Tastatur und Stuhllehne :).
Seit gestern Mittag rätsel ich nun schon an diesem Phänomen :).

Meine Vermutung war eigentlich dass ich irgendwelche Adressierungsfehler oder überschreibungen gemacht habe, da ich bisher nichts mit Pointern zu tun hatte.

Zum Adressregister hätte ich noch eine Frage, falls du so nett wärst. Ich habe bei einem anderen Projekt gesehen, dass das Adressregister auf temp gelegt wurde: TAR1 #AR1_safe. Am Ende des Bausteins wurde dann: LAR1 #AR1_safe.

In den Netzwerken dazwischen wurde ganz normal mit z.B. [AR1,P#2.0] gearbeitet.

Ist das Adressregister dann normalerweise im allgemeinen Arbeitsspeicher und nicht im FC? Könnte ich da probleme bekommen, falls 2 Bausteine gleichzeitig das AR1 benutzen.

Vielen Dank

Gruß Nico
 
Zum Adressregister hätte ich noch eine Frage, falls du so nett wärst. Ich habe bei einem anderen Projekt gesehen, dass das Adressregister auf temp gelegt wurde: TAR1 #AR1_safe. Am Ende des Bausteins wurde dann: LAR1 #AR1_safe.
Das wird "von alten Hasen" oft so gemacht, ist bei S7 aber nicht nötig. Stört aber auch nicht.
Bei Aufruf eines Bausteins wird AR1 automatisch gesichert und beim Verlassen wiederhergestellt - man muß das AR1 nicht mehr selber sichern.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das wird "von alten Hasen" oft so gemacht, ist bei S7 aber nicht nötig. Stört aber auch nicht.
Bei Aufruf eines Bausteins wird AR1 automatisch gesichert und beim Verlassen wiederhergestellt - man muß das AR1 nicht mehr selber sichern.

Harald
Vielen Dank Harald,

wünsch dir noch eine schöne und erfolgreiche Woche.

Gruß

Nico
 
Zurück
Oben