Просмотр полной версии : Сдвиг переменной влево и чтение ее 7-го разряда
83463
Добрый день,
подскажите, как написать программу, аналогичной на картинке.
Суть программы сдвиг влево переменной по фронту 1-го входа и запись в младший разряд значения со 2-го входа.
Результат значения с 7-го разряда передается на выход.
M: udint;
--
rtrig(CLK := 1-го входа);
if rtrig.Q then
M := shl(M,1);
M.0 := 2-го входа;
end_if
выход := M.7;
или
rtrig(CLK := 1-го входа);
M := sel(rtrig.Q, M, M + M + bool_to_udint(2-го входа));
выход := M.7;
Сергей0308
26.04.2025, 19:27
А если в первый бит писать(по фронту импульса на 1-ом входе), а с 8-ого читать, так не потянет, мой вариант:
83475
Короче, сто раз сдвиговые регистры обсуждали, эта песня хороша, начинай сначала!
83476
Могу добавить сдвиговый регистр с предустановкой, в одной из тем обсуждали:
83478
83479
Подойдёт для бегущих огней и т. п., в смысле, набираете комбинацию огней и нажимаете на включение сдвига, она сдвигается!
Комбинация набирается нажатием по одной кнопке.
83482
Спасибо, большое,
только мне так не пойдет. Здесь алгоритм записи в младший разряд привязан к фронту входа I1.
А мне нужно как в той программе как я показал, чтобы после фронта входа I1 и сдвига,
пока I1 положителен, можно было бы записать в младший разряд значение по фронту от входа I2.
Сергей0308
26.04.2025, 21:06
83482
Спасибо, большое,
только мне так не пойдет. Здесь алгоритм записи в младший разряд привязан к фронту входа I1.
А мне нужно как в той программе как я показал, чтобы после фронта входа I1 и сдвига,
пока I1 положителен, можно было бы записать в младший разряд значение по фронту от входа I2.
Надо так надо, я Вам Т.З. не писал, не знаю как Вам надо, я к тому, что если результатом является значение на выходе, то разницы в работе не будет!
Может у вас переменная ещё где(как) используется, Вы об этом не написали, поэтому я догадками стараюсь не руководствоваться, а что написано в моём варианте разницы работы(значения на выходе) не будет!
Короче, если важен не результат, а сам процесс, вот мой вариант:
83484
83485
Много лет назад в одной из тем делали задержку на 2048 тактов, от туда взял, у вас гораздо проще, задержка всего на 7 тактов, в смысле, состояние на втором входе будет появляться на выходе спустя 7 тактов(импульсов) на первом входе по фронту импульса!
Хотелось бы добавить, посмотрел вашу картинку, в смысле, диаграмму состояний, тоже считаю что это наиболее удобный и понятный способ описания работы алгоритма, проблема в том, что она не соответствует вашему первоначальному описанию, я понимаю, что всё в мире меняется ничего нет постоянного, наверно я тоже в чём то виноват, в смысле не поспеваю за вашей динамикой, короче, определяйтесь с алгоритмом, как должно работать как изначально Вы описали или как на диаграммах!
Вот соответствующий диаграммам мой вариант:
83486
83487
Разумеется, бывает куча всяких тонкостей(нюансов) работы алгоритма, но пока Вы их не сообщили, в смысле, пока остановимся на этом!
Ну, если по картинке, то, вроде, так
83483
А можно не морщить лоб и просто перевести код на картинке из LD в ST
function_block Shift_L //имя функционального блока.
var_input //объявление входных переменных
In1, In2 : bool; //входная переменная с типом данных bool
end_var
var_output //объявление выходных переменных
Q : bool;
end_var
var //объявление локальных переменных
RTrig : SYS.RTRIG;
Val: udint;
end_var
RTrig(I:= In1);
if RTrig.Q then val := shl(Val,1); end_if
if In1 and In2 then Val.0 := true; end_if
Q := Val.7;
end_function_block
[
Вот соответствующий диаграммам мой вариант:
83486
83487
Спасибо большое!
это то, что мне нужно!
А можно не морщить лоб и просто перевести код на картинке из LD в ST
function_block Shift_L //имя функционального блока.
var_input //объявление входных переменных
In1, In2 : bool; //входная переменная с типом данных bool
end_var
var_output //объявление выходных переменных
Q : bool;
end_var
var //объявление локальных переменных
RTrig : SYS.RTRIG;
Val: udint;
end_var
RTrig(I:= In1);
if RTrig.Q then val := shl(Val,1); end_if
if In1 and In2 then Val.0 := true; end_if
Q := Val.7;
end_function_block
И это то что мне надо!
Спасибо всем большое!
Удачи Вам и хороших предстоящих майских праздников!
[
Вот соответствующий диаграммам мой вариант:
83486
83487
Спасибо большое!
это то, что мне нужно!
А я не уверен. Здесь порядок исполнения не соответствует приведенной программе на LD. Попробуйте активировать сначала второй вход, а потом первый.
Хотя, если линию задержки в другом месте поставить, то получится
83489
Да и диаграмме не соответствует, там вы указали, что запись происходит по фронту второго входа. Т.е., так
83490
А я не уверен. Здесь порядок исполнения не соответствует приведенной программе на LD. Попробуйте активировать сначала второй вход, а потом первый.
Хотя, если линию задержки в другом месте поставить, то получится
83489
Да и диаграмме не соответствует, там вы указали, что запись происходит по фронту второго входа. Т.е., так
83490
Да, Вы правы, так будет лучше, это как раз то что мне нужно!
Спасибо большое!
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot