Функция 23 (1716) Read/Write Multiple Registers
Даня функция производит операцию чтения и записи за одну MODBUS транзакцию. Функция может записывать новые значения Holding (выходных/внутренних) регистров и возвращать содержание другой группы Holding регистров. Эта функция поддерживается не всеми устройствами Modbus (уточняйте в документации к устройству). В запросе указывается начальный адрес и количество регистров группы для чтения, после чего указывается начальный адрес, количество регистров, и данные для записи. Счетчик байтов перед данными для записи указывает на количество байт, передаваемых в поле данных. Запрос:
В ответе при отсутствии ошибок передаются считываемые регистры. Ответ.
Пример 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:
Для чтения регистров и битов можно воспользоваться функцией 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 |