Zitat von "dreamshader" pid='147441' dateline='1428544529'
Und weiter geht's ...
ich habe jetzt ein Programm für den Raspi erstellt, das sich als Master am RS485-Bus anmeldet, die Register des Slabe (Arduino) ausliest und einige Register ändert.
Voraussetzung: die libmodbus muss installiert sein. Verwendet habe ich die aktuellste Version (3.1.2 vom 10.02.2015), die ihr als Source -> hier <- oder bei github -> hier <- herunterladen könnt. Auf github liegt eine ZIP-Datei namens libmodbus-master.zip.
Und dann benötigt ihr noch einen USB->RS485-Adapter wie z.B. -> diesen <- hier.
Das Bauen der Library ist ziemlich simpel. Entpackt das Archiv mit
pi@raspberrypi ~ $ tar xvf libmodbus-3.1.2
bzw. beim ZIP-Archinv mit
pi@raspberrypi ~ $ unzip libmodbus-master.zip.
wechselt dann in das Verzeichnis
pi@raspberrypi ~ $ cd libmodbus-3.1.2
und ruft dann das Konfigurationsscript auf
pi@raspberrypi ~/RS485_MODBUS/libmodbus-3.1.2 $ ./configure
Wenn nach Beenden des scripts die Ausgabe
libmodbus 3.1.2
===============
prefix: /usr/local
sysconfdir: ${prefix}/etc
libdir: ${exec_prefix}/lib
includedir: ${prefix}/include
compiler: gcc -std=gnu99
cflags: -g -O2
ldflags:
documentation: no
Alles anzeigen
erscheint, habt ihr erst mal alles richtig gemacht ...
Jetzt mit make:
pi@raspberrypi ~/RS485_MODBUS/libmodbus-3.1.2 $ make
make --no-print-directory all-recursive
Making all in src
CC modbus.lo
CC modbus-data.lo
CC modbus-rtu.lo
CC modbus-tcp.lo
CCLD libmodbus.la
Making all in tests
make all-am
CC bandwidth-server-one.o
CCLD bandwidth-server-one
CC bandwidth-server-many-up.o
CCLD bandwidth-server-many-up
CC bandwidth-client.o
CCLD bandwidth-client
CC random-test-server.o
CCLD random-test-server
CC random-test-client.o
CCLD random-test-client
CC unit-test-server.o
CCLD unit-test-server
CC unit-test-client.o
CCLD unit-test-client
CC version.o
CCLD version
Making all in doc
make[2]: Nothing to be done for 'all'.
pi@raspberrypi ~/RS485_MODBUS/libmodbus-3.1.2 $
Alles anzeigen
die Library erzeugen und anschliessend mit sudo make install:
pi@raspberrypi ~/RS485_MODBUS/libmodbus-3.1.2 $ sudo make install
Making install in src
/bin/mkdir -p '/usr/local/lib'
/bin/bash ../libtool --mode=install /usr/bin/install -c libmodbus.la '/usr/local/lib'
libtool: install: /usr/bin/install -c .libs/libmodbus.so.5.1.0 /usr/local/lib/libmodbus.so.5.1.0
libtool: install: (cd /usr/local/lib && { ln -s -f libmodbus.so.5.1.0 libmodbus.so.5 || { rm -f libmodbus.so.5 && ln -s libmodbus.so.5.1.0 libmodbus.so.5; }; })
libtool: install: (cd /usr/local/lib && { ln -s -f libmodbus.so.5.1.0 libmodbus.so || { rm -f libmodbus.so && ln -s libmodbus.so.5.1.0 libmodbus.so; }; })
libtool: install: /usr/bin/install -c .libs/libmodbus.lai /usr/local/lib/libmodbus.la
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/sbin" ldconfig -n /usr/local/lib
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/lib
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the 'LD_RUN_PATH' environment variable
during linking
- use the '-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to '/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
/bin/mkdir -p '/usr/local/include/modbus'
/usr/bin/install -c -m 644 modbus.h modbus-version.h modbus-rtu.h modbus-tcp.h '/usr/local/include/modbus'
/bin/mkdir -p '/usr/local/include/libmodbus'
/usr/bin/install -c -m 644 modbus.h '/usr/local/include/libmodbus'
Making install in tests
make[2]: Nothing to be done for 'install-exec-am'.
make[2]: Nothing to be done for 'install-data-am'.
Making install in doc
make[2]: Nothing to be done for 'install-exec-am'.
make[2]: Nothing to be done for 'install-exec-am'.
/bin/mkdir -p '/usr/local/lib/pkgconfig'
/usr/bin/install -c -m 644 libmodbus.pc '/usr/local/lib/pkgconfig'
pi@raspberrypi ~/RS485_MODBUS/libmodbus-3.1.2 $
Alles anzeigen
installieren. Wenn jetzt im Verzeichnis /usr/local/lib folgende Dateien:
pi@raspberrypi ~/RS485_MODBUS/libmodbus-3.1.2 $ ls -l /usr/local/lib/*modbus*
-rwxr-xr-x 1 root staff 919 Apr 9 02:58 /usr/local/lib/libmodbus.la
lrwxrwxrwx 1 root staff 18 Apr 9 02:58 /usr/local/lib/libmodbus.so -> libmodbus.so.5.1.0
lrwxrwxrwx 1 root staff 18 Apr 9 02:58 /usr/local/lib/libmodbus.so.5 -> libmodbus.so.5.1.0
-rwxr-xr-x 1 root staff 114648 Apr 9 02:58 /usr/local/lib/libmodbus.so.5.1.0
pi@raspberrypi ~/RS485_MODBUS/libmodbus-3.1.2 $
und im Verzeichnis /usr/local/include diese Include-Dateien und Verzeichnisse:
pi@raspberrypi ~/RS485_MODBUS/libmodbus-3.1.2 $ ls -l /usr/local/include/*modbus*
/usr/local/include/libmodbus:
insgesamt 12
-rw-r--r-- 1 root staff 9895 Apr 9 02:58 modbus.h
/usr/local/include/modbus:
insgesamt 24
-rw-r--r-- 1 root staff 9895 Apr 9 02:58 modbus.h
-rw-r--r-- 1 root staff 1676 Apr 9 02:58 modbus-rtu.h
-rw-r--r-- 1 root staff 2074 Apr 9 02:58 modbus-tcp.h
-rw-r--r-- 1 root staff 2114 Apr 9 02:58 modbus-version.h
pi@raspberrypi ~/RS485_MODBUS/libmodbus-3.1.2 $
Alles anzeigen
vorhanden sind - gratuliere - dann ist alles ok gelaufen.
Ladet euch jetzt den Source für den Raspi-Modbus-Master in z.B. Euer Home-Verzeichnis herunter, steckt den USB->RS485 Adapter am Raspi an und überprüft mit dmesg:
pi@raspberrypi ~/RS485_MODBUS $ dmesg
...
[988403.925355] usb 1-1.2.3.4: new full-speed USB device number 9 using dwc_otg
[988404.028808] usb 1-1.2.3.4: New USB device found, idVendor=1a86, idProduct=7523
[988404.028850] usb 1-1.2.3.4: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[988404.028871] usb 1-1.2.3.4: Product: USB2.0-Serial
[988404.030916] ch341 1-1.2.3.4:1.0: ch341-uart converter detected
[988404.045856] usb 1-1.2.3.4: ch341-uart converter now attached to ttyUSB0
pi@raspberrypi ~/RS485_MODBUS $
auf welche Gerätedatei ihr für die Verbindung zugreifen müsst.
Wenn ihr nichts am sketch geändert habt, dann sollten die Schnittstellen-Parameter auf 9600 Baud, even Parity, 8 Datenbits und 2 Stoppbits stehen.
Im Raspi-Code werden diese Werte ebenfalls verwendet, falls ihr nichts daran verändert habt.
Am Anfang des Source-Codes findet ihr folgende Anweisungen die die Schnittstelle betreffen:
#define MODBUS_DEV "/dev/ttyUSB0"
#define MODBUS_BAUD 9600
#define MODBUS_PARITY 'E'
#define MODBUS_DATABITS 8
#define MODBUS_STOPBITS 2
Ändert ggf. das Device auf den Namen, den ihr mit dmesg angezeigt bekommen habt. Soltet ihr im sketch die Schnittstellen-Parameter geändert haben, dann führt die entsprechenden Änderung auch im Raspi-Source durch.
Jetzt könnt ihr das Programm mit
pi@raspberrypi ~ $ cc -o RaspiRFIDModbus RaspiRFIDModbus.c -I/usr/local/include/modbus -I/usr/local/include/libmodbus -lmodbus
übersetzen und anschliessend mit
pi@raspberrypi ~ $ ./RaspiRFIDModbus
aufrufen.
Wenn jetzt alles passt, solltet ihr eine Ausgabe ähnlich wie:
pi@raspberrypi ~/RS485_MODBUS $ ./RaspiRFIDModbus
Opening /dev/ttyUSB0 at 9600 bauds (E, 8, 2)
[01][03][00][00][00][0F][05][CE]
Waiting for a confirmation...
<01><03><1E><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><D8><BA>
reg[0]=0 (0x0)
reg[1]=0 (0x0)
reg[2]=0 (0x0)
reg[3]=0 (0x0)
reg[4]=0 (0x0)
reg[5]=0 (0x0)
reg[6]=0 (0x0)
reg[7]=0 (0x0)
reg[8]=0 (0x0)
reg[9]=0 (0x0)
reg[10]=0 (0x0)
reg[11]=0 (0x0)
reg[12]=0 (0x0)
reg[13]=0 (0x0)
reg[14]=0 (0x0)
[01][06][00][0C][00][01][88][09]
Waiting for a confirmation...
<01><06><00><0C><00><01><88><09>
[01][06][00][0D][00][01][D9][C9]
Waiting for a confirmation...
<01><06><00><0D><00><01><D9><C9>
[01][06][00][0E][00][01][29][C9]
Waiting for a confirmation...
<01><06><00><0E><00><01><29><C9>
pi@raspberrypi ~/RS485_MODBUS $
Alles anzeigen
Wie ihr seht stehen alle ausgelesenen Register auf 0.
Jetzt lest einen Transponder ein und ruft das Programm anschliessend zweimal auf:
pi@raspberrypi ~/RS485_MODBUS $ ./RaspiRFIDModbus
Opening /dev/ttyUSB0 at 9600 bauds (E, 8, 2)
[01][03][00][00][00][0F][05][CE]
Waiting for a confirmation...
<01><03><1E><00><01><00><04><00><D5><00><38><00><90><00><28><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><9E><0A>
reg[0]=1 (0x1)
reg[1]=4 (0x4)
reg[2]=213 (0xD5)
reg[3]=56 (0x38)
reg[4]=144 (0x90)
reg[5]=40 (0x28)
reg[6]=0 (0x0)
reg[7]=0 (0x0)
reg[8]=0 (0x0)
reg[9]=0 (0x0)
reg[10]=0 (0x0)
reg[11]=0 (0x0)
reg[12]=0 (0x0)
reg[13]=0 (0x0)
reg[14]=0 (0x0)
[01][06][00][0C][00][01][88][09]
Waiting for a confirmation...
<01><06><00><0C><00><01><88><09>
[01][06][00][0D][00][01][D9][C9]
Waiting for a confirmation...
<01><06><00><0D><00><01><D9><C9>
[01][06][00][0E][00][01][29][C9]
Waiting for a confirmation...
<01><06><00><0E><00><01><29><C9>
pi@raspberrypi ~/RS485_MODBUS $ ./RaspiRFIDModbus
Opening /dev/ttyUSB0 at 9600 bauds (E, 8, 2)
[01][03][00][00][00][0F][05][CE]
Waiting for a confirmation...
<01><03><1E><00><01><00><04><00><D5><00><38><00><90><00><28><00><00><00><00><00><00><00><00><00><00><00><00><00><01><00><01><00><01><33><CA>
reg[0]=1 (0x1)
reg[1]=4 (0x4)
reg[2]=213 (0xD5)
reg[3]=56 (0x38)
reg[4]=144 (0x90)
reg[5]=40 (0x28)
reg[6]=0 (0x0)
reg[7]=0 (0x0)
reg[8]=0 (0x0)
reg[9]=0 (0x0)
reg[10]=0 (0x0)
reg[11]=0 (0x0)
reg[12]=1 (0x1)
reg[13]=1 (0x1)
reg[14]=1 (0x1)
[01][06][00][0C][00][01][88][09]
Waiting for a confirmation...
<01><06><00><0C><00><01><88><09>
[01][06][00][0D][00][01][D9][C9]
Waiting for a confirmation...
<01><06><00><0D><00><01><D9><C9>
[01][06][00][0E][00][01][29][C9]
Waiting for a confirmation...
<01><06><00><0E><00><01><29><C9>
pi@raspberrypi ~/RS485_MODBUS $ ./RaspiRFIDModbus
Alles anzeigen
Zweimal deshalb, damit die Änderungen die das Master (Raspi) an den Registern vornimmt sichtbar werden. Die Register 12, 13 und 14 sollten nach dem Aufruf des Programms auf 1 geändert sein. Ihr könnt allerdings auch den Modbus-Monitor qmodbus verwenden, um die Änderungen zu sehen.
Nun, das war es auch schon ...
Ich hoffe jetzt, mir ist kein gröberer Schnitzer beinm Schreiben dieses Beitrags unterlaufen. Falls noch
Fragen offen sind, einfach melden ...
Als Nachtrag noch eine wichtige Erkenntnis:
das Handling der Kommunikation wird komplett von der libmodbus übernommen. Die Befürchtungen, das mit dem USB-Adapter nicht hinzubekommen (wegen des HIGH/LOW-Handshake) waren also unnötig.
Wie gesagt: Schaltplan wird noch nachgeliefert und die fehlenden Funktionen im sketch (siehe Beitrag vorher) müssen noch ausdiskutiert resp. implementiert werden.
Ich bleib' jedenfalls dran und halte Euch auf dem Laufenden.
cu,
-ds-