Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Mitsubishi Electric. Контроллеры, преобразователи частоты, HMI _ Программирование _ Задача №38

Автор: lkobets 12.04.2014 - 15:43


Есть 10 маркеров, которые включаются/отключаются по каким-то внешним условиям. Например, 10 линий, продукция поступает хаотически, некие датчики на входе включают эти битики, некие датчики на выходе отключают.
Задача - расчет количества включеных/выключеных. Т.е. в неком регистре надо получить число.

Приблизим к реальности. Есть 10 линий, на входе каждой стоит оптический датчик, надо "мониторить", сколько датчиков сейчас выдают 1-ку. Какие - не важно. Важно - количество.
И, естественно, код должен быть сразу для n.

И хотелось бы добавить:
1. Решение у меня есть, но не уверен, что оно оптимальное. Признаюсь, задаю задачку в надежде, что кто-то предложит что-то супер интересное.
2. Уважаемый ivgtrk, пожалуйста, не надо сюда плодить кучу сообщение, которые к делу не имеют никакого отношения. Без обид. )



Автор: Sergei Troizky 12.04.2014 - 17:46

Цитата(lkobets @ 12.04.2014 - 15:43) *
Решение у меня есть, но не уверен, что оно оптимальное. Признаюсь, задаю задачку в надежде, что кто-то предложит что-то супер интересное.

Надеюсь, задача не вызвана незнанием о существовании инструкции SUM.
И, хотелось бы знать критерии интересности.

Автор: ivgtrk 13.04.2014 - 15:51

Цитата(lkobets @ 12.04.2014 - 19:43) *
2. Уважаемый ivgtrk, пожалуйста, не надо сюда плодить кучу сообщение, которые к делу не имеют никакого отношения. Без обид. )

Уважаемый lkobets, и тем не менее, Вы сами же спровоцировали появление этого моего сообщения, "не относящегося к делу", о недопустимости которых меня же и просите. Без обид. Неплохо бы, для начала, прежде чем упоминать подобное - разобраться для себя, чем (кем) были вызваны, и по какому поводу те или иные мои посты "не по делу". На подобные безосновательные выпады я просто обязан отреагировать, уж простите. Или же будьте добры привести примеры того, о чем утверждаете. Я что то не припомню за собой таких деяний, касательно поставленных задач: плодить кучу сообщение, которые к делу не имеют никакого отношения.

Что касается же Вашей задачи - на наиболее прагматичное (читай - простое и эффективное) решение, Вам дали намек в предыдущем посте.

Автор: Sergei Troizky 15.04.2014 - 04:46

Цитата(Sergei Troizky @ 12.04.2014 - 17:46) *
Надеюсь, задача не вызвана незнанием о существовании инструкции SUM.
И, хотелось бы знать критерии интересности.

А в ответ- тишина.
Ладно, предположим, у Вас FX1S либо FX1N, и инструкция SUM недоступна.
Тогда, можно так:
LD M8000
RST D0
RST Z
FOR K10
LD M8000
MOV K1X20Z K1M0
INC Z
LD M0
INC D0
NEXT
Опрашиваются 10 последовательных входов, начиная с X20, результат- в D0.
Программа будет также затрагивать биты M0-M3.

Автор: lkobets 15.04.2014 - 16:56

Цитата
Надеюсь, задача не вызвана незнанием о существовании инструкции SUM.


Признаюсь, инструкцию упустил.
Но в любом случае, как было выше сказано, для 1S, 1N задача остается актуальной (мануал уже почитал).

Цитата
Тогда, можно так:
LD M8000
RST D0
RST Z
FOR K10
LD M8000
MOV K1X20Z K1M0
INC Z
LD M0
INC D0
NEXT
Опрашиваются 10 последовательных входов, начиная с X20, результат- в D0.
Программа будет также затрагивать биты M0-M3.


Цитата
И, хотелось бы знать критерии интересности.


Интересно, реально ли решить без использования индексных регистров. И, естественно, без инструкции SUM.

Автор: m_by 16.04.2014 - 09:05

Можно топорно ...
- обнулить счётчик бит (например D0) в начале программы
- добавить на каждый бит отдельно inc D0
- в конце программы D0 перенести в любую ячейку, которая и будет всегда содержать сумму активных

Автор: Sergei Troizky 21.04.2014 - 21:20

Цитата(m_by @ 16.04.2014 - 09:05) *
Можно топорно ...
- обнулить счётчик бит (например D0) в начале программы
- добавить на каждый бит отдельно inc D0
- в конце программы D0 перенести в любую ячейку, которая и будет всегда содержать сумму активных

При заданном объеме задачи (10 бит), и даже где-то до 30-ти бит, я именно так бы и сделал.
Не стоит оно организации цикла. Кроме того, адреса наблюдаемых входов смогут быть совершенно произвольными и в любом порядке.
И будут впрямую мониториться на экране, что тоже удобно.
Последний пункт в цитате- лишний, если значение полностью вычисляется до его использования.


Цитата(lkobets @ 15.04.2014 - 16:56) *
Интересно, реально ли решить без использования индексных регистров. И, естественно, без инструкции SUM.

Извольте:
LD M8000
RST D0
DWAND K8X0 HFFFFFFFF K8M100 'Скопировать желаемые входы в буфер через маску, в пределах 32-х последовательных входов.
FOR K32 'Проделать нижеследующее столько раз, какова длина буфера (не путать с количеством наблюдаемых входов).
LD M100 'Посчитать включенный младший бит буфера.
INC D0
LD M8000
SFTR M8001 M100 K32 K1 'Сдвинуть биты буфера, записав в старший бит ноль.
NEXT
Можно использовать и более длинный буфер, сформировав его более чем одной инструкцией.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)