Browse Source

DAServer.CS添加注释

pull/17/head
zhangfl0220 9 years ago
parent
commit
b752082a22
  1. 44
      SCADA/Program/BatchCoreService/DAService.cs
  2. 2
      SCADA/Program/BatchCoreTest/Program.cs

44
SCADA/Program/BatchCoreService/DAService.cs

@ -212,9 +212,13 @@ namespace BatchCoreService
} }
} }
#region 初始化服务器,连接和主机等
public DAService() public DAService()
{ {
if (!EventLog.SourceExists(SERVICELOGSOURCE))
#region 创建事件日志
if (!EventLog.SourceExists(SERVICELOGSOURCE))//服务器记录的源和名称都是"DataProcess"
{ {
EventLog.CreateEventSource(SERVICELOGSOURCE, SERVICELOGNAME); EventLog.CreateEventSource(SERVICELOGSOURCE, SERVICELOGNAME);
} }
@ -228,6 +232,8 @@ namespace BatchCoreService
// 當EventLog 滿了就把最早的那一筆log 蓋掉。 // 當EventLog 滿了就把最早的那一筆log 蓋掉。
Log.ModifyOverflowPolicy(OverflowAction.OverwriteAsNeeded, 7); Log.ModifyOverflowPolicy(OverflowAction.OverwriteAsNeeded, 7);
} }
#endregion
_scales = new List<Scaling>(); _scales = new List<Scaling>();
_drivers = new SortedList<short, IDriver>(); _drivers = new SortedList<short, IDriver>();
_alarmList = new List<AlarmItem>(ALARMLIMIT + 10); _alarmList = new List<AlarmItem>(ALARMLIMIT + 10);
@ -262,6 +268,8 @@ namespace BatchCoreService
} }
} }
#endregion
public void Dispose() public void Dispose()
{ {
lock (this) lock (this)
@ -409,7 +417,7 @@ namespace BatchCoreService
{ {
foreach (IDriver reader in _drivers.Values) foreach (IDriver reader in _drivers.Values)
{ {
reader.OnClose += new ShutdownRequestEventHandler(reader_OnClose); reader.OnClose += new ShutdownRequestEventHandler(reader_OnClose);//每次连接失败,记录失败原因日志。
if (reader.IsClosed) if (reader.IsClosed)
{ {
//if (reader is IFileDriver) //if (reader is IFileDriver)
@ -574,8 +582,8 @@ namespace BatchCoreService
* UDP广播加密的主机名 * UDP广播加密的主机名
*/ */
//socketThreadList = new Dictionary<IPAddress, Socket>(); //socketThreadList = new Dictionary<IPAddress, Socket>();
tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//新建一个套接字
IPEndPoint LocalPort = new IPEndPoint(IPAddress.Any, PORT); IPEndPoint LocalPort = new IPEndPoint(IPAddress.Any, PORT);//IPEndPoint是IP和端口对的组合,IPAdress.Any使用你机器上一个可用的IP来初始化这个IP地址对象。
tcpServer.Bind(LocalPort); tcpServer.Bind(LocalPort);
tcpServer.Listen(100); tcpServer.Listen(100);
ThreadPool.QueueUserWorkItem(new WaitCallback(AcceptWorkThread)); ThreadPool.QueueUserWorkItem(new WaitCallback(AcceptWorkThread));
@ -607,7 +615,7 @@ namespace BatchCoreService
if (reader.MoveToAttribute("TestCycle")) if (reader.MoveToAttribute("TestCycle"))
int.TryParse(reader.Value, out CYCLE); int.TryParse(reader.Value, out CYCLE);
if (reader.MoveToAttribute("SendTimeout")) if (reader.MoveToAttribute("SendTimeout"))
int.TryParse(reader.Value, out SENDTIMEOUT); int.TryParse(reader.Value, out SENDTIMEOUT);//客户端Socket通讯发送超时
} }
break; break;
case "Hda"://历史记录的参数 case "Hda"://历史记录的参数
@ -652,37 +660,37 @@ namespace BatchCoreService
while (true) while (true)
{ {
//if (tcpServer.Poll(0, SelectMode.SelectRead)) //if (tcpServer.Poll(0, SelectMode.SelectRead))
Socket s_Accept = tcpServer.Accept(); Socket s_Accept = tcpServer.Accept();//有连接后,接受客户端的连接请求。
//IPAddress addr = (s_Accept.RemoteEndPoint as IPEndPoint).Address; //IPAddress addr = (s_Accept.RemoteEndPoint as IPEndPoint).Address;
s_Accept.SendTimeout = SENDTIMEOUT; s_Accept.SendTimeout = SENDTIMEOUT;
IPAddress addr = (s_Accept.RemoteEndPoint as IPEndPoint).Address; IPAddress addr = (s_Accept.RemoteEndPoint as IPEndPoint).Address;//客户端的IP地址
try try
{ {
if (!_socketThreadList.ContainsKey(addr)) if (!_socketThreadList.ContainsKey(addr))//键查找:如果字典中不存在IP地址,将客户端的IP添加到字典中
_socketThreadList.Add(addr, s_Accept); _socketThreadList.Add(addr, s_Accept);
} }
catch (Exception err) catch (Exception err)
{ {
AddErrorLog(err); AddErrorLog(err);
} }
ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(ReceiveWorkThread), s_Accept); ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(ReceiveWorkThread), s_Accept);//线程池中不安全的线程。线程池将s_Accept传送给ReceiveWorkThread
} }
} }
void ReceiveWorkThread(object obj) void ReceiveWorkThread(object obj)
{ {
Socket s_Receive = (Socket)obj; Socket s_Receive = (Socket)obj;//创建新的接收通道Socket
IPAddress addr = null; IPAddress addr = null;
try try
{ {
addr = (s_Receive.RemoteEndPoint as IPEndPoint).Address; addr = (s_Receive.RemoteEndPoint as IPEndPoint).Address;//获取远程终结点。
} }
catch (Exception err) catch (Exception err)
{ {
AddErrorLog(err); AddErrorLog(err);
return; return;
} }
byte[] buffer = new byte[s_Receive.ReceiveBufferSize]; // 创建接收缓冲 byte[] buffer = new byte[s_Receive.ReceiveBufferSize]; // 创建接收缓冲,默认的接收缓冲区的大小是多少?
while (true) while (true)
{ {
try try
@ -698,12 +706,12 @@ namespace BatchCoreService
{ {
//buffer[0]是协议头,1是指令号,2是读方式(缓存还是设备),3、4是ID,5是长度,后接变量值 //buffer[0]是协议头,1是指令号,2是读方式(缓存还是设备),3、4是ID,5是长度,后接变量值
byte command = buffer[1]; byte command = buffer[1];
switch (command) switch (command)//根据指令号来操作对应的程序。
{ {
case FCTCOMMAND.fctReadSingle: case FCTCOMMAND.fctReadSingle://来自DataServer中的IServer下面的类FCTCOMMAND
{ {
//DataSource source = buffer[2] == 0 ? DataSource.Cache : DataSource.Device; //DataSource source = buffer[2] == 0 ? DataSource.Cache : DataSource.Device;
short id = BitConverter.ToInt16(buffer, 3); short id = BitConverter.ToInt16(buffer, 3);//将二进制数转换成整数
byte length = buffer[5]; byte length = buffer[5];
byte[] send = new byte[5 + length]; byte[] send = new byte[5 + length];
for (int i = 0; i < 5; i++) for (int i = 0; i < 5; i++)
@ -1347,6 +1355,8 @@ namespace BatchCoreService
return rs; return rs;
} }
#region New region
void grp_DataChange(object sender, DataChangeEventArgs e) void grp_DataChange(object sender, DataChangeEventArgs e)
{ {
var data = e.Values; var data = e.Values;
@ -1376,7 +1386,11 @@ namespace BatchCoreService
ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(this.SendData), new TempCachedData(addr, data)); ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(this.SendData), new TempCachedData(addr, data));
} }
} }
#endregion
//此处发生内存泄漏;需要试验CLRProfile确定泄漏原因;改回原方法测试;看是否解决队列堵塞问题。对于客户端Grp,要过滤掉 //此处发生内存泄漏;需要试验CLRProfile确定泄漏原因;改回原方法测试;看是否解决队列堵塞问题。对于客户端Grp,要过滤掉
private void SendData(object obj) private void SendData(object obj)
{ {
var tempdata = obj as TempCachedData; var tempdata = obj as TempCachedData;

2
SCADA/Program/BatchCoreTest/Program.cs

@ -30,7 +30,7 @@ namespace BatchCoreService
// Create a ServiceHost for the CalculatorService type and // Create a ServiceHost for the CalculatorService type and
// provide the base address. // provide the base address.
serviceHost = new ServiceHost(typeof(DAService)); serviceHost = new ServiceHost(typeof(DAService));//MCF通讯
// Open the ServiceHostBase to create listeners and start // Open the ServiceHostBase to create listeners and start
// listening for messages. // listening for messages.

Loading…
Cancel
Save