Реализовал функцию на стороне контроллера:
Ввод времени в формате 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" значений. Может быть кому-нибудь пригодится.