**Библиотека 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. Асинхронный синтаксис **рекомендуется** по сравнению с синхронным (возможно, синхронный однажды будет устаревшим). ## Командная строка Также можно использовать проект интерфейса командной строки для быстрого тестирования.