Globale Variable über Modbus auslesen

Jazz11
2009-05-26
2009-05-28
  • Jazz11 - 2009-05-26

    Hallo!

    Habe folgendes Problem: Ich würde gern Globale Variable aus einem CoDeSys Programm über Modbus/TCP DLL (MBT.dll) nach EXCEL auslesen.

    Den Zugriff auf Messdaten, die über eine Eingangskarte an der Wago anliegen habe ich bereits hinbekommen. Aber wie kann ich auf globale Variablen zugreifen, die nicht direkt mit einer Karte in Verbindung stehen sondern nur im Programm existieren? Wenn ich das richtig verstanden habe geht das über Merker? aber wie greife ich auf die Merker zu? und wie krieg ich raus welcher Merker welche Modbus Adresse hat?

    Vile Fragen ich weis, vielleicht kann mir ja jemand helfen!

     
  • Uwe - 2009-05-27

    Hallo Jazz,

    Standardfrage : Was für’n System ?

    Ich vermute Wago 841.

    Bei der Variablendeklaration kannst du festlegen wo die Variable angelegt wird.

    z.B.

    wVar AT%MW0 : WORD;

    legt deine Variable auf das Merkerwort 0.

    So kannst du deine Variablen auf bestimmte Merkerworte legen.

    Du musst natürlich selbst verwalten welche Adressen du schon belegt hast und welche nicht

    also z.B. musst du wissen das ein REAL 4 Byte belegt und mit der Deklaration

    rVar AT%MW28 : REAL;

    die Merkerworte 28 und 29 belegt sind.

    Weiterhin musst du dabei das Word / Doppelwort-Alignment beachten !!

    (kontrolliert der Compiler aber schon)

    Nachdem du nun deine Variablen auf die Merker verteilt hast,

    kannst du ab Adresse 12288 (3000h) mit Modbus auf die Merker zugreifen.

    Also 12288 -> %MW0 u.s.w.

    Beim 842 wäre nun noch eine Randbedingung zu beachten

    (daher die Frage am Anfang).

    Uwe

     
  • Jazz11 - 2009-05-27

    Hallo Uwe,

    vielen Dank, das hat mir schon mal weitergeholfen, hab aber noch einige Anschlussfragen:

    erstmal ja es ist eine 841

    jetzt hab ich meine Variablen jeweils einem Merker zugewiesen d.h. das sieht jetzt so aus: Var1 AT %MW0:REAL;

                            Var2 AT %MW2:REAL;
    
                            Var3 AT %MW4:REAL;  da eine REAL Variable jeweils 4 Byte belegt. Bekomme ich beim übersetzten automatisch eine Fehlermeldung falls MW 0 schon belegt wäre?
    

    Wie bewerkstellige ich nun das Auslesen über Modbus?

    Bisher hab ich Temperaturen über Modbus ausgelesen, die an eine Eingangskarte gekoppelt waren d.h. das sieht in der Steuerungskonfiguration so aus:VAR AT%IW6:INT; Dann konnte ich in der Modbus read address einfach die 6 eingeben. Jetzt ist mein Wert ja über zwei Merkerworte verteilt, dann kann ich jetzt wohl nicht statt zuvor die 6 die Modbus Adresse 12288 für MW0 eingeben oder? Bzw. ich muss wohl MW0 und MW1 übertragen und danach irgendwie zusammenkoppeln??

    Und zum Schluss noch ne ganz andere Frage wenn ich nicht einzelne Variablen auslesen will sondern Arrays die so deklariert sind:

    Var:ARRAY [1..20]OF REAL; ist das möglich??

    Jazz

     
  • Uwe - 2009-05-27

    Hallo Jazz,

    Zitat:
    Bekomme ich beim übersetzten automatisch eine Fehlermeldung falls MW 0 schon belegt wäre?
    Nein.

    Zitat:
    Jetzt ist mein Wert ja über zwei Merkerworte verteilt, dann kann ich jetzt wohl nicht statt zuvor die 6 die Modbus Adresse 12288 für MW0 eingeben oder?
    Doch geht.

    Du hast doch schon mit der MBT.dll gearbeitet.

    Dort gibst du bei dem Dienst MBTReadRegisters die

    Startadresse -> 12288 an

    und die Anzahl der Worte die du lesen möchtest.

    Dort kannst du bis ca. 120 Worte in einem Rutsch lesen.

    Also auch ein Array.

    Es werden ja keine Variablen sondern lediglich ein Stück aus dem Speicher gelesen.

    Der zu REAL passende Datentyp in deinem VBA ist übrigens Single,
    wahrscheinlich must du die Bytereihenfolge dann in deinem Makro
    noch ein wenig tauschen damit es passt.

    Uwe

     
  • NetFritz - 2009-05-27

    Hallo

    Zitat:
    @ Uwe
    Du musst natürlich selbst verwalten welche Adressen du schon belegt hast und welche nicht
    also z.B. musst du wissen das ein REAL 4 Byte belegt und mit der Deklaration
    rVar AT%MW28 : REAL;
    die Merkerworte 28 und 29 belegt sind.

    Wo finde ich mehr dazu in der Doku?

    Ich habe folgendes in der Doku gefunden.

    Zum Beispiel würde die Adresse %MD48 die Bytes Nr. 192, 193, 194 und 195 im

    Merkerbereich adressieren (48 * 4 = 192). Das erste Byte ist das Byte Nr. 0.

    Dann ist aber %MD49 die Bytes Nr. 196,197,198 u. 199.

    Gruß NetFritz

     
  • Jazz11 - 2009-05-27

    Hallo Uwe,

    danke nochmal, gibts ne Möglichkeit rauszufinden ob ich MW0 schin verwendet habe?, bin mir da nicht sicher.

    Startadress 12288 soweit klar. Wie kann ich aber die empfangenen Daten so weiterverarbeiten, dass aus sechs Merkern 3 Werte entstehen.

    Datentyp Long müsste auch gehen?

    Jazz

     
  • Matze001 - 2009-05-27

    Golbal suchen/ersetzen ist das Zauberwort für die Suche nach MW0.

    MfG

    Marcel

     
  • Uwe - 2009-05-28

    @Jazz1

    Zitat:
    gibts ne Möglichkeit rauszufinden ob ich MW0 schin verwendet habe?

    Klar
    Projekt->Überprüfen->Überlappende Speicherbereiche
    und
    Projekt->Querverweisliste ausgeben => Kategorie : Adresse / Name : *

    Zitat:
    Datentyp Long müsste auch gehen?

    Sicher, wenn du in der SPS statt REAL den Typ DINT benutzt oder

    den Wert im VBA von Single nach Long castest -> CLng().

    siehe

    http://bauwiki.tugraz.at/bin/view/VBA/DatenTypen

    und

    http://bauwiki.tugraz.at/bin/view/VBA/D ... vertierung

    Uwe

     
  • Jazz11 - 2009-05-28

    Hallo Uwe,

    nochmals vielen Dank, das Auslesen von globalen Variablen, die in der SPS den Datentyp INT oder DINT haben klappt einwandfrei in VBA als als Long oder Single.

    Allerdings bekomme ich immer komische Ergebnisse (meist 0) wenn ich Variable des Datentyps REAL aus der SPS auslesen will. Was muss ich denn mit dem Response Wert aus Modbus genau anstellen damit ich ihn korrekt angezeigt bekomme? Hast Du da vielleicht ein Beispiel?

     

Log in to post a comment.