-
- Сразу. Требование паузы 3.5 char устарело сразу после появления интерфейсов USB/Ethernet/Bluetooth-RS485, где такие точные паузы не выдерживаются, и могут быть разрывы в середине пакетов. Конец пакета определяетя по правильной CRC, ошибки - по zeleny(11 знак., 15.11.2012 13:26)
- это да, я влетал с некоторыим клиентами в их нарушение пауз, но koyodza прав, никакого другого критерия завершения пакета, как появления ОПРЕДЕЛЕННОЙ паузы применять нельзя. Иначе тут можно таких эффектов нахватать! Не нравится величина паузы? Лагунов(72 знак., 15.11.2012 13:56)
- это очень распространённое, но крайне глупое заблуждение - определять конец пакета по совпадению CRC Не делайте так никогда - koyodza(15.11.2012 13:51)
- почему ? даже если адрес и CRC правильные ? - zeleny(15.11.2012 13:53)
- А потому что CRC призвана защитить(обнаружением) посылку от помех на линии. И что Вы будете делать если пройдет помеха и CRC совпадет? При помехах на линии и так есть вероятность принять неправильную посылку, а Вы еще хотите усугубить ситуацию и abivan(30 знак., 15.11.2012 14:28)
- помеха пройдет и при наличии паузы - zeleny(15.11.2012 14:32)
- там CRC может ошибочно совпадать и без помех, данные внутри пакета могут быть разные. Получится огрызок - koyodza(15.11.2012 14:31)
- данные внутри пакета не пройдут по условию начала пакета, которое распознается именно по тайм-ауту приема - zeleny(15.11.2012 14:35)
- а это кто написал? "Конец пакета определяетя по правильной CRC, ошибки - по тайм-ауту" - koyodza(15.11.2012 14:38, ссылка)
- данные внутри пакета не пройдут по условию начала пакета, которое распознается именно по тайм-ауту приема - zeleny(15.11.2012 14:35)
- потому, что потом начнутся глюки, типа по какому-то адресу какое-то значение не записывается или не читается, потому что CRC совпала в середине пакета - koyodza(15.11.2012 14:06)
- не начнутся - начало пакета определяется по тайм-ауту приема - zeleny(15.11.2012 14:09)
- повторяю, идите нах с этими "новшествами". Не забывайте, что кто-то может почитать вашу писанину и сделать большую **йню не подумавши. Есть только один критерий конца пакета в ModBus RTU - таймаут, и всё. Не нравится - переходите на ModBus ASCII koyodza(21 знак., 15.11.2012 14:15)
- вообще я использую примерно такой алгоритм koyodza(782 знак., 15.11.2012 14:28 - 17:41)
- тоже иногда испльзую, только обычно 0xAA или 0x85 в качестве маркера начала пакета, заодно и синхронизации модемов (типа построенных на fx469 и т.п.), хотя в нынешних проектах неактуально, поэтому оставляю чистый modbus. - AVF(16.11.2012 10:54)
- речь шла о ModBus RTU, а не о проприетарных протоколах - koyodza(16.11.2012 11:18)
- ну а остальное там модбас rtu. добавлен маркер в начале передачи. он даже в CRC не участвует - AVF(16.11.2012 12:08)
- речь шла о ModBus RTU, а не о проприетарных протоколах - koyodza(16.11.2012 11:18)
- Полностью согласен (но п.1 не использую). Вообщето на сайте modbus.org есть, в пдф-ках, полный граф состояний и переходов и для мастера и для слейва, который совпадает с koyodz'овским (кроме ноу-хау). - Скрипач(15.11.2012 18:14)
- Может быть п.1 заменить простым включением передатчика (в единицу) на время таймаута (или несколько больше его), чтобы приемный буфер очистился от хлама? Тогда вообще никаких терок со стандартом не будет. - sin(15.11.2012 16:42, )
- я бы 1-й пункт убрал потому как 255 есть в стандарте(From 248 to 255 - Reserved) это значит что может появится адрес типа Broadcast хз зачем, а Вы его отбросив возьмете Function code, который совпадет с вашим адресом. Начнете делать проверку abivan(42 знак., 15.11.2012 14:41)
- не должен появиться, BROADCAST определён как нулевой. Можете убрать, я сразу предупредил, что этот пункт - собственное ноу-хау koyodza(264 знак., 15.11.2012 14:48 - 14:50)
- я имел в виду ситуацию, когда разработчику протокола взбредет в голову использовать резерв(добавить фичу), ХЗ для чего, может для хабов каких. И Ваше старое устройство начнет ловить "ошибочные" пакеты. - abivan(15.11.2012 16:12)
- если кому-то взбредёт в голову какое-то другое усовершенствование, то совместимость тоже может быть нарушена. У меня гарантируется совместимость с устройствами, которые соответствуют стандарту - koyodza(15.11.2012 16:16)
- я про изменение стандарта. Имеют право, раз зарезервировали. И тогда Ваши старые устройства перестанут удовлетворять стандарту. - abivan(15.11.2012 16:26)
- убрал. Не хотите - не делайте - koyodza(15.11.2012 17:42)
- я про изменение стандарта. Имеют право, раз зарезервировали. И тогда Ваши старые устройства перестанут удовлетворять стандарту. - abivan(15.11.2012 16:26)
- если кому-то взбредёт в голову какое-то другое усовершенствование, то совместимость тоже может быть нарушена. У меня гарантируется совместимость с устройствами, которые соответствуют стандарту - koyodza(15.11.2012 16:16)
- я имел в виду ситуацию, когда разработчику протокола взбредет в голову использовать резерв(добавить фичу), ХЗ для чего, может для хабов каких. И Ваше старое устройство начнет ловить "ошибочные" пакеты. - abivan(15.11.2012 16:12)
- не должен появиться, BROADCAST определён как нулевой. Можете убрать, я сразу предупредил, что этот пункт - собственное ноу-хау koyodza(264 знак., 15.11.2012 14:48 - 14:50)
- тоже иногда испльзую, только обычно 0xAA или 0x85 в качестве маркера начала пакета, заодно и синхронизации модемов (типа построенных на fx469 и т.п.), хотя в нынешних проектах неактуально, поэтому оставляю чистый modbus. - AVF(16.11.2012 10:54)
- вообще я использую примерно такой алгоритм koyodza(782 знак., 15.11.2012 14:28 - 17:41)
- повторяю, идите нах с этими "новшествами". Не забывайте, что кто-то может почитать вашу писанину и сделать большую **йню не подумавши. Есть только один критерий конца пакета в ModBus RTU - таймаут, и всё. Не нравится - переходите на ModBus ASCII koyodza(21 знак., 15.11.2012 14:15)
- не начнутся - начало пакета определяется по тайм-ауту приема - zeleny(15.11.2012 14:09)
- бывают коллизии (не говоря о "вааще неправильно") - Vit(15.11.2012 13:57)
- А потому что CRC призвана защитить(обнаружением) посылку от помех на линии. И что Вы будете делать если пройдет помеха и CRC совпадет? При помехах на линии и так есть вероятность принять неправильную посылку, а Вы еще хотите усугубить ситуацию и abivan(30 знак., 15.11.2012 14:28)
- почему ? даже если адрес и CRC правильные ? - zeleny(15.11.2012 13:53)
- слейв вообще не имеет права разбирать "сразу". В MODBUS RTU признаком конца пакета является только пауза на линии не менее 3,5Т и ни что другое koyodza(308 знак., 14.11.2012 16:05)
- а 1.5 интервала разве не является признаком окончания пакета? abivan(504 знак., 14.11.2012 16:35)
- откуда цитата? 1,5Т вроде как должен считаться ошибочным разрывом, но чаще он вообще не отслеживается - koyodza(14.11.2012 16:58)
- вот с оригинала abivan(805 знак., 14.11.2012 17:13)
- отсюда следует, что при паузе 1,5Т всё что принято бросить нах и не разбирать, а начать принимать следующий пакет. Т.е. 1,5Т это признак бракованного пакета, а не признак завершения пакета koyodza(176 знак., 14.11.2012 17:20)
- Небольшая поправка. Не "начать принимать следующий пакет", а ожидать окончания текущего пакета/начало следующего. То бишь отслеживать паузу 3,5Т. Хотя лично я в RTU-ных протоколах про 1,5Т обычно не заморачиваюсь, ориентируясь на rezident(31 знак., 14.11.2012 18:19)
- Пытаюсь разобраться. Читаем оригинал abivan(553 знак., 15.11.2012 10:14)
- Вы читаете давно устаревшее описание протокола. Откройте текущую версию стандарта по ссылке, там довольно наглядные диаграммы состояний и никаких упоминаний про "next byte will be the address field of a new message". Интервал 1.5 сделан, видимо, AlexG(174 знак., 15.11.2012 11:07, ссылка)
- RTU через модем? Мсье знает толк в извращениях. - ASDFS(15.11.2012 13:32)
- Не отрицаю :) Но сильно не хотелось тратить в два раза больше времени на передачу Modbus-ASCII. Некоторым модемам то что RTU пакет помещается в буфер целиком совершенно не мешает его рвать, причем это может выясниться на последнем модеме из AlexG(116 знак., 15.11.2012 19:17)
- Пурква па? Если в буфер модема помещается весь пакет целиком. - rezident(15.11.2012 19:05)
- Да хоть три пакета. Нет гарантий что дойдет без временнЫх разрывов. ASDFS(56 знак., 15.11.2012 19:25)
- сенкс, теперь ясна причина разночтения. - abivan(15.11.2012 12:40)
- RTU через модем? Мсье знает толк в извращениях. - ASDFS(15.11.2012 13:32)
- Вы читаете давно устаревшее описание протокола. Откройте текущую версию стандарта по ссылке, там довольно наглядные диаграммы состояний и никаких упоминаний про "next byte will be the address field of a new message". Интервал 1.5 сделан, видимо, AlexG(174 знак., 15.11.2012 11:07, ссылка)
- да, верно - koyodza(14.11.2012 18:45)
- Пытаюсь разобраться. Читаем оригинал abivan(553 знак., 15.11.2012 10:14)
- Небольшая поправка. Не "начать принимать следующий пакет", а ожидать окончания текущего пакета/начало следующего. То бишь отслеживать паузу 3,5Т. Хотя лично я в RTU-ных протоколах про 1,5Т обычно не заморачиваюсь, ориентируясь на rezident(31 знак., 14.11.2012 18:19)
- отсюда следует, что при паузе 1,5Т всё что принято бросить нах и не разбирать, а начать принимать следующий пакет. Т.е. 1,5Т это признак бракованного пакета, а не признак завершения пакета koyodza(176 знак., 14.11.2012 17:20)
- вот с оригинала abivan(805 знак., 14.11.2012 17:13)
- откуда цитата? 1,5Т вроде как должен считаться ошибочным разрывом, но чаще он вообще не отслеживается - koyodza(14.11.2012 16:58)
- и еще вопрос. Ljutik1(108 знак., 14.11.2012 16:06)koyodza
- Следует всегда предусматривать настраиваемые таймауты для как минимум двух событий: а) ожидание ответа ведомого, б) задержка передачи ответа после приема запроса. Первая нужна для тайм-слота, в котором адресуемому слейву разрешено отвечать. rezident(368 знак., 14.11.2012 16:14)
- Вы где нибудь видели в природе репитеры RS485? Вопрос без всякого подвоха и претензий, просто не понятен алгоритм определения направления передачи в данном девайсе, универсальный и работающий при любом протоколе (не только для MODBUS RTU). Я sin(55 знак., 14.11.2012 16:28, )
- Конечно. Я сам там такой разрабатывал 6+ лет назад. Мы производим их мелкой серией. Устройство выполняет функции конвертера RS232<->2*RS485 и репитера RS485<->RS485. rezident(1174 знак., 14.11.2012 17:57 - 18:02)
- да, есть такие. Простейший вариант использует одновибраторы, более сложные попадались на ПЛИС - koyodza(14.11.2012 16:59)
- Они наверное все таки имеют какие нибудь ограничения на протокол и на скорость передачи. К примеру, не возбраняется же на RS485 организовать мультимастерную сеть, хотя наверное это и экзотика. Здесь мне кажется возможны нюансы: сложно будет sin(225 знак., 14.11.2012 17:10, )
- Я и сам разрабатывал, с конфигурацией микроконтроллером. Если протокол позволяет производить разворот на весь пакет, то потери помехоустойчивости не происходит. - Vladimir Ljaschko(14.11.2012 17:26)
- те, что мне попадались, настраивались на нужную скорость джамперами - koyodza(14.11.2012 17:17)
- Они наверное все таки имеют какие нибудь ограничения на протокол и на скорость передачи. К примеру, не возбраняется же на RS485 организовать мультимастерную сеть, хотя наверное это и экзотика. Здесь мне кажется возможны нюансы: сложно будет sin(225 знак., 14.11.2012 17:10, )
- Вы где нибудь видели в природе репитеры RS485? Вопрос без всякого подвоха и претензий, просто не понятен алгоритм определения направления передачи в данном девайсе, универсальный и работающий при любом протоколе (не только для MODBUS RTU). Я sin(55 знак., 14.11.2012 16:28, )
- обычно это время настраивается пользователем (вернее, "администратором")в пределах от десятков-сотни мсек до единиц сек, зависит от физической скорости передачи, структуры системы и т.д. - koyodza(14.11.2012 16:09)
- Следует всегда предусматривать настраиваемые таймауты для как минимум двух событий: а) ожидание ответа ведомого, б) задержка передачи ответа после приема запроса. Первая нужна для тайм-слота, в котором адресуемому слейву разрешено отвечать. rezident(368 знак., 14.11.2012 16:14)
- а 1.5 интервала разве не является признаком окончания пакета? abivan(504 знак., 14.11.2012 16:35)
- Сразу. Требование паузы 3.5 char устарело сразу после появления интерфейсов USB/Ethernet/Bluetooth-RS485, где такие точные паузы не выдерживаются, и могут быть разрывы в середине пакетов. Конец пакета определяетя по правильной CRC, ошибки - по zeleny(11 знак., 15.11.2012 13:26)