|
@@ -93,6 +93,10 @@ namespace Monitor
|
|
|
/// </summary>
|
|
|
public static int garageID;
|
|
|
/// <summary>
|
|
|
+ /// PLC读取锁
|
|
|
+ /// </summary>
|
|
|
+ public static object PLCReadLock = new object();
|
|
|
+ /// <summary>
|
|
|
/// 将显示在界面的提示字符串
|
|
|
/// </summary>
|
|
|
private static Queue<string> notificationQueue = new Queue<string>();
|
|
@@ -101,83 +105,93 @@ namespace Monitor
|
|
|
private void PLCUpdate()
|
|
|
{
|
|
|
int linkCount = 0;
|
|
|
+ int count = 0;
|
|
|
bool disconnected = false;
|
|
|
while (!isClosing)
|
|
|
{
|
|
|
+ if (count > 10000)
|
|
|
+ count = 11;
|
|
|
+ count++;
|
|
|
if (PLC != null)
|
|
|
{
|
|
|
if (PLC.isConnected)
|
|
|
{
|
|
|
if (disconnected) {disconnected = false; SetNotification("PLC已重新连接",TextColor.Info); }
|
|
|
linkCount = 0;
|
|
|
- List<object> received = PLC.ReadFromPLC(PLCDataType.terminal, 0);
|
|
|
- //首先获取所有终端信息
|
|
|
- try
|
|
|
+ lock (PLCReadLock)
|
|
|
{
|
|
|
- //终端总数相同
|
|
|
- if (Terminal.Terminal.terminalInfo.Count == plcTerminalCount)
|
|
|
+ List<object> received = PLC.ReadFromPLC(PLCDataType.terminal, 0);
|
|
|
+ //首先获取所有终端信息
|
|
|
+ try
|
|
|
{
|
|
|
- for (int i = 0; i < plcTerminalCount; i++)
|
|
|
+ //终端总数相同
|
|
|
+ if (Terminal.Terminal.terminalInfo.Count == plcTerminalCount)
|
|
|
{
|
|
|
- //一旦发现差异立刻更新
|
|
|
- if (!Terminal.Terminal.terminalInfo[i].Equals(received[i]))
|
|
|
+ for (int i = 0; i < plcTerminalCount; i++)
|
|
|
{
|
|
|
- Terminal.Terminal.terminalInfo[i] = (TerminalStru)received[i];
|
|
|
+ //一旦发现差异立刻更新
|
|
|
+ if (!Terminal.Terminal.terminalInfo[i].Equals(received[i]))
|
|
|
+ {
|
|
|
+ Terminal.Terminal.terminalInfo[i] = (TerminalStru)received[i];
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //初始化终端信息列表
|
|
|
- Terminal.Terminal.terminalInfo.Clear();
|
|
|
- for (int i = 0; i < plcTerminalCount; i++)
|
|
|
+ else
|
|
|
{
|
|
|
- Terminal.Terminal.terminalInfo.Add((TerminalStru)received[i]);
|
|
|
- if (!Terminal.Terminal.termCalcMap.ContainsKey(((TerminalStru)received[i]).terminalID))
|
|
|
- Terminal.Terminal.termCalcMap.Add(((TerminalStru)received[i]).terminalID, false);
|
|
|
- else
|
|
|
- Terminal.Terminal.termCalcMap[((TerminalStru)received[i]).terminalID] = false;
|
|
|
+ //初始化终端信息列表
|
|
|
+ Terminal.Terminal.terminalInfo.Clear();
|
|
|
+ for (int i = 0; i < plcTerminalCount; i++)
|
|
|
+ {
|
|
|
+ Terminal.Terminal.terminalInfo.Add((TerminalStru)received[i]);
|
|
|
+ if (!Terminal.Terminal.termCalcMap.ContainsKey(((TerminalStru)received[i]).terminalID))
|
|
|
+ Terminal.Terminal.termCalcMap.Add(((TerminalStru)received[i]).terminalID, false);
|
|
|
+ else
|
|
|
+ Terminal.Terminal.termCalcMap[((TerminalStru)received[i]).terminalID] = false;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- catch (Exception ex) { Console.WriteLine("PLC监控终端数据," + ex.Message); }
|
|
|
- //接下来获取中控监控信息
|
|
|
- try
|
|
|
- {
|
|
|
- received = PLC.ReadFromPLC(PLCDataType.central, 0);
|
|
|
- if (received.Count > 0 && !mainBlockInfo.Equals(received[0]))
|
|
|
- {
|
|
|
- mainBlockInfo = (MainBlockStru)received[0];
|
|
|
- }
|
|
|
- }
|
|
|
- catch (Exception ex) { Console.WriteLine("PLC监控中控数据," + ex.Message); }
|
|
|
- //最后获得所有车位信息
|
|
|
- try
|
|
|
- {
|
|
|
- received = PLC.ReadFromPLC(PLCDataType.parkingSpace, 0);
|
|
|
- //Console.WriteLine(parkingSpaceInfo.Count+","+ plcParkingSpaceCount);
|
|
|
- //车位总数相同
|
|
|
- if (parkingSpaceInfo.Count == plcParkingSpaceCount)
|
|
|
+ catch (Exception ex) { Console.WriteLine("PLC监控终端数据," + ex.Message); }
|
|
|
+ //接下来获取中控监控信息
|
|
|
+ try
|
|
|
{
|
|
|
- for (int i = 0; i < plcParkingSpaceCount; i++)
|
|
|
+ received = PLC.ReadFromPLC(PLCDataType.central, 0);
|
|
|
+ if (received.Count > 0 && !mainBlockInfo.Equals(received[0]))
|
|
|
{
|
|
|
- //一旦发现差异立刻更新
|
|
|
- if (!parkingSpaceInfo[i].Equals(received[i]))
|
|
|
- {
|
|
|
- parkingSpaceInfo[i] = (ParkingSpaceStru)received[i];
|
|
|
- }
|
|
|
+ mainBlockInfo = (MainBlockStru)received[0];
|
|
|
}
|
|
|
}
|
|
|
- else
|
|
|
+ catch (Exception ex) { Console.WriteLine("PLC监控中控数据," + ex.Message); }
|
|
|
+ //最后获得所有车位信息
|
|
|
+ if (count < 10)
|
|
|
{
|
|
|
- parkingSpaceInfo.Clear();
|
|
|
- for (int i = 0; i < plcParkingSpaceCount; i++)
|
|
|
+ try
|
|
|
{
|
|
|
- parkingSpaceInfo.Add((ParkingSpaceStru)received[i]);
|
|
|
+ received = PLC.ReadFromPLC(PLCDataType.parkingSpace, 0);
|
|
|
+ //Console.WriteLine(parkingSpaceInfo.Count+","+ plcParkingSpaceCount);
|
|
|
+ //车位总数相同
|
|
|
+ if (parkingSpaceInfo.Count == plcParkingSpaceCount)
|
|
|
+ {
|
|
|
+ for (int i = 0; i < plcParkingSpaceCount; i++)
|
|
|
+ {
|
|
|
+ //一旦发现差异立刻更新
|
|
|
+ if (!parkingSpaceInfo[i].Equals(received[i]))
|
|
|
+ {
|
|
|
+ parkingSpaceInfo[i] = (ParkingSpaceStru)received[i];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ parkingSpaceInfo.Clear();
|
|
|
+ for (int i = 0; i < plcParkingSpaceCount; i++)
|
|
|
+ {
|
|
|
+ parkingSpaceInfo.Add((ParkingSpaceStru)received[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+ catch (Exception ex) { Console.WriteLine("PLC监控车位数据," + ex.Message); }
|
|
|
}
|
|
|
}
|
|
|
- catch (Exception ex) { Console.WriteLine("PLC监控车位数据," + ex.Message); }
|
|
|
}
|
|
|
else
|
|
|
{
|