SIEMENS, DF&PD

Предыдущее посещение: Сб июл 02, 2016 4:49 Текущее время: Сб июл 02, 2016 4:49

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




 [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: POINTER, как входной аргумент FB
СообщениеДобавлено: Ср окт 05, 2011 6:04 
Не в сети
Известный Писатель

Зарегистрирован: Вс фев 03, 2008 19:57
Сообщения: 322
Откуда: Кохтла-Ярве
Мне нужно передать указатель DB8.DBX0.0, на DataBlock, как входной аргумент функционального блока.
Код:
CALL  "DBReader" , DB4
       Count     :=
       DB_Pointer:=DB8.DBX0.0
       Par_amount:=2
       Menu_Num  :=MW200
       Par_Num   :=MW202

внутри блока передаю его адресному регистру
Код:
LAR1 P##DB_Pointer
и далее по процедуре.
Но в адресный регистр он уже приходит, как указатель на область входов P#DI2.0 (смотрю в адресном регистре симулятора)
Заглянул в экземплярный DataBlock, а там входной параметр остался по-умолчанию P# P0.0 т.е. не забрал переданное ему значение.
Не пойму, что не правильно?
Искал ответ в Бергере - не нашел...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: POINTER, как входной аргумент FB
СообщениеДобавлено: Ср окт 05, 2011 6:35 
Не в сети
Известный Писатель

Зарегистрирован: Пт июл 06, 2007 6:41
Сообщения: 325
Откуда: г. Тюмень, Россия
Догадки.

1. Сделать параметр DB_POINTER типом POINTER. При вызове давать ему P#DB8.DBX0.0

2. P#DI2.0 - это не область входов. DI - это экземплярный блок данных.

Тип POINTER является составным 6байтным типом данных. Структуру смотреть в соответствующем разделе Step7.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 05, 2011 11:31 
Не в сети
Новый писатель

Зарегистрирован: Вт окт 02, 2007 11:08
Сообщения: 14
LAR1 P##DB_Pointer - в адресном регистре лежит указатель на переменную DB_Pointer.
L W[AR1, p#0.0] - получишь номер твоей DB = 8
L D[AR1, p#0.0] - - получишь указатель = DB0.0


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 05, 2011 11:36 
Не в сети
Новый писатель

Зарегистрирован: Вт окт 02, 2007 11:08
Сообщения: 14
Прошу прощения:
L D[AR1, p#2.0] - - получишь указатель = DBX0.0


L W[AR1, p#0.0]
T #db_no
L D[AR1, p#2.0]
Lar1

OPN #db_no
A [ar1, p#0.0]
= #bool_var


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: POINTER, как входной аргумент FB
СообщениеДобавлено: Чт окт 06, 2011 6:19 
Не в сети
Известный Писатель

Зарегистрирован: Вс фев 03, 2008 19:57
Сообщения: 322
Откуда: Кохтла-Ярве
akcount писал(а):
1. Сделать параметр DB_POINTER типом POINTER. При вызове давать ему P#DB8.DBX0.0
1. Входной параметр DB_POINTER уже изначально был типа POINTER, при попытке назначить этому входному параметру P#DB8.DBX0.0 Step7 сам переделывает его в DB8.DBW0. Проделывал это и с FB и с FC.
Эдуардt писал(а):
LAR1 P##DB_Pointer - в адресном регистре лежит указатель на переменную DB_Pointer.
2. Кстати LAR1 P##DB_Pointer у меня получается сделать только в FB, в FC выражение сразу становится красным. Не разобрался почему?

3. Команду открытия DB по имени переменной...
akcount писал(а):
OPN #db_no
...Step7 не дает написать - сразу выделяет красным. Поясните, что это за переменная, какого типа? Я ее делал INT, ставил или в STAT или в TEMP.
Когда открываю в таком виде и читаю первые два слова, все в норме
Код:
OPN   DB     8
L     W [AR1,P#0.0]
T     #Menu_Num
L     W [AR1,P#2.0]
T     #Par_Num
4. Мне необходимо в процедуре сдвигать указатель на два слова по DB и читать следующие значения. Но следующей комадой сдвига...
Код:
L     #count // типа INT
SLD   3
+AR1
... контроллер тут же уходит в СТОП. Тоже не пойму почему??? Причем когда я работал без POINTER-ов эта команда работала.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: POINTER, как входной аргумент FB
СообщениеДобавлено: Чт окт 06, 2011 7:36 
Не в сети
Писатель со стажем

Зарегистрирован: Пн май 16, 2005 7:41
Сообщения: 500
Откуда: Самара
wolly писал(а):
...2. Кстати LAR1 P##DB_Pointer у меня получается сделать только в FB, в FC выражение сразу становится красным. Не разобрался почему?...

Попробуйте заменить на конструкцию:
Код:
l P##DB_Pointer // загрузить адрес переменной "указатель "
lar1 //               -> в адресный регистр

работать должно везде.

Если уж и работать с указателями (косвенной адресацией), то лучше использовать указатель ANY.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: POINTER, как входной аргумент FB
СообщениеДобавлено: Чт окт 06, 2011 16:52 
Не в сети
Известный Писатель

Зарегистрирован: Вс фев 03, 2008 19:57
Сообщения: 322
Откуда: Кохтла-Ярве
Vasiliy писал(а):
Попробуйте заменить на конструкцию:
Код:
l P##DB_Pointer // загрузить адрес переменной "указатель "
lar1 //               -> в адресный регистр

работать должно везде.
Если уж и работать с указателями (косвенной адресацией), то лучше использовать указатель ANY.

Не работает (( Выделяет красным.
И с OPN #name та же засада ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт окт 07, 2011 5:39 
Не в сети
Новый писатель

Зарегистрирован: Вт окт 02, 2007 11:08
Сообщения: 14
Работающий код:
FUNCTION_BLOCK fb1

VAR_INPUT
DB_Pointer : POINTER ;
END_VAR
VAR_TEMP
db_no : WORD ;
addr : DWORD ;
dummy : BOOL ;
END_VAR

BEGIN

LAR1 P##DB_Pointer;
L W [AR1,P#0.0];
T #db_no;
L D [AR1,P#2.0];
T #addr;

OPN DB [#db_no];
L #addr;
LAR1 ;
A [AR1,P#0.0];
= #dummy;

END_FUNCTION_BLOCK


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт окт 07, 2011 5:45 
Не в сети
Новый писатель

Зарегистрирован: Вт окт 02, 2007 11:08
Сообщения: 14
в FC:


L P##DB_Pointer
LAR1
L W [AR1,P#0.0]
T #db_no
L D [AR1,P#2.0]
T #addr

OPN DB [#db_no]
L #addr
LAR1
A [AR1,P#0.0]
= #dummy


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн окт 10, 2011 5:49 
Не в сети
Известный Писатель

Зарегистрирован: Вс фев 03, 2008 19:57
Сообщения: 322
Откуда: Кохтла-Ярве
Большое спасибо за подсказки!
Действительно, использователь указатель типа ANY весьма удобно. Получаю не только указание на DB и адрес считывания данных, но и размер рабочей области, за которую это чтение не должно заходить.
Как то вот так:
Код:
      L     P##DB_POINTER    //загрузить указатель на входную переменную типа ANY...
      LAR1
      L     W [AR1,P#4.0]                //прочитать в адресном регистре номер DB...
      T     #DB_number                   //...записать
      L     D [AR1,P#6.0]                //прочитать в адресном регистре рабочую область
      T     #area                        //...записать       
      L     W [AR1,P#2.0]                //прочитать в адресном регистре размер рабочей области...
      T     #amount                      //...записать


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн окт 10, 2011 8:03 
Не в сети
Писатель со стажем

Зарегистрирован: Пн май 16, 2005 7:41
Сообщения: 500
Откуда: Самара
wolly писал(а):
...Действительно, использователь указатель типа ANY весьма удобно. Получаю не только указание на DB и адрес считывания данных, но и размер рабочей области, за которую это чтение не должно заходить...

При учитывании размера не забывайте учитывать описатель типа данных, который лежит во втором байте ANY-указателя.
Код:
L B[Ar1, P#1.0]
.


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


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

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