Просмотр полной версии : pragma bitaccess? помогите разобраться
В проекте нужно несколько флаговых переменных, использую на данный момент несколько 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;
В проекте нужно несколько флаговых переменных, использую на данный момент несколько 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, то не советуйте глупости.
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}?
Странно. Если сделать вот так:
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? Это же путает?!
Я это сделал до того как задал вопрос. Если после имени написать значение за рамками структуры, то тоже не работает.
Вопрос в другом. Если значение для x1 берется из глобальных констант, то зачем его указывать в директиве bitaccess? Это же путает?!
а синтаксис Вы прочли, второй аргумент это как и третий, для информации. в нем должно быть значение присвоенное глобальной константе
Спорягин Кирилл
25.08.2015, 15:04
Вообщем, это что-то вроде комментария. Только обязательного.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot