exponenta event banner

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

Введение в чтение и запись

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

Чтение данных из элемента

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

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

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

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

Следующий пример создает 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'сервер считает значение с устройства и возвращает вам это значение (а также обновляет кэш сервера с этим значением).

Примечание

Чтение с устройства может быть медленным. Если операция read генерирует ошибку тайм-аута, вам может потребоваться увеличить значение 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 function, и не задавать 'device' как источник, Quality будет установлено значение 'Bad: Out of Service'.

Вы управляете активным статусом элемента, используя Active свойство.

Следующий пример устанавливает Active свойство элемента, которое должно быть '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, генерируя событие read async. 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.

Можно изменить функцию обратного вызова события read async путем установки ReadAsyncFcn свойство dagroup объект.

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

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

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

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

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

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

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

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

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

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

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

В следующем примере для записи значения используются асинхронные операции 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 Toolbox Данных Доступа векторов объектов для получения информации о создании и работе с тулбоксом векторами объектов.

Когда вы выполняете любую операцию чтения или записи на 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 коллбэк. Для получения информации о структуре события read async смотрите Типы событий.

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

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

Примечание

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

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

write(grp, {1.234, 5.43})

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

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

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

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

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