Никак нельзя обработать дискретные выходы в массиве, потому что они им не являются
Вид для печати
Это от нежелания банально преварительно "ассоциировать" их в массив юзающих их обьектов (и забыв про какие то там физические входа) по причине это не круто/этож примитивные присвоения/это много строк. Но на фоне этого заполонить код многобуквием, спорными вопросами и непонятно зачем кучей таймеров и флагов при наличии автомата.
Дорогие друзья помогите с программой для ПЛК 160 надо настроить опрос и прием данных китайского датчика растворенного кислорода LH-DY06 по rs485
Ну первая страница вас чем не устраивает? Считываете с 200 регистра 3 регистра. Только десятичное число в ответе поделите на 100.
PS такие документы лучше не через переводчик, а хотя бы на английском...
У кого под руками установленный CodeSys, скиньте код BLINK из него пожалуйста. находится в Util.lib
Код:FUNCTION_BLOCK BLINK
(* Function block to simulate a turn signal *)
VAR_INPUT
ENABLE:BOOL; (* TRUE:run Blink, FALSE: OUT keeps its value*)
TIMELOW:TIME; (* Time for OUT=FALSE *)
TIMEHIGH:TIME; (* Time for OUT=TRUE *)
END_VAR
VAR_OUTPUT
OUT:BOOL; (* output variable, starting with FALSE *)
END_VAR
VAR
CLOCK:TP;
END_VAR
CLOCK; (* call Timer *)
IF CLOCK.Q=FALSE AND ENABLE THEN (* time passed or init *)
CLOCK(IN:=FALSE); (* reset Timer *)
CLOCK(IN:=TRUE); (* restart Timer *)
IF OUT=FALSE THEN
CLOCK.PT:=TIMEHIGH;
ELSE
CLOCK.PT:=TIMELOW;
END_IF;
OUT := NOT OUT; (* invert *)
END_IF
1exan спасибо. А то не очень хотелось устанавливать на домашний комп, а на работу только в понедельник :)
Посмотрите обучающие видео №6, а лучше все 13 шт. https://www.youtube.com/watch?v=hOhL...p0nrq5&index=6
Подскажите, пожалуйста, почему в конфигурации LeftSide ПЛК-210-12 отсутствует параметры/настройки ABZ -энкодеров? И возможно ли их добавить? В конфигурации ПЛК-210-01 данные параметры присутствуют ( скриншоты прилагаем).
Вложение 73636
Вложение 73637
Потому что ПЛК210-1Х не поддерживают подключение энкодеров.
Характеристики входов ПЛК210-0Х
Вложение 73639
Характеристики входов ПЛК210-1Х
Вложение 73640
Всем спасибо за помощь! Будем писать сами.
В кратком руководстве по эксплуатации на ПЛК210-12 указано, что он поддерживает энкодеры ABZ.
Вложение 73642
Да, большое спасибо. Пример точно не будет лишнем.
Вот попробуйте вот это:
Код:PROGRAM POU_ENCODER
VAR
//Энкодер направления вращения
a: BOOL; //Вход датчика А
b: BOOL; //Вход датчика В
a1: BOOL; //Условие 1го положения
a2: BOOL; //Условие 2го положения
a3: BOOL; //Условие 3го положения
a4: BOOL; //Условие 4го положения
//Энкодер направления вращения
//Направление вращения
c0: BOOL; //Вращение вперед
d0: BOOL; //Вращение назад
//Направление вращения
zIMP1: R_TRIG; //Фронт импульса датчика А
zIMP2: R_TRIG; //Фронт импульса датчика В
zIMP3: F_TRIG; //Спад импульса датчика А
zIMP4: F_TRIG; //Спад импульса датчика В
zIMP5: R_TRIG; //Фронт импульса для "Вращение вперед"
zIMP6: R_TRIG; //Фронт импульса для "Вращение назад"
//Определение импульсов сигнала
i1: DINT; //Количество импульсов сигнала датчика А
i2: DINT; //Количество импульсов сигнала датчика В
iF1: DINT; //Количество накопленных импульсов сигнала датчика А для "Вращение вперед"
iF2: DINT; //Количество накопленных импульсов сигнала датчика В для "Вращение вперед"
iR1: DINT; //Количество накопленных импульсов сигнала датчика А для "Вращение назад"
iR2: DINT; //Количество накопленных импульсов сигнала датчика В для "Вращение назад"
//Определение импульсов сигнала
RESET_BIT: BOOL;
END_VAR
VAR_INPUT
iA1: BOOL; //Входной импульс основного датчика
iA2: BOOL; //Входной импульс вспомогательного датчика
END_VAR
VAR_OUTPUT
oC0: BOOL; //Направление вращения - Вперед
oD0: BOOL; //Направление вращения - Назад
oN1: DINT; //Количество импульсов датчика А
oN2: DINT; //Количество импульсов датчика В
END_VAR
Код://iA1 = 0/1 - Входной импульс основного датчика
a := iA1;
//iA2 = 0/1 - Входной импульс вспомогательного датчика
b := iA2;
//Энкодер направления вращения
IF a AND NOT b THEN a1 := 1; END_IF
IF a AND b THEN a2 := 1; END_IF
IF NOT a AND b THEN a3 := 1; END_IF
IF NOT a AND NOT b THEN a4 := 1; END_IF
IF a1 AND a2 AND a AND b THEN d0 := a3 := a4 := 0; c0 := 1;
ELSIF a2 AND a3 AND NOT a AND b THEN d0 := a4 := a1 := 0; c0 := 1;
ELSIF a3 AND a4 AND NOT a AND NOT b THEN d0 := a1 := a2 := 0; c0 := 1;
ELSIF a4 AND a1 AND a AND NOT b THEN d0 := a2 := a3 := 0; c0 := 1;
ELSIF a1 AND a2 AND a AND NOT b THEN c0 := a3 := a4 := 0; d0 := 1;
ELSIF a2 AND a3 AND a AND b THEN c0 := a4 := a1 := 0; d0 := 1;
ELSIF a3 AND a4 AND NOT a AND b THEN c0 := a1 := a2 := 0; d0 := 1;
ELSIF a4 AND a1 AND NOT a AND NOT b THEN c0 := a2 := a3 := 0; d0 := 1;
END_IF
//Энкодер направления вращения
//Направление вращения
oC0 := c0;
oD0 := d0;
//Направление вращения
zIMP1(CLK := a);
zIMP2(CLK := b);
zIMP3(CLK := a);
zIMP4(CLK := b);
zIMP5(CLK := c0);
zIMP6(CLK := d0);
//Определение импульсов сигнала
IF c0 AND zIMP1.Q THEN i1 := i1 + 1; END_IF
IF d0 AND zIMP3.Q THEN i1 := i1 - 1; END_IF
IF c0 AND zIMP2.Q THEN i2 := i2 + 1; END_IF
IF d0 AND zIMP4.Q THEN i2 := i2 - 1; END_IF
IF c0 AND zIMP1.Q THEN iF1 := iF1 + 1; END_IF
IF zIMP5.Q AND zIMP3.Q THEN iF1 := iF1 - 1; END_IF
IF c0 AND zIMP2.Q THEN iF2 := iF2 + 1; END_IF
IF zIMP5.Q AND zIMP4.Q THEN iF2 := iF2 - 1; END_IF
IF zIMP6.Q AND zIMP1.Q THEN iR1 := iR1 + 1; END_IF
IF d0 AND zIMP3.Q THEN iR1 := iR1 - 1; END_IF
IF zIMP6.Q AND zIMP2.Q THEN iR2 := iR2 + 1; END_IF
IF d0 AND zIMP4.Q THEN iR2 := iR2 - 1; END_IF
//Определение импульсов сигнала
//Количество импульсов
oN1 := i1;
oN2 := i2;
//Количество импульсов
IF RESET_BIT THEN
i1 := i2 := iF1 := iF2 := iR1 := iR2 := 0;
RESET_BIT := a1 := a2 := a3 := a4 := c0 := d0 := 0;
END_IF
reset_bit - онлайн отладка руками? да и комент для него странный
Добрый день
Есть ПЛК110[М02] и сенсорная панель. Связь ПЛК с панелью по Ethernet. Подключаю ПЛК к ПК по Ethernet. Запускаю на ПК CoDeSys и конфигуратор панели, т.е. 2 приложения одновременно. Загружаю проект в ПЛК и запускаю. Запускаю проект для панели на ПК в режиме онлайн эмуляции. Будет ли нормальный обмен ПЛК с обоими приложениями ПК.
Добрый день
Как в CoDeSys посмотреть IP адрес ПЛК ?
Добрый день. Подскажите пожалуйста, какие есть внутренние ограничения на переменные?
Суть проблемы - ПР200 - 2 счетчика импульсов (аналоговые входы в режиме дискретных), на значениях 256 и 8717,51 не инкрементируется, при этом если поставить большие или меньшие числа, например 255,95/300 или 89000, то всё работает.
Исходя из описания типа, у меня в запасе 38 знаков,... https://docs.owen.ru/product/program...58#topic-83359
В целых меньше, но до них я тоже не досчитываю...
Сетевую переменную из расчета удалял - эффекта нет. логика деления на 100/1000 исходя из количества импульсов на 10 литров или на 1 литр, соответственно на выходе кубы.
Подскажите пожалуйста, где руки гнутся не в локтях? проект прилагаю
Да, штука интересная
Но может я конечно не понял суть задачи, но почему бы не считать с накоплением просто количество импульсов, а потом пересчитывать его в нужные единицы?
Вложение 74024
переменная water-internal выведена на панель для возможности коррекции начального значения (условно если света не было, а был водоразбор или работал котёл) - т.е. стартовать в теории должно с энергонезависимой переменной из памяти
пробовал альтернативный вариант - верхний блок вложения, считает нормально, но вносит ошибку в 5 знак...
благодарю за оперативный ответ,
случаем не подскажете, как это обойти? - странный наверное вопрос - но внутренние блоки же должны работать со стандартной длиной чисел? (аналогичной базовым?) - во вложенном варианте всё считается в плавающей точке и на числах больше 256002 / 1000 уже ошибка... - сейчас попробую переписать на ST
Есть такая штука, называется Алгоритм_Кэхэна
Если я правильно понял это, то выглядит как-то так:
Вложение 74026
Думаю, что надо считать в целочисленном формате (32 битным счётчиком), с плавающей запятой будут проблемы больше 5 значного числа, в любом случае.
Даже по варианту Алгоритм_Кэхэна. И дело тут не в реле, а в представлении Float.
В промышленных счётчиках используют комбинированный вариант, целое до запятой и Float после запятой.
kondor3000, 1exan, спасибо за идеи, ушел в реализацию )
ошибка действительно вылезает в блоке fMUL, а там есть оговорка - "Если во время выполнения операции функции значение числа получается больше 4294967295 (32 бита), то биты, выходящие за разрядность 32 бита, отсекаются."
придется вычислять целую и дробную отдельно,...
У меня получилось так Вложение 74028
kondor3000, спасибо, красивое решение!
пока закину счетчиком в целых (на панели будет основная - как и было в кубах = счетчик, для ввода = в литрах) - за то простопросто )))
она мне не нужна - чтоб базу не засорять я забираю её модбасом один раз в час и строю почасовой лог потребления воды, газа, электричества (это "домашняя" автоматизация, на работе да - каждое изменение по МЭК 104 с дискретом 0,1% ДИ с хранением в 3 года с десятков тысяч приборов)
в ситуации с, считаю, запланированной ущербностью математики, закрепленной оговоркой в РЭ в целях загнать всех с ПР на ПЛК, я ошибался с точностью и у меня не сходились, условно, накопительные итоги - Вы правы, это критически важно и потребовало внесения изменений в алгоритм для корректной обработки в рамках МОИХ диапазонов измерений, а сейчас накопления считаются точно, могу получить ошибку исключительно при снятии показания в 5м знаке при разрядности эталонного счетчика в 3 знака после запятой, при этом не накапливая ошибку... в общем то не принципиально :)
Что не так в строке ?