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; using NewLife.Collections; using System.IO.Ports; using NewLife.Log; 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(); /// /// 日志实例 /// public List RFIDLogsEntitys; /// /// 日志数据库操作实例 /// public IDbContext LogContext; // Thread flashThread; SerialPortFactory serialPort; private CancellationTokenSource cancellationTokenSource; public int textRFID = 0; private ICache cache = Cache.Default; int FlashIndex = 0; // bool _flashflag = true; private Dictionary dictionary = new Dictionary(); // private DengTool tool; public MainForm() { InitializeComponent(); // tool = new DengTool(); // tool.Start(); 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); for (int w = 0; w < 2; w++) { for (int i = 0; i < 16; i++) { DOperateInfo.DClose(i); Thread.Sleep(300); } } } 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, "服务端释放失败"); } } // tool.Stop(); if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); } timer.Close(); timer.Dispose(); } #region 按钮 /// /// 打开DO测试 /// /// /// private void DOTest_Click(object sender, EventArgs e) { ScrewdriverTest screwdriverTest = new ScrewdriverTest(server, DOperateInfo); screwdriverTest.Show(); } /// /// 初始化按钮 /// /// /// private void InitButton_Click(object sender, EventArgs e) { InitTable(); StartLongRunningTask(); } /// /// 初始化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(); monitorEntities = new List(list.Count); int i1 = 0; foreach (var en in list) { monitorEntities.Add(new MonitorEntity() { Green = Convert.ToInt32(en.Green), Yellow = Convert.ToInt32(en.Yellow), Red=Convert.ToInt32(en.Red), RFIDState = 0, RFIDValue = en.RfidNo, RowIndex = i1, RowEntitys = InitRows() }); monitorEntities[i1].RowEntitys[1].Value = en.RfidNo; i1++; } monitorEntities[0].RFIDState = 2; FormUtils.LogInsert(LogContext, "RFID " + 0 + " 准备工作", monitorEntities[0].RFIDValue); GetLog(); RefreshRoll(); } /// /// 打开设置界面 /// /// /// private void SettingButton_Click(object sender, EventArgs e) { FrmSetting frmSetting = new FrmSetting(); frmSetting.Show(); } /// /// 测试按钮 /// /// /// private void TestButton1_Click(object sender, EventArgs e) { //if (monitorEntities.Count == 0) //{ // MessageBox.Show("请先初始化RFID列表!"); //} //else if (textRFID == monitorEntities.Count) //{ // SetNowWorkRow("0000000"); // textRFID = 0; // return; //} //SetNowWorkRow(monitorEntities[textRFID].RFIDValue); //if (++textRFID > monitorEntities.Count) //{ // textRFID = 0; // return; //} LogContext.Delete(x=>x.ID>0); GetLog(); } #endregion #region 功能性方法 /// /// 根据读取到的RFID条码设置当前工作的行 并且更新state /// /// 读取到的RFID private void SetNowWorkRow(string rfid) { var memorySetting = MemorySetting.Current; //设置RFID状态 int flag = 0; for (int i = 0; i < monitorEntities.Count; i++) { if (monitorEntities[i].RFIDValue == rfid && monitorEntities[i].RFIDState == 2) { monitorEntities[i].RFIDState = 1; FormUtils.LogInsert(LogContext, "RFID " + i + " 开始工作", monitorEntities[i].RFIDValue); GetLog(); // if (i - 1 >= 0) // { // string rfidValue = monitorEntities[i - 1].RFIDValue; // var leastTime = RFIDLogsEntitys.First(x => x.RFIDId == rfidValue).CreateTime; // double timeSpan = (DateTime.Now - leastTime).TotalSeconds; // if (timeSpan >= memorySetting.AlarmTimeValue) // { // monitorEntities[i - 1].RFIDState = 4; // FormUtils.LogInsert(LogContext, "RFID " + i + " 超时结束", monitorEntities[i].RFIDValue); // } // if (timeSpan < memorySetting.AlarmTimeValue) // { // monitorEntities[i - 1].RFIDState = 3; // FormUtils.LogInsert(LogContext, "RFID " + (i - 1) + " 成功结束", monitorEntities[i].RFIDValue); // } // GetLog(); // } // if (i + 1 < monitorEntities.Count) // { // FormUtils.LogInsert(LogContext, "RFID " + (i + 1) + " 准备工作", monitorEntities[i].RFIDValue); // GetLog(); // monitorEntities[i + 1].RFIDState = 2; // FlashIndex = i + 1; // } // else // { // timer.Stop(); // // _flashflag = false; // } flag = 1; break; } } if (flag == 0) //列表里没有已读的RFID { // for (int i = 0; i < monitorEntities.Count; i++) // { // if (monitorEntities[i].RFIDState == 1) // { // string rfidValue = monitorEntities[i - 1].RFIDValue; // if (rfidValue != null) // { // var leastTime = RFIDLogsEntitys.First(x => x.RFIDId == rfidValue).CreateTime; // double timeSpan = (DateTime.Now - leastTime).TotalSeconds; // if (timeSpan >= memorySetting.AlarmTimeValue) // { // monitorEntities[i].RFIDState = 4; // FormUtils.LogInsert(LogContext, "RFID " + i + " 超时结束", monitorEntities[i].RFIDValue); // } // if (timeSpan < memorySetting.AlarmTimeValue) // { // monitorEntities[i].RFIDState = 3; // FormUtils.LogInsert(LogContext, "RFID " + (i - 1) + " 成功结束", monitorEntities[i].RFIDValue); // } // } // // } // } } //刷新前端灯的状态 for (int i = 0; i < monitorEntities.Count; i++) { // if (monitorEntities[i].RFIDState == 1) // { // SetRowsLightState(i, 1); // } // else if (monitorEntities[i].RFIDState == 3) // { // SetRowsLightState(i, 0); // } // else if (monitorEntities[i].RFIDState == 4) // { // SetRowsLightState(i, 2); // } // else // { // SetRowsLightState(i, Brushes.Transparent); // } } // if(_flashflag) // timer.Stop(); // // //刷新IO的状态 // // for (int i = 0; i < RFIDStatesEntities.Count; i++) // // { // // // // if (RFIDStatesEntities[i].RFIDState == 1) // // { // // // DOperateInfo.DOpen(lightsEntities[i].Yellow); // // tool.AddMq(new DOperateEntity() // // { // // port = lightsEntities[i].Yellow, // // delay = 0 // // }); // // // // } // // else if (RFIDStatesEntities[i].RFIDState == 3) // // { // // tool.AddMq(new DOperateEntity() // // { // // port = lightsEntities[i].Green, // // delay = 0 // // }); // // // // tool.AddMq(new DOperateEntity() // // { // // port = lightsEntities[i].Yellow, // // delay = -1 // // }); // // // // } // // else if (RFIDStatesEntities[i].RFIDState == 4) // // { // // // // tool.AddMq(new DOperateEntity() // // { // // port = lightsEntities[i].Red, // // delay = 0 // // }); // // // // tool.AddMq(new DOperateEntity() // // { // // port = lightsEntities[i].Yellow, // // delay = -1 // // }); // // // // } // // } // if (_flashflag) // timer.Start(); RefreshRoll(); } /// /// 初始化一行 /// /// private List InitRows() { 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 < monitorEntities.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 < monitorEntities.Count; i++) { monitorEntities[i].RowEntitys[0].Value = monitorEntities[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); } } } } } private QingTcpClient2 quClient2 = new QingTcpClient2(); private DateTime dateTime = DateTime.Now; /// /// RFID刷新任务 /// private void StartLongRunningTask() { cancellationTokenSource = new CancellationTokenSource(); Task.Run(() => { while (!cancellationTokenSource.Token.IsCancellationRequested) { //SetNowWorkRow("0000000"); // 这里是你的长期运行逻辑 try { var read = serialPort?.Read(); // var read = ""; if (read.Length == 16) { this.Invoke(() => { SetNowWorkRow(read); }); var monitorEntitiesCount = monitorEntities.Count; var last = monitorEntities[FlashIndex].RFIDState; if (FlashIndex < monitorEntitiesCount) { if (last != 100 && last==1) { quClient2.Enable(); dateTime = DateTime.Now; if (FlashIndex < monitorEntitiesCount) { XTrace.WriteLine("a"); //状态修改 monitorEntities[FlashIndex].RFIDState = 1; DOperateInfo.DOpen(monitorEntities[FlashIndex].Yellow); timer.Start(); } } } } else { XTrace.WriteLine("aa"); var total = DateTime.Now - dateTime; if (total.TotalSeconds > 2) { quClient2.Close(); dateTime = DateTime.Now; } } Thread.Sleep(500); // 模拟一些长时间的工作 } catch (Exception e) { Console.WriteLine(e); } } }, cancellationTokenSource.Token); } System.Timers.Timer timer = new System.Timers.Timer(500); // 设置1秒间隔 /// /// 等待工作指示灯闪烁进程 /// private void FlashThreadTime() { int step = 0; timer.Elapsed += (sender, e) => { Set(FlashIndex); RefreshRoll(); }; } int step1 = 0; public void Set(int id) { var monitorEntitiesCount = monitorEntities.Count; if (id < monitorEntitiesCount) { /// 状态指示 0未操作 2准备操作 1正在操作 3已完成 4超时报警 int RFIDState = monitorEntities[id].RFIDState; if (step1 == 0) { step1 = 1; RFIDState = monitorEntities[id].RFIDState; if (RFIDState == 2) { DOperateInfo.DClose(monitorEntities[id].Red); Thread.Sleep(300); DOperateInfo.DClose(monitorEntities[id].Green); Thread.Sleep(300); DOperateInfo.DTimeOpen(monitorEntities[id].Yellow, 1); monitorEntities[id].RowEntitys[2].Color = Brushes.Yellow; } RFIDState = monitorEntities[id].RFIDState; if (RFIDState == 1) { if ((id+1) < monitorEntitiesCount) { monitorEntities[id + 1].RFIDState = 2; /// 状态指示 0未操作 2准备操作 1正在操作 3已完成 4超时报警 } if (dictionary.ContainsKey(monitorEntities[id].RFIDValue)) { var i = dictionary[monitorEntities[id].RFIDValue]; dictionary[monitorEntities[id].RFIDValue] = i + 1; if (i >3) { monitorEntities[id].RFIDState = 3; dictionary[monitorEntities[id].RFIDValue] = 3; } } else { dictionary[monitorEntities[id].RFIDValue] = 1; } monitorEntities[id].RowEntitys[2].Color = Brushes.Yellow; } RFIDState = monitorEntities[id].RFIDState; if (RFIDState == 3) { DOperateInfo.DClose(monitorEntities[id].Red); Thread.Sleep(300); DOperateInfo.DClose(monitorEntities[id].Yellow); Thread.Sleep(300); FormUtils.LogInsert(LogContext, "RFID {0} 发送绿灯", monitorEntities[id].RFIDValue); XTrace.WriteLine("========================================================================"); DOperateInfo.DOpen(monitorEntities[id].Green); Thread.Sleep(300); DOperateInfo.DOpen(monitorEntities[id].Green); quClient2.Close(); monitorEntities[id].RowEntitys[2].Color = Brushes.Green; monitorEntities[id].RFIDState=100; timer.Stop(); FlashIndex += 1; timer.Start(); } } else if (step1 == 1) { step1=0; if (RFIDState == 2) { monitorEntities[id].RowEntitys[2].Color = Brushes.Transparent; } } } } private int step2 = 0; /// /// 获取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 < monitorEntities.Count; i++) { if (monitorEntities[i].RFIDState == 2) { return i; } } return -1; } /// /// 获取正在工作的行 /// /// 工作行index private int GetNowRowIndex() { for (int i = 0; i < monitorEntities.Count; i++) { if (monitorEntities[i].RFIDState == 1) { return i; } } return -1; } #endregion } }