Просмотр полной версии : ПР102+ МВ110-32 H/W v2.0
Здравствуйте коллеги.
Столкнулся с обновленными модулями ввода.
На старых модулях ПР опрашивал модуль по двум регистрам 99, входа 1-16 и 100, входа 17-37 соответсвенно.
А вот теперь опрос идет по сдвоенному регистру, т.е. DWORD 99, входа 1-32, а иначе связи с модулем нет, модуль ввода уходит в аварию (нет опроса).
Моя проблема заключается в том, как теперь, по битово разобрать DWORD?
Ранее я пользовался макросом WORD IN BOOL, в основу которого входит макрос EXTRACT но он рассчитан на 16 бит.
Я пробовал модернизировать подставляя 16, 17... 31, получался какой то бред.
сдвиг + add
так вы же читаете, а не пишите
kondor3000
25.05.2024, 10:30
Здравствуйте коллеги.
Столкнулся с обновленными модулями ввода.
На старых модулях ПР опрашивал модуль по двум регистрам 99, входа 1-16 и 100, входа 17-37 соответсвенно.
А вот теперь опрос идет по сдвоенному регистру, т.е. DWORD 99, входа 1-32, а иначе связи с модулем нет, модуль ввода уходит в аварию (нет опроса).
Моя проблема заключается в том, как теперь, по битово разобрать DWORD?
Ранее я пользовался макросом WORD IN BOOL, в основу которого входит макрос EXTRACT но он рассчитан на 16 бит.
Я пробовал модернизировать подставляя 16, 17... 31, получался какой то бред.
Что за ерунда, EXTRACT может извлекать все с 0 по 31 бит. У вас где то ошибка, если не работает.
На языке ST ещё проще, , биты извлекаются через точку из Маски DWORD. Сделать ФБ и записать в одну, две строки можно.
b0:=Mask.0; b1:=Mask.1; b2:=Mask.2;.........b31:=Mask.31;
Чтобы не создавать лишних макросов и т.д. ставите два Word_To_Bool, на первый (0-15) просто подаете число, на второй перед подачей числа сдвиньте его вправо на 16 бит SHR и получите на выходе 16-31 биты.
зачем все усложнять созданием лишних макросов, когда в системе для таких вещей вполне все предусмотрено?
Спасибо.
Ранее просто так тесно не работал с битами.
Вот блин, я забыл, что ПРка поддерживает ST.
kondor3000
25.05.2024, 12:37
Проверил, можно и не писать новый блок, а на 2 экземпляр подать Маску DWORD (Udint) через функцию. 76036
Или просто вставить строку W:=SHR(W1,16); в ФБ на ST. Всё работает
function SHR16: udint; //имя функции и тип данных выхода
var_input
W : udint; //входная переменная с типом данных udint
end_var
SHR16:=SHR(W,16);
end_function
лучше сделайте блок на 8 выходов и дополнительный вход для сдвига. А сдвиг встройте внутрь.
Сергей0308
25.05.2024, 14:16
лучше сделайте блок на 8 выходов и дополнительный вход для сдвига. А сдвиг встройте внутрь.
У меня настройки имеются в свойствах макроса, в смысле, настраивается какой бит извлекать на каждом выходе!
И, сдвиг не нужен!
76037
Что за ерунда, EXTRACT может извлекать все с 0 по 31 бит. У вас где то ошибка, если не работает.
На языке ST ещё проще, , биты извлекаются через точку из Маски DWORD. Сделать ФБ и записать в одну, две строки можно.
b0:=Mask.0; b1:=Mask.1; b2:=Mask.2;.........b31:=Mask.31;
Не получается создать массив с udint.
Проверил, можно и не писать новый блок, а на 2 экземпляр подать Маску DWORD (Udint) через функцию. 76036
Или просто вставить строку W:=SHR(W1,16); в ФБ на ST. Всё работает
function SHR16: udint; //имя функции и тип данных выхода
var_input
W : udint; //входная переменная с типом данных udint
end_var
SHR16:=SHR(W,16);
end_function
Странно, повторил Ваш пример. Но у меня вот ни хрена не работает, первые 16 и все.....
У меня настройки имеются в свойствах макроса, в смысле, настраивается какой бит извлекать на каждом выходе!
И, сдвиг не нужен!
76037
Я так изначально и делал через экстракт, подставляя 16, 17 и т.д. Бесполезно.
kondor3000
26.05.2024, 17:49
Не получается создать массив с udint.
Зачем тут массив? Маска это переменная UDINT.
Сергей0308
26.05.2024, 17:51
Я так изначально и делал через экстракт, подставляя 16, 17 и т.д. Бесполезно.
Так не надо там ничего мудрить, функция извлечения бит в ОЛ имеется и её можно проверить, в смысле подайте на вход значение 65536 или 131072, эти значения должны соответствовать 16 или 17 биту, в смысле, неужели хотя бы в симуляторе нельзя минуту потратить и всё проверить, в смысле, проблему найти, может у Вас значения поступают не более 65535, поэтому эти биты всегда в состоянии логического "0"!
Попробуйте отдельно читать 99 и 100 регистр!
И, Вы используете макрос вставки(записи) бит очень не оптимальный, сильно переусложнённый, в смысле, можно подсмотреть в моём проекте, намного проще!
kondor3000
26.05.2024, 18:10
Странно, повторил Ваш пример. Но у меня вот ни хрена не работает, первые 16 и все.....
Так у вас дело не в блоке, а в чтении с Модуля. Сам блок работает правильно. 76058
Последний бит включает число 134217728
Это 27 бит, но так как у вас счёт с 1 бита ( а не с 0), то получился 28.
Скорее всего сетевая переменная не передаёт число больше 65535. Надо сделать сетевую с адресом 100 и посмотреть в ней число.
Так же попробовать переставить регистры (байты) галочкой.
Так не надо там ничего мудрить, функция извлечения бит в ОЛ имеется и её можно проверить, в смысле подайте на вход значение 65536 или 131072, эти значения должны соответствовать 16 или 17 биту, в смысле, неужели хотя бы в симуляторе нельзя минуту потратить и всё проверить, в смысле, проблему найти, может у Вас значения поступают не более 65535, поэтому эти биты всегда в состоянии логического "0"!
Попробуйте отдельно читать 99 и 100 регистр!
И, Вы используете макрос вставки(записи) бит очень не оптимальный, сильно переусложнённый, в смысле, можно подсмотреть в моём проекте, намного проще!
Вот это хороший вопрос, что приходит не более 65535. К сожалению модуля ввода у меня под рукой нет, объект пытаюсь запустить удаленно. Ранее проблем с модулем ввода не было, это именно с обновленной версии модуля какая-то фигня. Ранее опрос делался 2-мя регистрами и проблем не было. а сей час по мимо того что он сдвоенные так еще и на оборот.... Вход 16, это 1 бит, очень усложняет наладку.
Так у вас дело не в блоке, а в чтении с Модуля. Сам блок работает правильно. 76058
Последний бит включает число 134217728
Это 27 бит, но так как у вас счёт с 1 бита ( а не с 0), то получился 28.
Скорее всего сетевая переменная не передаёт число больше 65535. Надо сделать сетевую с адресом 100 и посмотреть в ней число.
Так же попробовать переставить регистры (байты) галочкой.
Как я и писал в начале своего поста, прикладывая картинку от тех поддержки ОВЕН, модуль НОВЫЙ опрашивается сдвоеным регистром, а читать его 99 и 100 не получается! Ошибка сети, на модуле мигает лампа авария.
Прочитайте модуль когда замкнут только первый вход и посмотрите что ПРка прочитает. Может надо байты местами поменять?
Получил я модуль на руки.
Проблема действительно не в самом коде, а в настройка сети.
Сам модуль на заводских настройках сети!
В лоджике я добавил шаблон из менеджера компонентов, и отредактировал его под один регистр.
Вот в этом шаблоне стояла галочка "старшим байтом".
Получается, что если подать сигнал на 1ый вход, сетился 9 в лоджике!
Если убрать эту галочку, все работает корректно!
Это я смог понять только когда модуль оказался в у меня на столе, а не в щите с подключенными приборами.
Всем огромное спасибо!!!
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot