Step 7 Programmierung erleichtern

A.Gashi

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

Ich brauche Unterstützung bei der Implementierung unserer Janitza Leistungsmessgeräte an unsere Visualisierung.

Aktuell habe ich eine 300er SPS und etwa 70 Janitza Leistungsmessgeräte vom Typ UMG96 RM-P (Profibus Anbindung)

Diese sind alle installiert. Bei den Geräten muss man ein Feldbusprofil einrichten, was man alles rauslesen möchte. Ich habe mir folgendes Profil erstellt :

U1 INT 2 Byte
U2 INT 2 Byte
U3 INT 2 Byte
I1 INT 2 Byte
I2 INT 2 Byte
I3 INT 2 Byte
Scheinleistung Float 4 Byte
Komme auf insgesamt 16 Byte, die ich benötige pro Gerät.

In der Hardware Konfiguration habe ich die entsprechende GSD Datei gewählt, 8 Word.
Das Messgerät schickt also die Daten die ich im Feldbusprofil konfiguriert habe in dieser Reihenfolge an meine CPU.
Jetzt möchte ich mir die ganze Programmierung etwas erleichtern. Beispielsweise ist das erste Gerät im Eingangsbereich 564..579 (8 Word)
Jetzt möchte ich eine schnelle und einfache Lösung um die verschiedenen Werte einzulesen und in einen DB zu transferieren.

Somit kann ich dann die Spannung von Messgerät "xy" vom DB auslesen und visualisieren.
Bis jetzt habe ich die verschiedenen Werte mit AWL eingelesen und transferiert zB.:
L PED 357
T DB100.DBD0

Ich möchte das aber nicht für alle 70 Geräte machen, gibt es daher eine einfache Variante dafür?

MfG
Arber
 
Moin A.Gashi,

Du kannst die Daten(bereiche) kopieren mit BLK_MOVE. Als Bereiche übergibst Du any-Pointer. Diese "baust" Du Dir zusammen.
Das ganze dann in einer Schleife (LOOP NEXT) einbauen und die Startadressen passend inkrementieren.

VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo MFreienberger
Danke für die schnelle Antwort, es geht schonmal in die richtige Richtung.

Kann ich beim SFC 20 beim SRCBLK einen Eingangsbereich einlesen?
Beispielsweise ist der Teilnehmer 7 im Bereich 564..579.
Was muss ich da eingeben um die 16 Byte startend von EB564 in einen DB zu transferieren?
 
Liegen die Eingänge 564..579 im Prozessabbild der Eingänge (PAE)? Dann kannst Du SFC20 BLKMOV verwenden:
Code:
      CALL  "BLKMOV"
       SRCBLK :=P#E564.0 BYTE 16
       RET_VAL:=#tempInt
       DSTBLK :="MyDB".MyUMGStruct_1
(Nicht so schön: in den Referenzdaten taucht dann nur der E564.0 auf.)
Das müsstest Du dann 70 mal aufrufen.

Wenn die Eingangsadressen außerhalb des Prozessabbildes liegen, dann kannst Du nicht SFC20 verwenden.
Wie ist die Konsistenz der 16 Byte vom Slave eingestellt? Wenn "Gesamt", dann den SFC14 DPRD_DAT verwenden.

Hast Du schon alle 70 DP-Slaves in HW Konfig projektiert? Kann Deine CPU mindestens 1120 Byte Eingangs-Adressen?

PS: Die Spannungs- und Strom-INT mußt Du doch sicherlich noch skalieren (in REAL wandeln und mit einem Faktor multiplizieren). Das müsstest Du dann auch noch 70 mal aufrufen und die REAL-Werte in einem weiteren DB Bereich ablegen. Effizienter wäre es da, wenn Du das Einlesen und Skalieren in einem eigenen Baustein (FC) zusammenfasst (und das obige BLKMOV ganz weglässt), dem Du die Eingangs-Anfangsadresse und das UMG-Struct übergibst. Im FC dann die EingangsBytes/INTs indirekt adressiert lesen, skalieren und die Ergebnis-Werte in die Struktur schreiben.

Harald
 
Zuletzt bearbeitet:
Liegen die Eingänge 564..579 im Prozessabbild der Eingänge (PAE)? Dann kannst Du SFC20 BLKMOV verwenden:
Code:
      CALL  "BLKMOV"
       SRCBLK :=P#E564.0 BYTE 16
       RET_VAL:=#tempInt
       DSTBLK :="MyDB".MyUMGStruct_1
(Nicht so schön: in den Referenzdaten taucht dann nur der E564.0 auf.)
Das müsstest Du dann 70 mal aufrufen.

Wenn die Eingangsadressen außerhalb des Prozessabbildes liegen, dann kannst Du nicht SFC20 verwenden.
Wie ist die Konsistenz der 16 Byte vom Slave eingestellt? Wenn "Gesamt", dann den SFC14 DPRD_DAT verwenden.

Hast Du schon alle 70 DP-Slaves in HW Konfig projektiert? Kann Deine CPU mindestens 1120 Byte Eingangs-Adressen?

PS: Die Spannungs- und Strom-INT mußt Du doch sicherlich noch skalieren (in REAL wandeln und mit einem Faktor multiplizieren). Das müsstest Du dann auch noch 70 mal aufrufen und die REAL-Werte in einem weiteren DB Bereich ablegen. Effizienter wäre es da, wenn Du das Einlesen und Skalieren in einem eigenen Baustein (FC) zusammenfasst (und das obige BLKMOV ganz weglässt), dem Du die Eingangs-Anfangsadresse und das UMG-Struct übergibst. Im FC dann die EingangsBytes/INTs indirekt adressiert lesen, skalieren und die Ergebnis-Werte in die Struktur schreiben.

Harald

Hallo Harald

Ja die Eingänge liegen im Prozessabbild.

Zum Thema Adressbereich, ich hatte tatsächlich das Problem dass ich zu wenig Adressbereich hatte, daher habe ich das was ich auslesen muss aufs Minimum reduziert. Vom Gerät kann ich diese Daten im REAL oder INT Format auslesen, ich habe das auf INT eingestellt, um Adressbereich einzusparen.

Da meine 315er CPU 2048 Bytes Adressbereich hat komme ich mit dem Minimum an Daten die ich auslese bei dieser Anzahl von Geräten bis zum Byte 1931. Also kaum noch Luft nach oben.


Warum meinst du dass ich die Daten noch in Real skalieren muss? Ich kann ja mit INT eine Zahl bis 65.535 anzeigen, das reicht ja für Spannung und Strom.

Ich versuche deinen Vorschlag mal nachzuvollziehen, eventuell finde ich noch ein paar Videos dazu :)

Danke für die Unterstützung
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn Deine Visu einen Spannungswert 2345 als 234.5 (V) anzeigen kann, und Stromwerte in mA OK sind oder 32109 als 32.109 (A) anzeigen kann, dann brauchst Du nicht nach REAL konvertieren.

Wenn die Peripherie-E-Adressen der CPU nicht reichen, dann könntest Du mit einem CP342-5 einen weiteren Profibus aufmachen.

Wenn die Werte von den UMG nicht zeitkritisch sind, dann kann man die Geräte per Modbus RTU und/oder Modbus-Gateways auslesen (und braucht dann keine Profibus-Schnittstelle).

Harald
 
Wenn Deine Visu einen Spannungswert 2345 als 234.5 (V) anzeigen kann, und Stromwerte in mA OK sind oder 32109 als 32.109 (A) anzeigen kann, dann brauchst Du nicht nach REAL konvertieren.
kommt auf die Visu drauf an. Kannst die Skalierung auch an der HMI-Variablen machen oder beim EA-Feld einstellen. Was besser ist, naja ich würds vermutlich in der SPS skalieren ;)
 
Hier mal ein Projekt mit einer von unseren CPU's für die UMG96. Vielleicht hilft das ja weiter.
 

Anhänge

  • Umg96.zip
    904,1 KB · Aufrufe: 15
Zurück
Oben