PLC, HMI, SCADA, INVERTERS, TUTORIALS, INDUSTRIAL AUTOMATION

10:49
SIEMENS STEP7 SCL пример 3 Вычисление расстояния (c) гипотенузы по 2 катетам

Вычисление расстояния гипотенузы по 2 катетам (корень из суммы квадратов длин катетов)

//- DB1 контейнер для a и b ----------------------------------------

DATA_BLOCK DB1

  STRUCT

    buffer_a : ARRAY[1..10] OF INT := 10(0);        // несортированное a

    buffer_b : ARRAY[1..10] OF INT := 10(0);        // несортированное b

  END_STRUCT

BEGIN

END_DATA_BLOCK

//- FC61 вычисление длины -------------------------------------------------

FUNCTION FC61 : VOID

AUTHOR  : HF

NAME    : Abstand

FAMILY  : Training

// KNOW_HOW_PROTECT

VAR_TEMP

    values: STRUCT                   // временная структура для значений

               val_a : ARRAY[1..10] OF INT;

               val_b : ARRAY[1..10] OF INT;

               val_c : ARRAY[1..10] OF REAL;

            END_STRUCT;

    index : INT;  

END_VAR

BEGIN

    values.val_a := DB1.buffer_a;    // взять а из DB

    values.val_b := DB1.buffer_b;    // взять b из DB

    index := 1;                      // инициализация индекса

           WHILE index <= 10 DO             // вычисление длины

        values.val_c[index]:= SQRT(SQR(values.val_a[index]) +

                              SQR(values.val_b[index]));

        index:=index +1;

    END_WHILE;

END_FUNCTION

//- FB2 сохранение значений в буфере (DB1 ) -------------------------------------

FUNCTION_BLOCK FB2                   // Случ. знач. a помещается в DB1.buffer_a

                                     // Случ. знач. b помещается в DB1.buffer_b

CONST

    BUFLENGTH  := 10;                // длина буфера

END_CONST

VAR_INPUT

    NewValue  : INT;                 // случ. значение

END_VAR

VAR_IN_OUT

    BUF_DB    : ANY;                 // номер DB и область для значений

END_VAR

VAR_OUTPUT

    READY   : BOOL:=FALSE;           // все значения сохранены

END_VAR

VAR

    index  : INT := 1;               // cчетчик № сохраненных значений

    field  : ARRAY[1..10] OF INT;

    ret    : INT;                    // RET_VAL для SFC20

END_VAR

BEGIN

  IF index > BUFLENGTH THEN          // очистка буфера на старте

        index := 1;

        READY := FALSE;

    END_IF;

    field[index]:= NewValue;         // сохранение значения

    IF index = BUFLENGTH THEN        // буфер полон

        ret   := SFC20(SRCBLK:=field,DSTBLK:=BUF_DB); //сохранение значений в DB

        READY := TRUE;               // все значения сохранены

    END_IF;

    index := index +1;

 END_FUNCTION_BLOCK

//- FC60 генератор случайных чисел ---------------------------------------------

FUNCTION FC60 : INT;

CONST

    m:=101;                          // случ. число от 0 to 100

END_CONST

VAR_INPUT

    RAND:INT;                        // инициализация

END_VAR

BEGIN                                // вычисление случ. числа

    FC60 := (ABS(RAND*DINT_TO_INT(TIME_TO_DINT(SFC64())))) MOD m;

END_FUNCTION

//- OB 35 ---------------------------------------------------------------------

ORGANIZATION_BLOCK OB35                                

VAR_TEMP

    info  : ARRAY[0..19] OF BYTE;

    random: INT;

END_VAR

BEGIN

    random := FC60(RAND:=711);                        //создание случ. числа a

    FB2.DB11(NewValue:=random,BUF_DB:=DB1.buffer_a);  //сохранение случ. числа

    random := FC60(RAND:=13);                         // создание случ. числа b

    FB2.DB12(NewValue:=random,BUF_DB:=DB1.buffer_b);  // сохранение случ. числа

    IF DB12.READY = TRUE THEN                         //если буфер полон,

        FC61();                                       //вычислить расстояние

    END_IF;

END_ORGANIZATION_BLOCK


SCL_Loe3.doc


 

Категория: SIEMENS | Просмотров: 26 | Добавил: gt7600 | Теги: SCL, Step7, siemens | Рейтинг: 0.0/0
Всего комментариев: 0
avatar