или как вариант, в параметрах UMD вернуть режим в пункте work mode, а какой это перечитать документацию на конфигуратор
Вид для печати
или как вариант, в параметрах UMD вернуть режим в пункте work mode, а какой это перечитать документацию на конфигуратор
Промышленная автоматика тяготеет в сторону функциональности, надежности и консерватизма прежде всего, а потом уже всякие дизайнерские навороты. Что впрочем не значит что нельзя сделать красивый интерфейс с 3D мнемосхемой установки, в том числе и на СП3хх. Но нужно знать меру во-первых, во-вторых иметь немалый опыт. Многие конторы, занимающиеся разработкой установок имеют в штате отдельного дизайнера интерфейсов.
Вы уверены что вот так вот с нуля потянете и то и то? Или лучше сосредоточится на функциональности?
И да, что за установку автоматизируете, поделитесь?
"Кстати о птичках": Мультиплатформенное ПО Iridium Mobile как раз имеет приоритет в сторону дизайна и благодаря мощному редактору Iridium Studio, позволяет создавать весьма навороченные интерфейсы.
3D модель установки хотел сделать в виде окон и некоторых активных элементов (к примеру клапан или насос). К слову зачем ? Просто, как мы все знаем покупатель сначала покупает глазами, а качество исполнения и работоспособность гарантировать я думаю смогу. Возвращаясь к моему предыдущему вопросу, есть информация как использовать ПК взамен панели оператора (без связи через интернет и покупку доп. платного ПО) ?
Заранее спасибо за внимание !
Я не хочу использовать 3D модель как основу интерфейса (то есть она не будет крутиться в панели оператора) картинка будет статична, просто после создания 3D модели можно использовать разные ракурсы картинки и выделить на ней определенные активные зоны(например двигатель или клапан)
Установка предназначена для напыления серебра.
Подскажите, пожалуйста, по пользовательским типам данных. Правильно я понимаю, что структуру нельзя прописать в конфигурации входа плк, например "pump.flow" и придётся объявлять входы как простые переменные и тратить процессорное время на присваивание?
хм. Может не правильно высказался. Мне не дефайн нужен. Есть структура:
TYPE Tpump :(*Модель насоса*)
STRUCT
cmd_on:BOOL;
flow:BOOL;
flow_alarm:BOOL;
owerheat_alarm:BOOL;
oper_time:WORD;(*Время наработки*)
flow_delay:WORD;(*Задержка при старте перед определением сухого хода*)
END_STRUCT
END_TYPE
pump:Tpump;
Хочется без лишних присваиваний заставить плк писать дискретный вход в pump.flow
Опечатка, через интернет. Гарантировать могу т.к я курирую эту установку и при возникновении неисправности или недоработки (которая не вылезла в ходе тестирования) можно будет оперативно устранить.
Спасибо за ответы.
Спасибо, буду иметь ввиду.
Вроде как в конфигураторе вы только можете объявить переменные, но не можете обратиться к уже объявленной переменной в тексте программы.
Здравствуйте! У меня возможно глупый вопрос по действиям, никак не вкурю в них. Допустим у меня в проекте три программы, PROG1, PROG2 и PROG3. Друг друга они не вызывают, скажем все программы запускаются из конфигуратора задач. Я к PROG1 добавляю два действия DEISTV1 и DEISTV2, в которые копирую код PROG2 и PROG3, само собой из PROG1 они вызываться не будут, а вот из конфигуратора к ним обращаться как к PROG1, PROG1.DEISTV1 и PROG1.DEISTV2. Интересует вопрос, в чем будет отличие в плане работы программы, если программы отдельно и если программы засунуты в действие?
Здравствуйте! Вопрос такой: программа ПЛК использует счётчик времени, вызываемый TIME(). Производится вычисление интервала времени между текущим показанием TIME и записанным предыдущим. По описанию функций счётчик времени достигает 49d17h2m47s295ms (4194967295 ms). И что потом: он сбрасывается и начинает отсчёт с нуля? или что?
Это значит, что указанным способом (вычисление интервала времени между текущим показанием TIME и записанным предыдущим) можно измерять интервалы времени не более 49d17h2m47s295ms. Замечу, что это не зависит от начального значения TIME()
Если нужно больше, то используют часы реального времени и переменные DT(DateAndTime).
И ??
Вот у меня предыдущее значение записалось, допустим, PrevTime = 49d17h2m47s000ms (равное текущему показанию счёта). Следующее вычисление (интервал) - через 500 ms. "TiME() минус PrevTime". Какой будет результат ? TIME() будет дальше продолжать отсчёт и мне интервал нормально вычислит = 500 ms? Я то думал, что может перепрыгнуть через "0" и выдаст отрицательный результат.
"минус" 4194800000 ms. Или "минус" 49d17h0m00s000ms.
А вообще то должен выдать ошибку, т.к. UDINT в диапазоне от 0 - не предусматривает отрицательных значений.
И если так - выдаст ошибку и перезагрузит контроллер - мои проблемы решены :)
Кстати, можно ли из самого проекта в режиме работы отдать команду на перезагрузку контроллера ??
А разве TIME может быть отрицательным?
Правильный ответ 167296ms или 2m47s296ms
ЗЫ
Развернутый ответ на Ваш предыдущий вопрос
TimeNow=49d17h2m47s000ms + 500ms = 204msЦитата:
...допустим, PrevTime = 49d17h2m47s000ms (равное текущему показанию счёта). Следующее вычисление (интервал) - через 500 ms. "TiME() минус PrevTime". Какой будет результат ?
Интервал = TimeNow - PrevTime = 204ms - 49d17h2m47s000ms = 500ms
Не очевидно, но факт! Не очевидно то, что (204 - 4194967000) = 500. Видимо, это связано, как Вы заметили, что TIME тоже не принимает отрицательных значений.Цитата:
ЗЫ
Развернутый ответ на Ваш предыдущий вопрос
49d17h2m47s000ms + 500ms = 204ms
204ms - 49d17h2m47s000ms = 500ms
Значит, фактически идёт переход через "0" ? Это нормально, пойдёт.
Через 49 дней точно будет понятно :) Спасибо (у меня в режиме эмуляции почему то ничего не считает программа, поэтому не могу свои и чужие догадки или размышления проверять без контроллера)
Почему не очевидно?
Целочисленная арифметика без знаковых чисел, числа представлены 4 байтами(32бита)
Операции вычитания в этом случае заменяются операцией сложения с числом в дополнительном коде
Дополнительный код 4294967000 == NOT(4294967000) + 1 = 296
(204 - 4294967000) = 204 + 296 = 500
ЗЫ
49d17h2m47s000ms = 4294967000
Извините, не сталкивался с целочисленной арифметикой без знаковых чисел раньше, про дополнительные коды не слышал.
Так по факту, значение TIME() - на дисплее или в программе, по достижении T#49d17h2m47s295ms, далее изменится на 0 и начинается отсчёт с нуля. Удалось проверить.
Спасибо за разъяснения!
Подскажите что за ошибка:
Вложение 44449
Аааа, в этом смысле =) 2 дня по 1 часу в каждом
Здравствуйте! Интересует вопрос, могу ли я программно запретить выполнение какого-либо задания в конфигураторе задач? Опишу суть проблемы. Имеется концевик с нормально замкнутыми и нормально разомкнутыми контактами, они подключены к ПЛК. В PLC_PRG вход NC я инвертирую, и входа вешаю на прерывания. Замыкание NO или размыкание NC вызывают одну и ту же программу. НО! При нормальной работе концевика получится так, что программа вызовется дважды, один раз при размыкании NC и второй раз при замыкании NO. Мне нужно чтобы если скажем NC разомкнулось, прерывание по замыканию NO не вызывалось, так как нужное действие уже будет произведено. Использовать только один контакт концевика или ждать обоих срабатываний не вариант, по опыту знаю, что концевики любят умирать в неподходящий момент, поэтому нужно именно отключение вызова прерывания. Пока придумал только костыль по типу промежуточной программы, которая будет запускаться вместо основной про прерываниям, в ней объявляю переменную разрешения вызова основной программы, которая будет сбрасываться в момент срабатывания концевика, и устанавливаться в момент отжатия концевика. Вызов основной программы само собой через IF. Должен же быть способ лучше. И попутный вопрос, можно ли сделать вызов программы не по переднему фронту, а по заднему?
Avenging_Archangel
Если уж так хочется поразвлекаться с прерываниями, то можно пойти другим путем.
Делаем глобальную булеву переменную, например StartProgramm1.
В прерываниях по необходимым условиям устанавливаем её в TRUE
Пишем отдельную ПОУ Programm1, причем там должно быть прописано условие окончания алгоритма, по которому StartProgramm1 сбрасывается в FALSE.
В ПЛЦ_ПРГ пишем следующее:
Что имеем в результате:Код:IF StartProgramm1 THEN Programm1(); END_IF;
По сработке любого NC или NO устанавливается флаг StartProgramm1.
Начинает выполняться Programm1.
Изменение состояний входов NC и NO уже не меняют состояние флага.
Состояние флага меняет только Programm1.
Выполнение Programm1 прекратится в следующем цикле ПЛК после сброса флага StartProgramm1.
Следовательно Programm1 выполняется только один раз.
Ну в принципе похожим образом сейчас и реализовано у меня, хотелось бы попроще, типа как в AVR микропроцессорах, запретил внешнее прерывание на нужной ноге в регистре EIMSK, сделал нужные дела и разрешил прерывание
В том то и дело, что по идее концевик будет нажиматься очень медленно, и если там будет стоять не щелчковый, а типа советского ..овна, который будет на пружине, после размыкания NC контакта перед замыканием NO контакта может пройти и полсекунды. Ну и я конечно не знаю как в ПЛК устроены прерывания, если сравнивать с AVR, с которыми одно время работал, там если даже пришло второе прерывание во время работы первого, если прерывания запретить просто CLI, процессор все равно поставит бит прерывания, и после выхода из первого сразу перейдет во второе.
Через действие и делаю, думал есть способ проще
С семафором пока не разобрался, но если я правильно понял, им можно заблокировать программу если она выполняется сейчас. Если это так, то вообще не вариант, так как программа по срабатыванию концевика очень маленькая, условно говоря 40 строк кода, поэтому до второго срабатывания она сто пудово успеет выполниться.
Вкратце опишу, для чего это мне нужно. В общем, я заменяю на ПЛК внутренности одного станка, и в нем есть ЧПУ. И сейчас я занимаюсь с определением конечных точек ЧПУ, на которых стоят концевики. В идеале при поиске алгоритм такой: запускаю мотор по направлению к концевику, при касании концевика мотор начинает вращаться в другую сторону, как концевик размыкается, мотор опять идет к концевику, и так три раза. В моменты касания концевика я сохраняю значение энкодера и потом нахожу среднее. Именно поэтому мне нужно для надежности оба контакта концевика, но это полбеды. Так как оборудование все-таки ответсвенное, будет еще функция, типа если концевик сработал не во время поиска нулей - все, приехали, беги и смотри что не так с приводами. И именно для последней задачи мне нужно игнорировать второе срабатывание во время поиска.
Вроде я написал эту часть кода, сегодня вечером попробую на плк на столе.
Забейте и забудьте про прерывания для таких задач.Цитата:
..запускаю мотор по направлению к концевику, ..
..при касании концевика мотор начинает вращаться в другую сторону,
..как концевик размыкается, мотор опять идет к концевику,
и так три раза. ...
Классический автомат
Особенности состояний-шаговЦитата:
..В моменты касания концевика я сохраняю значение энкодера и потом нахожу среднее. Именно поэтому мне нужно для надежности оба контакта концевика, но это полбеды...,
еще функция, если концевик сработал не во время поиска нулей - все, приехали, беги и смотри что не так с приводами. ..
для последней задачи мне нужно игнорировать второе срабатывание во время поиска. ...