Мне нужно создать небольшое приложение HMI / SCADA WPF, которое использует WCF - PullRequest
2 голосов
/ 21 декабря 2010

Мне нужно создать простое приложение, которое подойдет в качестве примера использования WPF и WCF для создания экранов HMI.

Я не уверен, что WCF должен делать в таком приложении, наверное, должен быть OPC-сервер, к которому подключается мое приложение.Подключается ли приложение к серверу OPC с помощью службы WCF и находится ли служба WCF внутри приложения или вне его?

Служба WCF предназначена для использования только в качестве соединения с сервером OPC?Я еще не совсем уверен, какой процесс имитировать, мне нужно что-то простое.

Пожалуйста, любые идеи приветствуются.

Спасибо

Ответы [ 6 ]

2 голосов
/ 22 декабря 2010

Звучит так, как будто у вас будет приложение WPF, которое будет действовать как ЧМИ, содержащее все элементы пользовательского интерфейса. Приложение WPF создаст клиентский прокси для службы WCF, используя адрес (адрес хоста, на котором запущена служба), привязку (вероятно, tcp или http) и контракт (интерфейс) службы.

Служба WCF будет размещена где-то (адрес хоста) и предоставит конечную точку, которая определяет привязку и контракт. Это то, с чем будет взаимодействовать клиентский прокси вашего WPF-приложения. Методы, реализованные в контракте службы, будут создавать экземпляры классов OPC и, при необходимости, записывать или читать элементы OPC.

В простейшей форме у вас, вероятно, будет одно решение с двумя проектами: одно для приложения WPF (с прокси-сервером клиента) и одно для службы WCF (с реализациями OPC).

2 голосов
/ 22 декабря 2010

Взгляните на www.opcsystems.net, большой набор предложений для быстрого и простого создания приложений WPF SCADA с использованием OPC.

1 голос
/ 10 марта 2011

Если вы хотите создать потребителя WPF, ваш лучший путь к WCF - использовать новые реализации OPC-UA.

Например, сервер KepwareEx реализует эти спецификации и предоставляет конечную точку wcf из коробки.

Я не имею никакого отношения к Kepware, но мы часто использовали их продукты.

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

Также стоит взглянуть на архитектурные описания ребят по Status Vision , которые выходят с инструментарием OPC UA -> Silverlight / XAML ...

1 голос
/ 21 декабря 2010

Взгляните на OPC Connect и используйте некоторые бесплатные или коммерческие компоненты для предпочитаемого вами языка, чтобы общаться с некоторым сервером OPC и визуализировать данные.

0 голосов
/ 11 февраля 2017

Вы можете использовать продукт WPF HMI .NET от Open Automation Software, который использует WCF для связи с источниками данных из Modbus, AB, Siemens, OPC, MQTT, AWS и т. Д. https://www.openautomationsoftware.com/products/hmi-scada-for-net/wpf-hmi-net/

0 голосов
/ 22 декабря 2010

Когда вы упоминаете OPC, я предполагаю, что вы говорите об OPC DA. OPC - это просто протокол связи, и вы, вероятно, захотите создать оболочку для своей системы. Это свободный пример того, как вы можете реализовать простое чтение OPC DA с использованием C # и управляемой оболочки.

namespace ScadaServiceLibrary
{
    [ServiceContract]
    public interface IDataClass
    {
        [OperationContract]
        string RetrieveValues(string OpcPath);
    }

    public class DataClass : IDataClass
    {

        ....

        public string RetrieveValue(string OpcPath)
        {
            // Retrieve data here. ScadaServer is a Opc.Da.Server type.
            // Example assumes you have a dictionary of the item handles keyed 
            // to the path.

            string value = null;

            Opc.Da.Item item = new Opc.Da.Item();

            item.ItemName = OpcPath;
            item.ClientHandle = Handles[OpcPath];
            item.Active = true;
            item.ActiveSpecified = true;

            Opc.Da.Item[] items = new Opc.Da.Item[1];
            items[0] = item;
            Opc.Da.ItemValueResult[] results = ScadaServer.Read(items);

            if (results != null && results.Length > 0)
            {
                Opc.Da.ItemValueResult result = results[0];
                value = result.Value.ToString();
            }

            return value;
        }
    }
}
...