UART и RS485

Использование протокола Modbus
Ответить
adishis
Рядовой
Сообщения: 8
Зарегистрирован: 14.09.2015{, 15:35}
Репутация: 0

UART и RS485

#1

Сообщение adishis » 03.03.2017{, 12:44}

Здравствуйте.
Вот такая проблема образовалась. необходимо снять данные с монитора электроэнергии по UART и отвечать по RS485 Modbus.
В программе FLProg создаю RS485 Slave с переменными, так же подключаю пользовательскую библиотеку для связи и чтению данных с энергомонитора PZEM004 (UART).
В этой связке Master RS485 не видит Слейва, а Чтение данных по UART работает без проблем. Если отключаю библиотеку чтения данных по UART, то Modbus начинает работать.
Пробовал переключать входа и 485 и UART. в общем транслит из одного протокола в другой не работает. Может кто может помочь разобраться?
FLProg 2.3.2
Arduino ProMini 328 5v 16MHz
Библиотека - http://flprog.ru/load....1-0-184

starshoy81
Лейтенант
Сообщения: 510
Зарегистрирован: 05.04.2016{, 23:30}
Репутация: 29
Откуда: Санкт-Петербург
Имя: Илья

UART и RS485

#2

Сообщение starshoy81 » 03.03.2017{, 15:08}

adishis, смотрите какие интерфейсы куда подключены. скорее всего модбас и блок pzem сидят на одном уарте. А вообще без проекта можно долго гадать на пальцах.

Аватара пользователя
Sancho
Полковник
Сообщения: 3991
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 567
Откуда: Ярославль.
Имя: Александр
Контактная информация:

UART и RS485

#3

Сообщение Sancho » 03.03.2017{, 15:28}

ВЫ используете один и тот-же serial port?
Откуда Вы знаете, что
adishis писал(а):а Чтение данных по UART работает без проблем.
, когда
adishis писал(а):Master RS485 не видит Слейва
starshoy81 писал(а):А вообще без проекта можно долго гадать на пальцах
+1
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

adishis
Рядовой
Сообщения: 8
Зарегистрирован: 14.09.2015{, 15:35}
Репутация: 0

UART и RS485

#4

Сообщение adishis » 03.03.2017{, 16:44}

Порт используется разный, UART программный на 10 и 11 ноге, 485 аппаратный на 0 и 1 ноге.
когда 485 перевожу на программный порт (например на 2 и 3 ноге), то при компиляции ругается -

"Несколько библиотек найдено для "SoftwareSerial.h"
 Используется: c:\Users\Администратор\Desktop\FLProg-2_3_2_Portable\ideV1\hardware\arduino\avr\libraries\SoftwareSerial
Не используется: c:\Users\Администратор\Desktop\FLProg-2_3_2_Portable\ideV1\libraries\pzem
exit status 1
Ошибка компиляции для платы Arduino Pro or Pro Mini."

удаляя строку #include<SoftwareSerial.h> , скеч компилируется без ошибок.
Вложения
MyProgPZEM004_M.flp
(156.8 КБ) 44 скачивания

starshoy81
Лейтенант
Сообщения: 510
Зарегистрирован: 05.04.2016{, 23:30}
Репутация: 29
Откуда: Санкт-Петербург
Имя: Илья

UART и RS485

#5

Сообщение starshoy81 » 03.03.2017{, 18:06}

adishis писал(а):удаляя строку #include<SoftwareSerial.h> , скеч компилируется без ошибок.
то есть Вы вообще удаляете связь по софтсериал?

А без дисплея не пробовали?
adishis писал(а):В этой связке Master RS485 не видит Слейва, а Чтение данных по UART работает без проблем. Если отключаю библиотеку чтения данных по UART, то Modbus начинает работать.
А это как проверяли?

adishis
Рядовой
Сообщения: 8
Зарегистрирован: 14.09.2015{, 15:35}
Репутация: 0

UART и RS485

#6

Сообщение adishis » 03.03.2017{, 19:32}

Без дисплея, просто принять данные по UART и отправить по 485 все равно ругается, та же самая ошибка

"Несколько библиотек найдено для "SoftwareSerial.h"
 Используется: c:\Users\Администратор\Desktop\FLProg-2_3_2_Portable\ideV1\hardware\arduino\avr\libraries\SoftwareSerial
Не используется: c:\Users\Администратор\Desktop\FLProg-2_3_2_Portable\ideV1\libraries\pzem
exit status 1
Ошибка компиляции для платы Arduino Pro or Pro Mini."

Дело в том наверное, что блок обработки PZEM004T уже в себе содержит вызов библиотеки SoftwareSerial. 
starshoy81 писал(а):Цитата adishis ()В этой связке Master RS485 не видит Слейва, а Чтение данных по UART работает без проблем. Если отключаю библиотеку чтения данных по UART, то Modbus начинает работать.
А это как проверяли?
Проверял у себя на столе. USB - 485 Moxa Uport1150 и программа мастер modbus на компе.
Заливаю скеч опрос данных по UART и на дисплей - работает
Заливаю скеч с переменными 485 (константы) - работает
а вот связка - не работает.

Пытался поочередно сначала считывать по UART а потом Обновлять данные в переменных 485 тоже не работает. (циклично 500мс - UART, 500мс - 485).

starshoy81
Лейтенант
Сообщения: 510
Зарегистрирован: 05.04.2016{, 23:30}
Репутация: 29
Откуда: Санкт-Петербург
Имя: Илья

UART и RS485

#7

Сообщение starshoy81 » 03.03.2017{, 19:40}

adishis, попробуйте не напрямую из блока передавать в модбас, а через запись в переменную. И эту переменную отправлять в модбас на другой плате.

adishis
Рядовой
Сообщения: 8
Зарегистрирован: 14.09.2015{, 15:35}
Репутация: 0

UART и RS485

#8

Сообщение adishis » 03.03.2017{, 20:04}

starshoy81 писал(а):adishis, попробуйте не напрямую из блока передавать в модбас, а через запись в переменную. И эту переменную отправлять в модбас на другой плате.
То есть две Ардуинки. Одна принимает данные другая отправляет по модбас. А как между двумя Ардуинками передать данные без интерфейсной связи? я думаю, что блок  PZEM004 не даст интерфейсной связи нормально работать. (если не брать конечно типа I2C или что то не связанное с Serial)
Или разбираться с библиотекой PZEM004, или написать поновой (этого никогда не делал и буду долго писать)

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

UART и RS485

#9

Сообщение Boroda » 03.03.2017{, 20:21}

В блоке (PZEM004T/Энергомонитор) в секции Setup уберите строчку Serial.begin(9600). Получается, что ваш блок запускает и софтварный, и хардварный юарт.
Последний раз редактировалось Boroda 03.03.2017{, 20:23}, всего редактировалось 1 раз.

starshoy81
Лейтенант
Сообщения: 510
Зарегистрирован: 05.04.2016{, 23:30}
Репутация: 29
Откуда: Санкт-Петербург
Имя: Илья

UART и RS485

#10

Сообщение starshoy81 » 03.03.2017{, 20:23}

adishis, Не-не, плата в программе. Первая плата считывание из энергомонитора и присвоение выхода V переменной, а вторая плата присвоение вышеобозначенной переменной тега модбас.

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

UART и RS485

#11

Сообщение Boroda » 03.03.2017{, 22:29}

Ээээээээ... в блоке в LoopSection объявлены переменные и они же стоят на выходе. Двойное декларирование.
Последний раз редактировалось Boroda 04.03.2017{, 00:56}, всего редактировалось 1 раз.

adishis
Рядовой
Сообщения: 8
Зарегистрирован: 14.09.2015{, 15:35}
Репутация: 0

UART и RS485

#12

Сообщение adishis » 03.03.2017{, 22:41}

starshoy81 писал(а):adishis, Не-не, плата в программе. Первая плата считывание из энергомонитора и присвоение выхода V переменной, а вторая плата присвоение вышеобозначенной переменной тега модбас
Пробовал так, не помогает

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

UART и RS485

#13

Сообщение Boroda » 03.03.2017{, 23:09}

Доработал блок, положил в блоки пользователя в 5м комментарии.

Добавлено (03.03.2017, 23:01)
---------------------------------------------
adishis, поменяйте адрес слейва на 2, обычно адрес 1 присваивается мастеру сети.

Добавлено (03.03.2017, 23:09)
---------------------------------------------
Убейте из папки C:\Program Files (x86)\Flprog\ideV1\libraries\pzem файлы SoftwareSerial, потому как в стандартных либах IDE они уже есть. У меня с модбасом и блоком ПЗЕМ все компилируется нормально.
Последний раз редактировалось Boroda 04.03.2017{, 00:56}, всего редактировалось 1 раз.

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

UART и RS485

#14

Сообщение Boroda » 03.03.2017{, 23:58}

adishis, чем опрашиваете Arduino?

У меня нет энергомонитора PZEM, тестирую систему с пустыми ногами. Результаты:

1. В файле PZEM004T.cpp есть строчка #define DEFAULT_READ_TIMEOUT 1000, это таймаут софтового UART, если данные от Pzem не пришли в течении секунды, то возвращается значение "-1". С подключенным энергомонитором данные возвращаются намного быстрее.

2. У меня Pzem отсутствует, поэтому софтовый UART на каждый запрос ждет 1 секунду и возвращает -1. Итого на опрос Pzema уходит 4 секунды (у Вас это происходит быстрее).

3. Опрашиваю ардуину скадой SIMP, по умолчанию ожидание ответа от слейва стоит 1000мс. У нас выходит 4 секунды, следовательно скада это воспринимает как ошибка TimeOut.

4. Уменьшил в PZEM004T.cpp параметр DEFAULT_READ_TIMEOUT до 500 (получилось 2 секунды на запрос 4х переменных) и увеличил в скаде таймаут ожидания до трех секунд. Скада увидела нули. Опрос Pzen идет как положено, смотрю логером.

5. Суть в чем: Если начался опрос Pzem и в этот момент поступил запрос по модбасу, пока не опросятся 4 параметра Pzem, модбас не отдаст данные скаде. Увеличивайте таймаут ответа в мастере, возможно этого времени не хватает на опрос энергомонитора.

6. Используйте блок, который я выложил выше.

П.С. Не включайте индикатор en=true, так он обновляется каждый цикл программы и пожирает драгоценное время, лучше сделать так: данные для вывода поменялись -> обновляем экран. Программа быстрее работать будет. Да и вообще все преобразования и экран лучше выносить на отдельную плату с условием. И запускать эту плату тогда, когда необходимо обновить инфу.

Вот программа.
Вложения
test_pzem.flp
(272.26 КБ) 45 скачиваний
Последний раз редактировалось Boroda 04.03.2017{, 00:59}, всего редактировалось 1 раз.

adishis
Рядовой
Сообщения: 8
Зарегистрирован: 14.09.2015{, 15:35}
Репутация: 0

UART и RS485

#15

Сообщение adishis » 06.03.2017{, 08:53}

Boroda писал(а):adishis, чем опрашиваете Arduino?У меня нет энергомонитора PZEM, тестирую систему с пустыми ногами. Результаты:

1. В файле PZEM004T.cpp есть строчка #define DEFAULT_READ_TIMEOUT 1000, это таймаут софтового UART, если данные от Pzem не пришли в течении секунды, то возвращается значение "-1". С подключенным энергомонитором данные возвращаются намного быстрее.

2. У меня Pzem отсутствует, поэтому софтовый UART на каждый запрос ждет 1 секунду и возвращает -1. Итого на опрос Pzema уходит 4 секунды (у Вас это происходит быстрее).

3. Опрашиваю ардуину скадой SIMP, по умолчанию ожидание ответа от слейва стоит 1000мс. У нас выходит 4 секунды, следовательно скада это воспринимает как ошибка TimeOut.

4. Уменьшил в PZEM004T.cpp параметр DEFAULT_READ_TIMEOUT до 500 (получилось 2 секунды на запрос 4х переменных) и увеличил в скаде таймаут ожидания до трех секунд. Скада увидела нули. Опрос Pzen идет как положено, смотрю логером.

5. Суть в чем: Если начался опрос Pzem и в этот момент поступил запрос по модбасу, пока не опросятся 4 параметра Pzem, модбас не отдаст данные скаде. Увеличивайте таймаут ответа в мастере, возможно этого времени не хватает на опрос энергомонитора.

6. Используйте блок, который я выложил выше.

П.С. Не включайте индикатор en=true, так он обновляется каждый цикл программы и пожирает драгоценное время, лучше сделать так: данные для вывода поменялись -> обновляем экран. Программа быстрее работать будет. Да и вообще все преобразования и экран лучше выносить на отдельную плату с условием. И запускать эту плату тогда, когда необходимо обновить инфу.

Вот программа.
Прикрепления: test_pzem.flp(272Kb)
Спасибо за ответы. В выходные не мог проверить. Тестовая программа компилируется без проблем.
Саму Ардуинку опрашиваю пока просто компьютером программой МБ TCP Железо Usb-485 (Moxa) . Железо PZEM так же есть в наличии. В дальнейшем хочу построить сеть ModbusRTU (Arduino) и в голове Мастером поставить S7-1200.  Железо PZEM так же есть в наличии. 
По программу:
У Вас не включен в настройках RTU - PIN PE-DE. При его включении (у меня  2 нога) (Или PIN PE-DE не обязательно подтягивать?) в компиляции появляется надпись #include SoftwareSerial опять.
Она тоже компилируется с этим включением. Если убрать вывод данных на дисплей, то уже компиляция не проходит.
Программа:

Добавлено (06.03.2017, 08:53)
---------------------------------------------
Boroda писал(а):5. Суть в чем: Если начался опрос Pzem и в этот момент поступил запрос по модбасу, пока не опросятся 4 параметра Pzem, модбас не отдаст данные скаде. Увеличивайте таймаут ответа в мастере, возможно этого времени не хватает на опрос энергомонитора.
Я так полагаю независимая работа подпрограмм не возможна.
Вложения
test_pzem_v2.0.flp
(195.38 КБ) 41 скачивание
Последний раз редактировалось adishis 06.03.2017{, 08:51}, всего редактировалось 1 раз.

starshoy81
Лейтенант
Сообщения: 510
Зарегистрирован: 05.04.2016{, 23:30}
Репутация: 29
Откуда: Санкт-Петербург
Имя: Илья

UART и RS485

#16

Сообщение starshoy81 » 06.03.2017{, 12:22}

adishis, на Моха преобразователе необязательно пин PEDE, там скорее всего автоматическое распознавание направления передачи данных.
adishis писал(а):Я так полагаю независимая работа подпрограмм не возможна.
Ну она псевдонезависимая за счет скорости прохождения циклов программы. А так, да, все выполняется последовательно. Поэтому пока не придут данные от пзема на запрос от модбаса ответа не будет.

adishis
Рядовой
Сообщения: 8
Зарегистрирован: 14.09.2015{, 15:35}
Репутация: 0

UART и RS485

#17

Сообщение adishis » 07.03.2017{, 08:23}

starshoy81 писал(а):adishis, на Моха преобразователе необязательно пин PEDE, там скорее всего автоматическое распознавание направления передачи данных.
Нет, на Мохе то нет, я имел ввиду на ардуиновском 485-м. (МАХ485)
starshoy81 писал(а):Ну она псевдонезависимая за счет скорости прохождения циклов программы. А так, да, все выполняется последовательно. Поэтому пока не придут данные от пзема на запрос от модбаса ответа не будет.
А почему не будет? если не успел считать от пзема пусть отдает старые данные по Модбас. Или все таки сам обмен, что аппаратный, что программный он последовательный, тоесть обмен сначала по UART - как закончит обмен , то если есть запрос по Модбас, отдаем данные по Модбас.

starshoy81
Лейтенант
Сообщения: 510
Зарегистрирован: 05.04.2016{, 23:30}
Репутация: 29
Откуда: Санкт-Петербург
Имя: Илья

UART и RS485

#18

Сообщение starshoy81 » 07.03.2017{, 09:09}

adishis, на мах485csa точно нужно включать, без него не работает.
Чтобы отдавать старые данные нужно их записывать в переменные, тогда они будут висеть в озу до обновления. Дело здесь в другом, проц занят опросом пзема и на другой запрос не реагирует. В блоке пзема, кстати, delay, не проставлена случайно? Это тоже может влиять на опросы проца.

adishis
Рядовой
Сообщения: 8
Зарегистрирован: 14.09.2015{, 15:35}
Репутация: 0

UART и RS485

#19

Сообщение adishis » 07.03.2017{, 09:45}

Boroda писал(а):Вот программа.Прикрепления: test_pzem.flp(272Kb)
Вот в этом примере просто не подключена PIN PE-DE в настройках Modbus в программе FlProg

igrik1972
Рядовой
Сообщения: 75
Зарегистрирован: 08.02.2017{, 00:29}
Репутация: 1

UART и RS485

#20

Сообщение igrik1972 » 19.03.2017{, 17:56}

Такой вопрос:
на Slave по модбасу есть переменные.......
можно их не отдельно передавать, а упаковать через 8int to UART, потом конвертировать в BYTE , а потом одним пакетом передавать через модбаст...
а потом там распоковать.......
Вложения
slave_10_meteo.flp
(606.8 КБ) 46 скачиваний
Последний раз редактировалось igrik1972 19.03.2017{, 18:07}, всего редактировалось 1 раз.

Ответить

Вернуться в «Modbus»