LINUX.ORG.RU

Вопросы по библиотеки libmodbus

 ,


0

3

Привет. Протокол модбус

Библиотека умеет управлять выводом RTS (RE) при работе с RS485? Или библиотека libmodbus на время передачи выключает приемник?

Вывод RE «receiver enable». Для более лучшего понимания если мы замкнем RX на TX то получим эхо при передачи. Есть специальные микросхемы RS485 типа «MAX13487» которые имеют вывод RE который отключает приемник в момент передачи. Но также можно заблокировать приемник на аппаратно-программном уровне для приема сигнала.

Вот от суда и вопрос как сделано в libmodbus ?



Последнее исправление: Alex_Golubev (всего исправлений: 1)

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

Silerus ★★★★
()
Ответ на: комментарий от Silerus

У меня схема построена так: В момент передачи данных с передатчика данные возвращаются сразу на приемник «ЭХО» и передаются на slave. После slave отвечает.

Получается что в буфере приемника будут появляться два типа данных от мастера и от slave.

Двух проводной RS-485.

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

ну если вы сами назад посылаете - то будут, просто считывайте эхо и отбрасывайте его. Единственное у вас есть согласно протоколу crc сумма - при получение той стороной сообщение просчитать ее и сравнить с тем что в сообщение - если ок, возвращать ответ, если нет вернуть ошибку согласно протоколу, зачем еще и эхо я не знаю

Silerus ★★★★
()
Последнее исправление: Silerus (всего исправлений: 1)
Ответ на: комментарий от Silerus

Нет вы не поняли. Есть физический уровень модбус. По диф. паре передаются данные только в одном направление.

Пример двухпроводной RS485 http://www.modbus.org/docs/Modbus_over_serial_line_V1.pdf стр 22/44. Там показано что передатчик замкнут на приемник, смотреть master.То есть когда на линии D есть данные то данные сразу идут и на линию R.

Если я включу

    modbus_t* my_modbus = modbus_new_rtu("/dev/ttyAPP1", 4800, 'E', 8, 1);
    modbus_set_slave(my_modbus, 0x00);
    modbus_rtu_set_serial_mode(my_modbus,MODBUS_RTU_RS485);
    modbus_rtu_set_rts(my_modbus, MODBUS_RTU_RTS_NONE);
На двух проводную линию RS485, как библиотека поймет что в первый момент времени приходит эхо?

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

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

sigurd ★★★★★
()
Ответ на: комментарий от sigurd

И железо само определяет направление без всякой программной поддержки

Вот как раз железо и не определяет этого.

Есть еще один вариант 4 проводная RS485. Так вот там выделены линии под передатчик и приемник. И там нет эха.

Этим должна заниматься программа, дергать вывод RTS. В библиотеки libmodbus есть для этого функция «modbus_rtu_set_rts»

Никто не поднимал с помощью libmodbus двухпроводную передачу по RS485 без использования RTS?

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

Действительно не понимаю, почему у вас физически реализовано эхо!? Еще раз протокол modbus rtu подразумевает наличе crc суммы - т.е ваш slave после получение посылки должен рассчитать эту сумму, откинув последние слово, и сравнить с последним словом - если верно - он должен выполнить запрос или ответить о невозможности выполнения, если нет - то должен вернуть ошибку передачи данных, все согласно протоколу. Т.е ваше эхо засирает канал связи лишними сообщениями - его быть не должно, так как контроль того что пришло обеспеченно протоколом modbus rtu. Если бы вы использовали modbus tcp - то целостность обеспечивал протокол tcp.

А вы под эхом случайно не подразумеваете то, что в случае ошибки возвращается тот же самый пакет только меняет код команды на код ошибки?

Silerus ★★★★
()
Последнее исправление: Silerus (всего исправлений: 1)
Ответ на: комментарий от Silerus

Под эхом понимаю возврат сигнала мастера. К коду ошибок это не относиться. Да вы правы есть специальные микросхемы типа MAX13487 которые могут блокировать прием на время передачи, на аппаратном уровне. Но у меня стоит дубовая SP485 она не может ни чего, поставить другую не могу. Остается мне только включить вывод RTS установить время срабатывания и начать работать. Для этого мне нужно правильно настроить RTS. Есть пример https://github.com/stephane/libmodbus/blob/master/doc/modbus_rtu_set_rts.txt

modbus_t *ctx;
uint16_t tab_reg[10];

ctx = modbus_new_rtu("/dev/ttyS0", 115200, 'N', 8, 1);
modbus_set_slave(ctx, 1);
modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS485);
modbus_rtu_set_rts(ctx, MODBUS_RTU_RTS_UP);

if (modbus_connect(ctx) == -1) {
    fprintf(stderr, "Connexion failed: %s\n", modbus_strerror(errno));
    modbus_free(ctx);
    return -1;
}

rc = modbus_read_registers(ctx, 0, 7, tab_reg);
if (rc == -1) {
    fprintf(stderr, "%s\n", modbus_strerror(errno));
    return -1;
}

modbus_close(ctx);
modbus_free(ctx);
По пути /dev/ttyS0 должен находиться драйвер RS485 c управлением RTS? Или RTS присваивается какому-то выводу.

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

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

Silerus ★★★★
()
Ответ на: комментарий от Silerus

и вам просто достаточно игнорировать мастер пакет

А libmodbus позволяет получить два пакета и мастера и слейва?

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

вот хз ему вообще должно быть как то пофиг, что в буфер прилетело то он и разбирает, скорее всего он (libmodbus) будет фильтровать это автоматически -это логично, учитывая что ваша проблема вообще не гуглится

Silerus ★★★★
()
Ответ на: комментарий от Alex_Golubev

вывод ошибки посмотрите

The modbus_read_registers() function shall return the number of read registers if successful. Otherwise it shall return -1 and set errno.

rc = modbus_read_registers(ctx, 0, 10, tab_reg);
if (rc == -1) {
    fprintf(stderr, "%s\n", modbus_strerror(errno));
    return -1;
}

Silerus ★★★★
()
Последнее исправление: Silerus (всего исправлений: 1)
Ответ на: комментарий от Alex_Golubev

уже интересно ошибка передачи данных - у вас точно устройство исправно или вы уверены что оно считает именно crc modbus - а то этих crc как собак нерезанных

Silerus ★★★★
()
Ответ на: комментарий от Silerus

Устройство мной разработано. При приеме данных (слейв) я сначала считаю CRC и если совпадает то смотрю адрес ---> функцию ---> и т.д. Если бы CRC считалось бы неправильно то слейф сказал бы мне об этом.

Alex_Golubev
() автор топика

Заведи DE на RE и этого по идее хватит. 485 и так полудуплекс.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Silerus

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

А в IMX287 нету аппаратной возможности подключения RTS. И программную не включили вот сижу мучаюсь пишу драйвер для RS485 :(.

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

Смотрю протокол не может быть такого. В любом случае цепанитесь picocom или minicom вместо своего мастера, вручную пошлите запрос и посмотрите что придёт назад

Silerus ★★★★
()
Ответ на: комментарий от Alex_Golubev

без понятия, я не уверен что это эхо надо смотреть что назад приходит, хотя если подумать. Разница между запросом и ответом, помимо данных составляет одно поле - размер сообщения, допустим что что пришло эхо тогда если библиотека считает что это ответ то она считает данных на величину которое будет являться адрес первого запрашиваемого элемента, считает все остальное оно будет считать crc - тогда будет ошибка. Заплатка: открыть тот же порт на чтение и забрать данных на величину эхо потом вызвать чтения ответа. Но я посоветовался с коллегой - он говорит что эхо в нормальном варианте устройства быть не должно вообще

Silerus ★★★★
()
Ответ на: комментарий от Alex_Golubev

Сегодня завтра допишу драйвер а потом займусь библиотекой

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

modbus_rtu_set_rts

Она требует поддержки адаптером этого режима? Или в юзерспейссе эмулирует?

Deleted
()
Ответ на: комментарий от Alex_Golubev

Если бы CRC считалось бы неправильно то слейф сказал бы мне об этом.

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

Deleted
()
Ответ на: комментарий от Alex_Golubev

И железо само определяет направление без всякой программной поддержки

FT232 на линию CBUS2 выводит сигнал DE. Можешь от этого оттолкнуться, если допустимо USB юзать.

Deleted
()

специальные микросхемы

MAX485 за 5 рублей такое умеет. Причём RE и DE в противофазе - тупо кидаешь на них один сигнал, и эха нет.

Deleted
()

Я капец невнимательный.

Deleted
()
Ответ на: комментарий от Silerus

Сделал драйвер для RTS и модбус заработал :). Эхо мешало ему . теперь эха нет. Пишу программу дальше.

Alex_Golubev
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.