我是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一个。
这是一种有效的方法,还是应该选择完全不同的方法?
答案 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; }
}