Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Использование библиотеки freemodbus
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
AlexKas
Доброго времени суток!!!


Есть мультиплатформенная библиотека freemodbus (http://freemodbus.berlios.de/), которая позволяет реализовать протокол Modbus(slave). Очень хочется ее использовать.

Я только начинаю работать с WinAVR, поэтому испытываю трудности при работе с make-файлами. В данной ситуации у меня не получается скомпилировать cof-файл для demo.c . Какие изменения необходимо внести в make-файл, чтобы получить cof-файл?Нажмите для просмотра прикрепленного файла

Подскажите, как скомпилировать и запустить на моделирование demo в AVRStudio без внешнего make-файла?

Спасибо за помощь!!!

Примечание: Спасибо ARV за помощь с hex!
dimka76
Код
##Link
$(TARGET).elf: $(OBJECTS) $(MBOBJECTS) $(MBPORTOBJECTS)
     $(CC) $(LDFLAGS) $(OBJECTS) $(MBPORTOBJECTS) $(MBOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET).elf

%.hex: $(TARGET).elf
    ##$(OBJCOPY) -O ihex $(HEX_FLASH_FLAGS)  $< $@
    avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@

%.cof: $(TARGET).elf

В этом участке кода попробуйте заменить
Код
%.cof: $(TARGET).elf


на
Код
%.cof: $(TARGET).cof


А вообще в пакете WinAVR есть утилита MFile. Попробуйте использовать ее. А еще лучше поставьте AVR_Studio и работайте через нее. К ней можно прицепить WinAVR. И она makefile сама создает.
AlexKas
Доброго времени суток!
Цитата(dimka76 @ Jun 24 2009, 16:28) *
В этом участке кода попробуйте заменить
Код
%.cof: $(TARGET).elf

на
Код
%.cof: $(TARGET).cof

Спасибо за ответ, но замена %.cof: $(TARGET).elf на %.cof: $(TARGET).cof не помогла при компилировании cof-файла.
Цитата(dimka76 @ Jun 24 2009, 16:28) *
А вообще в пакете WinAVR есть утилита MFile. Попробуйте использовать ее. А еще лучше поставьте AVR_Studio и работайте через нее. К ней можно прицепить WinAVR. И она makefile сама создает.

Да я пользуюсь этой утилитой для создания make-файлов в WinAVR, но в данном случае в этой библиотеке очень много внутренних ссылок, и я не знаю как их подключить через эту утилиту.

AVR-Studio я использую ,а именно после того как в ней появилась поддержка GCC, я перешел на нее и не жалею.
При запуске demo-проекта для AVR от freemodbus с приложенным make-файлом, я могу пошагово отлаживаться только по ассемблерному коду (с ассемблером только начинаю "водить дружбу"), поэтому хотел получить cof-файл, чтобы отлаживаться на Си.
Запустить demo-проект, когда AVR-Studio сама создает make-файла, у меня не получается, постоянно выскакивают ошибки, предполагаю, что нужно делать хитрые настройки в "Configuration options".
К примеру, ниже приведенный код содержится в make-файле, приложенном к demo-проекту, я так понимаю, что при компиляции к проекту подключаются библиотеки, которые содержаться в папках "Port", "rtu", "ascii" и "include".
Код
CFLAGS = $(COMMON) \
         -Iport -I. \
         -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include

Данные папки я подключил к AVR-Studio в "Configuration options"->"Include directories" - не помогло.

Заинтересовался другим участком кода:
Код
OBJECTS = demo.o
MBPORTOBJECTS = port/portserial.o \
            port/portevent.o \
            port/porttimer.o \
            port/mbcrc.o
MBOBJECTS = ../../modbus/mb.o \
            ../../modbus/rtu/mbrtu.o \
            ../../modbus/ascii/mbascii.o \
            ../../modbus/functions/mbfunccoils.o \
            ../../modbus/functions/mbfuncdiag.o \
            ../../modbus/functions/mbfuncholding.o \
            ../../modbus/functions/mbfuncinput.o \
            ../../modbus/functions/mbfuncother.o \
            ../../modbus/functions/mbfuncdisc.o \
            ../../modbus/functions/mbutils.o

(Если кто-то объяснит зачем этот участок кода в make-файле буду очень благодарен.)
Попытался что-то подобное сделать в AVR-Studio в "Configuration options"->"Libraries", а именно, в окне "Library search path" указал пути, после чего в окне "Available link objects" появились portserial.o...mbutils.o, после этого с помощью кнопки "Add Libraries" данные объектные файлы я добавил в окно "Link with these objects". При компиляции в ошибках вывел имя каждого добавленного объектного файла и "No such file or directory".
Подскажите, в каком направлении идти дальше?
"Configuration options"
Нажмите для просмотра прикрепленного файла Нажмите для просмотра прикрепленного файла Нажмите для просмотра прикрепленного файла
MrYuran
Цитата(AlexKas @ Jun 26 2009, 00:21) *
К примеру, ниже приведенный код содержится в make-файле, приложенном к demo-проекту, я так понимаю, что при компиляции к проекту подключаются библиотеки, которые содержаться в папках "Port", "rtu", "ascii" и "include".

Неправильная формулировка.
Это не библиотеки, а самые что ни на есть исходники.
Причём в include - вообще набор хедеров.
rtu, ascii - реализация соответствующего режима, port - привязка к платформе.

И дался вам этот cof...

Попробуйте для начала просто автоматический мэйк сделать.
Для этого включите всю папку modbus со всем содержимым в проект.

Цитата
all: $(TARGET).elf $(TARGET).cof $(TARGET).hex $(TARGET).eep

%.cof: $(TARGET).elf
$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000 -O coff-avr $< $@


Ну вот же, всё есть.
Посмотрите, какой командой билд делается.
Должно быть make all
andre_74
Цитата(AlexKas @ Jun 26 2009, 00:21) *
Заинтересовался другим участком кода:
Код
OBJECTS = demo.o
MBPORTOBJECTS = port/portserial.o \
            port/portevent.o \
            port/porttimer.o \
            port/mbcrc.o
MBOBJECTS = ../../modbus/mb.o \
            ../../modbus/rtu/mbrtu.o \
            ../../modbus/ascii/mbascii.o \
            ../../modbus/functions/mbfunccoils.o \
            ../../modbus/functions/mbfuncdiag.o \
            ../../modbus/functions/mbfuncholding.o \
            ../../modbus/functions/mbfuncinput.o \
            ../../modbus/functions/mbfuncother.o \
            ../../modbus/functions/mbfuncdisc.o \
            ../../modbus/functions/mbutils.o


сейчас тоже пытаюсь скомпилировать freemodbus из под студии без внешнего мейкфайла. Как в студии подключить данные object файлы? Подскажите пожалуйста
andre_74
Доброго времени суток. Разбираюсь с библиотекой freemodbus. Демо написано для мега168. Как я понял, для меги16 достаточно в мейкфайле поменять тип mcu и выставить нужную частоту кварца (F_CPU). Прошил в контроллер - не отвечает. То есть вижу по сведодиодам, что со стороны компьютера идет передача, а со стороны меги - ничего. Проверял программой Modbus_Poll, пишет ошибка таймаута. Поскажите пожалуйста, как данную библиотеку адаптировать к atmega16?
MrYuran
Цитата(andre_74 @ Jun 22 2010, 13:43) *
вижу по сведодиодам, что со стороны компьютера идет передача, а со стороны меги - ничего. Проверял программой Modbus_Poll, пишет ошибка таймаута. Поскажите пожалуйста, как данную библиотеку адаптировать к atmega16?

Код
eStatus = eMBInit( MB_RTU, 0x0A, 0, 38400, MB_PAR_EVEN );

Настройки соответствуют?
Скорость, чётность, адрес?
andre_74
Цитата(MrYuran @ Jun 22 2010, 14:41) *
Код
eStatus = eMBInit( MB_RTU, 0x0A, 0, 38400, MB_PAR_EVEN );

Настройки соответствуют?
Скорость, чётность, адрес?


Да, настройки соответствуют. Так и не разобрался в чем дело.
Нашел в интернете исходники на С для modbus, адаптировал их под свою задачу, все прекрасно работает!
Alex-GTU
Цитата(andre_74 @ Jun 27 2010, 16:26) *
Да, настройки соответствуют. Так и не разобрался в чем дело.
Нашел в интернете исходники на С для modbus, адаптировал их под свою задачу, все прекрасно работает!


А исходники на С для modbus где Вы нашли, подскажите, пожалуйста.
alux
Пытаюсь запустить freeModBus для AVR. Переделал код под IAR.
Код
#define REG_INPUT_START 1000
#define REG_INPUT_NREGS 4

/* ----------------------- Static variables ---------------------------------*/
static USHORT   usRegInputStart = REG_INPUT_START;
static USHORT   usRegInputBuf[REG_INPUT_NREGS];

/* ----------------------- Start implementation -----------------------------*/
int
main( void )
{
    eMBErrorCode    eStatus;

    eStatus = eMBInit( MB_RTU, 0x01, 0, 9600, MB_PAR_NONE );
    __enable_interrupt();

    /* Enable the Modbus Protocol Stack. */
    eStatus = eMBEnable(  );

    for(;; )
    {
        ( void )eMBPoll(  );

        /* Here we simply count the number of poll cycles. */
        usRegInputBuf[0]++;
    }
}


От Мастера даю запрос на чтение одного регистра:
Код
mb.ReadOutputRegisters(0x01, 1000, 1, wTempData);

упорно отвечает ошибкой:
Код
01 83 02 C0

Контроллер Mega128, F_CPU 11059200, MB_TIMER_PRESCALER 1024

Другая реализация протокола ModBus для Mega128 на этот запрос отвечает нормально. Наблюдаю в PortMonitor. А c FreeModBus - ошибка. Уже не знаю что и думать... Куда копать?

MrYuran
Цитата(alux @ Jan 25 2011, 02:50) *
От Мастера даю запрос на чтение одного регистра:
Код
mb.ReadOutputRegisters(0x01, 1000, 1, wTempData);

упорно отвечает ошибкой:
Код
01 83 02 C0

Контроллер Mega128, F_CPU 11059200, MB_TIMER_PRESCALER 1024

Другая реализация протокола ModBus для Mega128 на этот запрос отвечает нормально. Наблюдаю в PortMonitor. А c FreeModBus - ошибка. Уже не знаю что и думать... Куда копать?

Посмотрите диапазон адресов по умолчанию.
Скорее всего он начинается не с 1000, а с 0х1000.
Ну и код ошибки. Скорее всего, это оно и есть.
alux
Цитата(MrYuran @ Jan 25 2011, 09:26) *
Скорее всего он начинается не с 1000, а с 0х1000.

Код
In this example we map four 16bit input registers at the register address 1000.

#define REG_INPUT_START 1000
#define REG_INPUT_NREGS 4


С какой это радости число 1000 из примера вдруг должно быть 0x1000 = 4096 ? Сейчас нет платы, не могу проверить. Но вопрос остается открытым.
alux
To MrYuran

Так все-таки, в чем может быть проблема? Выкладываю проект в IAR. Посмотрите, пожалуйста, исходники.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.