Автор |
Повідомлення |
Повідомлення створено: 29. 09. 2012 [09:16]
|
lexx666
Алексей Велесевич
Автор теми
Зареєстрован(а) с: 05.09.2012
Повідомлення: 7
|
Серия контроллеров AT91 поддерживает режим работы RS485. Соотвествующий режим есть и в драйвере ядра ОС Linux. На примере библиотеки libmodbus привожу код настройки порта в режиме RS485.
int modbus_rtu_set_serial_mode(modbus_t *ctx, int mode)
{
if (ctx->backend->backend_type == _MODBUS_BACKEND_TYPE_RTU) {
#if HAVE_DECL_TIOCSRS485
modbus_rtu_t *ctx_rtu = ctx->backend_data;
struct serial_rs485 rs485conf;
memset(&rs485conf, 0x0, sizeof(struct serial_rs485));
if (mode == MODBUS_RTU_RS485) {
rs485conf.flags = SER_RS485_ENABLED;
if (ioctl(ctx->s, TIOCSRS485, &rs485conf) < 0) {
return -1;
}
ctx_rtu->serial_mode |= MODBUS_RTU_RS485;
return 0;
} else if (mode == MODBUS_RTU_RS232) {
if (ioctl(ctx->s, TIOCSRS485, &rs485conf) < 0) {
return -1;
}
ctx_rtu->serial_mode = MODBUS_RTU_RS232;
return 0;
}
#else
if (ctx->debug) {
fprintf(stderr, "This function isn't supported on your platform\n");
}
errno = ENOTSUP;
return -1;
#endif
}
/* Wrong backend and invalid mode specified */
errno = EINVAL;
return -1;
}
Можно ли указать в настройках OpenSCADA, что допустим /dev/ttyS2 должен инициализироваться в режиме RS485? Необходимо управлять приёмо-передатчиком RS485, в режиме RS485 контроллер сам аппаратно дергает ногой RTS для управления приёма\передачи.
Читал документацию по Модулю Serial , но не совсем понял фразу про использования ключа rts:
"rts" — использование RTS сигнала для передачи(false) и проверки на эхо, для сырого RS-485.
Или проще изменить режим работы железно в ядре для устройства /dev/ttyS2 и особо не мучиться ?
|
Повідомлення створено: 30. 09. 2012 [10:51]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
"lexx666" wrote:
Можно ли указать в настройках OpenSCADA, что допустим /dev/ttyS2 должен инициализироваться в режиме RS485? Необходимо управлять приёмо-передатчиком RS485, в режиме RS485 контроллер сам аппаратно дергает ногой RTS для управления приёма\передачи.
Сейчас нельзя, но могу добавить, если проверите.
"lexx666" wrote:
Читал документацию по Модулю Serial , но не совсем понял фразу про использования ключа rts:
"rts" — использование RTS сигнала для передачи(false) и проверки на эхо, для сырого RS-485.
Это режим управления потоком на стороне UserSpace, сделаный для TionPro270 поскольку там нет спец драйвера для работы этого режима на стороне ядра. В целом-же этот режим предусматривает установку RTS=false при передаче, а затем возврат в RTS=true для чтения. В "сырых" конверторах уровня RS232->RS485 такое переключение предусматривает попадание в канал чтения эхо от передачи, которое нужно отбрасывать.
Если в вашем случае режим подобный то можете попробовать установить "rts".
"lexx666" wrote:
Или проще изменить режим работы железно в ядре для устройства /dev/ttyS2 и особо не мучиться ?
Можно и так, хотя я смотрю это стандартно и его можно добавить в OpenSCADA.
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 01. 10. 2012 [09:15]
|
lexx666
Алексей Велесевич
Автор теми
Зареєстрован(а) с: 05.09.2012
Повідомлення: 7
|
В исходниках ядра достаточно большая вложенность, чтобы изменить один бит режима надо перелопатить кучу всего. Забил я на это дело.
Впринципе я добавил уже сам нужный режим rs-485 в модуле serial, и даже протестил на ARM всё работает. Если надо могу выложить осциллограммы с осциллографа. Если введёте этот режим официально было бы здорово.
Единственное, ещё не знаю надо ли включать задержки до и после передачи на RTS.
/* Set rts delay before send, if needed: */
rs485conf.delay_rts_before_send = ...;
/* Set rts delay after send, if needed: */
rs485conf.delay_rts_after_send = ...;
Поразбираюсь, отпишусь по этому вопросу.
Ах да. Попробовал я режим rts. Но пин RTS на время ВСЕЙ передачи именно на ARM платформе не выставлялся. Выставлялся вначале передачи в "1" на какое-то очень короткое время - на TX пине ещё пачка импульсов, на.RTS`е уже "0".
[Повідомлення редагувалось 2 раз(ів), останній раз 01.10.2012 в 09:23.]
Вкладений файл
mod_serial.cpp (Тип файлу: text/x-c++src, Розмір: 41.77 кілобайтів) — 1781 завантажень
|
Повідомлення створено: 01. 10. 2012 [19:38]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
"lexx666" wrote:
Впринципе я добавил уже сам нужный режим rs-485 в модуле serial, и даже протестил на ARM всё работает. Если надо могу выложить осциллограммы с осциллографа. Если введёте этот режим официально было бы здорово.
Введу.
Однако одно замечания. Строки "#define TIOCGRS485 0x542E" лишние, поскольку они определены через linux/serial.h
"lexx666" wrote:
Единственное, ещё не знаю надо ли включать задержки до и после передачи на RTS.
На каких скоростях тестировали? Например, в случае с "rts", с UserSpace обработкой, есть проблема в исходящем транспорте на больших скоростях, когда Slave уже отвечает, а Master не успевает переключиться на приём. Как результат теряется голова ответа и Slave нужно замедлять.
"lexx666" wrote:
Ах да. Попробовал я режим rts. Но пин RTS на время ВСЕЙ передачи именно на ARM платформе не выставлялся. Выставлялся вначале передачи в "1" на какое-то очень короткое время - на TX пине ещё пачка импульсов, на.RTS`е уже "0".
Как-бы я его именно для ARM, который TionPro270 с PXA270, делал и там работает.
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 02. 10. 2012 [12:45]
|
lexx666
Алексей Велесевич
Автор теми
Зареєстрован(а) с: 05.09.2012
Повідомлення: 7
|
Тестировали на скорости 115200.
Время между RTS, уже выставленным в "1" и началом передачи на TXD не более 10 мкс. Время включения передатчика на ИМС интерфейса RS485 по даташиту 2,5 мкс. Т.е. всё ништяк.
Время между концом данных и RTS уже в "0" теже ~ 10 мкс. Время включения приёмника по даташиту наносекунды.
За 10 мкс слейв вряд ли даже подготовит данные, плюс ему тоже надо включить передатчик так что всё нормально.
Как-бы я его именно для ARM, который TionPro270 с PXA270, делал и там работает.
хбз. Может serial драйвер другой. На at91 может как то некоректно работает, вполне возможно. Впринципе меня устраивает бит включения rs-485 режима полностью.
[Повідомлення редагувалось 1 раз(ів), останній раз 02.10.2012 в 12:45.]
|
Повідомлення створено: 03. 10. 2012 [12:09]
|
lexx666
Алексей Велесевич
Автор теми
Зареєстрован(а) с: 05.09.2012
Повідомлення: 7
|
Протестировали с реальной железкой Nport DE-311. Данный преобразователь Serial-Ethernet был под рукой.
Со стороны Ethernet`а кольцо, принятые данные с rs485 тут же в него и возвращаются. Всё прекрасно работает на скорости 115200, начальные данные не теряются.
|
Повідомлення створено: 03. 10. 2012 [12:59]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
"lexx666" wrote:
Протестировали с реальной железкой Nport DE-311. Данный преобразователь Serial-Ethernet был под рукой.
Со стороны Ethernet`а кольцо, принятые данные с rs485 тут же в него и возвращаются. Всё прекрасно работает на скорости 115200, начальные данные не теряются.
Включил "RS485" в рабочую ветку, проверяйте.
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 04. 10. 2012 [13:47]
|
lexx666
Алексей Велесевич
Автор теми
Зареєстрован(а) с: 05.09.2012
Повідомлення: 7
|
Протестил. Слил модуль serial в 0.8.0.3.
RS-485 включается. RTS дергается.
RS-485 выключается. RTS не дергается.
Описание режима проверил и на русском и на английском. Всё отлично.
Cпасибо! :)
|