using AucmaEms.Common; using AucmaEms.Entity; using AucmaEms.SqlSugar; using AucmaEms.SqlSugar.Impl; using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Web.UI.WebControls; using TouchSocket.Core.Config; using TouchSocket.Sockets; using TcpClient = TouchSocket.Sockets.TcpClient; namespace AucmaEms { internal class Program { private static TcpServer server = TcpServer.Instance; private static LogHelper logHelper = LogHelper.Instance; private static AppConfig appConfig = AppConfig.Instance; static void Main(string[] args) { printMessage("服务启动"); Thread.Sleep(3000); while (true) { CollectEmsData_2Q(); Thread.Sleep(1000 * 60 * appConfig.ReadIntervel); } } /// /// 一期采集读取现场电表数据 /// static async void CollectEmsData_1Q() { Business business = Business.Instance; List monitorInfos = await business.monitorInfos("PDS"); if (monitorInfos == null) return; int monitorInfosLength = monitorInfos.Count; try { for (int i = 0; i < monitorInfosLength; i++) { BaseMonitorInfo info = monitorInfos[i]; if (info != null) { TcpClient m_tcpClient = new TcpClient(); try { string title = info.monitorName + DateTime.Now.ToString("MM-dd HH:mm:ss"); Console.WriteLine("-------------------------" + title.PadRight(25,'-') + "-----------------------"); //声明配置 TouchSocketConfig config = new TouchSocketConfig(); config.SetRemoteIPHost(new IPHost(info.networkAddress+":502")).UsePlugin().SetBufferLength(1024 * 10); //载入配置 m_tcpClient.Setup(config); m_tcpClient.Connect(); ScadaEmsElectricLoss scadaEmsElectric = new ScadaEmsElectricLoss(); byte[] zxyg_Bytes = business.packageBuffer(new byte[]{ Convert.ToByte(info.monitorId), 0x03, 0x04, 0x4B, 0x00, 0x02 }); logHelper.SemaphoreLog(String.Format("{0}:{1}发送获取正向有功指令:{2}",info.monitorName,info.networkAddress,StringChange.bytesToHexStr(zxyg_Bytes, zxyg_Bytes.Length))); byte[] zxyg_buffer = m_tcpClient.GetWaitingClient(WaitingOptions.AllAdapter).SendThenReturn(zxyg_Bytes, 2000); logHelper.SemaphoreLog(String.Format("{0}:{1}接收正向有功指令:{2}", info.monitorName, info.networkAddress, StringChange.bytesToHexStr(zxyg_buffer, zxyg_buffer.Length))); scadaEmsElectric.zxyg = business.byteToFloat(zxyg_buffer.Skip(3).Take(4).ToArray(), 100); printMessage(String.Format("{0}正向有功:{1}", info.monitorName, scadaEmsElectric.zxyg)); //取三项电压 byte[] v_Byte = business.packageBuffer(new byte[] { Convert.ToByte(info.monitorId), 0x03, 0x03, 0xE7, 0x00, 0x06 }); logHelper.SemaphoreLog(String.Format("{0}:{1}发送获取三相电压指令:{2}", info.monitorName, info.networkAddress, StringChange.bytesToHexStr(v_Byte, v_Byte.Length))); byte[] v_Buffer = m_tcpClient.GetWaitingClient(WaitingOptions.AllAdapter).SendThenReturn(v_Byte, 2000); logHelper.SemaphoreLog(String.Format("{0}:{1}接收三相电压指令:{2}", info.monitorName, info.networkAddress, StringChange.bytesToHexStr(v_Buffer, v_Buffer.Length))); scadaEmsElectric.va = business.byteToFloat(v_Buffer.Skip(3).Take(4).ToArray(), 1000); scadaEmsElectric.vb = business.byteToFloat(v_Buffer.Skip(7).Take(4).ToArray(), 1000); scadaEmsElectric.vc = business.byteToFloat(v_Buffer.Skip(11).Take(4).ToArray(), 1000); printMessage(String.Format("{0}A项电压:{1},B项电压:{2},C项电压:{3}", info.monitorName, scadaEmsElectric.va, scadaEmsElectric.vb, scadaEmsElectric.vc)); //取三项电流 byte[] i_Byte = business.packageBuffer(new byte[] { Convert.ToByte(info.monitorId), 0x03, 0x03, 0xF3, 0x00, 0x06 }); logHelper.SemaphoreLog(String.Format("{0}:{1}发送获取三相电流指令:{2}", info.monitorName, info.networkAddress, StringChange.bytesToHexStr(i_Byte, i_Byte.Length))); byte[] i_Buffer = m_tcpClient.GetWaitingClient(WaitingOptions.AllAdapter).SendThenReturn(i_Byte, 2000); logHelper.SemaphoreLog(String.Format("{0}:{1}接收三相电流指令:{2}", info.monitorName, info.networkAddress, StringChange.bytesToHexStr(i_Buffer, i_Buffer.Length))); scadaEmsElectric.ia = business.byteToFloat(i_Buffer.Skip(3).Take(4).ToArray(), 1000); scadaEmsElectric.ib = business.byteToFloat(i_Buffer.Skip(7).Take(4).ToArray(), 1000); scadaEmsElectric.ic = business.byteToFloat(i_Buffer.Skip(11).Take(4).ToArray(), 1000); printMessage(String.Format("{0}A项电流:{1},B项电流:{2},C项电流:{3}", info.monitorName, scadaEmsElectric.ia, scadaEmsElectric.ib, scadaEmsElectric.ic)); scadaEmsElectric.collectTime = DateTime.Now; scadaEmsElectric.monitorId = info.monitorId; scadaEmsElectric.uuid = System.Guid.NewGuid().ToString("N"); business.SaveDate(info, scadaEmsElectric); //断开连接 if (m_tcpClient.Online) { m_tcpClient.Shutdown(System.Net.Sockets.SocketShutdown.Both); m_tcpClient.Close(); m_tcpClient.SafeDispose(); } } catch (TimeoutException) { printMessage(info.monitorName+"等待超时"); if (m_tcpClient.Online) { m_tcpClient.Shutdown(System.Net.Sockets.SocketShutdown.Both); m_tcpClient.Close(); m_tcpClient.SafeDispose(); } } } } } catch (Exception ex) { logHelper.Error("数据采集异常", ex); } } /// /// 二期采集读取现场电表数据 /// static async void CollectEmsData_2Q() { Business business = Business.Instance; List monitorInfos = await business.monitorInfos("2QPDG"); if (monitorInfos == null) return; int monitorInfosLength = monitorInfos.Count; try { for (int i = 0; i < monitorInfosLength; i++) { BaseMonitorInfo info = monitorInfos[i]; if (info != null) { string monitorId = info.monitorId.Replace("2Q_", ""); TcpClient m_tcpClient = new TcpClient(); try { string title = info.monitorName + DateTime.Now.ToString("MM-dd HH:mm:ss"); Console.WriteLine("-------------------------" + title.PadRight(25, '-') + "-----------------------"); //声明配置 TouchSocketConfig config = new TouchSocketConfig(); config.SetRemoteIPHost(new IPHost(info.networkAddress + ":502")).UsePlugin().SetBufferLength(1024 * 10); //载入配置 m_tcpClient.Setup(config); m_tcpClient.Connect(); ScadaEmsElectricLoss scadaEmsElectric = new ScadaEmsElectricLoss(); byte[] zxyg_Bytes = business.packageBuffer(new byte[] { Convert.ToByte(monitorId), 0x03, 0x04, 0x4B, 0x00, 0x02 }); logHelper.SemaphoreLog(String.Format("{0}:{1}发送获取正向有功指令:{2}", info.monitorName, info.networkAddress, StringChange.bytesToHexStr(zxyg_Bytes, zxyg_Bytes.Length))); byte[] zxyg_buffer = m_tcpClient.GetWaitingClient(WaitingOptions.AllAdapter).SendThenReturn(zxyg_Bytes, 2000); logHelper.SemaphoreLog(String.Format("{0}:{1}接收正向有功指令:{2}", info.monitorName, info.networkAddress, StringChange.bytesToHexStr(zxyg_buffer, zxyg_buffer.Length))); scadaEmsElectric.zxyg = business.byteToFloat(zxyg_buffer.Skip(3).Take(4).ToArray(), 100); printMessage(String.Format("{0}正向有功:{1}", info.monitorName, scadaEmsElectric.zxyg)); //取三项电压 byte[] v_Byte = business.packageBuffer(new byte[] { Convert.ToByte(monitorId), 0x03, 0x03, 0xE7, 0x00, 0x06 }); logHelper.SemaphoreLog(String.Format("{0}:{1}发送获取三相电压指令:{2}", info.monitorName, info.networkAddress, StringChange.bytesToHexStr(v_Byte, v_Byte.Length))); byte[] v_Buffer = m_tcpClient.GetWaitingClient(WaitingOptions.AllAdapter).SendThenReturn(v_Byte, 2000); logHelper.SemaphoreLog(String.Format("{0}:{1}接收三相电压指令:{2}", info.monitorName, info.networkAddress, StringChange.bytesToHexStr(v_Buffer, v_Buffer.Length))); scadaEmsElectric.va = business.byteToFloat(v_Buffer.Skip(3).Take(4).ToArray(), 1000); scadaEmsElectric.vb = business.byteToFloat(v_Buffer.Skip(7).Take(4).ToArray(), 1000); scadaEmsElectric.vc = business.byteToFloat(v_Buffer.Skip(11).Take(4).ToArray(), 1000); printMessage(String.Format("{0}A项电压:{1},B项电压:{2},C项电压:{3}", info.monitorName, scadaEmsElectric.va, scadaEmsElectric.vb, scadaEmsElectric.vc)); //取三项电流 byte[] i_Byte = business.packageBuffer(new byte[] { Convert.ToByte(monitorId), 0x03, 0x03, 0xF3, 0x00, 0x06 }); logHelper.SemaphoreLog(String.Format("{0}:{1}发送获取三相电流指令:{2}", info.monitorName, info.networkAddress, StringChange.bytesToHexStr(i_Byte, i_Byte.Length))); byte[] i_Buffer = m_tcpClient.GetWaitingClient(WaitingOptions.AllAdapter).SendThenReturn(i_Byte, 2000); logHelper.SemaphoreLog(String.Format("{0}:{1}接收三相电流指令:{2}", info.monitorName, info.networkAddress, StringChange.bytesToHexStr(i_Buffer, i_Buffer.Length))); scadaEmsElectric.ia = business.byteToFloat(i_Buffer.Skip(3).Take(4).ToArray(), 1000); scadaEmsElectric.ib = business.byteToFloat(i_Buffer.Skip(7).Take(4).ToArray(), 1000); scadaEmsElectric.ic = business.byteToFloat(i_Buffer.Skip(11).Take(4).ToArray(), 1000); printMessage(String.Format("{0}A项电流:{1},B项电流:{2},C项电流:{3}", info.monitorName, scadaEmsElectric.ia, scadaEmsElectric.ib, scadaEmsElectric.ic)); scadaEmsElectric.collectTime = DateTime.Now; scadaEmsElectric.monitorId = info.monitorId; scadaEmsElectric.uuid = System.Guid.NewGuid().ToString("N"); business.SaveDate(info, scadaEmsElectric); //断开连接 if (m_tcpClient.Online) { m_tcpClient.Shutdown(System.Net.Sockets.SocketShutdown.Both); m_tcpClient.Close(); m_tcpClient.SafeDispose(); } } catch (TimeoutException) { printMessage(info.monitorName + "等待超时"); if (m_tcpClient.Online) { m_tcpClient.Shutdown(System.Net.Sockets.SocketShutdown.Both); m_tcpClient.Close(); m_tcpClient.SafeDispose(); } } } } } catch (Exception ex) { logHelper.Error("数据采集异常", ex); } } private static void printMessage(string message) { Console.WriteLine(message); logHelper.Info(message); } } }