SIEMENS, DF&PD

Предыдущее посещение: Вт июн 28, 2016 4:08 Текущее время: Вт июн 28, 2016 4:08

Часовой пояс: UTC + 3 часа




 [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Косвенная адресация
СообщениеДобавлено: Чт сен 19, 2013 11:35 
Не в сети

Зарегистрирован: Чт сен 19, 2013 8:02
Сообщения: 1
Добрый день! Очень нужна помощь.
Есть следующий фрагмент кода функции FC:
...
CALL "DPWR_DAT"
LADDR :=#laddr
RECORD :=P#DB61.DBX1524.0 BYTE 12
RET_VAL:=#fault_code
...

Возможно ли в параметр RECORD записывать какую-либо временную переменную вместо DBX1524.0 ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт сен 19, 2013 13:09 
Не в сети
Известный Писатель

Зарегистрирован: Чт мар 08, 2007 17:11
Сообщения: 336
Откуда: Киров - - Вятка - - Хлынов
Ну не совсем это косвенная адресация.....
Это - тип данных POINTER
Цитата:
POINTER: указывает адрес переменной. Указатель содержит адрес вместо значения. Когда Вы снабжаете формальный параметр типа POINTER значением, задавайте в качестве фактического параметра адрес. В STEP 7 Вы можете задавать указатель в формате указателя или просто как адрес (например, М 50.0). Пример формата указателя для адресации данных, начинающихся с М 50.0: P#M50.0.
Изображение

Переменная RECORD в данном случае - это 12 байт начиная с DB61.DBB1524
Так что записывать в Record временную переменную можно, главное помнить, что длиной она будет 12 байт. Если Вы не уверены в том, что храниться в DB61-м начиная с адреса 1524, то в качестве временной переменной создайте свой вспомогательный DB длиной 12 байт со структурой как в DB61 начиная с байта 1524 - и всё, можно экспериментировать. Если, к примеру Ваш DB будет №1, то формат записи такой: RECORD:=P#DB1.DBX0.0 BYTE 12
Поскольку ваш DB в программе больше нигде фигурировать не будет, в эти байты можно записать любые нужные значения


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Косвенная адресация
СообщениеДобавлено: Пт сен 20, 2013 10:30 
Не в сети
Начинающий писатель

Зарегистрирован: Сб ноя 03, 2012 16:07
Сообщения: 96
Откуда: Россия, г. Волжский
VasjaNechaev писал(а):
Добрый день! Очень нужна помощь.
Есть следующий фрагмент кода функции FC:
...
CALL "DPWR_DAT"
LADDR :=#laddr
RECORD :=P#DB61.DBX1524.0 BYTE 12
RET_VAL:=#fault_code
...

Возможно ли в параметр RECORD записывать какую-либо временную переменную вместо DBX1524.0 ?

Можно записать:
RECORD :=P#M128.0 BYTE 12.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс сен 22, 2013 7:32 
Не в сети
Писатель со стажем

Зарегистрирован: Пн май 16, 2005 7:41
Сообщения: 500
Откуда: Самара
1. создаёте Temp-переменную Record тип данных ANY

2. Ваш кусок кода для косвенной адресации будет следующим:

Код:
LAR1 P#Record // адресный регистр спозиционировать на ANY-указатель
L B#16#10 // префикс для всех указателей
t B[ar1, P#0.0]
L B#16#2 // тип данных байт
t B[ar1, P#1.0]
L CountBytes//Ваша переменная типа Word, в которой лежит размер в байтах
t W[ar1, P#2.0]
L NumDB //Ваша переменная типа Word, в которой лежит номер DB (если он есть, если его нет можно писать 0)
t W[ar1, P#4.0]
L P#DBX1524.0
T AddressRecord
l AddressRecord //Ваша переменная типа DWord, в которой лежит адрес, выше она инициализирована, но можно и менять динамически
T D[ar1, P#6.0]

...
CALL "DPWR_DAT"
LADDR :=#laddr
RECORD :=Record
RET_VAL:=#fault_code
...

про косвенную адресацию хорошо написано у Бергера для STL в главах 25 и 26


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
 [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: 40_p9tka124, YandexBot и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group