Рефераты - Афоризмы - Словари
Русские, белорусские и английские сочинения
Русские и белорусские изложения

Разработка клиентского интерфейса для мониторинга состояния устройств в промышленных сетях передачи данных

Работа из раздела: «Программирование, компьютеры и кибернетика»

/

/

Государственное образовательное учреждение

САНКТ - ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Факультет переподготовки специалистов

Дипломная работа по специальности

Специальность № 230101

«Вычислительные машины, комплексы, системы и сети»

«Разработка клиентского интерфейса для мониторинга состояния устройств в промышленных сетях передачи данных»

«Допустить к защите»

Научный руководитель ФПС,

профессор, д. т. н. А.М. Яшин

Слушатель В.А. Арутюнов

Руководитель

доцент, к. т. н. Д.К. Державин

Санкт - Петербург

2010 год

Оглавление

ВВЕДЕНИЕ

1. ФОРМУЛИРОВКА ПОСТАВЛЕННОЙ ЗАДАЧИ И НЕОБХОДИМЫЕ ПОЯСНЕНИЯ К НЕЙ

ГЛАВА 2. ТЕОРЕТИЧЕСКИЙ АНАЛИЗ ВЫБРАННОГО СПОСОБА РЕШЕНИЯ ЗАДАЧИ

ГЛАВА 3. ОПИСАНИЕ РАБОТЫ СИСТЕМЫ

3.1 Основные компоненты системы

3.2 Диспетчеризация и управление

3.2.1 Концепции систем

3.2.2 Основные задачи

3.3 АСУ ТП

3.3.1 Распределенная система управления

3.4 Человеко-машинный интерфейс

3.5 OPC

3.6 Интеграция

3.7 Экскурс в идеи COM/DCOM

3.7.1 Удалённые объекты

3.8 OPC-стандарты

3.9 OPC-сервер

3.10 OPC-клиент

3.11 Инструментарий для создания OPC-серверов и OPC-клиентов

3.12 OPC и Интеграция

3.13 ОСОБЕННОСТИ ВНЕДРЕНИЯ OPC-стандарта

3.14 Перспективы развития OPC-технологии

3.16 Web сервер Apache

3.17 PHP

3.18 MySQL

3.19 Язык программирования Python

3.20 ХАРАКТЕРИСТИКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

3.20.1 Утилита диагностики сети «Pinger»

3.20.2 Opc_client

3.20.3 Веб-интерфейс

ГЛАВА 4. ОПИСАНИЕ РЕЗУЛЬТАТОВ РАБОТЫ СИСТЕМЫ

ГЛАВА 5. ДОКУМЕНТАЦИЯ

5.1 Техническое руководство по пользованию веб-интерфейсом

5.2Техническое руководство для администраторов, обслуживающих OPC-клиент и веб-сервер

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

ПРИЛОЖЕНИЕ

Приложение 1

Приложение 2

Приложение 3

ВВЕДЕНИЕ

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

Создание крупных производственных комплексов привело не только к существенному увеличению производства, но и к заметному росту объемов информации.

Современные предприятия стали активно применять современные средства связи, такие как факс, электронная почта, мобильная связь, электронный документооборот, что увеличивает скорость обработки информации.

Но и это оказалось недостаточным. Стало необходимостью, чтобы поступление информации было оптимизированным. Многое стало зависеть от правильно построенных информационных систем конкретного предприятия.

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

Как показывает практика промышленного производства в нашей стране и за рубежом, не редко возникает необходимость мониторинга работы оборудования и персонала с целью оптимизации затрат цикла производства.

Совершенно очевидно, что при поступлении контрольной информации появляется возможность своевременно и полноценно реализовывать решения по управлению производственным процессом, в т.ч. отдельными производственными мощностями, персоналом и, как следствие - всем производственным циклом.

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

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

1. ФОРМУЛИРОВКА ПОСТАВЛЕННОЙ ЗАДАЧИ И НЕОБХОДИМЫЕ ПОЯСНЕНИЯ К НЕЙ

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

К сожалению универсального апробированного способа решения поставленной задачи не существует.

В настоящее время на различных производствах используются различные способы решения данной задачи.

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

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

Третий способ: использование SCADA - обозначающая комплекс диспетчерского контроля и сбора данных для целей объективного (доказательного) управления современным производством; данное понятие реализуется практически через системы контроля и управления технологическими процессами с применением ЭВМ.

Целесообразнее всего выбрать третий способ контроля и сбора данных, так как он является наиболее современным и эффективным.

ГЛАВА 2. ТЕОРЕТИЧЕСКИЙ АНАЛИЗ ВЫБРАННОГО СПОСОБА РЕШЕНИЯ ЗАДАЧИ

Задача данного дипломного проекта - создать механизм, способный осуществлять контроль за работой оборудования в цехе. Для наглядной иллюстрации этого - нами сконструирован «виртуальный участок», состоящий из трех единиц оборудования типа «Карусель», «Токарный станок» и «Молот». Это позволит нам компенсировать невозможность фактической демонстрации в реальных производственных условиях.

Итак, в конструкцию каждого оборудования необходимо внедрить пульт, с помощью которого будет осуществляться сбор данных. Данные с пультов должны доставляться на OPC сервер.

Данные могут передаваться по разным интерфейсам передачи данных, например, RS232 или Ethertnet . Для сбора данных необходим OPC сервер.

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

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

ГЛАВА 3. ОПИСАНИЕ РАБОТЫ СИСТЕМЫ

Для реализации выбранного нами способа мы применяются системы SCADA - аббревиатура (от анг. Supervisory Control And Data Acquisition).

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

· Технологические процессы (ТП) включают в себя - производство и выработку энергии, конструирование, переработку. ТП может протекать в непрерывном, пакетном, периодическом или дискретном режимах.

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

· Процессы в сфере обслуживания (обслуживающие процессы - ОП) имеют как частную, так и общественную стороны - здания, аэропорты, корабли и космические станции. Они контролируют и управляют HVAC HVAC, аббревиатура от англ. Heating, Ventilation, & Air Conditioning -- Теплоснабжение, Вентиляция и Кондиционирование воздуха., доступом и потреблением энергии.

3.1 Основные компоненты системы

SCADA-система обычно содержит следующие подсистемы:

· Человеко-машинный интерфейс (HMI, англ. Human Machine Interface) - инструмент, который представляет данные о ходе процесса человеку-оператору, что позволяет последнему аудио-визуально представлять процесс, контролировать и управлять им.

· Диспетчерская система - собирает данные о процессе и отправляет команды процессу (управление).

· Абонентский оконечный блок, либо УСО (RTU, англ. Remote Terminal Unit), подсоединяемый к датчикам процесса. Преобразует сигнал с датчика в цифровой код и отправляет данные в диспетчерскую службу.

· Программируемый Логический Контроллер (PLC, англ. Programmable Logic Controller) используется как полевое устройство из-за экономичности, универсальности и гибкости нежели RTU специального назначения.

· Коммуникационная инфраструктура для соединения диспетчерской системы с RTU.

3.2 Диспетчеризация и управление

В некоторых отраслях промышленности, существует значительная неопределенность в различиях между SCADA системами и распределенными системами управления (DCS, от англ. - Disributed Control System - распространенная система управления).

В общем, понятие SCADA обычно применяется к системе, которая координирует, но не управляет процессами в режиме реального времени. Дискуссия по управлению в реальном времени затруднена усовершенствованием телекоммуникационных технологий. Это дает надежный, с малыми задержками, высокоскоростной обмен данными на большие расстояния. Большинство различий между SCADA и DCS установлено человеком и обычно может игнорироваться. По мере развития инфраструктуры коммуникации различия между SCADA и DCS стираются.

3.2.1 Концепции систем

Термин SCADA обычно относится к централизованным системам контроля и управления всей системой, или комплексами систем, расположенных на больших областях (между промышленной установкой и потребителем). Большинство управляющих воздействий выполняется автоматически RTU и PLC. Первостепенные функции управления обычно ограничиваются по уровням отмены или контролирующему вмешательству. Например, PLC может управлять потоком охлаждающей воды внутри части производственного процесса, а SCADA система может позволить операторам изменять установку для потока, и установить условия сигнализации, такие как потеря потока и высокая температура, которые должны быть отображены и записаны. Цикл управления с обратной связью проходит через RTU или PLC, в то время как SCADA система контролирует полное выполнение цикла.

Сбор данных начинается в RTU или на уровне PLC и включает показания измерительного прибор и отчеты о состоянии оборудования, соединенного со SCADA, по мере надобности. Далее данные собираются и форматируются таким способом, чтобы оператор диспетчерской, используя HMI мог принять контролирующие решения - корректировать или прервать стандартное управление RTU (PLC). Данные могут также быть помещены в историю, часто основанную на СУБД, для построения трендов и другой аналитической обработки накопленных данных.

Системы SCADA обычно оснащаются распределенной базой данных, часто называемой базой тэгов. Эта база содержит элементы данных, названные тэгами или точками. Точка представляет собой единичный ввод или вывод, значение которого контролируют или регулируют в системе. Точки могут быть или ”hard” или ”soft”. Аппаратная (”hard”) точка представляет собой фактически ввод или вывод в пределах системы, в то время как точка ”soft” - результат математических и логических операций с другими точками. (Большинство реализаций систем снимает концептуальное различие между ”soft” и ”hard” точками, делая каждое свойство в выражении точкой ”soft”, которая может, в самом простом случае, равняться единичной аппаратной точке). Точки обычно сохраняются как пары значения - штамп времени: значение, и штамп времени - то время, когда событие было зарегистрировано или вычислено. Серия пар значение - штамп времени представляет собой хронологию данной точки. Также распространено сохранение дополнительных метаданных с тэгами, такими как путь до полевого устройства или регистра PLC, комментарии во время разработки, и сигнальная информация.

3.2.2 Основные задачи

Scada-системы решают ряд задач:

· Обмен данными с УСО (устройства связи с объектом, то есть с промышленными контроллерами и платами ввода/вывода) в реальном времени через драйверы.

· Обработка информации в реальном времени.

· Отображение информации на экране монитора в понятной для человека форме.

· Ведение базы данных реального времени с технологической информацией.

· Аварийная сигнализация и управление тревожными сообщениями.

· Подготовка и генерирование отчетов о ходе технологического процесса.

· Осуществление сетевого взаимодействия между SCADA ПК.

· Обеспечение связи с внешними приложениями (СУБД, электронные таблицы, текстовые процессоры и т.д.) В системе управления предприятием такими приложениями чаще всего являются приложения, относимые к уровню MES MES (сокр. от англ. Manufacturing Execution System) -- производственная исполнительная система. Системы такого класса решают задачи синхронизации, координируют, анализируют и оптимизируют выпуск продукции в рамках какого-либо производства..

SCADA-системы позволяют разрабатывать АСУ ТП в клиент-серверной или распределенной архитектуре.

Иногда SCADA-системы комплектуются дополнительным ПО для программирования промышленных контроллеров. Такие SCADA-системы называются интегрированными и к ним добавляется термин SoftLogic.

Термин SCADA имеет двоякое толкование. Наиболее распространенное понимание SCADA как приложение, то есть программного комплекса, обеспечивающего выполнение указанных функций, а также инструментальных средств для разработки этого программного обеспечения. Однако, часто под SCADA-системой подразумевают программно-аппаратный комплекс. Подобное понимание термина SCADA более характерно для раздела телеметрия Телеметрия (телеизмерение) -- совокупность технологий, позволяющая производить удалённые измерения и сбор информации для предоставления оператору или пользователю, составная часть телемеханики. Для сбора данных обычно используют либо датчики телеметрии (с возможностью работы в телеметрических системах, то есть специальным встроенным модулем связи), либо устройства связи с объектом, к которым подключаются обычные датчики..

Термин SCADA эволюционировал вместе с развитием технологий автоматизации и управления технологическими процессами. В 80-е годы под SCADA-системами чаше понимали программно-аппаратные комплексы сбора данных реального времени. С 90-х годов термин SCADA больше используется для обозначений только программной части человеко-машинного интерфейса АСУ ТП.

3.3 АСУ ТП

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

3.3.1 Распределенная система управления

Распределенная система управления (РСУ, англ. Distributed Control System, DCS) - система управления технологическим процессом, характеризующаяся построением распределенной системы ввода вывода и децентрализацией обработки данных.

Распределенная система управления применяется для управления непрерывными и гибридными технологическими процессами (с другой стороны, сфера применения распределенной системы управления этим не ограничена). К непрерывным процессам можно отнести те, которые должны проходить днями и ночами, месяцами и даже годами, при этом останов процесса, даже кратковременный, может привести к порче изготавливаемой продукции, поломке технологического оборудования и даже несчастным случаям. Классическим примером непрерывного процесса является изготовление стекла в стекловаренной печи.

Сферы применения распределенной системы управления многочисленны:

1. Энергетическое машиностроение.

2. Химия и нефтехимия.

3. Нефтепереработка и нефтедобыча.

4. Стекольная промышленность.

5. Пищевая промышленность: молочная, сахарная, пивная.

6. Газодобыча и газопереработка.

7. Металлургия.

8. Энергоснабжение и т.д.

Требования к современной распределенной системе управления:

1. Отказоустойчивость и безопасность.

2. Простота разработки и конфигурирования.

3. Поддержка территориально распределенной архитектуры.

4. Единая конфигурационная база данных.

5. Развитый человеко-машинный интерфейс.

3.4 Человеко-машинный интерфейс

Человеко-машинный интерфейс (ЧМИ или HMI) - широкое понятие, охватывающие инженерные решения, обеспечивающие взаимодейсвие оператора с управляемыми им машинами.

Создание систем человеко-машинного интерфейса тесно связано с эргономикой, но не тождественно ей. Проектирование ЧМИ включает в себя создание рабочего места: кресла, стола, пульта управления, размещения приборов и органов управления, освещение рабочего места, а, возможно, и микроклимат.

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

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

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

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

Немаловажным моментом использования данного программного комплекса является «дружественный интерфейс», который достигается путем генерирования веб-страницы предлагаемым нами модернизированным клиентом на основе OpenOPC.

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

3.5 OPC

OPC -- это аббревиатура от OLE OLE (англ. Object Linking and Embedding, произносится как oh-lay [олэй]) -- технология связывания и внедрения объектов в другие документы и объекты, разработанные корпорацией Майкрософт.

OLE позволяет передавать часть работы от одной программы редактирования к другой и возвращать результаты назад. Например, установленная на персональном компьютере издательская система может послать некий текст на обработку в текстовый редактор, либо некоторое изображение в редактор изображений с помощью OLE-технологии.

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

OLE используется при обработке составных документов (англ. compound documents), может быть использована при передаче данных между различными несвязанными между собой системами посредством интерфейса переноса (англ. drag-and-drop), а также при выполнении операций с буфером обмена.

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

Однако, технология OLE использует архитектуру «толстого клиента», то есть сетевой ПК с избыточными вычислительными ресурсами.

Это означает, что тип файла либо программа, которую пытаются внедрить, должна присутствовать на машине клиента. Например, если OLE оперирует таблицами Microsoft Excel, то программа Excel должна быть инсталлирована на машине пользователя.

История технологии следующая. OLE 1.0 был выпущен в 1990 году на основе технологии DDE (Dynamic Data Exchange), использовавшейся в более ранних версиях операционной системы Microsoft Windows.

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

OLE сервера и клиенты взаимодействуют с системными библиотеками при помощи таблиц виртуальных функций (англ. virtual function tables, VTBL). Эти таблицы содержат указатели на функции, которые системная библиотека может использовать для взаимодействия с сервером или клиентом. Библиотеки OLESVR.DLL (на сервере) и OLECLI.DLL (на клиенте) первоначально были разработаны для взаимодействия между собой с помощью сообщения WM_DDE_EXECUTE, разработанного операционной системой.

OLE 1.1 позднее развился в архитектуру COM (component object model) для работы с компонентами программного обеспечения. Позднее архитектура COM была преобразована и стала называться DCOM.

Когда объект OLE помещен в буфер обмена информацией, он сохраняется в оригинальных форматах Windows (таких как bitmap или metafile), а также сохраняется в своём собственном формате. Собственный формат позволяет поддерживающей OLE программе внедрить порцию другого документа, скопированного в буфер, и сохранить её в документе пользователя.

Следующим эволюционным шагом стал OLE 2.0, сохранивший те же цели и задачи, что и предыдущая версия. Но OLE 2.0 стал надстройкой над архитектурой COM вместо использования VTBL. Новыми особенностями стали автоматизация технологии drag-and-drop, in-place activation и structured storage.

В 1996 году Microsoft переименовала технологию OLE 2.0 в ActiveX. Были представлены элементы управления ActiveX, ActiveX документы и технология Active Scripting. Эта версия OLE в основном используется веб-дизайнерами для вставки в страницы мультимедийных данных. // См.: http://ru.wikipedia.org/wiki/Object_Linking_and_Embedding for Process Control, или OLE для управления процессами. Ключевыми словами для понимания изложенного являются технология Microsoft OLE и Интеграция; точнее, «означаемое» под термином OLE понятие COM COM (англ. Component Object Model -- Объектная Модель Компонентов; произносится как [ком]) -- это технологический стандарт от компании Microsoft, предназначенный для создания программного обеспечения на основе взаимодействующих распределённых компонентов, каждый из которых может использоваться во многих программах одновременно. Стандарт воплощает в себе идеи полиморфизма и инкапсуляции объектно-ориентированного программирования. Стандарт COM мог бы быть универсальным и платформо-независимым, но закрепился в основном на операционных системах семейства Microsoft Windows. В современных версиях Windows COM используется очень широко. На основе COM были созданы технологии: Microsoft OLE Automation, ActiveX, DCOM, COM+, а также XPCOM. // См.: http://ru.wikipedia.org/wiki/Component_Object_Model.

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

1) «Автоматизация» - под этим термином следует понимать, собственно автоматизацию (например, производства), а также и OLE-автоматизацию. Кроме первых двух непосредственных значений, «автоматизация» это ещё и Интерфейс, на определении которого мы остановимся ниже.

2) «Интерфейс» - это, разумеется, интерфейс в общепринятых смыслах (их несколько). Также под этим термином следует понимать интерфейсы объектов COM и еще интерфейсы серверов (например, интерфейс автоматизации).

Сравнительно недавно, в 1994 г., под эгидой Microsoft была создана организация OPC Foundation См. источник: http://www.opcfoundation.org. Как определяет сама OPC Foundation, её цель -- разработка и поддержка открытых промышленных стандартов, регламентирующих методы обмена данными в режиме реального времени между клиентами на базе ПК и ОС Microsoft.

Сейчас организация насчитывает более 270 членов, включая почти всех ведущих поставщиков контрольно-измерительного и управляющего оборудования для АСУ ТП. Достаточно назвать такие фирмы, как Siemens, Schneider Automation, Rockwell Software, Wonderware, Intellution, Ci Technologies.

3.6 Интеграция

Что следует понимать под Интеграцией!? Предположим, в результате огромных усилий программистов создана сложная комплексная система, охватывающая автоматизацию на всех уровнях предприятия, начиная от самого нижнего -- управления датчиками и исполнительными механизмами -- и заканчивая уровнем управления предприятием, вплоть до представления обобщенных данных завода у директора.

Реализована ли в данном случае концепция интеграции? В общем случае нет. Здесь интеграция подразумевает не единую глобальную систему как таковую, а прежде всего взаимодействие всех уровней ПО между собой (разумеется, это не исключает объединение их в цельную систему).

Фактически, речь идет о том, что различные программные системы, созданные с помощью различных средств, установленных на различных платформах, работающих на разных компьютерах, умеют «договариваться». То есть они знают, как запросить друг у друга данные и как послать друг другу «указания». По большому счету, интеграция сводится к конфигурированию «высоких договаривающихся сторон».

Для того чтобы «договориться», необходимо установить общий язык. И этот язык должны принимать хотя бы де-факто, а лучше «де-юре» все программные участники интеграции.

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

3.7 Экскурс в идеи COM/DCOM

Не осталась в стороне от этого процесса и компания Microsoft. Как было сказано ниже (см. сноску №5), COM -- Component Object Model (модель составных объектов) -- и ее сетевое расширение DCOM -- Distributed COM (распределенная COM) -- это технология, введённая первоначально Microsoft для интеграции различных офисных приложений в Windows. Интеграция подразумевала использование объектов одного приложения, например, таблицы Excel, в другом приложении, например, в редакторе Word. Все это известно под аббревиатурой OLE (см. сноску №4). Начиная с версии OLE 2.0 в ее основу была положена модель COM.

Первоначально название COM не было обнародовано; но с течением времени стандарт COM был включён и был использован во всех вариантах Windows 9.x/NT/CE и, следовательно, стал широко известен в профессиональной среде.

Достаточно упомянуть такие её производные, как ActiveX (OLE-автоматизация) или OLE DB, не говоря уже о самой офисной OLE. Эта технология все больше и больше увлекала Microsoft. И вот в Windows 2000 к COM добавляются некоторые компоненты (транзакции, безопасность, очереди и др.), она преобразовывается в COM+ и объявляется главной агглютинирующей технологией программирования в архитектуре DNA (Distributed interNet Application -- распределенные приложения Internet), а связанные с этим технологии объединяются под общим названием Component Services (сервисы компонентов).

Тем не менее, по проблеме реализации идей COM/DCOM выпущено достаточно информационных релизов и обзорных статей. Нам же, прежде всего, необходимо понять основные положения, связанные с нынешним состоянием технологии COM.

Модель COM оперирует объектами, очень похожими на объекты в объектно-ориентированных языках программирования типа Cи++. Но сама технология COM не является языком программирования. Она только регламентирует поведение своих объектов. Нам следует знать, что объект после создания предоставляет свою функциональность вызвавшему процессу, а после использования -- уничтожается.

Объекты COM передают свою функциональность через интерфейсы. Интерфейс в COM (не путать с тем, что обычно понимается под словом интерфейс) объединяет группу взаимосвязанных функций, предоставляемых объектом. Главная особенность интерфейсов COM заключается в их «публичности».

Интерфейсы используются после того, как они «опубликованы», и после этого их нельзя изменять никогда (имеются в виду прототипы и набор функций интерфейса, но не их реализация, которая вполне может изменяться). Если необходима новая версия интерфейса, издается новый интерфейс при сохранении старого. Этим обеспечивается совместимость при обновлении и модернизации объектов. И это первый шаг на пути к интеграции.

Именно интерфейс, вернее, указатель на него является тем, с чем работает вызывающий процесс (читай - программист). Объект может предоставлять несколько интерфейсов. Чтобы получить указатель на любой интерфейс, нужно воспользоваться функцией QueryInterface обязательного для всех COM-объектов интерфейса IUnknown.

Указатель на этот интерфейс передается инициирующему процессу при создании объекта.

Объект COM -- сторона пассивная. Он лишь передает через интерфейсы свои функции. В этом смысле употребляется термин COM-сервер. Запрашивающая программа, соответственно, называется COM-клиент. Но это не исключает того, что обе программы одновременно могут быть и COM-серверами, и COM-клиентами. Именно здесь ключ к пониманию того, что OPC-сервер может поставлять данные «по подписке», т. е. сам инициализировать обмен с OPC-клиентом при их обновлении.

Чтобы создать объект, нужно знать, где он находится. В Windows для этого используется регистрация объектов в системном реестре. И не только их. В реестре регистрируются также интерфейсы и кое-что другое. При этом каждый COM-предмет регистрации имеет уникальный в полном смысле этого слова идентификатор, называемый GUID (Globally Unique Identifier -- глобально уникальный идентификатор, иногда используется название UUID -- Universally Unique Identifier).

Присваивает идентификаторы своим COM-детищам их создатель, используя, например, программу GUIDGEN.EXE. Заметим также, что многие COM-объекты могут (а ActiveX обязаны) саморегистрироваться.

Регистрация делает доступной информацию о расположении объектов всем приложениям. И это второй шаг на пути к интеграции.

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

Даже на одном компьютере разные приложения Windows функционируют в своих собственных адресных пространствах. Это означает, что требуется кто-то для передачи вызовов из одного процесса в другой, так как даже простое создание или уничтожение объекта в другом адресном пространстве вовсе не тривиальное дело.

В COM эти и другие проблемы решаются с помощью специальных библиотек, таких, как OLE32.DLL. С одной стороны, эти библиотеки предоставляют функции для работы с объектами. Например, вызов CoCreateInstance создает объект. С другой стороны, активизируемые специальные компоненты выполняют диспетчерские функции, в частности, упаковку и передачу параметров вызываемым методам объектов (так называемый marshalling). В связи с этим упомянем два важных модуля: заместитель (proxy) и заглушка (stub). Они функционируют в адресном пространстве COM-клиента и COM-сервера соответственно и обеспечивают прозрачность вызовов. Механизм таков: COM-клиент вызывает функцию COM-интерфейса, которую ему подсовывает заместитель. Тот передает вызов заглушке через RPC. А заглушка вызывает функцию COM-сервера.

Для нас важно следующее. Первое -- поддерживающие компоненты автоматизируют работу с COM-объектами и делают ее прозрачной для COM-клиента (с его точки зрения объект находится в его собственном адресном пространстве). И это третий шаг на пути к интеграции.

И второе -- необходимость некоего программного обеспечения напоминает о том, что это в первую очередь технология Microsoft и добиться полной платформенной независимости не совсем просто.

3.7.1 Удалённые объекты

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

Еще одно существенное замечание. Сервис DCOM базируется на RPC. А это очень сильно затрудняет его использование в глобальных сетях. Требуются специальные программные компоненты и сложное сетевое администрирование, чтобы добиться взаимодействия через DCOM в глобальных сетях

3.7.2 Предоставление объектов

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

1) вы разрабатываете некий COM-объект, структурируете его и его интерфейсы GUID, снабжаете документацией (если это объект ActiveX, то официальная документация может и не понадобиться: на программном уровне общаться с распространяемым вами через Internet объектом будете только вы сами) и передаете в виде бинарного кода;

2) вы намечаете какую-либо проблему, изучаете её, возможно, организуете Фонд или Комитет (Foundation или Committee) и издаёте стандарт, подробно описывающий объекты, призванные решать данную проблему. Реализацию объекта Вы оставляете другим.

Использовать COM-объекты должны COM-клиенты. Но они могут быть разными, если мы говорим об интеграции. И они могут применять разные языки программирования, не исключая скриптовых, типа Visual Basic.

Технология COM предусматривает две возможности. Либо вы программируете на Cи++ и тогда описываете интерфейсы с помощью предоставляемых с документацией h- и c-файлов. В этом случае говорят об интерфейсе (не путать с COM-интерфейсами).

Либо вы используете для скриптовых запросов так называемую автоматизацию (OLE Automation). В этом случае для доступа к функциям объекта имеется специальный COM-интерфейс IDispatch, который COM-объект в этом случае обязан поддерживать, предоставляя интерфейс автоматизации (не путать с COM-интерфейсами).

При этом никакие компилируемые файлы не нужны, но нужна так называемая библиотека типов.

Программирование COM было бы нелегким занятием, если бы не предоставляемые средства. Процесс программирования упрощенно выглядит так. С помощью Cи-подобного языка MIDL (Microsoft Interface Definition Language -- язык определения интерфейсов) вы описываете интерфейсы.

С помощью компилятора MIDL.EXE они преобразовываются в описанные выше файлы, в том числе и в библиотеку типов. А далее используется библиотека ATL (Active Template Library - библиотека активных шаблонов), «умеющая» интерпретировать эти файлы и многое другое, связанное с COM и ActiveX.

Все выше изложенное преследовало единственную цель - подвести понятийную базу под то, что будет рассказано далее.

Как уже отмечалось выше, технология OPC реализована и продолжает реализовываться по второй схеме предоставления объектов -- путем разработки стандартов. OPC Foundation определяет направления исследований и организует комитеты, которые делают следующее:

- создают спецификации COM-интерфейсов и COM-объектов;

- присваивают объектам GUID;

- оформляют все в виде стандартов и опубликовывают;

- генерируют или создают вспомогательные файлы: idl-, h- и c-файлы для Custom-интерфейса; библиотеки типов для интерфейса автоматизации; заместители (proxy) и заглушки (stub) для поддержки межпроцессного взаимодействия;

- разрабатывают вспомогательные компоненты, например утилиту opcenum, позволяющую OPC-клиенту “увидеть” список всех OPC-серверов локальной сети;

- занимаются рекламой и популяризацией технологии, включая выпуск демонстрационных программ и оценку производительности.

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

Существует достаточно большой перечень стандартов ОРС. Известно, что Консорциум OPC Foundation пытается охватить все аспекты взаимодействия с технологическим оборудованием. В разработке самих спецификаций принимают участие ведущие производители оборудования и систем автоматизации, которые стараются максимально учесть свой опыт и предоставить абсолютно все необходимое тому, кто будет использовать OPC.

Далее мы проиллюстрируем это на примере спецификации Data Access (DA). Нет никакой возможности хоть сколько-нибудь подробно рассмотреть остальные.

3.8 OPC-стандарты

OPC Common Definitions and Interfaces -- общие для всех OPC-спецификаций интерфейсы.

Data Access Custom Interface Standard -- спецификация COM-интерфейсов для обмена оперативными данными, программирование на Cи++.

Data Access Automation Interface Standard -- спецификация COM-интерфейсов для обмена оперативными данными, программирование на языках типа Visual Basic.

OPC Batch Custom Interface Specification -- спецификация COM-интерфейсов конфигурирования оборудования, программирование на Cи++.

OPC Batch Automation Interface Specification -- спецификация COM-интерфейсов для конфигурирования оборудования, программирование на языках типа Visual Basic.

OPC Alarms and Events Custom Interface Specification -- спецификация COM-интерфейсов для обслуживания событий (event) и нештатных ситуаций (alarm), программирование на Cи++.

OPC Alarm and Events Automation Interface Specification - спецификация COM-интерфейсов для обслуживания событий и нештатных ситуаций, программирование на языках типа Visual Basic.

Historical Data Access Custom Interface Standard -- спецификация COM-интерфейсов для работы с хранилищами данными, программирование на Cи++.

Historical Data Access Automation Interface Standard -- спецификация COM-интерфейсов для работы с хранилищами данными, программирование на языках типа Visual Basic.

OPC Security Custom Interface -- спецификация COM-интерфейсов для обработки прав доступа к данным, программирование на Cи++.

3.9 OPC-сервер

веб сервер клиент интерфейс

Кто использует OPC? Первая категория -- производители оборудования автоматизации, или OEM. Предполагается, что тот, кто создает, например, плату сбора данных, снабжает ее не только драйвером, но и реализует OPC-сервер, работающий с этой с платой через драйвер или даже напрямую. Тем самым OEM-производитель предоставляет стандартный доступ к своей плате.

Список потенциальных изготовителей OPC-серверов неограничен. OPC-сервером можно снабдить контроллер, плату ввода/вывода, адаптер полевой шины, программу пересчета, генератор случайных чисел, что угодно, лишь бы это устройство поставляло или принимало данные. Но все-таки здесь речь идет в первую очередь о программном обеспечении для более низкого уровня в системах автоматизации.

Что необходимо сделать производителю, если он решил обеспечить свой продукт стандартным интерфейсом? Сначала он должен получить нужную спецификацию и прилагаемые программные компоненты, затем изучить COM-интерфейсы тех COM-объектов этой спецификации, которые относятся в ней к модели OPC-сервера, и, наконец, необходимо найти опытного программиста, который с помощью ATL-библиотеки реализует требуемые интерфейсы, а значит, и OPC-сервер. Если же не пользоваться услугами программиста, то придется купить какой-нибудь комплект инструментальных средств (Toolkit). Но об этом ниже.

3.10 OPC-клиент

OPC-сервер «поставляет» данные. OPC-клиент их потребляет. Этим фактом определяется вторая категория пользователей спецификаций OPC. К ней относятся, в первую очередь те, кто реализует программное обеспечение более высокого уровня, например, поставщики SCADA-пакетов или чего-то близкого по назначению.

Что же требуется от производителя «верхнего» ПО, если он полагает обеспечить свой продукт стандартным интерфейсом?

Как и в предыдущем случае, ему следует получить нужную спецификацию и прилагаемые программные компоненты. Затем он должен изучить COM-интерфейсы тех COM-объектов этой спецификации, которые относятся в ней к модели OPC-клиента, и с помощью ATL-библиотеки реализовать требуемые интерфейсы, а значит, и OPC-клиент для Custom-интерфейса. Можно использовать любой язык программирования, и тогда будет создан OPC-клиент для интерфейса автоматизации (если она предусмотрена для данной спецификации). По-прежнему, сэкономить на квалификации программиста помогает Toolkit.

Остальные потребители собирают системы из OPC-серверного оборудования и соединяют его с OPC-клиентным ПО. Главная задача здесь -- каждому OPC-серверу найти OPC-клиента и наоборот. Очень часто чего-то из этого не хватает, и тогда не исключена вероятность перехода потребителя в категорию изготовителей, но чаще заказчиков OPC-продукции.

Чтобы лучше почувствовать, что такое OPC, рассмотрим подробнее главный, по большому счету, стандарт Data Access (DA), предназначенный для поставки оперативных данных от оборудования и/или к оборудованию (термин “OPC” часто используют как синоним OPC DA). Для DA реализованы спецификации как пользовательского интерфейса, так интерфейса автоматизации. Как функциональный интерфейс, последний ничем не отличается от пользовательского, за исключением того, что не позволяет одновременно работать с несколькими OPC-серверами и к нему добавлен упомянутый выше COM-интерфейс IDispatch, обязательный в OLE Automation. Это позволило OPC Foundation издать 'обертку' (wrapper) в виде dll, преобразующую один интерфейс в другой. Таким образом, разработчик OPC-сервера заботится только о Custom-интерфейсе, а если клиент предпочитает автоматный интерфейс, он использует эту библиотеку в качестве переводчика.

Стандарт DA имеет две версии интерфейсов: 1.0 и 2.0. C точки зрения COM это самостоятельные спецификации. OPC-клиент предварительно запрашивает, может ли он работать с нужным ему COM-интерфейсом в используемом OPC-сервере. В версии 2.0 механизм уведомления клиента приведен к стандартному механизму COM/DCOM, что упрощает программирование.

Более интересно рассмотреть, с чем работает DA. Основной единицей данных в OPC является переменная (Item). Переменная может быть любого типа, допустимого в OLE: различные целые и вещественные типы, логический тип, строковый, дата, валюта, вариантный тип и т. д. Кроме того, переменная может быть массивом.

Каждая переменная обладает свойствами. Различаются обязательные свойства, рекомендуемые и пользовательские. Обязательными свойствами, понятно, обязана обладать каждая переменная. Это, во-первых, текущее значение переменной, ее тип и права доступа (чтение и/или запись). Во-вторых, очень важные свойства -- качество переменной и метка времени. Технология OPC ориентирована на работу с оборудованием, а оборудование может давать сбои, так что корректное значение переменной не всегда известно OPC-серверу, о чем и уведомляется клиент через качество (хорошее/плохое/неопределенное и дополнительная информация). Метка времени сообщает о том, когда переменная получила данное значение и/или качество. Еще одним обязательным свойством является частота опроса переменной OPC-сервером, хотя его можно было бы и не относить к обязательным, так как не все OPC-серверы работают в режиме опроса оборудования. Последнее из обязательных свойств -- описание переменной. Это строковое значение, содержащее информацию для пользователя о том, что представляет собой эта переменная.

Дополнительные свойства необязательны для OPC-сервера. Это, например, диапазон изменения (выход за границы диапазона должен специальным образом обрабатываться клиентом) и единица измерения. Есть перечень рекомендуемых свойств, но можно добавить и свои собственные, то есть пользовательские.

Существует три основных способа получения OPC-клиентом данных от OPC-сервера: синхронное чтение, асинхронное чтение и подписка. При синхронном чтении клиент посылает серверу запрос со списком интересующих его переменных и ждет, когда сервер его выполнит. При асинхронном чтении клиент посылает серверу запрос, а сам продолжает работать. Когда сервер выполнил запрос, клиент получает уведомление (через интерфейс соответствующего COM-объекта, реализованного в клиенте!). И, наконец, в случае подписки клиент передает серверу список интересующих его переменных, а сервер затем регулярно присылает клиенту информацию об изменившихся переменных из этого списка (опять же, через интерфейс соответствующего COM-объекта клиента!). Эти списки в терминологии OPC называются группами. Каждый клиент может поддерживать одновременно много групп с разной скоростью обновления.

Запись данных ничем не отличается от чтения, за исключением того, что нет записи по подписке.

Технология OPC регламентирует только интерфейс между OPC-клиентами и OPC-серверами (как и положено в технологии клиент-сервер, допускаются множественные подсоединения). И она абсолютно не регламентирует способ получения этих данных от оборудования! Разработчик сам определяет, где и как их брать. Но, тем не менее, есть некоторые разумные, с точки зрения разработчиков OPC, модели взаимодействия с оборудованием. Для их рационального обслуживания предлагаются соответствующие механизмы. Например, можно попросить OPC-сервер получать данные не напрямую, а извлекать их из своего внутреннего буфера (кэша). Разумеется, если сервер не делает кэширования, он вправе эту просьбу 'игнорировать'.

Переменные в OPC-сервере могут быть представлены либо в виде простого списка, либо в виде дерева, напоминающего дерево файлов на диске (только вместо термина «папка» в OPC говорят «ветвь»).

И есть соответствующие интерфейсы для навигации по этому дереву, позволяющие, в частности, в любой момент запросить дерево переменных, поддерживаемых OPC-сервером. Если оборудование допускает, дерево может изменяться динамически. Точнее, интерфейс для просмотра дерева объявлен в OPC-спецификации как необязательный. Тем не менее, он настолько удобен, что практически все OPC-серверы его реализуют.

Кроме того, есть механизм оповещения о завершении работы OPC-сервера, запроса информации о самом сервере и списка зарегистрированных групп. В общем, разработчики OPC-спецификаций предусмотрели многое для облегчения организации взаимодействия поставщика данных (OPC-сервера) и потребителя данных (OPC-клиента). Однако цель этого раздела -- описание не DA-интерфейсов, а того, как OPC ориентируется именно на работу с оборудованием, в частности на обмен данными.

3.11 Инструментарий для создания OPC-серверов и OPC-клиентов

Как уже было сказано, чтобы создать OPC-сервер или OPC-клиент, нужно только взаимодействие с OPC Foundation (получить OPC-спецификации) и Microsoft (приобрести Visual Cи++ и пр.). Но имеется много сложных вопросов, которые придется решить при программировании OPC-интерфейсов.

Во-первых, само программирование COM весьма сложная задача даже с применением библиотеки активных шаблонов (ATL).

Во-вторых, сами OPC-объекты и их OPC-интерфейсы достаточно сложны и громоздки.

Проблема памяти весьма актуальна, так как в COM допускается (и сплошь и рядом в OPC используется) выделение памяти в сервере, а удаление ее возлагается на клиент. Малейшая неточность -- и пойдут трудно устранимые утечки памяти. А учитывая, что OPC-сервер обычно должен работать стационарно, рано или поздно крах системы неизбежен.

Всего этого можно избежать, если воспользоваться специальным инструментарием разработчика.

Типичный инструментарий представляет собой библиотеку, состоящую из OPC-объектов выбранной спецификации. Разработчику же, например, OPC-сервера, предлагается некий набор вызовов, достаточно простых (read, write), которые необходимо приложить к своему оборудованию для доступа к его данным.

Для тех, кто знает объектное программирование, заметим, что эти функции могут быть реализованы как виртуальные функции некоторого класса - их нужно перегрузить в своем приложении. Так устроен, например, инструментарий фирмы FactorySoft См.: www.factorysoft.com.

3.12 OPC и Интеграция

Рассмотрим возможные области применения OPC-серверов в АСУ предприятия. Мы различаем несколько уровней управления:

* нижний уровень -- полевые шины (fieldbus) и отдельные контроллеры;

* средний уровень -- цеховые сети;

* уровень АСУТП -- уровень работы систем типа SCADA;

* уровень АСУП -- уровень приложений управления ресурсами предприятия.

Каждый из этих уровней может обслуживаться OPC-сервером, поставляя данные OPC-клиенту на более высоком или на равном уровне.

Так, если имеется оборудование, например, плата АЦП, управляемая через драйвер на компьютере с Windows или другой ОС, поддерживающей COM/DCOM, то это самый главный кандидат на то, чтобы непосредственно поверх драйвера реализовать OPC-сервер. Замена устройства не потребует изменения остальных приложений: драйвер изменяется, но OPC-интерфейс поверх него остается прежним.

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

Несколько более сложной будет схема при работе управляющих приложений на компьютере, не поддерживающем COM/DCOM. В этом случае применим двухкомпонентный OPC-сервер. На стороне ОС, не поддерживающей COM, устанавливается сетевой модуль, который, с одной стороны, связан с приложением (ями), а с другой -- через сеть с OPC-сервером.

Заметим, что сетевой модуль может быть стандартным (как, например, ISaNet в системе ISaGRAF). В этом случае необходимо разработать только OPC-сервер. По такому принципу функционирует OPC-сервер ISaGRAF фирмы «РТСофт» См.: www.rtsoft.ru.

Иногда сетевой модуль создается специально для OPC-сервера. Возможна даже реализация, при которой этот модуль не ориентирован на конкретное приложение, а предоставляет некоторый API-интерфейс для любых приложений, желающих обслуживаться с помощью OPC. Так действует OPC-сервер для операционной системы OS-9, также разработанный в «РТСофт».

Еще одна разновидность OPC-сервера -- шлюз к сети полевой шины, такой как Profibus или Lonworks. Реализация этой схемы очень похожа на предыдущие случаи. Скорее всего, на компьютере с ОС Windows будет установлен адаптер fieldbus-сети, а OPC-сервер будет взаимодействовать с этой сетью через драйвер адаптера.

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

Можно назвать много других мест применения OPC: для работы с базами данных в качестве вспомогательных или промежуточных OPC-серверов и т. д.

Технология DCOM, как уже говорилось, не очень пригодна для глобальных сетей. Поэтому для привлечения к OPC-технологии Internet-технологий можно набросать такой путь. Расширение Web-сервера является OPC-клиентом, собирающим данные от OPC-серверов. А на стороне клиентов запускается динамическая html- или xml-страница, получающая данные от этого Web-сервера. Ее можно сделать даже OPC-сервером для других приложений.

Полезность применения OPC с точки зрения интеграции достаточно прозрачна и вытекает из самой сути OPC. Это стандарт на интерфейс обмена данными с оборудованием. Первое преимущество -- если вы заменяете какой-нибудь компонент, то нет нужды корректировать другое ПО, так как даже при замене драйвера поверх него работает OPC. Второе -- если вы хотите добавить в систему новые программы, нет необходимости предусматривать в них драйверы устройств, кроме OPC-клиента, разумеется. Ну и так далее.

3.13 ОСОБЕННОСТИ ВНЕДРЕНИЯ OPC-стандарта

До сих пор мы описывали технологию и ее возможности. А каково же состояние дел с её внедрением?

Для улучшения обстановке с OPC, необходимо чтобы основная часть производителей признали OPC своим стандартом. При этом поставщики оборудования, в том числе полевых шин, снабжают выпускаемые продукты OPC-серверами, а поставщики программ для систем управления делают собственные продукты OPC-клиентами и во многих случаях еще и OPC-серверами. При этом и те, и другие реализуют все спецификации и поддерживают все интерфейсы OPC. А все производители операционных систем встраивают в свои ОС технологии COM/DCOM, а также предоставляют сервисный инструментарий, как для него, так и для OPC. И при этом все делается на высоком профессиональном уровне и очень грамотно рассказывается сборщикам систем, как это все собирать и конфигурировать. Вот тогда вопрос обмена данными в системах автоматизации можно было бы считать закрытым.

Но пока положение дел несколько иное.

В настоящее время общепризнанным стандартом является только OPC DA, а остальные спецификации только начинают внедряться. Не все спецификации завершены, по крайней мере, с точки зрения интерфейса автоматизации (например, для OPC Batch уже существует версия 2.0 custom-интерфейса, а интерфейса автоматизации - только версия 1.0, для некоторых других спецификаций тоже существует отставание интерфейсов автоматизации от custom-интерфейсов; для OPC Security спецификации на интерфейс автоматизации вообще не существует).

Соответственно, широкое распространение получил лишь стандарт OPC DA. Можно сказать, что сейчас действительно очень многие производители снабжают свои продукты OPC DA-серверами. Чего нельзя сказать о других спецификациях.

Среди программ высокого уровня аналогичная картина. Спросом пользуется лишь OPC DA. Все известные нам SCADA-продукты являются OPC-клиентами, например Wonderware InTouch, CiTect (Ci Technologies), а многие из них и OPC-серверами (в частности, CiTect). Другое ПО подвержено влиянию OPC в гораздо меньшей степени.

Из операционных систем технологию COM/DCOM поддерживают следующие:

- все Windows, начиная с Windows 95. Это обеспечивается самой компанией Microsoft;

- большинство Unix-подобных ОС, включая Linux; поддерживается фирмой GE Software;

- ОС реального времени VxWorks; обеспечивается фирмой-разработчиком WindRiver; имеется поддержка OPC, встроенная в систему разработки Tornado.

В других операционных системах, насколько нам известно, поддержки COM/DCOM нет. Это не очень отрадный факт, поскольку разработчиков систем автоматизации в первую очередь интересуют ОС реального времени.

3.14 Перспективы развития OPC-технологии

Итак, в настоящее время картина далеко не идеальна. Еще довольно много оборудования и ПО не охвачено OPC-технологиями. Даже технологией DA. Но нам представляется, что сейчас в мире налицо некий бум OPC, по крайней мере, в отношении опять же DA. Думается также, что Microsoft рано или поздно доведет все до желаемого уровня по всем направлениям.

Тем более что альтернативных вариантов пока нет. Мы имеем в виду не COM/DCOM, а именно спецификации на обмен технологическими данными. Поскольку для COM/DCOM замена как раз имеется -- CORBA. Это действительно изначально платформенно-независимая технология взаимодействия приложений.

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

Таким образом, технология OPC предлагает стандарты для обмена технологическими данными, в которые заложены самые широкие возможности. Учитывая большой авторитет вовлеченных в данную деятельность фирм можно ожидать, что технология OPC будет набирать силу. Это перспективная технология для интеграции разнородных систем в частности, и, в особенности, сложных систем в составе различных технологических процессов и линий производства.

3.15 Программное обеспечение

SCADA-системы чаще всего имеют закрытый код и поставляются вместе с оборудованием (в данном случае с пультами, которые встраиваются в станок).

SCADA-система устанавливается на серверную версию операционной системы Microsoft и включает в себя OPC сервер и Microsoft SQL сервер. OPC сервер не обрабатывает результаты, а помещает их в базу данных, а уже OPC клиенту, которые установлен у пользователя, приходится обрабатывать полученый результат, что приводит к задержкам получения данных на пользовательской машине.

Для решения данной проблемы можно воспользоваться OPC клиентом, который будет заранее подсчитывать результаты полученные с OPC сервера и переводить их в web форму. Чтобы не вмешиваться в работу сервера SCADA-системы (чтобы не вызывать задержки получения данных с пультов) необходимо организовать сервер для OPC клиента, который в последствии будет и web-сервером.

Многие OPC протоколы базируются на Windows-технологиях (OLE, ActiveX, COM/DCOM), но также была найдена утилита для языка программирования Python - OpenOPC.

Данная утилита свободная и поставляется с открытым кодом, что позволяет при необходимости изменять её код. Она состоит из двух частей - серверная и клиентская. Серверная часть устанавливается на SCADA-систему в виде службы, а клиентская на наш дополнительный сервер. Для работы данной утилиты на дополнительном сервере необходимо установить язык программирования Python. Так же для нашего дополнительного сервера понадобится любой web-сервер, например, Apache, так же для обработки данных понадобиться препроцессор гипертекста, например, PHP, а для хранения данных, полученных с OPC сервера можно использовать MySQL.

Кроме того, необходимо использовать утилиту для диагностики работы сети, которая будет проверять работоспособность пультов и сервера, а так же активного сетевого оборудования на пути от пультов до сервера.

Для получения данных с OPC будет использоваться написанная Нами программа, которая работает за счет библиотек утилиты OpenOPC. Данная программа будет посылать запрос, например, раз в день на OPC сервер, а полученные результаты сохранять в базе данных MySQL. При этом конечный пользователь при обращении к web-серверу будет получать информацию незамедлительно, без каких-либо технических задержек, так как клиентской машине не нужно будет преобразовывать получаемые данные, а только лишь отображать полученные результаты в виде web-страницы на экране конечного пользователя.

Важно, что данные утилиты (т.е. OPC-клиент, OPC-сервер, база данных MySQL, web-сервер, PHP, собственно язык программирования Pyton и т.д.) являются свободными и кросплатформенными, и, поэтому их можно установить фактически на любую современную систему, например на unix-подобные системы, Windows и другие.

Следует рассмотреть отдельные программные средства, необходимые для создания web-сервера; такие, как web-сервер Apache, препроцессор гипетреткста PHP и база данных MySQL. Выбор этих программных продуктов обусловлен, прежде всего, надёжностью в использовании, возможностью получения обновлений в ходе работы, а также - некоммерческим характером их распространения. В современных условиях нашей страны, последнее свойство, несомненно, кажется особенно привлекательным.

3.16 Web сервер Apache

Apache является кроссплатформенным программным обеспечением, является свободным и поддерживается операционными системами GNU/Linux, BSD, Mac OS, Microsoft Windows, Novell NetWare, BeOS.

Основными достоинствами Apache считаются надежность и гибкость конфигурации. Он позволяет подключать внешние модули для предоставления данных, использовать СУБД для аутентификации пользователей, модифицировать сообщения об ошибках и т.д. Поддерживает IPv4 и IPv6.

Недостатком считается отсутствие удобного стандартного интерфейса для администратора.

Ядро Apache включает в себя основные функциональные возможности, такие как обработка конфигурационных файлов, протокол http и система загрузки модулей. Ядро (в отличии от модулей) полностью разрабатывается Apache Softaware Foundation, без участия сторонних программистов.

Теоретически, ядро Apache может функционировать в чистом виде, без использования модулей. Однако, функциональность такого решения крайне ограничена. Ядро Apache полностью написано на языке программирования C.

Система конфигурации Apache основана на текстовых конфигурационных файлах. Имеет три условных уровня конфигурации:

· Конфигурирования сервера (http.conf).

· Конфигурирования виртуального хоса (http.conf, c версии 2.2 extra/httpd-vhost.conf).

· Конфигурация уровня директории (.htaccess).

Имеется собственный язык конфигурационных файлов, основанных на блоках директив. Практически все параметры ядра могут быть изменены через конфигурационные файлы, вплоть до управления мултипроцессорной модели Симметричное мультипроцессирование (англ. Symmetric Multiprocessing, или SMP) это архитектура многопроцессорных компьютеров, в которой два или более одинаковых процессоров подключаются к общей памяти. Большинство многопроцессорных систем сегодня используют архитектуру SMP.. Большая часть модулей имеет собственные параметры.

Часть модулей использует в своей работе конфигурационные файлы операционной системы (например, /etc/passwd и /etc/hosts).

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

Apache HTTP Server поддерживает модульность. Существует более 400 модулей, выполняющих различные функции. Часть из них разрабатывается командой Apache Software Foundation, но основное количество - отдельными open source разработчиками.

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

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

В модулях реализуются так возможности, как:

· Поддержка языков программирования.

· Добавление функционала.

· Исправление ошибок или модификация основных функций.

· Усиление безопасности.

Apache имеет встроенный механизм виртуальных хостов. Он позволяет полноценно обслуживать на одном ip-адресе множество сайтов (доменных имен), отображая для каждого из них собственное содержимое.

Для каждого виртуального хоста можно указать собственные настройки ядра и модулей, ограничить доступ ко всему сайту или отдельным файлам. Некоторые МРМ, например Apache-ITK позволяют запускать процесс httpd для каждого виртуального хоста с отдельными идентификаторами uid и gid.

Также, существуют модули, позволяющие учитывать и ограничивать ресурсы сервера (CPU, RAM, трафик) для каждого виртуального хоста.

Существует множество модулей, добавляющих к Apache поддержку различных языков программирования и систем разработки. К ним относятся:

· PHP (mod_php).

· Python (mod_python)

· Ruby (apache-ruby).

· Perl (mod_perl).

· ASP (apache-asp).

Кроме того, Apache поддерживает механизмы CGI и FastCGI, что позволяет исполнять программы на практически всех языках программирования, в том числе C, C++, sh, Perl и Java.

Apache имеет различные механизмы обеспечения безопасности и разграничения доступа к данным. Основным механизмами являются:

· Ограничение доступа к определенным директориям или файлам.

· Механизм авторизации пользователей для доступа к директории по методу HTTP-Авторизации (mod_auth_basic) и digest-авторизации (mod_auth_digest).

· Ограничение доступа к опеределенным директориям или всему серверу, основанное на IP-адресах пользователей.

· Запрет доступа к определенным типам файлов для всех или части пользователей, например, запрет доступа к конфигурационным файлам и файлам баз данных.

· Существуют модули, реализующие авторизацию через СУБД или PAM.

В некоторых MPM-модулях присутствует возможность запуска каждого процесса Apache используя различные uid и gid с соответствующими этим пользователям и группам пользователей.

Также, существует механизм suexec, используемый для запуска скриптов и CGI-приложений с правами и идентификационными данными пользователя.

Для реализации шифрования данных, передающихся между клиентом и сервером, используется механизм SSL, реализованный через библиотеку OpenSSL. Для удостоверения подлинности web-сервера используются сертификаты X.509.

Существуют внешние средства обеспечения безопасности, например mod_security.

Начиная с версии 2.0, появилась возможность определения сервером набора параметров, в т.ч. набора региональных символов, регионального языка пользователя, страны и местного времени.

Сообщения об ошибках и событиях, посылаемые браузеру, теперь представлены на нескольких языках и используют SSI технологию.

Apache поддерживает множество кодировок, в том числе Unicode, что позволяет использовать страницы, созданные в любых кодировках и на любых языках.

Администратор может установить собственные страницы и обработчики для всех HTTP ошибок и событий, таких как 404 (Not Found) или 403 (Forrbiden). В том числе существует возможность запуска скриптов на разных языках.

В версиях 1.3 и старше был реализован механизм Server Side Includes, позволяющий динамически формировать HTML-документы на стороне сервера.

Управлением SSI занимается модуль mod_include, включенный в базовую поставку Apache.

3.17 PHP

PHP (от анг. PHP: Hypertext Preprocessor -- «PHP: препроцессор гипертекста») -- скриптовый язык программирования общего назначения, применяющийся для разработки веб-приложений.

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

Язык и его интерпретатор разрабатываются группой энтузиастов в рамках проекта с открытым кодом. Проект не является свободным и распространяется под собственной лицензией.

В области программирования для Сети, PHP -- один из популярнейших скриптовых языков (наряду с JSP, Perl и языками, используемыми в ASP.NET) благодаря своей простоте, скорости выполнения, богатой функциональности, кроссплатформенности и распространению исходных кодов на основе лицензии PHP.

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

· Автоматическое извлечение POST и GET-параметров, а также переменных окружения веб-сервера в предопределенные массивы;

· Файловые функции успешно обрабатывают как локальные, так и удаленные файлы;

· Автоматическая отправка HTTP-заголовков;

· Работа с cookies и сессиями;

· Обработка файлов, загружаемых на сервер;

· Работа с HTTP заголовками и HTTP авторизацией;

· Работа с XForms;

· Работа с удаленными файлами и сокетами

В настоящее время PHP используется сотнями тысяч разработчиков. Согласно рейтингу Tiobe, базирующемуся на данных поисковых систем, в октябре 2009 года PHP находится на 3 месте среди языков программирования (уступая Java и C), поднявшись за год на две позиции.

3.18 MySQL

MySQL -- свободная система управления базами данных (СУБД). MySQL является собственностью компании Sun Microsystems, осуществляющей разработку и поддержку приложения.

Распространяется под GNU General Public License и под собственной коммерческой лицензией, на выбор. Помимо этого разработчики создают функциональность по заказу лицензионных пользователей, именно благодаря такому заказу почти в самых ранних версиях появился механизм репликации.

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

Гибкость СУБД MySQL обеспечивается поддержкой большого количества типов таблиц: пользователи могут выбрать как таблицы типа MyISAM, поддерживающие полнотекстовый поиск, так и таблицы InnoDB, поддерживающие транзакции на уровне отдельных записей. Более того, СУБД MySQL поставляется со специальным типом таблиц EXAMPLE, демонстрирующим принципы создания новых типов таблиц. Благодаря открытой архитектуре и GPL-лицензированию, в СУБД MySQL постоянно появляются новые типы таблиц.

MySQL портирована на большое количество платформ: AIX, BSDi, FreeBSD, HP-UX, GNU/Linux, Mac OS X, NetBSD, OpenBSD, OS/2 Warp, SGI IRIX, Solaris, SunOS, SCO OpenServer, SCO UnixWare, Tru64, Windows 95, Windows 98, Windows NT, Windows 2000, Windows XP, Windows Server 2003, WinCE, Windows Vista и Windows 7.

Существует также порт MySQL к OpenVMS. Важно отметить, что на официальном сайте СУБД для свободной загрузки предоставляются не только исходные коды, но и откомпилированные и оптимизированные под конкретные операционные системы готовые исполняемые модули СУБД MySQL.

3.19 Язык программирования Python

Python - высокоуровневый язык программирования общего назначения с акцентом на производительность разработчика и читаемость кода. Синтаксис ядра Python минималистичен. В то же время стандартная библиотека включает большой объём полезных функций.

Python поддерживает несколько парадигм программирования, в том числе структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное. Основные архитектурные черты -- динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений и удобные высокоуровневые структуры данных. Код в Питоне организовывается в функции и классы, которые могут объединяться в модули (которые в свою очередь могут быть объединены в пакеты).

Эталонной реализацией Python является интерпретатор CPython, поддерживающий большинство активно используемых платформ. Он распространяется свободно под очень либеральной лицензией, позволяющей использовать его без ограничений в любых приложениях, включая проприетарные. Есть реализации интерпретаторов для JVM (с возможностью компиляции), MSIL (с возможностью компиляции), LLVM и других. Проект PyPy предлагает реализацию Питона на самом Питоне, что уменьшает затраты на изменения языка и постановку экспериментов над новыми возможностями.

Python -- активно развивающийся язык программирования, новые версии (с добавлением/изменением языковых свойств) выходят примерно раз в два с половиной года. Вследствие этого и некоторых других причин на Python отсутствуют ANSI, ISO или другие официальные стандарты, их роль выполняет CPython.

Разработка языка Python была начата в конце 1980-х годов сотрудником голландского института CWI Гвидо ван Россумом. Для распределённой ОС Amoeba требовался расширяемый скриптовый язык, и Гвидо начал писать Python на досуге, позаимствовав некоторые наработки для языка ABC (Гвидо участвовал в разработке этого языка, ориентированного на обучение программированию). В феврале 1991 года Гвидо опубликовал исходный текст в ньюсгруппе alt.sources. С самого начала Python проектировался как объектно-ориентированный язык.

Название языка произошло вовсе не от вида пресмыкающихся. Автор назвал язык в честь популярного британского комедийного телешоу 1970-х «Воздушный цирк Монти Пайтона». Впрочем, всё равно название языка чаще ассоциируют именно со змеёй, нежели с фильмом -- пиктограммы файлов в KDE или в Microsoft Windows и даже эмблема на сайте python.org (до выхода версии 2.5) изображают змеиные головы.

Наличие дружелюбного, отзывчивого сообщества пользователей считается наряду с дизайнерской интуицией Гвидо одним из факторов успеха Python. Развитие языка происходит согласно чётко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP (Python Enhancement Proposal) -- предложений по развитию Python.

Большая часть других возможностей Python (например, байт-компиляция исходного кода) также была реализована ранее в других языках.

Python портируем и работает почти на всех известных платформах -- от КПК до мейнфреймов. Существуют порты под Microsoft Windows, все варианты UNIX (включая FreeBSD и GNU/Linux), Plan 9, Mac OS и Mac OS X, Palm OS, OS/2, Amiga, AS/400 и даже OS/390, Symbian и Android .

По мере устаревания платформы её поддержка в основной ветви языка прекращается. Например, с серии 2.6 прекращена поддержка Windows 95, Windows 98 и Windows ME. Однако на этих платформах можно использовать предыдущие версии Python -- на данный момент сообщество активно поддерживает версии Python начиная от 2.3 (для них выходят исправления).

При этом, в отличие от многих портируемых систем, для всех основных платформ Python имеет поддержку характерных для данной платформы технологий (например, Microsoft COM/DCOM). Более того, существует специальная версия Питона для виртуальной машины Java -- Jython, что позволяет интерпретатору выполняться на любой системе, поддерживающей Java, при этом классы Java могут непосредственно использоваться из Питона и даже быть написанными на Питоне. Также несколько проектов обеспечивают интеграцию с платформой Microsoft .NET, основные из которых -- IronPython и Python.Net.

Python поддерживает динамическую типизацию, то есть тип переменной определяется только во время исполнения. Поэтому вместо «присваивания значения переменной» лучше говорить о «связывании значения с некоторым именем». В Питоне имеются встроенные типы: булевые, строки, Unicode-строки, целые числа произвольной точности, числа с плавающей запятой, комплексные числа и некоторые другие. Из коллекций Python поддерживает кортежи (tuples), списки, словари (ассоциативные массивы) и, начиная с версии 2.4, множества. Все значения в Питоне являются объектами, в том числе функции, методы, модули, классы.

Добавить новый тип можно либо написав класс (class), либо определив новый тип в модуле расширения (например, написанном на языке C). Система классов поддерживает наследование (одиночное и множественное) и метапрограммирование. Возможно наследование от большинства встроенных типов и типов расширений.

Все объекты делятся на ссылочные и атомарные. К атомарным относятся int, long, complex и некоторые другие. При присваивании атомарных объектов копируется их значение, в то время как для ссылочных копируется только указатель на объект, таким образом обе переменные после присваивания используют одно и то же значение. Ссылочные объекты бывают изменяемые и неизменяемые. Например, строки и кортежи являются неизменяемыми, а списки, словари и многие другие объекты -- изменяемыми. Кортеж в Питоне является, по сути, неизменяемым списком.

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

Набор операторов достаточно традиционен. Вот некоторые из них:

· условный оператор if (если). Альтернативный блок после else (иначе). Если условий и альтернатив несколько, можно использовать elif (сокр. от else if).

· операторы цикла while (пока) и for (для). Внутри цикла возможно применение break и continue для прерывания цикла и перехода сразу к следующей итерации соответственно.

· оператор определения класса class.

· оператор определения функции, метода или генератора def. Внутри возможно применение return (возврат) для возврата из функции или метода, а в случае генератора -- yield (давать).

· оператор обработки исключений try -- except -- else или try -- finally (начиная с версии 2.5 можно использовать finally, except и else в одном блоке).

· оператор pass ничего не делает. Используется для пустых блоков кода.

Одной из интересных синтаксических особенностей языка является выделение блоков кода с помощью отступов (пробелов или табуляций), поэтому в Питоне отсутствуют операторные скобки begin/end как в языке Паскаль или фигурные скобки, как в Си. Такой «трюк» позволяет сократить количество строк и символов в программе и приучает к «хорошему» стилю программирования. С другой стороны, поведение и даже корректность программы может зависеть от начальных пробелов в тексте. Некоторые критики языка считают такое поведение неинтуитивным и неудобным.

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

3.20 ХАРАКТЕРИСТИКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

Scada-системы чаще всего имеют закрытый код и поставляются вместе с оборудованием (в данном случае с пультами, которые встраиваются в станок). Scada-система устанавливается на серверную версию операционной системы Microsoft и включает в себя OPC сервер и Microsoft SQL сервер. OPC-сервер не обрабатывает результаты, а помещает их в базу данных, а уже OPC клиенту, который установлен у пользователя, приходится обрабатывать полученный результат, что приводит к задержкам получения данных на пользовательской машине.

Для решения данной проблемы можно воспользоваться OPC клиентом, который будет заранее подсчитывать результаты, полученные с OPC сервера, и переводить их в web форму. Чтобы не вмешиваться в работу сервера Scada-системы (это необходимо для того, чтобы не вызывать задержки получения данных с пультов) необходимо организовать сервер для OPC клиента, который в последствии будет и web-сервером.

Многие OPC протоколы базируются на Windows-технологиях (OLE, ActiveX, COM/DCOM), но была найдена утилита для языка программирования Python - OpenOPC. Данная утилита свободная и поставляется с открытым кодом, что позволяет легко изменять ее код.

Она состоит из двух частей - серверная и клиентская. Серверная часть устанавливается на Scada-систему в виде службы, а клиентская на наш дополнительный сервер. Для работы данной утилиты на дополнительном сервере необходимо установить язык программирования Python.

Так же для нашего дополнительного сервера понадобится любой web сервер, например, Apache, так же для обработки данных понадобиться препроцессор гипертекста, например, PHP, а для хранения данных, полученных с OPC сервера можно использовать MySQL. Так же необходимо использовать утилиту для диагностики работы сети, которая будет проверять работоспособность пультов и сервера, а так же активного оборудования на пути от пультов до сервера.

Для получения данных с OPC будет использоваться написанная мною программа, которая работает за счет библиотек утилиты OpenOPC. Данная программа будет посылать запрос раз в день на OPC сервер, а полученные результаты сохранять в базе данных MySQL.

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

Данные утилиты являются свободными и кросплатформенными и поэтому их можно установить фактически на любую современную систему, например на unix подобные системы, Windows и другие.

3.20.1 Утилита диагностики сети «Pinger»

Данная утилита требует установленную среду программирования Python. В данном случае она адоптирована под Unix системы и запускается по расписанию. Запускается с помощью скрипта для SH SH - командный интерпретатор, используемый в операционных системах семейства UNIX. В первую очередь, под shell понимаются POSIX-совместимые оболочки, восходящие к Bourne shell, появившемуся в Unix Version 7.:

Данная утилита помогает узнать в каком сегменте сети (активное сетевое оборудование, пульт и сервер обычно работают с протоколом ICMP ICMP (англ. Internet Control Message Protocol -- межсетевой протокол управляющих сообщений) -- сетевой протокол, входящий в стек протоколов TCP/IP. В основном ICMP используется для передачи сообщений об ошибках и других исключительных ситуациях, возникших при передаче данных. Также на ICMP возлагаются некоторые сервисные функции.) произошла неполадка и почему не пришел результат с пульта на сервер.

Основной отчет с пультов на сервер OPC приходит в период от 5:00 до 10:00. В это период сеть должна работать стабильно.

Исходный код программы см. приложение №1.

3.20.2 Opc_client

Данная утилита требует установленную среду программирования Python.

Для работы данной утилиты необходимо, чтобы на OPC-сервере был установлен и запущен в виде службы компонент OpenOPC под название OpenOPC Gateway Service.

Исходный код программы см. приложение №2.

3.20.3 Веб-интерфейс

Веб-интерфейс необходим для того, что бы конечный пользователь мог получить необходимую информацию в понятном виде. В рассматриваемой SCADA-системе веб-интерфейс выполнен на языке PHP с элементами java script. Получение необходимых данных происходит с помощью взаимодействия PHP и MySQL.

Таким образом, интерфейс, полученный на экране клиентской машины представляет собой:

1) С помощью удобного календаря можно выбирать дату, по которой необходимо вывести статистику работы станков.

2) После выбора даты происходит вывод на экран работающих станков и сопутствующая информация.

Информация о станках представляет собой таблицу, в которую входят следующие столбцы:

1) Название оборудования

2) Месторасположение оборудования

3) Время работы оборудования

4) Время работы оборудования под нагрузкой

5) Время простоя оборудования из-за отсутствия заготовок

6) Время простоя оборудования по другим причинам

Так же можно внедрить дополнительные столбцы для отображения других информационных полей, которые поддерживает пульт, подключенный непосредственно к станку.

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

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

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

SCADA-системы осуществляет сбор информации о состоянии станочного парка в полуавтоматическом и автоматическом режимах. Оба режима работают параллельно и не оказывают влияния друг на друга.

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

В автоматическом режиме на пульт сбора данных поступает следующая информация:

· Состояние вводного автоматического выключателя или разъединителя станка (включен/отключен);

· Состояние главных приборов станка (работают/не работают);

· Состояние аварийных блокировок станка (включены/выключены);

· Ток потребляемый станком.

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

1. Время простоя оборудования, в т.ч. из-за ремонта, из-за отсутствия заготовок, либо по другим причинам.

Данные по каждому станку, собранные в полуавтоматическом и автоматическом режиме обрабатываются в локальном контроллере пульта сбора данных и передаются по сети Ethernet на сервера заводов.

В рассматриваемой SCADA-системе веб-интерфейс выполнен на языке PHP с элементами java script.

Получение необходимых данных происходит с помощью взаимодействия PHP и MySQL.

Поиск данных происходит по дате с помощью календаря, написанного на java script - при выборе определенной даты в календаре, данные передаются в PHP и, в результате запроса, к MySQL.

Получаемый результат с помощью PHP распределяется по таблице и выводится на экран пользователя.

Работоспособность данного веб-интерфейса является кросплатформенной, что было проверено на различных браузерах (Internet Explorer 8.0, FireFox, Safari, Opera), также браузеры мобильных устройств (iPhone 3G и Samsung WiTu с операционной системой Windows Mobile 6.1), на игровой приставке Sony PS3, и везде веб сайт корректно отображался.

Исходный код программы см. приложение №3.

ГЛАВА 4. ОПИСАНИЕ РЕЗУЛЬТАТОВ РАБОТЫ СИСТЕМЫ

Результаты работы SCADA-системы отображены на веб странице. Мы приводим два снимка с экрана, которые наглядно демонстрируют проделанную дипломную работу. На этих снимках пользователь получает необходимые данные о работе оборудвоания, которые предварительно запрашивает. В первом случае при выборе отчета за один день (рис.1), а во втором случае за период (рис. 2), в котором 5 дней. В принципе, возможно получение отчета за любой период (например, декада, месяц, квартал, год и т.д.)

/

/

/

/

ГЛАВА 5. ДОКУМЕНТАЦИЯ

5.1 Техническое руководство по пользованию веб-интерфейсом

В адресной строке Вашего веб-браузера (интернет обозревателя) необходимо ввести имя или ip адрес сервера (сервера, где установлен OPC-клиент) и нажать клавишу “Enter” и в результате откроется страница. Теперь Вам предстоит выбрать какой вид отчета Вас интересует (можно выбрать отчет за один день или за любой другой период, например, за несколько дней, недель, месяцев и т.д.) Если Вас интересует отчет за один день, то необходимо в первое поле ввести необходимую дату, либо выбрать ее на календаре. После ввода даты необходимо нажать на кнопку «Выполнить» и вы получите информацию, выбранную за один день.

Если Вас интересует отчет за период больше, чем один день, то необходимо ввести дату начала периода в первое поле, а дату окончания периода во второе поле, здесь также можно воспользоваться календарем. После ввода дат необходимо нажать на кнопку «Выполнить» и вы получите информацию, выбранную за период.

5.2Техническое руководство для администраторов, обслуживающих OPC-клиент и веб-сервер

Для добавления дополнительных столбцов в таблицу, которая генерируется при запросе пользователя, необходимо изменить следующие файлы.

В opc_client.php:

Добавить переменную, например:

time_work_karusel = opc.read('Random.Int1')

Сначала указать название переменной, а также указать переменную, получаемую с OPC-сервера в (' '). Данную переменную необходимо узнать у организации, которая обслуживает OPC-сервер и подключенные к нему пульты.

Также, в этом файле необходимо изменить sql запрос:

b.query('INSERT INTO `stanok`.`main` (`id_stanok`, `name`, `where`, `time_work`, `time_work_nagruzka`, `time_remont`, `time_nometal`, `time_another`, `date`) VALUES ('NULL', 'Карусель' , '1 пролет', '%s', '%s', '%s', '%s', '%s', CURDATE())' % (time_work_karusel, time_work_nagruzka_karusel, time_remont_karusel, time_nometal_karusel, time_another_karusel))

Если добавляется новое оборудование, то необходимо написать подобный запрос, если же добавляется новая характеристика к существующему оборудованию, то необходимо добавить переменную в запрос.

В файле index.php необходимо изменить следующую строку (если добавляется только новое оборудование, то ничего менять не надо, а если добавляется новая характеристика, то необходимо добавить).

echo '</font><table border=black'><tr><th>Номер</th><th>Название оборудования</th><th>Месторасположение</th><th>Время работы оборудования</th><th>Время работы оборудования под нагрузкой</th><th>Время простоя оборудования из-за ремонта</th><th>Время простоя оборудования из-за отсутствия заготовок</th><th>Время простоя из-за других причин</th></tr>';

for ($i=1; $i<=$rows; $i++)

{

$r=mysqli_fetch_array($result);

echo '<tr>';

echo '<td>$i</td>';

echo '<td>$r[name]</td>';

echo '<td>$r[where]</td>';

echo '<td>$r[time_work]</td>';

echo '<td>$r[time_work_nagruzka]</td>';

echo '<td>$r[time_remont]</td>';

echo '<td>$r[time_nometal]</td>';

echo '<td>$r[time_another]</td>';

}

echo '</tr>';

}

echo '</table>';

В элемент таблицы необходимо внести изменения, а так же внести новую переменную, получаемую из запроса sql.

ЗАКЛЮЧЕНИЕ

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

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

Такой анализ позволит правильно оценить возможности производственных подразделений любого уровня, выявить «узкие» места, наметить пути по повышению эффективности их работы, снижению затрат, повышению прибыли, принимать своевременно руководству необходимые решения по управлению материально-техническим снабжением, производством, персоналом, сбытом и т.д., в конечном случае повысить конкурентоспособность предприятия в целом.

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

1. Бенкен Е. С. Администрирование web-приложений с использованием PHP и MYSQL (альбом-конспект по курсу). СПБГПУ, СПБ., 2008.

2. Бенкен Е. С. Технологии HTML и XHTML/XML (альбом-конспект к курсу). СПБГПУ, СПб., 2008.

3. Брык И. Ю. Построение вычислительных сетей на основе технологий CISCO. Технология TCP/IP. Конспект лекций. СПБГПУ, СПб., 2007.

4. Кетов Д. В., Державин Д. К. Архитектура UNIX - LUNUX/FREEBDS. Конспект лекций. СПбГПУ, СПб., 2007.

5. Они же. Системное администрирование UNIX. Конспект лекций. СПбГПУ, СПб., 2007.

6. Кудаков А. А. Администрирование Windows. (альбом-конспект по курсу). СПбГПУ, СПб., 2007.

7. Скотт Хокинс. Администрирование Web-сервера Apache и руководство по электронной коммерции. Изд. «Вильямс», 2001. (без указания города издания).

8. www.php.ru

9. www.mysql.ru

1o. www.opcfoundation.org

11. www.openopc.sourceforge.net

12. www.ubuntu.ru

13. www.piton.ru

14. www.google.ru/codesearch

15. www.wikipedia.org

16. www.apache.ru

ПРИЛОЖЕНИЕ

Приложение 1

Утилита pinger (Для диагностики сети)

# -*- coding: utf-8 -*-

import MySQLdb

import OpenOPC

opc = OpenOPC.open_client('192.168.142.130')

opc.connect('Matrikon.OPC.Simulation')

time_work_karusel = opc.read('Random.Int1')

time_work_nagruzka_karusel = opc.read('Random.Int2')

time_remont_karusel = opc.read('Random.Int3')

time_nometal_karusel = opc.read('Random.Int4')

time_another_karusel = opc.read('Random.Int5')

time_work_molot = opc.read('Random.Int6')

time_work_nagruzka_molot = opc.read('Random.Int7')

time_remont_molot = opc.read('Random.Int8')

time_nometal_molot = opc.read('Random.Int9')

time_another_molot = opc.read('Random.Int10')

time_work_tokarniy = opc.read('Random.Int11')

time_work_nagruzka_tokarniy = opc.read('Random.Int12')

time_remont_tokarniy = opc.read('Random.Int13')

time_nometal_tokarniy = opc.read('Random.Int14')

time_another_tokarniy = opc.read('Random.Int15')

db= MySQLdb.connect(host='localhost', user='opc_insert', passwd='stanok', db='stanok')

db.query('INSERT INTO `stanok`.`main` (`id_stanok`, `name`, `where`, `time_work`, `time_work_nagruzka`, `time_remont`, `time_nometal`, `time_another`, `date`) VALUES ('NULL', 'Карусель' , '1 пролет', '%s', '%s', '%s', '%s', '%s', CURDATE())' % (time_work_karusel, time_work_nagruzka_karusel, time_remont_karusel, time_nometal_karusel, time_another_karusel))

db.query('INSERT INTO `stanok`.`main` (`id_stanok`, `name`, `where`, `time_work`, `time_work_nagruzka`, `time_remont`, `time_nometal`, `time_another`, `date`) VALUES ('NULL', 'Молот' , '2 пролет', '%s', '%s', '%s', '%s', '%s', CURDATE())' % (time_work_tokarniy, time_work_nagruzka_tokarniy, time_remont_tokarniy, time_nometal_tokarniy, time_another_tokarniy))

db.query('INSERT INTO `stanok`.`main` (`id_stanok`, `name`, `where`, `time_work`, `time_work_nagruzka`, `time_remont`, `time_nometal`, `time_another`, `date`) VALUES ('NULL', 'Токарный станок' , '3 пролет', '%s', '%s', '%s', '%s', '%s', CURDATE())' % (time_work_molot, time_work_nagruzka_molot, time_remont_molot, time_nometal_molot, time_another_molot))

Скрипт для запуска:

python pinger.py >>$(date +%d_%m_%Y).log

Получаемый файл журнала:

20:52:49 Testing 85.249.168.5 No response

20:53:00 Testing 85.249.168.11 Alive

20:53:01 Testing 85.249.168.12 No response

20:53:12 Testing 85.249.168.13 No response

Приложение 2

OPC Client

# -*- coding: utf-8 -*-

import MySQLdb

import OpenOPC

opc = OpenOPC.open_client('192.168.142.130')

opc.connect('Matrikon.OPC.Simulation')

time_work_karusel = opc.read('Random.Int1')

time_work_nagruzka_karusel = opc.read('Random.Int2')

time_remont_karusel = opc.read('Random.Int3')

time_nometal_karusel = opc.read('Random.Int4')

time_another_karusel = opc.read('Random.Int5')

time_work_molot = opc.read('Random.Int6')

time_work_nagruzka_molot = opc.read('Random.Int7')

time_remont_molot = opc.read('Random.Int8')

time_nometal_molot = opc.read('Random.Int9')

time_another_molot = opc.read('Random.Int10')

time_work_tokarniy = opc.read('Random.Int11')

time_work_nagruzka_tokarniy = opc.read('Random.Int12')

time_remont_tokarniy = opc.read('Random.Int13')

time_nometal_tokarniy = opc.read('Random.Int14')

time_another_tokarniy = opc.read('Random.Int15')

db= MySQLdb.connect(host='localhost', user='opc_insert', passwd='stanok', db='stanok')

db.query('INSERT INTO `stanok`.`main` (`id_stanok`, `name`, `where`, `time_work`, `time_work_nagruzka`, `time_remont`, `time_nometal`, `time_another`, `date`) VALUES ('NULL', 'Карусель' , '1 пролет', '%s', '%s', '%s', '%s', '%s', CURDATE())' % (time_work_karusel, time_work_nagruzka_karusel, time_remont_karusel, time_nometal_karusel, time_another_karusel))

db.query('INSERT INTO `stanok`.`main` (`id_stanok`, `name`, `where`, `time_work`, `time_work_nagruzka`, `time_remont`, `time_nometal`, `time_another`, `date`) VALUES ('NULL', 'Молот' , '2 пролет', '%s', '%s', '%s', '%s', '%s', CURDATE())' % (time_work_tokarniy, time_work_nagruzka_tokarniy, time_remont_tokarniy, time_nometal_tokarniy, time_another_tokarniy))

db.query('INSERT INTO `stanok`.`main` (`id_stanok`, `name`, `where`, `time_work`, `time_work_nagruzka`, `time_remont`, `time_nometal`, `time_another`, `date`) VALUES ('NULL', 'Токарный станок' , '3 пролет', '%s', '%s', '%s', '%s', '%s', CURDATE())' % (time_work_molot, time_work_nagruzka_molot, time_remont_molot, time_nometal_molot, time_another_molot))

Приложение 3

Веб сайт.

Основная страница

index.php

<?php

include('month_rus.php');

?>

<html>

<head>

<meta http-equiv='content-type' content='text/html; charset=UTF-8'>

<meta http-equiv='content-type' content='application/xhtml+xml; charset=UTF-8'>

<meta http-equiv='content-style-type' content='text/css'>

<title>Мониторинг оборудования</title>

<link rel='stylesheet' href='style.css' type='text/css'>

<style type='text/css'>

#calc {display:none; z-index:0; position:absolute;

background-color: white;}

#mainarea {z-index: 1;display:inline; width:100%; height:100%}

.dateinput {position:relative; top:0px; left:3px; border:1px solid gray;}

</style>

<script type='text/javascript' src='calendar.js'></script>

<script type='text/javascript' src='functions.js'></script>

<script type='text/javascript'>

var calcflag = false;

var cur_form;

</script>

</head>

<font size='14'>Доброе время суток, сегодня

<?php

$month=date('m');

$day=date('d');

$year=date('Y');

echo month_rus($day, $month, $year);

?>.

<br>

Нажмите на поле, чтобы выбрать на календаре даты или введите ее в ручную:<br>

<body id='body' onclick='hidecalc()'>

<div id='mainarea'>

<form action='<?php $date1 = $_POST['date1']; $date2 = $_POST['date2']?>' name='myform' method='post'>

<input id='date1' class='dateinput' type='text' name='date1' onfocus='showcalc(this)' onmouseover='javascript: calcflag=true' onmouseout='javascript: calcflag=false'>

<input id='date2' class='dateinput' type='text' name='date2' onfocus='showcalc(this)' onmouseover='javascript: calcflag=true' onmouseout='javascript: calcflag=false'>

<input name='Submit' type=submit value='Выполнить'>

<br>Например:<br>

23-12-2009 25-12-2009 - чтобы получить данные за период<br>

23-12-2009 - чтобы получить данные за день

<br>

<?php

if (empty ($date1))

{echo '<br>Нет данных для отображения';}

else

if (empty ($date2))

{

$sqldate = $date1;

echo '<br>Выбран отчет за ';

$parts = explode('-', $sqldate);

$convertdate='{$parts[2]}-{$parts[1]}-{$parts[0]}';

echo '$convertdate <br>';

$db=mysqli_connect ('localhost', 'stanok_site', 'stanok')

or die ('can't connect to server');

mysqli_select_db($db, 'stanok');

$request='select * from main where date='$sqldate'';

$result=mysqli_query ($db,$request);

$rows=mysqli_num_rows($result);

mysqli_close($db);

if (empty($rows))

{echo 'Нет данных для отображения';}

else

{

echo '</font><table border=black'><tr><th>Номер</th><th>Название оборудования</th><th>Месторасположение</th><th>Время работы оборудования</th><th>Время работы оборудования под нагрузкой</th><th>Время простоя оборудования из-за ремонта</th><th>Время простоя оборудования из-за отсутствия заготовок</th><th>Время простоя из-за других причин</th></tr>';

for ($i=1; $i<=$rows; $i++)

{

$r=mysqli_fetch_array($result);

echo '<tr>';

echo '<td>$i</td>';

echo '<td>$r[name]</td>';

echo '<td>$r[where]</td>';

echo '<td>$r[time_work]</td>';

echo '<td>$r[time_work_nagruzka]</td>';

echo '<td>$r[time_remont]</td>';

echo '<td>$r[time_nometal]</td>';

echo '<td>$r[time_another]</td>';

}

echo '</tr>';

}

echo '</table>';

}

else

{

$sqldate = $date1;

echo '<br>Выбран отчет за период с ';

$parts = explode('-', $date1);

$convertdate1='{$parts[2]}-{$parts[1]}-{$parts[0]}';

$parts2 = explode('-', $date2);

$convertdate2='{$parts2[2]}-{$parts2[1]}-{$parts2[0]}';

echo '$convertdate1 по $convertdate2<br>';

$db=mysqli_connect ('localhost', 'stanok_site', 'stanok')

or die ('can't connect to server');

mysqli_select_db($db, 'stanok');

$request='select `name`, `where`, SEC_TO_TIME( SUM( TIME_TO_SEC( `time_work`))) 'time_work', SEC_TO_TIME( SUM( TIME_TO_SEC( `time_work_nagruzka`))) 'time_work_nagruzka', SEC_TO_TIME( SUM( TIME_TO_SEC( `time_remont`))) 'time_remont', SEC_TO_TIME( SUM( TIME_TO_SEC( `time_nometal`))) 'time_nometal', SEC_TO_TIME( SUM( TIME_TO_SEC( `time_another`))) 'time_another' from `main` where `date`>='$date1' and `date` <='$date2' group by `name`';

$result=mysqli_query ($db,$request);

$rows=mysqli_num_rows($result);

mysqli_close($db);

if (empty($rows))

{echo 'Нет данных для отображения';}

else

{

echo '</font><table border=black'><tr><th>Номер</th><th>Название оборудования</th><th>Месторасположение</th><th>Время работы оборудования</th><th>Время работы оборудования под нагрузкой</th><th>Время простоя оборудования из-за ремонта</th><th>Время простоя оборудования из-за отсутствия заготовок</th><th>Время простоя из-за других причин</th></tr>';

for ($i=1; $i<=$rows; $i++)

{

$r=mysqli_fetch_array($result);

echo '<tr>';

echo '<td>$i</td>';

echo '<td>$r[name]</td>';

echo '<td>$r[where]</td>';

echo '<td>$r[time_work]</td>';

echo '<td>$r[time_work_nagruzka]</td>';

echo '<td>$r[time_remont]</td>';

echo '<td>$r[time_nometal]</td>';

echo '<td>$r[time_another]</td>';

}

echo '</tr>';

}

echo '</table>';

}

?>

<br>

</div>

<div id='calc' onmouseover='javascript: calcflag=true' onmouseout='javascript: calcflag=false'></div>

</body>

</html>

style.css

body {

margin-left: 0px;

margin-top: 0px;

margin-right: 0px;

margin-bottom: 0px;

background-image: url(images/fon2_mod.jpg);

background-repeat: repeat;

}

a:link {

color: #000000;

}

a:visited {

color: #000000;

}

a:hover {

color: #990000;

}

.style1 {color: #990000}

.style3 {font-size: 12px; font-family: Arial, Helvetica, sans-serif; background-attachment: fixed; color: #000000; }

.стиль4 {

font-size: 12px;

font-weight: bold;

font-family: Arial, Helvetica, sans-serif;

color: #990000;

text-decoration: none;

}

.стиль6 {

font-size: 12px;

font-family: Arial, Helvetica, sans-serif;

}

.стиль8 {font-size: 12px; font-family: Arial, Helvetica, sans-serif; }

.стиль9 {font-family: Arial, Helvetica, sans-serif}

.стиль10 {font-family: Arial, Helvetica, sans-serif; color: #000000; font-size: 12px;}

.style14_1 {font-size: 12px; font-family: Arial, Helvetica, sans-serif; font-weight: bold; }

.стиль15 {font-size: 12px; font-family: Arial, Helvetica, sans-serif; color: #990000; }

.стиль16 {font-size: 12px}

.стиль20 {font-size: 12px; font-weight: bold; }

.стиль21 {color: #990000}

.bludoimage {border-color: red; border-style: solid; border-width: 1px; width: 104px; height:90px;}

.bludoprice {border-width: 0px; background-image: URL(images/fon2_mod.jpg);}

#notcurmonth {background-color: #d4d0c8; font-weight: normal;}

.calblock {width: 140px; border: 1px solid red;}

.caldatestable {border-width: 0px 1px 1px 0px; border-style: solid; border-color: red; background-color: #fbf6f0; width: 140px;}

.calcell {border-width: 1px 0px 0px 1px; border-style: solid; border-color: red; width: 20px; height: 20px; font-weight: bold; font-size: small; color: black}

a:hover.callink {color: red; text-decoration: none;}

a:visited.callink {color: red; text-decoration: none;}

a:active.callink {color: red; text-decoration: none;}

a:link.callink {color: red; text-decoration: none;}

month_rus.php

<?php

function month_rus($day, $month, $year)

{

$f_res = $day.' ';

if (ereg('01',$month)) {

$f_res .= 'января';

}

if (ereg('02',$month)) {

$f_res .= 'февраля';

}

if (ereg('03',$month)) {

$f_res .= 'марта';

}

if (ereg('04',$month)) {

$f_res .= 'апреля';

}

if (ereg('05',$month)) {

$f_res .= 'мая';

}

if (ereg('06',$month)) {

$f_res .= 'июня';

}

if (ereg('07',$month)) {

$f_res .= 'июля';

}

if (ereg('08',$month)) {

$f_res .= 'августа';

}

if (ereg('09',$month)) {

$f_res .= 'сентября';

}

if (ereg('10',$month)) {

$f_res .= 'октября';

}

if (ereg('11',$month)) {

$f_res .= 'ноября';

}

if (ereg('12',$month)) {

$f_res .= 'декабря';

}

$f_res .= ' $year';

return $f_res;

}

?>

function.js

function showcalc(obj){

var calcid = document.getElementById('calc');

calcid.style.top = obj.offsetTop+obj.offsetHeight;

calcid.style.left = obj.offsetLeft;

calcid.style.display = 'inline';

curform = obj;

cal(0,0,obj.id);

}

function hidecalc(){

if (calcflag==false){

document.getElementById('calc').style.display = 'none';

}

}

function writedate(date){

curform.value = date;

}

calendar.js

var caldate1 = new Date();

var datelist = new Array(6);

var thisdate = caldate1.getDate();

var thismonth = caldate1.getMonth();

var thisyear = caldate1.getFullYear();

function cal(year,month)

{

caldate1.setMonth(caldate1.getMonth()+month);

var curmonth = caldate1.getMonth();

var monthtext;

switch (curmonth)

{case 0: monthtext = 'Январь'; break;

case 1: monthtext = 'Февраль'; break;

case 2: monthtext = 'Март'; break;

case 3: monthtext = 'Апрель'; break;

case 4: monthtext = 'Май'; break;

case 5: monthtext = 'Июнь'; break;

case 6: monthtext = 'Июль'; break;

case 7: monthtext = 'Август'; break;

case 8: monthtext = 'Сентябрь'; break;

case 9: monthtext = 'Октябрь'; break;

case 10: monthtext = 'Ноябрь'; break;

case 11: monthtext = 'Декабрь'; break;

}

caldate1.setYear(caldate1.getFullYear()+year);

caldate1.setDate(1);

x = (caldate1.getDay() == 0) ? x = 7 : x = caldate1.getDay();

var c = 2 - x;

var caldate2 = new Date(caldate1);

caldate2.setMonth(caldate2.getMonth()+1);

var lastday = caldate2.getDate(caldate2.setDate(0) );

var curyear = caldate1.getFullYear();

var cal='';

cal += '<div valign='top' align='center' class='calblock'>n';

cal += '<table class='caldatestable' style='border-width: 1px;' border='0' cellpadding='0' cellspacing='0'>n';

cal += '<tr>n<td align='right' width='20'><a class='callink' href='javascript: cal(-1,0);'>&#8592;</a></td>n';

cal += '<td align = 'center' width='100'>'+curyear+'</td>n';

cal += '<td align='left' width='20'><a class='callink' href='javascript: cal(1,0);'>&#8594;</a></td>n</tr>n';

cal += '<tr>n<td align='right'><a class='callink' href='javascript: cal(0,-1);'>&#8592;</a></td>n';

cal += '<td align = 'center'>'+monthtext+'</td>n';

cal += '<td align='left'><a class='callink' href='javascript: cal(0,1);'>&#8594;</a></td>n';

cal += '</tr></table>n';

cal += '<table class='caldatestable' border='0' cellpadding='0' cellspacing='0'>n';

var flag = false;

for (i=0;i<6;i++)

{ cal += '<tr>n';

datelist[i] = new Array(7);

for (j=0;j<7;j++)

{ var bcolor = '';

if (c < 1) {bcolor = 'id='notcurmonth'';}

else if (c > lastday) {bcolor = 'id='notcurmonth'';

flag = true;}

else if (c == thisdate && curmonth == thismonth && curyear == thisyear) bcolor = 'style='border-width: 3px 2px 2px 3px;'';

cal += '<td ' + bcolor + ' class='calcell' align='center' valign='middle'>';

datelist[i][j] = new Date(caldate1);

datelist[i][j].setDate(c);

cal += '<a class='callink' href='javascript:writedate(''+datelist[i][j].getFullYear()+'-'+(datelist[i][j].getMonth()+1)+'-'+datelist[i][j].getDate()+'')'>'+datelist[i][j].getDate()+'</a></td>n';

c++;

}

cal += '</tr>n';

if (flag) break;

}

cal += '</table>n</div>';

document.getElementById('calc').innerHTML = cal;

}

ref.by 2006—2025
contextus@mail.ru