0

我是 MVVM 的新手,在这里我有点不知所措。英语不是我的首选语言,所以请多多包涵。

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

对于与 PLC 的通信,我使用Libnodave。适用于 MVVM 事物的 MVVM Light。

模型。

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

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

视图模型。

从 ViewModelBase 继承,并有一个模型对象作为成员。公共的 get-set-methods,它会在 set 上引发 propertychanged。例子:

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");
                }
        }
}

集合视图模型。

ViewModel 的 ObservableCollection。从 ModelData.cs(具有两个数组 name 和 startbyte 的类)获取模型名称和 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 一个。

这是一种有效的方法,还是我应该研究完全不同的东西?

4

2 回答 2

0

如果我理解正确,您有一个 PLC,其中包含一组数据结构,并且这些数据结构中的每一个都将在您的程序中由一个对象表示。现在将其乘以 2,因为您有两个 PLC。

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

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

现在,您的视图模型只需要获取单例或静态类的实例,这很容易做到。

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

于 2013-06-27T12:20:58.127 回答
0

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

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

因此,您有一个名为 PlcRepository 的类,其方法是 GetData(object plcId),您可以在其中将对象替换为有用的东西,以识别您要查询的 Plc。这完成了从 PLC 获取数据的所有逻辑,并将从您的 Libnodave 库/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; }
}
于 2013-06-27T12:42:21.157 回答