пятница, 16 марта 2012 г.

вольный перевод текноута 825

Давно я ничего не писал сюда .. буду исправляться :)

И Так …  
         В очередной раз столкнулся по работе с настройкой связи между платформами Wonderware Application Server и в частности с резервированием движков на онных платформах …. да и новый текноут по данной теме вышел Tech Note 825 Industrial Application Server Redundancy: Troubleshooting Guidelines. Попробую компактно и по русски  все что там описано законспектировать, без картинок и скоментариями …. картинки в оригинале смотреть  :)
(авторы оригинального текноута P. Karthikeyan and N. Khadikar)


  1. Отключаем UAC (Tech Note 772 ,Tech Note 733)
  2. Убеждаемся что Фаервол везде выключен
  3. Убеждаемся что версия .NET Framework на всех машинах одинаковая
  4. Проверяем пингами связь между резервируемыми машинами и между этими машинами и Галактикой.
    Пинговать по как по
    именам, так  и по IP адресам.
    IP
    адреса сверять с теми что в пингах по именам показывает и по ipconfig /all !
    Имена и IP в hosts файле (если мы  его вместо/вместе DNS используем C:\Windows\System32\drivers\etc\hosts) должны совпадать с именами и адресами на машинах (
    были случаи однако....)
  5. Отключить IPv6 для используемых подключений (пишут что иногда помогает :) )
  6. Проверить порядок привязки сетевых карт в настройках Windows.
    Основная сеть по которой платформы общаются обязательно первой, линк между резервными после основной или дальше.
    Tech Note 773 и Tech Note 368
  7. Проверяем настройки DCOM чтобы убедится что он включен :)
    как это делать в Windows 2000 и 2003 читаем в
    Tech Note 461
    В 7ке и 2008 порядок действий такой
    • открываем  Component Services. (Control Panel\All Control Panel Items\Administrative Tools)
    • Выбираем в дереве компьютор для которого собираемся настраивать DCOM (обычно он там 1 и называется My Computer) и правой кнопкой мышки по нему щелкаем :)
    • в выпвшей меню выбераем Properties
    • далее вкладку  Default Properties
    • если не установлена то ставим галочку Enable Distributed COM on the computer. Authentication Level = Connect. Impersonation Level = Identify. Остальные галочки “uncheck”....
    • OK
  8. Проверяем разрешения для папок
    C:\Program Files\ArchestrA\Framework\Bin\CheckPointer
    C:\Program Files\ArchestrA\Framework\Bin\GalaxyData
    C:\Program Files\ArchestrA\Framework\Bin\GlobalDataCache
    Подробнее в
    Tech Note 461 (постараюсь описать развернуто позже)
  9. Убеждаемся что simple file sharing выключен.
    Проверить можно в любой папке через меню
    Folder OptionsView tab → Advanced settings. В ХР убрать галочку Use simple file sharing (Recommended), в Vista|7 убрать Use Sharing Wizard (Recommended).
  10. Версия Application Server должна быть одинаковая на обоих машинах используемых для резервирования.Тест: Первый деплой резервируемого движка не каскадом и с отмеченной галочкой Include Redundant Partner. Проверить резервирование и только после этого деплоить объекты.
  11. Проверяем конфигурацию платформы
    • configuration → General → Network address используем имя ноды а не IP адрес
    • configuration → General → Redundancy Message Channel IP address вписан собственный IP адрес RMC сети а не адрес второй машины (было и сам путал :) )
  12. Проверяем конфигурацию движка
    • галочка Restart the engine when it fails должна быть убрана
    • время скана - Scan Period выставляем болше стандартного и делаем его разным на разных движках для того чтобы они не падали одновременно
    • Если платформы друг друга видят но есть проблеммы с резервированием рекомендуется увеличить значение configuration → Redundancy → Maximum time to discover partners до 30000
    • После сохранения изменений проверьте разрешилась ли проблема … передеплойте :)
    • При большом количестве объектов на движке (несколько сотен штук или сложных просто очень.... ) необходимо распределять нагрузку. Создайте новые движки и перенесите некоторые объекты на них для равномерного распределения нагрузки
  13. Используйте Object Viewer чтобы проверить работу резервирования. Проверяйте следующие атрибуты:
    • Redundancy.Status
    • Redundancy.PartnerStatus
    • Redundancy.Identity
    • Platform Engine.Objects (опционально но полезно)

вторник, 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.: Цвет второго и последующих перьев лучше задавать вручную т.к. первое перо по умолчанию синее , а вот последующие цвета выбираются случайно и они всегда разные ..... могут визуально совпадать с первым (я понимаю что теоретически  цвет не совпадает но на практике глаз не различает их)

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

настройка OPC windows 2003 ... еще раз и очень кратко :)

1. Установить OPC сервер :)
2. Добавить 135 порт в исключения фаервола для тех компьютеров (дипазон адресов подсеть или все подряд) которые будут клиентами ... обычно уже добавлен для всех , запись DCOM
3. Добавить OPCEnum.exe в исключения фаервола для тех же самых адресов
4. Добавить exe-шник OPC сервера в исключения фаервола с аналогичными предыдущим пунктам настройками
5. Аналогично открыть 139 порт (File and Printer Shar... шары должно быть видно) и можно пинг разрешить :)

6. Создать на сервере и клиентах одинакового пользователя (не гостя) с одинаковым паролем или использовать доменного пользователя
7. Запустить конфигурацию DCOM (dcomcnfg) , найти там наш свежеустановленный сервер и добавить нашего нового пользователя в разрешения на запуск и выполнение (2 верхних)

.... вот вроде и все
на клиенте фаервол ругнется сам и мы разрешим клиенту лезть в сеть , а если не ругнется то провести настройки ему вручную на доступ в сеть для клиента ... ну и 2-3й пункт ... хотя не пробовал ... может и без них работает ?

P.S.:  извините но скриншоты снимать лениво , их в разных других руководствах навалом :-p

можно смотреть здесь http://www.opcactivex.com/Support/Tutorials/DCOM_Tutorial_-_Configuring_th/dcom_tutorial_-_configuring_th.html

четверг, 22 октября 2009 г.

.Net Control-ы для Intouch 10 +

Графические символы дбавленые в 10ом интаче вещь красивая но с ними добавили возможность использования .Net Control! На официальном форуме даже есть рекомендации по их использованию :)
Цитата с оф. форума:
Rickard Norin
I am not aware of any official guidelies. The best thing for you to do is probably to familiarize with the QuickScript.NET scripting language and the ArchestrA datatypes.
These impose a few limitations. The most obvious that come to mind are:


Scripting is not capable of catching exceptions. Catch exceptions internally and expose possible exception messages as a string property of the class.


Scripting does not fare well with some data relationships. For instance, it is not possible to do recusive script calls to traverse a hiearchical structure as the nodes collection of a TreeView. The parsing of such data has to be built into the control.


Scripting is, as far as I know, incapable of generics. This means that you have to use explicit datatypes as avoid properties of types like ObservableCollection or List.

As far as I know, only controls inheriting from System.Windows.Forms.Control namespace are valid. Using Windows Presentation Foundation (System.Windows.Controls namespace) is probably out of the picture.

Other than that, I think that most things are ok. As a scripting language as opposed to programming language (if there is such a distinction =), I find QuickScript.NET very capable. There is a very nice data binding and event subscription implementation for controls.

You can also import %WinDir%\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll and see what you can do with the standard controls out of the box. This will give you some ideas of how controls behave in the ArchestrA symbols.


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

Например недавно писал потомка TreeView для меню в Интаче... очень красиво получилось ... опишу в следующий раз наверное