using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Net;
namespace FLY.Simulation.Blowing
{
public class HMI:INotifyPropertyChanged
{
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;
UInt16 heatupdate = 1;
UInt16 currupdate = 1;
UInt16 heatupdate_last = 1;
UInt16[] heats;
bool[] Bads;
public Blowing.AirRing mAirRing;
FLY.ModbusModule.ClientTCP mbclient;
public HMI()
{
mbclient = new FLY.ModbusModule.ClientTCP(IPAddress.Parse("127.0.0.1"));
heats = new UInt16[100];
Bads = new bool[100];
Array.Clear(heats, 0, 100);
Array.Clear(Bads, 0, 100);
Bads[2] = true;
Bads[30] = true;
heatupdate = 1;
heatupdate_last = 1;
currupdate = 1;
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();
bool current = false;
for (int i = 0; i < mAirRing.ChannelCnt; i++)
{
if ( (Bads[i]==false) && (mAirRing.Heats[i]>0))
{
current = true;
break;
}
}
HasElectricCurrent = current;
CurrUpdate++;
SendUpdate();
}
SendStatue();
}
public event PropertyChangedEventHandler PropertyChanged;
}
}