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.wms.Data; using DeiNiu.wms.Data.Model; using DeiNiu.Utils; //using DeiNiu.wms.Logical; using DeiNiu.wms.win.ServiceReferenceStockOutPickRequest; using DeiNiu.wms.win; using System.Speech.Synthesis; namespace Deiniu.win.elelab { internal class light { public delegate void printPack(int eleId); public static printPack printLabPack; public delegate void updateSeedsGoodsStatus(); public static updateSeedsGoodsStatus seedsGoodItemValided; internal static Thread pick_work; internal static Thread pick_work_support; //internal static Timer check_time; //internal static uart_dis_data[] ele_return_data = new uart_dis_data[10000]; //internal static int ele_return_receive_address = 0; //internal static int ele_return_manage_address = 0; //internal static int ele_return_max = 10000; internal static bool begain_pick = false; // internal static bool Threads_state; // internal static bool out_start_state; internal static byte[,] ele_lab = new byte[3000, 100];//ele_id address type 0 拣选 1 播种 2 装车 internal static uart_dis_data[] ele_lab_data = new uart_dis_data[10000];//ele_id address type 0 拣选 1 播种 2 装车 internal static int receive_add = 0; internal static int manage_add = 0; internal static int add_max = 10000; internal static int[] pick_part_task = new int[100];//分区名称 分区结果 0 没有任务 正在处理任务 internal static int[] seed_part_task = new int[100];//分区名称 分区结果 0 没有任务 正在处理任务 internal static int[] tran_part_task = new int[100];//分区名称 分区结果 0 没有任务 正在处理任务 // internal static int port_max = 100; internal static bool pick_task = true; internal static List activeComports = new List();//激活的com口 public static bool resetDevice(int port) { if (elelab.coms.com_manage[port] != null) return elelab.coms.com_manage[port].write_reset_device(); return false; } public static void displayLabels(int port) { if (elelab.coms.com_manage[port] != null) elelab.coms.com_manage[port].displayLabel(); } public static void clearLabels(int port) { if (elelab.coms.com_manage[port] != null) elelab.coms.com_manage[port].clearLabel(); } 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.light.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 < coms.com_count; i++)//init com0-10 { int com = Convert.ToByte(i); if (elelab.coms.initCom(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 (coms.com_manage[port].clear_order(order)) { activeComports.Add(port); } } } init_pick(); // clear_order(dt); } internal 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; coms.com_manage[port].clear_order(order); } return true; } private 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; } internal 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; } internal static void wake_thread() { // if ( Convert.ToInt16(pick_work.ThreadState) == 68) { try { if (pick_work != null && Convert.ToInt16(pick_work.ThreadState) == 68) pick_work.Resume(); } catch (Exception er) { LogHelper.WriteLog(typeof(light), er); } } } internal 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; } } } } internal 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) { //dt 列名 ele_lab_id ele_address Out_count // 电子标签id 控制的层列 数量 //led_color 灯的颜色 0 不亮 1 红灯 2 绿灯 3 蓝灯 4 红闪 5 绿闪 6 蓝闪 7红绿 8 红蓝 9 绿蓝 14红绿蓝 15 红绿蓝蜂鸣器 //ele_order_id 电子标签的订单号(电子标签使用)订单号范围 1-200 每个订单号有多条数据 控制器一次能处理多个订单号 //订单号唯一,一个订单号使用完毕,这个订单号才能被使用 //port 端口号 //DataTable ds = new DataTable(); List statuKeys = new List(); if (ds != null) { if (ds.Rows.Count == 0) return false; uart_dis_data[] ele_data_comment = new uart_dis_data[ds.Rows.Count]; for (int j = 0; j < ds.Rows.Count; j++) { ele_data_comment[j].channel_id = 0;//暂不使用 默认为0 ele_data_comment[j].dis_type = Convert.ToByte(ds.Rows[j]["color"].ToString()); ;// 灯的颜色 0 不亮 1 红灯 2 绿灯 3 蓝灯 4 红闪 5 绿闪 6 蓝闪 ele_data_comment[j].ele_id = Convert.ToInt16(ds.Rows[j]["ele_lab_id"].ToString()); ele_data_comment[j].kucun_id = 0; ele_data_comment[j].little_ele_id = Convert.ToByte(ds.Rows[j]["ele_address"].ToString()); ele_data_comment[j].order = Convert.ToByte(ele_order_id); ele_data_comment[j].port = "1"; ele_data_comment[j].receive_count = 0; int dot_station; int total_num; string[] count = ds.Rows[j]["send_count"].ToString().Split('.');//Out_count get_data(ds.Rows[j]["send_count"].ToString(), out dot_station, out total_num); //total_num = Convert.ToInt16(count[0]); ele_data_comment[j].send_count = total_num;//.ToString()); ele_data_comment[j].dot = Convert.ToByte(0); //ele_data_comment[j].dot = 0; ele_data_comment[j].WarehousingID = 0; ele_lab[ele_data_comment[j].ele_id, ele_data_comment[j].little_ele_id] = type; statuKeys.Add(Util.getLightKey(ele_data_comment[j].dis_type, Convert.ToInt16(ds.Rows[j]["ele_lab_id"].ToString()), Convert.ToByte(ds.Rows[j]["ele_address"].ToString()))); }// //向串口发送数据 clear_order order = new clear_order(); order.order = Convert.ToByte(ele_order_id); order.state = 1; if (coms.com_manage[port].clear_order(order) == false) { LogHelper.WriteLog(typeof(light), string.Format(" port {0} clear fail", port)); //MessageBox.Show("clear fail"); return false; } //elelab.ele_base.usart_send_state = false; //ele .usart_send_state = false; while (coms.com_manage[port].send_state_finish == false) ; coms.com_manage[port].send_state_finish = false; coms.com_manage[port].usart_send_state = false; coms.com_manage[port].usart_send_result = ""; if (coms.com_manage[port].write_data(ele_data_comment) == false) { LogHelper.WriteLog(typeof(light), string.Format(" port {0} send fail", port)); //MessageBox.Show("send fail") ; coms.com_manage[port].send_state_finish = true; coms.com_manage[port].usart_send_state = true; coms.com_manage[port].usart_send_result = ""; return false; } string result; bool isLightsSuccess = coms.com_manage[port].wait_ack(out result); foreach (string key in statuKeys) { WmsConstants.WAVE_CURRENT_LIGHTS_STATUS[key] = isLightsSuccess; WmsConstants.WAVE_CURRENT_PICK_STATUS[key] = false; } return isLightsSuccess; } else { uart_dis_data[] ele_data_comment = new uart_dis_data[ele_lab_id.Length]; for (int j = 0; j < ele_lab_id.Length; j++) { ele_data_comment[j].channel_id = 0;//暂不使用 默认为0 ele_data_comment[j].dis_type = led_color;// 灯的颜色 0 不亮 1 红灯 2 绿灯 3 蓝灯 4 红闪 5 绿闪 6 蓝闪 ele_data_comment[j].ele_id = Convert.ToInt16(ele_lab_id[j].ToString()); ele_data_comment[j].kucun_id = 0; ele_data_comment[j].little_ele_id = Convert.ToByte(ele_address[j].ToString()); ele_data_comment[j].order = Convert.ToByte(ele_order_id); ele_data_comment[j].port = "1"; ele_data_comment[j].receive_count = 0; string[] count = Out_count[j].ToString().Split('.'); ele_data_comment[j].send_count = Convert.ToInt16(count[0]);//.ToString()); ele_data_comment[j].state = 1; ele_data_comment[j].WarehousingID = 0; ele_lab[ele_data_comment[j].ele_id, ele_data_comment[j].little_ele_id] = type; }// //向串口发送数据 clear_order order = new clear_order(); order.order = Convert.ToByte(ele_order_id); order.state = 1; if (coms.com_manage[port].clear_order(order) == false) { return false; } if (coms.com_manage[port].write_data(ele_data_comment) == false) { return false; } return true; } } void speak(string msg) { SpeechSynthesizer voice = new SpeechSynthesizer(); //创建语音实例 voice.Rate = -1; //设置语速,[-10,10] voice.Volume = 100; //设置音量,[0,100] voice.SpeakAsync(msg); //播放指定的字符串,这是异步朗读 } internal static bool clsDisplay(byte port, byte ele_order_id) { clear_order order = new clear_order(); order.order = Convert.ToByte(ele_order_id); order.state = 1; return coms.com_manage[port].clear_order(order); } internal static bool restDevice(byte port) { //clear_order order = new clear_order(); //order.order = Convert.ToByte(ele_order_id); //order.state = 1; coms.com_manage[port].write_reset_device(); return true; } private static void read_single(int address) { while (coms.com_manage[address].manage_address != coms.com_manage[address].receive_address) { ele_lab_data[receive_add] = coms.com_manage[address].return_data[coms.com_manage[address].manage_address]; receive_add++; if (receive_add >= add_max) { receive_add = 0; } coms.com_manage[address].manage_address++; if (coms.com_manage[address].manage_address >= coms.com_manage[address].return_max) { coms.com_manage[address].manage_address = 0; } } } private static void receiveData() { for (int i = 0; i < coms.com_manage.Length; i++) { if (coms.com_manage[i] != null) { if (coms.com_manage[i].wait_data == true) {//读取数据 coms.com_manage[i].wait_data = false; read_single(i); } } } } private static string receiveDataDot(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 /// internal static void dataSent() { List statuKeys = new List(); // string sql, table; int ele_id; int little_ele_id; string receive_count; string color; // WmsOutPickLable outPick = new WmsOutPickLable(); enumLabelPickType pickType = enumLabelPickType.pick; //同一个控制器应该拣选类型唯一 // int cnt = 0; Dictionary tmp = WmsConstants.WAVE_CURRENT_PICK_STATUS; //LogHelper.debug(typeof(light),"-----------------------------new data---------------------------"); while (receive_add != manage_add) { // cnt++; receive_count = receiveDataDot(Convert.ToInt16(ele_lab_data[manage_add].receive_count), Convert.ToInt16(ele_lab_data[manage_add].dot)); // ele_lab_data[receive_add] //receive_count = "0"; ele_id = Convert.ToInt16(ele_lab_data[manage_add].ele_id.ToString()); //label id color = ele_lab_data[manage_add].order.ToString();//color little_ele_id = Convert.ToInt16(ele_lab_data[manage_add].little_ele_id.ToString()); //ele address int state = elelab.light.ele_lab[ele_id, little_ele_id]; pickType = (enumLabelPickType)state; string key = Util.getLightKey(Convert.ToInt16(color), ele_id, little_ele_id); LogHelper.debug(typeof(light), string.Format("current key {0}, waveNo {1}", key, WmsConstants.WAVE_CURRENT_ORDER)); //WmsConstants.WAVE_CURRENT_PICK_STATUS[key] = true; //#if debug //speak(key); //#endif // LogHelper.debug(typeof(light), string.Format("receive_add {0}, manage_add {1}", receive_add, manage_add)); // while (receive_add != manage_add) // { switch (pickType) { case enumLabelPickType.pick: int trycnt = 0; if (WmsConstants.WAVE_CURRENT_PICK_STATUS.ContainsKey(key)) { // LogHelper.debug(typeof(light), string.Format(" !!!!!!!!!..........{0} exist in pick cache ", key)); // LogHelper.debug(typeof(light), string.Format(" {0} value is {1} ", key, WmsConstants.WAVE_CURRENT_PICK_STATUS[key])); if (WmsConstants.WAVE_CURRENT_PICK_STATUS[key]) { manage_add++; if (manage_add >= add_max) { manage_add = 0; } continue; } } try { updatePickStatus(key, color, ele_id, little_ele_id, receive_count); } catch (DeiNiuTimeOutException e) { Login lg = new Login(); lg.ShowDialog(); } catch (Exception e) { LogHelper.WriteLog(typeof(light), e); WmsConstants.WAVE_CURRENT_PICK_STATUS[key] = false; trycnt++; LogHelper.debug(typeof(light), string.Format(" trying cnt {0} ", trycnt)); if (trycnt < 3) { try { updatePickStatus(key, color, ele_id, little_ele_id, receive_count); } catch (Exception err) { LogHelper.WriteLog(typeof(light), err); } } // throw e; } break; case enumLabelPickType.seed: key = Util.getLightKey(Convert.ToInt16(color), ele_id, WmsConstants.CURRENT_SEEDS_GOOD_SKUID); if (WmsConstants.SEEDS_CURRENT_PICK_STATUS.ContainsKey(key)) { if (WmsConstants.SEEDS_CURRENT_PICK_STATUS[key]) { manage_add++; if (manage_add >= add_max) { manage_add = 0; } continue; } } using (WmsOutPickRequestClient client = new WmsOutPickRequestClient("BasicHttpBinding_IWmsOutPickRequest", string.Format("http://{0}/{1}", Park.svrUrl, "WmsOutPickRequestService.svc"))) { try { // client.updateValidBulkPickStatus(407,1,"test seed",0,100,2788); enumOutSeedsStatus status = (enumOutSeedsStatus)client.updateSeedingStatus(CURRENT_SEEDS_NO, CURRENT_SEEDS_GOODSID, CURRENT_SEEDS_GOOD_BATCH, ele_id, little_ele_id, Convert.ToDecimal(receive_count), WmsConstants.CHECKED_BY_2_ID);//本次拣选完毕 client.Close(); bool result = (int)status > (int)enumOutSeedsStatus.处理失败; LogHelper.debug(typeof(light), string.Format("updated record result {3} ----by elabelId {0}, address {1},receiveCnt {2} ", ele_id, little_ele_id, receive_count, status)); LogHelper.debug(typeof(light), string.Format("key {0}, result {1}", key, result)); WmsConstants.SEEDS_CURRENT_PICK_STATUS[key] = result;// isPickOrderFinished; if (WmsConstants.SEEDS_CURRENT_PICK_STATUS[key]) { LogHelper.debug(typeof(light), string.Format("{0},更新成功, receive count is {1}", key, receive_count)); } if (status == enumOutSeedsStatus.商品完成分播) { if (seedsGoodItemValided != null) { // seedsGoodItemValided(); } } if (status == enumOutSeedsStatus.分拣单完成分播 || status == enumOutSeedsStatus.播种单完成分播) { LogHelper.debug(typeof(light), string.Format(" labid {0} 对应分拣单完成分拣, to print.... ", ele_id )); if (printLabPack != null) { printLabPack(ele_id); } if (seedsGoodItemValided != null) { // seedsGoodItemValided(); } } } catch (DeiNiuTimeOutException e) { LogHelper.debug(typeof(light), string.Format("{0} 出错了。。。{1}", key, e.Message)); Login lg = new Login(); lg.ShowDialog(); } catch (Exception e) { LogHelper.debug(typeof(light), string.Format("{0} 出错了。。。{1}", key, e.Message)); LogHelper.WriteLog(typeof(light), e); } } manage_add++; // manage_add = receive_add; if (manage_add >= add_max) { manage_add = 0; } break; case enumLabelPickType.tran: break; /* case enumLabelPickType.seedPick: // 播种分区摘果 if (WmsConstants.WAVE_CURRENT_PICK_STATUS.ContainsKey(key)) { //LogHelper.debug(typeof(light), string.Format(" !!!!!!!!!..........{0} exist in pick cache ", key)); // if (WmsConstants.WAVE_CURRENT_PICK_STATUS[key]) { manage_add++; if (manage_add >= add_max) { manage_add = 0; } continue; } } using (WmsOutPickRequestClient client = new WmsOutPickRequestClient("BasicHttpBinding_IWmsOutPickRequest", string.Format("http://{0}/{1}", Park.svrUrl, "WmsOutPickRequestService.svc"))) { //LogHelper.debug(typeof(light), string.Format(" ..........{0} trying to update db ", key)); try { WmsConstants.WAVE_CURRENT_PICK_STATUS[key] = client.updateSeedsPickingStatus( Convert.ToInt16(color), ele_id, little_ele_id, Convert.ToDecimal(receive_count));//本次拣选完毕 //LogHelper.debug(typeof(light), string.Format(" ..........{0} update result {1}", key, WmsConstants.WAVE_CURRENT_PICK_STATUS[key])); client.Close(); } catch (DeiNiuTimeOutException e) { Login lg = new Login(); lg.ShowDialog(); } catch (Exception e) { LogHelper.WriteLog(typeof(light), e); } } break; */ } /* manage_add++; if (manage_add >= add_max) { manage_add = 0; } * */ } //统一处理。。。。 /* if (cnt == 0) { return; } switch (pickType) { case enumLabelPickType.pick: bool isPickOver = outPick.getCurrentPickList(DeiNiu.Utils.enumLabelPickState.notPicked).Tables[0].Rows.Count ==0;//波次是否全部拣选完毕 elelab.pick.pick_task = isPickOver; if (isPickOver) { //lWmsOutPickRequest lpickRequest = new lWmsOutPickRequest(); lpickRequest.finishCurrentWave(false); } break; case enumLabelPickType.seed: break; case enumLabelPickType.tran: break; } */ } private static void updatePickStatus(string key, string color, int ele_id, int little_ele_id, string receive_count) { using (WmsOutPickRequestClient client = new WmsOutPickRequestClient("BasicHttpBinding_IWmsOutPickRequest", string.Format("http://{0}/{1}", Park.svrUrl, "WmsOutPickRequestService.svc"))) { LogHelper.debug(typeof(light), string.Format(" ..........{0} trying to update db ", key)); WmsConstants.WAVE_CURRENT_PICK_STATUS[key] = client.updatePickingStatus(Convert.ToInt16(color), ele_id, little_ele_id, Convert.ToDecimal(receive_count));//本次拣选完毕 LogHelper.debug(typeof(light), string.Format(" ..........{0} update result {1}", key, WmsConstants.WAVE_CURRENT_PICK_STATUS[key])); bool isPickOver = client.getCurrentPickList((int)DeiNiu.Utils.enumPickState.未拣).Rows.Count == 0;//波次是否全部拣选完毕 // //LogHelper.debug(typeof(pick), string.Format(" ..........{0} update result {1}", key, WmsConstants.WAVE_CURRENT_PICK_STATUS[key])); elelab.light.pick_task = isPickOver; if (isPickOver) { //lWmsOutPickRequest lpickRequest = new lWmsOutPickRequest(); client.finishCurrentWave(WmsConstants.WAVE_CURRENT_ORDER, false); } client.Close(); } } private static void manage_data() { dataSent(); } private static bool read_state() { for (int i = 0; i < coms.com_manage.Length; i++) { if (coms.com_manage[i] != null) { if (coms.com_manage[i].wait_data == true) {//读取数据 return true; } } } return false; } private static void pick_sys() { //int count;Threads_state // Threads_state = true; //out_start_state = false; elelab.light.init_pick_support(); while (true) { // unart_manage.com_manage[17].return_data(); pick_work_support.Suspend(); //System.Threading.Thread.Sleep(15000); receiveData(); manage_data(); wake_support_thread(); pick_work.Suspend(); } } internal 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(); } } internal 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 接口 //初始化端口 //复位端口 //清除订单 internal static void initPort(enumLabelPickType pickType) { elelab.coms.initSys(); init_sys_port(pickType); } internal static string resetDevice(string port) { int port_num; try { port_num = Convert.ToInt16(port); } catch { port_num = 1; } elelab.coms.com_manage[port_num].write_reset_device(); return "执行成功"; } static string CURRENT_SEEDS_NO, CURRENT_SEEDS_GOODSID, CURRENT_SEEDS_GOOD_BATCH; internal static string lightsUpSeeds(DataTable dt, enumLabelPickType pickType, string seedsNo, string goodsId, string batch) { CURRENT_SEEDS_NO = seedsNo; CURRENT_SEEDS_GOODSID =goodsId; CURRENT_SEEDS_GOOD_BATCH =batch; return lightsUp( dt, pickType); } internal static string lightsUp(DataTable dt,enumLabelPickType pickType)////----- { // init_port(pickType); if (activeComports.Count ==0 || dt.Rows.Count == 0) { return ""; } DataTable[] ds = split_ele_data(dt); // DataTable[] ds = split_ele_data(sortedTable); int successCnt=0; int failureCnt=0; for (int j = 0; j < ds.Length; j++) { //string part = ; byte part_byte = get_byte(ds[j].Rows[0]["ele_order"].ToString()); //part_byte = 1; 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()); byte pick_type = get_byte( ((int)pickType).ToString()); if (elelab.light.make_data(ds[j], led_color, part_byte, port_byte, null, null, null, pick_type)) { successCnt++; } else { failureCnt++; } } elelab.light.pick_task = false; if (failureCnt > 0) { // return string.Format("成功点亮标签{0}个,点亮失败{1}个", successCnt, failureCnt); //return string.Format("成功点亮{0},失败{1}", successCnt, failureCnt); if (successCnt > 0) { return "部分标签未点亮"; } else { return "标签点亮失败"; } } return ""; } private static DataTable[] split_ele_data(DataTable dt) { // dt.DefaultView.Sort = "ele_order,color"; // 同一个亮灯波次里标签ID和标签前2位数字的组合只能有一个 //[{"labelId":1,"num1":14,"num3":1333,"color":4 },{"labelId":1,"num1":14,"num3":67,"color":1 }] //如上,同一个亮灯 order只能显示一个 //需要分别放在不同亮灯波次order里 Dictionary> portOrders =new Dictionary>(); Dictionary>> partOrders = new Dictionary>>(); portOrders[17]=new List(); partOrders[1] = portOrders; string port, portLast, eOrder="", eOrderLast, labId,labIdLast, labAddress ,labAddressLast= ""; for (int i = 1; i < dt.Rows.Count; i++) { if (String.IsNullOrEmpty(eOrder)) { eOrder = dt.Rows[i]["ele_order"].ToString(); } if (eOrder != dt.Rows[i]["ele_order"].ToString()) { partOrders[ Convert.ToInt16(eOrder)] = new Dictionary>(); } } if (dt.Rows.Count == 1) { DataTable[] ds1 = new DataTable[1]; ds1[0] = dt; return ds1; } int count = 1; //ele_order for (int i = 1; i < dt.Rows.Count; i++) { port = dt.Rows[i]["port"].ToString(); portLast = dt.Rows[i - 1]["port"].ToString(); eOrder = dt.Rows[i]["ele_order"].ToString(); eOrderLast = dt.Rows[i - 1]["ele_order"].ToString(); labId = dt.Rows[i]["ele_lab_id"].ToString(); labIdLast = dt.Rows[i - 1]["ele_lab_id"].ToString(); labAddress = dt.Rows[i]["ele_address"].ToString(); labAddressLast = dt.Rows[i - 1]["ele_address"].ToString(); if (port != portLast || eOrder != eOrderLast ) { count++; } }//ele_order DataTable[] ds = new DataTable[count]; for (int i = 0; i < count; i++) { ds[i] = dt.Clone(); } int address = 0; for (int i = 0; i < dt.Rows.Count; i++) { if (i == 0) { address = 0; } else if ((dt.Rows[i]["port"].ToString() != dt.Rows[i - 1]["port"].ToString()) || (dt.Rows[i]["ele_order"].ToString() != dt.Rows[i - 1]["ele_order"].ToString())) { address++; //ds[address].Rows.Add(dr); } //else //{ // ds[address].Rows.Add(dr); //} DataRow dr = ds[address].NewRow(); dr[0] = dt.Rows[i][0]; dr[1] = dt.Rows[i][1]; dr[2] = dt.Rows[i][2]; dr[3] = dt.Rows[i][3]; dr[4] = dt.Rows[i][4]; dr[5] = dt.Rows[i][5]; dr[6] = dt.Rows[i][6]; // dr[7] = dt.Rows[i][7]; ds[address].Rows.Add(dr); } return ds; } } }