Просмотр полной версии : Как это реализовать??
Добрый день,прошу "подкинуть идею" .Есть четыре насоса,ротация по времени (один в работе остальные "ждут") ,а так же возможность выводить из каскада насосы ,которые в ремонте или аварии.
С переключением по времени проблем как бы не возникло а вот с выводом ремонтных насосов из каскада ,вот ту споткнулся.
Вопрос:как организовать алгоритм когда аварийном насосу присваивается число "3",второму аварийному число "2" те которые остались в каскаде "0" и "1"
Вот для примера картинки.
33532 на первом рисунке аварийных и ремонтных насосов нет,выходы = 0,1,2,3
33533 на втором рисунке аварийный насос №1 ему присваивается число 3
33534 на третьем рисунке аварийных насосов два(№1 и №2)им присваивается число 2 и 3 соответственно
33535 на это рисунке аварийный насос №2 и ему присваивается "3"
Вот в общем что нужно соорудить,а знаний не хватает
По моему не надо переприсваивать номера .На ПР такая задача решалась .Если 2й насос в ремонте ,то ротация 0,1,3, ,если 1,3 в ремонте то ротация 0,2,,если в ремонте 123 то работает один насос без ротации. итд.
В моем случае нужно выводить неисправный на последнее место.
TRAB считает количество времени.По заданному времени "PV3" в данном случае это время =5 "НН" прибавляет единицу.
Счетчик CTU1 отсчитывает до уставки "pv4"(которая зависит от количества работающих насосов (от 4 при всех работающих ,до 0 при всех аварийных)
выход CTU1 (СТ1) меняется, соответственно происходит переключение насосов
33536
По моему не надо переприсваивать номера .На ПР такая задача решалась .Если 2й насос в ремонте ,то ротация 0,1,3, ,если 1,3 в ремонте то ротация 0,2,,если в ремонте 123 то работает один насос без ротации. итд.
А можно где то посмотреть как это решалось на ПР?
Массив структур/фб для насосов. Внешний монитор их включает/выключает. И без разницы - 1 из 4, 2 из 3, 3 из 7 - это тупо пользовательские настройки.
:confused: ))) Честно говоря Вы меня еще больше "загнали" во тьму.
Можно ли ваши слова перевести на язык CFC ???
Про 2 зимой и один летом это тоже предусмотрено.
Я не понимаю сути Вами сказанного .Вы мне говорите,что моя задумка не правильна и пользуйся готовыми ФБ для насосов???Или что то другое???
Хорошо(забудем про насосы),представим что мне нужно получить на выходе блока "PROBA",рис 1-4 числа 0,1,2,3 при определенных комбинациях входов .Как описано в первом посте №1.
Как это можно сделать???
А если 0,1,2,3,4 ? 0,1...10 ?
Есть массив насосов которые могут сами отключится (авария/караул устал/..).
Внешний монитор считает сколько работает и ждет, и добавляет/убавляет до заданного кол-ва. Выборка по счетчикам наработал/наотдыхался в каждом насосе.
Уважаемый Валенок,но мне не нужно 5,6,7 и т.д ,мне нужно 0,1,2,3 Подскажите как это можно реализовать если это возможно.Или перенаправьте , туда где можно почитать об этом.
ПС стесняюсь спросить ,что Вы называете "Внешним монитором"?
Я использую указанную мною схему,потому что она(по моему мнению )работает без проблем при пропадании питания ,программа ,при востановлении начинает работать с того места ,где остановилась.
Использовать готовые ФБ не хочу,т.к не знаю что внутри.Да и как то не интересно.
Eugene.A
08.10.2017, 17:47
Добрый день,прошу "подкинуть идею" .Есть четыре насоса,ротация по времени (один в работе остальные "ждут") ,а так же возможность выводить из каскада насосы
А я почему-то всегда думал, что работа в каскаде предполагает, что количество работающих насосов определяется необходимостью поддержания параметра - давления, расхода, уровня, а ротация, выравнивание наработки - это уже вторично, поверх основной задачи. А оно вон как, оказывается... День, ночь...
А я почему-то всегда думал, что работа в каскаде предполагает, что количество работающих насосов определяется необходимостью поддержания параметра - давления, расхода, уровня, а ротация, выравнивание наработки - это уже вторично, поверх основной задачи. А оно вон как, оказывается... День, ночь...
В данном случае первично переключение,т.к. насосы включаются через ПП и после пуска работают на 100%
Не нашел про изменение задания на 1..2 штуки
))) Мой основной вопрос,про то,как по четырем проводам(входам)блока "PROBA" ,на выходе получать числа 0,1,2,3
У меня ощущение ,что тема раздуется страниц на 10,и я в конце концов решу что не стоит придумывать что то ,а лучше пользоваться библиотеками ОСКАТ и тихо ,вечерами почитывать форум:)
Так я ж "не знаю что внутри". И зачем вообще получать числа ?
Внутри пусто,я этот блок создал для примера,для описания того что мне нужно.
Числа нужны для того ,чтобы включать требуемый выход(сравнивать с счетчиком)
33537
на рисунке указанно красными стрелками.
В случае аварии или ремонта насоса ему присваивается число 3,а счетчик начинает считать не до 4 ,а до 3 и насос не участвует в алгоритме переключения
Как то так,но правда очень топорно,хотелось бы по изящнее.
33538
Ну....не методом научного тыка подбирать числа ,думал может есть какая то система
Ув.Валенок как бы Вы вы организовали алгоритм?( Прошу не схему а ход Ваших мыслей).
Мой алгоритм работает ровно так ,как я и хотел.Только на одном насосе.Вот подошел к месту где нужно включить два насоса (Зимой).
В моем представлении алгоритм таков:
Лето-включаем автоматический режим,счетчик отсчитывает заданное время, через которое произойдет переключение на другой насос.Если какой то насос находится в аварии(не сработал датчик перепада давления) или в ремонте(кнопкой со СКАДА) программа выводит этот насос(ы) из общего алгоритма.
Это я уже реализовал.
Зима-Тот же алгоритм,только насосы включаются по два.1 и 2 ,2 и 3 и т.д. Если ,к примеру включились насосы 1 и 2 ,но №2 перешел в режим авария включается следующий насос,№3 .
Вот это еще предстоит сделать.
Спасибо
А как предлагаете оценивать кто больше устал а кто меньше.На каждого канадца таймер ставить?
И я хотел бы что бы они работали по очереди 1,2,3,4 ,а не как придется по наработке 3,1,4,2
У меня один вопрос, вам не все равно кто из них 1, кто 2 а кто 3 ? ну нафига себе (и насосам) забивать голову ненужной нумерацией по порядку ?
Есть.
1 - количество насосов - банальная битовая маска
2. - аварийный или остановленный (опустили автомат питания с допконтактом, выбило по кз и т.д.) исключаем из битовой маски
3. остальные, кто в работе, в битовой маске включены и меняются по времени из включенных
4. при необходимости добавляем второй, третий опять же из включенных в битовой маске.
Осинский Алексей
09.10.2017, 09:45
Добрый день,прошу "подкинуть идею" .Есть четыре насоса,ротация по времени (один в работе остальные "ждут") ,а так же возможность выводить из каскада насосы ,которые в ремонте или аварии.
С переключением по времени проблем как бы не возникло а вот с выводом ремонтных насосов из каскада ,вот ту споткнулся.
Вопрос:как организовать алгоритм когда аварийном насосу присваивается число "3",второму аварийному число "2" те которые остались в каскаде "0" и "1"
Вот для примера картинки.
33532 на первом рисунке аварийных и ремонтных насосов нет,выходы = 0,1,2,3
33533 на втором рисунке аварийный насос №1 ему присваивается число 3
33534 на третьем рисунке аварийных насосов два(№1 и №2)им присваивается число 2 и 3 соответственно
33535 на это рисунке аварийный насос №2 и ему присваивается "3"
Вот в общем что нужно соорудить,а знаний не хватает
Добрый день.
Я вижу, что не один из предложенных алгоритмов Вас не устроил.
Распишите пожалуйста как можно более подробно словами задачу, которую Вы решаете.
Если я не прав, поправьте пожалуйста. Я вижу задачу так:
Есть блок управления N насосами.
Входные параметры блока:
Разрешить работу;
Время ротации;
Запретить запуск насоса 1;
Запретить запуск насоса 2;
...
Запретить запуск насоса N;
Выходные параметры:
Ошибка - нет исправных насосов;
Состояние насоса 1;
Состояние насоса 2;
...
Состояние насоса N;
В начальный момент времени все насосы остановлены и работа блока запрещена.
1) Разрешили работу блока;
1.1) Включился первый из списка насос, у которого не запрещена работа;
1.2) Если истекло время ротации или работу текущего насоса запретили
1.2.1) отключить текущий насос;
1.2.2) включить следующий насос из списка у которого разрешена работа;
1.3) Если в списке нет исправных насосов - включить выход "Ошибка".
2) Запретили работу блока
2.1) Отключить текущий насос.
3) Опять разрешили работу блока
аналогично 1.1 - 1.3
Если я правильно понял, то Валенок предлагает Вам п.1. переделать таким образом:
1.1) Включить насос с минимальной наработкой и незапрещенной работой;
1.2) Если истекло время ротации или работу текущего насоса запретили:
1.2.1) отключить текущий насос;
1.2.2) включить насос с минимальной наработкой и незапрещенной работой;
1.3) Если в списке нет исправных насосов - включить выход "Ошибка".
Такой алгоритм используется чаще и позволяет избежать ситуации когда у "первого" насоса ресурс уже выработан, а 2-N насосы еще новые.
Уточните, пожалуйста, какой из вариантов Вам подходит (или опишите свой).
Постараемся помочь.
Здравствуйте
Алгоритмы меня устраивают ,я пока не придумал ка их воплотить в жизнь.
Мой блок (как я представляю )должен быть таким:
Входы
1.Разрешение на включение(Режим Автомат)
2.Сигнал с датчика перепада давления насоса №1
3.Сигнал с датчика перепада давления насоса №2
4.Сигнал с датчика перепада давления насоса №3
5.Сигнал с датчика перепада давления насоса №4
6.Четыре сигнала(BOOL или байт или ВОРД) насосы1..4 в ремонте.
7.Задание времени переключения (в часах)-DWORD
8.Количество насосов в работе (1 или 2)
Выходы
1.Четыре дискретных выхода включения насосов
2.Четыре дискретных выхода аварии насосов
3.выход(информация о прошедшем времени ведущего насоса)
Алгоритм ...при включении входа "Автоматический рeжим" (тумблер на щите) и выбора (со СКАДА) количества насосов (например один )включается в работу насос(ведущий) и работает до достижения уставки по времени.Если во время работы произошла авария (пропал сигнал с датчика перепада давления) происходит переключение на насос,следующий за ним(например №2),если он не в ремонте .И так далее по счету..Если во время работы нет насосов в ремонте и не происходит аварий,ротация происходит по заданному времени.(Аналог работы САУ МП).
При выборе режима "в работе два насоса алгоритм повторяется,только в работе одновременно два насоса(1 и 2 ,2 и 3,1 и 3 и т.д.)
С двумя насосами (один рабочий второй резервный) я это сделал.
Четыре насоса (в режиме "в работе один насос")тоже осилил,правда "ГРОМОЗДКО",а вот теперь застрял на режиме "в работе два насоса".
При возникновении аварии насоса это отображается у диспетчера,он снимает аварию путем выключения режима "Автомат" и снова его включения.Если аварию устранить не удается насос переводится в режим "Ремонт" и насос выводится из алгоритма.
Для подсчета времени наработки я использую блок TRAB он меня устраивает тем, при отключении питания он сохраняет время наработки и программа продолжается с того же места ,где отключилась.
33583
Каждый уважающий себя канадец завсегда может обзавестись часами.
В крайнем случае - записать на ладошке когда вышел на работу или бросил тачку.
А если у двоих (у второго и третьего) время наработки одинаковое,какой должен включится после первого??
Кстати тоже не заморачивался бы с точным временем наработки. Любое устройство требует обслуживания и время наработки в среднем у исправного оборудования будет примерно равным после истечения длительного срока.
В вашем случае задача решаема, но смысл тратить на нее столько времени ? Если какой-то насос вдруг отработает явно больше, просто выключите его на некоторое время из системы, сделайте обслуживание и все.
з.ы. на ПР бы отличный макрос от AI! но реализовать его на ПЛК я не смог, из-за "явных обратных связей" ПР, кривовато оно работает.. на CDS такой "фичи" нет...
У меня один вопрос, вам не все равно кто из них 1, кто 2 а кто 3 ? ну нафига себе (и насосам) забивать голову ненужной нумерацией по порядку ?
Есть.
1 - количество насосов - банальная битовая маска
2. - аварийный или остановленный (опустили автомат питания с допконтактом, выбило по кз и т.д.) исключаем из битовой маски
3. остальные, кто в работе, в битовой маске включены и меняются по времени из включенных
4. при необходимости добавляем второй, третий опять же из включенных в битовой маске.
А можно хоть скрин с кусочком программы как это сделать в CFC. или в чем другом ,хоть для ПР.
для вашего случая программы нет. Делал на ПЛК63 для ротации кондиционеров методом отключения их от сети. как раз использовал принцип битовой маски.
Для ПР ищите в Макросах соответствующей темы Ротация8, если сможете его перепилить для CDS будет замечательно.
Кстати тоже не заморачивался бы с точным временем наработки. Любое устройство требует обслуживания и время наработки в среднем у исправного оборудования будет примерно равным после истечения длительного срока.
В вашем случае задача решаема, но смысл тратить на нее столько времени ? Если какой-то насос вдруг отработает явно больше, просто выключите его на некоторое время из системы, сделайте обслуживание и все.
з.ы. на ПР бы отличный макрос от AI! но реализовать его на ПЛК я не смог, из-за "явных обратных связей" ПР, кривовато оно работает.. на CDS такой "фичи" нет...
Выравнивать насосы по времени нароботки-такой цели нет .Нужно только что бы насосы просто переключались через определенное время.Время считается только у ведущего насоса.Если врключается резервный насос и отработает 20-40 часов,меня это время не интересует.
Если в работе два насоса (1и2)а фактическое их время наработки 500 и 800 часов соответственно,а задание по времени 240 часов,то оба насоса должны отработать 240 часов и переключится на (например 2 и 3)
для вашего случая программы нет. Делал на ПЛК63 для ротации кондиционеров методом отключения их от сети. как раз использовал принцип битовой маски.
Для ПР ищите в Макросах соответствующей темы Ротация8, если сможете его перепилить для CDS будет замечательно.
Мне и не нужно для насосов,можно для чего угодно,что бы понять на чем вы это делаете,на каких элементах(на простой логике и и триггерах или что еще там есть).Как Вы использовали принцип битовой маски
Осинский Алексей
11.10.2017, 19:33
Здравствуйте
Алгоритмы меня устраивают ,я пока не придумал ка их воплотить в жизнь.
Добрый день!
Выпала свободная минутка и реализовал алгоритм управления, соответствующий Вашему запросу.
В приложении к посту алгоритм работы блока и проект, в котором он реализован.
Проект состоит из 2х блоков:
Функциональный блок Pump, предназначен для управления насосом и подсчета времени наработки насоса. Нужен для работы программы управления насосами.
Программа PumpControl_PRG предназначена для управления насосами в соответствии с Вашим алгоритмом.
и перечисления PUMP_CONTROL_ERRORS содержащего все возможные ошибки, которые могут возникнуть в процессе работы программы
Общее время наработки насосов хранится в энергонезависимой памяти.
Все, что Вам нужно:
1) Перенести в Ваш проект ФБ, программу и перечисление.
Сделать это можно как при помощи импорта\экспорта, так и при помощи простого копирования;
2) В Вашей основной программе вызывать программу PumpControl_PRG, предварительно передавая ей на входы состояния насосов и настройк, а так же подключить выходы программы к выходам ПЛК;
3) Тщательно протестировать программу на соответствие требуемому алгоритму работы.
Если возникнут вопросы\пожелания - пишите, помогу.
UPD: 12.10.2017 12:20
Устранил ошибку, при которой система не восстанавливалась после срабатывания ошибки PUMP_TOO_FEW_PUMPS.
UPD: 12.10.2017 16:40
Добавил описание внутренним переменным.
Устранил ошибку при которой насос мог отключиться т.к. проработал дольше времени, заданного оператором,
а в следующем цикле снова включиться т.к. у него минимальное время наработки. Что привело бы к ненужным "дерганиям" выхода ПЛК.
Описание в архиве.
Василий Кашуба
11.10.2017, 19:48
Кстати тоже не заморачивался бы с точным временем наработки. Любое устройство требует обслуживания и время наработки в среднем у исправного оборудования будет примерно равным после истечения длительного срока.
В вашем случае задача решаема, но смысл тратить на нее столько времени ? Если какой-то насос вдруг отработает явно больше, просто выключите его на некоторое время из системы, сделайте обслуживание и все.
з.ы. на ПР бы отличный макрос от AI! но реализовать его на ПЛК я не смог, из-за "явных обратных связей" ПР, кривовато оно работает.. на CDS такой "фичи" нет...
Замените "обратные связи" на внутренние промежуточные переменные и получится задержка на один цикл.33624
Василий Кашуба, речь о переносе на CodeSys, может не заработать...
Василий Кашуба
11.10.2017, 23:10
Василий Кашуба, речь о переносе на CodeSys, может не заработать...
Я это знаю, переносил некоторые проекты.
Владимир Ситников
11.10.2017, 23:28
Функциональный блок Pump, предназначен для управления насосом и подсчета времени наработки насоса. Нужен для работы программы управления насосами.
Программа PumpControl_PRG предназначена для управления насосами в соответствии с Вашим алгоритмом....
Если возникнут вопросы\пожелания - пишите, помогу.
Не троллинга ради, а серьёзный вопрос: можете пояснить зачем наработку вы считаете "поминутно"?
Почему не сделать просто переменную со "временем старта" и, соответственно, считать наработку как "текущее время"-"время старта"?
Добрый день!
Выпала свободная минутка и реализовал алгоритм управления, соответствующий Вашему запросу.
В приложении к посту алгоритм работы блока и проект, в котором он реализован.
Проект состоит из 2х блоков:
Функциональный блок Pump, предназначен для управления насосом и подсчета времени наработки насоса. Нужен для работы программы управления насосами.
Программа PumpControl_PRG предназначена для управления насосами в соответствии с Вашим алгоритмом.
и перечисления PUMP_CONTROL_ERRORS содержащего все возможные ошибки, которые могут возникнуть в процессе работы программы
Общее время наработки насосов хранится в энергонезависимой памяти.
Все, что Вам нужно:
1) Перенести в Ваш проект ФБ, программу и перечисление.
Сделать это можно как при помощи импорта\экспорта, так и при помощи простого копирования;
2) В Вашей основной программе вызывать программу PumpControl_PRG, предварительно передавая ей на входы состояния насосов и настройк, а так же подключить выходы программы к выходам ПЛК;
3) Тщательно протестировать программу на соответствие требуемому алгоритму работы.
Если возникнут вопросы\пожелания - пишите, помогу.
Здравствуйте,спасибо за готовый блок,попробую разобраться с его "начинкой ".Вставлять Ваш блок в проект не буду,а изучить и сделать на его примере что то свое попробую.
Осинский Алексей
12.10.2017, 08:01
Почему не сделать просто переменную со "временем старта" и, соответственно, считать наработку как "текущее время"-"время старта"?
Для подсчета общего времени наработки такой способ не подойдет - все равно придется запоминать с некоторой дискретностью.
А поскольку уже таймер под это дело заведен - то почему бы и наработку с момента запуска не инкрементировать по сигналу таймера?
Плюсом такого решения можно назвать меньше зависимостей от библиотек.
Не троллинга ради
Аргументированная критика и вопросы всегда приветствуются.
Владимир Ситников в вашем варианте еще переход через ноль придется отслеживать.... Простой счетчик в несколько раз проще, за одним исключением, они зараза все 16-ти разрядные.
Осинский Алексей
12.10.2017, 10:47
в алгоритме не отражено что наработки нужно сохранять в файл когда прибавляем очередную минуту (любую единицу измерения) для того что если произойдет сброс программы наработка сохранилась
На текущий момент наработка сохраняется в RETAIN-памяти.
В описании (в моем посте) я это дополнительно указал. Не думаю, что в алгоритме это нужно указывать.
По поводу циклической записи файлов во внутреннюю память - я противник этого. Т.к. если система работает круглосуточно, то в конечном итоге мы израсходуем ресурс флеш-памяти.
Владимир Ситников
12.10.2017, 11:02
Программа PumpControl_PRG предназначена для управления насосами в соответствии с Вашим алгоритмом.
У вас ошибка в алгоритме: если наступит авария, то перестанут запускаться-останавливаться насосы. Даже рабочие.
Вот пример такого состояния (я его сделал через force write для переменных "pump ok", "pump disabled"):
33629
Видно, что "isRunning=FALSE" для всех насосов, есть 2 нормальных (3ий и 4ый), но система думает, что "TOO_FEW_PUMPS".
Перерисовал алгоритм (с сохранением этой же ошибки).
На перерисованной картинке эта проблема более заметна: заход в "запуск-останов" происходит только в безошибочном состоянии.
33630
Осинский Алексей
12.10.2017, 11:32
У вас ошибка в алгоритме: если наступит авария, то перестанут запускаться-останавливаться насосы. Даже рабочие.
Вот пример такого состояния (я его сделал через force write для переменных "pump ok", "pump disabled"):
33629
Видно, что "isRunning=FALSE" для всех насосов, есть 2 нормальных (3ий и 4ый), но система думает, что "TOO_FEW_PUMPS".
Перерисовал алгоритм (с сохранением этой же ошибки).
На перерисованной картинке эта проблема более заметна: заход в "запуск-останов" происходит только в безошибочном состоянии.
33630
Спасибо. Проверю и устраню.
Подскажите пожалуйста, в чем алгоритм рисовали?
Владимир Ситников
12.10.2017, 11:34
Спасибо. Проверю и устраню.
Подскажите пожалуйста, в чем алгоритм рисовали?
Программа тут: http://drakon.su/programma_is_drakon (на странице http://drakon.su/ ссылка на учебник (http://drakon.su/_media/01._parondzhanov_uchis_pisat_chitat_i_ponimat_algo ritmy.pdf) и т.п.)
Владимир Ситников в вашем варианте еще переход через ноль придется отслеживать.... Простой счетчик в несколько раз проще, за одним исключением, они зараза все 16-ти разрядные.
Какие глупости..
Если считать наработку как "текущее время"-"время старта", то для целочисленной арифметики все получается правильно даже если текущее время "перешло через 0"
melky Вы думаете, что в стандартном таймере отсчет времени как- то по другому сделан?
33637
ЗЫ.
Пример когда время "перешло через 0"
StartTime:= DWORD_TO_TIME(16#FFFFFFF0); (* 4 294 967,280 сек*)
EndTime:= DWORD_TO_TIME(0); (* 0 сек *)
EndTime_2:= DWORD_TO_TIME(1000); (* 1 сек *)
Work_Time1:= EndTime - StartTime;
Work_Time2:= EndTime_2 - StartTime;
Результат
33638
Осинский Алексей
12.10.2017, 12:22
Программа тут: http://drakon.su/programma_is_drakon (на странице http://drakon.su/ ссылка на учебник (http://drakon.su/_media/01._parondzhanov_uchis_pisat_chitat_i_ponimat_algo ritmy.pdf) и т.п.)
Спасибо за помощь в локализации ошибки.
Я обновил программу и алгоритм в предыдущем посте.
Отдельное спасибо за ссылки на программу - посмотрю вечером.
Владимир Ситников
12.10.2017, 12:33
Спасибо за помощь в локализации ошибки.
Я обновил программу и алгоритм в предыдущем посте.
Всё равно не работает. Схема не реагирует на pump ok / pump disabled.
Осинский Алексей
12.10.2017, 13:22
Всё равно не работает. Схема не реагирует на pump ok / pump disabled.
Перепроверил. и PumpOK и Disabled.
1) загрузил проект;
2) запустил на исполнение;
3) запустились насосы 1, 2;
4) Сымитировал аварию насоса 1 отключив Pump1OK;
5) Сработал выход Pump1Error, отключился Pump1Running, включился Pump3Running;
6) Отключил насос 3 выставив Pump3Disabled в TRUE;
7) Отключился Pump3Running, включился Pump4Running;
8) Отключил аварию насоса 1 выставив Pump1OK в TRUE;
9) Отключил насос 4 выставив Pump4Disabled в TRUE;
10) Отключился насос 4 и включился насос 1.
Судя по всему все отработало как и планировалось.
Опишите, пожалуйста, как повторить ошибку.
Владимир Ситников
12.10.2017, 13:49
Судя по всему все отработало как и планировалось.
Опишите, пожалуйста, как повторить ошибку.
Я пробовал менять значения в PROGRAM PumpControl_PRG -- почему-то там не работает. Вот это непонятно.
Если делать force write в plc_prg, похоже, работает.
Осинский Алексей
12.10.2017, 13:51
Я пробовал менять значения в PROGRAM PumpControl_PRG -- почему-то там не работает. Вот это непонятно.
Если делать force write в plc_prg, похоже, работает.
Понял. Спасибо!
Апну тему, заголовок подходящий.
Собственно как реализовать, то что на гифке, с учетом того что основная матрица и матрица ядра это массивы интов?
Апну тему, заголовок подходящий.
Собственно как реализовать, то что на гифке, с учетом того что основная матрица и матрица ядра это массивы интов?
Для чего если не секрет?
Сергей0308
10.09.2018, 13:05
Если конечно будет интересно, вот подобное для ОЛ делал:
http://www.owen.ru/forum/showthread.php?t=12691&page=41
Владимир Ситников
10.09.2018, 14:03
Возможно кто то подкинет еще идеи, но точно не планирую это делать на ОЛ и андроиде
А чем не подходит "метод цикла for"?
Владимир Ситников
10.09.2018, 15:25
почему не подходит, он таки как раз пока выигрывает по объему реализации. Может я не знаю о каких то еще вариантах, вот и спрашиваю
Цикл FOR наше всё.
Разумеется, тут может "напрягать", что ради вычисления каждой точки нужно целую матрицу обойти и сложить коэффициенты.
Но в случае небольших фильтров это не проблема.
Для ускорения используют преобразование Фурье и свёртку: https://habr.com/post/265781/
вот такой код получился
System.out.println("getConvolution");
int[] stuff = {7, 6, 5, 5, 6, 7, 6, 4, 3, 3, 4, 6, 5, 3, 2, 2, 3, 5, 5, 3, 2, 2, 3, 5, 6, 4, 3, 3, 4, 6, 7, 6, 5, 5, 6, 7};
int w = 6;
int h = 6;
int k = 0;
result = new int[w * h];
int count = 0;
for (int i = 0; i < stuff.length; i++) {
if ( (i / w) == 0) { // первый ряд матрицы
if ((i % w) == 0 || (i % w) == (w-1)) { // первая и последняя колонка
k = stuff[i] * 3; // сложили уголок
k += stuff[i + ((i % w) == 0?1:-1)] * -1;
k += stuff[i + w] * -1;
result[count] = k;
count++;
} else {
k = stuff[i] * 4;
k += stuff[i - 1] * -1;
k += stuff[i + 1] * -1;
k += stuff[i + w] * -1;
result[count] = k;
count++;
}
} else if ( (i / (w * (h-1))) > 0) {
if ((i % w) == 0 || (i % w) == (w-1)) {
k = stuff[i] * 3;
k += stuff[i + ((i % w) == 0?1:-1)] * -1;
k += stuff[i - w] * -1;
result[count] = k;
count++;
} else {
k = stuff[i] * 4;
k += stuff[i - 1] * -1;
k += stuff[i + 1] * -1;
k += stuff[i - w] * -1;
result[count] = k;
count++;
}
} else {
if ((i % w) == 0 || (i % w) == (w-1)) {
k = stuff[i] * 4;
k += stuff[i + ((i % w) == 0?1:-1)] * -1;
k += stuff[i + w] * -1;
k += stuff[i - w] * -1;
result[count] = k;
count++;
} else {
k = stuff[i] * 5;
k += stuff[i - 1] * -1;
k += stuff[i + 1] * -1;
k += stuff[i - w] * -1;
k += stuff[i + w] * -1;
result[count] = k;
count++;
}
}
System.out.println(Arrays.toString(result));
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot