verschiedene ergebnisse aus 0b 35 addieren

Zuviel Werbung?
-> Hier kostenlos registrieren
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?

Code:
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!
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
Code:
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
 
Zuletzt bearbeitet:
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 ...
 
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.
 
... 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 ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Zuletzt bearbeitet:
In Pointerwertigkeit steht zu dem Zeitpunkt bei dem die CPU in Stop geht -23282 :confused:

Wie geht denn das?
Dieses DBD gibt es selbstverständlich nicht!
Ist mir unbegreiflich.
Ich habe doch nur folgendes mit Pointerwertigkeit programmiert:
Code:
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?
 
... 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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 ?
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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?

Code:
L      DBD[AR1,P#0.0]
L      #Momentangeschwindigkeit
<>    R
SPBN M020
 
L      #Pointerwertigkeit
L      1
+I    
....
 
... 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 ?
 
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... ich mache so etwas (wie schon geschrieben) folgendermassen :

Im OB35:
Code:
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
 
Hi also ich hab jetzt folgendes programmiert
Code:
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?
 
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?
 
Zurück
Oben