Просмотр полной версии : СП310+пр200
Viktor D
20.04.2023, 15:23
Добрый день.
Вопрос новичка.
В связи с тем, что исчерпался запас сетевых переменных при обмене между ПР200 и СП310 хочу поступить следующим образом:
В пр 200 собрать булевские переменные при помощи макроса "Битовая маска дискретных входов" в целчисленное значение и передать по одному регистру в панель оператора.
Вопрос: как в панели оператора произвести обратное преобразование и из этого числа получить переменные, которые можно привязать к индикаторам?
Так же - возможно ли передавать аналогичным образом данные в обратном направлении - от панели в ПР200. Если да, то как (где про это почитать)?
Добрый день.
Вопрос новичка.
В связи с тем, что исчерпался запас сетевых переменных при обмене между ПР200 и СП310 хочу поступить следующим образом:
В пр 200 собрать булевские переменные при помощи макроса "Битовая маска дискретных входов" в целчисленное значение и передать по одному регистру в панель оператора.
Вопрос: как в панели оператора произвести обратное преобразование и из этого числа получить переменные, которые можно привязать к индикаторам?
Так же - возможно ли передавать аналогичным образом данные в обратном направлении - от панели в ПР200. Если да, то как (где про это почитать)?
Устал ссылку давать "Обмен битовыми (BOOL) переменными с ПР Slave" https://owen.ru/forum/showthread.php?t=32194
kondor3000
20.04.2023, 22:11
Добрый день.
Вопрос новичка.
В связи с тем, что исчерпался запас сетевых переменных при обмене между ПР200 и СП310 хочу поступить следующим образом:
В пр 200 собрать булевские переменные при помощи макроса "Битовая маска дискретных входов" в целчисленное значение и передать по одному регистру в панель оператора.
Вопрос: как в панели оператора произвести обратное преобразование и из этого числа получить переменные, которые можно привязать к индикаторам?
Так же - возможно ли передавать аналогичным образом данные в обратном направлении - от панели в ПР200. Если да, то как (где про это почитать)?
Добавлю, можно читать писать биты как по ссылке, но по мне гораздо проще и удобней,
собрать маску например в 512 регистр, а в панели обращаться не к битам, типа 0х8192, а к битам регистра, что тоже самое 4х512 бит 0, для панели мастера.
или для панели слейва, к регистрам PSW512 бит 0, PSW512 бит 1, PSW512 бит 2 и т.д.,
соответственно читать, писать маску в ПР мастере надо функциями 0х03, 0х06 (0х10), а в Панели мастере использовать 4х512 бит 0, 4х512 бит 1, 4х512 бит 2 и т.д.
Viktor D
20.04.2023, 23:08
Спасибо за подсказки:D
Viktor D
23.04.2023, 08:25
Ещё вопрос. Можно ли инвертировать бит видимости кнопки. Необходимо, что бы при нажатии кнопки "старт цикла" с экрана пропадало несколько других кнопок, тем самым предотвращая их включение. У меня же происходит наоборот - эти кнопки видны при нажатой "старт цикла и пропадают когда та отжата.
kondor3000
23.04.2023, 16:12
Ещё вопрос. Можно ли инвертировать бит видимости кнопки. Необходимо, что бы при нажатии кнопки "старт цикла" с экрана пропадало несколько других кнопок, тем самым предотвращая их включение. У меня же происходит наоборот - эти кнопки видны при нажатой "старт цикла и пропадают когда та отжата.
Пример инверсии бита на графическом макросе от petera. Скопируйте к себе в проект. Работает в эмуляции.
На входах один и тот же бит, на выходе инверсия (элемент 2 И-НЕ). Биты можно менять, кликнув мышью.
Viktor D
23.04.2023, 19:39
Спасибо за подсказку!
Пример инверсии бита на графическом макросе от petera. Скопируйте к себе в проект. Работает в эмуляции.
На входах один и тот же бит, на выходе инверсия (элемент 2 И-НЕ). Биты можно менять, кликнув мышью.
Есть просто инвертор (НЕ), с одним входом и одним выходом
67504
kondor3000
24.04.2023, 16:25
Есть просто инвертор (НЕ), с одним входом и одним выходом
67504
Да, спасибо, проглядел его))) Хотя в данном случае всё равно)
Viktor D
26.04.2023, 10:16
При помощи графических макросов всё сделал. Раньше пытался решить всё через сетевые переменные и программу в ПР200. В панели удобнее.
Появился такой вопрос. Нужно управлять параметрами "длительность вращения", "длительность паузы" и т.д. Всего несколько штук. Задаю их с панели через сетевые переменные. При снятии питания с панели и ПР200 они все сбрасываются в "0". Подскажите как сделать, что бы они запоминались на последних выставленных значениях.
kondor3000
26.04.2023, 10:28
При помощи графических макросов всё сделал. Раньше пытался решить всё через сетевые переменные и программу в ПР200. В панели удобнее.
Появился такой вопрос. Нужно управлять параметрами "длительность вращения", "длительность паузы" и т.д. Всего несколько штук. Задаю их с панели через сетевые переменные. При снятии питания с панели и ПР200 они все сбрасываются в "0". Подскажите как сделать, что бы они запоминались на последних выставленных значениях.
Это вообще проще простого, в панели есть энергонезависимая память PFW, записываете в неё нужные уставки (первый раз),
далее функц. область, при включении панели, копировать нужные регистры из PFW в PSW и передавайте куда надо.
Если надо сохранить последние, при выключении ( или остановке программы по биту) записать из PSW в PFW . Только не делайте запись часто, ресурс перезаписи ограничен. Если записывать 2 раза в день, хватит почти на 100 лет.
Viktor D
26.04.2023, 18:41
Спасибо. Буду делать.
Viktor D
03.05.2023, 17:02
Приветствую всех.
У меня возник ещё один вопрос. Когда я передаю уставки из панели в пр200 (делаю это функциональной кнопкой с опцией "копировать регистр №", то целочисленные уставки копируются нормально, а с цислами с плавающей запятой не получается передать значение.
Может здесь есть какая то тонкость, которую я не учитываю?
у ПР200 порядок байт флоат надо менять, регистры местами поменяйте. Можно сделать в самом ПР для сетевой переменной, или возможно есть настройка в панели.
порядок байт для float 2301 (или 3412) как вам удобнее воспринимать.
Настройки галочек в ПР200 не действуют для slave режима. Порядок байт всегда один.
kondor3000
03.05.2023, 17:37
Приветствую всех.
У меня возник ещё один вопрос. Когда я передаю уставки из панели в пр200 (делаю это функциональной кнопкой с опцией "копировать регистр №", то целочисленные уставки копируются нормально, а с цислами с плавающей запятой не получается передать значение.
Может здесь есть какая то тонкость, которую я не учитываю?
В панели мастере, галка Поменять регистры в настройках.
Если ПР мастер, поставить галку, переставить регистры.
Viktor D
03.05.2023, 18:26
Пр у меня слейв, панель мастер.
Галка в настройках проекта в настройках протокола RTU master поменять регистры местами стоит.
Пробовал без неё - результат тот же.
Подумываю над тем, что бы передавать уставки в целочисленном формате, умножив в панели на 100 и соответственно в ПР разделив так же.
Как в ПР делить понятно. Вопрос - как в панели умножить.
Viktor D
03.05.2023, 18:35
Что интересно, если передавать значения флоат просто с цифрового ввода сразу в PLC то они проходят нормально. А если как посоветовали выше - сначала записать в PSW (с сохранением в PFW) а затем через функциональную кнопку в PLC, то флоат не проходит, проходит целочисленные.
kondor3000
03.05.2023, 20:06
Пр у меня слейв, панель мастер.
Галка в настройках проекта в настройках протокола RTU master поменять регистры местами стоит.
Пробовал без неё - результат тот же.
Подумываю над тем, что бы передавать уставки в целочисленном формате, умножив в панели на 100 и соответственно в ПР разделив так же.
Как в ПР делить понятно. Вопрос - как в панели умножить.
Если галка стоит, то снимите ( надо сделать правильную передачу). Еще, не забывайте что Float занимает 2 регистра, адреса должны быть через 1, частая ошибка наделать несколько штук, а адреса наложить, то есть считать по 1 регистру. Соответственно, вы читаете часть первого и часть второго, как галку не переставляй, всё равно не получится.
Умножить можно с помощью функц. области, там есть математика.
Что интересно, если передавать значения флоат просто с цифрового ввода сразу в PLC то они проходят нормально. А если как посоветовали выше - сначала записать в PSW (с сохранением в PFW) а затем через функциональную кнопку в PLC, то флоат не проходит, проходит целочисленные.
Тогда галку не трогайте, передача у вас правильная.
Значит где то не поставили тип DWORD ( 2 регистра, адреса через 1) или формат Float, это часто бывает с новичками.
И зачем вам 2 раза то копировать, через ФО и кнопку? Не проще записать в PFW и при включении скопировать сразу куда надо. Поэтому и наделали кучу ошибок.
Вот скрин, после включения панели, все копируется из PFW256 в PSW256 и в 4x0 67693
Viktor D
03.05.2023, 20:58
Да, я пока учусь.Вот собственно по этому и пробую все варианты. Записать значения через цифровой ввод в PSW, потом через функциональной кнопкой в PLC порт в энергонезависимые переменные в ПР. Что бы понять как что работает.
На практике же нужно будет несколько уставок менять в процессе работы. Поэтому и хочу сделать запись из PSW по функциональной кнопке в ПР и из PSW в PFW, что бы хранить уставки там на случай отключения панели.
Про то, что для float нужно 2 регистра я знаю и перепероверил всё.
Ладно, сделаю передачу через целочисленные переменные.
Спасибо за подсказки.
kondor3000
03.05.2023, 21:50
Да, я пока учусь.Вот собственно по этому и пробую все варианты. Записать значения через цифровой ввод в PSW, потом через функциональной кнопкой в PLC порт в энергонезависимые переменные в ПР. Что бы понять как что работает.
На практике же нужно будет несколько уставок менять в процессе работы. Поэтому и хочу сделать запись из PSW по функциональной кнопке в ПР и из PSW в PFW, что бы хранить уставки там на случай отключения панели.
Про то, что для float нужно 2 регистра я знаю и перепероверил всё.
Ладно, сделаю передачу через целочисленные переменные.
Спасибо за подсказки.
Советую всё таки сделать как надо, разобраться до конца, хотя бы один раз и привыкайте делать адреса всех Float чётными.
Например в ПЛК слейве все адреса делают чётными, иначе выравнивание их смещает на 1 регистр. Соответственно и в панели тоже.
Тогда вы читая Float по нечётному адресу, будете захватывать 2 куска разных переменных и были случаи, даже проекты так сдавали ( даже показывали похоже на правду)
и они работали (некоторое время) пока кто нибудь не заметит ерунды на дисплеях.
Viktor D
04.05.2023, 03:37
Наконец то разобрался в чем бвла проблема. В одном месте не выбрал чекбокс float.
Спасибо за помощь.
Viktor D
07.05.2023, 20:25
Добрый день всем.
Появился ещё один вопрос на котором я застрял.
В проекте есть 4 дозировки различных химикатов в один мерник. Необходимо сделатьтак,что бы в конкретный момент времени активной могла быть только одна дозировка. Как лучше сделать -через биты видимости в панели или в программе ПР200?
Для панели не могу найти решения.
Четыре, вы так и можете в панели вводить 1, 2, 3, 4 а в ПР делаете сравнение на равенство и включаете соответствующие SEL, которые стоят каскадом.
Ну зависит от того как вы в программе ПР выбираете. Один из вариантов.
Павел Крупенко
08.05.2023, 20:08
Здравствуйте уважаемые форумчане! Нужна ваша помощь, немного запутался. На руках в данный момент нет панели СП и ПР200, поэтому делаю все в симуляторе.
Допустим мне нужно поменять уставку давления в авто режиме (на принтскрине). В цифровом вводе данных сохраняю значение уставки в 256 PFW внутреннем регистре панели.
Далее создаю функциональную область, в которой копирую регистр 256 PFW в регистр 256 PSW, затем копирую 256 PSW в 4-х 514 регистр ПР200 .
Во вкладе Режим функциональной области настраиваю запись при включении панели.
Вопрос: когда я с панели буду изменять значение данной уставки она изменится только во внутреннем регистре 256 PFW? Как ее передать в регистр 4-х 514 ПР200 без перезагрузки панели?
Масло масляное получается.
kondor3000
08.05.2023, 20:39
Здравствуйте уважаемые форумчане! Нужна ваша помощь, немного запутался. На руках в данный момент нет панели СП и ПР200, поэтому делаю все в симуляторе.
Допустим мне нужно поменять уставку давления в авто режиме (на принтскрине). В цифровом вводе данных сохраняю значение уставки в 256 PFW внутреннем регистре панели.
Далее создаю функциональную область, в которой копирую регистр 256 PFW в регистр 256 PSW, затем копирую 256 PSW в 4-х 514 регистр ПР200 .
Во вкладе Режим функциональной области настраиваю запись при включении панели.
Вопрос: когда я с панели буду изменять значение данной уставки она изменится только во внутреннем регистре 256 PFW? Как ее передать в регистр 4-х 514 ПР200 без перезагрузки панели?
Масло масляное получается.
Опять снова здорово, в PFW регистры надо записывать первый раз ( можно при загрузке проекта), дальше при включении панели, вы копируете их в PSW и работаете с PSW регистрами в оперативке, копируйте их раз в секунду или постоянно в 4х.
Меняйте в PSW хоть по 100 раз в день и копируйте в 4х, а записывать в PFW желательно, только при остановке программы в конце рабочего дня, желательно не чаще 2-5 раз в день.
Павел Крупенко
09.05.2023, 21:38
Спасибо за ответ. Я пока только начинаю разбираться с обменом данными, регистрами.
Сделаю так: на панели в цифровом вводе данные сохраняю в pfw, создаю функциональную область и в ней копирую из pfw в 4x регистры ПР и pws с интервалом в 1 секунду. Если из pfw копировать с такой периодичностью она не испортится?
Поправьте пожалуйста меня, если опять не правильно сделал.
kondor3000
09.05.2023, 21:50
Спасибо за ответ. Я пока только начинаю разбираться с обменом данными, регистрами.
Сделаю так: на панели в цифровом вводе данные сохраняю в pfw, создаю функциональную область и в ней копирую из pfw в 4x регистры ПР и pws с интервалом в 1 секунду. Если из pfw копировать с такой периодичностью она не испортится?
Поправьте пожалуйста меня, если опять не правильно сделал.
Читать (копировать) регистры PFW, можно сколько угодно и куда угодно, без ограничений. А вот записывать в них желательно не часто.
У них ограниченный ресурс циклов перезаписи, лучше, не чаще 2-5 раз в день. Тогда хватит надолго.
Павел Крупенко
09.05.2023, 22:46
Спасибо за ответ. Я пока только начинаю разбираться с обменом данными, регистрами.
Сделаю так:
1 вариант:
на панели в цифровом вводе данные сохраняю в pfw, создаю функциональную область и в ней копирую из pfw в 4x регистры ПР и pws с интервалом в 1 секунду. Если из pfw копировать с такой периодичностью с ней ничегоне будет?
2 вариант.
На панели СП в цифровом вводе данных делаю запись в psw или сразу в 4х регистр ПР. Создаю функциональную кнопку и ей копирую регистры из psw или 4х регистров в pfw. Создаю функциональную область, которой при включении панели копирую из pfw в pws и в регистры ПР.
kondor3000
10.05.2023, 08:22
Спасибо за ответ. Я пока только начинаю разбираться с обменом данными, регистрами.
Сделаю так:
1 вариант:
на панели в цифровом вводе данные сохраняю в pfw, создаю функциональную область и в ней копирую из pfw в 4x регистры ПР и pws с интервалом в 1 секунду. Если из pfw копировать с такой периодичностью с ней ничегоне будет?
2 вариант.
На панели СП в цифровом вводе данных делаю запись в psw или сразу в 4х регистр ПР. Создаю функциональную кнопку и ей копирую регистры из psw или 4х регистров в pfw. Создаю функциональную область, которой при включении панели копирую из pfw в pws и в регистры ПР.
Первый вариант можно, ничего при копировании не будет, а второй излишний (много ненужного).
Регистры PSW можно сделать тоже для ввода, при включении ( один раз) в них копируются начальные уставки из PFW,
далее при работе (если надо), их можно менять уже в PSW. Из PSW раз в секунду в 4х.
И если надо записывать, то например, по кнопке Стоп (по биту в конце смены) копируете обратно из PSW в PFW.
Viktor D
26.06.2023, 14:10
Добрый день.
Возник такой вопрос - есть ли возможность вывести в ПР200 в Овен лоджике системную переменную размерностью 100мс, или менее.
Проблема в том, что таймеры с задержкой включения и отключения на длительных периодах дают значительную ошибку по времени.
Хочу селать макрос с коррекцией времени вкл/откл. Пременной с размерностью 1 сек недостаточно (будет слишком грубая регулировка).
Добрый день.
Возник такой вопрос - есть ли возможность вывести в ПР200 в Овен лоджике системную переменную размерностью 100мс, или менее.
Проблема в том, что таймеры с задержкой включения и отключения на длительных периодах дают значительную ошибку по времени.
Хочу селать макрос с коррекцией времени вкл/откл. Пременной с размерностью 1 сек недостаточно (будет слишком грубая регулировка).
PSW38, DWORD - системное время панели(от момента включения питания) с дискретностью 0,1 сек(100мс),
PSW38, DWORD - системное время панели(от момента включения питания) с дискретностью 0,1 сек(100мс),
Пример измерения интервалов времени с использованием PSW38
68460
https://owen.ru/forum/attachment.php?attachmentid=68459&d=1687781656
Viktor D
05.07.2023, 12:03
Добрый день. Спасибо за подсказки. Посмотрел, полезно. У меня была немного другая проблема. Сейчас решил сам по другому. Там был длительный процесс вращения барабана в разные стороны (вперёд-назад) и за сутки почему то набегала значительная ошибка. Сделал в ПР200 в виде генератора blink и счётчика импульсов.ри этом время генерации корректирую путём записи переменной в функциональный блок.
Почему получается ошибка во времени не могу пока понять. Если брать связку генератор - счётчик, то она работает точно. А вот в составе программы с переключением направлений вращения и еще разных условий типа защита и т.д. почему то время уходит.
На данныймомент привёл в требуемый допуск. Хотя может и не правильно.
Добрый день. Спасибо за подсказки. Посмотрел, полезно. У меня была немного другая проблема. Сейчас решил сам по другому. Там был длительный процесс вращения барабана в разные стороны (вперёд-назад) и за сутки почему то набегала значительная ошибка. Сделал в ПР200 в виде генератора blink и счётчика импульсов.ри этом время генерации корректирую путём записи переменной в функциональный блок.
Почему получается ошибка во времени не могу пока понять. Если брать связку генератор - счётчик, то она работает точно. А вот в составе программы с переключением направлений вращения и еще разных условий типа защита и т.д. почему то время уходит.
На данныймомент привёл в требуемый допуск. Хотя может и не правильно.
Какое время нужно подсчитать? Время вращения в одну сторону и время вращения в другую?
Я бы подсчет вел в циклах выполнения программы, затем умножал на время одного цикла.
Покажите фрагмент Вашей схемы, может предложу решение.
Viktor D
06.07.2023, 19:21
Пётр, добрый вечер.
Проблема у меня следующая. Есть процесс, который состоит из повторяющихся циклов вращения барабана в разных направлениях с паузами между вращением. Таких повторяющихся циклов много. В процессе работы нужно останавливать барабан, брать пробы, загружать химикаты и т.д. Тоже по времени.
Временные промежутки цикла вращений у меня отрабатываются программой в ПР200. Помимо этого нужно вести учёт общего времени от начала выполнения процесса, что бы оператор видел сколько времени прошло от начала и мог внести корректировку в процесс.
У меня организован в ПР200 таймер, который считает это время в секундах и записывает в сетевую переменную. Мне нужен мкарос в СП310, который из этого числа выводит на экран время в секундах, минутах и часах.
В вашей библиотеке подобный есть, называется "часы". Только я не знаю как его связать с моей переменной, в настройка там нет регистра.
И еще, таких подсчётов времени у меня несколько (несколько барабанов и несколько разных периодов).
Саму программу сейчас выложить не смогу - всё на работе а там я буду только в субботу. Если интересно, то позже могу отправить проект на почту или куда то выложить.
Спасибо заранее за помощь.:D
...
У меня организован в ПР200 таймер, который считает это время в секундах и записывает в сетевую переменную. Мне нужен мкарос в СП310, который из этого числа выводит на экран время в секундах, минутах и часах.
В вашей библиотеке подобный есть, называется "часы". Только я не знаю как его связать с моей переменной, в настройка там нет регистра.
Вы не там смотрели
Такой макрос находится в "Визуальные ГМ\Ц_индикация\Таймеры" и называется "чч_мм_сс"
68689
Операндом там выступает любой регистр DWord
68690
Только есть один нюанс - эти ГМ делал для отображения времени заданном в миллисекундах (таймеры в кодесис, например)
По этому можно читать из ПР переменную, например рег.512, а в СП использовать ф.область, непрерывную, с функцией PSW500(dword) = 4x512 * 1000
68691
Viktor D
06.07.2023, 20:53
Спасибо. Это то, что нужно. Буду когда на работе - встрою в проект.
Наверное можно будет сразу сделать пересчёт в овенлоджике в нужную размерность и передать результат в регистр панели.
Viktor D
09.07.2023, 01:21
Пётр, всё получилось как нужно.
Вопрос - есть ли возможность отредактировать внешний вид этих макросов,что бы выглядели как стандартные окна ввода и отображения цифровых значений.
Имеется в виду размер цифр и вид рамок.
Пётр, всё получилось как нужно.
Вопрос - есть ли возможность отредактировать внешний вид этих макросов,что бы выглядели как стандартные окна ввода и отображения цифровых значений.
Имеется в виду размер цифр и вид рамок.
По поводу шрифта (тип и размер) - для любых визуальных ГМ делается нажатием кнопки "F" на панели инструментов
68743
По поводу внешнего вида
Такой же по функционалу ГМ "чч_мм_сс", но в рамке находится в папке "Визуальные ГМ\Ц_индикация\Таймеры\В рамке"
68744
В этом случае в настройках появляется вкладка "Цвет"
68745
ЗЫ
Что касается другого стиля самой рамки, то путем редактирования самого макроса можно сделать рамку любого стиля, в том числе как у стандартных дисплеев или элементов ввода.
Укажите какой внешний вид рамки Вам нужен (картинку прикрепите)
Viktor D
19.07.2023, 03:43
Пётр, доброго времени суток.
По поводу рамок для макросов- мне бы хотелось, что бы они выглядели как стандартные Цифровой дисплей. Потому как так проще - не надо каждый раз приводить всё к единому стилю.
получается покак вот так
68973
и приходиться каждый раз делать несколько операций, что бы получить такой вид.
Тут столкнулся ещё с такой проблемой. Если для вашего макроса (в котором время в микросекундах) указать формат данных word, и делать умножение в овенлоджике, то подсчёт времени идет только до 1мин 5 сек и далее стартует сначала. Получается если я хочу считать часы (реально есть процессы по 2 суток) то мне надо для сетевой переменной выделять 2 регистра и указывать dword в настройках макроса?
И ещё - -если производить вычисления в функциональной области,то надо тоже в области памяти панели выделять 2 регистра? Или можно читать значения сразу из сетевой переменной (которая тоже займёт два регистра)?
Если брать формат данных unsigned, то даже передавая время в секундах и умножая на 1000 в функциональной области и используя только один регистр упрёшься в значение 18 часов.
Как тут мне лучше сделать?
kondor3000
19.07.2023, 09:30
По поводу рамок для макросов- мне бы хотелось, что бы они выглядели как стандартные Цифровой дисплей. Потому как так проще - не надо каждый раз приводить всё к единому стилю.
получается покак вот так
и приходиться каждый раз делать несколько операций, что бы получить такой вид.
Как тут мне лучше сделать?
Проще рамки стандартных дисплеев сделать как макрос времени. Сделать один, потом копировать, только адреса менять.
Для передачи времени больше 18 часов надо использовать 2 регистра в ПР и в дисплее ( целочисленное DWORD).
2 регистра на приём и 2 регистра для времени 68979
Но не больше 99 часов 59 мин 59 сек или 4 с небольшим дня
Пётр, доброго времени суток.
По поводу рамок для макросов- мне бы хотелось, что бы они выглядели как стандартные Цифровой дисплей. Потому как так проще - не надо каждый раз приводить всё к единому стилю.
получается покак вот так
68973
и приходиться каждый раз делать несколько операций, что бы получить такой вид.
Тут столкнулся ещё с такой проблемой. Если для вашего макроса (в котором время в микросекундах) указать формат данных word, и делать умножение в овенлоджике, то подсчёт времени идет только до 1мин 5 сек и далее стартует сначала. Получается если я хочу считать часы (реально есть процессы по 2 суток) то мне надо для сетевой переменной выделять 2 регистра и указывать dword в настройках макроса?
И ещё - -если производить вычисления в функциональной области,то надо тоже в области памяти панели выделять 2 регистра? Или можно читать значения сразу из сетевой переменной (которая тоже займёт два регистра)?
Если брать формат данных unsigned, то даже передавая время в секундах и умножая на 1000 в функциональной области и используя только один регистр упрёшься в значение 18 часов.
Как тут мне лучше сделать?
1. Рамки
Понятие "стандартный" Цифровой дисплей - относительное.
Я не люблю эти гигантские дисплеи с серо-зелеными цифрами внутри, которые Вы используете
У меня в конфигураторе стандартный дисплей выглядит так
https://owen.ru/forum/attachment.php?attachmentid=68987&d=1689761561
Но во вложении найдете макрос с оформление в серо-зеленых цветах, точь в точь как Ваши дисплеи
68989 68990
2. Формат данных.
Если есть процессы по двое суток, то из ПРки нужно брать значение DWORD (два регистра)
- можно в лоджике время в секундах умножить на 1000 и положить в две сетевые переменные, расположенные друг за другом младшую Lo и старшую Hi части.
например
68991
Тогда в настройках макроса нужно сразу указать регистр 4х512, DWORD (Незабываем в настройках порта панели вкл. галку "Изменить порядок регистров")
- если в ПРке не умножать время на 1000, то делайте в СП ф.область с вычислением, как kondor3000 написал
Viktor D
19.07.2023, 19:40
Спасибо, прочитал. Попробую сделать.
Viktor D
19.07.2023, 20:11
Допустим я буду передавать время из пр200 в секундах и пересчитывать в панели. В таком случае всё равно для передачи значения более, чем 18 часов потребуются 2 регистра и Dword. Как в овенлоджике это организовать если я хочу передать значение больше чем 65535 в виде целочисленной переменной? Нужно будет сделать такое же преобразование как и в примере с умножением на 1000 и записывать в 2 сетевые переменные? Где то я ещё читал, что первая переменная должна быть чётной. Правильно я понял?
kondor3000
19.07.2023, 22:15
Допустим я буду передавать время из пр200 в секундах и пересчитывать в панели. В таком случае всё равно для передачи значения более, чем 18 часов потребуются 2 регистра и Dword. Как в овенлоджике это организовать если я хочу передать значение больше чем 65535 в виде целочисленной переменной? Нужно будет сделать такое же преобразование как и в примере с умножением на 1000 и записывать в 2 сетевые переменные? Где то я ещё читал, что первая переменная должна быть чётной. Правильно я понял?
Не важно, где умножать на 1000, всё равно числа больше 18 часов передавать надо через 2 регистра.
Можно сделать так, разложить время на 2 регистра, старш. и младший, отправить например по адресам 512 и 513, в панели по адресу 4х512 принимаете DWORD.
Нас скрине как разложить на 2 регистра и собрать обратно (вам собирать не надо, просто для примера) 69006
Если в панели отображается не правильно, поменяйте их местами ( можно в ПР поменять местами или поставить галку в панели, переставить регистры).
Конкретно для ПР чётный или нет младший регистр не важно, а вот в ПЛК важно ( лучше привыкайте все 32 битные переменные отправлять по чётному адресу)
Viktor D
21.07.2023, 16:44
Сегодня проверил на живом железе. Всё заработало. Всем большое спасибо за помощь.
ЗЫ. Пётр, если можно, то сделайте пожалуйста ещё один таймер в такой же рамке. В нём нужны только минуты и секунды.
Сегодня проверил на живом железе. Всё заработало. Всем большое спасибо за помощь.
ЗЫ. Пётр, если можно, то сделайте пожалуйста ещё один таймер в такой же рамке. В нём нужны только минуты и секунды.
держите еще один
69077
Viktor D
23.07.2023, 09:21
Спасибо. Теперь есть все что нужны.
Только вот получается не совсем как задумано. Оставил макет на проверку подсчёта времени на сутки и оказалось, что в какой то момент времени подсчёт обнулился (начался заново). Думаю как раз эти 18 часов.
Пока не могу понять в чём дело.
69118
69119
69120
69121
kondor3000
23.07.2023, 10:30
Спасибо. Теперь есть все что нужны.
Только вот получается не совсем как задумано. Оставил макет на проверку подсчёта времени на сутки и оказалось, что в какой то момент времени подсчёт обнулился (начался заново). Думаю как раз эти 18 часов.
Пока не могу понять в чём дело.
Вы скрины в онлайн режиме делайте, какое число уходит из ПР, какое приходит в панель. Оно должно быть правильное, иначе переставить регистры.
Число задайте просто константой, для проверки, больше 65535, лучше 6 значное типа 172800 ( это 48 часов ровно)
Viktor D
23.07.2023, 17:01
Проверю завтра - макет на работе.
Viktor D
24.07.2023, 20:52
Проверил.
Результаты:
1. Задал константой 172800 в Пр в панели отобразилось ровно 48 часов.
2. Проверил в симуляторе работу макроса со второго скрина. Обнаружил, что при подсчёте импульсов счётчиком по достижении значения 65535 он обнуляется и подсчёт стартует с нуля.
Причина ясна, но пока не понимаю как исправить это дело.
Может есть смысл сделать двухступенчатый счётчик со сложением результатов?
Проверил.
Результаты:
1. Задал константой 172800 в Пр в панели отобразилось ровно 48 часов.
2. Проверил в симуляторе работу макроса со второго скрина. Обнаружил, что при подсчёте импульсов счётчиком по достижении значения 65535 он обнуляется и подсчёт стартует с нуля.
Причина ясна, но пока не понимаю как исправить это дело.
Может есть смысл сделать двухступенчатый счётчик со сложением результатов?
сделать счетчик на 32 бита.
69156
Будет как настоящий, только лучше :rolleyes:
69157
Viktor D
25.07.2023, 03:04
Спасибо за подсказку. Надо осмыслить её.
Пока сидел, думал у самого получилось вот так
69159
В таком виде работает. Оставлю макет включенным на пару суток.
Крутится в голове мысль, что отсюда можно сразу две переменные вытащить старший разряд и младший. Пока не до конца разобрался как.
А то получается, что сначала делаю большое число, а потом его же раскладываю на две переменные
69160
Viktor D
29.02.2024, 10:33
Доброго дня всем.
Возник такой вопрос. Подключаю к ПР 200 датчик Pt100. Использую макрос из онлайн библиотеки.
Разница в показаниях датчика Pt100 и датчика с токовым преобразователем 4-20мА в несколько градусов.
Причём интересная ситуация - если в режиме симуляции для входов к которым подключены вышеперечисленные датчики ввести числовые значения соответствующие одинаковой температуре, ну к примеру 50 градусов Цельсия, то результат получается одинаковым и правильным.
Похоже на аппаратную проблему при подключении. Может кто сталкивался с чем то подобным?
kondor3000
29.02.2024, 10:46
Доброго дня всем.
Возник такой вопрос. Подключаю к ПР 200 датчик Pt100. Использую макрос из онлайн библиотеки.
Разница в показаниях датчика Pt100 и датчика с токовым преобразователем 4-20мА в несколько градусов.
Причём интересная ситуация - если в режиме симуляции для входов к которым подключены вышеперечисленные датчики ввести числовые значения соответствующие одинаковой температуре, ну к примеру 50 градусов Цельсия, то результат получается одинаковым и правильным.
Похоже на аппаратную проблему при подключении. Может кто сталкивался с чем то подобным?
Таких тем полно
Ответ производителя - https://owen.ru/forum/showthread.php?t=39112&page=4&p=429348&viewfull=1#post429348
https://owen.ru/forum/showthread.php?t=9398&page=761&p=429383#post429383
https://owen.ru/forum/showthread.php?t=37270
https://owen.ru/forum/showthread.php?t=39201
Viktor D
29.02.2024, 10:52
Спасибо, уже читаю.
Viktor D
29.02.2024, 10:56
Понял, надо датчик с токовым преобразователем использовать.
Спасибо за подсказку. Надо осмыслить её.
Пока сидел, думал у самого получилось вот так
69159
В таком виде работает. Оставлю макет включенным на пару суток.
Крутится в голове мысль, что отсюда можно сразу две переменные вытащить старший разряд и младший. Пока не до конца разобрался как.
А то получается, что сначала делаю большое число, а потом его же раскладываю на две переменные
69160
А зачем осмысливать. В менеджере компонентов есть готовый 32 разрядный счетчик (хотите в квадратиках, хотите - на ST)
Viktor D
05.03.2024, 11:05
А зачем осмысливать. Ну что бы чему то научиться в результате.
Viktor D
05.03.2024, 11:10
Пётр, а можно вас попросить сделать 2 таймера мм:сс и ч:мм:сс только что бы на входе не надо было умножать на 1000. Ну что бы не городить лишние функциональные области и макросы.
Пытался сам сделать по вашим видео - запутался совсем.
Пётр, а можно вас попросить сделать 2 таймера мм:сс и ч:мм:сс только что бы на входе не надо было умножать на 1000. Ну что бы не городить лишние функциональные области и макросы.
Пытался сам сделать по вашим видео - запутался совсем.
Просто замените деление с 1000
74085
на 1
74086
и ВСЕ!
74088 74087
Viktor D
05.03.2024, 12:58
Спасибо. Буду разбираться.
kondor3000
05.03.2024, 13:09
Кстати это лучший вариант ГМ, для передачи числа до 18 часов, можно использовать 1 регистр, а не 2 как раньше.
Viktor D
07.03.2024, 10:06
Всё сделал. Спасибо.
Dead Kid
25.09.2024, 20:08
Здравствуйте. Делаю проект - СП310Р опрашивает 4 ПР200 по ModBus RTU. Как на панели можно отслеживать обрыв связи с пр200?
In_Da_Cher_A
25.09.2024, 21:28
Как на панели можно отслеживать обрыв связи с пр200?откройте руководство по эксплуатации панели , там написаны служебные регистры и окна, отвечающие за проверку связи с подчинённым устройством. В ютюбе точно есть обучающие видео по-моему от самого же ОВЕНа и на эту тему в том числе
Здравствуйте. Делаю проект - СП310Р опрашивает 4 ПР200 по ModBus RTU. Как на панели можно отслеживать обрыв связи с пр200?
Вообще-то панель прямо кричит (окошко с текстом "потеря связи с устройством X" где X - Modbus-адрес устройства).
Конечно, только если на текущем экране есть элементы, которые обращаются к этому устройству.
Viktor D
26.09.2024, 12:56
Добрыйдень.
У меня похожий вопрос.
В проекте одна панель оператора сп310 и 5 пр200.
Управление каждым пр осуществляется с отдельного экрана. Однако на стартовом экране выведена информация об активности процесса в виде индикатора а так же таймер показывающий время процесса на каждом пр. Плюс всплывающие сообщения типа "работа", "программа выполнена" и "пауза".
В случае если один из пр отключен (такая ситуация периодически возникает) панель при нахождении на стартовом экране начинает тормозить.
Мне нужн как то сделать, что бы при отключении одного из пр панель его не опрашивала.
Как такое можно осуществить.
In_Da_Cher_A
26.09.2024, 13:13
Мне нужн как то сделать, что бы при отключении одного из пр панель его не опрашивала.
Как такое можно осуществить.да сколько можно 78910
откройте руководство на панель, там всё написано
78912
kondor3000
26.09.2024, 13:13
Добрыйдень.
У меня похожий вопрос.
В проекте одна панель оператора сп310 и 5 пр200.
Управление каждым пр осуществляется с отдельного экрана. Однако на стартовом экране выведена информация об активности процесса в виде индикатора а так же таймер показывающий время процесса на каждом пр. Плюс всплывающие сообщения типа "работа", "программа выполнена" и "пауза".
В случае если один из пр отключен (такая ситуация периодически возникает) панель при нахождении на стартовом экране начинает тормозить.
Мне нужн как то сделать, что бы при отключении одного из пр панель его не опрашивала.
Как такое можно осуществить.
В регистр PFW130 нужно записывать базовый адрес регистров PFW, через биты которых и происходит управление обменом.
https://owen.ru/forum/showthread.php?t=35196&page=2#13
Viktor D
26.09.2024, 13:35
Спасибо, буду изучать.
Viktor D
03.10.2024, 17:57
Ещё раз спасибо, всё получилось.
Возник такой вопрос - Можно ли на панели реализовать кнопку или переключатель с индикацией с задержкой отклика. Нужно для остановки процесса, что бы случайным касанием не сбросили таймер. Задержка 3-5 секунд по удержанию в нажатом состоянии.
Можно. Случайное касание? Это как? Ой не то нажал!
kondor3000
03.10.2024, 19:32
Ещё раз спасибо, всё получилось.
Возник такой вопрос - Можно ли на панели реализовать кнопку или переключатель с индикацией с задержкой отклика. Нужно для остановки процесса, что бы случайным касанием не сбросили таймер. Задержка 3-5 секунд по удержанию в нажатом состоянии.
Можно всё, делаете в ПР бит с таймером TON, задержка включения на 3 сек, не будет срабатывать при случайном касании.
На самой панели, то же самое можно сделать на ФО (функц. области) или функц. кнопке.
.. Случайное касание? Это как?...
ну например
Viktor D
04.10.2024, 01:45
Можно. Случайное касание? Это как? Ой не то нажал!
Может показатся смешным, но так и есть. Процесс многочасовой, оператор может вместо паузы "тыкнуть" пальцем в стоп. Тем более в 5утра.
Viktor D
04.10.2024, 01:47
Можно всё, делаете в ПР бит с таймером TON, задержка включения на 3 сек, не будет срабатывать при случайном касании.
На самой панели, то же самое можно сделать на ФО (функц. области) или функц. кнопке.
Насчёт ПР я уже так и сделал.
Ещё есть необходимость в подобных кнопках в самой панели без обращения к ПР. Попробую что то изобрести с вашей подсказкой насчёт ф. области и ф. кнопки. Хотя пока не представляю с чего начать...
Может показатся смешным, но так и есть. Процесс многочасовой, оператор может вместо паузы "тыкнуть" пальцем в стоп. Тем более в 5утра.
Создайте окно с подтверждением, где надо повторно нажать кнопку команды
Насчёт ПР я уже так и сделал.
Ещё есть необходимость в подобных кнопках в самой панели без обращения к ПР. Попробую что то изобрести с вашей подсказкой насчёт ф. области и ф. кнопки. Хотя пока не представляю с чего начать...
Я использую функциональную кнопку, например:
- состояние "не нажата": Присвоить значение PSW256 = 0
- состояние "зажата": Математика PSW256 = PSW256 + 1 до максимального значения 256 (будет выставлен 8 бит в PSW256, накопление происходит за 3 секунды)
Дальше - пуск процесса привязываю к PSW256.8.
kondor3000
04.10.2024, 09:01
Насчёт ПР я уже так и сделал.
Ещё есть необходимость в подобных кнопках в самой панели без обращения к ПР. Попробую что то изобрести с вашей подсказкой насчёт ф. области и ф. кнопки. Хотя пока не представляю с чего начать...
Вот пример на ФО, удержание кнопки 3 сек, включает индикатор, повторное удержание 3 сек выключает индикатор.
На функц. кнопке можно сделать так же, она должна управлять битом включения цикла 3 сек. в ФО.
Я использую ...
+
Вот пример на ФО...
= все вместе
Viktor D
16.10.2024, 03:18
Спасибо за подсказки.
Положил в копилку знаний.
Сейчас прошу помочь разобраться как создать функциональный блок на ST.
собственно говоря прочитав хелп к Овенлоджику и действуя по аналогии удалось самостоятельно создать ФБ типа таймер с задержкой отключения (для саморазвития и с прицелом на использование в следующем проекте).
Далее хотел добавить в него на вход импульс включения длительнстью 10ms (по аналогии RTIG), но что то пошло не так.
В редакторе висят 2 ошибки.
Подскажите что делаю не так.
Спасибо за подсказки.
Положил в копилку знаний.
Сейчас прошу помочь разобраться как создать функциональный блок на ST.
собственно говоря прочитав хелп к Овенлоджику и действуя по аналогии удалось самостоятельно создать ФБ типа таймер с задержкой отключения (для саморазвития и с прицелом на использование в следующем проекте).
Далее хотел добавить в него на вход импульс включения длительнстью 10ms (по аналогии RTIG), но что то пошло не так.
В редакторе висят 2 ошибки.
Подскажите что делаю не так.
Конкретно ошибка в том, что у ФБ типа TP.SYS отсутствует входная переменная с именем "strt_1", которой вы пытаетесь присвоить значение.
Наверное планировалось сделать что-то типа такого:
strt_1 := strt;
TP_1(I := strt, T := T#10ms);
Viktor D
16.10.2024, 04:16
Ну не совсем так. В первом ФБ если подать на вход 1 и убрать то он отсчитывает 10 секунд Если 1 оставить то он продолжает считать бесконечно.
Планировалось сделать что бы внутри ФБ был RTRIG.
Исходя из вашей подсказки после TP_1 в скобках выражение:
T:=10#ms - это время,
а I:=strt, - это как понимать? (м.б входу ФБ присвоить значение переменной strt из основной программы)?
Может есть где то более подробные разъяснения в этой части?
Что должно быть в круглых скобках?
PS.
Сделал так:
TP_1(I := strt, T := T#10ms);
strt_1 := TP_1.Q;
вроде заработало.
Правильно я понимаю, что I :=strt - это присвоение входу ФБ TP.SYS значения внешней переменной а strt_1 := TP_1.Q - это присвоение результата работы ФБ уже в следующую переменную?
И забегаявперёд - если нужно будет использовать несколькоблоков TP.SYS то надо будет их нумеровать типа так:
TP_1
TP_2
и т.д.
?
Ну не совсем так. В первом ФБ если подать на вход 1 и убрать то он отсчитывает 10 секунд Если 1 оставить то он продолжает считать бесконечно.
Планировалось сделать что бы внутри ФБ был RTRIG.
Исходя из вашей подсказки после TP_1 в скобках выражение:
T:=10#ms - это время,
а I:=strt, - это как понимать? (м.б входу ФБ присвоить значение переменной strt из основной программы)?
Может есть где то более подробные разъяснения в этой части?
Что должно быть в круглых скобках?
PS.
Сделал так:
TP_1(I := strt, T := T#10ms);
strt_1 := TP_1.Q;
вроде заработало.
Правильно я понимаю, что I :=strt - это присвоение входу ФБ TP.SYS значения внешней переменной а strt_1 := TP_1.Q - это присвоение результата работы ФБ уже в следующую переменную?
И забегаявперёд - если нужно будет использовать несколькоблоков TP.SYS то надо будет их нумеровать типа так:
TP_1
TP_2
и т.д.
?
Все примерно так и есть. Посмотрите базовую информацию по ST в справке по OL (там не очень много, но есть) - нет смысла копировать её сюда.
Где-то на форуме была тема с реализацией ФБ типа "TON", "R_TRIG" и т.п. - поищите, если интересно.
И ещё - вы пытаетесь сделать свой "R_TRIG" на основе системного ФБ "TP.SYS" - при том, что можно просто использовать ФБ "R_TRIG.SYS"
Viktor D
16.10.2024, 05:25
Спасибо за подсказки.
Собственно говоря я уже это читал, просто некотрые моменты не понятны (учился давно по другой специальности (ТМС) и тогда комп был редкость. Проги писали на Фортране на листочке и сдавали преподу, а он окидывал взглядом и выносил вердикт - будет работать или нет).
Цель моих действий сделать ФБ который будет осуществлять следующий алгоритм: вращение вперёд-пауза-вращение назад и всё это повторять в течении определённого времени.
Делаю это для общего развития. На стандартных ФБ из овенлоджика уже сделано, теперь хочу освоить хотя бы в общих чертах ST. Привязаться хочу к функции DT потому как делала в ОЛ на BLINK и CTN и столкнулся с тем, что на длительных выдержках время уходит от встроенных часов из за конечной скорости работы программы. Приходилось вводить коррекцию.
Спасибо за подсказки.
Собственно говоря я уже это читал, просто некотрые моменты не понятны (учился давно по другой специальности (ТМС) и тогда комп был редкость. Проги писали на Фортране на листочке и сдавали преподу, а он окидывал взглядом и выносил вердикт - будет работать или нет).
Цель моих действий сделать ФБ который будет осуществлять следующий алгоритм: вращение вперёд-пауза-вращение назад и всё это повторять в течении определённого времени.
Делаю это для общего развития. На стандартных ФБ из овенлоджика уже сделано, теперь хочу освоить хотя бы в общих чертах ST. Привязаться хочу к функции DT потому как делала в ОЛ на BLINK и CTN и столкнулся с тем, что на длительных выдержках время уходит от встроенных часов из за конечной скорости работы программы. Приходилось вводить коррекцию.
Посмотрите конструкцию SWITCH - для реализации на ST это лучше, чем CTN.
По поводу неточности выдержки времени - я не уверен, что пользуясь внутренним таймером процессора вы не получите таких-же погрешностей на больших интервалах времени. И большая выдержка времени - это сколько в данном случае?
Viktor D
16.10.2024, 06:52
От суток до двух суток. Уже не помню какая там цифра набегала. На практике это и не важно в принципе. Просто тогда мы решили добиться точности и я в BLINK записывал 2 значения вкл - 1мкс, выкл 999мкс. Потом CTN ом считал количество секунд. А потом уже в залитой в ПР программе на макете сравнивал с часами реального времени ПРа и панели СП310. Затем уменьшал время выключенного состояния. Но такая регулировка получилась грубой.
В принципе я хотел привязаться к системным перемненым секунды минуты часы для задачи общего времени выполнения цикла. Короткие промежутки вперёд-стоп-назад не так важны.
Но как сделать не соображу пока.
Опять же это чисто для понимания. На практике оно не так уж важно.
В мануале rp_owen_logic.pdf есть такое:
Функция GET_DATE_TIME
Функция GET_DATE_TIME возвращает значение тип DT (4 байта), содержащее данные часов реального
времени, в секундах с 00:00:00 1.01.2000 г., с учетом часового пояса, установленного в приборе
Может к этой величине привязаться. По идее по ней внутренние часы сс мм чч и т.д. и должны работать.Следовательно расхождений выдержки с часами не должно быть.
Или я что то не понимаю?
In_Da_Cher_A
16.10.2024, 07:15
я может не всё понял, в чём проблема, но на форуме уже были жалобы на низкую точность частов в ПР
От суток до двух суток. Уже не помню какая там цифра набегала. На практике это и не важно в принципе. Просто тогда мы решили добиться точности и я в BLINK записывал 2 значения вкл - 1мкс, выкл 999мкс. Потом CTN ом считал количество секунд. А потом уже в залитой в ПР программе на макете сравнивал с часами реального времени ПРа и панели СП310. Затем уменьшал время выключенного состояния. Но такая регулировка получилась грубой.
В принципе я хотел привязаться к системным перемненым секунды минуты часы для задачи общего времени выполнения цикла. Короткие промежутки вперёд-стоп-назад не так важны.
Но как сделать не соображу пока.
Опять же это чисто для понимания. На практике оно не так уж важно.
В мануале rp_owen_logic.pdf есть такое:
Может к этой величине привязаться. По идее по ней внутренние часы сс мм чч и т.д. и должны работать.Следовательно расхождений выдержки с часами не должно быть.
Или я что то не понимаю?
К точности работы часов реального времени ПР как раз было много претензий.
Если вам точность не сильно важна, то можно использовать их.
По поводу привязки - можете читать через GET_DATE_TIME текущее значение при начале нового периода, прибавлять к нему значение выдержки и ждать достижения этого значения, контролируя текущее значение времени через GET_DATE_TIME
Спасибо за подсказки.
Собственно говоря я уже это читал, просто некотрые моменты не понятны (учился давно по другой специальности (ТМС) и тогда комп был редкость. Проги писали на Фортране на листочке и сдавали преподу, а он окидывал взглядом и выносил вердикт - будет работать или нет).
Цель моих действий сделать ФБ который будет осуществлять следующий алгоритм: вращение вперёд-пауза-вращение назад и всё это повторять в течении определённого времени.
Делаю это для общего развития. На стандартных ФБ из овенлоджика уже сделано, теперь хочу освоить хотя бы в общих чертах ST. Привязаться хочу к функции DT потому как делала в ОЛ на BLINK и CTN и столкнулся с тем, что на длительных выдержках время уходит от встроенных часов из за конечной скорости работы программы. Приходилось вводить коррекцию.
Предлагаю взять этот пример за основу и доработать под Ваши желания:
79431
function_block FPRP
var_input
OnOff : bool; // Управление блоком
end_var
var_output
FW, RW : bool; // Сигналы вперед и назад
end_var
var
State : udint; // Текущее состояние
t : udint; // Метка времени события в мс
end_var
if OnOff then
case State of
0: // Пауза 1 сек перед пуском вперед
if time_to_udint(get_time()) - t >= 1000 then
State := 1; FW := true; RW := false; t := time_to_udint(get_time()); // Пуск вперед
end_if
1: // Вращение вперед 2 сек перед паузой
if time_to_udint(get_time()) - t >= 2000 then
State := 2; FW := false; RW := false; t := time_to_udint(get_time()); // Пауза
end_if
2: // Пауза 1 сек перед пуском назад
if time_to_udint(get_time()) - t >= 1000 then
State := 3; FW := false; RW := true; t := time_to_udint(get_time()); // Пуск назад
end_if
3: // Вращение назад 2 сек перед паузой
if time_to_udint(get_time()) - t >= 2000 then
State := 0; FW := false; RW := false; t := time_to_udint(get_time()); // Пауза
end_if
end_case
else
FW := false; RW := false; State := 0; t := 0;
end_if
end_function_block
почему не просто
t : time;
?
вангую что в else тоже
t := time_to_udint(get_time());
почему не просто
t : time;
?
вангую что в else тоже
t := time_to_udint(get_time());
Хорошо. Как скажите:
function_block FPRP
var_input
OnOff : bool; // Управление блоком
end_var
var_output
FW, RW : bool; // Сигналы вперед и назад
end_var
var
State : udint; // Текущее состояние
t : time; // Метка времени события
end_var
if OnOff then
case State of
0: // Пауза 1 сек перед пуском вперед
if get_time() - t >= T#1s then
State := 1; FW := true; t := get_time(); // Пуск вперед
end_if
1: // Вращение вперед 2 сек перед паузой
if get_time() - t >= T#2s then
State := 2; FW := false; t := get_time(); // Пауза
end_if
2: // Пауза 1 сек перед пуском назад
if get_time() - t >= T#1s then
State := 3; RW := true; t := get_time(); // Пуск назад
end_if
3: // Вращение назад 2 сек перед паузой
if get_time() - t >= T#2s then
State := 0; RW := false; t := get_time(); // Пауза
end_if
end_case
else
FW := false; RW := false; State := 0; t := T#0s;
end_if
end_function_block
Хорошо. Как скажите:
где ж хорошо ? time - это просто дело вкуса не принципиальное, а в else - кранты потенциальные
где ж хорошо ? time - это просто дело вкуса не принципиальное, а в else - кранты потенциальные
Сейчас весь мир на пороге "крантов потенциальных"!
Viktor D
16.10.2024, 09:30
Ну в принципе я так делаю.
Time_1 := GET_DATE_TIME();
curr_t := DT_TO_UDINT (Time_1);
if strt then
trgt_t := curr_t + ust;
end_if
if trgt_t <= curr_t then
out_dsb := true;
out_enb := false;
else
out_dsb := false;
out_enb := true;
end_if
Это просто выдержка времени привязанная к секундам.
Насчёт точности - сравнивал время насчитанное моим макросом в пр с временем панели сп310. Там было расхождение. Опять же сейчас я не решаю какую то конкретную задачу, а учусь писать код на ST. Ну естественно надо что то конкретное делать - вот и практикуюсь.
Viktor D
16.10.2024, 09:35
За пример спасибо - буду разбираться.
Сейчас весь мир на пороге "крантов потенциальных"!
Дык шаг 0 после стопа будет 1 цикл или 1.5 месяца же - как звезды сложатся
Дык шаг 0 после стопа будет 1 цикл или 1.5 месяца же - как звезды сложатся
Вы хотите сказать, что get_time() - T#0s будет < T#1s в течении 1.5 месяцев?
Я думал, Вас беспокоит, что при быстром сбросе OnOff при State := 3; произойдет смена вращения без паузы.
А вообще, я бы с Вами согласился, если бы арифметика была бы со знаком!!!
Давайте предупредим новичков, что get_time() каждые 1.5 месяца обнуляется.
И да, при get_time() = Tmax, какое-то состояние будет выдержано не полностью.
Предлагаю безопасный вариант с предварительной паузой:
function_block FPRP
var_input
OnOff : bool; // Управление блоком
end_var
var_output
FW, RW : bool; // Сигналы вперед и назад
end_var
var
State : udint; // Текущее состояние
t : SYS.TON; // Таймер
end_var
if OnOff then
case State of
0: // Пауза 1 сек перед пуском вперед
t(I:=true, T:=T#1s);
if t.Q then
State := 1; FW := true; t(I:=false); // Пуск вперед
end_if
1: // Вращение вперед 2 сек перед паузой
t(I:=true, T:=T#2s);
if t.Q then
State := 2; FW := false; t(I:=false); // Пауза
end_if
2: // Пауза 1 сек перед пуском назад
t(I:=true, T:=T#1s);
if t.Q then
State := 3; RW := true; t(I:=false); // Пуск назад
end_if
3: // Вращение назад 2 сек перед паузой
t(I:=true, T:=T#2s);
if t.Q then
State := 0; RW := false; t(I:=false); // Пауза
end_if
end_case
else
FW := false; RW := false; State := 0; t(I:=false);
end_if
end_function_block
Вы хотите сказать, что get_time() - T#0s будет < T#1s в течении 1.5 месяцев?
Я думал, Вас беспокоит, что при быстром сбросе OnOff при State := 3; произойдет смена вращения без паузы.
Не. С 1.5мес я погорячился. Не в этом случае.
Потенциальный крантец (в старом варианте) остается из-за практически всегда отсутствия задержки шага 0 после подъема OnOff.
При шаблонном использовании такой конструкции в шаге 0 могут быть какие-то подготовительные действия которые пойдут лесом. Смысл в таймере шага 0?
TON тут не причем, простое t := get_time(); (а не := 0) в else эту проблему решает.
Ну и лично я (дело вкуса) предпочитаю выходы привязывать не в шаге, а к шагу
..
end_case
FW := State = 1;
RW := State = 3;
Там где есть ENUM это максимально наглядно, да и здесь чуть очевидней.
А когда шагов много, еще и
..
end_case
if State <> State_ then //State_ - прошлое значение
State_ := State;
t := get_time();
end_if
Т.е. самовзвод таймера шагов после любого перехода. Но это норм когда само состояние OnOff = false тоже шаг, а не IF (внешний if для case не использую)
Не. С 1.5мес я погорячился. Не в этом случае.
Потенциальный крантец (в старом варианте) остается из-за практически всегда отсутствия задержки шага 0 после подъема OnOff.
При шаблонном использовании такой конструкции в шаге 0 могут быть какие-то подготовительные действия которые пойдут лесом. Смысл в таймере шага 0?
TON тут не причем, простое t := get_time(); (а не := 0) в else эту проблему решает.
Да, но даже в этом случае, когда t станет = Tmax, и на следующем цикле OnOff станет true, а get_time() обнулится - 0-й State будет просто пропущен!!!
Да, но даже в этом случае, когда t станет = Tmax, и на следующем цикле OnOff станет true, а get_time() обнулится - 0-й State будет просто пропущен!!!
Нет
"я бы с Вами согласился, если бы арифметика была бы со знаком!!!" (C)
))
Нет
........
Хорошо один цикл в нем, а надо 1 сек!!!
Хорошо один цикл в нем, а надо 1 сек!!!
Так и будет 1 сек если
else
... t := get_time();
а если
else
... t := t#0s;
то будет 1 цикл, не смотря на
0: // Пауза 1 сек перед пуском вперед
if get_time() - t >= T#1s then
State := 1; FW := true; t := get_time(); // Пуск вперед
end_if
точнее - практически никогда не будет шага 0
Так и будет 1 сек если
else
... t := get_time();
а если
else
... t := t#0s;
то будет 1 цикл, не смотря на
0: // Пауза 1 сек перед пуском вперед
if get_time() - t >= T#1s then
State := 1; FW := true; t := get_time(); // Пуск вперед
end_if
точнее - практически никогда не будет шага 0
Допустим:
else
t := get_time(); // и это значение равно Tmax(1.5мес)
тогда на следующем цикле get_time() := 0 и:
0 - Tmax > T#1s // Истина в этом же цилк и State := 1 тоже в этом же цикле
else
t := get_time(); // и это значение равно Tmax(1.5мес)
Ok. Давайте точнее.
t := udint_to_time(FFFFFFFFh), на калькуляторе можно десятичный вид посмотреть
тогда на следующем цикле get_time() := 0 и:
0 - Tmax > T#1s // Истина в этом же цилк и State := 1 тоже в этом же цикле
Неа
0 - FFFFFFFFh = 1, мс => false
1 - FFFFFFFFh = 2, мс => false
....
1000 - FFFFFFFFh = 1001, мс => true
Viktor D
17.10.2024, 08:44
А можно теперь простыми словами разъяснить суть дискуссии?
И каков правильный вариант.
А можно теперь простыми словами разъяснить суть дискуссии?
И каков правильный вариант.
Правильный вариант, когда в ветке else стоит:
else
t := get_time();
Т.е. на каждом цикле когда OnOff = false ФБ будет t := get_time() для того, чтобы в тот момент, когда OnOff станет true, нормально отработала первая пауза.
Дискуссия возникла из-за недопонимания того, что в беззнаковой арифметике Xmax = 0 - 1,
а значит пауза отработает правильно даже при обнулении get_time() через 4294967296 мс (или примерно через 50 суток).
Если оставить t := T#0s, то в момент когда переполнится get_time() и будет выполняться State = 3 - произойдет реверс без паузы.
Попробуйте быстро выключить и включить OnOff во время вращения назад - произойдет реверс без паузы, а это опасно в большинстве случаев.
Viktor D
18.10.2024, 02:34
Спасибо, оба варианта интересные.
Viktor D
18.10.2024, 06:52
По аналогии с предложенными вариантами получилось вот так - см аттач.
В else закоментированные строки выдают ошибку, но работает и без них. Что то я не понимаю, но что не понимаю - не понимаю. Подправьте как должно быть. И пару слов пояснений если не затруднит.:)
По аналогии с предложенными вариантами получилось вот так - см аттач.
В else закоментированные строки выдают ошибку, но работает и без них. Что то я не понимаю, но что не понимаю - не понимаю. Подправьте как должно быть. И пару слов пояснений если не затруднит.:)
function_block DRIVER_drm //имя функционального блока.
var_input //объявление входных переменных
strt : bool;//старт
stop : bool;//стоп
pause : bool;//пауза
end_var
var_output //объявление выходных переменных
rt_fw : bool;//вращение вперёд
rt_bw : bool;//вращение назад
end_var
var //объявление локальных переменных
State : udint; // Текущее состояние
t : SYS.TON; // Метка времени события
end_var
//CODE
if strt then
case State of
0: t(I:=true, T := t#1s);
if t.Q then State := 1; t(I := false); end_if
1: t(I:=true, T := t#3s);
if t.Q then State := 2; t(I := false); end_if
2: t(I:=true, T := t#1s);
if t.Q then State := 3; t(I := false); end_if
3: t(I:=true, T := t#3s);
if t.Q then State := 0; t(I := false); end_if
end_case
rt_fw := State = 1;
rt_bw := State = 3;
else
State := 0;
t(I := false);
rt_fw := false;
rt_bw := false;
end_if
end_function_block
function_block DRIVER_drm //имя функционального блока.
var_input //объявление входных переменных
strt : bool;//старт
stop : bool;//стоп
pause : bool;//пауза
end_var
var_output //объявление выходных переменных
rt_fw : bool;//вращение вперёд
rt_bw : bool;//вращение назад
end_var
var //объявление локальных переменных
State : udint; // Текущее состояние
t : SYS.TON; // Метка времени события
end_var
//CODE
if strt then
case State of
0: t(I:=true, T := t#1s);
if t.Q then State := 1; t(I := false); end_if
1: t(I:=true, T := t#3s);
if t.Q then State := 2; t(I := false); end_if
2: t(I:=true, T := t#1s);
if t.Q then State := 3; t(I := false); end_if
3: t(I:=true, T := t#3s);
if t.Q then State := 0; t(I := false); end_if
end_case
rt_fw := State = 1;
rt_bw := State = 3;
else
State := 0;
t(I := false);
rt_fw := false;
rt_bw := false;
end_if
end_function_block
мне кажется имеет смысл к этому коду добавить ловлю фронта старта, чтоб если это первый запуск начинать с кейса №1 как просил вопрашающий
Цель моих действий сделать ФБ который будет осуществлять следующий алгоритм: вращение вперёд-пауза-вращение назад и всё это повторять в течении определённого времени.
Viktor D
18.10.2024, 08:11
Спасибо. Работает.
Т.Е. надо просто в отсутствии strt устантвить state 0 (первая ступень цикла) и присвоить t : SYS.TON; логический 0.
А что в таком случае будет происходить при переполнении get_time()? Или при использовании SYS.TON это не важно?
мне кажется имеет смысл к этому коду добавить ловлю фронта старта, чтоб если это первый запуск начинать с кейса №1 как просил вопрашающий
Да, неплохо бы. Хотя после снятия сигнала со входа ПР цикл и так начинается сначала. Что было бы полезнее - это по заднему фронту strt делать паузу и потом возобновление процесса с того же момента. А вообще в проекте на стандартных ФБ в Овенлоджике у меня сделано три кнопки старт, пауза и стоп и по передним фронтам от их нажатия осуществляется управление. Но наверное это сильно здесь всё усложнит.
Буду думать .
Спасибо за подсказки.
Что мне интересно - это как вот здесь t(I:=true, T := t#1s); менять время t с входной переменной.
Спасибо. Работает.
Т.Е. надо просто в отсутствии strt устантвить state 0 (первая ступень цикла) и присвоить t : SYS.TON; логический 0.
А что в таком случае будет происходить при переполнении get_time()? Или при использовании SYS.TON это не важно?
Если Вы используете SYS.TON, то get_time() - не нужен и наоборот.
Попробуйте понять как работает этот вариант, где нет ни того ни другого:
function_block DRV
var_input
Start : bool;
Stop : bool;
tStart : udint;
tStop : udint;
end_var
var_output
FW : bool;
RW : bool;
end_var
var
btn : SYS.RS;
bl : SYS.BLINK;
st : SYS.CTN;
end_var
btn(S := Start, R := Stop);
bl(I := btn.Q, Th := udint_to_time(tStart), Tl := udint_to_time(tStop));
st(U := bl.Q, R := st.Q = 2);
FW := (st.Q = 0) and bl.Q;
RW := (st.Q = 1) and bl.Q;
end_function_block
capzap предложил Вам добавить в код:
if strt then OnOff := true; end_if // Фиксируем состояние входа "Старт"
if stop then OnOff := false; end_if // Но "Стоп" является приоритетом, но тогда...
if OnOff then // вместо if strt then
Некоторые пишут так:
OnOff := (OnOff or strt) and not stop;
Можно входные переменные вставлять в параметры других блоков, например:
t(I:=true, T:=udint_to_time(ust_p)); // где ust_p задается в миллисекундах!!!
Viktor D
18.10.2024, 08:54
Насколько я понял на входе детектор переднего фронта, далее имеем генератор который выдаёт импульсы длительность которых задаётся соответствующими входными переменными и наконец счётчик всё считает и по его результату переключаются входы.
Правильно я понял?
На стандартных ФБ я так примерно и делал, только там BLINK выдавал импульсы в 1 сек, а счётчик их считал (сколько задано по входной переменной). В таком варианте поставив BLINK на паузу (сняв входной сигнал) весь процесс становиться на паузу и продолжается с того же места.
Остальное (как отловить входной фронт и вставить переменную в ФБ) вроде понятно. Надо будет попробовать применить на практике.
Для меня сложно угадать правильный синтаксис. С вашими примерами многое становиться понятно.
Спасибо за подсказки.
Добавлен автостоп по истечении tWork:
function_block DRV
var_input
Start : bool;
Stop : bool;
tStart : udint;
tStop : udint;
tWork : udint; // Время работы блока
end_var
var_output
FW : bool;
RW : bool;
end_var
var
btn : SYS.RS; // Кнопка фиксирующая Start/Stop
bl : SYS.BLINK; // Генератор времени вращения и паузы
st : SYS.CTN; // Переключатель направления вращения
tW : SYS.TON; // Таймер работы блока
end_var
btn(S := Start, R := Stop or tW.Q); // Кнопка которая фиксирует Start и сбрасывает по Stop или по таймеру tW
tW(I := btn.Q, T := udint_to_time(tWork)); // Таймер, который работает пока кнопка в состоянии Start
bl(I := btn.Q, Th := udint_to_time(tStart), Tl := udint_to_time(tStop)); // Переключатель Вращение/Пауза
st(U := bl.Q, R := st.Q = 2); // Счетчик вращений от 0 до 1
FW := (st.Q = 0) and bl.Q; // Счетчик и переключатель определяют состояние выходов
RW := (st.Q = 1) and bl.Q;
end_function_block
Самый лучший способ научиться - это читать чужой код (только хороший код - это проблема).
Профи не любят им делиться - хлеб свой отдавать кому-то, но очень любят стебаться над новичками (даже здесь есть дедовщина).
Viktor D
18.10.2024, 09:25
Ну я так и пытаюсь делать.:)
Непонятно как работает во эта строка
st(U := bl.Q, R := st.Q = 2); // Счетчик вращений от 0 до 1
конкретно
R := st.Q = 2 - это что делает?
Ну я так и пытаюсь делать.:)
Непонятно как работает во эта строка
st(U := bl.Q, R := st.Q = 2); // Счетчик вращений от 0 до 1
конкретно
R := st.Q = 2 - это что делает?
Счетчик сбрасывается в 0 при R = true, т.е. как только он досчитает до 2, то на следующем цикле счетчик сбросится.
Счетчик можно заменить на направление вращения:
function_block DRV
var_input
Start : bool;
Stop : bool;
tStart : udint;
tStop : udint;
tWork : udint; // Время работы блока
end_var
var_output
FW : bool;
RW : bool;
end_var
var
bl : SYS.BLINK; // Генератор времени работы и паузы
tW : SYS.TON; // Таймер работы блока
tr : SYS.FTRIG; // Переход на паузу
dir : bool; // Направление вращения
OnOff : bool; // Кнопка
end_var
OnOff := (OnOff or Start) and not (Stop or tW.Q);
tW(I := OnOff, T := udint_to_time(tWork));
bl(I := OnOff, Th := udint_to_time(tStart), Tl := udint_to_time(tStop));
tr(I := bl.Q); if tr.Q then dir := not dir; end_if
FW := not dir and bl.Q;
RW := dir and bl.Q;
end_function_block
Viktor D
18.10.2024, 10:37
То есть когда Q = 2 тогда происходит R - reset и опять на входе 0.
Viktor D
20.10.2024, 03:20
Пока ждал информация устарела. Чуть позже выложу новый вариант.
Viktor D
22.10.2024, 08:48
Ну собственно говоря используя все предложенные подсказки удалось сделать первый собственный ФБ на ST.
Кому интересно см. прикреплённый файл.
Критика приветствуется.
По ходу дела возник вопрос: Есть ли возможность переменные внутри ФБ сделать энергонезависимыми, что бы при отключении питания состояния счётчиков запоминалось?
kondor3000
22.10.2024, 09:12
По ходу дела возник вопрос: Есть ли возможность переменные внутри ФБ сделать энергонезависимыми, что бы при отключении питания состояния счётчиков и запоминалось?
Внутри нет, надо делать вход и выход и запоминать снаружи.
А вот константы можно было ввести в блоке, а не снаружи.
Viktor D
22.10.2024, 09:44
Константы они только пока константы. В проекте они будут переменными и будут задаваться с панели управления. Здесь я их просто сделал константами что бы постоянно не вводить при симуляции.
А насчёт энергонезависимости - жаль что так. Придётся что то изобретать.
собственно говоря надо запоминать текущие состояния счётчиков и при повторном включении его восстанавливать. Опять же если каждую секунду перезаписывать их то наверное быстро энергонезависимая память в ПР выйдет из строя
kondor3000
22.10.2024, 10:06
Константы они только пока константы. В проекте они будут переменными и будут задаваться с панели управления. Здесь я их просто сделал константами что бы постоянно не вводить при симуляции.
А насчёт энергонезависимости - жаль что так. Придётся что то изобретать.
собственно говоря надо запоминать текущие состояния счётчиков и при повторном включении его восстанавливать. Опять же если каждую секунду перезаписывать их то наверное быстро энергонезависимая память в ПР выйдет из строя
Типичное заблуждение, работа идёт в ОЗУ, запоминание происходит только в момент выключения питания ПР.
Так что выводить можно каждый цикл.
А вот в панели записывать лучше редко, например при нажатии кнопки Стоп, в конце смены.
Viktor D
22.10.2024, 11:03
Понятно. Спасибо.
А в панели хранятся только уставки времени и другие и то когда они записываются в ПР, то в энергонезависимые переменные.
Viktor D
05.11.2024, 14:09
Доброго дня всем.
Возник такой вопрос:
Допустим есть входная переменная в ФБ, которая привязана к инверсивной кнопке на панели управления. По её значению переключаются 2 выходные переменные. Что произойдёт с выходными сигналами ФБ при отключении питания панели если с панели приходило значение входной переменной true?
spd_sr_trig(S := spd_sel, R := not spd_sel);
spd_1 := not spd_sr_trig.Q; spd_2 := spd_sr_trig.Q;
kondor3000
05.11.2024, 14:22
Доброго дня всем.
Возник такой вопрос:
Допустим есть входная переменная в ФБ, которая привязана к инверсивной кнопке на панели управления. По её значению переключаются 2 выходные переменные. Что произойдёт при отключении питания панели если с панели приходило значение входной переменной true?
spd_sr_trig(S := spd_sel, R := not spd_sel);
spd_1 := not spd_sr.Q; spd_2 := spd_sr.Q;
Вам проверить быстрее, чем ждать ответа.
Так как код выложен не весь и что на входах и выходах ФБ тоже не известно.
Viktor D
05.11.2024, 14:28
Сейчас я в отпуске, а всё железо на работе. Конечно проверил бы сам.
kondor3000
05.11.2024, 14:30
Сейчас я в отпуске, а всё железо на работе. Конечно проверил бы сам.
Если ПР слейв, то вход останется TRUE, и выходные переменные останутся как до отключения панели.
Viktor D
05.11.2024, 17:58
Спасибо. Буду пока програмку дома кодить.
еще
Доброго дня всем.
Возник такой вопрос:
Допустим есть входная переменная в ФБ, которая привязана к инверсивной кнопке на панели управления. По её значению переключаются 2 выходные переменные. Что произойдёт с выходными сигналами ФБ при отключении питания панели если с панели приходило значение входной переменной true?
spd_sr_trig(S := spd_sel, R := not spd_sel);
spd_1 := not spd_sr_trig.Q; spd_2 := spd_sr_trig.Q;
==>
выкидывается тригер за ненадобностью и просто
spd_1 := not spd_sel;
spd_2 := spd_sel;
Viktor D
08.11.2024, 12:33
Спасибо за совет. Просто я думал, если входной сигнал пропадёт то триггер будет запоминать последнее состояние входа.
kondor3000
08.11.2024, 13:42
Спасибо за совет. Просто я думал, если входной сигнал пропадёт то триггер будет запоминать последнее состояние входа.
Чтобы триггер запомнил состояние, он должен быть энергонезависимый. Схемы таких триггеров, скрин 79921
На ST, входная и выходная переменная должна запоминаться вне блока. Если триггеров много, то запоминать маской бит.
Viktor D
11.12.2024, 18:20
Появился ещё один вопрос. У меня в проекте есть несколько ПР200 с идентичными программами. Отличаются только адресом Cam. для каждого приходится создавать отдельное окно и в нём переназначать номера регистров.
Может быть есть какой то способ использовать одно окно и из него обращаться к разным ПР200?
kondor3000
11.12.2024, 18:31
Появился ещё один вопрос. У меня в проекте есть несколько ПР200 с идентичными программами. Отличаются только адресом Cam. для каждого приходится создавать отдельное окно и в нём переназначать номера регистров.
Может быть есть какой то способ использовать одно окно и из него обращаться к разным ПР200?
Адреса регистров не надо менять, надо менять адрес ПР
Viktor D
18.12.2024, 04:35
Доброй ночи.
Прошу помощи в следующем вопросе:
Хочу сделать ФБ для имитации токового датчика (температуры или другого какого типа). Смысл в том, что бы можно было имитировать работу датчика вращая энкодер.
Собственно говоря частично получилось. На выходе целые числа 0 1 2 3 и тд. Если это считать милиамперами, то регулировка получается грубой. Если сделать счёт такой: 401 402 403 и потом всё разделить на 10, то получается приемлемо, но до 4 мА долго крутить ручку.
В ФБ я сделал 2 варианта подсчёта с множителями х1 и х10.Переключение по кнопке энкодера. Только почему то при переключении накопленное значение меняется либо на 1 либо на 10. Подскажите как решить вопрос. Чего то я не знаю ещё.
На выходе мне нужно число с плавающей запятой с точностью до десятых в пределах 4,0 --- 20,0 и что бы по нажатию кнопки менялись либо десятые либо единицы.
function_block encoder_1_
var_input
in_1 : bool;
in_2 : bool;
reset : bool;
end_var
var_output
Q_int : udint;
Q_float : real;
end_var
var
in_1_rt : SYS.RTRIG;
in_2_rt : SYS.RTRIG;
in_1_tof : SYS.TOF;
in_2_tof : SYS.TOF;
ctn : SYS.CTN;
reset_ctn : SYS.CTN;
mul_ctn : udint;
res_int1 : udint;
res_int2 : udint;
res_1 : udint;
res_2 : udint;
stop_u : bool;
stop_d : bool;
ctn_r : bool;
end_var
(*код программы*)
in_1_tof(I := in_1 T := t#100ms); in_1_rt(i:=in_1);
in_2_tof(I := in_2 T := t#100ms); in_2_rt(i:=in_2);
reset_ctn(U := reset, R := reset_ctn.Q = 2 N := 0);
if reset_ctn.Q = 0 then mul_ctn := 1;
elsif reset_ctn.Q = 1 then mul_ctn := 2;
else mul_ctn := 0;
end_if
case mul_ctn of
1:
ctn(U := in_1_rt.Q and not stop_u and not in_2_tof.Q, D := in_2_rt.Q and not stop_d and not in_1_tof.Q);
stop_u := ctn.Q = 200;
stop_d := ctn.Q = 0;
res_int1 := ctn.Q;
2:
ctn(U := in_1_rt.Q and not stop_u and not in_2_tof.Q, D := in_2_rt.Q and not stop_d and not in_1_tof.Q);
stop_u := ctn.Q = 20;
stop_d := ctn.Q = 0;
res_int2 := ctn.Q*10;
end_case
//дальше я не понимаю как сделать
res_1:=res_int1; res_2:=res_int2;
Q_int := res_1 + res_2;
Q_float := udint_to_real(Q_int/10);
Доброй ночи.
Прошу помощи в следующем вопросе:
Хочу сделать ФБ для имитации токового датчика (температуры или другого какого типа). Смысл в том, что бы можно было имитировать работу датчика вращая энкодер.
Собственно говоря частично получилось. На выходе целые числа 0 1 2 3 и тд. Если это считать милиамперами, то регулировка получается грубой. Если сделать счёт такой: 401 402 403 и потом всё разделить на 10, то получается приемлемо, но до 4 мА долго крутить ручку.
В ФБ я сделал 2 варианта подсчёта с множителями х1 и х10.Переключение по кнопке энкодера. Только почему то при переключении накопленное значение меняется либо на 1 либо на 10. Подскажите как решить вопрос. Чего то я не знаю ещё.
На выходе мне нужно число с плавающей запятой с точностью до десятых в пределах 4,0 --- 20,0 и что бы по нажатию кнопки менялись либо десятые либо единицы.
Попробуйте так:
function_block encoder_1_
var_input
in_1 : bool;
in_2 : bool;
reset : bool;
N: real := 0.1;
end_var
var_output
count : real := 4;
end_var
var
in_1_rt : SYS.RTRIG;
in_2_rt : SYS.RTRIG;
in_1_tof : SYS.TOF;
in_2_tof : SYS.TOF;
end_var
in_1_tof(I := in_1 T := t#100ms); in_1_rt(i:=in_1);
in_2_tof(I := in_2 T := t#100ms); in_2_rt(i:=in_2);
if reset then count := 4.0;
else
if in_1_rt.Q and not in_2_tof.Q then count := count + N;
elsif in_2_rt.Q and not in_1_tof.Q then count := count - N;
end_if
end_if
if count > 20.0 then count := 20.0; end_if
if count < 4.0 then count := 4.0; end_if
end_function_block
Дискретность изменения выхода задаётся на одном из входов блока (N) - можете сами прикрутить туда то, как хотите её изменять
Viktor D
18.12.2024, 10:12
Спасибо. Ваш вариант проще.
Буду экспериментировать.
Может быть есть смысл подсчёт вести не в целых числах, а десятичных и прибавлять/вычитать либо 1 либо 0.1 и это как то переключать....
А по ресету устанавливать 12мА - середину диапазона.
Надо пробовать разные варианты.
Viktor D
18.12.2024, 17:53
Вы практически точно всё напсали. Единственное уставку по ресету нужно было делать через триггер. Иначе так и висит 4 .
function_block encoder_123_
var_input
in_1 : bool;
in_2 : bool;
reset : bool;
t_step : bool;
end_var
var_output
count : real := 4;
end_var
var
in_1_rt : SYS.RTRIG;
in_2_rt : SYS.RTRIG;
in_1_tof : SYS.TOF;
in_2_tof : SYS.TOF;
reset_rtr : SYS.RTRIG;
N : real;
end_var
//================================================== ================================================== =========
in_1_tof(I := in_1 T := t#100ms); in_1_rt(i:=in_1);
in_2_tof(I := in_2 T := t#100ms); in_2_rt(i:=in_2);
reset_rtr(I:=reset);
if t_step = true then N := 1; elsif t_step = false then N := 0.1; end_if
if reset_rtr.Q then count := 12.0;
else
if in_1_rt.Q and not in_2_tof.Q then count := count + N;
elsif in_2_rt.Q and not in_1_tof.Q then count := count - N;
end_if
end_if
if count > 20.0 then count := 20.0; end_if
if count < 4.0 then count := 4.0; end_if
//================================================== ================================================== ==========
end_function_block
Спасибо
Viktor D
27.04.2025, 04:44
Приветствую всех кто читает эту тему.
По ходу работы возникла проблема на ровном месте, но как решить не понятно.
В проекте на сп310 есть несколько экранов для управления несколькими ПР200.
В частности экран 1 управляет пр200 №1 экран2 пр200 №2 и т.д.
Но поскольку все элементы управления на один экран не поместились, пришлось на каждый Пр200 добавить ещё по экрану.
Так вот: например для пр200 № 1 есть экраны №1 и №7.
Экран №1работает нормально, а сэкрана №7 нет отклика ни на одну команду на ПР200.
Самое тнтересное, что сначала всё работало, но на каком то этап я что то сделал, сам не пойму что и всё стало так как есть.
Интересный момент, если на экране №7 дополнительно открыть окно с любым элементом управления ПР200 №1 (например кнопка которая обращается к регистру 574 или др.№) , то работоспособность восстанавливается.
Кто сталкивался с пообным - подскажите что искать?
МихаилГл
27.04.2025, 05:04
Все с таким сталкивались, и у каждого свои причины таких аварий или неработоспособности.
Что вам мешает приложить исходник для СП, что бы вам подсказали конкретно именно по вашей проблеме, а не это вот гадание на кофейной гуще?
Viktor D
27.04.2025, 05:13
Вот файл проекта. См.экран 7 На нём кнопка "ПС" открывает окно 7 и тогда всё работает. Из окна 7 можно обращатся к любому регистру PLC. Если окно пустое, то тоже нет отклика от экрана 7.
МихаилГл
27.04.2025, 06:53
Открыл... Пока не понял что тут не так, но у вас некоторые кнопки с мониторингом, некоторые без. Некоторые с типом "пока нажата", другие с "инверсия". Так и задумано? Вы все регистры в ПР прописали?
Выдаете конкретную последовательность, что вы делаете, что нажимаете, и что должно быть.
Одно замечание. Если вы делаете видимость на экране элемента, который перекрывает другой элемент, то под ним кнопки все равно активны, в симуляции точно, на панели вроде тоже этот баг есть.
Viktor D
27.04.2025, 16:18
Да, всё так и есть. Все кнопки работают по разному.
Я программу уже отлаживал на отдельном ПР200 с двумя модулями расширения. Что бы не собирать внешние цепи в отдельном окне (№7) сделал имитацию их срабатывания. В тот момент всё работало как надо.
Что то произошло в тот момент когда я стал переносить программу в собранный щит с 3-мя ПР200 (всего рассчитано на 6). 2 на вращение барабана и подачу химии(в них программа одинаковая, номера их 1 и 2. И третий - дозировка воды (в нём программа другая он №10).
Сейчас вернул всё на тот ПР на котором отлаживал программу и там теперь тоже она перестала работать.
Выкладываю все три файла в этом посте. (слегка может отличаться от предыдущего, поскольку я уже пытался что то исправить.)
Насчёт перекрытия кнопок я в курсе.
Насчёт того, что бы объяснить последовательность действий - это слишком большая история. Вкратце, касательно экрана 7, - дозируется 4 разных химиката в мерник. Либо по токовому зонду (линейный потенциометр 4-20 мА) либо по контактным зондам, выбор осуществляется программно.
По идее если залить программу в ПР200 с 2 мя модулями расширения и в комплекте с сп310 всё должно работать без дополнительных внешних цепей.
Да, всё так и есть. Все кнопки работают по разному.
Я программу уже отлаживал на отдельном ПР200 с двумя модулями расширения. Что бы не собирать внешние цепи в отдельном окне (№7) сделал имитацию их срабатывания. В тот момент всё работало как надо.
Что то произошло в тот момент когда я стал переносить программу в собранный щит с 3-мя ПР200 (всего рассчитано на 6). 2 на вращение барабана и подачу химии(в них программа одинаковая, номера их 1 и 2. И третий - дозировка воды (в нём программа другая он №10).
Сейчас вернул всё на тот ПР на котором отлаживал программу и там теперь тоже она перестала работать.
Выкладываю все три файла в этом посте. (слегка может отличаться от предыдущего, поскольку я уже пытался что то исправить.)
Насчёт перекрытия кнопок я в курсе.
Насчёт того, что бы объяснить последовательность действий - это слишком большая история. Вкратце, касательно экрана 7, - дозируется 4 разных химиката в мерник. Либо по токовому зонду (линейный потенциометр 4-20 мА) либо по контактным зондам, выбор осуществляется программно.
По идее если залить программу в ПР200 с 2 мя модулями расширения и в комплекте с сп310 всё должно работать без дополнительных внешних цепей.
У вас вот здесь адреса идут не по порядку (некоторые пропущены). Возможно панель делает групповые запросы, включающие пропущенные регистры, а ПР отвечает ошибкой. Попробуйте организовать адресное пространство сетевых переменных ПР без разрывов (ну и в проекте панели конечно адреса поправьте соответственно)
83498
Второй проект ПР не смотрел, проверьте сами
Viktor D
27.04.2025, 19:08
Если быть точным, то речь идёт о проекте "Вращение Химия". Может быть вы смотрели "Водоподготовка", но не это важно.
Да такое дело есть, в обоих проектах. Но оно так работало. Просто те регистры, что в конце я использовал для передачи 16 булевских переменных через один регистр и разместил их в конце списка, что бы было удобно. Переменные начиная с 568 регистра используются в одном и том же ПР и для вращения барабана и для дозировки химии, при этом первое работает а второе нет. Получается нелогично. Регистры 570 571 572 573 работают а 574 575 568 569 нет.
Доберусь до оборудования только во вторник. Буду проверять ваш вариант.
Хотя наверное проще сделать "обманку" в виде скрытого окна. С ним то всё работает. Каким образом его открытие поверх экрана влияет на работоспособность - непонятно.
Если быть точным, то речь идёт о проекте "Вращение Химия". Может быть вы смотрели "Водоподготовка", но не это важно.
Да такое дело есть, в обоих проектах. Но оно так работало. Просто те регистры, что в конце я использовал для передачи 16 булевских переменных через один регистр и разместил их в конце списка, что бы было удобно. Переменные начиная с 568 регистра используются в одном и том же ПР и для вращения барабана и для дозировки химии, при этом первое работает а второе нет. Получается нелогично. Регистры 570 571 572 573 работают а 574 575 568 569 нет.
Доберусь до оборудования только во вторник. Буду проверять ваш вариант.
Хотя наверное проще сделать "обманку" в виде скрытого окна. С ним то всё работает. Каким образом его открытие поверх экрана влияет на работоспособность - непонятно.
Как вариант - просто добавьте в ПР регистров-пустышек в эти промежутки и обязательно вытащите их на поляну в режиме записи в них значения (можно ничего не привязывать на их вход)
Viktor D
27.04.2025, 20:03
А вот это уже хорошая мысль. С неё и начну.
Хотя уже пробовал создать кнопку с номером регистра 568 и разместить на экране. Не сработало. Может надо именно разрыв последовательности в ПР заполнить....
kondor3000
27.04.2025, 20:06
Если быть точным, то речь идёт о проекте "Вращение Химия". Может быть вы смотрели "Водоподготовка", но не это важно.
Да такое дело есть, в обоих проектах. Но оно так работало. Просто те регистры, что в конце я использовал для передачи 16 булевских переменных через один регистр и разместил их в конце списка, что бы было удобно. Переменные начиная с 568 регистра используются в одном и том же ПР и для вращения барабана и для дозировки химии, при этом первое работает а второе нет. Получается нелогично. Регистры 570 571 572 573 работают а 574 575 568 569 нет.
Как раз последние регистры использованы в 7 окне 83500 и только одна кнопка с мониторингом.
И тут из последних регистров с мониторингом 83501
Viktor D
27.04.2025, 20:10
Как раз последние регистры использованы в 7 окне и мониторинге 83499
Да так работает. Посмотрите связку экран 1 и окно 1 там всё работает в этих же Пр и панели оператора. Например кнопки "Старт", "Пауза".
Я пробовал из 7го окна все кнопки удалять (при этом работать перестаёт) и просто там создать кнопку с PLC адресом 568 15 (без мониторинга) (при этом работоспособность восстанавливается независимо от того нажата кнопка или нет).
Так же пробовал всё то же с другим окном в частности №8. Так же работает при его открытии.
Пробовал так же 569 регистр вообще удалить из Пр и панели и вместо него на окне 7 разместить кнопку с любым другим. Так тоже работает.
Мистика какая то.
Сейчас Всё на работе проверить не могу, только во вторник.
Что то произошло со свойствами экрана 7. Хотя я переносил все элементы управления на другой экран (8) получил ту же проблему.
kondor3000
27.04.2025, 20:13
Да так работает. Посмотрите связку экран 1 и окно 1 там всё работает в этих же Пр и панели оператора. Например кнопки "Старт", "Пауза".
Я пробовал из 7го окна все кнопки удалять (при этом работать перестаёт) и просто там создать кнопку с PLC адресом 568 15 (без мониторинга) (при этом работоспособность восстанавливается независимо от того нажата кнопка или нет).
Я к этому и веду, какой то адрес пропущен на экране и присутствует в окне. Скорее всего как раз 568.
Панель их или читает или тормозит, из-за 568 адреса.
Viktor D
27.04.2025, 20:39
Похоже на то. Надо все слои "растаскивать" и перепроверять. Там ещё на экране несколько скрытых сообщений с битом видимости и всё "стопкой" сложено.
Хотя я уже выше писал, что 568 регистр вообще удалял и в окно вставлял кнопку с другим.... Работает так.
Viktor D
08.08.2025, 15:18
Доброго дня всем.
Возник такой дилетантский вопрос. Возможно ли на панели СП310 для многоугольника с заливкой сделать бит видимости. Т.е. Сделать его появляющимся по сигналу скажем с ПР200 или внутреннегорегистра панели?
Может где уже обсуждалос, подскажите.
НЯП, это невозможно для всех объектов типа "Графика". Попробуйте Инструменты->Анимация->Изображения, например.
Многоугольник предварительно нарисуйте хоть в том же Paint'е
... Возможно ли на панели СП310 для многоугольника с заливкой сделать бит видимости. Т.е. Сделать его появляющимся по сигналу скажем с ПР200 или внутреннегорегистра панели...
Можно.
Но через анус. Привяжите положение многоугольника (горизонт или вертикаль) к какому-нить регистру. Пишите инверсно свой бит видимости в один любого из 10й...15й-бит этого регистра. И всё.
Или ФО с копированием и инверсией прямой видимости в тот же регистр положения (PSW[x])
видимость => PSW[x+1].15
PSW[x] <= 32768 - PSW[x+1]
Или с макросами. Более ясно, но тут их не все любят
Доброго дня всем.
Возник такой дилетантский вопрос. Возможно ли на панели СП310 для многоугольника с заливкой сделать бит видимости. Т.е. Сделать его появляющимся по сигналу скажем с ПР200 или внутреннегорегистра панели?
Может где уже обсуждалос, подскажите.
https://owen.ru/forum/attachment.php?attachmentid=85259&d=1754692275
А как получить доступ к этим дополнительным элементам?
Viktor D
14.08.2025, 15:39
Доброго дня всем.
Прежде всего спасибо всем, кто помогает с ответами на мои дилетантские вопросы. Я не каждый раз отписываюсь, но с вашей помощью иду вперёд и на данном этапе всё удалось решить.
Сегодня же столкнулся с таким казусом.
Понадобилось сделать макрос для Овенлоджика который округляет число с плавающей запятой при переходе через значение 0.5 и умножает результат на 10.
например: 1,499 = 14 а 1,500 = 15, соответственно в панели СП310 будет отображаться 1,5 и 1,6
Нужно это, что бы не занимать лишний регистр при передаче значения, например температуры (с точностью 0,1), в панель.
Вот что у меня получилось
function_block r_t_u_//преобразование числа real в udint с округлением до 0.1 и умножением на 10
var_input
inp : real;
end_var
var_output
Q_r : real;
Q_u : udint;
end_var
var
inp_1 : udint;
end_var
//================================================== ================================================== ============================
(*код программы*)
Q_r := inp;
inp_1 := real_to_udint(inp*1000) mod 1000;
if inp_1 > 500 then Q_u := real_to_udint(inp*10) + 1; else Q_u := real_to_udint(inp*10); end_if
end_function_block
Вроде работает, но только если внешний выход макроса (который real) подключен к какой либо прееменной.
Если нет, то не работает.
(Специально пришлось в макросе прописать: Q_r := inp)
Соответственно картинки 1 и 2
85310
85311
Можно ли сделать так, что бы у макроса был только выход с целочисленным значением?
kondor3000
14.08.2025, 15:56
Всё работает, при подключении любой из переменных 85308
И это не макрос, а ФБ на ST
А у вас просто вторая переменная не энергонезависимая (не сетевая и не экранная).
Viktor D
14.08.2025, 17:20
Спасибо. Действительно если сделать переменную энергонезависимой то всё работает.
А насчёт макроса и ФБ - это я перепутал термины:)
Здравствуйте.
Прошу помощи.
Связка СП307-Б и ПР100-24.1203.03.1 (М02).
Пытаюсь отобразить на панели индикаторами состояние дискретных входов. Делаю это, присваивая индикаторам адреса 0х4096...4103. Всё работает.
Я использую также один аналоговый вход в качестве дискретного - в программе на ПРку соответствующие настройки сделал - он работает.
Теперь, как только на панели я добавляю индикатор с адресом 0х4112 (AI1 в дискретном режиме) этот индикатор не отображается и все остальные (0х4096...4103) тоже перестают.
При этом индикаторы, привязанные к дискретным выходам (0х0..9) продолжают отображаться.
Подскажите как быть?
kondor3000
26.08.2025, 18:45
Здравствуйте.
Прошу помощи.
Связка СП307-Б и ПР100-24.1203.03.1 (М02).
Пытаюсь отобразить на панели индикаторами состояние дискретных входов. Делаю это, присваивая индикаторам адреса 0х4096...4103. Всё работает.
Я использую также один аналоговый вход в качестве дискретного - в программе на ПРку соответствующие настройки сделал - он работает.
Теперь, как только на панели я добавляю индикатор с адресом 0х4112 (AI1 в дискретном режиме) этот индикатор не отображается и все остальные (0х4096...4103) тоже перестают.
При этом индикаторы, привязанные к дискретным выходам (0х0..9) продолжают отображаться.
Подскажите как быть?
Попробуйте прочитать из панели 4х4112 бит 0, но есть большие сомнения, битовых сетевых в ПР слейве нет, а целое может не пройти.
Правильней будет присвоить бит из AI1, после конвертации в целое, в сетевую переменную, например регистр 512
и читать как 0 бит 512 регистра (4х512 бит 0).
Можно упаковать биты в маску и передать до 16 бит одним регистром.
Попробуйте прочитать из панели 4х4112 бит 0, но есть большие сомнения
Не работает.
Привязать к этому входу переменную и потом её упаковать в маску - работает.
Хотелось обойтись по-простому. Тем более, что вроде как в мануале описана такая возможность.
... адреса 0х4096...4103. Всё работает.
... добавляю индикатор с адресом 0х4112 ... этот индикатор не отображается и все остальные (0х4096...4103) тоже перестают....
Возможно что панель запрашивает сразу 17 (или ?) бит (4096...4112, протокол это не запрещает) а ПР это не вывозит или есть пропуски на которые не может положить болт. Часто встречается оборудование которое с какого-то считает что модбасные битовые должны быть с какой-то кратностью в адресации и кол-ве, хотя штатно модбасу на это класть. Точно можно сказать снифернув посылку от панели и ответ ПР.
Обходите маской как сделали и забудьте.
Здравствуйте.
Прошу помощи.
Связка СП307-Б и ПР100-24.1203.03.1 (М02).
Пытаюсь отобразить на панели индикаторами состояние дискретных входов. Делаю это, присваивая индикаторам адреса 0х4096...4103. Всё работает.
Я использую также один аналоговый вход в качестве дискретного - в программе на ПРку соответствующие настройки сделал - он работает.
Теперь, как только на панели я добавляю индикатор с адресом 0х4112 (AI1 в дискретном режиме) этот индикатор не отображается и все остальные (0х4096...4103) тоже перестают.
При этом индикаторы, привязанные к дискретным выходам (0х0..9) продолжают отображаться.
Подскажите как быть?
Возможно что панель запрашивает сразу 17 (или ?) бит (4096...4112, протокол это не запрещает) а ПР это не вывозит или есть пропуски на которые не может положить болт. Часто встречается оборудование которое с какого-то считает что модбасные битовые должны быть с какой-то кратностью в адресации и кол-ве, хотя штатно модбасу на это класть. Точно можно сказать снифернув посылку от панели и ответ ПР.
Обходите маской как сделали и забудьте.
Валенок прав. Т.к панель делает групповые запросы по 16 регистров или по 16 бит в однм запросе и если в группу попадает адрес не существующего бита или регистра, то происходит ошиббка связи. А ОВЕН выкинул из шаблона проектов вызов системного окна о потери связи, по этому Вы просто наблюдаете, что все индикаторы из группы как бы перестают отображаться.
Обмануть панель не сложно.
Запретить включать бит 0х4112 в групповой запрос можно если для этого индикатора включить динамическую адресацию
85433
Индексный регистр можно указать ЛЮБОЙ !
85434
Главное коэффициент сделать равным 0
85435
Viktor D
04.09.2025, 20:05
Доброго вечера всем.
У меня такая ситуация. Есть панель СП315 (мастер) и по модбасу к ней подключены 2 ПР 200 (слейвы). В каждом своя программа. Нужно сделать так, что бы ПР 200 могли обмениваться между собой булевскими переменными и желательно помимо панели. Т.К. предполагается, что панель будет отключаться и ПР-ы работать автономно.
Сергей0308
04.09.2025, 20:24
Доброго вечера всем.
У меня такая ситуация. Есть панель СП315 (мастер) и по модбасу к ней подключены 2 ПР 200 (слейвы). В каждом своя программа. Нужно сделать так, что бы ПР 200 могли обмениваться между собой булевскими переменными и желательно помимо панели. Т.К. предполагается, что панель будет отключаться и ПР-ы работать автономно.
Это же проще пареной репы, в смысле ПР200 может иметь до двух(включительно) сетевых интерфейса, короче, второй интерфейс на каждом ПР используйте для связи ПР между собой, всё!
Если сразу купите ПР200 с двумя сетевыми интерфейсами ещё и денег сэкономите, в смысле, чем потом их докупать, короче, счастье Вам привалит!
Viktor D
04.09.2025, 21:07
Проблема в том, что на работе есть только пр-ки с одним интерфесом. На них и надо делать.
kondor3000
04.09.2025, 21:21
Проблема в том, что на работе есть только пр-ки с одним интерфесом. На них и надо делать.
С одним интерфейсом, связать ПР между собой не выйдет. Тогда только через панель.
Второй интерфейс надо докупить, хотя бы для одной ПР200.
Второй вариант, переделать проект, чтобы для одной ПР мастера, панель и второй ПР были слейвом.
Сергей0308
04.09.2025, 21:55
Проблема в том, что на работе есть только пр-ки с одним интерфесом. На них и надо делать.
Можно переставить сетевой интерфейс с незадействованных в текущем проекте ПР200, если правду говорите, в смысле, у вас много ПР с одним сетевым интерфейсом.
Может и докупать ничего не придётся не только для текущего проекта, но и для последующих, в смысле, если для последующих проектов сетевой интерфейс будет не нужен!
Viktor D
05.09.2025, 02:50
Ну не так уж и много, но с пары можно снять.
Viktor D
05.09.2025, 09:43
Прошу помощи у знающих товарищей.
В продолжении предыдущего вопроса ситуация следующая:
Есть ПР200 cam 2 - основной, в котором будет исполняться программа управления и есть ПР200 сам 3 (с двумя модулями расширения по 8 дискретных входов и выходов) который будет исполнять функции модуля расширения на 24 входа_выхода.
(Собственно говоря можно было бы купить модули расширения на 16 входов-выходов и не страдать, но говорят нет возможности.:(
Сетевой интерфейс я сниму с другого ПР200 и установлю в ПР сам 2. Его как понимаю надо будет сделать мастером (перемычками).
Почитав справку овенлоджика принцип понял. Не уверен, что смогу всё настроить без ошибок. И на работе, что бы заняться экспериментами буду только через 2 дня....
Прошу помочь с настройкой.
Во вложении 2 проекта .owle, Проверьте все ли настройки правильно сделаны.
Заранее благодарен:)
Предусмотрите обработку состояний обрыва связи.
В Slave это проверяется получением из мастера постоянно изменяющегося числа, например, секунд из часов реального времени.
В Master - есть отдельная привязываемая переменная состояния связи, но и её можно дополнить аналогичной переменной, принимаемой от Slave.
Чтобы эти переменные меньше мешали обмену, их период опроса в Master можно сделать больше, чем у других - 600-900 мс.
Обработку таких переменных можно сделать как показано у Сергей0308
https://owen.ru/forum/showthread.php?t=12264&p=470544&viewfull=1#post470544
Ну и сетевые Slave переменные - в Овен ПР200 общие для всех интерфейсов, т.е. дублировать их не требуется.
Viktor D
05.09.2025, 10:16
А вот здесь (см вложение) всё правильно настроено?
Viktor D
05.09.2025, 10:18
Насчёт дублирования - т.е . можно не указывать переменный в ПР слейв в настройках а просто вытащить макрос на поле проекта?
Не использовал ни запись по разрешению ни по изменению - чтобы избежать неоднозначности из-за периодических обрывов связи из-за помех.
Про дублирование - у Вас в описаниях одноимённых переменных для Slave и Master видны красные кружочки диагностированных ошибок. Имена должны быть разными.
Переменные Slave - общие для всех интерфейсов, т.е. к одной переменной может обратиться Master (не из Вашей ПР, а какой-то другой, посторонний - например, панель оператора) по RS1 и по RS2 и по Ethernet - это будет обращение к одной и той же переменной.
А у Master из ПР интерфейс жёстко определён и это конкретный порт.
Но у каждой переменной должно быть уникальное имя, т.к. иначе невозможно предсказать к какой именно переменной обращение.
И ещё - нет нужды какие-то переменные и читать и записывать - достаточно определиться, что команды только пишутся, а состояния только читаются.
Viktor D
06.09.2025, 20:45
Понял только половину.
Насчёт дублирования вроде разобрался. А вот как сделать проверку на обрыв связи и перезапуск - не понимаю.
Может кто то помочь и в моём проекте настроить как правильно. А я по образцу уже буду знать как надо делать
Мне проще показать на чистом проекте с минимумом всего
Viktor D
07.09.2025, 02:19
Спасибо. Буду разбираться.
И о модулях расширения не забудьте - их тоже нужно проверять на исправность - ПРМ можно привязать переменные контроля исправности.
В справке или в руководстве на ПР или ПРМ это должно быть.
Viktor D
19.10.2025, 15:47
Добрый день всем.
Прошу помочь с решением такой задачи:
Делаю управление дозированием кислоты в бак с эмульсией.
Суть работы ФБ следующая:
Есть дозатор который выдаёт порции кислоты.
И есть объём эмульсии при достижении которого срабатывает дозатор и т.д. повторяется.
500л эмульсии - 2,77л кислоты
Алгоритм:
1 Старт
2 Наполнение ёмкости до минимального зонда
3 После п.2 включается сигнал управления дозатором, который работает пока не нальёт определённый объём (2,77 литра)
4 По импульсу от дозатора сигнал управления снимается. И так повторяется пока не сдозируется необходимое количество порций кислоты (получается по геометрии ёмкости 2 раза.).
5 Затем при накоплении каждых 500л эмульсии дозатор срабатывает 1 раз.
Это у меня получилось сделать.
Затем возникла необходимость частичного слива готового продукта с ёмкости и повторного начала её заполнения с добавлением кислоты по алгоритму.
Вот тут не могу сообразить как правильно это сделать.
ФБ прилагаю. Может у кого то есть желание помочь. Заранее благодарен.
Попробую перевести на человеческий: :rolleyes:
1. Наполняем эмульсией некую ёмкость по расходомеру (вес импульса 500л) до срабатывания "минимального зонда".
2. Выдаем импульсы на дозатор кислоты (вес импульса может меняться) из расчета 2.77л кислоты на 500л налитой по расходомеру эмульсии.
3. Разрешаем частичный слив раствора и ждем сигнала.
4. По сигналу возвращаемся к шагу 1.
Если всё правильно, попробуйте ещё раз самостоятельно составить программу.
У Вас должно получиться! Только не спешите.
Подсказка:
- Считайте накопительно объем эмульсии и кислоты в литрах.
- Когда текущий объём кислоты превысит расчетный от объема эмульсии, процесс завершайте.
- Накопленные объёмы можно не сбрасывать каждый раз при старте. Сбрасывайте в конце смены.
Будет виден общий итог (расход химикатов за смену).
Viktor D
19.10.2025, 18:46
Не совсем так. На дозатор выдаётся не импульс а постоянный сигнал по которому срабатывает его насос. От расходомера в дозаторе приходит импульс, что налито 2.77л (фиксированное количество, не меняется), по нему происходит останов двигателя. Если за один цикл, концентрация не достигнута - цикл повторяется. Далее по одному циклу при наполнении на следующие 500 литров.
Частичный слив - это как потребуется (в это время наполнение остановлено).
ПРоблема у меня, еси обобщить в том, что бы сделать расчёт не от нулевого уровня а от произвольного.
Буду пробовать что то сделать в очередной раз.
МихаилГл
19.10.2025, 19:10
И мешалки никакой нет? Ну тогда будет работать если залили до минимума (ну например 50 литров), потом кислоты, потом основной объем (остаток 450 литров). Тогда перемешивание будет. Но при неполном опустошении уже работать не будет, так как тут уже хорошего смешивания основным потоком не произойдет...
In_Da_Cher_A
19.10.2025, 20:01
при достижении которого срабатывает дозаторнормальный насос-дозатор имеет калиброванный вес импульса подачи и регулируемую частоту впрыска. А хорошие насосы - регулируемые и то и другое через настройки.
Что у вас за насос, которому надо снаружи самостоятельно "делать мозги"?
МихаилГл
19.10.2025, 20:07
нормальный насос-дозатор имеет калиброванный вес импульса подачи и регулируемую частоту впрыска. А хорошие насосы - регулируемые и то и другое через настройки.
Что у вас за насос, которому надо снаружи самостоятельно "делать мозги"?
Ну в приготовлении флокулянтов для осаждения промышленных сбросов применяют винтовые насосы дозаторы, например. За оборот выдают нужную порцию жидкого реагента. Им то и нужны мозги...
In_Da_Cher_A
19.10.2025, 20:47
винтовые насосы дозаторыну это костыли, нормальная дозация реагента в нормальном химическом процессе так не делается, ктото скроил видимо
ладно не буду душнить :D
МихаилГл
19.10.2025, 20:54
ну это костыли, нормальная дозация реагента в нормальном химическом процессе так не делается, ктото скроил видимо
ладно не буду душнить :D
Вы наверное представили шнековый, у винтового немного другой принцип и самотеком из него не вытекает...
Не совсем так. На дозатор выдаётся не импульс а постоянный сигнал по которому срабатывает его насос. От расходомера в дозаторе приходит импульс, что налито 2.77л (фиксированное количество, не меняется), по нему происходит останов двигателя. Если за один цикл, концентрация не достигнута - цикл повторяется. Далее по одному циклу при наполнении на следующие 500 литров.
Частичный слив - это как потребуется (в это время наполнение остановлено).
ПРоблема у меня, еси обобщить в том, что бы сделать расчёт не от нулевого уровня а от произвольного.
Буду пробовать что то сделать в очередной раз.
Вот пример от произвольного уровня:
function_block grout
var_input
Start, Stop : bool; // Старт/Стоп приготовления
Probe : bool; // Зонд
inEmulsion, inAcid : bool; // Импульсы с расходомеров
end_var
var_output
BatcherEmulsion : bool; // Дозатор эмульсии
BatcherAcid : bool; // Дозатор кислоты
Done : bool; // Раствор готов
end_var
var
OnOff : SYS.RS; // Сотстояние Работа/Ожидание
rtEmulsion, rtAcid : SYS.RTRIG; // Фиксация импульсов
TotalEmulsion, TotalAcid : real; // Накопленные дозы
CalcAcid : real; // Расчетное кол-во кислоты
end_var
rtEmulsion(I := inEmulsion); rtAcid(I := inAcid); // Фиксация импульсов
OnOff(S := Start, R := not Stop); // Пуск/Стоп наведения
if rtEmulsion.Q then
TotalEmulsion := TotalEmulsion + 500; // + доза эмульсии
Done := false; // Новая доза снимает готовность раствора
end_if
if rtAcid.Q then
TotalAcid := TotalAcid + 2.77; // + доза кислоты
Done := false; // Новая доза снимает готовность раствора
end_if
CalcAcid := TotalEmulsion / 500 * 2.77; // Требуемый объем кислоты
if OnOff.Q then // Если наведение включено, ..
BatcherEmulsion := not Probe; // Наполняем эмульсией до зонда
BatcherAcid := Probe and TotalAcid < CalcAcid; // или наполняем кислотой до расчетного объема
Done := not BatcherEmulsion and not BatcherAcid; // Если дозировать больше не надо, сообщим о готовности раствора
else // Если наведение выключено, ..
BatcherEmulsion := false; // то всё выключаем
BatcherAcid := false;
end_if
end_function_block
Viktor D
20.10.2025, 09:08
Насчёт дозатора - это не ко мне. В задании было указано сделать так как я выше написал. Вот и делаю.
Мешалка есть. Включается по срабатыванию минимального зонда.
Viktor D
20.10.2025, 09:09
Спасибо за пример. Изучаю.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot