Указатель на локальные данные FB (pointer to local data)?

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
Post Reply
Terand
Posts: 6
Joined: Wed Feb 15, 2006 8:15 am
Location: Russia

Указатель на локальные данные FB (pointer to local data)?

Post by Terand » Wed Apr 05, 2006 5:48 am

Внутри FB вызываю SFC15 для которой необходим параметр RECORD.
Если подставить что то типа P#DB30.DBX0.0 BYTE 8, то всё работает.
Но мне нужно сформировать такой же указатель на локальные (temp) расположеные внутри самой FB. Попытка подставить что то типа p##LW0.DBX0.0 BYTE 8 не проходит.
Возможна ли вообще такой указатель, и если да то как правильно его написать?
Под temp переменными находятся WORD к которым происходит обращение и формирование внутри FB

sania
Site Admin
Posts: 1371
Joined: Sat Aug 13, 2005 6:15 am
Contact:

Post by sania » Wed Apr 05, 2006 6:13 am

ПРИМЕРНО ТАК

Code: Select all

FUNCTION_BLOCK FB 1
TITLE =
AUTHOR : Alex
FAMILY : 
NAME : 
VERSION : 0.1


VAR_INPUT
  SL_LIST : BLOCK_DB ;
END_VAR
VAR_IN_OUT
  Ret_Val_R_W : INT ;	
  Time_Delay_Interrupt : WORD ;	
END_VAR
VAR
  read_byte1 : BYTE ;	
  read_byte2 : BYTE ;	
  read_word : WORD ;	
  read_dword : DWORD ;	
  write_byte1 : BYTE ;	
  write_byte2 : BYTE ;	
  write_word : WORD ;	
  write_dword : DWORD ;	
  INIT_DBNR : WORD ;	
  tmp_ret_val : WORD ;	
  SL_DBNR : WORD ;	
  Init_Index : BYTE  ;	
END_VAR
BEGIN
NETWORK
TITLE =
 CALL SFC   14 (
           LADDR                    := DBW    6,
           RET_VAL                  := #Ret_Val_R_W,
           RECORD                   := P#DIX 6.0 BYTE 8);

CALL SFC   15 (
           LADDR                    := DBW    6,
           RECORD                   := P#DIX 14.0 BYTE 8,
           RET_VAL                  := #Ret_Val_R_W);

sania
Site Admin
Posts: 1371
Joined: Sat Aug 13, 2005 6:15 am
Contact:

Post by sania » Wed Apr 05, 2006 6:20 am

Попытка подставить что то типа p##LW0.DBX0.0 BYTE 8 не проходит.
в FB у тебя внутренние параметры содержатся в экземплярном DB!поэтому:
p#dix0.0 byte 8

Terand
Posts: 6
Joined: Wed Feb 15, 2006 8:15 am
Location: Russia

Post by Terand » Wed Apr 05, 2006 6:33 am

Огромное СПАСИБО!
Вроде получается.

Terand
Posts: 6
Joined: Wed Feb 15, 2006 8:15 am
Location: Russia

Post by Terand » Mon Apr 10, 2006 6:54 am

К сожалению радость оказалась преждевременной :(
Синтаксис действительно понимает, но данные в temp переменных не правильные какие то.
Для проверки использую точно такую же FB, но с прямым указанием DB.
А с использованием экземплярного DB и его локальных переменных получаю какую то чушь: если SFC15 хотя бы RET VAL = 0, то SFC 14 выдает RET VAL = -31965 !?
И локальные переменные содержат какую то чушь.

Code: Select all

VAR_INPUT
  Address : WORD ;	//Profibus адрес устройства
  Parameter_number : WORD ;	//Номер параметра 0000-3900
  Index : WORD ;	//Индекс в параметре 0-255
END_VAR
VAR_OUTPUT
  Parameter_value : DWORD ;	//Принятое значение параметра
END_VAR
VAR_TEMP
  wr_pkw_word_1_Address : WORD ;	//Адрес:0-10 PNU адрес (0-7CF), 11=0, 12-15 AK = 0001 (чтение параметра). Запрос.
  wr_pkw_word_2_Index : WORD ;	//Индекс:0-6 спецефичные для СМ411,7-страница, 8-15 индекс в адресе. Запрос.
  wr_pkw_word_3_Hi : WORD ;	//Значение параметра Hi. Запрос.
  wr_pkw_word_4_Low : WORD ;	//Значение параметра Low. Запрос.
  pzd_word_1_cw_setpoint : WORD ;	//PZD1. Котрольное слово + значение частоты. Копия управление в режиме РРО3 
  pzd_word_2_sw_act_value : WORD ;	//PZD2. Слово сотояния + текущее значение частоты. Копия управление в режиме РРО3
  rd_pkw_word_1_Address1 : WORD ;	//Адрес:0-10 PNU адрес (0-7CF), 11=0, 12-15 AK = 0001 (чтение параметра). Чтение.
  rd_pkw_word_2_Index1 : WORD ;	//Индекс: 0-6 спецефичные для СМ411,7-страница, 8-15 индекс в адресе. Чтение.
  rd_pkw_word_3_Hi1 : WORD ;	//Значение параметра Hi. Чтение.
  rd_pkw_word_4_Low1 : WORD ;	//Значение параметра Low. Чтение.
  ret_val_1 : INT ;	
  ret_val_2 : INT ;	
  pkw_WAIT_1 : BOOL ;	//Бит ожидания окончания работы с PKW
END_VAR
BEGIN
NETWORK
TITLE =Формирование индекса и адреса запроса PKW

      L     #Index; 
      SLW   8; // сдвиг  влево на 8 битов
      T     #wr_pkw_word_2_Index; // сохранение индекса
      L     #Parameter_number; // номер параметра, диапазон 0-3900, в 16-ом виде!
      L     W#16#7D0; // для номеров больше 2000 надо отнять 2000 и установить бит номеров больше 2000
      >=I   ; 
      JCN   v199; // номер меньше 2000
      -I    ; // иначе вычитаем из номера 2000
      S     L      3.7; // устанавливаем бит номеров больше 2000
      JU    v200; // номер больше 2000
v199: L     #Parameter_number; 
v200: OW    W#16#1000; // установить флаг запроса
      T     #wr_pkw_word_1_Address; 
      L     0; 
      T     #wr_pkw_word_3_Hi; 
      T     #wr_pkw_word_4_Low; 
NETWORK
TITLE =Запрос PKW

      CALL "DPWR_DAT" (
           LADDR                    := #Address,
           RECORD                   := P#DIX 0.0 BYTE 8,
           RET_VAL                  := #ret_val_1);
      NOP   0; 
NETWORK
TITLE =

      A     #pkw_WAIT_1; 
      JC    rd1; 
      S     #pkw_WAIT_1; 
NETWORK
TITLE =Чтение PKW

rd1:  CALL "DPRD_DAT" (
           LADDR                    := #Address,
           RET_VAL                  := #ret_val_2,
           RECORD                   := P#DIX 12.0 BYTE 8);
      NOP   0; 
NETWORK
TITLE =Проверка полученого ответа на запрос
//Сравниваются адреса запроса и ответа на их совпадение.
      L     #rd_pkw_word_1_Address1; // чтение адреса ответа
      AW    W#16#FFF; // накладываем маску
      L     #wr_pkw_word_1_Address; // чтение адреса запроса
      AW    W#16#FFF; // накладываем маску
      ==I   ; // проверяем соответствие адресов запроса и ответа, иначе это ответ на другой запрос
      JCN   ex1; // ждём ответа на данный запрос
      R     #pkw_WAIT_1; // сброс флага ожидания ответа
ex1:  NOP   0; 
      L     #wr_pkw_word_1_Address; 
      L     #wr_pkw_word_2_Index; 
      L     #wr_pkw_word_3_Hi; 
      L     #wr_pkw_word_4_Low; 
      L     #pzd_word_1_cw_setpoint; 
      L     #pzd_word_2_sw_act_value; 
      L     #rd_pkw_word_1_Address1; 
      L     #rd_pkw_word_2_Index1; 
      L     #rd_pkw_word_3_Hi1; 
      L     #rd_pkw_word_4_Low1; 
      T     #Parameter_value; 
      L     #ret_val_2; 
END_FUNCTION_BLOCK
Подскажите, в чём может быть проблема?

sania
Site Admin
Posts: 1371
Joined: Sat Aug 13, 2005 6:15 am
Contact:

Post by sania » Mon Apr 10, 2006 7:57 am

ты используешь ТЕМР,пользуй в FB параметры STAT
в ТЕМРе при выходе из FB стираются все данные(ТЕМР не имеет адресов ДБ)!
а в STAT - сохраняются и используются при следующем заходе!
адреса неправильные,правильный смотри вверху в таблице в колонке ADDRESS

Guest

Post by Guest » Mon Apr 10, 2006 10:17 am

sania
ОГРОМНОЕ СПАСИБО! :D
Теперь всё работает! Признаю, ступил с темпами, а ведь знал, что они затираются.

AV

Re: Указатель на локальные данные FB (pointer to local data)

Post by AV » Tue Apr 11, 2006 5:47 am

Terand wrote:Внутри FB вызываю SFC15 для которой необходим параметр RECORD.
Если подставить что то типа P#DB30.DBX0.0 BYTE 8, то всё работает.
Но мне нужно сформировать такой же указатель на локальные (temp) расположеные внутри самой FB. Попытка подставить что то типа p##LW0.DBX0.0 BYTE 8 не проходит.
Возможна ли вообще такой указатель, и если да то как правильно его написать?
Под temp переменными находятся WORD к которым происходит обращение и формирование внутри FB
В принципе, можно использовать локальные данные при вызове другого блока. Для этого есть тип данных V. Конешно от p##VW0.DBX0.0 BYTE 8 симатика вытошнит, но можно создать локальную переменную типа ANY в которую ручками записать нужные цифры. Можно написать P#L 0.0 BYTE 8, но при вызове другого блока симатик втупую передаст этот указатель и другой блок будет искать эти данные в своем локальном стеке (вот не знаю как SFC, а FC и FB точно) и наверно не найдет. Поэтому указатель P#L 0.0 BYTE 8 можно использовать только внутри текущего блока, а если есть желание передать указатель в вызываемый блок, то его нужно формировать ручками т.к. P#V 0.0 BYTE 8 симатик не понимает.

Azazello
Posts: 2
Joined: Sat Oct 14, 2006 5:48 pm

Post by Azazello » Sat Oct 14, 2006 6:47 pm

Извените что врываюсь в ваш разговор.
Скажите почему вы пишете на STL? Какие приемущества? Допустим чем хуже SCL?

Если есть желание поболтаь то аска под рукой. (208700070)

bunglehead
Posts: 109
Joined: Thu Oct 19, 2006 7:00 am
Location: Russia

Post by bunglehead » Thu Oct 19, 2006 3:09 pm

В STL обеспечивается полный доступ ко всем ресурсам, формированию указателей и т.д.

А, например, релейная логика (имею ввиду булевы функции) гораздо лучше читается в FBD или LAD.

По мне, если не работать с массивами (без которых можно обойтись чаще всего), никаких преимуществ SCL не дает..Наиболее удобным считаю сочетание диаграмм и STL

Post Reply