通讯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}

 

posted on 2025-03-27 08:09  张彦山  阅读(31)  评论(0)    收藏  举报