Step 7 Indirekte Adressierung: Wo ist mein Denkfehler?!

Luke1986

Level-2
Beiträge
74
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

Ich habe wieder mal ein Problem mit meinem Programm und würde euch gerne ein Code-Schnippselchen zeigen wollen:

Code:
      L     #QDB                 //Lade Quell-DB mit Füllmenge in m³://Im QuellDB stehen 400 Einträge, welche als "Startwert" die Füllmenge in m³ haben
      T     #TEMP_QuellDB        //Zwischenspeicher Quelldatei 
      L     #QDW                 //Lade skalierten Messwert: Skaliert von 0-400
      T     #TEMP_Messwert_Analog


//Pointer-Adressierung in Siemens S5
//B MW242
//L DW0
//T #TEMP_Messwert_Analog


//Ziel:
//a) Abfangen von Werten -> 0 < Messwert < obere Grenze: Messfehler/Überlauf
//b) Vergleich vom Messwert mit dem QuellDB und übergabe des Füllstandes (Wert in Spalte: Startwert)
//   an #ZDW (und dann entsprechend an entsprechenden DB


      AUF   #TEMP_QuellDB
      L DBB [ AR1 , P#0.0 ]


      T     #"TEMP_Daten-KubikMeter"


      L     #OG                  //Obergrenze aus Analogwertskalierung
      T     #TEMP_ObererGrenzwert
      L     #ZDW                 //Ausgabewert: Füllstand in Kubikmeter
      T     #TEMP_Messwert_KubikMeter//Temporärer Wert: Füllstand in Kubikmeter


//Verhalten bei Störung: -> Verhalten bei "a"


      U(
      L     #TEMP_Messwert_Analog
      L     0
      <=I
      )                          //ist Messwert kleiner 0?
      O
      U(
      L     #TEMP_Messwert_Analog
      L     #TEMP_ObererGrenzwert
      >I
      )                          //ist Messwert größer der oberen Grenze?
      =     #STOE                //Störung


//----------------------------------


      L     #TEMP_Messwert_Analog
      L     0
      >I
      SPB   M001                 //Wenn der analoge Messwert größer 0 ist, dann Bearbeiten...


      L     0                    //sonst schreibe 0.0 in Ausgabewert
      T     #TEMP_Messwert_KubikMeter
      SPA   M002


M001: L     #TEMP_Messwert_Analog//wenn der analoge Messwert kleiner
      L     #TEMP_ObererGrenzwert//...als die obere Grenze ist,...
      <=I
      SPB   M003                 //...dann bearbeiten
      L     29999                //wenn der analoge Messwert größer als die obere Grenze ist,...
      T     #TEMP_Messwert_KubikMeter// ... FEHLER! ...
      SPA   M002                 //...29999.0 in den Ausgabewert schreiben


M003: L     #TEMP_Messwert_Analog  //Vergleich von Messwert mit Wert aus QuellDB
      L     #TEMP_Messwert_KubikMeter
      >=I
      SPB   M002
 //Schleife: Wenn der Vergleich kein richtiges Ergebnis liefert, dann im QuellDB um ein Byte weiter adressieren und wieder vergleichen
      L     #"TEMP_Daten-KubikMeter"
      L     2
      +I
      T     #"TEMP_Daten-KubikMeter"
      SPB   M003




M002: L     #TEMP_Messwert_KubikMeter//Temporärer Ausgabewert
      T     #ZDW                 //Ausgabewert
      BE

Ich hoffe, ich versteht mein anliegen und könnt mir helfen.

Gruß Lukas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Problem ist, dass ich aus dem analogen Messwert nur indirekt den Füllstand eines Tanks ableiten kann.

Dieser wurde ausgelitert und die Werte wurden entsprechend notiert und in einen DB geschrieben.

Nun stehen die Füllmengen in eben diesem DB (#QuellDB - allderweil es 3 DBs gibt, die verschieden groß sind) und nun soll halt mein analoger Messwert (gewandelt in INT) mit einem Wert (Name im DB) verglichen werden.
Wird ein Pärchen gefunden (z.B. Messwert = 32, Eintrag im DB 32 -> Startwert vom Eintrag = 320 [m³]) soll bitte am Ausgang (#ZDW) 320 ausgegeben werden.

Ich glaube, dass der Hase irgendwo in M003 im Pfeffer liegt und dort die Adresse nicht hochgezählt wird... oder oben bei der Angabe des Pointers...

Gruß Lukas
 
Zuletzt bearbeitet:
hallöchen

wo zählst du dein adress Register denn hoch ????

und wie wärs mit denn dbs und der Schnittstelle
 
hallöchen

wo zählst du dein adress Register denn hoch ????

und wie wärs mit denn dbs und der Schnittstelle

in der Schleife in M003 zähle ich mit L 2 / +I - so die hoffnung. aber scheinbar ja nicht.

Schnittstelle + DB kann ich morgen früh nachliefern.

Im DB steht jedoch nichts weiter als

Name | Typ | Startwert
0 | Int | 21
1 | Int | 23
2 | Int | 24

usw.

Name ist nur inkrementiert - der dazugehörige startwert entsprechend der wahren messung.

gruß Lukas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
M003: L #TEMP_Messwert_Analog //Vergleich von Messwert mit Wert aus QuellDB
L #TEMP_Messwert_KubikMeter
>=I
SPB M002
//Schleife: Wenn der Vergleich kein richtiges Ergebnis liefert, dann im QuellDB um ein Byte weiter adressieren und wieder vergleichen
L #"TEMP_Daten-KubikMeter"
L 2
+I
T #"TEMP_Daten-KubikMeter"
SPB M003


wenn du das meisnt
zählst du immer nur einen zähler hoch und wo holst du dir indirekt denn neuen wert aus denn db ????

oder willst du nur am ende die zahl stehen haben die mit deiner übereinstimmt

ich steh auf der leitung
 
ziel ist, dass mein messwert (kapazitive messung), skaliert von 0-400 mit den 400 einträgen im DB verglichen wird.

bei übereinstimmung, soll der dort hinterlegte startwert übergeben werden.

beispiel:

ich messe: 145

im DB:

Name | Typ | Startwert
143 | Int | 327 [m³]
144 | Int | 329 [m³]
145 | Int| 332 [m³]

gewünschte ausgabe: 332

der Startwert ist NICHT linear, weil der tank irgendwie schräg liegt.

gruß Lukas
 
#TEMP_Messwert_Analog
#TEMP_Messwert_KubikMeter

am ende deiner Routine sind deine 2 werte gleich oder
aber du hollst dir aus denn db nie denn anderen wert raus ????
 
Who wurde das AR1 gesetz?
Poste die ganse FC.
Wenn die wert von 1-400 = dass nr von tabelle in DB ist kan man das adresse gleich mit dit werd adressieren. Wenn in DB 400 INTs stehn kan man das adresse von das DBW berechnen.
Code:
L #Scalierter wert
+ -1  //wert ist von 1-400 und erste wert steht auf DBW0
SLW 4      // nach bitadresse umwandlen
T       #t_adresse    // Temp  DWord
AUF [COLOR=#333333][FONT=Courier]#TEMP_QuellDB
[/FONT][/COLOR]L DBW[t_adresse]
T  [COLOR=#333333][FONT=Courier]#"TEMP_Daten-KubikMeter"[/FONT][/COLOR]
 
Zurück
Oben