TIA Variable Adressierung (Eingangsadresse im Anwenderprogramm errechnen und auswerten)

TIA_TESTER

Level-1
Beiträge
103
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich stoß immer wieder auf das Problem das ich Bausteine für Busteilnehmer schreibe und alle Prozessdaten einzeln in der Variablentabelle anlege, ist bei mehreren Prozessdatenwörtern Steuer/Status/Sollwert/etc. Word etwas müßig.

Es gibt von SEW einen Baustein für die Ansteuerung des MovietrackB über Profibus. An diesen Baustein wird nur die erste IO Adresse geschrieben und er macht alles weitere Intern. Soetwas würde ich gern für andere Anwendungen realisieren.

Beispielsweise die Auswertung einer Zählerkarten.

ID300 = Zählwert
IW303 = Status
ID305 = Vergleichswert.

Jetzt schreib ich (da oft verwendet wird) einen Baustein der alle werte Verarbeitet und muss alle 3 Adressen am Input definieren damit er weis woher die Daten kommen.

Kann mir jemand sagen wie ich es am besten mache das ich nur einmal I300 als Startadresse angebe und später alle Werte im Baustein von der E/A Ebene abrufe.

Man kann ja 300 + 3 rechnen und dann den Programmteil der das Statuswort bearbeitet die Adresse IW303 vorgeben. <- Das ist das eigentliche Problem, denn im nächsten Baustein ist die Adresse für diesen Programmteil eben 400+3 ...:? Ich hoffe ihr wisst was ich meine.


Danke schonmal TIATESTER
 
Habe selbst gesucht, man braucht meist nur das richtige Suchwort:)

Ich brauche Indirekte Adressierung oder???

Für das oben genannte beispiel wäre das hier denkbar.

Code:
[B]VAR
Input: [/B]
I/O_Adresse    Word    ...    16#0    True    False    

[B]Static:[/B]
Adresse_Steuerwort    Word    ...    16#0    True    False    
Zählwert Zähler 1    DWord    ...    16#0    True    False    
Statuswort Zähler 1    Word    ...    16#0    True    False    
Vergleichswert    DWord    ...    16#0    True    False    
[B]VAR_END[/B]

NW1: 

L     #"I/O_Adresse"
T     #Adresse_Steuerwort
LAR1  P##Adresse_Steuerwort
L ID [ AR1 , P#0.0 ]
T     #"Zählwert Zähler 1"
L IW [ AR1 , P#3.0 ]
T     #"Statuswort Zähler 1"
L ID [ AR1 , P#5.0 ]
T     #Vergleichswert
Somit hätte ich die Werte die ich von der Zählerkarte haben will in meinen Statischen Variablen im FB, oder ist das nicht so klug/funktioniert nicht so wie gedacht?

Danke Gruß T

Also das funktioniert nicht:ROFLMAO: weis jemand Rat? ich glaub ich bin mit sämtlichen Datenformaten falsch?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe die Sache mal vereinfacht um es auszuprobieren.

Folgendes funktioniert:

Code:
L     #"I/O_Adresse"       //Lädt I/O Adresse
T     #Adresse             //Transferiert in Statische Variable
LAR1  P#256.0              //Lädt I/O Adresse in Adressregister 1
L ID [ AR1 , P#0.0 ]       //Lädt Eingangsdoppelword mit I/O Adresse aus AR1
T     #"Zählwert Zähler 0" //Transferiert Zählwert 0 in Static-Variable

Folgendes nicht mehr obwohl in #Adresse auch 256.0 drin steht wird ins Adressregister DI8.0 geladen??:

Code:
L     #"I/O_Adresse"       //Lädt I/O Adresse
T     #Adresse             //Transferiert in Statische Variable
LAR1  P##Adresse           //Lädt I/O Adresse in Adressregister 1
L ID [ AR1 , P#0.0 ]       //Lädt Eingangsdoppelword mit I/O Adresse aus AR1
T     #"Zählwert Zähler 0" //Transferiert Zählwert 0 in Static-Variable


Zum Sew Baustein, diese machen das ganze mittels 2 SFC´s für DP Slaves, somit ganz andere vorhergehensweise. Funktioniert was ich vorhabe? Oder soll ichs klassisch machen?
 
Zuletzt bearbeitet:
"LAR1 P##Adresse" ist ganz falsch - das lädt nicht den Inhalt der Variablen #Adresse in AR1 sondern deren Adresse. (es müßte heißen "LAR1 #Adresse")
Das nachfolgende "L ID [ AR1 , P#0.0 ]" lädt dadurch den Wert aus der Variablen #Adresse und nicht aus der gewollten I/O-Adresse.


Das Stichwort "Indirekte Adressierung" ist richtig. Schaue Dir dazu mal die AWL-Hilfe an.
Da wirst Du finden, daß bei der indirekten Adressierung als Pointer eine Bitadresse angegeben werden muß, z.B. P#256.0
Um von der Byteadresse 256 zur Bitadresse P#256.0 zu kommen, muß die Byteadresse mit 8 multipliziert werden, was man üblicherweise mit "SLD 3" macht:
Code:
L     #"I/O_Adresse"       //Lädt I/O Adresse aus dem IN-Parameter
T     #Adresse             //Transferiert in Statische Variable (--- ist überflüssig)
SLD   3                    //Byteadresse --> P#Byte.0
LAR1
L ID [ AR1 , P#0.0 ]       //Lädt Eingangsdoppelword aus I/O Adresse von AR1
T     #"Zählwert Zähler 0" //Transferiert Zählwert 0 in Static-Variable

Beim Beobachten des AWL-Programms kannst Du Dir die Spalten mit dem Inhalt des AR1-Registers anzeigen lassen (*), da wirst Du sehen, daß bei Deinen nicht funktionierenden Programmvarianten nicht P#256.0 im AR1 stand.
(*) zumindest in Step7 classic: Rechtsklick auf eine Spalte (VKE/STA/AKKU) > Einblenden...


Achtung:
"L ID [..." funktioniert nur, wenn die angegebene E-Adresse im Prozessabbild PAE liegt. Liegt die Adresse außerhalb, dann muß auf die Peripherieadresse PID... zugegriffen werden (das wird in TIA vermutlich anders geschrieben --> befrage die Hilfe).
Bei Zugriffen auf Peripherieadressen muß außerdem die projektierte Konsistenzgröße beachtet werden und ggf. mit SFC14/SFC15 gearbeitet werden.

Die indirekten Zugriffe auf die E-Adressen erscheinen nicht in den Referenzdaten, sind also nur sehr schwer in einem (unbekannten) Programm zu finden!

PS: Auch wenn TIA das neuerdings idiotischerweise zuläßt, sollte man in Variablennamen keine Leerzeichen und Sonderzeichen (wie Operatoren) verwenden.

Harald
 
Zuletzt bearbeitet:
Hallo und danke für die Erklärung, die AWL Anweisungen habe ich mir angeschaut. komme aber absolut nicht klar. Es funktioniert schon nicht wenn ich den Pointer 256.0 vorgeben und nicht variabel gestalte. Siehe Anhang:Unbenannt.JPG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der IN-Parameter #"I/O_Adresse" muß INT oder WORD sein. (die Static-Variable #Adresse ebenfalls)
Beim Bausteinaufruf schreibst Du dann die EA-Adresse als Ganzzahl (z.B. 256) an den Baustein-Eingang "I/O_Adresse".

Harald
 
Es funktioniert auf allen erdenklichen weisen nicht,... ich hab jetzt die 256 ins AR1 bekommen, folgendermaßen:

Unbenannt.JPG
Allerdings lädt er nicht ID256,... So langsam glaub ich das ich etwas komplett falsch habe irgendwie?
 
Mein Code aus dem Beitrag #4 funktioniert auch nicht???

Nachtrag:
Ich habe mal das SLD im Code korrigiert: hatte "SLD 3" zwar richtig erklärt, jedoch wegen einem Schwächeanfall ;) im Code "SLD 8" geschrieben :oops:

Harald
 
Zuletzt bearbeitet:
Mein Code aus dem Beitrag #4 funktioniert auch nicht???

Nachtrag:
Ich habe mal das SLD im Code korrigiert: hatte "SLD 3" zwar richtig erklärt, jedoch wegen einem Schwächeanfall ;) im Code "SLD 8" geschrieben :oops:

Harald

Hey, ja das war auch eine undankbare Zeit zu der du das geschrieben hast, habe es selbst schon mit SLD 3 probiert, dann geht es vielen Dank, ich habe noch ein anderes Problem aber ist mir gerade entfallen, VIELEN DANK für EURE HILFE!! ECHT Klasse, Gruß T
 
Guten abend, ich verstehe zwar was du vor hast, nur erschließt sich mir der Vorteil nicht ganz, weswegen man das nicht per sfc einlesen sollte? Da hab ich doch schon fertig was ich brauche und muss mich um solche Dinge nicht mehr kümmern?

Gruß, von einem interessieren mitleser :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey, wie???? Wenns einfacher ist gerne... Die Daten kommen von ner Eingangskarte die am rack steckt... (Vipa)

Freut mich trotzdem das ich wieder was gelernt habe:) auch wenns andersrum einfacher geht (was mir im echten leben auch lieber ist). Deswegen bitte ich dich mir n suchwort zu geben. Ich schau es mir an.
 
Wenn die E-Adresse der Baugruppe im Prozessabbild liegt dann könntest Du SFC20 BLKMOV zum Kopieren benutzen.

Harald
 
Liegen Sie,

ich schau mir das in einer ruhigen Minute mal an:) Vielen Dank dafür und allgemeint für die schnelle und nett Hilfe die man hier bekommt!

Gruß T
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also mit dem Pointer funktioniert soweit alles. Die andere geschichte hab ich mir noch nicht angesehen.

Hab aber eine andere Frage, weis jemand von euch ob es in der Standard-Bilbiliothek einen Baustein gibt der mir aus 16Bit ein Word Zaubern kann? Möchte quasi 16 Eingänge haben die anschließend zu einem Integerwert zusammengefasst werden. Gibts aber sicher nix fertiges oder?

Vielen Dank
 
16 BOOL to WORD

Hmm, da gibt es bestimmt auch irgendwo fertige Bausteine für Anfänger. Doch weil das so simpel ist, ist so ein Baustein schneller geschrieben als man im Internet suchen und Downloaden kann. Etwa sowas:
Code:
VAR_INPUT
  Bit0  : BOOL ;
  Bit1  : BOOL ;
...
  Bit14 : BOOL ;
  Bit15 : BOOL ;
END_VAR

VAR_OUTPUT
  OutWord : WORD ;
END_VAR

VAR_TEMP
  tempWord : STRUCT
   Bit8  : BOOL ;
   Bit9  : BOOL ;
   Bit10 : BOOL ;
   Bit11 : BOOL ;
   Bit12 : BOOL ;
   Bit13 : BOOL ;
   Bit14 : BOOL ;
   Bit15 : BOOL ;
   Bit0  : BOOL ;
   Bit1  : BOOL ;
   Bit2  : BOOL ;
   Bit3  : BOOL ;
   Bit4  : BOOL ;
   Bit5  : BOOL ;
   Bit6  : BOOL ;
   Bit7  : BOOL ;
  END_STRUCT ;
END_VAR

BEGIN
NETWORK
      U     #Bit0
      =     #tempWord.Bit0
      U     #Bit1
      =     #tempWord.Bit1
...
      U     #Bit15
      =     #tempWord.Bit15

      LAR1  P##tempWord
      L     W [AR1,P#0.0]
      T     #OutWord

Harald
 
Hier hatte ich auch mal eine FB-Version, die das Kopieren der 16 Bits in ein Word im Baustein spart, weil diese bereits beim Bausteinaufruf passend in den IDB kopiert wurden.

Harald
 
Zurück
Oben