Максимально специфичный кейс, но пишу потому что приёмы которые тут используются, могут пригодиться и в будущем. Помогали опять нейросети, но все же по итогу все сам. Плохо то что не зная синтаксиса можно сделать небольшую ошибку и работать не будет, и не ясно потом почему, а нейронка накидывает суперсложные варианты, хотя и помогает с их реализацией. Но обо всем по порядку.
Имеется светодиодное табло, Onbon BX-05 - куда можно вывести любой текст, время, температуру. У табло есть свой вайфай, подключившись к которому в него можно заливать программы (экраны) через специально приложение на Андроид. Несколько лет назад я нарыл сайт и API на JAVA для этого табло, но тогда не разобрался сразу что экраны можно менять просто переключая программы, а не каждый раз записывая экран в EEPROM. Причем там написано что циклы записи в EEPROM ограничены (как и в любом другом оборудовании), а в моем случае переключение экрана предполагалось каждые 5 минут 24/7, то есть в таком темпе EEPROM сдох бы уже через год. Но в этот раз я целенаправленно искал такую опцию чтобы налету менять экран (программу) и нашел. На странице с документацией (JAVA - ONBON Docs (onbonbx.com)) есть такая строка
// 锁定指定节目 screen.lockProgram(programId, lockDuration); // 解除节目锁定 screen.unlockProgram(programId);
У меня уже были наработки в прошлый раз, я научился компилировать Java и запускать тестовый скрипт из командной строки, и добавив в него строку screen.lockProgram(1,0); научился включать в данном случае первую программу (пример onbon_bx05/SimpleCommand.java). Чтобы запустить Java программу нужно запустить команду
java -cp lib/*;bin SimpleCommand
при этом в каталоге bin должны быть заранее скомпилированные классы. Компилил я их командой
javac -source 8 -target 8 -encoding UTF-8 -cp lib/* -d bin p1.java
мне было необходимо компилировать в 8 версию java для поддержки 32 битной винды.
Интереснее то как запустить потом все это через WinCC. Как я и говорил ранее, можно было легко нагуглить и даже спросить у нейросети как создать vbs скрипт для переключения экрана, но почему-то он не пошел на WinCC сразу хотя из файла vbs переключение работало. А все дело в том что я забыл объявить переменные в самом начале через ключевое словоDim - виндовый интерпретатор игнорировал это и сам объявлял, а вот Винсисишный не захотел. И я потратил очень много времени чтобы запускать скрипты через C-action и внешние проги. И в итоге это не работало так как было нужно мне, а нужно было чтобы переключение происходило незаметно, без открытия окна консоли. Но в итоге все решилось довольно просто - исправил ошибку с объявлением переменных, и узнал что java может запускаться в скрытом режиме через команду javaw.
В итоге создал такой глобальный скрипт:
Option ExplicitFunction actionDim testprohodSet testprohod = HMIRuntime.Tags("testprohod")Dim WshShell,cmdSet WshShell = CreateObject("WScript.Shell")cmd = "javaw -cp ""C:\bx\bin;C:\bx\lib\*"" p"&testprohod.ReadWshShell.Run cmd, 1End Function
Этот скрипт запускает по триггеру - изменение тега testprohod - число от 1 до 5, например. Соответственно подготавливаются заранее java классы с названием p1, p2, p..., и кладутся в папку C:\bx\bin. Еще с чтением тега были проблемы -я забыл Read - без этого значение не читалось. Добавил Reafd и все заработало: теперь при каждом изменении тега меняется программа на табло, соответствующая тому номеру число которое есть в теге. Стрелочкой на скрине показана кнопка для выбора тега, при этом автоматом добавляется объявление и функция присваивание объекта тегу, значение которого потом считывается всторенной функцией Read
Вот такой получился кейс - в нем и то как надо писать скрипты на WinCC и как добавилять абсолютные пути для java и vbs и как запускать триггеры. Сейчас переключение экранов бесшовное и незаметно пользователю