Найти тему
Владимир Радченко

DWIN. Протокол Modbus. Slave и Master режимы.

Оглавление

ModBus широко применяемый в промышленности протокол для связи электронных устройств. Используется для передачи данных по последовательным интерфейсам передачи RS-232, RS-485, RS-422 и TCP/IP. Первые два интерфейса реализованы в дисплеях DWIN.

Прошлые статьи:

DWIN человеко-машинный интерфейс. Введение

DWIN. Подготовка дисплея к работе и загрузка демо-проекта

DWIN. Знакомство с программным обеспечением DWIN Graphic Utilized Software. Hello World

Рассмотрим протокол ModBus:

Протокол Modbus
Протокол Modbus

Slave ID - номер устройства с которым происходит взаимодействие;
Код функции представляет стандартную команду поддерживаемую протоколом Modbus;
Код функции - команда определяющая действия с данными;
Данные - передаваемые данные;
CRC - контрольная сумма для проверки целостности доставленного пакета.

Рассмотрим подобнее код функции поддерживаемые дисплеем:
1 - Чтение DO Read Coil Status
2 - Чтение DI Read Input Status
3 - Чтение AO Read Holding Registers
4 - Чтение AI Read Input Registers
5 -Запись одного DO Force Single Coil
6 -Запись одного AO Preset Single Register
10 - Команда работает когда дисплей настроен в качестве ведущего устройства, данные в этой команде будут отправлены после включения питания для инициализации ведомого устройства.

Для реализации проекта будет использован дисплей DMG80480C050_03WTC. Обладающий TN матрицей с разрешением 800х480, напряжением питания 5В, интерфейсом UART TTL.

На изображении ниже можно наблюдать что дисплей имеет два интерфейса UART с переключением режимов работы RS-232/TTL. RX2/TX2 относятся к интерфейсу UART2. RX4/TX4 относятся к интерфейсу UART4, данный интерфейс будет задействован для связи по Modbus.

Дисплей поддерживает как работу в качестве ведомого так и в качестве ведущего устройства. Разберем оба режима.

Работа дисплея DWIN в режиме "Slave"

Используем проект из прошлой статьи. Чтобы использовать Modbus, необходимо загрузить файл обновления ядра, для этого переходим в папку загруженную с GitHub, \Docs\Modbus и выбираем подходящий архив с файлами. В нашем случае это "DWIN_T5L_115200_UART4_MODBUS_Slave", дисплей на ядре T5L, с Modbus на UART4 с скоростью 115200 Baud. Из архива нужны файлы:
DWIN_T5L_115200__UART4_ModBus.asm - ассемблерный файл с кодом;
DWINOS_DWIN_T5L_115200__UART4_ModBus.bin бинарный скомпилированный файл.

Рассмотрим файл DWINOS_DWIN_T5L_115200__UART4_ModBus.bin через Notepad++ с плагином hex-editor, также можно воспользоваться UltraEdit-32.

Конфигурационный файл DWINOS_DWIN_T5L_115200__UART4_ModBus
Конфигурационный файл DWINOS_DWIN_T5L_115200__UART4_ModBus

e0 00 - Начальный адрес (слово) первой инструкции в файле 22 = 0xE000

ff 04 - FF - 255 максимальное количество инструкций в файле 22*.bin, 04 - настроен как ведомый, RTU формат.

  • (0x00 = Сконфигурирован как мастер, RTU формат.
  • 0x01 = Сконфигурирован как мастер, , ascii формат (в настоящее время не поддерживается).
  • 0x02 = Сконфигурирован как мастер (RTU), ведомый отвечает часами в данных.
  • 0x03 = Сконфигурирован как мастер (ascii), ведомый отвечает часами в данных (в настоящее время не поддерживается).
  • 0x04 = Сконфигурирован как ведомый, RTU формат.
  • 0x05 = Сконфигурирован как ведомый, ascii формат (в настоящее время не поддерживается).)

05 ff - 05 - Количество повторений отправки команды, FF время задержки между командами FF = 255мс.

01 40 - 01 - идентификатор дисплея в режиме ведомого (ID Slave 0x01-0x7F (1 - 127)). 0x40=8N1, 0x41= 8E1, 0x42=8O1,0x43=8N2 (для UART5 значения будут 0x5*).

00 e0 - Делитель скорости порта Modbus 0x00E0 = 224, 25804800/224 = 115 200 Baud.

Если нет необходимости изменять ID slave дисплея и скорость 115200 или 9600 подходит для использования, то просто загружаем подходящий файл без изменений.

Загружаем на uSD карту папку DWIN_SET с прошлого проекта с добавлением файла DWINOS_DWIN_T5L_115200__UART4_ModBus.bin, вставляем в дисплей и обновляем прошивку.

Программа Modbus Poll будет использована как эмулятор для ПК в виде мастера.

ID Slave 1 115200 бод

Как видно в таблице имеются значения, считанные с дисплея, кроме считывания значений их можно и изменять, для этого необходимо нажать на интересующий адрес, пусть будет 5002, и в поле Value вписать новое значение.

Modbus Poll команда на запись регистра в дисплее
Modbus Poll команда на запись регистра в дисплее

На дисплее отображается следующая картинка:

DMG80480C050_03WTC отображаемая информация
DMG80480C050_03WTC отображаемая информация

ID Slave 2 9600 бод

Возьмем готовый файл DWINOS_DWIN_T5L_9600__UART4_ModBus и изменим в нем ID Slave на 02.

Редактирование конфигурационного файла DWINOS_DWIN_T5L_9600__UART4_ModBus
Редактирование конфигурационного файла DWINOS_DWIN_T5L_9600__UART4_ModBus

Файл DWINOS_DWIN_T5L_9600__UART4_ModBus.bin загрузим на дисплей не через uSD карту, а используя UART2. Для этого открываем DGUS и выбираем файл проекта, далее в вкладке "Welcome" находим "UART Download Tool".

DGUS рабочее окно программы
DGUS рабочее окно программы

В появившемся окне выбираем Select Files и выбираем файл DWINOS_DWIN_T5L_9600__UART4_ModBus.bin, после чего нажимаем на Start Download, предварительно убедившись, что Serial Port и Baud Rate выбраны правильно.

Перезагружаем дисплей и видим, что Modbus Poll теперь не может получить данные.

Настраиваем Modbus Poll на скорость 9600 Baud и Slave ID равным 2 и видим, что информация начала обновляться.

DMG80480C050_03WTC отображаемая информация
DMG80480C050_03WTC отображаемая информация

Считанные данные совпадают с отображаемыми данными на дисплее.

Работа дисплея DWIN в режиме "Master"

Для создания проекта также воспользуемся наработками с предыдущей статьи и используем готовый бинарный файл DWIN_T5L_115200_UART4_MODBUS из соответствующего архива. Также в архиве появился дополнительный файл 22*.bin, в который нужно будет записывать команды, которые должен отправлять дисплей к ведомым устройствам. В качестве ведомого устройства будет использоваться эмулятор Modbus Slave.

Пример записанной команды в файле 22*.bin:

5A 01 03 06 02 01 00 02 10 00 00 01

D0: 5A - стартовый байт команды;

D1: 01 - Идентификационный номер ведомого устройства;

D2: 03 - команда (может быть 1,2,3,4,5,6,10);

D3: 06 - длина данных;

D4: 02 - время ожидания приема (2 мс) (2 ~ 255);

D5: 01 - Режим отправки выполнения команды триггера (0-4)

  • 0x00 = Безусловное выполнение.
  • 0x01 = Выполнить на странице, указанной в D6.D7.
  • 0x02 = Выполнить, когда значение ключа, указанное в D6.D7, не равно нулю, значение ключа будет очищено после выполнения инструкции.
  • 0x03 = В инструкции 0x06, когда значение переменной, на которую указывает D8.D9, не равно нулю, оно будет отправлено автоматически.
    После завершения связи очистите значение переменной, указанной в D8.D9.
  • 0x04 = В инструкции 0x05,0x06; 0x10 он будет отправлен автоматически при изменении указанной переменной D8.D9.

D6, D7:

  • D5 = 0, настройка не требуется.
  • D5 = 1, он настроен как номер страницы (0x0002).
  • D5 = 2, он настраивается как ключевой адрес, запускающий отправку.
  • D5 = 3, настройка не требуется.
  • D5 = 4, настройка не требуется.

D8, D9: Эта инструкция используется для управления адресом исходной переменной или начальным адресом (0x1000) данных, размещенных на экране DGUS.

D10, D11: таблица адресов подчиненного устройства (0x0001), управляемая этой инструкцией.

D12, D13, D14, D15: Не используются.

Эта команда предназначена для чтения данных из 6 последовательных слов в таблице точек, начиная с 0x0001 ведомого (id = 0x01), когда экран является ведущим, и отображения их по адресу 0x1000_0x1005 экрана.

Запишем 4 команды, 2 команды на считывание данных с ведомого устройства и запись их в ячейки с адресами 5002 и 5004. И 2 команды на запись данных в ведомое устройство из ячеек 5000 и 5006

Команда на чтение:
5A 01 03 01 30 01 00 00 50 02 00 02 00 00 00 00 - чтение из ячейки 0002 Slave устройства(01) и запись в ячейку 5002 дисплея.

5A 01 03 01 30 01 00 00 50 04 00 04 00 00 00 00 - чтение из ячейки 0004 Slave устройства(01) и запись в ячейку 5004 дисплея.

5A 01 06 01 30 04 00 00 50 06 00 06 00 00 00 00 - автоматическая отправка данных на запись из ячейки 5006 при изменении данных, отправление происходит в ячейку памяти 0006 Slave устройства (01).

5A 01 06 01 30 04 00 00 50 00 00 00 00 00 00 00 - автоматическая отправка данных на запись из ячейки 5000 при изменении данных, отправление происходит в ячейку памяти 0000 Slave устройства(01).

Для записи данных команд в файл 22*.bin откроем файл через Notepad++ с плагином hex-editoк или UltraEdit-32. И начнём записывать команды в строки с адреса 0001C000.
Если записывать команды в файл сконфигурированный DGUS то значения инициализации останутся прежними, если файл будет новый то все переменные инициализируются нулями. В данном примере мы будем записать в новый файл без начальных значений переменных.

Редактирование файла 22_Master_Poll.bin
Редактирование файла 22_Master_Poll.bin

Загрузим проект на uSD карту, обновим прошивку дисплея, включим программу Modbus Slave, выставим настройки порта и подключимся к дисплею.
При изменении полей 5000 и 5006 на дисплее видно что данные в программе обновляются. Если в Modbus Slave изменить поля 0004 и 0002 то изменения отобразятся на дисплее.

Modbus Slave рабочее окно
Modbus Slave рабочее окно

На дисплее отобразится следующая информация:

DMG80480C050_03WTC отображаемая информация
DMG80480C050_03WTC отображаемая информация

Видео версия демонстрации использования протоколов Modbus в дисплеях DWIN.

Ссылка на GitHub: https://github.com/VB-Radchenko/DWIN-Project/

По вопросам закупок, технической поддержкой и общим вопросам обращайтесь на электронную почту: Info_dwin@mail.ru

Скидочный купон для официального магазина AliExpress - DWVLPRO

#iot #diy #сенсорная панель #modbus #ПЛК #PLC #dwin #dgus