MVVM WPF的新手,从外部源获取数据

时间:2013-06-27 12:09:22

标签: c# wpf mvvm libnodave

我是MVVM的新手,我在这里有点过头了。英语不是我的首选语言,所以请耐心等待。

我正在尝试为PLC制作HMI。我应该连接到两个不同的PLC,并在PLC中显示来自不同数据块的数据。为简单起见,我们将讨论仅连接到一个PLC,并仅从一个数据块获取数据。数据块有一个重复的数据结构,在我的解决方案中,我将每个结构组成一个对象。

对于与PLC的通信,我使用Libnodave。 MVVM Light for MVVM-thingies。

模型。

包含PLCs结构的“配方”。它还包括get-set-methods。

int _startByte;
string _name;
int _value1;
bool value2;

视图模型。

来自ViewModelBase的Iherits,并且有一个Model-object作为成员。公共get-set-methods,提高了属性。 例子:

Public ViewModel(string name, int startByte)
{
        _model = new Model{Name = name, StartByte = startByte};
}


public int Value
{
        get{return _model.Value;}
        set
        {
                if(_model.Value!=value)
                {
                        _model.Value=value;
                        RaisePropertyChanged("Value");
                }
        }
}

CollectionViewModel。

ViewModels的ObservableCollection。从ModelData.cs获取模型名称和startbyte(具有两个数组的类,name和startbyte)。使用RelayCommands我已经测试过将ViewModels添加到集合中。

查看。

现在可以使用,希望以后也可以使用

我的程序看起来有点像这样:

View
CollectionViewModel
ViewModel    ModelData
Model

(ViewModel和ModelData互不认识)

所以,收集数据。 我的计划是让ViewModel引用一个PLC对象(这是Libnodave进来的地方),并使用PLC对象方法收集数据。 PLC对象表示与PLC的连接,包含写入和读取数据的方法。在ViewModel中,我将使用PLC对象方法来收集数据(和写入数据)。

这意味着很多PLC参考,但锁定有望防止崩溃。我的问题是我无法弄清楚如何给ViewModel一个PLC对象的引用。 PLC对象也将被其他ViewModel使用,并且将有两个不同的PLS对象,每个PLC一个。

这是一种有效的方法,还是应该选择完全不同的方法?

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你就有一个PLC,里面有一系列数据结构,这些数据结构中的每一个都将由你的程序在一个对象中表示出来。现在将它乘以2,因为你有两个PLC。

为了这篇文章,让我们调用代表一个PLC PLC的类。让我们调用代表该PLC PLCData中单个结构的每个对象。

创建一个包含一个包含两个PLC对象的数组的单例类(或静态类)。每个PLC对象都有PLCData个对象的数组(或List<>或...)。

现在,你的viewmodels只需要获取单例或静态类的实例,这很容易。

如果您正在使用多线程(每个PLC使用一个线程来收集数据),BlockingCollection可能是您对象的数据结构的理想选择。

答案 1 :(得分:0)

我认为TS正在寻找如何查询他的PLC的解决方案。如果你问我你正在寻找Repository pattern。这是获取所有数据的好方法。这可以在不同的ViewModel或其他地方重用。

您的存储库中的方法将返回PLC数据的(数据)模型的实例

所以你有一个名为PlcRepository的类 使用GetData(object plcId)方法,您可以使用有用的东西替换该对象,以识别您要查询的Plc。这样就完成了从PLC获取数据的所有逻辑,并将从您返回对象Libnodave library / api

public class PlcRepository : SomeBase
{
    public PlcRepository()
    {
        //Do what you need to do
    }

    /// <summary>
    /// Query the data from your PLC
    /// </summary>
    /// <param name="plcId">The ID of the PLC to query</param>
    /// <returns>PlcData</returns>
    public PlcData GetData(object plcId)
    {
        PlcData data = new PlcData()

        //create instance of your class that is able to talk to the PLC

        //Query your plc

        //Fill your dataobject

        //return the dataobject you just filled
        return data;
    }
}

public class MainViewModel
{
    private readonly PlcRepository _plcRepository;

    public MainViewModel()
    {
        // Create instance of your Repository
        _plcRepository = new PlcRepository();

        // Get the Data from the PLC Repository and fill your property
        PlcData = _plcRepository.GetData(12345);
    }

    public PlcData PlcData { get; set; }
}