Н.В. Клиначев

Терминальная программа для отладки цифровых систем управления электропривода (Terminal Modbus R04 W06)

Рабочие файлы: [Terminal Modbus R04 W06] [Modbus-устройство NUCLEO-F303RE]

Описана терминальная программа для обмена данными между компьютером и комплектами разработчика встроенных систем в соответствии с протоколом Modbus RTU. Даны разъяснения к модификации исходного кода и компиляции программы (C#) без интегрированной среды разработки MS Visual Studio. Предложена методика отладки информационного обмена с виртуальным объектом в ведомом устройстве (с математической моделью двухконтурной подчиненной системы автоматического регулирования). Модель отражает движение координат разных устройств и может быть использована в условиях отсутствия подконтрольного объекта. Программа рекомендуется разработчикам измерительных приборов, цифровых систем управления импульсных источников вторичного электропитания, устройств управления электродвигателями.

Ключевые слова: Modbus, терминал, terminal, COM-порт, RS-485, электропривод, NUCLEO-F303RE, исходный код, Microsoft.NET, моделирование в Jigrein4WEB.

Введение

Отладка цифровых систем управления – это нетривиальная задача. Для её решения инженер может применить ряд инструментов доступных в той или иной степени. Отладчик интегрированной среды разработки. Цифроаналоговый преобразовать (ЦАП) микропроцессора. Математическую программу для моделирования поведения сложных динамических систем. И терминальную программу для обмена данными между компьютером и комплектом разработчика встроенных систем. Последняя, позволяя при каждой прошивке целевого процессора рассматривать несколько вариантов кода, ускоряет разработку. И, безусловно, приближает проект к конечному продукту, являясь его составной частью. Существует несколько терминальных программ. Можно порекомендовать Termite с плагином Hex View [1]. Но эта программа для обмена текстовыми сообщениями. Она не вычисляет циклическую контрольную сумму посылки (хэш-функцию) и принуждает инженера вручную вводить пакеты протокола Modbus [2]. В настоящей статье описана терминальная программа, чей графический интерфейс пользователь может изменить под свою задачу (предоставлены три шаблона). Даны разъяснения к компиляции программы (C#) без интегрированной среды разработки MS Visual Studio. Предложены примеры исходного кода подчиненных Modbus-устройств, реализованных с помощью комплектов разработчика встроенных систем NUCLEO-F303RE / NUCLEO-F334R8 (с ARM-процессором фирмы STMicroelectronics).

Описание программы

Внешний вид окна терминальной программы представлен ниже по тексту на рис. 1. На этапе запуска большинство элементов управления в нем неактивны. Для дальнейшей работы требуется настройка. Любое подчиненное Modbus-устройство имеет адрес. Компьютер, в данном случае, является ведущим устройством, поэтому, при необходимости, в строке Raw можно изменить адрес подчиненного. Терминальная программа периодически сканирует имеющиеся COM-порты и индуцирует их порядковые номера на одной из кнопок. Как только ведомое устройство будет подключено к компьютеру (посредством USB-кабеля), список дополняется новым портом. Именно его и следует выбрать, нажав кнопку. Программа открывает порт, считывает из регистров устройства флаги состояния и паспортные данные. После чего запускает таймер периодического опроса регистров с выходными координатами цифровой системы управления.

Terminal Modbus R04 W06 в режиме сканирования COM-портов
Рис. 1. Состояние окна программы в момент запуска
и сканирования имеющихся COM-портов

Отвечая на запросы ведущего, подчиненное устройство выдает выходные координаты подконтрольного объекта (электродвигателя) в относительных величинах (от -1 до +1). Терминальная программа, имея паспортные данные, приводит полученные значения к абсолютным и индицирует их в окне (скорость, ток, напряжение, мощность, состояние).

Terminal Modbus R04 W06 в режиме периодического опроса устройства
Рис. 2. Состояние окна программы в момент
периодического опроса Modbus-устройства

В окне программы имеются поля ввода данных. Уставки по скорости и току пользователь вводит в абсолютных величинах. Программа приводит их к относительным, при неправильном вводе ограничивает и программирует устройство. В каком бы состоянии не находилось подконтрольное устройство программу можно закрыть. При повторном открытии – программа подстраивает графический интерфейс под текущее состояние устройства. Например, надпись на кнопке Start или Stop. Дополнительно, при первом сканировании, программа демонстрирует пользователю номинальные значения скорости и тока.

Для отладочных целей в окне программы имеются: кнопка Event и Raw-строка для ручного ввода шестнадцатеричных данных произвольного запроса с дополняющим её полем визуализации ответа. Последние позволяют считать или записать любой из "недокументированных" регистров устройства. А кнопка Event инкрементирует в устройстве регистр-счетчик. В типовом случае, в зависимости от его значения, разработчик цифровой системы управления переключает выводимые в ЦАП микроконтроллера сигналы для контроля осциллографом.

Обмен данными между терминальной программой и ведомым устройством осуществляется в соответствии с протоколом Modbus RTU. Поддерживаются функции считывания и записи одного регистра (коды 0x04, 0x06 соответственно), характеризующиеся постоянной длинной пакета и обрабатываемые микроконтроллером ведомого устройства с минимальным индексом ветвления кода.

Карта Modbus-регистров частотного преобразователя

В соответствии с протоколом Modbus, контроль ведомого устройства осуществляется посредством данных в шестнадцатиразрядных регистрах двух типов. Первые доступны ведущему для записи (holding registers). Вторые – только для чтения (input registers). В таблице 1 представлены обе группы регистров, которые считывает и записывает представленная выше терминальная программа. Так, например единица и ноль в регистре HR02 включают и выключают устройство. А в регистрах IR07, .., IR09 хранятся паспортные данные частотного преобразователя.

                                                                     Таблица 1
+----------------------------------------------------------------------------+
|  HR00: 0003 - 0x03 адрес          IR00: 0000 = 0                           |
|  HR01: 0002 - 38400 8N1           IR01: 0000 - ERROR: NON ORC ORV ORP      |
|  HR02: 0000 - BUTTON: OFF ON      IR02: 0000 - STATE: OFF POS SIX CAP RUN  |
|  HR03: 3fff - _iq15:  Spd         IR03: 0000 - _iq14: Spd                  |
|  HR04: 6665 - _iq15:  Iq          IR04: 0000 - _iq14: Im                   |
|  HR05: 0000 - DEBUG: counter      IR05: 0000 - _iq14: Udc                  |
|                                   IR06: 0000 - _iq14: P1                   |
|                                   IR07: 0001 =    Zp: 1 шт                 |
|                                   IR08: 6a44 = 10820e-1 Гц                 |
|                                   IR09: a0d0 =  8400e-2 А                  |
|                                   IR0A: 5518 =  5400e-1 В                  |
+----------------------------------------------------------------------------+

В отношении входных и выходных координат любой системы автоматического регулирования, представленных в регистрах Modbus-устройства, можно настоятельно рекомендовать следующее соглашение. Задающие сигналы следует представлять типом данных _iq15, выходные координаты – типом данных _iq14. В первом типе данных можно закодировать число в диапазоне от -1.0 до +1.0 с разрешением в пятнадцать двоичных разрядов. Во втором – число в диапазоне от -2.0 до +2.0 с разрешением в четырнадцать разрядов. Такая система кодирования не позволит передать устройству задающие воздействия вне диапазона паспортных данных. В то же время, даже в переходном процессе, приведенная к относительным величинам выходная координата объекта не сможет выйти за диапазон от -2.0 до +2.0 ед.

                                        Листинг 1
// ----------------------------------------------
double gS1;  // уставка по скорости в отн. ед.
gS1 = DialogWindowData.gS / BASE_SPEED;
gS1 = gS1 > 1.0 ? 1.0 : gS1 < -1.0 ? -1.0 : gS1;
// Преобразование ### double к _iq15 ###
HR04 = (ushort)(gS1 * ((1 << 15) - 1));
// ----------------------------------------------

Смысл типа данных _iq15 расшифровывается следующим образом. Имеющееся число с плавающей точкой кодируется в целочисленном типе данных (long или short). 15 младших двоичных разрядов отводятся под дробную часть числа. Старшие – под целую часть и знак. Если число закодировано в полуслове (16 бит). То старший бит – это знак. Под целую часть – разрядов нет. А младшие 15 – дробная часть. Можно закодировать число от -1.000000 до +0.999969. Квант равен 1 / ((1 << 15) - 1)) = 0.00003051851.

                                        Листинг 2
// ----------------------------------------------
double yS1;  // скорость вала в отн. ед.
// Преобразование ### _iq14 к double ###
yS1 = (double)((short)IR03) / ((1 << 14) - 1));
DialogWindowData.yS = yS1 * BASE_SPEED;
// ----------------------------------------------

Шаблоны приведения координат с помощью базовой величины (BASE_SPEED) и преобразования к типу данных _iq## представлены в листингах 1 и 2.

Пример аппаратной реализации

Для быстрой интеграции описываемого технического решения в конечный продукт пользователя создана программно-аппаратная модель Modbus-устройства (см. гиперссылку на архив ниже заголовка статьи). Современные комплекты разработчика встроенных систем (небольшие платы с целевым процессором, подключаемые к компьютеру с помощью USB-кабеля) инициируют установку нескольких драйверов. Обязательным является драйвер классического программатора и отладчика. Нововведением является драйвер флешь-диска, который используется для записи бинарных файлов (это способ альтернативной прошивки целевого процессора для работы с online-компилятором). И драйвер COM-порта для взаимодействия целевого процессора с терминальной программой.

Для одной из таких плат – NUCLEO-F303RE [3] (с ARM-процессором фирмы STMicroelectronics) – в упомянутом архиве есть готовый бинарный файл и соответствующие исходные коды. Достаточно скопировать его на флешь-диск платы. И запустить терминальную программу. Программа и плата начнут взаимодействовать. Бинарный файл, в том числе, корректно исполняет процессор платы NUCLEO-F334R8 [4].

Далеко не всегда на этапе отладки информационного обмена доступен подконтрольный объект, но пересылаемые данные, с какой-то степенью приближения, должны отражать реальные процессы в нем. С этой целью был создан виртуальный объект – математическая модель двухконтурной подчиненной системы автоматического регулирования (см. ниже по тексту чертеж 1). Модель может отражать движение координат разных устройств: системы автоматического регулирования (САР) скорости вала электропривода, САР положения рабочего органа, САР выходного напряжения импульсного источника вторичного электропитания и пр.

Модель двухконтурной подчиненной системы
автоматического регулирования координат виртуального объекта

Листинг 3. Программный код dll-блока (javascript)

Программный код виртуального объекта ARM-процессор исполняет в прерывании одного из таймеров. Прототипом прерывания, в листинге 3, является функция stepEnd. Можно обратить внимание на закомментированные строки. Соответствующий код необходим для подключения входных и выходных координат виртуального объекта к карте регистров Modbus-устройства.

Модификация исходного кода и компиляция программы

Цифровые системы управления могут контролировать движение координат разных объектов. Но, разнообразие не столь уж велико, если различать их по количеству задающих сигналов и выходных координат. В большинстве случаев достаточно переименовать / добавить / удалить поля ввода и индикации данных в окне терминальной программы. Выполнить эту операцию не сложно. Нужно отредактировать исходный код любым редактором текста. И выполнить компиляцию программы. Архив исходного кода доступен по гиперссылке ниже заголовка статьи.

Терминальная программа написана для платформы Microsoft.NET [5] с применением языка программирования C#. На каждом компьютере с ОС Windows, без исключения, имеется компилятор соответствующего исходного кода (и не один). Это файлы csc.exe в папках c:\Windows\Microsoft.NET. Запустить компилятор и выполнить построение бинарного кода можно в режиме командной строки (см. файл в архиве Terminal.bat):

C:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe
/utf8output /filealign:512 /optimize+ /out:Terminal.exe
/target:winexe Form1.Designer.cs Form1.cs Program.cs >> log.txt

Названия полей ввода данных и индикации можно поменять в файле Form1.Designer.cs. Настройки COM-порта, интервалы сканирования и функции Modbus-протокола определены в файле Form1.cs.

Версии программы

...

Terminal Modbus R04 W06 в режиме периодического опроса устройства
Рис. 3. Версия программы "Terminal Modbus R04 W06"
в состоянии контроля электромагнитного привода
малых линейных перемещений рабочего органа

Terminal Modbus R04 W06 в режиме периодического опроса функционального генератора
Рис. 4. Версия программы "Terminal Modbus R04 W06"
в состоянии контроля функционального генератора

...

Выводы

  1. В условиях, когда технический объект с цифровой системой управления, недоступен, является источником повышенной опасности или не допускает ошибок, рекомендуется использовать его программную модель на этапе отладки удаленного терминального контроля.
  2. Для решения задачи отладки информационного обмена между компьютером и подчиненным Modbus-устройством хорошо зарекомендовали себя ложные модели технических систем адекватно отражающие движение координат. Их порядок существенно ниже. Одна модель может отражать движение координат разных технических устройств.
  3. В процессе отладки информационного обмена между устройством и удаленным терминалом может быть полезно временное масштабирование движений координат генерируемых моделью.
  4. Хорошей практикой является приведение координат технической системы (передаваемых по линиям связи с целью удаленного терминального контроля) к относительным единицам. Для уставок рекомендуется использовать тип данных _iq15. Это исключит саму возможность пересылки значения превышающего номинальную величину. Для выходных координат системы – _iq14. Соответствующий диапазон (от -2 до +2) лишь в два раза превышает номинальный, но его достаточно и в предельных случаях (для визуализации переходных процессов систем с минимальными запасами устойчивости).
  5. Стоимость отладки информационного обмена между компьютером и подчиненным Modbus-устройством будет низкой, если использовать имеющий драйверы COM-порта и флешь-диска комплект разработчика встроенных систем, а терминальную программу написать для платформы NET, адаптируя под задачу предложенные шаблоны.

Литература

  1. Thiadmer Riemersma. Termite: a simple RS232 terminal. 2006-2015 гг. // The CompuPhase web site. – URL: http://www.compuphase.com/software_termite.htm. Дата обращения: 20.11.2016.
  2. Modbus – открытый коммуникационный протокол // Материал из Википедии − свободной энциклопедии. − URL: https://ru.wikipedia.org/wiki/Modbus. Дата обращения: 20.11.2016.
  3. ARM mbed-enabled development board: STM32F303 Nucleo overview // База данных совместимой аппаратной части онлайн-компилятора "mbed Compiler". − URL: https://developer.mbed.org/platforms/ST-Nucleo-F303RE. Дата обращения: 20.11.2016.
  4. ARM mbed-enabled development board: STM32F334 Nucleo overview // База данных совместимой аппаратной части онлайн-компилятора "mbed Compiler". − URL: https://developer.mbed.org/platforms/ST-Nucleo-F334R8. Дата обращения: 20.11.2016.
  5. Библиотека классов .NET Framework: Класс SerialPort // Сеть разработчиков Microsoft (Microsoft Developer Network). − URL: https://msdn.microsoft.com/ru-ru/library/system.io.ports.serialport(v=vs.110).aspx. Дата обращения: 20.11.2016.

20.11.2016