Ich hab noch ein wenig rumprobiert und bin mir sicher dass die sps bei
auf jeden fall in "Stop" gegangen ist.
Bei dieser Operation ist die CPU
GARANTIERT NICHT in Stop gegangen.
Da wird nur das Adressregister AR2 mit irgendeiner Adresse geladen, es ist noch nicht einmal ein Speicherzugriff.
Die CPU geht aber z.B. bei
= [AR2,P#0.0] in Stop, wenn Dein Instanz-DB nicht mindestens 8 Byte lang ist (und kein OB121 in der CPU ist).
Die genaue Stop-Stelle erfährt man aus dem Diagnosepuffer der CPU, da ist direkt vor (unter) dem Eintrag "STOP durch Programmierfehler" der Eintrag mit der Fehlerursache, bei Dir: "Bereichslängenfehler beim Schreiben". Den Eintrag markierst Du und liest Dir die Details zum Ereignis durch.
Ereignis 2 von 2: Ereignis-ID 16# 2523
Bereichslängenfehler beim Schreiben
Instanz-DB , Bitzugriff, Zugriffsadresse: 7
Das bedeutet: Der Instanz-DB in der CPU hat keine Adresse 7, er ist also zu kurz oder garnicht geladen.
Die Operation war ein Bit-Schreibzugriff: S, R oder =.
Mit dem Button "Baustein öffnen" springt Step7 dann genau zu der Zeile, die den Fehler verursacht hat.
Was mir noch nicht ganz klar ist, warum der code den du geschrieben hast nicht funktioniert hat.
Der Code, den ich geschrieben habe, der funktioniert.
Es funktioniert nicht der Code, den Du daraus gemacht hast.
Wie ich weiter oben schon schrieb:
LAR2 P#DIX 7.0 solltest Du noch zu einem symbolischen Zugriff umformulieren.
Der Bereich, wohin Du die Eingangszustände kopieren willst, beginnt bei Dir höchstwahrscheinlich nicht bei DBX7.0.
Bei einem symbolischen Zugriff setzt der Editor automatisch die richtige Adresse ein.
Ist es so schwer, hier endlich mal die Deklaration Deines FB zu posten? Du brauchst keine Betriebsgeheimnisse verraten, Deinen Code brauchen wir nicht, um die kurze Programmschleife passend zu Deinem FB umzuschreiben.
Ohne Deine FB-Deklaration können wir Dir auch wieder nur Code geben, der andere Variablennamen als bei Dir hat, an dem Du dann "kaum" etwas ändern mußt - und bums - geht Deine CPU wieder in Stop.
Wenn Du es selber hinbekommen willst, dann brauchst Du:
- einen Eingangsparameter "Eingangsbereichsanfang" vom Typ POINTER
- einen Eingangsparameter (oder TEMP/STAT-Variable) "Eingangsbereichsende" vom Typ POINTER
- eine TEMP/STAT-Variable (oder Eingangsparameter) "Eingangsbereichslaenge" vom Typ INT (Dein FB muß ja auch wissen, ob er 8 oder 13 Eingänge verarbeiten muß)
(die Länge kann der FB aus "Eingangsbereichsende" und "Eingangsbereichsanfang" selber berechnen oder das Ende aus Anfang und Länge)
- ein ARRAY[0..15] OF BOOL im STAT-Bereich Deines FB, wohin die Eingangszustände kopiert werden
- statt P#DIX 7.0 mußt Du den Name des Arrays einsetzen
- falls Dein FB als Multi-Instanz genutzt wird, mußt Du den Multi-Instanz-Offset im AR2 beachten (besser: das AR2 auf jeden Fall dazuaddieren)
- Beachte: zwischen dem LAR2 P#DIX 7.0 und dem LAR2 #tmpDW_AR2save kann nicht symbolisch auf Variablen der Instanz zugegriffen werden
Viel Erfolg!
Harald