Индексная адресация

Система команд блочного языка программирования контроллера (ЛМК) является функциональным аналогом системы команд языка STEP 5 фирмы SIEMENS. В связи с различием в архитектуре контроллеров, имеются незначительные отличия и в системе команд. Команды не имеют деления на основной и расширенный набор, как в STEP 5. Это позволяет использовать команды, относящиеся к “расширенному набору”, не только в функциональных блоках, как в STEP 5, но и в программных и организационных. Система команд дополнена командами работы с байтами, работающими быстрее, чем команды работы со словами.

При программировании в форме ЛМК система команд ПЛК С300 включает в себя около 200 основных команд. Большинство команд, имеющих операнд в памяти, имеют три модификации, отличающиеся адресацией операнда:

1) прямая адресация - в команде прямо указывается имя операнда, например: U Е3.4; R М75.6; LW DW17;

2) индексная адресация - индексом является содержимое какого-либо слова активного блока данных или слова меток, в команде указывается имя операнда, от которого ведется индексирование (базовый операнд) – “индексный регистр”;

Формат индексных команд:

В DWx (MWx)

+КОМАНДА ОПЕРАНД

В строке В DWx (MWx) указывается слово DWx активного блока данных или слово меток MWx, которое будет использовано в качестве индекса. Во второй строке перед командой ставится знак “+” без пробелов между ним и командой. Эти две строки являются единой командой, и между ними нельзя вставлять другие строки (даже пустые). Операнд, к которому будет произведено обращение, определяется суммой указанного имени операнда и содержимого индексного слова данных (меток), например:

В DW 17

+U Е 3.0

Если содержимое слова DW17 текущего активного блока равно 1, то команда U будет оперировать с операндом Е3.0 + 1 = Е3.1. Если содержимое слова DW17 равно 7, то операндом будет Е3.0 + 7 = Е3.7. Если номер бита превысит 7, то произойдет переход к следующему байту, т.е. если содержимое слова DW17 равно 13, то операндом будет Е3.0 + 13 = Е3.13 = Е4.5. Так индексируются битные операнды Ех.y, Ax.y, Мх.y.

Операнды типа байт, слово, бит байта или слова (QBx.y, QWx.y, DWx.у), таймер, счётчик, блок индексируются поэлементно, т.е. увеличение индекса на 1 приводит к переходу к операнду со следующим номером (от ЕВ5 к ЕВ6, от MW7 к MW8, от QB17.3 к QB18.3, от Т17 к Т18, от Z50 к Z51, от FB12 к FB13 и т.д.). Если индекс имеет отрицательное значение (-1, -2), то происходит смещение к предыдущим операндам (от ЕВ5 к ЕВ4, ЕВЗ).

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

ПРИМЕР: Занести “5” в группу слов данных DW40...DW49.

; Возьмем в качестве индексного регистра DW 07

; и будем использовать промежуточное значение бита метки М1.1

; М 1.1 = 1 означает, что индексный регистр DW 07 уже обнулялся, =0 – значит, нужно его обнулить

U M 1.1; занесение значения метки М 1.1 в аккумулятор LA

SPB =STEP; если значение LA равно 1, то переход на метку STEP

LW KF 0; иначе загрузка константы 0 в аккумулятор RW1

TW DW 07; перенос значения аккумулятора RW1 в индексный регистр DW 07

=1 M 1.1; присвоение 1 метке М 1.1

STEP:LW KF 10; загрузка константы 10 в аккумулятор RW1

LW DW 07; загрузка значения DW 07 в RW1, при этом старое значение

; RW1 (10) переместится в RW2

!=W; сравнение аккумуляторов RW1 и RW2 (см. п.4.9.)

SPB =END; если RW1=RW2 (это значит, что в DW 07 счет дошел до 10),

; то переход на метку END

LW KF 5; если аккумуляторы не равны, то записываем 5 в аккумулятор RW1

B DW 07; и загружаем значение аккумулятора (5) в слово данных

+TW DW 40; с номером 40 + [DW 07]

LW DW 07; загрузка значения DW 07 в аккумулятор RW1

IW 1; инкрементирование аккумулятора – RW1: = RW1 + 1

TW DW 07; загрузка полученного значения обратно в DW 07

END:BE; перейти в начало блока.

3) использование в качестве операнда формального параметра. Эти команды допустимы только в функциональных блоках.

Признаком формального параметра является то, что имя операнда начинается со знака “=” (например, =fo). В этом случае команда оперирует с операндом, который будет ей передан в качестве данного формального параметра при вызове этого функционального блока. При одном вызове в качестве =fo может быть назначен, например, операнд Е7.2 (если fo типа BI, т.е. битного типа, что определяется в заголовке функционального блока), а при другом вызове – операнд М14.7. Тогда одна и та же команда, использующая в качестве операнда =fo, при первом вызове обратится к Е7.2, а при втором - к М14.7. Такие команды удобны для написания функций, процедур, выполняющих операции над операндами, не задаваемыми жестко, а определяемыми в момент вызова этой функции, процедуры (см. п. 4.4.2).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: