Да. Верно.
Вид для печати
Да. Верно.
Пока ждал информация устарела. Чуть позже выложу новый вариант.
Ну собственно говоря используя все предложенные подсказки удалось сделать первый собственный ФБ на ST.
Кому интересно см. прикреплённый файл.
Критика приветствуется.
По ходу дела возник вопрос: Есть ли возможность переменные внутри ФБ сделать энергонезависимыми, что бы при отключении питания состояния счётчиков запоминалось?
Константы они только пока константы. В проекте они будут переменными и будут задаваться с панели управления. Здесь я их просто сделал константами что бы постоянно не вводить при симуляции.
А насчёт энергонезависимости - жаль что так. Придётся что то изобретать.
собственно говоря надо запоминать текущие состояния счётчиков и при повторном включении его восстанавливать. Опять же если каждую секунду перезаписывать их то наверное быстро энергонезависимая память в ПР выйдет из строя
Понятно. Спасибо.
А в панели хранятся только уставки времени и другие и то когда они записываются в ПР, то в энергонезависимые переменные.
Доброго дня всем.
Возник такой вопрос:
Допустим есть входная переменная в ФБ, которая привязана к инверсивной кнопке на панели управления. По её значению переключаются 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;
Сейчас я в отпуске, а всё железо на работе. Конечно проверил бы сам.
Спасибо. Буду пока програмку дома кодить.
Спасибо за совет. Просто я думал, если входной сигнал пропадёт то триггер будет запоминать последнее состояние входа.
Чтобы триггер запомнил состояние, он должен быть энергонезависимый. Схемы таких триггеров, скрин Вложение 79921
На ST, входная и выходная переменная должна запоминаться вне блока. Если триггеров много, то запоминать маской бит.
Появился ещё один вопрос. У меня в проекте есть несколько ПР200 с идентичными программами. Отличаются только адресом Cam. для каждого приходится создавать отдельное окно и в нём переназначать номера регистров.
Может быть есть какой то способ использовать одно окно и из него обращаться к разным ПР200?
Доброй ночи.
Прошу помощи в следующем вопросе:
Хочу сделать ФБ для имитации токового датчика (температуры или другого какого типа). Смысл в том, что бы можно было имитировать работу датчика вращая энкодер.
Собственно говоря частично получилось. На выходе целые числа 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);
Попробуйте так:
Дискретность изменения выхода задаётся на одном из входов блока (N) - можете сами прикрутить туда то, как хотите её изменятьКод: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
Спасибо. Ваш вариант проще.
Буду экспериментировать.
Может быть есть смысл подсчёт вести не в целых числах, а десятичных и прибавлять/вычитать либо 1 либо 0.1 и это как то переключать....
А по ресету устанавливать 12мА - середину диапазона.
Надо пробовать разные варианты.
Вы практически точно всё напсали. Единственное уставку по ресету нужно было делать через триггер. Иначе так и висит 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
Приветствую всех кто читает эту тему.
По ходу работы возникла проблема на ровном месте, но как решить не понятно.
В проекте на сп310 есть несколько экранов для управления несколькими ПР200.
В частности экран 1 управляет пр200 №1 экран2 пр200 №2 и т.д.
Но поскольку все элементы управления на один экран не поместились, пришлось на каждый Пр200 добавить ещё по экрану.
Так вот: например для пр200 № 1 есть экраны №1 и №7.
Экран №1работает нормально, а сэкрана №7 нет отклика ни на одну команду на ПР200.
Самое тнтересное, что сначала всё работало, но на каком то этап я что то сделал, сам не пойму что и всё стало так как есть.
Интересный момент, если на экране №7 дополнительно открыть окно с любым элементом управления ПР200 №1 (например кнопка которая обращается к регистру 574 или др.№) , то работоспособность восстанавливается.
Кто сталкивался с пообным - подскажите что искать?
Все с таким сталкивались, и у каждого свои причины таких аварий или неработоспособности.
Что вам мешает приложить исходник для СП, что бы вам подсказали конкретно именно по вашей проблеме, а не это вот гадание на кофейной гуще?
Вот файл проекта. См.экран 7 На нём кнопка "ПС" открывает окно 7 и тогда всё работает. Из окна 7 можно обращатся к любому регистру PLC. Если окно пустое, то тоже нет отклика от экрана 7.
Открыл... Пока не понял что тут не так, но у вас некоторые кнопки с мониторингом, некоторые без. Некоторые с типом "пока нажата", другие с "инверсия". Так и задумано? Вы все регистры в ПР прописали?
Выдаете конкретную последовательность, что вы делаете, что нажимаете, и что должно быть.
Одно замечание. Если вы делаете видимость на экране элемента, который перекрывает другой элемент, то под ним кнопки все равно активны, в симуляции точно, на панели вроде тоже этот баг есть.
Да, всё так и есть. Все кнопки работают по разному.
Я программу уже отлаживал на отдельном ПР200 с двумя модулями расширения. Что бы не собирать внешние цепи в отдельном окне (№7) сделал имитацию их срабатывания. В тот момент всё работало как надо.
Что то произошло в тот момент когда я стал переносить программу в собранный щит с 3-мя ПР200 (всего рассчитано на 6). 2 на вращение барабана и подачу химии(в них программа одинаковая, номера их 1 и 2. И третий - дозировка воды (в нём программа другая он №10).
Сейчас вернул всё на тот ПР на котором отлаживал программу и там теперь тоже она перестала работать.
Выкладываю все три файла в этом посте. (слегка может отличаться от предыдущего, поскольку я уже пытался что то исправить.)
Насчёт перекрытия кнопок я в курсе.
Насчёт того, что бы объяснить последовательность действий - это слишком большая история. Вкратце, касательно экрана 7, - дозируется 4 разных химиката в мерник. Либо по токовому зонду (линейный потенциометр 4-20 мА) либо по контактным зондам, выбор осуществляется программно.
По идее если залить программу в ПР200 с 2 мя модулями расширения и в комплекте с сп310 всё должно работать без дополнительных внешних цепей.
У вас вот здесь адреса идут не по порядку (некоторые пропущены). Возможно панель делает групповые запросы, включающие пропущенные регистры, а ПР отвечает ошибкой. Попробуйте организовать адресное пространство сетевых переменных ПР без разрывов (ну и в проекте панели конечно адреса поправьте соответственно)
Вложение 83498
Второй проект ПР не смотрел, проверьте сами
Если быть точным, то речь идёт о проекте "Вращение Химия". Может быть вы смотрели "Водоподготовка", но не это важно.
Да такое дело есть, в обоих проектах. Но оно так работало. Просто те регистры, что в конце я использовал для передачи 16 булевских переменных через один регистр и разместил их в конце списка, что бы было удобно. Переменные начиная с 568 регистра используются в одном и том же ПР и для вращения барабана и для дозировки химии, при этом первое работает а второе нет. Получается нелогично. Регистры 570 571 572 573 работают а 574 575 568 569 нет.
Доберусь до оборудования только во вторник. Буду проверять ваш вариант.
Хотя наверное проще сделать "обманку" в виде скрытого окна. С ним то всё работает. Каким образом его открытие поверх экрана влияет на работоспособность - непонятно.
А вот это уже хорошая мысль. С неё и начну.
Хотя уже пробовал создать кнопку с номером регистра 568 и разместить на экране. Не сработало. Может надо именно разрыв последовательности в ПР заполнить....
Как раз последние регистры использованы в 7 окне Вложение 83500 и только одна кнопка с мониторингом.
И тут из последних регистров с мониторингом Вложение 83501
Да так работает. Посмотрите связку экран 1 и окно 1 там всё работает в этих же Пр и панели оператора. Например кнопки "Старт", "Пауза".
Я пробовал из 7го окна все кнопки удалять (при этом работать перестаёт) и просто там создать кнопку с PLC адресом 568 15 (без мониторинга) (при этом работоспособность восстанавливается независимо от того нажата кнопка или нет).
Так же пробовал всё то же с другим окном в частности №8. Так же работает при его открытии.
Пробовал так же 569 регистр вообще удалить из Пр и панели и вместо него на окне 7 разместить кнопку с любым другим. Так тоже работает.
Мистика какая то.
Сейчас Всё на работе проверить не могу, только во вторник.
Что то произошло со свойствами экрана 7. Хотя я переносил все элементы управления на другой экран (8) получил ту же проблему.
Похоже на то. Надо все слои "растаскивать" и перепроверять. Там ещё на экране несколько скрытых сообщений с битом видимости и всё "стопкой" сложено.
Хотя я уже выше писал, что 568 регистр вообще удалял и в окно вставлял кнопку с другим.... Работает так.
Доброго дня всем.
Возник такой дилетантский вопрос. Возможно ли на панели СП310 для многоугольника с заливкой сделать бит видимости. Т.е. Сделать его появляющимся по сигналу скажем с ПР200 или внутреннегорегистра панели?
Может где уже обсуждалос, подскажите.
НЯП, это невозможно для всех объектов типа "Графика". Попробуйте Инструменты->Анимация->Изображения, например.
Многоугольник предварительно нарисуйте хоть в том же Paint'е
Можно.
Но через анус. Привяжите положение многоугольника (горизонт или вертикаль) к какому-нить регистру. Пишите инверсно свой бит видимости в один любого из 10й...15й-бит этого регистра. И всё.
Или ФО с копированием и инверсией прямой видимости в тот же регистр положения (PSW[x])
видимость => PSW[x+1].15
PSW[x] <= 32768 - PSW[x+1]
Или с макросами. Более ясно, но тут их не все любят
А как получить доступ к этим дополнительным элементам?
Доброго дня всем.
Прежде всего спасибо всем, кто помогает с ответами на мои дилетантские вопросы. Я не каждый раз отписываюсь, но с вашей помощью иду вперёд и на данном этапе всё удалось решить.
Сегодня же столкнулся с таким казусом.
Понадобилось сделать макрос для Овенлоджика который округляет число с плавающей запятой при переходе через значение 0.5 и умножает результат на 10.
например: 1,499 = 14 а 1,500 = 15, соответственно в панели СП310 будет отображаться 1,5 и 1,6
Нужно это, что бы не занимать лишний регистр при передаче значения, например температуры (с точностью 0,1), в панель.
Вот что у меня получилось
Вроде работает, но только если внешний выход макроса (который real) подключен к какой либо прееменной.Цитата:
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
Если нет, то не работает.
(Специально пришлось в макросе прописать: Q_r := inp)
Соответственно картинки 1 и 2
Вложение 85310
Вложение 85311
Можно ли сделать так, что бы у макроса был только выход с целочисленным значением?