Н.В. Клиначев, Е.А. Маргацкая

Прецизионный электромагнитный привод для малых линейных перемещений рабочего органа. Преобразование программного кода цифровой системы управления к целочисленной арифметике

Рабочие файлы: [ЦСУ 4 ЛЭМД Модель] [ЦСУ 4 ЛЭМД int32] [ЦСУ 4 ЛЭМД [-1, +1]]
[ЦСУ 4 ЛЭМД Шум] [ЦСУ 4 ЛЭМД Си-код]

Разработка программного кода цифровой системы управления состоит из 5-ти этапов. На первом этапе составляется модель объекта и разрабатываемой для него системы управления. За тем, с помощью динамически подключаемой (к математическому ядру моделирующей программы) библиотеки, отлаживается макет программного кода замещающий регуляторы. Третий этап связан с масштабированием параметров регуляторов для обработки сигналов в относительных величинах и эффективного использования мантиссы ЦВМ с целочисленным АЛУ. На четвёртом этапе код модифицируется в соответствии с особым стилем, чтобы изменение малого фрагмента кода позволило заменить все операции с плавающей точкой на целочисленные. И на пятом этапе, отлаженный JavaScript-код преобразуется в Си-код для последующей трансляции и прошивки микроконтроллера.

Ниже по тексту на интерактивном чертеже представлена непрерывная динамическая модель прецизионного электромагнитного привода для малых линейных перемещений рабочего органа. Ниже чертежа, в окне редактора, демонстрируется подключенный к модели программный код. Код был составлен методом пошаговой замены в исходной модели (см. гиперссылку 1) тех математических блоков, из которых были составлены регуляторы. Дополнительно была решена задача соблюдения стиля программирования, который позволяет заменить все операции с плавающей точкой на целочисленные. Суть упомянутого стиля написания кода состоит в том, что все числа с плавающей точкой и операции умножения заключаются в обертку – функцию или IQ-макрос. Если обертки пустые – трансляция генерирует код с плавающей точкой. Если заполнены – то код с целочисленными операциями.

Двухконтурная система управления ЛЭМД

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

В листинге кода определены два варианта функций-оберток (_IQ и _IQmpy). Убедитесь в том, что реализация регуляторов на ЦВМ с целочисленным АЛУ ни чуть не уступает версии, использующей математический сопроцессор. По умолчанию транслируется код с плавающей точкой. Если определить ненулевое количество разрядов в слове под дробную часть (см. константу GL_Q), то код будет обрабатывать сигналы командами целочисленной арифметики.

Выполните серию экспериментов. Меняйте тип данных для кодирования чисел с плавающей точкой (константе GL_Q присваивайте значения 24, 22, 20). В первом случае на дробную часть числа отводиться 24 бита, во втором – 22, в последнем – 20 (старшие биты – это целая часть числа и знак). Убедитесь в том, что мантисса АЛУ не перегружается и код остается работоспособным. Уточните, при каких типах данных (_iq25 и _iq11) нарушается работоспособность системы управления.

Примечание. Математическое ядро программы Jigrein4WEB вызывает функцию tune перед первым шагом симуляции. Её необходимо использовать для сброса начальных условий в регистрах задержки. Функцию calcStep математическое ядро может вызывать множество раз на каждом шаге симуляции (в зависимости от типа активированных решателей). Реализованный в ней код не должен обладать эффектом памяти (результат преобразований должен завесить исключительно от входных сигналов). Функция stepEnd вызывается на каждом шаге симуляции только один раз после всех вызовов функции calcStep и предназначена для обновления регистров задержки.

JSLint | JSBeautifier | Emmet coding

17.04.2016