**Библиотека Opc и командная строка для упрощения работы с OPC-операциями и обеспечения прозрачности между различными протоколами.**

В настоящее время поддерживается синхронная работа по протоколам UA и DA.

## Содержание
* Использование.
* Документация:
    * Изучение узлов.
    * Чтение узла.
    * Запись в узел.
    * Мониторинг тега.
    * Переход к асинхронному режиму.
* Командная строка.
* Сборка и вклад.
  * Модульное тестирование:
      * UA.
      * DA.
* Отказ от ответственности.
* План развития.

**Использование**

Доступен пакет nuget для библиотеки. Чтобы установить H.Opc, выполните следующую команду в консоли диспетчера пакетов:

PM> Install-Package H.Opc

Примечание: пакет был перемещён на NuGet.org из Hylasoft.Opc в H.Opc из-за проблем с учётной записью NuGet.

Чтобы установить интерфейс командной строки, перейдите в раздел релизов (https://github.com/hylasoft-usa/h-opc/releases).

**Документация**

Для использования клиента UA просто...

````cs
using (var client = new UaClient(new Uri("opc.tcp://host-url")))
{
  client.Connect();
  // Используйте здесь `client`
}
````

или с параметрами...

````cs
var options = new UaClientOptions {
  UserIdentity = new Opc.Ua.UserIdentity("<your-username>", "<your-password>")
};
using (var client = new UaClient(new Uri("opc.tcp://host-url")), options)
{
  client.Connect();
  // Используйте здесь `client`
}
````

Вместо этого можно использовать клиент DA:

````cs
using (var client = new DaClient(new Uri("opcda://host-url")))
{
  client.Connect();
  // Используйте `client` здесь
}
````

#### Изучение узлов

Вы можете получить ссылку на узел с помощью...

````cs
var node = client.FindNode("path.to.my.node");
````

Это даст вам ссылку на узел `node` в папке `path.to.my`.

Вы можете использовать ссылку на узел для изучения иерархии узлов с помощью свойств `Parent` и `SubNodes`. Например...

````cs
Node parentNode = node.Parent;
IEnumerable<Node> children = client.ExploreFolder(node.Tag);
IENumerable<Node> grandChildren = children.SelectMany(m => client.ExploreFolder(m.Tag));
````

#### Чтение узла

Чтение переменной? Так же просто, как...

````cs
var myString = client.Read<string>("path.to.string").Value;
var myInt = client.Read<int>("path.to.num").Value;
````

Приведённый выше пример будет читать строку из тегов `string` и `num` в папке `path.to`.

#### Запись в узел

Чтобы записать значение, просто...

````cs
client.Write("path.to.string", "My new value");
client.Write("path.to.num", 42);
````

#### Мониторинг тега

Простой мониторинг:

````cs
client.Monitor<string>("path.to.string", (readEvent, unsubscribe) =>
{
  DoSomethingWithYourValue(readEvent.Value);
  if(ThatsEnough == true)
    unsubscribe();
});

````

Второй параметр — это `Action<T, Action>`, который имеет два параметра:

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

Важно, чтобы вы либо заключили клиент в оператор `using`, либо вызвали `Dispose()`, когда закончите, чтобы отменить подписку на все отслеживаемые элементы и завершить соединение!

### Переход к асинхронному режиму

Каждый метод имеет асинхронный аналог, который можно использовать с синтаксисом async/await. Асинхронный синтаксис **рекомендуется** по сравнению с синхронным (возможно, синхронный однажды будет устаревшим).

## Командная строка

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