Adresse eines Merkers am FB ermitteln

RAN

Level-1
Beiträge
19
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus!
Ich hab folgendes Problem(chen). Ich habe ein FB mit IN, OUT und IN_OUT. Von außen habe ich Merker angeschaltet. Ich will jetzt im FB wissen welcher Merker draußen angeschrieben ist.


Beim FC ist das ganz einfach(z.B):
L P##Eingang_bool

und schon habe ich den Pointer der mit verrät, welcher Datenbereich (ob E, A, M, DB, DI...) und welche Adresse das "Ding" hat. (z.B.8300002a).

Das brauch ich beim FB!
Wenn ich das wie oben programmiere, pointet der natürlich immer auf den Instanz-DB:( . Das hilft mir nicht, ich brauche die Adresse des Merkers (ob der 1(True) oder 0(false) ist, ist mir nicht wichtig.

Gibt es dafür eine Lösung. Ich wäre so dankbar!
 
Zuletzt bearbeitet:
Also nicht das ich eine Lösung hätte,
das es beim FC funktioniert ist imho auch mehr ein "Zufall" weil Siemens E/A/M
direkt im FC ersetzt,
während DB ... im Lokalstack landen.

Aber wofür braucht man im FB/FC die Adresse?

Mfg
Manuel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich will eine Fehlerverwaltung mit "Reaktionssystem" basteln.
Merker in einem bestimmten Bereich stellen verschiedene Sperren da, wie z.B. "Antriebssperre", Hydrauliksperre....

Der Merker z.B. "Antriebssperre" soll aus den unterschiedlichsten Progammteilen als Reaktion auf einen Fehler "gesetzt" werden.
Das geschieht indirekt über einen Reaktionsbaustein.

Der Reaktionsbaustein war bisher immer ein FC. Nun ist aber der SFC18 (ALARM_S) drin. Was die Verwendung eines FCs unmöglich macht (jedenfalls hab ich es nicht hingekrigt:( ). Deshalb FB!

Gruß RAN
 
Man könnte es so machen:

Code:
FUNCTION_BLOCK FB 100
TITLE =
VERSION : 0.1


VAR_INPUT
  Dein_Input : ANY ;    
END_VAR
VAR_OUTPUT
  Dein_Output : BOOL ;    
END_VAR
VAR
  HM_Flanke : BOOL ;    
  Flanke : BOOL ;    
END_VAR
BEGIN
NETWORK
TITLE =Flanke von deinem Input

      L     P##Dein_Input; 
      LAR1  ; 

      L     D [AR1,P#6.0]; 
      LAR1  ; 

      U     M [AR1,P#0.0]; 
      FP    #HM_Flanke; 
      =     #Flanke; 
NETWORK
TITLE =Diese Flanle als Output

      U     #Flanke; 
      =     #Dein_Output; 
END_FUNCTION_BLOCK
Aufruf:

Code:
      CALL  FB   100 , DB100
       Dein_Input :=M10.0
       Dein_Output:=M11.0
Dein Input deklarierierst du als Any.
Der Code liest jetzt den Inhalt des Merkers, aber du kannst damit natürlich auch die Info über den Merker aus dem Any herausholen.
 
Hallo Ralle,
ersmal vielen D A N K! Das Funktioniert!

Der Code:
Code:
    L     P##Dein_Input
      LAR1  
      L     D [AR1,P#6.0]
ist genau das was ich brauche. Ein Problem habe ich aber trotzdem. Der FB in dem ich die Adresse des angeschalteten Merkers brauche, hat keinen eigenen Instanz-DB (nämlich Multiinstanz im übergeordneten FB).
Dann Funktioniert das nicht mehr:confused: . Weißt du WARUM??
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt gehts, ich habe die Offsetverschiebung auf die Adresse im Instanz-DB angepasst. Erstmal ein dickes D A N K E!:D
Wie es jedoch funktioniert ist mir noch nicht ganz klar.
Und ich werd verrückt wenn ich was nicht verstehe.
 
Jetzt gehts, ich habe die Offsetverschiebung auf die Adresse im Instanz-DB angepasst. Erstmal ein dickes D A N K E!:D
Wie es jedoch funktioniert ist mir noch nicht ganz klar.
Und ich werd verrückt wenn ich was nicht verstehe.

Das ist leider Geheim,
wir könnten es dir sagen, aber danach müssten wir dein Notebook unschädlich machen. Also überleg es dir gut.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also INOUT habe ich auch probiert. Macht aber kein unterschied.
Ich finde das ist etwas kompliziert und kniffelig!

Ich habs jetzt so:
Code:
//Anfangsadresse der Multiinstanz im Instanz-DB steht im AR2
      TAR2                              //Inhalt des AR2 in Akku1 holen und
      L     DW#16#84000000              //Den DB-Bereich (also links die 16#84) löschen, in dem der Pointer mit 16#84000000 subtrhiert wird. 
      -D                                //(Es wäre auch möglich mit SLD und SLR den Bereich zu löschen)
      SRD   3                           //Die 3 Bitstellen (rechts) löschen damit steht das Ergebnis (also die Anfangsadresse der Multiinstanz) richtig im Akku.
      L     6                           //Die Anfangsadresse der Multiinstanz um 6 Bytes verschieben.
      +I                                //(Also Anfangsadresse der Multiinstanz plus 6)
      T     #Anfang_plus_6
//Auf Adresse des angeschalteten Merkers pointen
      L     P##Reaktion_1               //Pointer der Reaktion_X laden (pointet im Instanz-DB (16#8500XXXX))
      L     #Anfang_plus_6              //An die Anfangsadresse der "Multiinstanz plus 6" rechts die 3 Bitstellen 
      SLD   3                           //wieder anfügen, und zum Pointer der Reaktion_X addieren.
      +D    
      LAR1                              //Den fertigen Pionter in AR1 laden - 
      L     D [AR1,P#0.0]               //und auf die angeschaltete Adresse pointen (sollte Merker sein)
      LAR1                              //(Im AR1 kann die angepointete Adresse eingesehen werden. Anweisung LAR1 ist für die Funktion nicht nötig)
      L     P#M 0.0                     //Den Merker-Bereich (also links die 16#83) des Any-Pointers löschen,             
      -D                                //in dem der Pointer mit (P#M 0.0 = DW#16#83000000) subtrhiert wird.
      T     #Adresse_Reaktionsbit       //(Im Akku1 kann die angepointete Adresse in Oktal! eingesehen werden. Anweisung T ist für die Funktion nicht nötig)

Toll nicht!?!
 
Hallo ran.

Wenn du mit Multiinstanzen arbeitest, muß du bei solchen Adressberechnungen das Adressregister 2 hinzuaddieren, denn darin steht die "Adressverschiebung".

Gruß

boogoo :ROFLMAO:
 
Zurück
Oben