реклама на сайте
подробности

 
 
9 страниц V  « < 2 3 4 5 6 > »   
Reply to this topicStart new topic
> сниффер ком порта
juvf
сообщение Sep 23 2016, 03:14
Сообщение #46


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата
для любителей растяжек НИКОГДА не работавших с длинными реальными линиями.
А что такое длинная реальная линия? с линией в 1200 метров не работал..... но несколько сотен метров - был опыт. Ни чего в линию не дули, ни до ни после передачи... линия была на растяжках.

Цитата
За такую "подтяжку" криворуким дизайнерам надо отрывать гениталии. Она КАТОСТРОФИЧЕСКИ гробит дальность передачи.
Так в даташитах на драйвера эти растяжки в схемах как ..... Typical Half-Duplex RS-485 Network.

zltigo, а вы как с 485-ым работаете? вообще без растяжек? Иногда разработчики забывали растяжку на линии сделать... так, когда линия свободна - все на линии непрерывно ловят мусор... непрерывно по уарту а процессор идёт мусор и связи толком нет.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 23 2016, 09:08
Сообщение #47


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (juvf @ Sep 23 2016, 06:14) *
zltigo, а вы как с 485-ым работаете? вообще без растяжек?

Разумеется без.
Предпочтение отдается, как уже писал, Failsafe приемникам (разумеется тем, которые True), но это для уменьшения помех, а не для того что бы мечтать, что помех не будет.
Растяжки опциональные в железе предусмотрены, но ТОЛЬКО на случай подключений чужого железа которое делали убогие программисты не поддерживающие активное состояние линии перед началом передачи. Увы, сие не редкость sad.gif и Вы тому живое свидетельство. Для систем в котором используется гарантрованно свое оборудование на своем протоколе - нет и этой опции за полной ненадобностью.
QUOTE
Иногда разработчики забывали растяжку на линии сделать... так, когда линия свободна - все на линии непрерывно ловят мусор... непрерывно по уарту а процессор идёт мусор и связи толком нет.

Все это совершенно нормально БЕСПРОБЛЕМНО фильтруется. Для фильтрации, например, в случае MODBUS и заложены те самые 1,5 и 3,5 интервалы АКТИВНОГО состояния, но без передачи, и само собой обработка ошибок собственно UART.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
juvf
сообщение Sep 23 2016, 10:34
Сообщение #48


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(zltigo @ Sep 23 2016, 14:08) *
Все это совершенно нормально БЕСПРОБЛЕМНО фильтруется. Для фильтрации, например, в случае MODBUS и заложены те самые 1,5 и 3,5 интервалы АКТИВНОГО состояния, но без передачи, и само собой обработка ошибок собственно UART.
не ради холевара.... а ради прокачки скила.... как допустим, ПК БЕСПРОБЛЕМНО делает интервал активного состояния без передачи данных? как в покупных преобразователях усб-485 или 232-485 ПК делает активные паузы? это раз

2)но понятно.... что перед отправкой пакета сделать паузу, то вероятность ошибок будет меньше.... линяя будет "нешумная" и слейв получит пакет нормально. Но если линяя брошена... растяжек нет... то в УАРТ постоянно сыплет мусор. Понятно, что слейв считает црц и вероятность что получился из мусора годный пакет бесконечно мала.... Слейв в мусоре годного пакета не найдет. Но мусор то есть... и слейву нужно этот мусор обрабатывать... т.е. слейв непрерывно копается в мусоре и тратит свои ресурсы. Кто-то скажет - что эти ресурсы ничтожно малы.... но на каком нить АтТини не так уж и малы. с растяжками мусора нет.... может и могут быть помехи.... но они очень редки

Цитата
в случае MODBUS и заложены те самые 1,5 и 3,5 интервалы АКТИВНОГО состояния
эээээ.... в MODBUS вроде нет ни каких интервалов активного состояния. там есть интервалы тишины.


ps я всегда в своих устройствах делаю счетчик пакетов с битыми црц, и счетчик пакетов адресованных "мне". всегда интересно.... на сколько качественная связь.... сколько пакетов потеряно? каковы помехи? Приятно увидеть через год, что счетчик битых либо не изменился, либо инкрементировался на 1.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 23 2016, 10:45
Сообщение #49


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(zltigo @ Sep 22 2016, 16:50) *
Увы, для 485 пауза есть неизбежное зло.
Величина паузы зависит от способа выделения фрейма и при MODBUS самый плохой вариант c точки зрения величины пауз -
1,5 байта в начале и 3,5 байта в конце.
Про 1,5 байта в начале не понял.
Там ведь и в начале и в конце 3,5 байта, а от 1,5 до 3,5 - это признак битого пакета.


Цитата(juvf @ Sep 23 2016, 13:34) *
ээээ.... в MODBUS вроде нет ни каких интервалов активного состояния. там есть интервалы тишины.
Да именно тишины, а как вы её должны добиться в стандарте ИМХО не сказано. Единственно возможный способ гарантированно этого добиться - включить шину в активное состояние.
А что касается настоящих usb преобразователей в MODBUS-RTU то такие, я думаю есть в природе и в них наверняка стоит контроллер.

Кстати про FAILSAFE - большая их часть нифига не FAILSAFE (т.е. без смещённого порога).
Поскольку последнее время разрабатываем девайсы на отечественной элементной базе могу сказать, что у Миландра правильные RS485 драйверы.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
juvf
сообщение Sep 23 2016, 11:16
Сообщение #50


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(demiurg_spb @ Sep 23 2016, 15:45) *
Единственно возможный способ гарантированно этого добиться - включить шину в активное состояние.
не единственный. Я уже писал выше про растяжки.

Цитата
Кстати, про загрузку процессора - если фильтровать по адресу слейва и коду функции то CRC считать для мусора и "не твоих запросов" фактически и не придётся.
Я сначала принимаю весь пакет, потом проверяю црц, только потом принимаю решение что пакет без ошибок и обрабатываю его. Проверять адрес без принятия всего пакета не совсем правильно.... но хотя кому как удобнее.... но тем не менее... допустим считаем црц после каждого приема байта....

1)пришел байт мусора
2)посчитал црц для 1 байта (табличным способом)
3)goto 1
сработал таймер 3,5, если црц == 0, то пакет годный, смотрим адрес.

в таком алгоритме придётся для мусора считать црц.... если не считать црц, а фильтровать по адресу...
1)пришел байт мусора
2)проверили адрес
3)goto 1

где профит? 2-ой шаг - или фильтрация, или подсчет црц всеравно тратить время, все равно вход в прерывание, выход из прерывания....
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 23 2016, 11:38
Сообщение #51


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (juvf @ Sep 23 2016, 13:34) *
не ради холевара.... а ради прокачки скила.... как допустим, ПК БЕСПРОБЛЕМНО делает интервал активного состояния без передачи данных? как в покупных преобразователях усб-485 или 232-485 ПК делает активные паузы? это раз

Мне безразлично кто и что НЕ делает и по какой причине. Я говорю о том, как НАДО делать и как делаю сам.
QUOTE
но понятно.... что перед отправкой пакета сделать паузу, то вероятность ошибок будет меньше.... линяя будет "нешумная" и слейв получит пакет нормально. Но если линяя брошена... растяжек нет... то в УАРТ постоянно сыплет мусор.

Ну и пусть сыпет. Всегда возможна, пусть даже и нештатая ситуация, когда посыпется мусор и с такой ситуацией надо уметь БЕСПРОБЛЕМНО справляться.
QUOTE
Понятно, что слейв считает црц и вероятность что получился из мусора годный пакет бесконечно мала.... Слейв в мусоре годного пакета не найдет. Но мусор то есть... и слейву нужно этот мусор обрабатывать... т.е. слейв непрерывно копается в мусоре и тратит свои ресурсы. Кто-то скажет - что эти ресурсы ничтожно малы.... но на каком нить АтТини не так уж и малы. с растяжками мусора нет.... может и могут быть помехи.... но они очень редки

Тем не менее тот же MODBUS начинался тогда, когда помянутая Вами тини была-бы более, чем крута на фоне чего либо типа 8080 мегагерцового. Тратить ресурсы на самом деле не приходится особо, поскольку первоначальный отсев мусора идет уже по ошибкам фиксируемым UART, потом по тем тому самому 1,5 интервалу. В случае MODBUS контроль адреса и так далее....
QUOTE
эээээ.... в MODBUS вроде нет ни каких интервалов активного состояния. там есть интервалы тишины.

Которые гарантированно обеспечиваются активизацией передатчика а не навешиванием сопливых растяжек.


QUOTE (demiurg_spb @ Sep 23 2016, 13:45) *
Про 1,5 байта в начале не понял.
Там ведь и в начале и в конце 3,5 байта, а от 1,5 до 3,5 - это признак битого пакета.

Вот в начале и делается 1,5 байтовая пауза, кторая
1) Обепечивает признак битого пакета для любого мусора возможно идущего из линии.
2) Обеспечивает гарантрованный стоп бит и соответственно захват байтовой синхронизации UART-ом.
Для других протоколов может быть достаточно однобайтовой паузы только для синхронизации.
QUOTE
Кстати про FAILSAFE - большая их часть нифига не FAILSAFE (т.е. без смещённого порога).

Ну не большая, но много именно с хлипенькими "растяжками" внутри.
Причем это в основном левая китайская перемаркировка. Отличаются от настоящих легко по поведению при замыкании линии - растяжки сразу идут лесом в вылезает истинное личико sm.gif.
По этой причине я и писал ранее TRUE Falsafe.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 23 2016, 11:39
Сообщение #52


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(juvf @ Sep 23 2016, 14:16) *
не единственный. Я уже писал выше про растяжки.
Спорить с вами бесполезно.
Вы зациклились на своём решении и не видите его недостатков.
Поверьте что никогда не поздно учиться.
Если не доверяете мне с непрерывным опытом разработки КИПиА и интеграции чуть более 16 лет - я не в обиде.
Но не прислушиваться к корифеям типа zltigo по меньшей мере самонадеянно.



--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 23 2016, 11:55
Сообщение #53


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (juvf @ Sep 23 2016, 14:16) *
не единственный. Я уже писал выше про растяжки.

Гарантированный - единственный. Он же, в отличие от растяжек, работающий ВСЕГДА, а не только на короткой линии и при низком уровне помех.
QUOTE
Проверять адрес без принятия всего пакета не совсем правильно....

Это абсолютно правильно, ибо если адрес не ваш, то уже пофиг и пакет и его целостность - пакет уже игнорируется и становимся в ожидание следующего фрейма без лишних разбирательств.
QUOTE
1)пришел байт мусора
2)посчитал црц для 1 байта (табличным способом)
3)goto 1
сработал таймер 3,5, если црц == 0, то пакет годный, смотрим адрес.

Таймер 1,5 как видно из этого супер алгоритма, Вам оказался не по уму sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
juvf
сообщение Sep 23 2016, 12:09
Сообщение #54


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата
Мне безразлично кто и что НЕ делает и по какой причине. Я говорю о том, как НАДО делать и как делаю сам.
К словам цепляетесь... перефразирую вопрос: Как ВЫ делаете активную паузу, если мастер ПК?

Цитата
Спорить с вами бесполезно.
Вы зациклились на своём решении и не видите его недостатков.
Поверьте что никогда не поздно учиться.
я не пытаюсь вам доказать свою правду.... я хочу учиться... у меня тоже не малый опыт... (с 2000 года, теже 16+, наверно мы ровесники ))) )
Я просто первый раз слышу об активных паузах. всегда линия 485го растягивалась. без растяжек даже на столе могло не работать. я не работал на линиях 1000 метров.... может вы и корифей типа zltigo речь ведёте о 2-3 км.... или десятки км.... тут я пасс.
Но если это до 500м.... тут у меня есть опыт теже, 16 лет.... и растяжки работают на ура. приимущества: 1. не надо заморачиваться с активными паузами, 2 не надо переваривать мусор из-за его отсутствия (а что его нет... на практике проверенно, а не теоретические выводы).

Наверно я начну со следующей разработки делать активные паузы... просто я хочу понять - ради чего? научите меня правильно готовить 485? Пока я преимуществ в активной паузе не вижу.

ps, да, кстате.... 2demiurg_spb У вас не было задачи с десктопного ПК под виндой или линуксом по MODBUS-у работать? Или промышленная ЭВМ должна быть мастером в MODBUS-е? Как вы добиваетесь в таких случаях активной паузы? (опять же, я не хочу вам навязывать своё решение. я своё мнение высказал, вам решать. я хочу узнать как вы технически решаете подобные задачи? Ну чтоб научиться... ведь ни когда не позно wink.gif )

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

Цитата
Таймер 1,5 как видно из этого супер алгоритма
я таймера упустил для краткости.... да там в пошаговом алгоритме и 3.5 нет перезапуска. много писать.... я просто хотел показать суть.... что и там и там нужно "работать". В одном случае считать црц, в другом проверять адрес. ..... и там и там будет вход-выход из прерывания и будет перезапуск таймеров.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 23 2016, 12:41
Сообщение #55


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (juvf @ Sep 23 2016, 15:09) *
К словам цепляетесь... перефразирую вопрос: Как ВЫ делаете активную паузу, если мастер ПК?

Если под ПК Вы очевидно понимаете Windows/Linuх и иже с ними, то ни мастеров ни слейвов MODBUS под такой "ПК" не бывает. Вот такая печальная правда. Под голый ПК, ака DOS - без проблем. Так же без проблем не уродливый MODBUS-RTU, а протоколы, например, на байтстаффинге. В этом случае достаточно 9-10 битовой паузы для захвата байтовой синхронизации и для этого годится посылка 0xFF.
То, что пытаются делать на "ПК" без аппаратной поддержки, это что-то похожее на MODBUS и только в некоторых условиях и с не всяким оборудованием работоспособное. Да, типичный способ ЗАСТАВИТЬ хоть в каких-то условиях работать - прицепить растяжки. Цену такого "решения", если не понимаете, поймете решив задачку в конце поста.
Соответственно при работе с "ПК" я использую свои конверторы протоколов на Ethernet.
Они отрабатывают все паузы и протокольные таймауты, включая таймауты неответа слейвов.
QUOTE
Но если это до 500м.... тут у меня есть опыт теже, 16 лет.... и растяжки работают на ура.

Займемся арифметикой.
Имеем витую пару 100 Ом волнового и соответственно 100 омный терминатор.
Вопрос первый, какое сопротивление должны иметь волшебные растяжки, дабы обеспечить гарантированную паузу, ну, например, при 3.3V питании и стандартных 200mV порогах срабатывания приемника?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Sep 23 2016, 12:44
Сообщение #56


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(juvf @ Sep 22 2016, 15:47) *
когда нет драйвера на линии там лог "1". Линяя RS485 должна быть подтянута (А к +V, B k GND).
...
Забудьте про всякие продувки..... слейв как только принял пакет и обработал без всяких пауз и продувок может отвечать.

Вы не правы. Никто не должен там ничего никому держать.
Пример хорошего протокола для RS485- тот же Модбас: пауза в Модбасе РТУ не просто так сделана в начале пакета, и тайминг там не просто так был придуман.
Случаи- они разные бывают.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 23 2016, 13:04
Сообщение #57


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



2juvf:
Я стараюсь на комп не заводить MODBUS-RTU - он используется в основном для связи модулей расширения с ПЛК.
Если и завожу по необходимости, то никак не формирую активное состояние в паузе - и говорю клиенту, что так, мол, и так, работать как-то будет...
Если хотите чтобы было совсем хорошо надо раскошелится. Многие не хотят...

А сейчас парсер реализован так (сначала проверка адреса, а уже потом CRC):
CODE
static void modbus_serial_pdu_parser(modbus_handle_t* mb)
{
modbus_buffer_goto_idx(mb, 0);

mb->pdu.current.len = rs485_get_rx_qty(mb->rs);
mb->pdu.current.address = modbus_buffer_get_byte(mb); // address = buffer[0]
mb->pdu.current.function = modbus_buffer_get_byte(mb); // function = buffer[1]

dbg_printf("qlen:%d\taddress:%d\n", (int)mb->pdu.current.len, (int)mb->pdu.current.address);

if ( (mb->pdu.current.address==MB_BROADCAST_ADDRESS)
|| (mb->pdu.current.address==mb->pdu.wanted.address) )
{
if (modbus_buffer_check_crc(mb))
{
if (modbus_serial_is_master(mb))
modbus_serial_stop(mb),
modbus_master_ack_parser(mb);
else
modbus_slave_function_parser(mb);
}
else
{
dbg_printf("bad_crc\n");

#if MB_SLAVE_STATISTICS_ENABLE
mb->stat.comm_errors++;
#endif

modbus_serial_default_state(mb); // idle or stop
}
}
else
modbus_serial_default_state(mb); // idle or stop

#if MB_SLAVE_STATISTICS_ENABLE
mb->stat.total_messages++;
#endif
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
juvf
сообщение Sep 25 2016, 09:02
Сообщение #58


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата
Под голый ПК, ака DOS - без проблем.
Поделитесь опытом.
Цитата
Цену такого "решения", если не понимаете, поймете решив задачку в конце поста.
И какова? На практике это работает. Об этом пишут в даташитах. Погуглил инет на эту тему - кругом рекомендации про растяжки.
Цитата
Имеем витую пару 100 Ом волнового и соответственно 100 омный терминатор.
Вопрос первый, какое сопротивление должны иметь волшебные растяжки, дабы обеспечить гарантированную паузу
какую паузу? растяжки не обеспечат вам гарантированной паузы. растяжки обеспечат вам тишину в линии без дайвера (ну или шум сведут к минимуму).

Цитата
и говорю клиенту, что так, мол, и так, работать как-то будет...
А мы делаем. И работает, не хоть как-то, а работает.

Цитата
Пример хорошего протокола для RS485- тот же Модбас: пауза в Модбасе РТУ не просто так сделана в начале пакета
нет там пауз в НАЧАЛЕ пакета. там пакеты разделены 3.5 символьными паузами тишины. Чтоб тишину обеспечить, достаточно всем помолчать. А если в линии шум... так нужно бороться с шумом. У нас в линиях нет шума. Зачем туда что-то дуть активно?


ps Я могу усомниться в своих знаниях (а я и усомнился... и погуглил... да нет... ставят растяжки), я могу не знать как в ДОС врубить активную паузу, я могу встать осцыолом на линию и посмотреть там шумы... и если их сейчас нет, не значит что их вообще нет.... Я могу во что-то поверить, например в ЛММ. Но верить в то, что растяжки не обеспечат тишину - не получается. У меня на каждом устройстве, и на слейве и на мастере стоит счетчик битых пакетов. если пройдет шум.... и хоть какой-то уарт примет хотя бы 1 байт ложный в тишины - счетчик битых пакетов увеличиться. если ложный байт будет перед нормальным пакетом или сразу после него - счетчик битых пакетов увеличиться. По этим счетчикам можно судить о шумах на линии... и вообще о работе всего модбаса на линии. годами в режиме 7/24 работают устройства... и эти счетчики единично инкриминируются. Т.е. эти "сопливые" растяжки не такие уж и сопливые. Тишину в линии они обеспечивают. А что ещё от них нужно? Зато нет гемора с активными паузами.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 25 2016, 14:28
Сообщение #59


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (juvf @ Sep 25 2016, 12:02) *
Поделитесь опытом.

Решите задачу о котрой писал, вот и будет Вам первый шаг к пониманию и опыту. Если будете как заведенный попугай долдонить про каке-то "даташиты из гугла с растяжками", то так и останетесь попугаем повторяющим то, что не понимаете.
Выбор за Вами.
QUOTE
Т.е. эти "сопливые" растяжки не такие уж и сопливые.

Если не сопливые, то тогда это вызывает проблему с дальностью работы в полный рост.
QUOTE
годами в режиме 7/24 работают устройства...

Забыли добавить "у меня". Типичное радиолюбительство описывается одной фразой - "ничего не знаю у меня все работает" sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Sep 25 2016, 17:33
Сообщение #60


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



juvf , Вы хотели что-то спросить, или просто еще раз подтвердить самому себе верность своего курса?
Вы очень уверены в том что делаете, в чем тогда вообще смысл дискуссии, что Вы ждете от оппонентов?

Ваш путь ошибочен. Лично Вам он годится, только и всего.

Как говорил один классик "Езжайте! Да, когда свернете налево, ну вы-то направо, там проезд запрещен, обрыв. Но вам туда можно."
Go to the top of the page
 
+Quote Post

9 страниц V  « < 2 3 4 5 6 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th April 2024 - 07:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01561 секунд с 7
ELECTRONIX ©2004-2016