Страница 1 из 1
UART и RS485
Добавлено: 03 мар 2017, 12:44
adishis
Здравствуйте.
Вот такая проблема образовалась. необходимо снять данные с монитора электроэнергии по 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
UART и RS485
Добавлено: 03 мар 2017, 15:08
starshoy81
adishis, смотрите какие интерфейсы куда подключены. скорее всего модбас и блок pzem сидят на одном уарте. А вообще без проекта можно долго гадать на пальцах.
UART и RS485
Добавлено: 03 мар 2017, 15:28
Sancho
ВЫ используете один и тот-же serial port?
Откуда Вы знаете, что
adishis писал(а):а Чтение данных по UART работает без проблем.
, когда
adishis писал(а):Master RS485 не видит Слейва
starshoy81 писал(а):А вообще без проекта можно долго гадать на пальцах
+1
UART и RS485
Добавлено: 03 мар 2017, 16:44
adishis
Порт используется разный, 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> , скеч компилируется без ошибок.
UART и RS485
Добавлено: 03 мар 2017, 18:06
starshoy81
adishis писал(а):удаляя строку #include<SoftwareSerial.h> , скеч компилируется без ошибок.
то есть Вы вообще удаляете связь по софтсериал?
А без дисплея не пробовали?
adishis писал(а):В этой связке Master RS485 не видит Слейва, а Чтение данных по UART работает без проблем. Если отключаю библиотеку чтения данных по UART, то Modbus начинает работать.
А это как проверяли?
UART и RS485
Добавлено: 03 мар 2017, 19:32
adishis
Без дисплея, просто принять данные по 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).
UART и RS485
Добавлено: 03 мар 2017, 19:40
starshoy81
adishis, попробуйте не напрямую из блока передавать в модбас, а через запись в переменную. И эту переменную отправлять в модбас на другой плате.
UART и RS485
Добавлено: 03 мар 2017, 20:04
adishis
starshoy81 писал(а):adishis, попробуйте не напрямую из блока передавать в модбас, а через запись в переменную. И эту переменную отправлять в модбас на другой плате.
То есть две Ардуинки. Одна принимает данные другая отправляет по модбас. А как между двумя Ардуинками передать данные без интерфейсной связи? я думаю, что блок PZEM004 не даст интерфейсной связи нормально работать. (если не брать конечно типа I2C или что то не связанное с Serial)
Или разбираться с библиотекой PZEM004, или написать поновой (этого никогда не делал и буду долго писать)
UART и RS485
Добавлено: 03 мар 2017, 20:21
Boroda
В блоке (PZEM004T/Энергомонитор) в секции Setup уберите строчку Serial.begin(9600). Получается, что ваш блок запускает и софтварный, и хардварный юарт.
UART и RS485
Добавлено: 03 мар 2017, 20:23
starshoy81
adishis, Не-не, плата в программе. Первая плата считывание из энергомонитора и присвоение выхода V переменной, а вторая плата присвоение вышеобозначенной переменной тега модбас.
UART и RS485
Добавлено: 03 мар 2017, 22:29
Boroda
Ээээээээ... в блоке в LoopSection объявлены переменные и они же стоят на выходе. Двойное декларирование.
UART и RS485
Добавлено: 03 мар 2017, 22:41
adishis
starshoy81 писал(а):adishis, Не-не, плата в программе. Первая плата считывание из энергомонитора и присвоение выхода V переменной, а вторая плата присвоение вышеобозначенной переменной тега модбас
Пробовал так, не помогает
UART и RS485
Добавлено: 03 мар 2017, 23:09
Boroda
Доработал блок, положил в
блоки пользователя в 5м комментарии.
Добавлено (03.03.2017, 23:01)
---------------------------------------------
adishis, поменяйте адрес слейва на 2, обычно адрес 1 присваивается мастеру сети.
Добавлено (03.03.2017, 23:09)
---------------------------------------------
Убейте из папки C:\Program Files (x86)\Flprog\ideV1\libraries\pzem файлы SoftwareSerial, потому как в стандартных либах IDE они уже есть. У меня с модбасом и блоком ПЗЕМ все компилируется нормально.
UART и RS485
Добавлено: 03 мар 2017, 23:58
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, так он обновляется каждый цикл программы и пожирает драгоценное время, лучше сделать так: данные для вывода поменялись -> обновляем экран. Программа быстрее работать будет. Да и вообще все преобразования и экран лучше выносить на отдельную плату с условием. И запускать эту плату тогда, когда необходимо обновить инфу.
Вот программа.
UART и RS485
Добавлено: 06 мар 2017, 08:53
adishis
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, модбас не отдаст данные скаде. Увеличивайте таймаут ответа в мастере, возможно этого времени не хватает на опрос энергомонитора.
Я так полагаю независимая работа подпрограмм не возможна.
UART и RS485
Добавлено: 06 мар 2017, 12:22
starshoy81
adishis, на Моха преобразователе необязательно пин PEDE, там скорее всего автоматическое распознавание направления передачи данных.
adishis писал(а):Я так полагаю независимая работа подпрограмм не возможна.
Ну она псевдонезависимая за счет скорости прохождения циклов программы. А так, да, все выполняется последовательно. Поэтому пока не придут данные от пзема на запрос от модбаса ответа не будет.
UART и RS485
Добавлено: 07 мар 2017, 08:23
adishis
starshoy81 писал(а):adishis, на Моха преобразователе необязательно пин PEDE, там скорее всего автоматическое распознавание направления передачи данных.
Нет, на Мохе то нет, я имел ввиду на ардуиновском 485-м. (МАХ485)
starshoy81 писал(а):Ну она псевдонезависимая за счет скорости прохождения циклов программы. А так, да, все выполняется последовательно. Поэтому пока не придут данные от пзема на запрос от модбаса ответа не будет.
А почему не будет? если не успел считать от пзема пусть отдает старые данные по Модбас. Или все таки сам обмен, что аппаратный, что программный он последовательный, тоесть обмен сначала по UART - как закончит обмен , то если есть запрос по Модбас, отдаем данные по Модбас.
UART и RS485
Добавлено: 07 мар 2017, 09:09
starshoy81
adishis, на мах485csa точно нужно включать, без него не работает.
Чтобы отдавать старые данные нужно их записывать в переменные, тогда они будут висеть в озу до обновления. Дело здесь в другом, проц занят опросом пзема и на другой запрос не реагирует. В блоке пзема, кстати, delay, не проставлена случайно? Это тоже может влиять на опросы проца.
UART и RS485
Добавлено: 07 мар 2017, 09:45
adishis
Boroda писал(а):Вот программа.Прикрепления: test_pzem.flp(272Kb)
Вот в этом примере просто не подключена PIN PE-DE в настройках Modbus в программе FlProg
UART и RS485
Добавлено: 19 мар 2017, 17:56
igrik1972
Такой вопрос:
на Slave по модбасу есть переменные.......
можно их не отдельно передавать, а упаковать через 8int to UART, потом конвертировать в BYTE , а потом одним пакетом передавать через модбаст...
а потом там распоковать.......