TIA Informationen aus Anypointer holen

C7633

Level-1
Beiträge
224
Reaktionspunkte
13
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja leider unterstützt die 1200er kein AWL mehr.
Jetzt darf ich Bausteine auf SCL umschreiben.

Ich habe einen Eingangsparameter am Baustein, vom Typ Any
Den würde ich gerne zerlegen. In AWL war das so einfach:

Code:
// Get offset in the instant DB
      TAR2
      SLD   8
      SRD   8
      T     #Offset

      L     P##IA_Interface
      L     #Offset
      +D
      LAR1



      L DIB [ AR1 , P#7.0 ]
      L     B#16#7
      UW
      T     #S_ByteT

// get start adress of the device interface
      L DIW [ AR1 , P#8.0 ]
      T     #S_WordT
      SRW   3
      T     #S_WordT
      L     #S_ByteT
      SLW   13
      L     #S_WordT
      +I
      ITD
      T     #T_StartAdres


// get DB number of the interface interface
      L DIW [ AR1 , P#4.0 ]
      T     #DBNumber

Aber wie geht das in SCL?
Ich hab natürlich schon etwas geschaut

Da muss man so merkwürdige AT Parameter anlegen.
Aber wie geht das?

Hätte mir jemand einen Tip?

Vielen Dank
 
Danke Dir

Die Beiträge hatte ich mir schon angeschaut
Aber wie bekomme ich die pAny AT Dest Variable angelegt?
 
Hi, um den Any-Pointer mit einer AT-Struktur zu überlagern (bspw. Array[0..4] of Word) darf der Baustein nicht optimiert sein, oder die Remanenz der Variable muss auf "Im IDB setzen" stehen.

Anschließend kannst du die Elemente in SCL ganz normal mit etwas Bit-Schieberei auseinander nehmen:

Code:
    #temp_Datentyp := WORD_TO_INT(AT_Variable[0].%B0);
    #temp_DB_Nummer := WORD_TO_INT(AT_Variable[2]);
    #temp_Speicherbereich := WORD_TO_INT(AT_Variable[3].%B1);
    #temp_Byteadresse := WORD_TO_INT(SHR_WORD(IN := AT_Variable[4], N := 3));
    #temp_Bitadresse := WORD_TO_INT(SHR_WORD(IN := SHL_WORD(IN := #AT_Variable[4], N := 13), N := 13));
 
Moin,
erst in der DB_Any-Variable bei Remanenz "im IDB setzen" einstellen.
Dann in der darauf folgenden Variable als Typ "AT" auswählen. Diese "Folge-Variable" überlagert dann die darüber stehende. Geht aber alles nur bei FBs und dort nur im In, Out, In/Out und Static-Teil.
AT-Sicht.jpg
 
Anschließend kannst du die Elemente in SCL ganz normal mit etwas Bit-Schieberei auseinander nehmen:

Code:
    #temp_Datentyp := WORD_TO_INT(AT_Variable[0].%B0);
    #temp_DB_Nummer := WORD_TO_INT(AT_Variable[2]);
    #temp_Speicherbereich := WORD_TO_INT(AT_Variable[3].%B1);
    [COLOR="#FF0000"]#temp_Byteadresse := WORD_TO_INT(SHR_WORD(IN := AT_Variable[4], N := 3));[/COLOR]
    #temp_Bitadresse := WORD_TO_INT(SHR_WORD(IN := SHL_WORD(IN := #AT_Variable[4], N := 13), N := 13));
Na, ganz so easy geht es dann doch nicht - Byteadresse wird falsch ermittelt. Und Bitadresse ist viel zu umständlich gelöst.


@C7633
Der ANY der zeigt doch bestimmt auf irgendwas strukturiertes? Dann erkläre doch die Struktur zu einem Datentyp, dann kannst Du ganz ohne rumbasteln in- und außerhalb des Bausteins symbolisch mit dem Übergabeparameter arbeiten.

Oder soll da Schweinkram ;) aus der Programmier-Steinzeit in dieses Jahrtausend übernommen werden?

Harald
 
Na, ganz so easy geht es dann doch nicht - Byteadresse wird falsch ermittelt. Und Bitadresse ist viel zu umständlich gelöst.

So funktioniert es allerdings tatsächlich bei uns in der Anlage. Ich lerne jedoch gerne dazu, wärst du also so freundlich...? :)

Edit: Ok, ich weiß was du bei der Byteadresse meinst, es fehlen drei Bits...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
ABER: Wenn du es eh gerade umschreibst , dann mach es doch gleich vernünftig :wink: und löse dich von dem alten Gedankengut.


Dem stimme ich uneingeschränkt zu. Wobei ich deine Aussage umformulieren würde in:
Wenn du es jetzt eh endlich umschreibst, dann mach es doch endlich vernünftig und löse dich von den uralten Konzepten, die noch nie gut waren.
 
Zuletzt bearbeitet:
Na, ganz so easy geht es dann doch nicht - Byteadresse wird falsch ermittelt. Und Bitadresse ist viel zu umständlich gelöst.


@C7633
Der ANY der zeigt doch bestimmt auf irgendwas strukturiertes? Dann erkläre doch die Struktur zu einem Datentyp, dann kannst Du ganz ohne rumbasteln in- und außerhalb des Bausteins symbolisch mit dem Übergabeparameter arbeiten.

Oder soll da Schweinkram ;) aus der Programmier-Steinzeit in dieses Jahrtausend übernommen werden?

Harald

Hallo Harald

Genau das ist die Herausforderung.
Der Anypointer zeigt auf eine Schnittstelle zum Gerät, die in einem DB abgelegt ist.
Hier greift die Visualisierung drauf zu, die eingegebenen Parameter können mit dem Baustein über die azyklische Kommunikation ins Gerät geschrieben werden.
Da es aber ca. 500 verschiedene Schnittstellen gibt, muss ich hier total flexibel bleiben.
Wenn jemand eine bessere ID als den Anypointer hat, ich würde mich freuen.
 
Moin,
erst in der DB_Any-Variable bei Remanenz "im IDB setzen" einstellen.
Dann in der darauf folgenden Variable als Typ "AT" auswählen. Diese "Folge-Variable" überlagert dann die darüber stehende. Geht aber alles nur bei FBs und dort nur im In, Out, In/Out und Static-Teil.
Anhang anzeigen 47315

Hi Howard

Danke für die Antwort.
Noch eine Gegenfrage: Funktioniert das dann auch, wenn man 300er mit TIA macht, oder muss es dann eine 1200er / 1500er sein?
 
Na, ganz so easy geht es dann doch nicht - Byteadresse wird falsch ermittelt. Und Bitadresse ist viel zu umständlich gelöst.


@C7633
Der ANY der zeigt doch bestimmt auf irgendwas strukturiertes? Dann erkläre doch die Struktur zu einem Datentyp, dann kannst Du ganz ohne rumbasteln in- und außerhalb des Bausteins symbolisch mit dem Übergabeparameter arbeiten.

Oder soll da Schweinkram ;) aus der Programmier-Steinzeit in dieses Jahrtausend übernommen werden?

Harald

Das funktioniert aber nur, wenn man den Optimierten Zugriff am FB ausgeschaltet hat.
 
Zurück
Oben