Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 17:02

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Реализация ModBus на Форте? ( Прим: и ссылки на Micro Lan )
СообщениеДобавлено: Вт авг 21, 2007 11:12 
Не в сети

Зарегистрирован: Чт ноя 23, 2006 00:44
Сообщения: 494
Откуда: СПб
Благодарил (а): 19 раз.
Поблагодарили: 8 раз.
Может кто реализовывал?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 30, 2007 08:45 
Не в сети

Зарегистрирован: Вт май 30, 2006 14:52
Сообщения: 18
Откуда: Таганрог, Ростовской обл.
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Было дело. Управлял инверторами для электродвигателей.
Программа для Win32. Писал на WF32

Вот собственно код. Выбрал наиболее важные участки.
Для работы мне нужно было только 2 функции. С остальными думаю разберётесь.

Код:
-- ----------------------------------------------------------------------------
: +Field:   Over Field +      ;   \ base n --> base+n
: ?FalseExit   0= If  RDrop Then   ;
-- ----------------------------------------------------------------------------
\ Преобразование строки  C-ADDR U в число в текущей стстеме счисления.
\ Аналогично VAL в SMAL32 только для S" строки.
\ удачно - D. true
\ неудача - c-addr u false.

\ : SVal      \ c-addr u --> c-addr u 0 | D. true
\ ;
-- ----------------------------------------------------------------------------
\ Структура пакетов передачи-приема ModBus в ASCII режиме.
0
1   +Field:   +MBA.StartByte      \ +00 стартовый байт ":"
2   +Field:   +MBA.id         \ +01 Адрес подчиненного устройства.
2   +Field:   +MBA.fn         \ +03 Функция запроса (ответа).
0   +Field:   +MBA.addr      \ +05 Адрес регистра (при записи).
2   +Field:   +MBA.cnr      \ +05 Количество байт регистров в ответе.
2   +Field:   +MBA.rdata      \ +07 Начало данных в ответе.
0   +Field:   +MBA.cnt      \ +09 Количество регистров чтения или
4   +Field:   +MBA.srg      \ +09 значение одного регистра при записи.
0   +Field:   +MBA.data      \ +13 Начало данных.
Constant   /MBA.BEG      \ 13 Длина начальной обязательной части.
\ .........  Сдесь могуть идти данные переменной длины.
\ окончание пакета.
4 Dup Constant   /MBA.END      \ 4 байта в конце.
Negate               \ -4
2   +Field:   -MBA.LRC      \ -4 Контрольная сумма.
2   +Field:   -MBA.CRLF      \ -2 Символы окончания строки.
Drop
/MBA.END /MBA.BEG + Constant /MBA   \ Минимальная длина пакета (13+4=17байт).
-- ----------------------------------------------------------------------------
$3130   Constant   FN_OUT_READ   \ Команда чтения статуса выходов. "01"
$3230   Constant   FN_IN_READ   \ Команда чтения статуса входов.  "02"
$3330   Constant   FN_HRG_READ   \ Команда чтения регистров.       "03"
$3430   Constant   FN_IRG_READ   \ Команда чтения регистров.       "04"
$3530   Constant   FN_FSC      \ Установка еденичного выхода.    "05"
$3630   Constant   FN_WR_RG   \ Запись еденичного регистра.     "06"
-- ----------------------------------------------------------------------------
/MBA   User-Array BufTx      \ Буфер для передачи (минимальный).
/MBA   User-Array BufRx      \ Буфер для приема (минимальный).
User   ResultRead         \ Результат операции чтения.
User   BytesRead         \ Указатель принятых байт.
User   FlagACK            \ Флаг завершения операции.
-- ----------------------------------------------------------------------------
: PatStrModBus   \ --> c-addr u      \ Шаблон для формирования пакета .

      S" :00000000000000\r\n"
;
-- ----------------------------------------------------------------------------
: CalcLRC   \ c-addr u --> c

\ c-addr u - адрес длина буфера приема-передачи.
\ Подсчет КС блока.

      1 0 -MBA.LRC 1- D+      \ c-addr+1 u-5   Пропустить служебные.
      0 >R            \ c-addr u   Начальная КС=0
Begin
      Dup            \ c-addr u u   Все?
While
      Over C@ RP@ +!         \ c-addr u   Нарастить LRC.
      1 -1 D+            \ c-addr+1 u-1   След. символ.
Repeat
      2Drop 0 R> - $FF And      \ Дополнение до 0.
;
-- ----------------------------------------------------------------------------
\ Преобразовывает число в строку с записью в память по адресу ADDR.
\ U - беззнаковое число.
\ n - количество символов.
: U>ASCII   \ u addr n -->
      Base @ >R Hex         \ addr c-addr
      >R Swap 0 R@ ZStr 1+      \ addr c-addr
      Swap R>   CMove         \
      R> Base !         \
;
-- ----------------------------------------------------------------------------
: CheckRxBuf   \ c-addr u --> c-addr u

\ Процедура проверки буфера приема. Вызывается при приеме символа LF (10).
\ В Win32 эта процедура основная. Сом-порт настроен на вызов события при приеме
\ этого символа.

2Dup Type \ для отладки.
      Over C@ [Char] : = ?FalseExit      \ c-addr u   Первый символ ":"?
      2Dup + -MBA.CRLF C@ 13 = ?FalseExit   \ c-addr u   Предпоследний CR?
      2Dup CalcLRC            \ c-addr u b   Подсчет LRC
      Base @ >R Hex            \ c-addr u   Начало данных.
      0 2 ZStr 1+ W@            \ c-addr u N
      R> Base ! >R            \ c-addr u w   ASCII код.
      2Dup + -MBA.LRC W@ R> = ?FalseExit   \ c-addr u   Совпадает?.
      Over +MBA.fn W@ FN_HRG_READ =      \ c-addr u f   Чтение?
If
      \ Ответ на чтение регмстра.

      Base @ >R Hex            \ c-addr u   Начало данных.
      Over +MBA.rdata   4         \ c-addr u c-addr' 4
      SVal 2Drop ResultRead !         \ c-addr u   В число.
      R> Base !            \ c-addr u
Then
      True FlagACK !
;
-- ----------------------------------------------------------------------------
: ReadCharFromCom   \ char -->

\ Процедура записи в буфер приема. Должна вызываться при приеме каждого символа
\ из последовательного порта.

      Dup [Char] : =         \ c f   Начало пакета?
If
      0 BytesRead !         \ c   Обнулить указатель приема.
Then
      BytesRead @ /MBA =      \ c f   Буфер под завязку?
If
      BufRx 1+ BufRx /MBA 1- CMove   \ c   Сместить данные на 1 байт.
      Dup BufRx /MBA + 1- C!      \ c   Записать символ в конец.
Else
      Dup BufRx BytesRead @ + C!   \ c   Записать символ по указателю.
      BytesRead 1+!         \ c   Нарастить указатель приема.
Then
      10 =            \ f   Конец пакета?
If
      BufRx BytesRead @
      CheckRxBuf 2Drop
Then
;
-- ----------------------------------------------------------------------------
: SendAndWait   \ c-addr u --> f

\ Процедура передачи и приема информации черех последовательный интерфейс.
\ Сильно зависит от аппаратных средств и операционной системы.

\ Вход:
\ c-addr - адрес передачи.
\ u      - размер буфера.
\ Выход:
\ f      - флаг успешности.


\ Передать_данные --> Принять_данные --> Проверить_правильность_принятого_пакета --> f


False FlagACK !            \ Обнулить флаг завершения операции.
2Dup CR Type            \ для отладки - вывести на печать.
0 Do Count ReadCharFromCom Loop Drop    \ для отладки - вызвать процедуру чтения.
FlagACK @            \
;
-- ----------------------------------------------------------------------------
: ReadRG   \ Addr Id  --> U True | False
\ Чтение регистра в протоколе MODBUS.
\ Addr - адрес регистра.
\ Id   - номер устройства.
\ U    - прочитаное значение.

      PatStrModBus BufTx Swap CMove   \ Переписать шаблон.
      FN_HRG_READ BufTx +MBA.fn W!   \ Addr Id   Функция.
      BufTx +MBA.id         2 U>ASCII   \ Addr       Номер устройства.
      BufTx +MBA.addr       4 U>ASCII   \    Адрес регистра.
      1 BufTx +MBA.cnt      4 U>ASCII   \   Количество регистров.
      BufTx /MBA CalcLRC      \ u   Подсчет LRC
      BufTx /MBA + -MBA.LRC 2 U>ASCII   \   Сохранить в буфере.
      BufTx /MBA SendAndWait      \ f   Передать-Принять_ответ.
If
      ResultRead @ True
Else
      False
Then
;
-- ----------------------------------------------------------------------------
: WriteRG   \ Val Addr Id --> F
\ Запись в регистр в протоколе MODBUS.
\ Addr - адрес регистра.
\ Id   - номер устройства.
\ Val  - значение регистра.

      PatStrModBus BufTx Swap CMove   \ Val Addr Id   Переписать шаблон.
      FN_WR_RG BufTx +MBA.fn W!   \ Val Addr Id   Функция.
      BufTx +MBA.id         2 U>ASCII   \ Val Addr    Номер устройства.
      BufTx +MBA.addr       4 U>ASCII   \ Val       Адрес регистра.
      BufTx +MBA.srg        4 U>ASCII   \      Значение регистра.
      BufTx /MBA CalcLRC      \ u   Подсчет LRC
      BufTx /MBA + -MBA.LRC 2 U>ASCII   \   Сохранить в буфере.
      BufTx /MBA SendAndWait      \ f   Передать-Принять_ответ.
;
-- ----------------------------------------------------------------------------
: Test      $3210 $7654 $98 WriteRG CR .h
      $7654 $98 ReadRG If CR .h Then
; test


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 30, 2007 15:33 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
Попалась реализация протокола микролан DS1820
на сайте: "Лаборатория Автоматизации Эксперимента Института Ядерных Реакторов РНЦ «Курчатовский Институт»"
реализация протокола микролан DS1820

Здесь есть работа с микроланом в форте.


Последний раз редактировалось Kopa Чт сен 03, 2009 17:24, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 30, 2007 21:43 
Не в сети

Зарегистрирован: Чт ноя 23, 2006 00:44
Сообщения: 494
Откуда: СПб
Благодарил (а): 19 раз.
Поблагодарили: 8 раз.
Спасибо Всем откликнувшимся!
Кста, если кто работает с телемеханикой, то могу поделится инфой по протоколу FT1.2 (часть протокола+GUI реализована на SPF4).

Прим: начинать отсюда


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт апр 17, 2009 07:50 
в функции CalcLRC ошибка. Складывать нужно байты, а не символы.


Вернуться к началу
  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB