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



## DerPraktikant (4 Dezember 2008)

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


----------



## vierlagig (4 Dezember 2008)

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:


```
*
      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!?


----------



## DerPraktikant (4 Dezember 2008)

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


----------



## vierlagig (4 Dezember 2008)

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


----------



## Roos (4 Dezember 2008)

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


----------



## vierlagig (4 Dezember 2008)

Roos schrieb:


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



nichts anderes machen wir mit dem sprung. schau dir mal deinen KUP-bausteinaufruf in AWL an


----------



## Roos (4 Dezember 2008)

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

Gruß


----------



## DerPraktikant (4 Dezember 2008)

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?


```
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
> ...


 
Ja, definitiv, wer lesen kann ist klar im Vorteil  Das heisst ich sollte dann eher MD0, MD4, MD8 und MD12 zum Abspeichern meiner Maximalwerte?


----------



## FrankW (4 Dezember 2008)

Hallo


DerPraktikant schrieb:


> 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
> ...


 
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.


----------



## Gebs (4 Dezember 2008)

Hallo Praktikant,

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



DerPraktikant schrieb:


> 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
> ...



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:

```
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


----------



## vierlagig (4 Dezember 2008)

und wenn ihr jetzt noch davon wegkommt mit dem PEW6 zu vergleichen, dann wird alles gut


----------



## DerPraktikant (4 Dezember 2008)

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


```
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.


----------



## Gebs (4 Dezember 2008)

Hallo Praktikant,



DerPraktikant schrieb:


> aber was magst Du jetzt nicht am PEW 6 ?



was VL damit sagen will ist, dass man mit dem normierten Wert, den der FC 105 ausspuckt
arbeiten soll.

Grüße
Gebs


----------



## vierlagig (4 Dezember 2008)

DerPraktikant schrieb:


> 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



DerPraktikant schrieb:


> 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.


----------



## OHGN (4 Dezember 2008)

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

Mein Vorschlag zur Lösung:

```
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
```


----------



## vierlagig (4 Dezember 2008)

OHGN schrieb:


> Der Aufruf des FC105 ohne Parameterübergabe,



ich glaub es ging erstmal nur um die schematische darstellung ... zumindest hatte ich punkte unter meinem aufruf um das so darzustellen ... ich hoffe sehr, dass die anderen das auch alle so erkannt haben.


----------



## DerPraktikant (5 Dezember 2008)

Ich nehme mir dann einmal die Freiheit den Code von OHGN zu nutzen.
Ich hätte da aber noch einige Fragen:

Zitat:


```
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:


```
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


```
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:


```
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:


```
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.


----------



## vierlagig (5 Dezember 2008)

DerPraktikant schrieb:


> Das müsste dann passen nehme ich an.



wenn du auf die flanke acht gibst, ja, dann könnte das funktionieren, wobei du den messwert nicht nullen mußt


----------



## DerPraktikant (5 Dezember 2008)

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?


----------



## vierlagig (5 Dezember 2008)

DerPraktikant schrieb:


> Irgendwie sehe ich hier keine kritische Flanke :???:, aber es ist noch früh am Morgen...



wenn du keine flankenauswertung machst, bügelst du die 0 immer drüber, egal ob die messung gerade neu gestartet wurde, sie schon stunden läuft oder gerade inaktiv ist ... wobei letzteres könnteste fast verhindern 



DerPraktikant schrieb:


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



jopp


----------



## OHGN (5 Dezember 2008)

DerPraktikant schrieb:


> Irgendwie sehe ich hier keine kritische Flanke :???:, aber es ist noch früh am Morgen...


vierlagig meinte nur, dass Du das Nullsetzen der MD's von einer Bedingung abhängig machen musst. Das könnte auch eine Flanke sein, muss es aber nicht.

```
U     E      0.5                  //neue Messreihe starten
      SPBN  sp01
      L     0.000000e+000               //wenn neue Messreihe
      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
sp01: NOP   0
```


----------



## vierlagig (5 Dezember 2008)

OHGN schrieb:


> Das könnte auch eine Flanke sein, muss es aber nicht.



ich finde die lösung mit dem automatischen rücksetzen bei neuer messreihe eleganter ... aber natürlich kann da auch ein reset von einem HMI kommen ... oder man behält die werte um eine vergleichsmessung machen zu können ... oder man macht es so wie OHGN oder oder oder ... aber von die nullen per HMF* in die CPU zu kloppen würde ich abraten!


*Hammer, Meißel, Flex


----------



## DerPraktikant (5 Dezember 2008)

Ich nehme an, das mit der Flankenauswertung und dem überbügeln der 0 meinst Du in dem Kontext des Nullsetzens der 4 gespeicherten Werte am Ende des Prüfzyklus. Das müsste dann so behoben werden können, oder?


```
U     E       6.7                  //wenn am TP Schaltfläche für "Neuer Test" gedrückt
FP   M       6.7                  //und dieses Signal hat eine steigende flanke 
L     0.000000e+000           //dann lade 0
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
```
 
Wenn Du das nicht gemeint hast, und Du eher an den Code um den FC 105 herum gedacht hast, dann musst Du mir aber erklären wie. Irgendwie sehe ich nämlich gerade so keine Stelle an der ich eine Flankenauswertung reinsetzen sollte.


----------



## vierlagig (5 Dezember 2008)

mach noch einen sprung "wenn VKE=0" hinter FP und alles wird gut


----------



## vierlagig (5 Dezember 2008)

achso, noch was ... du solltest im richtigen format nullen. nicht weil es sonst nicht funktioniert, nur weil es logischer ist und damit die nachvollziehbarkeit unterstützt wird ... also 0.00 in die MDs schreiben


----------



## DerPraktikant (5 Dezember 2008)

Thema Format: 0.000000e+000 müsste doch das Richtige sein für die MDs
Die Maximal und Minimalwerte in dem FC105 werden ja auch in dem Format gegeben, also müsste der Ausgang des FC105 ja auch dem entsprechen.

Die Geschichte mit der Flankenauswertung sollte dann in etwa so aussehen:


```
P602: U     E       6.7                  //wenn am TP Schaltfläche für "Neuer Test" gedrückt
      FP   M       6.7                  //und dieses Signal hat eine steigende flanke 
      SPBN P603 
      L     0.000000e+000           //dann lade 0
      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
P603: NOP
```
 
Oder schmeiss ich wieder Sachen durcheinander?


----------



## vierlagig (5 Dezember 2008)

DerPraktikant schrieb:


> Oder schmeiss ich wieder Sachen durcheinander?



nö, flanke paßt ... wo hab ich denn erst die INT 0 gesehen  *grübel* ...anyway... 0.00 passt natürlich

aber weeßte was, du mußt doch da vier mal das selbe machen, warum bauste dir da nicht einen FB für, den du dann nur noch vier mal aufrufen brauchst und entsprechend beschalten? das fänd ich viiiiieeeel eleganter


----------



## DerPraktikant (8 Dezember 2008)

Einen schönen Montag Morgen allen 

Ich habe mir den Code zum Einlesen noch einmal genauer angeschaut eben, so wie OHGN ihn vorgeschlagen hat:


```
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
[B]SPB   P402[/B]
      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
```
 
Dabei ist mir allerdings etwas aufgefallen, so in etwa in der Mitte (fett geschrieben). Insgesamt würde diese Variante dann bedeuten dass er den Wert einliest, mit dem gespeicherten Maximalwert vergleicht, und wenn der aktuelle Wert grösser ist als der Maximalwert, dann Sprung zu P402 ohne vorher den aktuellen Wert als neuen Maximalwert zu speichern für den nächsten Zyklus.

Da es mir aber darum geht, am Ende in MD 4 den höchsten Wert gespeichert zu haben, der während der ganzen Zeit gemessen wurde, wäre es da nicht sinnvoller das Fettgedruckte durch


```
SPBN P402
```
 
zu ersetzen?

Weil das <R vergleicht ja ob MD4 < MD0 und wenn ja (VKE=1) dann sollte er doch die nächsten beiden Zeilen


```
TAK   
      T     MD     4                    //dann neuen Wert in MD 4 schreiben
```
 
auch gleich umsetzen, da diese ja dann den (höheren) Wert von MD0 in MD4 schreiben, und sich somit ein neuer Maximalwert ergibt für den nächsten Zyklus.

Oder habe ich die <R Anweisung falsch verstanden?


----------



## DerPraktikant (8 Dezember 2008)

Ich glaube ich habe etwas verwechselt...


```
LD MD 0
LD MD 4
<R
```
 
bedeutet an sich ja, dass wenn MD 4 < MD 0 dann kriegt man als VKE = 1, oder?

Dann wäre meine Frage beantwortet


----------



## johnij (8 Dezember 2008)

DerPraktikant schrieb:


> Ich glaube ich habe etwas verwechselt...
> 
> 
> ```
> ...


 


```
L MD 0
L MD 4
<R
```
bedeutet:
Vergleiche, ob AKKU2 (MD 0) kleiner (<) als AKKU1 (MD 4) 
--> VKE=1 if MD 0< MD 4


----------



## Gebs (8 Dezember 2008)

Guten Morgen Praktikant,

der Vergleich <R ergibt, wie Du schon gemerkt hast, VKE = 1 wenn
der neue Wert kleiner ist als der gespeicherte Altwert.

Grüße
Gebs


----------



## vierlagig (8 Dezember 2008)

johnij schrieb:


> ```
> L MD 0
> L MD 4
> <R
> ...



soweit richtig, aber



johnij schrieb:


> --> VKE=1 if MD 0> MD 4



 ...da sollteste nochmal drüber nachdenken!


----------



## johnij (8 Dezember 2008)

vierlagig schrieb:


> soweit richtig, aber
> 
> 
> 
> ...da sollteste nochmal drüber nachdenken!


 

Moin 4l,
es war ein tippfehler (< statt >)
ich habe es korrigiert
Danke für den Hinweis


----------



## Gebs (8 Dezember 2008)

Hallo johij,



johnij schrieb:


> Vergleiche, ob AKKU2-L (MD 0) kleiner (<) als AKKU1-L (MD 4)
> --> VKE=1 if MD 0< MD 4



stimmt nicht ganz. AKKUx-L ist nur ein Wort groß. Realzahlen aber ein Doppelwort.
Deshalb: AKKU2 < AKKU1

Grüße
Gebs


----------



## vierlagig (8 Dezember 2008)

Gebs schrieb:


> Hallo johij,
> 
> 
> 
> ...



man übersieht bei seinen beiträgen gern mal einen fehler .. es sind einfach zuviele


----------



## DerPraktikant (8 Dezember 2008)

Gleich soviele Antworten. Danke, aber ich bin jetzt noch immer etwas verwirrt...

Also es bleibt mit


```
L MD 0
L MD 4
<R
```
 
ja jetzt dabei dass VKE = 1 wenn MD0 < MD4 ?

Soweit ich das weiss wird ja bei zwei Ladeoperationen hintereinander der zuerst geladene Wert automatisch in AKKU 2 verschoben wenn der zweite geladen wird?


----------



## Gebs (8 Dezember 2008)

Ja, so ist es richtig.
Die Step 7-Hilfe sagt:


> Beschreibung
> 
> L <Operand> lädt den Inhalt des adressierten Bytes, Wortes oder Doppelwortes in AKKU 1, *nachdem zuvor* der alte Inhalt von AKKU 1 in AKKU 2 gespeichert wurde und AKKU 1 auf "0" zurückgesetzt wurde.


Grüße
Gebs


----------



## DerPraktikant (8 Dezember 2008)

Mal noch eine ganz andere Frage; 

Was genau bedeutet die Zeile

RET_VAL:=MW50

in dem Code des FC105?

Ich glaube das hängt irgendwie mit dem Format des ausgegebenen Wertes zusammen, oder?


----------



## vierlagig (8 Dezember 2008)

RET_VAL enthält die Fehler- und Betriebsinfos des FC105, nachzulesen in der Bausteindoku des Bausteins. diese wird in deinem fall im MW50 gespeichert.

notwendig ist die angabe eines operanden, da der skalierungsbaustein eine funktion ist, wäre es ein funktionsbaustein (FB) könnte dieser ausgang unbeschaltet bleiben


----------



## Ralle (8 Dezember 2008)

> RET_VAL    Ausgang    WORD    E, A, M, D, L, P    Gibt den Wert W#16#0000 aus, wenn die Operation fehlerfrei ausgeführt wird. Wird ein anderer Wert ausgegeben, entnehmen Sie der Fehlerinformation nähere Informationen hierzu.



Cursor auf FC105 --> "F1"


----------



## FrankW (8 Dezember 2008)

DerPraktikant schrieb:


> Mal noch eine ganz andere Frage;
> 
> Was genau bedeutet die Zeile
> 
> ...


Hallo,

aus der Online-Hilfe
"Fehlerinformation
Ist der ganzzahlige Eingabewert größer als K2 [27648], dann wird der Ausgang (OUT) an HI_LIM gebunden und ein Fehler ausgegeben. Ist der ganzzahlige Eingabewert kleiner als K1 [-27648], dann wird der Ausgang an LO_LIM gebunden und ein Fehler ausgegeben. Der Signalzustand von ENO wird auf "0" und RET_VAL wird auf W#16#0008 gesetzt."


----------

