Страница 1 из 1

EB Pro и S5TIME

СообщениеДобавлено: 13 май 2014, 08:09
Uncle Fedor
Доброго всем времени суток.
Возник вопрос, как без преобразования данных на стороне ПЛК, отображать данные типа S5TIME на панели.
Пробовал использовать форматы 16 bit BCD и 32 bit BCD, всё замечательно если изменяемое время < 9.99 сек, однако если время более 10.00 сек начинаются проблемы. Поставив 10.00 сек на панели, в ПЛК получаем S5time 0 ms, а устанвовив в ПЛК S5time 1 m в панели получаем 16,00.
Понимаю, что можно преобразовать в ПЛК S5TIME - > BCD потом BCD - > S5TME на панели использовать чтение/запись с разных адресов, но как-то слишком заковыристо получается, если кто сталкивался с данной проблемой, может быть есть простое решение?

Re: EB Pro и S5TIME

СообщениеДобавлено: 14 май 2014, 09:45
den_po
Преобразование данных в любом случае нужно, либо на стороне ПЛК, либо на стороне панели.
Регистр в этом формате кроме времени содержит информацию о диапазоне (множитель). Для значения больше 9.99с этот множитель - ненулевой.
Описание формата http://support.automation.siemens.com/W ... aller=view

Re: EB Pro и S5TIME

СообщениеДобавлено: 19 май 2014, 08:08
Uncle Fedor
А каким образом делать преобразование на стороне панели?
Я только начинаю разбираться с EBpro, еще много белых пятен, если не сложно дайте пример.
Заранее благодарен.

Re: EB Pro и S5TIME

СообщениеДобавлено: 19 май 2014, 12:28
den_po
Макросами. Примерно так

Миллисекунды в S5TIME:
Код: Выделить всё
//исходное значение: LW0 32бита беззнаковое целое
//результат: LW2 16бит S5TIME (в случае успеха)
macro_command main()

unsigned int timems
GetData(timems, "Local HMI", LW, 0, 1)
timems = timems/10

unsigned int base = 0

while timems>999
   timems = timems / 10
   base = base + 1
wend

if base > 3 then
   //ошибка! число не в диапазоне
else
   unsigned short s5time
   BIN2BCD(timems, s5time)
   s5time = s5time + (base<<12)
   
   //сохраняем результат
   SetData(timems, "Local HMI", LW, 2, 1)
   
end if

end macro_command


S5TIME в миллисекунды
Код: Выделить всё
//исходное значение: LW2 16бит S5TIME
//результат: LW0 32бита беззнаковое целое
macro_command main()

unsigned short s5time
GetData(s5time, "Local HMI", LW, 0, 1)

unsigned int timems
int base
base = (s5time >> 12) & 3
s5time = s5time & 0xFFF
BCD2BIN(s5time, timems)
while base>=0
   timems = timems * 10
   base = base - 1
wend

end macro_command

Re: EB Pro и S5TIME

СообщениеДобавлено: 19 май 2014, 13:03
Uncle Fedor
Огромное спасибо буду пробовать.

Re: EB Pro и S5TIME

СообщениеДобавлено: 27 апр 2015, 09:59
Uncle Fedor
Реализовал функцию на стороне контроллера:
Ввод времени в формате REAL (он же Floating point), также вывод времени в REAL.
Кто с S-300/400 работал знают, что ввод происходит в S5TIME, а вывод может происходить в INT, либо в S5TIME, второй вариант мне удобней т.к есть идентификатор разрешения таймера.
Код: Выделить всё
FUNCTION FC 2 : VOID
TITLE =
VERSION : 0.1


VAR_INPUT
  TIME_REAL : REAL ;   
  S5T_INP : S5TIME ;   
END_VAR
VAR_OUTPUT
  S5T_OUT : S5TIME ;   
  REAL_OUT : REAL ;   
END_VAR
BEGIN
NETWORK
TITLE =

// Определение пределов ввода времени
// от 0 мс до 9 сек 990 мс
      L     #TIME_REAL;
      L     9.990000e+000;
      <=R   ;
      JC    T000;
// от 9 сек 990 мс мс до 99 сек 900 мс
      L     #TIME_REAL;
      L     9.990000e+001;
      <=R   ;
      JC    T001;
// от 99 сек 900 мс до 999 сек
      L     #TIME_REAL;
      L     9.990000e+002;
      <=R   ;
      JC    T002;
// от 999 сек до 9990 сек
      L     #TIME_REAL;
      L     9.990000e+002;
      >R    ;
      JC    T003;
// Преобразование
// от 0 мс до 9 сек 990 мс [ПРЕОБРАЗОВАНИЯ НЕ ТРЕБУЮТСЯ]
T000: L     #TIME_REAL;
// Множитель для REAL числа
      L     1.000000e+002;
      *R    ;
      RND   ;
      DTB   ;
      JU    TEND;
// от 9 сек 990 мс мс до 99 сек 900 мс [ПРЕОБРАЗОВАНИЯ 1]
T001: L     #TIME_REAL;
// Множитель для REAL числа
      L     1.000000e+001;
      *R    ;
      RND   ;
      DTB   ;
      L     W#16#1000;
      OW    ;
      JU    TEND;
// от 99 сек 900 мс до 999 сек [ПРЕОБРАЗОВАНИЯ 2]
T002: L     #TIME_REAL;
      RND   ;
      DTB   ;
      L     W#16#2000;
      OW    ;
      JU    TEND;
// от 999 сек до 9990 сек [ПРЕОБРАЗОВАНИЯ 3]
T003: L     #TIME_REAL;
// Множитель для REAL числа
      L     1.000000e-001;
      *R    ;
      RND   ;
      DTB   ;
      L     W#16#3000;
      OW    ;
      JU    TEND;
TEND: T     #S5T_OUT;
      NOP   0;

NETWORK
TITLE =

// Определение пределов вывода времени
// от 0 мс до 9 сек 990 мс
      L     #S5T_INP;
      L     2457;
      <=I   ;
      JC    D000;
// от 9 сек 990 мс мс до 99 сек 900 мс
      L     #S5T_INP;
      L     6553;
      <=I   ;
      JC    D001;
// от 99 сек 900 мс до 999 сек
      L     #S5T_INP;
      L     10649;
      <=I   ;
      JC    D002;
// от 999 сек до 9990 сек
      L     #S5T_INP;
      L     10649;
      >I    ;
      JC    D003;
// Обратное преобразование
// от 0 мс до 9 сек 990 мс [ПРЕОБРАЗОВАНИЯ НЕ ТРЕБУЮТСЯ]
D000: L     #S5T_INP;
      BTD   ;
      DTR   ;
// Множитель для REAL числа
      L     1.000000e-002;
      *R    ;
      JU    DEND;
D001: L     #S5T_INP;
      L     W#16#1000;
      XOW   ;
      BTD   ;
      DTR   ;
// Множитель для REAL числа
      L     1.000000e-001;
      *R    ;
      JU    DEND;
D002: L     #S5T_INP;
      L     W#16#2000;
      XOW   ;
      BTD   ;
      DTR   ;
      JU    DEND;
D003: L     #S5T_INP;
      L     W#16#3000;
      XOW   ;
      BTD   ;
      DTR   ;
// Множитель для REAL числа
      L     1.000000e+001;
      *R    ;
      JU    DEND;
DEND: T     #REAL_OUT;
      NOP   0;


END_FUNCTION

Функция призвана путем сравнения, автоматически подставлять множитель для "S5TIME" значений. Может быть кому-нибудь пригодится.

Re: EB Pro и S5TIME

СообщениеДобавлено: 01 июн 2015, 11:40
den_po
Кстати, в последних версиях для S7-1200 добавлены типы: S5TIME_10Ms, S5TIME_100Ms, S5TIME_1S, S5TIME_10S.