PDA

Просмотр полной версии : работа несколько функциональных блоков (PID_FUNCTION) на ПЛК110-60 М2



svr007
11.01.2021, 14:56
Добрый день Всем. Необходимо на одном контроллере использовать четыре ФБ ПИД регулятора из библиотеки ОВЕН (PID_FUNCTION).Суть проблемы вот в чем. Настроил один ФБ (PID_FUNCTION) для одного канала регулирования, настраивал по методу колебания и измерения периода. Удалось добиться очень хорошей и стабильной работы этого регулятора(регулятор управляет тэном в радиаторе для поддержания температуры в помещении).Параметры регулятора РВ=0,6 Ti=1949 TD=243.63, работа регулятора видна на скриншоте.
Пытаюсь создать еще регулятор и тут происходит непонятная ситуация. Новый добавленный регулятор как будто имеет зависимость с уже настроенным и нормально работающим. На любых коэффициентах он работает плюс минус правильно, правда очень грубо. Не могу его запустить в разнос что бы настроить, даже при параметрах РВ=1 Ti=1 TD=0 пытается регулировать очень грубо. И так на всех остальных вновь добавленных ФБ. Для ПИД выделена отдельно программа и задача с циклом 100мс, пробовал запускать в разных программах и разных задачах(один ФБ ПИДа одна программа и задача). Не могу понять что их связывает.
Из особенностей заметил что на нормально рабочем ФБ ПИД значение dMeas меняется и при движении уставки вверх или вниз, INTEGAL1 принимает значения _IMIN или _IMAX. А на других ФБ dMeas=0 и всегда INTEGAL1=0. Может кто подскажет в чем дело?

svr007
12.01.2021, 20:36
Что то совсем непонятки происходят. Теперь наглухо перестал работать ПИД с АНР. При старте АНР, регулятор на выходе выдает 1 и все. Больше никак не реагирует. Никто не может подсказать что за проблема?

svr007
13.01.2021, 10:00
Вот на скринах более наглядное поведение. На общем графике видно что идет зависимость от нормально настроенного ПИД регулятора. Причем когда настраивал ПИД регулятор(он был тогда один в проекте), на коэффициентах РВ=1 Ti=1 TD=0 регулятор уходил в колебания, на этих колебаниях он и настроился. А два регулятора на коэффициентах РВ=1 Ti=1 TD=0 типа более менее работают, причем если задать другие коэффициенты, то картина сильно не изменится. Сейчас один ФБ ПИД одна программа и цикличный вызов через 100 мс, не понимаю где идет взаимосвязь с функциональными блоками.

YuriBel
16.02.2021, 11:16
Наблюдаю аналогичную ситуацию.
Такое ощущение, что первый экземпляр работает нормально, а остальные не интегрируют, а работают, как пропорциональные. Хотелось-бы услышать мнение разработчиков.

svr007
16.02.2021, 14:29
Да особо никто не ответит похоже. Звонил и писал в техподдержку, тишина.

YuriBel
16.02.2021, 17:03
Я сегодня написал в техподдержку, сейчас идет активный диалог. О результатах отпишусь, когда проблему победим.

IVM
16.02.2021, 17:31
Да особо никто не ответит похоже. Звонил и писал в техподдержку, тишина.

А что мешает попробовать ФБ PID из других библиотек, например oscat_basic_333.

YuriBel
16.02.2021, 17:51
Ничего не мешает. Этот вариант тоже держу в уме. Просто хочется понять, что реально происходит с PID_Function, где "собака зарыта".

IVM
16.02.2021, 19:42
Ничего не мешает. Этот вариант тоже держу в уме. Просто хочется понять, что реально происходит с PID_Function, где "собака зарыта".

А что там понимать, косяк он и есть косяк.

svr007
16.02.2021, 22:09
А что мешает попробовать ФБ PID из других библиотек, например oscat_basic_333.

1. Единичная работа ФБ устраивает на 100%. Точность, скорость реакции. Графики выше показывают
2. Хочется понять у меня руки кривые или действительно есть недоработки. Похожих тем не нашел.

svr007
16.02.2021, 22:16
Я сегодня написал в техподдержку, сейчас идет активный диалог. О результатах отпишусь, когда проблему победим.

Буду ждать инфу, теперь самому интересно если не я один такой.

IVM
17.02.2021, 11:14
Хочется понять у меня руки кривые или действительно есть недоработки.

Проект свой покажи, тогда можно будет сказать какие у тебя руки.

YuriBel
09.03.2021, 12:56
как обещал. отпишусь о результатах. Сразу прошу понять, что эксперименты проводились на живом оборудовании на действующем производстве, поэтому всё затянулось надолго, но быстрее просто не получалось.
Итак, после консультаций с техподдержкой понял, что их советы у меня либо не меняют ситуацию, либо меняют ее в худшую сторону, когда и первый регулятор перестает интегрировать. Написал тестовый проект, без всего лишнего, запустил его у себя на столе на старой версии ПЛК - всё работает. Поменял целевую платформу, запустил его на установке, где установлен М02 - не работает (регуляторы не интегрируют, срабатывает только пропорциональная составляющая). Отправил пример в техподдержку, попросил их по возможности прогнать пример на своем ПЛК. Мне прислали видео, на котором явно всё работает как надо, то есть проблема не в М02 в целом, а в моём, конкретном М02. с этим "сухим остатком" отправился на объект, где в другом шкафу, на совсем другой установке, есть еще один М02. Загрузил пример туда - работает. Еще раз загрузил туда, где не работал - опять не работает. После этого воспользовался советом техподдержки перепрошить ПЛК. Перепрошил на последнюю версию, и всё волшебным образом заработало. Так что проблему решил, но в причинах не разобрался.
ЗЫ. При перепрошивке у ПЛК меняется IP адрес, так что для восстановления связи нужно менять настройки соединения.

IVM
09.03.2021, 14:43
Так что проблему решил, но в причинах не разобрался.

Как это не разобрался ? А косячная прошивка ПЛК - это разве не причина ?

YuriBel
09.03.2021, 15:58
Два одинаковых контроллера с одинаковой версией прошивки 1.1.0. В одном работает- в другом дурит. Это косяк самой прошивки или это она при заливке производителем криво залилась?. Я не знаю. Точно знаю, что снова заливать 1.1.0, чтобы еще раз увидеть проблему, я не буду. Но второй контроллер, на котором 1.1.0, я пока трогать не стал. Дальше- поглядим, увидим

svr007
09.03.2021, 16:22
Спасибо за информацию. Попробую перепрошить и тоже отпишусь. Вы 1.2.42 версию прошивки ставили?
Ip адрес меняется при загрузки определенной прошивки? Раньше при перепрошивке Ip адрес не менялся вроде.

YuriBel
10.03.2021, 09:59
Да, перепрошился на версию 1.2.42. В результате картина была такая:
53889

svr007
10.03.2021, 11:48
Тогда пожалуй удаленно шить не буду.

svr007
25.03.2021, 11:01
Обновил прошивку на 1.2.42, странно что не где производитель не указывает что сетевые настройки сбрасываются в дефолт при обновлении на 1.2.42.
Изменения не произошли. Может кто подскажет за что отвечают переменные на скрине? У всех ФБ, в отличие от нормально рабочего ФБ ПИД, значения по нулям.

YuriBel
25.03.2021, 13:51
Ровно такая картина у меня была до перепрошивки. После перепрошивки стало по-другому.Индексы у регуляторв выстроились "в линейку" (1-2-3.....), переменные Next в каждом регуляторе стали разными. И всё ожило. Осталось непонятным, почему из двух одинаковых ПЛК с прошивкой 1.1.0 в одном рвсё работало, а в другом -нет. Так что перепрошивка мне помогла, но понимания, почему она мне помогла, так и не появилось.
54200

svr007
25.03.2021, 14:53
Причем у меня эти значения на рабочем ФБ ПИД присваиваются во время работы и сохраняются даже после сброса( заводского) и обнуления программы контроллера, хотя сам ФБ не в Retain. Вот на скрине переименовал ФБ -ки и запустил в работу, значения INDEX и NEXT у всех по нулям. Чуть позже скину скрин, когда заполнятся значения.

svr007
25.03.2021, 14:59
YuriBel заметил у Вас на скрине разные значения PV_time. Вы откуда берете эти значения?

YuriBel
25.03.2021, 18:30
Я использую блоки МВ110-2А, и из них забираю это время. соответственно , для каждого канала это время своё. Насколько я понял. Овеновская библиотека под это "заточена", это позволяет точнее вычислять интегральную составляющую.

svr007
25.03.2021, 18:55
Я использую блоки МВ110-2А, и из них забираю это время. соответственно , для каждого канала это время своё. Насколько я понял. Овеновская библиотека под это "заточена", это позволяет точнее вычислять интегральную составляющую.
Используете регистры "Циклическое время измерения входа"?
У меня тоже стоит МВ110 только 8а. Мне кажется если не читать регистры групповым запросом, то особой точности от этого не получишь, ввиду задержек при опросе. Я в каждом цикле программы увеличиваю счетчик на время цикла и подаю на вход, потому что есть два датчика температуры с rs 485.
Если переменные INDEX и NEXT не сбрасываются при обнуление и перезаливки программы, значит они пишутся в определенную область памяти?

YuriBel
25.03.2021, 19:18
Да, я использую данные этих регистров. Блоки медленные, и если вы читаете их чаще, чем в каналах обновляются данные, не учитывая время, в которое они измерены, то вносите дополнительную погрешность в интеграл. Я читаю из блока необходимые данные одним запросом (строкой), поэтому полагаю, что опрос у меня идет чаще, чем измеряются данные в каналах. Но это все нюансы, никак не связанные с тем, что у вас из нескольких регуляторов работает только один. Почему так получается- не знаю. Но там, где несколько регуляторов работают, у них разные переменные Index и Next. Так что даже и не знаю. что посоветовать. Возможно, имеет смысл перейти на регулятор из Util.lib.

Евгений Пашигоров
30.03.2021, 15:32
У меня была такая же проблема с ФБ в своем проекте. Год назад делал станок на ПЛК110 -М2. Общался с техподдержкой, но результата не было. Да и некогда было, станок уже надо было сдавать в работу. Вот выдержки из письма:
"
1. Вначале самопроизвольно изменялась переменная внутри функционального блока
(этот ФБ имеет 18 экземпляров).
Решил, что возможно, это я где-то ошибся. Переписал ФБ без этой внутренней переменной.
Ошибка пропала.

2. Потом в переключателе CASE возникли переходы из состояния CLOSE в
состояние BEGIN, хотя по программе это возможно только из состояния M_CUT.
Эти состояния используются в подпрограммах left_mould_cycle, right_mould_cycle
по переменным l_mould_mode, r_mould_mode. Эту ошибку я вообще никак
не смог отловить и объяснить.

На скриншоте видно, что экземпляр ФБ screv_lower_ctrl вызывается с параметром
IN := FALSE, и в то же время его выход screv_lower_ctrl.Q = TRUE (а по логике
ФБ должен быть FALSE). И в отладчике видно, что ФБ вызван с IN = TRUE?!!
"

Евгений Пашигоров
30.03.2021, 15:34
Поскольку был цейтнот, тупо переписал программу, выкинув все ФБ (!).
Но это точно ошибка где-то в распределении памяти ПЛК, поскольку ФБ влияют друг на друга.
Теперь боюсь брать ПЛК110-М2 в свои проекты.

Евгений Пашигоров
30.03.2021, 23:24
Это не "ля-ля с картинками", а отладчик, в котором видно, что в основной программе вызывается экземпляр ФБ с IN := false, а внутри экземпляра этого ФБ вход IN имеет значение true в это же самое время!

TOPan
30.03.2021, 23:47
Это не "ля-ля с картинками", а отладчик, в котором видно, что в основной программе вызывается экземпляр ФБ с IN := false, а внутри экземпляра этого ФБ вход IN имеет значение true в это же самое время!

Такое возможно только если меняли таргеты, большой кусок кода ещё что-то тогда нужно сделать "Очистить всё" и перекомплировать проект и всё станет в норму. Если это делали, то 100% ошибка в коде которую вы не можете найти. Может где-то в другом куске программы присваиваете этому фб на вход IN:=TRUE. Сами же пишете что первый раз переписали ФБ и стало норм. Не совсем понятное для меня использование Case и таймеров внутри условий(что тоже нужно делать аккуратно).
Согласен с Валенком тоже используем большое количество ФБ с указателями и без. И никогда не было проблем с распределением памяти только собственные ошибки.

Евгений Пашигоров
31.03.2021, 09:10
Такое возможно только если меняли таргеты, большой кусок кода ещё что-то тогда нужно сделать "Очистить всё" и перекомплировать проект и всё станет в норму.
Пунктом "Очистить все" действительно, я не пользуюсь (даже не знаю, что он делает). Всегда делаю "Компилировать все".


Может где-то в другом куске программы присваиваете этому фб на вход IN:=TRUE. Сами
же пишете что первый раз переписали ФБ и стало норм.
Все изменения команды на вход делаются выше по коду. Потом один раз вызывается этот ФБ.


Не совсем понятное для меня использование Case и таймеров внутри условий(что тоже нужно делать аккуратно). Мне тоже непонятно ваше высказывание. Пришла команда отработать цилиндру - включить таймер, надо считать время работы цилиндра.
А CASE и IF вообще братья-близнецы. CASE только намного лучше читается.


тоже используем большое количество ФБ с указателями и без. И никогда не было проблем с распределением памяти только собственные ошибки.
Непонятная мне необходимость в указателях! А зачем они вам?

Если это делали, то 100% ошибка в коде которую вы не можете найти.
Это точно. Ошибку не нашел. :(

Parovoz
01.04.2021, 05:25
Вкину свои 5 копеек.

Были слегка подобные случаи, в общем в конфигурацию ПЛК м02 постепенно по мере прироста оборудования добавлялись модули вывода МВ210-403. И вот в один день уже под конец раб. дня добавил ещё один мв210-403, причём сделал это копированием т.е. новый модуль в конфигурации встал между двумя последними модулями но т.к. надо было уже уезжать с объекта, я его добавил, потыкал оборудование, проверил что всё работает и решил, что в следующий раз займусь его окончательной настройкой и полной проверкой, а сейчас откачусь на прежнюю рабочую прошивку. Короче просто удалил его из конфигурации, перезалил прежнюю программу на ПЛК, которая до это стабильно работала, и каково же было моё удивление, что сразу после перезаливки у меня самопроизвольно включились выходы на последнем модуле вывода. И были включены пока я не нажал "Старт", я опять также добавил новый модуль в конфигурацию, залил с новым модулем и всё нормально. Удалил его, и снова опять те же выходы сработали на последнем модуле. но т.к. времени уже было в обрез, разбираться не стал, просто добавил новый модуль и оставил так.

Я слабо себе представляю как там организовано адресное пространство, что с чем взаимодействует, и что на что влияет. Но у меня сложилось впечатление, что когда я воткнул новый модуль между двумя последними, а потом его удалил, то последний модуль вывода "переехал" на место предпоследнего, который я удалил, и там остались какие-то данные в том адресном пространстве, которые обнулились только после запуска основной программы.

А так в целом солидарен с большинством, что во всех случаях именно работы кода косячил сам я. И вроде бы смотришь на код, видишь что ну вот же я явно присваиваю значение, а оно не присваивается. А через пару часов вникания в работу именно в контексте постоянно повторяющегося цикла контроллера понимаешь, почему всё так работает.

Parovoz
01.04.2021, 06:43
Пунктом "Очистить все" действительно, я не пользуюсь (даже не знаю, что он делает). Всегда делаю "Компилировать все".

Непонятная мне необходимость в указателях! А зачем они вам?



Чтобы можно было оперировать не целиком данными, а указателями на них, но это достаточно сложное для понимания колдунство. Утрированный пример таков: есть два человека в отеле, которые хотят поговорить (обменяться данными), и можно их друг с другом свести лицом к лицу т.е. доставить целиком человека из одного номера в другой, материально переместить, и есть телефонистка, которая может просто соединить телефонное гнездо первого человека с телефонным гнездом второго человека, и произойдёт передача данных от одного человека к другому. Указатели используются для достижения полиморфизма, когда вам, грубо говоря, не важен сам человек, а важен человек в том номере, с которым соединит телефонистка, а будет там мужчина, женщина или ребёнок не так принципиально, утрировано как-то так.

Частный случай использования указателей, как принципиального способа структурирования данных - это массивы.
И тогда ваша запись вида:

PROGRAM temperature_ctrl
VAR
pwm1chan,
pwm2chan,
pwm3chan,
pwm4chan,
pwm5chan,
pwm6chan,
pwm7chan,
pwm8chan: PWM_B;
END_VAR

превращается в:

pwmchan: array[1..8] of PWM_B;

А конструкция вида:

(
*формируем код устройства*)
...
panel_error1 :=
BOOL_TO_INT(cmd_l_mould_forw OR cmd_l_mould_back
OR cmd_l_mould_open OR cmd_l_mould_close) * 1 + (*левая форма*)
BOOL_TO_INT(cmd_r_mould_forw OR cmd_r_mould_back
OR cmd_r_mould_open OR cmd_r_mould_close) * 2 + (*правая форма*)
BOOL_TO_INT(cmd_screw_rising OR cmd_screw_lower) * 4 +... (*шнек*)
...

Превращается в:


panel_error1.0:=cmd_l_mould_forw OR cmd_l_mould_back OR cmd_l_mould_open OR cmd_l_mould_close;
panel_error1.1:=cmd_r_mould_forw OR cmd_r_mould_back OR cmd_r_mould_open OR cmd_r_mould_close;
...

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

capzap
01.04.2021, 07:21
Частный случай использования указателей, как принципиального способа структурирования данных - это массивы.

всё нижеизложенное это вообще не указатель

Parovoz
01.04.2021, 08:16
всё нижеизложенное это вообще не указатель

Да, лааааадно. Чё серьёзно? Не может быть...

Thanks, cap.

Речь шла о самом принципе использования указателей, а не о "POINTER TO"

Автор то массивами не пользуется, а также булевыми функциями через раз, привык всё на пальцах считать количественным исчислением, что 3 - это не первые два бита истинные, а только 1+2, а вы ему тут про указатели адресные и динамическое выделение памяти...

capzap
01.04.2021, 08:43
а вы ему тут про указатели адресные и динамическое выделение памяти...
покажите где я ему про...
перечитайте, это я Вам предложил не вводить в заблуждение

Parovoz
01.04.2021, 08:51
покажите где я ему про...
перечитайте, это я Вам предложил не вводить в заблуждение

Чтобы не было путаницы, Ты ему нигде.
Вы - это обращение к обществу присутствующих здесь людей, а не к тебе лично. Извиняюсь за фамильярность, но так понятнее.

Про указатели и динамическую память тему завёл TOPan.

Евгений Пашигоров
01.04.2021, 13:00
Каким боком картинка к этому проекту ?
Тот проект и те условия - где ? Я извиняюсь, все-таки год прошел. На сервере, оказывается, этой версии уже не было. Достал старый ноут, на нем нашел. Версия из письма в техподдержку во вложении. (Справедливости ради - отличия непринципиальные).
Номера строк теперь совпадают с картинкой.

И напоследок, после чего [-----Контроль перекрытия областей памяти -------] копаться в поведении 500 строк только PLC_PRG только мазохисты будут
Согласен, проект не миниатюрный. Но вообще-то, речь идет о единственной логической переменной cmd_screw_lower, значение которой используется в единственном вызове ФБ screw_lower_ctrl и более нигде. Причем все присваивания (только значения TRUE) ей делаются выше по коду, до вызова ФБ.
На загадочном скриншоте как раз видно, что ФБ вызывается со значением FALSE, и в то же время сам ФБ говорит, что вызван со значением TRUE. Эту загадку я решить не смог.

Насчет перекрытия областей памяти, выдаваемых компилятором. В данном случае это не ошибка. Таким образом я задаю псевдонимы для переменных, работающих с панелью. На разных экранах используются разные имена для одних и тех же адресов (экономия регистров МОДБАС). Просто взгляните в VAR_GLOBAL, и все станет ясно.

Про указатели я из любопытства спросил. Уже пятнадцатый год контроллеры программирую, ни разу не понадобились. Вот и интересно, зачем их люди применяют. (Объяснять, что такое указатели - не надо.)

Евгений Пашигоров
01.04.2021, 13:08
А конструкция вида:

(
*формируем код устройства*)
...
panel_error1 :=
BOOL_TO_INT(cmd_l_mould_forw OR cmd_l_mould_back
OR cmd_l_mould_open OR cmd_l_mould_close) * 1 + (*левая форма*)
BOOL_TO_INT(cmd_r_mould_forw OR cmd_r_mould_back
OR cmd_r_mould_open OR cmd_r_mould_close) * 2 + (*правая форма*)
BOOL_TO_INT(cmd_screw_rising OR cmd_screw_lower) * 4 +... (*шнек*)
...

Превращается в:


panel_error1.0:=cmd_l_mould_forw OR cmd_l_mould_back OR cmd_l_mould_open OR cmd_l_mould_close;
panel_error1.1:=cmd_r_mould_forw OR cmd_r_mould_back OR cmd_r_mould_open OR cmd_r_mould_close;
...

Не превращается.
В данном фрагменте кода производится запись кучи ошибок в одно 16-битное слово для передачи в панель.

Parovoz
01.04.2021, 20:45
Не превращается.
В данном фрагменте кода производится запись кучи ошибок в одно 16-битное слово для передачи в панель.

Ещё как превращается, потому что, что сверху, что снизу один и тот же результат произведённый разными способами.

Только в вашем случае вы превращаете булевые значения в целочисленные, используя степени числа 2 согласно номерам битов в слове, а затем суммируете чтобы получить итоговое значение, а в моем я сразу пишу эти биты в переменную согласно номерам этих битов. Результат один и тот же только действий, что для вас, что для контроллера меньше.

Евгений Пашигоров
01.04.2021, 21:51
Верно. Я невнимателен. Ваш способ проще. (Самое смешное, что там рядом в коде есть и работа с битами!) Но тут все зависит от компилятора. Если он понимает степени двойки, то окончательный код может и не отличаться.
Я вот тут недавно запихивал данные в слово в троичной системе. Со степенями тройки вариант с битами не прокатывает. :)

TOPan
01.04.2021, 23:29
Пунктом "Очистить все" действительно, я не пользуюсь (даже не знаю, что он делает). Всегда делаю "Компилировать все".

Все изменения команды на вход делаются выше по коду. Потом один раз вызывается этот ФБ.
Мне тоже непонятно ваше высказывание. Пришла команда отработать цилиндру - включить таймер, надо считать время работы цилиндра.
А CASE и IF вообще братья-близнецы. CASE только намного лучше читается.

Непонятная мне необходимость в указателях! А зачем они вам?

Это точно. Ошибку не нашел. :(

1) Полностью очищает папку с проектом и при следующей компиляции происходит полная "сборка проекта" с нуля - онлайн изменения при этом невозможны. Пару раз встречалась такая ситуация. Если у вас не было ошибок в коде 100% должно было бы помочь.
2) Про таймеры встречал что-то наподобие такого кода и потом люди удивлялись почему выход на таймере выдаёт TRUE. (Там было нечто похожее только IF'ов было больше человек потерялся).
VAR
x: BOOL:=TRUE;
tTON: TON;
END_VAR
IF x THEN
tTON(IN:=x, PT:=T#10s);
x:=FALSE;
END_IF
tTON();
3) Про Case по мне так не очень читабельно получилось - но тут дело каждого.
4) При опросе устройств с Modbus, нестандартными протоколами приходит ответ, который зачастую нужно разбирать и переставлять байты чтобы получить значение. Можно передавать указатель на структуру в которой хранятся нужные данные для ФБ и т.д. Уменьшает количество кода и вероятнее скорость обработки данных, но это лишь моё предположение)

svr007
06.04.2021, 08:40
Вроде выявил проблему, а может так и должно быть?
Если перезагрузить контроллер (по питанию или через тумблер), то все ФБ нормально работают, у все значение INDEX и NEXT выстраиваются по порядку. И все это работает до перезаливки программы или выполнения сброса(холодного, заводского).То есть если изменить программу ( кроме онлайн изменения) или выполнить сброс и не перезагрузить контроллер, то ФБ нормально не функционируют.

Ради справедливости скажу что контроллер запитан от ИБП 24, сам контроллер находится удаленно, по питанию и тумблером не дергал до этого. Сейчас пока временно для тестов завел питание контроллера через смс реле и после изменения программы дергаю по питанию.
Р.S. На все комментарии использовать другой ПИД, я использую другой ПИД и другой контроллер. Китайцы (WEINTEK) проблему со своим ФБ ПИД за сутки решили, а тут производитель тупо даже не ответил на письмо в техподдержку. Разбираюсь ради спортивного интереса, вот и все.

Евгений Пашигоров
06.04.2021, 10:33
Ну а проект покажешь? Хочу воспроизвести. (В личку сбрось, если секретный какой.)

svr007
06.04.2021, 11:06
Скинул в личку.