воскресенье, 13 ноября 2022 г.

АСУ ТП-шное

Программирование и АСУТП идут где-то рядом, потому что программирование промышленных линий и агрегатов - есть тоже программирование, внезапно. Проблема АСУТП в том, что оно не так сильно распространено в интернете, как программирование. Нет такого массового сайта типа Stackoverflow для асушников, где можно взять работающий код и внедрить к себе в проект, либо просто понять как это можно сделать самому. Вообще сейчас на этот счет есть куча воя от программеров, которые выкладывают свой код в интернет, а потом внезапно осознают, что кто-то копирует его, что им очень не нравится. Это конечно утрированно, там проблема несколько иная, но тем не менее. В АСУТП тоже есть что-то вроде защиты копирайтов и ноу хау. В ПЛК Сименс например (да и в других контроллерах) есть возможность заблокировать блок так чтобы его содержимое было недоступно для просмотра, и оттого понять что там за логика внутри скрыта не представляется возможным. Впрочем и открытый иногда блок может быть настолько сложным, что логику его понять тоже не очень-то просто. Потому я и пишу что как было бы классно иметь такой каталог с лучшими практиками и лайфхаками как сделать ту или иную задачу с минимальными усилиями. 

Вот недавно столкнулся по работе с проблемой, как на Интаче отобразить статус оборудования подключенного по профибасу к контроллеру митсубиси. Оказалось все довольно просто: оказывается в настройках контроллера для мастера (Master settings) есть внутренний адрес по которому можно узнать статус всех "абонентов", и просто сравнив бит этого слова с нулем, можно запросто узнать в сети устройство или нет, например для устройства c DP адресом 26. Это второе слово и пятый бит (32 в HEX)

(dpNetStatW01 & 32) <> 0 

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

"Статус нагревателя: " + 
DText(DuctHeater_HState == 1,"Нагрев",
DText(DuctHeater_HState == 2,"Ожидание",
DText(DuctHeater_HState == 3,"Отключен",
DText(DuctHeater_HState == 4,"Нет готовности тэнов",
DText(DuctHeater_HState == 5,"Аварийный останов",
DText(DuctHeater_HState == 6,"Отключен датчик тем-ры среды",
DText(DuctHeater_HState == 7,"Отказ датчика тем-ры среды",
DText(DuctHeater_HState == 8,"Аварийно высокая тем-ра среды",
DText(DuctHeater_HState == 9,"Отказ датчика тем-ры сосуда",
DText(DuctHeater_HState == 10,"Аварийно высокая тем-ра сосуда",
DText(DuctHeater_HState == 15,"Аварийное отключение",
DText(DuctHeater_HState == 17,"Отказ уставки",
"---"))))))))))))

Или вот другой вариант, чтобы вывести кучу текста в одну строку:

DText((DH_E1 & 64) == 64,"Нагрев включен ","") + 
DText((DH_E1 & 128) == 128,"Аварийный останов ","") + 
DText(DH_E7 & 512 == 512,"Низкое напр. тирист.","")

Либо вот, для экономии тегов (т.к. лицензия ограничена по количеству тегов), создал вместо кучи дискретных битов - один целочисленный и записывал в него по нажатию кнопки соответствующее значение по битовой маске, кстати это тоже самое что и значение 32 в DEC

EMG_DO_W = EMG_DO_W | 0x0020;

Вот так сделал кнопку показать/скрыть окно, тупо условия если и иначе

IF EMG_pop_show==0  THEN
    Show "Tens";
    EMG_pop_show = 1;
ELSE 
    Hide "Tens";
    EMG_pop_show = 0;
ENDIF;

Можно было бы придумать более изящный способ, например, повесить условие на показать/скрыть элемент в зависимости от статуса некоторого бита, который может быть как не странно  ИСТИНА или ЛОЖЬ, и уже этот бит переключать при клике по кнопке. В интаче для этого есть специальная опция, а вот в том же ВинСС похоже все еще не завезли, а народ выкручивается как может. Мне, например, понравилось как это сделал один мой товарищ по цеху: 

     
HMIRuntime.tags("AUTOPREP.SHOW_SETTINGS").write (1 - HMIruntime.Tags("AUTOPREP.SHOW_SETTINGS").read)

То есть на языке интача из прошлого примера получится EMG_pop_show = 1 - EMG_pop_show, то есть тег был нулем - стал единицей, была единица - стал нулем. Гениально)

Вот еще парочка примеров из интача опять же, просто чтобы было:

WWControl (InfoAppTitle("View"),"Close"); - закрыть приложение Intouch Viewer

RestartWindowViewer( ); - перезапустить это приложение

IF InfoAppActive(InfoAppTitle("Notepad"))==1
THEN
ActivateApp InfoAppTitle( "Notepad" );
ELSE
StartApp "Notepad";
ENDIF;

запустить приложение блокнот - все эти скрипты взяты из мануала

Комментариев нет:

Отправить комментарий