Форум программистов, компьютерный форум, киберфорум
Наши страницы

Контроллеры PLC

Войти
Регистрация
Восстановить пароль
 
IngProj
673 / 45 / 10
Регистрация: 23.10.2015
Сообщений: 93
#1

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

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

Имеется система на базе МК905, позволяющая определять работоспособность некоторых устройств. В данной системе установлены мудули NIM741. Нужно организовать прием данных о работоспособности тех внешних устройст. Интерфейс приема данных RS-485. Программно необходимо реализовать протокол ModBus RTU, чтобы с его помощью получать данные. Кто работал с данной средой прошу помочь.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2015, 15:29
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Прием данных по Modbus RTU (МК905 + NIM741, ST + CodeSys) (Контроллеры PLC):

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

Запрос MODBUS RTU - АСУ ТП
Добрый день! Никак не получается получить ответ от МВА8. По протоколу ascii проблем не возникло. Пример: :100300010001EB ...

Modbus RTU. Oпрос прибора - АСУ ТП
подскажите пожалуйста, что-то явно делаю не так, прибор опрашиваю по modbus rtu , но в ответ в response приходят одни нули , посылаю на...

Интеграция с контроллером по ModBus RTU - АСУ ТП
Здравствуйте. В щите используется контроллер, который опрашивает модули, датчики и т.п. по modbus rtu как мастер. Но по заданию...

Уточнить адреса регистров АС-3М MODBUS RTU - АСУ ТП
Доброго времени суток уважаемые форумчане. С авто синхронизатора (АС-3М) нужно получить данные, функция3(RHR) тип данных uint16. В...

MVI56-ADM. Релизация Modbus RTU - АСУ ТП
Всем привет. Пытаюсь разобраться с программированием ADM модуля MVI56-ADM компании Allen Bradley и реализовать в нем протокол Modbus RTU...

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

Добавлено через 2 минуты
И протокол нужно организовать не используя конфигурацию мк905, исключительно в коде. Так как nim741 и мк905 соеденены через FBus, а не через com, Ethernet порты.
0
raxp
10180 / 6563 / 481
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
28.10.2015, 09:30 #4
...и что, приехать лично и настроить?
0
IngProj
673 / 45 / 10
Регистрация: 23.10.2015
Сообщений: 93
28.10.2015, 09:51  [ТС] #5
Нет) я просто только начинаю изучать эти устройства. И не могу найти документацию, понятную для меня. Много прочитал. Много примеров просмотрел. Я не понимаю откуда взять адрес узла. Видел, что обычно в программах он указывается в конфигурации контроллера в настройках определненных портов. Но у меня nim741 подключен к мк через FBus. А в конфигурации в FBus негде установить этот адрес. Порты ком и ethrenet мне использовать нельзя так как они заняты. Также не понимаю как программно реализуется отправка запроса от сервера на разрешение получения данных от подчиненного. Само получение данных. Инициализацию я вроде бы разобрал. Библиотека для использования Modbus rtu в кодсис также не расписана и непонятна. Наверно я просто не очень способный. Но помощь получить хотелось бы. Возможно какие-то примеры программ реализации взаимодействия именно этих устройств.
0
raxp
10180 / 6563 / 481
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
28.10.2015, 10:24 #6
Документация http://www.prosoft.ru/products/brand...li/374813.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
IngProj
673 / 45 / 10
Регистрация: 23.10.2015
Сообщений: 93
28.10.2015, 10:53  [ТС] #7
Спасибо. Но я уже читал данный документ. В нем описана лишь инициализация протокола в программе. А его использование не описано. Как отправлять запрос, какими командами, что отправлять, в какой последовательности, как задать адрес узла, не используя конфигурацию, с помощью каких методов принимать и отправлять данные ... все это опущено почему-то. Из этого документа понятно лишь, что есть библиотека для использования необходимого мне протокола, что у мастера и подчиненного инициализация разная, что у них есть входные и выходные буфферы, регистры и другие параметры. А как все это поймет, что нужно принимать или посылать там не написано. Там даже иногда путаются в понятиях мастера и подчиненного, это вызывает еще большее недоумение у неопытного программиста.
0
raxp
10180 / 6563 / 481
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
28.10.2015, 11:31 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Еще раз, если не прочитали

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

Входные каналы блока NIM741 представлены набором параметров
Код
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 представлены набором параметров
Код
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
IngProj
673 / 45 / 10
Регистрация: 23.10.2015
Сообщений: 93
28.10.2015, 12:23  [ТС] #9
Спасибо большое за объяснение. Еще они вопрос а вот как мне принятые данные передать в переменную в программе. чтоб я по принятым данных мог выполнять определенные действия. например, зажечь светодиод.

Добавлено через 2 минуты
И как мне поставить Вам благодарность за помощь?)))
0
raxp
10180 / 6563 / 481
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
28.10.2015, 12:46 #10
ST. PLC — это просто
1
IngProj
673 / 45 / 10
Регистрация: 23.10.2015
Сообщений: 93
03.11.2015, 09:13  [ТС] #11
Здравствуйте.
Пишу программу для организации Modbus RTU в МК905 через модуль NIM741. МК905 - сервер. Для инициализации сервера используется указанная в заголовке библиотека. Данная бибилотека содержит структуру. Одно из полей данной структуры - pModbusSettings, которое также является структурой и имеет поля:
Код
               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 (1 – 247) *)
                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
03.11.2015, 09:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2015, 09:13
Привет! Вот еще темы с ответами:

ModBus RTU master для компа - Контроллеры PLC
Может у кого есть любимая бесплатная программа эмулятора ModBus RTU master для компа. Вообщем есть устройство "раб" подключал к ПЛК всё...

Modbus-RTU. Синхронизация. Формат времени - АСУ ТП
Здравствуйте! Помогите разобраться с форматом времени. Прибор- БМРЗ-100. В описании протокола обмена (Modbus-MT), в описании регистров...

Modbus RTU и ASCII на одном интерфейсе - АСУ ТП
Возникла ситуация следующего рода. На один интерфейс посажены несколько приборов (одних и тех же). Протоколы по документации Modbus...

Подключение устройств к S7-300 по Modbus RTU - Контроллеры PLC
Добрый день! Посоветуйте пожалуйста мануал или инструкцию по работе ПЛК S7-300 series с периферийными устройствами по Modbus RTU. В...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru