Добавить в корзинуПозвонить
Найти в Дзене

Округление при программировании ПЛК

У вас бывало такое, что вы пишите программу для программируемого логического контроллера на FBD, ST или CFC, делаете математику, преобразуете одни типы переменных в другие, а результат получается какой-то странный? В этом материале мы подробно рассмотрим все вопросы округления и узнаем, почему что-то может пойти не так! Работает, как обычное математическое округление. Округляет вещественное число до ближайшего целого, а затем округлённое число преобразуется в указанный тип целого. Если в результате такого преобразования округленное значение выходит за пределы диапазона типа выходной переменной, возвращается неопределённое значение, зависящее от системы. Если мы пытаемся преобразовать отрицательное число в беззнаковый тип переменной, то возникает ошибка, связанная с представлением беззнаковых переменных в памяти ПЛК, мы получим также неожиданное число. Принимает число REAL, отбрасывает его дробную часть и возвращает значение в формате DINT или INT соответственно. Работает, как округлени
Оглавление

У вас бывало такое, что вы пишите программу для программируемого логического контроллера на FBD, ST или CFC, делаете математику, преобразуете одни типы переменных в другие, а результат получается какой-то странный?

В этом материале мы подробно рассмотрим все вопросы округления и узнаем, почему что-то может пойти не так!

Функции преобразования типа переменной
REAL_TO_INT () и т.п.

Работает, как обычное математическое округление. Округляет вещественное число до ближайшего целого, а затем округлённое число преобразуется в указанный тип целого.

Примеры использования функции REAL_TO_INT() и т.п. на языке CFC (модифицированный FBD)
в CoDeSys 3.5
Примеры использования функции REAL_TO_INT() и т.п. на языке CFC (модифицированный FBD) в CoDeSys 3.5
Примеры использования функции REAL_TO_WORD() и т.п. на языке CFC в CoDeSys 3.5
Примеры использования функции REAL_TO_WORD() и т.п. на языке CFC в CoDeSys 3.5

Если в результате такого преобразования округленное значение выходит за пределы диапазона типа выходной переменной, возвращается неопределённое значение, зависящее от системы.

Если мы пытаемся преобразовать отрицательное число в беззнаковый тип переменной, то возникает ошибка, связанная с представлением беззнаковых переменных в памяти ПЛК, мы получим также неожиданное число.

Пример синтаксиса на ST. Результат - слева, выражение – справа.
Пример синтаксиса на ST. Результат - слева, выражение – справа.

Функции усечения
TRUNC() и TRUNC_INT ()

Принимает число REAL, отбрасывает его дробную часть и возвращает значение в формате DINT или INT соответственно. Работает, как округление к нулю.

Не рекомендуется использовать другие типы переменных вместо INT и DINT соответственно. Это может вообще не сработать или сработать некорректно.

Примеры использования функции TRUNC() и TRUNC_INT() на языке CFC в CoDeSys 3.5
Примеры использования функции TRUNC() и TRUNC_INT() на языке CFC в CoDeSys 3.5
Пример синтаксиса на ST. Результат - слева, выражение – справа.
Пример синтаксиса на ST. Результат - слева, выражение – справа.

Результат деления

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

Примеры использования оператора DIV и MOD на языке CFCс разными значениями и типами переменных в CoDeSys 3.5.
Примеры использования оператора DIV и MOD на языке CFCс разными значениями и типами переменных в CoDeSys 3.5.
Пример синтаксиса на ST. DIV заменяется на значок «/». Результат - слева, выражение – справа.
Пример синтаксиса на ST. DIV заменяется на значок «/». Результат - слева, выражение – справа.

Так, при делении вещественных чисел (REAL), мы получаем привычное дробное число, математически округленное до количества символов, установленного системой.

А при делении целочисленных значений (INT, WORD) мы получаем целое число, округленное к нулю, если результат получается дробный (то есть происходит усечение).

При этом мы можем получить остаток от такого деления оператором MOD.
Обратите внимание, что остаток от целочисленного деления будет отрицательный, если делимое отрицательное, и положительным, если делимое положительное.
Использовать MOD можно только с целочисленными типами переменных.

Округление до n знаков после запятой

Иногда требуется выдать результат с определенной точностью. В таком случае чаще всего переводят значение в более мелкие единицы измерения.
Проще говоря, если нужно получить значение с точностью до десятых – все умножают на 10, а в конце результат переводят в REAL и делят его на те же 10.
Тут, разве что, стоит следить за математикой, и контролировать, что с чем мы перемножаем-делим-складываем, чтобы не вышло ошибки в итоговых единицах измерения.

Пример, где значения с датчиков температуры, предварительно умноженные на 10, теперь снова делятся на 10, чтобы получить значения с точностью до десятых
Пример, где значения с датчиков температуры, предварительно умноженные на 10, теперь снова делятся на 10, чтобы получить значения с точностью до десятых

Библиотечное округление

Демонстрация работы библиотечных функций округления к большему, к меньшему, с определенной точностью.
Демонстрация работы библиотечных функций округления к большему, к меньшему, с определенной точностью.

Помимо стандартных способов есть и дополнительные библиотеки с функциями округления разного рода, например стандартная FloatingPointUtils или нестандартная - Oscat.

Но, понимая принципы, изложенные в статье, вы без труда сможете разобраться с ними или написать свою собственную функцию и реализовать какой-то новый необычный сценарий округления!

Надеемся, что этот материал позволил вам разобраться в своих старых ошибках. Дайте знать, если было полезно👍🏻
А
у нас на уроках также подробно разбираются и более сложные вещи.
Ждем вас!