Просмотр полной версии : ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)
Спасибо за идею без MOVE, но так проходит кратковременно авария при выключении xDO6_FUN, и в целом нет аварии при переходе TEST_FAN_ON из TRUE в FALSE при xDO6_FUN: TRUE
Если Test_Fan_On - это нечто вроде реле перепада давления на вентиляторе, то поставьте задержку побольше
Еще, так можно
78981
Здесь задержка работает только при включении
Где-то на форуме выкладывали функцию отличную, дайте ссылку, если кто-то помнит, что бы еще раз сказать спасибо автору.
TYPE Point_GR :
STRUCT
X,Y: REAL;
END_STRUCT
END_TYPE
FUNCTION MyGraf_p : REAL
VAR_INPUT
IN: REAL; (*Входной сигнал*)
pt : POINTER TO ARRAY[0..99] OF Point_GR; (*Массив точек графика, не более 100 пар точек X,Y*)
size : UINT;
END_VAR
VAR
a: INT; (*Начало интервала поиска*)
b: INT; (*Конец интервала поиска*)
N: INT; (*Число точек в графике*)
i: INT;
END_VAR
N:= SHR(size,3)-1; (*Число точек в графике*)
(*Начальные значения интнрвала поиска*)
a:=0;
b:=N-1;
(*Обрезание графика для крайних точек*)
IF IN<=pt^[0].X THEN
MyGraf_p:=pt^[0].Y;
ELSIF IN>=pt^[N-1].X THEN
MyGraf_p:=pt^[N-1].Y;
(*Теперь можно начать поиск*)
ELSE
WHILE (b-a) <> 1 DO (*В конце концов, входной сигнал ТОЧНО попадет между двумя соседними точками X(a) и Х(а+1)*)
i:=(a+b)/2; (*Делим интервал поиска пополам*)
IF IN=pt^[i+1].X THEN (*Может нам повезло, и мы сразу нашли точку? *)
a:=i; b:=i+1; (*Бинго! прекращаем итераций, нечего в пустую молотить :) *)
(*мимо :( ,тогда посмотрим в какую половину интервала попали*)
ELSIF IN>pt^[i].X THEN (*Если входной сигнал больше середины интервала поиска,*)
a:=i; (*то следующий поиск будем делать начиная от середины и до конца массива*)
ELSE (*А если входной сигнал меньше середины интервала поиска,*)
b:=i; (*то следующий поиск будем делать начиная от начала и до середины массива*)
END_IF
(*Таким образом на каждой итерации отбрасываем из поиска заведомо ненужную половину значений
две соседние координаты X(a) и Х(а+1), меду которыми попадает входной сигнал найдем очень быстро
для 8 точек графика нужно не более 3 итераций
при 9..16 точек в графике нужно не более 4 итераций
при 17..32 точек в графике нужно не более 5 итераций
при 33..64 точек в графике нужно не более 6 итераций
при 65..128 точек в графике нужно не более 7 итераций
инфа точная - 100% ;) *)
END_WHILE
(*Теперь самое простое - сделать линейную аппроксимацию по двум точкам ;) *)
MyGraf_p:=pt^[b].Y-(pt^[b].X-IN)*(pt^[b].Y-pt^[a].Y)/(pt^[b].X-pt^[a].X);
END_IF
Использование:
PROGRAM PLC_PRG
VAR
GR: ARRAY [0..49] OF Point_GR:=
(X:=0, Y:=15),(X:=3, Y:=25),(X:=4, Y:=45),(X:=8, Y:=75),(X:=15, Y:=45),
(X:=16, Y:=45),(X:=20, Y:=65),(X:=22, Y:=75),(X:=40, Y:=95),(X:=50, Y:=105),
(X:=110, Y:=15),(X:=120, Y:=25),(X:=130, Y:=45),(X:=140, Y:=75),(X:=150, Y:=45),
(X:=160, Y:=45),(X:=200, Y:=65),(X:=220, Y:=75),(X:=240, Y:=95),(X:=250, Y:=305),
(X:=301, Y:=15),(X:=305, Y:=25),(X:=324, Y:=45),(X:=380, Y:=75),(X:=415, Y:=45),
(X:=416, Y:=45),(X:=420, Y:=65),(X:=422, Y:=75),(X:=440, Y:=495),(X:=450, Y:=505),
(X:=511, Y:=15),(X:=515, Y:=25),(X:=524, Y:=45),(X:=580, Y:=75),(X:=615, Y:=45),
(X:=416, Y:=45),(X:=420, Y:=65),(X:=422, Y:=75),(X:=440, Y:=495),(X:=450, Y:=505),
(X:=621, Y:=15),(X:=625, Y:=25),(X:=634, Y:=45),(X:=680, Y:=75),(X:=695, Y:=45),
(X:=676, Y:=45),(X:=680, Y:=65),(X:=692, Y:=75),(X:=740, Y:=495),(X:=750, Y:=505);
IN: REAL;
OUT: REAL;
END_VAR
OUT:=MyGraf_p(IN, ADR(GR), SIZEOF(GR));*)
А если хотите изучить, то код библиотеки Util открыт, открываете в CoDeSys и изучаете.
Это был я, https://owen.ru/forum/showthread.php?t=10555&p=220263&viewfull=1#post220263
Dmitry_KV
29.09.2024, 22:23
Если Test_Fan_On - это нечто вроде реле перепада давления на вентиляторе, то поставьте задержку побольше
Еще, так можно
78981
Здесь задержка работает только при включении
xDO6_FUN это изначальный сигнал включения - подает питание на реле вентилятора, его в этой блок схеме не надо включать, он включается в другом месте и отключается с задержкой. Необходимо контролировать, что вентилятор включился TEST_FAN_ON стал TRUE все время пока реле xDO6_FUN:TRUE.
На самом деле я не уверен, пресостат на вентиляторе стоит или сухой контакт с его магнитного пускателя. Факт в том, что после включения xDO6_FUN проходит некоторое непродолжительное время (доли секунды) и появляется TEST_FAN_ON в TRUE. Но этого хватает чтобы на мгновение прошла авария, если не использовать таймер TOF в предложенной мной схеме.
78982
Выложенная мной схема работает так как мне надо, задача была избавиться от таймера TOF. Во всем проекте используется таймеров-7 шт. , один из которых исправляет зависание 2х таймеров при изменении их уставки на меньшее значение. На данный момент смирился с еще одним таймером.
Всем спасибо!
Появилась более интересная проблема, этот же контроллер ПЛК110-32 (М2) опрашивает счетчики по Modbus RTU (3 шт. по 25 регистров DINT), часть из них используется в работе ПЛК, но все 75 шт. передаются по Modbus TCP в SCADA. А проблема в том, что опрашивает он их по одному, не пакетно, и похоже после каждого регистра еще и таймаут выжидает, а счетчики итак на скорости 19200 работают. Где-то встречал на форуме такую проблему, но там писался свой блок опроса или сторонняя библиотека. Хотелось бы более оперативно видеть данные в SCADA.
xDO6_FUN это изначальный сигнал включения - подает питание на реле вентилятора, его в этой блок схеме не надо включать, он включается в другом месте и отключается с задержкой. Необходимо контролировать, что вентилятор включился TEST_FAN_ON стал TRUE все время пока реле xDO6_FUN:TRUE.
На самом деле я не уверен, пресостат на вентиляторе стоит или сухой контакт с его магнитного пускателя. Факт в том, что после включения xDO6_FUN проходит некоторое непродолжительное время (доли секунды) и появляется TEST_FAN_ON в TRUE. Но этого хватает чтобы на мгновение прошла авария, если не использовать таймер TOF в предложенной мной схеме.
78982
Появилась более интересная проблема, этот же контроллер ПЛК110-32 (М2) опрашивает счетчики по Modbus RTU (3 шт. по 25 регистров DINT), часть из них используется в работе ПЛК, но все 75 шт. передаются по Modbus TCP в SCADA. А проблема в том, что опрашивает он их по одному, не пакетно, и похоже после каждого регистра еще и таймаут выжидает, а счетчики итак на скорости 19200 работают. Где-то встречал на форуме такую проблему, но там писался свой блок опроса или сторонняя библиотека. Хотелось бы более оперативно видеть данные в SCADA.
Для реализации группового опроса используйте модуль String в конфигурации мастера ПЛК
Например
https://owen.ru/forum/showthread.php?t=22915&p=333593&viewfull=1#post333593
https://owen.ru/forum/showthread.php?t=22915&p=244022&viewfull=1#post244022
Dmitry_KV
29.09.2024, 23:17
Для реализации группового опроса используйте модуль String в конфигурации мастера ПЛК
Например
https://owen.ru/forum/showthread.php?t=22915&p=333593&viewfull=1#post333593
https://owen.ru/forum/showthread.php?t=22915&p=244022&viewfull=1#post244022
Спасибо большое, буду разбираться)
Попробовал работает, вроде даже быстрее. Но не правильное чередование байт - значение должно быть 231, а отображает 15138816.
78985
По настройкам вроде правильно выставил, если считывать отдельно требуемые параметры они отображаются корректно, тип данных DWORD.
78986
In_Da_Cher_A
30.09.2024, 08:33
опрашивает счетчики по Modbus RTU (3 шт. по 25 регистров DINT), часть из них используется в работе ПЛК, но все 75 шт. передаются по Modbus TCP в SCADA. А проблема в том, что опрашивает он их по одному, не пакетно, и похоже после каждого регистра еще и таймаут выжидает, а счетчики итак на скорости 19200 работают.электросчётчики или что?
самый главный вопрос - а нужно ли быстрее? :D
Dmitry_KV
30.09.2024, 08:51
электросчётчики или что?
самый главный вопрос - а нужно ли быстрее? :D
Да электросчетчики Lovato DMK22, изначально опрашивались напрямую SCADA. Хотелось бы максимально сохранить скорость опроса, а то выделяются на фоне остальных. Возможно и не нужно быстрее, но 4-5 сек тоже не дело) Больше спортивный интерес.
In_Da_Cher_A
30.09.2024, 09:06
Да электросчетчики Lovato DMK22, изначально опрашивались напрямую SCADA. Хотелось бы максимально сохранить скорость опроса, а то выделяются на фоне остальных. Возможно и не нужно быстрее, но 4-5 сек тоже не дело) Больше спортивный интерес.и как быстро меняются данные в электросчётчике? суточный объём, месячный объём, что там ещё активная, реактивная, ну токи допустим...и что в СКАДА системе за алгоритм, требующий более скоростного опроса и реакции на изменение допустим тока по фазе А?
я к тому, что изменение "загрузки" пары тройки "микросхем" отвечающих за сетевой опрос в ПЛК с допустим условно 30% до 5% никак не скажется на ни на увеличении времени безотказной работы, на на перегреве, ни на что другое
"ускорять" опрос или ещё как-то заморачиваться стоит только для того, имхо, если этого реально требует либо алгоритм, либо сетевые затыки. В большинстве случаев, все ускорения - это просто увеличение энтропии вселенной :D
спортивный интересну чисто для трени - вай нот
Dmitry_KV
30.09.2024, 09:25
и как быстро меняются данные в электросчётчике? суточный объём, месячный объём, что там ещё активная, реактивная, ну токи допустим...и что в СКАДА системе за алгоритм, требующий более скоростного опроса и реакции на изменение допустим тока по фазе А?
я к тому, что изменение "загрузки" пары тройки "микросхем" отвечающих за сетевой опрос в ПЛК с допустим условно 30% до 5% никак не скажется на ни на увеличении времени безотказной работы, на на перегреве, ни на что другое
"ускорять" опрос или ещё как-то заморачиваться стоит только для того, имхо, если этого реально требует либо алгоритм, либо сетевые затыки. В большинстве случаев, все ускорения - это просто увеличение энтропии вселенной :D
ну чисто для трени - вай нот
Заказчику нужно скорее для анализа кратковременных скачков мощности, которые можно вообще не увидеть при опросе в 4-5 сек. На работу ПЛК и его алгоритма это может повлиять если целевая уставка времени будет меньше 10 сек., на практике скорее меньше 20 сек не будет, если только больше. В принципе дальше на каждом потребителе уже нормальные мультиметры стоят по ним можно эти же скачки с точностью до десятых долей секунды видеть. Так что, хотелось бы сделать хорошо))
.. По настройкам вроде правильно выставил, если считывать отдельно требуемые параметры они отображаются корректно, тип данных DWORD..
String это просто контейнер для абстрактных регистров и он всегда нативный относительно слейва (не путать с пакетом) и кладет на настройку порядка регистров, которая за каким-то по дефолту трасемоде, т. е. переставляет регистры для "розничного" обмена
Т..к. в ваших слейвах порядок 3412, просто скопируйте из стринга исходную массив/структуру в нужное место и переставьте там слова в нужных двойных словах
Dmitry_KV
30.09.2024, 10:30
Т..к. в ваших слейвах порядок 3412, просто скопируйте из стринга исходную массив/структуру в нужное место и переставьте там слова в нужных двойных словах
Я это понимаю, если не трудно подскажите нужную библиотеку или пример. Библиотека UTIL вроде только с битами работает, не хотелось бы до битовых данных опускаться, а работать хотя бы с байтами.
Я это понимаю, если не трудно подскажите нужную библиотеку или пример. Библиотека UTIL вроде только с битами работает, не хотелось бы до битовых данных опускаться, а работать хотя бы с байтами.
Выложите проект и карту регистров этой ловаты
kondor3000
30.09.2024, 10:36
Я это понимаю, если не трудно подскажите нужную библиотеку или пример. Библиотека UTIL вроде только с битами работает, не хотелось бы до битовых данных опускаться, а работать хотя бы с байтами.
Самое простое создать функцию и переставить регистры 78988
FUNCTION SW_DWORD : DWORD
VAR_INPUT
DW :DWORD; (*полученный DWORD *)
END_VAR
________________________________
SW_DWORD := ROL(DW, 16); (* Выход с переставленными регистрами*)
))
Еще проще создать функцию и переставить как хочешь и сразу всей структуре/массиве
FUNCTION SwapOrder : BOOL (*неисп*)
VAR_INPUT
PStruct : DWORD; (*pointer to struct..*)
SzStruct : DWORD; (*для кратного 4*)
Order : WORD; (*2143,3412,4321. Всё остальное как 1234 и не трогается*)
END_VAR
---------------------------------------
CASE Order OF 2143,3412:
SysMemSwap(PStruct, 2, SzStruct / 2);
END_CASE
CASE Order OF 3412,4321:
SysMemSwap(PStruct, 4, SzStruct / 4);
END_CASE
Куда-то_в_слейв AT %где_то_в_слейве : ARRAY[..] of / STRUCT / ...
Order : WORD := 3412; (*для поиграть*)
---------------------------------------
SysMemCpy(ADR(Куда-то_в_слейв), ADR(Откуда-то_из_мастера), SIZEOF(Куда-то_в_слейв));
SwapOrder(ADR(Куда-то_в_слейв), SIZEOF(Куда-то_в_слейв), Order);
Иногда проще скомпоновать перенос с перестановкой в один футляр
Dmitry_KV
30.09.2024, 12:16
Самое простое создать функцию и переставить регистры
Спасибо, сейчас попробую.
))
Еще проще создать функцию и переставить как хочешь и сразу всей структуре/массиве
Иногда проще скомпоновать перенос с перестановкой в один футляр
Не до конца понятно, но очень интересно. Похоже это то, что требовалось в самом начале... Спасибо, буду пытать
Не до конца понятно,..
см. п#11012
Dmitry_KV
01.10.2024, 09:09
Выложите проект и карту регистров этой ловаты
В принципе меня устроило как работает предложенное уважаемым kondor3000, но этот вариант тоже может пригодиться в будущем.
Адресс Наименование
1 Напряжение_AN
3 Напряжение_BN
5 Напряжение_CN
7 Напряжение_LN_Avg
15 Напряжение_LL_ср
17 Текущий_ток_А
19 Текущий_ток_В
21 Текущий_ток_С
25 Полная_активная_мощность
27 Полная_реактивная_мощность
29 Полная_общая_мощность
33 Доставленная_активная_энергия
37 Доставленная_реактивная_энергия
41 Активная_мощность_А
43 Активная_мощность_В
45 Активная_мощность_С
47 Реактивная_мощность_А
49 Реактивная_мощность_В
51 Реактивная_мощность_С
53 Полная_мощность_А
55 Полная_мощность_В
57 Полная_мощность_С
71 Частота
511 Дисбаланс_напряжения
513 Дисбаланс_тока
Почему с нечетных если на стр. 10 с четных?
Чем @150 отличается от @144,146,148?
kondor3000
01.10.2024, 10:16
Почему у вас адреса начинаются с первого, когда по мануалу, адреса начинаются со 2.
У вас в итоге и регистры переставлены и читаете вы регистры из разных каналов. Если я прав, то переставлять регистры надо при обычном чтении, а через String и переставлять ничего не надо.
По мануалу функция должна быть 4, а вы всё читаете 3
Dmitry_KV
01.10.2024, 12:01
По мануалу функция должна быть 4, а вы всё читаете 3
Вот это ошибка... из других счетчиков перекочевала.
Почему у вас адреса начинаются с первого, когда по мануалу, адреса начинаются со 2.
У вас в итоге и регистры переставлены и читаете вы регистры из разных каналов. Если я прав, то переставлять регистры надо при обычном чтении, а через String и переставлять ничего не надо.
Почему с нечетных если на стр. 10 с четных?
При функции 3 смещение на 1 регистр, если ставить как в мануале то вообще ничего не читает, сразу в ошибку вываливается. Сейчас перепроверил, при нужной функции чтения 4, без разницы с какого регистра начинать чтение, но поправил на четный как в мануале. Цифры одинаковые считывает! Преобразование все равно нужно
Т.к. ПЛК считывает одинаковые цифры со смещением и без, проверил как все считается в arOPC напрямую со счетчика. В OPC сервере необходимо смещение, т.е. начало с 1 регистра а не со 2 как в мануале. С четного опрос не идет.
Чем @150 отличается от @144,146,148?
К мультиметру @150 есть доступ и там живые данные, у @144,146,148 все по нулям чтобы подать на них напряжение надо включать установку.
kondor3000
01.10.2024, 13:05
Т.к. ПЛК считывает одинаковые цифры со смещением и без, проверил как все считается в arOPC напрямую со счетчика. В OPC сервере необходимо смещение, т.е. начало с 1 регистра а не со 2 как в мануале. С четного опрос не идет.
.
Адреса должны быть как в мануале, если написано 2 значит 2, в ОРС сервере тоже самое, если передаёте 2 регистр то и принимать надо 2,
если же ошибка и не правильно передаётся, то надо не адрес менять, а регистры (байты) правильно расставить.
Нет в ОРС сервере никакого смещения.
А вот в слейве ПЛК адреса начинаются с 0 и 32 битные переменные должны быть с чётными адресами. Если сделать с нечётными, то выравнивание сместит адреса, на следующий чётный адрес. Но судя по выложенному проекту у вас адреса правильные.
То есть чётные, значит и в ОРС сервере 32 битные с чётными адресами.
Что то я запутался, хочу записать переменную с ПЛК 110 (мастер) в ПР205 (слейв) но, сделать это ТИКом как R_TRIG сначала записать 1 затем сбросить на 0 , разумеется запись пойдет по условию а сброс постоянно, но ничего не получается в ST , (напрямую из конфигурации ПЛК руками, все отлично) понимаю что запись должна произойти в конце цикла.. но что то не получается, вроде ерунда ...Обидно терять время и изобретать грабли с велосипедом.. Уверен что есть четкий и правильный способ, подскажите плиз..
Но судя по выложенному проекту у вас адреса правильные.
То есть чётные,.
В проекте же 1.., 41... (для 150) Автор может этот вопрос четко прояснить ?
К мультиметру @150 есть доступ и там живые данные, у @144,146,148 все по нулям чтобы подать на них напряжение надо включать установку.
В итоге они одинаковые будут?
Что то я запутался, хочу записать переменную с ПЛК 110 (мастер) в ПР205 (слейв) но, сделать это ТИКом как R_TRIG сначала записать 1 затем сбросить на 0 , разумеется запись пойдет по условию а сброс постоянно, но ничего не получается в ST , (напрямую из конфигурации ПЛК руками, все отлично) понимаю что запись должна произойти в конце цикла.. но что то не получается, вроде ерунда ...Обидно терять время и изобретать грабли с велосипедом.. Уверен что есть четкий и правильный способ, подскажите плиз..
На 1 цикл ПЛК не получится дернуть бит сетевой переменной. Взводите его на достаточный для обмена период (например через ТР), а фронт уж отлавливайте в ПР
Dmitry_KV
01.10.2024, 15:08
Адреса должны быть как в мануале, если написано 2 значит 2, в ОРС сервере тоже самое, если передаёте 2 регистр то и принимать надо 2,
если же ошибка и не правильно передаётся, то надо не адрес менять, а регистры (байты) правильно расставить.
Нет в ОРС сервере никакого смещения.
А вот в слейве ПЛК адреса начинаются с 0 и 32 битные переменные должны быть с чётными адресами. Если сделать с нечётными, то выравнивание сместит адреса, на следующий чётный адрес. Но судя по выложенному проекту у вас адреса правильные.
То есть чётные, значит и в ОРС сервере 32 битные с чётными адресами.
Если бы мне сразу удалось опросить в OPC сервере четные регистры как в мануале, то я бы в ПЛК мастером тоже опрашивал четные.
Если опрашивать не четные, с 1 адреса регистра
7902379024
Если опрашивать четные, со 2 адреса регистра
7902579026
В проекте же 1.., 41... (для 150) Автор может этот вопрос четко прояснить ?
В итоге они одинаковые будут?
Мультиметры абсолютно одинаковые все Lovato DMK22 - 4 шт. c @144,146,148 и 150.
kondor3000
01.10.2024, 15:25
Давайте ещё раз сначала. Вы читаете мастером с модулей, тут уже разобрались, адреса начинаются со 2, читаете функцией 4.
Потом вы отправляете в слейв те же регистры и читаете ОРС сервером из слейва, так я уже про слейв вам пишу. В нём есть выравнивание. Если положите в 15 адрес, то читать надо из 16.
Например вы положили в адрес 16, так ОРС и надо читать 16 адрес (при ошибке переставить регистры), читать в ОРС надо функцией 3.
... Мультиметры абсолютно одинаковые все Lovato DMK22 - 4 шт. c @144,146,148 и 150.
там с 2...73 есть фазное...частота. Их можно получить сразу одним запросом (и даже в конфигурации)
А что такое с 511?
Данные в слейв нужны все?
вопрос предобработки открыт, т.к.
-до сих пор с адресацией/ордером не разобрались
-вытягивает ли сама ловата 72 регистра (пропуски там)
-пропусков в слейве боитесь?
-нужна ли частота в нормальных Гц? (и т.п.)
Dmitry_KV
01.10.2024, 18:55
Давайте ещё раз сначала. Вы читаете мастером с модулей, тут уже разобрались, адреса начинаются со 2.
Потом вы отправляете в слейв те же регистры и читаете ОРС сервером из слейва, так я уже про слейв вам пишу. В нём есть выравнивание. Если положите в 15 адрес, то читать надо из 16.
Например вы положили в адрес 16, так ОРС и надо читать 16 адрес (при ошибке переставить регистры)
Согласен все запуталось) Забываем про все остальные счетчики кроме DMK22 c modbus ID 150. В проекте A2_TEST который я выложил выше опрос нормально работает, т.е. ПЛК как мастер по Modbus RTU опрашивает счетчик DMK22 @150 начиная с адреса регистра 1 (на данный момент я перепроверил с функцией чтения 0x04 все в точности также читается). ПЛК как слейв по Modbus TCP отдает эти данные в arOPC сервер, адресация совпадает - в слейве адрес 2 DWORD - читаем в OPC адрес 2 DWORD, в слайве адрес 27 WORD - читаем в OPC 27 WORD. Про то что, слейв автоматически добавляет байты до четного уже осведомлен (если добавить 8 бит, то он автоматически добавит еще 8 бит, чтобы стало 16 - даже если их вручную не добавить)
Теперь по поводу предыдущих изображений с OPC сервером. Решил разобраться с этим сдвигом и опросить счетчик напрямую, т.е. arOPC опрашивает мультиметр DMK22 напрямую через преобразователь AC4-M USB-485
В первом случае опрос проходит нормально, используется сдвиг адреса -1 (по мануалу Напряжение AN имеет адрес 2, мы же считываем адрес 1, и так далее)
Во втором случае опрос уходит в BAD, сдвиг не используется (По мануалу Напряжение AN имеет адрес 2, мы считываем 2 и так далее) Очевидно что в этом случае перестановка байт в регистрах 1234 или 3412 на само чтение никак не влияет, только на корректность отображаемых цифр.
Dmitry_KV
01.10.2024, 19:19
там с 2...73 есть фазное...частота. Их можно получить сразу одним запросом (и даже в конфигурации)
Адреса которые корректно читаются 1..71
А что такое с 511?
Нессиметрия напряжения и тока, энергетик сказал хочу видеть...
Данные в слейв нужны все?
Нет только список из поста с проектом, 25 параметров.
вопрос предобработки открыт, т.к.
-до сих пор с адресацией/ордером не разобрались
-вытягивает ли сама ловата 72 регистра (пропуски там)
-пропусков в слейве боитесь?
-нужна ли частота в нормальных Гц? (и т.п.)
-про адресацию выше вроде все расписал.
-в arOPC если одним блоком читать с 1..71 пол часа работало без отвалов и данные корректы
-волков бояться в лес не ходить. На данный момент этих нюансов не знаю, есть подводные камни? Ну кроме увеличения времени опроса из-за большего количества регистров.
-преобразований до нормальных Гц и т.п. делать не надо, все уже делается в SCADA готовые шаблоны шкал, отчетов, трендов и т.п. Большого труда переделать не составить, но надо ли?
kondor3000
01.10.2024, 20:02
Мне вот интересно, вы после всех изменений в проекте, хоть раз сделали Очистить всё, компилировать всё? Это надо делать после каждого сильного изменения, в адресах тем более.
Значит сдвиг есть в самих модулях, читаем 4 модуля с адреса 1 функцией 4. В принятых данных переставляем регистры.
Далее всё полученное кладём в слейв, по какому адресу (номеру регистра в слейве)?
Чтобы прочитать ОРС сервером, функцией 3 уже без смещения, например из 10 в 10 адрес, в ОРС регистры надо переставлять?
Dmitry_KV
01.10.2024, 21:27
Мне вот интересно, вы после всех изменений в проекте, хоть раз сделали Очистить всё, компилировать всё? Это надо делать после каждого сильного изменения, в адресах тем более.
Очистить все не делал, каюсь. Компилировать все каждый раз перед заливкой в ПЛК, когда добавлял, удалял изменял элементы(блоки). Контроль перекрытий, неиспользованные переменные и т.п. периодически.
Значит сдвиг есть в самих модулях, читаем 4 модуля с адреса 1 функцией 4. В принятых данных переставляем регистры.
Да так и сделано в представленной проекте A2_TEST.pro
Далее всё полученное кладём в слейв, по какому адресу (номеру регистра в слейве)?
Чтобы прочитать ОРС сервером, функцией 3 уже без смещения, например из 10 в 10 адрес, в ОРС регистры надо переставлять?
_144_15_Y8_QF1_JB1_1 имеет адрес 40, порядок байт при чтении OPC сервером 1032, ниже приложил скрин. Порядок байт в arOPC 1032 это стандартное значение которое он предлагает, т.е. не надо переставлять.
79030
kondor3000
02.10.2024, 08:28
Ну а теперь вы можете через структуру или массивом поменять везде регистры (как Валенок написал) и присвоить всё в созданную структуру (с указанием на 40 адрес слейва) и положить туда уже готовые данные.
Здесь подобный пример даже есть, читается 7 модулей через String и всё отправляется в структуру в готовом виде (с переставленными регистрами) и в слейв https://owen.ru/forum/showthread.php?t=10555&page=987
Dmitry_KV
02.10.2024, 10:55
Ну а теперь вы можете через структуру или массивом поменять везде регистры (как Валенок написал) и присвоить всё в созданную структуру (с указанием на 40 адрес слейва) и положить туда уже готовые данные.
Здесь подобный пример даже есть, читается 7 модулей через String и всё отправляется в структуру в готовом виде (с переставленными регистрами) и в слейв https://owen.ru/forum/showthread.php?t=10555&page=987
Примерно понял что хотите, мне нужно некоторое время, чтобы опробовать, спасибо еще раз.
Вот выпало немного времени, и про эти ловаты - 11 строк кода
kondor3000
03.10.2024, 18:50
У меня получилось не так красиво, но намного наглядней, структура по названию каналов. 79053
Если бы ещё прикрутить перестановку, через SysMemCpy, SysMemSwap был бы класс. Что то у меня не выходит.
но намного наглядней...
..
Activ_Power_A : DWORD ; (* 41 Активная_мощность_А *)
Activ_Power_B : DWORD; (* 43 Активная_мощность_В *)
Activ_Power_C : DWORD; (* 45 Активная_мощность_С *)
React_Power_A : DWORD; (* 47 Реактивная_мощность_А *)
React_Power_B : DWORD; (* 49 Реактивная_мощность_В *)
React_Power_C : DWORD; (* 51 Реактивная_мощность_С *)
Full_Power_A : DWORD; (* 53 Полная_мощность_А *)
Full_Power_B : DWORD; (* 55 Полная_мощность_В *)
Full_Power_C : DWORD; (* 57 Полная_мощность_С *)
..
=>
W,
VAr_,
VA : array[1..3] of dint;
не?
или P,Q,S_. СИ пока не отменили. И в РЭ какая-то муть про знак, но надеюсь что это имели в виду
sysmem только онлайн.
И проще накопировать что хочется а потом всё сразу переставить. Точнее не переставить - а предобработать. Но автору не нужно.
Но лично меня "розница" раздражает, проще еще сотню "4 byte" в слейв добавить - на 3 секунды дольше удерживать ctrl-v
kondor3000
03.10.2024, 21:23
Вот я о чём, что понятней Slave.LovataData[1].Part1[1]; или Power_Str[1].Voltage_AN; , структура по названию каналов.
А это одно и то же 1 блок, Напряжение_AN, переменная в слейве.
Ему ещё проект дописывать надо будет.
МихаилГл
03.10.2024, 21:29
Вот я о чём, что понятней Slave.LovataData[1].Part1[1]; или Power_Str[1].Voltage_AN; а это одно и то же (* Напряжение_AN *)
Ну для меня, например, если много данных и предполагается с ними работать (преобразовывать, пересылать и пр.) лучше Slave.LovataData[1...1000].Part1[1...1000] и с массивом работать, чем каждую переменную отдельно именовать. А расшифровку в .xls вести.
"Но автору не нужно"
А так, фазное
Slave.LovataData[1].UF[1];
потому что там считывается (но не нужно) еще и линейное
Slave.LovataData[1].UL[1];
А зачем вот эти буквы
(* Напряжение_AN *)
?
Ну для меня, например, если много данных и предполагается с ними работать ... лучше и с массивом работать...
структурой. Приведёной к нормальному виду.
какие-такие там токи/частота?
Current_A : DWORD ; (* 17 Текущий_ток_А *)
Current_B : DWORD ; (* 19 Текущий_ток_В *)
Current_C : DWORD ; (* 21 Текущий_ток_С *)
...
Frecuensi : DWORD ; (* 71 Частота *)
Исходно там левый формат
kondor3000
03.10.2024, 21:47
А зачем вот эти буквы (* 1 Напряжение_AN *) ?
Это взято у автора, это же его доработанный проект. Там ещё и номера (адреса) нужных регистров указаны. И в структуру я выбираю только нужные регистры.
)) не смотрел.
Но я никого лечить/учить не собираюсь - каждый пусть что хотит то и воротит. Больше работы будет))
Но лично я сначала (да и в процессе) больше структуры прорабатываю, а вот это
.. Slave.LovataData[1].Part1[1]; .
был просто транзит. Не для просмотра на ПЛК. Там даже свапы - лишние.
Dmitry_KV
04.10.2024, 07:16
Вот выпало немного времени, и про эти ловаты - 11 строк кода
У меня получилось не так красиво, но намного наглядней, структура по названию каналов. 79053
Если бы ещё прикрутить перестановку, через SysMemCpy, SysMemSwap был бы класс. Что то у меня не выходит.
Вот вы монстры, спасибо за наглядные примеры. Надеюсь успею испытать и разобраться на контроллере, иначе придется ждать, когда следующий закупят, чтоб живьем проверить...
..
Это Вас за OUT_RELAY еще не клевали
Dmitry_KV
04.10.2024, 18:09
Это Вас за OUT_RELAY еще не клевали
Ну там вроде обратной связи, чтоб с ручного на авто можно было без сброса в 0 переходить. Но железо реализовано не так как думал изначально, поэтому в итоге проще было бы через ARRAY реализовать, без перебора возможных вариантов.
kondor3000
04.10.2024, 21:36
Ну там вроде обратной связи, чтоб с ручного на авто можно было без сброса в 0 переходить. Но железо реализовано не так как думал изначально, поэтому в итоге проще было бы через ARRAY реализовать, без перебора возможных вариантов.
Проще было через извлечение бит из Маски сделать, будет всего 6 строк)))
Плюс несколько дополнений, с добавочными битами.
Кстати проверил оба проекта, в обоих есть смещение, на несколько строк. У меня надо в структуре добавить x2 : STRING(71); для заполнения
последнего STRING
Кстати проверил оба проекта, в обоих есть смещение, на несколько строк
в смысле оба, у меня тоже?
kondor3000
05.10.2024, 13:50
в смысле оба, у меня тоже?
Да, вот из за этого
Reserve : ARRAY[1..3] OF DWORD; (*добито до 80 регистров. Так красивше*) по 3 пустые DWORD между модулями в слейве.
Не считая пустых, которые не нужны, в середине.
Да и шут с ними, c пустыми полями. Все резервные. Как собсно и в РЭ прибора.
Зачем кроить-то? Но без фанатизма - 72..510 я не вставляю же. Я уже говорил
"розница" раздражает, проще еще сотню "4 byte" в слейв добавить - на 3 секунды дольше удерживать ctrl-v
меньше кода, быстрее и т.п.
...Нессиметрия напряжения и тока, энергетик сказал хочу видеть...
лучше бы с этим энергетиом переговорить - что он точно хочет. А учитывая что в другом запросе есть все наряжения и токи - зачем этот запрос если есть всё нужное чтоб показать то, что хочет энергетик.
И не закрыт вопрос - скока все таки вытягивает ловата за раз. Там в РЭ что-то про 30, а в натуре уже есть 37. Так может проще сразу 72?
Добрый день!
Опять обращаюсь за помощью. Не получается подключиться через USB.
В настройках диспетчера устройств виден вопросик у драйвера, но при обновлении драйвера на скачанный с сайта ОВЕН система пишет, что "Наиболее подходящие драйверы для данного устройства уже установлены".
Дело было в цифровой подписи драйвера. Помог совет:
Добрый день
Отключите проверку цифровой подписи драйверов:
https://remontka.pro/disable-drivers-signature-check-windows-10/
Добрый день, подскажите пожалуйста , есть газоанализатор СТГ 3 и с него я могу считывать питоновским скриптом показания в реальном времени по wifi (через преобразователь 485- wifi ). Можно ли тоже самое делать если я подключу стг3 к БПС 3?
Или такой вопрос подключены СТГ 3 к БПС 3 , параллельно к СТГ 3 сажусь на rs 485 преобразователем 485- wifi (чтобы на прямую считывать данные с стг 3) , данные считываются , но как только БПС 3 прогревается и включается , я не могу считать данные с СТГ 3 , БПС3 гасит мне связь .... хотя по сути БПС пускай опрашивает датчики и 485- wifi опрашивает , пускай будут ошибки чтения и там и там , но чтоб вообще связь пропадала...
Добрый день! Не подбросите пример D тригера на ST или СFC? Спасибо
Добрый день! Не подбросите пример D тригера на ST или СFC? Спасибо
в oscat библиотеку загляните
Да, есть он там , Не хочется использовать стороннею бибку. Было пару не приятных инцендентов когда другим компом открывал проект а там не оказывалось этой библиотеки. Поэтому хочется самому написать.
Да, есть он там , Не хочется использовать стороннею бибку. Было пару не приятных инцендентов когда другим компом открывал проект а там не оказывалось этой библиотеки. Поэтому хочется самому написать.
а чем пример выложенный здесь будет отличаться от библиотечного примера? Самом написать или взять у других, тоже не ясно
Да, есть он там , Не хочется использовать стороннею бибку. Было пару не приятных инцендентов когда другим компом открывал проект а там не оказывалось этой библиотеки. Поэтому хочется самому написать.
Можете не использовать. ОТКРОЙТЕ библиотеку, найдите этот ФБ и скопируйте его код себе в проект
Извиняюсь, наверное я не правильно обозначил проблемку, как реализовать алгоритм ,который выполнен в ФБ ОВЕН лоджик79474
Т.Е.Управление одной кнопкой - одним устройством.
в Oscat бибке есть готовый блок. FF-DRE. Внутренности не помню. Управление одной кнопкой.
Это аналог D-Trigger для ПР, ловите код, он есть у меня (с) :)
UNCTION_BLOCK FF_DRE
VAR_INPUT
SET : BOOL;
D : BOOL;
CLK : BOOL;
RST : BOOL;
END_VAR
VAR_OUTPUT
Q : BOOL;
END_VAR
VAR
edge : BOOL;
END_VAR
(*
version 1.2 30. oct. 2008
programmer hugo
tested by oscat
D-type flip flop with set, reset and rising clock trigger
*)
IF rst OR set THEN
Q := NOT rst;
ELSIF clk AND NOT edge THEN
Q := D;
END_IF;
edge := CLK;
(* revision history
hm 4. aug 2006 rev 1.0
original version
hm 27. dec 2007 rev 1.1
changed code for better performance
hm 30. oct. 2008 rev 1.2
optimized performance
*)
По-моему, в OSCAT подобный блок называется Toggle.
В CODESYS можно создать собственный ФБ куда скопировать текст ST этого ФБ. И Toggle будет уже не библиотечным, а "родным", самостоятельно реализованным.
Ребят, может это и примитивно но я просто реализовал на CFC один в один то что предлогает Лоджик и работает!79476
В CodeSys могут себя по разному вести то, что в ПР использует обратную связь. Иногда порой так непредсказуемо, что будете искать проблему долго и нудно. Так что осторожнее с переносом из ПР того, что использует обратные связи.
з.ы. чисто предупреждение. Один раз нарвался при переносе макроса и хоть тресни не заставил его работать так, как он работал в ПР.
Ребят, может это и примитивно но я просто реализовал на CFC один в один то что предлогает Лоджик и работает!79476
Вообще-то на этом форуме такой T-Триггер первым я предложил, где-то в 2011г. Ещё до всяких лоджиков. Ссылку на первое упоминание пока найти не смог, но вот в 2013 году https://owen.ru/forum/showthread.php?t=7344&p=117323&viewfull=1#post117323
Мужики всем кто принял участие спасибо!
В CodeSys могут себя по разному вести то, что в ПР использует обратную связь. Иногда порой так непредсказуемо, что будете искать проблему долго и нудно. Так что осторожнее с переносом из ПР того, что использует обратные связи.
з.ы. чисто предупреждение. Один раз нарвался при переносе макроса и хоть тресни не заставил его работать так, как он работал в ПР.
Интрига однако
Всем добрый день! подскажите с Эмуляцией Online панели СП310.
Моя задача - дома без оборудования проверить и отладить алгоритм работы пользователя с панелью.
Панель получает данные через Modbus от реле ПР102. Я знаю, что есть реализация протокола Modbus на Python - то есть указав IP адрес панели я могу писать данные в регистр протокола (https://habr.com/ru/articles/339008/). Таким образом я могу имитировать работу реле.
Я включаю "Эмуляцию онлайн" и пытаюсь выполнить команду PING панели, но не получаю никакого ответа.
Пробовал использовать виртуальную машину в следующей конфигурации сети -
виртуальная машина подключена к сетевому интерфейсу с адресом 192.168.61.20, шлюз 192.168.61.2 ( адрес шлюза виртуального адаптера VM Ware ).
Комп, на котором запущен Конфигуратор (Host) - имеет адрес 192.168.61.1, шлюз 192.168.61.2
панели назначил адрес 192.168.61.10, шлюз - 192.169.61.2.
В этой конфигурации host и виртуальная машина видят друг друга (ping проходит), но увидеть в сети панель я не могу.
Подскажите, как можно решить задачу имитации работы панели в части получения данных по протоколу modbus ?
МихаилГл
24.10.2024, 16:55
Так в панели не эмулируется её ip адрес, вроде...
Если панель мастер, то на кой вам её ip. Главное чтоб она ПРку увидела.
Alkalin полагаю, что эмулятор панели запускается тоже как "виртуалка" и настраивать нужно в ней, что там и как, раз ей может выдаваться отдельный IP.
kondor3000
24.10.2024, 17:53
Панель в эмуляции Онлайн может быть только мастером, она может опросить слейв реальный по RS485 (TCP) или виртуальный по ТСР.
В режиме слейв ничего не получится.
Сама по себе панель может быть подключена в сеть. Но эмулятор в конфигураторе не даёт мне (или не там смотрю может быть) возможности обращения к панели через modbus по этому и вопрос (
Добрый день, подскажите пожалуйста , есть газоанализатор СТГ 3 и с него я могу считывать питоновским скриптом показания в реальном времени по wifi (через преобразователь 485- wifi ). Можно ли тоже самое делать если я подключу стг3 к БПС 3?
Или такой вопрос подключены СТГ 3 к БПС 3 , параллельно к СТГ 3 сажусь на rs 485 преобразователем 485- wifi (чтобы на прямую считывать данные с стг 3) , данные считываются , но как только БПС 3 прогревается и включается , я не могу считать данные с СТГ 3 , БПС3 гасит мне связь .... хотя по сути БПС пускай опрашивает датчики и 485- wifi опрашивает , пускай будут ошибки чтения и там и там , но чтоб вообще связь пропадала...
И так) узнал у производителя , что считывать показания в реальном времени с газиков можно только бпс 3 выпущенном после 23 года. У меня я так понимаю ничего не получается , так как БПС 3 мастер в сети и мой 485- wifi преобразователь тоже мастер, как то можно проблему решить все же?)
kondor3000
29.10.2024, 09:20
И так) узнал у производителя , что считывать показания в реальном времени с газиков можно только бпс 3 выпущенном после 23 года. У меня я так понимаю ничего не получается , так как БПС 3 мастер в сети и мой 485- wifi преобразователь тоже мастер, как то можно проблему решить все же?)
Надо поставить слейв между ними, ПР, ПЛК с двумя портами. Один Мастер будет писать в слейв по одному порту, второй из него читать по другому порту.
МихаилГл
29.10.2024, 09:34
Надо поставить слейв между ними, ПР, ПЛК с двумя портами. Один Мастер будет писать в слейв по одному порту, второй из него читать по другому порту.
А можно ещё шлюз rs485 to modbus tcp или овен овский индикатор в spy режиме, он вроде предназначен для такого... Правда только один параметр...
1exan
Интрига однако
никакой интриги, макрос от AI! по ротации насосов до 8-ми с вычислением времени наработки. Там всего одна обратная связь. Ребята тут даже макрос на ST делали для эмуляции этой самой обратной связи. Хоть тресни, не работает так, как в ПР при переносе на CDS2.3
плюнул. Хотя было интересно повторить.
kondor3000
29.10.2024, 10:49
1exan
никакой интриги, макрос от AI! по ротации насосов до 8-ми с вычислением времени наработки. Там всего одна обратная связь. Ребята тут даже макрос на ST делали для эмуляции этой самой обратной связи. Хоть тресни, не работает так, как в ПР при переносе на CDS2.3
плюнул. Хотя было интересно повторить.
Всё переносится, у меня только несколько примеров с переносом программ в Лоджике и в CDS2.3 с обратными связями.
Выкладывайте свой пример, если хотите разобраться.
kondor3000 http://www.owen.ru/forum/attachment.php?attachmentid=26558&d=1474630298/
Если не ошибаюсь, данный макрос
kondor3000
29.10.2024, 13:23
http://www.owen.ru/forum/attachment.php?attachmentid=26558&d=1474630298/
Если не ошибаюсь, данный макрос
И что с ним делать надо? Макрос на FBD.
Если уж задаёте вопрос, то и выкладывайте пример на ST и пишите куда тут надо задержку вставить.
volodimer
31.10.2024, 14:48
Здравствуйте, возникла проблема с пр 205. Задумал подключить к пр 205 МВ 210-202 и МУ 210-403.*
На модулях адреса 192.168.1.99
И 192.168.1.102, на пр 192.168.1.10
По умолчанию в МВ для передачи состояния дискретных входов 51-й регистр и, соответственно, биты 0-20. Как в пр 205 прочитать эти данные? Овен Лоджик их не видит. Пробовал задать болевые сетевые переменные в master с адресами 51(0).51(1) — не видит. Галки «старшим регистром/байтом» пробовал во всех порядках и без них. Единственное, что смог увидеть, это непонятное значение при присвоении целочисленной переменной 51-му регистру и функции «чтение бита». С таким раскладом на входе в блок «чтение бита» появилось значение, однако бит не расшифровался. Да и по интерфейсу enthernet с пр 205 почему то связатся невозможно ни овен лоджик ни овенконфигуратор её не видят.
kondor3000
31.10.2024, 15:07
Вы пишите не в тот раздел, ПР205 обсуждают в разделе Программируемые реле
https://owen.ru/forum/forumdisplay.php?f=34
А по делу, из модуля ввода читать надо 32 битную целочисленную переменную, адрес 51 (2 регистра), это Маска 20 бит, которые надо распаковать.
1 регистр это 16 битная переменная (16 бит)
volodimer
31.10.2024, 15:37
Извиняюсь с телефона пишу, возможно не туда попал. Значит надо все же распаковывать целочисленную.
Интересно )) я же пробовал, почему не распаковалась?.... Пойду в профильную ветку за помощью.
Надо поставить слейв между ними, ПР, ПЛК с двумя портами. Один Мастер будет писать в слейв по одному порту, второй из него читать по другому порту.
Не совсем понял, можно подробнее пожалуйста
Вот моя схема подключения. То есть когда я подключаю rs485 wifi , до прогрева БПС данные считываются, как только БПС прогреется и включится , то ошибка чтения сразу.
rs485-wifi у меня это ESP32 и MAX485. Где мне нужно поставить слейв?
kondor3000
05.11.2024, 09:39
Не совсем понял, можно подробнее пожалуйста
Вот моя схема подключения. То есть когда я подключаю rs485 wifi , до прогрева БПС данные считываются, как только БПС прогреется и включится , то все ошибка чтения у меня
rs485 у меня это ESP32 и MAX485. Где мне нужно поставить слейв?
Эта схема не соответствует тому, что вы писали ранее. А писали вы, что у вас в сети 2 мастера одновременно.
Вот один из них, например RS-485 WI-FI, надо включить как то иначе. В одной сети, может быть только 1 мастер.
Зачем вам 2 раза читать счётчики, они например уже читаются на комп, вот с компа и отправляйте по WI-FI, куда вам надо.
Эта схема не соответствует тому, что вы писали ранее. А писали вы, что у вас в сети 2 мастера одновременно.
Вот один из них, например RS-485 WI-FI, надо включить как то иначе. В одной сети, может быть только 1 мастер.
Зачем вам 2 раза читать счётчики, они например уже читаются на комп, вот с компа и отправляйте по WI-FI, куда вам надо.
Все стг 3 это слайвы ведь? а опрашивает их бпс3 и RS-485 WI-FI они ведь тогда мастера?
Бпс только умеет считать пороги если они сработали, а RS-485 WI-FI в реальном времени концентрацию с стг 3
kondor3000
05.11.2024, 10:40
Все стг 3 это слайвы ведь? а опрашивает их бпс3 и RS-485 WI-FI они ведь тогда мастера?
Бпс только умеет считать пороги если они сработали, а RS-485 WI-FI в реальном времени концентрацию с стг 3
Ещё раз, 2 мастера в 1 сети быть не может, поэтому и отваливается WI-FI.
Счётчики надо читать тем, что может читать всё что надо, а потом отправлять на верхний уровеь и передавать куда надо.
Ещё раз, 2 мастера в 1 сети быть не может, поэтому и отваливается WI-FI.
Счётчики надо читать тем, что может читать всё что надо, а потом отправлять на верхний уровень и передавать куда надо.
Это я понимаю что 2 мастера быть не может)) Эх жаль думал, как то малой кровью получится решить проблему.
Gorynich
14.11.2024, 13:46
Всех приветствую! Возникла проблемка, кто может подскажите пожалуйста. Если в кратце, есть помещение с 3 комнатами, 1 установка приточной вентиляции на все комнаты и по 1 вытяжной на каждую комнату. Приточная OUT_P1 включается, если любая из вытяжных (OUT_B1, OUT_B2, OUT_B3) запускается. По факту получилось что только в одной комнате правильно работает (вариант1), в остальных при включении вытяжки, приточка не включается (вариант2). Есть еще график проветривания, когда вентиляция запускается во всех комнатах, то всё работает как надо (вариант3).800438004480045
Gorynich у вас элемент 28 всегда будет перезаписывать то, что было ранее. То, что общее, соберите через дополнительное ИЛИ.
In_Da_Cher_A
14.11.2024, 14:12
могу сразу сказать - БЛИНК неправильно обвязан, он так криво работает либо вообще работать нормально не будет
в КДС 2.3 в CFC требуется дополнительная "верификация" выхода через AND со входом ENABLE
80046
и не касаясь смысла вашего алгоритма, совет чисто из практики - избегайте вот таких вещей, в одном цикле это также не работает, либо глючит. Делайте "перекладку" через переменную и нормально выстраивайте логическую цепочку событий
80047
kondor3000
14.11.2024, 14:48
Всех приветствую! Возникла проблемка, кто может подскажите пожалуйста. Если в кратце, есть помещение с 3 комнатами, 1 установка приточной вентиляции на все комнаты и по 1 вытяжной на каждую комнату. Приточная OUT_P1 включается, если любая из вытяжных (OUT_B1, OUT_B2, OUT_B3) запускается. По факту получилось что только в одной комнате правильно работает (вариант1), в остальных при включении вытяжки, приточка не включается (вариант2). Есть еще график проветривания, когда вентиляция запускается во всех комнатах, то всё работает как надо (вариант3).
У вас переменная OUT_P1 с номером 30, всегда будет перезаписывать OUT_P1 с номером 16.
На первом и 2 скрине это видно.
Gorynich
14.11.2024, 15:26
Всем спасибо за помощь и советы!
Alexandr88
19.11.2024, 17:41
Здравствуйте, подскажите пожалуйста, как перенести проекты Codesys 2,3 с одно компа на другой, при переносе ругается на : "ошибка чтение целевой платформы" , не может найти файл module.root,
ставлю целевую платформу, подгружаю библиотеки потерявшиеся, и пишет ошибку
3612 "Превышено максимальное количество POU (<512>)! Компиляция прервана."
В инструкции:
В проекте используется слишком много POU. Измените максимум POU в Target Settings / Memory
Layout.
захожу в настройки целефой платформы там None, но в параметрах модуля указ PLC110-32_v2
если я меняю none на таргет из предложенных тоже PLC110-32_v2, он стирает полностью все что было в конфигурациях ПЛК, подскажет пожалуйста что делать? как перенести на другой комп/веник и потом открывать!??
выложите сам исходный проект и вам все скажут, потому как описаны симптомы "менял тыкал все подряд авось получицца"
kondor3000
19.11.2024, 18:04
Здравствуйте, подскажите пожалуйста, как перенести проекты Codesys 2,3 с одно компа на другой, при переносе ругается на : "ошибка чтение целевой платформы" , не может найти файл module.root,
ставлю целевую платформу, подгружаю библиотеки потерявшиеся, и пишет ошибку
3612 "Превышено максимальное количество POU (<512>)! Компиляция прервана."
В инструкции:
В проекте используется слишком много POU. Измените максимум POU в Target Settings / Memory
Layout.
захожу в настройки целефой платформы там None, но в параметрах модуля указ PLC110-32_v2
если я меняю none на таргет из предложенных тоже PLC110-32_v2, он стирает полностью все что было в конфигурациях ПЛК, подскажет пожалуйста что делать? как перенести на другой комп/веник и потом открывать!??
Чтобы не было проблем, надо ставить все таргеты и все биб-ки сразу. Тогда всё откроется.
Посмотреть какой таргет в проекте, если там старый PLC110-32, то на новый PLC110-32_v2 просто так не перенести. Придётся править ручками.
Программа переноса конфигурации https://owen.ru/forum/showthread.php?t=18269
Alexandr88
19.11.2024, 18:24
Чтобы не было проблем, надо ставить все таргеты и все биб-ки сразу. Тогда всё откроется.
Посмотреть какой таргет в проекте, если там старый PLC110-32, то на новый PLC110-32_v2 просто так не перенести. Придётся править ручками.
Спасибо!!!! установил таргеты до открытия проекта и все заработало!!!
Лучше всего переносить проект через АРХИВ ПРОЕКТА. (1exan и kondor3000, берите на заметку - это круто).
1. На исходной системе открываем проект в CodeSys и выбираем команду: "Файл => Сохранить/Отправить архив".
В диалоге проверяем, чтобы были установлены нужные галочки (можно поставить ВСЕ).
ВАЖНО: Галочка "Файлы целевой платформы" по умолчанию серая. Это значит, что в архив войдёт только текущий таргет для проекта.
Её можно (нажав) установить в обычный вид - тогда в архив войдут ВСЕ таргеты, какие есть на компьютере.
80198
2. Нажимаем кнопку "Сохранить". Мы получим ZIP-архив (если каки-то файлов нет, будет написано что архивация завершена с ошибками, и это не страшно).
3. На новом компьютере ВАЖНО установить CodeSys в ТАКУЮ ЖЕ папку, как и на старом.
4. Далее на новом компьютере открываем РУКАМИ ZIP-архив и видим там подпапки. Файлы из них надо скопировать на новый компьютер в ТЕ ЖЕ ПАПКИ ПОСЛЕ установки CodeSys.
80199
5. В корне архива без папок лежит файл "registry.reg". Его нужно внести в реестр по двойному щелчку мыши. Это пропишет в системе таргеты и настройки CodeSys.
После этого всё заработает.
PS. Написал пост про все технологии у себя на сайте: https://cs-cs.net/codesys-archiv-projekta-ishodniye-kody
Лучше всего переносить проект через АРХИВ ПРОЕКТА. ...(
Действительно интересный функционал. Я не часто сталкиваюсь с таким, но пару раз точно сэкономил бы время
kondor3000
20.11.2024, 08:40
В мастере добавить несколько String, в слейве зажать Ctrl +V и поставить пару указателей, намного быстрее возни с переносом конфига.
Тоже самое и в 3.5, только без String.
Всем здравия! Хочу немного дополнить проект на ПЛК110-60, только вот не нашел я готового функционального блока под заданную задачу. В линию подготовки сырья через счетчик воды с импульсом 1 имп/литр подается вода.
Количество набираемой воды задается в визуализации проекта и в ней же мониторится отчет о наборе воды. Было несколько случаев, когда оператора не было у монитора, а доблестные сантехники как назло отключили воду.
Начальство дало задание, что бы если возникла подобная ситуация, то программа выдала бы сигнал аварии, о том что вода не поступает, ну и в дальнейшем остановила весь процесс. При включении клапана подачи воды необходимо контролировать импульсы от счетчика воды. Если импульсы не поступают от счетчика воды при включенном клапане подаче воды, то должна сработать авария. Мне бы только помочь как реализовать этот контроль наличия импульсов,
а все остальное я сам привяжу к программе. Длительность импульсов от счетчика 1 сек, длительность паузы 2,5 сек. За подсказку как это сделать буду премного благодарен
grv008 Легко! Подать импульсы на таймер TOF с настройкой 5-10 секунд.
Тогда, если импульсов не будет более заданного времени, таймер TOF выключится.
Аварию я бы сформировал так:
* Если включен режим подачи воды
* И
* Если прошло 5 секунд (добавляем таймер TON) (чтобы первый импульс прошёл, и включил таймер TOF)
* И
* Если таймер TOF выключен
ТОГДА - Авария
Всем здравия! Хочу немного дополнить проект на ПЛК110-60, только вот не нашел я готового функционального блока под заданную задачу. В линию подготовки сырья через счетчик воды с импульсом 1 имп/литр подается вода.
Количество набираемой воды задается в визуализации проекта и в ней же мониторится отчет о наборе воды. Было несколько случаев, когда оператора не было у монитора, а доблестные сантехники как назло отключили воду.
Начальство дало задание, что бы если возникла подобная ситуация, то программа выдала бы сигнал аварии, о том что вода не поступает, ну и в дальнейшем остановила весь процесс. При включении клапана подачи воды необходимо контролировать импульсы от счетчика воды. Если импульсы не поступают от счетчика воды при включенном клапане подаче воды, то должна сработать авария. Мне бы только помочь как реализовать этот контроль наличия импульсов,
а все остальное я сам привяжу к программе. Длительность импульсов от счетчика 1 сек, длительность паузы 2,5 сек. За подсказку как это сделать буду премного благодарен
Что-то типа такого наверно
80206
Alexandr88
20.11.2024, 20:50
Здравствуйте подскажите пожалуйста из-за чего такое может быть:
был рабочий проект, перенес на другой комп, проверил на ошибки все ок, потом добавил входы и выходы на панель СП, переделал чутка схему компилирую и:
80219
проверяю на все как на рабочем проекте...
80220
80221
80222
по ошибке:
3729
"Неверный тип '<имя>' по адресу: '<имя>' "
Переменная данного типа не может быть размещена по указанному адресу. Например: адрес AT
%IB1:WORD; не допустим, если включено выравнивание по четным адресам. Данная ошибка мо-
жет возникнуть при попытке разместить массив по недопустимому прямому адресу.
удалил один Юневерсал модБас Девайс, создал заново с новым именем, и тоже самое...
Alexandr88 Вот хороший пример (твой) как НЕ НАДО использовать ужасную и мутную прямую адресацию!
Правильно делать ТАК: https://cs-cs.net/codesys-modbus-karta-registrov-struktury (там есть даже пример для скачивания)
А ещё можно объявить нужные переменные прямо в дереве конфигурации. Про это было рассказано вот здесь (заголовок 4): https://cs-cs.net/plk-oven-110-programmiruem-na-codesys#4
Ну и, если поможет, выполнить команду "Проект => Очистить всё". А потом заново скомпилировать. Вдруг да поможет. Но лучше без прямой адресации (это ужасный, можно сказать, старпёрско-совковый подход).
Alexandr88
20.11.2024, 21:42
Alexandr88 Вот хороший пример (твой) как НЕ НАДО использовать ужасную и мутную прямую адресацию!
Правильно делать ТАК: https://cs-cs.net/codesys-modbus-karta-registrov-struktury (там есть даже пример для скачивания)
А ещё можно объявить нужные переменные прямо в дереве конфигурации. Про это было рассказано вот здесь (заголовок 4): https://cs-cs.net/plk-oven-110-programmiruem-na-codesys#4
Ну и, если поможет, выполнить команду "Проект => Очистить всё". А потом заново скомпилировать. Вдруг да поможет. Но лучше без прямой адресации (это ужасный, можно сказать, старпёрско-совковый подход).
Проект -- очистьть все не помогло, Удалил все что било ошибку, заново прописываю - тоже самое!
а так как описали вы я не умею...
+ еше я не всегда знаю какие переменные будут в бедующем приходится прописывать по ходу!
80223
Взял старый рабочий проект, и просто в низу списка конфигурации ПЛК, добавил Юневерсал модБас Девайс, реал инпут моде, и на 4 выбивает ошибка, какие настройки не вношу, адреса меняю, все равно бьет..., что можно сделать подскажите пожалуйста!? почему он мне дает создать больше, я думал там их тысячами можно создавать
перебывал и на другом компе, та же песня, что я не то сделал?
типа много , Юневерсал модБас Девайс, ? или их нужно было группировать как-то?
Складывается такое ощущение как будто я перебрал все адреса, ошибка одна, я выше по ветке добавляю элемен, и он уже в место одной ошибки 2 последние показывает
Спасибо большое! Все получилось просто замечательно!!! :o
Спасибо большое! Все получилось просто замечательно!!! :o Пожалуйста! Мы рады, когда тот, кто спрашивает, умеет думать сам, и от него есть отдача =)
Alexandr88
22.11.2024, 13:25
ну например это может быть из-за присутствия буквы L в маркировке плк
А подскажите что делать с этим что L я только такими и пользуюсь !? Как это убрать?
Николай Суриков
22.11.2024, 13:30
А подскажите что делать с этим что L я только такими и пользуюсь !? Как это убрать?
Купить новый контроллер без буквы L.
А подскажите что делать с этим что L я только такими и пользуюсь !? Как это убрать? L - это ограничение памяти Modbus. Это удешевляет контроллер, но, когда её не хватает, создаёт проблемы. Я беру всегда с M - полную память.
Николай Суриков
22.11.2024, 14:15
Так же можно подметить, что ограничение распространяется на обмен через конфигурацию, если использовать обмен через библиотеки, то данного ограничения нет.
Николай Суриков Ой! СПАСИБО! Да, верно!
Alexandr88
23.11.2024, 15:11
Так же можно подметить, что ограничение распространяется на обмен через конфигурацию, если использовать обмен через библиотеки, то данного ограничения нет.
Здравствуйте , подскажите пожалуйста правильно ли я понял, т.е. посколькe у меня ПЛК с "L", я не могу создать больше ~60-70 глобальных переменных типа real input или real output (к примеру), т.к. у меня стоит искусственное ограничение до 360 байт??? тогда спрашивается, зачем такой прибор? где 60-70 переменных глобальных и он не может обработать? просто боль.....! 360 байт это 0,35 килобайт, а прибор без ограничения 100 кбайт!!! как то не пропорционально в цене
Только что проверил, изменил платформу на прибор с "М" и все ошибки ушли((((((((((((
А че мне теперь с приборам делать если он как оказывается не для средних не для малых систем негоден?)))
А что бы объявить глобальные переменные через библиотеки у меня должен ПЛК соединятся с СП300 по ethernet?
Николай Суриков
23.11.2024, 15:25
Здравствуйте , подскажите пожалуйста правильно ли я понял, т.е. посколькe у меня ПЛК с "L", я не могу создать больше ~60-70 глобальных переменных типа real input или real output (к примеру), т.к. у меня стоит искусственное ограничение до 360 байт??? тогда спрашивается, зачем такой прибор? где 60-70 переменных глобальных и он не может обработать? просто боль.....! 360 байт это 0,35 килобайт, а прибор без ограничения 100 кбайт!!! как то не пропорционально в цене
Только что проверил, изменил платформу на прибор с "М" и все ошибки ушли((((((((((((
А че мне теперь с приборам делать если он как оказывается не для средних не для малых систем негоден?)))
А что бы объявить глобальные переменные через библиотеки у меня должен ПЛК соединятся с СП300 по ethernet?
Первое. Что у Вас написано на плк? Какая буква? Изменением таргета проблему не решить если таргет будет М, а ПЛК Л.
Второе. Можно все передавать не реал, а ворд*10, а в панели смещать знак и будет нормально отображаться. Вам же не нужен реал в панели до последнего знака? Тогда регистров можно использовать в два раза больше.
Третье. Прибор такой для тех, кому не надо 60-70 реалов, а надо меньше и по этому можно купить дешевле.
Четвертое. Можно взять с буквой Л и написать обмен на библиотеке, тогда и ограничения не будет и скорость и дешевле и все остальное.
Пятое. В разделе Кодесис 2.3 библиотеки выложены для маcтера и слейва для работы через порты RS.
https://owen.ru/product/codesys_v2/libraries
https://owen.ru/uploads/373/modbus.pdf
https://owen.ru/uploads/373/owenmodbusslave.pdf
Alexandr88 А что же ты хочешь, если ты НЕ читаешь документацию, а рассуждаешь как "Да я всегда беру с L". А теперь настала расплата за это. И это не ругань, а жизнь.
С L делают, чтобы можно было сэкономить там, где нет Modbus. Например, если я делаю автоматику освещения квартиры, то мне панель оператора не нужна. Я могу взять такой ПЛК, опросить им штуки 4 модуля ввода-вывода (с каждого по 2 регистра итовой маски) - и всё (но я беру полную версию ПЛК).
Нет. Библиотеки позволяют работать как по RS-485, так и по Ethernet. Ты просто удаляешь из Конфигурации ПЛК всё, связанное с Modbus Slave, и описываешь это в коде программы. Этот же код сам устанавливает связь по RS-485 и отдаёт нужные данные.
ПОЖАЛУЙСТА поищи и почитай инструкции, так как я с этим способом не работал и не подскажу, что и где делать.
Купили новый ТРМ10-Д. Пытаюсь подружить его с контроллером ПЛК110-30.
Все переменные типа WORD прекрасно читаются и пишутся. С переменными REAL ни то, ни другое не работает. Читается какая-то ерунда. И пишется тоже непонятно что.
Скриншоты прилагаю. Может я что-то не так делаю?80337803388033980340
на последнем скриншоте видно, что считывает контроллер. Верхняя переменная REAL с температурой. Там должно быть 26 градусов, а показывается невесть-что, и оно к тому же сильно прыгает. А нижняя переменная типа WORD - параметр скорости модбас. Считывается 4, как и должно быть
Поменять трейс моде на Натив, первый скрин последний пункт
Благодарю, кажись заработало!
Приветствую всех участников данного форума. Будьте добры, подскажите есть ли в Codesys v2.3 подобное решение по виду Codesys 3.5 библиотека "OwenCommunication. функциональный блок "UNM_UdpRequest" ? У меня стоит задача по реализации нестандартного протокола для ОВЕН. Протокол FINS UDP ( PLC OMRON). Запрос представляет последовательность символов состоящих из HEX чисел вида "800007000100000C00030101820001000003". Ответ будет "C00002000C000001000401010000000A00000000"
Готового функционального блока для реализации нестандартного UDP запроса и получения ответа UDP я не нашел.
В CODESYS 3.5 на ПЛК 200 в качестве примера, реализовать удалось. Но, к сожалению, в задаче на оборудовании стоят ПЛК 100 серии.
80383
Распарсить символы надо или чего?
Alexandr88
27.11.2024, 23:41
Здравствуйте, подскажите пожалуйста, что я делаю не верно?
80384
Время приходит от СП, на сам блоки SET_DT и SET_TOD, приходит значение правильные, а выходные значения - даты и время "будующего")))
В документации на блоки, указано что если входит , к примеру 2024г и то и столько выходит , проводить не нужно...
Здравствуйте, подскажите пожалуйста, что я делаю не верно?
80384
Время приходит от СП, на сам блоки SET_DT и SET_TOD, приходит значение правильные, а выходные значения - даты и время "будующего")))
В документации на блоки, указано что если входит , к примеру 2024г и то и столько выходит , проводить не нужно...
"У нас писарь в уезде был, в пачпортах год рождения одной только циферкой обозначал. Чернила, шельмец, вишь, экономил. Потом дело прояснилось, его в острог, а пачпорта переделывать уж не стали. Документ все-таки. Ефимцев, купец, третьего года рождения записан, от рождества Христова, Куликов — второго, Кутякин — первого…
— Да много их тут — долгожителей."
Николай Суриков
28.11.2024, 00:55
Здравствуйте, подскажите пожалуйста, что я делаю не верно?
Время приходит от СП, на сам блоки SET_DT и SET_TOD, приходит значение правильные, а выходные значения - даты и время "будующего")))
В документации на блоки, указано что если входит , к примеру 2024г и то и столько выходит , проводить не нужно...
Вы же сами пишите что год 2024, а подаете 24.
80385
kondor3000
28.11.2024, 08:08
Здравствуйте, подскажите пожалуйста, что я делаю не верно?
80384
Время приходит от СП, на сам блоки SET_DT и SET_TOD, приходит значение правильные, а выходные значения - даты и время "будующего")))
В документации на блоки, указано что если входит , к примеру 2024г и то и столько выходит , проводить не нужно...
Зачем вам вначале REAL, если получать время можно сразу WORD ? 80391
По поводу конвертации, число 8228 - это 2024 год, а у вас почему то 24. Скрин
Конвертация у вас кривая, только 1 байт. Вот функция конвертации
FUNCTION HEX_DEC : WORD (* Конвертация HEX_DEC *)
VAR_INPUT
x: WORD;
END_VAR
__________________________________________
HEX_DEC := x/4096 MOD 16*1000+x/256 MOD 16*100+x/16 MOD 16*10+x MOD 16;
Конвертация времени BCD формата панелей, HEX в DEC и обратно DEC в HEX https://owen.ru/forum/showthread.php?t=38239&page=20#200
Нужно считать по Hart расходомер Krohne Optiflux 2300. Раньше скачал бы PactWare и модули (забыл уже как называются) и работал,
а сейчас нет возможности скачать. Не подскажете какую-нибудь доступную программу с модулями для работы с Krohne по Hart?
Нужно считать по Hart расходомер Krohne Optiflux 2300.
Преобразователь Hart в Modbus не устроит?
Это прибор а нужна прога с нужным модулем
Преобразователь Hart в Modbus не устроит?
Это прибор а нужна прога с нужным модулем
Распарсить символы надо или чего? Мне нужно в порт послать UDP запрос с набором символов и получить UD ответ с набором символов.
Мне нужно в порт послать UDP запрос с набором символов и получить UD ответ с набором символов.
https://owen.ru/forum/showthread.php?t=23997&p=222431&viewfull=1#post222431 если разберетесь. надо будет сделать наоборот сперва посылать, потом ждать ответ
Alexandr88
28.11.2024, 21:55
Всем спасибо, все понятно, а где взять этот функциональный блок HEX_DEC, в библиотеках стандартных его нет!? только писать на я зыке ST?
В теории я понимаю что мне нужно вставить код:
FUNCTION HEX_DEC : WORD (* Конвертация HEX_DEC *)
VAR_INPUT
x: WORD;
END_VAR
__________________________________________
HEX_DEC := x/4096 MOD 16*1000+x/256 MOD 16*100+x/16 MOD 16*10+x MOD 16;
Но поскольку я не знаю язык, я еще как видите с CFC не разобрался... Я не понимаю как создать вход и выход и поставить на поле этот блок!
я же могу сделать макрос: перебывал только что, x/4096 MOD 16*1000+x/256 MOD 16*100+x/16 MOD 16*10+x MOD 16; не понимаю , тут возможно скобочки нужны, не могу составить, не могу понять куда выход мода лепить еще!? какая-то фигня получается: 80412
, в библиотеках стандартных его нет!?..
util.lib/BCD_TO_INT
+ чуть-чуть
.. писать..
kondor3000
29.11.2024, 08:03
Но поскольку я не знаю язык, я еще как видите с CFC не разобрался... Я не понимаю как создать вход и выход и поставить на поле этот блок!
я же могу сделать макрос: перебывал только что, x/4096 MOD 16*1000+x/256 MOD 16*100+x/16 MOD 16*10+x MOD 16; не понимаю , тут возможно скобочки нужны, не могу составить, не могу понять куда выход мода лепить еще!? какая-то фигня получается: 80412
В дереве программ, нажимаете создать функцию на ST с именем HEX_DEC и выходом WORD и вставляете скопированный текст 2 кусками, 80423
на холсте основной программы добавляете элемент и тоже меняете его имя на HEX_DEC, всё.
Будет функция на ST, а программа на CFC. Это удобней чем квадратами пол страницы лепить.
https://owen.ru/forum/showthread.php?t=23997&p=222431&viewfull=1#post222431 если разберетесь. надо будет сделать наоборот сперва посылать, потом ждать ответ
Концепция FINS TCP состоит в том, что сначала приходит FINS запрос, а устройство отвечает на этот FINS запрос FINS ответом. Если провести аналогию с MODBUS TCP, то в моем случае клиентом будет ПЛК ОВЕН, а сервером ПЛК ОМРОН.
.... Если провести аналогию с MODBUS TCP, то в моем случае клиентом будет ПЛК ОВЕН, а сервером ПЛК ОМРОН.
Ответили же
...надо будет сделать наоборот сперва посылать, потом ждать ответ
--
Вы вопросы задаете через анус. Вам нужны клиент и сервер UDP на ПЛК 100. Всё. Что в них пихать - дело десятое. В примере от capzap есть оба (см UDPMBUS) Про ньюнсы - к нему))
Ответили же
--
Вы вопросы задаете через анус. Вам нужны клиент и сервер UDP на ПЛК 100. Всё. Что в них пихать - дело десятое. В примере от capzap есть оба (см UDPMBUS) Про ньюнсы - к нему))
Все ясно. Спасибо.
Конечно с анусом ваш ответ, мне очень неприятен. Но что поделаешь, я уже привык, что люди могут вести себя таким образом... Народ какой-то дюже злой и агрессивный сейчас.
Alexandr88
01.12.2024, 20:25
Спасибо, все получилось.
Добрый день! Подскажите, пожалуйста, использую библиотеку OwenCommunication версия 3.5.11.7 , контроллер ПЛК-210-11, среда- Codesys 3.5 SP17 Patch3. Задача, опросить 33 регистра по Modbus RTU с 17-ти частотных преобразователей. Опрос осуществляется по 12 регистров (сказано из документации на ПЧ). Вопрос, для каждого запроса, т.е. канала опроса (аналогично стандартным средствам конфигурирования устройств Modbus) нужно использовать свой экземпляр ФБ OCL.MB_SerialRequest ? Есть ли способы как-то это оптимизировать, код получается слишком громоздким?
kondor3000
03.12.2024, 09:05
Добрый день! Подскажите, пожалуйста, использую библиотеку OwenCommunication версия 3.5.11.7 , контроллер ПЛК-210-11, среда- Codesys 3.5 SP17 Patch3. Задача, опросить 33 регистра по Modbus RTU с 17-ти частотных преобразователей. Опрос осуществляется по 12 регистров (сказано из документации на ПЧ). Вопрос, для каждого запроса, т.е. канала опроса (аналогично стандартным средствам конфигурирования устройств Modbus) нужно использовать свой экземпляр ФБ OCL.MB_SerialRequest ? Есть ли способы как-то это оптимизировать, код получается слишком громоздким?
Вы пишите не в свой раздел, здесь ПЛК (среда CoDeSys V2.3).
По вопросу, если регистры подряд, то ФБ OCL.MB_SerialRequest может прочитать и 100 регистров за один раз.
Если разброс адресов большой, есть смысл использовать обычный опрос, через конфигурацию.
Хорошо, спасибо. Извините, что разделом ошибся.
Newcomer
12.12.2024, 08:20
Добрый день
В РЭ на ПЛК63 написано: При работе с ВУ дискретного типа значение канала преобразуется в ШИМсигнал. Выходные устройства - транзисторные ключи (К). Как использовать выхода в дискретном режиме без ШИМ ?
kondor3000
12.12.2024, 08:40
Добрый день
В РЭ на ПЛК63 написано: При работе с ВУ дискретного типа значение канала преобразуется в ШИМсигнал. Выходные устройства - транзисторные ключи (К). Как использовать выхода в дискретном режиме без ШИМ ?
Подать на выход 1.0 переменную типа REAL.
в программе использовать конвертацию BOOL_TO_REAL
Добрый день, коллеги. Подскажите, как в визуализации вывести переменную с временем. Т.е. у меня получается, но в виде "T#4s12ms". А надо, чтоб на экране не было символов "Т#"
odex Варианты (пишу сейчас без справочника функций):
а) Перевести в строку и через функцю замены текста в строке (REPLACE, кажется?) заменить T# на пустую строку.
б) Написать свою функцию формата времени. Ну, когда делим время на 24 часа, потом на 60 минут, на 60 секунд - и всё это склеиваем в строку.
PS. А с темой нет ошибки? Тут CodeSys 2.3, а там обычно мало кто визуализацией пользуется.
kondor3000
16.12.2024, 18:46
Добрый день, коллеги. Подскажите, как в визуализации вывести переменную с временем. Т.е. у меня получается, но в виде "T#4s12ms". А надо, чтоб на экране не было символов "Т#"
Можно Time конвертировать в String и вырезать кусок, с помощью функции MID 80858
8 символов, с 5 позиции, если часы, минуты и секунды.
TOD нужен, чтобы время было в нормальном виде, TIME выдаёт время без часов ( T#1176m23s297ms)
Можно собрать время из часов, минут и секунд и перевести в String.
Можно в визуализации вставить %t%H:%M:%S 80860 Получится 80861
Только для даты и времени взятой из Винды.
Samopalych
16.12.2024, 21:40
Что означает, если ПИД-регулятор выдает на выходе всегда 2E+01?
kondor3000
16.12.2024, 21:58
Что означает, если ПИД-регулятор выдает на выходе всегда 2E+01?
2E+01 это 20 градусов (%) или что там у вас.
А почему всегда 20, это надо у вас спросить, что то не так настроили, выкладывайте проект и скрины.
Некоторые ПИД регуляторы не работают в эмуляции, только в живом ПЛК. На некоторые надо подавать циклическое время с аналогового входа.
Вот как пример, для почитать https://owen.ru/forum/showthread.php?t=39620
AleksandrNikolaevi4
19.12.2024, 06:41
Добрый день. Не могу найти способ преобразовать полученные данные даты с панели СП307 в формате DEC в формат HEX для дальнейшей обработки в ПЛК 110. Буду благодарен любому совету.
kondor3000
19.12.2024, 07:49
Добрый день. Не могу найти способ преобразовать полученные данные даты с панели СП307 в формате DEC в формат HEX для дальнейшей обработки в ПЛК 110. Буду благодарен любому совету.
2 страницы назад, выкладывал функцию, удобней использовать чем ФБ 80913
https://owen.ru/forum/showthread.php?t=10555&page=1113#11123
ФБ для конвертации BCD формата панелей, HEX в DEC и обратно DEC в HEX. https://owen.ru/forum/showthread.php?t=38239&page=20#200
AleksandrNikolaevi4
19.12.2024, 09:17
Спасибо большое. Все сработало!
Aleksandr81
12.01.2025, 13:08
Друзья, все привет! Вопрос от новичка - при подключении ПР в режиме отладки часть входов нормально отображают состояние, например 0 или 1, а часть вообще просто квадратики без цифр. Я так понимаю это неисправность прибора... Или проблема в чем то другом? Заранее спасибо за ответы.
kondor3000
12.01.2025, 13:44
Друзья, все привет! Вопрос от новичка - при подключении ПР в режиме отладки часть входов нормально отображают состояние, например 0 или 1, а часть вообще просто квадратики без цифр. Я так понимаю это неисправность прибора... Или проблема в чем то другом? Заранее спасибо за ответы.
Это не неисправность, измените масштаб той части где смотрите и всё будет видно.
И ещё, вопросы по ПР надо задавать в разделе ПР, а вы пишите в разделе ПЛК (среда CoDeSys V2.3)
Aleksandr81
12.01.2025, 14:35
Спасибо за ответ. По невнимательности сюда написал, увидел ВОПРОС-ОТВЕТ и решил задать вопрос...
Юрий Ганыч
14.01.2025, 17:44
Вообще-то на этом форуме такой T-Триггер первым я предложил, где-то в 2011г. Ещё до всяких лоджиков. Ссылку на первое упоминание пока найти не смог, но вот в 2013 году https://owen.ru/forum/showthread.php?t=7344&p=117323&viewfull=1#post117323
Д.д. Спсб! а есть может решение не прописывать в обьявлении каждый RS блок, (если их много) а перед выходом ставить R или S , по типу CFC??
81302
Юрий Ганыч
14.01.2025, 17:50
имеется в в виду для ST
имеется в в виду для ST
if a then с = true; end_if;
if b then с = false; end_if;
Юрий Ганыч
15.01.2025, 15:31
Спсб !!!!!!!!!!!!!!
Юрий Ганыч
15.01.2025, 15:42
100000 раз спсб!!!!!
Юрий Ганыч
15.01.2025, 15:44
А может есть что то , что и ton и tof не прописывать? а только секунды вставлять и переменные? Вот была бы сказка....
kondor3000
15.01.2025, 15:53
А может есть что то , что и ton и tof не прописывать? а только секунды вставлять и переменные? Вот была бы сказка....
Совсем не прописывать нельзя, но упростить можно.
TON1,TON2,TON3,TON4,TON5:TON:=(PT:=T#10s) ; (* Объявить 5 Таймеров с временем 10 сек *)
__________________________________________________ _
TON1(); TON2(); TON3(); TON4(); (* Вызвать Таймеры 1-4 *)
TON1.IN:= In1; (* Включить Таймер 1 *)
TON2.PT:= T#35s ; (* Задать другое время таймера 2 *)
Q3 :=TON3.Q ; (* Получить выход таймера 3 *)
ET4 :=TON4.ET ; (* Вывести время таймера 4*)
Юрий Ганыч
15.01.2025, 18:48
не могли бы Вы подсказать как присвоить одно значение нескольким переменным или входам за раз? a, b , c , := d ; - так не получается...
не могли бы Вы подсказать как присвоить одно значение нескольким переменным или входам за раз? a, b , c , := d ; - так не получается...
a := b := с := d;
Юрий Ганыч
15.01.2025, 19:17
СПСБ!!!!!!!!!!!!!!!
А может есть что то , что и ton и tof не прописывать? а только секунды вставлять и переменные? Вот была бы сказка....
T := sel(in1, time(), T);
Q:= in1 and (Q or time() - T >= уставка);
Это TON с парой ньюансов
Добрый день, коллеги. Подскажите, как в визуализации вывести переменную с временем. Т.е. у меня получается, но в виде "T#4s12ms". А надо, чтоб на экране не было символов "Т#"
Вроде, здесь это делается
81341
elefantkip
20.01.2025, 14:28
Здравствуйте! Вопрос по использованию модуля МВ110-224.8А.
Для термопар типа К (ХА) - нужно установить настройку по ГОСТ: -200...+1360 градусов,
или по шильду: -40...+1100 градусов?
В частности использование целочисленного регистров Izm_int1.
Вопрос при минусовой температуре будут же не отрицательные показания от модуля?
Хочется учесть этот ньюанс в OwenLogic (при пусконаладке).
Не подскажите правильную логику обработки сигнала?
И ещё имеется сетевая переменная status1 (например, для первого канала)
не подскажите значения для диагностики обрыва, неисправностей?
Спасибо большое за ответы!
kondor3000
20.01.2025, 14:45
Здравствуйте! Вопрос по использованию модуля МВ110-224.8А.
Для термопар типа К (ХА) - нужно установить настройку по ГОСТ: -200...+1360 градусов,
или по шильду: -40...+1100 градусов?
Вопрос при минусовой температуре будут же не отрицательные показания от модуля?
Хочется учесть этот ньюанс в OwenLogic (при пусконаладке).
И ещё имеется сетевая переменная status1 (например, для первого канала)
Прописывать надо в модуле МВ110-224.8А как в него заложено, для термопар типа К (ХА)
Чтобы были показания со знаком, надо использовать переменную типа INT, так как в Лоджике нет типа INT, используют макросы (функции на ST), конвертация дополнительного кода в переменную типа FLOAT.
Функции FLOAT_TO_INT и INT_TO_FLOAT на ST____ https://owen.ru/forum/showthread.php?t=22915&page=311&p=429821#post429821
Но проще наверное сразу прочитать температуру FLOAT.
Статус надо обрабатывать, взять коды из руководства, например Обрыв датчика 16#F00D, перевести в DEC (61453) и сравнивать с этим числом.
По хорошему надо было использовать ПЛК, там всё делается через структуру и перечисление, регистры читаются группой.
В Лоджике вывод придётся делать через динамический текст, регистры читаются по 1 (2), вряд ли есть смысл связываться с ещё и с чтением ошибок.
Имеется контроллер ПЛК110-24.60.Р[М02] и внешнее устройство, которое может управляться по RS-485 (Modbus). У внешнего устройства я буду использовать три регистра: 101 ("чтение") , 103 "чтение/запись" и 153 ("чтение"). Не пойму, как правильно сконфигурировать устройство, где один регистр работает и на чтение и на запись. Я сделал так:
81526
В Reg_103_read и Reg_103_write указал один и тот же адрес регистра 103.
Это правильно?
Подскажите, как правильно конфигурировать в этом случае?
kondor3000
23.01.2025, 17:19
Имеется контроллер ПЛК110-24.60.Р[М02] и внешнее устройство, которое может управляться по RS-485 (Modbus). У внешнего устройства я буду использовать три регистра: 101 ("чтение") , 103 "чтение/запись" и 153 ("чтение"). Не пойму, как правильно сконфигурировать устройство, где один регистр работает и на чтение и на запись. Я сделал так:
В Reg_103_read и Reg_103_write указал один и тот же адрес регистра 103.
Это правильно?
Подскажите, как правильно конфигурировать в этом случае?
Чтение в своём UMD, настройка By Poll Time (циклическое чтение), 81528
запись в другом UMD, настройка By Value Change (запись по изменению)
Для некоторых модулей дискретного ввода-вывода, прокатывает настройка Both, в одном UMD, как у вас. Надо проверять.
Чтение в своём UMD, настройка By Poll Time (циклическое чтение), 81528
запись в другом UMD, настройка By Value Change (запись по изменению)
Для некоторых модулей дискретного ввода-вывода, прокатывает настройка Both, в одном UMD, как у вас. Надо проверять.
Под рукой не имею оборудование. Его пока заказали. Попробовать негде. Готовлю себя в теоретическом плане.
Как Вы предлагаете, то мне не понятно, как можно для регистра 103 (внешнего устройства) настроить параметр Work mode?
Придется включать в проект еще один UniveralModbus device отдельно для регистра 103 для записи и чтения и там изменять параметр Work mode.
81530
81529
А можно использовать два UniveralModbus device с одним адресом в сети Modbus?
И еще, а я в своих прошлых проектах не изменял параметр Work mode для модуля ввода МУ110-224.16Р и все работает. Возможно я не прав, паправьте.
И еще, а я в своих прошлых проектах не изменял параметр Work mode для модуля ввода МУ110-224.16Р и все работает. Возможно я не прав, паправьте.
Если это модуль ВЫВОДА 16Р - то ПЛК при таком режиме (Poll) пишет значение в модуль с установленной частотой опроса.
В общем-то это нормальный режим, к тому же позволяющий модулю вывода определить потерю связи с мастером и перевести выходы в безопасное состояние
kondor3000
23.01.2025, 21:11
Под рукой не имею оборудование. Его пока заказали. Попробовать негде. Готовлю себя в теоретическом плане.
Как Вы предлагаете, то мне не понятно, как можно для регистра 103 (внешнего устройства) настроить параметр Work mode?
Придется включать в проект еще один UniveralModbus device отдельно для регистра 103 для записи и чтения и там изменять параметр Work mode.
А можно использовать два UniveralModbus device с одним адресом в сети Modbus?
Можно, скрин из работающего проекта, обмен с панелью слейвом. Именно так с панелью работает великолепно, там ещё и групповой опрос через String, по 40 регистров за раз.
Какой у вас модуль, вы не написали в первом посте.
Можно, скрин из работающего проекта, обмен с панелью слейвом. Именно так с панелью работает великолепно, там ещё и групповой опрос через String, по 40 регистров за раз.
Какой у вас модуль, вы не написали в первом посте.
Не первый раз обращаюсь к Вам с вопросами и всегда получаю доходчивые ответы. Большое спасибо!
В проекте у меня будет группа не овеновских ВУ. Вот и о них все вопросы.
А овеновские модули будут МВ110-224.16ДН и МУ110-224.16Р. С ними все, вроде, понятно.
Из-за разных скоростей обмена данными я буду эти группы ВУ подключать на разные RS-485 (1-2).
Из Вашего ответа меня заинтересовали групповые опросы и записи через string. Я правильно понял, это чтение или запись группы рядом расположенных регистров ВУ?
Боюсь, что меня это ожидает в новом проекте. Не могли бы Вы дать ссылку на документацию, где это можно изучить. И желательно с примерами.
А можно и прислать фрагмент, как конкретно Вы это делаете на примере.
kondor3000
24.01.2025, 10:40
Из Вашего ответа меня заинтересовали групповые опросы и записи через string. Я правильно понял, это чтение или запись группы рядом расположенных регистров ВУ?
Боюсь, что меня это ожидает в новом проекте. Не могли бы Вы дать ссылку на документацию, где это можно изучить. И желательно с примерами.
А можно и прислать фрагмент, как конкретно Вы это делаете на примере.
Вот ссылки на групповой опрос через String, для регистров с адресами подряд. Petera всё разложил по полочкам, есть примеры чтения и записи
https://owen.ru/forum/showthread.php?t=22915&p=333593&viewfull=1#post333593
https://owen.ru/forum/showthread.php?t=22915&p=244022&viewfull=1#post244022
Если это модуль ВЫВОДА 16Р - то ПЛК при таком режиме (Poll) пишет значение в модуль с установленной частотой опроса.
В общем-то это нормальный режим, к тому же позволяющий модулю вывода определить потерю связи с мастером и перевести выходы в безопасное состояние
Нормальный режим для этого - Both (kondor3000 сказал выше)
И теребонькать всухую можно реже и данные вовремя отправляются.
А можно использовать два UniveralModbus device с одним адресом в сети Modbus?
Да.
С чего бы нет?
--
и выше ответили
Для корректной работы ПЛК с внешними устройствами по RS-485 (Modbus), как можно определить, что, например, связь нарушена (обрыв)? И, вообще, где можно узнать, какие бывают протоколированные ошибки и как их прочитать? И как думаете, если внешнее устройство не включено, то это такая же ситуация, что и нарушена связь?
в программе ПР есть уставка 1 (время реакции).
ПР подружил с панелью оператора (мастер). Если уставку 1 привязать к "входной блок сетевой переменной", то при старте эта переменная равна нулю. Видимо до получения от мастера (панель оператора) переменной, ПР (slave) трактует как "0".
Значение по умолчанию в ПР102 почему-то не дает поставить.
Как сделать чтобы в памяти ПР102 было ненулевое значение?
kondor3000
25.01.2025, 12:58
Для корректной работы ПЛК с внешними устройствами по RS-485 (Modbus), как можно определить, что, например, связь нарушена (обрыв)? И, вообще, где можно узнать, какие бывают протоколированные ошибки и как их прочитать? И как думаете, если внешнее устройство не включено, то это такая же ситуация, что и нарушена связь?
В Модбас мастере, есть адрес и ошибка, дайте им имя и получите ошибку ERR<>0, при обрыве сзязи 81574
Если блоков несколько, адрес меняется вместе с ошибкой, если связь есть, то ошибка =0.
kondor3000
25.01.2025, 13:04
в программе ПР есть уставка 1 (время реакции).
ПР подружил с панелью оператора (мастер). Если уставку 1 привязать к "входной блок сетевой переменной", то при старте эта переменная равна нулю. Видимо до получения от мастера (панель оператора) переменной, ПР (slave) трактует как "0".
Значение по умолчанию в ПР102 почему-то не дает поставить.
Как сделать чтобы в памяти ПР102 было ненулевое значение?
Вы пишите не в тот раздел, здесь ПЛК (среда CoDeSys V2.3), а вам нужно в Программируемые реле.
По теме, сделайте инициализацию при включении, из энергонезависимой переменной. 81575
В Модбас мастере, есть адрес и ошибка, дайте им имя и получите ошибку ERR<>0, при обрыве связи 81574
Если блоков несколько, адрес меняется вместе с ошибкой, если связь есть, то ошибка =0.
Я правильно понял, что в моем случае, когда 4 ВУ, я должен в программе на каждом цикле анализировать эти переменны (Last address и Last error). Там постоянно (!) меняются адреса внешних устройств и ошибки по этим адресам? И ничего там не сохраняется на долго. Значения меняются с частотой опроса внешних устройств? Я нашел всего два кода ошибок для RS-485 интерфейса: 0 (ошибки нет) или 81 (превышен таймаут ожидания ответа).
kondor3000
25.01.2025, 14:57
Я правильно понял, что в моем случае, когда 4 ВУ, я должен в программе на каждом цикле анализировать эти переменны (Last address и Last error). Там постоянно (!) меняются адреса внешних устройств и ошибки по этим адресам? И ничего там не сохраняется на долго. Значения меняются с частотой опроса внешних устройств? Я нашел всего два кода ошибок для RS-485 интерфейса: 0 (ошибки нет) или 81 (превышен таймаут ожидания ответа).
Что там анализировать то? Любая ошибка, проблема со связью.
IF Last_Adres=16 AND Last_Error<>0 THEN
Avar1:=TRUE; ELSE Avar1:=FALSE;
END_IF
Что там анализировать то? Любая ошибка, проблема со связью.
IF Last_Adres=16 AND Last_Error<>0 THEN
Avar1:=TRUE; ELSE Avar1:=FALSE;
END_IF
Если у меня 4 ВУ, то я должен по каждому устройству отработать Ваш фрагмент программы. Например:
IF Last_Adres=3 AND Last_Error<>0 THEN
Avar1:=TRUE; ELSE Avar1:=FALSE;
END_IF
IF Last_Adres=4 AND Last_Error<>0 THEN
Avar2:=TRUE; ELSE Avar2:=FALSE;
END_IF
IF Last_Adres=5 AND Last_Error<>0 THEN
Avar3:=TRUE; ELSE Avar3:=FALSE;
END_IF
IF Last_Adres=6 AND Last_Error<>0 THEN
Avar4:=TRUE; ELSE Avar4:=FALSE;
END_IF
Так?
Если у меня 4 ВУ, то я должен по каждому устройству отработать Ваш фрагмент программы. Например:
IF Last_Adres=3 AND Last_Error<>0 THEN
Avar1:=TRUE; ELSE Avar1:=FALSE;
END_IF
IF Last_Adres=4 AND Last_Error<>0 THEN
Avar2:=TRUE; ELSE Avar2:=FALSE;
END_IF
IF Last_Adres=5 AND Last_Error<>0 THEN
Avar3:=TRUE; ELSE Avar3:=FALSE;
END_IF
IF Last_Adres=6 AND Last_Error<>0 THEN
Avar4:=TRUE; ELSE Avar4:=FALSE;
END_IF
Так?
Можно так:
CASE Last_Adres OF
1: Err1 := LastErr;
2: Err2 := LastErr;
3: Err3 := LastErr;
4: Err4 := LastErr;
5: Err4 := LastErr;
6: Err4 := LastErr;
END_CASE;
В моем проекте требуется на ВУ по RS-485(Modbus) в три регистра передать значения. Но передавать необходимо строго в определенной последовательности. Как я могу просто проверять корректность передачи данных по Modbus? Или придется после каждой записи данных в регистр опять читать этот регистр и смотреть, что записалось?
In_Da_Cher_A
26.01.2025, 12:10
Но передавать необходимо строго в определенной последовательности.ну так записывайте в эти переменные СТРОГО В ОПРЕДЕЛЁННОЙ последовательности, и сами в программе своей контролируйте эту запись
в чём проблема прикрутить дополнительное условие для записи переменной?
kondor3000
26.01.2025, 12:13
Если у меня 4 ВУ, то я должен по каждому устройству отработать Ваш фрагмент программы. Например:
Так?
Можно упростить код. Только надо понимать, что так аварии будут постоянно мигать (работа в динамике)
Avar3:=Last_Adres=3 AND Last_Error<>0 ;
Avar4:=Last_Adres=4 AND Last_Error<>0 ;
Avar5:=Last_Adres=5 AND Last_Error<>0 ;
Avar6:=Last_Adres=6 AND Last_Error<>0 ;
Если же надо включить аварию, лучше использовать вариант 1exan с CASE. В шагах можно дописать включение других переменных.
CASE Last_Adres OF
3: Err3 := Last_Error<>0;
4: Err4 := Last_Error<>0;
5: Err5 := Last_Error<>0;
6: Err6 := Last_Error<>0;
END_CASE;
Наверно я не корректно поставил задачу. Представьте, необходимо записать по Modbus под адресом 3 в регистр 101, например, значение 100. После это, в регистр 103 значение 127 и только после этого в регистр 107 значение 3.
Хотите сказать, что если я запишу :
...
Reg101 := 100;
Reg103 := 127;
Reg107 := 3;
...
Это все пройдет корректно? Если да, то это отлично!
Просто, я раньше много лет работал с контроллерами Шнайдерэлектрик M221, то там нужно дождаться пока пройдет первая пересылка данных, а уж потом заталкиваем следующие данные. И там постоянно контролирую передачю данных.
In_Da_Cher_A
26.01.2025, 13:28
Хотите сказать, что если я запишу :
...
Reg101 := 100;
Reg103 := 127;
Reg107 := 3;
...
Это все пройдет корректно? Если да, то это отлично!ну формально, строки обрабатываются по порядку
и присвоение значения переменной идёт по порядку строк в программе
поэтому всё это будет работать "как есть"
если же вам необходимо Reg103 присвоить 127 только после записи числа 100 в слейв 3 и вы без этого спать не сможете спокойно, то добавьте Условие к присвоению Reg103
прочтите из слейва состояние регистра 101, и если он равен ранее введённому числу 100, то Reg103:=127
если нет, то другое действие или значение какое необходимо
то же самое делаете для Reg107
In_Da_Cher_A
26.01.2025, 13:33
там нужно дождаться пока пройдет первая пересылка данных, а уж потом заталкиваем следующие данные. всё зависит от того, как вы сделаете обмен - либо стандартной конфигурацией, либо будете писать сами, через билиотеку, строго чередуя отправку/приём как вам это хочется
И там постоянно контролирую передачю данных.как хотите. Ваш проект, заморачивайтесь как хотите. Только надо ли оно действительно так упарываться? сомневаюсь
ещё и контрольные суммы пресчитывайте каждый раз
только кому это надо? если железка не работает, это и так будет видно и пересчётом контрольной суммы это не вылечишь и плохие кабели не заменишь
kondor3000
26.01.2025, 13:35
Наверно я не корректно поставил задачу. Представьте, необходимо записать по Modbus под адресом 3 в регистр 101, например, значение 100. После это, в регистр 103 значение 127 и только после этого в регистр 107 значение 3.
Хотите сказать, что если я запишу :
Reg101 := 100;
Reg103 := 127;
Reg107 := 3;
Это все пройдет корректно? Если да, то это отлично!
Вы можете затолкать присвоение, в тот же CASE, и переходить по шагам, по условию, Когда чтение равно записи регистров.
Так вы проконтролируете запись и запишите регистры в нужном порядке.
Хотите сказать, что если я запишу :
...
Reg101 := 100;
Reg103 := 127;
Reg107 := 3;
...
Это все пройдет корректно? Если да, то это отлично!
Непонятна цель.
Абсолютно так же корректно все пройдет если запишите
...
Reg103 := 127;
Reg107 := 3;
Reg101 := 100;
...
или
...
Reg107 := 3;
Reg103 := 127;
Reg101 := 100;
...
и даже
...
Reg103 := -1584;
...
Reg101 := 3495;
....
Reg107 := 7747;
....
Reg107 := 3;
...
Reg101 := 100;
...
Reg103 := 127;
Просто, я раньше много лет работал с контроллерами Шнайдерэлектрик M221,
Да пофиг
....И там постоянно контролирую передачю данных.
задачи типа
..После это, в регистр 103 значение 127 и только после этого в регистр 107 значение 3.
Т.е. 3 последовательных подтверждённых записи здесь можно внятно решить только на биб-ках.
При условии что именно это нужно.
А в общем случае, в модбас-rtu ни на чем не исключите повторной записи
kondor3000
26.01.2025, 17:30
Т.е. 3 последовательных подтверждённых записи здесь можно внятно решить только на биб-ках.
При условии что именно это нужно.
Да ладно, вот поймал CASE на шаге 2,81589
1 и 2 переменные уже записаны, но вторая еще не прочитана,
а 3 вообще ещё не записана и даже не отправлена на запись.
Да ладно, вот поймал CASE на шаге 2,...
еще раз
3 последовательных подтверждённых записи.
Где здесь про чтение?
---
На текущий момент - только бибки
(повтор):
При условии что именно это нужно.
kondor3000
26.01.2025, 18:56
еще раз
Где здесь про чтение?
На текущий момент - только бибки
(повтор):
Всмысле? Переход к следующему шагу, только после сравнения записанного Write101 с прочитанным Read101.
Следующее присвоение Write103:=Reg103; только с след. шаге и опять переход только после сравнения Write103 с прочитанным Read103. И т. д.
...после сравнения записанного с прочитанным..
Зачем 2(два) раза подтверждать?
---
М - Мама
КШ - Красная шапочка
Б - Бабушка
В - Александр Сергеевич Волк
Сказка от бибок
М: КШ - отнеси Б пирожки
КШ убегает..
(*В провожает КШ сонным взглядом*)
.. и прибегает
КШ: М! Б сказала спасибо
Сказка от конфигурации
М: КШ - отнеси Б пирожки
КШ убегает..
(*В провожает КШ сонным взглядом*)
.. и прибегает
КШ: М! Б сказала спасибо.
М: Ок, но мне похер. Сбегай ЕЩЕ РАЗ к Б и спроси её - она получила пирожки?
КШ убегает..
(*В провожает КШ уже голодным взглядом*)
.. и прибегает
КШ: М! Б покрутила пальцем у виска, спросила - не передать ли тебе таблетки от склероза?
Заставили ребенка 2 раза сбегать к Б
И подвергли опасности В. Он старый, инсульт может приключится
kondor3000
26.01.2025, 19:21
Зачем 2(два) раза подтверждать?
Где 2 раза? Сначала 1 регистр, потом 2 , потом 3. Скрин то посмотрите.
Где 2 раза?.
выше добавил
Да ладно, вот поймал CASE на шаге 2,81589
1 и 2 переменные уже записаны, но вторая еще не прочитана,
а 3 вообще ещё не записана и даже не отправлена на запись.
Я правильно понял, что Вы специально "обрывали" связь для подтверждения, что передача данных идет по определенной последовательности?
... здесь можно внятно решить только на биб-ках.
Мне показалось, что у kondor3000 очень даже просто и корректно получилось.
Подскажите, а о каких библиотеках идет речь? Можно ссылку на этот материал?
kondor3000
27.01.2025, 10:14
Я правильно понял, что Вы специально "обрывали" связь для подтверждения, что передача данных идет по определенной последовательности?
Просто поймал скрин по времени, если по 1000 мс по умолчанию в ОРС (запись, потом чтение каждой переменной), то прямо видно как они записываются по очереди в ОРС сервер слейв, в программе тоже всё видно.
Примеры чтения и записи через биб-ки есть на сайте
Примеры / Примеры сетевого обмена/ Обмен через библиотеки Modbus и OwenNet, вам нужен обмен через библиотеки Modbus
https://owen.ru/product/codesys_v2/example_program
Мне показалось, что у kondor3000 очень даже просто и корректно получилось.
Может. Может и биб-ки не нужны- я же говорил.
Непонятно само требование именно такой записи в изложенном вами же виде. Оно несколько нечастое. И подходит ли оно.
Допускаю что в описании слейва так и есть (бывает).
Но так же пока нет никаких исключений варианта что вы что-то недопоняли (про слейв) и какой-то фигней занимаетесь
Может. Может и биб-ки не нужны- я же говорил.
Непонятно само требование именно такой записи в изложенном вами же виде. Оно несколько нечастое. И подходит ли оно.
Допускаю что в описании слейва так и есть (бывает).
Но так же пока нет никаких исключений варианта что вы что-то недопоняли (про слейв) и какой-то фигней занимаетесь
У меня в проекте несколько ВУ (выпрямители) . И когда включается наша СУ, то нужно дистанционно активизировать эти слейвы ВУ. А для этого необходимо через один регистр запустить (вывести из "спящего" режима), а уж только потом, через другой регистр, прописать режим работы ВУ. Это один из примеров, когда требуется отработка последовательной записи данных в регистры по Modbus. Нарушать последовательность нельзя.
In_Da_Cher_A
27.01.2025, 18:23
вывести из "спящего" режимаа при "погружении" в спячку - они разве "обнуляются"?
через другой регистр, прописать режим работы ВУ.каким образом ячейка памяти с адресом этого регистра обнуляется? разве у слейва нет retain?
каким-то образом он же помнит значение регистра для пробуждения? почему же он должен потерять режим работы ДО спячки?
и если он в спячке, то каким образом слейв ждёт записи в регистр "побудки"? он же тоже должен быть в спячке
а если он не спит, значит не спит и память режима ВУ, и значит никакого жесткача с записью регистра как такового - нет.
а если он спит, то никакого страшного не случится, если в режим будет записано другое значение другого режима (допустим ошибочно)
сдаётся мне, что как и говорилось изначально и потом добито мистером Серый Волк -
При условии что именно это нужно.именно это и не нужно
вы что-то недопоняли (про слейв) и какой-то фигней занимаетеськак-то так видится со стороны
И опять вопрос по Modbus. Начинаю понимать, почему мои предыдущие вопросы вызвали столько эмоциональных ответов. Всем большое спасибо!
Допустим, я организовал сиcтему, когда ПЛК Master и один Slave UMD:
81629
Правильно ли я понял, что независимо (!) от того, что мы делаем в программе контроллера с регистрами Read101, Read103 и Write104 система обмена данными по Modbus будет постоянно циклически обновлять в UMD значения Read101 и Read103. И цикл обмена будет определяться параметром Poling time, если Work mode = By poll time. А значение Write104 будет записываться во внутренний регистр 104 ВУ только в случае изменения его значения. Для этого Work mode=By value change.
И даже, если мы скроем в условном операторе все обращения к регистрам ВУ, и условие будет FALSE, то в UMD в эти регистры все равно будут записываться значения из ВУ.
Если у меня в Slave UMD будет 20 регистров для чтения, то они будут постоянно считываться из ВУ и передаваться в ПЛК.
Я прав?
kondor3000
29.01.2025, 13:59
И опять вопрос по Modbus. Начинаю понимать, почему мои предыдущие вопросы вызвали столько эмоциональных ответов. Всем большое спасибо!
Допустим, я организовал сиcтему, когда ПЛК Master и один Slave UMD:
Правильно ли я понял, что независимо (!) от того, что мы делаем в программе контроллера с регистрами Read101, Read103 и Write104 система обмена данными по Modbus будет постоянно циклически обновлять в UMD значения Read101 и Read103. И цикл обмена будет определяться параметром Poling time, если Work mode = By poll time. А значение Write104 будет записываться во внутренний регистр 104 ВУ только в случае изменения его значения. Для этого Work mode=By value change.
И даже, если мы скроем в условном операторе все обращения к регистрам ВУ, и условие будет FALSE, то в UMD в эти регистры все равно будут записываться значения из ВУ.
Если у меня в Slave UMD будет 20 регистров для чтения, то они будут постоянно считываться из ВУ и передаваться в ПЛК.
Я прав?
Ничего не понял.
Короче считываться будут постоянно циклически, если By poll time, а записываться только по изменению, если стоит By value change.
Поэтому у меня в примере присвоение на запись след. переменной, только после чтения предыдущей.
Я хотел сказать, что, когда мы считываем в программе значение регистров ВУ, то на самом деле мы считываем значения из UMD. А в UMD регистры заполняются от ВУ по Modbus циклически не зависимо от того, читаем мы эти регистры в программе или нет!
kondor3000
29.01.2025, 14:16
Я хотел сказать, что, когда мы считываем в программе значение регистров ВУ, то на самом деле мы считываем значения из UMD. А в UMD регистры заполняются от ВУ по Modbus циклически не зависимо от того, читаем мы эти регистры в программе или нет!
Немного не так, если переменная чтения есть в программе, то она каждый цикл будет получать значение из UMD и изменить её в программе не выйдет никак.
А менять значения в переменной, точнее присвоить на запись, вы можете когда вам это нужно.
Немного не так, если переменная чтения есть в программе, то она каждый цикл будет получать значение из UMD и изменить её в программе не выйдет никак.
А менять значения в переменной, точнее присвоить на запись, вы можете когда вам это нужно.
Я так и предполагал. Переменные для чтения я и не хотел изменять в программе. Только чтение. Тут главное, то , что переменные чтения в UMD считываются из регистров ВУ постоянно и циклически. И это происходит, когда мы в программе вообще не обращаемся к этим переменным.
Сдаётся мне что необходимо уточнение у/для vsa, как он видит МЭК-цикл ПЛК на предмет когда (в какой момент) обновляются входы конфигурации и когда она реагирует на выходы.
sssssaaaaabbbbb
31.01.2025, 08:50
Здравствуйте коллеги, скажите пожалуйста,есть ли какой то способ узнать время работы кода в TASK, чтоб понимать сколько можно минимально поставить время работы TASKa
kondor3000
31.01.2025, 09:15
Здравствуйте коллеги, скажите пожалуйста,есть ли какой то способ узнать время работы кода в TASK, чтоб понимать сколько можно минимально поставить время работы TASKa
Меньше времени цикла поставить нельзя, но обычно ставят около 20-100 мс.
Если вы не работали с тасками, то и не лезьте туда без дела.
Здравствуйте коллеги, скажите пожалуйста,есть ли какой то способ узнать время работы кода в TASK, чтоб понимать сколько можно минимально поставить время работы TASKa
Подключитесь к работающему контроллеру, зайдите в диспетчер задач и посмотрите
Сергей1978
03.02.2025, 18:38
Здравствуйте уважаемые участники форума. Есть проблема с ПЛК110-60М2. Контроллер установлен в щите парового котла. На дискретные входы подаются команды(ключи, кнопки, контакты реле), выходами контроллер включает светосигнальные табло, звонки, реле. Через порт_1(RS-485_Master) читает данные с ТРМов, и записывает их в СП310. Все работает. Но иногда, после длительного отключения(неделя), контроллер перестает работать по RS485. Сам же контроллер (входы, выходы) работает согласно программе. Берем ноутбук, запускаем CODESYS, подключаемся к ПЛК. Перезаписываем программу. Делаем старт. Все начинает работать. Данные по RS485 пошли. Подскажите что может быть?
А просто выключить и включить питание СП310 (сенсорной панели) не пробовали?
Что за манера - на любой чих перепрошивать программу.
Если после перезагрузки по питанию сенсорной панели связь восстановится, то добавьте на экран кнопку выключения и включения обмена - поможет - вместо перепрошивки и перезагрузки будет сенсорная кнопка.
Вот тут почитайте советы, которые мне дали
https://owen.ru/forum/showthread.php?t=37464
Сергей1978
04.02.2025, 07:32
Доброе утро FPavel. В своем посте я указал, что проблема возникает с ПЛК, а не СП310. ПЛК перестает опрашивать ТРМ. Это видно по мерцанию светодиодов(вернее их отсутствию) на ТРМах. Вдобавок ко всему временной интервал. Если выключить и через пять минут включить, то все работает. А если пройдет неделя, могут возникнуть выше указанные проблемы. Спасибо вам за комментарий. Может кто еще подскажет, где искать проблему.
Доброе утро FPavel. В своем посте я указал, что проблема возникает с ПЛК, а не СП310. ПЛК перестает опрашивать ТРМ. Это видно по мерцанию светодиодов(вернее их отсутствию) на ТРМах. Вдобавок ко всему временной интервал. Если выключить и через пять минут включить, то все работает. А если пройдет неделя, могут возникнуть выше указанные проблемы. Спасибо вам за комментарий. Может кто еще подскажет, где искать проблему.
уже второй пост и досих пор нет конкретики, через конфигурацию или библиотечный опрос слейвов и как тут подсказывать...
колеги, Доброе утро!
ППЛК_110 -мастер, имеем две панели оператора СП310 слейвом. Вопррос: естть способ или алгоритм который позволит ,например, изменить уставку терморегулятора ииз панели,,А,, и чтобы эта новая уставка отобразилась в панеле,,Б,, и наоборот?
kondor3000
04.02.2025, 08:25
колеги, Доброе утро!
ППЛК_110 -мастер, имеем две панели оператора СП310 слейвом. Вопррос: естть способ или алгоритм который позволит ,например, изменить уставку терморегулятора ииз панели,,А,, и чтобы эта новая уставка отобразилась в панеле,,Б,, и наоборот?
Какие проблемы, мастер читает из панели А и записывает в панель Б, как напишите так и будет работать.
В Лоджике есть макросы SelChgI ( SelChgF ), управление из 2 мест, вот его и примените, перенеся в Codesys.
Извините, можно поподробней, на обоих панелях присутствует окошко ,,цифровой вввод,, в котором отражаеться текущая уставка. ПЛК прочтет ее из панели,,А,, но разве получиттс её записать в оокошко ,,цифровй ввод,, панели ,,В,,?
kondor3000
04.02.2025, 08:39
Извините, можно поподробней, на обоих панелях присутствует окошко ,,цифровой вввод,, в котором отражаеться текущая уставка. ПЛК прочтет ее из панели,,А,, но разве получиттс её записать в оокошко ,,цифровй ввод,, панели ,,В,,?
В Лоджике есть макросы SelChgI ( SelChgF ), управление из 2 мест, вот его и примените, перенеся в программу Codesys на ПЛК.
мастер читает из панели А и записывает в панель Б и наоборот.
2 входа - чтение с 2 панелей, один выход- запись в 2 переменные, на 2 панели сразу.
function_block SelChgF (* SelChgF *)
var_input
I1 : real;
I2 : real;
end_var
var_output
Q : real;
end_var
var
I_1 : real;
I_2 : real;
end_var
__________________________________
if I_1<> I1 then (* SelChgF *)
Q:= I1;
elsif I_2 <> I2 then
Q := I2;
end_if
I_1:= I1; I_2 := I2;
Посмотрел, Может я не очень четко сформулировал вопрос. Проблемы нет чтобы изменить переменную из разных панелей для ,,например,, таймера. При воде уставки мы используем инструментт ,,цифровой ввод,, на панели. При работе с ней она визуально сохраняет веденное число ,например 100. Если мастер производственной смены решает изменить на панели ,,А,, уставку на 200 то нужно чтобы на панели ,,В,, в такомже окошке ,,цифровй ввод,, тоже стала уставка 200, чтобы оператор станка на другом конце производственной линии увидил что работа оборудования откоректирована и наоборот81734
In_Da_Cher_A
04.02.2025, 09:09
у вас ПЛК мастер, какие проблемы-то?
При работе с ней она визуально сохраняет веденное число ,например 100. у вас обе панели читают содержимое одного регистра в ПЛК, а не сохраняют это у себя
In_Da_Cher_A
04.02.2025, 09:14
если это вас так беспокоит, то у цифрового ввода есть такая вещь как "мониторинг" - используйте его для проверки введённого значения
и ничего не мешает также просто сделать "контрольный" экранчик - панель А / панель В, где оператор будет видеть, кто что ввёл и применилась ли правка настроек
и ничего не мешает также просто сделать "контрольный" экранчик - панель А / панель В, где оператор будет видеть, кто что ввёл и применилась ли правка настроек// Ройду пот этому варианту, Всем ещё раз спасибо!
In_Da_Cher_A
04.02.2025, 09:25
и ничего не мешает также просто сделать "контрольный" экранчик - панель А / панель В, где оператор будет видеть, кто что ввёл и применилась ли правка настроек// Ройду пот этому варианту, Всем ещё раз спасибо!
посмотрите инструмент Мониторинг, на вкладке "Регистр элемента"
Некоторые элементы (например, Цифровой ввод) способны не только отображать значения регистров, но и записывать в них данные. По умолчанию (при отсутствии галочки Мониторинг), элемент отображает значения регистра, в который записываются данные (пп. 1.3). При наличии галочки, можно указать регистр, который будет отображаться элементом – т.е. с помощью одного элемента можно будет записывать данные в регистр 1 и отображать данные из регистра 2. я редко им пользовался, не было необходимости, но вроде он может вам помочь решить вашу задачу более изящно
Благодарю! Обязательно поробую:o
Сергей1978
04.02.2025, 19:41
capzap. Вот конкретика. Может подскажите в чем может быть дело.
capzap. Вот конкретика. Может подскажите в чем может быть дело.
Прямо проблемных проблем не видно, но:
- почему установлена такая низкая скорость опроса (9600)?
- кто подключен на порт RS485-2?
Хорошо было бы, конечно, в момент проблемы подключиться и посмотреть, что происходит в конфигурации.
А потом не перепрошивать, а например, сделать "сброс" - "старт"
Сергей1978
04.02.2025, 20:16
1. Скорость раньше была 19200. Решили ее уменьшить. Думали может поможет.
2. К порту 2 подключен МСД200.
3. Завтра попробую сделать "сброс" - "старт".
kondor3000
04.02.2025, 20:20
У меня только 1 претензия, мин. цикл 1 мс, возможно ПЛК не хватает этого времени.
Добавьте статистику и проверьте мин. цикл.
А в панели, возможно лучше будет поставить запись по изменению (By Value Change) и сделать запись группой через String
https://owen.ru/forum/showthread.php?t=22915&page=39&p=244022&viewfull=1#post244022
1. Скорость раньше была 19200. Решили ее уменьшить. Думали может поможет.
2. К порту 2 подключен МСД200.
3. Завтра попробую сделать "сброс" - "старт".
Функции МСД вполне может выполнять сама панель (ведение трендов, запись из на внешний накопитель + какое-никакое отображение графиков).
И вообще я бы подключил панель на место МСД в качестве мастера
capzap. .
проект не смотрел, судя по ответам других конфигурация и холст с квадратиками. Логика и настройка соединений тут второстепенны, для диагностики не плохо бы видеть скрин последней ошибки у мастера, если таковая имеется, а так это что то в линии, что за витая пара, что расположено рядом из "шумящих" исполнительных механизмов, есть ли заземление и соединены ли все потребители на одну шину
Добрый день! Задача по синхронизации одинаковых показаний на двух панелях оператора решена блогадоря подсказкам In_Da_Cher_A и Kondor3000 , ещё раз им спасибо, имею наглость попросить на языке ST аналогичный макрос только для булевых переменных SelChg8 (выбирает значение bool которое менялось последним) из Овен Лоджика. Если есть конечно . Спасибо.
..Задача по синхронизации одинаковых показаний на двух панелях оператора решена...
Даже верю что тестилось по-взрослому - рандомно и независимо дергалось питание девайсов (плк, 2 панели) и отрывались интерфейсы
kondor3000
05.02.2025, 14:45
Добрый день! Задача по синхронизации одинаковых показаний на двух панелях оператора решена блогадоря подсказкам In_Da_Cher_A и Kondor3000 , ещё раз им спасибо, имею наглость попросить на языке ST аналогичный макрос только для булевых переменных SelChg8 (выбирает значение bool которое менялось последним) из Овен Лоджика. Если есть конечно . Спасибо.
Зачем его выкладывать, в ФБ SelChgF, меняете все REAL на BOOL или на WORD (UDINT) и получаете SelChgB или SelChgI
Вот, может кому пригодиться : выбирает значение BOOL которое менялось последним:
FUNCTION_BLOCK BIT_VUBOR
VAR_INPUT
B1: BOOL;
B2: BOOL;
END_VAR
VAR_OUTPUT
B_OUT: BOOL;
END_VAR
VAR
B_1: BOOL;
B_2: BOOL;
END_VAR
IF B_1<>B1 THEN
B_OUT:=B1;
ELSIF B_2<>B2 THEN
B_OUT:=B2;
END_IF;
B_1:=B1;
B_2:=B2;
Для меня - пригодилось:)
Stalker46k
05.02.2025, 17:16
Добрый день всем. Давно не возился с овеном, тем более версия M02 вышла. Не получается настроить общение ПЛК110-30Р.М с блоками расширения МВ110-32 и МУ110-32.
Вот конфиг настройки блоков расширения, начиная с 32 адреса с шагом в 32.
81789
Вот настройки в ПЛК RS-485
81790
Вот настройки Universal Module Device
81791
Пытаюсь прочитать 99 и 100 регистры, но ничего не получается. На блоках расширения горит авария, пните пожалуйста, в какую сторону копать нужно.
Переставьте у ПЛК ASCII на RTU
kondor3000
05.02.2025, 17:38
Проще было выложить тестовый проект.
Ставьте Модбас RTU,
шаг 32 нужен только для протокола Овен, для Модбас можно сделать хоть подряд, 32 и 33
Регистры надо читать только вместе, Маска бит 32 Bit Input Module (DWORD), записывать Маску бит 32 Bit Output Module,
Все тайминги лучше оставить по умолчанию, зачем Polling Time - 500 поставили? , зачем скорость 9600 ?
функция записи только 0х10, режим поставьте Both
Короче, удалите всё и сделайте заново, меняйте только RTU, скорость, слейв адрес и Both.
Stalker46k
05.02.2025, 18:35
Я так понимаю как то так должно выглядеть?
Сергей1978
05.02.2025, 18:54
Добрый вечер. Сегодня разбирался с ПЛК. И вроде бы нашел проблему. Обратил внимание, что после сброса питания светодиод "РАБОТА" на ПЛК тускло горит. Перечитал документацию, и понял, что неправильно загружал программу. Изначально делал так:открываю CODESYS, далее ОНЛАЙН > Подключение(выскакивает окно записать программу) > жму ДА > жму СТАРТ. И все заработало....до сброса питания. Сегодня сделал так:открываю CODESYS, далее ОНЛАЙН > Подключение > Создание загрузочного проекта. Теперь все работает. Признаю, изначально не доглядел, где-то подзабыл. Всем ответившим боьшое спасибо.
kondor3000
05.02.2025, 19:34
Я так понимаю как то так должно выглядеть?
Вроде похоже на правду, правда адреса регистров не проверял.
Stalker46k
06.02.2025, 08:24
Вроде похоже на правду, правда адреса регистров не проверял.
Спасибо большое за подсказку, все еще не проверил, но вроде бы работает. А еще один вопрос, как правильно присвоить тэг биту из 32bit input module. По адресации не очень удобно писать программу получается, под 200 адресов в уме держать.
Пытался сделать так, но выдает ошибку 4024.
IN : DWORD;
IN.0 := KSM7_1;
IN.1 := KSM8_1;
IN.2 := KSM9_1;
IN.3 := KSM10_1;
In_Da_Cher_A
06.02.2025, 08:47
IN : DWORD;объясните, для чего вы сделали это объявление переменной IN
Stalker46k
06.02.2025, 08:50
Пытался сделать по мануалу, не помогло.
81801
Пытался сделать по мануалу, не помогло.
81801
Объявляйте переменные и пишите код программы в предназначенных для этого секциях, а не в одном месте
In_Da_Cher_A
06.02.2025, 09:26
Пытался сделать по мануалу, не помогло.
81801отлично. ещё раз - IN- что это за переменная?
подсказка = посмотрите в конфигурацию
если не поняли, приложите скрин конфига
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot