И зачем вы эту портянку сюда выложили?
Можно же проект в Расширенных настройках прикрепить как файл .pro.
А по теме, разберитесь с одним ПИДом, а потом лепите всё в кучу.
Вид для печати
И зачем вы эту портянку сюда выложили?
Можно же проект в Расширенных настройках прикрепить как файл .pro.
А по теме, разберитесь с одним ПИДом, а потом лепите всё в кучу.
Подскажите, второй день бьюсь. Есть BLINK в кодесис и надо время работы и время остановки задавать переменной привязанной к панеле СП310, но в панеле я не могу понять как задать параметр T# 30s , а если просто цыфрами то ничего не получается. Почти весь интернет прорыл по этому вопросу ничего не нашел.
Спасибо огромное.
Совсем забыл про преобразования.
или без преобразований
BL.TIMELOW:= T#1s * PANEL_TIMELOW;
..
Возможно задам глупый вопрос, но тем не менее.
Интересует такая вещь, есть ли в природе какая нить софтина на винду, что бы по RS-485 можно было менять обороты/частоту частотного или некоторого кол-ва частотных преобразователей, ну скажем одного бренда с компа, и да, самое важное, что выполнять эту операцию будут люди далекие от технических нюансов, по этому все настройки которые их не касаются вообще должны быть не доступны, если такой софтины нет, то возможно ли это оперативно делать при помощи Овеновского конфигуратора ПЧВ, с соблюдением того же самого условия?
Или все же это проще реализовать на панели оператора?
Берете преобразователь USB-RS-485 подключаете в порт USB персонального компьютера.
Берете бесплатную версию (на 32 переменные) Мастерскады 4Д от "МПС Софт" (ранее ИнСАТ), там конфигурируете чтение и запись нужных регистров в ПЧ.
Выводите это все на мнемосхему. Мнемосхема открывается в любом браузере. Т.е. Вы даже из дома сможете "вмешаться" в работу оператора.
Любую Скаду можно использовать или например Овен OPC сервер. Только возьмете скаду попроще, типа SimpLighte (есть бесплатные версии), простая и удобная, встроенный Модбас сервер https://simplight.ru
Мастерскады 4Д не берите, сырая, глючная хрень, а весит как чугунный мост.
Не слушайте.
Берите Мастерскаду 4Д.
То, что нужно для непрограммистов. Это как раз среда проектирования!
Все там отлично! Это просто излюбленная наша традиция охаивать все свое!
Хотя, конечно, можно и любую другую скаду брать!
Добрый день, подскажите новичку пожалуйста.
Какой я адрес должен указать в EasyBuilder на кнопке старт (Вентилятора В1) ? Если в codesys у меня Start_Main_Fan_V1 AT %QX8 29.0.0: BOOL Вложение 73073 Вложение 73072
Адрес зависит не от AT %QX8 29.0.0, а от расположения модулей в конфигурации слейва
Адреса начинаются с 0
https://owen.ru/forum/attachment.php...5&d=1395648726
Камрады, подскажите и мне!
Подозреваю, что нарвался на выравнивание адресов в структуре и туплю, так как в другом проекте всё было нормально, и никаких глюков с выравниванием не было.
Вот что у меня есть:
1. Структура с описанием полей панели. Там всякие WORD или структуры из WORD. FLOAT и DWORD нет ВООБЩЕ.
2. Конфигурация ПЛК, где вбита пачка элементов по "4 Bytes".
3. ИП320.
Что наблюдаю: Начиная с регистра 26 данные съезжают на 1 регистр вперёд.
При этом панель читает правильно: если вручную в конфигурации ПЛК задать "2" на регистре 27 - то панель этот статус читает верно, чёрт побери.
Как будто моя структура сдвигается в регистрах 26-27 на 1 слово.
В CodeSys 2.3 как-то можно структуру выровнять по 2 байта, а не по 4 байта?
Вложение 73165 Вложение 73166 Вложение 73167 Вложение 73168
А где у меня 32 бита? У меня везде всё по WORD - по 16 бит же.
И панель всё читает как 16-битные. Какая ей разница, как в ПЛК ЭТО вбито? В прошлом проекте такого не было, и начало регистров с нечётными данными читались на ура.
То, что я тут поменял - так это сделал вложенные структуры из 2х WORD на 4 WORD.
4 BYTE, это DWORD, а структуру вы пытаетесь поместить во 2 регистр предыдущего DWORD.
Не понимаю. Почему ж в другом проекте я делал так:
* Набивал в конфигурации ПЛК по 4 байта (DWORD)
* Читал их как хотел из панели: чётно или нечётно, и панель всё читала.
А тут откуда-то вылезают дырки в самой структуре в CodeSys, а не в панели.
Я ща начал при помощи SizeOf() подгонять всё под количество полей в своей структуре.
Да, конечно. И можно на "ты", без проблем.
Как я понял, CodeSys в своих структурах округляет новые поля (вложеные структуры), если они начинаются с нечётного адреса.
Код:(* Структура данных для интервалов времени настроек объектов на панели оператора или в другом месте.
Занимает 4 (ЧЕТЫРЕ) регистра *)
TYPE CSSetTimesBE :
STRUCT
TimeBeginHour : WORD; (* Регистр 1, Время начала интервала: Часы *)
TimeBeginMinute : WORD; (* Регистр 2, Время начала интервала: Минуты *)
TimeEndHour : WORD; (* Регистр 3, Время конца интервала: Часы *)
TimeEndMinute : WORD; (* Регистр 4, Время конца интервала: Минуты *)
END_STRUCT
END_TYPE
Валенок Спасибо! Я вот и влетел именно со стороны CodeSys с этими размерами и округлением структур.
Ща правлю всё понемногу, проверяя через SizeOf!
Ура! Я разобрался с этим выравниванием. В итоге число регистров и 520 стало 542 штуки. ИП-320 это нормально сожрала.
Так что всё ОК: проблемы были именно с выравниванием структур, а не с конфигурацией ПЛК.
Угу! Я вчера в итоге через SizeOf и Эксель подбирал структуры так, чтобы адреса совпадали =)
Ну, образно вижу что по Экселю должно быть 118, а по ПЛК - 120. Значит где-то WORD дополнился. Иду его искать по чётным и нечётным адресам. Нахожу. Проверяю ещё раз. Совпадает - отлично.
Здравствуйте, коллеги.
Прошу помощи, в оптимизации кода. Возможно ли данный код привести к циклу чтобы реализовывать любое количество START_MOTOR
я пытаюсь делать в цикле но при любом Conveyors[i+1].motorSensor = TRUE все START_MOTOR срабатываютКод:IF Conveyors[2].motorSensor THEN
START_MOTOR1(inStart:=Conveyors[1].motorStart, inReset:=Conveyors[1].motorStop);
Conveyors[1].motorSensor := START_MOTOR1.OUT;
END_IF
IF Conveyors[3].motorSensor THEN
START_MOTOR2(inStart:=Conveyors[2].motorStart, inReset:=Conveyors[2].motorStop);
Conveyors[2].motorSensor := START_MOTOR2.OUT;
END_IF
IF Conveyors[4].motorSensor THEN
START_MOTOR3(inStart:=Conveyors[3].motorStart, inReset:=Conveyors[3].motorStop);
Conveyors[3].motorSensor := START_MOTOR3.OUT;
END_IF
Код:FOR i := 1 TO count - 1 DO
IF Conveyors[i+1].motorSensor THEN
START_MOTOR(inStart:=Conveyors[i].motorStart, inReset:=Conveyors[i].motorStop);
Conveyors[i].motorSensor := START_MOTOR.OUT;
END_IF
END_FOR
Start motor должен быть массивом, а у вас один параметр при изменении кода.
Не заметил что это fb.
Тогда другой вариант... А если в коде первоначальном fb с цифровым индексом заменить на один и тот же fb, как себя поведёт программа? Если так же как программа с циклом, то проблема где то там...
Благодарю вас! Это то что нужно и удалось реализовать расширяемость системы.
Код:FOR i := 1 TO count - 1 DO
IF Conveyors[i+1].motorSensor THEN
START_MOTORS[i](inStart:=Conveyors[i].motorStart, inReset:=Conveyors[i].motorStop);
Conveyors[i].motorSensor := START_MOTORS[i].OUT;(*Имитируем ответный сигнал что конвейер запустился*)
END_IF
END_FOR
Добрый день, кто нибудь делал связку PLC овен 110-60 и бпс-3-и с газоанализаторами СТГ-3 в codesys 2.3? Не получается получить данные с бпс3
я не делал, просто рядом постоял
если мне не изменяет память - там модбас, основные общие данные спокойно можно прочитать, там обычный byte, делайте UMD и считывайте и распаковывайте
а если хотите всю детализацию, то и там и в СТГ тоже формат BCD, там 4 байта , тут надо уже глубоко погружаться . хотя это как и DWORD в принципе, но там надо повозиться с распаковкой и придёться скорее всего вручную это писать
и зачем вам СТГ напрямую? он же адресный, для подключения к БПС
Больше нет сил! Ткните носом, пожалуйста. Управление вентиляцией представлена структурой. В отдельном ФБ - все функции системы. Есть функция управления заслонкой без обратной связи с отслеживанием позиции по времени ее работы:
FUNCTION_BLOCK VenFunctions
VAR_INPUT
num : INT;
END_VAR
--------------------
...
IF Ven[num].Flap.Open THEN
IF Ven[num].Flap.Open AND NOT Ven[num].Flap.xOpen THEN
Ven[num].Flap.xOpen:=TRUE;
Ven[num].Flap.Close:=Ven[num].Flap.xClose:=FALSE;
Ven[num].Flap.t_Pos:=TIME();
ELSIF Ven[num].Flap.Open AND Ven[num].Flap.xOpen THEN
Ven[num].Flap.Pos:= Ven[num].Flap.Pos + 0.00258 * (TIME_TO_REAL(TIME() - Ven[num].Flap.t_Pos));
Ven[num].Flap.t_Pos:=TIME();
IF Ven[num].Flap.Pos > 90 THEN Ven[num].Flap.Pos:=90;
END_IF;
ELSE
Ven[num].Flap.xOpen:=FALSE;
END_IF;
END_IF;
...
Тоже самое и на закрытие. Отлично работает, видно включение выхода на ПЛК, видно движение в визуализации.
Вчера написал режим калибровки/антизалипания (время от времени полностью открывать, потом закрывать для синхронизации положения) и проблема, в том, что, по каким-то причинам данный функция пытается выполниться за 1 цикл ПЛК, то есть не записывает выходные переменные. Подскажите, как обыграть данную ситуёвину( Максимально упрощенный блок калибровки:
IF Ven[num].Flap.xAdjust THEN (* Пора калиброваться *)
CASE Ven[num].Flap.sAdjust OF (* Счетчик шагов в структуре *)
1: Ven[num].Flap.Close:=FALSE; (*Шаг 1, Открываем заслонку, понадобится 40 секунд с запасом *)
VEN[num].Flap.Open:=TRUE;
t1(IN:=TRUE, PT:=T#40s);
IF t1.q THEN
Ven[num].Flap.sAdjust:=Ven[num].Flap.sAdjust+1;
t1.in:=FALSE;
END_IF;
2: VEN[num].Flap.Close:=TRUE; (*Шаг 2, Закрываем заслонку, те же 40 секунд *)
VEN[num].Flap.Open:=FALSE;
t1(IN:=TRUE, PT:=T#40s);
IF t1.q THEN
Ven[num].Flap.sAdjust:=Ven[num].Flap.sAdjust+1;
t1.in:=FALSE;
END_IF;
3: VEN[num].Flap.Close:=FALSE; (*Шаг 3 Выключаем управление *)
VEN[num].Flap.Open:=FALSE;
Ven[num].Flap.sAdjust:=1; (* Сбрасываем счетчик *)
Ven[num].Flap.xAdjust:=FALSE; (* Завершаем режим калибровки *)
END_CASE
END_IF;
(В программе управления вентиляцией объявляем этот ФБ, как входной параметр указываем номер системы - V1(num:=1); )
Перепробовал RETURN, убрать CASE за IF.. не могу осилить :/
Да, и еще момент - через визиализацию видно, что таймеры работают, так как шаги шагаются ( Ven[num].Flap.sAdjust увеличивается, как положено ), но значения на вход не пишутся