Арифметические операции 

Арифметические операции

2.8.4

Числовые данные подразумевают возможность совершать над ними арифметические операции, и все ПЛК, которые мы рассматриваем (кроме простейшего F2), способны выполнять по крайней мере четыре математические функциисложение, вычитание, умножение, деление.

В разделе Представление чисел мы рассматривали целые числа и числа с плавающей точкой. При операциях с целыми числами следует соблюдать осторожность. 16-битовые целые числа, представляемые в дополнительном коде, имеют диапазон от —32 768 до +32 767 (см. Приложение). Если арифметическая операция выводит результат за границы этого диапазона, то число будет искажено. Например,

26 732
8 647
-30157 в 16-битовом дополнительном коде,

что совсем не соответствует ожидаемому результату. ПЛК имеет флажок переполнения, который может быть использован для предупреждения об опасности или для установки результата, скажем, в ноль с помощью инструкции Move. Аналогичные меры предосторожности необходимы при операциях вычитания и умножения (последняя, в частности, чувствительна к переполнению: 200 х 200 = 40 000, что выходит за границу диапазона).

Надо иметь в виду, что арифметическое переполнение может возникнуть из-за неисправности аналоговой входной платы или датчика или даже самого объекта, причем иным способом эту неисправность бывает невозможно установить. Известен достоверный случай ложного предупреждения о ракетной атаке, имевший место в США в 1960-е годы, когда радарная система зафиксировала эхо от Луны. Расстояние до мишени (вычисленное умножением времени запаздывания отраженного сигнала на скорость света) значительно превосходило границу диапазона целых чисел (произошло переполнение), но проверка не была произведена, и результат был воспринят как правильный, соответствующий отраженному сигналу от летящих ракет. Это заставило вооруженные силы США принять высшую степень боевой готовности. К счастью, через несколько минут вмешался персонал, и ситуация разрешилась.

Более серьезная предосторожность нужна при выполнении деления. Ошибка в программировании или неисправность объекта управления или входной платы ПЛК могут привести к появлению ошибки типа «деление на ноль». Это вызовет остановку работы многих ПЛК с сообщением «ошибка в программе». Поэтому на практике рекомендуется упредить любую инструкцию проверкой того, что она будет выполнена только в том случае, если ожидаемый результат будет осмысленным.

Рис. 2.40 иллюстрирует типичный пример, с которым мне довелось столкнуться. Надо было измерять скорость движения объекта; для этого измерялся интервал времени Г между моментами прохождения передней частью объекта мимо двух фотоэлементов, в результате скорость вычислялась по формуле v = d/T. Все было нормально до тех пор, пока несколько месяцев спустя не отказал фотоэлемент ФЭ2; в результате возникло деление на ноль и рано утром ПЛК сигнализировал о неисправности. Прежде чем эта неисправность была обнаружена, обслуживающий персонал был вынужден заменить несколько устройств (в том числе и сам ПЛК, поскольку постоянно была включена лампа неисправности). Автору при этом было стыдно.

Каждый производитель ПЛК организует выполнение арифметических операций по-своему, с различной степенью простоты и удобочитаемости. Но нет ничего проше, чем использование для этой цели языков высокого уровня, таких как BASIC или Pascal, но и их возможности обычно ограничиваются четырьмя математическими функциями плюс извлечение квадратного корня в наиболее дорогих машинах.

PLC-5 использует такие математические блоки, как ADD, SUB, MULT и DIV, которые позволяют создавать простые, но несколько длинные программы. Рис. 2.41 показывает, как с помощью самокорректирующейся программы с усечением длины слова можно выполнить простые вычисления. Более мошные машины семейства PLC-5 (такие как 5/40) содержат блок выполнения инструкций, позволяющий вычислять математическое выражение с помощью единственной инструкции.

Рис. 2.40. Пример ошибки «деление на ноль»
Рис. 2.41. Арифметические операции в PLC-5

ПЛК 115-U выполняет арифметические инструкции в формате STL (statement list — список операторов). Выше речь шла об аккумуляторах; инструкции загрузки (L) и переноса (Т) используют внутренний аккумулятор. Фактически имеются два аккумулятора, и инструкция загрузки перемещает содержимое аккумулятора 1 в аккумулятор 2, а после этого перемещает данные из источника в аккумулятор 1, как показано на рис. 2.42. Арифметические инструкции (сложения, вычитания и т. д.) применимы к содержимому обоих аккумуляторов. На рис. 2.42 показано, как складываются два числа и результат переносится в запоминающее устройство.

Рис. 2.42. Арифметические операции в ПЛК Siemens S5

Процедуре в нотации Siemens, изображенной на рис. 2.41, соответствовала бы следующая программа:

L DW30 (заданная длина слова)
L DW31 (фактическая длина)
SUB (ошибка остается в аккумуляторе 1)
L DW32 (коэффициент)
MULT (остающаяся поправка)
L DW40 (старое слово усеченной длины)
ADD (добавить поправку, чтобы получить новую длину)
Т DW40 (перенести результат обратно в ЗУ)

Очевидно, наиболее легкими для восприятия являются представления той же программы в обозначениях GEM-80 и ABB Master, изображенные на рис. 2.43 (а) и 2.43 (б) соответственно. Они практически не нуждаются в пояснении. Читатель, знакомый с языком FORTH (см. раздел Программирование при управлении в реальном времени), поймет, что схемы, представленные на рис. 2.42 и 2.43, основаны на использовании идеи стека магазинного типа.

Рис. 2.43. Математические функции в GEM-80 и ABB Master, (а) В GEM-80 арифметическая функция UNCON используется, чтобы избежать ошибок усечения при работе с целыми числами, (б) В ABB Master доступ к переменным осуществляется по их именам в базе данных

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