Jump to content

    

FreeModbus

Кто-нибудь использовал такую штуку? Пробую скомпилировать - какая-то лабуда в заголовках. Ругается, что то одного определения не видит, то другого. Что происходит то? Как побороть?

Share this post


Link to post
Share on other sites
Что происходит то? Как побороть?

Как обычно.

Включить все модули в проект или в пути поиска, если свой мэйкфайл.

 

У меня так сделано:

...
MODULES +=  modbus
MODULES +=  modbus/RTU
MODULES +=  modbus/Port
MODULES +=  modbus/Functions
MODULES +=  modbus/system

...

SRCDIRS = $(PROJECT_ROOT)/
SRCDIRS += $(addprefix $(PROJECT_ROOT)/,$(MODULES))

#INCLUDES  = -I$(PROJECT_ROOT)/
INCLUDES  = $(addprefix -I$(PROJECT_ROOT)/,$(MODULES))

CSRC    = $(wildcard $(addsuffix /*.c,$(SRCDIRS)))
CPPSRC  = $(wildcard $(addsuffix /*.cpp,$(SRCDIRS)))
ASRC    = $(wildcard $(addsuffix /*.s,$(SRCDIRS)))

 

Ну и не забыть подключить:

/* ----------------------- Modbus includes ----------------------------------*/
#include "../modbus/include/mb.h"
#include "../modbus/include/mbport.h"
#include "../modbus/port/port.h"

Share this post


Link to post
Share on other sites

Попробую, хотя вроде все так же делаю. Я версию модбаса использовал 1.3 - может с 1.5 лучше покатит. И ещё, сами модули собрались, а вот в программе пытаюсь использовать их тайпдефы и вызовы из mb.h - ругается на то, что они не объявлены. Ничего не пойму - сколько на си пишу, такого безобразия не встречал.

Share this post


Link to post
Share on other sites
Ничего не пойму - сколько на си пишу, такого безобразия не встречал.

Нет там никакого безобразия, библиотека сделана очень чётко и грамотно.

Подключается буквально в три шага, в документации расписано.

Возьмите для начала готовый пример.

 

Чтобы не гадать, выкладывайте, что именно не получается и какие ошибки.

Share this post


Link to post
Share on other sites

Ну вот, стало сильно лучше. Помогло волшебное добавление именно в таком порядке

/* ----------------------- Modbus includes ----------------------------------*/
#include "../modbus/include/mb.h"
#include "../modbus/include/mbport.h"
#include "../modbus/port/port.h"

 

Причем добавление во все без исключения модули модбаса - иначе нет-нет да поругивалось.

 

Share this post


Link to post
Share on other sites
Причем добавление во все без исключения модули модбаса

Это идеологически неправильно...

Надо просто пути поиска к этим папкам прописать.

Share this post


Link to post
Share on other sites

Пути поиска просто скажут где находится тот или иной заголовочный файл, но добавлять всё равно нужно при помощи #include. Проблема не в путях, а в том, что каждый модуль модбаса хочет именно эту последовательность инклудов. Для меня это оказалось несколько странным. Хотя я не отрицаю, что тут я что-то не понимаю, но до этого успешно добавлял в проект и ucOS, и lwIp, и PolarSSL - такой странной реакции не наблюдал.

Share this post


Link to post
Share on other sites
Проблема не в путях, а в том, что каждый модуль модбаса хочет именно эту последовательность инклудов. Для меня это оказалось несколько странным.

Действительно странно...

Хотя, может я тоже добавлял, просто не помню. Давно это было, а отлаженная библиотека кочует из проекта в проект без изменений.

Share this post


Link to post
Share on other sites

А ещё подскажите, где код для мастера искать? В упор не вижу мастера во этой библиотечке.

Share this post


Link to post
Share on other sites
версию модбаса использовал 1.3 - может с 1.5 лучше покатит.

Собирал недавно проект ModbusTCP на Freemodbus 1.5 - с заголовками такой фигни не было, зато обнаружился другой небольшой глючок: не для всех функций корректно вычислялась длина возвращаемого пакета. Для большинства modbus-мастеров это не принципиально (там длина в пакете двух местах присутствует), но товарищ делал мастера на питоне под линуксом и у него мастер, собранный из готовой библиотеки, ругался на некорректность данных.

Share this post


Link to post
Share on other sites

При сборке проекта были ошибки линкера, пока не подключил #include "mbfunc.h" в некоторых модулях.

Проект скомпилировал в IAR v.5.50.0.

Безуспешно пытаюсь запустить freemodbus-v1.5. Пробую на разных контроллерах (сейчас на Меге324P 20MHz).

int
main( void )
{
    eMBErrorCode    eStatus;

    eStatus = eMBInit( MB_RTU, 0x01, 0, 9600UL, 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]++;
    }

На запрос чтения одного регистра по адресу 1000 отвечает ошибкой. В чем может быть проблема?

 

 

Share this post


Link to post
Share on other sites
На запрос чтения одного регистра по адресу 1000 отвечает ошибкой. В чем может быть проблема?

В возвращаемом пакете что передаёт? Там ведь пусть небогатая , но есть информация об ошибке.

Share this post


Link to post
Share on other sites

01 83 02 C0

Это ответ на запрос чтения (код 0x03) с устройства №1 одного регистра по адресу 1000.

Почему, никак не могу понять? Проект компилируется, правда в IARе, без ошибок.

Share this post


Link to post
Share on other sites
01 83 02 C0

То есть возвращает код ошибки - 2. А это означает (см. рисунок), что вы пытаетесь прочитать несуществующий регистр. Обработчик у вас этот адрес обрабатывает?

post-19701-1299137283_thumb.jpg

Share this post


Link to post
Share on other sites

Это из примера freemodbus

#define REG_INPUT_START 1000
#define REG_INPUT_NREGS 4

static USHORT   usRegInputStart = REG_INPUT_START;
static USHORT   usRegInputBuf[REG_INPUT_NREGS];

Со стороны мастера (ПК) периодически даю запрос на чтение:

wError = mb.ReadOutputRegisters(1, 1000, 1, wTempData);

//адр. устройства, адрес считывания, кол-во считываемых регистров, буфер

 

Так где я не прав?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this