0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 14
|
|
1 | |
Протокол Modbus RTU/ASCII для режима Slave04.06.2013, 17:25. Показов 16213. Ответов 36
Здравствуйте!
Стоит задача реализовать протокол Modbus ASCII/RTU для режима Slave на Си. Программа modbus_tester будет опрашивать программу через последовательный порт. Значения регистров должны загружаться из файла при запуске программы и сохраняться в файл при выходе из программы. Программировать на Си начал совсем недавно, поэтому эта задача для меня совсем не проста и разобраться в тоннах исходных кодов типа freemodbus не удалось.
0
|
04.06.2013, 17:25 | |
Ответы с готовыми решениями:
36
Нет связи между модулем ввода (modbus rtu slave) и программой modbus poll на ноутбуке Эмулятор для Modbus RTU (slave и master) под Linux Modbus RTU и ASCII на одном интерфейсе Запрос MODBUS RTU |
...
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
|
|
04.06.2013, 17:45 | 2 |
GhostSolder, так всё же не понятно, какого рода помощь вы рассчитываете получить?
ASCII(символьный) и RTU(бинарный) это разновидности протокола. Вам нужно оба реализовать или какой-то один?
0
|
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 14
|
|
04.06.2013, 17:58 [ТС] | 3 |
Любую помощь по реализации. Реализовать нужно оба протокола.
0
|
...
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
|
|
04.06.2013, 19:09 | 4 |
Хм... Я даже и не знаю с чего начать . Сам протокол очень прост и не имеет ничего замудрённого. Основные пакеты протокола выглядят следующим образом:
Запрос каких либо данных: <АДРЕС УСТРОЙСТВА> <ФУНКЦИЯ> <АДРЕС УЧАСТКА ПАМЯТИ> <КОЛИЧЕСТВО ЗАПРАШИВАЕМЫХ ДАННЫХ> <CRC> Отправка данных: <АДРЕС УСТРОЙСТВА> <ФУНКЦИЯ> <АДРЕС УЧАСТКА ПАМЯТИ> <КОЛИЧЕСТВО ДАННЫХ НА БОРТУ> <ДАННЫЕ> <CRC> Для возможности разработки и тестирования вам обязательно нужно вооружиться сниффером последовательных портов (к примеру он есть в sysinternals и называется portmon). Затем нужна утилита которая будет эмулировать master-a, к примеру вот эта. И самое главное, вот этой замечательной штуковиной: Virtual Serial Ports Emulator. Она создаёт виртуальный com-порт и позволяет подключаться к нему сразу нескольким процессам. В качестве первого шага советую вооружиться документацией по modbus. Создать виртуальный com-порт. Подключиться к нему сниффером. И с помощью какого-либо приложения работающего по modbus протоколу пытаться выполнить какие-либо запросы через созданный порт. А там всё само собой начнёт выстраиваться.
1
|
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 14
|
||||||
04.06.2013, 19:44 [ТС] | 5 | |||||
Спасибо =) Но проблемы возникают именно в реализации этого всего на Си. То есть всё что у меня на данный момент есть это modbus-tester, VSPE и вот это
0
|
Почетный модератор
|
|
04.06.2013, 19:51 | 6 |
посмотрите закрепленные и не только темы здесь: https://www.cyberforum.ru/asutp/
(если желаете я всю тему перенесу туда, мне кажется там Вы помощь получите быстрее)
1
|
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 14
|
|
04.06.2013, 19:54 [ТС] | 7 |
Спасибо, думаю действительно рациональнее будет перенести эту тему туда.
0
|
...
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
|
||||||
04.06.2013, 20:05 | 8 | |||||
Так это же просто. По сути дела регистры это адреса в памяти вашего виртуального PLC, т.е. это некий массив, ведь так? Такой массив вы должны сохранять и загружать из файла и естественно в бинарном виде. Предположим, что у вашей виртуальной машины памяти 65536 байт:
1
|
04.06.2013, 20:23 | 9 |
RS-485. Работа с Modbus протоколом...
Libmodbus. Библиотека Modbus for Linux, Mac OS X, FreeBSD, QNX and Win32 (материала и примеров реализации, в том числе и кроссплатформенного, достаточно)
0
|
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 14
|
|
04.06.2013, 22:53 [ТС] | 11 |
raxp, Материала и примеров реализации, не спорю, предостаточно, но, к сожалению, мои знания не позволяют самостоятельно разобраться в этом всём.
gazlan, Спасибо, но проект при компиляции выдаёт ошибку fatal error RC1110: could not open .\mbw.rc anmartex, А массив получается изначально инициализируется нулевыми значениями или это от чего-то зависит? (извините если задаю глупые вопросы)
0
|
...
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
|
|||||||||||||||||
05.06.2013, 04:31 | 14 | ||||||||||||||||
Извиняться незачем. Массив конечно изначально инициализируется нулевыми значениями, и в том случае если не найдётся файл mem.dat, то он таким и останется. Но в случае наличия mem.dat (строка 12) произойдёт загрузка данных из файла (строка 14).
У вас должно быть 4-ре таких массива, ибо спецификация протокола определяет четыре таблицы данных:
Если мы массив, приведённый мною в предыдущем комментарии, отнесём к регистру хранения, то размерность его должна составлять 2*65536 элементов. Теперь, как только будет производиться запрос к вашему виртуальному устройству (протокол RTU): 0x01 0x04 0x00 0x10 0x00 0x02 <CRC> где: серый - адрес устройства; зелёный - регистр; синий - адрес регистра (индекс вашего массива); красный - количество запрошенных элементов вы должны будите отправить 4 байта, т.е. 4 элемент массива: 32, 33, 34 и 35. Примерно так это будет выглядеть: 0x01 0x04 0x04 0x00 0x00 0x00 0x00 <CRC> где: серый - адрес устройства; зелёный - регистр; красный - количество возвращаемых данных; розовый - данные
1
|
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 14
|
|
06.06.2013, 20:36 [ТС] | 15 |
anmartex, не очень понял почему отправляем 4 байта, ведь запросили 2?
0
|
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 14
|
|
06.06.2013, 23:04 [ТС] | 17 |
raxp, в результате прочтения теории и возник этот вопрос.
разве на этот запрос мы должны выслать 4 элемента, а не 2?
0
|
06.06.2013, 23:37 | 18 |
Запросили мы два регистра. В ответе RTU значения регистров хранения и регистров ввода передаются начиная с указанного адреса, по два байта на регистр, старший байт каждого регистра передаётся первым. Итого сколько? Это из документации. Еще один подобный вопрос, тема будет закрыта ввиду вашего нежелания ознакомиться со стандартом.
1
|
...
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
|
|
07.06.2013, 03:45 | 19 |
Регистры ввода и хранения (0х03 и 0х04 соответственно) являются 16-тибитными т.е. на каждый регистр отводится по 2 байта. Отсюда: 2 байта на регистр * 2 запрошенных регистра = 4 байта
1
|
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 14
|
||||||
07.06.2013, 19:25 [ТС] | 20 | |||||
Посмотрите пожалуйста код, всё ли я правильно делаю?
0
|
07.06.2013, 19:25 | |
07.06.2013, 19:25 | |
Помогаю со студенческими работами здесь
20
Библиотека MODBUS ASCII для atmega328 Modbus RTU. Oпрос прибора Интеграция с контроллером по ModBus RTU Расшифровка данных Modbus RTU Modbus. Опрос slave Modbus-RTU. Синхронизация. Формат времени Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |