Соединить железо и софт по rs485

Sadd
Offline
Зарегистрирован: 26.04.2016

Здравствуйте, подключаю счетчик к компьютеру. В наличии конвертер rs485 и ардуино мега 2560.
Подключение:
Gnd------------------------> Gnd
DI -> pin11
Счётчик -> А конвертер DE-> pin12 ардуино->com порт PC
-> B RE-> pin12
RO->pin10
Vcc------------------------->5V
Программа должна общаться с счетчиком
исправьте пожалуйста скетч, или направьте в нужное русло, спасибо.
 
#include
#define SerialRxTxControl 12
#define RS485Transmit    HIGH
#define RS485Receive     LOW 
SoftwareSerial RS485(10, 11); // RX, TX

void setup(void) {
  Serial.begin(9600);
  RS485.begin(9600);
  pinMode(SerialRxTxControl, OUTPUT); 
}

void loop() {    
digitalWrite(SerialRxTxControl, RS485Transmit);  режим передачи в rs485
  if (Serial.available()) {RS485.write(Serial.read() );} //если есть данные со стороны софта читаем данные с порта и пишем в rs485

digitalWrite(SerialRxTxControl, RS485Receive); режим приема с rs485
  if (RS485.available()) {Serial.write(RS485.read() );}} // если есть данные со стороны железа читаем данные с rs485 и пишем в порт

  

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015
Sadd
Offline
Зарегистрирован: 26.04.2016

Один из первых уроков которые я реализовал, но мою задачу они не выполнили, между собой данные отправляют, а соединить счётчик и его программное обеспечение не получилось "ведомый не отвечает" - сообщение приложения.

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

RS485 не может одновременно передавать и принимать, в этом его отличие от RS232 или от просто Serial. 

Он может передавать и принимать пакеты данных по-очереди. Передали весь пакет целиком, переключились на прием и слушаете, не прошел ли ответный пакет. А если все время его дергать прием-передача, то он не то что пакет, он ни одного байта не сможет принять: только начнет принимать, вы его тут же на передачу переключаете.

Sadd
Offline
Зарегистрирован: 26.04.2016

(RS485.available()>0)
(Serial.available()>0)
Так нужно?

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Цитата:

Ученые решили доказать, что обезьяны обладают разумом. Поставили эксперимент: высоко на дереве повесили банан, а вокруг разбросали деревянные ящики и палки. Запустили обезьяну. Она увидела банан и стала прыгать, пытаясь его достать. Ничего не получалось.
Ученые говорят:
- Думай, Микки, думай!
Обезьяна стала трясти дерево.
- Думай, Микки, думай!
Обезьяна стала пробовать сбить банан палкой, по они оказались короткими.
- Думай, Микки, думай!
Тогда обезьяна начала ставить ящики друг на друга и самой длинной палкой наконец сбила банан.
Оппоненты стали заявлять, что это рефлекс, а не разум. Решили позвать водопроводчика дядю Васю и повторить эксперимент. Он зашел, увидел банан и стал прыгать.
- Думай Вася, думай!
Тогда Вася стал трясти дерево.
- Думай Вася, думай!
Но Вася продолжал трясти дерево:
- Не хрен здесь думать! Трясти надо!

Трясите...

Sadd
Offline
Зарегистрирован: 26.04.2016

Спасибо, не поленились же вы такой большой ответ составить на мой маленький вопрос, а пример по теме или ссылку на реализацию отличную от урока 26 забыли, скиньте пожалуйста.

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Еще трясите...

Sadd
Offline
Зарегистрирован: 26.04.2016

Я вас понял. Спасибо.

Sadd
Offline
Зарегистрирован: 26.04.2016

Кто нибудь на этом форуме что нибудь предложит по теме вопроса?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А Вы перечитайте тему. Вдруг окажется, что уже предложили.

Sadd
Offline
Зарегистрирован: 26.04.2016

Спасибо. Надеюсь 3 оратор поможет.

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Что принимает последовательный порт RS485, когда "конвертер RS485" настроен на передачу? "Думай, Вася, думай!" (с)

 

Sadd
Offline
Зарегистрирован: 26.04.2016

Если Тх то слушает, если Rx то читает данные которые в свою очередь от другого приемопередатчика.

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Sadd пишет:
Если Тх то слушает, если Rx то читает данные которые в свою очередь от другого приемопередатчика.

Всякий UART (в том числе UART используемый для RS485) состоит из трех частей: бодового генератора, приемника и передатчика. Вот вы переключили ваш "конвертер RS485" на передачу, передатчик UART через него передает один или несколько байт данных на линию RS485. Что в это время принимает приемник UART?

Не тот, который на другом конце линии RS485, а приемник того же UART-а, у которого сейчас работает передатчик. 

Sadd
Offline
Зарегистрирован: 26.04.2016

Получается ни чего так как rs485 полудуплексный и не может передовать и принимать одновременно, в отличии от uart

Sadd
Offline
Зарегистрирован: 26.04.2016

А приёмник получает то что прислал передатчик

Sadd
Offline
Зарегистрирован: 26.04.2016

Запутался приёмник и передатчик имеется в виду это два разных устройства, первый в режиме TX а второй Rx. Так?

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Sadd пишет:
Получается ни чего так как rs485 полудуплексный и не может передовать и принимать одновременно

А вам об этом было сказано черным по белому.

Sadd
Offline
Зарегистрирован: 26.04.2016

Я это знал, в скетче:если данные есть на отправку конвертер в режим передачи, если появились на приём то в режим приёма, я знаю что в скетче что не так.

Sadd
Offline
Зарегистрирован: 26.04.2016

Только не пойму что

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Выкиньте вы этот скетч, он никогда работать не будет. Потому что вы трясете, вместо того чтобы думать.

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Еще вопрос: что будет, если два устройства на шине RS485 одновременно включат свои передатчики и начнут передавать данные? "Думай, Вася, думай!" (с)

Sadd
Offline
Зарегистрирован: 26.04.2016

Ни кто ни чего не получит

Sadd
Offline
Зарегистрирован: 26.04.2016

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

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

Тебе пытаются сказать, что ты всё время должен слушать линию и пытаться принять данные. Переключать на передачу нужно только тогда, когда есть что передать. 10 строка в сетапе лишняя. 

Sadd
Offline
Зарегистрирован: 26.04.2016

Понял, спасибо, кроме того что не переводить преобразователь в режим передачи, какие ещё замечания?

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Sadd пишет:
Ни кто ни чего не получит

Проблема не в этом. Проблема в том, что будет с двумя передатчиками, которые стараются пересилить друг друга. Это будет коллизия, хуже чем короткое замыкание. Никто ничего не получит, и передатчики останутся живы - они на это расчитаны. Но в питании передатчиков будут броски тока, от которых микроконтроллер может уйти в сброс.

Поэтому ситуации, когда два передатчика могут начать работу одновременно, в RS485 допускать нельзя. Значит, нельзя включать передатчик когда захочется. Его можно включать только тогда, когда все другие передатчики гарантированно выключены.

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

Ерунда всё это. Передатчики - ключи терминальное сопротивление коротят. Хоть 10 в параллель поставь ничего не будет. Никаких бросков тока. Вот коллизии это проблема. Поэтому нормальные посылки контрольной суммой проверяют.

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

nik182 пишет:

Ерунда всё это. Передатчики - ключи терминальное сопротивление коротят. Хоть 10 в параллель поставь ничего не будет. Никаких бросков тока. Вот коллизии это проблема.

Какие вы странные вещи говорите, просто  не от мира сего. Посмотрите как устроен порт ввода-вывода в приемопередатчике RS485:

Слева - пушпульный каскад передатчика. Каким местом он "коротит терминальное сопротивление"?

Когда два таких каскада работают на линию одновременно и в противофазе, то открытый верхний транзистор одного передатчика тянет линию вверх, а открытый нижний транзистор другого передатчика - тянет ее вниз. И никакие терминаторы в этом не участвуют. 

Образуется сквозной ток короткого замыкания, который берется от источника, питающего передатчик с открытым верхним транзистором. Приемопередатчики RS485 сделаны так, что величина этого тока ограничена на уровне не более 250 мА. Вот такой дополнительный ток обязан обеспечивать источник питания, чтобы система не накрывалась медным тазом при коллизиях. 

 

Sadd
Offline
Зарегистрирован: 26.04.2016

nik182 пишет:

Тебе пытаются сказать, что ты всё время должен слушать линию и пытаться принять данные. Переключать на передачу нужно только тогда, когда есть что передать. 10 строка в сетапе лишняя. 


По схеме к конвертуру счётчик, конвертер к ардуино, ардуино к компьютеру(виртуальный com), com порт к программе. Изначально задача организовать радиоудлинитель интерфейса RS485. И соединить удалённо железо и по. Может я не правильно думаю, что в начале работы программа спрашивает счётчик, т.е. данные появились на отправку, ардуино должен отправить их счётчику, чтобы тот ответил, есть данные с счетчика, ардуино отправляет обратно в com программе. Я ориентировался на урок 26, там вместо счётчика клавиатура, а вместо программы дисплей. Что не так я делаю, подскажите пожалуйста?

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Sadd пишет:
Я ориентировался на урок 26, там вместо счётчика клавиатура, а вместо программы дисплей.

Там клавиатура вообще не слушает RS485. Нажали на кнопку - отправили символ, это все. "Чукча не читатель, чукча писатель"(с)  Пример гнилой, но если кнопки на разных клавиатурах не нажимать одновременно, то кое-как работать будет.  Но только если линия связи короткая, помех мало, а на линии RS485 стоят резисторы подтяжки на +5 и на землю.

Вы же собираетесь от программы посылать запрос Ардуино, а в ответ Ардуино должна посылать данные. Этот запрос надо сформировать в виде сообщения (т.е. пакета байт), защитить контрольной суммой или CRC, снабдить какими-то признаками начала и окончания сообщения. Ардуино должна обнаруживать начало сообщения, принимать сообщение в буфер, по окончании сообщения проверять контрольную сумму или CRC, и, если все в порядке, формировать ответное сообщение, со всеми перечисленными причиндалами.

Sadd пишет:
Что не так я делаю, подскажите пожалуйста?

Вы взялись за задачу, которая вам непосильна.  Вы же элементарных вещей не знаете. Не способны даже понять, почему "урок 26" не ложится на вашу задачу. Наверняка вы вообще ничего не поняли из того, что  я выше написал.

Нафиг вы вообще за RS485 схватились, вы можете объяснить?

Sadd
Offline
Зарегистрирован: 26.04.2016

Может и не понимаю, но хочу разобраться, если не rs485, то проще будет через rs232, у меня есть Adam, сконвектировать и работать с дуплексным сигналом, а вышеперечисленное я понял, в сети может быть множество ведомых, и чтобы они знали что для них это сообщение необходимо какой нибудь ID, а двумя пакетами начала и конца открывать и заканчивать передачу данных, контрольная сумма для целостности данных чтобы ни потерять какой-то пакет данных, вот про то что ардуино должна при нимать и писать в свой буфер я не знаю как это программно делается, может библиотека modbas RTU мне поможет сделать проще без заморочек и я не наделаю кучу ошибок т. к. за меня уже все написано. Как думаете? Дайте ссылку на литературу и я пойму.

Sadd
Offline
Зарегистрирован: 26.04.2016

Спасибо

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Sadd пишет:
Может и не понимаю, но хочу разобраться, если не rs485, то проще будет через rs232,

Проще всего работать с полным дуплексом, RS232 или RS422.

RS422 на физическом уровне практически не отличается от RS485. Просто у RS422 две витые пары, одна от компа к Ардуине, другая от Ардуины к компу. Можно использовать те же самые модули RS485, которые вы сейчас используете, только их понадобится не 2, а 4. В каждой витой паре  один модуль все время включен на прием, другой - на передачу.

Sadd
Offline
Зарегистрирован: 26.04.2016

Понял спасибо, только получается у счётчика должен быть RS422, если его нет то нужен конвертер с RS485 в RS422, или как у меня ADAM RS485 в RS232. Получается я с ADAMA к примеру беру 3 контакта, Rx, Tx и GND и сожаю их на выбранные пин из библиотеки softserial, преобразователя rs232 to ttl не потребуется верно?

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Sadd пишет:
Понял спасибо, только получается у счётчика должен быть RS422, если его нет то нужен конвертер с RS485 в RS422, или как у меня ADAM RS485 в RS232. Получается я с ADAMA к примеру беру 3 контакта, Rx, Tx и GND и сожаю их на выбранные пин из библиотеки softserial, преобразователя rs232 to ttl не потребуется верно?

"Конвертер с RS485 в RS422" не нужен. RS485 и RS422 совместимы. Приемопередатчик RS485 прекрасно работает в качестве передатчика  RS422. Приемоппередатчик RS485 прекрасно работает в качестве приемника RS422.

Разница в том, что у RS422 передатчик все время включен и приемник все время включен. Поэтому если приемопередатчик RS485 включить намертво на передачу - он будет передатчиком RS422. А если приемопередатчик RS485 включить намертво на прием - он будет приемником RS422.

Вы в каком классе учитесь, в пятом или в шестом?

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

triac пишет:

.....

Слева - пушпульный каскад передатчика. Каким местом он "коротит терминальное сопротивление"?

Когда два таких каскада работают на линию одновременно и в противофазе, то открытый верхний транзистор одного передатчика тянет линию вверх, а открытый нижний транзистор другого передатчика - тянет ее вниз. И никакие терминаторы в этом не участвуют. 

Вы бы целиком привеливыходной каскад, со всеми элементами защит. У большинства м.с. RS-485 стоят ограничители выходного тока на уровне 250 ма и в описанной вами ситуации ток КЗ не будет больше этой величины. Никаких физических последствий не будет. Только фатальная потеря данных. 

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

nik182 пишет:

 У большинства м.с. RS-485 стоят ограничители выходного тока на уровне 250 ма и в описанной вами ситуации ток КЗ не будет больше этой величины. Никаких физических последствий не будет. Только фатальная потеря данных. 

Что ж вы цитату обрезали? Там дальше было про 250 мА, вам не надо было "открывать Америку".

В очередной раз повторяю: эти 250 мА обязан выдать источник питания. Если он не способен выдать дополнительные 250 мА, то питание просядет и микроконтроллер сбросится. Теперь дошло? Или еще надо повторить?

Слава богу хотя бы про "коротит терминальное сопротивление" на этот раз от вас не слышно.

Sadd
Offline
Зарегистрирован: 26.04.2016

Спасибо, я просто не узнавал ещё про RS422 поэтому и не знаю его отличий от других интерфейсов. В 9 классе.