Problem bei einer Such-Schleife

Zuviel Werbung?
-> Hier kostenlos registrieren
Da muß ich dich mal korrigieren, was du schreibst trifft zwar zu, aber beim Thema Pointer hat Imker das schon korrekt gemacht.
Ein Pointer wird ja erstellt, indem man die gewünschte Byteadresse nimmt und damit ein SLD3 ausführt. Das bedeutet ja nicht anderes als mit 8 multiplizieren. Folglich ist der einfache Zeiger ohne Bereichsinformation im Prinzip ein "Durchnummerieren" der einzelnen Bits. DBX6.4 würde also tatsächlich 8*6+5=53 entsprechen, wenn man den Pointer dezimal eingeben will. Die Schreibweise P#6.4 gefällt mit aber auch besser.

Stimmt, habe ich übersehen.
Ob der TE das so gemeint oder doch nur abgeschrieben hat?
Eigentlich hätte er, wenn er das Programm wirklich selbst entwickelt, mich auf meinen Denkfehler hinweisen müssen. :ROFLMAO:

Mir geht / ging das Schreiben etwas gegen den Strich, da ich den Sinn nicht verstehe.
Warum wird das Suchen nicht mit den Adressregistern gemacht, wie es an sich üblich ist?
Es ist doch dumm, einen Ansatz zu kopieren, nicht zu verstehen und dann so lange nach Hilfe rufen bis der Mist läuft, den der nächste, der abschreibt wieder nicht versteht.


bike
 
Zum letzten mal, ich habe das nicht abgeschrieben.
Ich hab mir zuerst eine Datenstruktur überlegt, hab dann auf der Seite von Siemens und in Büchern nachgeschaut wie man so eine Schleife programmieren kann. Habs dann selber probiert und nach nun vielen frustierenden Stunden mich hier angemeldet um mir Hilfe zu besorgen. Wenn ich das kopiert hätte, dann sicher richtig und würde hier nicht nach Hilfe fragen. Ich verlange ja auch niemanden der mir hier eine perfekte Lösung liefert.
Mit Pointern kenne ich mich wie schon geschrieben leider nicht aus. Vom Prinzip her weiß ich was Sie machen, aber Anwendung ist eine andere Sache.

Ich weiß nicht wie ich noch beweisen soll, dass das ganze von mir kommt - keine Ahnung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zum letzten mal, ich habe das nicht abgeschrieben.
Ich hab mir zuerst eine Datenstruktur überlegt, hab dann auf der Seite von Siemens und in Büchern nachgeschaut wie man so eine Schleife programmieren kann. Habs dann selber probiert und nach nun vielen frustierenden Stunden mich hier angemeldet um mir Hilfe zu besorgen. Wenn ich das kopiert hätte, dann sicher richtig und würde hier nicht nach Hilfe fragen. Ich verlange ja auch niemanden der mir hier eine perfekte Lösung liefert.
Mit Pointern kenne ich mich wie schon geschrieben leider nicht aus. Vom Prinzip her weiß ich was Sie machen, aber Anwendung ist eine andere Sache.

Ich weiß nicht wie ich noch beweisen soll, dass das ganze von mir kommt - keine Ahnung.


Lass es gut sein.
Du hast das entwickelt, kannst dein Konzept nicht erklären und auch nicht wie du zu den Werten kommst.

Wenn deine PLC auf Stop geht, dann kann man nachschauen, was in der Diagnose steht.
Das ist hilfreich für die Fehlersuche.


bike
 
@Imker: Musst Du doch auch nicht.

@bike: Dir würde es manchmal gut tun, nicht immer mit solch einem Negativdenken an die Dinge heranzugehen. Wenn Du Dich selbst mal hinterfragst würde Dir das bestimmt gut tun.
 
Aber ich hab mein Konzept doch erklärt (1. Beitrag). Ich kann aber gerne nochmal erklären was ich mir da genau vorstelle, nur im detail nicht, da ich morgen noch andere sachen machen muss..

Zu den Werten: So wie ich es verstanden habe, wird jedes bit, von 0.0 an immer um eins höher gezählt wird. Deswegen ist 0.0=1, 0.1=2 usw. Die Zahlen entsprechen also dem jeweiligen Bit. Daher auch die dbx6.4=52. Aber ich werde den Vorschlag hier aufgreifen und lieber L P#6.4 schreiben.
Mein DB hat ein DBD als Suchzeiger: Ein word für die Suche und eins für die Daten. Um genauer zu sein: DW0 ist mein reiner suchzeiger, DBW2 ist mein zeiger, in den ich die gefunde position reinschreibe.
Im Db folgen dann ab 4.0 aufwärts die 21 positionen.
Waren das die Werte?

Das S7 so was wie eine Diagnose hat ist mir vollkommen fremd. Bin Neuling auf dem Gebiet. Ich habe heute z.B.: erst herrausgefunden, dass ich das Programm in Step 7 mit PLC-Sim simulieren kann...
 
Zum letzten mal, ich habe das nicht abgeschrieben.
...
Ich weiß nicht wie ich noch beweisen soll, dass das ganze von mir kommt - keine Ahnung.
Hallo Imker,
lass dich von bike nicht entmutigen.
Der hat gegen alle etwas, wahrscheinlich auch gegen sich selbst.
Er hat was gegen Schüler, Studenten und jetzt auch etwas gegen Leute die sich anhand von Beispielen weiterbilden wollen.
Eine wirkliche Hilfe wird wohl keine von ihm bekommen.
Sehe ihn einfach als unser Furunkel des Forums.

@Edit: Dieser Spruch allein schon nervt:
Mir geht / ging das Schreiben etwas gegen den Strich, da ich den Sinn nicht verstehe.
Warum wird das Suchen nicht mit den Adressregistern gemacht, wie es an sich üblich ist?
Es ist doch dumm, einen Ansatz zu kopieren, nicht zu verstehen und dann so lange nach Hilfe rufen bis der Mist läuft, den der nächste, der abschreibt wieder nicht versteht.
Nur weil du etwas nicht verstehst geht es dir gegen den Strich? Bike, halt dich doch einfach raus, ich glaube du verstehst noch vieles nicht.
 
Zuletzt bearbeitet:
@Edit: Dieser Spruch allein schon nervt:

Nur weil du etwas nicht verstehst geht es dir gegen den Strich? Bike, halt dich doch einfach raus, ich glaube du verstehst noch vieles nicht.

Gut dass du alles verstehst.
Der Kollege hat etwas hier reingestellt, das in keiner Weise klar und schlüssig ist.
Und du darfst versichert sein ich verstehe von Siemens PLC einiges.


bike

btw darf ich dich als Weltversteher dann fragen, wenn ich etwas nicht verstehe?
 
Also ihr braucht euch doch deswegen nicht zu streiten....

Es gibt zumindest - teilweise - gute nachrichten. Laut der Simulation schreibt mein Programm nun in meinen DB. Trotzdem hab ich noch eine Frage und ein Problem:
Zuerst zur Frage: Wenn ich nach dem simulieren in den einzelnen Bits des DB reingucke, dann sagt er in der Datenansicht immer FALSE. Wenn ich aber nun während der Simulation mit der "Brille" reingucke schreibt er sie auf true. Meine Frage nun: speichert der die nich irgendwie, dass ich dann auch nach offlineschalten sehe, welcher platz belegt ist?

Nun zu meinem Problem...
Ich habe mit der Diagnosefunktion rausgefunden, wieso mein programm immer auf stop geht. Grund ist meine indirekte adressierung. Hier mein Programmauszug:
Code:
AUF   DB     4                    // öffne meinen warteschlangen DB

      L     MB    90                    //  Lade das MB, was die bits 15 bis 7 des auftrages enthällt
      T     DBB [DBD 0]                 // Transferie das in den Zeiger  des DB4 (gleicher aufbau wie DB 11). er sollte auf das nächste freie  zeigen
      L     8                           // mein "offest" für die bits 7 bis 0 "dranzuhängen....
      L     DBD    0
      +D    
      T     DBD    0

      AUF   "PositionenRegal"           // öffne den platzverwaltungs-db
      L     DBB   23                    // lade NUR die x und y-position aus dem Zeiger (geht das?)
      AUF   DB     4                    // nun der warteschlangen-db 
      T     DBB [DBD 0]                 // lade das in den nächsten  freien auftrag. DBD 0 ist wie im anderen DB ein zeiger auf das nächste  freie Element
      L     8                           // mein "offest" um aufs nächste freie word zu kommen
      L     DBD    0
      +D    
      T     DBD    0

Nach einem Durchlauf springt das DBD 0 immer auch eine Zahl über eine Millionen (Dezimal). Ich habs zu Beginn auch mal 0 gesetzt oder auf einen gewissen Wert - hilft alles nichts....
 
Hallo,
ich habe mir jetzt nicht die Vorgeschichte in dem Thread durchgelesen ...

Aber was dein Problem angeht : du mußt beim Hochzählen deines DBD0 natürlich auch abfragen, wann du die Grenze deines Suchbereichs erreicht hast. Sonst zählt das Ding (wie du selbst schreibst) bis Ultimo und überschreitet dann natürlich auch die Grenzen des DB's (und des SPS-Speichers).

Also : irgendwann bei Start das DBD0 auch mal auf 0 setzen und während des Laufens die Grenze abchecken und dann aufhören ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, das ist mir bewusst. Habs aber tatsächlich noch nicht drinnen. Mach ich aber noch. Ich hab das DBD 0 aktuell auf den Startwert gesetzt.
Nur wenn ich das jetzt zyklisch simuliere, dann hat er schon im ersten durchlauf einen wert von über 2 mio (binär).
Ich konnte den Fehler noch eingrenzen, er passiert hier:
Code:
AUF   "PositionenRegal"           // öffne den platzverwaltungs-db       
L     DBB   23                          
AUF   DB     4                           
T     DBB [DBD 0]           // hier bekommt er den hohen wert

Es passiert also während ich die beiden DB's öffne. Zuvor hat er laut Simulation noch den gewünschten Wert (32) bzw. bei indirekt steht 4.0
 
So wie ich das sehe passiert der Fehler weil du mit unterschiedlichen Größen arbeitest.
Einmal ladest du ein Byte dann wieder ein Doppelwort.
 
Aber das sind doch beides Byte, oder? Das DBD 0 ist ja nur der Zeiger wegen der indirekten Adressierung. Da soll ja normalerweise beim ersten Durchlauf eine 32 drin stehen - für das DBB 4 dann.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber das sind doch beides Byte, oder? Das DBD 0 ist ja nur der Zeiger wegen der indirekten Adressierung. Da soll ja normalerweise beim ersten Durchlauf eine 32 drin stehen - für das DBB 4 dann.
Jupp.
Was heißt denn bei dir nach "zyklisch simuliere"? Pro Zyklus wird doch die Schleife komplett durchgelaufen. Und somit geht es in den Überlauf von 2 Mrd.
Mach doch mal die Abbruchbedingung rein wie es Larry schon vorgeschlagen hat und schau anschließend was eingetragen wurde.
 
Die habe ich inzwischen drinnen:

Code:
      L     DBD    0
      L     368
      <=D   
      SPBN  ENDE

Mit zyklisch meine ich die Simulation (PLC-Sim, Taste F9). Beim ersten durchlauf ist noch alles ok, dann kommt der zur besagten Stelle. Beim nächsten Durchlauf greift dann die Abbruchbedingung und er springt auf Ende. Die Steuerung geht dadurch auch nicht mehr auf Stop.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Okay, ist geändert, danke.

Nur ist das Problem immer noch da. Nach dem 1. Schleifendurchlauf schreibt er eine riesige Zahl in den DBD 0. Im nächsten Durchlauf greift dann die Abbruchbedingung und er kommt dementsprechend nicht mehr in die Schleife.:confused:

EDIT: ES GEHT!!! Aber ich weiß nicht wie ich das gemacht habe :confused:
Ansich hab ich nur mit dem Startwert rumgespielt ??

Vielen Dank euch allen bis hierher. Ich hoffe ich schaffe den Rest der Aufgabe allein :)
 
Zuletzt bearbeitet:
Zurück
Oben