Если Test_Fan_On - это нечто вроде реле перепада давления на вентиляторе, то поставьте задержку побольше
Еще, так можно
Вложение 78981
Здесь задержка работает только при включении
Вид для печати
Если 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.
Для реализации группового опроса используйте модуль String в конфигурации мастера ПЛК
Например
https://owen.ru/forum/showthread.php...l=1#post333593
https://owen.ru/forum/showthread.php...l=1#post244022
Спасибо большое, буду разбираться)
Попробовал работает, вроде даже быстрее. Но не правильное чередование байт - значение должно быть 231, а отображает 15138816.
Вложение 78985
По настройкам вроде правильно выставил, если считывать отдельно требуемые параметры они отображаются корректно, тип данных DWORD.
Вложение 78986
электросчётчики или что?Цитата:
опрашивает счетчики по Modbus RTU (3 шт. по 25 регистров DINT), часть из них используется в работе ПЛК, но все 75 шт. передаются по Modbus TCP в SCADA. А проблема в том, что опрашивает он их по одному, не пакетно, и похоже после каждого регистра еще и таймаут выжидает, а счетчики итак на скорости 19200 работают.
самый главный вопрос - а нужно ли быстрее? :D
и как быстро меняются данные в электросчётчике? суточный объём, месячный объём, что там ещё активная, реактивная, ну токи допустим...и что в СКАДА системе за алгоритм, требующий более скоростного опроса и реакции на изменение допустим тока по фазе А?
я к тому, что изменение "загрузки" пары тройки "микросхем" отвечающих за сетевой опрос в ПЛК с допустим условно 30% до 5% никак не скажется на ни на увеличении времени безотказной работы, на на перегреве, ни на что другое
"ускорять" опрос или ещё как-то заморачиваться стоит только для того, имхо, если этого реально требует либо алгоритм, либо сетевые затыки. В большинстве случаев, все ускорения - это просто увеличение энтропии вселенной :D
ну чисто для трени - вай нотЦитата:
спортивный интерес
Заказчику нужно скорее для анализа кратковременных скачков мощности, которые можно вообще не увидеть при опросе в 4-5 сек. На работу ПЛК и его алгоритма это может повлиять если целевая уставка времени будет меньше 10 сек., на практике скорее меньше 20 сек не будет, если только больше. В принципе дальше на каждом потребителе уже нормальные мультиметры стоят по ним можно эти же скачки с точностью до десятых долей секунды видеть. Так что, хотелось бы сделать хорошо))
String это просто контейнер для абстрактных регистров и он всегда нативный относительно слейва (не путать с пакетом) и кладет на настройку порядка регистров, которая за каким-то по дефолту трасемоде, т. е. переставляет регистры для "розничного" обмена
Т..к. в ваших слейвах порядок 3412, просто скопируйте из стринга исходную массив/структуру в нужное место и переставьте там слова в нужных двойных словах
Самое простое создать функцию и переставить регистры Вложение 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);
В принципе меня устроило как работает предложенное уважаемым 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?
Почему у вас адреса начинаются с первого, когда по мануалу, адреса начинаются со 2.
У вас в итоге и регистры переставлены и читаете вы регистры из разных каналов. Если я прав, то переставлять регистры надо при обычном чтении, а через String и переставлять ничего не надо.
По мануалу функция должна быть 4, а вы всё читаете 3
Вот это ошибка... из других счетчиков перекочевала.
При функции 3 смещение на 1 регистр, если ставить как в мануале то вообще ничего не читает, сразу в ошибку вываливается. Сейчас перепроверил, при нужной функции чтения 4, без разницы с какого регистра начинать чтение, но поправил на четный как в мануале. Цифры одинаковые считывает! Преобразование все равно нужно
Т.к. ПЛК считывает одинаковые цифры со смещением и без, проверил как все считается в arOPC напрямую со счетчика. В OPC сервере необходимо смещение, т.е. начало с 1 регистра а не со 2 как в мануале. С четного опрос не идет.
К мультиметру @150 есть доступ и там живые данные, у @144,146,148 все по нулям чтобы подать на них напряжение надо включать установку.
Адреса должны быть как в мануале, если написано 2 значит 2, в ОРС сервере тоже самое, если передаёте 2 регистр то и принимать надо 2,
если же ошибка и не правильно передаётся, то надо не адрес менять, а регистры (байты) правильно расставить.
Нет в ОРС сервере никакого смещения.
А вот в слейве ПЛК адреса начинаются с 0 и 32 битные переменные должны быть с чётными адресами. Если сделать с нечётными, то выравнивание сместит адреса, на следующий чётный адрес. Но судя по выложенному проекту у вас адреса правильные.
То есть чётные, значит и в ОРС сервере 32 битные с чётными адресами.
Что то я запутался, хочу записать переменную с ПЛК 110 (мастер) в ПР205 (слейв) но, сделать это ТИКом как R_TRIG сначала записать 1 затем сбросить на 0 , разумеется запись пойдет по условию а сброс постоянно, но ничего не получается в ST , (напрямую из конфигурации ПЛК руками, все отлично) понимаю что запись должна произойти в конце цикла.. но что то не получается, вроде ерунда ...Обидно терять время и изобретать грабли с велосипедом.. Уверен что есть четкий и правильный способ, подскажите плиз..
Спасибо, теперь понятно
Если бы мне сразу удалось опросить в OPC сервере четные регистры как в мануале, то я бы в ПЛК мастером тоже опрашивал четные.
Если опрашивать не четные, с 1 адреса регистра
Вложение 79023Вложение 79024
Если опрашивать четные, со 2 адреса регистра
Вложение 79025Вложение 79026
Мультиметры абсолютно одинаковые все Lovato DMK22 - 4 шт. c @144,146,148 и 150.
Давайте ещё раз сначала. Вы читаете мастером с модулей, тут уже разобрались, адреса начинаются со 2, читаете функцией 4.
Потом вы отправляете в слейв те же регистры и читаете ОРС сервером из слейва, так я уже про слейв вам пишу. В нём есть выравнивание. Если положите в 15 адрес, то читать надо из 16.
Например вы положили в адрес 16, так ОРС и надо читать 16 адрес (при ошибке переставить регистры), читать в ОРС надо функцией 3.
там с 2...73 есть фазное...частота. Их можно получить сразу одним запросом (и даже в конфигурации)
А что такое с 511?
Данные в слейв нужны все?
вопрос предобработки открыт, т.к.
-до сих пор с адресацией/ордером не разобрались
-вытягивает ли сама ловата 72 регистра (пропуски там)
-пропусков в слейве боитесь?
-нужна ли частота в нормальных Гц? (и т.п.)
Согласен все запуталось) Забываем про все остальные счетчики кроме 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 на само чтение никак не влияет, только на корректность отображаемых цифр.
Адреса которые корректно читаются 1..71
Нессиметрия напряжения и тока, энергетик сказал хочу видеть...
Нет только список из поста с проектом, 25 параметров.
-про адресацию выше вроде все расписал.
-в arOPC если одним блоком читать с 1..71 пол часа работало без отвалов и данные корректы
-волков бояться в лес не ходить. На данный момент этих нюансов не знаю, есть подводные камни? Ну кроме увеличения времени опроса из-за большего количества регистров.
-преобразований до нормальных Гц и т.п. делать не надо, все уже делается в SCADA готовые шаблоны шкал, отчетов, трендов и т.п. Большого труда переделать не составить, но надо ли?
Мне вот интересно, вы после всех изменений в проекте, хоть раз сделали Очистить всё, компилировать всё? Это надо делать после каждого сильного изменения, в адресах тем более.
Значит сдвиг есть в самих модулях, читаем 4 модуля с адреса 1 функцией 4. В принятых данных переставляем регистры.
Далее всё полученное кладём в слейв, по какому адресу (номеру регистра в слейве)?
Чтобы прочитать ОРС сервером, функцией 3 уже без смещения, например из 10 в 10 адрес, в ОРС регистры надо переставлять?
Очистить все не делал, каюсь. Компилировать все каждый раз перед заливкой в ПЛК, когда добавлял, удалял изменял элементы(блоки). Контроль перекрытий, неиспользованные переменные и т.п. периодически.
Да так и сделано в представленной проекте A2_TEST.pro
_144_15_Y8_QF1_JB1_1 имеет адрес 40, порядок байт при чтении OPC сервером 1032, ниже приложил скрин. Порядок байт в arOPC 1032 это стандартное значение которое он предлагает, т.е. не надо переставлять.
Вложение 79030
Ну а теперь вы можете через структуру или массивом поменять везде регистры (как Валенок написал) и присвоить всё в созданную структуру (с указанием на 40 адрес слейва) и положить туда уже готовые данные.
Здесь подобный пример даже есть, читается 7 модулей через String и всё отправляется в структуру в готовом виде (с переставленными регистрами) и в слейв https://owen.ru/forum/showthread.php?t=10555&page=987
Вот выпало немного времени, и про эти ловаты - 11 строк кода
У меня получилось не так красиво, но намного наглядней, структура по названию каналов. Вложение 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
Вот я о чём, что понятней Slave.LovataData[1].Part1[1]; или Power_Str[1].Voltage_AN; , структура по названию каналов.
А это одно и то же 1 блок, Напряжение_AN, переменная в слейве.
Ему ещё проект дописывать надо будет.
"Но автору не нужно"
А так, фазное
Slave.LovataData[1].UF[1];
потому что там считывается (но не нужно) еще и линейное
Slave.LovataData[1].UL[1];
А зачем вот эти буквы
?Цитата:
(* Напряжение_AN *)