Идея - правильная. Странно что не получилось
Вид для печати
А можно прокомментировать эту часть кода?
var_output
start : bool; (*на вход-старт FC*)
freq : real; (*Гц*)
end_var
var
fix : r_trig;
active : bool;
pid : pid; (*util.lib*)
end_var
--------------------
fix(clk := press);
active := fix.q xor active;
start := active or freq > 0;
pid(
actual := sel(active, set_point + 1, actual),
set_point := set_point,
kp := sel(active, 1, kp),
tn := sel(active, 1, tn),
tv := sel(active, 0, tv),
y_min := sel(active, 0, 10),
y_max := 50,
y => freq
);
Как и описалиЦитата:
при запуске частота должна быть равна 10 ( при нажатии кнопки ПУСК у нас начинает частотный преобразователь вращать двигатель с частотой=10 Гц)
Дальше уже в зависимости от Давления ... частота либо увеличивается либо уменьшается (в пределах от 10 до 50 ГЦ).
отключаем - частота у нас плавно опускается до 0.
Какую часть если привели всё ?
Валенок не получилось без сравнения и промежуточной переменной. Так как при записи по сети Modbus и одновременной записи значения из панели что-то кого-то перезатирал.
Когда добавил промежуточную переменную то все стало нормально.
fix : r_trig;
active : bool;
pid : pid; (*util.lib*)
end_var
--------------------
fix(clk := press);
active := fix.q xor active;
start := active or freq > 0;
pid(
actual := sel(active, set_point + 1, actual),
set_point := set_point,
Достаточно добавить комменты, что в строках происходит. Спасибо за решение задачи. Я как то не думал ПИД регулятор привлекать.
могу дать рыбу - об'яснить. Ну лучше научись ее ловить - см. хэлп, standart.lib, r_trigЦитата:
fix(clk := press);
Активе - это вкл/выкл с реверсом по кнопе - как и хотелиЦитата:
active := fix.q xor active;
не обязательный выход коли нет спец. сигнала СТАРТ на ЧПЦитата:
start := active or freq > 0;
здесь и далее ... sel(active, .....) - обман пида чтоб всегда одинаково мягонько опустил в 0 при отключении (active = false) вне зависимости от чего-либо. Есно что со всеми параметрами (KP,TN,TV) можно игратьЦитата:
actual := sel(active, set_point + 1, actual),
ну это и есть уставка давления. Можно константу запилить.Цитата:
set_point := set_point,
PS
Тому кто будет говорить про зависание этого пида передайте привет и пожелание учиться, учится ...
petera, сделал так как вы посоветовали - проще и надежней, просто объявив глобальной. Странно что сам не догадался. Спасибо!
По ТЗ, в нашей документации должен быть представлен текст программы в IL или ST. Не получается конвертировать один из POU (SFC). Эту проблему можно как-нибудь обойти?
Вложение 25898
ПД100 в датчике 3 контакта + 1 контакт земля. В инструкции ни полслова про это: только на 2 + земля и 4 информационных. Как правильно подключать?
Здравствуйте, синхронизировал время ПЛК с NTP, как правильно установить часовой пояс? GMT offset? Понятно что для Москвы это часы +3, но тогда при синхронизации в 23:00 +3 будет 26, надо прибавлять день +1, а если это конец месяца то и месяц, а в месяцах разное количество дней. Есть возможность прибавить к системному времени 3*60*60+1000 миллисекунд?
а вы синхронизируйте время после 0 часов, смысл делать это каждые 5 минут и тем более цикл...
Упакуйте UINT в строку вида DT, из строки сделайте DT, сдвиньте на нужный TIME, и обратно выпакуйте из строки. Каждый цикл это делать не надо, а работает как куранты
Не поверишь - нет. Если, канешна, не считать времени потраченного на рысканье по оскатам и т.п.Цитата:
думал что есть путь короче))))
Standart.lib, 15-20 строк (в основном копи-пасте). Тупо и надежно.
День добрый. Занимаюсь ПЛК73 не давно, вот такой вопрос. Не могу понять. Вот система состоит из ПЛК73 и 5-х ПД100 (-200 +200, 4...20мА). Все подключили через БП (24В) и резистор 100Ом (все как инструкции). В ПЛК также настроил тип порта 4...20мА. ПЛК показания видит при чем очень большие (49,2 В), хотя на входе мультиметр показывает (1,12В) и соответственно 8 мА. И в CodeSys так же на порте 0.
Paveldr может 49,2 это в диапазоне -200 +200 а не "В"
Диапазон датчика -200 +200 Па. Учитывая что датчик ни к чему не подключен (в смысле магистралям высокого давления), он должен выдавать примерно середину (0 Па) или около 8 мА.
Да все нормально показывает. Только вольты не надо на входе измерять, а нужно мультиметр в режиме измерения тока включить в разрыв цепи датчика, т.е. последовательно с датчиком и измерить ток.
В ПЛК показания не в вольтах, а в процентах от 0 до 100. 4мА - 0%, 20мА - 100%.
Если датчик не подключен к измеряемой среде, т.е. показания ~ 0 Па, т.е в ПЛК показания должны быть в районе 50%, что и наблюдаете - "ПЛК показания видит при чем очень большие (49,2 В)". Только это не вольты, а 49,2%. А в идеале должно было быть 50%.
И как верно было замечено ток от датчика в этом случае д.б примерно 12мА.
ЗЫ. Ток Вы измерили косвенным способом ( I=U/R) по падению напряжения на образцовом резисторе - на входе мультиметр показывает (1,12В). Ток у Вас получается 11,2 мА, если конечно резистор 100 Ом и прецизионный, а не абы какой, первый попавшийся.
Да разумеется. Вот все параметры.
Вложение 26059
Вложение 26060
Вложение 26061
Вложение 26062
Этих картинок не достаточно.
Вангую, что Вы еще и в разделе объявления переменных написали, что-то типа
DP11 AT %ID0.2.4: REAL;
Вложение 26064
А этого делать нельзя. Имя переменной должно быть либо в конфигурации, либо в разделе объявления переменных.
Потому, что для программы это две различные переменные.
Локальная - в разделе объявления переменных
Глобальная - в конфигурации.
Если имена локальной и глобальной переменной совпадают, то программа ВСЕГДА использует ЛОКАЛЬНУЮ переменную.
Спасибо проверил глобальные и локальные имеют разные имена. А проблема была в сгоревшем кабеле USB - COM (причем какбы связь с прибором устанавливалась и при изменении проекта загружалась в ПЛК), поменял кабель и все значения начали отображаться в CodeSys.
Спасибо за консультацию.
Форумчани, скажите пожалуйста у меня такой косяк немогу понять. почему у меня значение не записывается в AO сигнал.
вот код
oa(
IN:=AO_1 ,
IN_MIN:=0,
IN_MAX:=100 ,
OUT_MIN:=0 ,
OUT_MAX:=32768 ,
OUT=>,
ERROR=> );
ao_1:=REAL_TO_WORD(oa.OUT);
temp_delta_real:= TEMP_K1 - TEMP_GI1;
CASE STEP_3x OF (*управление 3x*)
0:
IF START_CAM1 AND NOT ERROR_SET THEN
STEP_3x:=1;
END_IF;
1:
IF temp_delta_real > temp_delta_3x THEN
AO_1:=5;
step_3x:=2;
END_IF;
2:
IF Ton_3x.Q THEN
step_3x:= 1;
END_IF;
3:
IF temp_delta_real <= temp_delta_3x THEN
AO_1:=0;
END_IF;
END_CASE;
TON_3x(IN:=(STEP_3x =0), PT:= time_3x);
Не работает уже чет голова не варит.
а Вы считаете, что АО_1 и ао_1 это разные переменные?