Вопрос.jpg
Добрый день,
подскажите, как написать программу, аналогичной на картинке.
Суть программы сдвиг влево переменной по фронту 1-го входа и запись в младший разряд значения со 2-го входа.
Результат значения с 7-го разряда передается на выход.
Вопрос.jpg
Добрый день,
подскажите, как написать программу, аналогичной на картинке.
Суть программы сдвиг влево переменной по фронту 1-го входа и запись в младший разряд значения со 2-го входа.
Результат значения с 7-го разряда передается на выход.
Вариант:
Owen.jpg
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;
А если в первый бит писать(по фронту импульса на 1-ом входе), а с 8-ого читать, так не потянет, мой вариант:
Сдвиговый регистр_8.png
Короче, сто раз сдвиговые регистры обсуждали, эта песня хороша, начинай сначала!
Сдвиговый регистр_8.owle
Могу добавить сдвиговый регистр с предустановкой, в одной из тем обсуждали:
Сдвиговый регистр_7.owle
Сдвиговый регистр_7.png
Подойдёт для бегущих огней и т. п., в смысле, набираете комбинацию огней и нажимаете на включение сдвига, она сдвигается!
Комбинация набирается нажатием по одной кнопке.
Последний раз редактировалось Сергей0308; 26.04.2025 в 20:13.
Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
справиться с проблемами, либо это не твои проблемы.
Вопрос1.jpg
Спасибо, большое,
только мне так не пойдет. Здесь алгоритм записи в младший разряд привязан к фронту входа I1.
А мне нужно как в той программе как я показал, чтобы после фронта входа I1 и сдвига,
пока I1 положителен, можно было бы записать в младший разряд значение по фронту от входа I2.
Надо так надо, я Вам Т.З. не писал, не знаю как Вам надо, я к тому, что если результатом является значение на выходе, то разницы в работе не будет!
Может у вас переменная ещё где(как) используется, Вы об этом не написали, поэтому я догадками стараюсь не руководствоваться, а что написано в моём варианте разницы работы(значения на выходе) не будет!
Короче, если важен не результат, а сам процесс, вот мой вариант:
Сдвиговый регистр_9.png
Сдвиговый регистр_9.owle
Много лет назад в одной из тем делали задержку на 2048 тактов, от туда взял, у вас гораздо проще, задержка всего на 7 тактов, в смысле, состояние на втором входе будет появляться на выходе спустя 7 тактов(импульсов) на первом входе по фронту импульса!
Хотелось бы добавить, посмотрел вашу картинку, в смысле, диаграмму состояний, тоже считаю что это наиболее удобный и понятный способ описания работы алгоритма, проблема в том, что она не соответствует вашему первоначальному описанию, я понимаю, что всё в мире меняется ничего нет постоянного, наверно я тоже в чём то виноват, в смысле не поспеваю за вашей динамикой, короче, определяйтесь с алгоритмом, как должно работать как изначально Вы описали или как на диаграммах!
Вот соответствующий диаграммам мой вариант:
Сдвиговый регистр_10.owle
Сдвиговый регистр_10.png
Разумеется, бывает куча всяких тонкостей(нюансов) работы алгоритма, но пока Вы их не сообщили, в смысле, пока остановимся на этом!
Последний раз редактировалось Сергей0308; 27.04.2025 в 00:51.
Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
справиться с проблемами, либо это не твои проблемы.
Ну, если по картинке, то, вроде, так
Безымянный.png
А можно не морщить лоб и просто перевести код на картинке из 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
Последний раз редактировалось Dimensy; 26.04.2025 в 23:52.
[
Вот соответствующий диаграммам мой вариант:
Сдвиговый регистр_10.owle
Сдвиговый регистр_10.png
Спасибо большое!
это то, что мне нужно!
А я не уверен. Здесь порядок исполнения не соответствует приведенной программе на LD. Попробуйте активировать сначала второй вход, а потом первый.
Хотя, если линию задержки в другом месте поставить, то получится
Безымянный.png
Да и диаграмме не соответствует, там вы указали, что запись происходит по фронту второго входа. Т.е., так
Безымянный.png
Последний раз редактировалось Dimensy; 27.04.2025 в 10:20.