seit einiger Zeit bin ich auf der Suche, wie ich am besten eine Vielzahl an Feldbusvariablen beschreiben kann. Wobei eine "Vielzahl" relativ ist. Ich spreche von ca. 100-200 Variablen, die ich von außen via ModbusTCP abrufen möchte. Das Problem bei der Sache ist nur, dass ich entweder den Zugriff auf jede Adresse einzeln direkt Programmieren muss, oder indikret über die zuvor hinzugefüghte Feldbus-Variable (in der Steuerungskonfiguration, Unterelement anhängen, Variablen, grünes +, usw.). In beiden Fällen muss ich aber für jede Variable separat was programmieren.
Die große Frage ist nun: Wie bekomme ich ein Array aus 100 bis 200 (oder mehr) Werte auf meine Feldbusvariablen verteilt, ohne für jeden einzelnen Wert eine Anweisung zu schreiben?
Wenn ich die Zuordnung eines jeden Werts einzeln programmiere, würde es nämlich folgender Maßen aussehen:
  FeldVariable0:=myARRAY[0];  FeldVariable1:=myARRAY[1];  FeldVariable2:=myARRAY[2];  ...  FeldVariable255:=myARRAY[255];
oder, wenn ich direkt auf die Adresse zugreife (beispielsweise bei UNSIGNED DOUBLE INTEGER (DUINT)), so:
  %QD128:= myARRAY[0];  %QD129:= myARRAY[1];  %QD130:= myARRAY[2];  ...  %QD383:= myARRAY[255];
Allerdings würden alle Variablen so ständig beschrieben werden (das ist so, als würde man mit einer interorbitalen Laserkanone Ameisen tätowieren - andere sagen, mit Kanonen auf Spatzen geschossen).
Natürlich könnte ich das mit mehreren IF-Anweisungen auch lösen:
  IF(%QD128!=myARRAY[0] )THEN
    %QD128 :=myARRAY[0];
  END_IF
Aber auch da müsste ich für jedes Array-Element eine schreiben. Den kleinsten Aufwand hätte man, wenn man direkt auf die Feldvariable zugreifen könnte, als wäre sie ein "FeldArray".
  FeldArray[index]:=myARRAY[index];
bzw. innerhalb einer IF-Anweisung könnte man das alles komfortabel in eine FOR-Schleife packen:
  FORindex :=0TO200DO
    IF(FeldArray[index] !=myARRAY[index] )THEN
      FeldArray[index] :=myARRAY[index];
    END_IF
  END_FOR
... und man muss nicht für 200 Elemente was schreiben.
Gibt es was, was ich bisher noch nicht gefunden habe? Hoffe ich habe mein Anliegen verständlich vorgestellt.
Hallo,
die Feldbusvariablen zu definieren wird dir vmtl. nicht erspart bleiben.
Aber wenn deine Feldbusvariablen bei %QD128 anfangen kannst du doch dein Array direkt an die Adresse legen.
myARRAY AT %QD128 : ARRAY[0..199] OF UDINT;
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo nochmal,
wenn du im deklarationsteil einen pointer definierst
myARRAY : POINTER TO ARRAY[0..199] OF UDINT;
dann kannst du zur laufzeit dein array auf unterschiedliche segmente legen (z.b. lesen bzw. schreiben)
myARRAY := ADR(FELDBUSVARIABLE);
oder
myARRAY := ADR(%QD128);
myARRAY := ADR(%ID128);
der zugriff erfolgt dann über den inhaltsoperator
myARRAY^[99] := 1234;
gruß heho
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
danke nochmal für Deinen Nachtrag. Genau so habe ich mir das gedacht. Sieht sehr gut aus mit dem was ich mir vorgestellt habe. Wusste nur nicht, dass ich die Adressen einfach auf mein Array legen kann. Aber so von deiner Beschreibung her ist es genau das was ich gesucht habe.
Grüße
Stoni
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
hat soweit funktioniert, außer, dass man beim 750-841 nicht so viele Feldbus-Variablen beschreiben kann. Ich wollte (die maximal 255 DUINT) auf je 2 Hälften zu je (128x 32bit) in die Input- und Output-Area verteilen.
Eine Hälfte passt gerade so in den Bereich der PFC-OUT- und die andere Hälfte in den Bereich der PFC-IN-Variables:
* IEC61131 %QW256 ... %QW511 / Modbus# 256 ... 511 (PFC-OUT-Variables)
* IEC61131 %IW256 ... %IW511 / Modbus# 768 ... 1023 (PFC-IN-Variables)
Nur leider lassen sich die PLC-IN-Variables vom Prozessor nicht beschreiben.
Gibt es da noch "irgendwo" weitere Bereiche als PFC-OUT-Variables, oder jene, die als solche konfigurieren kann?
Grüße
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
feldbus-eingangsvariablen sind wie der name schon sagt "EINGÄNGE" in die plc
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2015-12-10
Originally created by: Eckhard
Hi Stonix
Zusätzlich zu den "virtuellen" Eingängen %IW256 ... 511 und "virtuellen" Ausgängen %QW256 ... 511
gibt es noch die Memorywörter (%MW0 ... %MW4096), sie können über Modbus von außen über die Adresse 12288 (oder glatt in Hex 16#3000) gelesen oder geschrieben werden. Dabei entspricht MW0 - 12288, MW1 - 12289 usw.
Du kannst Dein Array auch auf diese Adresse legen. (myARRAY AT %MD0 : ARRAY[0..199] OF UDINT;)
(Wobei bei der Größe des Datentypens aus MW4096 dann MD2048 wird. Will sagen bei der Adressierung hat man die Wahl nach dem Muster: MB100 = MW50 = MD25)
Bei dem Speicherbereich hast Du keine Platzprobleme mehr.
Gruß Ecki
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo,
seit einiger Zeit bin ich auf der Suche, wie ich am besten eine Vielzahl an Feldbusvariablen beschreiben kann. Wobei eine "Vielzahl" relativ ist. Ich spreche von ca. 100-200 Variablen, die ich von außen via ModbusTCP abrufen möchte. Das Problem bei der Sache ist nur, dass ich entweder den Zugriff auf jede Adresse einzeln direkt Programmieren muss, oder indikret über die zuvor hinzugefüghte Feldbus-Variable (in der Steuerungskonfiguration, Unterelement anhängen, Variablen, grünes +, usw.). In beiden Fällen muss ich aber für jede Variable separat was programmieren.
Die große Frage ist nun: Wie bekomme ich ein Array aus 100 bis 200 (oder mehr) Werte auf meine Feldbusvariablen verteilt, ohne für jeden einzelnen Wert eine Anweisung zu schreiben?
Wenn ich die Zuordnung eines jeden Werts einzeln programmiere, würde es nämlich folgender Maßen aussehen:
oder, wenn ich direkt auf die Adresse zugreife (beispielsweise bei UNSIGNED DOUBLE INTEGER (DUINT)), so:
Allerdings würden alle Variablen so ständig beschrieben werden (das ist so, als würde man mit einer interorbitalen Laserkanone Ameisen tätowieren - andere sagen, mit Kanonen auf Spatzen geschossen).
Natürlich könnte ich das mit mehreren IF-Anweisungen auch lösen:
Aber auch da müsste ich für jedes Array-Element eine schreiben. Den kleinsten Aufwand hätte man, wenn man direkt auf die Feldvariable zugreifen könnte, als wäre sie ein "FeldArray".
bzw. innerhalb einer IF-Anweisung könnte man das alles komfortabel in eine FOR-Schleife packen:
... und man muss nicht für 200 Elemente was schreiben.
Gibt es was, was ich bisher noch nicht gefunden habe? Hoffe ich habe mein Anliegen verständlich vorgestellt.
Grüße
Stoni
Related
Talk.ru: 1
Talk.ru: 2
Hallo,
die Feldbusvariablen zu definieren wird dir vmtl. nicht erspart bleiben.
Aber wenn deine Feldbusvariablen bei %QD128 anfangen kannst du doch dein Array direkt an die Adresse legen.
myARRAY AT %QD128 : ARRAY[0..199] OF UDINT;
Hallo HeHo,
das könnte funktionieren. Werde ich am Montag gleich testen, danke vielmals!
Grüße
Stoni
Hallo nochmal,
wenn du im deklarationsteil einen pointer definierst
myARRAY : POINTER TO ARRAY[0..199] OF UDINT;
dann kannst du zur laufzeit dein array auf unterschiedliche segmente legen (z.b. lesen bzw. schreiben)
myARRAY := ADR(FELDBUSVARIABLE);
oder
myARRAY := ADR(%QD128);
myARRAY := ADR(%ID128);
der zugriff erfolgt dann über den inhaltsoperator
myARRAY^[99] := 1234;
gruß heho
Hallo HeHo,
danke nochmal für Deinen Nachtrag. Genau so habe ich mir das gedacht. Sieht sehr gut aus mit dem was ich mir vorgestellt habe. Wusste nur nicht, dass ich die Adressen einfach auf mein Array legen kann. Aber so von deiner Beschreibung her ist es genau das was ich gesucht habe.
Grüße
Stoni
Hallo Heho,
hat soweit funktioniert, außer, dass man beim 750-841 nicht so viele Feldbus-Variablen beschreiben kann. Ich wollte (die maximal 255 DUINT) auf je 2 Hälften zu je (128x 32bit) in die Input- und Output-Area verteilen.
Eine Hälfte passt gerade so in den Bereich der PFC-OUT- und die andere Hälfte in den Bereich der PFC-IN-Variables:
* IEC61131 %QW256 ... %QW511 / Modbus# 256 ... 511 (PFC-OUT-Variables)
* IEC61131 %IW256 ... %IW511 / Modbus# 768 ... 1023 (PFC-IN-Variables)
Nur leider lassen sich die PLC-IN-Variables vom Prozessor nicht beschreiben.
Gibt es da noch "irgendwo" weitere Bereiche als PFC-OUT-Variables, oder jene, die als solche konfigurieren kann?
Grüße
feldbus-eingangsvariablen sind wie der name schon sagt "EINGÄNGE" in die plc
Originally created by: Eckhard
Hi Stonix
Zusätzlich zu den "virtuellen" Eingängen %IW256 ... 511 und "virtuellen" Ausgängen %QW256 ... 511
gibt es noch die Memorywörter (%MW0 ... %MW4096), sie können über Modbus von außen über die Adresse 12288 (oder glatt in Hex 16#3000) gelesen oder geschrieben werden. Dabei entspricht MW0 - 12288, MW1 - 12289 usw.
Du kannst Dein Array auch auf diese Adresse legen. (myARRAY AT %MD0 : ARRAY[0..199] OF UDINT;)
(Wobei bei der Größe des Datentypens aus MW4096 dann MD2048 wird. Will sagen bei der Adressierung hat man die Wahl nach dem Muster: MB100 = MW50 = MD25)
Bei dem Speicherbereich hast Du keine Platzprobleme mehr.
Gruß Ecki