Применение Visual FoxPro 9 в задачах АСУ ТП с использованием технологии OPC

Новости

В настоящее время сложно приобрести высокотехнологичное промышленное оборудование без системы автоматизированного управления. Так, например, если завод железобетонных изделий приобретает новую линию подготовки цементной смеси или пивзавод – новый конвейер бутилированного розлива, не сомневайтесь, в спецификации оборудования будет раздел «Оборудование АСУ» и в него будут входить датчики, промышленные контроллеры, регистраторы параметров. Даже, типовой для данного процесса человеко-машинный интерфейс АСУ (SCADA) будет входить в спецификацию. Т.е. чтобы выполнять автоматизацию на таком уровне, не нужно быть инженером – нужно быть покупателем!

Но что делать, когда вы эксплуатируете несколько (возможно десятков) АСУ, от разных поставщиков и производителей, на разные технологические процессы. Значит – вам нужна ещё одна АСУ: диспетчерского управления локальными АСУ (СОДУ). В этой системе не требуется полной детализации всех параметров локальных АСУ, как правило, достаточно только данных для оперативного расчёта себестоимости в рамках управленческого учёта (расход ресурсов, выход продукции) и данных о безопасности производственного процесса (аварийные режимы). Даже если вы примите решение заказывать разработку СОДУ у сторонних подрядчиков, на этот раз вам придётся глубоко погрузиться в обсуждение применяемых технических решений и границ автоматизации. А раз так, может быть эффективнее выполнить разработку самостоятельно. Конечно, речь идёт об ответственном решении, но если вы располагаете опытом программирования на VFP – это возможно.

Несколько определений

OPC (OLE for Process Control) – набор повсеместно принятых спецификаций предоставляющих универсальный механизм обмена данными в системах контроля и управления. OPC технология обеспечивает независимость потребителей от наличия или отсутствия драйверов или протоколов, что позволяет выбирать оборудование и программное обеспечение, наиболее полно отвечающее реальным потребностям бизнеса. В спецификации OPC для обмена данными определены два компонента: OPC-клиент и OPC-сервер.
OPC-сервер — программа, получающая данные во внутреннем формате устройства или системы и преобразующая эти данные в формат OPC. OPC-сервер является источником данных для OPC-клиентов.
OPC-клиент — программа, принимающая от OPC-серверов данные в формате OPC и преобразующая их во внутренний формат устройства или системы.
OPC Data Access (OPC DA) – самая распространенная спецификация OPC, обеспечивающая обмен текущими данными.

Необходимые условия для начала разработки:
Вы должны знать типы контроллеров и других приборов, регистрирующих параметры локальных АСУ для выбора OPC-сервера.
Исключительно редки случаи, когда производители оборудования промышленной автоматизации не сопровождают свои изделия OPC-серверами. Если вы всё же столкнулись с отсутствием OPC-сервера – вероятнее всего, вам его недопоставил подрядчик, обратитесь напрямую к производителю. Если производитель всемирно известная компания, такая, например, как Siemens, Allen Bradley или Mitsubishi – можно воспользоваться бесплатным OPC-сервером независимого американского разработчика Matrikon Inc (http://www.matrikonopc.com/opc-drivers/index.aspx).
Вы должны располагать таблицами сигналов всех контроллеров во всех проектах локальной автоматизации.
Как правило, таблица сигналов является ключевым пунктом проектной документации автоматизированной системы ТП.
Создаём лабораторную среду OPC-сервера

Для создания приложения, демонстрирующего получение данных и отправку управляющих воздействий на промышленный контроллер, посредством OPC-сервера, нам потребуется эмулятор [MatrikonOPC Server for Simulation], от упомянутой ранее Matrikon Inc. Данный эмулятор доступен для бесплатного скачивания по адресу: http://www.matrikonopc.com/downloads/178/index.aspx, после необременительной процедуры регистрации.
Пусть мы имеем контроллер [Siemens S7-300] и таблица сигналов имеет вид:

Переменная Группа/ контроллер тег
1
Уставка частоты вращения эл. двигателя
(2 очередь, север) S7-300_002N S7-300_002N_Hz2N
2 Ток медной обмотки эл. двигателя
(2 очередь, север) S7-300_002N S7-300_002N_ICu2N
3 Температура железной обмотки эл. двигателя
(2 очередь, север) S7-300_002N S7-300_002N_TFe2N

Запускаем [MatrikonOPC Server for Simulation];
Создаём группу переменных [S7-300_002N];
В группе [S7-300_002N] создаём переменные/теги, см. рис.

Конфигурация группы тегов [s7-300_002N] представленная на рисунке, доступна в приложении, файл [002N.xml].

Обратите внимание:
переменная […Hz2N] – помимо чтения, доступна для записи значений;
переменная […ICu2N] – имеет статус только чтение и получает значения из генератора случайных чисел 1000 раз в секунду;
переменная […TFe2N] – имеет статус только чтение и получает значения из генератора случайных чисел 1 раз в минуту.

В нашем случае это означает что, ток и температуру обмоток эл. двигателя мы считываем с заданной периодичностью. Уставкой частоты вращения, вносим управляющее воздействие на эл. двигатель и дополнительно можем контролировать значение уставки 1 раз в секунду, на случай если значение уставки изменили с местного щита управления.
Приступаем к программированию на Visual FoxPro

После настройки эмулятора OPC-сервера, можно приступать к программированию OPC-клиента:
Public poOPC As Object
* создаём экземпляр OPC-клиента
m.poOPC=Createobject([Matrikon.OPC.Automation.1])
* подключаемся к OPC-серверу
m.poOPC.Connect([Matrikon.OPC.Simulation.1])

Public poOPCGroup As Object
* создаём группу переменных
m.poOPCGroup=m.poOPC.OPCGroups.Add([s7-300_002N])
* создаём в группе [s7-300_002N] переменную [S7-300_002N_Hz2N]
m.poOPCGroup.OPCItems.AddItem([s7-300_002N.S7-300_002N_Hz2N],1)

* определяем значение переменной [S7-300_002N_Hz2N] в 11.12345
m.poOPCGroup.OPCItems.Item(1).Write(11.12345)
* получаем значение переменной [S7-300_002N_Hz2N]
Local ln_Hz2N As Number
m.ln_Hz2N=m.poOPCGroup.OPCItems.Item(1).Value
Данный пример, демонстрирует запись тега (передачу управляющего воздействия – уставку частоты вращения эл. двигателя) и синхронное чтение значения этой же переменной.
Синхронное чтение значений переменных контроллера не единственный способ взаимодействия с OPC-сервером, стандарт OPC DA также предусматривает асинхронное взаимодействие и чтение по уведомлению. Ниже приведён пример получения значений переменных по уведомлению об изменениях.

* создаём в группе [s7-300_002N] переменные
m.poOPCGroup.OPCItems.AddItem([s7-300_002N.S7-300_002N_ICu2N],2)
m.poOPCGroup.OPCItems.AddItem([s7-300_002N.S7-300_002N_TFe2N],3)

Public poOPCGroupEvents As Object
* перегружаем событие [DataChange] группы тегов [s7-300_002N]
* кодом события [DIOPCGroupEvent_DataChange] класса [myOPCGroupClass]
m.poOPCGroupEvents=Newobject([myOPCGroupClass])
m.poOPCGroupEvents.AddProperty([OPCGroup],m.poOPCGroup)
EventHandler(m.poOPCGroup,m.poOPCGroupEvents)

* подписать группу на получение уведомлений
m.poOPCGroup.IsSubscribed=.T.

Define Class myOPCGroupClass As Session OlePublic
Implements DIOPCGroupEvent ;
In [c:\program files\common files\matrikonopc\common\opcdaauto.dll]

Procedure Init
Set Date German
Set Hours To 24

Procedure DIOPCGroupEvent_DataChange(;
TransactionID As Number,;
NumItems As Number,;
ClientHandles As VARIANT,;
ItemValues As VARIANT,;
Qualities As VARIANT,;
TimeStamps As VARIANT) ;
As VOID

Local loItem2 As Object, loItem3 As Object
m.loItem2=This.OPCGroup.OPCItems.Item(2)
m.loItem3=This.OPCGroup.OPCItems.Item(3)

Wait Window ;
Transform(m.loItem2.Value)+Chr(13)+;
Transform(m.loItem2.Quality)+Chr(13)+;
Transform(m.loItem2.Timestamp)+Chr(13)+Chr(13)+;
Transform(m.loItem3.Value)+Chr(13)+;
Transform(m.loItem3.Quality)+Chr(13)+;
Transform(m.loItem3.Timestamp)+Chr(13)+Chr(13)+;
Transform(Datetime()) ;
Nowait Timeout 3

Release loItem2,loItem3

Endproc

Procedure DIOPCGroupEvent_AsyncReadComplete(;
TransactionID As Number,;
NumItems As Number,;
ClientHandles As VARIANT,;
ItemValues As VARIANT,;
Qualities As VARIANT,;
TimeStamps As VARIANT,;
Errors As VARIANT) ;
As VOID
Endproc

Procedure DIOPCGroupEvent_AsyncWriteComplete(;
TransactionID As Number,;
NumItems As Number,;
ClientHandles As VARIANT,;
Errors As VARIANT) ;
As VOID

Endproc

Procedure DIOPCGroupEvent_AsyncCancelComplete(CancelID As Number) ;
As VOID
Endproc

Enddefine

В приведённом фрагменте, код класса [myOPCGroupClass] почти полностью сгенерирован автоматически утилитой входящей в поставку Visual FoxPrp 9 – [Object Browser], перетаскиванием интерфейса [DIOPCGroupEvent] библиотеки OPC-клиента [opcdaauto.dll] в процедурное окно.

В заключении осталось сказать что, по завершении работы с OPC-сервером следует не забывать выполнить отключение: