using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using System.Net; using System.IO; namespace FLY.Simulation.Blowing { public class HMI: IPlcLink { const int ADDR_M_HasElectricCurrent = 0;//bit 三相电 电流 const int ADDR_M_HasFan = 1;//bit 风机启动 const int ADDR_D_ChannelCnt = 0; const int ADDR_D_HeatUpdate = 1; const int ADDR_D_CurrUpdate = 2; const UInt16 ADDR_D_Heats = 100; const UInt16 ADDR_D_Currs = 300; public UInt16 HeatUpdate { get; set; } public UInt16 CurrUpdate { get; set; } /// /// 当前电流 有没? /// public bool HasElectricCurrent { get; set; } /// /// 风机是否启动? /// public bool HasFan { get; set; } = true; public string PlcAddr { get; set; } = "127.0.0.1"; UInt16 heatupdate = 1; UInt16 currupdate = 1; UInt16 heatupdate_last = 1; UInt16[] heats; public Blowing.AirRing mAirRing; FLY.ModbusModule.ClientTCP mbclient; public HMI() { if (!Load()) Save(); heats = new UInt16[100]; Array.Clear(heats, 0, 100); heatupdate = 1; heatupdate_last = 1; currupdate = 1; } public void Init(Blowing.AirRing mAirRing) { this.mAirRing = mAirRing; mbclient = new FLY.ModbusModule.ClientTCP(IPAddress.Parse(PlcAddr)); mbclient.PropertyChanged += new PropertyChangedEventHandler(mbclient_PropertyChanged); //每1秒读取一次 FObjBase.PollModule.Current.Poll_Config(FObjBase.PollModule.POLL_CONFIG.ADD, new FObjBase.PollModule.PollHandler(OnPoll), TimeSpan.FromMilliseconds(200)); } void mbclient_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "IsConnected") { if (mbclient.IsConnected) { step = 0; } else { step = -1; } } } int step = -1; void OnPoll() { switch (step) { case 0: mbclient.Do_03(ADDR_D_HeatUpdate, 1, delegate(UInt16[] datas, object AsyncState) { HeatUpdate = datas[0]; step = 2; }, null); step = 1; break; case 2: mbclient.Do_03(ADDR_D_Heats, 100, delegate(UInt16[] datas, object AsyncState) { Array.Copy(datas, heats, 100); step = 4; }, null); step = 3; break; case 4: OnPoll_send(); step = 0; break; } } void SendHeats() { mbclient.Do_10(ADDR_D_Currs,heats); } void SendUpdate() { mbclient.Do_10(ADDR_D_CurrUpdate, new ushort[]{ CurrUpdate}); } void SendStatue() { mbclient.Do_0F(ADDR_M_HasElectricCurrent, new bool[] { HasElectricCurrent, HasFan }); } void OnPoll_send() { if (heatupdate_last != HeatUpdate) { heatupdate_last = HeatUpdate; for (int i = 0; i < mAirRing.ChannelCnt; i++) { mAirRing.Heats[i] = heats[i]; } mAirRing.HeatApply(); SendHeats(); HasElectricCurrent = mAirRing.HasElectricCurrent; CurrUpdate++; SendUpdate(); } SendStatue(); } string filePath = "airRingPlc.json"; bool Load() { return HmiJsonDb.Load(filePath, this); } public bool Save() { return HmiJsonDb.Save(filePath, this); } public event PropertyChangedEventHandler PropertyChanged; } public class HmiJsonDb { public string PlcAddr = "127.0.0.1"; public static bool Save(string filePath, HMI plcLink) { try { HmiJsonDb jsondb = new HmiJsonDb() { PlcAddr = plcLink.PlcAddr }; string json = Newtonsoft.Json.JsonConvert.SerializeObject(jsondb, Newtonsoft.Json.Formatting.Indented); File.WriteAllText(filePath, json); return true; } catch { return false; } } public static bool Load(string filePath, HMI plcLink) { try { if (!File.Exists(filePath)) return false; string json = File.ReadAllText(filePath); var jsonDb = Newtonsoft.Json.JsonConvert.DeserializeObject(json); plcLink.PlcAddr = jsonDb.PlcAddr; return true; } catch { return false; } } } }