ldj/epickpublic/BLL/elelable/pick.cs

1084 lines
42 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 System.Timers;
namespace elelab
{
public class pick
{
public delegate void lightReturn(int eleId, int colorPort, int eleAddress, int count);
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<int> activeComports = new List<int>() ;//激活的com口
static List<int> errorIds = new List<int>() ;
static log4net.ILog log = log4net.LogManager.GetLogger("light");
static System.Timers.Timer timer = new System.Timers.Timer();//实例化Timer类
static WmsImportSeeds seeds = new WmsImportSeeds();
public static void initialErrorTimer()
{
int intTime = 5000;
timer.Interval = intTime;//设置间隔时间,为毫秒;
timer.Elapsed += new System.Timers.ElapsedEventHandler(tryErors);//到达时间的时候执行事件;
timer.AutoReset = true;//设置是执行一次false还是一直执行(true)
timer.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件
timer.Start();
}
private static void tryErors(object sender, ElapsedEventArgs e)
{
log.Debug("start try errors, erorrIds size " + errorIds.Count);
if (errorIds.Count == 0)
{
return;
}
log.Debug("start try errors, erorrIds size " + errorIds.Count);
List<int> ids = new List<int>();
try
{
foreach (int id in errorIds)
{
if (seeds.pickSeedItem(id, DeiNiu.Utils.enumSeedsState.) > 0)
{
ids.Add(id);
}
}
}
catch (Exception er)
{
log.Error(er);
}
try
{
foreach (int id in ids)
{
errorIds.Remove(id);
}
}
catch (Exception er)
{
log.Error(er);
}
log.Debug("end try errors, erorrIds size " + errorIds.Count);
}
private static byte get_byte(string data)
{
int length = data.Length;
List<string> str = new List<string>();
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)
{
LogHelper.WriteLog(typeof(pick), 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)
{
//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<string> statuKeys = new List<string>();
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(led_color, 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 (unart_manage.com_manage[port].clear_order(order) == false)
{
LogHelper.WriteLog(typeof(pick), 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 (unart_manage.com_manage[port].send_state_finish == false) ;
unart_manage.com_manage[port].send_state_finish = false;
unart_manage.com_manage[port].usart_send_state = false;
unart_manage.com_manage[port].usart_send_result = "";
if (unart_manage.com_manage[port].write_data(ele_data_comment) == false)
{
LogHelper.WriteLog(typeof(pick), string.Format(" port {0} send fail", port));
//MessageBox.Show("send fail") ;
unart_manage.com_manage[port].send_state_finish = true;
unart_manage.com_manage[port].usart_send_state = true;
unart_manage.com_manage[port].usart_send_result = "";
return false;
}
string result;
bool isLightsSuccess = unart_manage.com_manage[port].wait_ack(out result);
foreach(string key in statuKeys){
WmsConstants.WAVE_CURRENT_LIGHTS_STATUS[key] = isLightsSuccess;
}
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 (unart_manage.com_manage[port].clear_order(order) == false)
{
return false;
}
if (unart_manage.com_manage[port].write_data(ele_data_comment) == false)
{
return false;
}
return true;
}
}
public static bool clear_dis(byte port, byte 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);
}
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();
/// <summary>
/// send back from elabel
/// </summary>
public static void return_data1()
{
List<string> statuKeys = new List<string>();
// string sql, table;
int ele_id;
int little_ele_id;
int receive_count;
int little_ele_id_2;
string color;
int seedsId;//[t_wmsOutSeeds_tmp].id 区分同一个标签对应多个货物的情况
// WmsOutPickLable outPick = new WmsOutPickLable();
int orderNo;
enumLabelPickType pickType =enumLabelPickType.pick; //同一个控制器应该拣选类型唯一
// int cnt = 0;
Dictionary<string, bool> tmp = WmsConstants.WAVE_CURRENT_PICK_STATUS;
while (receive_add != manage_add)
{
// cnt++;
receive_count =Convert.ToInt16( receive_data_dot(Convert.ToInt32(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].dis_type.ToString();//.order.ToString();//color
little_ele_id = Convert.ToInt16(ele_lab_data[manage_add].little_ele_id.ToString()); //ele address
little_ele_id_2 = Convert.ToInt16(ele_lab_data[manage_add].little_ele_idH2.ToString()); //ele address
int state = elelab.pick.ele_lab[ele_id, little_ele_id];
pickType = (enumLabelPickType)state;
orderNo = Convert.ToInt16(ele_lab_data[manage_add].order.ToString()); //port
seedsId = ele_lab_data[manage_add].WarehousingID ; //port
string key;// = Util.getLightKey(Convert.ToInt16(color), ele_id, little_ele_id);
lWmsOutPickLable lwp;
bool isPickOver = false;
//WmsConstants.WAVE_CURRENT_PICK_STATUS[key] = true;
if (ele_id == 0)
{
manage_add = receive_add;
break;
}
// WmsImportSeeds seeds;
switch (pickType)
{
case enumLabelPickType.pick:
key = Util.getLightKey(Convert.ToInt16(color), ele_id, little_ele_id);
if (WmsConstants.WAVE_CURRENT_PICK_STATUS.ContainsKey(key) )
{
manage_add++;
if (manage_add >= add_max)
{
manage_add = 0;
}
if (WmsConstants.WAVE_CURRENT_PICK_STATUS[key])
{
continue;
}
}
lwp = new lWmsOutPickLable();
// lwp.getWmsOutPickLable.updatePickingStatus(Convert.ToInt16(color), ele_id, little_ele_id, Convert.ToDecimal(receive_count));
WmsConstants.WAVE_CURRENT_PICK_STATUS[key] = lwp.getWmsOutPickLable.updatePickingStatus(Convert.ToInt16(color), ele_id,little_ele_id, Convert.ToDecimal(receive_count)) >0;//本次拣选完毕
isPickOver = lwp.getWmsOutPickLable.getCurrentPickList( DeiNiu.Utils.enumPickState.).Tables[0].Rows.Count == 0;//波次是否全部拣选完毕
elelab.pick.pick_task = isPickOver;
if (isPickOver)
{
//notice pick finished
lwp. finishCurrentWave(WmsConstants.WAVE_CURRENT_ORDER,false);
}
break;
case enumLabelPickType.seed:
key = Util.getLightKey(Convert.ToInt16(color), ele_id, little_ele_id);
if (WmsConstants.WAVE_CURRENT_LIGHTS_STATUS.ContainsKey(key))
{
WmsConstants.WAVE_CURRENT_LIGHTS_STATUS.Remove(key);
}
if (WmsConstants.WAVE_CURRENT_PICK_STATUS.ContainsKey(key) )
{
manage_add++;
if (manage_add >= add_max)
{
manage_add = 0;
}
if (WmsConstants.WAVE_CURRENT_PICK_STATUS[key])
{
continue;
}
}
lightReturn handler = lightOffEvent;
if (handler != null)
{
handler(ele_id, orderNo, little_ele_id, receive_count);
}
// seeds = new WmsImportSeeds();
// lwp.getWmsOutPickLable.updatePickingStatus(Convert.ToInt16(color), ele_id, little_ele_id, Convert.ToDecimal(receive_count));
if (WmsConstants.SEEDS_LABEL_ID.ContainsKey(orderNo + "-" + ele_id))
{
seedsId = WmsConstants.SEEDS_LABEL_ID[orderNo + "-" + ele_id];
}
try
{
WmsConstants.WAVE_CURRENT_PICK_STATUS[key] = seeds.pickSeedItem(seedsId, DeiNiu.Utils.enumSeedsState.) > 0;//本次完毕
}
catch (Exception ex)
{
log.Debug(ex);
try
{
Thread.Sleep(200);
WmsConstants.WAVE_CURRENT_PICK_STATUS[key] = seeds.pickSeedItem(seedsId, DeiNiu.Utils.enumSeedsState.) > 0;//本次完毕
}
catch (Exception e)
{
log.Debug(e);
if (!errorIds.Contains(seedsId)) { errorIds.Add(seedsId); }
}
}
break;
case enumLabelPickType.seedsDesk:
key = Util.getLightKey(Convert.ToInt16(color), ele_id, little_ele_id);
if (WmsConstants.WAVE_CURRENT_LIGHTS_STATUS.ContainsKey(key))
{
WmsConstants.WAVE_CURRENT_LIGHTS_STATUS.Remove(key);
}
if (WmsConstants.WAVE_CURRENT_PICK_STATUS.ContainsKey(key))
{
manage_add++;
if (manage_add >= add_max)
{
manage_add = 0;
}
if (WmsConstants.WAVE_CURRENT_PICK_STATUS[key])
{
continue;
}
}
// seeds = new WmsImportSeeds();
WmsConstants.WAVE_CURRENT_PICK_STATUS[key] = seeds.pickSeedDeskItem(currentSeedsNo,currentBarcode,ele_id ) > 0;//本次拣选完毕
break;
case enumLabelPickType.tran:
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 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 string send_data_pick(DataTable dt,enumLabelPickType pickType)////-----
{
// init_port(pickType);
if (activeComports.Count ==0 || dt.Rows.Count == 0)
{
return "";
}
/*
DataView dv = dt.DefaultView ;
dv.Sort ="ele_order,color"; //排序,这里的排序不起作用。。。。
DataTable sortedTable = dv.ToTable();
foreach (DataRow dr in sortedTable.Rows){
LogHelper.debug ("pick", string.Format("sorted: eleOrder:{0} color:{1}", dr["ele_order"].ToString(), dr["color"].ToString()));
}
dt.DefaultView.Sort = "ele_order,color";
foreach (DataRow dr in dt.Rows)
{
LogHelper.debug("pick", string.Format(" dt.DefaultView.Sort eleOrder:{0} color:{1}", dr["ele_order"].ToString(), dr["color"].ToString()));
}*/
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.pick.make_data(ds[j], led_color, part_byte, port_byte, null, null, null, pick_type))
{
successCnt++;
}
else
{
failureCnt++;
}
}
elelab.pick.pick_task = false;
if (failureCnt > 0)
{
return string.Format("部分标签未点亮");
}
return "";
}
public static bool lightLabels(int[] ele_lab_id, string[] ele_address, int led_color,
int[] counts , int port, enumLabelPickType pickType)////-----
{
// init_port(pickType);
if (activeComports.Count == 0 || ele_lab_id.Length == 0)
{
return false;
}
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 = get_byte( (led_color).ToString());// 灯的颜色 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 = get_byte((port).ToString());// Convert.ToByte(ele_order_id);
ele_data_comment[j].port = "1";
ele_data_comment[j].receive_count = 0;
ele_data_comment[j].send_count = counts[j] ;
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] = get_byte( ((int)pickType).ToString()) ;
}// //向串口发送数据
clear_order order = new clear_order();
order.order = get_byte((port).ToString());//Convert.ToByte(ele_order_id);
order.state = 1;
if (unart_manage.com_manage[get_byte((port).ToString() )].clear_order(order) == false)
{
return false;
}
if (unart_manage.com_manage[get_byte((port).ToString())].write_data(ele_data_comment) == false)
{
return false;
}
return true;
}
public static bool lightLabels(List<DeiNiu.wms.win.ELabel> lables, enumLabelPickType pickType)////-----
{
// init_port(pickType);
if (activeComports.Count == 0 || lables.Count == 0)
{
return false;
}
int[] ids = new int[lables.Count];
int[] counts = new int[lables.Count];
string[] ele_address = new string[lables.Count];
for (int i = 0; i < lables.Count; i++)
{
ids[i] = lables[i].labelId;
ele_address[i] = lables[i].address.ToString();
counts[i] = lables[i].count;
}
return lightLabels(ids, ele_address, lables[0].color, counts, lables[0].port, pickType);
}
static string currentSeedsNo = "", currentBarcode = "";
/// <summary>
/// 以端口号为一组,点亮多个标签
/// 适用于分拣墙
/// </summary>
/// <param name="lables"></param>
/// <param name="portNo">分拣墙端口号</param>
/// <param name="orderId">order to clear</param> -->use color 支持多人
/// <param name="pickType"></param>
/// <returns></returns>
public static bool lightLabels2(List<DeiNiu.wms.win.ELabel> lables, int portNo,int orderId,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<string> statuKeys = new List<string>();
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;
currentSeedsNo = lb.seedsNo;
currentBarcode = lb.barcode;
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.address);// 货位号
ele_data_comment[j].send_count = lb.count;
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(lb.color, lb.labelId, lb.address));
}// //向串口发送数据
if (!clearOrder(orderPort, orderId))
{
return false;
}
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;
}
return 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();
}
public static bool clearOrder(int port, int orderId)
{
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[port].clear_order(order) == false)
{
return false;
}
return true;
}
private static DataTable[] split_ele_data(DataTable dt)
{
// dt.DefaultView.Sort = "ele_order,color";
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++)
{
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()))
{
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;
}
public static bool turnOnLight(int port, channel_led id_data)
{
if (unart_manage.com_manage[port] == null)
{
return false;
}
config_channel_led id;
id.channel_id = id_data.channel_id;
id.config_word = id_data.color;
id.state = 1;
if (unart_manage.com_manage[port].configLightColor(id))
{
return unart_manage.com_manage[port].turnOnLight(id_data);
}
return false;
}
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);
}
}
}