Temat: MR3020 jako akwizytor danych po protokole Modbus/RTU

Jeśli zaciekawił was temat to może pomożecie mi trochę.

Planuję wykorzystać TP-LINK TL-MR3020 ( http://eko.one.pl/?p=openwrt-mr3020#krtkaspecyfikacja ) jako pośrednika przy obrazowaniu bieżącego zużycia energii elektrycznej z 4 liczników ORNO OR-WE-506 z portami RS-485 ( http://www.orno.pl/index.php?strona=tow … amp;page=1 )poprzez konwerter USB/RS-485 AVTMOD03 ( http://sklep.avt.pl/p/pl/485817/konwert … rs485.html ). Odebrane dane po drobnej obróbce chciałem wysłać do serwisu http://thingspeak.org

W OpenWrt zainstalowałem libmodbus i muszę napisać mały programik w C do odczytu danych.

Z programikiem sobie poradzę tylko nie wiem jak przygotować sobie środowisko programistyczne. Podajcie krótki opis lub jakiś link.

Opracowanie zamieszczę w wątku.

Pozdrawiam

Michał

2

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

eko.one.pl - > kompilacja systemu, do poczytania. Albo ściągasz całe sdk i masz kroskompilator gotowy.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

3 (edytowany przez a.bakus 2013-04-28 14:19:56)

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

Zainstalowałem OpenWrt na routerze. Załadowałem kmod-usb-serial-ftdi ale nie widzę interfejsu w /dev. W /proc/bus mam tylko ./pci a nie mam ./usb. W logach nic nie mam na temat USB!

Co robić?

4

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

Potrzebny jest sterownik kontrolera USB EHCI, znajdujący się w kmod-usb2.

5

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

Wynik cat /sys/kernel/debug/usb/devices pokaż.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

6

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

Zainstalowałem OW z http://ecco.selfip.net/attitude_adjustment/ar71xx/ wcześniej miałem z openwrt.org. Nic nie pomogło. Zmieniłem kabelek USB i działa. Rany! Jak takie piredoły potrafią człowieka wkurzyć.

7

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

smile

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

8

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

To  jest mój skrypt na zbieranie danych z licznika OR-WE-504 może cie zainteresuje ja się komunikuje slotem tcp/ip na i z modułu już rs485

#!/bin/bash

czas=`date +"%H:%M:%S"`
dane=`sed 's/^[ ]*//' //mnt/www/dane/wyswietlacz.txt`

if ping -c 1 192.168.1.254 > /dev/null
then

exec 3<> /dev/tcp/192.168.1.254/4001

echo -en "\x01\x03\x00\x00\x00\x0B\x04\x0D" >&3

    head -c 40 <&3 > /mnt/www/header.hex
BYTES=( `hexdump -v -e ' 1/1 "%02X " ' /mnt/www/header.hex` )     
    HEX="${BYTES[0]}${BYTES[1]}${BYTES[2]}${BYTES[3]}${BYTES[4]}${BYTES[5]}${BYTES[6]}${BYTES[7]}${BYTES[8]}${BYTES[9]}${BYTES[10]}${BYTES[11]}${BYTES[12]}${BYTES[13]}${BYTES[14]}${BYTES[15]}${BYTES[16]}${BYTES[17]}${BYTES[18]}${BYTES[19]}${BYTES[20]}${BYTES[21]}${BYTES[22]}${BYTES[23]}${BYTES[24]}${BYTES[25]}${BYTES[26]}${BYTES[27]}"   
    DATA_LENGTH=`echo "obase=10; ibase=16; ${BYTES[3]}${BYTES[4]}" | bc` 
   # head -v -c "${DATA_LENGTH}" <&3
exec 3>&- # Close for write
exec 3<&- # Close for read                             

#echo adres ${BYTES[0]}

#echo rozkaz ${BYTES[1]}

#echo ilosc danych ${BYTES[2]}

#napiecie
DATA_LENGTH=`echo "obase=10; ibase=16; ${BYTES[3]}${BYTES[4]}" | bc`
DATA_LENGTH=${DATA_LENGTH:0:3}.${DATA_LENGTH:3:1}
echo Napięcie: ${DATA_LENGTH} V
#koniec

#aperaz
DATA_LENGTH=`echo "obase=10000; ibase=16; ${BYTES[5]}${BYTES[6]}" | bc`
DATA_LENGTH=${DATA_LENGTH:0:4}.${DATA_LENGTH:4:1}
echo Amperaz: ${DATA_LENGTH} A
#koniec

#czestotliwosc
DATA_LENGTH=`echo "obase=10000; ibase=16; ${BYTES[7]}${BYTES[8]}" | bc`
DATA_LENGTH=${DATA_LENGTH:0:4}.${DATA_LENGTH:4:1}
echo Czestotliwosc: ${DATA_LENGTH} HZ
#koniec

#Moc czynna
DATA_LENGTH=`echo "obase=10; ibase=16; ${BYTES[9]}${BYTES[10]}" | bc`
echo Moc czynna: ${DATA_LENGTH} W
#koniec

#Moc bierana
DATA_LENGTH=`echo "obase=10; ibase=16; ${BYTES[11]}${BYTES[12]}" | bc`
echo Moc bierna: ${DATA_LENGTH} var
#koniec

#Moc pozorna
DATA_LENGTH=`echo "obase=10; ibase=16; ${BYTES[13]}${BYTES[14]}" | bc`
echo Moc pozorna: ${DATA_LENGTH} va
#koniec

#współczynnik mocy
DATA_LENGTH=`echo "obase=10; ibase=16; ${BYTES[15]}${BYTES[16]}" | bc`
echo Wspolczynik mocy: ${DATA_LENGTH} P
#koniec

#stan licznika
DATA_LENGTH=`echo "obase=10; ibase=16; ${BYTES[17]}${BYTES[18]}${BYTES[19]}${BYTES[20]}" | bc`
DATA_LENGTH=${DATA_LENGTH:0:5}.${DATA_LENGTH:5:1}
echo Stan licznika ${DATA_LENGTH} Kwh
#koniec

#Energia bierna
DATA_LENGTH=`echo "obase=10; ibase=16; ${BYTES[21]}${BYTES[22]}${BYTES[23]}${BYTES[24]}" | bc`
DATA_LENGTH=${DATA_LENGTH:0:5}${DATA_LENGTH:5:1}
echo Bierny stan licznika ${DATA_LENGTH} varh
#koniec
fi

9

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

Pytanko do autora tematu - poszukuję prostego sposobu aby spod OpenWrt (Gargoyle) odczytać dane po Modbus RTU (przez konwerter RS485). Gdzie znajdę jakiegoś manuala do libmodbus? Jak wygląda odpytanie jakiegoś urządzenia?

Pozdrawiam

10

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

nawtom napisał/a:

To  jest mój skrypt na zbieranie danych z licznika OR-WE-504 może cie zainteresuje ja się komunikuje slotem tcp/ip na i z modułu już rs485

Mógłbyś pokazać jak to masz podłączone do routera/terminala? Zainteresowany tematem, zainstalowałbym sobie coś takiego.

TL-WDR3600
TL-WR1043ND
TL-WR842ND

11 (edytowany przez viper_lasser 2015-05-09 09:10:35)

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

Witam
Przerobiłem sobie powyższy skrypt na wersję ethernetową która działa pod zwykłym linuxem ale pod openwrt nie działa.

if ping -c 1 192.168.10.210 > /dev/null
then

exec 3<> /dev/tcp/192.168.10.210/1502

echo -en "\x01\x00\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A" >&3

head -c 20 <&3 > /tmp/header.hex
BYTES=( `hexdump -v -e ' 1/1 "%02X " ' /tmp/header.hex`)
    HEX="${BYTES[0]}${BYTES[1]}${BYTES[2]}${BYTES[3]}${BYTES[4]}${BYTES[5]}${BYTES[6]}${BYTES[7]}${BYTES[8]}${BYTES[9]}${BYTES[10]}${BYTES[11]}${BYTES[12]}${BYTES[13]}${BYTES[14]}${BYTES[15]}${BYTES[16]}${BYTES[17]}${BYTES[18]}${BYTES[19]}"
    DATA_LENGTH=`echo "obase=10; ibase=16; ${BYTES[3]}${BYTES[4]}" | bc`

exec 3>&- # Close for write
exec 3<&- # Close for read

#waga
DATA_LENGTH=`echo "obase=10; ibase=16; ${BYTES[9]}${BYTES[10]}" | bc`
DATA_LENGTH=${DATA_LENGTH:0:5}
echo Napiecie: ${DATA_LENGTH} V
WAGA=${DATA_LENGTH}
#koniec

#zmiana
DATA_LENGTH=`echo "obase=10; ibase=16; ${BYTES[13]}${BYTES[14]}" | bc`
DATA_LENGTH=${DATA_LENGTH:0:5}
echo Amperaz: ${DATA_LENGTH} A
ZMIANA=${DATA_LENGTH}
#koniec

fi 

Przy uruchomieniu pojawia się błąd
root@OpenWrt:/tmp# ./modbus_odczyt.sh
./modbus_odczyt.sh: line 10: syntax error: "(" unexpected (expecting "fi")
root@OpenWrt:/tmp#

Jak to można obejść ?

12

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

W ash nie ma tablic. Basha sobie zainstaluj i jawnie w przez basha wołaj albo sobie skrypt napisz poprawnie.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

13

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

Przerobiłem sobie skrypt ale mam dalej problem z wysłaniem i odbieraniem nagłówka

./modbus_odczyt.sh: line 39: can't create /dev/tcp/192.168.2.159/1502: nonexistent directory

Kawałek skryptu który powoduje bład wygląda mniej więcej tak

exec 3<> /dev/tcp/192.168.2.159/1502

echo -en "\x01\x00\x00\x00\x00\x06\x01\x03\x00\x00\x00\x0A" >&3

head -c 20 <&3 > /tmp/header.hex
#BYTES=(`hexdump -v -e ' 1/1 "%02X " ' /tmp/header.hex`)
BYTES=`hexdump -v -e '1/1 "%02X" '/tmp/header.hex`

Tutaj piszą o tym że ash tego nie umożliwia sad
http://stackoverflow.com/questions/1064 … -80-in-ash

14

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

exec 3<> /dev/tcp/192.168.2.159/1502

Co to jest? Masz w ogóle coś takiego jak /dev/tcp/192.168.2.159/1502?

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

15

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

http://www.linuxquestions.org/questions … pt-794812/

Jest to obsługa socketu w sensie nadawania i odbioru na danym porcie

16

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

Czy masz w /dev w ogóle coś takiego?

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

17

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

Nie mam czegoś takiego.
W bashu jest coś takiego
http://thesmithfam.org/blog/2006/05/23/ … devtcp-2/#

Skompilowałem sobie pakiet bash'a i postawiłem system na nowo ale w zainstalowanych pakietach nie widać że jest bash

root@OpenWrt:/dev# opkg list_installed
admswconfig - 0.1-1 -
base-files-adm5120 - 14.3-r18801 -
bridge - 1.4-1 -
busybox - 1.11.2-2.2 -
dropbear - 0.51-2 -
hotplug2 - 0.9+r102-2 -
kernel - 2.6.26.8-adm5120-1 -
kmod-usb-adm5120 - 2.6.26.8-adm5120-1 -
kmod-usb-core - 2.6.26.8-adm5120-1 -
kmod-usb-serial - 2.6.26.8-adm5120-1 -
kmod-usb-serial-ftdi - 2.6.26.8-adm5120-1 -
kmod-usb-serial-pl2303 - 2.6.26.8-adm5120-1 -
libgcc - 4.1.2-14.3 -
libpthread - 0.9.29-14.3 -
libstdcpp - 4.1.2-14.3 -
libuci - 0.7.3-1 -
mtd - 8.2 -
opkg - 4564-3.1 -
picocom - 1.4-1 -
uci - 0.7.3-1 -
uclibc - 0.9.29-14.3 -
udevtrigger - 106-1.1 -
waga2modbus - 1.0.0-1 -
root@OpenWrt:/dev#

W openwrt (kamikaze) nie widać tego pliku /dev/tcp ale pod ubuntu gdzie ten skrypt działa też tego pliku nie ma

18

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

Też nie znam takiej składni. Tym bardziej że /dev/tcp nie ma.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

19

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

Pod jaką nazwą mogę zainstalować pakiet collectd-mod-modbus?
Dostaję odpowiedź No package named collectd-mod-modbus found, try updating your package lists oczywiście opkg zaktualizowane.
Posiadam Gargoyle PL 1.11.0.5

20

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

Posiadasz stare gargoyle oparte o stare openwrt których repo już przeszło na nowe nazwy i https. Albo zmien sobie na https w /etc/opkg albo i/lub zmien sobie downloads.openwrt.org na archive.openwrt.org/

A tak w ogóle to aktualizuj gargoyle do ostatniego dostępnego, bo że nie możesz zainstalować to właśnie tego wina.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

21

Odp: MR3020 jako akwizytor danych po protokole Modbus/RTU

Jakby ktoś był zainteresowany to wrzucam swoją wersję skryptu do komunikacji po protokole modbus tcp/ip

https://pastebin.pl/view/68037760

Skrypt czyta aktualną wagę spod rejestru Holding Register i sprawdza czy zapisywać nią czy nie (w którymś tam rejestrze).

Można to było zrobić lepiej ale skrypt powstał z 5 lat temu i bazując na rozwiązaniu Nawtom'a udało mi się szybko uzyskać działającą wersję.