ldj/DNLight/pick.cs

918 lines
29 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 Model;
namespace elelab
{
public class DNLights
{
public delegate void lightReturn(int orderNo, int eleId, int color, int eleAddress,int count );
public static event lightReturn lightOffEvent;
static Thread pick_work;
static Thread pick_work_support;
// static bool begain_pick = false;
public static byte[,] ele_lab = new byte[3000, 100];//ele_id address type 0 拣选 1 播种 2 装车
static uart_dis_data[] ele_lab_data = new uart_dis_data[10000];//ele_id address type 0 拣选 1 播种 2 装车
static int receive_add = 0;
static int manage_add = 0;
static int add_max = 10000;
// public static int port_max = 100;
static bool pick_task = true;
static List<int> activeComports = new List<int>() ;//激活的com口
// static Dictionary<string, bool> CURRENT_LIGHTS_STATUS = new Dictionary<string, bool>();
static Dictionary<string, bool> CURRENT_PICK_STATUS = new Dictionary<string, bool>();
static int ORDER_NO = 1;
//static Dictionary orderDic
/// <summary>
///清除旧数据,准备接收新一组亮灯数据
///复位端口
///清除标签数据
/// </summary>
/// <param name="pickType">分拣类型默认0</param>
public static void initPort(int pickType=0)
{
elelab.unart_manage.init_sys();
init_sys_port(pickType);
CURRENT_PICK_STATUS.Clear();
}
/// <summary>
/// 点亮标签
/// 以端口号和颜色为单位发送亮灯数据
/// </summary>
/// <param name="port">标签端口号</param>
/// <param name="color">亮灯颜色</param>
/// <param name="eleLabId">标签ID</param>
/// <param name="eleAddress">标签坐标(行/列)</param>
/// <param name="counts">显示数量</param>
/// <param name="pickType">分拣类型默认0</param>
/// <returns>是否成功点亮标签</returns>
public static bool lightLabels( int port,int color, int[] eleLabId, int[] eleAddress,
int[] counts , int pickType=0)
{
// init_port(pickType);
if (activeComports.Count == 0 || eleLabId.Length == 0)
{
return false;
}
byte portB = Convert.ToByte(port);
int orderNo = port;
uart_dis_data[] ele_data_comment = new uart_dis_data[eleLabId.Length];
for (int j = 0; j < eleLabId.Length; j++)
{
ele_data_comment[j].channel_id = 0;//暂不使用 默认为0
ele_data_comment[j].dis_type = get_byte( (color).ToString());// 灯的颜色 0 不亮 1 红灯 2 绿灯 3 蓝灯 4 红闪 5 绿闪 6 蓝闪
ele_data_comment[j].ele_id = Convert.ToInt16(eleLabId[j].ToString());
ele_data_comment[j].kucun_id = 0;
ele_data_comment[j].little_ele_id = Convert.ToByte(eleAddress[j].ToString());
ele_data_comment[j].order = Convert.ToByte(orderNo);// get_byte((port).ToString());// Convert.ToByte(ele_order_id);
ele_data_comment[j].port = "1";// (port).ToString();// "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( pickType .ToString()) ;
string key = getLightKey(orderNo,color, eleLabId[j], eleAddress[j], counts[j]);
CURRENT_PICK_STATUS[key] =false;
}// //向串口发送数据
clear_order order = new clear_order();
order.order = Convert.ToByte(orderNo); //portB;// get_byte((port).ToString());//Convert.ToByte(ele_order_id);
order.state = 1;
/*
orderNo += 1;
if (orderNo >= 255)
{
orderNo = 1;
}*/
if (unart_manage.com_manage[portB].clear_order(order) == false)
{
return false;
}
if (unart_manage.com_manage[portB].write_data(ele_data_comment) == false)
{
return false;
}
string result;
bool isLightsSuccess = unart_manage.com_manage[port].wait_ack(out result);
Console.WriteLine("亮灯成功。。。。");
return isLightsSuccess;
}
public static bool lightLabels(int orderNo,int port, int[] colors, int[] eleLabId, int[] eleAddress,
int[] counts, int pickType = 0)
{
// init_port(pickType);
if (activeComports.Count == 0 || eleLabId.Length == 0)
{
return false;
}
byte portB = Convert.ToByte(port);
//int tmp = orderNo;
uart_dis_data[] ele_data_comment = new uart_dis_data[eleLabId.Length];
for (int j = 0; j < eleLabId.Length; j++)
{
ele_data_comment[j].channel_id = 0;//暂不使用 默认为0
ele_data_comment[j].dis_type = get_byte(colors[j].ToString());// 灯的颜色 0 不亮 1 红灯 2 绿灯 3 蓝灯 4 红闪 5 绿闪 6 蓝闪
ele_data_comment[j].ele_id = Convert.ToInt16(eleLabId[j].ToString());
ele_data_comment[j].kucun_id = 0;
ele_data_comment[j].little_ele_id = Convert.ToByte(eleAddress[j].ToString());
ele_data_comment[j].order = Convert.ToByte(orderNo);// get_byte((port).ToString());// Convert.ToByte(ele_order_id);
ele_data_comment[j].port = "1";// (port).ToString();// "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(pickType.ToString());
//初始化标签返回事件的状态
string key = getLightKey(orderNo, colors[j], eleLabId[j], eleAddress[j], counts[j]);
CURRENT_PICK_STATUS[key] = false;
}// //向串口发送数据
clear_order order = new clear_order();
order.order = Convert.ToByte(orderNo); //portB;// get_byte((port).ToString());//Convert.ToByte(ele_order_id);
order.state = 1;
/*
orderNo += 1;
if (orderNo >= 255)
{
orderNo = 1;
}
Console.WriteLine("next clean orderNo is。。。。" + orderNo);
*/
if (unart_manage.com_manage[portB].clear_order(order) == false)
{
return false;
}
if (unart_manage.com_manage[portB].write_data(ele_data_comment) == false)
{
return false;
}
/*
string result;
bool isLightsSuccess = unart_manage.com_manage[portB].wait_ack(out result);
if (isLightsSuccess)
Console.WriteLine("亮灯成功。。。。");
return isLightsSuccess;
*/
return true;
}
public static bool clearOrder(int orderNo, int port)
{
clear_order order = new clear_order();
order.order = Convert.ToByte(orderNo);
order.state = 1;
if (unart_manage.com_manage[Convert.ToByte(port)].clear_order(order) == false)
{
return false;
}
return true;
}
/// <summary>
/// 点亮标签
/// 以端口号和颜色为单位发送亮灯数据
/// </summary>
/// <param name="port">标签端口号</param>
/// <param name="colors">亮灯颜色</param>
/// <param name="eleLabId">标签ID</param>
/// <param name="eleAddress">标签坐标(行/列)</param>
/// <param name="counts">显示数量</param>
/// <param name="pickType">分拣类型默认0</param>
/// <returns>是否成功点亮标签</returns>
public static bool lightLabels(int port, int[] colors, int[] eleLabId, int[] eleAddress,
int[] counts, int pickType = 0)
{
if (ORDER_NO > 200)
{
ORDER_NO = 1;
}
return lightLabels(ORDER_NO, port, colors, eleLabId, eleAddress, counts, pickType);
ORDER_NO++;
}
public static List<int> getActiveComports()
{
return activeComports;
}
/// <summary>
/// 按灭标签,接收回传数据
/// 用户可以在此进行标签灭灯事件的数据处理
/// </summary>
public static void returnData()
{
List<string> statuKeys = new List<string>();
int eleId; //标签ID
int eleAddress;//标签坐标(层/列)
int count;//数量
int color;//颜色
int orderNo; //端口
// Dictionary<string, bool> 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 = elelab.DNLights.ele_lab[eleId, eleAddress];
orderNo = Convert.ToInt16(ele_lab_data[manage_add].order.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 = getLightKey(orderNo, color, eleId, eleAddress, count);
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);
CURRENT_PICK_STATUS[key] = true;
}
}
}
/// <summary>
/// 熄灭指定ID的标签
/// </summary>
/// <param name="ltId">默认熄灭所有</param>
public static void turnOffLight(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 == 0)
{
continue;
}
unart_manage.com_manage[port].init_port.write_clear_comment(id);
}
if (ltId != 65535) //当熄灭端口所有标签时,熄灭端口的通道灯
{
return;
}
id.order = 1;
id.ele_id = ltId;// 65535;
id.state = 1;
foreach (int port in activeComports)
{
if (port == 0 )
{
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);
}
// a.write_clear_comment(id);
}
}
/// <summary>
/// 熄灭指定端口标签
/// 当熄灭端口所有标签时,熄灭端口的通道灯
/// </summary>
/// <param name="port">端口号</param>
/// <param name="ltId">标签ID默认熄灭全部标签</param>
public static void turnOffLightOfPort(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);
}
}
/// <summary>
/// 熄灭端口的多个标签
/// 通道灯需要手动控制熄灭
/// </summary>
/// <param name="portNo">端口号</param>
/// <param name="ids">标签ID数组</param>
public static void turnOffLights(int portNo,int[] ids)
{
foreach (int id in ids)
{
turnOffLightOfPort(portNo, id);
}
}
/// <summary>
/// 复位指定所有标签、通道灯设备
/// </summary>
/// <param name="port">端口号</param>
/// <returns></returns>
public static void resetDevice()
{
foreach (int i in activeComports)
{
resetDevice(i);
}
}
/// <summary>
/// 复位指定端口的标签和通道灯
/// </summary>
/// <param name="port">端口号</param>
/// <returns></returns>
public static string resetDevice(int port)
{
int port_num;
try
{
port_num = Convert.ToInt16(port);
}
catch
{
port_num = 1;
}
if (elelab.unart_manage.com_manage[port_num] != null)
{
elelab.unart_manage.com_manage[port_num].write_reset_device();
}
return "<result>执行成功</result>";
}
public static Dictionary<int, List<int>> channalLights = new Dictionary<int, List<int>>();
public static void searchLight()
{
channalLights.Clear();
Model.modify_id id;
// System.Threading.Thread.Sleep(50);
foreach (int port in DNLights.activeComports)
{
if (port == 0)
{
continue;
}
for (int i = 5000; i <= 5100; i++)
{
id.order = 0;
id.new_ele_id = 0;
id.old_ele_id = i;
id.state = 1;
bool ret = unart_manage.com_manage[port].init_port.search_light_id(id);
if (ret)
{
if (!channalLights.ContainsKey(port))
{
channalLights[port] = new List<int>();
}
channalLights[port].Add(i);
}
}
}
}
#region privatefuncs
private static string getLightKey(int orderNo,int color, int labelId, int address,int count)
{
return string.Format("{0}-{1}-{2}", orderNo, color, labelId);
// return string.Format("{0}-{1}-{2}-{3}-{4}",orderNo, color, labelId, address,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 static void init_sys_port(int 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( pickType);
if (unart_manage.com_manage[port].clear_order(order))
{
activeComports.Add(port);
}
}
}
init_pick();
// clear_order(dt);
}
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;
}
}
}
}
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;
}
private static void manage_data()
{
returnData();
}
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;
}
#endregion
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;
if (pick_work_support != null)
return;
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
{
Console.WriteLine("pick_work.ThreadState " + pick_work.ThreadState);
if (Convert.ToInt16(pick_work.ThreadState) == 68)
{
pick_work.Resume();
Console.WriteLine("2. pick_work.Resumed" );
Console.WriteLine("pick_work.ThreadState " + pick_work.ThreadState);
}
}
catch (Exception er)
{
}
}
}
public static void wake_support_thread()
{
Console.WriteLine("pick_work_support.ThreadState " + pick_work_support.ThreadState);
if (Convert.ToInt16(pick_work_support.ThreadState) == 68)
{
pick_work_support.Resume();
Console.WriteLine("5. pick_work_support.Resumed");
}
}
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 void pick_sys()
{
//int count;Threads_state
// Threads_state = true;
//out_start_state = false;
elelab.DNLights.init_pick_support();
while (true)
{
// unart_manage.com_manage[17].return_data();
pick_work_support.Suspend();
//System.Threading.Thread.Sleep(15000);
Console.WriteLine("4. receive and manage data");
receive_data();
manage_data();
wake_support_thread();
Console.WriteLine("6. pick_work.Suspend ");
pick_work.Suspend();
}
}
public static void pick_sys_support()
{
//int count;Threads_state
while (true)
{
System.Threading.Thread.Sleep(2000); //wm 2000 is bigger?
Console.WriteLine("Thread.Sleeped 2000 ");
if (read_state() == true)
{
wake_thread();
}
Console.WriteLine(" pick_work_support.Suspend ");
pick_work_support.Suspend();
}
}
/// <summary>
/// 关闭通道灯
/// </summary>
/// <param name="port">端口号</param>
/// <param name="id">通道灯ID</param>
public static void close_channel_led(int port,int id)
{
dnwms dn = (unart_manage.com_manage[get_byte((port).ToString() )] ).init_port;
byte[] aa = new byte[5];
int count = 0;
aa[count++] = 0;
aa[count++] = Convert.ToByte(id/ 256);
aa[count++] = Convert.ToByte(id % 256);
aa[count++] = 0x30;
dn.manage_usart_package(aa) ;
}
/// <summary>
/// 点亮通道灯
/// </summary>
/// <param name="port">端口号</param>
/// <param name="id">通道灯ID</param>
public static void open_channel_led(int port, int id)
{
dnwms dn = (unart_manage.com_manage[get_byte((port).ToString())]).init_port;
if (dn == null)
{
return;
}
// dn.on_close_channel += new dn_wms.dnrj.close_channel(channelLightEvent);
// dn.on_open_channel += new dn_wms.dnrj.open_channel(channelLightEvent);
byte[] aa = new byte[5];
int count = 0;
aa[count++] = 0;
aa[count++] = Convert.ToByte(id / 256);
aa[count++] = Convert.ToByte(id % 256);
aa[count++] = 0x31;
dn.manage_usart_package(aa);
}
public static bool clear_order(int port)
{//7e 02 0002 24 1d 0a 05 05 05 06 06 03 04 04 00 7f
byte[] aa = new byte[6];
int count = 0;
aa[count++] = Convert.ToByte(port); ;// id_data.order;
aa[count++] = Convert.ToByte(0xea);
aa[count++] = Convert.ToByte(0xff);
aa[count++] = 0x2d;//命令字
aa[count++] = 0x0;
dnwms dn = (unart_manage.com_manage[get_byte((port).ToString())]).init_port;
if (dn == null)
{
return false;
}
return (dn.manage_usart_package(aa));
// return true;
}
}
}