PDA

Просмотр полной версии : Номер бита в регистре при адресации к нему. Как указать номер бита в виде переменной?



Daedal
25.02.2018, 21:47
Добрый вечер!

Подскажите, пожалуйста, следующий момент:

REG1.0 - это доступ к первому биту.
А как сделать это через REG.num ?

Какого типа должен быть num? Пробовал INT и STRING и BYTE - выдаёт ошибку.

Спасибо.

capzap
25.02.2018, 22:05
так просто не получится, только согласно документации

Daedal
25.02.2018, 22:10
так просто не получится, только согласно документации

Спасибо.
Так, значит так.

Daedal
27.02.2018, 10:50
И всё-таки что-то не получается.
Делаю так:

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;

- тоже самое.

Что я делаю не так?

capzap
27.02.2018, 10:53
строчка
VDARRAY[0].CmdIn.Hact := ACTUATORS_CMDIN_H.VDNUM;расшифровывается как VDARRAY[0].CmdIn.Hact := ACTUATORS_CMDIN_H.2;
Вам именно это нужно?

Daedal
27.02.2018, 11:02
строчка
VDARRAY[0].CmdIn.Hact := ACTUATORS_CMDIN_H.VDNUM;расшифровывается как VDARRAY[0].CmdIn.Hact := ACTUATORS_CMDIN_H.2;
Вам именно это нужно?

Да, всё верно. Так и нужно. Мне нужен третий бит из DWORD`a, который я присваиваю булевому Hact.
Но ошибку показывает.
А если ставлю просто 2, то ошибки нет.

Daedal
27.02.2018, 11:55
Опечатка в мануале смутила( НЕ НУЖНО "_") и я подумал, что надо VAR_GLOBAL CONSTANT!

объявил как на картинке, которую Вы прикрепили. Но результат тот же.

Вы сами пробовали скомпилировать?

capzap
27.02.2018, 12:20
всё работает как надо

Daedal
27.02.2018, 12:52
Полтергейст.
Вставляю в свой проект - не работает!
Создаю новый проект - не работает!
Компилирую Ваш проект - работает.
:eek:

Хоть в Вами созданный проект всё переноси :rolleyes:

Евгений Кислов
27.02.2018, 13:12
Daedal, вам надо сделать так: Проект - Опции - Генератор кода - поставить галочку Замена констант. И повторно выполнить компиляцию.

Daedal
27.02.2018, 13:33
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?!

capzap
27.02.2018, 13:39
неочевидно-то всё это в codesys?!
очень даже очевидно, написано же в выводе ошибки, целое число, либо переменная из области объявлений констант. Если в коде написать целое число, это тоже будет константа, и ни какая другая переменная, значение которой можно изменить из вне с нумерацией бит работать не будет.

Daedal
27.02.2018, 13:42
очень даже очевидно, написано же в выводе ошибки, целое число, либо переменная из области объявлений констант. Если в коде написать целое число, это тоже будет константа, и ни какая другая переменная, значение которой можно изменить из вне с нумерацией бит работать не будет.

Т.е. в цикле не перебрать биты никак?!

Евгений Кислов
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;

Daedal
27.02.2018, 13:53
Посмотрите в библиотеке Util папку bit/byte functions.
Описание доступно в справке Codesys.

;)

Спасибо.Всё.Теперь я знаю.

capzap
27.02.2018, 14:01
Чего вы зациклились на этой точке?
Двоичную арифметику запретили что-ли?

Подсказка: бит с номером j у BYTE/WORD/DWORD можно узнать с помощью операции SHR (операция побитового сдвига).

Т.е. вам нужно не ACTUATORS_CMDIN_H.j , а SHR(ACTUATORS_CMDIN_H, j).0;

арифметика арифметикой, но использование именованных констант, гораздо удобнее для той же отладки. В той же Яве с этим проблем нет, мало кто использует цвет цифровым представлением, все предпочитаютимя, например Color.GREY
Поэтому смещение конечно надо знать, но и с именованием констант тоже не плохо получить практический опыт