PDA

Просмотр полной версии : Как это реализовать??



Вова13
08.10.2017, 16:25
Добрый день,прошу "подкинуть идею" .Есть четыре насоса,ротация по времени (один в работе остальные "ждут") ,а так же возможность выводить из каскада насосы ,которые в ремонте или аварии.
С переключением по времени проблем как бы не возникло а вот с выводом ремонтных насосов из каскада ,вот ту споткнулся.
Вопрос:как организовать алгоритм когда аварийном насосу присваивается число "3",второму аварийному число "2" те которые остались в каскаде "0" и "1"
Вот для примера картинки.
33532 на первом рисунке аварийных и ремонтных насосов нет,выходы = 0,1,2,3
33533 на втором рисунке аварийный насос №1 ему присваивается число 3
33534 на третьем рисунке аварийных насосов два(№1 и №2)им присваивается число 2 и 3 соответственно
33535 на это рисунке аварийный насос №2 и ему присваивается "3"


Вот в общем что нужно соорудить,а знаний не хватает

rovki
08.10.2017, 16:31
По моему не надо переприсваивать номера .На ПР такая задача решалась .Если 2й насос в ремонте ,то ротация 0,1,3, ,если 1,3 в ремонте то ротация 0,2,,если в ремонте 123 то работает один насос без ротации. итд.

Вова13
08.10.2017, 16:52
В моем случае нужно выводить неисправный на последнее место.
TRAB считает количество времени.По заданному времени "PV3" в данном случае это время =5 "НН" прибавляет единицу.
Счетчик CTU1 отсчитывает до уставки "pv4"(которая зависит от количества работающих насосов (от 4 при всех работающих ,до 0 при всех аварийных)
выход CTU1 (СТ1) меняется, соответственно происходит переключение насосов
33536

Вова13
08.10.2017, 16:54
По моему не надо переприсваивать номера .На ПР такая задача решалась .Если 2й насос в ремонте ,то ротация 0,1,3, ,если 1,3 в ремонте то ротация 0,2,,если в ремонте 123 то работает один насос без ротации. итд.

А можно где то посмотреть как это решалось на ПР?

Вова13
08.10.2017, 17:09
Массив структур/фб для насосов. Внешний монитор их включает/выключает. И без разницы - 1 из 4, 2 из 3, 3 из 7 - это тупо пользовательские настройки.

:confused: ))) Честно говоря Вы меня еще больше "загнали" во тьму.
Можно ли ваши слова перевести на язык CFC ???

Вова13
08.10.2017, 17:18
Про 2 зимой и один летом это тоже предусмотрено.
Я не понимаю сути Вами сказанного .Вы мне говорите,что моя задумка не правильна и пользуйся готовыми ФБ для насосов???Или что то другое???

Вова13
08.10.2017, 17:27
Хорошо(забудем про насосы),представим что мне нужно получить на выходе блока "PROBA",рис 1-4 числа 0,1,2,3 при определенных комбинациях входов .Как описано в первом посте №1.
Как это можно сделать???

Вова13
08.10.2017, 17:44
А если 0,1,2,3,4 ? 0,1...10 ?
Есть массив насосов которые могут сами отключится (авария/караул устал/..).
Внешний монитор считает сколько работает и ждет, и добавляет/убавляет до заданного кол-ва. Выборка по счетчикам наработал/наотдыхался в каждом насосе.

Уважаемый Валенок,но мне не нужно 5,6,7 и т.д ,мне нужно 0,1,2,3 Подскажите как это можно реализовать если это возможно.Или перенаправьте , туда где можно почитать об этом.
ПС стесняюсь спросить ,что Вы называете "Внешним монитором"?
Я использую указанную мною схему,потому что она(по моему мнению )работает без проблем при пропадании питания ,программа ,при востановлении начинает работать с того места ,где остановилась.
Использовать готовые ФБ не хочу,т.к не знаю что внутри.Да и как то не интересно.

Eugene.A
08.10.2017, 17:47
Добрый день,прошу "подкинуть идею" .Есть четыре насоса,ротация по времени (один в работе остальные "ждут") ,а так же возможность выводить из каскада насосы
А я почему-то всегда думал, что работа в каскаде предполагает, что количество работающих насосов определяется необходимостью поддержания параметра - давления, расхода, уровня, а ротация, выравнивание наработки - это уже вторично, поверх основной задачи. А оно вон как, оказывается... День, ночь...

Вова13
08.10.2017, 17:53
А я почему-то всегда думал, что работа в каскаде предполагает, что количество работающих насосов определяется необходимостью поддержания параметра - давления, расхода, уровня, а ротация, выравнивание наработки - это уже вторично, поверх основной задачи. А оно вон как, оказывается... День, ночь...

В данном случае первично переключение,т.к. насосы включаются через ПП и после пуска работают на 100%

Вова13
08.10.2017, 17:56
Не нашел про изменение задания на 1..2 штуки

))) Мой основной вопрос,про то,как по четырем проводам(входам)блока "PROBA" ,на выходе получать числа 0,1,2,3

Вова13
08.10.2017, 17:59
У меня ощущение ,что тема раздуется страниц на 10,и я в конце концов решу что не стоит придумывать что то ,а лучше пользоваться библиотеками ОСКАТ и тихо ,вечерами почитывать форум:)

Вова13
08.10.2017, 18:05
Так я ж "не знаю что внутри". И зачем вообще получать числа ?

Внутри пусто,я этот блок создал для примера,для описания того что мне нужно.

Вова13
08.10.2017, 18:11
Числа нужны для того ,чтобы включать требуемый выход(сравнивать с счетчиком)
33537
на рисунке указанно красными стрелками.
В случае аварии или ремонта насоса ему присваивается число 3,а счетчик начинает считать не до 4 ,а до 3 и насос не участвует в алгоритме переключения

Вова13
08.10.2017, 19:51
Как то так,но правда очень топорно,хотелось бы по изящнее.
33538

Вова13
08.10.2017, 22:27
Ну....не методом научного тыка подбирать числа ,думал может есть какая то система

Вова13
08.10.2017, 23:01
Ув.Валенок как бы Вы вы организовали алгоритм?( Прошу не схему а ход Ваших мыслей).
Мой алгоритм работает ровно так ,как я и хотел.Только на одном насосе.Вот подошел к месту где нужно включить два насоса (Зимой).
В моем представлении алгоритм таков:
Лето-включаем автоматический режим,счетчик отсчитывает заданное время, через которое произойдет переключение на другой насос.Если какой то насос находится в аварии(не сработал датчик перепада давления) или в ремонте(кнопкой со СКАДА) программа выводит этот насос(ы) из общего алгоритма.
Это я уже реализовал.
Зима-Тот же алгоритм,только насосы включаются по два.1 и 2 ,2 и 3 и т.д. Если ,к примеру включились насосы 1 и 2 ,но №2 перешел в режим авария включается следующий насос,№3 .
Вот это еще предстоит сделать.
Спасибо

Вова13
08.10.2017, 23:20
А как предлагаете оценивать кто больше устал а кто меньше.На каждого канадца таймер ставить?

Вова13
08.10.2017, 23:22
И я хотел бы что бы они работали по очереди 1,2,3,4 ,а не как придется по наработке 3,1,4,2

melky
08.10.2017, 23:45
У меня один вопрос, вам не все равно кто из них 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 насосы еще новые.

Уточните, пожалуйста, какой из вариантов Вам подходит (или опишите свой).
Постараемся помочь.

Вова13
09.10.2017, 21:17
Здравствуйте
Алгоритмы меня устраивают ,я пока не придумал ка их воплотить в жизнь.
Мой блок (как я представляю )должен быть таким:

Входы

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

Вова13
09.10.2017, 21:28
Каждый уважающий себя канадец завсегда может обзавестись часами.
В крайнем случае - записать на ладошке когда вышел на работу или бросил тачку.

А если у двоих (у второго и третьего) время наработки одинаковое,какой должен включится после первого??

melky
09.10.2017, 21:36
Кстати тоже не заморачивался бы с точным временем наработки. Любое устройство требует обслуживания и время наработки в среднем у исправного оборудования будет примерно равным после истечения длительного срока.
В вашем случае задача решаема, но смысл тратить на нее столько времени ? Если какой-то насос вдруг отработает явно больше, просто выключите его на некоторое время из системы, сделайте обслуживание и все.

з.ы. на ПР бы отличный макрос от AI! но реализовать его на ПЛК я не смог, из-за "явных обратных связей" ПР, кривовато оно работает.. на CDS такой "фичи" нет...

Вова13
09.10.2017, 21:41
У меня один вопрос, вам не все равно кто из них 1, кто 2 а кто 3 ? ну нафига себе (и насосам) забивать голову ненужной нумерацией по порядку ?
Есть.
1 - количество насосов - банальная битовая маска
2. - аварийный или остановленный (опустили автомат питания с допконтактом, выбило по кз и т.д.) исключаем из битовой маски
3. остальные, кто в работе, в битовой маске включены и меняются по времени из включенных
4. при необходимости добавляем второй, третий опять же из включенных в битовой маске.

А можно хоть скрин с кусочком программы как это сделать в CFC. или в чем другом ,хоть для ПР.

melky
09.10.2017, 21:46
для вашего случая программы нет. Делал на ПЛК63 для ротации кондиционеров методом отключения их от сети. как раз использовал принцип битовой маски.
Для ПР ищите в Макросах соответствующей темы Ротация8, если сможете его перепилить для CDS будет замечательно.

Вова13
09.10.2017, 21:46
Кстати тоже не заморачивался бы с точным временем наработки. Любое устройство требует обслуживания и время наработки в среднем у исправного оборудования будет примерно равным после истечения длительного срока.
В вашем случае задача решаема, но смысл тратить на нее столько времени ? Если какой-то насос вдруг отработает явно больше, просто выключите его на некоторое время из системы, сделайте обслуживание и все.

з.ы. на ПР бы отличный макрос от AI! но реализовать его на ПЛК я не смог, из-за "явных обратных связей" ПР, кривовато оно работает.. на CDS такой "фичи" нет...


Выравнивать насосы по времени нароботки-такой цели нет .Нужно только что бы насосы просто переключались через определенное время.Время считается только у ведущего насоса.Если врключается резервный насос и отработает 20-40 часов,меня это время не интересует.

Если в работе два насоса (1и2)а фактическое их время наработки 500 и 800 часов соответственно,а задание по времени 240 часов,то оба насоса должны отработать 240 часов и переключится на (например 2 и 3)

Вова13
09.10.2017, 21:57
для вашего случая программы нет. Делал на ПЛК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

melky
11.10.2017, 22:54
Василий Кашуба, речь о переносе на CodeSys, может не заработать...

Василий Кашуба
11.10.2017, 23:10
Василий Кашуба, речь о переносе на CodeSys, может не заработать...
Я это знаю, переносил некоторые проекты.

Владимир Ситников
11.10.2017, 23:28
Функциональный блок Pump, предназначен для управления насосом и подсчета времени наработки насоса. Нужен для работы программы управления насосами.
Программа PumpControl_PRG предназначена для управления насосами в соответствии с Вашим алгоритмом....
Если возникнут вопросы\пожелания - пишите, помогу.

Не троллинга ради, а серьёзный вопрос: можете пояснить зачем наработку вы считаете "поминутно"?
Почему не сделать просто переменную со "временем старта" и, соответственно, считать наработку как "текущее время"-"время старта"?

Вова13
12.10.2017, 00:04
Добрый день!
Выпала свободная минутка и реализовал алгоритм управления, соответствующий Вашему запросу.

В приложении к посту алгоритм работы блока и проект, в котором он реализован.
Проект состоит из 2х блоков:

Функциональный блок Pump, предназначен для управления насосом и подсчета времени наработки насоса. Нужен для работы программы управления насосами.
Программа PumpControl_PRG предназначена для управления насосами в соответствии с Вашим алгоритмом.

и перечисления PUMP_CONTROL_ERRORS содержащего все возможные ошибки, которые могут возникнуть в процессе работы программы

Общее время наработки насосов хранится в энергонезависимой памяти.

Все, что Вам нужно:
1) Перенести в Ваш проект ФБ, программу и перечисление.
Сделать это можно как при помощи импорта\экспорта, так и при помощи простого копирования;
2) В Вашей основной программе вызывать программу PumpControl_PRG, предварительно передавая ей на входы состояния насосов и настройк, а так же подключить выходы программы к выходам ПЛК;
3) Тщательно протестировать программу на соответствие требуемому алгоритму работы.

Если возникнут вопросы\пожелания - пишите, помогу.

Здравствуйте,спасибо за готовый блок,попробую разобраться с его "начинкой ".Вставлять Ваш блок в проект не буду,а изучить и сделать на его примере что то свое попробую.

Осинский Алексей
12.10.2017, 08:01
Почему не сделать просто переменную со "временем старта" и, соответственно, считать наработку как "текущее время"-"время старта"?
Для подсчета общего времени наработки такой способ не подойдет - все равно придется запоминать с некоторой дискретностью.
А поскольку уже таймер под это дело заведен - то почему бы и наработку с момента запуска не инкрементировать по сигналу таймера?
Плюсом такого решения можно назвать меньше зависимостей от библиотек.


Не троллинга ради
Аргументированная критика и вопросы всегда приветствуются.

melky
12.10.2017, 09:11
Владимир Ситников в вашем варианте еще переход через ноль придется отслеживать.... Простой счетчик в несколько раз проще, за одним исключением, они зараза все 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) и т.п.)

petera
12.10.2017, 11:57
Владимир Ситников в вашем варианте еще переход через ноль придется отслеживать.... Простой счетчик в несколько раз проще, за одним исключением, они зараза все 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, похоже, работает.

Понял. Спасибо!

capzap
09.09.2018, 12:44
Апну тему, заголовок подходящий.
Собственно как реализовать, то что на гифке, с учетом того что основная матрица и матрица ядра это массивы интов?

Scream
09.09.2018, 13:01
Апну тему, заголовок подходящий.
Собственно как реализовать, то что на гифке, с учетом того что основная матрица и матрица ядра это массивы интов?

Для чего если не секрет?

Сергей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/

capzap
10.09.2018, 23:24
вот такой код получился

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));