0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 8
|
|||||||||||
1 | |||||||||||
Подскажите пример кода для передачи данных по RS48506.11.2015, 01:12. Показов 19087. Ответов 12
Метки нет (Все метки)
Здравствуйте. Возникла необходимость передать на прибор команду по RS485 порту.
Запрос в HEX-формате выглядит следующим образом: 01 05 00 00 FF 00 8C 3A. Протокол передачи ModbusRTU. С помощью компьютера и программы ModBus Tester это сделать не сложно. Хотелось бы реализовать это на автономном контроллере. В принципе какой контроллер значения не имеет, но хотелось бы на 16F84A. Просто у меня программатор к нему есть. В сети нашел пример софтового UART-a для него. Кликните здесь для просмотра всего текста
По идее должно "Hello World" выдавать, но у меня пустой терминал. Хотел вместо этого сообщения посылку запроса просто вписать..интересно так можно или нужно еще протокол Modbus прописывать? Еще с применением библиотечных функций под mikroC PRO for AVR, для контроллера ATMEGA16. Кликните здесь для просмотра всего текста
Запустил в Proteus второй пример. В его терминалке в режиме "HEX" видны пакеты(запросы). Они идут через небольшие промежутки времени. Посылка имеет такой вид "96 AD 81 AA 74 A9". Только не могу найти где эта последовательность прописана, чтобы заменить ее на нужную мне 01 05 00 00 FF 00 8C 3A. ?
0
|
06.11.2015, 01:12 | |
Ответы с готовыми решениями:
12
Пример использования передачи данных из VB в RS485 Нужен пример использования Nanomsg для передачи данных Пример использования MSComm для работы с RS485 Подскажите пример кода для реализации следущего (php) |
17 / 17 / 13
Регистрация: 06.08.2015
Сообщений: 73
|
|
06.11.2015, 07:05 | 2 |
попробуйте библиотеку freemodbus она хорошо портируется на микроконтроллеры, есть много demo-примеров под разные микроконтроллеры.
1
|
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 8
|
|
09.11.2015, 22:56 [ТС] | 3 |
Спасибо за подсказку. Нашел статью как портировать freemodbus, но смотря на код я не пойму откуда что берется.
Читал описание на стандарт RS-485 но там только пример для передачи строки в ASCII-коде. Решил немного разобраться. Подцепился осциллографом на RS-485 порт и дал посылку программой ModbusTester. Так выглядит команда на включение реле: 01 05 00 00 FF 00 8C 3A Так на выключение: 01 05 00 00 00 00 CD CA Опыта в программировании у меня мало. И чтобы понять как работает протокол будет проще самому написать с нуля побитовую передачу строки. Хотя программа получится длинной и топорной. т.е 0бит-пауза-1бит-пауза и.т.д. В итоге программа должно повторить генерацию меандра. Правильно ли я распознал структуру протокола? Я так понимаю транзисторный ключ на выходе "RX" контроллера должен выдавать биты с какой то определенной фиксированной частотой?
0
|
7 / 7 / 1
Регистрация: 09.10.2014
Сообщений: 30
|
|
13.11.2015, 13:18 | 5 |
RS485 это стандарт физического уровня, Modbus- коммуникационный протокол. Вы как-то всё в одну кучу свалили. И если уж делаете на PIC, то возьмите что-то поновее с аппаратным USORT, хотя-бы тот-же PIC16F628.
0
|
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 8
|
|
15.11.2015, 00:50 [ТС] | 6 |
Просто после нескольких дней непрерывного перелопачивания информации в голове каша. В инете оч. мало систематизированной информации, или возможно она есть, но моих знаний недостаточно для ее понимания. Я пока не привязываюсь к какому-то определенному типу контроллера. Впринципе нашел готовый пример на PIC16F877. Но хотелось бы самому разобраться какие процессы идут в нем. Понятно что "0" и "1" в разных комбинациях..Но прихожу к выводу что нужно еще довольно хорошо знать схемотехнику контроллера, чтобы настроиться на правильное понимание концепции написания кода. Сколько раз пытался разобраться по блок-схемам, анализируя логические связи программы,- особо ничего в голове не откладывается. Посмотреть бы полную электрическую схему хотябы на тот же Intel 8080 ..хотя и получится она наверно на сотню другую страниц. Максимум что я смог найти, это толковое описание КМ1816ВЕ51 в нем даже схемотехника портов ввода/вывода показана на дискретных элементах. смотришь и сразу понятно что порт может работать как на вход так и на выход. Потом установил AVR Simulator IDE, там наглядно видно как биты скачут. И Протеус пробовал, но он не дает полной развернутой информации для понимания, контроллер в нем просто квадратик с портами ввода-вывода. Хорошо бы для примера в реальном времени видеть полную электрическую схему микроконтроллера и параллельно идущую программу. Привык я все с паяльником на дискретной логике лепить, а тут вот виртуализациия.. нашел очерк Программирование на WinAVR Си зарядного устройства (ZU v1.7) на AT Mega32 и книгу Ч.Петцольд - Код. -обе написаны в понятной мне форме. Буду разбираться что к чему.
0
|
7 / 7 / 1
Регистрация: 09.10.2014
Сообщений: 30
|
|
15.11.2015, 05:10 | 7 |
Не пойму я в чём у Вас трудности. На выходе МК ставится AD485, или аналогичная микросхема. RX МК подключается к TX микросхемы и наоборот. Отдельным выводом управляется направление передачи, в сети этого полно. Записали в регистр МК байт - он улетел. Что там происходит на шине, Вам на данном этапе должно быть всё равно, всё, что нужно, уже придумано. Для чего Вам электрическая схема самого модуля UART или порта ввода/вывода МК при написании программы? IMHO усложняете, всё это полезно знать, но не сейчас, а настоящие сложности ещё предстоят.
0
|
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 8
|
||||||
16.11.2015, 20:33 [ТС] | 8 | |||||
Среда разработки CVAVR.
Для Atmega8 применил такой код:
В программе пробовал разные способы подачи информации. Отправляем такой фрейм: Тишина Адрес(8бит) Функция(8бит) Данные(n бит) CRC(16бит) Тишина Данные, адрес, команда, и CRC передаются побайтно. Последовательность байт от одной "тишины" до другой это пакет, внутри которого, маленькие "паузочки" ( стоп-биты ), отделяющие один байт от другого и дающие возможность схемам USORTа на передающей и приемной стороне синхронизироваться. Из описания на Modbus RTU Формат каждого байта в RTU-режиме: Система кодировки: 8-ми битовая двоичная, шестнадцатиричная 0-9, A-F Две шестнадцатиричные цифры содержатся в каждом 8-ми битовом байте сообщения. Назначение битов: 1 старт бит 8 бит данных, младшим значащим разрядом вперед 1 бит паритета; нет бита паритета 1 стоп бит если есть паритет; 2 бита если нет паритета Контрольная сумма: (CRC) Смотрел библиотеку freemodbus, как предлагал RO. В ней полноценная реализация протокола для двустороннего обмена. Но мне нужна упрощенная программа, чтобы отправить один фрейм для эксперимента.
0
|
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 8
|
|
16.11.2015, 22:30 [ТС] | 10 |
Например у нас в программе есть переменная в формате int. Как передать ее во входной буфер UART? Нужно ли выполнять преобразование int_to_bool или этим компилятор занимается? Побитно заполнять сдвиговый регистр или же он может сразу 1 байт информации в свои 8 ячеек памяти может принять. Если побитно, то по аналогии как стек заполняется..бит за битом. А потом как заполнился даем команду на передачу, регистр отдает в обратной последовательности и пошли импульсы состояния битовых ячеек на транзисторный ключ который уже на массу коротит вывод "TX" контроллера. И опять же этот ключ нормально открытый или закрытый (p-n-p или n-p-n). Какова длительнось тактирующего импульса по окончании передачи одного байта? или же он сам
генерится железом контроллера.. Нужно видеть хотя бы примерную схему, чтобы составить представление с чем ты имеешь дело и что программируешь. У меня конечно есть исходник софтварной реализации UART на PIC16А84. Цифровая модель - таже схема только в другой проекции. Не нарисованная, а воплощенная в коде. но опять же для меня пока сложно прочитать и понять что в нем написано. Хотя он и с комментариями. На работе программирую логические контроллеры в CodeSys на объектно-ориентированном языке CFC. Вот он для меня понятен. Вот и подумал что мне наверно было проще понять язык С и провести аналогию с моими знаниями в электронике. Это как перевести с английского на русский. Бесспорно нужно еще читать и изучать даташиты и соответствующую литературу. Но если бы в даташитах прилагалась бы еще и схема то мне бы достаточно было бы взглянуть на нее. Но кто ж ее приложит, это ведь секрет фирмы. Просто мне понадобилось провести небольшой эксперимент с прибором вот и подумал что несложно будет написать код для контроллера.. Думаю если бы я видел подробное внутреннее строение контроллера, возможно быстрее понял язык программирования. У меня знания в основном в области электроники, и с техникой я на "железном" языке разговариваю Добавлено через 25 минут Ясно, почему то я считал что паритет это и есть CRC. Погуглил по этому запросу и нашел новую для себя информацию в документации "Модуль вывода дискретного сигнала. Описание протокола обмена данными ModbusRTU" там дано более подробное описание протокола, чем в инструкции на мой прибор. Спасибо, буду изучать и пробовать.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
|
|
16.11.2015, 22:57 | 11 |
ну можно и так сказать
доводит количество единиц до четного если 00000011 то 0 если 00010000 то 1 могу вот еще что сказать итого 1 + 8 +1+1 или 1+8+2 11 бит 1+8+1 =10 бит твоя железка просто не понимает ждет 11 битом 1 (стопбит) а приходит 0(стартбит) вряд ли тебе поможет схема на сотни тысяч транзисторов, а блок схемы вроде на любой камень есть
1
|
7 / 7 / 1
Регистрация: 09.10.2014
Сообщений: 30
|
|
17.11.2015, 04:52 | 12 |
IMHO Вы:
1. Всё усложняете безо всякой необходимости; 2. Не читаете ни даташитов, ни какой-либо иной документации. 3. За деревьями не видите леса. Ответы на все Ваши вопросы есть в даташите на ATMega, в книге Кернигана и Ричи "Язык программирования Си" и в той-же Википедии.
0
|
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 8
|
||||||
19.11.2015, 01:27 [ТС] | 13 | |||||
Всем спасибо за конструктивную критику и пинки в нужном направлении. Все заработало, прибор отвечает на запрос.
0
|
19.11.2015, 01:27 | |
19.11.2015, 01:27 | |
Помогаю со студенческими работами здесь
13
Подскажите программу для передачи обновленных данных Проведите пример программы приема и передачи данных с использованием com порта Пример передачи данных с использованием стека протоколов HTTP/TCP/IP/Wi-Fi Ребята подскажите пример кода Подскажите Пример Создания Приложения Visual studio для баз данных microsoft sql server Пример передачи параметра для параметрического запроса Подскажите способ передачи данных через сеть Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |