using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Data; using System.Windows.Forms; using Model; using DeiNiu.Utils; namespace elelab { public class pick { public delegate void lightReturn(int orderNo,int eleId, int color, int eleAddress, int count,int num2); public static event lightReturn lightOffEvent; public static Thread pick_work; public static Thread pick_work_support; //public static Timer check_time; //public static uart_dis_data[] ele_return_data = new uart_dis_data[10000]; //public static int ele_return_receive_address = 0; //public static int ele_return_manage_address = 0; //public static int ele_return_max = 10000; public static bool begain_pick = false; // public static bool Threads_state; // public static bool out_start_state; public static byte[,] ele_lab = new byte[3000, 100];//ele_id address type 0 拣选 1 播种 2 装车 public static uart_dis_data[] ele_lab_data = new uart_dis_data[10000];//ele_id address type 0 拣选 1 播种 2 装车 public static int receive_add = 0; public static int manage_add = 0; public static int add_max = 10000; public static int[] pick_part_task = new int[100];//分区名称 分区结果 0 没有任务 正在处理任务 public static int[] seed_part_task = new int[100];//分区名称 分区结果 0 没有任务 正在处理任务 public static int[] tran_part_task = new int[100];//分区名称 分区结果 0 没有任务 正在处理任务 // public static int port_max = 100; public static bool pick_task = true; public static List activeComports = new List() ;//激活的com口 private static byte get_byte(string data) { int length = data.Length; List str = new List(); for (int i = 0; i < length; i++) { string result = data.Substring(i, 1); char aaaq = Convert.ToChar(result); if ((aaaq >= 0x30) && (aaaq <= 0x39)) { str.Add(data.Substring(i, 1)); } } if (str.Count == 1) { return Convert.ToByte(str[0]); } else if (str.Count == 2) { int len = Convert.ToInt16(str[0]); int len1 = Convert.ToInt16(str[1]); len = len * 10 + len1; return Convert.ToByte(len); } else if (str.Count == 3) { int len = Convert.ToInt16(str[0]); int len1 = Convert.ToInt16(str[1]); int len2 = Convert.ToInt16(str[2]); len = len * 100 + len1 * 10 + len2; return Convert.ToByte(len); } return 0; } private bool send_data(DataTable[] ds, byte byt) { for (int j = 0; j < ds.Length; j++) { //string part = ; byte part_byte = get_byte(ds[j].Rows[0]["part"].ToString()); string port = ds[j].Rows[0]["port"].ToString(); byte port_byte = get_byte(port); byte led_color = get_byte(ds[j].Rows[0]["color"].ToString()); elelab.pick.make_data(ds[j], led_color, part_byte, port_byte, null, null, null, byt); } return true; } private static void init_sys_port(enumLabelPickType pickType) { // activeComports.Clear(); clear_order order = new clear_order(); int port; for (int i = 0; i < unart_manage.com_count; i++)//init com0-10 { int com = Convert.ToByte(i); if (elelab.unart_manage.init_com_sys(com, true) == true) { port = Convert.ToInt16(i); // order = Convert.ToInt16(dt.Rows[i]["ele_order"]); order.order = Convert.ToByte(i); order.state =Convert.ToByte((int)pickType); if (unart_manage.com_manage[port].clear_order(order)) { activeComports.Add( port); } } } init_pick(); // clear_order(dt); } public static bool clear_order(DataTable dt) { int port; clear_order order = new clear_order(); for (int i = 0; i < dt.Rows.Count; i++) { port = Convert.ToInt16(dt.Rows[i]["port"]); // order = Convert.ToInt16(dt.Rows[i]["ele_order"]); order.order = Convert.ToByte(dt.Rows[i]["ele_order"]); order.state = 1; unart_manage.com_manage[port].clear_order(order); } return true; } public static void init_pick() { //为数据处理开辟线程 // Thread workTicketThread; //Thread workTicketThread; if (pick_work != null) return; pick_work = new Thread(pick_sys); // Make this a background thread, so it will terminate when the main thread/process is de-activated pick_work.IsBackground = true; //pick_work.SetApartmentState(ApartmentState.STA); pick_work.SetApartmentState(ApartmentState.MTA); // Start the Work pick_work.Start(); //workerThreads[i] = workTicketThread; } public static void init_pick_support() { //为数据处理开辟线程 // Thread workTicketThread; //Thread workTicketThread; pick_work_support = new Thread(pick_sys_support); // Make this a background thread, so it will terminate when the main thread/process is de-activated pick_work_support.IsBackground = true; //pick_work.SetApartmentState(ApartmentState.STA); pick_work_support.SetApartmentState(ApartmentState.MTA); // Start the Work pick_work_support.Start(); //workerThreads[i] = workTicketThread; } public static void wake_thread() { // if (Convert.ToInt16(pick_work.ThreadState) == 68) { try { if (Convert.ToInt16(pick_work.ThreadState) == 68) pick_work.Resume(); } catch(Exception er) { } } } public static void wake_support_thread() { if (Convert.ToInt16(pick_work_support.ThreadState) == 68) pick_work_support.Resume(); } private static void get_data(string data, out int dot_station, out int total_num) { data = Convert.ToDouble(data).ToString(); string[] count = data.Split('.');//Out_count int full = Convert.ToInt16(count[0]); int dot_num; dot_station = 0; total_num = full; if (count.Length > 1) { dot_num = Convert.ToInt16(count[1]); if (dot_num > 0) { if (dot_num < 10) { total_num = full * 10 + dot_num; dot_station = 1; } else if ((dot_num > 9) && (dot_num < 100)) { total_num = full * 100 + dot_num; dot_station = 2; } else if ((dot_num > 99) && (dot_num < 1000)) { total_num = full * 1000 + dot_num; dot_station = 3; } else if ((dot_num > 999) && (dot_num < 10000)) { total_num = full * 10000 + dot_num; dot_station = 4; } else { dot_station = 0; } } } } public static bool make_data(DataTable ds, byte led_color, byte ele_order_id, byte port, string[] ele_lab_id, string[] ele_address, string[] Out_count, byte type) { return true; } public static bool rest_sys_device(byte port) { //clear_order order = new clear_order(); //order.order = Convert.ToByte(ele_order_id); //order.state = 1; unart_manage.com_manage[port].write_reset_device(); return true; } //依次点亮数据 private void order_by_desc(string wave_order, string part, bool order) { //make_data(); // unart_manage.com_manage[port - 1]. } private static void read_single(int address) { while (unart_manage.com_manage[address].manage_address != unart_manage.com_manage[address].receive_address) { ele_lab_data[receive_add] = unart_manage.com_manage[address].return_data[unart_manage.com_manage[address].manage_address]; receive_add++; if (receive_add >= add_max) { receive_add = 0; } unart_manage.com_manage[address].manage_address++; if (unart_manage.com_manage[address].manage_address >= unart_manage.com_manage[address].return_max) { unart_manage.com_manage[address].manage_address = 0; } } } private static void receive_data() { for (int i = 0; i < unart_manage.com_manage.Length; i++) { if (unart_manage.com_manage[i] != null) { if (unart_manage.com_manage[i].wait_data == true) {//读取数据 unart_manage.com_manage[i].wait_data = false; read_single(i); } } } } private static string receive_data_dot(int count, int dot_station) { string result = "0"; if (dot_station == 0) { result = count.ToString(); } else if (dot_station == 1) { result = (count / 10).ToString() + "." + (count % 10).ToString(); } else if (dot_station == 2) { result = (count / 100).ToString() + "." + (count % 100).ToString(); } else if (dot_station == 3) { result = (count / 1000).ToString() + "." + (count % 1000).ToString(); } return result; } // static WmsOutPickLable outPick = new WmsOutPickLable(); // static lWmsOutPickRequest lpickRequest = new lWmsOutPickRequest(); /// /// send back from elabel /// public static void return_data1() { returnData(); } private static void manage_data() { return_data1(); } private static bool read_state() { for (int i = 0; i < unart_manage.com_manage.Length; i++) { if (unart_manage.com_manage[i] != null) { if (unart_manage.com_manage[i].wait_data == true) {//读取数据 return true; } } } return false; } public static void pick_sys() { //int count;Threads_state // Threads_state = true; //out_start_state = false; elelab.pick.init_pick_support(); while (true) { // unart_manage.com_manage[17].return_data(); pick_work_support.Suspend(); //System.Threading.Thread.Sleep(15000); receive_data(); manage_data(); wake_support_thread(); pick_work.Suspend(); } } public static void pick_sys_support() { //int count;Threads_state while (true) { System.Threading.Thread.Sleep(2000); if (read_state() == true) { wake_thread(); } pick_work_support.Suspend(); } } public static void test_multe() { //while (wms_usartmanage.pick.send_state == true) ; //wms_usartmanage.pick.send_state = true; //// while (get_part_task() == true) ; //get_part_task(); ////while(led_lamble() == true); //wms_usartmanage.pick.send_state = false; return; } //webserver 接口 //初始化端口 //复位端口 //清除订单 public static void init_port(enumLabelPickType pickType) { elelab.unart_manage.init_sys(); init_sys_port(pickType); } public static void init_port(enumLabelPickType pickType,bool isForce) { if (isForce) { elelab.unart_manage.clearComs(); } init_port(pickType); } public static bool reset_device(int port) { if( elelab.unart_manage.com_manage[port]!=null) return elelab.unart_manage.com_manage[port].write_reset_device(); return false; } public static bool turnOnLight(int port, channel_led id_data) { if (unart_manage.com_manage[port] == null) { return false; } return unart_manage.com_manage[port].turnOnLight(id_data); } public static bool turnOffLight(int port, channel_led id_data) { if (unart_manage.com_manage[port] == null) { return false; } return unart_manage.com_manage[port].turnOffLight(id_data); } public static bool clearDis(int port, int ele_order_id) { clear_order order = new clear_order(); order.order = Convert.ToByte(ele_order_id); order.state = 1; return unart_manage.com_manage[port].clear_order(order); } static Dictionary portOrder = new Dictionary(); /// /// 以端口号为一组,点亮多个标签 /// 适用于分拣墙 /// /// /// 端口号 /// public static bool lightLabels(List lables,bool isClearOrder,int orderNo, int portNo , enumLabelPickType pickType)////----- { // init_port(pickType); WmsConstants.WAVE_CURRENT_LIGHTS_PORT_STATUS.Clear(); byte orderPort = get_byte(portNo.ToString()); if (activeComports.Count == 0 || lables.Count == 0) { return false; } WmsConstants.WAVE_CURRENT_LIGHTS_PORT_STATUS[portNo] = false; ; //WmsConstants.WAVE_CURRENT_LIGHTS_STATUS.Clear(); WmsConstants.WAVE_CURRENT_PICK_STATUS.Clear(); WmsConstants.SEEDS_LABEL_ID.Clear(); List statuKeys = new List(); int orderId = portOrder.ContainsKey(portNo) ? portOrder[portNo]+1 : 1; orderId = orderId >= 200 ? 1 : orderId; if (isClearOrder ) { orderId = orderNo ; } uart_dis_data[] ele_data_comment = new uart_dis_data[lables.Count]; for (int j = 0; j < lables.Count; j++) { DeiNiu.wms.win.ELabel lb = lables[j]; WmsConstants.SEEDS_LABEL_ID[orderId + "-" + lb.labelId] = lb.seedsId; ele_data_comment[j].dis_type = get_byte((lb.color).ToString()); //Convert.ToByte(textBox4.Text); 电子标签灯的颜色 1 红色 2 绿色 3 蓝色 ele_data_comment[j].ele_id = lb.labelId; ; //电子标签id ele_data_comment[j].order = Convert.ToByte(orderId);// get_byte(orderId.ToString());//Convert.ToByte(textBox2.Text); 单号 ele_data_comment[j].receive_count = 0; //为0 ele_data_comment[j].little_ele_id = Convert.ToByte(lb.num1);// 货位号 ele_data_comment[j].send_count = lb.num3; if (lb.num2 > 0) { ele_data_comment[j].num2 = lb.num2; } ele_data_comment[j].state = 1; //都为1 ele_lab[ele_data_comment[j].ele_id, ele_data_comment[j].little_ele_id] = get_byte(((int)pickType).ToString()); statuKeys.Add(Util.getLightKey(orderId, lb.color, lb.labelId, lb.num1)); }// //向串口发送数据 clear_order order = new clear_order(); order.order = get_byte(orderId.ToString()); //orderPort;// get_byte(portNo.ToString());//Convert.ToByte(ele_order_id); order.state = 1; if (unart_manage.com_manage[orderPort].clear_order(order) == false) { return false; } portOrder[portNo] = orderId++; unart_manage.com_manage[orderPort].write_data(ele_data_comment); string result; bool isLightsSuccess = unart_manage.com_manage[orderPort].wait_ack(out result); WmsConstants.WAVE_CURRENT_LIGHTS_PORT_STATUS[portNo] = isLightsSuccess; foreach (string key in statuKeys) { WmsConstants.WAVE_CURRENT_LIGHTS_STATUS[key] = isLightsSuccess; CURRENT_PICK_STATUS[key] = false; } return true; } static Dictionary CURRENT_PICK_STATUS = new Dictionary(); /// /// 按灭标签,接收回传数据 /// 用户可以在此进行标签灭灯事件的数据处理 /// public static void returnData() { List statuKeys = new List(); int eleId; //标签ID int eleAddress;//标签坐标(层/列) int count;//数量 int color;//颜色 int orderNo; //端口 int num2; // Dictionary tmp = CURRENT_PICK_STATUS; while (receive_add != manage_add) { count = Convert.ToInt16(receive_data_dot(Convert.ToInt32(ele_lab_data[manage_add].receive_count), Convert.ToInt16(ele_lab_data[manage_add].dot))); eleId = Convert.ToInt16(ele_lab_data[manage_add].ele_id.ToString()); //label id color = ele_lab_data[manage_add].dis_type; eleAddress = Convert.ToInt16(ele_lab_data[manage_add].little_ele_id.ToString()); //ele address int pickType = ele_lab[eleId, eleAddress]; orderNo = Convert.ToInt16(ele_lab_data[manage_add].order.ToString()); //port num2 = Convert.ToInt16(ele_lab_data[manage_add].num2.ToString()); //port // int pno = Convert.ToInt16(ele_lab_data[manage_add].port.ToString()); //port string pno = ele_lab_data[manage_add].port; string key; if (eleId == 0) { manage_add = receive_add; break; } key = Util.getLightKey(orderNo, color, eleId, eleAddress); manage_add++; if (manage_add >= add_max) { manage_add = 0; } if (CURRENT_PICK_STATUS.ContainsKey(key)) { if (CURRENT_PICK_STATUS[key]) { Console.WriteLine("---------------------------- get key :" + key + ", orderNo: +" + orderNo); continue; } } else { Console.WriteLine("------------------------------ key dose not exists :" + key); } //客户在此处进行的数据处理 //..... // 步骤3,调用delegate lightReturn handler = lightOffEvent; if (handler != null) { handler(orderNo,eleId, color, eleAddress, count, num2); CURRENT_PICK_STATUS[key] = true; } } } public static void displayLabels(int port) { if (elelab.unart_manage.com_manage[port] != null) elelab.unart_manage.com_manage[port].displayLabel(); } public static void clearLabels(int port) { if (elelab.unart_manage.com_manage[port] != null) elelab.unart_manage.com_manage[port].clearLabel(); } /// /// 熄灭指定端口标签 /// 当熄灭端口所有标签时,熄灭端口的通道灯 /// /// 端口号 /// 标签ID,默认熄灭全部标签 public static void turnOffLabel(int portNo, int ltId = 65535) { Model.dis_id id; id.order = 1; id.ele_id = ltId; //65535; id.state = 1; foreach (int port in activeComports) { if (port != portNo) { continue; } unart_manage.com_manage[port].init_port.write_clear_comment(id); break; } /* if (ltId != 65535) //当熄灭端口所有标签时,熄灭端口的通道灯 { return; } id.order = 1; id.ele_id = ltId;// 65535; id.state = 1; foreach (int port in activeComports) { if (port == 0 || port != portNo) { continue; } elelab.unart_manage.com_manage[port].init_port.write_clear_comment(id); if (!channalLights.ContainsKey(port)) { continue; } foreach (int lt in channalLights[port]) { Model.close_channel_led idx; idx.channel_id = lt; idx.state = 1; elelab.unart_manage.com_manage[port].init_port.write_close_channel_led(idx); } break; // a.write_clear_comment(id); } */ } } }