26. Прямой доступ к переменным
Automating with STEP 7 in STL and SCL 26 - 23
Автоматизация посредством STEP 7
с использованием STL и SCL
Первый сегмент в функциональном блоке FB "Generate_frame" передает
идентификатор ID, сохраненный в экземплярном блоке данных в
заголовок фрейма. Порядковый номер ConsecNum инкрементируется (+1)
и также поступает в заголовок фрейма.
Второй сегмент содержит вызов функции "Clock_check", которая
считывает суточное время из часов реального времени и в формате
TIME_OF_DAY передает эту информацию в заголовок фрейма.
В третьем сегменте Вы можете видеть принципы использования
системной функции SFC 20 BLKMOV для копирования переменных,
выбранных в процессе работы программы, без использования косвенной
адресации. Следовательно, нет необходимости знать абсолютный адрес
и структуру переменной.
Принцип предельно прост: требуемая функция копирования выбирается с
помощью распределителя переходов. Здесь при выборе перехода
допускаются номера от 1 до 4. Пример "Buffer entry" ("Входной буфер")
демонстрирует такую же функциональность, но на этот раз, с набором
"переменны х назначения" и с вычисляемым указателем в процессе
работы программы (см. 26.10).
В следующем сегменте программы генерируется контрольная сумма с
учетом заголовка фрейма и данных фрейма. Так как функция "Checksum"
генерирует контрольную сумму по единой области данных, то сначала
заголовок фрейма и данные фрейма объединяются во временную
переменную Block. После этого содержимое переменной Block побайтно
суммируется, и результат сохраняется как контрольная сумма в
исходящем фрейме.
Функциональный блок FB "Generate_Frame" запрограммирован таким
образом, что он может вызываться для генерации фрейма по фронту
сигнала.
Пример "Store frame"
("Хранение фрейма сообщения")
В примере "Store frame" ("Хранение фрейма сообщения") показано, как
используется "переменная" ANY-указатель).
Фрейм в блоке данных "Rec_mailb" должен быть внесен в следующую
позицию в блоке данных "Buffer". Локальная пе ременная блока Entry
определяет позицию в кольцевом буфере; адре с кольцевого буфера
высчитывается, исходя из значения в данной позиции (см. рис. 26.10).
Если номер фрейма блоке "почтовый ящик для входящих сообщений"
("receive mailbox") изменился, то входящий фрейм должен быть записан в
буфере в следующей позиции. Буфер должен представлять собой блок
данных, который может накапливать до 8 фреймов. После прихода
восьмого фрейма следующий, девятый фрейм, должен быть внесен вновь
в первую позицию.
Функциональный блок "Store_Frame" сравнивает номер пришедшего
фрейма с сохраненным номером в блоке данных "Rec_mailb". Если
номера фреймов различаются, то номер, который сохранен,
корректируется, и фрейм, находящийся в блоке "почтовый ящик для
входящих сооб щений" ("receive mailbox"), копируется в блок данных
"Buffer" в следующую позицию. Системная функция SFC 20 BLKMOV
управляет копированием.