Создание своей функции для преобразования REAL в S5TIME

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
Ber56
Posts: 20
Joined: Fri Feb 18, 2011 12:43 pm

Создание своей функции для преобразования REAL в S5TIME

Post by Ber56 »

Здравствуйте специалисты!
Недавно попробовал создать свою функцию для преобразования REAL в S5TIME, все проверил всё работает (вызывал функцию только в одном месте), однако при использовании функции в нескольких местах программы, начинается белиберда, как я понимаю вся проблема в локальных переменных, которые записываются из разных мест "одновременно", понял, что надо использовать FB вместо FC, однако для FB требуется генерировать блок данных DB (так-то проблем нет, но функцию собираюсь использовать часто - > DB'шек будем много, может возникнуть путаница). Вспомнил про функцию из библиотеки stlibs\iec\FC 40 "TIM_S5TI", эта функция работает нормально при любых обстоятельствах независимо от количества точек входа.
Отсюда вопрос, может я что-то неправильно делаю в своей FC?
Собсно сама функция
Show

Code: Select all

 L     #TIME_REAL
      L     9.990000e+000
      <=R   
      JC    T000
      L     #TIME_REAL
      L     9.990000e+001
      <=R   
      JC    T001
      L     #TIME_REAL
      L     9.990000e+002
      <=R   
      JC    T002
      L     #TIME_REAL
      L     9.990000e+002
      >R    
      JC    T003
T000: L     #TIME_REAL
      L     1.000000e+002
      *R    
      T     #BUFF_R
      RND   
      T     #BUFF_DI
      DTB   
      T     #BUFF_W
      L     #BUFF_W
      T     #S5T_OUT
      JU    TEND
T001: L     #TIME_REAL
      L     1.000000e+001
      *R    
      T     #BUFF_R
      RND   
      T     #BUFF_DI
      DTB   
      T     #BUFF_W
      L     #BUFF_W
      L     W#16#1000
      OW    
      T     #S5T_OUT
      JU    TEND
T002: L     #TIME_REAL
      L     1.000000e+000
      *R    
      T     #BUFF_R
      RND   
      T     #BUFF_DI
      DTB   
      T     #BUFF_W
      L     #BUFF_W
      L     W#16#2000
      OW    
      T     #S5T_OUT
      JU    TEND
T003: L     #TIME_REAL
      L     1.000000e-002
      *R    
      T     #BUFF_R
      RND   
      T     #BUFF_DI
      DTB   
      T     #BUFF_W
      L     #BUFF_W

      L     W#16#3000
      OW    
      T     #S5T_OUT
TEND: NOP   0
Ber56
Posts: 20
Joined: Fri Feb 18, 2011 12:43 pm

Re: Создание своей функции для преобразования REAL в S5TIME

Post by Ber56 »

Проблема решена, путем исключения всех локальных переменных из функции:
Обновленная функция
Show

Code: Select all

   L     #TIME_REAL
      L     9.990000e+000
      <=R   
      JC    T000
      L     #TIME_REAL
      L     9.990000e+001
      <=R   
      JC    T001
      L     #TIME_REAL
      L     9.990000e+002
      <=R   
      JC    T002
      L     #TIME_REAL
      L     9.990000e+002
      >R    
      JC    T003
T000: L     #TIME_REAL
      L     1.000000e+002
      *R    
      RND   
      DTB   
      JU    TEND
T001: L     #TIME_REAL
      L     1.000000e+001
      *R    
      RND   
      DTB   
      L     W#16#1000
      OW    
      JU    TEND
T002: L     #TIME_REAL
      L     1.000000e+000
      *R    
      RND   
      DTB   
      L     W#16#2000
      OW    
      JU    TEND
T003: L     #TIME_REAL
      L     1.000000e-001
      *R    
      RND   
      DTB   
      L     W#16#3000
      OW    
      JU    TEND
TEND: T     #S5T_OUT
      NOP   0
Может кому-нибудь пригодится.
dyakov72
Posts: 56
Joined: Tue Feb 28, 2006 3:02 pm
Location: Russia

Re: Создание своей функции для преобразования REAL в S5TIME

Post by dyakov72 »

FUNCTION Real_to_s5time
Show

Code: Select all

FUNCTION "Real_to_s5time" : VOID
TITLE =
VERSION : 0.1


VAR_INPUT
  CasReal : REAL ;	
END_VAR
VAR_OUTPUT
  s5Cas : S5TIME ;	
END_VAR
VAR_TEMP
  r : REAL ;	
  d : DINT ;	
  t : TIME ;	
END_VAR
BEGIN
NETWORK
TITLE =

      A(    ; 
      L     #CasReal; 
      L     1.000000e+003; 
      *R    ; 
      T     #r; 
      AN    OV; 
      SAVE  ; 
      CLR   ; 
      A     BR; 
      )     ; 
      JNB   _001; 
      L     #r; 
      RND   ; 
      T     #d; 
_001: NOP   0; 
NETWORK
TITLE =

      A(    ; 
      L     #d; 
      T     #t; 
      SET   ; 
      SAVE  ; 
      CLR   ; 
      A     BR; 
      )     ; 
      JNB   _002; 
      CALL "TIM_S5TI" (
           IN                       := #t,
           RET_VAL                  := #s5Cas);
_002: NOP   0; 
END_FUNCTION
Oll Bell
Posts: 118
Joined: Sun Apr 17, 2011 9:49 pm

Re: Создание своей функции для преобразования REAL в S5TIME

Post by Oll Bell »

спрашиваю здесь, что бы тему не открывать, речь о S5T формате.
Необходимо время в секундах через HMI панель в контроллер задавать, изменят.

Имеется ли возможность обычную переменну формата S5T в HMI панели изменять
или изменяем в панели INTEGER и затем конвертируем для использования в программе в ST5?
У меня нет панели под рукой, опять же панель comfort 1500 в TIA Portal программируется, а
контроллер в классическом Step 7.
В TIA же другой формат TIME, чем в STEP7.
Dfcz
Posts: 878
Joined: Tue Dec 26, 2006 5:21 am
Location: Russia

Re: Создание своей функции для преобразования REAL в S5TIME

Post by Dfcz »

В панелях Сименса обычно можно прямо менять значение времени.
Но я часто использую изменения секунд в панели и передачи их в проц. где "преобразование" происходит прямо в DB.
TIME он и в африкe TIME...
Oll Bell
Posts: 118
Joined: Sun Apr 17, 2011 9:49 pm

Re: Создание своей функции для преобразования REAL в S5TIME

Post by Oll Bell »

мне так же не лежит душа в панели обработку переменных делать,
все в контроллере обрабатывается.
а вот пока со временем задаваемым с панели для контроллера 300 го не получается до ума довести.
преобразовать. программа для контроллера в step7-
хотелось бы в INT задать с панели, например, 5 сек и в контроллере получить S5T#

сейчас делаю так с Real
в TIA WinCC в панели задаю REAL через поле, отображение без запятой
передается в контроллер,
в контроллере умножается на 1000
затем в ROUND
MOVE в TIME
какая то ерунда получается, но поговаривают, что сей способ работает во Flex.
Dfcz
Posts: 878
Joined: Tue Dec 26, 2006 5:21 am
Location: Russia

Re: Создание своей функции для преобразования REAL в S5TIME

Post by Dfcz »

В панели создаешь поле ввода типа таймер. Связываешь его с адресом в DB-ке тоже типа таймер.
Вводишь секунды. В проце получаешь время S5T. Все.