Форум программистов, компьютерный форум, киберфорум
Контроллеры PLC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
673 / 45 / 16
Регистрация: 23.10.2015
Сообщений: 93

Прием данных по Modbus RTU (МК905 + NIM741, ST + CodeSys)

23.10.2015, 15:29. Показов 6799. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется система на базе МК905, позволяющая определять работоспособность некоторых устройств. В данной системе установлены мудули NIM741. Нужно организовать прием данных о работоспособности тех внешних устройст. Интерфейс приема данных RS-485. Программно необходимо реализовать протокол ModBus RTU, чтобы с его помощью получать данные. Кто работал с данной средой прошу помочь.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.10.2015, 15:29
Ответы с готовыми решениями:

Расшифровка данных Modbus RTU
Добрый день. Подскажите как расшифровать данные от прибора ? Снимаю снифером обмен данными через стандартную программу. Вот что получаю: ...

Сформировать запрос на чтение данных по протоколу modbus rtu
Добрый вечер! Появилась задача написать программку для master modbus rtu (на Borland C++ и желательно с использованием функций WinApi)....

Нет связи между модулем ввода (modbus rtu slave) и программой modbus poll на ноутбуке
Добрый день форумчанам. Сконфигурирован модуль modbus rtu slave в Ovation system. Опыт работы с modbus rtu master в овации есть, со slave...

10
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
24.10.2015, 08:03
Настройка обмена по протоколу Modbus в CODESYS v3.5
PLC — это просто. Modbus в Codesys
0
673 / 45 / 16
Регистрация: 23.10.2015
Сообщений: 93
28.10.2015, 08:57  [ТС]
Немного переформулирую.
Имеется прибор. Он состоит из мк905 и различных модулей ввода-вывода. Один из модулей nim741. Необходимо организовать прием данных по RS-485 по протоколу Modbus RTU. То есть мк905 выступает в качесте мастера, а подключенное к nim741 устройство в качесте подчиненного. ьл905 и nim741 общаются по FBus интерфейсу.

Добавлено через 2 минуты
И протокол нужно организовать не используя конфигурацию мк905, исключительно в коде. Так как nim741 и мк905 соеденены через FBus, а не через com, Ethernet порты.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
28.10.2015, 09:30
...и что, приехать лично и настроить?
0
673 / 45 / 16
Регистрация: 23.10.2015
Сообщений: 93
28.10.2015, 09:51  [ТС]
Нет) я просто только начинаю изучать эти устройства. И не могу найти документацию, понятную для меня. Много прочитал. Много примеров просмотрел. Я не понимаю откуда взять адрес узла. Видел, что обычно в программах он указывается в конфигурации контроллера в настройках определненных портов. Но у меня nim741 подключен к мк через FBus. А в конфигурации в FBus негде установить этот адрес. Порты ком и ethrenet мне использовать нельзя так как они заняты. Также не понимаю как программно реализуется отправка запроса от сервера на разрешение получения данных от подчиненного. Само получение данных. Инициализацию я вроде бы разобрал. Библиотека для использования Modbus rtu в кодсис также не расписана и непонятна. Наверно я просто не очень способный. Но помощь получить хотелось бы. Возможно какие-то примеры программ реализации взаимодействия именно этих устройств.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
28.10.2015, 10:24
Документация http://www.prosoft.ru/products... 74813.html

NIM74101:
Модуль сопряжения интерфейсный FBUS - RS485; скорость передачи данных1200. 2400. 4800. 9600. 14400. 19200. 38400. 57600. 115200 бит/с; модуль реализует функцию мастера (клиента) протокола Modbus RTU при помощи библиотеки FastwelModbusRTUClient.lib
Иллюстрацией управления модулем NIM74x при таком способе его представления может быть
входящая в пакет адаптации CoDeSys для Fastwel I/O библиотека nim741_742.lib. Библиотека
находится в подкаталоге “CoDeSys V2.3\Targets\Fastwel\Libraries” каталога установки среды
разработки CoDeSys
и содержит реализацию функциональных блоков NIM741, NIM741_DIRECT,
выполняющих функцию универсального асинхронного приемо-передатчика, принимающего и
передающего кадры через модуль NIM74x.

– RTU_FRAME – передача данных сообщения в канале связи должна осуществляться одним
неразрывным пакетом. В данном режиме отдельные символы (октеты) сообщения сначала
накапливаются в выходном буфере модуля NIM74x, а их отправка в линию связи
инициируется с передачей модулю последней порции символов сообщения. При передаче
сообщения интервалы тишины не превышают длительность одного символа.
Пример использования библиотеки nim741_742.lib приведен в проекте nim741_742.pro, который
находится в подкаталоге \Examples каталога установки файлов адаптации, по умолчанию “C:\Program
Files\Fastwel\Fastwel CoDeSys Adaptation\Examples”. В данном примере решается задача программного
опроса каналов аналогового ввода модуля ADAM-4017, подключенного к модулю NIM741, при
скорости обмена по RS-485, равной 115200 бит/с.

Примечание – Программа nim741_742.pro может быть адаптирована для работы с модулем
NIM742. Для этого только требуется заменить в PLC Configuration элемент
NIM741 RS-485 1xUART Module на элемент NIM742 RS-232C 1xUART Module.
ADAM-4017 подключается к модулю NIM742 через преобразователь интерфейсов
RS-232/RS-485 типа ADAM-4520.
0
673 / 45 / 16
Регистрация: 23.10.2015
Сообщений: 93
28.10.2015, 10:53  [ТС]
Спасибо. Но я уже читал данный документ. В нем описана лишь инициализация протокола в программе. А его использование не описано. Как отправлять запрос, какими командами, что отправлять, в какой последовательности, как задать адрес узла, не используя конфигурацию, с помощью каких методов принимать и отправлять данные ... все это опущено почему-то. Из этого документа понятно лишь, что есть библиотека для использования необходимого мне протокола, что у мастера и подчиненного инициализация разная, что у них есть входные и выходные буфферы, регистры и другие параметры. А как все это поймет, что нужно принимать или посылать там не написано. Там даже иногда путаются в понятиях мастера и подчиненного, это вызывает еще большее недоумение у неопытного программиста.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
28.10.2015, 11:31
Лучший ответ Сообщение было отмечено IngProj как решение

Решение

Еще раз, если не прочитали

Работа с модулем в кодесис осуществляется использованием готовой библиотеки 'nim741_742.lib' и ее входных и выходных каналов. Как у нее внутри - не ваша парафия, ваша задача просто подключить эти каналы в среде:

Входные каналы блока NIM741 представлены набором параметров
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
VAR_INPUT 
  (* Входы модуля 741/742 *) 
  inputs : NIM74x_INPUTS; 
  (* Команда функциональному блоку UART: *) 
  command : UART_Command := UART_CMD_IDLE; 
  (* В команде передавать данные: указатель на массив передаваемых байтов данных *) 
  pDataToSend : POINTER TO BYTE := 0; 
  (* В команде передавать данные: количество передаваемых байтов *) 
  sendDataSize : WORD := 0; 
(* В команде принимать данные: указатель на массив байтов, в который блок будет *) 
(* складывать данные *) 
  pReceiveBuffer : POINTER TO BYTE := 0; 
  (* В команде принимать данные: размер массива для принимаемых байтов *) 
  receiveBufferSize : WORD := 0; 
  (* Таймаут ожидания пакета данных *) 
  timeToWait : TIME := T#20ms; 
  (* Способ передачи фрейма сообщения при выполнении команды UART_CMD_TRANSMIT. *) 
  transmission_mode : UART_TransmissionMode := RTU_FRAME; 
(* Таймаут межсимвольного интервала, определяющего границы кадров. Иными словами,*) 
(* это минимальное значение интервала тишины следующего за последним принятым *)  
(* символом по которому блок определяет конец принимаемого сообщения *) 
  intervalTimeout : TIME := T#10ms; 
END_VAR
Выходные каналы блока NIM741 представлены набором параметров
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
VAR_OUTPUT 
  (* Выходы модуля 741/742 *) 
  outputs : NIM74x_OUTPUTS; 
  (* Длина принятого кадра *) 
  receivedDataSize : WORD := 0; 
  (* Число отправленных байт данных *) 
  transmittedDataSize : WORD := 0; 
  (* Текущее состояние блока: *) 
  state  : UART_State := UART_UNCERTAIN; 
  (*  Статус выполнения последней команды блока: *) 
  status : UART_Status := OK_IDLE; 
END_VAR 
 
Выходные каналы модуля NIM74x представлены типом NIM74x_OUTPUTS.  
(* Тип, представляющий выходы модуля NIM74х *) 
TYPE NIM74x_OUTPUTS : 
STRUCT 
  Control: WORD; 
  TxControl: BYTE; 
  TxLength: BYTE; 
  TxData: ARRAY [0..31] OF BYTE; 
END_STRUCT 
END_TYPE 
Команды управления блока NIM741(NIM741_DIRECT) представлены типом UART_Command. 
(* Команда блока NIM741 *) 
TYPE UART_Command : 
  (UART_CMD_IDLE, UART_CMD_INIT, UART_CMD_TRANSMIT, UART_CMD_RECEIVE); 
END_TYPE 
–  UART_CMD_IINIT – инициализация/сброс модуля NIM74х. Сбрасывает данные из входного 
и выходного буферов модуля NIM74х. 
–  UART_CMD_TRANSMIT   –  передавать данные. Записывает данные для передачи в 
выходной буфер модуля NIM74х, выдает команду передачи данных в  канал RS-485(RS-232), 
дожидается отправки данных. 
–  UART_CMD_RECEIVE  –  принимать  данные.  Читает  из  входного  буфера  модуля  NIM74х 
принятые данные. 
–  UART_CMD_IDLE  – продолжить выполнение текущей операции чтения/записи данных. 
Статус выполнения последней команды блока  NIM741(NIM741_DIRECT)  представлен  типом 
ART_Status. 
 (* Статус выполнения блока NIM741 *) 
TYPE UART_Status : 
  (FAIL_NO_DEVICE, FAIL_INVALID_STATE, FAIL_BAD_PARAMETER, FAIL_TX_ERROR, 
FAIL_RX_ERROR, FAIL_RX_APP_OVERFLOW, OK_TX, OK_RX, OK_IDLE); 
END_TYPE
что нужно принимать или посылать там не написано
c какого перепугу оно должно быть там написано? Протокол Modbus известен, формат обмена см. документацию на прибор, подключенный за конвертором.
1
673 / 45 / 16
Регистрация: 23.10.2015
Сообщений: 93
28.10.2015, 12:23  [ТС]
Спасибо большое за объяснение. Еще они вопрос а вот как мне принятые данные передать в переменную в программе. чтоб я по принятым данных мог выполнять определенные действия. например, зажечь светодиод.

Добавлено через 2 минуты
И как мне поставить Вам благодарность за помощь?)))
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
28.10.2015, 12:46
ST. PLC — это просто
1
673 / 45 / 16
Регистрация: 23.10.2015
Сообщений: 93
03.11.2015, 09:13  [ТС]
Здравствуйте.
Пишу программу для организации Modbus RTU в МК905 через модуль NIM741. МК905 - сервер. Для инициализации сервера используется указанная в заголовке библиотека. Данная бибилотека содержит структуру. Одно из полей данной структуры - pModbusSettings, которое также является структурой и имеет поля:
Code
1
2
3
4
5
6
7
8
               STRUCT
                   Port:BYTE; (* Порт: 2(COM2), 3(COM3), 4(COM4), 101, 102, ..., 164 *)
                   BaudRate:DWORD; (* Скорость передачи: 9600, 19200, 38400, 57600, 115200 *)
                   StopBits:BYTE; (* Число стоп-битов: 1, 2 *)
                   Parity:BYTE; (* Контроль четности: 0(нет), 1(нечётность), 2(чётность) *)
                   ByteSize:BYTE; (* Число битов данных: 8(RTU), 7(ASCII) *)
                   NodeAddress:BYTE; (* Адрес узла в сети MODBUS (1247) *)
                END_STRUCT
1)Port: NIM741 находится на 9-ой позиции в конфигурации в программе. Следовательно я должен указать порт 109? А если в конфигурации пропущены элементы, которые просто необходимы для питания последующих модулей такие как ОМ752, то я все равно должен их учитывать?
2)NodeAddress: В этом поле я должен указать любое придуманное из головы число от 1-247? И это будет адрес узла, к которому будут подключаться подчиненные устройства? Или я должен где-то этот адрес найти и указать в этом поле.
3)Допустим инициализация сервера удалась. При отладке программы можно просматривать переменную, отвечающую за статус сервера. При загрузке кода в МК905 сначала сервер имеет статус MB_SERVER_STATUS_UNDEFINED. Далее сервер переходит в состоянии MB_SERVER_STATUS_INITIALIZED. С этим все понятно. Но для работы сервера необходимо перевести его в состояние MB_SERVER_STATUS_READY и далее в MB_SERVER_STATUS_STARTED. Как это сделать, где найти примеры кодов? В документации на библиотеку демострируется лишь инициализация.
Я только начинающий программист. С документациями дружу плохо. Прошу конткретных ответов
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.11.2015, 09:13
Помогаю со студенческими работами здесь

Modbus RTU. Запись в modbus регистр
Доброго всем времени суток. qt5.15 Из приложения должен формироваться запрос — "01 06 00 00 00 05 49 C9", по факту же...

Преобразование modbus rtu в modbus tcp
Суть проблемы: есть устройство, оно работает по протоколу modbus rtu, но нужно подключиться к нему по tcp. Подскажите, можно ли как-то...

Modbus RTU - разобрать сформированный запрос к Slave
Добрый день Не могу разобраться с работой modbus rtu что значит запрос 024600e260? 02 - номер модуля 46 - функция и нет нигде...

Modbus RTU
Здравствуйте, пытаюсь решить задачу. Нужно послать значение какой-либо переменной с микроконтроллера на панель по протоколу modbus. ...

Modbus rtu wincc
Добрый день. Есть wincc advanced v13. Необходимо проверить наличие/отсутствие связи по канала modbus rtu. По modbus идет обмен между...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru