TIA Datenspeicherungs Schleife

Beiträge
95
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Software:
Tia V12.1 SP1
WinCC Basic Version V12 SP1

Harware:
S7 1215c DCDCDC + 4*15bit AI

Nun der nächste Knackpunkt.

Ich muss währen ich den Weg mit einem Zylinder verfahre alle 0,2 mm, zwei zusätzliche werte erfassen und speichern. Mein Plan war dies in SCL zu realisieren.
sprich alle 0,2 mm die über einen AI gemessen werden, die anderen zei werte erfassen und in einen DB schreiben.

Da ich jedoch in SCL nicht sehr geübt bin und seit gestern daran sitze und probiere, währe ich dankbar wenn mir jemand bestätigen könnte das es in SCL die beste Lösung ist.
 
So nunkommen die Fragen:
Also ichhabe den Datenübertragungsbaustein in SCL geschrieben.
kurz zur Übersicht: ich habe einen Hydraulikzylinder den ichunterschiedlich weit verfahre: min 50 mm bis max 300 mm bei etwa 100mm/min.Nach dem ausfahren fährt er direkt wieder ein.
DieserBaustein dient lediglich dazu die Analogwerte während des Ausfahrens in einenDB zu schreiben.


Hier werdenalle parameter genullt da der Zylinder die ersten 30 mm ohne messung verfährt:

IF #IN_Weg <= 30.0 THEN
#Naechster_schritt:= 30.0;
#Naechster_schritt_merker := 0;
#Nr_daten := 0;
#Nr_daten_merker := 0;
END_IF;


ab hier sollen die Daten mitgeschriben werdenbis der sollwert des Zylinders erreicht ist:

IF
#IN_Weg <= #IN_Weg_sollwert
THEN
IF
#IN_Weg >= #Naechster_schritt
THEN
#Naechster_schritt := #Naechster_schritt +0.2;
#Nr_daten := #Nr_daten + 1;
"Messparameter".WEG_DATEN[#Nr_daten] := #IN_Weg;
"Messparameter".DRUCKMESSPLATTE_DATEN[ #Nr_daten ] :=#IN_Druckmessplatte;
"Messparameter".OELDRUCK_DATEN[#Nr_daten] := #IN_Oeldruck;
END_IF;
END_IF;


Und ab hier entsteht das Problem:
diese Schleife dient dazu die Restlichen Array [1500] Feldermit 0.0 aufzufüllen. Sprich wenn derZylinder den sollwert erreicht hat hält dieser und fährt zurück. Während deszurückfahrens sollen die restlichen Array felder genullt werden um anschließenausgelesen zu werden.

IF
#IN_Weg > #IN_Weg_sollwert
THEN
WHILE #Nr_daten < 1501 DO
#Naechster_schritt := #Naechster_schritt + 0.2;
#Nr_daten := #Nr_daten + 1;
"Messparameter".WEG_DATEN[#Nr_daten] := 0.0;
"Messparameter".DRUCKMESSPLATTE_DATEN[ #Nr_daten ] := 0.0;
"Messparameter".OELDRUCK_DATEN[#Nr_daten] := 0.0;

END_WHILE;
END_IF;

In demMoment wo die schleife die Arrays nullt, geht meine Steuerung kurz auf memoryerror, fängt sich dann aber wieder. die Zykluszeit beträgt hier kurz ca. 60ms.

Den OnlineFehler ist Folgender:


Temporärer CPU-Fehler: Bereichslängenfehler in FB 2
betrifft OB 1 Ausführung
Schreibzugriff DB-Bereich
fehlerhafte Adresse, Operand ignoriert
Bearbeitung wirdfortgesetzt (keine OB-Bearbeitung)

|> HW_ID= 52
interne Adressierungsdetails: Caddr=16#00000198, Bereich: DB7 , Adr: 144096


Nun meineFrage: kann ich den Fehler Irgendwie abfangen ? gibts da einen Baustein ?
oder gibtseine bessere Möglichkeit die Arrayfelder zu nullen ?

bin um jedenRat dankbar

Gruß
 
Und ab hier entsteht das Problem:
diese Schleife dient dazu die Restlichen Array [1500] Feldermit 0.0 aufzufüllen. Sprich wenn derZylinder den sollwert erreicht hat hält dieser und fährt zurück. Während deszurückfahrens sollen die restlichen Array felder genullt werden um anschließenausgelesen zu werden.

IF
#IN_Weg > #IN_Weg_sollwert
THEN
WHILE #Nr_daten < 1501 DO
#Naechster_schritt := #Naechster_schritt + 0.2;
#Nr_daten := #Nr_daten + 1;
"Messparameter".WEG_DATEN[#Nr_daten] := 0.0;
"Messparameter".DRUCKMESSPLATTE_DATEN[ #Nr_daten ] := 0.0;
"Messparameter".OELDRUCK_DATEN[#Nr_daten] := 0.0;

END_WHILE;
END_IF;

eine minimale Änderung, nämlich:
WHILE #Nr_daten < 1500 DO
sollte das Problem vermutlich beheben - ich denke die erste Zelle des Arrays hat den Index 0 und nicht 1?
 
Hallo,
die 60 ms bei einem Reset sehe ich nicht als problematisch an, da sie ja nur in einem Zyklus entstehen in dem keine weitere relevante Aktion stattfindet.

Dein Fehler besagt nach meiner Meinung, dass versucht wurde ein Array-Element zu indexieren, das es nicht gibt. Vielleicht wäre hier der komplette Code (mit den Deklarationen) mal interessant.
Was mir persönlich nicht so gut gefällt ist der Einsatz der WHILE-Schleife. Wenn man den Anfang (#Nr_daten +1) und das Ende (1500) einer Schleife kennt halte ich FOR ... TO für die bessere Lösung. Dann würdest du vielleicht auch den Fehler nicht bekommen ... 8)

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Morgen,
also mal Danke für die Tipps.
ich werde jetzt jetzt ma in Betrieb fahren und weiter testen.

Hier mal ein Bild von den Deklarationen:
Unbenannt1.jpg

und hier das Bild vom Dazugehörigen DB:
Unbenannt2.jpg

Der gesamte SCL code ist oben schon rein kopiert. mehr ist das nicht.

Also ich habe ja 1501 Arrays von 0 bis 1500.
also Müsste das ja passen.


Ich werde mal die Zykluszeit Hochstellen und eine andere Schleife einbauen,
Vieleicht sollte ich dem SCL CODE eine Startbedinung geben.

Spricht

if startmerker := true
than

( scl code )

if end
 
Hallo,

der Index sollte passen, dein problem ist das hier:

#Nr_daten := #Nr_daten + 1; kommt einfach zu früh

erst Werte schreiben dann inkrementieren....

Und der Tip mit For-To statt While ist gut!
 
Zuletzt bearbeitet:
Zurück
Oben