Feldbusvariablen als Array deklarieren und zugreifen

stonix
2015-09-24
2015-12-10
  • stonix - 2015-09-24

    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:

        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:

        FOR index := 0 TO 200 DO
            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.

    Grüße
    Stoni

     

    Related

    Talk.ru: 1
    Talk.ru: 2

  • HeHo - 2015-09-26

    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;

     
  • stonix - 2015-09-26

    Hallo HeHo,

    HeHo hat geschrieben:
    myARRAY AT %QD128 : ARRAY[0..199] OF UDINT;

    das könnte funktionieren. Werde ich am Montag gleich testen, danke vielmals!

    Grüße
    Stoni

     
  • HeHo - 2015-09-27

    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

     
  • stonix - 2015-09-27

    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

     
  • stonix - 2015-09-28

    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

     
  • HeHo - 2015-09-28

    feldbus-eingangsvariablen sind wie der name schon sagt "EINGÄNGE" in die plc

     
  • 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

     

Log in to post a comment.