# verschiedene ergebnisse aus 0b 35 addieren



## stift (18 Februar 2008)

hi 
ich komme grade nicht weiter. 
ich berechne meine formel zur geschwindigkeitsmessung mit einfluss von ob35. 
nun arbeitet die cpu meine formel ja zyklisch durch. 
mein ziel ist es alle einzelergebnisse zu addieren und anschließend durch die anzahl der teilschritte zu teilen. 

leider kann ich die einzelergebnisse irgendwie nicht addieren 
	
	



```
L #Betrag_Geschwindigkeit
L "DB_V-Messung".Summe_Momentangeschw
+R
T "DB_V-Messung".Summe_Momentangeschw
```
 
So habe ich gedacht kann ich die summe aller momentangeschwindigkeiten bilden. 
Allerdings funktioniert das nicht. "Summe_Momentangesch" ist immer null. Es wird nicht dazu addiert. 
Wie müsste ich denn Vorgehen um die Summe aller Momentangeschwindigkeiten zu bilden. 
Ob 35 rechnet die jeweilige Momentangeschwindigkeit alle 25ms aus.


----------



## vierlagig (18 Februar 2008)

die beiden variablen sind vom datentyp REAL?


----------



## Larry Laffer (18 Februar 2008)

Die Formel ist so richtig und sollte funktionieren ...
Was steht denn in "Betrag_Geschwindigkeit" in der Online-Sicht ?


----------



## stift (18 Februar 2008)

ja genau, 
die daten sind vom datentyp real. 
allerdings wenn ich in den beobachtungsmodus schalte steht bei summe-momentangeschwindigkeit immer 0 und bei betrag geschwindigkeit irgendein wert, für einen beliebigen zeitpunkt den mir mein fc errechnet.


----------



## kiestumpe (18 Februar 2008)

Hast du den DB schon auf der CPU?


----------



## Larry Laffer (18 Februar 2008)

kiestumpe schrieb:


> Hast du den DB schon auf der CPU?


 
... dann würde die CPU in Stop gehen ...

Was machst du denn sonst noch so mit dem "DB_V-Messung".Summe_Momentangeschw ...?


----------



## kiestumpe (18 Februar 2008)

Larry Laffer schrieb:


> ... dann würde die CPU in Stop gehen ...


Und woher weisst du, ob da nicht OB121 auf der CPU ist 

Vielleicht wird aber auch  "DB_V-Messung".Summe_Momentangeschw noch irgendwo anders verwendet? Womöglch überlappend?


----------



## stift (18 Februar 2008)

also außer ob1 und ob35 werden ganz sicher keine obs verwendet. 
Summe_Momentangeschwindigkeit wird ganz sicher nur in diesem fc verwendet. Mein db ist auch auf der cpu, da die anderen variabeln aus dem db ganz normal arbeiten


----------



## Larry Laffer (18 Februar 2008)

... ganz so kann es ja nicht sein ...

1. kann ich mich erinnern, dass du mit den Werten etwas ausrechnen wolltest (Mittelwert oder so) - das wird also sicherleich auch irgendwo programmiert sein.

2. das von dir eingestellte Netzwerk funktioniert so. Einzige Ausnahme : der Wert, der von einem FC generiert wird hat in jeweils aufeinanderfolgenden Zyklen jeweils abwechselnd den gleichen Wert positiv wie negativ. Das kann ich mir allerdings nicht vorstellen, da du ja geschrieben hast, dass der FC sinnvolle Werte ausgibt - habe ich jedenfalls so verstanden ...


----------



## kiestumpe (18 Februar 2008)

Larry Laffer schrieb:


> ...
> 2. das von dir eingestellte Netzwerk funktioniert so. Einzige Ausnahme : der Wert, der von einem FC generiert wird hat in jeweils aufeinanderfolgenden Zyklen jeweils abwechselnd den gleichen Wert positiv wie negativ. Das kann ich mir allerdings nicht vorstellen, da du ja geschrieben hast, dass der FC sinnvolle Werte ausgibt - habe ich jedenfalls so verstanden ...



hmm wenn ich mich recht erinnere, hast du einen Antrieb mit Kurbel, d.h. der Schlitten fährt ständig vor und zurück - dann kann das sogar richtig sein .

du kommst anscheinend wieder grad an das Problem, dass dein Algorhytmus nicht so richitg mit der Abtastzeit zusammen passt, was ich ein Stück weiter vorher mal drauf hingewiesen hab.
Aber ist ja auch für nen Lernprozess...:-D


----------



## Larry Laffer (18 Februar 2008)

Ist eine Frage, wie lange der Fahr-Vorgang dauert. Für eine reine Messwert-Aufnahme ist 25 ms OK. Für Statistik-Funktionen vielleicht etwas lahm ... Da wären vielleicht 5 ms besser ...

Es wäre aber schon unwarscheinlich, das sich berechnete Werte absolut kompensieren ...
Wir wissen allerdings auch nicht, was der FC ausgibt ...


----------



## Grubba (18 Februar 2008)

Hallo Stift,

versuch doch einfach mal, irgendein freies Doppelwort anstelle Deines Wertes im DB zu verwenden. Wenns dann funktioniert, überschreibst Du irgendwo Deinen Wert im DB.


----------



## stift (19 Februar 2008)

ihr habts erfasst. 
es geht wieder um diesen schlitten. 
mein signal das mein fc ausgibt ist zwar sinusförmig, aber ich rechne davon den betrag aus und desshalb können sich die negativen und die positiven werte nicht wegaddieren. 
meine drehzahl ist maximal 40 1/min das heist ein zyklus dauert max 1,5s. 
diese 1,5s splitte ich in lauter inkremente zu 50ms auf, d.h. mein ob35 soll mir die werte für t=0, 0,050, 0,100 usw. bis 1,5 s hochrechnen. 
Kurioserweise ist heute ein neues problem aufgetaucht. 
er rechnet mir überhaupt nichts mehr aus da er sagt dass t immer 0 ist.
darum funktionieren die nachfolgenden netzwerke nicht mehr, da deren eingangsgröße ja dann logischerweise auch null ist. 

ob35 habe ich so programmiert dass ich sage 
	
	



```
L DB10.Zeit_fuer_Umdrehung
L Db10.Zeit
<R

SPBNB M001
L DB10.Zeit
L 5.000000e-002
+R
T DB10.Zeit
M001: NOP 0
```
Das müsste doch so passen oder. 
ich möchte dass er immer weiter 50ms hinzuzählt bis die zeit für eine umdrehung erreicht ist.


----------



## Larry Laffer (19 Februar 2008)

? ... tut mir leid, den Sinn des abgebildeten Netzwerkes habe ich leider nicht verstanden - trotz deiner Beschreibung.

Wofür zählst du die Zeit hoch ?
Warum zählst du die Zeit (wenn du sie benötigst) nicht ständig hoch und setzt sie auf "0.0" wenn du von neuem beginnst ?

Gruß
LL


----------



## stift (20 Februar 2008)

genau das mache ich ja damit.
also ob 35 habe ich jetzt ausreichend getestet. daran liegt es nicht. 
allerdings habe ich jetzt den betrag von meiner geschwindigkeit mal auf ein dbd gelegt und beobachtet und da ist ebenfalls ein fehler. 

meine betragsrechnung sieht folgendermaßen aus:

```
L #Geschwindigkeit
         L 0.000000e+000
         >R
         SPBNB M010
 
         L #Geschwindigkeit
         T #Betrag_Geschwindigkeit
 
M010:    L #Geschwindigkeit
         L -1.000000e+000
         *R
         #Betrag_Geschwindigkeit
```
Stimmt meine Rechnung so um den Betrag zu erhalten?
Ich kann leider keinen Fehler finden. 
Habs schon verzweifelt versucht.


----------



## Larry Laffer (20 Februar 2008)

... wenn du auf diese Weise einen negativen Wert zu einem positiven machen willst, dann würde ich das so machen :

```
L #Geschwindigkeit
L 0.000000e+000
>R
SPB M010
SPA M020
 
M010: L #Geschwindigkeit
         T #Betrag_Geschwindigkeit
         spa M030

M020: L #Geschwindigkeit
         L -1.000000e+000
         *R
         T #Betrag_Geschwindigkeit
 
M030: nop 0
```


----------



## vierlagig (20 Februar 2008)

Larry Laffer schrieb:


> ... wenn du auf diese Weise einen negativen Wert zu einem positiven machen willst, dann würde ich das so machen :
> 
> ```
> L #Geschwindigkeit
> ...



und warum nicht?


```
L #geschwindigkeit
ABS
T #betrag_geschwindigkeit
```


----------



## stift (20 Februar 2008)

es funktioniert. 
Danke!
Famos, Famos. 
Jetzt hab ich nur noch ein paar eklige Rechenfehler drin, aber immerhin arbeitet die sache schon mal.


----------



## stift (20 Februar 2008)

tut mir leid aber ich steht schon wieder auf dem schlauch. 
um die durchschnittsgeschwindigeit zu ermitteln addiere ich doch alle werte zu einer summe und dividiere die dann durch die anzahl der teilschritte (siehe oben)

In den Befehl
	
	



```
L #Betrag_Geschwindigkeit
L DB10.Summe_Momentangeschw
+R
T DB10.Summe_Momentangeschw
```
 
musste ich noch eine Funktion einfügen dass nur solange addiert werden soll bis der ob35 einmal durch ist, d.h. bis er einmal den Zyklus abgearbeitet hat. 
Also bis alle Ergebnisse für die Zeiten 0s, 0,05s 0,1s usw. einmal addiert worden sind. 
Ansonsten würde ja immer weiter addiert und mein Ergebnis wäre total Schwachsinnig. 
Wie würdet ihr das machen?


----------



## vierlagig (20 Februar 2008)

da wird nur einmal je weckalarm addiert ... oder ist dein codeschnipsel aus einem anderen, zyklisch durchlaufenen baustein? wenn ja, dann würd ichs so machen:


```
U     #TRIGGER
      FP    #HELP_FLAG
      SPN   _001

      L     #ACCU_1
      L     #ACCU_2
      +R    
      L     #ACCU_3
      +R    
      L     #ACCU_4
      +R    
      L     #ACCU_5
      +R    
      L     #ACCU_6
      +R    
      L     #ACCU_7
      +R    
      L     #ACCU_8
      +R    
      L     8.000000e+000
      /R    
      T     #OUTPUT
_001: NOP
```

und als trigger zum beispiel den cpu-takt


----------



## stift (20 Februar 2008)

Also der codeschnipsel ist aus meinem fc. 
dort wird der betrag der geschwindigkeit berechnet. dieser betrag der geschwindigkeit steht in abhängigkeit von der zeit t, d.h. er wird in meiner formel aufgegriffen. 

Dadurch dass der wert von 0b35 mit einfließt ist der fc ja auch zyklisch durchlaufend oder?

Wäre es vielleicht einfacher wenn ich meinen kompletten fc nehmen würde und in den ob 35 einfügen würde?


----------



## vierlagig (20 Februar 2008)

stift schrieb:


> Also der codeschnipsel ist aus meinem fc.
> dort wird der betrag der geschwindigkeit berechnet. dieser betrag der geschwindigkeit steht in abhängigkeit von der zeit t, d.h. er wird in meiner formel aufgegriffen.



das nächste mal einfach dazu schreiben



stift schrieb:


> Dadurch dass der wert von 0b35 mit einfließt ist der fc ja auch zyklisch durchlaufend oder?



der ob35 wird zu bestimmten zeiten einmal durchlaufen, deine fc mit jedem cpu-zyklus



stift schrieb:


> Wäre es vielleicht einfacher wenn ich meinen kompletten fc nehmen würde und in den ob 35 einfügen würde?



nein, denn du solltest den ob35 so klein wie möglich halten *IMHO*
aber schau dir nochmal meinen letzten beitrag an, da gibts code... beachte aber das help_flag nicht im temp_bereich deiner FC liegen kann...


----------



## stift (20 Februar 2008)

könntest du mir den code ein bisschen erläutern?
Für mich ist das absolutes neuland. 
Ich hab mal gehört dass der akku irgendein zwischenspeicher ist aber was das mit meinem fc aus sich hat... -kein plan. 
Was bedeutet denn diese 8.0e0000000+000?


----------



## vierlagig (20 Februar 2008)

stift schrieb:


> könntest du mir den code ein bisschen erläutern?
> Für mich ist das absolutes neuland.
> Ich hab mal gehört dass der akku irgendein zwischenspeicher ist aber was das mit meinem fc aus sich hat... -kein plan.
> Was bedeutet denn diese 8.0e0000000+000?



aber klar kann ich, wenn dir *F1* zu weit weg ist 


```
U     #TRIGGER             //berechnungsfreigae
      FP    #HELP_FLAG           //auf positive flanke prüfen
      SPN   _001                 //denn nur dann wollen wir rechnen
                                 //ansonsten springen wir zu label _001 und machen nichts
      L     #ACCU_1              //ACCU sind die variablen aus MEINEM baustein
      L     #ACCU_2              //bei dir könnte es geschwindigkeit eins bis
      +R                         //zwölfzig sein
      L     #ACCU_3              //egal
      +R                         //die addieren wir hier jedenfalls erstmal
      L     #ACCU_4
      +R    
      L     #ACCU_5
      +R    
      L     #ACCU_6
      +R    
      L     #ACCU_7
      +R    
      L     #ACCU_8                //letzter wert
      +R                           //addiert
      L     8.000000e+000          //und da es alles real zahlen waren und auch ne realzahl
      /R                           //rauskommen soll dividieren wir hier mit real anzahl der
      T     #OUTPUT                //summierten elemente und schreiben es in den output - fertig!
_001: NOP
```


----------



## stift (20 Februar 2008)

so wie ich dich verstehe sind die akkus die einezelergebnisse. 
problem ist aber dass ich keine feste anzahl von rechenschritten habe. 
d.h. ich habe so viele rechenschritte wie "Zeit_pro_Umdrehung" durch 0,05s da ich in meinem ob35 immer 50ms dazuzähle. 
d.h. bei 40 u/min hätte ich 30 Einzelergebnisse die ich summieren will
      bei 20 u/min hätte ich 60 Einzelergebnisse 
      usw.

damit ändert sich ja auch die triggerzeit. 
d.h. bei 40 u/min >>> höre nach 1,5s auf zu summieren
      bei 20 u/min >>> höre nach 3s auf zu summieren
      usw.


----------



## Larry Laffer (20 Februar 2008)

Vielleicht mal ein anderer Vorschlag in Anlehnung an den Beitrag von Vierlagig :

Du machst dir einen DB-Messwerte in dem du Platz lässt für die max-. Anzahl von Messwerten. In diesen DB trägst du den aktuellen Messwert an der ersten freien Stelle ein und erhöhst den Eintrag-Zähler. Wenn deine Fahrt abgeschlossen ist, dann machst du eine Komplett-Auswertung und löscht den DB wieder. Hier brauchst du dann auch nicht das Trigger-Intervall im OB35 mitzurechnen ...
Hieraus ergibt sich noch zusätzlich die Möglichkeit, die aufgenommenen Messwerte auf einer entsprechenden Visu darzustellen.

Vielleicht wäre das ja etwas für dich für die Zukunft.

Gruß
LL

@Vierlagig:
Die Variante mit dem ABS-Befehl kannte ich noch nicht ... Da habe ich dann auch noch etwas dazu gelernt ...


----------



## stift (20 Februar 2008)

sorry
ich versteh nicht ganz
was ist denn ein eintrag-zähler???


----------



## Larry Laffer (20 Februar 2008)

stift schrieb:


> sorry
> ich versteh nicht ganz
> was ist denn ein eintrag-zähler???


 
Der Eintrag-Zähler zählt die Anzahl der erfassten Einträge in deinem DB. Den kann man dann für das Hineinschreiben auch als Pointer missbrauchen und natürlich für die Mittelwert-Bildung als Teiler ...


----------



## stift (20 Februar 2008)

Ich versteh leider schon wieder nicht. 


> Du machst dir einen DB-Messwerte in dem du Platz lässt für die max-. Anzahl von Messwerten. In diesen DB trägst du den aktuellen Messwert an der ersten freien Stelle ein und erhöhst den Eintrag-Zähler.


Da müsste ja dann jedes Ergebnis ein eingendes Doppelwort in meinem DB haben oder versteh ich das falsch?
Wie müsste ich das dann adressieren?


----------



## Larry Laffer (20 Februar 2008)

siehe hierzu bitte den Beitrag in der FAQ von Volker :
http://www.sps-forum.de/showthread.php?t=8887


----------



## stift (20 Februar 2008)

Es funktioniert 
Ich hab die sache allerdings anders gelöst. 
Ich habe mich an einen anderen Tipp von dir erinnert, den ich bisher noch nicht umsetzen konnte. 
http://www.sps-forum.de/showthread.php?t=18030&page=2

v=s/t 

Wenn alles so einfach wäre...

Danke für deine Mühe mir die variante mit dem db zu erklären, aber ich glaube das ist mir im Moment noch etwas zu hoch. 
Das was Volker da zu vermitteln versuchte sind für mich böhmische dörfer. 
ich hab kein wort verstanden. 
allerdings hat mich der ehrgeiz jetzt gepackt. 
da werd ich mich wohl mal näher mit beschäftgen. 
http://www.sps-forum.de/showthread.php?t=18030&page=2


----------



## Larry Laffer (20 Februar 2008)

stift schrieb:


> ... allerdings hat mich der ehrgeiz jetzt gepackt.
> da werd ich mich wohl mal näher mit beschäftgen.


 
Das ist gut ...



stift schrieb:


> Danke für deine Mühe mir die variante mit dem db zu erklären, aber ich glaube das ist mir im Moment noch etwas zu hoch.
> Das was Volker da zu vermitteln versuchte sind für mich böhmische dörfer.
> ich hab kein wort verstanden.


 
Wenn du damit loslegst, dann erklären sich warscheinlich viele Sachen von selbst und die anderen fragst du dann. Dann wird das schon was. Der Beitrag von Volker ist eigentlich schön gemacht ... aber denk dran ... Rom wurde auch nicht an einem Tag erbaut ...

Gruß
LL


----------



## stift (25 Februar 2008)

ich hab mich jetzt das wochenende etwas mit diesen pointern beschäftigt. 
Nun möchte ich einen Fc programmieren in dem ich festlegen, dass die einzelergebnisse die ich immer abhängig von db10.dbd0 errechne auf ein eigenes dbd im db "Daten" geschoben werden. z.B.
ergebnis 1--> dbd0
ergebnis 2--> dbd4
uws. 
bis mein zyklus einmal durch ist. 
Wenn dann alle Einzelergenisse auf meinem DB sind kann ich dann ja die Auswertung ohne probleme fahren. 

Ich habe jetzt schon einen kleinen teil programmiert, doch jetzt komme ich nicht weiter wie ich mit den pointern umgehen muss. 

Wie kann ich das anstellen das mein einzelergebniss immer auf das nächste freie dbd schiebe. 
Ich habe mir gedacht ich zähle immer weiter mittels #Pointerwertigkeit bis ich einmal durch bin. 
Wie würdet ihr an dieser Stelle jetzt weiter machen?


```
L     0.000000e+000
      L     DB10.DBD    0
      ==R   
      SPBNB ende
      L     0
      T     #Pointerwertigkeit
ende: NOP   0

      L     #Pointerwertigkeit
      L     1
      +I    
      T     #Pointerwertigkeit

      AUF   "Daten"
      L     #Pointerwertigkeit
      SLD   3                           //pointer erzeugen
      LAR1                              //in das Adressregister laden
      L     #Ergebnis
      T     DBB [AR1,P#0.0]
```


----------



## Gerhard K (25 Februar 2008)

```
L     0.000000e+000
      L     DB10.DBD    0
      ==R   
      SPBNB ende
      L     0
      T     #Pointerwertigkeit
      L 20
      t # loopconter
ende: NOP   0
 
      L     #Pointerwertigkeit
      L     1
      +I    
      T     #Pointerwertigkeit
 
      AUF   "Daten"
      L     #Pointerwertigkeit
      SLD   [COLOR=red]5  [/COLOR]                        //pointer erzeugen [COLOR=red]SLD 5(ist wie mal 4)[/COLOR]
      LAR1                              //in das Adressregister laden
      L     #Ergebnis
      T     DB[COLOR=red]B [/COLOR][AR1,P#0.0] [COLOR=red]// sollte das nicht DBD heißen?? real und byte vertragen sich glaub ich nicht so recht[/COLOR]
[COLOR=#ff0000]    L #loopcounter[/COLOR]
[COLOR=#ff0000]    L 1[/COLOR]
[COLOR=#ff0000]    -I[/COLOR]
[COLOR=#ff0000]    T #loopcounter[/COLOR]
[COLOR=#ff0000]    L 1[/COLOR]
[COLOR=#ff0000]    >=I[/COLOR]
[COLOR=#ff0000]    SPB ende[/COLOR]
```
 
probier das mal.denke das sollte funktionieren.


----------



## stift (26 Februar 2008)

Irgendwo steckt anscheinend noch ein Fehler. 
Ich wollte den Code mal ausprobieren aber die CPU geht sofort in stop. Sobald ich obigen code wieder entferne funktioniert wieder alles.


----------



## Gerhard K (26 Februar 2008)

wie viele werte mußt du in den db speichern??
bzw. wie viele dbd hast du im DB10?
bei dem code werden 20 dbd beschrieben.wenn es die nicht gibt,geht die cpu in stop

      L     0.000000e+000
      L     "SPS_Forum".DB_VAR
      ==R   
      SPB   ende
      L     0
      T     #Pointerwertigkeit
ende: NOP   0
      L     #Pointerwertigkeit
      L     1
      +I    
      T     #Pointerwertigkeit
      AUF   "SPS_Forum"
      L     #Pointerwertigkeit
      SLD   5                           //pointer erzeugen SLD 5(ist wie mal 4)
      LAR1                              //in das Adressregister laden
      L     #Ergebnis
      T     DBD [AR1,P#0.0]             // sollte das nicht DBD heißen?? real und byte vertragen sich glaub ich nicht so recht
      L     20
      L     #Pointerwertigkeit
      <=I   
      SPBN  end1
      L     0
      T     #Pointerwertigkeit
end1: NOP   0
also wenn ich einen DB erzeuge mit 20 DBD (adresse 0.0 bis 80.0) dann funktioniert es.


----------



## stift (27 Februar 2008)

Fehler entdeckt!
Ich hab nicht 20 DBD erstellt sonden nur DBD mit den Adressen 0.0 bis 20.0! 
Dankeschön


----------



## stift (3 März 2008)

Hi, also ich hab jetzt letzte woche das mit dem pointer in einem test-programm ausprobiert und das hat ja einwandfrei geklappt. 
Nun habt ihr mir doch empfohlen dass ich meine einzelergebnisse auf den db mittels eines pointers legen soll um die durchschnittsgeschwindigkeit zu errechnen. 
Mein problem ist nun dass ich bemerkt habe, dass wenn ich eine umdrehungsfrequenz von 10 1/min habe ich 240 dbd vom datentyp real bräuchte um alle einzelergebnisse zu speichern. 
Ist das nicht ein bisschen viel?
In der Step 7 hilfe habe ich leider nicht gefunden wieviele dbd ein datenbaustein maximal haben kann.


----------



## vierlagig (3 März 2008)

stift schrieb:


> In der Step 7 hilfe habe ich leider nicht gefunden wieviele dbd ein datenbaustein maximal haben kann.



maximale datenbausteingröße ist CPU-abhängig


----------



## Larry Laffer (3 März 2008)

stift schrieb:


> Mein problem ist nun dass ich bemerkt habe, dass wenn ich eine umdrehungsfrequenz von 10 1/min habe ich 240 dbd vom datentyp real bräuchte um alle einzelergebnisse zu speichern.
> Ist das nicht ein bisschen viel ?


 
Die üblichen Kurven, die ich so erfasse, haben normalerweise 200 bis 400 Einträge. Das schaffst du m.E. mit jeder der 300er CPU's. Außerdem ist diese Datenmenge auch noch nicht zu groß als Belastung für die Daten-Übertragung zur Visu.

Wenn du Platz sparen möchtest, dann könntest du noch überlegen, ob du wirklich unbedingt REAL-Zahlen brauchst, oder ob du mit INT's nicht genauso gut bedient bist ...

Gruß
LL


----------



## stift (4 März 2008)

Ich brauch noch mal eure hilfe. 
meine Momentanergebnisse werden ja alle 5ms über den Ob 35 errechnet. 
Wie würdet ihr vorgehen um vor dem Pointer zu sagen dass er alle 5ms die momentangeschwindigkeit auf das jeweilige dbd schieben soll. 
Ich habe gedacht ich erhöhe die pointerwertigkeit um 1 wenn der wert des pointers nicht mit dem wert der momentanbeschleunigung übereinstimmt. 
Kann ich das so machen?


```
L        DBD [AR1,P#0.0]
L        #Momentangeschwindigkeit
<>R
SPBN   M020
 
L        #Pointerwertigkeit
L        1
+I
T        #Pointerwertigkeit 
 
usw...
```
Leider geht die CPU immer nach einiger zeit (ca 5s) in stop. 
Es muss irgenwo an dem Netzwerk liegen, da das Progamm ohne Pointernetzwerk funktioniert!


----------



## Larry Laffer (4 März 2008)

Ich könnte mir vorstellen, dass du deinen Pointer über die Grenzen deines DB hinaus erhöhst ...
Fragst du den Pointer auf einen maximalen Wert ab ?

Gruß
LL


----------



## stift (4 März 2008)

das habe ich am schluss programmiert. 
der code-fetzen von oben geht dann wie folgt weiter. 
Ich habe gedacht die Pointerwertigkeit soll dann wieder auf null gesetzt werden sobald mein ob35 bei dem wert angekommen ist den ich für eine Umdrehung brauche. 

```
AUF       "Daten"
 
L           #Pointerwertigkeit
SLD        5
LAR1
L          Momentangeschwindigkeit
T          DBD [AR1,P#0.0]
 
L          DB10.Zeit_fuer_Umdrehung
L          DB10.Zeit
>R
SPBN       M030
 
L           0
T           #Pointerwertigkeit
M030:      NOP 0
```


----------



## Larry Laffer (4 März 2008)

Wie sieht der Vergleich auf Max. den aus und wie groß ist der DB ...?


----------



## stift (4 März 2008)

Im db habe ich 300 dbd`s erzeugt. 
Was meinst du mit vergleich auf max?
ich dachte es reicht wenn ich die pointerwertigkeit auf null setze sobald ob35 die zeit für eine umdrehung erreicht hat.


----------



## Larry Laffer (4 März 2008)

Nein, du musst sicherstellen, dass du kein DBD beschreibst, das es in deinem DB nicht mehr gibt.
Das heißt, du musst auf jeden Fall auch überprüfen, dass du nicht den Adressbereich deines DB's überschreitest ...


----------



## stift (4 März 2008)

es dauert 10 sekunden bis meine drehzahl errechnet ist (ich zähle über dieses zeitfenster hinweg wie oft der bero kommt) schon in dieser zeit geht die cpu auf stop. 
das kann aber eigentlich doch nicht sein, da ich ja sage

L DBD[AR1,P#0.0]
L #Momentangeschwindigkeit
<>R
SPBN M020

....
M020: NOP 0

Mein Pointer hat ja zu diesem Zeitpunkt noch den Wert 0 und die Maximalgeschwindigkeit ist ja ebefalls noch 0, da ich ja noch keine Drehzahl ermittelt habe.


----------



## Larry Laffer (4 März 2008)

... ist Pointerwertigkeit ein DW aus deinem DB ?
Wenn ja, dann schau doch mal nach, was du bei CPU-STOP darin für einen Wert stehen hast ...

Was sagt denn übrigens deine Diagnose zu dem Thema ?
Wo bleibt das Programm stehen und warum ?


----------



## stift (4 März 2008)

die diagnose meldet
"Stop durch Programmierfehler (OB nicht geladen oder nicht möglich, bzw. kein FRB vorhanden)
Unterbrechungsstelle im Anwerderprogramm OB1
FC-Nummer 12
usw. "

Pointerwertigkeit ist dieser Eintragzähler. 
d.h. mit der pointerwertigkeit will ich immer weiter zähler um die eintsprechenden adressen von 0 - 300 im Datenbaustein zu erhalten.


----------



## stift (4 März 2008)

In Pointerwertigkeit steht zu dem Zeitpunkt bei dem die CPU in Stop geht -23282  

Wie geht denn das?
Dieses DBD gibt es selbstverständlich nicht!
Ist mir unbegreiflich. 
Ich habe doch nur folgendes mit Pointerwertigkeit programmiert:

```
L #Pointerwertigkeit
L 1
+I
T #Pointerwertigkeit
 
...
später dann
 
L 0
T #Pointerwertigkeit
```
 
Sonst kommt nirgendwo mehr Pointerwertigkeit vor. 
Woher kommt dann dieser komische negative Wert?


----------



## Larry Laffer (4 März 2008)

... wenn du einen INT zu oft erhöhst dann wird er auf wieder negativ.

Das sagt mir aber auch, dass du schon 40.000 x erhöht hast. Vielleicht solltest du die Aufzeichnung und die Erhöhung des Pointers noch einmal überprüfen. Vielleicht auch in Verbindung mit dem SLD Befehl.

Auf jeden Fall solltest du sicherstellen, dass dein Pointer IMMER in einem legalen Bereich ist, bevor du ihn herannimmst um damit ein DBD zu adressieren ...

Gruß
LL


----------



## Larry Laffer (4 März 2008)

Nachtrag:
Woher kommt Pointerwertigkeit überhaupt ? Auch aus dem DB ? Vielleicht überschreibst du den Pointer auch mit sich selbst ...

Hast du mal gecheckt, bis zu welchem DBD in deinem DB schon Werte eingetragen worden sind ?


----------



## stift (4 März 2008)

Also ich hab die pointerwertigkeit jetzt mal genau beobachtet. 
die ist auf 1 sobald ich starte, wie gewollt. 
sobald mir dann eine drehzahl errechnet wir knallt der mir plötzlich schlagartig ne riesen zahl auf pointerwertigkeit. 
wo könnte die denn herkommen?
die zahl ist manchmal negativ, manchmal positiv.


----------



## Larry Laffer (4 März 2008)

... du überschreibst den Pointer mit deinem ersten Datensatz ...


----------



## stift (4 März 2008)

Ich schätze mal ich hab den fehler gefunden. 

Ich lasse doch die pointerwertigkeit erhöhen sobald meine momentangeschwindigkeit anders ist als mein wert, der im pointer steht. 
Das funktioniert auch anfangs gut, allerdings wenn der wert im pointer dann anders ist als die momentangeschwindigkeit, dann ist das ja keine einmalige sache sondern dauert 5ms bis der nächste wert von ob35 mein ergebniss beeinflusst. 
solange ist die obige bedingung ja erfüllt und jedesmal wenn die cpu meinen fc durcharbeitet wir pointerwertigkeit um 1 erhöht. 
Nach 5ms íst meine Momentangeschwindigkeit wieder anders als die pointergeschwindgkeit --> er will schieben aber die pointerwertigkeit ist irgendein mist, da ja je nachdem wie oft mein fc durchgearbeitet wurde die pointerwertigkeit um 1 erhöht wurde. 
Wie würdest du das problem beheben?
Ein timer, der alle 5ms meinen wert schiebt oder kann ich irgendwie ne flankenauswertung mit einbauen?


```
L      DBD[AR1,P#0.0]
L      #Momentangeschwindigkeit
<>    R
SPBN M020
 
L      #Pointerwertigkeit
L      1
+I    
....
```


----------



## Larry Laffer (4 März 2008)

... die Frage verstehe ich nicht ganz ...

Du hast das Ganze doch im OB35 programmiert, der dann in einem Intervall von 5 ms aufgerufen wird. Hier sollte dann auch der Pointer erhöht werden und der Wert in deine Liste geschrieben werden. Das würde ich übrigens auch tun, wenn sich der Wert nicht geändert hat.
Abhängig wäre die ganze Aktion bei mir von einem Freigabe-Bit, das ich von dem übergeordneten Ablauf (Verfahrantrieb) schalte bzw. sperre.

Hast du das grundlegend anders gemacht ?


----------



## stift (4 März 2008)

Ich glaube ich hab einen recht großen fehler gemacht. 
Im ob35 errechne ich nur die Zeitvariable meiner Funktion. Diese lege ich auf einen Datenbaustein und rechne dann in einem FC weiter. 
Im Fc ist dann auch mein Pointer. 
Funtioniert die sache dann, wenn ich mein ergebnis aus dem Fc auf einen Datenbaustein lege und das pointernetzwerk in den ob35 einfüge. 
wahrscheinlich nicht oder, da mir erst die zeit im ob35 errechnet wird, dann müsste der fc abgearbeitet werden und dann erst das pointernetzwerk. Da wird dann die cpu schätz ich mal nicht ganz mitkommen oder?
Ich dachte man soll den ob35 so klein wie möglich halten!
Oder soll ich die ganzen netzwerke des fc´s kopieren und in den ob35 einfügen?


----------



## Larry Laffer (4 März 2008)

... ich mache so etwas (wie schon geschrieben) folgendermassen :

Im OB35:

```
UN -Freigabe_Messung
BEB
 
Pointer erhöhen
 
U Pointer > Max.Adresse_im_DB
S -Messung_beendet
BEB
 
L Messwert
T DBD (Pointer)
```
 
Den korrekten Code dafür hast du im Grunde ja schon ...

Wenn du das in den OB35 schreibst, dann wird die deine Zykluszeit auch nicht explodieren. Zumindestens nicht bei einer 5ms Rate.

Gruß
LL


----------



## stift (5 März 2008)

Hi also ich hab jetzt folgendes programmiert

```
UN  "Moter Ein"
BEB
 
L    #Pointerwertigkeit
L    1
+I
T    #Pointerwertigkeit
 
L    #Pointerwertigkeit
L    300
>=I
BEB
 
AUF "Momentanbeschleunigung
 
L    #Pointerwertigkeit
SLD 5
LAR1
L     db10.dbd28
T     DBD [AR1, P#0.0]
 
L     DB10.Zeit
L     DB10.Zeit_fuer_Umdrehung
>R
SPBN M010
 
L     0
T    #Pointerwertigkeit
 
M10: Nop 0
```
 
Sobald ich den "Motor Ein" schalte geht die CPU aufgrund eines Fehlers in diesem Netzwerk in stop.
Hab ich da irgendwo noch nen fehler?


----------



## stift (5 März 2008)

Die Pointerwertigkeit passt. War zum Zeitpunkt des Fehlers auf 19. 
Funktioniert das eigentlich dass ich im ob35 einen wert immer alle 5ms um 5 aufaddiere. Diesen Wert verarbeite ich in meinem Fc mit der Formel zur "Momentanbeschleunigung". 
Diese will ich anschließend wieder mit dem Pointer auf den Datenbaustein schieben. 
Eigentlich müsste ja dann meine CPU so schnell den FC durcharbeiten, dass sie das erste netzwerk vom ob35 durcharbeitet, anschließend parall der FC errechnet wird und noch bevor die cpu im ob35 das rechnen im 2.netzwerk anfängt müsste mein ergebnis im fc da sein.
kann das überhaupt funktionieren?


----------



## Larry Laffer (5 März 2008)

... du solltest dann die Berechnung der Beschleunigung auch vom OB35 ausgehen lassen. Ansonsten erhälst du ja irgend etwas unsynchrones ...

Wenn du zuviel Code in deinem OB35 hast, dann gheht die CPU auch in Stop (außer du hats den Fehler-OB dafür geschrieben), weil ein neuer Aufruf erfolgte bevor der alte abgearbeitet war. Ich weiß jetzt nicht, wie komplex deine Berechnung ist, aber eigentlich habe ich da nicht so die Bedenken. 
Was hattest du noch für eine CPU am Start ?


----------



## stift (5 März 2008)

eine 313-c


----------



## stift (5 März 2008)

wie fahre ich dann eigentlich die auswertung?
Ich muss ja alle DBD die größer als 0 sind addieren und durch ihre anzahl teilen. Wie kann ich das denn umsetzen?


----------



## Larry Laffer (5 März 2008)

Die Auswertung oder die Zwischenberechnung ?

In der Auswertung weißt du doch, wieviele Werte du aufgezeichnet hast (#Pointerwertigkeit).
Wenn du daraus einen Gesamt-Mittelwert bilden willst (z.B.), dann addierst du alle diese Werte und teilst die Summe durch #Pointerwertigkeit. Im Prinzip genauso kannst du mit Zwischen-Werte verfahren (Abschnittsberechnung). Du mußt da halt nur wissen, wie weit ein Abschnitt geht ...

Bei der Zwischenberechnung geht es dir (soweit ich mich da erinnere) doch um die aktuelle Geschwindigkeit. Das wäre dann v = ds / t also :
Geschwindigkeit = (aktuelle Position - letzte Position) / Zeit (5 ms).

Bitte um Ergänzung ... 

Gruß
LL


----------



## stift (5 März 2008)

die geschwindigkeit habe ich ja schon. 
jetzt gehts um die beschleunigung (ich hab weiter vorne im thread mal von geschwindigkeit geredet haber hab beschleunigung gemeint. Aber was kümmert mich mein dummes geschwätzt von gestern)
Und jetzt hab ich die beschleunigung über b=-r*w²*sin(w*t)+(r²/a)*w²*cos(2*w*t) berechnet wobei r der kurbelwellenradius ist, w die winkelgeschwindigkeit, t der momentanzeitpunkt und a die pleuelstangenlänge.
gibt es eigentlich irgendeinen tollen befehl mit dem ich alle werte aus meinem db auf einen schlag summieren kann oder muss ich so was ekliges programmieren:

L DB11.DBD0
L DB11.DBD4
+R
L DB11.DBD8
+R 
.... usw bis DB11.dbd1192


----------



## Larry Laffer (5 März 2008)

... wenn du da doch so eine wunderschöne (komplizierte) Formel hast, dann setzt die doch ein.
Die Beschleunigung bezieht sich doch immer auch auf delta Strecke (oder delta Winkel) zu delta (verstrichene) Zeit ^2.

Ich verstehe also die Frage im Augenblick nicht ...


----------



## Larry Laffer (5 März 2008)

... oh, du hast deinen Beitrag noch ergänzt ...

Das Summieren kannst du über eine Schleife machen, die der she ähnlich ist, die du für das Reinschreiben der Werte in den DB nimmst :

```
Pointer = 0
Summe = 0
 
Loop: Pointer := Pointer +1
        wenn Pointer > Anzahl_Werte dann Ende
 
        Summe = Summe + Wert (Pointer)
        spa Loop
 
Ende: Mittelwert = Summe / Anzahl_Werte
```
 
Ich wollte das jetzt nicht in Step7-Code schreiben (der wäre dann warscheinlich auch fehlerhaft  ), aber ich denke, damit kommst du trotzdem weiter ...


----------



## stift (5 März 2008)

Alles klar. Danke. 
Ich wills versuchen


----------



## stift (5 März 2008)

Also wie ich meine Berechnung noch im FC gefahren habe hat alles funktioniert. 
Nun hab ich alles in den ob35 eingefügt und jetzt geht die cpu nach einer belibigen zeit (manchmal 10s manchmal 15s oder so) in stop. 
woran kann das denn liegen?
Gibt es irgend ne möglichkeit genau herauszufinden wo der fehler ist?
Im Diagnosepuffer steht ja nur dass es im OB35 ist.


----------



## vierlagig (5 März 2008)

da du ja wirklich viel rechnest, scheint die abarbeitungszeit deines OB35 deutlich höher als der aufruftakt zu sein und schon die step7-hilfe weiß



> *Hinweis*
> Sie müssen dafür sorgen, daß die Laufzeit jedes Weckalarm-OBs deutlich kleiner ist als sein Zeittakt. Falls ein Weckalarm-OB noch nicht beendet ist, aber wegen des abgelaufenen Zeittakts erneut zur Bearbeitung ansteht, wird der Zeitfehler-OB (OB 80) gestartet. Anschließend wird der fehlerverursachende Weckalarm nachgeholt.


die zeit von 10-15s kann ich mir dadurch erklären, dass die zahl der zur mittelwert herangezogenen werte steigt und damit auch der rechenaufwand... ein anderer, möglicher fehlergrund wäre die zuletzt eingefügte schleife, die nicht beendet wird...

zur genaueren fehlerdiagnose empfehle ich das betrachten des stacks und man möge mir gestatten, auch dafür die step7-hilfe zu zitieren:



> *Anzeigen der Stacks der CPU* Mit diesem Register können Sie für jede Zentralbaugruppe (CPU)  online die Informationen über den Inhalt der Stacks anzeigen. Die CPU muss sich  dabei im Betriebszustand STOP befinden oder einen Haltepunkt erreicht haben.
> Das Anzeigen der Stacks ist eine wichtige Hilfe zum Finden von  Fehlern, z.B. beim Testen Ihrer Bausteine. Ist die CPU dabei in den  Betriebszustand STOP gegangen, können Sie sich im Unterbrechungs-Stack (U-Stack) die Unterbrechungsstelle mit den  dort aktuellen Anzeigen und Akku-Inhalten anzeigen lassen, um so die Ursache  (z.B. Programmierfehler) herauszufinden.
> Voraussetzung ist eine bestehende Verbindung zur CPU.
> 
> ...




@larry: respekt für soviel geduld!


----------



## Larry Laffer (5 März 2008)

vierlagig schrieb:


> @larry: respekt für soviel geduld!


 
Danke, aber wenn sich einer interessiert und mitmacht, dann helfe ich gerne ...

@Stift:
Vielleicht kannst du deine Berechnung noch optimieren, oder andere Alternative um herauszufinden, ob es daran liegt, das Intervall des OB35 auf einen langsameren Wert setzen (z.B. 10 ms). Wenn es dann durchläuft, dann liegt es am Wiederaufruf. 

...


----------



## stift (5 März 2008)

In stacks steht 
ob35 cyc_int5

Was sagt mir das jetzt?
Das in ob35 ein fehler ist. 
Aber das hat der diagnosepuffer ja auch schon gemeldet. 
Tut mir übringens leid wenn ich mich blöd anstelle. 
Ich bemüh mich echt und probier schon viel abends zuhause aus. 
Aber so langsam werd ich echt besser. 
Als ich mit dem projekt angefangen habe war awl für mich ein buch mit sieben siegeln. Ich hab nur fup verstanden. 
Mittlerweile mach ich alles nur noch in awl.


----------



## vierlagig (5 März 2008)

stift schrieb:


> Tut mir übringens leid wenn ich mich blöd anstelle.
> Ich bemüh mich echt und probier schon viel abends zuhause aus.



1. hat keiner gesagt, dass du blöd bist oder dich blöd anstellst
2. deinen einsatz merkt man und wird durch konsequente hilfe von larry gewürdigt



stift schrieb:


> In stacks steht
> ob35 cyc_int5



ist irgendwo ersichtlich, ob der OB80 angefordert wird? versuchs mal mit larrys tipp, einfach mal die aufruftaktung erhöhen ...


----------



## stift (5 März 2008)

Also die Auftaktung hab ich jetzt erhöht auf 10ms. 
Das Programm läuft wieder. 
Allerdings stimmt die Berechnung der Maximalgeschwindigkeit nicht mehr. 
Ich vergleiche im 0b35 immer die Momentangeschwindigkeit mit der geschwindgkeit die auf dem dbd für die maximalgeschwindgkeit ist. 
Ist diese größer als die alte maximalgeschwindigkeit so wird die momentangeschwindgkeit auf die maximalgeschwindigkeit gelegt. 
Normalerweise ist der wert bei 63 1/min 29.01m/s. Jetzt wird mir ein wert von 7.25 m/s angezeigt. 
ich denk mal das liegt daran dass der ob35 nicht alle werte durchrechnen kann oder?
Für die Durchschnittsbeschleunigung wird mir noch 0 angezeigt. Da bin ich aber auch noch nicht auf fehlersuche gewesen.

Von ob80 steht nirgend etwas. 
Ich glaub aber ich habe noch ein problem. 
Wenn jemand die drehzahl herunterregelt dann hätte ich maximal 300 momentanbeschleunigungen. 
Ist das eigentlich möglich dass die cpu alle diese werte in 10ms durchrechnet?


----------



## Larry Laffer (5 März 2008)

vierlagig schrieb:


> 1. hat keiner gesagt, dass du blöd bist oder dich blöd anstellst
> 2. deinen einsatz merkt man und wird durch konsequente hilfe von larry gewürdigt


*ACK* 
Ich würde da sogar noch einen draufsetzen ... 
Du hast ja bisher nur Tips erhalten. Den Code hasr du im Großen und Ganzen selbst erstellt ... und das ist Ober-Klasse ...

Zum Thema:
300 Berechnungen in 10 ms - weiß nicht. Du hast aber auch die Möglichkeit, die Zykluszeit-Überwachung hochzusetzen. Dann kann dir der eine Berechnungs-Zyklus ja egal sein.
In meinen Auswertungen erreiche ich bei bestimmten Aufgaben auch schon mal eine Zykluszeit von 1 s beim Auswerten. Das passiert aber nicht so oft und zu dem Zeitpunkt passiert auch nichts zeitkritisches in der Anlage.

Aber ... wo liegt im Moment das Problem ... in der Berechnung ?

Außerdem, wenn die Umschaltung der Rate auf 10ms erfolgreich war, dann solltest du ggf. versuchen, die Formel noch zu optimieren ... Muß die so aufwendig sein ? Ich werde mir das eventuell nachher selbst mal zu Gemüte führen ...


----------



## Larry Laffer (5 März 2008)

zur Mittelwert-Bildung:
sieh dir doch mal in dem Thread : http://www.sps-forum.de/showthread.php?t=18491 
den Beitrag von Ralle an. Das ist im Grunde genau dein Problem ...


----------



## stift (5 März 2008)

Hier meine Tabelle zur berechnung der Geschwindigkeit und der Beschleunigung
Anhang anzeigen Berechnung Geschwindigkeit.zip


Ich hab jetzt übrigens den 0b35 auf 100ms gestellt. Nun bekomme ich den exakten Wert für die Maximalgeschwindgkeit wieder angezeigt.
Jetzt muss ich nur noch die Durchschnittsgeschwindgkeit zum laufen bekommen


----------



## Larry Laffer (5 März 2008)

Ich konnte mich mit der Sache noch nicht beschäftigen.
Die Excel-Tabelle sieht gut aus ... aber - ohne Wertung zunächst ...

Die max.-Geschwindigkeit ? nicht den Momentan-Wert ?
OB35 auf 100ms bringt m.E. nichts. Stell doch bitte mal den kompletten OB35 hier ein. Ich möchte mir den doch mal ansehen ...


----------



## Larry Laffer (5 März 2008)

Hallo Stift,
sieht die Umsetzung der von dir angegebenen Formel ungefähr so aus ?

```
L     #r
      SQR   
      T     #r2                         // r^2 erzeugen
      L     2.000000e+000
      L     3.141593e+000
      *R    
      L     #f
      *R    
      T     #w                          // w erzeugen
      L     #w
      SQR   
      T     #w2                         //w^2 erzeugen
      L     #w
      L     #t
      *R    
      T     #wt                         //wt erzeugen
      L     #wt
      SIN   
      T     #sin_wt                     // Sin(wt) erzeugen
      L     #wt
      L     2.000000e+000
      *R    
      COS   
      T     #cos_2wt                    //Cos(2wt) erzeugen
      L     #r2
      L     #a
      /R    
      T     #r2a                        // r^2 / a erzeugen
// End-Berechnung -----------------------------------
      L     -1.000000e+000
      L     #r
      *R    
      L     #w2
      *R    
      L     #sin_wt
      *R    
      T     #hwert
      L     #r2a
      L     #w2
      *R    
      L     #cos_2wt
      *R    
      L     #hwert
      +R    
      T     #Beschleunigung
```


----------



## stift (6 März 2008)

Ja genau so hab ichs auch gemacht. 
Ich hab halt nur wesentlich mehr temp-variablen reingebaut um die sache übersichtlich zu machen.


----------



## Larry Laffer (6 März 2008)

... jede Lade- und Transfer-Operation kostet natürlich Zeit ... Das Code-Beispiel oben sollte in 5ms ohne weiteres bearbeitet werden können - auch mit anschließender Daten-Archivierung ...

Stell doch bitt mal deinen OB35 hier ein ... nur so zum Spaß ...
Um 10 ms zum "Überlauf" zu bringen mußt du eigentlich noch ein bißchen mehr aufgefahren haben ...


----------



## stift (6 März 2008)

Hier mein ob35


```
U(    
      L     "DB_V-Messung".Zeit
      L     "DB_V-Messung".Zeit_fuer_Umdrehung
      <R    
      )     
      U     "Motor Ein"
      SPBNB _001
      L     "DB_V-Messung".Zeit
      L     5.000000e-002
      +R    
      T     "DB_V-Messung".Zeit
_001: NOP   0

      U(    
      O(    
      L     "DB_V-Messung".Zeit
      L     "DB_V-Messung".Zeit_fuer_Umdrehung
      >=R   
      )     
      ON    "Motor Aus"
      )     
      SPBNB _002
      L     0.000000e+000
      T     "DB_V-Messung".Zeit
_002: NOP   0
```


```
L     6.283185e+000
      L     "DB_V-Messung".Zeit_fuer_Umdrehung
      /R    
      T     #Winkelgeschwindigkeit      // w= (2*PI)/T 


      L     #Winkelgeschwindigkeit
      SQR   
      T     #SQR_Winkelgeschw


      L     #Winkelgeschwindigkeit
      L     "DB_V-Messung".Zeit
      *R    
      T     #Winkelgroesse             


      L     #Winkelgroesse
      L     2.000000e+000
      *R    
      T     #Winkelgroesse_2           

      L     #Winkelgroesse
      SIN   
      T     #Sinus


      L     -5.000000e-001
      L     #SQR_Winkelgeschw
      *R    
      L     #Sinus
      *R    
      T     #Beschleunigung_Teil_1


      L     #Winkelgroesse_2
      COS   
      T     #Cosinus

      L     1.666667e-001               //(r²/a)
      L     #SQR_Winkelgeschw
      *R    
      L     #Cosinus
      *R    
      T     #Beschleunigung_Teil_2


      L     #Beschleunigung_Teil_1
      L     #Beschleunigung_Teil_2
      +R    
      T     #Beschleunigung

      L     #Beschleunigung
      ABS   
      T     #Betrag_Beschleunigung
```


```
UN    "Motor Ein"
      BEB   


      L     #Pointerwertigkeit
      L     1
      +I    
      T     #Pointerwertigkeit

      L     #Pointerwertigkeit
      L     300
      >I    
      BEB   

      AUF   "Beschleunigungsmessung"
      L     #Pointerwertigkeit
      SLD   5
      LAR1  
      L     #Betrag_Beschleunigung
      T     DBD [AR1,P#0.0]

      L     P#0.0
      T     #Pointerwertigkeit_1

      L     0
      T     "DB_V-Messung".Summe_Momentanbeschl

      L     300
M010: T     #Zaehler

      L     DBW [#Pointerwertigkeit_1]
      L     "DB_V-Messung".Summe_Momentanbeschl
      +D    
      T     "DB_V-Messung".Summe_Momentanbeschl

      L     #Pointerwertigkeit
      L     P#2.0
      +D    
      T     #Pointerwertigkeit
      L     #Zaehler
      LOOP  M010

      L     "DB_V-Messung".Zeit_fuer_Umdrehung
      L     "DB_V-Messung".Zeit
      >R    
      SPBN  M020

      L     0
      T     #Pointerwertigkeit
M020: NOP   0
```


----------



## Larry Laffer (6 März 2008)

Vorschlag:
Im 3. Netzwerk summierst du in jedem Zyklus die Momentan-Beschleunigung auf. Das ist m.E. Unsinn. Du könntest Beim "Start  Messung" die Summe auf "0" setzen und jeden neuen Wert des OB35 drauf rechnen. Dadurch erhälst du das gleiche Ergebnis, sparst aber enorm Zykluszeit.
Probier das doch einmal ...

Gruß
LL


----------



## stift (6 März 2008)

was meinst du denn mit start messung?
Das ganze dann im fc aufaddieren oder?


----------



## Larry Laffer (7 März 2008)

"Start Messung" heisst für mich der Beginn eines Verfahr-Hubes.
Eine "Messung" würde nach meinem Verständnis für einen Hub oder ggf. auch für einen Hin- und Rückhub gelten.

Hier würde ich mir eine Einschalt-(Start-)Flanke bilden und mit dieser die Grund-Bedinegungen herstellen (Pointer auf 1, Summe auf 0, ...). Nun kann die Messung losgehen - du liest einen Wert nach dem anderen ein, berechnest die Beschleunigung und speicherst die Werte in deinen DB als Liste und addierst deinen Summenwert auf. Wenn du nun den Durchschnitt brauchst (auch zwischendurch), dann brauchst du nur den Summenwert durch die Anzahl der gebuchten Einträge teilen ... Soweit klar ...?

Gruß
LL


----------



## stift (7 März 2008)

ja genau das hab ich mir ja schon so gedacht. 
was mir nur gedanken macht ist dass die pointerwertigkeit immer nach jedem zyklus ja auf null gesetzt wird. Aber das lässt sich realisieren indem ich abfrage ob eintagzähler auf 300, dann dividiere.


----------



## Larry Laffer (7 März 2008)

Ich glaube, wir philosophieren noch ein wenig aneinander vorbei ...:twisted: 

Wieso setzt du den Pointer nach jedem OB-Aufruf wieder auf "0" ?
Du wolltest doch eine Liste vollschreiben - oder nicht ? Dann jedenfalls müßtest du den Pointer für den nächsten Aufruf in der Messung erhalten ...

Gruß
LL


----------



## stift (7 März 2008)

sorry, 
ich war missverständlich. 
Mit einem Zyklus meinte ich eine Umdrehung meiner Kurbelwelle also bis der Pointer auf 300 erhöht ist.


----------



## Larry Laffer (7 März 2008)

OK ...
Dann meinen wir beide das Gleiche ...
Ich bin mal auf deine Ergebnisse gespannt ...

Da du dich mit solchen Sachen beschäftigst ... hast du schon mal über SCL nachgedacht ? Da würde das Thema sehr viel eleganter zu lösen gehen ...

Gruß
LL


----------



## stift (7 März 2008)

Ich kenne SCL leider überhaupt nicht. 
Hab davon noch nichts gehört. 
Da werd ich mich wohl mal informieren.


----------



## Larry Laffer (7 März 2008)

Wenn du vor Hochsprachen keine Angst hast, dann wäre das für dein laufendes Ding eine 1A-Alternative. 
Vieles, was du jetzt kompliziert über Pointer löst, würde dir dann abgenommen werden. Ich mache deralei nur noch so ...


----------



## stift (10 März 2008)

Hi
ich stehe wieder mal vor einem problem. 
Ich hatte jetzt die netzwerke so umstrukturiert, dass ich der meinung war es müsste passen und habe beim simulieren bemerkt dass die weckalarmzeit von ob35 noch auf den 5ms eingestellt war. Um dies zu ändern musste ich meine Hardwareauswahl aktualisieren, da ich im betrieb eine neuere Cpu in der hw festgelegt hatte und mein S7 zu Hause ja nicht auf dem neusten stand ist. 
Also habe ich alles aktualisiert und wollte gerade weiter mache, doch jetzt habe ich festgestellt, dass in der hw meines projekts plötzlich gar keine cpu mehr ist und meine ob´s und fc´s somit auch verschwunden sind. Gibts ne möglichkeit das wieder herzustellen?
Vorher wurde mir bei der CPU so n gelbes Fragezeigen angezeigt. Jetzt ist alles weg. 
Hast du irgendeinen Link parat, bei dem ich mich mal über scl informieren könnte. Ich hab schon im Netz geschaut aber ich finde leider nichts.


----------



## Larry Laffer (10 März 2008)

Hallo Stift,
zu dem von dir gestellten Problem habe ich keine Lösung. Für die Zukunft vielleicht den Vorschlag (hört sich blöd an, weiss ich) der regelmässigen Archivierung ...

Auch zum Thema SCL kann ich dir keine wirklich schönen Links anbieten.
Allerdings ist das Thema hier im Forum sehr reichlich angegangen worden.
Das du das zusätzlich käuflich erwerben musst, weisst du sicherlich. Ich habe für mich (meinen Betrieb) diese Anschaffung niemals auch nur eine Sekunde bereut. Es geht damit doch einiges eleganter - aber auch SCL-Scripts haben so ihre Tücken.

Ich kann dir dazu nur anbieten, dir auf gezielte Fragen zu antworten.
Vielleicht grundsätzlich :
SCL ist eine Script-Sprache, die ein Mischmasch zwischen VB und Pascla / Delphi darstellt. Alles, was du in SCL erstellst, wird letztlich in einen (stinknormalen) Step7-Code umgewandelt. Der Vorteil (aus meiner Sicht) ist, dass du dir bei Schleifen und ARRAY-Operationen, aber auch bei größeren Formeln, keine so große Arbeit mehr mit der Umsetzung machen musst.

Ich hoffe, ich konnte wieder ein bisschen Verwirrung stiften ...
Gruß
LL


----------



## vierlagig (10 März 2008)

auf der *service&support-seite* vom großen S findest du bei suche nach SCL drei oder vier gute pdf´s die dich in das thema bringen ... die *getting started* ist z.B. relativ gut gemacht...


----------



## Torsten05 (14 März 2008)

Hi,

auch wenn ich noch nicht ganz kapiert habe worum es genau geht:

So wie du das machst ist es erstens ungenau, zweitens frisst es extrem viel Speicher bei 1Wert/5ms.
Ungenau ist es deshalb weil du den Istwert im Zyklus, die Auswertung aber im OB35 machst. Richtig wäre es die Berechnung im Zyklus zu machen und genau im Moment der Bearbeitung die beiden Werte Zeit/Ist-Wert zu übernehmen, oder aber auch im ob35 den Ist-Wert abzufragen, und zwar nicht aus dem DB, sondern von da wo er kommt (PEW,PED, Profibus o.Ä.)
Hängt aber davon ab was man mit den Werten hinterher machen möchte, und auch wie gross das Programm insgesamt mal werden wird.
Was nützt dir die Auflösung von 5ms wenn deine Zykluszeit 30ms beträgt, und du somit eh nur jeden 6 Zylus einen "frischen" Ist-Wert bekommst?

Davon ab sollte man bei der Benutzung vom OB35 noch ein paar andere Sachen beachten, wie z.B. sichern von AR1, AR2 und ggf. auch DB-Register. Sonst kann das eine nette Fehlersuche geben.

Torsten


----------



## stift (1 April 2008)

Hi, es geht weiter mit meinem Programm
Ich hab wieder einen Fehler im OB35
Laut diagnosepuffer hab ich eine unterbrechungsstelle im anwenderprogramm. Was heist n das?
Das Programm hat ein paar sekunden funktioiert und ist dann wieder in stop. Meine längste zykluszeit beträgt 311ms.


----------



## vierlagig (1 April 2008)

ich würd den code auf ne endlos-schleife prüfen ... falsche oder nicht erfüllte abbruch-/ausstiegsbedingung


----------



## stift (1 April 2008)

Ich hab folgendes netzwerk mal programmiert aber irgendwie bin ich völlig raus. Ich bin mir nicht sicher ob das stimmt: 
	
	



```
L P#4.0
         T #Pointerwertigkeit_1
 
         L 0
         T #Summe_Beschleunigung
 
         L 300
M020: T #Zähler
 
         L #Summe_Beschleunigung
         +R
         T #Summe_Beschleunigung
 
         L #Pointerwertigkeit_1
         L P#8.0
         +R
         T #Pointerwertigkeit_1
         L #Zähler
         Loop M020
```
 
Ich glaub das ganze ist ziemlicher käse oder?
Das netzwerk ist ein auszug aus meinem ob35 und soll die funktion erfüllen dass die dbd0 - dbd300 aus dem db11 addiert werden.


----------



## stift (1 April 2008)

also an dem obigem netzwerk liegt es schon mal nicht. 
das hab ich jetzt gelöscht. 
warum kompliziert wenn s auch einfach geht. 
nochmal zur zykluszeit: 
als taktzeit für meinen ob35 habe ich 10ms eingestellt. 
die gemessene kürzeste zykluszeit beträgt 10ms
ebenso die letzte zykluszeit. 
die längste zykluszeit beträgt allerdings 237ms. 
liegt vielleicht daran dass mein ob35 zu groß ist?


----------



## Larry Laffer (1 April 2008)

... das deutet für mich auf die Auswertung hin ...
Wie auch immer ... du musst die Zykluszeit-Überwachung in der HW-Konfig-CPU-Zyklus entsprechend hoch legen ...

Du wolltest auch mal dein Programm (OB35) hier einstellen. Ich denke, wir sind da jetzt an einem Punkt, wo es schwer ist, etwas pauschal zu sagen ...

Gruß
LL


----------



## stift (1 April 2008)

jetzt wollte ich gerade mein ob35 ins forum stellen. 
ich hab mir extra nen neuen usb-stick besorgt, da die projekte auf meinem alten stick zuhause ja immer nicht lesbar waren. 
Jetzt habe ich mich schon gefreut dass ein projekt auf dem neuen stick ist aber meine cpu ist verschwunden. 
Die die ich im betrieb programmiert habe, habe ich in meinem hw-katalog zuhause nicht zur verfügung. Aber deswegen dürfte sie doch nicht verschwinden oder?


----------



## Larry Laffer (1 April 2008)

... 
Hattest du das Problem nicht schon einmal ...?
Wenn deine HW-Konfig die CPU (wegen ihrer Best.-Nr.) nicht genau kennt, dann bekommt sie in der HW-Konfig ein gelbes Ausrufezeichen. Die Bausteine werden deswegen nicht gelöscht ...
Was machst du da denn immer ...?


----------



## stift (1 April 2008)

Ja verstehe ich auch nicht. 
Anfangs hatte ich ja auch noch dieses gelbe zeichen, aber seit ich versucht habe meinen hardware-katalog zu aktualisieren verschwindet unbekannte cpu und ich hab seitdem folgendes problem: 
http://www.sps-forum.de/showthread.php?t=18953


----------



## stift (2 April 2008)

Hier mal mein ob35 
Hoffe ihr versteht mein Kommentare
Ich muss ihn aber auf zwei Beiträge aufsplitten da ich über 10000 zeichen komme. 

```
[FONT=Times New Roman][SIZE=3]Zyklisches Bearbeiten des Zeitpunkts t[/SIZE][/FONT]
 
[SIZE=3][FONT=Times New Roman]     U(    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     "DB_V-Messung".Zeit[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     "DB_V-Messung".Zeit_fuer_Umdrehung[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     <R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     )     [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     U     "Merker_Motor_Ein"[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     SPBNB _001[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     "DB_V-Messung".Zeit[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     5.000000e-002[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     +R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     "DB_V-Messung".Zeit[/FONT][/SIZE]
 
 
[FONT=Times New Roman][SIZE=3]_001: NOP   0[/SIZE][/FONT]
 
 
[FONT=Times New Roman][SIZE=3]Rücksetzen der Zeit[/SIZE][/FONT]
 
[SIZE=3][FONT=Times New Roman]     U(    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     O(    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     "DB_V-Messung".Zeit[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     "DB_V-Messung".Zeit_fuer_Umdrehung[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     >=R   [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     )     [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     ON    "Merker_Motor_Ein"[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     )     [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     SPBNB _002[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     0.000000e+000[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     "DB_V-Messung".Zeit[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]_002: NOP   0[/SIZE][/FONT]
 
 
[FONT=Times New Roman][SIZE=3]Berechnen der Winkelgeschwindigkeit und der beiden Winkelgrößen.[/SIZE][/FONT]
 
[SIZE=3][FONT=Times New Roman]   L     6.283185e+000[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     "DB_V-Messung".Zeit_fuer_Umdrehung[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     /R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     #Winkelgeschwindigkeit      // w= (2*PI)/T [/FONT][/SIZE]
 
 
[SIZE=3][FONT=Times New Roman]     L     #Winkelgeschwindigkeit[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     SQR   [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     #SQR_Winkelgeschw[/FONT][/SIZE]
 
 
[SIZE=3][FONT=Times New Roman]     L     #Winkelgeschwindigkeit[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     "DB_V-Messung".Zeit[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     *R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     #Winkelgroesse              //w*t um leichter den sin daraus ziehen zu können[/FONT][/SIZE]
 
 
[SIZE=3][FONT=Times New Roman]     L     #Winkelgroesse[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     2.000000e+000[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     *R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     #Winkelgroesse_2            //2*w*t um leichter den cos daraus ziehen zu können[/FONT][/SIZE]
 
 
[FONT=Times New Roman][SIZE=3]Berechen der Formel b=-r*w²*sin(w*t)+(r²/a)*w²*cos(2*w*t))[/SIZE][/FONT]
 
[FONT=Times New Roman][SIZE=3]L     #Winkelgroesse[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]     SIN   [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     #Sinus[/FONT][/SIZE]
 
 
[SIZE=3][FONT=Times New Roman]     L     -5.000000e-001[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     #SQR_Winkelgeschw[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     *R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     #Sinus[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     *R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     #Beschleunigung_Teil_1[/FONT][/SIZE]
 
 
[SIZE=3][FONT=Times New Roman]     L     #Winkelgroesse_2[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     COS   [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     #Cosinus[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]     L     1.666667e-001               //(r²/a)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     #SQR_Winkelgeschw[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     *R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     #Cosinus[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     *R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     #Beschleunigung_Teil_2[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]     L     #Beschleunigung_Teil_1[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     #Beschleunigung_Teil_2[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     +R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     #Beschleunigung[/FONT][/SIZE]
 
 
[FONT=Times New Roman][SIZE=3]Berechnen des Betrags aus der Geschwindigkeit um vergleichbare Werte zu [/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]erhalten, da eine Halbwelle sonst immer im negativen Bereich liegen würde.[/SIZE][/FONT]
 
[FONT=Times New Roman][SIZE=3]L     #Beschleunigung[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]     ABS                               // Funktion für Absolutwert[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     #Betrag_Beschleunigung[/FONT][/SIZE]
 
 
[FONT=Times New Roman][SIZE=3]Schiebt den momentanen Betrag der Geschwindigkeit auf das DBD für die [/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]Maximalgeschwindigkeit, wenn der Betrag der Geschwindigkeit größer ist, als die [/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]bisherige Maximalgeschwindigkeit[/SIZE][/FONT]
 
 
[SIZE=3][FONT=Times New Roman]     U(    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     #Betrag_Beschleunigung[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     "DB_V-Messung".Maximalbeschleunigung[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     >R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     )     [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     SPBNB _003[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     #Betrag_Beschleunigung[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     "DB_V-Messung".Maximalbeschleunigung[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]_003: NOP   0[/SIZE][/FONT]
 
 
[FONT=Times New Roman][SIZE=3]Schiebt eine 0 auf die Maximalbeschleunigung falls sich die Drehzahl ändert.[/SIZE][/FONT]
 
[SIZE=3][FONT=Times New Roman]     U(    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     "DB_V-Messung".Momentandrehzahl[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     "DB_V-Messung".Vergleichsdrehzahl[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     <>I   [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     )     [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     SPBNB _004[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     0.000000e+000[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     "DB_V-Messung".Maximalbeschleunigung[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]_004: NOP   0[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3][/SIZE][/FONT] 
[FONT=Times New Roman][SIZE=3]...[/SIZE][/FONT]
 
[FONT=Times New Roman][SIZE=3][/SIZE][/FONT]
```


----------



## stift (2 April 2008)

```
[FONT=Times New Roman][SIZE=3]Ermitteln der Durchschnittsbeschleunigung[/SIZE][/FONT]
 
[SIZE=3][FONT=Times New Roman]    UN    "Merker_Motor_Ein"          //Startbedingung[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    BEB   [/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]    L     #Pointerwertigkeit          //Berechnung des Pointerwertes[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    L     1[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    +I    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    T     #Pointerwertigkeit[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]    L     #Pointerwertigkeit          //Sicherung dass Pointerwert nie größer ist als[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    L     300                         //die Anzahl der vorhandenen DBD[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    >=I   [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    BEB   [/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]    AUF   "Momentanbeschleunigung"[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]    L     #Pointerwertigkeit          //Pointer[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    SLD   5[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    LAR1  [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    L     #Betrag_Beschleunigung[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    T     DBD [AR1,P#0.0][/FONT][/SIZE]
 
[FONT=Times New Roman][SIZE=3]//----------------------------------------------[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]    L     #Betrag_Beschleunigung[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    L     DB10.DBD   28[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    +R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    T     DB10.DBD   28[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]//---------------------------------------------[/SIZE][/FONT]
 
[SIZE=3][FONT=Times New Roman]    L     "DB_V-Messung".Zeit[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    L     "DB_V-Messung".Zeit_fuer_Umdrehung    //Startbedingung für Division nach einem Zyklus[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    >R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    SPBN  M030[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]    L     DB10.DBD   28[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    L     #Pointerwertigkeit          //Division mittels Eintrag-Zähler[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    /R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    T     "DB_V-Messung".Durchschnittsbeschl[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]    L     0[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    T     #Pointerwertigkeit[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]    L     0[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    T     DB10.DBD   28[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]M030: NOP   0[/SIZE][/FONT]
```


----------



## stift (2 April 2008)

Hi, also ich hab jetzt mal das letzte netzwerk ausgeklammert. 
Dann hat die sache funktionert. 
Das Problem liegt also am letzten netzwerk
Leider kann ich keinen Fehler da drin finden.


----------



## Larry Laffer (2 April 2008)

Hallo Stift,
darf ich dich noch einmal an meinen Beitrag #85 verweisen ...?

Auf den ersten Blick sieht der OB35 nicht so aus, als hättest du das so gemacht ...

Gruß
LL


----------



## stift (2 April 2008)

Also ich hab eigentlich versucht das ganze so umzusetzen wie du mirs geschildert hast. 

--> Die messung startet sobald der motor läuft
--> Sobald die messung beendet wird werden alle pointer usw. wieder auf null gesetzt
-->ich speichere alle werte in meinem dbd
-->mit dem netzwerk von beitrag #98 habe ich versucht die summe zu bilden (ist mir aber glaub ich gründlich misslungen,(so ganz hab ichs erlich auch nicht verstanden))
-->dieses netzwerk habe ich jetzt entfernt da ich da den fehler vermutet habe und stattdessen wollte ich die berechneten werte direkt addieren (db10.dbd28 ) und anschließend durch die #pointerwertigkeit teilen.


----------



## Larry Laffer (2 April 2008)

... endschuldige bitte. Ich hatte den 2. Beitrag nur überflogen. Ich denke, alles ist gut bis auf das Rücksetzen der "Pointerwertigkeit". Das sollte m.E. nur stattfinden wenn du nicht am Messen bist. Das erklärt aber auch nicht das Hochlaufen deiner Zykluszeit ...

Lass doch mal generell die Berechnung mitlaufen. Wo liegst du dann mit der Zykluszeit ...?


----------



## Larry Laffer (2 April 2008)

Ich habe da noch ein paar Kleinigkeiten gefunden ...

```
[FONT=Times New Roman][SIZE=3]   AUF   "Momentanbeschleunigung"[/SIZE][/FONT]
 
[SIZE=3][FONT=Times New Roman]    L     #Pointerwertigkeit          //Pointer[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]   [COLOR=red][B]ITD[/B][/COLOR][/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]    SLD   5[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    LAR1  [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    L     #Betrag_Beschleunigung[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    T     DBD [AR1,P#0.0][/FONT][/SIZE]
 
[FONT=Times New Roman][SIZE=3]//----------------------------------------------[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]    L     #Betrag_Beschleunigung[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    L     DB10.DBD   28[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    +R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    T     DB10.DBD   28[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]//---------------------------------------------[/SIZE][/FONT]
 
[SIZE=3][FONT=Times New Roman]    L     "DB_V-Messung".Zeit[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    L     "DB_V-Messung".Zeit_fuer_Umdrehung    //Startbedingung für Division nach einem Zyklus[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    >R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    SPBN  M030[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]    L     DB10.DBD   28[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    L     #Pointerwertigkeit          //Division mittels Eintrag-Zähler[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3][COLOR=red][B]    ITD[/B][/COLOR][/SIZE][/FONT]
[COLOR=red][B][FONT=Times New Roman][SIZE=3]    DTR[/SIZE][/FONT]
[/B][/COLOR][SIZE=3][FONT=Times New Roman]    /R    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    T     "DB_V-Messung".Durchschnittsbeschl[/FONT][/SIZE]
```


----------



## stift (2 April 2008)

ich hab gemacht was du gemeint hast und alle start-bedingungen ausgeklammert, dass die messung immer läuft. 
Mein programm läuft jetzt immer bis zum letzten netzwerk vom ob35 und geht dann in stopp
Was recht misteriös ist dass ich folgendes programmiert habe: 
	
	



```
L 0
T #Pointerwertigkeit
 
L #Pointerwertigkeit
L 1
+I
T #Pointerwertigkeit
 
...
```
Die ersten beiden zeilen hab ich schnell reingeschrieben um sicher zu sein dass Pointerwertigkeit größer ist wie 300. 
dennoch wir mit jeden run-befehl die pointerwertigkeit um 1 erhöht. meinem verständinis nach müsste sie doch aber immer bei 1 liegen oder?


----------



## stift (2 April 2008)

kein wunder dass die cpu in stopp geht. 
meine pointerwertigkeit hat den werd 13d --> also 317
aber ich versteh nicht warum die nicht auf null gesetzt wird obwohl ich doch obige zeilen eingefügt habe.


----------



## stift (2 April 2008)

Ich habs zum laufen gebracht. 
mein fehler war dass ich programmiert hatte
	
	



```
L #Pointerwertigkeit
L 300
>=I
SPNB M030
```
 
richtig wäre aber 
	
	



```
L #Pointerwertigkeit
L 300
>=I
SPB M030 bzw. BEB
```


----------



## Larry Laffer (2 April 2008)

Hey Klasse, dass du es gefunden hast ...
Ich hatte vorhin immer nach der Endlos-Schleife gesucht, aber nicht gefunden ...


----------



## stift (3 April 2008)

Die messung funktioniert. 
Danke schön.
Echt toll dass du mir alles so erklärt hast und so geduldig warst. 
Ich danke von Herzen


----------

