PDA

Просмотр полной версии : Запись значений в булевы переменные с абсолютной адресацией из визуализации



S#716_0P
27.10.2022, 07:41
Добрый день,
Столкнулся с такой проблемой:
В глобальном списке определены булевы переменные. Переменные определены с привязкой к адресам при помощи декларации AT. Например, так:


{attribute 'qualified_only'}
VAR_GLOBAL
bVar0 AT %QX10.0 :BOOL;
bVar1 AT %QX10.1 :BOOL;
bVar2 AT %QX10.2 :BOOL;
bVar3 AT %QX10.3 :BOOL;
bVar4 AT %QX10.4 :BOOL;
bVar5 AT %QX10.5 :BOOL;
bVar6 AT %QX10.6 :BOOL;
bVar7 AT %QX10.7 :BOOL;
bVar8 AT %QX11.0 :BOOL;
bVar9 AT %QX11.1 :BOOL;
и т.д.
END_VAR

Привязка необходима для того, чтобы можно было в дальнейшем читать/писать переменные посредством Modbus.
Эти же переменные привязаны к элементам управления на визуализации (кнопкам, чекбоксам).
При компиляции проекта генерируются предупреждения:


C0355: A single bit cannot be referenced. A reference to the complete byte will be stored.

Если я правильно понял, BIT и BOOL это два разных типа. И если в BOOL можно писать, как в отдельный бит, то при записи в BIT ,будет перезаписан весь байт.
Т.е. при нажатии кнопки, привязанной, например, к bVar3, перезапишутся все переменные от bVar0 до bVar7 значением 2#00001000.
Проверить это на данный момент мне не на чем, нет контроллера под рукой. Если кто-нибудь сталкивался, это действительно так? Как можно обойти это ограничение? Или можно игнорировать предупреждения?

1exan
27.10.2022, 08:31
...
При компиляции проекта генерируются предупреждения:


C0355: A single bit cannot be referenced. A reference to the complete byte will be stored.

Если я правильно понял, BIT и BOOL это два разных типа. И если в BOOL можно писать, как в отдельный бит, то при записи в BIT ,будет перезаписан весь байт.
Т.е. при нажатии кнопки, привязанной, например, к bVar3, перезапишутся все переменные от bVar0 до bVar7 значением 2#00001000.
Проверить это на данный момент мне не на чем, нет контроллера под рукой. Если кто-нибудь сталкивался, это действительно так? Как можно обойти это ограничение? Или можно игнорировать предупреждения?

Да, похоже память организована в виде байтов (видно по адресации битов) и ссылка делается только на весь байт.
Вот здесь (https://blog.engcore.ru/2022/03/21/программирование-плк-на-codesys-bit-c-bool/) есть тоже про сравнение BIT с BOOL, может поможет.

S#716_0P
28.10.2022, 12:18
Спасибо за ссылку. Полезная статья.
Попробовал в режиме симуляции: нажимаю на кнопку значение записывается только в переменную, которая привязана к кнопке, соседние биты не затрагивает. Как будет возможность проверю на реальном контроллере и отпишусь.

VSU
02.11.2022, 09:43
Привязка необходима для того, чтобы можно было в дальнейшем читать/писать переменные посредством Modbus.
Эти же переменные привязаны к элементам управления на визуализации (кнопкам, чекбоксам).


А не проще ли объявить одну переменную bVar типа BYTE или WORD и обращаться к отдельным битам и в визуализации и в программе.
bVar.0 := TRUE; bVar.1 := FALSE и т.д.