вторник, 14 декабря 2010 г.

Динамическое изменение входов объектов а AS

       Динамическая  перепривязка входов очень удобная штука но если ее очень много то возможны проблемы при работе движка.Сейчас я реализовал в одном проекте перепривязку  в соответствии с рекомендациями WW для решения этой проблемы.

    Выглядит это примерно так :
скрипт перепривязки повешен на "WhileTrue"
условие выполнения " MyContainer.ScanState"
Запускается привязка на 1-2 скане при условии что объект контейнер уже задеплоен и работает , тк с него берется путь для привязки.

в конце скрипта я добавил строку
me.SetInput.Disabled=true;
тк менять приязку в моем случае надо только после деплоймента , а при перезапуске привязка сохраняется и это лишняя трата ресурсов.

среда, 8 декабря 2010 г.

XmlDocument и Wonderware Application Server Scripting

            В скриптах AS сейчас нет структуры  case, приходится заменять  ее кучей if. В некоторых задачах приходится в зависимости от значения одной величины менять значение другой или нескольких, и пока вариантов не много это еще выглядит нормально .... но вот если больше 10 то это уже 2 экрана if then elseif ..... некрасиво ... и менять это неудобно :) возникла идея заменить это все какой нибудь структурой но ничего подходящего скрипты в AS не могу :( . 
             
      Это была предыстория :)

      Решил эту проблему сейчас с помощью .NET  System.Xml.XmlDocument. Все получилось очень просто, но пока адаптировал к языку скриптов AS пришлось немного повозится.

Вот результат.

создание объекта и загрузка xml в объект

dim EngUnitDoc as System.Xml.XmlDocument;
EngUnitDoc = new System.Xml.XmlDocument;
EngUnitDoc.load(me.xmlPath);

выгрузка объекта в общее пространство приложения .... правильно называется оно не так но вроде понятно :)


System.AppDomain.CurrentDomain.SetData(Me.Tagname+"XMLDoc",EngUnitDoc);

Все файл прочитали и он доступен для всех объектов... вероятно на том же самом движке , но не уверен еще не проверял. 

Теперь получаем доступ к данным которые мы загрузили из скрипта 

dim EngUnitDoc as System.Xml.XmlDocument;
EngUnitDoc = System.AppDomain.CurrentDomain.GetData(MyContainer.Tagname+"XMLDoc");
if EngUnitDoc <> null then
dim collection as System.Xml.XmlAttributeCollection;
collection = EngUnitDoc.SelectSingleNode("EngUnits/unit[@id='"+Me.Measurment+"']").Attributes;
Me.EngUnits =collection.GetNamedItem("text").Value;
me.accuracy =StringToReal(collection.GetNamedItem("accuracy").Value);
me.ValueOutDesc =collection.GetNamedItem("Description").Value;
'setGood(me.accuracy);
else
Me.EngUnits ="error";
me.accuracy =0.0001;
me.ValueOutDesc = "ERROR: XMLDoc  ";
endif;


вот собственно и все :) 
xml файл использовал примерно такой (не знаю как сюда его вставить в связи с чем заменил < на *  )



*?xml version="1.0" encoding="utf-8"?*
*EngUnits*
  *unit id="1234567" Description="xxxxxxxx" text="emu" accuracy="0.0001"**/unit*
  *unit id="1137" Description="xxxxx" text="xxxx" accuracy="0.001"**/unit*
*/EngUnits*





P.S.: текст этот писал скорее для себя на будущее, в связи с чем все очень кратко. Подробности смотреть в msdn :)
EngUnits/unit[@id='"+Me.Measurment+"']" - XSLT в Гугле или msdn

понедельник, 21 июня 2010 г.

Wonderware TrendClient 3.1sp2patch1

Wonderware AS31_SP2P01 ! TrendClient начал работать почти нормально !
Теперь с вот такой скрипт добавляет перо на тренд и настраивает его ... раньше это все тоже было но не работало или работало не так как хотелось бы :)




'Добавление нового пера
TrendClient1.AddPen(PenName,Expression,HistorySource,HistoryTagName,HistoryTagType);
TrendClient1.Pen.TrendType = 1;
TrendClient1.Pen.TrendHi = Max;
TrendClient1.Pen.TrendLo = Min;
TrendClient1.Pen.Units = Unit;
TrendClient1.Pen.Description = PenDescription;

TrendClient1.Pen.Width = PenWidth;


'если захочется больше перьев на графике то надо бы более красивую конструкцию ....


if TrendClient1.Pen.Index == 0 then TrendClient1.Pen.Color = System.Drawing.Color.FromName("Blue"); endif;

if TrendClient1.Pen.Index == 1 then TrendClient1.Pen.Color = System.Drawing.Color.FromName("Green"); endif;
if TrendClient1.Pen.Index == 2 then TrendClient1.Pen.Color = System.Drawing.Color.FromName("Red"); endif;



Теперь получилось сделать графический символ  шаблон со всеми нужными кнопочками масштабирования и т.д. и т.п. и использовать его везде где нужно ! и даже добавлять нужное количество перьев динамически :)

P.S.: Цвет второго и последующих перьев лучше задавать вручную т.к. первое перо по умолчанию синее , а вот последующие цвета выбираются случайно и они всегда разные ..... могут визуально совпадать с первым (я понимаю что теоретически  цвет не совпадает но на практике глаз не различает их)