SFB4

Инженерное программное обеспечение
Ответить
vkurnosov
Профан
Сообщения: 3
Зарегистрирован: 04 мар 2018, 16:42

SFB4

Сообщение vkurnosov »

Коллеги, а помогите разобраться в использовании SFB4.
Задаяча такая: нужно контролировать различное время: открытие закрытие клапанов с выдачей ошибки и окончание времени различных технологических шагов.
Клапан это пользовательский тип:
Valve
simulation bool Симуляция
alarm bool Ошибка
manual bool Ручное управление
lock bool Блокировка
man_open bool Ручное открытие
aut_open bool Автоматическое открытие
input_open bool Обратный сигнал открытия
input_close bool Обратный сигнал закрытия
open bool Открытие
open_time time Время ожидания обратного сигнала открытия
close_time time Время ожидания обратного сигнала закрытия
Клапана прописаны в DB2. Например SV31.
Я хочу вызывать, например функциональный блок FB201, в который передать как параметр IN_OUT клапан SV31.
Блок должен обрадотать сигналы ручного и автоматического отрытия и сформировать аварийный сигнал, если клапан не открылся/закрылся за опредленное время:

Код: Выделить всё

FUNCTION_BLOCK FB 201
TITLE =
VERSION : 0.1


VAR_IN_OUT
  Valve : "Valve";	
END_VAR
VAR
  TON_ON : "TON";	
  TON_OFF : "TON";	
END_VAR
BEGIN
NETWORK
TITLE =

      AN    #Valve.lock; 
      A(    ; 
      AN    #Valve.manual; 
      A     #Valve.aut_open; 
      O     ; 
      A     #Valve.manual; 
      A     #Valve.man_open; 
      )     ; 
      =     #Valve.open; 
NETWORK
TITLE =

      A     #Valve.open; 
      AN    #Valve.input_open; 
 [color=#FF0000][i] call sfb4, #TON_ON[/i][/color]

END_FUNCTION_BLOCK
но вызвать SFB 4 с параметром #TON_ON не могу. Правда к FB201 никакую FB не прикреплял.

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Программирование на Step7

Сообщение Автоматизатор »

я таймеры делаю в статической памяти - в интерфейсе fb надо выбрать тип данных sfb4.

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: SFB4

Сообщение Автоматизатор »

вызов должен быть

Код: Выделить всё

call #TON_ON
без дополнительных указаний на блок данных

vkurnosov
Профан
Сообщения: 3
Зарегистрирован: 04 мар 2018, 16:42

Re: SFB4

Сообщение vkurnosov »

Да с этим разобрался, но при повторном вызове FB идет перезапись времени.
Вобщем сейчас к примеру имеем два клапана SV31 и SV33. На SV33 не пердусмотрен датчик закрытия и его мы обманываем:
AN "Input_Output".SV33.open
= "Input_Output".SV33.input_close
Для обработки клапанов вызываем кусок кода:
CALL "FB_CM_Valve" , "DB_CM_Valve"
Valve:="Input_Output".SV31
A "Input_Output".SV31.open
= "SV31" // вывод на физический выход

AN "Input_Output".SV33.open
= "Input_Output".SV33.input_close
CALL "FB_CM_Valve" , "DB_CM_Valve"
Valve:="Input_Output".SV33
A "Input_Output".SV33.open
= "SV33"// вывод на физический выход

Код FB_CM_Valve:
FUNCTION_BLOCK "FB_CM_Valve"
TITLE =
VERSION : 0.1


VAR_IN_OUT
Valve : "Valve";
END_VAR
VAR
TON_OFF : "TON";
TON_ON : "TON";
END_VAR
BEGIN
NETWORK
TITLE =

AN #Valve.lock;
A( ;
AN #Valve.manual;
A #Valve.aut_open;
O ;
A #Valve.manual;
A #Valve.man_open;
) ;
= #Valve.open;
NETWORK
TITLE =controt open



A #Valve.open;
AN #Valve.input_open;
= L 0.0;
BLD 103;
CALL #TON_ON (
IN := L 0.0,
PT := #Valve.open_time,
Q := #Valve.alarm);

NOP 0;
NETWORK
TITLE =controt open

AN #Valve.open;
AN #Valve.input_close;
= L 0.0;
BLD 103;
CALL #TON_OFF (
IN := L 0.0,
PT := #Valve.open_time,
Q := #Valve.alarm);

NOP 0;
END_FUNCTION_BLOCK

Во-первых, #TON_OFF переписывает #Valve.alarm от #TON_ON, но это я решу, разделив #Valve.alarm_open и #Valve.alarm_close, а далее или #Valve.alarm_open или #Valve.alarm_close = #Valve.alarm.

Но главная проблема, что у клапана SV31 нет обратного сигинала на закрытие. И если я при обработке следующего клапана SV33 не вызываю FB_CM_Valve, то вижу "Input_Output".SV31.alarm "1", т.к. клапан закрыт, а сигнала от закрытия нет. А если вызываю повторно FB_CM_Valve, то таймера переписываются и у SV31 пропадает аварийный сигнал. Как это корректно организовать?

Потом понадобятся таймера и для отслеживания времени того или ионого шага.

Аватара пользователя
mr_Frodo
Профессионал
Сообщения: 588
Зарегистрирован: 22 июл 2016, 20:38

Re: SFB4

Сообщение mr_Frodo »

Так у вас в переменных всего их два. Естественно вызывая один и тот же повторно он сломается... Сделайте их столько, сколько надо с таким как надо параметрами и используйте в разных местах. Этого никто не запрещал.
Вот моя подпись...

aranea
Дилетант
Сообщения: 11
Зарегистрирован: 23 дек 2014, 12:48
Контактная информация:

Re: SFB4

Сообщение aranea »

сделайте один нормальный FB управления клапаном и вызывайте его с новыми DB для каждого клапана, передавая IO переменные
не нужно мучиться с одной_глобальной_ДБ_со_всеми_переменными и одним FB для их обработки
в итоге у каждого клапана свои данные (вход, выход, уставки, таймеры, диагностика и т.п.) в своей DB - тяните ее на верхний уровень

пс. откуда у вас такой подход к построению программы появился?

vkurnosov
Профан
Сообщения: 3
Зарегистрирован: 04 мар 2018, 16:42

Re: SFB4

Сообщение vkurnosov »

подход из программирования RSLOgix AB. Там таймер можно запихнуть в переменную пользовательского типа, а эту переменную отдавать на обработку в подпрограмму. И работает очень классно! В сименсе, как я вижу либо использовать стандартные таймера, которых мало, либо еще что-то типа своего таймера и приплюсовывать к нему каждый раз время цикла программы от этой точки до этой точки (но пока не знаю, где взять это время), либо SFB4, но тогда нужно создать что-то типа таймерной FB_TIME (FB400) с DB_TIME(DB400), в которой будет крутиться n_таймеров, на их запуск будет в каком-то месте формироваться условия в DB_time _Param (DB410). тогда ко будет выглядеть так

FC111 //в ней и других будут формироваться таймерные условия
network 1:

A "Input_Output".SV31.open
AN "Input_Output".SV31.input_open
L "Предустановленное время"
T "DB_time_Param".timer1.PRE //предустановленное время
= "DB_time_Param".timer1.TT //

A "DB_time_Param".timer1.DN
S "Input_Output".SV31.alarm_open

Код FB_TIME:
FUNCTION_BLOCK "FB_TIME"
TITLE =
VERSION : 0.1

VAR
TIMER_1 : "TON";
TIMER_2 : "TON";
TIMER_N : "TON";
END_VAR
BEGIN
NETWORK
TITLE =


CALL #TIMER_1 (
IN := "DB_time_Param".timer1.TT,
PT := "DB_time_Param".timer1.PRE,
Q := "DB_time_Param".timer1.DN);

CALL #TIMER_2 (
IN := "DB_time_Param".timer2.TT,
PT := "DB_time_Param".timer2.PRE,
Q := "DB_time_Param".timer2.DN);

CALL #TIMER_N (
IN := "DB_time_Param".timerN.TT,
PT := "DB_time_Param".timerN.PRE,
Q := "DB_time_Param".timerN.DN);

NOP 0;
END_FUNCTION_BLOCK


Так пойдет, КОЛЛЕГИ? Или как то еще проще есть?

aranea
Дилетант
Сообщения: 11
Зарегистрирован: 23 дек 2014, 12:48
Контактная информация:

Re: SFB4

Сообщение aranea »

многие системы позволяют что-то куда-то запихнуть - не стоит воспринимать это как призыв к действию =)

позвольте пару вопросов:
1. как данные клапанов (входы) попадают в структуры в DB2?
2. как попадают данные на дискр. выходы?
3. какой верхний уровень используется у вас?

имхо, ПРОЩЕ, иметь свою DB на каждый клапан, чем свои таймеры в ДБ таймеров, свои входы в ДБ входов, свои условия в ДБ условий.. не забывайте про ДБ сообщений, ДБ уставок, ДБ выходов? и ДБ команд?

Ответить