1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

WinCC на двух мониторах или управление PictureName одного PictureWindow из другого PW

Ответить

Автор темы
stesl
эксперт
эксперт
Сообщения: 1011
Зарегистрирован: 31 мар 2018, 12:05
Имя: Вячеслав
Благодарил (а): 94 раза
Поблагодарили: 136 раз

WinCC на двух мониторах или управление PictureName одного PictureWindow из другого PW

Сообщение stesl »

Всем привет. Задал такой вопрос на другом форуме. С Вашего позволения, просто продублирую
Здравствуйте, коллеги!
Всегда натыкаюсь в поиске на Ваш форум, и с интересом читаю. Сам не пишу - уровень слабоват. Но вот, в очередной раз находясь в поиске, обнаружил, что и АСУшники здесь бывают, каковым я тоже и являюсь.

Пишу первый проект на WinCC, есть богатый опыт на WinCC Flexible, но пальто явно не то. Нужен второй моник. Обратился к OS project Editor и вроде появилась в Miscellaneous того же PictureWindow настройка Monitor Number, но что то ни к чему не приводит. Оговорка - в винде все готова, карта - разрешение, все настроено.

Собственно вопрос 1. Что то я упускаю? Что еще ткнуть, чтобы PW автоматом на 2 моник ушел?

Ладно основной процесс отображаю в PW1 координаты которого 0,0. Вспомогательный моник с PW2 с координатами 1921,0 (FullHD оба моника). Есть 2 независимых картинки. Все неплохо. Но как мне сделать смену картинки на PW2 по клику на объекте на PW1? Direct Connection не пойдет, ибо в текущем (PW1) окне нет объекта PW2 (равно и объектов в нем). Написал в VB так

Sub OnClick(ByVal Item)
ScreenItems.Item ("SecondMonWindow").PictureName = "Z3_mon2.pdl"
End Sub

Фигня. Не работает. И без скобок в конце тоже. Не силен конечно в VB. Может поможете? Ибо в Visual C не силен еще более.

Можно конечно один PW1 с размером 1920*2,1080 сделать. Но это как то костыли. Не хочется путь начинать с них. И так кругом ОНИ.

LexSL
осмотрелся
осмотрелся
Сообщения: 192
Зарегистрирован: 16 дек 2011, 15:13
Имя: Алексей
Страна: Россия
Благодарил (а): 65 раз
Поблагодарили: 46 раз

WinCC на двух мониторах или управление PictureName одного PictureWindow из другого PW

Сообщение LexSL »

stesl писал(а): 24 май 2019, 02:04 Ладно основной процесс отображаю в PW1 координаты которого 0,0. Вспомогательный моник с PW2 с координатами 1921,0 (FullHD оба моника). Есть 2 независимых картинки. Все неплохо. Но как мне сделать смену картинки на PW2 по клику на объекте на PW1? Direct Connection не пойдет, ибо в текущем (PW1) окне нет объекта PW2 (равно и объектов в нем). Написал в VB так

Sub OnClick(ByVal Item)
ScreenItems.Item ("SecondMonWindow").PictureName = "Z3_mon2.pdl"
End Sub

Фигня. Не работает. И без скобок в конце тоже. Не силен конечно в VB. Может поможете? Ибо в Visual C не силен еще более.

Можно конечно один PW1 с размером 1920*2,1080 сделать. Но это как то костыли. Не хочется путь начинать с них. И так кругом ОНИ.
Если я правильно понял, то выглядит так:
123.png
Тогда по нажатию кнопки:

Код: Выделить всё

Sub OnClick(ByVal Item)                
Dim posPW, pw1, pw2
posPW = InStrRev(Item.Parent.AccessPath, ".") 'ищем в пути имени экрана точку с конца
'экраны (pdl) и элементы на экране адресуются так, например:
'start.PW1:PDL1_1.pw_temp:PDL1_2.Button1     

Set pw1 = HMIRuntime.Screens(Left(Item.Parent.AccessPath, posPW-1)).ScreenItems(Parent.ObjectName)  'получаем ссылку на PW1 - если надо, можно удалить
Set pw2 = HMIRuntime.Screens(Left(Item.Parent.AccessPath, posPW-1)).ScreenItems("PW2")  'получаем ссылку на PW2
pw2.PictureName = "Z3_mon2.pdl"

Set pw1 = Nothing
Set pw2 = Nothing
End Sub
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Автор темы
stesl
эксперт
эксперт
Сообщения: 1011
Зарегистрирован: 31 мар 2018, 12:05
Имя: Вячеслав
Благодарил (а): 94 раза
Поблагодарили: 136 раз

WinCC на двух мониторах или управление PictureName одного PictureWindow из другого PW

Сообщение stesl »

Во первых - спасибо за обстоятельный ответ. Во вторых чувствуется опыт и хочется запытать :crazy0to:

По рисунку: нет, с самого начала у меня не было той подложки - Start.pdl. Вспоминая свой Флексибл я подумал, что какая то структура у экранов должна быть (начал догадываться про адресацию). И вот уже с этим экраном получилось гораздо проще

Код: Выделить всё

Sub OnRButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y) 
    Parent.Parent.ScreenItems.Item ("SecondMonWindow").PictureName = "Z3_mon2"
End Sub
Изучая Ваш пример, не совсем понимаю что за поле AccessPath? Также непонятен пример адресации start.PW1:PDL1_1.pw_temp:PDL1_2.Button1
двоеточия между элементами это синтиаксис? Я понял так элемент Старт (экран "подложка").PW1(элемент Picture Window1) - тут непонятно (:PDL1_1) - pw_temp это то что отображено сейчас на PW1 (ObjectName?), снова :PDL1_2 - и наконец кнопка.

И наконец зачем Left в строках инициализаций переменных?

И может есть чего доброго почитать по VB WinCC да и по С можно. Симатик в своих книжках - ну очень краем задевает эти темы. Есть, к примеру раздел VBS, и ты довольный потираешь руки, а там просто описание того, как с IDE работать :shock:
Так что в основном - обратный инжиниринг работ коллег.

PS И еще - Вы пользуетесь входной переменной процедуры - Item. Это тоже ObjectName кнопки (в данном контексте)? На самом деле вопросов еще больше, но постараюсь разобраться сам.

LexSL
осмотрелся
осмотрелся
Сообщения: 192
Зарегистрирован: 16 дек 2011, 15:13
Имя: Алексей
Страна: Россия
Благодарил (а): 65 раз
Поблагодарили: 46 раз

WinCC на двух мониторах или управление PictureName одного PictureWindow из другого PW

Сообщение LexSL »

Начнем с конца:
stesl писал(а): 26 май 2019, 01:22 PS И еще - Вы пользуетесь входной переменной процедуры - Item. Это тоже ObjectName кнопки (в данном контексте)? На самом деле вопросов еще больше, но постараюсь разобраться сам.
Item - это объект, кнопка по которой Вы жмякаете левой кнопкой мыши. У нее есть свойства и методы, которые можно менять.
stesl писал(а): 26 май 2019, 01:22 Изучая Ваш пример, не совсем понимаю что за поле AccessPath? Также непонятен пример адресации start.PW1:PDL1_1.pw_temp:PDL1_2.Button1
двоеточия между элементами это синтиаксис? Я понял так элемент Старт (экран "подложка").PW1(элемент Picture Window1) - тут непонятно (:PDL1_1) - pw_temp это то что отображено сейчас на PW1 (ObjectName?), снова :PDL1_2 - и наконец кнопка.
Когда я пишу - например:

Код: Выделить всё

dim scr1
Set screen = Item.Parent
То это я получаю ссылку на pdl (screen), в котором находится ваша кнопка. У этого объекта есть также свойства.
Если Вы сделаете так:

Код: Выделить всё

HMIRuntime.Trace Item.Parent.AccessPath & vbCrLf
то увидите наглядный пример адресации.
stesl писал(а): 26 май 2019, 01:22 По рисунку: нет, с самого начала у меня не было той подложки - Start.pdl.
У Вас PictureWindow PW1 и PW2 на каком экране находятся? На одном ли они экране находятся? Судя по коду , да
stesl писал(а): 26 май 2019, 01:22

Код: Выделить всё

Sub OnRButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y) 
    Parent.Parent.ScreenItems.Item ("SecondMonWindow").PictureName = "Z3_mon2"
End Sub
Объясню:
Как выше уже сказал - Item.Parent - это объект экрана на котором кнопка. Если же просто писать Parent - то это уже PictureWindow, в котором находится pdl с кнопкой. Сделайте

Код: Выделить всё

HMIRuntime.Trace Parent.ObjectName & vbcrlf
и все поймете.

Код: Выделить всё

Parent.Parent
Это уже объект pdl, на котором находится PW1 и PW2. Т.е. вы получили условно ссылку на pdl (например пусть будет pdl1)
И вот у Вас код уже такой получается

Код: Выделить всё

pdl1.ScreenItems("SecondMonWindow").PictureName = "Z3_mon2"
В общем, и Ваш вариант имеет право на жизнь.
Left - это функция VBScript, возвращает из строки слева указанное кол-во символов.

Да, забыл, чтобы увидеть вывод Trace - необходимо на, например, стартовый pdl кинуть объект Global Diagnistics и выбрать Scripts

Автор темы
stesl
эксперт
эксперт
Сообщения: 1011
Зарегистрирован: 31 мар 2018, 12:05
Имя: Вячеслав
Благодарил (а): 94 раза
Поблагодарили: 136 раз

WinCC на двух мониторах или управление PictureName одного PictureWindow из другого PW

Сообщение stesl »

Здравствуйте.
Ну что... Наверно опыт придет с годами. Чем больше в WinCC погружаюсь тем больше вопросов. Нет английского, но хотя бы google стал таким натасканым, что технические тексты один в один почти переводит. Попробую VB изучить, отвлеченно от WinCC. Но вот все эти моменты с адресацией и прочей спецификой такое изучение не осветит.
А пока - главное проект двигается. На месте не стоит. Каждый скрипт в муках конечно рожается :ext_book:

По поводу нашего диалога - да, я добавил один экран (Start) размером 1920*2х1080. По крайней мере в редакторе стало понятно что где находится. Получилось как на Вашем рисунке. И конечно поэтому и смог через Parent.Parent дотянуться до содержимого PW2.
Информации как же все таки пользоваться свойством Monitor 1(2) PW так и не нашел. Как бы я его не ставил (0,1,2) - PW всегда на 1 мониторе.

Спасибо за инструмент GD. Правда в 7.4 его еще добыть пришлось. Через Aplication Window. Но видимо вопросы по навигации по кадрам буду задавать этому окошечку.

Сейчас интересует еще один вопрос. Вспоминается, что на курсах говорили о цикле обновления Upon Change примерно так: WinCC посылает телегу ПЛК, что при изменении таких то тэгов - сообщать. Я правильно помню? Или это уже моя фантазия. Если правильно, то такая телега посылается 1 раз, при открытии окна? А ПЛК потом уже отчитывается? Или др механизм работает.
Нужно думать о оптимизации. Тэгов тыщи под 4, и проект далеко не единственный в сегменте.

И еще вопросик. В VB можно сами тэги использовать? Если да - небольшой пример, если не трудно. То есть если тэг = столько то, то ...
Ответить

Вернуться в «WinCC»