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

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
Post Reply
a_gricaj
Posts: 193
Joined: Wed Mar 19, 2008 1:12 pm
Location: Ukraine

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

Post by a_gricaj » Thu Nov 28, 2019 10:59 am

Здравствуйте, помогите пж с таким вопросом
Например есть FB из InOut - "Par" и "Stat"(обе тип данных Структура но разные), как вытянуть из структуры Par байт и отправить его в Stat?
это нужно для экономии тегов в Скаде, и не тянуть тег "Par".
"Побитно" не нравится, так как код больше, да и время цикла...
СПС

Rex2701
Posts: 273
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

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

Post by Rex2701 » Thu Nov 28, 2019 8:43 pm

Code: Select all

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

Preliy
Posts: 1
Joined: Sat Nov 30, 2019 9:24 pm

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

Post by Preliy » Sat Nov 30, 2019 9:39 pm

Привет!

В 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)

a_gricaj
Posts: 193
Joined: Wed Mar 19, 2008 1:12 pm
Location: Ukraine

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

Post by a_gricaj » Mon Dec 02, 2019 9:59 am

Допустим структура 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
спс

Rex2701
Posts: 273
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

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

Post by Rex2701 » Mon Dec 02, 2019 3:43 pm

Code: Select all

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

a_gricaj
Posts: 193
Joined: Wed Mar 19, 2008 1:12 pm
Location: Ukraine

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

Post by a_gricaj » Tue Dec 03, 2019 6:43 am

СПС за ответ, но интересует SCL)

POV_PDA
Posts: 69
Joined: Mon Apr 26, 2010 7:02 pm
Location: Н.Новгород

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

Post by POV_PDA » Tue Dec 03, 2019 7:25 am

Если можно менять интерфейс блока - используйте "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

Rex2701
Posts: 273
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

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

Post by Rex2701 » Tue Dec 03, 2019 11:20 am

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;

a_gricaj
Posts: 193
Joined: Wed Mar 19, 2008 1:12 pm
Location: Ukraine

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

Post by a_gricaj » Wed Dec 04, 2019 10:18 am

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

Rex2701
Posts: 273
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

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

Post by Rex2701 » Wed Dec 04, 2019 11:41 am

Только так:

Code: Select all

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

a_gricaj
Posts: 193
Joined: Wed Mar 19, 2008 1:12 pm
Location: Ukraine

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

Post by a_gricaj » Wed Dec 04, 2019 11:47 am

а вне ФБ я буду иметь один вход или 8??

a_gricaj
Posts: 193
Joined: Wed Mar 19, 2008 1:12 pm
Location: Ukraine

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

Post by a_gricaj » Wed Dec 04, 2019 11:50 am

буду иметь один, а так чтобы 8 входов (тип bool) есть варианты?

Rex2701
Posts: 273
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

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

Post by Rex2701 » Wed Dec 04, 2019 12:31 pm

Тогда так:

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 которая будет собирать нужные биты в байт.

sania
Site Admin
Posts: 1204
Joined: Sat Aug 13, 2005 6:15 am

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

Post by sania » Wed Dec 04, 2019 1:01 pm

а почему не сделать отдельный фс ,в нём стл, а уж его вызывать в фб ?

Rex2701
Posts: 273
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

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

Post by Rex2701 » Wed Dec 04, 2019 1:12 pm

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


Post Reply