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
| |
|
Всего комментариев: 0 | |