Page 1 of 1

Подскажите как в SCL из структуры получить байт и запихнуть в другую структуру

Posted: Thu Nov 28, 2019 10:59 am
by a_gricaj
Здравствуйте, помогите пж с таким вопросом
Например есть FB из InOut - "Par" и "Stat"(обе тип данных Структура но разные), как вытянуть из структуры Par байт и отправить его в Stat?
это нужно для экономии тегов в Скаде, и не тянуть тег "Par".
"Побитно" не нравится, так как код больше, да и время цикла...
СПС

Re: Подскажите как в SCL из структуры получить байт и запихнуть в другую структуру

Posted: Thu Nov 28, 2019 8:43 pm
by Rex2701

Code: Select all

L B "Par".ByteTag
T B "Stat".ByteTag
:?: Или что?
Распиши полностью обе структуры, и что куда надо перекинуть.

Re: Подскажите как в SCL из структуры получить байт и запихнуть в другую структуру

Posted: Sat Nov 30, 2019 9:39 pm
by Preliy
Привет!

В TwinCat и Codesys использовал функцию MEMCPY для подобных задач.
[https://infosys.beckhoff.com/index.php? ... py.htm&id=]

B Siemens SCL использовал MOVE_BLK.
[https://support.industry.siemens.com/cs ... 0&lc=en-WW]

(pgood)

Re: Подскажите как в SCL из структуры получить байт и запихнуть в другую структуру

Posted: Mon Dec 02, 2019 9:59 am
by a_gricaj
Допустим структура Par:

Code: Select all

Bool0
Bool1
Bool2
Bool3
Bool4
Bool5
Bool6
Bool7
Bool8
Bool9
Bool10
Bool11
Bool12
Bool13
Bool14
Bool15
Int1
Int2
Dint1
Stat:

Code: Select all

Bool0
Bool1
Bool2
Bool3
Bool4
Bool5
Bool6
Bool7
Bool8
Bool9
Bool10
Bool11
Bool12
Bool13
Bool14
Bool15
Bool16
Bool17
Bool18
Bool19
Bool20
Bool21
Bool22
Bool23
Bool24
Bool25
Bool26
Bool27
Bool28
Bool29
Bool30
Bool31
Int1
Нужно первый байт PAR перекинуть в первый байт Stat
спс

Re: Подскажите как в SCL из структуры получить байт и запихнуть в другую структуру

Posted: Mon Dec 02, 2019 3:43 pm
by Rex2701

Code: Select all

L      P#"Par"
LAR1
L      P#"Stat"
LAR2
L      LB [AR1,P#0.0]
T      LB [AR2,P#0.0]
Кажется, как-то так... Давно не писал в STL. В первой и третьей строке кавычки, возможно, не нужны.

Re: Подскажите как в SCL из структуры получить байт и запихнуть в другую структуру

Posted: Tue Dec 03, 2019 6:43 am
by a_gricaj
СПС за ответ, но интересует SCL)

Re: Подскажите как в SCL из структуры получить байт и запихнуть в другую структуру

Posted: Tue Dec 03, 2019 7:25 am
by POV_PDA
Если можно менять интерфейс блока - используйте "AT"

To be able to access a declared variable with a different data type, you can define views of the variable or of ranges within the variables using the "AT" keyword. A view is visible only locally in the block; it is not included in the interface. A view can be used like any other variable in the block. It inherits all the properties of the variable that it references; only the data type is new.

VAR_INPUT
Buffer : ARRAY[0..255] OF BYTE;
Frame1 AT Buffer : UDT100 ;
Frame2 AT Buffer : UDT200 ;
END_VAR

Re: Подскажите как в SCL из структуры получить байт и запихнуть в другую структуру

Posted: Tue Dec 03, 2019 11:20 am
by Rex2701
a_gricaj wrote:
Tue Dec 03, 2019 6:43 am
СПС за ответ, но интересует SCL)
В SCL можно прямо использовать STL инструкции.
А по чистому SCL вам уже ответили выше. Хотя достаточно после описания каждой структуры добавить:
bPar AT Par.Bool0 : BYTE;
...
bStat AT Stat.Bool0 : BYTE;
ну а потом просто
bStat := bPar;

Re: Подскажите как в SCL из структуры получить байт и запихнуть в другую структуру

Posted: Wed Dec 04, 2019 10:18 am
by a_gricaj
Работает, спс
А еще такой вопрос, допустим FB имеет Input:
Bool0 Bool
Bool1 Bool
Bool2 Bool
Bool3 Bool
Bool4 Bool
Bool5 Bool
Bool6 Bool
Bool7 Bool
можно ли их запихнуть в байт одним "махом"?
не могу понять как наложить область с нужного бита

Re: Подскажите как в SCL из структуры получить байт и запихнуть в другую структуру

Posted: Wed Dec 04, 2019 11:41 am
by Rex2701
Только так:

Code: Select all

VAR_INPUT
    BoolVars : ARRAY[0 .. 7] OF BOOL;
    BoolsByte AT BoolVars : BYTE;
END_VAR

Re: Подскажите как в SCL из структуры получить байт и запихнуть в другую структуру

Posted: Wed Dec 04, 2019 11:47 am
by a_gricaj
а вне ФБ я буду иметь один вход или 8??

Re: Подскажите как в SCL из структуры получить байт и запихнуть в другую структуру

Posted: Wed Dec 04, 2019 11:50 am
by a_gricaj
буду иметь один, а так чтобы 8 входов (тип bool) есть варианты?

Re: Подскажите как в SCL из структуры получить байт и запихнуть в другую структуру

Posted: Wed Dec 04, 2019 12:31 pm
by Rex2701
Тогда так:

Code: Select all

FUNCTION_BLOCK FB666

VAR_INPUT
    Bools : STRUCT
        b0 : BOOL;
        b1 : BOOL;
        b2 : BOOL;
        b3 : BOOL;
        b4 : BOOL;
        b5 : BOOL;
        b6 : BOOL;
        b7 : BOOL;
    END_STRUCT;
    BoolsByte AT Bools : BYTE;
END_VAR

VAR_OUTPUT

    MyByte : BYTE;

END_VAR

BEGIN

    MyByte := BoolsByte;

END_FUNCTION_BLOCK


Биты будут поодиночке, но скорее всего их тоже просто так не привяжешь.
Проще сделать вход байтовый, и написать FC которая будет собирать нужные биты в байт.

Re: Подскажите как в SCL из структуры получить байт и запихнуть в другую структуру

Posted: Wed Dec 04, 2019 1:01 pm
by sania
а почему не сделать отдельный фс ,в нём стл, а уж его вызывать в фб ?

Re: Подскажите как в SCL из структуры получить байт и запихнуть в другую структуру

Posted: Wed Dec 04, 2019 1:12 pm
by Rex2701
STL можно написать прямо в SCL.
Маппинг 8 бит в один байт выполняется всего двумя командами (если биты идут с начала в IN):
L DIB [AR2,P#0.0]
T #SomeByte
Но SCL-компилятор не умеет / не хочет мапить биты в один байт, и приходится извращаться.

Re: Подскажите как в SCL из структуры получить байт и запихнуть в другую структуру

Posted: Wed Dec 04, 2019 2:04 pm
by a_gricaj
СПС