PDA

Просмотр полной версии : Возможно ли значение STRUCT присвоить WORDу?



a_gricaj
11.09.2018, 10:40
Здравствуйте, подскажите пж такой вопрос:

Есть переменная test(word) и структура TestStruct(CUctrl) состоящая из 16 битов:
TYPE CUctrl :
STRUCT
Spare0:BOOL;;
Spare1:BOOL;
Spare2:BOOL;
Spare3:BOOL;
Spare4:BOOL;
Spare5:BOOL;
Spare6:BOOL;
Spare7:BOOL;
Spare8:BOOL;
Spare9:BOOL;
Spare10:BOOL;
Spare11:BOOL;
Spare12:BOOL;
Spare13:BOOL;
Spare14:BOOL;
Spare15:BOOL;
END_STRUCT
END_TYPE
то есть размер структуры равен Word, но тип данных естественно она имеет CUctrl (в случае этого примера).
на код такого вида естественно компилятор матюкается:
test:=TestStruct;
подскажите можно ли в СS "одним махом" присвоить значение структуры другой переменной
побитно не вариант, так как приходится делать больше операций, спс

capzap
11.09.2018, 10:43
в качестве аналога что_то_там_TO_во_что_то_там можно использовать ADR, но с битами это не получиться

a_gricaj
11.09.2018, 11:10
в качестве аналога что_то_там_TO_во_что_то_там можно использовать ADR, но с битами это не получиться

а какой у Вас тип данных переменных ptr и foo, подскажите пж ??

capzap
11.09.2018, 11:23
foo это WORD, ptr эту указатель на слово.
На скрине наглядно показано, что элемент BOOL в структуре занимает один байт, так что для Вас это не вариант, остается только побитное присвоение или на прямую писать були в слово через точку

a_gricaj
11.09.2018, 11:27
foo это WORD, ptr эту указатель на слово.
На скрине наглядно показано, что элемент BOOL в структуре занимает один байт, так что для Вас это не вариант, остается только побитное присвоение или на прямую писать були в слово через точку
да, точно байт((, очень благодарен за консультацию

lazy
14.09.2018, 10:47
вместо TYPE CUctrl : STRUCT не проще ли о обращаться сразу к битам test(word) через точку:

test.0 := TRUE;
TestStruct.Spare0 := TRUE;

можно константы объявить для удобства.
VAR CONSTANT
Spare0: BYTE := 0;
END_VAR (и даже глобальные VAR_GLOBAL CONSTANT)

test.Spare0 := TRUE;

Serhioromano
16.09.2018, 16:20
Написать свой CUctrl_TO_WORD


FUNCTION CUctrl_TO_WORD : WORD
VAR_INPUT
IN: CUctrl;
END_VAR
CUctrl_TO_WORD.0 := IN.Spare0;
CUctrl_TO_WORD.1 := IN.Spare1;
CUctrl_TO_WORD.2 := IN.Spare2;
CUctrl_TO_WORD.3 := IN.Spare3;
CUctrl_TO_WORD.4 := IN.Spare4;
CUctrl_TO_WORD.5 := IN.Spare5;
CUctrl_TO_WORD.6 := IN.Spare6;
CUctrl_TO_WORD.7 := IN.Spare7;
CUctrl_TO_WORD.8 := IN.Spare8;
CUctrl_TO_WORD.9 := IN.Spare9;
CUctrl_TO_WORD.10 := IN.Spare10;
CUctrl_TO_WORD.11 := IN.Spare11;
CUctrl_TO_WORD.12 := IN.Spare12;
CUctrl_TO_WORD.13 := IN.Spare13;
CUctrl_TO_WORD.14 := IN.Spare14;
CUctrl_TO_WORD.15 := IN.Spare15;
END_FUNCTION

И потом в коде не нужно делать много операций.



VAR
TestStruct : CUctrl;
test: WORD;
END_VAR

test:=CUctrl_TO_WORD(TestStruct);

a_gricaj
22.10.2018, 15:47
вместо TYPE CUctrl : STRUCT не проще ли о обращаться сразу к битам test(word) через точку:

test.0 := TRUE;
TestStruct.Spare0 := TRUE;

можно константы объявить для удобства.
VAR CONSTANT
Spare0: BYTE := 0;
END_VAR (и даже глобальные VAR_GLOBAL CONSTANT)

test.Spare0 := TRUE;

НУ я так и делаю, через точку, но много лишней работы для ПЛК

a_gricaj
22.10.2018, 15:49
Написать свой CUctrl_TO_WORD


FUNCTION CUctrl_TO_WORD : WORD
VAR_INPUT
IN: CUctrl;
END_VAR
CUctrl_TO_WORD.0 := IN.Spare0;
CUctrl_TO_WORD.1 := IN.Spare1;
CUctrl_TO_WORD.2 := IN.Spare2;
CUctrl_TO_WORD.3 := IN.Spare3;
CUctrl_TO_WORD.4 := IN.Spare4;
CUctrl_TO_WORD.5 := IN.Spare5;
CUctrl_TO_WORD.6 := IN.Spare6;
CUctrl_TO_WORD.7 := IN.Spare7;
CUctrl_TO_WORD.8 := IN.Spare8;
CUctrl_TO_WORD.9 := IN.Spare9;
CUctrl_TO_WORD.10 := IN.Spare10;
CUctrl_TO_WORD.11 := IN.Spare11;
CUctrl_TO_WORD.12 := IN.Spare12;
CUctrl_TO_WORD.13 := IN.Spare13;
CUctrl_TO_WORD.14 := IN.Spare14;
CUctrl_TO_WORD.15 := IN.Spare15;
END_FUNCTION

И потом в коде не нужно делать много операций.



VAR
TestStruct : CUctrl;
test: WORD;
END_VAR

test:=CUctrl_TO_WORD(TestStruct);

А тут не понял, почему ПЛК будет проще, так как процессору еще нужно вызвать функцию....Реально будет быстрее?

capzap
22.10.2018, 16:18
Как то это по детски, считать что процессор, что видит человек, то и выполняет. На уровне компиляции любой вариант придуманный человеком оптимизируется и в машинных кодах будет с большой вероятностью одно и тоже