exponenta event banner

Чтение и запись данных

Введение в чтение и письмо

С помощью программного обеспечения OPC Toolbox™ можно обмениваться данными с сервером OPC с помощью отдельных элементов или с помощью dagroup объект для выполнения операции над несколькими элементами. Операция чтения и записи может выполняться синхронно, так что сеанс MATLAB ® будет ждать завершения операции или асинхронно, позволяя сеансу MATLAB продолжать обработку, пока операция выполняется в фоновом режиме.

Считывание данных из элемента

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

Использовать операции синхронного чтения

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

Вы используете read для выполнения синхронных операций чтения, пропуская daitem объект, связанный с элементом сервера, который требуется прочитать. Если операция считывания выполнена успешно, то данные возвращаются в структуре, содержащей информацию об операции считывания, включая значение элемента сервера, качество этого значения и время, когда сервер получил это значение. Товар Value, Quality и Timestamp свойства также обновляются для отражения значений, полученных в результате операции считывания.

В следующем примере создается opcda клиентский объект и настраивает группу с одним элементом, 'Random.Real8'. Затем над элементом выполняется операция синхронного считывания.

da = opcda('localhost','Matrikon.OPC.Simulation.1');
connect(da);
grp = addgroup(da);
itm1 = additem(grp,'Random.Real8');
r = read(itm1)
r = 

       ItemID: 'Random.Real8'
        Value: 4.3252e+003
      Quality: 'Good: Non-specific'
    TimeStamp: [2004 3 2 9 50 26.6710]
        Error: ''

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

Примечание

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

Следующий пример считывает данные с устройства, связанного с itm1.

r = read(itm1,'device')
r = 

       ItemID: 'Random.Real8'
        Value: 9.1297e+003
      Quality: 'Good: Non-specific'
    TimeStamp: [2004 3 2 10 8 20.2650]
        Error: ''

Считывание из кэша с неактивными элементами.  Чтобы уменьшить трафик связи и ускорить доступ к данным, серверы OPC хранят в кэше не все значения элементов сервера. В кэше сервера будут храниться только активные элементы сервера. Поэтому синхронные операции чтения из кэша неактивного элемента будут возвращать данные, которые могут не соответствовать текущему значению устройства. При попытке чтения данных из неактивного элемента с помощью read функции и не указывать 'device' в качестве источника, Quality будет установлено значение 'Bad: Out of Service'.

Управление активным статусом позиции осуществляется с помощью Active собственность.

В следующем примере устанавливается Active свойство элемента to 'off' и попытки чтения из кэша.

itm1.Active = 'off';
r = read(itm1)
Warning: One or more items is inactive.
(Type "warning off opc:read:iteminactive" to suppress this 
warning.)

r = 

       ItemID: 'Random.Real8'
        Value: 8.4278e+003
      Quality: 'Bad: Out of Service'
    TimeStamp: [2004 3 2 10 17 19.9370]
        Error: ''

Использовать асинхронные операции чтения

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

Асинхронные операции чтения всегда возвращают данные с устройства.

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

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

При обработке асинхронной операции чтения в MATLAB, элемент Value, Quality и Timestamp свойства также обновляются для отражения значений, полученных в результате операции асинхронного чтения.

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

tid = readasync(itm1)
tid =

     3

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

OPC ReadAsync event occurred at local time 10:44:49
    Transaction ID: 3
    Group Name: Group0
    1 items read.

Вы можете изменить функцию обратного вызова асинхронного события чтения, установив ReadAsyncFcn имущества dagroup объект.

Запись данных в элемент

Можно записывать данные в отдельные элементы или в группы элементов. В этом разделе описывается процедура записи данных в отдельные элементы. Сведения об использовании см. в разделе Чтение и запись нескольких значений dagroup объекты для записи данных в несколько элементов.

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

Использовать синхронные операции записи

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

В следующем примере создается элемент с идентификатором элемента 'Bucket Brigade.Real8' и записывает значение 10.34 к элементу. Затем значение считывается с помощью операции синхронного считывания.

itm2 = additem(grp,'Bucket Brigade.Real8');
write(itm2, 10.34)
r = read(itm2,'device')

Не требуется, чтобы тип данных записываемого значения и тип данных daitem объект, те же самые. Программное обеспечение OPC Toolbox полагается на сервер для выполнения преобразования из предоставленного типа данных в тип данных, необходимый для данного элемента сервера. Сведения о том, как панель инструментов обрабатывает различные типы данных, см. в разделе Работа с различными типами данных.

Использовать асинхронные операции записи

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

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

В следующем примере асинхронные операции используются для записи значения 57.8 к элементу 'Bucket Brigade.Real8' создана ранее.

tid = writeasync(itm2, 57.8)
tid =

     4

Некоторое время спустя стандартный обратный вызов (opccallback) отобразит результаты операции записи в командной строке.

OPC WriteAsync event occurred at local time 11:15:27
   Transaction ID: 4
   Group Name: Group0
   1 items written.

Вы можете изменить функцию обратного вызова асинхронного события записи, установив WriteAsyncFcn имущества dagroup объект.

Чтение и запись нескольких значений

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

A daitem вектор объекта является единственной переменной в рабочей области MATLAB, содержащей более одной daitem объект. Векторы элементов можно создавать с помощью любых стандартных методов конкатенации, доступных в MATLAB. Сведения о создании векторов объектов панели инструментов и работе с ними см. в разделе Создание векторов объектов доступа к данным панели инструментов OPC.

При выполнении любой операции чтения или записи для dagroup , это эквивалентно выполнению операции над Item свойства этой группы, которая является daitem вектор объекта, представляющий все элементы, содержащиеся в dagroup объект.

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

Считывание нескольких значений

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

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

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

r = read(grp)
r = 

2x1 struct array with fields:
    ItemID
    Value
    Quality
    TimeStamp
    Error

Для отображения первой записи в массиве структуры используйте индексирование в структуре.

r(1)
ans = 

       ItemID: 'Random.Real8'
        Value: 3.7068e+003
      Quality: 'Good: Non-specific'
    TimeStamp: [2004 3 2 11 49 52.5460]
        Error: ''

Для просмотра всех значений определенного поля можно использовать синтаксис создания списка в MATLAB. При включении этого списка в массив ячеек значения группируются в одну переменную.

{r.Value}
ans =

  {3.7068e+003    10}

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

Записать несколько значений

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

Примечание

Даже если используется один и тот же тип данных для каждого значения, записываемого в dagroup объект или daitem объектный вектор, необходимо использовать массив ячеек для задания отдельных значений. Используйте num2cell функция для преобразования числовых массивов в массивы ячеек.

В следующем примере значения записываются в dagroup объект, содержащий два элемента.

write(grp, {1.234, 5.43})

Обработка ошибок для операций чтения и записи нескольких элементов

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

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

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

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