Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



MODBUS

Сообщений 31 страница 37 из 37

31

Я сейчас сделал проект как раз на rs485, начинается стадия его тестирования/проба. Для тестов как раз юзал модуль, что ты выше показал, потом получилось это.
Так заходил по началу с другой стороны, вначале проверил максимальное быстрое время переключения между отправка/приём, чтобы данные не потерять. Потом уже начал заниматься остальным. Время переключения уже не помню, если надо могу вечером глянуть.
Про флаги ХМеги при буфере и асинхронке, забыл посмотреть дома, почему-то в новом хелпе баскома, на сайте нет ничего, походу Марк всё-таки взялся за него и причесал по хорошему (да так, что полезную инфу вырезал, раньше она была). Суть того "флага" была в том, что он отдавал количество байт в буфере. По нему можно попробовать понять переключение дирекшен. Кажется это: https://avrhelp.mcselec.com/index.html?bufspace.htm

0

32

Тут оказалось ещё куча проблем!
Принимаю к примеру 7 байт в массив 1-2-3-4-5-6-7 (читаю из 16 битной ячейки)
1-Номер устройства
2-Функия (03 - чтение, 06- запись)
3 и 4 - Адрес Hi Byte и Lo Byte 16 битного значения
5 и 6 - Кол-во адресов Hi Byte и Lo Byte 16 битного значения 0 тут нам только 1 адрес нужен
7 и 8 - CRC16 Modbus

Принимаю данные (ответ состоит из 7 бит ) и понимаю, что само значение в другом порядке (((((
1-Номер устройства (01)
2-Функция (03)
3 -Счётчик байт (получаю значение 2)
4 и 5 - во тут и засада, это данные.

Хотел сразу получить данные по адресу:
Dim Priem(7) As Byte
Dim Dannie As Word At Priem(4) Overlay

Придётся либо смещать переменную Word, либо принимать данные иначе.

Чтение и Запись получается как-то вот так:
http://sa.uploads.ru/t/CivH5.jpg

Устройство у меня на дикость страшное, электропривод тиристорный трёхфазный с цифровым управлением ЭПУ1М-7, хоть и находится от меня в 10 метрах, мало ли чего ))))
Позвонил разок в службу поддержки, они ещё не сталкивались с людьми создающие устройство на микроконтроллере, но и проблем с работой по Modbus небыло даже с несколькими устройствами в сети.
Получается протокол стандартные, а вот в Xmega всё равно приходится терять кучу тактов на всякую CRC и Lo-Hi битность.

Так-же заметил разность приёма байтов CRC, передаю в Hi-Lo последовательности, принимаю на оборот.

Решил принимать по проще данные:

Код:
Config Com4 = 9600 , Mode = Asynchroneous , Parity = Disabled , Stopbits = 2 , Databits = 8
Config Portd.6 = Input                                      'RX
Config Portd.5 = Output
Config Portd.7 = Output                                     'TX
Open "COM4:" For Binary As #4
Txout Alias Portd.5 'Выход активирующий передачу модуля RS485
Config Base = 1 'Режим для PrintBIn (0-255 байт)

Dim Rsin(8) As Byte 

On Usartd1_rxc Rx485: 'Прерывание по получению данных
Enable Usartd1_rxc , Med  'Med - я использую приоритет над другими, у меня в контроллере куча прерываний сейчас

Enable Interrupts

Do
Loop
End

Rx485:
   Incr Rxtm485
   Rsin(rxtm485) = Usartd1_data
Return


Отредактировано Ev3658 (2018-01-25 16:40:25)

0

33

Ev3658 написал(а):

передаю в Hi-Lo последовательности, принимаю на оборот

Ну это скорее косяк/позор их программеров.

0

34

RDW написал(а):

Ну это скорее косяк/позор их программеров.

Надеюсь нет, чего то запутался. Какой байт массива A(8) будет старшим и младшим в переменной D типа WORD?

Dim A(8) As Byte

Dim D As Word AT A(4) Overlay

Если вот так, то позор их программеров:
A(4) - старший байт
A(5) - Младьший байт

Else
косяк я  :shine:

Походу действительно я.
Память получается распределяется от младшего байта к старшему.
http://sh.uploads.ru/t/7yTlM.png

Отредактировано Ev3658 (2018-01-26 09:51:01)

0

35

Ev3658 написал(а):

Память получается распределяется от младшего байта к старшему

Ну да, так всегда было, с времён появления процессоров и адресации больше байта. ;)
Просто чтобы не было таких в предь косяков, то надо нормально описывать оверлеи (на оба байта):

Код:
Dim A(8) As Byte
Dim D As Word

Dim D_low As Byte At D + 0 Overlay
Dim D_high As Byte At D + 1 Overlay

Dim D_low As Byte At A(4) Overlay
Dim D_high As Byte At A(5) Overlay

Мне кажется, правильнее как-то так.

0

36

Не, это как-то объявить одну переменную сразу по двум адресам не вариант. Оператор Rotate конечно выручил.

Код:
Rotate data , Left , 8   

0

37

Твой ротэйт требует процессорного времени, назначенная адресация (с двойным назначением) - нет.

0