HMI.cs 7.22 KB
Newer Older
潘栩锋's avatar
潘栩锋 committed
1 2 3 4 5 6 7 8 9 10 11
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Net;

namespace FLY.Simulation.Coating
{
    public class HMI : INotifyPropertyChanged
    {
12
        const UInt16 ADDR_D_PumpSet=0;//泵速设置 & 泵速显示, float
潘栩锋's avatar
潘栩锋 committed
13
  
14 15
        const UInt16 ADDR_D_LeftSet=10;//uint16  65535-> 6553.5
        const UInt16 ADDR_D_Left=12;
潘栩锋's avatar
潘栩锋 committed
16

17 18
        const UInt16 ADDR_D_RightSet=14;//uint16  65535-> 6553.5
        const UInt16 ADDR_D_Right=16;
潘栩锋's avatar
潘栩锋 committed
19 20


21
        const UInt16 ADDR_D_FilmVelocity=6;//float
潘栩锋's avatar
潘栩锋 committed
22 23
        const UInt16 ADDR_C_STATE = 0;//涂布状态 bit 0

24
        const UInt16 ADDR_C_OK = 2;//设置 0->1 设置
潘栩锋's avatar
潘栩锋 committed
25 26 27 28 29 30

        CoatingCtrl mCoatingCtrl;

        FLY.ModbusModule.ServerTCP mbServer;
        FLY.ModbusModule.PLCRegister mPLCRegister;

31 32
        Dictionary<UInt16, string> Addrs_reg = new Dictionary<ushort, string>();
        Dictionary<UInt16, string> Addrs_coil = new Dictionary<ushort, string>();
潘栩锋's avatar
潘栩锋 committed
33 34 35 36 37


        public double PumpSet 
        {
            get {
38 39
                float p = mPLCRegister.GetFloat(ADDR_D_PumpSet);
                return p;
潘栩锋's avatar
潘栩锋 committed
40 41 42 43
            }
            set {
                if (PumpSet != value)
                {
44
                    mPLCRegister.SetFloat(ADDR_D_PumpSet, (float)value);
潘栩锋's avatar
潘栩锋 committed
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
                    NotifyPropertyChanged("PumpSet");
                }
            }
        }
        public double LeftSet
        {
            get
            {
                UInt16 p = mPLCRegister.GetUInt16(ADDR_D_LeftSet);
                return p / 10.0;
            }
            set
            {
                if (LeftSet != value)
                {
                    mPLCRegister.SetUInt16(ADDR_D_LeftSet, (UInt16)(value * 10));
                    NotifyPropertyChanged("LeftSet");
                }
            }
        }
        public double Left
        {
            get
            {
                UInt16 p = mPLCRegister.GetUInt16(ADDR_D_Left);
                return p / 10.0;
            }
            set
            {
                if (Left != value)
                {
                    mPLCRegister.SetUInt16(ADDR_D_Left, (UInt16)(value * 10));
                    NotifyPropertyChanged("Left");
                }
            }
        }
        public double RightSet
        {
            get
            {
                UInt16 p = mPLCRegister.GetUInt16(ADDR_D_RightSet);
                return p / 10.0;
            }
            set
            {
                if (RightSet != value)
                {
                    mPLCRegister.SetUInt16(ADDR_D_RightSet, (UInt16)(value * 10));
                    NotifyPropertyChanged("RightSet");
                }
            }
        }
        public double Right
        {
            get
            {
                UInt16 p = mPLCRegister.GetUInt16(ADDR_D_Right);
                return p / 10.0;
            }
            set
            {
                if (Right != value)
                {
                    mPLCRegister.SetUInt16(ADDR_D_Right, (UInt16)(value * 10));
                    NotifyPropertyChanged("Right");
                }
            }
        }

114

潘栩锋's avatar
潘栩锋 committed
115 116 117 118
        public double FilmVelocity
        {
            get
            {
119 120
                float p = mPLCRegister.GetFloat(ADDR_D_FilmVelocity);
                return p;
潘栩锋's avatar
潘栩锋 committed
121 122 123 124 125
            }
            set
            {
                if (FilmVelocity != value)
                {
126
                    mPLCRegister.SetFloat(ADDR_D_FilmVelocity, (float)value );
潘栩锋's avatar
潘栩锋 committed
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
                    NotifyPropertyChanged("FilmVelocity");
                }
            }
        }


        public bool State
        {
            get
            {
                return mPLCRegister.GetBool(ADDR_C_STATE);
            }
            set
            {
                if (State != value)
                {
                    mPLCRegister.SetBool(ADDR_C_STATE, value);
                    NotifyPropertyChanged("State");
                }
            }
        }

149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
        public bool OK
        {
            get
            {
                return mPLCRegister.GetBool(ADDR_C_OK);
            }
            set
            {
                if (OK != value)
                {
                    mPLCRegister.SetBool(ADDR_C_OK, value);
                    NotifyPropertyChanged("OK");
                }
            }
        }
164
        private bool ok_last = false;
潘栩锋's avatar
潘栩锋 committed
165 166 167 168
        public HMI(Coating coating, CoatingCtrl cc, int port)
        {
            mCoatingCtrl = cc;
           
169
            mPLCRegister = new ModbusModule.PLCRegister(200, 200);
潘栩锋's avatar
潘栩锋 committed
170 171 172 173
            mbServer = new FLY.ModbusModule.ServerTCP(mPLCRegister, (UInt16)port);

            mPLCRegister.RegChanged += new ModbusModule.PLCRegister.RegChangedEventHandler(plcregister_RegChanged);

174 175
            ok_last = OK;

176 177 178 179 180 181 182 183
            Addrs_reg.Add(ADDR_D_PumpSet, "PumpSet");
            Addrs_reg.Add(ADDR_D_LeftSet, "LeftSet");
            Addrs_reg.Add(ADDR_D_Left, "Left");
            Addrs_reg.Add(ADDR_D_RightSet, "RightSet");
            Addrs_reg.Add(ADDR_D_Right, "Right");
            Addrs_reg.Add(ADDR_D_FilmVelocity, "FilmVelocity");
            Addrs_coil.Add(ADDR_C_OK, "OK");
            Addrs_coil.Add(ADDR_C_STATE, "State");
184

潘栩锋's avatar
潘栩锋 committed
185 186 187 188 189 190 191 192 193 194 195

            Misc.BindingOperations.SetBinding(cc.NowCtrl, "Pump", this, "PumpSet", Misc.BindingOperations.BindingMode.TwoWay);
            Misc.BindingOperations.SetBinding(cc.NowCtrl, "LeftDis", this, "Left");
            Misc.BindingOperations.SetBinding(cc.NowCtrl, "RightDis", this, "Right");
            Misc.BindingOperations.SetBinding(coating, "FilmVelocity", this, "FilmVelocity");
            Misc.BindingOperations.SetBinding(coating, "DeviceState", this, "State");


            LeftSet = Left;
            RightSet = Right;
            this.PropertyChanged += new PropertyChangedEventHandler(HMI_PropertyChanged);
196 197

            
潘栩锋's avatar
潘栩锋 committed
198 199 200 201
        }

        void HMI_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
202 203

            if (e.PropertyName == "OK")
潘栩锋's avatar
潘栩锋 committed
204
            {
205
                if (ok_last != OK)
206
                {
207 208 209 210 211 212
                    ok_last = OK;

                    if (OK == true)
                    {
                        mCoatingCtrl.SetCoatingCtrl(PumpSet, LeftSet, RightSet);
                    }
213
                }
潘栩锋's avatar
潘栩锋 committed
214 215 216 217 218 219 220
            }
        }

        void plcregister_RegChanged(object sender, ModbusModule.PLCRegister.RegChangedEventArgs e)
        {
            if (e.RegType == ModbusModule.PLCRegister.RegChangedEventArgs.REG_TYPE.REG)
            {
221
                foreach (UInt16 key in Addrs_reg.Keys)
潘栩锋's avatar
潘栩锋 committed
222 223 224
                {
                    if (e.IsCover(key))
                    {
225
                        NotifyPropertyChanged(Addrs_reg[key]);
潘栩锋's avatar
潘栩锋 committed
226 227 228 229 230
                    }
                }
            }
            else 
            {
231
                foreach (UInt16 key in Addrs_coil.Keys)
潘栩锋's avatar
潘栩锋 committed
232
                {
233 234 235 236
                    if (e.IsCover(key))
                    {
                        NotifyPropertyChanged(Addrs_coil[key]);
                    }
潘栩锋's avatar
潘栩锋 committed
237 238 239 240 241 242 243 244 245 246 247 248 249 250
                }
            }
        }

        protected void NotifyPropertyChanged(string propertyname)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyname));
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }
}