Краткий справочник по STL
.pdfS7-300/400 Система команд |
Описание |
Команды_сравнения |
Содержание |
Команды сравнения представлены тремя подгруппами:
Сравнение_длинных_целых_чисел_со_знаком
Сравнение_целых_чисел_со_знаком
Сравнение_вещественных_чисел
Содержание
22
S7-300/400 Система команд Описание
Команды_сравнения Содержание
1. Сравнение_длинных_целых_чисел_со_знаком
В эту группу входит шесть команд: ==D , <=D , <D , <>D , >=D , >D . Формат: ==D , <=D , <D , <>D , >=D , >D
Описание. Данные команды сравнивают содержимое ACCU2 с содержимым ACCU1. Содержимое ACCU2 и ACCU1 рассматривается, как long integer 32 бита. Результат сравнения отражается в бите RLO и битах CC1, CC0. У всех команд общий алгоритм работы. Пусть, например, выполняется команда '<=D'. Процессор подставит значение ACCU2 с левой стороны от знака сравнения, а значение ACCU1 подставит вместо 'D', то есть с правой стороны. Бит RLO будет установлен, если результат сравнения истинен, иначе RLO = 0. Биты CC1 и CC0 показывают отношение 'меньше', 'равно' или 'больше' (См. Команды_переходов).
BR
-
-
Следующая таблица показывает, какое значение будет записано в бите RLO при различных исходных (1) и (2) условиях:
(2) А выполнялась |
(1) Пусть, имело место какое-то отношение |
|||
между ACCU2 и ACCU1: |
||||
одна из инструкций: |
|
|
|
|
ACCU2 > ACCU1 |
ACCU2=ACCU1 |
ACCU2 < ACCU1 |
||
|
||||
|
|
|
|
|
'==D' |
0 |
1 |
0 |
|
|
|
|
|
|
'¹D' |
1 |
0 |
1 |
|
|
|
|
|
|
'>D' |
1 |
0 |
0 |
|
|
|
|
|
|
'<D' |
0 |
0 |
1 |
|
|
|
|
|
|
'>=D' |
1 |
1 |
0 |
|
|
|
|
|
|
'<=D' |
0 |
1 |
1 |
Пример:
LMD 10
LID 24
>D |
// Если ACCU2 ( MD 10 ) больше чем ACCU1 (ID 24 ), |
//то бит RLO будет установлен
=M 2.0 // M 2.0 :=1 , если MD 10 > ID 24
2. Сравнение_целых_чисел_со_знаком (integer 16 бит)
В эту группу входит шесть команд: ==I , <=I , <I , <>I , >=I , >I . Формат: ==I , <=I , <I , <>I , >=I , >I
Описание. См. описание предыдущей группы команд. Все то же самое, за исключением того, что берутся ACCU1_L и ACCU2_L.
Содержание
23
S7-300/400 Система команд |
Описание |
Команды_сравнения Оглавление
3. Сравнение_вещественных_чисел
В эту группу входит шесть команд: ==R , <=R , <R , <>R , >=R , >R . Формат: ==R , <=R , <R , <>R , >=R , >R
Описание. Сравнивается содержимое ACCU1 и ACCU2. Значение в Аккумуляторах рассматривается как вещественные числа с плавающей точкой (32-bit IEEE floating point). Команды работают так же, как в
предыдущих подгруппах.
|
BR |
CC1 |
CC0 |
OV |
OS |
OR |
STA |
RLO |
/FC |
Зависит от |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Воздействует на |
- |
Х |
Х |
Х |
Х |
0 |
Х |
Х |
1 |
Содержание
24
S7-300/400 Система команд |
Описание |
Содержание |
Команды_преобразования |
В данную группу входят 17 команд:
from_BCD_to_Long_integer
from_BCD_to_Integer
from_Long_integer_to_BCD
from_Integer_to_BCD
from_Long_integer_to_Real
Инвертирование_битов_двойного_слова
Инвертирование_битов_слова
from_Integer_to_Long_integer
Смена_знака_для_Long_integer
Смена_знака_для_Integer
Смена_знака_для_Real
Округление_до_ближайшего_целого
Округление_до_большего_целого
Округление_до_меньшего_целого
Отбрасывание_дробной_части
Обмен_байтами_в_двойном_слове
Обмен_байтами_в_слове
Содержание
25
S7-300/400 Система команд Описание
Команды_преобразования Содержание
1. from_BCD_to_Long_integer Формат: BTD
Описание. Содержимое ACCU1 рассматривается, как число в BCD формате, оно преобразуется в Long integer и результат сохраняется в
ACCU1. |
|
|
|
Значение в ACCU1 рассматривается как число в BCD формате: |
|
31 |
30..28 |
27....0 |
знак |
не используются |
7 цифр BCD формата от -9.999.999 до |
|
|
+9.999.999 |
|
Замечание. Если хотя бы |
одна цифра исходного числа (BCD |
формат) оказалась принадлежащей недействительному диапазону (от 10 до 15), то контроллер распознает синхронную ошибку. По умолчанию
контроллер прекращает выполнение программы пользователя и переходит в состояние STOP. Однако, если Вы запрограммируете OB121, то при возникновении такой ошибки управление будет передано в OB121.
|
BR |
CC1 |
CC0 |
OV |
OS |
OR |
STA |
RLO |
/FC |
Зависит от |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Воздействует на |
- |
- |
- |
- |
- |
- |
- |
- |
- |
2. from_BCD_to_Integer Формат: BTI
Описание. Содержимое ACCU1_L рассматривается, как число в BCD формате, оно преобразуется в Integer и результат сохраняется в ACCU1_L. Значения ACCU1_H и ACCU2 не изменяются.
Значение в ACCU1_L рассматривается как число в BCD формате:
31....16 |
15 |
14..12 |
11...0 |
не используются |
знак |
не используются |
3 цифры BCD формата |
|
|
|
от -999 до +999 |
Замечание. Если хотя |
бы одна цифра |
исходного числа (BCD |
формат) оказалась принадлежащей недействительному диапазону (от 10 до 15), то контроллер распознает синхронную ошибку. По умолчанию контроллер прекращает выполнение пользовательской программы и
переходит в состояние STOP. Однако, если Вы запрограммируете OB121, то при возникновении такой ошибки управление будет передано в OB121.
|
BR |
CC1 |
CC0 |
OV |
OS |
OR |
STA |
RLO |
/FC |
Зависит от |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Воздействует на |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Содержание
26
S7-300/400 Система команд Описание
Команды_преобразования Оглавление
3. from_Long_integer_to_BCD Формат: DTB
Описание. Содержимое ACCU1 рассматривается как 32-ух битное целое число со знаком Long integer. Оно преобразуется в BCD формат (обратное действие к команде BTD), результат сохраняется в ACCU1. Причем, в битах 0...27 прописываются BCD цифры, а в битах 28..31
прописывается знак '+' 0000 или '-' |
1111. ACCU2 не изменяется. |
|
|
||||||
|
BR |
CC1 |
CC0 |
OV |
OS |
OR |
STA |
RLO |
/FC |
Зависит от |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Воздействует на |
- |
- |
- |
Х |
Х |
- |
- |
- |
- |
Замечание. Так как BCD формат ограничен отрезком [-9.999.999 .. +9.999.999], то если преобразуемое Long integer изначально не находилось в этом отрезке, то будут установлены биты OV и OS в слове состояния.
4. from_Integer_to_BCD Формат: ITB
Описание. Содержимое ACCU1_L рассматривается как 16-ти битное целое число со знаком Integer. Оно преобразуется в BCD формат (обратное действие к команде BTI), результат сохраняется в ACCU1_L. Причем, в битах 0...11 прописываются BCD цифры, а в битах 12..15 прописывается знак '+' 0000 или '-' 1111. ACCU1_H и ACCU2 не изменяются.
|
BR |
CC1 |
CC0 |
OV |
OS |
OR |
STA |
RLO |
/FC |
Зависит от |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Воздействует на |
- |
- |
- |
Х |
Х |
- |
- |
- |
- |
Замечание. Так как BCD формат ограничен отрезком [-999 .. +999], то если преобразуемое Integer изначально не находилось в этом отрезке, то будут установлены биты OV и OS в слове состояния.
5. from_Long_integer_to_Real Формат: DTR
Описание. Содержимое ACCU1 рассматривается как 32-ух битное целое число со знаком Long integer. Оно преобразуется в 32-ух битное вещественное число Real (число с плавающей точкой). Результат сохраняется в ACCU1. ACCU2 не изменяется.
|
BR |
CC1 |
CC0 |
OV |
OS |
OR |
STA |
RLO |
/FC |
Зависит от |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Воздействует на |
- |
- |
- |
- |
- |
- |
- |
- |
- |
На следующей странице приводится пример с подробными пояснениями.
Содержание
27
S7-300/400 Система команд |
Описание |
Команды_преобразования Содержание
Пример:
LMD 10 // Пусть, например, в MD10 было +500
DTR |
// Преобразование |
TMD 20 // Результат запишем в MD20
MD10 = 500 |
31 |
|
|
|
|
|
15 |
|
|
|
0 |
|
|
0000 0000 |
0000 |
0000 |
0000 |
0001 |
1111 |
0100 |
|
||||
MD20 = 500.0 |
31 |
30… |
23 |
22… |
… |
|
|
…0 |
||||
|
0 |
10000111 |
111 1010 |
0000 |
|
0000 0000 |
0000 |
|||||
|
знак |
порядок |
|
23-ех битная мантисса |
|
|||||||
Число с плавающей точкой записывается в формате IEEE: |
|
|||||||||||
31 |
0 |
|
|
|
|
|
|
|
|
|
|
|
[...................] , где бит 31 |
- знак мантиссы. Биты 30...23 - значение |
|||||||||||
порядка, причем значимость битов следующая: |
|
|
|
|
|
∙бит 30 ≡ 128
∙бит 29 ≡ 64
∙.....
∙бит 24 ≡ 2
∙бит 23 ≡ 1
Биты 22…0 - значение мантиссы, причем значимость битов следующая:
∙бит 22 ≡ 2-1 (т.е. 0.5)
∙бит 21 ≡ 2-2 (т.е. 0.25)
∙бит 20 ≡ 2-3 (т.е. 0.125)
∙.....
∙бит 0 ≡ 2-27
Общая формула такая:
(знак) * (1.мантисса) * 2 порядок - 127
Итак, в данном примере мантисса получилась: 22 15 0 111 1010 0000 0000 0000 0000
Если Вы преобразуете ее, то получится 0.953125. Далее, после преобразования порядка 10000111, получится 135.
Теперь возвращаемся к формуле:
(+1) * (1.953125) * 2 (135-127) |
= 1.953125 * 2 8 = 500 |
Именно то, что и требовалось доказать.
Содержание
28
S7-300/400 Система команд |
Описание |
Команды_преобразования Содержание
6. Инвертирование_битов_двойного_слова Формат: INVD
Описание. Содержимое ACCU1 рассматривается как двойное слово Double word. Каждый бит этого Double word инвертируется. Результат сохраняется в ACCU1.
ACCU2 без изменений.
|
BR |
CC1 |
CC0 |
OV |
OS |
OR |
STA |
RLO |
/FC |
Зависит от |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Воздействует на |
- |
- |
- |
- |
- |
- |
- |
- |
- |
7. Инвертирование_битов_слова Формат: INVI
Описание. Содержимое ACCU1_L рассматривается как слово Word. Каждый бит этого слова инвертируется. Результат сохраняется в ACCU1_L.
ACCU2 и ACCU1_H без изменений.
|
BR |
CC1 |
CC0 |
OV |
OS |
OR |
STA |
RLO |
/FC |
Зависит от |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Воздействует на |
- |
- |
- |
- |
- |
- |
- |
- |
- |
8. from_Integer_to_Long_integer Формат: ITD
Описание. Содержимое ACCU1_L рассматривается как целое число со знаком Integer, оно преобразуется в длинное целое со знаком Long integer, то есть выполняется расширение знаковым битом.
ACCU2 не изменяется.
|
BR |
CC1 |
CC0 |
OV |
OS |
OR |
STA |
RLO |
/FC |
Зависит от |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Воздействует на |
- |
- |
- |
- |
- |
- |
- |
- |
- |
9. Смена_знака_для_Long_integer Формат: NEGD
Описание. Содержимое ACCU1 рассматривается как длинное целое число со знаком Long integer, оно умножается на -1, то есть выполняется смена знака, результат сохраняется в ACCU1.
В процессоре умножение на -1 реализуется путем инверсии и прибавлением 1.
ACCU2 не изменяется.
|
BR |
CC1 |
CC0 |
OV |
OS |
OR |
STA |
RLO |
/FC |
Зависит от |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Воздействует на |
- |
Х |
Х |
Х |
Х |
- |
- |
- |
- |
Содержание
29
S7-300/400 Система команд |
Описание |
Команды_преобразования Содержание
Замечание. После выполнения команды результат будет сохранен в ACCU1, ниже показана зависимость установки флагов от значения
результата.
|
|
CC1 |
CC0 |
OV |
OS |
|
|
|
|
|
|
результат = |
0 |
0 |
0 |
0 |
- |
|
|
|
|
|
|
- 2.147.483.648 |
≤ результат ≤ -1 |
0 |
1 |
0 |
- |
|
|
|
|
|
|
+1 ≤ результат |
≤ + 2.147.483.647 |
1 |
0 |
0 |
- |
|
|
|
|
|
|
Если же перед выполнением команды содержимое ACCU1 было равно - 2.147.483.648, то после выполнения команды (казалось бы, что результат будет +2.147.483.648) будут установлены флаги:
0 |
1 |
1 |
1 |
Т.е. имеет место переполнение
10. Смена_знака_для_Integer Формат: NEGI
Описание. Содержимое ACCU1_L рассматривается как целое число со знаком Integer, оно умножается на -1, то есть выполняется смена знака, результат сохраняется в ACCU1_L.
ACCU2 и ACCU1_H без изменений.
|
BR |
CC1 |
CC0 |
OV |
OS |
OR |
STA |
RLO |
/FC |
Зависит от |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Воздействует на |
- |
Х |
Х |
Х |
Х |
- |
- |
- |
- |
См. замечание для предыдущей команды с той разницей, что нижняя граница теперь равна -32768 , а верхняя +32767.
11. Смена_знака_для_Real Формат: NEGR
Описание. Содержимое ACCU1 рассматривается как число с плавающей точкой, оно умножается на -1, результат сохраняется в ACCU1.
ACCU2 не изменяется.
|
BR |
CC1 |
CC0 |
OV |
OS |
OR |
STA |
RLO |
/FC |
Зависит от |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Воздействует на |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Пример: |
|
|
|
|
|
|
|
|
|
L МD 2 |
// Пусть, например, МD2 = 1.5E+02 |
|
|
|
|||||
NEGR |
|
|
|
|
|
|
|
|
|
TMD 2 // Теперь MD2 = -1.5E+02
Содержание
30
S7-300/400 Система команд |
Описание |
Команды_преобразования Содержание
12. Округление_до_ближайшего_целого Формат: RND
Описание. Содержимое ACCU1 рассматривается как число с плавающей точкой Real, оно преобразуется в Long integer путем округления до ближайшего целого. Причем, если исходное число не умещается в формате Long integer, то это рассматривается как ошибка, и производится установка битов OV и OS. В том случае, если значение исходного числа оказывается ровно по середине между двумя целыми числами, то число округляется до четного числа.
ACCU2 не изменяется.
|
BR |
CC1 |
CC0 |
OV |
OS |
OR |
STA |
RLO |
/FC |
Зависит от |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Воздействует на |
- |
- |
- |
Х |
Х |
- |
- |
- |
- |
13. Округление_до_большего_целого Формат: RND+
Описание. Содержимое ACCU1 рассматривается как число с плавающей точкой, оно преобразуется в Long integer путем округления до ближайшего большего целого. Причем, если исходное число не умещается в формате Long integer, то это рассматривается как ошибка, и производится установка битов OV и OS.
ACCU2 не изменяется.
|
BR |
CC1 |
CC0 |
OV |
OS |
OR |
STA |
RLO |
/FC |
Зависит от |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Воздействует на |
- |
- |
- |
Х |
Х |
- |
- |
- |
- |
14. Округление_до_меньшего_целого Формат: RND-
Описание. Содержимое ACCU1 рассматривается как число с плавающей точкой, оно преобразуется в Long integer путем округления до ближайшего меньшего целого. Причем, если исходное число не умещается в формате Long integer, то это рассматривается как ошибка, и производится установка битов OV и OS.
ACCU2 не изменяются.
|
BR |
CC1 |
CC0 |
OV |
OS |
OR |
STA |
RLO |
/FC |
Зависит от |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Воздействует на |
- |
- |
- |
Х |
Х |
- |
- |
- |
- |
Содержание
31