bin mal ein wenig am Basteln und stehe vor einem kleinen Problem.
Ich will mein Arduino an IPS anbinden. Das ganze soll nun per Modbus erfolgen. Die Insperation hierfür habe ich von dieser Seite:
Nun die Konfiguration unter IPS…
Als erstes I/O Instanz mit der IP des Arduinos und den Port 52:
Bis dahin scheint alles zu laufen. Der Arduino wird zumindest erkannt. Nun kommt der Spliter, diesen habe ich auf Modbus RTU over TCP gestellt und als Geräte-ID 0 gewählt. Die ID habe ich aus diesem Forum Eintrag rausgelesen:
Nun habe ich, so wie im oben genanten Beitrag eine Modbusinstanz erstellt, die Einheit auf DWord (32Bit - Unsiged) gestellt, Die Leseadresse auf 1 und die Schreibeadresse auf 0. Ich nehme an das mit der Lese und schreibe Adresse das Register gemeint ist. Da ich den Wert erstmal nur auslesen möchte ist der „Nur Lesen“ Hacken aktiv. Das Intervall ist auf dem default Wert von 5000 gestellt.
Trotz dieser Einstellung sehe ich nur dieses Traurige Bild:
Das scheint wohl kein unterschied zu machen, zumindest funktioniert es mit beiden Einträgen. Hast du eigentlich auch mal versucht einen Wert per Symcon an den Arduino zu übertragen? Habe nämlich doch noch ein Problem. Ich beschreibe es mal kurz:
Die konfiguration in Symcon ist gleichgeblieben. Die Modbus Instanz sieht so aus:
Nun wollte ich die Variable auf true setzen und kriege die Meldung das die Variable auf nur lesen gesetzt ist. Wie man im Screen sieht, ist es aber nicht der Fall. Per Skript das gleich:
Warning: Variable wurde als „Nur-Lesen“ markiert und kann nicht verändert werden in C:\IP-Symcon\scripts\33773.ips.php on line 3
Hat jemand dazu noch eine Idee?
RTFM^^
ok so wie ich es verstehe handelt es sich dabei um eine „Status Variable“ aber warum habe ich dann die möglichkeit „Nur Lesen“ auszuwählen? Ist es überhaupt möglich Modbus Variablen mit der Musbus Library zu schreiben?
Alle StatusVariablen sind immer nur lesen. Das hat nicht direkt was mit dem Haken nur lesen in der Instanz zu tun.
Wenn du StatusVariablen beschreiben willst (und das auch geht) musst du den passenden Befehl auf die Instanz mit dem passenden Befehl ausführen.
Dadurch führt IPS im Hintergrund den Befehl aus und die Rückmeldung ist die Änderung bei der Statusvariable.
Wie in der Doku beschrieben, an der Tachonadel drehen heisst nicht das das Auto schneller wird, du musst schon eine Aktion ausführen
Z.B. ModBus_WriteRegisterDWord http://www.ip-symcon.de/service/dokumentation/modulreferenz/modbus-rtu-tcp/modbus-registerdword/
Michael
OK, ich hätte mich doch besser informieren sollen. Wusste bis dato nicht mal das es Modbus befehle gibt. Nun funktioniert auch das senden 1A. Danke noch mal an alle.
ich habe das mit dem Bits auch mal versucht…war aber nicht ganz zufreiden es hat immer sehr lange gedauert und war nicht zuverlässig. Ich benutze jetzt nur noch INT16 und Wandel die dann in Bits um.
Ich bin noch am schreiben des Sketchs für den Arduino. Habe daher auch keine langzeit Erfahrung. Aber du hast recht, warum 32 bit belegen wenn es auch mit der hälfte geht.
bin mal ein wenig am Basteln und stehe vor einem kleinen Problem.
Ich will mein Arduino an IPS anbinden. Das ganze soll nun per Modbus erfolgen. Die Insperation hierfür habe ich von dieser Seite: Temperatur- und Verschlussüberwachung mittels Arduino | BPMedia
Bei mir sagt er bei der Rot markierten stelle immer
sketch_dec28a:5: error: 'Mudbus' does not name a type
sketch_dec28a.ino: In function 'void loop()':
sketch_dec28a:22: error: 'Mb' was not declared in this scope
hehe schön das mein gebastel den Weg ins Forum findet.
Stefan:
Der Include für das Mudbus sieht nicht gut aus.
Nutz mal: #include <Mudbus.h> anstatt #include „Mudbus.h“
Dann sollte es auch mit Mudbus Mb; funktionieren. Vorausgesetzt die Library wurde korrekt im Arduinoverzeichnis kopiert!
Hi, hatte nochmal ne andere Lib außem Netz gesucht, jetzt geht’s.
Danke schon mal für dein „gebastel“
Habe aber noch einige Fragen,
wenn ich beim Client Socket die IP des Arduino eingebe sagt er immer „Connect timed out“ ich kann den Arduino aber anpingen. modbus1.png
Wo finde ich das Modul ModBus RTU TCP modbus2.png
wie muß ich das schreiben wenn ich einen Ausgang schalten möchte oder wenn ich einen Wert in eine Variable ändern möchte?
Mb.R[1] = analogRead(A1);
Mb.R[1] = digitalRead(1); ???
[EDIT] hab ich in deinem anderen Beitrag gefunden [EDIT]
Wie bei PHP werden die Variablen von rechts nach links verarbeitet. Also
Mb.R[1] = digitalRead(1);
Mb.R[1] bekommt den Wert des PIN 1.
Wenn Du von IP-Symocn in den Arduino schreiben möchtest, muss das dann umgedreht werden.
Das würde dann bei einer Variablen so aussehen.
Variable = Mb.R[1]
Bei einem Pin brauchst du den Schaltbefehl z.B. digitalWrite(pinnummer,HIGH/LOW)
Siehe auch die Tutorials auf der Arduinoseite http://arduino.cc/en/Tutorial/Blink
Ich würde das so schreiben:
if (Mb.R[1] == 0){
digitalWirte(1,LOW);
} else {
digitalWrite(1,HIGH);
}
Achtung!!!
Wenn Du den Wert aus Mb.R[1] bidirektional nutzen möchtest. Also sowohl schreiben im Arduino als auch in IP-Symcon, musst Du dir Gedanke machen wer wann die Variable Mb.R[1] beschreiben darf. Anders als in PHP läuft der Arduino in einer Dauerschleife. Schreibst Du den READBefehl in den LOOP, dann wird dir die Variable immer durch den Arduino überschrieben. Evtl. könntest Du das mit einer weiteren BoolVariable lösen. So lange diese false ist (0) dann darf der Arduino die Mb.R[1] überschreiben Willst Du aus IP-Symocn schreiben und der Arduino soll die Variable verarbeiten dann sendest Du ein true. Für eine Variable ist das witzlos. Aber wenn du 10 Variablen bidirektional nutzen möchtest könnte das ganz gut funktionieren. Nur so als Idee.
Jetzt muß ich erst mal eine Verbindung hin bekommen
Hab einen ModBus Gateway angelegt, ModBus RTU over TCP Geräte ID 1
bei Untergeordnete Instanz habe ich den Client Socket ausgewählt und beim
Client Socket hab ich die IP des Arduino und den Port 502 eingegeben wenn ich jetzt auf Übernehmen klicke
kommt die Meldung „No route to host.“, hab ich irgend etwas übersehen?