通讯s7
通讯监控放在主窗口相关的地方
其他页面会关闭销毁
主窗口不会
通讯放在主窗口就对了
窗口一打开的时候就监控
MainWindow()构造new MainViewModel();
在new MainViewModel()构造函数里面写通讯
监控到全局App.xaml.cs里面可以,
但必须是静态的,静态对象绑定
主窗口里面写,可以不用静态
每个页面都可以绑定到主窗口里面
设备不多10-20台,可以每个设备开一个线程
1、DeviceModel.cs 设备
不同设备可以通过VarList自定义
public class DeviceModel { public string IP { get; set; } public int Port { get; set; } public List<VariableModel> VarList { get; set; } = new List<VariableModel>(); }
2、VariableModel.cs变量
创建通用对象,不同设备通用基础属性
public class VariableModel : INotifyPropertyChanged { public string VarName { get; set; } public string VarAddress { get; set; } private object _value; public object Value { get { return _value; } set { _value = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Value")); } } public string Unit { get; set; } public event PropertyChangedEventHandler? PropertyChanged; }
3、模拟两台设备
DeviceModel dm = new DeviceModel(); dm.IP = "192.168.2.1"; dm.Port = 102; dm.VarList.Add(new VariableModel { VarName = "空运行速度", VarAddress = "DB1.DBW0" }); dm.VarList.Add(new VariableModel { VarName = "主轴转速", VarAddress = "DB1.DBW2" }); DeviceList.Add(dm); dm = new DeviceModel(); dm.IP = "192.168.2.2"; dm.Port = 102; dm.VarList.Add(new VariableModel { VarName = "空运行速度", VarAddress = "DB1.DBW0" }); dm.VarList.Add(new VariableModel { VarName = "主轴转速", VarAddress = "DB1.DBW2" }); dm.VarList.Add(new VariableModel { VarName = "进给速率", VarAddress = "DB1.DBW4" }); DeviceList.Add(dm);
4、添加Nuget包:S7netplus
while (true)
改为
private CancellationTokenSource cts = new CancellationTokenSource();
while (!cts.IsCancellationRequested)
效率不高,变量其实可以直接取出来
最大通讯长度的限制
很多变量一次性取出来,不建议
打包分组的案例在智控处理

可以设置多端口处理的
不支持同一个ip和端口打开多次,只能打开一次,不需要using
//启动监控 // 1、设备有很多 // 2、每台设备中变量也很多 foreach (var device in DeviceList) { Task.Run(() => { // 连接到设备 S7.Net.Plc plc = new S7.Net.Plc(S7.Net.CpuType.S71200, device.IP, 0, 0); plc.Open(); // 循环获取 while (!cts.IsCancellationRequested) { // 重连机制:心跳 // 请求设备一个状态,效率很高的通信 // 如果没获取到 超时 断开连接 // 这里开始做重连 // 如果没有问题 // 开始下面的变量获取 if (plc.IsConnected) // 变量很多 很外变量取一次(不建议) 判断有些地址进行打包 foreach (var v in device.VarList) { v.Value = plc.Read(v.VarAddress); // 报警判断 } } }); }
前台绑定
{Binding DeviceList[0].VarList[0].Value}
浙公网安备 33010602011771号