EnglishУкраїнськаmRussian
Login/New
Topic with many replies

ModBus ASCII


Author Message
Written on: 22. 07. 2009 [08:51]
ruslan
Руслан Нургалин
Topic creator
registered since: 25.06.2009
Posts: 15
Всем доброго времени суток! Уважаемые форумчане, обращаюсь к вам с таким вопросом, исходя из названия темы, - Весовой процессор ПВ -310 производства SWEDA, протокол обмена данными ModBus ASCII, связи с ним ни как не удается установить формат обмена данными - :[адрес][функция][данные][LCR][0d,0a]. Было ли у кого ни будь решение такого вопроса?
Written on: 22. 07. 2009 [09:01]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
Шлите тестовые запросы в подсистеме транспорты, взять можно из протокола запросов ModBus.

Вообще ASCII крайне медлен из-за в дважды больших запросов и поэтому требует больший таймингов. В Демо я ставил ASCII и тестил через COM на себя. Всё работало, при увеличенных таймингах.

Learn, learn and learn better than work, work and work.
Written on: 14. 04. 2010 [13:06]
almaz
Almaz Karimov
Contributor
registered since: 25.09.2008
Posts: 516
В весовом процессоре ПВ-310 и во многих других устройствах (по описаниям в интернете) подчёт LRC происходит следующим образом:

1. Складываются все байты, кроме начального ":" и завершающих двух символов. Переносы в разряды старше байта игнорируются.
2. Из 0xFF вычитается полученная сумма (получение доп. кода).
3. К полученному доп.коду прибавляется 1.

Вот образец программы на Си:

BYTE LRC (BYTE *nData, WORD wLength)
{
BYTE nLRC = 0 ; // LRC char initialized

for (int i = 0; i < wLength; i++)
nLRC += *nData++;

return (BYTE)(-nLRC);

} // End: LRC


В модуле MODBUS DAQ OpenSCADA реализован следующий код (только пункт 1 по алгоритму выше):

uint8_t TProt::LRC( const string &mbap )
{
uint8_t ch = 0;
for( int i_b = 0; i_b < mbap.size(); i_b++ )
ch += (uint8_t)mbap[i_b];

return ch;
}

Это верный подсчёт контрольной суммы для каких-то устройств или ошибка?

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 14. 04. 2010 [13:35]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
У меня небыло возможности проверить ASCII на стороннем оборудовании, в виду его отсутствия.
Код вычисления LRC брал из библиотеки от Moxa, сейчас её под рукой нет.
Возможно при переносе и ошибся.
Проверьте на своём оборудовании, если будет работать я поправлю.

Learn, learn and learn better than work, work and work.
Written on: 14. 04. 2010 [14:12]
almaz
Almaz Karimov
Contributor
registered since: 25.09.2008
Posts: 516
С таким подсчётом LRC опрос 2 байтных регистров весового процессора ПВ-310 пошёл:

uint8_t TProt::LRC( const string &mbap )
{
uint8_t ch = 0;
for( int i_b = 0; i_b < mbap.size(); i_b++ )
ch += (uint8_t)mbap[i_b];

return (uint8_t)(-ch);
}

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Written on: 14. 04. 2010 [15:11]
ruslan
Руслан Нургалин
Topic creator
registered since: 25.06.2009
Posts: 15
В продолжение темы:
Возникла ситуация когда необходимо считывать данные из 4-х байтного регистра, проблема в том что модуль ModBUS выдает содержимое только первых двух регистров.
При отправке запросов вручную:
Запрос - 3a 30 36 30 33 30 30 30 33 30 30 30 31 46 33 0d 0a
Ответ - 3a 30 36 30 33 30 34 30 30 30 35 46 43 39 34 35 45 0d 0a
Written on: 14. 04. 2010 [15:32]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
ruslan wrote:

В продолжение темы:
Возникла ситуация когда необходимо считывать данные из 4-х байтного регистра, проблема в том что модуль ModBUS выдает содержимое только первых двух регистров.

И в чём собственно проблема? В том что читаются два регистра, так это правильно (в сумме это 4 байта) или в том что первые два, тогда где конфигурация для которой это не верно?

Learn, learn and learn better than work, work and work.
Written on: 14. 04. 2010 [15:32]
ruslan
Руслан Нургалин
Topic creator
registered since: 25.06.2009
Posts: 15
Прошу прощения, в сообщении выше закралась ошибка: ModBUS выдает содержимое только первых двух байт регистра.
Written on: 14. 04. 2010 [15:34]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
ruslan wrote:

Прошу прощения, в сообщении выше закралась ошибка: ModBUS выдает содержимое только первых двух байт регистра.

Регистр в ModBus это и есть два байта!

Learn, learn and learn better than work, work and work.
Written on: 14. 04. 2010 [15:40]
ruslan
Руслан Нургалин
Topic creator
registered since: 25.06.2009
Posts: 15
В случае с весовым процессором ПВ-310 есть и 4-х байтные регистры.



16001