Вот, данные начали ипередаваться в панель, только они там скачут между 0 и 250, и когда таймер останавливаеться там выводится цифра 16. Может надо использовать REAL а не BYTE?
Вид для печати
Вот, данные начали ипередаваться в панель, только они там скачут между 0 и 250, и когда таймер останавливаеться там выводится цифра 16. Может надо использовать REAL а не BYTE?
CS_Cs, это не вы задаете тупые опросы а увы я, не хватает знаний вот такие вопросы и генерирую..
Назревает новый проект, где придется одним промышленным компьютером(ПК) управлять двумя ПЛК110-60[M02] (Slave) по Modbus TCP. Будут всего два шкафа. В одном шкафу расположится ПК и ПЛК110-60, а в другом только один ПЛК110-60. Расстояние между шкафами 4-7 метров. Подскажите, какой простой (не дорогой) неуправляемый коммутатор можно использовать для подобной сети взаимодействия по Ethernet? Или имеются особенности для ПЛК ОВЕН?
VSA, я использовал овеновский неуправляемый комутатор между ПЛК и Скадой на компе, 100 метров, 1 год полет нормальный
Ну вот щас точно ясно, что скачки значений из-за того, что ты байт передаёшь. Но REAL не надо тоже.
Меня смутил Register Input module тогда: вдруг я чего-то не знаю и не в курсе, и там какой-то сложный случай.
PS. Если панель - Master, то у меня есть удобный способ передать весь Slave через красивую структуру. Во, тут писал: https://cs-cs.net/codesys-modbus-kar...trov-struktury (для будущих проектов может сгодиться)
Cs-Cs благодарю, выполнил Ваши рекомендации и все заработало:o
Это система распределенного управление гальваническим оборудованием. Тут и шесть автооператоров, две передаточные тележки, водяные клапаны, сушильная камера, выпрямители и т.д. Много приходится анализировать дискретных входом и выходов. Мы этими вопросами занимаемся много лет. Но на оборудовании ОВЕН только с 2022 года. Поэтому и возникают вопросы. У нас в проекте нет ни оптики, ни 1000 Мбит. Так что на счет неуправляемого свитча? Какой можно поставить для ПЛК110-60? Хотелось бы в пределах 1000 руб. максимум.
Модули расширения для каждого ПЛК обязательно будут. Кроме этого дополнительные каналы RS-485 будут задействованы на каждом ПЛК. Но нас интересует быстродействие системы. У нас автооператоры на высоких скоростях перемещаются вдоль линии, а позиционирование осуществляется бесконтактными датчиками. Если все нагрузить на один ПЛК, то программа будет очень большая, а это увеличение длительности цикла опроса датчиков. Есть вероятность, что автооператоры могут на высокой скорости проезжать позиции остановки. Да и такая распределенная система управления сокращает расход "меди" на коммутационные линии. Электрические проводники становятся короче, а это, порой, и уменьшает наводимые помехи. Ведь наша СУ использует много частотных преобразователей для приводов автооператоров. И работают эти приводы на разных частотах в зависимости от ситуации. Вот такая система.
Да я уже понял. Нашел у ОВЕН неплохой хаб.
Вопрос по оптимизации кода программы.
По задаче мне нужно cчитывать значения одноименного регистра (153) по Modbus из четырех Slave устройств и записывать эти значения в регистры (36-39) Slave устройства ПЛК110 для дальнейшей передачи их по TCP в ПК.
Можно было в программе записать просто:
wTok_Real_Pult_1 := wTok_Real_Pult_1_In; (* Reg 153 Slave 1 записывается в 36 регистр ПЛК*)
wTok_Real_Pult_2 := wTok_Real_Pult_2_In; (* Reg 153 Slave 2 записывается в 37 регистр ПЛК*)
wTok_Real_Pult_3 := wTok_Real_Pult_3_In; (* Reg 153 Slave 3 записывается в 38 регистр ПЛК*)
wTok_Real_Pult_4 := wTok_Real_Pult_4_In; (* Reg 153 Slave 4 записывается в 39 регистр ПЛК*)
Т.к. эти значения имеют чисто информационный характер для оператора, работающего на этой СУ, то я решил не загружать процессор ПЛК этой операцией на каждом цикле работы контроллера, а ввел цикличность опроса. Каждые 4 сек. происходит опрос этих четырех регистров. Например, как на этом фрагменте. Для цикличноcти опросов я использовал 2 таймера TON:
(* Опрос регистров 153 (фактического тока выпрямителей) Slave1-4 каждые 4 сек.*)
(* wTok_Real_Pult_1 регистр 36 Master PLC *)
(* wTok_Real_Pult_2 регистр 37 Master PLC *)
(* wTok_Real_Pult_3 регистр 38 Master PLC *)
(* wTok_Real_Pult_4 регистр 39 Master PLC *)
(* Регистры 36-39 будут читаться по TCP внешним ПК *)
Pausa_Opros1(IN:=NOT Opros,PT:=T#2s); (* Пауза 2 сек *)
IF Pausa_Opros1.Q THEN (* Это место отрабатывается один раз за 4 сек! *)
wTok_Real_Pult_1 := wTok_Real_Pult_1_In; (* Регистр 153 Slave 1 *)
wTok_Real_Pult_2 := wTok_Real_Pult_2_In; (* Регистр 153 Slave 2 *)
wTok_Real_Pult_3 := wTok_Real_Pult_3_In; (* Регистр 153 Slave 3 *)
wTok_Real_Pult_4 := wTok_Real_Pult_4_In; (* Регистр 153 Slave 4 *)
Opros := TRUE;
END_IF
Pausa_Opros2(IN:=Opros,PT:=T#2s); (* Пауза 2 сек *)
IF Pausa_Opros2.Q THEN
Opros := FALSE;
END_IF
Все свои программы в контроллерах я стараюсь выполнять за минимальное время цикла процессора, т.к. приходится оперативно анализировать состояние дискретных входов, по которым осуществляется позиционирование движущихся автооператоров по рельсам.
Интуитивно, понимаю, что работающий таймер тоже отвлекает процессор на каждом цикле. Но все же вопросы:
1. ”Игра стоит свеч”?
2. Как можно проще реализовать приведённый мною фрагмент? Возможно с использованием BLINK.
Если в этом нет необходимости, то это всё вообще не нужно, пишите в регистры постоянно, выиграть ничего не получится, только ненужные таймеры добавили.
А вот читать и записывать регистры в мастере надо группой, про String уже писал.
Если же так нужно, то наличие 2 таймеров, никак не замедлит программу.
Если опрашиваете не самописной программой, а средствами плк, то вроде он сам постоянно опрашивает регистры... А тут вы только в самой программе просто пытаетесь раз в несколько секунд присвоить значения этих уже несколько раз считанных контроллером регистров какой то переменной... Или я не прав?
Это имело бы смысл, если чтение регистров выполнялось с использованием библиотеки. А если сконфигурирован Polling 100ms, то чтение будет 10 раз/сек. Поставьте Polling 4000ms на эти регистры.
Давно хотел работать с групповой записью. Напомните ссылкой место, где можно подробнее изучить этот режим. Но для формирования строки, которую в дальнейшем нужно отправить в рядом расположенные регистры, необходимо сформировать. А это дополнительные операции. А это дополнительное время. Или я ошибаюсь?
Вот ссылка чтения, записи через String.
https://owen.ru/forum/showthread.php...l=1#post244022
Несколько строк присвоения, никак не повлияют на длительность цикла программы, кроме того разложить по массивам переменные (если их много) можно, например циклом FOR
Пример чтения 7 модулей 8АС и отправки всего в слейв https://owen.ru/forum/showthread.php?t=10555&page=987
Для эмуляции с предустановленными значениями https://owen.ru/forum/showthread.php...&page=988#9875
А можно для ПЛК11-60М на один порт RS-484 закрепить несколько UMD с одним и тем же ModuluSlaveAddress, но с разными параметрами Polling time?
Было бы не плохо таким образом не перегружать Modbus частыми опросами. Например, в моем случае, для одного внешнего устройства несколько регистров чтения (101 и 103) в одном UMD имеют Polling time=200 ms, а регистр (153) в другом UMD Polling time=4000 ms. И тогда код программы в ПЛК не нужно нагружать искусственными задержками опроса регистров внешнего устройства. Или это все так не работает?
Можно. Я тоже так делаю. Есть процессы, параметры которых меняются очень медленно. Нет смысла считывать их очень часто. А есть, наоборот, надо чаще.
Пока с групповыми запросами я еще не разбирался, возможно Вы правы. Но для редко опрашиваемых регистров я и предложил отдельный UND c большим Polling time, а для часто опрашиваемых регистров Polling time имеет маленькое значение. А "искусственную задержку" я бы осуществлял обычными таймерами TON. Но они в таком случае не потребуются. О чем и был вопрос. EFrol положительно ответил. Возьму на вооружение.
Иногда надо и реже 1-го раза в 10 секунд. Тогда можно использовать режим "По команде". Я опрашиваю так кристаллизаторы 1 раз каждые 4 минуты. https://owen.ru/uploads/373/plc1xx_p...ation_v2.0.pdf
Вложение 81998
А если представить, что один ПЛК110-60 управляет несколькими цехами одновременно:
Вложение 81999
то используются все доступные средства.
И в полне себе работает. Вот уже лет 8.
Сразу не бросайте тапки. Что-то никак не могу придумать реализацию T-триггера на языке ST. Был бы оператор GOTO, то мог бы смоделировать, этого оператора в ST нет.
Представьте, имеются переменные IN, OUT : BOOL. Как сделать так, чтобы после первого сигнала на IN (TRUE) выставилось TRUE на OUT, а после следующего TRUE на IN должен появится сигнал FALSE на OUT и т.д. Короче, обычный T-триггер. Перебрал триггеры: RS, SR, F_TRIG и R_TRIG, но ничего красивого не выходит. Если можно, подскажите.
vsa Тебе нужен R_TRIG, который ты поставишь на вход импульсов, чтобы он отрабатывал ОДИН раз, когда на входе TRUE.
А потом пишешь банально так: OUT := NOT OUT;
(всё-таки накидал код)
Код:FUNCTION_BLOCK T_TRIG
(* Copyright © 2024 Cs-Cs.Net Laboratory & Studio https://cs-cs.net *)
VAR_INPUT
Trig : BOOL := FALSE;
END_VAR
VAR_OUTPUT
Out : BOOL := FALSE;
END_VAR
VAR
fbRTrig : R_TRIG;
END_VAR
fbRTrig(CLK:= Trig);
IF (fbRTrig.Q) THEN
Out := NOT Out;
END_IF
Проблема с ПЛК 73. Почему-то modbus возвращает функцию на чтение регистра сам в себя. На картинке normal_receive нормальный ответ от устройства, а на картинке это фукнция modbus, которая идет от ПЛК к устройству. Из-за этого данные скачут, вне зависимости от проверок. Вложение 82077Вложение 82078Вложение 82079
Писал код по примеру от разработчиков к библиотеке Modbus. Сам заметил что флаг complete не устанавливается. Но, к сожалению, не могу понять почему. Можете, пожалуйста, подсказать как он работает или указать на какой-либо пример?Цитата:
С кодом.