plcforum.uz.ua

International PLC Forum
It is currently Mon Sep 24, 2018 3:12 am

All times are UTC + 3 hours


Forum rules


Please click here to view the forum rules



Post new topic Reply to topic  [ 10 posts ] 
Author Message
PostPosted: Wed Apr 05, 2006 8:48 am 

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


Top
 Profile  
 
 Post subject:
PostPosted: Wed Apr 05, 2006 9:13 am 
Site Admin

Joined: Sat Aug 13, 2005 9:15 am
Posts: 1122
ПРИМЕРНО ТАК
Code:
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);


Top
 Profile  
 
 Post subject:
PostPosted: Wed Apr 05, 2006 9:20 am 
Site Admin

Joined: Sat Aug 13, 2005 9:15 am
Posts: 1122
Quote:
Попытка подставить что то типа p##LW0.DBX0.0 BYTE 8 не проходит.

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


Top
 Profile  
 
 Post subject:
PostPosted: Wed Apr 05, 2006 9:33 am 

Joined: Wed Feb 15, 2006 11:15 am
Posts: 6
Location: Russia
Огромное СПАСИБО!
Вроде получается.


Top
 Profile  
 
 Post subject:
PostPosted: Mon Apr 10, 2006 9:54 am 

Joined: Wed Feb 15, 2006 11:15 am
Posts: 6
Location: Russia
К сожалению радость оказалась преждевременной :(
Синтаксис действительно понимает, но данные в temp переменных не правильные какие то.
Для проверки использую точно такую же FB, но с прямым указанием DB.
А с использованием экземплярного DB и его локальных переменных получаю какую то чушь: если SFC15 хотя бы RET VAL = 0, то SFC 14 выдает RET VAL = -31965 !?
И локальные переменные содержат какую то чушь.
Code:
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

Подскажите, в чём может быть проблема?


Top
 Profile  
 
 Post subject:
PostPosted: Mon Apr 10, 2006 10:57 am 
Site Admin

Joined: Sat Aug 13, 2005 9:15 am
Posts: 1122
ты используешь ТЕМР,пользуй в FB параметры STAT
в ТЕМРе при выходе из FB стираются все данные(ТЕМР не имеет адресов ДБ)!
а в STAT - сохраняются и используются при следующем заходе!
адреса неправильные,правильный смотри вверху в таблице в колонке ADDRESS


Top
 Profile  
 
 Post subject:
PostPosted: Mon Apr 10, 2006 1:17 pm 
sania
ОГРОМНОЕ СПАСИБО! :D
Теперь всё работает! Признаю, ступил с темпами, а ведь знал, что они затираются.


Top
  
 
PostPosted: Tue Apr 11, 2006 8: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 симатик не понимает.


Top
  
 
 Post subject:
PostPosted: Sat Oct 14, 2006 9:47 pm 

Joined: Sat Oct 14, 2006 8:48 pm
Posts: 2
Извените что врываюсь в ваш разговор.
Скажите почему вы пишете на STL? Какие приемущества? Допустим чем хуже SCL?

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


Top
 Profile  
 
 Post subject:
PostPosted: Thu Oct 19, 2006 6:09 pm 

Joined: Thu Oct 19, 2006 10:00 am
Posts: 109
Location: Russia
В STL обеспечивается полный доступ ко всем ресурсам, формированию указателей и т.д.

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

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


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 10 posts ] 

All times are UTC + 3 hours


Who is online

Users browsing this forum: No registered users and 10 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
Jump to:  
Powered by International PLCforum® Forum Software © PLCforum
Mobile version