# TIA Portal AT Sicht in SCL



## Didaddy (1 Juli 2011)

Hallo Zusammen,

versuche mich gerade an der AT Sicht in SCL im Tia Portal. Will zum testen ein Byte auf ein Array legen mittels der AT Sicht. Syntax mäßig haut es auch hin. Bausteine lassen sich auch fehlerfrei übersetzen und laden in PLCSIM. 

CPU314:
Habe mir einen FB20 mit DB 20 Instanz Baustein angelegt und diesen im OB1 aufgerufen.

FB20:

```
Deklaration:
    Static                    
    myArray    ARRAY[0..7] OF Bool    0.0        True    
    myByte AT myARRAY    Byte    2.0    0    True    

Code:
#"myByte AT myARRAY":= 1;
```
Wenn ich mir das ganze dann online anschaue habe ich zwar die 1 in der Byte Variablen drin stehen, allerdings nicht in der Array Variablen.

Hat einer von Euch schon erfolgreich mit der AT Sicht unter TIA gearbeitet?
Unter 5.5 hab ich sonst keine Probleme mit der AT Sicht. Ist da im TIA oder PLCSIM noch der eine oder andere Bug drin, bzw. mach ich generell noch was falsch?

Für konstruktive Hinweise im vorraus 
Vielen Dank

Gruß Didaddy


----------



## dalbi (1 Juli 2011)

Hi,


```
Deklaration:
    Static                    
    myArray    ARRAY[0..7] OF Bool    0.0        True    
    myByte AT myARRAY    Byte    2.0    0    True    

Code:
[COLOR=Red]#"myByte AT myARRAY":= 1;[/COLOR]
```
Was willst Du damit beschreiben?

Richtig wäre:


```
#myByte := 1;
```
Gruss Daniel


----------



## dalbi (1 Juli 2011)

Hi,

habs mal probiert.


```
Deklaration:
    Static                    
    myArray    ARRAY[0..7] OF Bool    0.0        True    
    myByte AT "myARRAY"    Byte    2.0    0    True    

Code:
#myByte := 1;
```



Gruss Daniel


----------



## Didaddy (1 Juli 2011)

Hallo Dalbi,

danke für die schnelle Antwort.


```
Deklaration:     
Static                         
myArray    ARRAY[0..7] OF Bool    0.0        True         
myByte AT "myARRAY"    Byte    2.0    0    True      

Code: 
[COLOR=Red]#myByte[/COLOR] := 1;
```
Leider schluckt der Compiler das bei mir nicht. Der Operand 67 ist nicht definiert kommt als Fehlermeldung.

Das schlägt der Compiler vor und schluckt er auch. Nur wenn ich es dann lade tuts halt nicht wirklich.


```
#"myByte AT myARRAY":= 1;
```
Hast du es mit TIA V11 getestet?


----------



## Didaddy (1 Juli 2011)

Hallo zusammen,

hat sonst noch jemand Erfahrung unter TIA mit der AT Sicht. Wie gesagt unter V5.5 und niedriger hab ich diese Probleme nicht.

Hier der FC225 wo der Any Pointer aufgelöst wird unter Step7 V5.5==>


```
FUNCTION FC225 : BOOL
//  Beschreibung: FC_ANY_TO_STRUCT
//                Baustein zerlegt den Datentyp ANY in einzelne Variablen. Unter "Hilfe zu Step 7" ==> "Suchen" ==> "Format des Datentyps ANY"
//                ist der Aufbau des ANY zeigers beschrieben. Mit Hilfe dieser Angaben wurde dieser Baustein hier erstellt. Je nachdem welchen
//                Datentyp (Elementar/Zusammengesetzt oder Parametertyp) der Eingangszeiger hat, werden die Daten unterschiedlich interpretiert
//                und entsprechend ausgegeben. Die Datentyp Art gibt der Baustein ebenfalls aus damit die weitere Bearbeitung vereinfacht wird.
//                Als Rückgabewert der Funktion wird das OK Flag übergeben. Sollte der angegebene Datentyp unbekannt sein wird 0 übergeben, wird 
//                die Funktion fehlerfrei ausgefüht wir eine 1 übergeben.   
//  Ersteller:    Uze/LOFT
//  Erstelldatum: 25.03.2009    
//  Änderungen:   
TITLE=    'Konvertierung des ANY Pointers in einzelne Variablen';
NAME:     ANY_TO_STRUCT;
Family:   SCL;
Version:  '1.0';
AUTHOR:   VU;
// KNOW_HOW_PROTECT
{SCL_SetOKFlag:='TRUE'}

VAR_INPUT
  AnyZeiger             :ANY;           // Eingangszeiger der zerlegt werden soll
END_VAR

VAR_OUTPUT
    bySyntaxID          :BYTE;          // Bei Step7 immer 10h
    byDatentyp          :BYTE;          // b#16# 00=NIL;01=BOOL;02=BYTE;03=CHAR;04=WORD;05=INT;06=DWORD;07=DINT;08=REAL;09=DATE;
                                        //       0A=TOD;0B=TIME;0C=S5TIME;0E=DT;13=STRING;
                                        //       17=BLOCK_FB;18=BLOCK_FC;19=BLOCK_DB;1A=BLOCK_SDB;1C=COUNTER;1D=TIMER 
    wWiederholfaktor    :WORD;          // Anzahl der Datentypen
    wDBNummer           :WORD;          // Nummer des DB's falls vorhanden ansonsten 0
    bySpeicherbereich   :BYTE;          // b#16# 80=P;81=E;82=A;83=M;84=DB;85=DI;86=L;87=V
    nByteadr            :INT;           // Byteadresse des Speicherbereichs
    nBitadr             :INT;           // Bitadresse des Speicherbereichs
    wNummer             :WORD;          // Nummer der Zeit, des Zählers bzw. des Bausteins   
    bDatentyp_Art       :BOOL;          // 0=Daten von elementaren zusammengesetzten Datentypen; 1= Daten von Parametertypen      
END_VAR

VAR
  sAny                  :STRUCT   
    bySyntaxID          :BYTE;          // Bei Step7 immer 10h
    byDatentyp          :BYTE;          // b#16# 00=NIL;01=BOOL;02=BYTE;03=CHAR;04=WORD;05=INT;06=DWORD;07=DINT;08=REAL;09=DATE;
                                        //       0A=TOD;0B=TIME;0C=S5TIME;0E=DT;13=STRING;
                                        //       17=BLOCK_FB;18=BLOCK_FC;19=BLOCK_DB;1A=BLOCK_SDB;1C=COUNTER;1D=TIMER 
    wWiederholfaktor    :WORD;          // Anzahl der Datentypen
    wDBNummer           :WORD;          // Nummer des DB's falls vorhanden ansonsten 0
    bySpeicherbereich   :BYTE;          // Speicherbereich, in dem die Informationen gespeichert werden
    by7                 :BYTE;          // Byteadresse      00000bbb
    by8                 :BYTE;          // Byteadresse      bbbbbbbb
    by9                 :BYTE;          // Byte/Bitadresse  bbbbbxxx     
  END_STRUCT;      
  Anytmp_Zeiger AT sAny :ANY;           // Temporärer Eingangszeiger der zerlegt werden soll 
  wWord                 :WORD;          // Hilfsvariable
  sWord AT wWord        :STRUCT         // Hilfsstruktur
    by0                 :BYTE;
    by1                 :BYTE;
  END_STRUCT;
END_VAR

BEGIN

// Den Einganszeiger mal temporär übergeben
Anytmp_Zeiger:= AnyZeiger;

// Variablen übergeben
bySyntaxID        := sAny.bySyntaxID;
byDatentyp        := sAny.byDatentyp;
wWiederholfaktor  := sAny.wWiederholfaktor;
wDBNummer         := sAny.wDBNummer;

sWord.by0     := sAny.by8;  // Byte ins Word kopieren
sWord.by1     := sAny.by9;

(* Je nach Datentyp Art müssen die Daten unterschiedlich behandelt werden *)
IF byDatentyp = b#16#00 OR byDatentyp = b#16#01 OR byDatentyp = b#16#02 OR byDatentyp = b#16#03 OR byDatentyp = b#16#04 OR byDatentyp = b#16#05 OR
   byDatentyp = b#16#06 OR byDatentyp = b#16#07 OR byDatentyp = b#16#08 OR byDatentyp = b#16#09 OR byDatentyp = b#16#0A OR byDatentyp = b#16#0B OR
   byDatentyp = b#16#0C OR byDatentyp = b#16#0E OR byDatentyp = b#16#13 THEN                                                                                
  bySpeicherbereich := sAny.bySpeicherbereich;                                // Speicherbereich zuweisen
  nByteadr          := WORD_TO_INT(ROR (IN:= BYTE_TO_WORD(sAny.by7 AND BYTE#0000_0111) OR (wWord AND WORD#2#1111_1111_1111_1000),
                                        N := 3));                             // Zuerst in ein gemeinsames Word bringen und dann 3 stellen nach rechts rotieren
  nBitadr           := BYTE_TO_INT(sAny.by9 AND BYTE#2#0000_0111);            // Das gleiche nur maskiert
  wNummer           := 0;                                                     // hier unrelevant
  bDatentyp_Art     := FALSE;                                                 // Elementaren bzw. zusammengesetzten Datentyp setzen
ELSIF byDatentyp = b#16#17 OR byDatentyp = b#16#18 OR byDatentyp = b#16#19 OR byDatentyp = b#16#1A OR byDatentyp = b#16#1C OR byDatentyp = b#16#1D THEN
  bySpeicherbereich := 0;                                                     // hier unrelevant
  nByteadr          := 0;                                                     // hier unrelevant
  nBitadr           := 0;                                                     // hier unrelevant
  wNummer           := wWord;                                                 // und hier übergeben wirs über die AT Deklaration
  bDatentyp_Art     := TRUE;                                                  // Parametertyp setzen
ELSE
  OK:= FALSE;  
END_IF;

FC225:= OK;

END_FUNCTION
```
Wäre toll wenn der eine oder andere noch seine Erfahrungen mit TIA und der AT Sicht posten würde funzt bei mir einfach nicht richtig.


----------



## Ralle (1 Juli 2011)

VErsteh ich nicht, dalbi schreibt ja, bei ihm würde es funktionieren. Ich gehe mal davon aus, dass er auch TIA-Portal nutzt.


----------



## Didaddy (1 Juli 2011)

denke nicht das er Tia Portal nutzt, da er sonst gewusst hätte das Tia Portal sofern er Auto Vervollständigen aktiviert hat, diese Geschichte


```
#"myByte AT myARRAY":= 1;
```
vorschlägt, und mich nicht fragen würde was ich damit bezwecken wollte.

Funktionierts bei Dir Ralle? Ist ja schnell getestet.


----------



## Ralle (1 Juli 2011)

Also bei mir hat das funktioniert, mit dem TIA-Portal und SCL.












Aber ehrlich, das ist ja arschlahm und recht unübersichtlich, oder?
vor Allem die Definition der AT-Ansicht, da muss man erstmal drauf kommen.
Bei mit hat der gar nichts vorgeschlagen, da wahr wohl sogar ich schneller als die Codevervollständigung


----------



## Didaddy (1 Juli 2011)

Hallo Ralle,

danke das Du es getestet hast,

bei mir schluckt der compiler diese Geschichte einfach nicht.


```
#myByte := 1;
```
werde es nächste Woche nochmals genauer untersuchen woran es liegt. Wenn ich was finde geb ich Bescheid.


----------



## Didaddy (1 Juli 2011)

Eine Frage noch Du hast es auch mit PLCSIM getest oder?


----------



## dalbi (1 Juli 2011)

Hi,

Du hast den Fehler in der Variablendeklaration.

XYZ AT "ZYX" (siehe Bilder von Ralle)

sonst geht das nicht.

Gruss Daniel


----------



## Didaddy (1 Juli 2011)

So sieht das bei mir aus fehlerfrei, was allerdings online nicht funktioniert.






Wenn ich es so mach wie bei Ralle, dann sieht es so aus. So kann ich es nicht übersetzen und somit nicht laden.


----------



## dalbi (1 Juli 2011)

Hi,

in Deinem Bild steht " myArray" da ist ein Leerzeichen vorne drin. 

Gruss Daniel


----------



## Didaddy (1 Juli 2011)

an dem Leerzeichen lag es nicht gleiches Resultat. Denke aber auch das es daran liegt wie man diesen AT Befehl eingibt.

Ich habs so eingegeben myByte AT myArray. (in der Spalte Name)

Wie gibt man das richtig ein?

Habe das Projekt mal hochgeladen. Wie gesagt FB20/DB20 ist relevant.


----------



## Ralle (1 Juli 2011)

Eingabe AT:

Du wählst bei Typ "AT", dann glaube ich Doppelclick und AT erscheint mit in der Spalte des Namens, dann bei Typ Byte auswählen.

Was mir auffällt, du hast ein Array of Byte und kein Array of Bool.

Eine AT-Sicht mit einem Byte auf ein Array of Byte macht m.E. keinen Sinn! Was soll da rauskommen?

Kann es sein, dass du den Sinn der AT-Ansicht noch nicht ganz verinnerlicht hast oder ist das nur ein Schreibfehler?


----------



## Didaddy (1 Juli 2011)

thx Ralle, thx dalbi,

das mit dem of Byte anstatt Bool war ein Schreibfehler. Den hab ich erst zuletzt reingebracht, an dem lag es nicht. Allerdings lag es an meiner Eingabe. Ich hab direkt im Feld Name den AT Befehl eingegeben gefolgt von der überlagernden Variablen. Jetz wo ich es bei Datentyp eingeben hab, siehts aus wie bei Ralle und funktioniert auch.

Danke Euch beiden vielmals

Gruß Didaddy


----------



## Didaddy (2 Juli 2011)

Wobei ich sagen muß, das mir die textuelle Eingabe mehr liegt als die tabelarische. Gibt es unter TIA die Möglichkeit die Deklaration textuell einzugeben?

Beispiel V5.5:


```
FUNCTION_BLOCK FB20  // FB_Test
//  Beschreibung: FB_Test
//  Ersteller:    Uze/LOFT
//  Erstelldatum: 01.07.2010    
//  Änderungen:    
AUTHOR:   VU;
Version:  '1.0';

VAR
  myArray           :ARRAY[0..7] OF BOOL;
  myByte AT myArray :BYTE;  
END_VAR

myByte:= 1;

END_FUNCTION_BLOCK
```


----------



## Ralle (2 Juli 2011)

Didaddy schrieb:


> Wobei ich sagen muß, das mir die textuelle Eingabe mehr liegt als die tabelarische. Gibt es unter TIA die Möglichkeit die Deklaration textuell einzugeben?
> 
> Beispiel V5.5:
> 
> ...



Soviel ich mitbekommen habe, geht das leider nicht. Mir liegt diese tabellarische Geschichte auch nicht, sicher gewähnt man sich mit der Zeit daran. Über den Kontrast der Tabellen haben wir ja schon reichlich gemeckert.


----------



## Mephisto (13 Juli 2015)

Hallo Leute!

Ich check's nicht!
Wie geb ich den AT Befehl richtig in die Tabelle ein?
Also was muss in "Name" und was muss in "Datentyp" stehen?
Bekomme immer die Meldung Syntaxfehler

Danke!

mfg mephisto


----------



## 404 Name not found (13 Juli 2015)

Hi Mephisto,

Erstmal muss die Variable mit der du per AT auf eine andere Zugreifen willst direkt unter eben dieser Variable stehen.
Dann gibst du bei 'Name' einen Namen für deine Variable ein und wählst bei 'Datentyp'  "AT" aus wenn du bestätigst wird das "AT" automatisch mit in den Variablennamen gezogen und jetzt kannst du den Datentyp frei wählen.

Ich hoffe das hilft dir irgendwie  

Schön Tach noch
Phil


----------



## Mephisto (13 Juli 2015)

Jetzt Hab ich's!

Der FC muss absolut adressiert werden (kein Häkchen bei "Optimierter Bausteinzugriff"
Dan funzt es!

Danke!


----------



## Nico1977 (13 Juli 2015)

AT Konstrukt ist bei optimierten Bausteinen geplant, aber nicht realisiert. Kommt eventuell mit V14... Wie so vieles hoffe ich.


----------



## Bobbybau91 (13 Juli 2015)

Habe bei mir im Projekt auch gerade zufällig die AT-Sicht benutzt, du kannst ja mal vergleichen, bei mir funktioniert es so:







Ich verwende TIA V13 SP1


----------

