Einlesen eines Analogwertes über mehrere Sekunden, anschl. speichern und anzeigen

DerPraktikant

Level-1
Beiträge
65
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich habe folgendes Problem: Ich soll mit meiner CPU314C-2PtP einen Analogwert über mehrere Sekunden einlesen, den Maximalwert dieser Zeit speichern und am Ende des Tests (es werden insgesamt vier verschiedene Analogwerte über diesen Kanal gemessen) sollen dann die vier Werte separat angezeigt werden auf einem TP177B.

Als Praktikant der gerade mal eine Woche mit AWL in S7-300 programmiert bis ich jetzt natürlich total überfordet.

Ich habe das Forum nach "Analogwert einlesen" durchforstet und bin diesem FC105 Baustein begegnet. Hier zunächst die erste Frage:

Wie kriege ich den Wert vom Messverstärker in die CPU? Resp. wie soll meine Programmierung dabei aussehen?

Laut Siemens-Ausbildungsunterlage sollte ich folgendes tun:

U E 0.4 //Sensor meldet "Endposition erreicht"
CC FC105 //Bausteinaufruf

Wundersamerweise gibt die Unterlage aber nirgends an wo und wie man von welchem Eingang aus einliest, also gehe ich davon aus dass noch mehr dahinter steckt.

Eingang in diesem Fall ist ein Kraftsensor 0...20kN mit dafür kalibriertem Messverstärker der 0...+10V ausgibt (und dann in den entsprechenden Analogeingang meiner CPU gesteckt wird)

Und am Ende möchte ich dann von den vier verschiedenen Messungen jeweils den Maximalwert separat gespeichert haben und dann auf dem TP177B anzeigen lassen.

Mit Gebastel und Raten könnte es irgendwie so aussehen:

U E 0.4 //Sensor meldet "Endposition erreicht"
CC FC105 //Bausteinaufruf
L PEW 6 //Ist dies der richtige (erste) Eingang der CPU314C-2PtP?
???

Wie gesagt ich habe danach gesucht hier, ich habe auch alle Threads durchgesehen die mir angezeigt wurden, aber so 100% Durchblick habe ich noch immer nicht. Bloss Links zu anderen Threads posten hilft mir wahrscheinlich nicht weiter :icon_confused:

Danke im Voraus,
Euer (verzweifelter) Praktikant
 
fangen wir mal ganz langsam an. die FAQ zu dem thema hast du ja schon gelesen. da steht dann auch drinnen, wo du die adresse deines analogwertes findest, nämlich in der HW-konfig deiner station.

den aufruf des FC105 würd ich mit CALL machen.

die freigabe des einlesens ist soweit fast ok, bedingen kannst du den aufruf allerdings nur mit einem sprung, also:

Code:
*
      U     E      0.4                  //Sensor meldet "Endposition erreicht"
      SPBNB _001
      CALL  FC   105                    //Bausteinaufruf
      ...
_001: NOP   0

verstehe ich das richtig, dass du nur den maximalwert brauchst? da brauchst du dann zwei variablen, den wert des aktuellen zyklusses und denvergleichswert äqu. maximalwert. diesen letzten setzt du vor dem einlesen auf null. dann vergleichst du den aktuellen wert mit diesem maximalwert, wenn der aktuelle größer als der maximalwert ist, diesen dann umkopieren.

ich denke, mit der einstellung der dauer der aufzeichnung gibt es erstmal keine probleme!?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke. Gute Idee den aktuellen Wert immer mit dem Maximalwert zu vergleichen und diesen zu überschreiben wenn der Erste grösser ist, da wäre ich jetzt auf Anhieb nicht darauf gekommen.

Die Aufzeichnung beginnt wenn die Endposition erreicht ist ( U E 0.4 ) und endet wenn diese verlassen wird ( UN E 0.4 ).

Aber irgendwie brauche ich dann doch noch eine Art Schleife weil ich während dieser Zeit ja wiederholt einlese?

Irgendwas in der Art

...
L 0 //0 in AKKU 1 laden
T MD1 //0 nach Merkerdoppelwort 1 transferieren
P000:U E 0.4 //Prüfen ob noch in Endlage
SPBNB P001
CALL FC 105
L MD1
L PEW 6 //angenommen es wäre dieser Analog-Eingang
<I //wenn neuer Wert grösser als alter wert
T MD1 //dann neuen Wert in MD1 schreiben
SPA P000 //zurück zur Marke P000

P001: NOP 0
...

Und für die drei anderen Messungen dann genau der gleiche Vorgang, nur MD2 , MD3, und MD4 anstelle von MD1
 
Zuletzt bearbeitet:
ohoh, wir haben noch viel zu tun ;)

als erstes: code-tags wären nett! danke...

die schleife hast du durch die zyklische bearbeitung des programms, solange die wertskalierung aktiviert ist, wird diese jeden zyklus ausgeführt. zur freigabe der messung gehört dann noch die dauer der freigabe.

das setzen auf null solltest du nur beim start der messung machen - stichwort flankenauswertung.

MD1, MD2, MD3, MD4 ... owei owei ... schau dir auf jeden fall nochmal das speicherkonzept an!
ein kurzer abriß:

ein bit ist bestandteil von byte, word und dword
8 bits sind ein byte
2 byte sind ein word
2 word sind ein dword

und das schöne daran, sie sind bereichsübergreifend

also das MD0 besteht aus MB0...MB3 ... also wäre das nächste freie dword das MD4, denn MD2 z.b. besteht aus MB2, MB3 (welche ja schon im MD0 drinnen sind), MB4 und MB5 bzw. MW2 und MW4 ... desweiteren empfehle ich dir immer durch zwei teilbar zu adressieren, das rechnet sich einfacher
 
Hallo Praktikant,

meines wissens hat der FC 105 eine EN (Freigabe zum bearbeiten des Baustens) benutz doch diesen eingang in verbindung mit dem Sensor.

Sensor da.... Baustein FC 105 freigegeben.
Sensor weg.. Baustein FC 105 gesperrt.

vll hilfts dir.

Gruß Johannes
 
stimmt und durch die zyklische bearbeitung des Programmes springt er bei Änderung des Sensors zur Sprungmarke _001!

Gruß
 
Aaah eben dachte ich noch ich hätte es begriffen ;)
Ich erlaube mir mal Deinen Beitrag auseinander zu pflücken.

ohoh, wir haben noch viel zu tun ;)

als erstes: code-tags wären nett! danke...

Meinst Du so?

Code:
U E O.O
S A 4.5

die schleife hast du durch die zyklische bearbeitung des programms, solange die wertskalierung aktiviert ist, wird diese jeden zyklus ausgeführt. zur freigabe der messung gehört dann noch die dauer der freigabe.

Verstehe ich das richtig dass das ganze Programm eh immer durchlaufen wird bis die Abbruchbedingung kommt? Wie gesagt, für zwei der Messungen kann ich nur schwer eine Dauer festlegen, da ein Hydraulikylinder solange an einer Schubstange zieht bis die Motorkupplung an der Schubstange durchdreht. Das dauert länger bei neuen Motoren als bei alten nehme ich an.

das setzen auf null solltest du nur beim start der messung machen - stichwort flankenauswertung.

Habe ich doch versucht, oder? Also zumindest war es so geplant, da die Sprungmarke ja unter dem Laden des Wertes 0 in AKKU 1 steht.

MD1, MD2, MD3, MD4 ... owei owei ... schau dir auf jeden fall nochmal das speicherkonzept an!
ein kurzer abriß:

ein bit ist bestandteil von byte, word und dword
8 bits sind ein byte
2 byte sind ein word
2 word sind ein dword

und das schöne daran, sie sind bereichsübergreifend

also das MD0 besteht aus MB0...MB3 ... also wäre das nächste freie dword das MD4, denn MD2 z.b. besteht aus MB2, MB3 (welche ja schon im MD0 drinnen sind), MB4 und MB5 bzw. MW2 und MW4 ... desweiteren empfehle ich dir immer durch zwei teilbar zu adressieren, das rechnet sich einfacher

Ja, definitiv, wer lesen kann ist klar im Vorteil ;) Das heisst ich sollte dann eher MD0, MD4, MD8 und MD12 zum Abspeichern meiner Maximalwerte?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
L 0 //0 in AKKU 1 laden
T MD1 //0 nach Merkerdoppelwort 1 transferieren
P000:U E 0.4 //Prüfen ob noch in Endlage
SPBNB P001
CALL FC 105
L MD1
L PEW 6 //angenommen es wäre dieser Analog-Eingang
<I //wenn neuer Wert grösser als alter wert
SPB P000
T MD1 //dann neuen Wert in MD1 schreiben
SPA P000 //zurück zur Marke P000

P001: NOP 0

Transfer ist vom VKE unabhängig, du hättest immer PEW 6 ins MD 1 geschrieben.
Generell wird diese Schleife nicht funktionieren! Wenn du nur 2s in der Endlage stehst wird deine Zykluszeit über 2000ms lang --> da ist die SPS schon längst im Stop.
 
Hallo Praktikant,

mit diesem Code schickst Du die SPS garantiert mit Zykluszeitüberschreitung in STOPP!

L 0 //0 in AKKU 1 laden
T MD1 //0 nach Merkerdoppelwort 1 transferieren
P000:U E 0.4 //Prüfen ob noch in Endlage
SPBNB P001
CALL FC 105
L MD1
L PEW 6 //angenommen es wäre dieser Analog-Eingang
<I //wenn neuer Wert grösser als alter wert
T MD1 //dann neuen Wert in MD1 schreiben
SPA P000 //zurück zur Marke P000

P001: NOP 0

Du springst immer wieder zur Marke P000 zurück. Da sich das PAE aber innerhalb eines Zykluses
nicht ändert, kommst Du bei E 0.4 = 1 nie zur Marke P001!

Besser wäre:
Code:
U E 0.4 //Prüfen ob noch in Endlage
SPBN P001
CALL FC 105
L MD 0
L PEW 6 //angenommen es wäre dieser Analog-Eingang
<I //wenn neuer Wert grösser als alter wert
SPB P001
T MD 0 //dann neuen Wert in MD 0 schreiben

P001: NOP 0
Jetzt wird einmal pro Zyklus verglichen, ob sich der Wert geändert hat.

Grüße
Gebs
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also die Idee von Gebs ist mir so langsam klar, aber was magst Du jetzt nicht am PEW 6 ? ;)

Aber sonst scheint in dem von ihm vorgeschlagenen Code

Code:
U E 0.4 //Prüfen ob noch in Endlage
SPBN P001
CALL FC 105
L MD 0
L PEW 6 //angenommen es wäre dieser Analog-Eingang
<I //wenn neuer Wert grösser als alter wert
SPB P001
T MD 0 //dann neuen Wert in MD 0 schreiben

P001: NOP 0

alles drin zu sein was ich brauche.

Also:
1. Einlesen einer Spannung zwischen 0...10V als analoger Eingangswert
2. Vergleichen mit dem letzten Maximalwert und überschreiben des Letzteren wenn der kleiner war
3. Beim nächsten Zyklus wird geprüft ob das Ganze noch in Endlage ist. wenn ja, zu 1. , wenn nicht weiter zu 4.
4. Sprung hinter den Vergleich

Sollte an sich alles passen. Bleibt halt die Frage mit dem PEW 6 da die SPS leider noch immer nicht geliefert wurde :sb7: und ich aus dem Datenblatt der CPU auch nicht unbedingt herausfinden kann wo die Analogeingänge anfangen.
 
aber was magst Du jetzt nicht am PEW 6 ? ;)

gehen wir mal von 5V am analogeingang aus:

so hast du im MD0, je nach skalierung, ich geh jetzt mal von 0..10 aus, eine 5.00e00
im PEW6 aber eine W#16#3600

und jetz sag er mir, wie er das vergleichen möchte! vorallem mit dem <I wird das nischts ... wie ich bereits im ersten beitrag erwähnte brauchst du zwei speicherbereiche, die mit einem <R verglichen werden sollten

Bleibt halt die Frage mit dem PEW 6 da die SPS leider noch immer nicht geliefert wurde :sb7: und ich aus dem Datenblatt der CPU auch nicht unbedingt herausfinden kann wo die Analogeingänge anfangen.

im normfall kannst du die bereiche einstellen! ... übrigens: wenn die werte innerhalb des prozessabbildes liegen kannst du auch mit EW6 arbeiten, der zugriff erfolgt schneller ... den unterschied haste ja in der FAQ nachlesen können.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Vorschläge hier sind doch etwas merkwürdig.
Der Aufruf des FC105 ohne Parameterübergabe, vergleichen des PEW mit dem Doppelwort, das auch mit dem Inhalt des PEW beschrieben wird...
Wozu brauche ich dann den FC105:confused:

Mein Vorschlag zur Lösung:
Code:
      U     E      0.4                  //Prüfen ob noch in Endlage
      SPBN  p001
      CALL  FC   105
       IN     :=PEW6                    //angenommen es wäre dieser Analog-Eingang
       HI_LIM :=2.000000e+001           //Maxwert ist 20kN
       LO_LIM :=0.000000e+000           //Minwert ist 0kN
       BIPOLAR:=FALSE
       RET_VAL:=MW50
       OUT    :=MD0                     //normierter Wert
      L     MD     0                    //normierter Wert
      L     MD     4                    //max Speicherwert
      <R                                //wenn neuer Wert grösser als alter wert
      SPB   p002
      TAK   
      T     MD     4                    //dann neuen Wert in MD 4 schreiben
      SPA   p002
p001: L     0.000000e+000               //wenn nicht mehr in Endlage
      T     MD     0                    // 0 in MD0 schreiben
      T     MD     4                    //und MD4 schreiben
p002: NOP   0
 
Ich nehme mir dann einmal die Freiheit den Code von OHGN zu nutzen.
Ich hätte da aber noch einige Fragen:

Zitat:

Code:
      U     E      0.4                  //Prüfen ob noch in Endlage
      SPBN  P401
      CALL  FC   105
       IN     :=PEW6                    //angenommen es wäre dieser Analog-Eingang
       HI_LIM :=2.000000e+001           //Maxwert ist 20kN
       LO_LIM :=0.000000e+000           //Minwert ist 0kN
       BIPOLAR:=FALSE
       RET_VAL:=MW50
       OUT    :=MD0                     //normierter Wert
      L     MD     0                    //normierter Wert
      L     MD     4                    //max Speicherwert
      <R                                //wenn neuer Wert grösser als alter wert
      SPB   P402
      TAK   
      T     MD     4                    //dann neuen Wert in MD 4 schreiben
      SPA   P402
P401: L     0.000000e+000               //wenn nicht mehr in Endlage
      T     MD     0                    // 0 in MD0 schreiben
      T     MD     4                    //und MD4 schreiben
P402: NOP   0

In diesem Teil:

Code:
P401: L     0.000000e+000               //wenn nicht mehr in Endlage
      T     MD     0                    // 0 in MD0 schreiben
      T     MD     4                    //und MD4 schreiben

Hier habe ich das Gefühl als wenn das MD4 = 0 gesetzt würde sobald die Schubstange die Endlage verlässt ( UN E 0.4 ). Was allerdings ziemlich unpraktisch wäre da ich ja viermal eine Kraft messe und am Ende des Ganzen die vier gemessenen Kräfte noch zur Verfügung haben muss.

Wenn das dann der Fall wäre dass hier MD4 = 0 gesetzt würde, würde ich vorschlagen diesen Teil

Code:
P401: L     0.000000e+000               //wenn nicht mehr in Endlage
      T     MD     0                    // 0 in MD0 schreiben
      T     MD     4                    //und MD4 schreiben

durch diesen zu ersetzen:

Code:
P401: L     0.000000e+000               //wenn nicht mehr in Endlage
      T     MD     0                    // 0 in MD0 schreiben

Und bei der zweiten Messung würde ich dann den Wert in MD8 speichern anstelle in MD4 , resp. MD12 und MD16 bei den beiden letzten Messungen, und am Ende würde ich mir dann die Werte von MD4, MD8, MD12 undMD16 auf dem TP anzeigen lassen können.

Und nach dem Quittieren der Testergebnisse, resp. wenn ein neuer Test gestartet wird, füge ich dann noch diese Zeilen ein, ehe es losgeht:

Code:
L     0.000000e+000               //wenn nicht mehr in Endlage
T     MD     0                    // 0 in MD0 schreiben
T     MD     4                    //und MD4 schreiben
T     MD     8                    //und in MD8 schreiben
T     MD    12                   //und in MD12 schreiben
T     MD    16                   //und in MD16 schreiben

Das müsste dann passen nehme ich an.
 
Irgendwie sehe ich hier keine kritische Flanke :???:, aber es ist noch früh am Morgen...

Eine wahrscheinlich eher triviale Frage, OHGN schägt als Maximalwert HI_LIM=2.000000e+001 vor, da ich von 20kN redete. Tatsächlich geht es aber um 20.000N ;)

Demnach müsste ich dann nur HI_LIM=2.000000e+004 schreiben an der Stelle?
 
Zurück
Oben