Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Срочно нужен Mod Bus на Си
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
mmnik
smile3046.gif Товарищи срочно нужна реализация протокола Mod Bus на языке Си. Помогите кто может скиньте на мыло mmnik@yandex.ru буду очень благодарен.
_artem_
http://edaboard.com/viewtopic.php?t=27431
RRRR
http://pes.free.fr/
Виктория
Цитата(_artem_ @ Dec 22 2005, 18:08) *


Намудрили все-так много китайцы wink.gif

mmnik, студент небось для лабораторки. У меня такой случай со студентами был - спросили со стороны, а потом мне же и вернули мой исходник в качестве сделанного по лаб. работе. blush.gif Ну удивились, что преподаватель так нервничает...

Свой вариант для MS DOS + PC (не все FC) - Мастер
Slave тоже могу выложить потом.
_artem_
А как же без раба ? После этого барин, да не тот .))
Виктория
Пример Slave на ПЛК Smart2+OS-9:
_artem_
Spasibo za code

Odin voprosik neyasen poka chto :

vot eta chast v tank.c :

" if(ir==0)
t0=clock();
else
{
t1=clock() - t0;
if(t1>TIMEOUT)
{
ir=0;
t0=clock();
}
}

read(path,&request[ir],1);
ir++;
_ss_ssig(path,REC);
FlRec=1;

if(ir==8)
"


dlya togo chtoby 8 baytov prinyat ili sbrosit priem esli timeout nezdu baytamai ?
Виктория
Артем, последнее слово совсем не поняла blush.gif ("timeout nezdu baytamai").

Ошибка таймаута здесь не обрабатывается, это только пример.

Код
case REC:    /* if(ir==0) t0=clock();      "закомментареннный" текст использовался при отладке
              else                                                 означал - если в течении 2 секунд                                
              { t1=clock()-t0;                                 связи не было, то начать прием с начала -
                if(t1>TIMEOUT) { ir=0; t0=clock(); }  НЕ РЕКОМЕНДУЮ!
              } */

              read(path,&request[ir],1); ir++;         // это прием 1-го байта в буфер[8]
              _ss_ssig(path,REC); FlRec=1;            // разрешение приема следующего байта
              if(ir==8)                                          // если полностью буфер принят (тоже не для всех FC)
              { ir=0;



В общем, пример не очень удачный, я поищу получше.
_artem_
попробую обьяснить свое понимание кода:

- функция void DispSig(int sig) как я понял обработчик прерываний (файл tankr.c).
- если аргумент к функции DispSig(sig) - ябляется постоянная REC то это означает прием байта
- при значении ir == 0 сохраняется время прихода байта
- байт записывается в буфер request[] (из терминала то бишь RS232) пока ir не достигнет 8 .
- при каждом примеме байта вычисляется время от начала приема (когда ir == 0, было сохранено в t0)
t1=clock() - t0; если t1 превышает TIMEOUT (указан #define TIMEOUT 200 - означает цлоцк тицк рате 10 миллсекунд)
то ir обнуляется , в итоге прием считается незавершенным и принятые до этого байти игнорируются .

Но я так понял что сюда по этому отрезку - длина сообшения в Modbus для этого примера , строго ограничивается 8
байтами , конечно это можно и изменить или эту часть выбросить.
Виктория
Артем, конечно, все правильно Вы поняли. blush.gif
По крайней мере значит, что использование функций OS-9 - не страшно для понимания.

DispSig() - обработчик всех сигналов (аналог прерываний), устанавливается по intercept. REC - сигнал (прерывание) по приему байта с терминала (RS-232). С таймаутом Вы правы (забыла свой текст полностью!).

Ограничение FC до 8 байт - основной недостаток здесь. Известно же, что в Modbus некоторые FC переменной длины (при записи в Slave). Поэтому длина буфера для приема - переменная, изменение которой осуществляется по приему/анализу FC и его параметров. Обработка ошибок тоже не полностью реализована.
_artem_
Spasibo za otvet .
mmnik
a14.gif Огромное спасибо!!!
Alex2172
См. FreeMODBUS
http://freemodbus.berlios.de
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.