![]() |
Модераторы: PILOT, ManiaK, Mazzi |
![]() ![]() ![]() |
|
xvr |
|
||||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Да ну? И где же они выставляются? Особено интересует как сделать паузу в 3 символа при передаче.
![]() То, что у вас оно работало это еще ничего не значит, вам просто сильно повезло - фреймы шли отдельно друг от друга, поток фреймов ваша реализация не отловила бы.
![]() PS. По поводу Modbus RTU был очень длинный топик на electronix.ru (не могу дать ссылку - он сейчас лежит) |
||||||||||||||
|
|||||||||||||||
Felan |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: нет Всего: 7 |
В MSDN написано, что эти таймауты выставить можно. Оснований недоверять MSDN у меня нет. Я ставил. Это работало.
Какой код? Функция SetCommTimeouts. Вот и весь код. Я незнаю, что она там гарантирует (кстати, Windows не является системой реального времени, так что требовать от нее гарантий соблюдения каких-либо временных интервалов вообще, мягко говоря, некорректно), но то, что ReadFile возвращала управление если они не соблюдались, это было. А по поводу мониторинга среды, что бы выделить из нее пакет, это я не знаю как сделать... возможно на событиях можно.... которые драйвер САМ возбуждает. Но я не знаю. У нас работа была только с одним устройством одновременно. Фреймы действительно шли отдельно. Но это не умаляет того, что таймауты выдерживались. Код я уже давал. Работало все с тем классом, ссылку на который я давал.
Незнаю, причем тут паяльник, ничего не понимаю в чипах и паяльниках. Но в MSDN написано, что драйвер может автоматически устанавливать(или сбрасывать я точно не понмю, помню, что проблемы были в том, что драйвер мог только одно делать, а у нас переходники были на другое настроены. Пришлось электронщикам переходник перепаять, что бы там наоборот было).
А что именно вы пытались сделать? Как я понял, хотели отлавливать кадры по таймингам? Этого сделать скорее всего не получится. Только если использовать, как я уже гвоорил, события. И то, я не знаю, будет ли это работать. А в общем случае, компорт не предназначен для того, что бы анализировать среду. Если я прав, и вы хотели сделать именно это, все понятно. Молтком сложно вскапать огород.
Сложно тут что-то ответить. Есть вообще масса разного народа. Я говорю за себя. В нашем частном случае, когда пакеты шли поочереди и на шине было только одно устройство все работало прекрасно.
Потому что давно было, потому и плохо помню. Еще раз. Было организовано взаимодействие одного устройства на базе МК и компьютера через RS485, с использованием переходника RS232<>RS485, который возвращал эхо. После этого, было обнаружено, что в делфи неправильно объявлены константы для настройки драйвера порта. Константы управлением DTR/RTS были исправлены и драйвер настроен так, что бы сигнал (DTR или RTS я сейчас не помню, который именно использовали наши электронщики) изменял свое состояние в зависимости от наличия/отсутсвия байт в буфере порта. Смотрели на осциллографе. Все работало. Ссылку не надо, т.к. давно этим не занимаюсь. Просто хотел поделиться тем, что когда-то делал. И у меня, допускаю что по странному везению ![]() -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
||||||||||
|
|||||||||||
xvr |
|
||||||||||||||||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
То, что написано в MSDN не может поменять АППАРАТУРУ в компьютере. Эта АППАРАТУРА не позволяет отлавливать timeout'ы на уровне отдельных символов в входном и выходном потоке. Любой timeout, поставленный через SetCommTimeouts будет округлен в большую сторону до величины тика системного таймера. MSDN по этому поводу молчит.
Собственно зачем я весь этот разговор завел. Это касалось вашего заявления, что Modbus ASCII нафиг не нужен, а везде вместо него имеет смысл применять Modbus RTU. Я заявляю, что ПОЛНОЦЕННЫЙ (полностью соотвествующий стандарту) Modbus RTU на ЛЮБОЙ PC без специальной дополнительной аппаратурой реализовать НЕВОЗМОЖНО. В отличии от Modbus ASCII, который реализовать МОЖНО. |
||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
Felan |
|
||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: нет Всего: 7 |
Я не говорил такого. Я сказал:
И вы меня в этом не разубедили. То, что текстовые протоколы в частных случаях бывают полезны, я не отрицаю. Здесь же все исключительно ИМХО. Требует. Но он писан для взаимодействия MK<>MK. А для PC надо использовать другие методы. Наш метод, в нашем частном случае работал и не знал проблем.
Нет, настолько досконально я не проверял. Не было нужды, т.к. все работало.
Я нигде не говорил, что реализовал полноценный MUDBU RTU, да еще и дословно по спецификации. Я сказал, что было сделано так-то и так-то и это работало.
Справедливо. Особенно для разных осей... У нас все это работало только под XP. У XP наверно везде один драйвер порта... во всяком случае я не слышал, что кому-то пришло в голову его поменять. Но может быть и разный. С чего? С того, что я не электронщик? Я нигде этого не говорил.
Полностью согласен. Еще раз. Спецификация MODBUS писана для MK<>MK. Для PC нужно использовать ДРУГИЕ МЕХАНИЗМЫ. Тем более, что в данном конкретном случае кадры как два пальца определяются по размеру. По крайней мере я лично их определял именно так. И все было хорошо. -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
||||||||||||
|
|||||||||||||
xvr |
|
||||||||||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Ок. Если под железом понимается связь 2х и более спец. устройств, то полностью согласен. Если же это железо собирается подключаться к PC, то текстовый формат обмена может быть полезен (правда при условии, что его можно использовать с обычного терминала, без ручного подсчета всяких контрольных сумм и пр). И довольно много железок используют такой формат (например вся продукция фирмы Extron). Некоторые железки используют оба формата, например видеокоммутатор от системы видеонаблюдения фирмы Philips использует текстовые команды для управления (они документированны) и отдельный бинарный протокол (недокументированный) для обмена со своим софтом на PC. С другой стороны текстовые протоколы более трудоемки для реализации в железе и обычно на это идут неохотно ![]() Текстовый протокол позволяет посылать железке ПРОИЗВОЛЬНЫЕ команды из обычного терминала не имея специального софта, тем более что обычно в таком специальном софте не предусматривается возможность отослать железке ПРОИЗВОЛЬНУЮ команду.
![]()
![]()
Кстати, по поводу текстовых и бинарных форматов и специального софта: У меня был один проект, где PC взаимодействовал с внешней железкой. Взаимодействие происходило по RS232 или по сети (TCP), использовался бинарный формат. В процессе отладки всей системы мне ПРИШЛОСЬ в софте со стороны PC реализовать отправку в железку введенных (в виде hex дампа) пользователем пакетов, иначе было очень трудно ее (железку) отлаживать. |
||||||||||||||||||||
|
|||||||||||||||||||||
Felan |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: нет Всего: 7 |
Эх ![]() ![]() ![]() ![]() Я искренне не понимаю, что такое "ПРОИЗВОЛЬНАЯ КОМАНДА". И зачем ее посылать устройству, если оно ее все равно не поймет? ![]()
Я имел ввиду, что спецификация модбаса создавалась для промышленных сетей, и для промышленной автоматики. И там ни разу не учитывалось, что надо будет обеспечить взаимодействие с компьютером да еще и именно из под Windows. Ибо Windows не есть реал-тайм система, и она не может использоваться в серьезных автоматических системах без специальных надстроек, которые обеспечивают псевдо-реал-тайм среду. Даже среда и протокол для модбаса называются RS485, а не RS232. Следовательно не подразумевалось никаких СТАНДАРТНЫХ РЕШЕНИЙ ДЛЯ ИХ СОПРЯЖЕНИЯ. А все что делает через переходники и пр. это есть шаманство. То, что текстовый имеет свои особенности, и, в данном случае, может быть действительно удобнее, я не спорю. Но, мы делали бинарный и у нас все работало. Это все что я декларирую ![]()
Могут. Но они все равно должны обеспечивать работу драйвера и его спецификацию. Наверняка, что есть случаи, когда это не так, и ты прав. Я с ними не встречался ![]() Не иначе, как сегодня небо упадет на землю! ![]() ![]() ![]() Понятное дело. Просто мне кажется что это надо понимать, и учитывать при проектировании системы изначально.
Могут. И даже скорее всего будут. Но у нас такого не было. У нас по проще условия были. Но, уверен, что это то же решаемо. Хотя я не представляю себе как символ может потерятся... Ну исказиться еще ладно, а потеряться... Кусок кабеля разве что с ним украдут ![]() ![]() ![]() Даже если пакет придет не полностью, это будет обнаружено на уровне CRC, и можно проанализировать буфер, для того, чтобы найти начало следующего. Это конечно то же шаманство, ну а как по другому? ![]()
И что это дало? Как были цифры так и остались, только в другом представлении ![]() Это сообщение отредактировал(а) Felan - 17.4.2008, 14:32 -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
||||||||||
|
|||||||||||
Cergiy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 15.4.2008 Репутация: нет Всего: нет |
Товарищи, а оно заработало!!!
![]() Точнее заработало пока только запись, а вот чтение не получается, он мне постоянно показывает что буфер пустой. Но я вообще-то не могу даже разобраться с командой чтения 03h. В файле что я присоединил написано какой она имеет вид, и что там подразумевается под "количество запрашиваемых (передаваемых) параметров", когда я просто хочу считать текущую температуру, не понятно. |
|||
|
||||
xvr |
|
||||||||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Текстовый лучше тогда, когда невозможна отладка со стороны PC. Например - твой девайс стоит на объекте, там нет ни Delphi ни вообще какого либо компилятора. Текстов твоей программы для связи с железкой тоже нет (хотя они и нафиг не нужны без компилятора). Есть только PC с последней версией управляющей программы и терминалом. Выясняется, что все вместе не работает и логов, встроенных в программу, оказалось недостаточно, что бы понять причину. Что делать? Или хотя бы для начала разобраться кто виновать - железка или программа?
![]() ![]()
![]()
|
||||||||||||||||||
|
|||||||||||||||||||
Felan |
|
||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: нет Всего: 7 |
Cergiy, Ты бы хоть код привел. Сказал, что пользуешь, мои классы или нет. А так - ошибка в 17-ой строке
![]()
Я не понял, почему невозможна отладка на PC? Отладка программы контроллера очень даже возможна. А отладкой управляющей программы надо было раньше заниматься ![]() Понятно, что ошибки могут потом всплыть, но опять же перекомпилировать ее ты же не будешь на объекте? Следовательно перекомпилят ее там где писали. Если логов встроенных в программу недостаточно то это проблема программы, надо делать достаточные логи ![]() Но если программа хороманогая по своей задумке, сути и реализации... то лучше ее вообще не использовать, лучше сразу терминалом ![]()
Я не понял, что это за управляющая программа, которая реализует не все команды? Ну допустим в этом есть высокий смысл, непонятный мне. Но тогда эта программа уж точно не предназначена для отладки. Еще раз, отладку чего ты хочешь делать т.о.? Найти ошибки в УП? Это да. Но овчинка выделки не стоит. Найти ошибки в МК? Для этого не нужен текстовый протокол. Достаточно нормального лога.
Ну в серьезных системах показометры тоже должны быть серьезными. А серьезному показометру не зазорно сделать маленький контроллер, который будет работать адаптером. Я думаю что это будет правильно во всех смыслах. Во например: Канал передачи - лес. Показометр - глаз. Днем все видно хорошо. Вечером хуже, но приемлемо. Ночью - нифига не видно. При полной луне что-то можно увидеть. Что бы видеть ночью используют спец. технику предназначенную специально для этого. Почему бы не использовать спец. заточенный конвертер на базе еще одного МК который будет переводить сплошной поток кадров, которые вообще передаются на конкурирующей основе, в четко разделенные последовательности с которыми можно без проблем работать PC? Это идеологически правильное решение. А текстовый протокол это шаманство. Просто его добавили, наверно (я незнаю историю модбаса) после того, как столкнулись проблемами о которых ты говоришь.
Да понятно, что среда любая. Но мы говорим про конкретную. Вот видишь, есть железные конверторы ![]() Начальство придумало, что мы должны разработать. Начальство поменьше подумало и решило, что надо RS485 (ну, надо сказать, что это было оправдано), електроньщики почесали рему и сказали, что надо переходники, каждый стоит... незнаю $10 например. Начальство поменьше сказало, дороговато, поищите еще что-нибудь, а то начальство завернет. Начальство посмотрело... переобуть свой новый лексус не получится, если столько денег отвалить... Давайте ищите варианты дешевле. Ну и вкрячили дешевый, с эхом, по $1 за переходник. А разработчики должны тр№;ся, но сделать что б работало, причем не через полгода, а вчера. Не знаю как там "у вас", но у нас, в частной лавочке было именно так ![]() Я к чему это все завел... К тому, что надо делать правильно. А правильно дорого. Вот и появляются всякие разные "дешевые" решения ![]() ![]()
Наверно да.... С ходу ничего в голову не приходит. А то, что попрощаться, это безусловно ![]() Но, подобную фигню, мне кажется, можно реализовать на эвентах. Можно пробовать... Если кто-нибудь нормально профинансировал бы, я бы может попробовал, в свободное от работы время поковыряться ![]()
Ну убей меня об стенку, зачем для этого ТЕКСТОВЫЙ ПРОТОКОЛ? Ну сделал в программе отправку любой последовательности, и все ![]() ЗЫЖ Вобщем, единственное, в чем я теперь стобой соглашусь полностью, это то, что текстовый протокол, который имее маркер конца кадра, позволяет избежать проблем связанных с выделение этих кадров из потока. ![]() ![]() ![]() ![]() -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
||||||||||||
|
|||||||||||||
xvr |
|
||||||||||||||||||||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Потому что ты сидишь на объекте и на PC, который там есть ничего нет ![]() ![]()
С другой стороны, даже если управляющая программа и читает все регистры, она это делает по своей собственной инициативе и скорее всего невозможно заставить ее читать их так (и в том порядке) как хочет пользователь/разработчик. (Вариант с правкой сорцов и перекомпиляцией мы не рассматриваем - на объекте нет ни сорцов ни компилятора)
![]()
![]()
![]()
Увы я видел только 2 таких программы - одну я уже упоминал, а вторая была среда програмирования контролеров фирмы AMX (контроллеры для 'Умных домов'), она позволяла отправить любую команду любому устройству, включенному в ее сеть.
![]() |
||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||
Felan |
|
||||||||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: нет Всего: 7 |
Я прекрасно понимаю, что это очень реальный расклад. Но в таких случаях у нас ВСЕГДА предусматривался спец. режим для отладки.
Легко! Для этого обычно пишут заглушку, т.е. эмулятор, который реализует интерфейс системы. Мне кажется, что это настолько очевидно, что тех, кто так не делаешь, я пожалуй не назвал бы профессионалами.
Зачем каждую строчку то логировать? Достаточно писать в лог только то, что нужно. Нет в этом ничего такого страшного, а есть такой паттерн проектирования "Команда", очень он способствует всяким удобствам в разработке подобного ПО.
Блин, уел. Ладно. Просто мне, как человеку разрабатывавшему подобный софт не пришла голову простая до безобразия мысль, что у команды чтения регистра не может быть параметра, который указывает какой именно регистр надо прочитать. А так же не пришло в голову, что в целях отладки этот параметр нельзя изменить... Отсутствие отладочного режима тоже... Ты сам не находишь сдесь противоречия? Сделать что-то, чем-то, что для делания этого не предназначено?
Вариант 2. Еще раз, то, что по не позволят элементарно проверить свою работу, т.е. работу команд, которые оно должно выполнять, но не выполняет, это значит, что плохое ПО. Протокол здесь НИ ПРИЧЕМ! Причем здесь посторонние команды, я тоже не понимаю. Ну увидит он, что у него не читается еще и остальные 99, что это кардинально изменит?
Как не видишь смысла!? Ты же сам сказал, что сделать штатными средствами НЕВОЗМОЖНО! Да, тут выкрутились, оказалось, что есть текстовый протокол, а если бы его не было? Как можно сделать, когда ты сам вчера говорил, что ЧИП ПОРТА И ЕГО УПРАВЛЯЮЩЕЕ ПО НЕ ПОЗВОЛЯЕТ ДЕЛАТЬ "ЭТО" В ПРИНЦИПЕ??? ![]() ![]() ![]() Я отказываюсь понимать твою логику ![]()
Ну вот видишь, по твоим же словам, была спецификация, налетели не грабли, под шаманили ![]()
Я так и сделал, полтора года назад. ![]()
Вот и я про то, что не самоцель. И что реализовывать его обосновывая тем, что "читать удобнее", считаю глупостью. Если в этом есть РЕАЛЬНАЯ НЕОБХОДИМОСТЬ - да пожалуйста, сам первый и реализую ![]() Ладно. Я сдаюсь ![]() -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
||||||||||||||||||
|
|||||||||||||||||||
xvr |
|
||||||||||||||||||||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Значит ваше ПО уникальное - практически ни в одном ПО, распространяемым с железками, такого режима нет (по крайней мере мне не попадалось, за редким исключением)
![]()
![]()
![]() ![]()
![]() ![]() Это сообщение отредактировал(а) xvr - 18.4.2008, 13:36 |
||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||
Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: нет Всего: 7 |
Ну поскольку мы ПО для себя писали, то мы и предусматривали.
Раз про "удобство чтения" аргументов не было, значит с остальным согласен ![]() -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
Cergiy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 15.4.2008 Репутация: нет Всего: нет |
У меня там солянка, но вообще мне порекомендовали dll-ху и с ней все заработало очень быстро, пример кода что-то типа sio_write (3, @buf, 17), то есть пишем в COM-3 из массива buf типа char, 17 символов ![]() Но я не могу в логике MODBUSA разобраться, сейчас процитирую. Для команд 03h либо 04h(кстати, чем они отличаются, в мануале написано что они обе для того чтобы читать несколько параметров) существует следущая форма запроса: :1 Adr 2 Fc 2 PAdr 4 PNum 4 LRC 2 CRLF 2(цифры обозначают количество байт), где 1) Adr – сетевой адрес устройства, 2 знака 2) Fc – код функции, 2 знака 3) PAdr – адрес параметра, 4 знака 4) PNum – количество запрашиваемых (передаваемых) параметров от PAdr включительно, 4 знака итд. Так вот мне не понятно откуда я должен узнать PNum? Я раньше подцеплял мануал по своему прибору Термодат-17КЗ (можете посмотреть). Мне нужно считывать текущее значение температуры, то есть я адрес параметра там посмотрел - 0170h, ну а про количество параметров там ничего не сказано. То есть я вообще не понимаю о чем речь. Может мне кто помочь? |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Количество параметров - 1 (количество подряд идущих регистров) Команды 03 и 04 отличаются набором регистров, которые они читают. 03 - Holding Registers, 04 - Input Registers. Что понимается под Holding и Input Registers определяет устройство. В вашем случае это одно и тоже. Вообще Modbus оперирует понятиями, которые давно не имеют физического соотвествия с какой либо реальной аппаратурой ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |