TIA Pointer auf E/A-Bereich ohne AWL

Ueribu95

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

ich habe ein IO-Device mit vielen Submodulen, und möchte möglichst einfach einen Verweis auf alle Adressen der Submodule an einen Baustein übergeben. Ich kenne zwar das GETIO/SETIO, das muss man aber leider mit jedem Submodule einzeln verknüpfen, soweit ich weiß. Das ist für mich eigentlich keine Option, da ich wie gesagt viele Submodule habe.
Eine andere Variante habe ich in einem alten 300er-Programm gesehen, dort wird nur die Startadresse der ganzen Submodule als Integer vorgegeben und dann mit Pointern gearbeitet:

Code:
L     #IN_StartAdress             // z.B. INT-Wert 400
      SLD   3
      LAR1                              // Akku1 mit Byteadresse in AR1 laden [P#400.0]

      L     PEB [AR1,P#0.0]             // PEB 400
      T     DIB   28                    // StatusModule Byte 1

      L     PEB [AR1,P#1.0]             // PEB 401
      T     DIB   29                    // StatusModule Byte 2

Nur ist AWL für mich keine Option. Gibt es eine Möglichkeit, diesen Code (oder eine andere Variante) in SCL/FUP/KOP zu nutzen?

Liebe Grüße
Ueribu
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So ganz habe ich die Frage nicht verstanden. Meinst du so in der Art ( SCL ):

WertByte0 := EW[Startadresse];
WertByte1 := EW[Startadresse+1];
WertByte2 := EW[Startadresse+2];
So ungefähr, ja.
WertWord0 := EW[Startadresse];
WertDInt1 := ED[Startadresse+2];
WertDInt2 := ED[Startadresse+6];

Ich habe einen langen Eingangs- und Ausgangsbereich, den ich in einem extra Baustein auf einzelne Variablen verknüpfen will, um damit ordentlich arbeiten zu können.
 
So ganz genau hab ich das auch noch nicht verstanden.
Du kannst aber entsprechende Symbole in der Symboltabelle anlegen, die du dann übergeben könntest.
Wenn du ein Array of Word über 10 Wörter als UDT anlegst, dann kannst du in der Symboltabelle ein Symbol mit diesem UDT anlegen, das als Startadresse z.Bsp. %I16 bekommt. Dann hast Wort 16-25 in diesem Symbol.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
            #_returnValue := LOG2GEO(LADDR := #HW_ID, GEOADDR := #_geoAddr);
            
            IF #_returnValue <> 0 THEN
                RETURN;
            END_IF;
            
            
            FOR #_i := 1 TO 14 DO
                #_geoAddr.SLOT := INT_TO_UINT(IN := #_i);
                #_returnValue := GEO2LOG(GEOADDR := #_geoAddr,
                                         LADDR => #HwSubmodules[#_i]);
                
                IF #_returnValue <> 0 THEN
                    RETURN;
                END_IF;
                
            END_FOR;

Mit LOG2GEO kann man aus einer HW_ID oder HW_SUBMODULE die GEOADDRESS ermitteln und dann in der GEOADDRESS den SLOT ändern und mit GEO2LOG wieder die HW_SUBMODULE addresse ermitteln.
 
Code:
            #_returnValue := LOG2GEO(LADDR := #HW_ID, GEOADDR := #_geoAddr);
          
            IF #_returnValue <> 0 THEN
                RETURN;
            END_IF;
          
          
            FOR #_i := 1 TO 14 DO
                #_geoAddr.SLOT := INT_TO_UINT(IN := #_i);
                #_returnValue := GEO2LOG(GEOADDR := #_geoAddr,
                                         LADDR => #HwSubmodules[#_i]);
              
                IF #_returnValue <> 0 THEN
                    RETURN;
                END_IF;
              
            END_FOR;

Mit LOG2GEO kann man aus einer HW_ID oder HW_SUBMODULE die GEOADDRESS ermitteln und dann in der GEOADDRESS den SLOT ändern und mit GEO2LOG wieder die HW_SUBMODULE addresse ermitteln.
Ich bestätige, diesen Ansatz verwende ich auch immer. Man muss sich einfach mal mit dem Konzept der logischen und geografischen Adresse auseinandergesetzt haben, dann kommt man einfach ans Ziel.
Der Ansatz ist, die logische Adresse des ersten Moduls zu übergeben (als Systemkonstante), diese in eine geografische Adresse (IO-System, Gerät, Slot, Subslot) umzuwandeln, den Slot/Subslot zu manipulieren, diese manipulierte geografische Adresse wieder zurück umzuwandeln, und anschließend mit GETIO/SETIO auf das Modul zuzugreifen.

Der hier gezeigte Code geht hart von Slot 1-14 vor und bricht ab, sobald ein Slot unbelegt ist.

Um man muss dazu keine einzige EA-Variable anlegen, allerdings ist es sinnvoll die EA-Daten dann auf lesbare Strukturen umzukopieren.
 
Wichtig wäre auch mal die Angabe, welche Steuerung du benutzt, ob TIA oder S7Classic, welche Programmiersprachen verwendet werden dürfen.

Ich hatte bisher immer ganz gute Erfahrungen mit PEEK und POKE gemacht, wenn ich auf größere E/A-Bereiche zugegriffen habe
 
Erstmal vielen Dank für eure vielen Antworten.

Ich nutze das TIA Portal V17 und eine S7-1511. Die Variante mit einem UDT für die ganzen Eingangsdaten und einen UDT für die Ausgangsdaten, die dann an einen (multiinstanzfähigen) Baustein übergeben werden, kenne ich, ich habe aber gehofft, dass es eine einfachere Lösung gibt. Beim Erstellen des Themas habe ich diese Variante nur kurz bedacht, und habe dies leider nicht mit dazu geschrieben.

Mein Ziel ist es, einen multiinstanzfähigen Baustein für ein Gerät, das man öfter und in mehreren späteren Projekten nutzt, zu erstellen. Dieser soll möglichst einfach über die Baustein-Inputs/-Outputs konfiguriert werden können (gerne ohne, dass man dafür Eingangs- und Ausgangs-UDTs anlegen muss). Daher fand ich die Lösung mit dem GETIO sehr angenehm. Dies hat z. B. bei Frequenzumrichtern mit einem einzigen Submodul für ein PPO4 gut gereicht, aber für ein Gerät mit vielen Submodulen nicht ganz so einfach.
Die Variante mit dem LOG2GEO werde ich ausprobieren, die klingt sehr interessant. Ich schätze, dass ich entweder diese oder die Variante mit den UDTs nutzen werde.
Das mit dem PEEK und POKE klingt aber auch gut.

Vielen Dank also für eure Unterstützung und den interessanten Einblick in die verschiedenen Varianten, wie man diese Aufgabe bewältigen kann. Ich denke, meine Frage hat sich hierzu geklärt, es sei denn, jemand hat noch eine andere Idee :)

Viele Grüße

Ueribu
 
Anhand der Anfangsadresse eines Submoduls auf die Adressen der anderen Submodule zu schließen ist ziemlich blauäugig (Pointer, PEEK, POKE).
Ja das stimmt das funktioniert nicht. Aber mit den LOG2GEO / GEO2LOG Funktionen kann man die Adressen der anderen Submodule ermitteln.
Ich wollte damit nur die Möglichkeit zeigen.

Trotzdem würde ich mich da TP-Inc anschließen dass es eine bessere Möglichkeit als einen UDT im E/A Bereich nicht gibt. Diese Variante benutze ich auch ausschließlich.
 
Zurück
Oben