Сети‎ > ‎Modbus‎ > ‎

Функция17HEX чтение/запись

 
 
Функция 23 (1716) Read/Write Multiple Registers

            Даня функция производит операцию чтения и записи за одну MODBUS транзакцию. Функция может записывать новые значения Holding (выходных/внутренних) регистров и возвращать содержание другой группы Holding регистров. Эта функция поддерживается не всеми устройствами Modbus (уточняйте в документации к устройству).

            В запросе указывается начальный адрес и количество регистров группы для чтения, после чего указывается начальный адрес, количество регистров, и данные для записи. Счетчик байтов перед данными для записи указывает на количество байт, передаваемых в поле данных.

Запрос:                                                             

Код функции

1716

Адрес начального регистра группы чтения (Hi)

от 0 до FFFF16

 

Адрес начального регистра группы чтения (Lo)

Количество читаемых регистров (Hi)

от 1 до 7616 (118)

 

Количество читаемых регистров (Lo)

Адрес начального регистра группы записи (Hi)

от 0 до FFFF16

 

Адрес начального регистра группы записи (Lo)

Количество регистров для записи (Hi)

от 1 до 7616 (118)

Количество регистров для записи (Lo)

Счетчик байт

2*N

Данные для записи (1-й регистр Hi)

от 0 до FFFF16

Данные для записи (1-й регистр Lo)

Данные для записи (N-й регистр Hi)

от 0 до FFFF16

Данные для записи (N-й регистр Lo)

 

В ответе при отсутствии ошибок передаются считываемые регистры.

Ответ.

Код функции

1716

счетчик байт

2*N

Считываемые данные (1-й регистр Hi)

от 0 до FFFF16

Считываемые данные  (1-й регистр Lo)

Считываемые данные  (N-й регистр Hi)

от 0 до FFFF16

Считываемые данные  (N-й регистр Lo)

 

 

 

 

 

 

 

 

 

Пример 1. MODBUS. Запрос на чтение/запись значения Holding регистров.

Задача. Сформировать сообщение-запрос и сообщение-ответ на чтение Holding регистров с 108-го по 110-й (при условии адресации с 0), и одновременно записи регистров с 200-го по 201-й  при положительной обработке запроса сервером.
 
 
 

Пример 2. MODBUS. Создание функционального блока для реализации функции Read/Write Multiple Registers в Modicon M340.

Задача. Создать производный тип функционального блока (DFB Type) для реализации функции Modbus 1716 в М340, при условиях:

-        количество читаемых и пишущих регистров произвольно в диапазоне от 1 до 20;

-        управляющий вход START_REQ функции запускает запросы с максимально-возможной производительностью;

-        данные для записи передаются в виде массива INT;

-        прочитанные данные получаются в виде массива INT;

-        предвидеть возможность контроля результата выполнения операции через выходы: номер коммуникационной ошибки (0 – отсутствие ошибки), номер ошибки Modbus протокола (0 – отсутствие ошибки), количество прочитанных байт;     

Работу функционального блока продемонстрировать на примере периодического (период=500 мс) считывания с Slave 1, 6-ти регистров, начиная с 12741, и записи 2-х регистров, начиная с 12761.

Решение.

В UNITY PRO создаем DFB Type со структурой, показанной на рис.3. Кроме перечисленных в постановке задачи входов и выходов блока,  дополнительно используется параметр типа input/output GEST_RW. Массив GEST_RW – соответствует массиву коммуникационных параметров, используемой в функциональном блоке коммуникационной функции DATA_EXCH 

В настройках Tools->Project Settings->Variabless нужно не забыть выставить опцию Allow Dynamic Array.

 
 
 

Адрес Modbus Slave передается в блок том же формате, как и во всех коммуникационных функциях UNITY для M340.

Листинг секции PROG типа производного функционального блока RW_MODBUS_M340:

XDB файл для скачивания

Для чтения регистров и битов можно воспользоваться функцией READ_VAR, для записи WRITE_VAR, для реализации остальных клиентских функций Modbus в М340 используется коммуникационная функция DATA_EXCH. Функция отсылает по адресу, указанному в ADR,  запрос (содержание запроса записывается в SEND_BUFER). Параметр TYP=1 указывает, что функция должна ждать ответ. После позитивной обработки функции, ответ на запрос будет доступен в RECV_BUFER. Запрос формируется в формате MODBUS APP, то есть не включает поле адреса Slave (он берется с ADDR) и CRC контрольную сумму (она высчитывается автоматически).  Для работы функции DATA_EXCH необходимо в последнее слово параметров управления коммуникационным обменом (GEST_RW[3]) записать количество предаваемых байт (исключая поле адреса и контрольной суммы).   

Следует отметить, что в протоколе Modbus при передаче регистров сначала передается старший байт слова, а потом младший. Буферы для передачи DATA_EXCH передаются таким образом: младший байт предается первым. То-есть при передаче и приеме регистров, старшие и младшие байты будут поменяны местами (проблема совместимости BIG/LITLE Endian). Для того, чтоб решить эту проблему, в программе используется функция ROL, которая вращает влево указанное количество битов слов (8, т.е. один байт) в буфере передачи и приема. При заполнении буфера передачи, проходит смещение на один байт, по этому заполнение происходит побайтно.

Программа для периодического (период=500 мс) считывания с Slave 1, 6-ти регистров, начиная с 12741, и записи 2-х регистров, начиная с 12761, показана на рис.4.

 

 

Оставить комментарии Вы можете здесь http://pupena-san.blogspot.com

 
 
 
 
ċ
RW_MODBUS_M340.XDB
(7k)
Александр Пупена,
17 авг. 2011 г., 23:39
Ċ
Александр Пупена,
7 авг. 2011 г., 13:32
Comments