Обсуждаем контроллеры компании Atmel.
Пн июл 02, 2012 18:24:10
Здравствуйте! Появилась необходимость создать Slave устройство AVR с протоколом Modbus.
Исходники модуля с сайта
http://freemodbus.berlios.de/. Создал проект в AVR Studio 4.18, скомпилировал. Создал проект в протеусе.
Понимаю, что нужно посылать в МК команду, по которой выдается результат. ТОлько как это грамотно сделать, используя функции Freemodbus? Есть функция eMBASCIISend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength ). С помощью нее пробовал кидать элементы массива на выход. Терминал в Proteus пишет что-то типа :03F304. Понимаю, что надо сделать по-другому.
Вопрос - в какой поседовательности какие функии вызывать и что им передавать?
Пн июл 02, 2012 18:40:04
А может всё же начать с изучения спецификации на протокол ModBus? В инете есть на русском языке.
1. В каком режиме предполагается работать устройству - RTU или ASCII ?
2. У пакета не видно контрольной суммы.
Учите документацию. А зачем вам понадобилось именно modbus? Для "домашних" применений он избыточный. Можно всё упростить, но подозреваю, что вы весьма начинающий, и не сможете этого сделать.
Вт июл 03, 2012 23:06:36
Спасибо!
1. ASCII.
2. Да, разобрался, вызывал голую функцию отправки, что делать нельзя.
Сейчас ищу программу Mastera для ноута, чтоб всё проверить. Порекомендовали terring modbus tools, но нигде не могу найти рабочий вариант.. Ни у кого нет? Очень буду благодарен.
Ср июл 04, 2012 08:44:54
http://www.zaovip.ru/file/file/PO_Modbus.exeНе хотели искать. Я нашёл за 3 минуты.
А для себя я как то сделал универсальный терминал для отладки устройств на 232/485. Но там у меня только режим RTU.
А вот вам вдогонку описание протокола
http://www.servotechnica.spb.ru/library ... us_Rus.Doc
Ср июл 04, 2012 15:29:03
Я качал эту программу по этой ссылке, похоже, файл битый((
Ср июл 04, 2012 17:57:22
Специально проверил - скачал, установил и запустил.
Ср июл 04, 2012 18:02:50
скачал, установил и запустил.
+1
Ср июл 04, 2012 18:42:27
Похоже, несовместимость.
Ну ладно. Нашел Modbus Poll, разобрался как она работает, связался с микроконтроллером
. Косяк в том, что я не понимаю пока что как работать с регистрами модбаса на самом микроконтроллере. Например, использую функцию 06 - Write Single Register. Пишу, к примеру, в 1200 регистр с помощью Modbus Poll, приходит ответ что данные записались. А как их забрать из регистра в микроконтроллере? Я так понял, надо использовать eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs,
eMBRegisterMode eMode ) ? Можете пояснить? Спасибо
Ср июл 04, 2012 19:03:26
всё же меня мучает вопрос - зачем вам использовать для дома этот протокол. Для промышленных контроллеров - да, удобно, так как унификация при работе с разновсякими контроллерами
А как их забрать из регистра в микроконтроллере?
для этого есть команда
03 Read Holding Registers
Чт июл 05, 2012 13:36:30
orinoko писал(а):всё же меня мучает вопрос - зачем вам использовать для дома этот протокол. Для промышленных контроллеров - да, удобно, так как унификация при работе с разновсякими контроллерами
Это не домашнее решение.
orinoko писал(а):А как их забрать из регистра в микроконтроллере?
для этого есть команда
03 Read Holding Registers
Это понятно ) Но как закинуть в такой регистр данные, например,с датчика, подключенного к ножке МК?
Чт июл 05, 2012 14:16:16
А это уже ручками думать надо и подключать библиотеку "brain.dll". Снимать показания с датчика в соответствии с его спецификацией, и заносить данные в нужную ячейку памяти в необходимом формате.
Чт июл 05, 2012 15:15:54
Мне не понятно, где именно хранятся эти Holding регистры в самом МК.
Чт июл 05, 2012 15:22:14
Timo писал(а):Мне не понятно, где именно хранятся эти Holding регистры в самом МК.
Работал с сенсорными панелями оператора ОВЕН. В описании на панель даны адреса памяти и описано какой тип памяти (ОЗУ или EEPROM). С МК не работал.
Чт июл 05, 2012 15:34:50
В памяти они находятся, где же еще... Вся память AVR (да и не только) делится на регистры R0-R31, регистры I/O и ОЗУ. По идее если адрес регистра 0x00-0x1F, это регистры R0-R31, если 0x20-0x5F - I/O, остальное - ОЗУ. Хотя программно можно наверняка переназначить адреса как угодно, и запретить доступ к каким-либо из них на этапе приема команды в любом протоколе.
Чт июл 05, 2012 16:04:25
Правильно люди советуют : если связываться с уже готовыми устройствами, то все их "регистры" описаны в мануалке на устройство. А если дивайс на МК собственного производства, и программа на РС к нему тоже собственная , то можно взять только оболочку, каркас от Модбаса и наполнить его такими командами и в таких форматах, как самому удобно. Пересылать, например, не один какой-то "регистр", а целый блок параметров.
У меня была в практике необходимость выполнить быстрый, но устойчивый обмен. Как бы сделал по "букварю" ? Запрос - ответ - подсчет CRC - фиксируется ошибка - перезапрос. А время т`икает . Сделал в пакете тройное дублирование инфы с внутренней КС. Если CRC битая, не заморачиваем себе бошку перезапросом, а смотрим, есть ли в принятой тройке совпадающая пара, да еще с правильной КС. Есть - значит приняли и исправили ошибку. Чуть более сложная обработка позволяла исправить и двойную ошибку.
Работало без вопросов.
Но если ожидаете инспекцию со Schneider-electric на предмет соответствия вашего протокола букварю - тогда я пас и ничего не советовал.
Чт июл 05, 2012 18:09:52
Timo писал(а):Мне не понятно, где именно хранятся эти Holding регистры в самом МК.
В МК есть просто ОЗУ. Некоторый объём. Как вы эти ячейки назовёте при разработке программы, такими они и будут. Все эти Holding Registers - это некий уровень абстракции, и к конкретному МК не имеет отношения. Выделяется некая область памяти и отмечам - это регистры. И занимаемся обработкой сами программно.
Судя по всему, вы очень далеки от понимания сути. Это вам не дельфи, где программу можно написать одной мышкой. Как я уже говорил, без brain.dll вы не решите задачу. Ищите специалиста.
Чт июл 05, 2012 19:18:23
orinoko писал(а):Timo писал(а):Мне не понятно, где именно хранятся эти Holding регистры в самом МК.
В МК есть просто ОЗУ. Некоторый объём. Как вы эти ячейки назовёте при разработке программы, такими они и будут. Все эти Holding Registers - это некий уровень абстракции, и к конкретному МК не имеет отношения. Выделяется некая область памяти и отмечам - это регистры. И занимаемся обработкой сами программно.
Судя по всему, вы очень далеки от понимания сути. Это вам не дельфи, где программу можно написать одной мышкой. Как я уже говорил, без brain.dll вы не решите задачу. Ищите специалиста.
Я понимаю смысл ОЗУ, Holding Registers и т.п. Я не понимаю некоторых деталей, но я только учусь.
Я обращаюсь к тем,кто пользовалмя freemodbus.. Мне нужно как-то вытащить данные из холдинг регистра, и грубо говоря, к примеру, выдать их на порт микроконтроллера. Я понимаю, что те же самые холдинги висят где-то в ОЗУ, я с компьютера связываюсь с МК, кидаю в них данные, забираю. Но мне хочется для начала, к примеру, отправить в 1201 холдинг регистр и зажечь светодиод на выходе. Если бы мне предоставили пример такого взаимодействия, я бы разобрался и решил бы любую задачу
Чт июл 05, 2012 19:45:21
Freemodbus скорее всего - это библиотека, которая огранизует только транспорт для данного протокола. А всю реализацию уже должен описывать сам программист. Осознайте это для себя. Пришедший пакет вы должны сами обрабатывать и формировать ответ, а также взамодействовать с периферией МК - кнопочки, лампочки и т.д.
Чт июл 05, 2012 19:55:51
Чуть прояснилась ситуация. Спасибо.
Осталось найти места, где хранятся модбасовские регистры, остальное я реализую
.
Попробую разобраться еще раз со всем, но если кто пользовался freemodbus и знает ответ - буду благодарен получить информацию
Чт июл 05, 2012 20:34:14
Но эта бибилиотека должна ведь иметь элементы взаимодействия стека модбаса со всеми осталными функциями, записанными в МК?
По freemodbus есть
справка, правда я не могу в ней разобраться
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.