Pointer <- Indirekter DB möglich ?

Zuviel Werbung?
-> Hier kostenlos registrieren
Hab noch mal nachgeschaut... Hier noch mal das komplette Netzwerk 1:
Code:
// Den Begleitwerten einmalig den passenden Instanzdatenbaustein zuweisen
// Hierzu einen ANY_Pointer verwenden:
// Pointer im Format für die Begleitwerte der Alarm_S und SQ SFCs bilden
      L     B#16#10                     // TYP (Teil1): 10h für s7
      T     LB     0
      L     B#16#2                      // TYP (Teil2): BYTE
      T     LB     1
      L     12                          // Anzahl (Bytes) ab Startadresse
      T     LW     2
      L     #DI_Number                  // Nummer des Datenbausteins (IN:INT)
      T     LW     4
      L     1170                        // Startadresse im DB (Beginn STAT-Bereich)
      SLD   3                           // Pointer erzeugen
      T     LD     6
      L     B#16#85                     // Speicherbereichstyp: 85h für Instanz-DB
      T     LB     6
// Der hiermit erzeugte Pointer liegt nun im TEMP-Bereich ab Adresse 0
// Dort eine Variable #Begleitwerte des Typs ANY anlegen und bei SD zuweisen.
// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Abbilder der DBs Alarm_S_Bits und Alarm_SQ_Bits temporär zwischenspeichern
      L     #DB_Nr_Alarm_S_Bits
      T     #DB_Nr_Alarm_S_Bits_Int
      AUF   DB [#DB_Nr_Alarm_S_Bits_Int]
      L     DBD    0
      T     #Abbild_AlmS_Bits_DBD0      // Inhalt des DBD 0 lokal gespeichert
      L     DBD    4
      T     #Abbild_AlmS_Bits_DBD4      // Inhalt des DBD 4 lokal gespeichert
      L     DBD    8
      T     #Abbild_AlmS_Bits_DBD8      // Inhalt des DBD 8 lokal gespeichert
      L     DBD   12
      T     #Abbild_AlmS_Bits_DBD12     // Inhalt des DBD 12 lokal gespeichert
      L     #DB_Nr_Alarm_SQ_Bits
      T     #DB_Nr_Alarm_SQ_Bits_Int
      AUF   DB [#DB_Nr_Alarm_SQ_Bits_Int]
      L     DBD    0
      T     #Abbild_AlmSQ_Bits_DBD0     // Inhalt des DBD 0 lokal gespeichert
      L     DBD    4
      T     #Abbild_AlmSQ_Bits_DBD4     // Inhalt des DBD 4 lokal gespeichert
      L     DBD    8
      T     #Abbild_AlmSQ_Bits_DBD8     // Inhalt des DBD 8 lokal gespeichert
      L     DBD   12
      T     #Abbild_AlmSQ_Bits_DBD12    // Inhalt des DBD 12 lokal gespeichert
// /////////////////////////////////////////////////////////////////////////////////////////////////////////
 
// *********************************************************************************************************
//    eigentlicher Beginn Netzwerk 1 ...
// *********************************************************************************************************
      L     #T_MOT_OUT_C
      T     #begleitwert1
      L     L#0                         // falls ein Wert ausreicht die restlichen 2 mit "0" auffüllen
      T     #begleitwert2
      T     #begleitwert3
// Störung 1
      CALL  "ALARM_S"
       SIG    :=L16.0                   // Meldungsauslösendes Bit aus jeweiligem DB lokal gespeichert
       ID     :=W#16#EEEE               // Bleibt konstant gleich
       EV_ID  :=#Stoerung001            // Variable aus IN-Bereich welcher die Meldungsnummer zugeordnet ist
       SD     :=#Begleitwerte           // Pointer auf die Begleitwerte im STAT-Bereich (siehe oben)
       RET_VAL:=#retval                 // Rückgabewert für Fehlercodes
Die Netzwerke 2 - n beinhalten dann jeweils nur die nachfolgenden SFC 17/18 Aufrufe und die Zuweisung der Begleitwerte. Beispiel Netzwerk 2:
Code:
      L     #T_OEL_C
      T     #begleitwert1
      L     L#0
      T     #begleitwert2
      T     #begleitwert3
// Störung 2
      CALL  "ALARM_S"
       SIG    :=L16.1
       ID     :=W#16#EEEE
       EV_ID  :=#Stoerung002
       SD     :=#Begleitwerte
       RET_VAL:=#retval
Das geht dann einfach so weiter...
Testen kann ich das erst wieder heute nachmittag, aber so wie es jetzt gepostet ist läufts aktuell und funktioniert NICHT -> Begleitwert ist immer = 0

An SD soll ja der Anyzeiger mitteilen wo die Begleitwerte liegen -> in dem Fall im STAT-Bereich des Instanzdatenbausteins, diese werden vor Aufruf der nächsten Störung immer neu versorgt (Begleitwert1, 2 und 3)

Ich weiss einfach nicht was da nicht gehen soll...

Ersetze ich an SD den Any #Begleitwerte durch #begleitwert1 (direkt aus STAT) dann funktioniert es, habe dann allerdings nur einen Wert statt 3 (manchmal brauche ich 2, den dritten habe ich als reserve schon mal vorgesehen...)
Also muss es irgendwie an dem Zeiger hängen...
 
Hallo!

#Begleitwert ist dein Any Zeiger?
Liegt der im Temp bereich bei Adresse 0.0?

Wo wird die Variable #DI_Nummer beschrieben?

Gibt Ret_Val von deinen SFC aufrufen einen Wert zurück?

godi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo rs-plc-aa,

ich habe den Beitrag jetzt nur kurz überflogen. Deine Begleitwerte liegen in den Lokaldaten? Wie sieht die Deklaration aus? Ich denke, du musst garkeinen Pointer basteln. Deklariere deine Begleitwerte als STRUCT oder als ARRAY und schreibe diesen direkt an die SFC. Alles andere erledigt Step7 für dich.

Gruß, Onkel
 
Hallo!

#Begleitwert ist dein Any Zeiger?
Liegt der im Temp bereich bei Adresse 0.0?
ja, steht ganz oben wo der Any Zeiger gebaut wird darunter als Kommentar...
godi schrieb:
Wo wird die Variable #DI_Nummer beschrieben?
Ist ein IN Parameter (INT) und wird am OB als Zahl drangeschrieben -> kann sicherlich durch DINO ersetzt werden...
godi schrieb:
Gibt Ret_Val von deinen SFC aufrufen einen Wert zurück?

godi
nix fehlerhaftes zumindest

Onkel Dagobert schrieb:
Deine Begleitwerte liegen in den Lokaldaten? Wie sieht die Deklaration aus? Ich denke, du musst garkeinen Pointer basteln. Deklariere deine Begleitwerte als STRUCT oder als ARRAY und schreibe diesen direkt an die SFC. Alles andere erledigt Step7 für dich.
Die Begleitwerte liegen im STAT -> darauf soll der Zeiger zeigen...

Wenn das jetzt nicht geht werde ich sie aber in TEMP verschieben und einen normalen Pointer über die Länge aller 3 darauf setzen - das funktioniert. Wie das als Array geht weiss ich nicht, würde aber ziemlich sicher auch ohne gehen.

Mir geht´s jetzt hauptsächlich noch darum zu wissen warum das jetzt nicht geht weil ich es vielleicht für was anderes noch brauchen kann.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
vom prinzip kann ich keinen fehler entdecken.
mach mal nen scrennshot wenn der online bearbeitet wird (so ich ich das angehängt hatte.)
eins von der bildung des any und eins vom aufruf der sfc17

vor dem sfc aufruf füge vorher ein
L LD 0
L LW 4
L LD 6
nur um zu sehen ob da noch der zeiger stimmt.
 
Habe damit gemeint ob die Variable Begleitwert in der Deklaration im Temp bereich angelegt ist und ganz oben steht. Also mit Adresse 0.0 beginnt?
Ja -> Name: Begleitwerte ; Typ: Any ; Adresse: 0.0

Die 3 eigentlichen Werte sind im STAT die einzigen Variablen. Der Zeiger soll also auf den Instanzdatenbaustein verweisen, und zwar auf Adresse 1170.0 und das ganze 12 Byte lang...

Das mit dem Screenshot werde ich Nachreichen (geht jetzt im Moment nicht)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich mach heute wahrscheinlich keinen Abstecher mehr dort hin aber wahrscheinlich morgen.

Dann schaue ich das alles im Status noch mal ganz genau an und füge mal noch Screenshots dazu.

Jetzt weiß ich wenigstens daß nichts gravierendes sein kann.

Danke schon mal...
 
..Jetzt weiß ich wenigstens daß nichts gravierendes sein kann..
Da wäre ich mir nicht so sicher. Am meisten stört mich dass du in einem FB eine Nr. für einen Instanz-DB als Eingang anlegst und diesen dann in einem ANY weitergibst. Wahrscheinlich zeigt danach dein DI-Register nicht mehr auf den Instanz-DB des FB, sondern auf den, der als Eingangsparameter angegeben ist. Wenn du mit der DB-Nr. flexibel sein willst, musst du schon einen Global-DB verwenden. Widersprüchlich ist dies ohnehin, da ja die Daten, auf die zugegriffen werden sollen, in den temporären oder statischen Lokaldaten des FB stehen.

Mach dir's nicht so schwer. Folgende Abbildung zeigt zwei Variablendeklarationen, mit denen du symbolisch einen ANY-Pointer übergeben kannst. Step7 generiert den passenden Pointer für dich, egal ob er auf die temorären oder statischen Lokaldaten zeigt. Probiert habe ich es nicht, aber generell sollte es so gehen.

Vergib mir, falls ich falsch liege. Zum Testen habe ich momentan keine Zeit.

..Dann schaue ich das alles im Status noch mal ganz genau an und füge mal noch Screenshots dazu..
Achte dabei besonders auf die DB-Register! Unter Extras-Einstellung-AWL kannst du die Anzeige aktivieren.


Gruß, Onkel
 

Anhänge

  • temp.jpg
    temp.jpg
    42,2 KB · Aufrufe: 47
Zuletzt bearbeitet:
Das DB Register scheint ja zu passen (falls es sich um die Spalte DB2 und nicht DB1 handelt -> habe jetzt mal PLCSIM angeworfen...)

Die DB Nummer von aussen ist nicht sehr glücklich gewählt, zumal es sich um seine (FB) eingene DI Nummer handelt - also L DINO würde reichen - kommt aber zunächst aufs selbe raus...

@Onkel Dagobert: Dein Vorschlag - vor allem der mit dem Struct gefällt mir sehr gut da ich eigentlich immer für´s einfachst-mögliche bin.
Die Variante mit dem Array -> Wie beschreibe ich dort die Einzelwerte ?
\@Onkel Dagobert

Aber mir lässt das trotzdem keine Ruhe - es geht wahrscheinlich mittlerweile bloß noch ums Prinzip (-> den "Fehler" zu finden...).
 
Danke dir, das kann ich sicher auch mal brauchen...

Ich habe jetzt die Variante mit der Struct vollständig umgesetzt (gefiel mir hierfür einfach besser)

Der weitere Vorteil hierbei -> Wenn Begleitwerte ergänzt werden sollen (es ist ja noch Reserve an Meldungen) dann brauche ich ja einen Wert von aussen. D.h. es muß die IN-Schnittstelle erweitert werden, wodurch sich wiederum die Anfangsadresse des Stat-Bereichs verschieben würde.

Hier müßte der Zeiger wieder angepasst werden damit er auch wieder korrekt "zeigt".

Mit der Struct / Array Version fällt das flach da hier ja die tatsächliche Adresse uninteressant ist...

Wie hieß gleich der Slogan? -> warum einfach wenn´s auch kompliziert geht...

Der Test an der echten Steuerung steht zwar noch aus (also vielleicht doch nicht gleich die Klappe so weit aufreissen :ROFLMAO: ) aber das scheint syntaktisch alles zu passen und sollte daher auch funieren...

Zum Any-Zeiger: Ein wenig wurmt´s mich jetzt schon daß es nicht geklappt hat aber das muß ja nicht heissen daß es an anderer stelle nicht noch mal aufgeriffen wird - von daher trotzdem danke an alle für die Mithilfe, geschadet hat´s ja auf jeden Fall nicht.

P.S.: Wenn der Test morgen fehlschlägt melde ich mich ja sowieso wieder :) , aber wenn es klappt ist sicher auch niemand böse daß ich den Lösungsweg nun verworfen habe (es muß halt auch vorwärts gehen...)
 
Zurück
Oben