Блок Сложения ^^^^^^^^^^^^^ .. figure:: ../../zwb/lib/fbd_block_ADD.png :align: center **Описание:** Блок функции "Сложение" производит арифметическую операцию сложения (вычитания) со значениями, поданными на входы. Тип операции задается для каждого входа отдельно, путем изменения свойств соответствующей входу ножки. Операция выглядит как: (знак операции)значение на входе 1 + (знак операции)значение на входе 2 + .... + (знак операции)значение на входе n, где n - число входов блока (см. свойства блока). **Примечание:** тип операции задается в свойствах "ножки" входа блока. **Пример:** 1. (+)10 + (+)5 = 10+5 = 15; 2. (+)10 + (-)5 = 10-5 = 5; 3. (-)10 + (+)5 = -10+5 = -5; 4. (-)10 + (-)5 = -10-5 = -15: .. figure:: ../../zwb/lib/fbd_example_ADD.png :align: center **Свойства блока:** (ПКМ по блоку - Свойства ( :guilabel:`Alt` + :guilabel:`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: +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ |**Способ обработки**|**Операция**|**Значение**|**Операция**|**Значение**|**Операция**|**Значение**| | | | | | | | | | |**Выход**|**Выход of**| |**переполнения** |**1 входа** |**1 входа** |**2 входа** |**2 входа** |**3 входа** |**3 входа** | | | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Игнорировать | **+** | 0 | **+** | 255 | **+** | 0 | 255 | 0 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Игнорировать | **+** | 0 | **+** | 255 | **+** | 1 | 0 | 1 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Игнорировать | **+** | 128 | **+** | 128 | **+** | 3 | 3 | 1 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Игнорировать | **+** | 1 | **-** | 1 | **+** | 255 | 255 | 0 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Игнорировать | **-** | 0 | **+** | 1 | **+** | 100 | 101 | 0 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Игнорировать | **-** | 1 | **+** | 1 | **+** | 100 | 100 | 1 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Игнорировать | **-** | 1 | **+** | 128 | **+** | 255 | 126 | 1 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Установить 0 | **+** | 0 | **+** | 255 | **+** | 0 | 255 | 0 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Установить 0 | **+** | 0 | **+** | 255 | **+** | 1 | 0 | 1 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Установить 0 | **+** | 128 | **+** | 128 | **+** | 3 | 0 | 1 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Установить 0 | **+** | 1 | **-** | 1 | **+** | 255 | 255 | 0 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Установить 0 | **-** | 0 | **+** | 1 | **+** | 100 | 101 | 0 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Установить 0 | **-** | 1 | **+** | 1 | **+** | 100 | 0 | 1 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Установить 0 | **-** | 1 | **+** | 128 | **+** | 255 | 0 | 1 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Граничное значение | **+** | 0 | **+** | 255 | **+** | 0 | 255 | 0 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Граничное значение | **+** | 200 | **+** | 200 | **+** | 1 | 255 | 1 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Граничное значение | **+** | 128 | **-** | 28 | **+** | 200 | 255 | 1 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Граничное значение | **+** | 1 | **-** | 1 | **+** | 255 | 255 | 0 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Граничное значение | **-** | 0 | **+** | 200 | **+** | 55 | 255 | 0 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Граничное значение | **-** | 1 | **+** | 1 | **+** | 100 | 0 | 1 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+ | Граничное значение | **-** | 1 | **+** | 128 | **+** | 255 | 0 | 1 | +--------------------+------------+------------+------------+------------+------------+------------+---------+------------+