Вызов функционального блока с индексированным вызовом экземп

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
Post Reply
Balagur
Posts: 11
Joined: Sun Apr 11, 2010 10:26 pm

Вызов функционального блока с индексированным вызовом экземп

Post by Balagur » Mon Jul 02, 2012 3:37 am

Доброго времени суток!

Для написания программ нижнего уровня использую S7-SCL V5.3.5.1 из программного пакета Step7 V5.5.

Интересует вопрос: возможен ли вызов функционального блока с индексированным вызовом экземплярного блока данных, согласно задаче.

Например:
- есть функциональный блок FB1
- есть созданные для него экземплярные базы данных DB1-DB9
- в OB1 (не принципиально, можно использовать еще один функциональный блок с вызовом FB1 например, для хранения локальных переменных и т.д.) должны вызываться последовательно FB1.DB1 (); ... FB1.DB9 ();.

Так вот, возможно ли реализовать вызов функционального блока (по сути, идентичной программы для 9-ти разных объектов) с разными экземплярными блоками с использованием, например, оператора FOR? Например, так:

For i=1 to 9 do
FB1.DB [индекс_базы_данных] (параметры блока);
End_For;

Ясно, что написан пример неправильно.

bilbo_321
Posts: 88
Joined: Wed May 19, 2010 2:22 pm
Location: Bulgaria

Re: Вызов функционального блока с индексированным вызовом эк

Post by bilbo_321 » Mon Jul 02, 2012 10:18 am

Hi Balagur,

You can't call FB with index of instance DB as I know.
You can try to define UDT with structure of your DB and then create a DB with array of that UDT.
later in OB1 or FC you can call your FB in a cycle with I/O variable of the same UDT type.
See the code below.

Code: Select all

//=================== TYPE DECLARATION ========================
TYPE UDT1
    STRUCT
    // Sample UDT
    SAMPLE_INT1:INT;
    SAMPLE_INT2:INT;
    SAMPLE_INT3:INT;
    END_STRUCT
END_TYPE
//============================================================

//=================== DATA BLOCK FOR ALL 10 ITEMS ============
DATA_BLOCK DB1
//
// Block Comment ...
//
    STRUCT
       DEVICES:ARRAY[1 .. 10] OF UDT1;
    END_STRUCT
BEGIN

END_DATA_BLOCK
//============================================================

//=================== CONTROL FB =============================
FUNCTION_BLOCK FB1

VAR_IN_OUT
    // I/O Parameters
    DEVICE:UDT1;
END_VAR
    // Statement Section
    DEVICE.SAMPLE_INT2 := DEVICE.SAMPLE_INT1;
END_FUNCTION_BLOCK
//============================================================

//=================== OB1 ====================================
ORGANIZATION_BLOCK OB1

VAR_TEMP
    // Reserved
    info : ARRAY[0..19] OF BYTE;
    Index:INT;
    // Temporary Variables
END_VAR
    
    FOR Index:= 1 TO 10 DO
        // Statement Section
        FB1.DB10(DEVICE :=  DB1.DEVICES[Index]);
        ;
    END_FOR;  

END_ORGANIZATION_BLOCK
//============================================================

Actually you can use FC instead of FB. It is your choice.
Hope this is helpful.