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!
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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?
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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!
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
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;
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
Hallo Jazz,
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
Hallo
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
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
Golbal suchen/ersetzen ist das Zauberwort für die Suche nach MW0.
MfG
Marcel
@Jazz1
Klar
Projekt->Überprüfen->Überlappende Speicherbereiche
und
Projekt->Querverweisliste ausgeben => Kategorie : Adresse / Name : *
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
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?