using Chloe; using DNSD_DB; using DNSD_DB.Entity; using NDSD_Screwdriver.Tool; using NDSD_TouchSocket; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Text; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Timers; using System.Windows.Forms; using System.Xml.Serialization; using NewLife.Caching; namespace NDSD_Screwdriver { public partial class MainForm : Form { /// /// 输出端口操作 /// private DOperate DOperateInfo; /// /// TCP服务器 /// private TcpServer server = TcpServer.Instance; /// /// 前端列表集合 /// private List monitorEntities; private List RFIDConfigEntitys; private Random rand = new Random(); /// /// RFID状态列表 /// public List RFIDStatesEntities; /// /// 报警灯配置实例 /// public List lightsEntities; /// /// 日志实例 /// public List RFIDLogsEntitys; /// /// 日志数据库操作实例 /// public IDbContext LogContext; // Thread flashThread; SerialPortFactory serialPort; private CancellationTokenSource cancellationTokenSource; private CancellationTokenSource sendCancellationTokenSource; public int textRFID = 0; private Queue _methodQueue; private ICache cache = Cache.Default; int FlashIndex = 0; bool _flashflag = true; public MainForm() { InitializeComponent(); _methodQueue = new Queue(); FlashThreadTime(); var memorySetting = MemorySetting.Current; SqlLiteTool.CreateTable(memorySetting.DB); LogContext = SqlLiteTool.GetDb(memorySetting.DB); RFIDLogsEntitys = LogContext.Query().OrderByDesc(a => a.CreateTime).Take(200).ToList(); LogDataGridView.AutoGenerateColumns = false; LogDataGridView.DataSource = null; LogDataGridView.DataSource = RFIDLogsEntitys; DOperateInfo = new DOperate(); if (!server.ServerOpen(memorySetting.ServerIP, memorySetting.ServerPort)) { MessageBox.Show("服务端打开失败!"); FormUtils.LogInsert(LogContext, "服务端打开失败"); } try { serialPort = new SerialPortFactory(memorySetting.Com); StartLongRunningTask(); SendRunningTask(); } catch (Exception e) { MessageBox.Show(e.Message); FormUtils.LogInsert(LogContext, e.Message); } } private void MainForm_FormClosed(object sender, FormClosedEventArgs e) { if (server != null) { if (!server.ServerStop()) { MessageBox.Show("服务端关闭失败!"); FormUtils.LogInsert(LogContext, "服务端关闭失败"); } if (!server.ServerDispose()) { MessageBox.Show("服务端释放失败!"); FormUtils.LogInsert(LogContext, "服务端释放失败"); } } if (sendCancellationTokenSource != null) { sendCancellationTokenSource.Cancel(); } if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); } timer.Close(); timer.Dispose(); } #region 按钮 /// /// 打开DO测试 /// /// /// private void DOTest_Click(object sender, EventArgs e) { //string str = serialPort.Read(); ScrewdriverTest screwdriverTest = new ScrewdriverTest(server, DOperateInfo); screwdriverTest.Show(); } /// /// 初始化按钮 /// /// /// private void InitButton_Click(object sender, EventArgs e) { InitTable(); } /// /// 初始化Table /// private void InitTable() { _flashflag = true; FlashIndex = 0; textRFID = 0; timer.Start(); var memorySetting = MemorySetting.Current; //读取rfid数据 var ctx = SqlLiteTool.GetDb(memorySetting.DB); var list = ctx.Query().Where(x => x.IsEnable == true).ToList(); var strs = list.Select(x => x.RfidNo).ToArray(); RFIDStatesEntities = new List(); RFIDStatesEntities.Clear(); foreach (var a in strs) { RFIDStatesEntities.Add(new RFIDStatesEntity() { RFIDValue = a, }); } RFIDStatesEntities[0].RFIDState = 2; FormUtils.LogInsert(LogContext, "RFID " + 0 + " 准备工作", RFIDStatesEntities[0].RFIDValue); GetLog(); //读取报警灯数据 lightsEntities = new List(); lightsEntities.Clear(); for (int i = 0; i < list.Count; i++) { lightsEntities.Add(new LightsEntity() { Green = Convert.ToInt32(list[i].Green), Yellow = Convert.ToInt32(list[i].Yellow), Red = Convert.ToInt32(list[i].Red), }); } //初始化列表框架 monitorEntities = new List(); monitorEntities.Clear(); for (int i = 0; i < RFIDStatesEntities.Count; i++) { monitorEntities.Add(new MonitorEntity() { RowIndex = i, RowEntitys = InitRows(i) }); } //更新值 for (int i = 0; i < RFIDStatesEntities.Count; i++) { monitorEntities[i].RowEntitys[1].Value = RFIDStatesEntities[i].RFIDValue; } timer.Start(); RefreshRoll(); RefreshIO(); } /// /// 打开设置界面 /// /// /// private void SettingButton_Click(object sender, EventArgs e) { FrmSetting frmSetting = new FrmSetting(); frmSetting.Show(); } /// /// 服务端重启按钮 /// /// /// private void ServerRestartButton_Click(object sender, EventArgs e) { var memorySetting = MemorySetting.Current; if (server.ServerRestart(memorySetting.ServerIP, memorySetting.ServerPort)) { MessageBox.Show("服务器重启成功!"); FormUtils.LogInsert(LogContext, "服务器重启成功"); } else { MessageBox.Show("服务器重启失败!请手动启动服务器。"); FormUtils.LogInsert(LogContext, "服务器重启失败"); } } /// /// 服务端手动启动 /// /// /// private void StartServerButton_Click(object sender, EventArgs e) { var memorySetting = MemorySetting.Current; if (!server.ServerOpen(memorySetting.ServerIP, memorySetting.ServerPort)) { MessageBox.Show("服务端打开失败!"); FormUtils.LogInsert(LogContext, "服务端打开失败"); } else { MessageBox.Show("服务器启动成功"); FormUtils.LogInsert(LogContext, "服务器启动成功"); } } /// /// 服务端手动停止 /// /// /// private void ServerStopButton_Click(object sender, EventArgs e) { if (server != null) { if (!server.ServerStop()) { MessageBox.Show("服务端关闭失败!"); FormUtils.LogInsert(LogContext, "服务端关闭失败"); } if (!server.ServerDispose()) { MessageBox.Show("服务端释放失败!"); FormUtils.LogInsert(LogContext, "服务端释放失败"); } } } /// /// 测试按钮 /// /// /// private void TestButton1_Click(object sender, EventArgs e) { if (RFIDStatesEntities.Count == 0) { MessageBox.Show("请先初始化RFID列表!"); } else if (textRFID == RFIDStatesEntities.Count) { SetNowWorkRow("0000000"); textRFID = 0; return; } SetNowWorkRow(RFIDStatesEntities[textRFID].RFIDValue); if (++textRFID > RFIDStatesEntities.Count) { textRFID = 0; return; } } #endregion #region 功能性方法 /// /// 根据读取到的RFID条码设置当前工作的行 并且更新state /// /// 读取到的RFID private void SetNowWorkRow(string rfid) { var memorySetting = MemorySetting.Current; //设置RFID状态 int flag = 0; for (int i = 0; i < RFIDStatesEntities.Count; i++) { if (RFIDStatesEntities[i].RFIDValue == rfid && RFIDStatesEntities[i].RFIDState == 2) { RFIDStatesEntities[i].RFIDState = 1; FormUtils.LogInsert(LogContext, "RFID " + i + " 开始工作", RFIDStatesEntities[i].RFIDValue); GetLog(); if (i - 1 >= 0) { string rfidValue = RFIDStatesEntities[i - 1].RFIDValue; var leastTime = RFIDLogsEntitys.First(x => x.RFIDId == rfidValue).CreateTime; double timeSpan = (DateTime.Now - leastTime).TotalSeconds; if (timeSpan >= memorySetting.AlarmTimeValue) { RFIDStatesEntities[i - 1].RFIDState = 4; FormUtils.LogInsert(LogContext, "RFID " + i + " 超时结束", RFIDStatesEntities[i].RFIDValue); } if (timeSpan < memorySetting.AlarmTimeValue) { RFIDStatesEntities[i - 1].RFIDState = 3; FormUtils.LogInsert(LogContext, "RFID " + (i - 1) + " 成功结束", RFIDStatesEntities[i].RFIDValue); } GetLog(); } if (i + 1 < RFIDStatesEntities.Count) { FormUtils.LogInsert(LogContext, "RFID " + (i + 1) + " 准备工作", RFIDStatesEntities[i].RFIDValue); GetLog(); RFIDStatesEntities[i + 1].RFIDState = 2; FlashIndex = i + 1; } else { timer.Stop(); _flashflag = false; } flag = 1; break; } } if (flag == 0) //列表里没有已读的RFID { for (int i = 0; i < RFIDStatesEntities.Count; i++) { if (RFIDStatesEntities[i].RFIDState == 1) { string rfidValue = RFIDStatesEntities[i - 1].RFIDValue; var leastTime = RFIDLogsEntitys.First(x => x.RFIDId == rfidValue).CreateTime; double timeSpan = (DateTime.Now - leastTime).TotalSeconds; if (timeSpan >= memorySetting.AlarmTimeValue) { RFIDStatesEntities[i].RFIDState = 4; FormUtils.LogInsert(LogContext, "RFID " + i + " 超时结束", RFIDStatesEntities[i].RFIDValue); } if (timeSpan < memorySetting.AlarmTimeValue) { RFIDStatesEntities[i].RFIDState = 3; FormUtils.LogInsert(LogContext, "RFID " + (i - 1) + " 成功结束", RFIDStatesEntities[i].RFIDValue); } } } } //刷新前端灯的状态 for (int i = 0; i < RFIDStatesEntities.Count; i++) { if (RFIDStatesEntities[i].RFIDState == 1) { SetRowsLightState(i, 1); } else if (RFIDStatesEntities[i].RFIDState == 3) { SetRowsLightState(i, 0); } else if (RFIDStatesEntities[i].RFIDState == 4) { SetRowsLightState(i, 2); } else { SetRowsLightState(i, Brushes.Transparent); } } if(_flashflag) timer.Stop(); Thread.Sleep(500); //刷新IO的状态 for (int i = 0; i < RFIDStatesEntities.Count; i++) { if (RFIDStatesEntities[i].RFIDState == 1) { // DOperateInfo.DOpen(lightsEntities[i].Yellow); _methodQueue.Enqueue(new DOperateEntity() { port = lightsEntities[i].Yellow, delay = 0 }); } else if (RFIDStatesEntities[i].RFIDState == 3) { _methodQueue.Enqueue(new DOperateEntity() { port = lightsEntities[i].Green, delay = 0 }); _methodQueue.Enqueue(new DOperateEntity() { port = lightsEntities[i].Yellow, delay = -1 }); } else if (RFIDStatesEntities[i].RFIDState == 4) { _methodQueue.Enqueue(new DOperateEntity() { port = lightsEntities[i].Red, delay = 0 }); _methodQueue.Enqueue(new DOperateEntity() { port = lightsEntities[i].Yellow, delay = -1 }); } } if (_flashflag) timer.Start(); RefreshRoll(); } /// /// 初始化一行 /// /// 当前的初始化行数 /// private List InitRows(int rowNo) { List rowEntities = new List(); for (int i = 0; i < 3; i++) { rowEntities.Add(new RowEntity() { ColumnIndex = i, }); } return rowEntities; } /// /// 刷新列表 /// private void RefreshRoll() { List values = new List(); for (int i = 0; i < RFIDStatesEntities.Count; i++) { values.Add(new string[] { "", "", "" }); } ScrewdriverMonitor.SetTableValue(values); } private void SetRowsLightState(int index, LightState lightState) { SetRowsLightState(index, FormUtils.EnumColorToBrush(lightState)); } private void SetRowsLightState(int index, int lightState) { SetRowsLightState(index, (LightState)lightState); } /// /// 设置指定行指示灯的状态以及工作的行的标识 /// /// private void SetRowsLightState(int index, Brush brush) { monitorEntities[index].RowEntitys[2].Color = brush; //工作中箭头指示 for (int i = 0; i < RFIDStatesEntities.Count; i++) { monitorEntities[i].RowEntitys[0].Value = RFIDStatesEntities[i].RFIDState == 1 ? "=>" : ""; } } /// /// 列表回调函数 /// /// /// /// /// /// /// private void ScrewdriverMonitor_OnDrawCellTextEvent(Graphics g, int rowIndex, int colIndex, RectangleF rectangle, string value, StringFormat sf) { foreach (MonitorEntity entity in monitorEntities) { if (rowIndex == entity.RowIndex) { foreach (RowEntity rowEneiey in entity.RowEntitys) { if (colIndex == rowEneiey.ColumnIndex) { g.FillRectangle(rowEneiey.Color, rectangle); g.DrawString(rowEneiey.Value, this.ScrewdriverMonitor.Font, Brushes.Black, rectangle, sf); } } } } } /// /// RFID刷新任务 /// private void StartLongRunningTask() { cancellationTokenSource = new CancellationTokenSource(); Task.Run(() => { while (!cancellationTokenSource.Token.IsCancellationRequested) { //SetNowWorkRow("0000000"); // 这里是你的长期运行逻辑 Thread.Sleep(1000); // 模拟一些长时间的工作 } }, cancellationTokenSource.Token); } /// /// RFID刷新任务 /// private void SendRunningTask() { sendCancellationTokenSource = new CancellationTokenSource(); Task.Run(() => { while (!sendCancellationTokenSource.Token.IsCancellationRequested) { if (!cache.ContainsKey("Test")) { while (_methodQueue.Count > 0) { var q = _methodQueue.Dequeue(); // -1 DClose > 0 DTimeOpen =0 Dopen if (q.delay == -1) { DOperateInfo.DClose(q.port); } if (q.delay == 0) { DOperateInfo.DOpen(q.port); } if (q.delay > 0) { DOperateInfo.DTimeOpen(q.port, q.delay); } Thread.Sleep(210); // 模拟一些长时间的工作 } } else { _methodQueue.Clear(); } Thread.Sleep(100); // 模拟一些长时间的工作 } }, cancellationTokenSource.Token); } ///// ///// 等待工作指示灯闪烁进程 ///// //private void FlashThread() //{ // //等待闪烁线程 // flashThread = new Thread(() => // { // while (true) // { // DOperate.DTimeOpen(lightsEntities[FlashIndex].Yellow, 1); // monitorEntities[FlashIndex].RowEntitys[2].Color = Brushes.Yellow; // RefreshRoll(); // Thread.Sleep(1000); // monitorEntities[FlashIndex].RowEntitys[2].Color = Brushes.Transparent; // RefreshRoll(); // Thread.Sleep(1000); // } // }); //} System.Timers.Timer timer = new System.Timers.Timer(1000); // 设置1秒间隔 /// /// 等待工作指示灯闪烁进程 /// private void FlashThreadTime() { int step = 0; timer.Elapsed += (sender, e) => { if (step == 0) { step = 1; _methodQueue.Enqueue(new DOperateEntity() { port = lightsEntities[FlashIndex].Yellow, delay = 1 }); monitorEntities[FlashIndex].RowEntitys[2].Color = Brushes.Yellow; } else if (step == 1) { step=0; monitorEntities[FlashIndex].RowEntitys[2].Color = Brushes.Transparent; } RefreshRoll(); }; ////等待闪烁线程 //flashThread = new Thread(() => //{ // while (true) // { // DOperate.DTimeOpen(lightsEntities[FlashIndex].Yellow, 1); // monitorEntities[FlashIndex].RowEntitys[2].Color = Brushes.Yellow; // RefreshRoll(); // Thread.Sleep(1000); // monitorEntities[FlashIndex].RowEntitys[2].Color = Brushes.Transparent; // RefreshRoll(); // Thread.Sleep(1000); // } //}); } /// /// 获取Log /// private void GetLog() { RFIDLogsEntitys = LogContext.Query().OrderByDesc(a => a.CreateTime).Take(200).ToList(); LogDataGridView.DataSource = null; LogDataGridView.DataSource = RFIDLogsEntitys; } /// /// 获取准备行 /// /// 准备行index private int GetReadyRowIndex() { for (int i = 0; i < RFIDStatesEntities.Count; i++) { if (RFIDStatesEntities[i].RFIDState == 2) { return i; } } return -1; } /// /// 获取正在工作的行 /// /// 工作行index private int GetNowRowIndex() { for (int i = 0; i < RFIDStatesEntities.Count; i++) { if (RFIDStatesEntities[i].RFIDState == 1) { return i; } } return -1; } private void RefreshIO() { for (int i = 0; i < RFIDStatesEntities.Count; i++) { _methodQueue.Enqueue(new DOperateEntity() { port = lightsEntities[i].Yellow, delay = -1 }); _methodQueue.Enqueue(new DOperateEntity() { port = lightsEntities[i].Red, delay = -1 }); _methodQueue.Enqueue(new DOperateEntity() { port = lightsEntities[i].Green, delay = -1 }); } } #endregion } }