Блок Умножения

_images/fbd_block_MUL.png

Описание: Блок функции “Умножение” производит арифметическую операцию умножения (деления) со значениями, поданными на входы. Тип операции задается для каждого входа отдельно, путем изменения свойств соответствующей входу ножки. Операция выглядит как: числитель - “1” умножить на произведение всех значений на входах со знаком операции “*”, знаменатель - “1” умножить на произведение всех значений на входах со знаком операции “/”.

Примечание: тип операции задается в свойствах “ножки” входа блока.

Пример:

  1. (1*10*2)/1 = 10*2 = 20;
  2. (1*2)/(1*10) = 2/10 = 0,2;
  3. (1*10)/(1*2) = 10/2 = 5;
  4. 1/(1*10*2) = 1/20 = 0,05:
_images/fbd_example_MUL.png

Свойства блока: (ПКМ по блоку - Свойства ( Alt + P ))

Общие свойства: см. Редактирование свойств блока.

Тип данных: допускаются любые типы данных из предложенных.

Количество входов: в данном пункте предоставляется возможность изменения количества входов соответствующего блока.

Показывать выход переполнения: управляет наличием выхода of, который выдает логический признак возникновения переполнения. Это свойство не влияет на выполнение операций устройством. Выход of рекомендуется использовать для выполнения специально запрограммированных действий при переполнении.

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

Существуют следующие способы обработки переполнения:

  1. «Игнорировать» - выход получает только младшие биты данных от полученного результата. Не рекомендуется использовать, за исключением реализации циклических счетчиков, когда переход счетчика через максимальное значение в 0 специально нужен, или когда старшие биты значения не нужны, достаточно младших битов.
  2. «Установить 0» - выход устанавливается в 0. Рекомендуется использовать при использовании значения 0 как признак аварии;
  3. «Выставить граничное значение» - выход получает значение, ближайшее к истинному значению, на границе диапазона значений выбранного типа данных. Это наиболее логически правильный и рекомендуемый способ, особенно для значений, суммируемых за некоторое время работы устройства;
  4. «Настройки проекта» - ссылка на один из первых трех способов, указанный в настройках проекта. Эта опция позволяет централизованно управлять этим свойством.

При наличии нескольких операций в одном блоке, т.е. более чем 2 входов – ситуация переполнения последовательно анализируется при выполнении операций:

  • выход of равен 0, если переполнения нет при выполнении всех операций (на выходе математически правильное значение), иначе устанавливается 1;
  • при 2 и 3 способе обработки при возникновении переполнения блок пропускает выполнение следующих операций, т.к. все биты, в т.ч. младшие, приняли математически неправильные значения. Поэтому при пропуске следующих операций в 3 способе обработки и возникновении ситуации переполнения несколько раз в разные стороны (например, сначала вверх, затем вниз) выдаваемое значение будет соответствовать первой по порядку ситуации переполнения;
  • при 1 способе обработки при возникновении переполнения блок продолжает выполнение следующих операций. При выполнении вычитания первого входа значение вычитается из 0, блок выполняет на одну операцию больше в сравнении со сложением первого входа. При этом вычитании также обрабатывается переполнение.

Внимание: при 2 и 3 способе обработки переполнения, в случае возникновения переполнения, результат зависит от порядка выполнения операций, т.е. подключение входов в другом порядке приводит к изменению результата. В том числе, возможно, что при каком-то варианте подключения переполнение не происходит, а в другом – происходит, при одинаковых входных значениях. Этого можно избежать с помощью выбора в блоке типа данных с большей разрядностью, чем типы данных значений на входах. В таком случае переполнение практически не может случиться (для переполнения потребуется слишком большое количество входов). При использовании типов данных с плавающей запятой вероятность переполнения значительно уменьшается. Но имеются побочные эффекты, которые могут привести к неожиданным результатам.

Следует иметь ввиду:

  • при увеличении порядка значения снижается его точность из-за увеличения дискретности, например 4-байтовое число порядка 17000000 имеет дискретность 2, т.е. сложение 1 к нему может не изменить результат!
  • обработка младших разрядов, выходящих за предел разрядности, может зависеть от реализации в устройстве. В большинстве устройств вычисления реализуются по стандарту IEEE 754, но это не гарантировано.

Пример выполнения блока для 1-байтового беззнакового типа данных, значения ограничены диапазоном от 0 до 255:

Способ обработки

переполнения

Операция

1 входа

Значение

1 входа

Операция

2 входа

Значение

2 входа

Операция

3 входа

Значение

3 входа

Выход Выход of
Игнорировать * 1 * 255 * 0 255 0
Игнорировать * 2 * 129 * 1 4 1
Игнорировать * 128 * 128 * 3 0 1
Игнорировать * 0 / 0 * 255 0 1
Игнорировать / 0 * 1 * 100 0 1
Игнорировать / 1 * 1 * 100 100 1
Игнорировать / 1 * 128 * 255 0 1
Установить 0 * 1 * 255 * 1 255 0
Установить 0 * 2 * 200 * 0 0 1
Установить 0 * 128 * 128 * 3 0 1
Установить 0 * 0 / 0 * 0 0 1
Установить 0 / 0 * 1 * 100 0 1
Установить 0 / 1 * 1 * 100 100 0
Установить 0 / 1 * 128 * 255 0 1
Граничное значение * 1 * 255 * 1 255 0
Граничное значение * 2 * 200 * 0 255 1
Граничное значение * 128 * 128 * 3 255 1
Граничное значение * 0 / 0 * 0 255 1
Граничное значение / 0 * 1 * 100 255 1
Граничное значение / 1 * 1 * 100 100 0
Граничное значение / 1 / 128 * 255 255 1