Страница 1 из 1

Математика в контроллере

Добавлено: 01 авг 2013, 06:14
Автоматизатор
В текущей задаче присутствуют математические вычисления. Привод перемещения каретки на станке: асинхронный электродвигатель с частотным управлением. На плату частотника поступает сигнал от энкодера, установленного на валу двигателя. Дублирующий сигнал с платы идет на скоростные входа контроллера S7-1200. Требуется вычислить и отобразить на панели оператора:
- текущую скорость перемещения (в мм/мин),
- текущее положение (в мм).

Известно:
- разрешение энкодера (для квадратурного счетчика 4096),
- передаточное отношение редуктора (14:1),
- шаг ШВП (5 мм/оборот),
- максимальное перемещение (1200 мм).

Вроде математика не сложная. Но у меня всегда есть сомнение:
- будет переполнение в процессе вычислений?
- не потеряется ли точность?
- не будет ли деления на 0?

Отсюда вопросы:
- в каком формате производите вычисления DINT или REAL ?
- контролируете ли ошибки при выполнении математических операций (каким образом, какая реакция на ошибку)?
- контролируете ли входные данные при вычислении ?

Re: Математика в контроллере

Добавлено: 01 авг 2013, 07:56
Михайло
Если вычисления производятся с реальными значениями (нет деления на ноль и т.д.), то с типом REAL ничего не потеряется. Все благодаря тому, что число с плавающей запятой рассматривается как совокупность мантиссы и показателя степени.
В твоем случае происходит умножение/деление на константы - здесь точно никаких проблем. Главное сразу перейти от DINT к REAL.

S7-1200 прекрасно работает с REAL, так что лучше делать вычисления именно в REAL.

Re: Математика в контроллере

Добавлено: 02 авг 2013, 04:43
Автоматизатор
Михайло писал(а):лучше делать вычисления именно в REAL
Как все просто! Спасибо, попробую.

Re: Математика в контроллере

Добавлено: 02 авг 2013, 12:36
Автоматизатор
Решил обкатать различные варианты расчетов на эмуляторе. У меня программа расчета написана в Step7 v11. Попробовал перегнать в Step7 v12. Оказалось, что программирование контроллеров S7-1200, S7-300, S7-1500 отличается:
- S7-1200 допускает конструкции:
S7-1200.jpg
- S7-300 не допускает: требует, чтобы в одном Network было одно вхождение (т.е. так, как было в Step7 v5.4)

Блоки S7-1200 и S7-300 несовместимы, программу можно переписать кусочкам, но это трудоемко.

Re: Математика в контроллере

Добавлено: 02 авг 2013, 15:10
Михайло
Автоматизатор писал(а):S7-1200 допускает конструкции
Хорош он, правда? :)

Re: Математика в контроллере

Добавлено: 03 авг 2013, 09:54
Автоматизатор
Михайло писал(а):Хорош он, правда?
Да, мне понравились улучшения. Допускать такое - это хорошо. Не надо вставлять совершенно идиотские "AlwaysOn".

Однако, напрягает разный подход к программированию контроллеров S7-300 и S7-1500 в одной среде: 300-е программируются также как и в версии 5.

Хорошо еще, что программные блоки S7-1200 и S7-1500 совместимы.

Re: Математика в контроллере

Добавлено: 03 авг 2013, 18:18
Михайло
Я не пробовал версию Professional и CPU15xx. Будем верить тебе.

Re: Математика в контроллере

Добавлено: 03 авг 2013, 18:49
Автоматизатор
Автоматизатор писал(а):
Михайло писал(а):лучше делать вычисления именно в REAL
Как все просто! Спасибо, попробую.
Попробовал. Действительно, применительно к описанной задачи, в REAL считать удобнее. Однако, как то несколько лет назад тоже пробовал, и пришел к выводу, что в DINT точнее получается. Попробую найти старую задачу.

Как то использовал модуль позиционирования Siemens FM-351. С модулем шел СD с программным обеспечением: мастер настройки и функции управления осями. Так там все параметры были DINT. С какой целью сделали? Быстродействие улучшить? Точность?

Михайло, считаешь, что не стоит контролировать результаты выполнения математических операций?

Re: Математика в контроллере

Добавлено: 03 авг 2013, 19:42
Михайло
Автоматизатор писал(а):Быстродействие улучшить?
Похоже, что именно это.
Автоматизатор писал(а):Михайло, считаешь, что не стоит контролировать результаты выполнения математических операций?
Можно этот самый контроль разделить на две части: на design-time и на real-time. Design-time - это то есть "подумать на этапе разработки". Real-time - это когда контроль переполнений полностью осуществляется средствами системы управления в реальном времени.
Я стараюсь на этапе разработки продумать все возможные варианты значений переменных, участвующих в расчете, и уже решаю, где ставить контроль, а где нет. Ну все просто: например, если целое число из диапазона 0...4096 нужно разделить на 10000 и умножить на 128. Простой анализ показывает, что 4096 делить на 10000 в самом начале не стОит, лучше с начала умножить на 128, а результат умножения хранить в DINT и т.д. Я думаю, тебе понятно, что при условии, что число 0...4096, умножаемое на 128, нормально сохраняется в DINT, а этот же результат, деленный на 10000, можно успешно хранить в BYTE. Главное, чтобы процессор позволял такие преобразования. Так или иначе на этапе разработки все просчитывается.
Труднее, когда используются не банальные умножения и деления.
Но весьма пригождается REAL, при этом типе данных переполнения практически невозможны.

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

Re: Математика в контроллере

Добавлено: 04 авг 2013, 13:58
Автоматизатор
Интересная статья: IEEE 754 - стандарт двоичной арифметики с плавающей точкой
Вот пример на VB:

Private Sub Command1_Click()
Dim a As Single
Dim b As Double
Dim c As Double

a = 123456789.123457
b = 123456789.123457
c = a - b
Text1.Text = c

End Sub
Результат: 2,87654320895672 (должен быть 0)

Re: Математика в контроллере

Добавлено: 04 авг 2013, 14:53
Михайло
Надо заметить, что тип REAL соответствует типу single (32 бита). Тип double (64 бита) в S7-1200 отсутствует. Следовательно, ошибка 9.1 невозможна.