Много описывать не буду. Может кому пригодится нативный пинг на Эрланге. Ничего мудрого тут нет, обычный парсинг вывода результатов ping на stdout.
Под windows парсер не делал, т.к. пока он мне не нужен, но предусмотрел, потому что потом понадобится. Все. Пользуйтесь.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | %% %% OS:Ping result parser for UNIX systems %% ping_parser_unix(PingOut, Count) -> ErrorCode = lists:last(PingOut), case ErrorCode of "0" -> begin TitlOut = lists:sublist(PingOut, 1, 1), IPAddr = element(2, list_to_tuple(string:tokens(lists:flatten(TitlOut), " "))), DtlOut = lists:sublist(PingOut, 2, Count), ExtrTm = fun(E) -> Str = element(4, list_to_tuple(string:tokens(element(2, list_to_tuple(string:tokens(E, ":"))), "="))), list_to_float(element(1, list_to_tuple(string:tokens(Str, " ")))) end, TmLst = [ExtrTm(E) || E <- DtlOut], AvgOut = lists:sublist(PingOut, length(PingOut)-2, 2), {PingInfo, PingAvg} = list_to_tuple(AvgOut), {A1,_,_,A2,_,A3,_,_,_,A4} = list_to_tuple(string:tokens(PingInfo, " ")), {Tranmd, Recvd, Loss, Time} = {A1, A2, A3, A4}, PingAvgLst = [list_to_float(X) || X <- string:tokens(element(4, list_to_tuple(string:tokens(PingAvg, " "))), "/")], {Min, Avg, Max, MDev} = list_to_tuple(PingAvgLst), {IPAddr, TmLst, {Tranmd, Recvd, Loss, Time}, {Min, Avg, Max, MDev}} end; "1" -> {error, 1, destination_host_unreachable}; "2" -> {error, 2, invalid_argument} end. %% %% OS:Ping result parser for WINDOWS systems %% %% Pinging 10.10.10.1 with 32 bytes of data: %% %% Reply from 10.10.10.1: bytes=32 time<1ms TTL=255 %% Reply from 10.10.10.1: bytes=32 time<1ms TTL=255 %% %% Ping statistics for 10.10.10.1: %% Packets: Sent = 2, Received = 2, Lost = 0 (0% loss), %% Approximate round trip times in milli-seconds: %% Minimum = 0ms, Maximum = 0ms, Average = 0ms ping_parser_win(PingOut, Count) -> {error, not_relised}. ping(Parser, Host, Count) -> Cmd = io_lib:format("ping -c ~w ~ts; echo $?", [Count, Host]), Parser(string:tokens(os:cmd(Cmd), "\n"), Count). ping(Host, Count) -> {OSType, OSName} = os:type(), case OSType of unix -> ping({?MODULE, ping_parser_unix}, Host, Count); win32 -> ping({?MODULE, ping_parser_win}, Host, Count); _ -> {error, not_relised} end. |
Результат вызова:
2> libping:ping(10.10.10.1, 5).
* 1: syntax error before: 10.1
2> libping:ping("10.10.10.1", 5).
{"10.10.10.1",
[9.91,0.256,0.259,0.252,0.29],
{"5","5","0%","3999ms"},
{0.252,2.193,9.912,3.859}}
3>
При разборе одного бинарного файла потребовалось преобразовать строки, находящиеся в нем из cp1251 в utf-8. Штатных средств в эрланге не обнаружил. Использовать iconv для этих целей показалось слишком «дорогим» удовольствием. Поэтому вспомнил как делал такую перекодировку лет так 10 назад табличным способом на паскале. Получилось просто и очень нативно: Continue reading »
Перевел Главу 16 из книги Джо Армстронга «Programming Erlang». В этой главе рассматривается gen_server.
Предложил идею перевода книги на jabber-конференции erlang@conference.jabber.ru и получил активную поддержку. Создали группу в GoogleGroups http://groups.google.ru/group/Russian-Armstrong-Erlang там теперь вся работа и ведется совместными усилиями.
Критика принимается.
Начал, недавно, изучать Erlang. Весч! Для того чтобы вникнуть читаю книжку отца этого языка Джо Армстронга. Наткнулся там на интересную информацию об использовании файла .erlang. Сначала не придал этому значения, а оказалось, что штука полезная. Вот содержимое моего файла .erlang:
io:format("Информация из файла .erlang в каталоге ~p~n" , [element(2,file:get_cwd())]). %% Edit to the directory where you store your code c:cd("c:/Prj/STMConfigServer/src"). io:format("Текущий каталог:~p~n" , [element(2,file:get_cwd())]). %% А тут можно запустить appmon, и наверно все что душе угодно appmon:start().
Вот такая вот штуковина. Забыл сказать, файл должен находится в каталоге bin Эрланга.
З.Ы. Почти перевел 16 главу книги Армстронга. Закончу, выложу сюда же. Вот только вопрос о правах бодает. Думаю, может написать Армстронгу и спросить разрешения? А может ну их всех? Если вдруг сюда кто-нить зайдет и прочитает это, посоветуйте как поступить.
P.S. После написание сей заметки обнаружил описание как правильно установить Эрланг на Windows комп – чтитать тут.
В новом релизе введены несколько новых возможностей, исправлены ошибки и сделаны некоторые доработки.
Новые возможности:
- Добавлены пути поиска в среду разработки и монитор. Перечень путей поиска находится в настройках, в ветке «Пути поиска». Теперь, в путях поиска, вы можете перечислить все папки, где находятся ваши документы, скрипты, звуки и т.д. При использовании некоторых функций, в том случае, если путь к файлу не указан, программа сама попытается обнаружить его, используя указанные пути поиска. Эту возможность так же поддерживают некоторые визуальные элементы схем, компоненты и модули. Есть возможность поиска в подкаталогах.
Функции: openDocument, checkDocument, soundAlarm, setCheckProjectEvent.
Элементы схем: Кнопка, Менеджер предупреждений.
Директивы препроцессинга: <?Sources … ?>.
Модули и компоненты: Менеджер предупреждений в редакторе и просмотрщике журналов журналов, Редактор и просмотрщик проектов (кроме групп проектов).
Данную возможность полностью поддерживает движок монитора.
Continue reading »
Приветствую всех.
Вчера закончилась выставка «ПТА Урал 2008″, было много интересного и конечно же все это повлияло на развитие STM Developer Suite. В ближайшем будущем мы будем рады представить вашему вниманию обновленную версию STM Developer Suite. На выставке были выявлены небольшие ошибочки в некоторых модулях. Работа над ними уже идет полным ходом. Многое исправим. Многое добавим. Пока что скажу только то, что изменения коснутся, в частности, механизма сценариев (скриптов) и не только его.
Следите за новостями – будет интересно!
Любое сравнение разного всегда имеет погрешности,
но если вы достаточно компетентны,
то добавите еще и свои (погрешности)
Итак, мысли по поводу плюсов и минусов технологии OPC (Ole for Process Control) и STM (Network Server TeleMetric).
На самом деле не корректно сравнивать технологию (OPC) и продукт (STM).
Корректнее сравнивать реализации систем на технологии (OPC) с продуктами STM.
OPC – это технология, позволяющая на выходе “OPC сервера” получить стандартный интерфейс для получения данных от контроллера.
“OPC сервер” – это программа – транслятор протокола обмена конкретного устройства (серии устройств) в протокол по спецификации OPC Foundation, иначе говоря конвертор аппаратно – зависимого представления данных в контролере (контролерах) в абстрактное представление данных (“tag”).
В состав семейства продуктов STM включена технология OPC как средство получения доступа к различным контроллерам.
В продуктах STM связь с конкретными устройствами обеспечивают “драйвера”. Они конвертируют аппаратно – зависимое представление данных в контролере (контролерах) в тематическое представление данных (расход прямой, расход обратный, напряжение… – иначе говоря обеспечивают на выходе драйвера объектное представление данных, “tag” является частным случаем представления данных в таком драйвере). Кроме того, драйвера, как правило, осуществляют промежуточные вычисления (например расчет средних значений, времени отключения/простоя или включения/работы и т.п.), авто синхронизацию архивов драйвера с устройствами и другие необходимые для формирования объектной модели данных процедуры и действия). Драйвера обеспечивают реконнекты по резервным маршрутам и многие другие необходимые функции.
Большая часть SCADA систем, если не все, используют технологию OPC как основу для работы с контроллерами (PLC). В связи с этим можно смело выделить ряд особенностей:
- OPC – это надстройка над COM/DCOM, а значит, что работает только под управлением Microsoft Windows. Реализации под другие ОС скорее “экспериментальны”.
- COM – технология того же Microsoft и под той же Windows, да еще и локальная.
- DCOM – расширение COM для работы по сети.
- COM/DCOM – работает только в сети Microsoft Windows. Примеров реально работающих c COM/DCOM под другие ОС я не нашел.
- За счет того, что передача данных посредством COM/DCOM замаскирована внутри библиотек и сервисов (так называемый МАРШАЛИНГ), реализующих COM/DCOM, она происходит очень медленно, что становится дорогим, а при больших масштабах – очень дорогим решением.
При сборке предыдущего релиза была допущена ошибка, из-за чего STM Monitor не открывал схемы и вываливался с ошибкой. Пакет был пересобран. Текущая версия 1.0.8.701.
В новой версии пакета произошли некоторые изменения и дополнения. Continue reading »
1. Изменился формат процедур журнала: DataRequest, SetUserName и AddEvent. Был упразднен параметр elementID. Теперь процедуры имеют вид:
• TSTMEvent::DataRequest
• TSTMEvent::SetUserName UserName
• TSTMEvent::AddEvent Params
2. Добавились процедуры:
• checkDocument ?fileName? (Квитирования документа. Если имя файла не указано, то квитируется документ, из которого была вызвана процедура.)
• TProjectManager::checkProject reason (Квитирование текущего проекта. Параметр указывает причину квитирования. При вызове данной процедуры, будут вызваны
Недавно у одного из заказчиков возникла задача, при решении которой потребовалось определять принадлежит ли схема проекту или нет. В связи с тем, что внутренние механизмы STMDS не имеют (скорее всего такая возможность будет встроена в будущих версиях) функций доступа к такой информации, нам придется применить «военную хитрость».
Для решения такой, не самой сложной, задачки воспользуемся пакетом xml из поставки ActiveState Tcl/Tk. Вы спросите почему xml? И правильно сделаете. Тем не менее ответ на этот вопрос очевиден. Файлы проектов в среде STMDS ничто иное, как xml файлы. Continue reading »
Посмотрите на пример приведенный ниже и вам все станет понятно.


