Просмотр полной версии : Номер бита в регистре при адресации к нему. Как указать номер бита в виде переменной?
Добрый вечер!
Подскажите, пожалуйста, следующий момент:
REG1.0 - это доступ к первому биту.
А как сделать это через REG.num ?
Какого типа должен быть num? Пробовал INT и STRING и BYTE - выдаёт ошибку.
Спасибо.
так просто не получится, только согласно документации
так просто не получится, только согласно документации
Спасибо.
Так, значит так.
И всё-таки что-то не получается.
Делаю так:
1.Объявляю глобальную константу:
VAR_GLOBAL CONSTANT
(* Кол-во вентиляторов -1*)
VDNUM : INT := 2;
END_VAR
2. В цикле пытаюсь выбрать бит:
(* Индивидуальные настройки, полученные с modbus tcp *)
FOR i:= 0 TO VDNUM DO
VDARRAY[i].CmdIn.Hact := ACTUATORS_CMDIN_H.i; (* ACTUATORS_CMDIN_H - VD1..VD3 | KDYVD1..KDYVD3 | OZK1..OZK5 *)
END_FOR
- ошибка 4027: требуется целое число или символьная константа
пробую прямо указать константу:
VDARRAY[0].CmdIn.Hact := ACTUATORS_CMDIN_H.VDNUM;
- тоже самое.
Что я делаю не так?
строчка
VDARRAY[0].CmdIn.Hact := ACTUATORS_CMDIN_H.VDNUM;расшифровывается как VDARRAY[0].CmdIn.Hact := ACTUATORS_CMDIN_H.2;
Вам именно это нужно?
строчка
VDARRAY[0].CmdIn.Hact := ACTUATORS_CMDIN_H.VDNUM;расшифровывается как VDARRAY[0].CmdIn.Hact := ACTUATORS_CMDIN_H.2;
Вам именно это нужно?
Да, всё верно. Так и нужно. Мне нужен третий бит из DWORD`a, который я присваиваю булевому Hact.
Но ошибку показывает.
А если ставлю просто 2, то ошибки нет.
Опечатка в мануале смутила( НЕ НУЖНО "_") и я подумал, что надо VAR_GLOBAL CONSTANT!
объявил как на картинке, которую Вы прикрепили. Но результат тот же.
Вы сами пробовали скомпилировать?
Полтергейст.
Вставляю в свой проект - не работает!
Создаю новый проект - не работает!
Компилирую Ваш проект - работает.
:eek:
Хоть в Вами созданный проект всё переноси :rolleyes:
Евгений Кислов
27.02.2018, 13:12
Daedal, вам надо сделать так: Проект - Опции - Генератор кода - поставить галочку Замена констант. И повторно выполнить компиляцию.
Daedal, вам надо сделать так: Проект - Опции - Генератор кода - поставить галочку Замена констант. И повторно выполнить компиляцию.
Спасибо, для случая подстановки константы в качестве номера бита - помогло.
А как сделать, чтобы :
(* Индивидуальные настройки, полученные с modbus tcp *)
FOR i:= 0 TO VDNUM DO
VDARRAY[i].CmdIn.Hact := ACTUATORS_CMDIN_H.j; (* ACTUATORS_CMDIN_H - VD1..VD3 | KDYVD1..KDYVD3 | OZK1..OZK5 *)
j:=j+1;
END_FOR
- ошибка 4027: требуется целое число или символьная константа
j - была переменной и было без ошибок, подскажите, пожалуйста.
Если инициализировать j в разделе:
VAR_GLOBAL
j : INT := 0;
END_VAR
, то ошибка остаётся.
Как вообще в цикле перебирать номер бита в регистре? Детский вопрос, я не понимаю, почему так неочевидно-то всё это в codesys?!
неочевидно-то всё это в codesys?!
очень даже очевидно, написано же в выводе ошибки, целое число, либо переменная из области объявлений констант. Если в коде написать целое число, это тоже будет константа, и ни какая другая переменная, значение которой можно изменить из вне с нумерацией бит работать не будет.
очень даже очевидно, написано же в выводе ошибки, целое число, либо переменная из области объявлений констант. Если в коде написать целое число, это тоже будет константа, и ни какая другая переменная, значение которой можно изменить из вне с нумерацией бит работать не будет.
Т.е. в цикле не перебрать биты никак?!
Евгений Кислов
27.02.2018, 13:47
Т.е. в цикле не перебрать биты никак?!
Посмотрите в библиотеке Util папку bit/byte functions.
Описание доступно в справке Codesys.
Владимир Ситников
27.02.2018, 13:49
Т.е. в цикле не перебрать биты никак?!
Чего вы зациклились на этой точке?
Двоичную арифметику запретили что-ли?
Подсказка: бит с номером j у BYTE/WORD/DWORD можно узнать с помощью операции SHR (операция побитового сдвига).
Т.е. вам нужно не ACTUATORS_CMDIN_H.j , а SHR(ACTUATORS_CMDIN_H, j).0;
Посмотрите в библиотеке Util папку bit/byte functions.
Описание доступно в справке Codesys.
;)
Спасибо.Всё.Теперь я знаю.
Чего вы зациклились на этой точке?
Двоичную арифметику запретили что-ли?
Подсказка: бит с номером j у BYTE/WORD/DWORD можно узнать с помощью операции SHR (операция побитового сдвига).
Т.е. вам нужно не ACTUATORS_CMDIN_H.j , а SHR(ACTUATORS_CMDIN_H, j).0;
арифметика арифметикой, но использование именованных констант, гораздо удобнее для той же отладки. В той же Яве с этим проблем нет, мало кто использует цвет цифровым представлением, все предпочитаютимя, например Color.GREY
Поэтому смещение конечно надо знать, но и с именованием констант тоже не плохо получить практический опыт
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot