Any Pointer verweis auf Bool ko!pieren

BoxHead

Well-known member
Beiträge
144
Punkte Reaktionen
25
Zuviel Werbung?
->Hier kostenlos registrieren
Vorne weg ich habe die Suchfunktion bemüht und die Hilfe auch, leider habe ich mit beidem keinen Erfolg gehabt.

Ich habe einen FC mit einem Any Pointer als Eingang. Nun würde ich gerne den Inhalt der variable wo der Any Pointer hinzeigt kopieren.
Mit byte, word, dword usw. klappt es auch aber bei Bool steigt der SFC 20 aus. Die Erklärung warum der SFC20 zickt steht in der Hilfe "Anzahl der Bits muss durch 8 teilbar sein".

Kann mir bitte jemand einen Tipp geben.

Danke!
 

PN/DP

User des Jahres 2011-2013; 2015-2017; 2020-2021
Beiträge
19.493
Punkte Reaktionen
5.876
indirekte Adressierung

Schau Dir mal die AWL-Hilfe zu speicherindirekter Adressierung und registerindirekter Adressierung an. (anstatt SFC20)

Harald
 
OP
BoxHead

BoxHead

Well-known member
Beiträge
144
Punkte Reaktionen
25
Zuviel Werbung?
->Hier kostenlos registrieren
Leider komm ich damit nicht so richtig weiter. Liegt vielleicht aber auch an der Uhrzeit.

Die Quelle kann ja eigentlich alles sein und bei den Beispielen in der AWL Hilfe habe ich den Eindruck man müsste dies vorher wissen ob es sich um einen Eingang oder ein Bit in einem Db geht usw.
 

PN/DP

User des Jahres 2011-2013; 2015-2017; 2020-2021
Beiträge
19.493
Punkte Reaktionen
5.876
Oooch, das ist gar nicht so schwer. Leider habe ich grad' kein Step7 zur Verfügung für die Details, doch es funktioniert etwa so:

Zum Lesen von der Adresse auf die der ANY zeigt, ist zunächst der ANY zu prüfen, ob er eine Adresse enthält (Syntax ID), dann der Datentyp und Länge zu prüfen, ob er auf ein einzelnes BOOL zeigt, dann die DB-Nummer vom ANY in eine Zwischenvariable zu kopieren, dann der 32-Bit Pointer (enthält eine Bereichskennung) in ein Adressregister oder L/M-Dword zu laden, dann der DB zu öffnen. Dann kann per bereichsübergreifender indirekter Adressierung (Operation ohne explizite Angabe eines Speicherbereichs) das adressierte Bit ins VKE geladen werden ( U [...] ).

Wenn der ANY auf was anderes als DB zeigt, dann ist die DB-Nummer 0, ein Öffnen eines DB mit i=0 bewirkt nichts / schadet nicht.

Das Lesen bzw. Auswerten des ANY macht man in AWL am besten mit registerindirekter Adressierung mit AR1.

Harald
 
Zuletzt bearbeitet:
OP
BoxHead

BoxHead

Well-known member
Beiträge
144
Punkte Reaktionen
25
Soweit bin ich bereits (dank Heiner Hilfe mit der "Hilfe"), E,A,M und Db gehen aber bei Z und T kracht es leider. Der Any kann diese Typen verwalten aber der "normale" 32Bit Pointer kotzt an der Stelle.
 

PN/DP

User des Jahres 2011-2013; 2015-2017; 2020-2021
Beiträge
19.493
Punkte Reaktionen
5.876
Zuviel Werbung?
->Hier kostenlos registrieren
Ach ja, T und Z erfordern eine Sonderbehandlung. An die kommt man glaube ich nur mit speicherindirekter Adressierung heran, weil der erforderliche Pointer im Wortformat sein muß.

Harald
 
OP
BoxHead

BoxHead

Well-known member
Beiträge
144
Punkte Reaktionen
25
Ich denke das vertage ich dann auf morgen. Vielen Dank für deine Hilfe. Wenn Dir zu dem Thema T und Z noch was einfällt, werde ich es sicher nicht ignorieren:ROFLMAO:

EDIT: Nun gehen auch T und Z mit hilfe von zwei Sprüngen und einer WORD Variable.
 
Zuletzt bearbeitet:

PN/DP

User des Jahres 2011-2013; 2015-2017; 2020-2021
Beiträge
19.493
Punkte Reaktionen
5.876
Bit indirekt kopieren

Hier mal mein Lösungsbeispiel des FC.
Es werden allerdings nicht alle Parameterfehler abgefangen:
- die angegebene Adresse existiert nicht / ist zu groß
- Aufrufe mit DBXx.y ohne Angabe einer DBnr und kein DB ist geöffnet wird nicht geprüft
- Aufrufe mit DIXx.y müssten noch nach DBXx.y umgewandelt werden

Code:
// IN      aIn_SrcBit    : Any
// IN_OUT  xInout_DstBit : Bool
// TEMP    iTmp_DB_No    : Int (oder Word)
// TEMP    iTmp_TZ_No    : Int (oder Word)

// IN-Parameter (ANY) prüfen
      L     P##aIn_SrcBit               //Adresse des IN-Parameters
      LAR1  

      L     D [AR1,P#6.0]               //ANY: bereichsübergreifende Adresse P#bx.y
      T     #iTmp_TZ_No                 //untere 16 Bit vielleicht T- oder Z-Nummer

//ANY+0 Byte: ANY-ID muß B#16#10 sein
//ANY+1 Byte: Typ muß BOOL (B#16#01), Counter (B#16#1C) oder Timer (B#16#1D) sein
//ANY+2 Word: Wiederholfaktor muß 1 sein

// zeigt der ANY auf ein einzelnes BOOL (E A M L DB)?
      L     D [AR1,P#0.0]               //ANY-Header: ANY-ID + Typ + Wiederholfaktor
      L     DW#16#10010001              //ANY+1: Typ B#16#01 = BOOL
      ==D   
      SPB   AR1

// zeigt der ANY auf einen Counter (Z)?
      POP                               //ANY-Header zurück in AKKU1   
      L     DW#16#101C0001              //ANY+1: Typ B#16#1C = Counter
      ==D   
      SPB   SIZ

// zeigt der ANY auf einen Timer (T)?
      POP                               //ANY-Header zurück in AKKU1   
      L     DW#16#101D0001              //ANY+1: Typ B#16#1D = Timer
      ==D   
      SPB   SIT

// Fehler: unzulässiger ANY-Parameter
      SPA   ERR

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

// Adresse E A M L DB (DI)
// !!! Adresse DIXx.y müsste nach DBXx.y gewandelt werden
// !!! Aufruf mit DBXx.y ohne DBnr und kein DB offen wird nicht geprüft

AR1:  L     W [AR1,P#4.0]               //eventuell DB-Nr
      T     #iTmp_DB_No                 //merken für speicherindirekt öffnen

      L     D [AR1,P#6.0]               //ANY: bereichsübergreifende Adresse P#bx.y
      LAR1                              //in AR1 für registerindirekt Lesen

// Lesen E A M L DB
      AUF   DB [#iTmp_DB_No]            //(ist Adresse nicht in DB bewirkt es nichts)
      U      [AR1,P#0.0]                //SrcBit --> VKE
      SPA   OUTB

// Lesen Counter Z
SIZ:  U     Z [#iTmp_TZ_No]             //SrcBit --> VKE
      SPA   OUTB

// Lesen Timer T
SIT:  U     T [#iTmp_TZ_No]             //SrcBit --> VKE

// gelesenes SrcBit an DstBit ausgeben
OUTB: =     #xInout_DstBit              //VKE --> DstBit

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

// OK/Fehleranzeige an ENO/BIE
OK:   CLR                               //kein Fehler --> ENO/BIE=1
ERR:  NOT                               //(bei Fehler Sprung hierher mit VKE=1)
      SAVE                              //VKE in ENO/BIE speichern

Harald
 
OP
BoxHead

BoxHead

Well-known member
Beiträge
144
Punkte Reaktionen
25
Zuviel Werbung?
->Hier kostenlos registrieren
Ich hatte eine ähnliche wenn auch etwas umfangreichere Lösung, werde mich nun aber mehr an Deinem Beispiel orientieren.

Danke!
 
Zuletzt bearbeitet:
Oben