Kleines Problem mit indirekter Adressierung

TobiS81

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen, ich möchte einen kleinen FB schreiben in dem ich abhängig vom Monat (LB13) bestimmte DBD´s aus eienm DB lade und in ein MD ablege, den DBD für den Monat Januar will ich auch extern durch eine Zahl vorgeben. Ich probiere jetzt schon seit 2 Tagen alles mögliche aus, komme aber zu keiner Lösung. Kann mir jemand mal ein bischen auf die Sprünge helfen?
 
Hallo,
du müßtest dein Problem m.E. etwas konkretisieren ...
Vielleicht stellst du mal ein (Dein) Beispiel ins Forum und dann findet sich bestimmt was ...
 
Dann gib doch mal unter Suchen "Indirekte Adressierung" ein.
Dort stehen m.E. viele interessante Ansätze. Wenn du dir da was herausgepickt hast und nicht weiterkommst hast du auf jeden Fall schon mal einen Anfang, der hier ausgebaut werden kann ...
 
Ich habe mir jetzt folgenden FB zusammengeschustert:
Code:
VAR_INPUT
  Monat : INT ;    
  Anfang_DBD : INT ;    
  Pt_db : INT ;    
END_VAR
VAR_OUTPUT
  MW_ausgelesener_Wert : INT ;    
END_VAR
VAR_TEMP
  Pt_db_1 : WORD ;    
END_VAR
BEGIN
NETWORK
TITLE =

      L     #Pt_db; 
      T     #Pt_db_1; 
      AUF   DB [#Pt_db_1]; 


NETWORK
TITLE =

      L     #Anfang_DBD; 
      SLD   3; 
      LAR1  ; 


NETWORK
TITLE =

      L     #Monat; 
      SPL   M046; 
      SPA   M042; 
      SPA   M031; 
      SPA   M032; 
      SPA   M033; 
      SPA   M034; 
      SPA   M035; 
      SPA   M036; 
      SPA   M037; 
      SPA   M038; 
      SPA   M039; 
      SPA   M040; 
      SPA   M041; 
      SPA   M042; 
M046: SPA   M015; 

M031: L     P#0.0; 
      +AR1  ; 
      SPA   M044; 
M032: L     P#2.0; 
      +AR1  ; 
      SPA   M044; 
M033: L     P#4.0; 
      +AR1  ; 
      SPA   M044; 
M034: L     P#6.0; 
      +AR1  ; 
      SPA   M044; 
M035: L     P#8.0; 
      +AR1  ; 
      SPA   M044; 
M036: L     P#10.0; 
      +AR1  ; 
      SPA   M044; 
M037: L     P#12.0; 
      +AR1  ; 
      SPA   M044; 
M038: L     P#14.0; 
      +AR1  ; 
      SPA   M044; 
M039: L     P#16.0; 
      +AR1  ; 
      SPA   M044; 
M040: L     P#18.0; 
      +AR1  ; 
      SPA   M044; 
M041: L     P#20.0; 
      +AR1  ; 
      SPA   M044; 
M042: L     P#22.0; 
      +AR1  ; 
      SPA   M044; 




NETWORK
TITLE =

M044: NOP   0; 
      L     DBD [AR1,P#0.0]; 
      T     #MW_ausgelesener_Wert; 


NETWORK
TITLE =

M015: BEA   ; 

END_FUNCTION_BLOCK
Leider ruft er immer den wert des Folgemonats auf. Ich will im Januar (input Variable Monat=1) zb.dbw12 aufrufen der Baustein gibt mir aber den Inhalt des dbw 14 aus dabei steht im AR1 12.0. Den gleichen Baustein habe ich nocheinmal (nur mit größeren Schritten um meine Realzahlen aus einem DB zu holen dort funktioniert alles einwandfrei. Nur Worte werden falsch abgeholt.
 
Hallo.

Dein Fehler liegt darin, dass du ein Doppelwordwert lädst statt eines Wordwertes.

Dien Code:
Code:
M044: NOP   0;
Code:
[COLOR=black]     L     DBD [AR1,P#0.0]; [/COLOR]
[COLOR=black]     T     #MW_ausgelesener_Wert; [/COLOR]

So wäre es richtig für einen Wordzugriff.
Code:
M044: NOP   0;
Code:
[COLOR=black]     L     DBW [AR1,P#0.0]; [/COLOR]
[COLOR=black]     T     #MW_ausgelesener_Wert; [/COLOR]

Wird ein 32Bit Wert geladen (DWord, DINT) und wird dieser in einen 16Bit Wert transferiert (Word, INT) so wird vom 32Bit Wert immer das Niederwertig Word geladen. Somit greift er immer um einen Plus 2 Versatz auf dein Datenfach. Bei Fragen stehe ich gerne zur Verfügung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Tobi,

Ich habe mir jetzt folgenden FB zusammengeschustert:
Code:
...
      M044: NOP   0; 
      L     DBD [AR1,P#0.0]; 
      T     #MW_ausgelesener_Wert; 
..
..Nur Worte werden falsch abgeholt.
Ja, wenn du ein Doppelwort lädst, kann das schon mal vorkommen ;-) .

Code:
...
      M044: NOP   0; 
      L     DB[COLOR=red][U]W[/U][/COLOR] [AR1,P#0.0]; 
      T     #MW_ausgelesener_Wert; 
..

Gruß, Onkel
 
Zurück
Oben