ModBUS

eyatsko
Offline
Зарегистрирован: 02.09.2015

Добрый день!

Думаю, не я первый, не я последний. Мне тут потребовалось собрать некий PLC, работающий по ModBUS RTU (RS-485), в режиме Slave, который читал бы несколько аналоговых входов, и при опросе Мастером, выдавал бы их значения ему. Я понял, при беглом ознакомлении с ATMega - там всего 6 аналоговых канало (10 бит каждый) - можно ли на каких-то контроллерах больше?

P. s. Просьба сильно не "пинать" новичка. :-)

С уважением,

Эллад

 

Radjah
Offline
Зарегистрирован: 06.08.2014

На меге 2560 их 16 штук.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

На Uno - 6, на Nano - 8, на Mega - 16, а сколько надо?

eyatsko пишет:

P. s. Просьба сильно не "пинать" новичка. :-)

Будем пинать! Учитесь вопросы задавать! Что не устраивает - количество или разрадность? Сколько надо?

eyatsko
Offline
Зарегистрирован: 02.09.2015

-> Radjah: А Мега поддерживается софтом программирования?

-> Евгений П: 32 хотелось бы. Разрядность - устраивает.

Меня больше сейчас волнует, как сделать так, чтобы в схемотехническом плане таже упомянутая МЕГА была связана с сетью RS485. Программой я уже добьюсь, чтобы устройство передавало и реагировало сообщения ModBUS.

Я поясню - это надо для нашего ЦОДа, чтобы в Заббикс ввести значения токов и напряжений на вводе в КАЖДУЮ 19" СТОЙКУ. Я пока не придумал, как я буду это получать с выхода автомата (в шкафу, видимо, удобнее всего будет) - наверное, трансформатор, выпрямитель и как-то "смасштабировать" на операционнике - по типу токовых клещей.

А вот как состыковать Мегу с сетью RS-485 на сигнальном уровне - для меня пока "темный лес".

 

nevkon
Offline
Зарегистрирован: 20.01.2015

Взять одну Мегу и дополнить внешними АЦП, благо цифровых пинов хватает. Софтом Arduino IDE поддерживается "из коробки". Модельки внешних АЦП не подскажу - может кто-нибудь другой...

eyatsko
Offline
Зарегистрирован: 02.09.2015

Простите, но ничего не понял.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

eyatsko пишет:

Простите, но ничего не понял.

Нет таких Ардуин, чтоб было 32 канала АЦП. Даже в старших моделях STM32 (ARM Cortex-M) максимум 24 канала АЦП. Поэтому Вам советуют совместно с Ардуиной применять отдельные специализиорованные микросхемы АЦП. Более конкретно не подскажу, т.к. не приходилось с этой темой сталкиваться.

eyatsko
Offline
Зарегистрирован: 02.09.2015

Ясно. Но главный вопрос  все-таки как его включить в сеть RS-485 "электрически".. Пусть будет несколько "Ардуин". Не суть важно.

Radjah
Offline
Зарегистрирован: 06.08.2014

MAX485 использовать можно.

alex_r61
Offline
Зарегистрирован: 20.06.2012

eyatsko пишет:

Ясно. Но главный вопрос  все-таки как его включить в сеть RS-485 "электрически".. Пусть будет несколько "Ардуин". Не суть важно.

Электрически:

 

 

 

 

 

 

 

 

 

 

Если нужен более точный внешний АЦП, например

http://ru.aliexpress.com/item/J34-Free-Shipping-ADS1115-Module-I2C-16-Bi...

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

У ATmega32u4 ака Ардуино Леонардо  и Микро 12 аналоговых входов. Ну и у Меги 16.

eyatsko
Offline
Зарегистрирован: 02.09.2015
KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Вполне, это и есть MAX485 с обвесом

eyatsko
Offline
Зарегистрирован: 02.09.2015

Только, как я понимаю, его придется рядом монтировать,так как его "разножка" не совпадает с "ногами" самой Меги?..

alex_r61
Offline
Зарегистрирован: 20.06.2012

Есть и такие:

http://ru.aliexpress.com/wholesale?shipCountry=ru&shipFromCountry=&shipC...

Только цены озверевшие.

4ishops
Offline
Зарегистрирован: 06.10.2012

Берете MAX485, подключаете RX/TX и все работает

 

Alekssey
Offline
Зарегистрирован: 19.12.2015

Товарищи, утро доброе!

Помогите разобраться. Хочу вникнуть в работу нескольких Arduino по Modbus RTU. Имеется Arduino UNO прошитая как "Slave", могу ли я опросить её цифровой вход (допустим D12) с компа работающего как "Master"  через монитор последовательного порта софта ардуины? В каком виде я должен отправить запрос? Или без  этого преобразователя не обойтись?s-l1600.jpg

Ravil-ag
Offline
Зарегистрирован: 02.01.2016

Alekssey этот преобразователь для Arduino UNO не нужен, так как в этой модификации ардуино всего один UART порт и он уже задействован через свой преобразователь на USB платы. 

Опрос Modbus RTU Slave возможно с Modbus RTU Master. Для этого берем любой Modbus OPC сервер, например Lectus Modbus OPC/DDE сервер, настраиваем и опрашиваем. 

nik182
Offline
Зарегистрирован: 04.05.2015

Отладку одного слейва действительно можно проводить прямо через родной USB. Когда слейвов несколько приведенный преобразователь нужен для мастера-компьютера, а для слейвов ардуин нужен преобразователь TTL - 485 типа такого:

http://www.aliexpress.com/item-img/MAX485-Module-RS-485-TTL-to-RS485-MAX485CSA-Converter-Module-For-Arduino-Integrated-Circuits-Products/32295998063.html?spm=2114.10010208.100005.20.1UasnI

он подключается к 0,1 ноге и отлично работает паралельно со штатным преобразователем TTL - USB, к которому в этом случае подключать USB кабель бесполезно.   

eyatsko
Offline
Зарегистрирован: 02.09.2015

Извините, господа, за долгое молчание. Но я взял в Амперке шилд RS-485 и полностью реализовал протокол. :-)

Все уже несколько месяцев работает.

eyatsko
Offline
Зарегистрирован: 02.09.2015

Тему можно закрыть. Если кому-то нужна моя реализация, пишите, вышлю.

4ishops
Offline
Зарегистрирован: 06.10.2012

eyatsko пишет:

Тему можно закрыть. Если кому-то нужна моя реализация, пишите, вышлю.

 

здесь не хотите опубликовать наработки?

Radjah
Offline
Зарегистрирован: 06.08.2014

tgs
Offline
Зарегистрирован: 21.04.2016

я хотел бы посмотреть на вашу реализацию modbus протокола. Если можно скиньте на електронку tgs2611@ukr.net. Зарание спасибо.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Если приёмник требуемых сигналов имеет ModbusTCP, то забудьте про RS-485 - доканает его пауза синхронизации в 0.3с. Да и сам пакет ModbusTCP намного проще и удобнее. По крайней мере, считать CRC не придётся. :) Хотя, может быть, есть уже и готовые библиотеки для Modbus RTU... Я сам курил... :)

djdance
Offline
Зарегистрирован: 08.06.2016

Не пинайте чайника.

 

А почему нельзя подключить провода из устройства на Modbus RTU прямо к RX/TX ардуины (или GPIO любого другого девайса)? Почему нужен именно rs485 посредник? Всё равно ж софт писать, поскольку 485 не контроллер модбаса. Или чего не понимаю?

 

nik182
Offline
Зарегистрирован: 04.05.2015

Почему нельзя? Можно конечно! Нужно только, что бы  устройства на Modbus RTU выдавала TTL RX TX. Например другая ардуина. У меня так замечательно общаются две наны. Нужен именно rs485 посредник, если устройство выдаёт rs485 и его надо конвертировать в RX TX ардуины. 

djdance
Offline
Зарегистрирован: 08.06.2016

А. ДОшло, спасибо :)

Тогда последнее. А есть чем отладить модбас ИЗ ардуины в отсутствие реальной железки? а то пока из-за бугра приедет JBUS-железка, я тут заскучаю. Правильно ли я понимаю, что на одном конце ставим ардуину с 485, далее - RS485-USB-converter в компьютер, и запускаем софт типа http://www.mikont.com/products/mbregistrator.html или http://www.modbustools.com/download.html ?

eyatsko
Offline
Зарегистрирован: 02.09.2015

Добрый вечер!

У меня реализация была такой - Mega была подцеплена по USB к компьютеру (COM-порт 232), на ней стоял шилд 485, от него шли линии  к 485-ой сети. С Linux  я опрашивал Mega, передавал запрос в формате ModBUS, потом в течение установленного стандартом таймаута ожидал ответа. Если ответ приходил - декодировал его "вдоль по стандарту", либо сообщал "вышестоящему" софту о таймауте ожидания отклика от устройства.

232 от 485 отличается уровнями сигналов, которые шилд и согласует. Насколько я помню - 232 униполярный, дуплексный (линия приема от удаленного устройства, линия передачи на удаленное устройство и земля), 485 - это всего две линии, по которым передается либо 0, либо какой-то уровень, соответствующий логической "1". Причем по линии А - это положительный уровень, по линии В - отрицательный. Так что без шилда никак. :-) Причем передача в каждый момент времени либо от мастера ModBUS к слейвам, либо обратно. Но никак не одновременно.

Арудиона имеет "врожденное" ограничение на скорость - 38400. Никаких там 115200. Это накладывает ограничение на число устрйоств (либо на размер сообщений, либо на то и на другое). Поэтому я отошел от этой реализации и ушел в SNMP (Ethernet-shield).

Эллад

 

djdance
Offline
Зарегистрирован: 08.06.2016

eyatsko,

а почему вы не с USB компьютера сразу в 485 слали (через соответствующий конвертер конечно), зачем мега?

или, переформулирую, а если бы вам на том конце ничего не дали, чем бы модбас-железку эмулировали? (вторая мега эт перебор)

vde69
Offline
Зарегистрирован: 10.01.2016

я себе написал отладчик https://github.com/vde69/A_House

а в ардуинке сделал эхо в USB

uint8_t BusRS485::Read(){
  uint8_t a; 
  a = port->read();
  if (this->Echo == 1) { port->write(a); }
  return a; 
}

 

djdance
Offline
Зарегистрирован: 08.06.2016

vde69, пойдет! хотя и аскетичненько :)

 

Alekssey
Offline
Зарегистрирован: 19.12.2015

Всем привет!
Ранее, возможно, я не очень ясно описал задачу)
Вобщем прошло уже достаточно времени чтобы найти ответы на основные вопросы. Схема такая: ПК>USB to RS485>RS485 to ttl>arduino, после модуля usb to rs в парралель предпологалось включить еще несколько ардуин через rs to ttl. Каждая ардуина подключена к своей группе датчиков и по команде с пк опрашивает их и передает данные обратно в пк.Сейчас работаю над алгоритмом поочередного опроса ардуин. Софт на пк пишу в visualstudio.

eyatsko
Offline
Зарегистрирован: 02.09.2015

"На той стороне" у меня был Bolid. :-) Можно, в принципе и как вы предлагаете, но у меня была другая задача.

nik182
Offline
Зарегистрирован: 04.05.2015

eyatsko пишет:

Арудиона имеет "врожденное" ограничение на скорость - 38400. Никаких там 115200. Это накладывает ограничение на число устрйоств (либо на размер сообщений, либо на то и на другое).

Может быть у меня неправильная Ардуина? Почему к меня всё бегает на 115200? По цепи PC-USB-RS485-RS485-TTL-Arduino. Пересылает массив 100 слов. Сервер написан на Delphi. Как Это может накладывать ограничение на число устройств, если только сервер имеет право задавать транзакции и устройства сами не занимают шину? Можно предположить, что вам надо опрашивать устройства очень часто. Тогда да, есть проблемы, но это не проблемы модбаса. 

Самый лучший бесплатный софт QModBus. Единственный недостаток - не умеет работать с ком портами с номером больше 9. Можно посылать запросы и видеть что отвечает ардуина. Это только сервер.

Maximus
Offline
Зарегистрирован: 24.07.2015

Вышли пожалуйста реализацию мастера и слейва в коде. заранее спасибо! leonoffmaxim@yandex.ru

Andrey053
Offline
Зарегистрирован: 08.10.2018

eyatsko пишет:

Тему можно закрыть. Если кому-то нужна моя реализация, пишите, вышлю.

Здравствуйте, хочу сделать что-то похожее на Ваш проект, не могли бы Вы поделиться кодом ?

Andrey053@gmail.com

Спасибо
 

ik01
Offline
Зарегистрирован: 04.03.2019

Молодец автор ,  не просто создал, но и разобрался  как это работает!

Я так не могу, по этому прошу , поделись  кодом с ближним : OxFFFFAA@mail.ru ( первая анг.буква О )

Заранее благодарю.