воскресенье, 14 сентября 2025 г.

Смена программы на табло BX-05 через WinCC

Максимально специфичный кейс, но пишу потому что приёмы которые тут используются, могут пригодиться и в будущем. Помогали опять нейросети, но все же по итогу все сам. Плохо то что не зная синтаксиса можно сделать небольшую ошибку и работать не будет, и не ясно потом почему, а нейронка накидывает суперсложные варианты, хотя и помогает с их реализацией. Но обо всем по порядку.

Имеется светодиодное табло, 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 Explicit
Function action
    Dim testprohod
    Set testprohod = HMIRuntime.Tags("testprohod")
    Dim WshShell,cmd
    Set WshShell = CreateObject("WScript.Shell")
    cmd = "javaw -cp ""C:\bx\bin;C:\bx\lib\*"" p"&testprohod.Read
    WshShell.Run cmd, 1
End Function

Этот скрипт запускает по триггеру - изменение тега testprohod - число от 1 до 5, например. Соответственно подготавливаются заранее java классы с названием p1, p2, p..., и кладутся в папку C:\bx\bin. Еще с чтением тега были проблемы -я забыл Read - без этого значение не читалось. Добавил Reafd и все заработало: теперь при каждом изменении тега меняется программа на табло, соответствующая тому номеру число которое есть в теге. Стрелочкой на скрине показана кнопка для выбора тега, при этом автоматом добавляется объявление и функция присваивание объекта тегу, значение которого потом считывается всторенной функцией Read


 Вот такой получился кейс - в нем и то как надо писать скрипты на WinCC и как добавилять абсолютные пути для java и vbs и как запускать триггеры. Сейчас переключение экранов бесшовное и незаметно пользователю

Кстати совсем забыл что что нейросеть посоветовала в конце использовать конструкцию 
Set WshShell = Nothing
чтобы освободить объект. 

вторник, 12 августа 2025 г.

Вайб кодинг

 Уже неделю наверное экспериментирую с нейросетями, делаю так чтобы они за меня писали программы, и должен признаться получается это у них даже лучше чем у меня, быстрее. Попробовал переделать те приложения что делал я, и чисто визуально они выглядят сильно лучше, хотя и функционал +- такой же, ну конечно засчет того что добавлять новый функции стало проще, добавлено и что-то новое. Есть и отрицательные стороны - код сложно назвать компактным, но правда опять же, если я не сипользовал в своей игре никаких стилей а от нейросети попросил визуально красивую игру, то конечно она накидает не мало стилей со всякими тенями, скруглениями, цветными кнопками, градиентами и прочим. Но и код один фиг не оптимизирован, но и в современных реалиях гнаться за килобайтами тоже глупо. Короче такие сумбурные размышления на тему того что не все так просто, хотя и все очень даже круто) 

нужно разработать игру mastermind для удобного игрового процесса на мобильном устройстве. нужно сделать 6 развноцветных кругов которые будут добавляться в игровую зону просто по клику на круге, заполняя игровую зону последовательно друг за другом, что означает что если щелкнул например красный круг первым, то он встает в угадываемую последовательность на первое место. 6 разноцветных кругов расположить в 2 строки по 3 в ряд. В верхней строке в правой части должна быть кнопка проверить, во второй строке кнопка убрать, чтобы убрать последний добавленный кружок. Внизу страницы кнопка новая игра и помощь с инструкцией к игре. Угадываемые последовательности цветов в игровой зоне нужно заполнять сверху вниз в игровой зоне, это означает что последняя угадываемая последовательность цветов должна находиться всегда внизу, прикреплена к нижнему краю игрового поля. Попытки пронумеровать и расположить так чтобы первая была вверху, последняя внизу. Нужно добавить полосу прокрутки в игровом поле чтобы можно было прокрутить до первой попытки. при победе выдавать сообщение с количеством попыток и просмотром правильной комбинации Нужно использовать только javascript html и css - все в одном файле чтобы запустить локально

Чтобы понимали о чем речь вот 2 проекта, мой и нейросетевой: визуально видно разницу хорошо, + добавлены еще и уровни сложности, а все сообщения выводятся в модальном окне. работал кстати в нейросети от алибабы - Qwen. 

На этой игре пытался тестить другие нейросети, должен сказать что они может и чуток получше, вероятно запросов придется сделать меньше чтобы получить нужный вариант, хотелось бы максимально приближенный к тому что получилос у меня в первый раз при помощи нейросети (за несколько часов и с десятка 2 уточнений) - расположение кнопок, цветовая схема, функционал как задумано. Допустим Lovable - там есть несколько запросов в день бесплатных и по такому запросу, с 4-мя уточнениями удалось воссоздать играбельную игру с нормальным визуалом. Qwen с таким же запросом в итоге все же не справился за даже 6 уточнений, но можно так пытать до бесконечности, поэтому пофиг. Хотя и не совсем - иногда нейросети тупо не понимают что ты видишь и не могут это починить. Я так пытался исправить некруглые кнопки, и хрен бы их исправил, потому что как и положено в css задан стиль для кнопки круглый, но Хром подставляет свой стиль, поэтому пришлось конкретно просить заменить кнопки на элемент div.

Вот этот запрос на голубом фоне - он не идеальный, нужно дорабатывать. Я думаю что нужно вносить свои названия для элемнетов дизайна чтобы оперировать с ними в будущем, потому что не всегда очевидно как описать этот элемент чтобы поменять его цвет или форму или размер, или сообщить об ошибке в нем. Например сейчас я бы ввел понятие панели управления, который бы попросил сделать единым блоком в конфигурации 3*2 кружка слева, справа 2 кнопки друг под другом. Опять же сразу просить темную тему если хочется именно такую. 

Ну и да ссылка на проекты от нейросети: https://github.com/boolkin/html


пятница, 30 мая 2025 г.

WinCC ошибка SQL

Как-то раз у нас на работе пропало питание и отключился комп, с запущенной на нем WinCC. После запуска компа WinCC отказалось запускать проект, ссылаясь на ошибку: «SQL сервер не может получить доступ к базе данных». После долгих мытарств пришло понимание что похерилась база данных самой WinCC, которая создается при ее установке. Находится такая она по пути C:\Program Files\Microsoft SQL Server\MSSQL10_50.WINCC\MSSQL\DATA и там лежит несколько файлов. Мы просто взяли такие же файлы с другой работающей WinCC такой же версии и заменили их на те что были повреждены, тупо все скопом. На всякий случай решил сохранить эти файлы на будущее, вдруг такая ситуация когда-нибудь повторится у нас или у кого еще.  Версия WinCC в данном случае была 7.2.0.2

Архив с файлами в папке DATA

четверг, 6 марта 2025 г.

Управление умной лампой с помощью виджетов Android

Я как-то писал статью статью о том, как сделал приложение для управления умной лампой через яндекс алису https://boolkin.blogspot.com/2023/09/Yandex-station-android-apk.html

Проблема этого способа в том, что коды пропысываются жестко и если что-то поменяется (срок действия уодов которые генерировал яндекс для меня составлял один год) то придется заново пересобирать приложение и мало того для того чтобы включить или выключить лампу надо сначала запустить свое приложение и уже потом нажимать нужную кнопку. Именно поэтому пришла идея отказаться от своего приложения и воспользоваться сторонними разработками - виджеты с http запросами. Конкретно речь идет о приложении в моем случае Ярлыки HTTP запросовЯрлыки HTTP запросов 

В этом приложении создаются ярлыки которые можно отправить на рабой стол, и запускать их с рабочего стола одним кликом. Причем можно назначить разный вид ярлыков, есть неплохой набор иконок, возможно даже можно и свои назначит но с некоторых пор мне такое уже давно не интересно. Вот как это выглядит:




Пишу со смарта, поэтому оформление немного храмает, но я думаю примерно понятно. Добавляется ярлык, добавляется http post запрос на адрес api.iot, в заголовок добавляется авторизация, а сам запрос делается как json:

{
  "devices": [
    {
      "id": "",
      "actions": [
        {
          "type": "devices.capabilities.on_off",
          "state": {
            "instance": "on",
            "value": true
          }
        }
      ]
    }
  ]
}
Естественно id должно быть айди вашей лампы, а авторизация та что даст яндекс.

Если включить то value true, а если лампу выключить то value false

воскресенье, 19 января 2025 г.

Статистика википедии

Наверняка про википедию слышали все, а вот про то что в русском сегменте вики хозяйничают украинцы по полной программе, про это думаю слышали не так много людей, а еще меньше людей  заморачиваются по этому поводу. Возможно, некоторые более-менее продвинутые пользователи интернета и вики видели такую картину, показывающие эту статистику правок рувики по странам, где четко видно как выделяется Украина на фоне других стран, а Россия тем временем вообще подсвечена серым цветом:

Статистика находится по этому адресу Можно прокрутить статистику по месяцам начиная с 2018 года, и посмотреть как менялась активность украинцев в российской википедии, для чего был написан простейший скрипт. Фишка в том что эти данные по редакторам можно смотреть и в табличном виде, для чего нужно нажать на кнопку "глобуса" над картой справа. После формирования таблицы все числа с редакторами будут отсортированы по правой стороне и это поможет выделить нужные цифры. Сам скрипт такой:

tds = document.getElementsByTagName("td");
total = 0;
numb = 0;

for (let i=0;i<tds.length;i++) {
    if (tds[i].className =="right aligned") {
    total = total +parseInt(tds[i].innerHTML);
    numb++;
    }
}
x = parseInt(tds[0].innerHTML);
proc = x *100 / total;
console.log(total +" из " + numb + " стран; УКР=" + Math.round(proc) + "%");

И вот результат сравнений по годам для правок от 100 штук:

янв 2018: 380 из 29 стран; УКР=18% 

дек 2018: 350 из 27 стран; УКР=20%

дек 2019: 360 из 29 стран; УКР=17% 

дек 2020: 340 из 25 стран; УКР=21%

дек 2021: 370 из 30 стран; УКР=19% 

дек 2022: 320 из 27 стран; УКР=16%

дек 2023: 390 из 31 стран; УКР=13%

дек 2024: 400 из 34 стран; УКР=10%

Вот по годам для правок до 99 штук:

янв 2018: 1760 из 60 стран; УКР=36%

дек 2018: 1640 из 60 стран; УКР=34%

дек 2019: 1510 из 54 стран; УКР=36%

дек 2020: 1730 из 60 стран; УКР=35%

дек 2021: 1570 из 53 стран; УКР=36%

дек 2022: 1650 из 57 стран; УКР=24%

дек 2023: 1510 из 60 стран; УКР=24%

дек 2024: 1510 из 56 стран; УКР=24% 

Как видно активность снижается, что не может не радовать)

понедельник, 7 октября 2024 г.

Продолжение по Owen и Codesys

В прошлый раз писал о том как запустить опрос нескольких устройств по протоколу modbus чтобы опрос велся в пакетном режиме - тогда советовали использовать символы, и приходилось делать еще множество преобразований, а еще чтобы сделать опрос сразу 30 устройств пришлось даже расширять память. Оказалось что Овен выпустили давным давно библиотеку, которая так же в пакетном режиме опрашивает модбас устройства и преобразований становится меньше.

Удобно то что добавлять и убирать опрашиваемые устройства можно в коде и гораздо проще чем через конфиг контроллера, хотя и сделал я это немного странновато, но работает. Удобно что в Кодесис есть экспорт программы, который экспортируется целиком в текстовом формате - можно экспортировать кусок программы, лишь один блок FB, что я и сделал и скопировал его в гитхаб гист. Этот блок вызывается из главной программы, и в него передается количество оправшиваемых модбас устройств, адреса которых записаны в отдельном массиве. Вообще там есть еще и множество глобальных переменных, но пока решил не добавлять 


Еще хотел бы написать еще об одной интересной штучке, подсмотрел на форуме, но хочу сохранить еще раз - логика для отображения времени скана программы:


Простейший принцип - фиксируется время каждого цикла и отнимается от времени предыдущего цикла - сработает на любом другом ПЛК, интересно даже проверить это потом как-нибудь.

Еще одна интересная фишка - есть и в документации и снова как всегда пишу тут чтобы не искать в документации:

Как видно на картинке можно задать разные цвета заливки для блока с восклицательным знаком - при разных условиях цвет будет разный. При этом удобно использовать массив цветов (в данном случае cell_err, причем обратить внимание на тип DINT - цвет требует больше памяти чем просто INT) и цикл для задания цветов для нескольких устройств. Конечно же даже если условий сработает несколько, то цвет останется в итоге по последнему условию, но в данном случае такое поведение не принципиально, потому что при любом раскладе требуется обратить внимание на состоянии ячейки. Чтобы при нормальной работе не отображать восклицательный знак - его показ можно скрыть по условию если цвет будет равен нулю, но в конструкции добавляется NOT - потому что свойство невидимости (или тогда <>0 без NOT)
.cell_err[1]=0
И еще кое-что. Для того чтобы реализовать мигающий красный восклицательный знак, пришлось добавить мигающий бит в программу. Сначала сделал на таймерах ,а потом увидел что есть готовый блок в библиотеке Utils:


пятница, 23 августа 2024 г.

Передача сигнала с IBA PDA в PLC

IBA PDA может собирать кучу сигналов через множество протоколов с разных ПЛК: TCP, UDP, S7, Modbus TCP (но иба не мастер а слейв), Modbus RTU (как мастер та ки слейв через COM порт), OPC DA и другие. Фишка в том что оказывается через OPC можно и отправлять данные в ПЛК, и об этом хоел написать небольшую заметку, чтобы как обычно в случе если снова понадобится, можно было это сделать еще раз. (сейчас смотрю и как будто слишком сложно все, но та кработает. не знаю можно ли упростить, но оставлю именно так как делал сам)

Для настройки передачи используется функция ИБЫ Alarms (OPC output module), где в качестве выходного сигнала выбирается тот который поддерживает записть. На скрине ниже видно как в ИБА Qpanel ввели в специальное поле значение 20, и это значение изменилось (4 график):


 Видно так же то что этот сигнал пишется еще и в виртуальный модуль (7:0)

А кнопка на Qpanel привязывается к этому сигналу (на скрине кстати видно как можно скрыть кнопку Apply, или можно ее текст изменить):

Все. Теперь если с ибы ввести новое значение, то оно передается в ПЛК посредством OPC. 

B еще немного про интересную функцию ИБЫ - technostring, вот так она примерно работает:

То есть можно передавать ASCII символы, которые будут отображаться в анализе в момент передачи. Туда можно передавать например номера рулонов. Как видно на скрине выше передавать на ибу можно строку по TCP протоколу и выделять в строке нужную часть, которая будет отображаться на графике. Заканчиваться строка должна переводом каретки (0x0D). Также можно передать строку в файле - во время сохранения файла показывается та часть первой строки (оканчивающаяся так же переводом каретки) которая настраивается аналогичным образом как и с TCP. В общем все это очень интересно, но для применения в реальности чаще всего врядли понадобится: если не знать что так можно делать, то значит так можно не делать)