TIA Byteadressen der Hardware auslesen

MFreiberger

Level-3
Beiträge
3.269
Reaktionspunkte
913
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Zusammen,

kurze Frage:
Kann ich irgendwie im Programm auslesen, welche Bytes als Eingänge projektiert sind?

Also:
Es gibt eine ET200SP mit den 8-DI Eingangskarten. Deklariert sind sind die EBs 0,1 und 2.
Jetzt wird noch ein Byte 3 hinzugefügt. Im Anwenderprogramm möchte ich gerne in einem Array[0..n] of Byte diese Eingangsbyte übergeben. Dazu soll noch geschrieben werden, welche Adresse das Byte hat.

Also vielleicht eher ein Array[0..n] of Struct mit den Elementen:
Byteadresse INT
Eingangsbyte BYTE

Diese Informationen sollen einem Fremdsystem über OPCUA zur Verfügung gestellt werden, da das Einlesen eines Arrays deutlich performanter ist, als das Einlesen von einzelnen EIngängen.

Weiß Jemand wie ich das machen kann oder gibt es vielleicht eine bessere Lösung?

VG

MFreiberger

Noch vergessen: ich verwende eine 1515F und das Portal TIA 15.1
 
Zuletzt bearbeitet:
Mir ist nur bekannt das der "RD_ADDR" dir aus einer Hardwarekennung (da kannst du das DI Modul nehmen) die E/A Anfangsadresse und länge ausgibt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin jat,

danke, das kann ich schon einmal gut gebrauchen.
Mit DeviceState kann ich ja auch erkennen, welche Gerätenummer vorhanden, gestört, projektiert... ist.
Wenn ich jetzt noch anhand der Gerätenummer die HW_DEVICE ermitteln könnte wäre ich glücklich.

Leider komme ich da nicht voran. Hat Jemand eine Idee dazu?

VG

MFreiberger
 
Mit DeviceState bekommt man nicht die Gerätenummer sondern sieht welche Gerätenummer vorhanden, gestört usw. ist, es handelt sich ja um ein "Boolischen" Wert. (Je nach Mode)
 
Moin jat,

naja, indirekt bekommt man schon die Gerätenummer (Arrayindex). Über eine Schleife kann man dann alle Geräte die vorhanden sind abfragen und sich jeweils den Schleifenindex merken. Dann hat man die Gerätenummer.

VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das stimmt bedingt, falls man zwei PROFINET-IO Systeme in einem Projekt / CPU verwaltet stirbt die Lösung ganz schnell weil man dann doppelte Gerätenummern bekommt.
Ich würde über GEO2LOG gehen und solange suchen bis die Funktion quasi nichts mehr ausgibt, so hat man die Hardwarekennung auch gleich. Da man über den GEOADDR UDT die Module hochzählen kann. (Dann sollte auch die Gerätenummer funktionieren, bin mir da aber nicht sicher, den da wird die Stationsnummer verwendet)

Aber muss das so aufwendig sein? Man könnte doch einfach den RD_ADDR so oft aufrufen wie man Module abfragen will.
 
Moin jat,

erstmal Danke für Deine Unterstützung!

Das stimmt bedingt, falls man zwei PROFINET-IO Systeme in einem Projekt / CPU verwaltet stirbt die Lösung ganz schnell weil man dann doppelte Gerätenummern bekommt.

Aber man braucht ja sowieso die HW_IOSYSTEM für das jeweilige Profinet-IO-System. Dann kann man die doch getrennt behandeln? Ich habe aber auch nur ein Profinet-IO-System.


Ich würde über GEO2LOG gehen und solange suchen bis die Funktion quasi nichts mehr ausgibt, so hat man die Hardwarekennung auch gleich. Da man über den GEOADDR UDT die Module hochzählen kann. (Dann sollte auch die Gerätenummer funktionieren, bin mir da aber nicht sicher, den da wird die Stationsnummer verwendet)

Die Hilfe zu GEO2LOG habe ich nicht ganz verstanden. Was muss ich denn jetzt alle angeben, um die Hardwarekennung eines Moduls zu erhalten, damit ich direkt RD_ADDR einsetzen kann?


Aber muss das so aufwendig sein? Man könnte doch einfach den RD_ADDR so oft aufrufen wie man Module abfragen will.

Ich weiß ja nicht wie oft ich Module abfragen will. Genau das will ich ja herausfinden:
Wie viele Eingangsbytes gibt es in der IO-System und welche Adresse haben sie?

VG

MFreiberger
 
Zuletzt bearbeitet:
Die Hilfe zu GEO2LOG habe ich nicht ganz verstanden. Was muss ich denn jetzt alle angeben, um die Hardwarekennung eines Moduls zu erhalten, damit ich direkt RD_ADDR einsetzen kann?

So ähnlich könnte man das aufbauen, musst nur Stationsanzahl rausfinden sowie die Anzahl der Slots.

Code:
#Geoaddr.HWTYPE := 4;               // 4 = Auswertung vom Modul (IOSYSTEM, STATION und SLOT ausgewertet)
#Geoaddr.AREA := 1;                 // 1 = PROFINET
#Geoaddr.IOSYSTEM := 100;           // 100 = PROFINET-IO


FOR #Station := 1 TO #StationCnt DO
    #Geoaddr.STATION := INT_TO_UINT(#Station);
    
    FOR #Slot := 1 TO #SlotCnt DO
        #Geoaddr.SLOT := INT_TO_UINT(#Slot);
        
        #Geoaddr.SUBSLOT := 0;      // Egal wird bei HWTYPE 4 ncht ausgewertet
        
        #Retval := INT_TO_WORD(GEO2LOG(GEOADDR := #Geoaddr, LADDR => #Laddr));
        
        IF (#Laddr <> 0) THEN
            #Retval := INT_TO_WORD(RD_ADDR(LADDR := #Laddr, PIADDR => #InputStartAddr, PICount => #InputLength, PQADDR => #OutputStartAddr, PQCount => #OutputLength));
        END_IF;
    END_FOR;
END_FOR;
 
Zurück
Oben