УкраїнськаEnglishmRussian
Вход/Новый
В теме нет новых постов

ARM RS485 и OpenSCADA


Автор Сообщение
Сообщение создано: 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
Сообщения: 3747
"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 килобайт) — 1717 загрузок
Сообщение создано: 01. 10. 2012 [19:38]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3747
"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
Сообщения: 3747
"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пасибо! :)



7258