передача данных по сети

Использование протоколов Modbus, SPI, I2c и прочих, проблемы и решения
Ответить
keeper1978
Сержант
Сообщения: 128
Зарегистрирован: 26.09.2015{, 19:57}
Репутация: 2

передача данных по сети

#1

Сообщение keeper1978 » 19.04.2016{, 17:57}

Ребят нужен ваш совет
вводная:
Имеется мега, управляющая оборудованием и возможность её подключения к локальной сети посредством интернет шилда,
и Openhab на OrangePI  так же в этой сети.
надо подключить мегу к openhab, при этом допускаю использование в качестве промежутка ещё одну ардуинку, подключённую к апельсине по ком порту.

надо: передовать данные с меги на опенхаб и опенхабом управлять мегой.
как это проще реализовать посредством программы.
mqtt блок не предлагать хоть  этот протокол был бы лдля меня более предпочтителен, так как он корректно работает только c передачей, а на прием не работает !!
Последний раз редактировалось keeper1978 19.04.2016{, 18:24}, всего редактировалось 1 раз.

XENOMAN
Рядовой
Сообщения: 33
Зарегистрирован: 05.10.2015{, 18:03}
Репутация: 2

передача данных по сети

#2

Сообщение XENOMAN » 19.04.2016{, 20:47}

Как насчет Modbus? Openhab его поддерживает, настройка - проще пареной репы, и не надо городить огородов с html кодами.

Если использование интернет шилда - принципиально. http://forum.flprogwiki.ru/viewtopic.php?f=18&t=199 - тут я описывал пару костылей для общения openhab и ардуины через W5100. Стабильность работы не гарантирована.
Последний раз редактировалось XENOMAN 19.04.2016{, 21:41}, всего редактировалось 1 раз.

keeper1978
Сержант
Сообщения: 128
Зарегистрирован: 26.09.2015{, 19:57}
Репутация: 2

передача данных по сети

#3

Сообщение keeper1978 » 19.04.2016{, 23:30}

у меня нет возможности из того места передать данные по проводам, приходится использовать точку доступа

Добавлено (19.04.2016, 22:40)
---------------------------------------------
Да читал я както давно эту тему ну и подзабыл про неё
но проблема не в этом а в передаче переменных из опен хаба на ардуинку а там я этого не нашел  (( может плохо смотрел
а вообще еслиб был в программе блок хотябы mqtt  можно былоб уже смело использовать в разработках опенхаб+Flprog на полную катушку
а с модбасом проблемы так как туда нет доступа для кабеля

о всё разобрался вроде работает

Добавлено (19.04.2016, 23:30)
---------------------------------------------
а как тогда апелсинкой принимать Modbus протокол
Последний раз редактировалось keeper1978 20.04.2016{, 01:10}, всего редактировалось 1 раз.

XENOMAN
Рядовой
Сообщения: 33
Зарегистрирован: 05.10.2015{, 18:03}
Репутация: 2

передача данных по сети

#4

Сообщение XENOMAN » 20.04.2016{, 20:08}

keeper1978 писал(а):а как тогда апелсинкой принимать Modbus протокол
Купите USB-RS485 переходник. По поводу настройки модбас и OpenHab: есть статья на Хабре - https://habrahabr.ru/post/252555/
СпойлерПоказать
Коротко: ставите плагин, в конфиге вбиваете:

# Частота опроса слейвов

# Настройки соединения, номер порта, скорость и т.д. Конкретно у меня если прописать только СОМ17, то работать не будет.

# id слейва в сети

# Начальный индекс переменной

# Кол-во переменных

# Тип переменной: discrete, coil, input или holding.

Код: Выделить всё

modbus:poll=200

modbus:serial.slave1.connection=COM17:9600:8:none:1:rtu
modbus:serial.slave1.id=1
modbus:serial.slave1.start=0
modbus:serial.slave1.length=1
modbus:serial.slave1.type=discrete
З.Ы. Есть две очень важные особенности.

1) В статье на хабре приведен пример где берется сразу несколько адресов переменных.


СпойлерПоказать

Код: Выделить всё

modbus:serial.slave1.connection=COM7
modbus:serial.slave1.id=1

modbus:serial.slave1.start=0 //Начиная с нулевой
modbus:serial.slave1.length=4 //Четыре штуки, т.е. 0,1,2,3.
modbus:serial.slave1.type=holding
Но у меня почему-то такой способ не взлетел, первая переменная выводится без проблем, а последующие - не работают вообще. Поэтому для каждой переменной необходимо в конфиге прописывать код вида:



Код: Выделить всё

modbus:serial.slave1.connection=COM17:9600:8:none:1:rtu
modbus:serial.slave1.id=1
modbus:serial.slave1.start=0
modbus:serial.slave1.length=1
modbus:serial.slave1.type=discrete
Для второй переменной этого же слейва соответственно:



Код: Выделить всё

modbus:serial.slave2.connection=COM17:9600:8:none:1:rtu
modbus:serial.slave2.id=1
modbus:serial.slave2.start=16
modbus:serial.slave2.length=1
modbus:serial.slave2.type=discrete
2) Адресация
СпойлерПоказать
При использовании переменных типа discrete и coil, есть некоторая пляска с адресами. Цитата автора программы:


Например вы создали 3  переменых  модбас с адресами 0 - 2 типа Integer,
Если мастер запросит холдинг-регистр с адресом 0 то получит значение переменной с адресом 0, но это понятно.
если мастер запросит Input Register с адресом 0  полчит значение переменной с адресом 0
если мастер запросит Discrete Inputs с адресом 0  полчит значение нулевого бита переменной с адресом 0 (соответственно запросив Discrete Inputs с адресом 16 полчит значение нулевого бита переменной с адресом 1 )
если мастер запросит Coils с адресом 0  полчит значение нулевого бита переменной с адресом 0 (соответственно запросив Coils с адресом 16 полчит значение
нулевого бита переменной с адресом 1 )
Я думаю понятно - если используете discrete или coil надо учитывать сдвиг 16 бит для каждой последующей переменной(0 для переменной с индексом 0, 16 для 1, 32 для 2 и т.д.). Либо работать с несколькими битами одной переменной.
Последний раз редактировалось XENOMAN 20.04.2016{, 20:47}, всего редактировалось 1 раз.

keeper1978
Сержант
Сообщения: 128
Зарегистрирован: 26.09.2015{, 19:57}
Репутация: 2

передача данных по сети

#5

Сообщение keeper1978 » 23.04.2016{, 01:14}

Помогите с настройкой модбаса
в системе

СпойлерПоказать
root@orangepipc:/home/keeper# ls -l /dev/ttyS* /dev/ttyUSB*
crw--w---- 1 root tty     251, 0 Apr 22 23:13 /dev/ttyS0
crw-rw---- 1 root dialout 188, 0 Apr 22 23:39 /dev/ttyUSB0 //модбас конвертер
root@orangepipc:/home/keeper#

+-----------------------------------------------------------------------+
| A -    Serial Device      : /dev/ttyUSB0                    |
| B - Lockfile Location     : /var/lock                    |
| C -   Callin Program      :                    |
| D -  Callout Program      :                    |
| E -    Bps/Par/Bits       : 9600 8N1                    |
| F - Hardware Flow Control : Yes                    |
| G - Software Flow Control : No                    |
|                    |
|    Change which setting?                    |
+-----------------------------------------------------------------------+
| Screen and keyboard      |
| Save setup as dfl        |
| Save setup as..          |
| Exit                     |
| Exit from Minicom        |

+--------------------------+

конфиг Openhab



modbusoll=200

modbus:serial.slave1.connection=ttyUSB0:9600:8:none:1:rtu
modbus:serial.slave1.id=1
modbus:serial.slave1.start=0
modbus:serial.slave1.length=1
modbus:serial.slave1.type=discrete

modbus:serial.slave2.connection=ttyUSB0:9600:8:none:1:rtu
modbus:serial.slave2.id=1
modbus:serial.slave2.start=16
modbus:serial.slave2.length=1
modbus:serial.slave2.type=discrete

modbus:serial.slave3.connection=ttyUSB0:9600:8:none:1:rtu
modbus:serial.slave3.id=1
modbus:serial.slave3.start=32
modbus:serial.slave3.length=1
modbus:serial.slave3.type=discrete

modbus:serial.slave4.connection=ttyUSB0:9600:8:none:1:rtu
modbus:serial.slave4.id=1
modbus:serial.slave4.start=48
modbus:serial.slave4.length=1
modbus:serial.slave4.type=discrete

конфиг Openhab


items


Number    Temp_TEST    "Temperature [%d °C]"    { modbaus="slave1:0" }

переменная в Flprog



reg:0   integer
где ошибка
Последний раз редактировалось keeper1978 23.04.2016{, 01:18}, всего редактировалось 1 раз.

XENOMAN
Рядовой
Сообщения: 33
Зарегистрирован: 05.10.2015{, 18:03}
Репутация: 2

передача данных по сети

#6

Сообщение XENOMAN » 23.04.2016{, 07:48}

У Вас тип переменной в конфиге OpenHab - discrete - , он предназначен для передачи значений 1/0(вкл/выкл) в режиме чтение/запись. А ардуино передает температуру, тут надо использовать - input - register, он предназначен для передачи переменных(числовых значений) в режиме только чтение. + ещё пара синтаксических ошибок.
Не уверен насчет COM портов в linuxe, но вроде правильно будет /dev/ttyUSB0.


СпойлерПоказать
конфиг Openhab


modbus(двоеточие)poll=1000

modbus:serial.slave1.connection=/dev/ttyUSB0:9600:8:none:1:rtu
modbus:serial.slave1.id=1
modbus:serial.slave1.start=0
modbus:serial.slave1.length=1
modbus:serial.slave1.type=input

конфиг Openhab

items


Number    Temp_TEST    "Temperature [%d °C]"    {modbus="slave1:0"}
p.s. Для Input и Holding регистров адреса пишутся как есть, т.е. переменная с индексом 1 в конфиге так же будет иметь индекс 1. А не 16 как в случае с Discrete или Coil.

p.p.s. В параметр modbus:poll=1000 вставляется смайлик, правильно modbus(двоеточие)poll=1000, 1000 - это частота опроса слейвов в мс, как правило 1 раз в секунду более чем достаточно, особенно учитывая то, что при изменении статуса item'а запрос отправляется "вне очереди".
Последний раз редактировалось XENOMAN 23.04.2016{, 07:56}, всего редактировалось 1 раз.

keeper1978
Сержант
Сообщения: 128
Зарегистрирован: 26.09.2015{, 19:57}
Репутация: 2

передача данных по сети

#7

Сообщение keeper1978 » 23.04.2016{, 14:23}

а есть какие нибуть визуальные веб утилиты для работы с modbus
хочу проверить данные которые приходят на порт
у меня чего то все равно не заводится опенхаб
хотя в винде в MasterOPC Universal Modbus Server данные без проблем получал

Добавлено (23.04.2016, 14:23)
---------------------------------------------
На винде Опенхаб завелся с пол пинка
но возник вопрос как передать boolean переменную
её ведь нет в переменных модбаса

XENOMAN
Рядовой
Сообщения: 33
Зарегистрирован: 05.10.2015{, 18:03}
Репутация: 2

передача данных по сети

#8

Сообщение XENOMAN » 23.04.2016{, 15:35}

Передавайте как INT, а в OpenHub принимайте как Discrete или Coil. Не забывайте про особенности адресации таких переменных.

keeper1978
Сержант
Сообщения: 128
Зарегистрирован: 26.09.2015{, 19:57}
Репутация: 2

передача данных по сети

#9

Сообщение keeper1978 » 23.04.2016{, 20:13}

Что то я никак не могу разобратся с записью переменной


СпойлерПоказать
modbus:serial.slave1.connection=COM14:9600:8:none:1:rtu
modbus:serial.slave1.id=1
modbus:serial.slave1.start=112
modbus:serial.slave1.length=112
modbus:serial.slave1.type=coilИзображение
или так
СпойлерПоказать
Изображение

modbus:serial.slave1.connection=COM14:9600:8:none:1:rtu
modbus:serial.slave1.id=1
modbus:serial.slave1.start=7
modbus:serial.slave1.length=7
modbus:serial.slave1.type=holding

Изображение
никак не получается записать
Последний раз редактировалось keeper1978 23.04.2016{, 23:41}, всего редактировалось 1 раз.

XENOMAN
Рядовой
Сообщения: 33
Зарегистрирован: 05.10.2015{, 18:03}
Репутация: 2

передача данных по сети

#10

Сообщение XENOMAN » 24.04.2016{, 18:53}

Первый вариант ближе к истине, НО
Одна переменная это 16 бит.

Нулевой тэг, от 0 до 15, 1 тэг 16-31, 2 тэг 32-47, 3 тэг 48-63, 4 тэг 64-79, 5 тэг 80-95, 6 тэг 96-111, 7 тэг 112-128 и т.д.

Но при этом сам седьмой тег так-же включает в себя 16 бит.

Т.е. в опенхабе код будет иметь вид:



Код: Выделить всё

modbus:serial.slave1.connection=COM14:9600:8:none:1:rtu
modbus:serial.slave1.id=1
modbus:serial.slave1.start=112
modbus:serial.slave1.length=1
modbus:serial.slave1.type=coil
А в Ардуинке Вам нужно будет считать Первый бит этого тэга.

Изображение

ЕМНИП, то же самое можно сделать и без считывания первого бита, просто подавая переменную на переключатель. При условии что один тег несет одну переменную.

P.S. Надеюсь Вы обратили внимание, что каждая последующая переменная в ОпенХабе меняет название.


СпойлерПоказать
Первая переменная:


Код: Выделить всё

modbus:serial.slave1.connection=COM14:9600:8:none:1:rtu
modbus:serial.slave1.id=1
modbus:serial.slave1.start=0
modbus:serial.slave1.length=1
modbus:serial.slave1.type=coil
Вторая


Код: Выделить всё

modbus:serial.slave2.connection=COM14:9600:8:none:1:rtu
modbus:serial.slave2.id=1
modbus:serial.slave2.start=16
modbus:serial.slave2.length=1
modbus:serial.slave2.type=coil
Третья


Код: Выделить всё

modbus:serial.slave3.connection=COM14:9600:8:none:1:rtu
modbus:serial.slave3.id=1
modbus:serial.slave3.start=32
modbus:serial.slave3.length=1
modbus:serial.slave3.type=coil
Последний раз редактировалось XENOMAN 24.04.2016{, 19:01}, всего редактировалось 1 раз.

alex2485as
Рядовой
Сообщения: 8
Зарегистрирован: 27.12.2015{, 15:25}
Репутация: 1
Откуда: Армавир

передача данных по сети

#11

Сообщение alex2485as » 14.05.2016{, 14:01}

простите что не в тему , а кто нибудь имеет опыт работы в делфи + FLProg ?
нужна помощь...

Ответить

Вернуться в «Протоколы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей