Вход

Просмотр полной версии : pragma bitaccess? помогите разобраться



manuel
11.08.2015, 13:47
В проекте нужно несколько флаговых переменных, использую на данный момент несколько DWORD и кучу констант типа INT для доступа к отдельным битам.
Проблем вроде нет, но хочется сделать по человечески. В справке в разделе "Addressing bits in variables" описан вариант:

----------------------------------------
Example 2, Bitaccess on an integer structure component:
Declaration of structure stru1:
TYPE stru1 :
STRUCT
bvar:BOOL;
rvar:REAL;
wvar:WORD;
{bitaccess enable 42 'Start drive'}
END_STRUCT
END_TYPE

Declaration in POU:

VAR
x:stru1;
END_VAR

Bitaccess:

x.enable:=true;

This will set TRUE the 42. bit in variable x. Since bvar has 8 bits and rvar has 32 bits, the bitaccess will be done on the second bit of variable wvar, which as a result will get value 4.

---------------------------------------------

Красиво, понятно, в рантайме должно отображаться, но, создаю проект, ПЛК160, таргет 2.10, и получаю ошибку Error 4121: ENABLE is not a component of stru1.

Проект прикладываю, кодесис пробовал как с сайта ОВНА, так и скачанный с сайта 3S (2.3.9.47) -- результат тот же.
Подскажите что я делаю не так, какое волшебное слово нужно, чтобы нормально заработал этот bitaccess?

_Mikhail
11.08.2015, 14:21
В твоем проекте создана структура из трех переменных
TYPE stru1 :
STRUCT
bvar: BOOL;
rvar: REAL;
wvar: WORD;
END_STRUCT
END_TYPE

А в проекте ты вызвал структуру
x: stru1;

и обращаешься к несуществующей переменной
x.enable:=true;

petera
11.08.2015, 14:53
В проекте нужно несколько флаговых переменных, использую на данный момент несколько DWORD и кучу констант типа INT для доступа к отдельным битам.
Проблем вроде нет, но хочется сделать по человечески. В справке в разделе "Addressing bits in variables" описан вариант:

----------------------------------------
Example 2, Bitaccess on an integer structure component:
Declaration of structure stru1:
TYPE stru1 :
STRUCT
bvar:BOOL;
rvar:REAL;
wvar:WORD;
{bitaccess enable 42 'Start drive'}
END_STRUCT
END_TYPE

Declaration in POU:

VAR
x:stru1;
END_VAR

Bitaccess:

x.enable:=true;

This will set TRUE the 42. bit in variable x. Since bvar has 8 bits and rvar has 32 bits, the bitaccess will be done on the second bit of variable wvar, which as a result will get value 4.

---------------------------------------------

Красиво, понятно, в рантайме должно отображаться, но, создаю проект, ПЛК160, таргет 2.10, и получаю ошибку Error 4121: ENABLE is not a component of stru1.

Проект прикладываю, кодесис пробовал как с сайта ОВНА, так и скачанный с сайта 3S (2.3.9.47) -- результат тот же.
Подскажите что я делаю не так, какое волшебное слово нужно, чтобы нормально заработал этот bitaccess?
Читать в справке нужно все, в том числе и примечания.
19459

19464

19460

Из этого следует, что
1. Включить "замену констант"
19461
2. Объявить "enable" как глобальную константу.
19462

И вуаля:rolleyes:
19463

To _Mikhail

Вы если не знаете что такое Bitaccess, то не советуйте глупости.

manuel
11.08.2015, 15:19
2 petera
Да!

Огромное спасибо за развернутый ответ, работает!

Спорягин Кирилл
25.08.2015, 13:54
Странно. Если сделать вот так:

TYPE strDWORD :
STRUCT
Channel : DWORD;
{bitaccess x1 0}
END_STRUCT
END_TYPE

VAR_GLOBAL CONSTANT
x1 : INT := 3;
END_VAR

То будет меняться 3 бит в переменной Channel.

Если убрать в объявлении bitaccess 0, т.е. так:
TYPE strDWORD :
STRUCT
Channel : DWORD;
{bitaccess x1}
END_STRUCT
END_TYPE
то не работает.

Т.е. в записи {bitaccess x1 0} цифра после имени бита нужна, но значение номера бита для имени x1 берется из глобальных констант.

Зачем тогда указывать цифру в объявлении {bitaccess x1 0}?

capzap
25.08.2015, 14:05
Странно. Если сделать вот так:

TYPE strDWORD :
STRUCT
Channel : DWORD;
{bitaccess x1 0}
END_STRUCT
END_TYPE

VAR_GLOBAL CONSTANT
x1 : INT := 3;
END_VAR

То будет меняться 3 бит в переменной Channel.

Если убрать в объявлении bitaccess 0, т.е. так:
TYPE strDWORD :
STRUCT
Channel : DWORD;
{bitaccess x1}
END_STRUCT
END_TYPE
то не работает.

Т.е. в записи {bitaccess x1 0} цифра после имени бита нужна, но значение номера бита для имени x1 берется из глобальных констант.

Зачем тогда указывать цифру в объявлении {bitaccess x1 0}?

так Вы прочитайте в документации синтакиси этой директивы, замените ноль на 333 и посмотрите что будет

Спорягин Кирилл
25.08.2015, 14:24
так Вы прочитайте в документации синтакиси этой директивы, замените ноль на 333 и посмотрите что будет
Я это сделал до того как задал вопрос. Если после имени написать значение за рамками структуры, то тоже не работает.
Вопрос в другом. Если значение для x1 берется из глобальных констант, то зачем его указывать в директиве bitaccess? Это же путает?!

capzap
25.08.2015, 14:53
Я это сделал до того как задал вопрос. Если после имени написать значение за рамками структуры, то тоже не работает.
Вопрос в другом. Если значение для x1 берется из глобальных констант, то зачем его указывать в директиве bitaccess? Это же путает?!
а синтаксис Вы прочли, второй аргумент это как и третий, для информации. в нем должно быть значение присвоенное глобальной константе

Спорягин Кирилл
25.08.2015, 15:04
Вообщем, это что-то вроде комментария. Только обязательного.