using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Data.SqlClient; using System.Collections; using System.IO; using com.force.json; using System.Net; using System.Net.NetworkInformation; using Oracle.ManagedDataAccess.Client; namespace WCS { public class Common { /// /// 系统路径 /// public static string filepath = System.Reflection.Assembly.GetExecutingAssembly().Location; //public static string exepath = Application.ExecutablePath; //public static string path = filepath.Substring(0, filepath.LastIndexOf('\\')); /// /// 系统配置文件 /// public static string sysinipath = filepath.Substring(0, filepath.LastIndexOf('\\')) + "\\System.ini"; //public static string cmdinipath = filepath.Substring(0, filepath.LastIndexOf('\\')) + "\\Command.ini"; //public static string inipath = filepath.Substring(0, filepath.LastIndexOf('\\')) + "\\labels\\"; //public static string pbdpath = filepath.Substring(0, filepath.LastIndexOf('\\')) + "\\report.pbd"; /// /// 公司名称 /// public static string gs_companyName = ""; /// /// 系统图片路径 /// public static string picpath = filepath.Substring(0, filepath.LastIndexOf('\\')) + "\\image\\"; /// /// 系统信号,弹出提示框后根据选择传值回主窗口,后期考虑窗口间传参 /// public static bool sysinfo = false; //public static bool logout = false; //public static bool sameinfo = false; /// /// ASRS数据库连接字符串 /// public static string sqlcon = "Initial Catalog=klsasrs2;Persist Security Info=True;User ID=sa;Password=sa@123;"; //public static string sqlcon = "Initial Catalog=jsasrs;Persist Security Info=True;User ID=;Password=klsasrs@zy;"; /// /// ERP数据库连接字符串 /// public static string erpcon = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dm01db01-vip.dssyebs.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME = PROD)));User Id=HSTORE;Password=HSTORE;"; /// /// 数据库服务器IP /// public static string serverIp = "127.0.0.1"; /// /// WMS接口 /// public static string HttpUrl = ""; //public static string servername = "."; //public static string login = "asrs"; //public static string psw = "asrs"; //public static int crnwriteadd = 80; /// /// 定义FORM窗体f1 /// public static Form f1 = null; /// /// 堆垛机数量 /// public static int ci_crn_count = 3; /// /// 站点数量 /// public static int ci_sta_count = 36; /// /// PLC数量 /// public static int ci_plc_count = 1; /// /// 磅秤数量 /// public static int ci_scale_count = 1; /// /// 条码扫描器数量 /// public static int ci_barcode_count = 1; /// /// LED显示屏 /// public static int ci_led_count = 5; /// /// 台车数量 /// public static int ci_rgv_count = 0; /// /// WCS服务器Socket IP /// public static string gs_wcs_ip = ""; /// /// WCS服务器Socket端口 /// public static int gs_wcs_port = 10001; //public static int ci_plc_error_count = 7;// 91; /// /// 站点错误数 /// public static int ci_plcerrcount = 100; public static string[] plcerr;// = new string[ci_plcerrcount]; public static string[] gs_PlcErrDesc;// = new string[ci_plcerrcount]; //public static int ci_plcerrrecord = 30; //public static int[] gi_plc_err = new int[ci_plcerrrecord]; /// /// S7写数据到西门子PLC互锁标志,同一时间只允许一个写入 /// public static bool writeFlag = true; /// /// 磅秤重量上限 /// public static double ci_scale_maxwt = 1000; /// /// 磅秤重量下限 /// public static double ci_scale_minwt = 30; /// /// 堆垛机入库站站点编号数组 /// public static int[] crn_inStns = new int[8] { 104,106,117,120,124,131,133,136 }; /// /// 堆垛机出库站站点编号数组 /// public static int[] crn_outStns = new int[4] { 101,110, 113,127 }; //public static bool[] plctag = new bool[2]; //public static bool[] stasts = new bool[16]; //public static bool[] stasts1 = new bool[4]; //public static int[] gi_wrkno_pick = new int[5]; //public static string[] gi_sts=new string[4]; #region 常量定义区 //堆垛机内部状态参数状态字 public static long ch_crn_sdms = 1; //手动模式 public static long ch_crn_zdms = 2; //自动模式 public static long ch_crn_dnms = 4; //电脑模式 public static long ch_crn_sdz = 8; //手动中 public static long ch_crn_zdz = 16; //自动中 public static long ch_crn_dnmsz = 32; //电脑模式中 public static long ch_crn_jt = 64; //急停 public static long ch_crn_yc = 128; //异常 public static long ch_crn_dndmz = 256; //电脑待命中 public static long ch_crn_dnmljs = 512; //电脑命令正确接收 public static long ch_crn_rkz = 1024; //入库中 public static long ch_crn_ckz = 2048; //出库中 public static long ch_crn_kdkz = 4096; //库对库中 public static long ch_crn_zdzz = 8192; //站对站中 public static long ch_crn_yxz = 16384; //移行中 public static long ch_crn_dcqhjd = 32768; //堆垛机取货阶段 // {CRN STATUS2} public static long ch_crn_dcfhjd = 1; //堆垛机放货阶段 public static long ch_crn_dckx = 2; //堆垛机空闲 public static long ch_crn_zxyddw = 4; //走行原点定位 public static long ch_crn_sjyddw = 8; //升降原点定位 public static long ch_crn_zxzdw = 16; //走行在定位 public static long ch_crn_cyzzj = 32; //叉牙在中间 public static long ch_crn_cyzzd = 64; //叉牙在左端 public static long ch_crn_cyzyd = 128; //叉牙在右端 public static long ch_crn_sjsdw = 256; //升降上定位 public static long ch_crn_sjxdw = 512; //升降下定位 public static long ch_crn_plcdlbz = 1024; //plc电力不足 public static long ch_crn_sjtycyw = 2048; //升降台有物 //public static bool[] gl_crn_status = new bool[ci_crn_count]; //plc状态字 public static int ch_d1 = 1; public static int ch_d2 = 2; public static int ch_d3 = 4; public static int ch_d4 = 8; public static int ch_d5 = 16; public static int ch_d6 = 32; public static int ch_d7 = 64; public static int ch_d8 = 128; public static int ch_d9 = 256; public static int ch_d10 = 512; public static long ch_d11 = 1024; public static long ch_d12 = 2048; public static long ch_d13 = 4096; public static long ch_d14 = 8192; public static long ch_d15 = 16384; public static long ch_d16 = 32768; //堆垛机工作模式 /// /// 手动模式 /// public static int ci_CRN_MANUAL = 1; /// /// 自动模式 /// public static int ci_CRN_AUTO = 2; /// /// 连线模式 /// public static int ci_CRN_ONLINE = 3; //堆垛机io状态 public static int ci_CRN_LINK = 1; public static int ci_CRN_RESET = 2; public static int ci_CRN_CLEAR = 3; public static int ci_CRN_HOME = 4; public static int ci_CRN_STN = 5; public static int ci_CRN_SHELF = 6; public static int ci_CRN_INQUIRY = 7; public static int ci_CRN_STORE = 7; public static int ci_CRN_RETRIEVE = 8; public static int ci_CRN_MOVE = 10; public static int ci_CRN_STNTOSTN = 11; public static int ci_CRN_LOCTOLOC = 12; //堆垛机状态 /// /// 初始化 /// public static int ci_CRN_STS_INIT = -1; /// /// 空闲,无任务 /// public static int ci_CRN_STS_IDLE = 0; /// /// 取货定位中 /// public static int ci_CRN_STS_FETCH_MOVING = 1; /// /// 取货中 /// public static int ci_CRN_STS_FETCH = 2; /// /// 取货完成,放货定位中 /// public static int ci_CRN_STS_RELEASE_MOVING = 3; /// /// 放货中 /// public static int ci_CRN_STS_RELEASE = 4; /// /// 回原点中 /// public static int ci_CRN_STS_HP = 5; /// /// 去反原点中 /// public static int ci_CRN_STS_OHP = 6; /// /// 库位移转中 /// public static int ci_CRN_STS_LOC_MOVE = 7; /// /// 任务完成,等待WCS确认 /// public static int ci_CRN_STS_TASK_FINISH = 90; //public static int ci_CRN_SETTING = 0; //public static int ci_CRN_STS_IDLE = 1; public static int ci_CRN_STS_STORE_MOVE = 2; //{ STORE COMMAND } public static int ci_CRN_STS_RETRIEVE_MOVE = 3; //{ RETRIEVE COMMAND } public static int ci_CRN_STS_MOVING = 4; //{ MOVE COMMAND } public static int ci_CRN_STS_STORE_OK = 5; public static int ci_CRN_STS_RETRIEVE_OK = 6; public static int ci_CRN_STS_MOVING_OK = 7; public static int ci_CRN_STS_ERROR = 8; public static int ci_CRN_STS_ERROR_IDLE = 9; //public static int ci_CRN_STS_OHP = 10; public static int ci_CRN_STS_STOP = 11; public static int ci_CRN_STS_STNCHG_MOVE = 12; public static int ci_CRN_STS_STNCHG_OK = 13; public static int ci_CRN_STS_LOCATION_MOVE = 14; public static int ci_CRN_STS_LOCATION_MOVE_OK = 16; public static int ci_CRN_STS_HP_POSITION = 15; ///20061007 //工作状态 public static int ci_WRK_STORE_SETDATA = 1; public static int ci_WRK_STORE_SETPLC = 2; public static int ci_WRK_STORE_SETCRN = 3; public static int ci_WRK_STORE_OK = 4; public static int ci_WRK_STORE_UPDDB = 5; public static int ci_WRK_STORE_exit = 6; public static int ci_WRK_STNMOVE_OK = 7; public static int ci_WRK_RETRIEVE_SETDATA = 11; public static int ci_WRK_RETRIEVE_SETCRN = 12; public static int ci_WRK_RETRIEVE_OK = 14; public static int ci_WRK_RETRIEVE_UPDDB = 15; public static int ci_plc_MAX = 10; //PLC最大队列数 //plc工作命令类型 public static int ci_PLC_SETID = 1; public static int ci_PLC_SETDEST = 2; public static int ci_PLC_SETIDDEST = 3; //COMUCATION I/O BUFFER SIZE public static int ci_crn_MAXBUFSIZE = 4096; public static int ci_barcode_MAXBUFSIZE = 4096; //public static int ci_MAXINCOUNT = 35; //public static int ci_MAXOUTCOUNT = 50; /// /// CRANE SLEEP TIME /// public static int ci_CRNtimeInterval = 300; /// /// PLC SLEEP TIME /// public static int ci_PLCtimeInterval = 300; /// /// Barcode Scanner SLEEP TIME /// public static int ci_BarcodetimeInterval = 200; /// /// LED SLEEP TIME /// public static int ci_LedtimeInterval = 200; /// /// 系统运行中 /// public static int ch_CMD_START = 1; /// /// 系统暂停中 /// public static int ch_CMD_PAUSE = 10; /// /// 系统关闭中 /// public static int ch_CMD_CLOSE = 100; #endregion //-------------------------------------------------------------变量定义--------------------------------------------------------------------------- /// /// 下发堆垛机命令后,等待一个周期,再判断堆垛机是否空闲 /// public static int gi_cycle_flag = 0; /// /// 堆垛机IP /// public static string[] gs_crn_ip = new string[ci_crn_count]; /// /// PLC输送设备IP /// public static string[] gs_plc_ip = new string[ci_plc_count]; /// /// 磅秤端口号,串口 /// public static int[] gi_scale_port = new int[ci_scale_count]; /// /// 磅秤设备IP /// public static string[] gs_scale_ip = new string[ci_scale_count]; /// /// 条码设备串口端口 /// public static int[] gs_barcode_port = new int[ci_barcode_count]; /// /// 条码设备IP /// public static string[] gs_barcode_ip = new string[ci_barcode_count]; /// /// 条码设备IP /// public static string[] gs_led_ip = new string[ci_led_count]; /// /// 磅秤称重数据 /// public static double[] gd_gross_wt = new double[ci_scale_count]; /// /// 条码扫描数据 /// public static string[] gs_barcode_data = new string[ci_barcode_count]; /// /// LED待发送数据 /// public static string[] gs_led_data = new string[ci_led_count]; public static string[] gs_led_data_pre = new string[ci_led_count]; ///// ///// LED页数 ///// //public static int[] gi_led_Pages = new int[ci_led_count]; /// /// LED页码 /// public static int[] gi_led_PageNumber = new int[ci_led_count]; /// /// LED显示当前页码 /// public static int[] gi_led_CurPageNumber = new int[ci_led_count]; /// /// LED显示循环次数 /// public static int[] gi_led_Counts = new int[ci_led_count]; ///// ///// LED显示效果 ///// //public static int[] gi_led_ShowStyle = new int[ci_led_count]; /// /// 台车位置 /// public static int[] gi_RGVPos = new int[ci_rgv_count]; /// /// 扫描超时时间判断 /// public static double gd_scanTimeout = 4; ///// ///// PLC工作模式,0--入库,1--出库 ///// //public static int gi_PLCModel = 0; ///// ///// PLC手工完成出库信号,工作档将12->14 ///// //public static int gi_PLCClear = 0; /// /// 1号站条码扫描判断有没有扫到,计时判断 /// public static DateTime barcodeTime = DateTime.Now; public static int barcodeFlag = 0; //public static string gs_barcode = ""; #region LED参数 /// /// 显示屏宽度 /// public static int SCREEN_WIDTH = 96; /// /// 显示屏高度 /// public static int SCREEN_HEIGHT = 48; public static int CONTROLLER_TYPE = 850; //控制器类型 public static int SCREEN_TYPE = 1; //显示屏类型 public static int SCREEN_PIXELMODE = 1; //点阵类型 public static int SCREEN_DATADA = 0; //数据极性 public static int SCREEN_DATAOE = 0; //OE极性 public static int SCREEN_ROWORDER = 0; //行序模式 public static int SCREEN_FREQPAR = 0; //扫描点频 public static string SCREEN_COMM = "COM1"; //串口 public static int SCREEN_BAUD = 57600; //串口波特率 public static string SCREEN_STATUSFILE = "C:\\ScreenStatus.ini"; //显示屏状态保存文件 public static int SCREEN_SENDMODE = 2; //通讯模式,0:串口 2:网络 4:wifi public const int SENDALLPROGRAM = 41456; //发送所有节目信息。 /// /// 发送数据给控制卡时互斥作用,每次只能发送一条过去 /// public static bool m_bSendBusy = false; #endregion //public static string barrec = ""; public static int[] areamode = new int[4]; //public static bool insesheettag = false; //public static string[] gs_barcode_tmp = new string[5]; public static string[] crncmd = new string[ci_crn_count]; public static int[] crnwrkno = new int[ci_crn_count]; //public static int[] pickquereseq = new int[12]; //public static int bk = 1; public static Form form1 = null; public static Form form2 = null; //public static bool stnmove = true; //public static bool crnmove = true; //public static bool crnallow = true; public static int gi_Online_Flag = 10; public static bool[] gb_crn_status = new bool[ci_crn_count]; //public static int gi_wrkfileh = 0; public static string[] gs_crnlastio = new string[ci_crn_count]; public static int[] gi_crnstn = new int[ci_crn_count]; public static string[] gs_crn_data_pre = new string[ci_crn_count]; public static int[] gi_crn_wrkno = new int[ci_crn_count]; public static string[] gs_crn_err_pre = new string[ci_crn_count]; //public static int[] clrled = new int[10]; public static int gi_buffer_count = 16; public static int gi_trolleypos_count = 2; //public static int[] stnbuffer = new int[gi_buffer_count];// public static int[] trolleypos = new int[gi_trolleypos_count];//2个,14,29 //public static int[] ci_stnbuffer = new int[gi_buffer_count]; public static int[] gi_stabuffer = new int[gi_buffer_count]; //public static int[] gi_crn_actsts = new int[ci_crn_count]; public static int[] gi_stn_iotype = new int[ci_sta_count]; public static int[] g_ari_staion = new int[ci_sta_count]; public static string[] g_ars_staion_name = new string[ci_sta_count]; public static int[] g_ari_staion_plc_no = new int[ci_sta_count]; public static Control[] g_ari_staion_Component_seq = new Control[ci_sta_count]; public static int[] g_ari_station_idaddr = new int[ci_sta_count]; public static int[] g_ari_station_stsaddr = new int[ci_sta_count]; public static int[] g_ari_station_destaddr = new int[ci_sta_count]; public static string[] gs_plc_data_pre = new string[ci_sta_count]; public static int[] gi_crn_iotype = new int[ci_crn_count]; public static int[] gi_loctype = new int[ci_sta_count]; //堆垛机变量 //public static string[,] crnstsvalue = new string[ci_crn_count, 33]; public static string[] crnerrlist = new string[ci_crn_count]; //public static string[] crnip = new string[ci_crn_count]; public static int[] crn_i_crnno = new int[ci_crn_count]; public static int[] crn_i_crn_sts = new int[ci_crn_count]; /// /// 堆垛机命令 /// public static string[] gs_crncmd = new string[ci_crn_count]; public static string[] crn_s_commandstr = new string[ci_crn_count]; public static int[] crn_i_kind = new int[ci_crn_count]; public static int[] crn_i_Wrkno = new int[ci_crn_count]; public static int[] crn_i_fstn = new int[ci_crn_count]; public static int[] crn_i_tstn = new int[ci_crn_count]; public static string[] crn_s_Flocno = new string[ci_crn_count]; public static string[] crn_s_Tlocno = new string[ci_crn_count]; public static int[] crn_i_Errcod = new int[ci_crn_count]; public static bool[] gi_Yanshi_Flag = new bool[ci_crn_count]; /// /// 是否在原点,1=原点 /// public static int[] crn_i_onHP = new int[ci_crn_count]; ////////////////////---------------------------堆垛机变量表-------------------------- #region 堆垛机(CRN)状态信息 /// /// 堆垛机工作模式,0 = 离线模式,1=手动模式中,2=自动模式中,3=电脑连线模式中 /// public static int[] Mode = new int[ci_crn_count]; /// /// 堆垛机当前任务号 /// public static int[] TaskNo = new int[ci_crn_count]; /// /// SRM工位1当前任务执行状态,0=空闲,1=取货定位中,2=取货中,3=取货完成,放货定位中, /// 4=放货中,5=回原点中,6=去反原点中,7=库位移转,90=任务完成,WCS未确认,99=报警 /// public static int[] CrnState = new int[ci_crn_count]; ///// ///// 堆垛机当前列号 ///// //public static int[] CurBay = new int[ci_crn_count]; ///// ///// 堆垛机当前层号 ///// //public static int[] CurLev = new int[ci_crn_count]; /// /// 堆垛机当前货叉位置,0=货叉原位,1=货叉在左侧,2=货叉在右侧 /// public static int[] ForkPos = new int[ci_crn_count]; /// /// 堆垛机当前载货台定位位置,1=下定位,2=上定位,0=不在定位 /// public static int[] LiftPos = new int[ci_crn_count]; /// /// 堆垛机走行定位位置,1=在定位,0=不在定位 /// public static int[] WalkPos = new int[ci_crn_count]; /// /// =1 堆垛机任务完成信号 /// public static int[] TaskFinish = new int[ci_crn_count]; /// /// SRM工位1任务完成处理标记,防止重复处理。默认为0,timer1根据F1TaskFinish处理工作档状态后赋值1 /// 堆垛机线程中下发确认信息后,重置为0 /// public static int[] TaskFlag = new int[ci_crn_count]; /// /// =1 堆垛机载货台有货 /// public static int[] Loaded = new int[ci_crn_count]; /// /// 堆垛机异常码 /// public static int[] AlarmCode = new int[ci_crn_count]; /// /// 堆垛机走行速度(m/min) /// public static float[] WalkSpeed = new float[ci_crn_count]; /// /// 堆垛机升降速度(m/min) /// public static float[] LiftSpeed = new float[ci_crn_count]; /// /// 堆垛机叉牙速度(m/min) /// public static float[] ForkSpeed = new float[ci_crn_count]; /// /// 堆垛机累计走行距离(km) /// public static float[] XDistance = new float[ci_crn_count]; /// /// 堆垛机累计升降距离(km) /// public static float[] YDistance = new float[ci_crn_count]; /// /// 堆垛机累计走行时长(H) /// public static float[] XDuration = new float[ci_crn_count]; /// /// 堆垛机累计升降时长(H) /// public static float[] YDuration = new float[ci_crn_count]; ///// ///// 1=SRM处于报警状态 ///// //public static int[] AlarmStatus = new int[ci_crn_count]; ///// ///// SRM工位1当前货叉位置,[1:左近,2:中位,3:右近,4:左远,5:右远] ///// //public static int[] F1PosZ = new int[ci_crn_count]; ///// ///// SRM当前列坐标,单位mm ///// //public static double[] PosXmm = new double[ci_crn_count]; ///// ///// SRM当前层坐标,单位mm ///// //public static double[] PosYmm = new double[ci_crn_count]; ///// ///// SRM工位1当前货叉坐标,单位mm ///// //public static double[] F1PosZmm = new double[ci_crn_count]; ///// ///// SRM工位2当前任务执行状态,0=位置,1=空闲,2=检查任务数据,3=定位到取货位,7=取货完成, ///// 8=等待调度柜允许,9=移动到放货位置,10=放货中,13=搬运完成,14=空载避让,15=检查任务数据 ///// 20=检查源位置,21=检查目标位置,50=移动任务,98=任务完成,WCS未确认,99=报警 ///// //public static int[] F2State = new int[ci_crn_count]; #endregion #region 堆垛机状态字定义 /// /// 手动模式 /// public static bool[] crn_sdms = new bool[ci_crn_count]; /// /// 自动模式 /// public static bool[] crn_zdms = new bool[ci_crn_count]; /// /// 电脑模式 /// public static bool[] crn_dnms = new bool[ci_crn_count]; /// /// 手动中 /// public static bool[] crn_sdz = new bool[ci_crn_count]; /// /// 自动中 /// public static bool[] crn_zdz = new bool[ci_crn_count]; /// /// 电脑模式中 /// public static bool[] crn_dnmsz = new bool[ci_crn_count]; /// /// 急停 /// public static bool[] crn_jt = new bool[ci_crn_count]; /// /// 异常 /// public static bool[] crn_yc = new bool[ci_crn_count]; /// /// 保留 /// public static bool[] crn_dndmz = new bool[ci_crn_count]; /// /// 任务完成 /// public static bool[] crn_dnmljs = new bool[ci_crn_count]; /// /// 入库中 /// public static bool[] crn_rkz = new bool[ci_crn_count]; /// /// 出库中 /// public static bool[] crn_ckz = new bool[ci_crn_count]; /// /// 库到库 /// public static bool[] crn_kdkz = new bool[ci_crn_count]; /// /// 站到站 /// public static bool[] crn_zdzz = new bool[ci_crn_count]; /// /// 去原点 /// public static bool[] crn_yxz = new bool[ci_crn_count]; /// /// 去反原点 /// public static bool[] crn_dcqhjd = new bool[ci_crn_count]; /// /// 放货阶段 /// public static bool[] crn_dcfhjd = new bool[ci_crn_count]; /// /// 吊车空闲 /// public static bool[] crn_dckx = new bool[ci_crn_count]; /// /// 走行原点定位 /// public static bool[] crn_zxyddw = new bool[ci_crn_count]; /// /// 升降原点定位 /// public static bool[] crn_sjyddw = new bool[ci_crn_count]; /// /// 走行在定位 /// public static bool[] crn_zxzdw = new bool[ci_crn_count]; /// /// 叉牙在中间 /// public static bool[] crn_cyzzj = new bool[ci_crn_count]; /// /// 叉牙在左端 /// public static bool[] crn_cyzzd = new bool[ci_crn_count]; /// /// 叉牙在右端 /// public static bool[] crn_cyzyd = new bool[ci_crn_count]; /// /// 升降上定位 /// public static bool[] crn_sjsdw = new bool[ci_crn_count]; /// /// 升降下定位 /// public static bool[] crn_sjxdw = new bool[ci_crn_count]; /// /// 保留 /// public static bool[] crn_plcdlbz = new bool[ci_crn_count]; /// /// 升降台有物 /// public static bool[] crn_sjtycyw = new bool[ci_crn_count]; /// /// 当前排数 /// public static int[] crn_dqps = new int[ci_crn_count]; /// /// 当前层数 /// public static int[] crn_dqcs = new int[ci_crn_count]; /// /// 走行镭射距离 /// public static double[] crn_zxlsz = new double[ci_crn_count]; /// /// 升降镭射距离 /// public static double[] crn_sjlsz = new double[ci_crn_count]; public static int[] crn_dnmlyc = new int[ci_crn_count]; /// /// 设备异常码 /// public static int[] crn_ycmm = new int[ci_crn_count]; public static int[] crn_yczm = new int[ci_crn_count]; //public static int[] crn_zxlsz1 = new int[ci_crn_count]; //public static int[] crn_zxlsz2 = new int[ci_crn_count]; //public static int[] crn_sjlsz1 = new int[ci_crn_count]; //public static int[] crn_sjlsz2 = new int[ci_crn_count]; #endregion public static string[] crncmdtext = new string[ci_crn_count]; //定义plc变量 //public struct sta //{ public static int PlcMaxQuereCount = 10;//plc最大队列存储数量 public static string[,] s_cmd = new string[4, PlcMaxQuereCount]; //public static Queue PlcAQueue = new Queue(); //public static Queue PlcBQueue = new Queue(); public static string[,] plc_s_dev_no = new string[ci_plc_count, ci_sta_count]; public static string[,] plc_s_type_mk = new string[ci_plc_count, ci_sta_count]; public static string[,] plc_s_term_mk = new string[ci_plc_count, ci_sta_count]; public static int[,] plc_i_status = new int[ci_plc_count, ci_sta_count]; public static int[,] plc_i_plc_no = new int[ci_plc_count, ci_sta_count]; public static int[,] plc_i_Wrk_no = new int[ci_plc_count, ci_sta_count]; public static int[,] plc_i_ctn_type = new int[ci_plc_count, ci_sta_count]; public static int[,] plc_i_pakmk = new int[ci_plc_count, ci_sta_count]; public static int[,] plc_i_buff_count = new int[ci_plc_count, ci_sta_count]; public static string[,] plc_s_stn_status = new string[ci_plc_count, ci_sta_count]; public static string[,] plc_s_from_stn = new string[ci_plc_count, ci_sta_count]; public static string[,] plc_s_next_stn = new string[ci_plc_count, ci_sta_count]; public static string[,] plc_s_t_station = new string[ci_plc_count, ci_sta_count]; public static string[,] plc_s_autoing = new string[ci_plc_count, ci_sta_count]; public static string[,] plc_s_loading = new string[ci_plc_count, ci_sta_count]; /// /// 可入 /// public static string[,] plc_s_canining = new string[ci_plc_count, ci_sta_count]; /// /// 可出 /// public static string[,] plc_s_canouting = new string[ci_plc_count, ci_sta_count]; /// /// 空板信号 /// public static string[,] plc_s_inreq1 = new string[ci_plc_count, ci_sta_count]; /// /// 满托信号 /// public static string[,] plc_s_inreq2 = new string[ci_plc_count, ci_sta_count]; /// /// 货物类型 /// public static string[,] plc_s_loctype = new string[ci_plc_count, ci_sta_count]; /// /// 报警 /// public static string[,] plc_s_error = new string[ci_plc_count, ci_sta_count]; public static string[,] plc_s_modeallow = new string[ci_plc_count, ci_sta_count]; //public static string[] s_plc_err_count1 = new string[ci_plcerrcount]; //public static string[] s_plc_err_count2 = new string[ci_plcerrcount]; //public struct fieldds//字段描述 //{ // public int index; // public string dataname; // public string datadesc; //} //public Common() //{ //} //public static string Proc_GetNum(string str) //{ // string result = ""; // try // { // for (int i = 0; i < str.Length; i++) // { // if (str[i] == '0' || str[i] == '1' || str[i] == '2' || str[i] == '3' || str[i] == '4' || str[i] == '6' || str[i] == '7' || str[i] == '8' || str[i] == '9') // { // result = result.Trim() + str[i]; // } // } // } // catch (Exception t) // { // } // return result; //} /// /// 增加plc命令队列 /// /// plc号 /// 指令 public static void AddPlcQuereCmd(int plcno, string cmd) { if (cmd == "") { return; }; for (int j = PlcMaxQuereCount - 1; j >= 0; j--) { if (s_cmd[plcno, j] == "" || s_cmd[plcno, j] == null) { s_cmd[plcno, j] = cmd; break; } } AdjPlcQuere(plcno); } /// /// 得到plc指令队列的数量 /// /// plc号 /// 队列的数量 public static int GetPlcQuereCount(int plcno) { int count = 0; for (int i = 0; i < ci_plc_MAX; i++) { if (s_cmd[plcno, i] != "" && s_cmd[plcno, i] != null) { count++; } } return count; } /// /// 从plc队列中取最先进的一笔指令 /// /// plc号 /// 对应最先进的指令 public static string GetPlcQuereCmd(int plcno) { string cmd = ""; for (int i = 0; i < PlcMaxQuereCount; i++) { if (s_cmd[plcno, i] != "" && s_cmd[plcno, i] != null) { cmd = s_cmd[plcno, i]; s_cmd[plcno, i] = ""; break; } } AdjPlcQuere(plcno); return cmd; } /// /// 调整队列存储 /// /// plc号 public static void AdjPlcQuere(int plcno) { string s_tmep1 = "", s_tmep2 = ""; for (int j = PlcMaxQuereCount - 1; j >= 0; j--) { s_tmep1 = s_cmd[plcno, j]; if (j > 0) { s_tmep2 = s_cmd[plcno, j - 1]; if (s_tmep1 != "" && s_tmep2 == "") { s_cmd[plcno, j - 1] = s_tmep1; s_cmd[plcno, j] = ""; } } } } /// /// 根据堆垛机状态值得到状态名称 /// /// 堆垛机状态值 /// 堆垛机状态 public static string GetCrnStsName(int i_sts) { string crnstsname = ""; switch (i_sts) { case -1: crnstsname = "初始化"; break; case 0: crnstsname = "空闲"; break; case 1: crnstsname = "取货定位中"; break; case 2: crnstsname = "取货中"; break; case 3: crnstsname = "取货完成,放货定位中"; break; case 4: crnstsname = "放货中"; break; case 5: crnstsname = "回原点中"; break; case 6: crnstsname = "去反原点中"; break; case 7: crnstsname = "库位移转"; break; case 90: crnstsname = "任务完成,WCS未确认"; break; case 99: crnstsname = "报警"; break; default: crnstsname = "未知"; break; } return crnstsname; } /// /// 站点初始化,PLC读写地址定义 /// public static void InitSta() { int i; for (i = 1; i <= ci_sta_count; i++) { //站点号 g_ari_staion[i - 1] = i + 100; g_ars_staion_name[i - 1] = (i + 100).ToString(); g_ari_staion_plc_no[i - 1] = 1; //工作号 目标库位 状态 g_ari_station_idaddr[i - 1] = (i - 1) * 4; //工作号地址 g_ari_station_destaddr[i - 1] = (i - 1) * 4 + 2; //目标站地址 g_ari_station_stsaddr[i - 1] = i + 149; //状态位地址 //else if (i > 5 && i <= 10) //{ // g_ari_staion[i - 1] = i + 194; // g_ars_staion_name[i - 1] = (i + 194).ToString(); // g_ari_staion_plc_no[i - 1] = 1; // g_ari_station_idaddr[i - 1] = (i - 1) * 4; // g_ari_station_destaddr[i - 1] = (i - 1) * 4 + 2; // g_ari_station_stsaddr[i - 1] = i + 59; //} //初始化站点中各个值的数据。 plc_s_dev_no[g_ari_staion_plc_no[i - 1] - 1, i - 1] = g_ari_staion[i - 1].ToString(); plc_s_autoing[g_ari_staion_plc_no[i - 1] - 1, i - 1] = "N"; plc_s_loading[g_ari_staion_plc_no[i - 1] - 1, i - 1] = "N"; plc_s_canining[g_ari_staion_plc_no[i - 1] - 1, i - 1] = "N"; plc_s_canouting[g_ari_staion_plc_no[i - 1] - 1, i - 1] = "N"; plc_s_inreq1[g_ari_staion_plc_no[i - 1] - 1, i - 1] = "N"; plc_s_inreq2[g_ari_staion_plc_no[i - 1] - 1, i - 1] = "N"; plc_s_loctype[g_ari_staion_plc_no[i - 1] - 1, i - 1] = "N"; plc_s_error[g_ari_staion_plc_no[i - 1] - 1, i - 1] = "N"; plc_i_buff_count[g_ari_staion_plc_no[i - 1] - 1, i - 1] = 0; plc_i_Wrk_no[g_ari_staion_plc_no[i - 1] - 1, i - 1] = 0; plc_s_stn_status[g_ari_staion_plc_no[i - 1] - 1, i - 1] = "N"; plc_s_next_stn[g_ari_staion_plc_no[i - 1] - 1, i - 1] = "0"; plc_i_pakmk[g_ari_staion_plc_no[i - 1] - 1, i - 1] = 0; gi_stn_iotype[i - 1] = 0; //初始化站点出入形态 } } /// /// 堆垛机初始化 /// public static void InitCrn() { int i; for (i = 1; i <= ci_crn_count; i++) { crn_i_crnno[i - 1] = i; //crn_i_crn_sts[i - 1] = ci_CRN_SETTING; gs_crncmd[i - 1] = ""; crn_i_kind[i - 1] = 0; crn_i_Wrkno[i - 1] = 0; crn_i_fstn[i - 1] = 0; crn_i_tstn[i - 1] = 0; crn_s_Flocno[i - 1] = ""; crn_s_Tlocno[i - 1] = ""; //crn_i_Errcod[i - 1] = 0; crn_i_onHP[i - 1] = 0; gs_crnlastio[i - 1] = "I"; gs_crncmd[i - 1] = ""; crn_s_commandstr[i - 1] = ""; gi_crn_iotype[i - 1] = 0; gb_crn_status[i - 1] = true; AlarmCode[i - 1] = 0; TaskFlag[i - 1] = 0; CrnState[i - 1] = -1; } } /// /// 条码、LED、磅秤数据初始化 /// public static void InitDev() { int i; for (i = 0; i < ci_barcode_count; i++) { gs_barcode_data[i] = ""; } for (i = 0; i < ci_led_count; i++) { gs_led_data[i] = ""; gs_led_data_pre[i] = ""; gi_led_PageNumber[i] = 1; //gi_led_Pages[i] = 1; gi_led_Counts[i] = 0; gi_led_CurPageNumber[i] = 1; } for (i = 0; i < ci_scale_count; i++) { gd_gross_wt[i] = 0; } } /// /// 得到站序号 /// /// /// public static int GetStnSeq(int stn) { int retval = 0; for (int i = 0; i <= ci_sta_count - 1; i++) { if (g_ari_staion[i] == stn) { retval = i; return retval; //break; } } return 0; } ////得到区域模式地址 //public static int GetBufAddrByStn(int stn) //{ // int addr = 0; // switch (stn) // { // case 1: // addr = 4107; // break; // case 2: // addr = 4110; // break; // default: // break; // } // return addr; //} //public static string InttoStringYN(int i, int j) //{ // if (i == 1) // { // if (j == 1) // { // return "出"; // } // else // { // return "入"; // } // } // else // { // if (j == 1) // { // return "入"; // } // else // { // return "出"; // } // } //} ///// ///// 十六进制转十进制 ///// ///// ///// ///// //public static int funi_htoi(string s_data, int i_len) //{ // int i_sum = 0, i_tmp = 0, x = 0; // s_data = s_data.ToUpper(); // if (s_data == "" || s_data == null) // { // return 0; // } // for (x = 0; x < i_len; x++) // { // i_tmp = Convert.ToInt32(s_data[x]); // if (i_tmp > 58) i_tmp = i_tmp - 7; // i_sum = i_sum * 16 + i_tmp - 48; // } // return i_sum; //} ///// ///// 判断是否4位十六进制是否正确 ///// ///// ///// //public static bool fun_chkhex(string data) //{ // string s_str = data.PadLeft(4, '0'); // int i_asc = 0, i_count = 0; // for (int i = 0; i < s_str.Length; i++) // { // i_asc = Convert.ToInt32(s_str[i]); // if ((i_asc > 47 && i_asc < 58) || (i_asc > 64 && i_asc < 71)) // { // } // else // { // i_count++; // } // } // if (i_count > 0) // { // return false; // } // else // { // return true; // } //} /// /// 十六进制转十进制 /// /// /// public static double fun_hextodec(string data) { string cptr = ""; string s_str = data.Trim(); int len = s_str.Length; double nsum = 0; int k = 1; for (int i = 0; i < len; i++) { cptr = s_str.Substring(len - i - 1, 1); if (cptr == "A") { cptr = "10"; } else if (cptr == "B") { cptr = "11"; } else if (cptr == "C") { cptr = "12"; } else if (cptr == "D") { cptr = "13"; } else if (cptr == "E") { cptr = "14"; } else if (cptr == "F") { cptr = "15"; } if (i == 0) { k = 1; } else if (i == 1) { k = 16; } else if (i == 2) { k = 256; } else if (i == 3) { k = 16 * 256; } else if (i == 4) { k = 256 * 256; } else if (i == 5) { k = 16 * 256 * 256; } else if (i == 6) { k = 256 * 256 * 256; } else if (i == 7) { k = 16 * 256 * 256 * 256; } nsum = nsum + Convert.ToInt32(cptr) * k; } return nsum; } ////得到十六进制 //public static string fun_gethex(string s_data) //{ // string tohex = ""; // tohex = Convert.ToString(Convert.ToInt32(funi_htoi(s_data, 4)), 2); // return tohex; //} ////得到位与运算结果,并判断是否相同 //public static bool fun_ChkAndByte(string s_data, long t_data) //{ // long tohex1 = 0, tohex2 = 0, tohex3 = 0; // tohex1 = Convert.ToInt64(Convert.ToString(Convert.ToInt64(funi_htoi(s_data, s_data.Length)), 2)); // tohex2 = t_data;// Convert.ToInt32(Convert.ToString(t_data, 2)); // tohex3 = tohex1 & tohex2; // if (tohex3 == tohex2) // { // return true; // } // else // { // return false; // } //} /// /// 得到位与运算结果,并判断是否相同 /// /// /// /// public static bool fun_ChkAndByte(long i_data, long t_data) { long tohex1 = 0, tohex2 = 0, tohex3 = 0; tohex1 = i_data; tohex2 = t_data;// Convert.ToInt32(Convert.ToString(t_data, 2)); tohex3 = tohex1 & tohex2; if (tohex3 == tohex2) { return true; } else { return false; } } /// /// 生成工作号 /// /// /// public static int GetWrkno(int wrkmk) { int wrkno = 0, li_s_no = 0, li_e_no = 0; SqlConnection sqlcn = new SqlConnection(sqlcon); sqlcn.Open(); SqlDataAdapter sqlda = new SqlDataAdapter("select wrk_no,s_no,e_no from asr_wrk_lastno where wrk_mk=" + wrkmk + "", sqlcn); DataSet ds = new DataSet(); sqlda.Fill(ds); DataView dv = new DataView(ds.Tables[0]); sqlcn.Close(); foreach (System.Data.DataRowView drow in dv) { wrkno = Convert.ToInt32(drow[0].ToString().Trim()); li_s_no = Convert.ToInt32(drow[1].ToString().Trim()); li_e_no = Convert.ToInt32(drow[2].ToString().Trim()); } if (wrkno >= li_e_no) { wrkno = li_s_no; } else { wrkno++; } SqlConnection sqlcon1 = new SqlConnection(sqlcon); sqlcon1.Open(); SqlTransaction sqlts = sqlcon1.BeginTransaction(); string sql = "update asr_wrk_lastno set wrk_no=" + wrkno + " where wrk_mk=" + wrkmk + ""; SqlCommand sqlcom1 = new SqlCommand(sql, sqlcon1); sqlcom1.Transaction = sqlts; try { sqlcom1.ExecuteNonQuery(); sqlts.Commit(); } catch (SqlException r) { //MessageBox.Show("更新[asr_wrk_lastno]错误!", "错误"); sqlts.Rollback(); wrkno = 0; } finally { sqlcom1.Dispose(); sqlcon1.Dispose(); sqlcon1.Close(); } return wrkno; } /// /// 生成库位号 /// /// 入库类型 /// 高低库位 /// 堆垛机号 /// 入库站号 /// 入库方向,1为东侧1列起数,2为西侧最大列起数 /// public static string GetLocNo(int type, int loc_type, int crn_no, int stano, int stnType) { int e_staNo = 0; string locno = ""; int li_crnrow = 0, li_crn = 0, li_cnt = 0, li_max_cnt = 0, i = 0, n = 0, li_min = 0, li_max = 0, li_max_1 = 0, li_crn_qty = 0, crnsts = 0; string orderBy = "lev1,bay1 asc"; if (stnType == 1) //东侧 { orderBy = "lev1,bay1 asc"; } else if (stnType == 2) //西侧 { orderBy = "lev1 asc,bay1 desc"; } //DataView dv = ExecAsrsSelect("select current_row,s_row,e_row,crn_qty from asr_row_lastno where whs_type=" + whs_type); DataView dv = ExecAsrsSelect("select current_row,s_row,e_row,crn_qty from asr_row_lastno "); foreach (DataRowView drv in dv) { li_crnrow = Convert.ToInt32(drv[0].ToString()); li_min = Convert.ToInt32(drv[1].ToString()); li_max = Convert.ToInt32(drv[2].ToString()); li_crn_qty = Convert.ToInt32(drv[3].ToString()); } li_max_1 = li_max - 1; i = 1; do { if (li_crnrow == li_max) { li_crnrow = li_min; } else if (li_crnrow == li_max_1) { li_crnrow = li_min + 1; } else { li_crnrow = li_crnrow + 2; } li_crn = (li_crnrow + 1) / 2; if (ChkCrnEnable(li_crn, "I") == "Y") { e_staNo = getIoStaNo(type, li_crn, stano); if (e_staNo == 0) { continue; } //if (type == 10) //{ // locno = getEmptyLocation(li_crnrow, loc_type, orderBy); //} if (locno == "") { string sql = ""; //if (type == 10) //{ sql = "select top 1 loc_no from asr_loc_mast where row1=" + li_crnrow + " and loc_sts='O' order by " + orderBy; //} //else //{ // sql = "select top 1 loc_no from asr_loc_mast where row1=" + li_crnrow + " and loc_sts='O' order by " + orderBy; //} SqlConnection sqlconn = new SqlConnection(sqlcon); sqlconn.Open(); SqlDataAdapter sqlap = new SqlDataAdapter(sql, sqlconn); DataSet ds = new DataSet(); sqlap.Fill(ds); DataView dv1 = new DataView(ds.Tables[0]); sqlap.Dispose(); sqlconn.Dispose(); //sqlconn.Close(); foreach (DataRowView drv in dv1) { locno = drv[0].ToString(); break; } } } //if (locno != "" && int.Parse(locno.Substring(0, 2)) < 3 && (stano == 1304 || stano == 1205)) //{//1204站无法入库1号堆垛机 // locno = ""; //} //if (crn_no > 0 && crn_no != li_crn) //{//先入品分配新库位,必须同一台堆垛机 // locno = ""; //} if (Common.AlarmCode[li_crn - 1] > 0 || Common.Mode[li_crn - 1] != 3) { //堆垛机异常或者非自动,寻找下一个库位 locno = ""; } //int seqno = Common.GetStnSeq(e_staNo); //int plcno = stnType - 1; //string s_loading = Common.plc_s_loading[plcno, seqno]; //if (s_loading == "Y") //{//堆垛机入库站点有物,寻找下一个 // locno = ""; //} i++; if (i > li_crn_qty * 2) { break; } } while (locno == ""); if (locno != "") { SqlConnection sqlconn = new SqlConnection(sqlcon); sqlconn.Open(); SqlTransaction sqltrans = sqlconn.BeginTransaction(); string sql = "update dbo.asr_row_lastno set current_row='" + li_crnrow + "',modi_time='" + DateTime.Now.ToString() + "' "; SqlCommand sqlcmd = new SqlCommand(sql, sqlconn); sqlcmd.Transaction = sqltrans; try { sqlcmd.ExecuteNonQuery(); sqltrans.Commit(); } catch (SqlException r) { //MessageBox.Show("更新[asr_row_lastno]错误!", "错误"); sqltrans.Rollback(); sqlcmd.Dispose(); sqlconn.Dispose(); locno = ""; } } return locno; } /// /// 根据作业类型得到站点编号 /// /// 入库类型 /// 堆垛机号 /// 站点号 /// public static int getIoStaNo(int type, int crnno, int stnno) { int e_staNo = 0; try { string sql = "select crn_stn from asr_sta_desc "; sql += " where type_no=" + type + " and stn_no=" + stnno + " and crn_no=" + crnno; DataView dv_crn_stn = Common.ExecAsrsSelect(sql); if (dv_crn_stn != null || dv_crn_stn.Count > 0) { foreach (DataRowView drow in dv_crn_stn) { e_staNo = int.Parse(drow[0].ToString()); } } } catch (Exception) { } return e_staNo; } /// /// 判断堆垛机是否可用 /// /// /// /// public static string ChkCrnEnable(int crnno, string type) { DataView dv = null; string ls_in = "N", ls_ou = "N"; dv = ExecAsrsSelect("select in_enable,out_enable from asr_bas_crnp where crn_no=" + crnno); foreach (DataRowView drv in dv) { ls_in = drv[0].ToString(); ls_ou = drv[1].ToString(); } if (type == "I") { return ls_in; } else if (type == "O") { return ls_ou; } else { return "N"; } } //public static string GetRow(string row) //{ // if (row == "01") // { // return "01"; // } // else if (row == "02") // { // return "02"; // } // //else if (row == "03") // //{ // // return "01"; // //} // //else if (row == "04") // //{ // // return "02"; // //} // //else if (row == "05") // //{ // // return "01"; // //} // //else if (row == "06") // //{ // // return "02"; // //} // else // { // return ""; // } //} /// /// 根据堆垛机异常码得到异常描述 /// /// /// public static string GetErr(int error_code) { string result = ""; switch (error_code) { case 1: result = "左超限"; break; case 2: result = "右超限"; break; case 3: result = "前超限"; break; case 4: result = "后超限"; break; case 5: result = "高超限"; break; case 6: result = "取货载货台有货"; break; case 7: result = "放货载货台无货"; break; case 8: result = "取货左货格无货"; break; case 9: result = "取货右货格无货"; break; case 10: result = "放货左一有货"; break; case 11: result = "放货右一有货"; break; case 12: result = "取左二货格无货"; break; case 13: result = "取右二货格无货"; break; case 14: result = "放货左二货格有货"; break; case 15: result = "放货右二货格有货"; break; case 16: result = "左二取货左一有货"; break; case 17: result = "右二取货右一有货"; break; case 18: result = "左取货失败"; break; case 19: result = "右取货失败"; break; case 20: result = "左放货失败"; break; case 21: result = "右放货失败"; break; case 22: result = "货叉运行超时"; break; case 23: result = "货叉断路器跳闸"; break; case 24: result = "货叉变频器报警"; break; case 25: result = "货叉编码器故障"; break; case 26: result = "货叉伸叉故障"; break; case 27: result = "层运行货叉不在中位"; break; case 28: result = "列运行货叉不在中位"; break; case 29: result = "货叉中位开关故障"; break; case 30: result = "货叉变频器通讯故障"; break; case 31: result = "货叉编码器通讯故障"; break; case 32: result = "伸叉超出左极限"; break; case 33: result = "伸叉超出右极限"; break; case 34: result = "入左二货格货时左一货格有货"; break; case 35: result = "入右二货格货时右一货格有货"; break; case 36: result = "货叉右侧回中停止位置错误"; break; case 37: result = "货叉左侧回中停止位置错误"; break; case 38: result = "货叉左侧极限停止位置错误"; break; case 39: result = "货叉右侧极限停止位置错误"; break; case 40: result = "面板急停"; break; case 41: result = "远程急停"; break; case 42: result = "主接触器控制回路故障"; break; case 43: result = "超重保护"; break; case 44: result = "松绳保护"; break; case 45: result = "限速保护"; break; case 46: result = "层停止位置错误"; break; case 47: result = "列停止位置错误"; break; case 48: result = "列停止位置错误"; break; case 49: result = "接收列超限"; break; case 50: result = "接收层超限"; break; case 51: result = "接收层超限"; break; case 52: result = "行走后退极限"; break; case 53: result = "提升上极限"; break; case 54: result = "提升下极限"; break; case 55: result = "行走运行超时"; break; case 56: result = "提升运行超时"; break; case 57: result = "行走断路器跳闸"; break; case 58: result = "提升断路器跳闸"; break; case 59: result = "行走变频器故障"; break; case 60: result = "提升变频器故障"; break; case 61: result = "行走测距/条码故障"; break; case 62: result = "提升测距/条码故障"; break; case 63: result = "行走测距/条码被挡"; break; case 64: result = "提升测距/条码被挡"; break; case 65: result = "上升减速光电故障"; break; case 66: result = "下降减速光电故障"; break; case 67: result = "提升原点光电故障"; break; case 68: result = "行走前减速光电故障"; break; case 69: result = "行走后减速光电故障"; break; case 70: result = "行走原点光电故障"; break; case 71: result = "与输送机通讯故障"; break; case 72: result = "升降超出最小层"; break; case 73: result = "升降超出最大层"; break; case 74: result = "行走超出最小列"; break; case 75: result = "行走超出最大列"; break; case 76: result = "接收排错误"; break; case 77: result = "起始站货格被禁用"; break; case 78: result = "目的站货格被禁用"; break; case 79: result = "行走抱闸故障"; break; case 80: result = "提升抱闸故障"; break; case 81: result = "安全门打开故障"; break; default: result = ""; break; } return result; } ////判断数字是否合法 //public static bool ChkFloat(string str) //{ // try // { // float f = (float)Convert.ToDouble(str); // return true; // } // catch (Exception e) // { // return false; // } //} ////判断整数是否合法 //public static bool ChkInt(string str) //{ // try // { // int f = Convert.ToInt32(str); // return true; // } // catch (Exception e) // { // return false; // } //} ////得到地址 //public static string GetAddr(int li) //{ // string addr = ""; // try // { // switch (li) // { // case 0: // return addr = "1030"; // case 1: // return addr = "1032"; // case 2: // return addr = "1034"; // case 3: // return addr = "1036"; // case 4: // return addr = "1038"; // case 5: // return addr = "1040"; // case 6: // return addr = "1042"; // default: // return addr = ""; // } // } // catch (Exception e) // { // return addr = ""; // } //} /// /// 查询erp数据 /// /// /// public static DataView ExecErpSelect(string sql) { try { OracleConnection sqlerp = new OracleConnection(erpcon); sqlerp.Open(); OracleDataAdapter odasrs = new OracleDataAdapter(sql, sqlerp); DataSet dserp = new DataSet(); odasrs.Fill(dserp); DataView dverp = new DataView(dserp.Tables[0]); odasrs.Dispose(); sqlerp.Dispose(); sqlerp.Close(); return dverp; } catch (SqlException em) { return null; } } /// /// 执行ERP数据更新sql语句 /// /// /// public static bool ExecERPModify(string sql) { bool result = false; try { OracleConnection sqlconn = new OracleConnection(erpcon); sqlconn.Open(); OracleTransaction sqltrans = sqlconn.BeginTransaction(); OracleCommand sqlcmd = new OracleCommand(); //SqlCommand sqlcmd = new SqlCommand(sql, sqlconn); //sqlcmd.Transaction = sqltrans; string[] arraySql = sql.Split(';'); try { for (int i = 0; i < arraySql.Length; i++) { if (arraySql[i] != "") { sqlcmd.CommandText = arraySql[i]; sqlcmd.Connection = sqlconn; sqlcmd.Transaction = sqltrans; sqlcmd.ExecuteNonQuery(); } } sqltrans.Commit(); result = true; } catch (SqlException t) { sqltrans.Rollback(); result = false; } finally { sqlcmd.Dispose(); sqltrans.Dispose(); sqlconn.Dispose(); //sqlconn.Close(); } } catch (Exception r) { return false; } return result; } /////-------------------------------从asrs数据库中执行查询功能返回数据集---------------- public static DataView ExecAsrsSelect(string sql) { try { SqlConnection sqlasrs = new SqlConnection(sqlcon); sqlasrs.Open(); SqlDataAdapter odasrs = new SqlDataAdapter(sql, sqlasrs); DataSet dsasrs = new DataSet(); odasrs.Fill(dsasrs); DataView dvasrs = new DataView(dsasrs.Tables[0]); odasrs.Dispose(); sqlasrs.Dispose(); sqlasrs.Close(); return dvasrs; } catch (SqlException em) { return null; } } public static DataView ExecAsrsSelect(string sql, out string err) { err = null; try { SqlConnection sqlasrs = new SqlConnection(sqlcon); sqlasrs.Open(); SqlDataAdapter odasrs = new SqlDataAdapter(sql, sqlasrs); DataSet dsasrs = new DataSet(); odasrs.Fill(dsasrs); DataView dvasrs = new DataView(dsasrs.Tables[0]); odasrs.Dispose(); sqlasrs.Dispose(); sqlasrs.Close(); return dvasrs; } catch (SqlException em) { err = "查询sql语句失败:" + em.Message; //MessageBox.Show("查询sql语句失败:" + em.Message + "\r\n" + sql); return null; } } /////-------------------------------从asrs数据库中执行查询功能返回数据量---------------- public static int ExecAsrsSelect1(string sql) { int li_count1 = 0; SqlConnection sqlasrs0 = new SqlConnection(sqlcon); sqlasrs0.Open(); SqlCommand ocasrs = new SqlCommand(sql, sqlasrs0); li_count1 = Convert.ToInt32(ocasrs.ExecuteScalar()); sqlasrs0.Dispose(); ocasrs.Dispose(); sqlasrs0.Close(); return li_count1; } /////-------------------------------从asrs数据库中执行异动功能(提交)---------------- /// /// 执行sql更新语句(insert、delete、update) /// /// /// public static bool ExecAsrsModify(string sql) { bool result = false; try { SqlConnection sqlconn = new SqlConnection(sqlcon); sqlconn.Open(); SqlTransaction sqltrans = sqlconn.BeginTransaction(); SqlCommand sqlcmd = new SqlCommand(); //SqlCommand sqlcmd = new SqlCommand(sql, sqlconn); //sqlcmd.Transaction = sqltrans; string[] arraySql = sql.Split(';'); try { for (int i = 0; i < arraySql.Length; i++) { if (arraySql[i] != "") { sqlcmd.CommandText = arraySql[i]; sqlcmd.Connection = sqlconn; sqlcmd.Transaction = sqltrans; sqlcmd.ExecuteNonQuery(); } } sqltrans.Commit(); result = true; } catch (SqlException em) { WriteLogFile("WcsError", "Common/ExecAsrsModify--执行SQL语句发生异常:" + em.Message + "\r\n" + sql); sqltrans.Rollback(); result = false; } finally { sqlcmd.Dispose(); sqltrans.Dispose(); sqlconn.Dispose(); //sqlconn.Close(); } } catch (Exception r) { return false; } return result; } ///////-------------------------------从asrs数据库中执行异动功能(未提交)---------------- //public static bool ExecAsrsModify1(string sql) //{ // bool result = false; // SqlConnection sqlasrs1 = new SqlConnection(sqlcon); // sqlasrs1.Open(); // SqlTransaction otasrs = sqlasrs1.BeginTransaction(); // SqlCommand ocom = new SqlCommand(sql, sqlasrs1); // ocom.Transaction = otasrs; // try // { // ocom.ExecuteNonQuery(); // //otasrs.Commit(); // result = true; // } // catch (SqlException t) // { // otasrs.Rollback(); // result = false; // } // finally // { // ocom.Dispose(); // otasrs.Dispose(); // sqlasrs1.Dispose(); // sqlasrs1.Close(); // } // return result; //} ///////-------------------------------从asrs数据库中执行异动功能(两个表),同步执行---------------- //public static bool ExecAsrsModifyByMD(string sql, string sql1) //{ // bool result = false; // SqlConnection sqlasrs1 = new SqlConnection(sqlcon); // sqlasrs1.Open(); // SqlTransaction otasrs = sqlasrs1.BeginTransaction(); // SqlCommand ocom = new SqlCommand(sql, sqlasrs1); // SqlCommand ocom1 = new SqlCommand(sql1, sqlasrs1); // ocom.Transaction = otasrs; // ocom1.Transaction = otasrs; // try // { // ocom.ExecuteNonQuery(); // ocom1.ExecuteNonQuery(); // otasrs.Commit(); // result = true; // } // catch (SqlException t) // { // otasrs.Rollback(); // result = false; // } // finally // { // ocom.Dispose(); // otasrs.Dispose(); // sqlasrs1.Dispose(); // sqlasrs1.Close(); // } // return result; //} ///////-------------------------------从asrs数据库中执行异动功能(4个表),同步执行---------------- //public static bool ExecAsrsModifyByMD(string sql, string sql1, string sql2, string sql3) //{ // bool result = false; // SqlConnection sqlasrs1 = new SqlConnection(sqlcon); // sqlasrs1.Open(); // SqlTransaction otasrs = sqlasrs1.BeginTransaction(); // SqlCommand ocom = new SqlCommand(sql, sqlasrs1); // SqlCommand ocom1 = new SqlCommand(sql1, sqlasrs1); // SqlCommand ocom2 = new SqlCommand(sql2, sqlasrs1); // SqlCommand ocom3 = new SqlCommand(sql3, sqlasrs1); // ocom.Transaction = otasrs; // ocom1.Transaction = otasrs; // ocom2.Transaction = otasrs; // ocom3.Transaction = otasrs; // try // { // ocom.ExecuteNonQuery(); // ocom1.ExecuteNonQuery(); // ocom2.ExecuteNonQuery(); // ocom3.ExecuteNonQuery(); // otasrs.Commit(); // result = true; // } // catch (SqlException t) // { // otasrs.Rollback(); // result = false; // } // finally // { // ocom.Dispose(); // otasrs.Dispose(); // sqlasrs1.Dispose(); // sqlasrs1.Close(); // } // return result; //} /////-------------------------------从asrs数据库中执行异动功能(5个表),同步执行---------------- public static bool ExecAsrsModifyByMD(string sql, string sql1, string sql2, string sql3, string sql4) { bool result = false; SqlConnection sqlasrs1 = new SqlConnection(sqlcon); sqlasrs1.Open(); SqlTransaction otasrs = sqlasrs1.BeginTransaction(); SqlCommand ocom = new SqlCommand(sql, sqlasrs1); SqlCommand ocom1 = new SqlCommand(sql1, sqlasrs1); SqlCommand ocom2 = new SqlCommand(sql2, sqlasrs1); SqlCommand ocom3 = new SqlCommand(sql3, sqlasrs1); SqlCommand ocom4 = new SqlCommand(sql4, sqlasrs1); ocom.Transaction = otasrs; ocom1.Transaction = otasrs; ocom2.Transaction = otasrs; ocom3.Transaction = otasrs; ocom4.Transaction = otasrs; try { ocom.ExecuteNonQuery(); ocom1.ExecuteNonQuery(); ocom2.ExecuteNonQuery(); ocom3.ExecuteNonQuery(); ocom4.ExecuteNonQuery(); otasrs.Commit(); result = true; } catch (SqlException t) { otasrs.Rollback(); result = false; } finally { ocom.Dispose(); otasrs.Dispose(); sqlasrs1.Dispose(); sqlasrs1.Close(); } return result; } ///////-------------------------------从ASRS数据库中执行查询功能返回数据量---------------- //public static int ExecASRSSelect1(string sql) //{ // int li_count1 = 0; // SqlConnection sqlasrs = new SqlConnection(sqlcon); // sqlasrs.Open(); // SqlCommand ocerp = new SqlCommand(sql, sqlasrs); // li_count1 = Convert.ToInt32(ocerp.ExecuteScalar()); // ocerp.Dispose(); // sqlasrs.Dispose(); // sqlasrs.Close(); // return li_count1; //} /// /// 根据库位状态代号返回库位状态名称 /// /// /// public static string getlocsts(string locsts) { string locstsname = ""; switch (locsts) { case "O": locstsname = "O-空库位"; break; case "F": locstsname = "F-在库"; break; case "S": locstsname = "S-入库预约中"; break; case "R": locstsname = "R-出库预约中"; break; case "P": locstsname = "P-拣料/并板/盘点出库预约中"; break; case "L": locstsname = "L-拣料库位空载中"; break; case "M": locstsname = "M-拣料库位满载中"; break; case "Q": locstsname = "Q-拣料/并板/盘点再入库预约中"; break; case "X": locstsname = "X-禁用"; break; case "D": locstsname = "D-空栈板"; break; default: locstsname = "O-空库位"; break; } return locstsname; } /// /// 根据工作状态代号得到工作状态名称 /// /// /// public static string Getwrksts(string sts) { string wrkstsname = ""; switch (sts) { case "1": wrkstsname = "1.生成入库ID"; break; case "2": wrkstsname = "2.设备上移动"; break; case "3": wrkstsname = "3.堆垛机入库中"; break; case "4": wrkstsname = "4.堆垛机入库完成"; break; case "5": wrkstsname = "5.入库回报完成"; break; //case "6": // wrkstsname = "6.2号堆垛机站到站中"; // break; //case "7": // return "7.5站到6站移动中"; // break; //case "8": // return "8.7站到8站移动中"; // break; //case "9": // return "9.2号堆垛机站到站完成"; // break; case "11": wrkstsname = "11.生成出库ID"; break; case "12": wrkstsname = "12.堆垛机出库中"; break; case "13": wrkstsname = "13.空出库"; break; case "14": wrkstsname = "14.堆垛机出库完成"; break; case "15": wrkstsname = "15.出库回报完成"; break; case "16": wrkstsname = "16.LED指令完成"; break; } return wrkstsname; } /// /// 根据IO类型代号得到IO名称 /// /// /// public static string Getiotype(string sts) { string iotypename = ""; switch (sts) { case "1": iotypename = "1.入库"; break; case "6": iotypename = "6.退库"; break; case "10": iotypename = "10.空桶入库"; break; case "110": iotypename = "110.空桶出库"; break; case "101": iotypename = "101.全板出库"; break; case "103": iotypename = "103.拣料出库"; break; case "104": iotypename = "104.并板出库"; break; case "107": iotypename = "107.盘点出库"; break; case "53": iotypename = "53.拣料再入库"; break; case "57": iotypename = "57.盘点再入库"; break; case "54": iotypename = "54.并板再入库"; break; } return iotypename; } /// /// 根据拣料站得到再入库堆垛机站点 /// /// /// /// public static int GetRestoreStnByPick(int crn, int stn) { int stnno = 0; switch (crn) { case 1: stnno = 106; break; case 2: stnno = 120; break; case 3: stnno = 133; break; } return stnno; } /// /// 根据站号得到对应吊车站序号 /// /// /// public static int GetCrnStnSeq(int stn) { int crnstn = 0; switch (stn) { case 100: crnstn = 1; break; case 200: crnstn = 2; break; case 104: crnstn = 1; break; case 204: crnstn = 2; break; default: crnstn = 0; break; } return crnstn; } /// /// 根据堆垛机入库站号得到站点编号 /// /// 堆垛机号 /// 堆垛机站点编号 /// 输送机站点编号 public static int GetStnSeqNo(int crn, int seq) { int stnno = 0; switch (crn) { case 1: switch (seq) { case 1: stnno = 104; break; //case 2: // stnno = 104; // break; } break; case 2: switch (seq) { case 1: stnno = 204; break; } break; default: stnno = seq; break; } return stnno; } /// /// 判断字符串是否数字 /// /// /// public static bool ChkStrtoInt(string ls_string) { bool result = false; int i = 0, i_len = 0; i_len = ls_string.Length; for (i = 0; i < i_len; i++) { if (ls_string[i] >= '0' && ls_string[i] <= '9') // if (Convert.ToInt32(ls_string[i].ToString()) >= 0 && Convert.ToInt32(ls_string[i].ToString()) <= 9) { result = true; } else { result = false; break; } } return result; } /// /// 写日志文件 /// /// 写入内容 public static void WriteLogFile(string fileName, string Memo) { DateTime dt = DateTime.Now; string FileName = Application.StartupPath + "\\log\\" + fileName + string.Format("{0:yyyyMMdd}", dt) + ".log"; try { if (!Directory.Exists(Application.StartupPath + "\\log")) { Directory.CreateDirectory(Application.StartupPath + "\\log"); } StreamWriter fs1 = new StreamWriter(FileName, true);//创建写入文件 //StreamWriter sw = new StreamWriter(fs1); fs1.WriteLine("【" + DateTime.Now.ToString() + "】" + Memo);//开始写入值 //sw.Close(); fs1.Close(); } catch (Exception) { } } /// /// DateTime时间格式转换为Unix时间戳格式 /// /// /// public static int ConvertDateTimeInt(System.DateTime time) { System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); return (int)(time - startTime).TotalSeconds; } ///// ///// 判断工作档中入库资料数量 ///// ///// //public static int GetWrkInCount() //{ // int result = 1000; // try // { // string sql = "select * from asr_wrk_mast where wrk_sts>0 and wrk_sts<5"; // result = Common.ExecAsrsSelect1(sql); // } // catch (Exception) // { // } // return result; //} ///// ///// 判断工作档中出库资料数量 ///// ///// //public static int GetWrkOutCount() //{ // int result = 1000; // try // { // string sql = "select * from asr_wrk_mast where wrk_sts>11 and wrk_sts<15"; // result = Common.ExecAsrsSelect1(sql); // } // catch (Exception) // { // } // return result; //} ///// ///// 判断工作档中资料数量 ///// ///// //public static int GetWrkCount() //{ // int result = 1000; // try // { // string sql = "select * from asr_wrk_mast where wrk_sts<15"; // result = Common.ExecAsrsSelect1(sql); // } // catch (Exception) // { // } // return result; //} ///// ///// 判断库存档中库存资料是否存在 ///// ///// //public static int GetStkCount(string boxId) //{ // int result = 1000; // try // { // string sql = "select * from asr_loc_mast where boxId='" + boxId + "'"; // result = Common.ExecAsrsSelect1(sql); // } // catch (Exception) // { // } // return result; //} /// /// 检查数据库连接是否正常 /// /// public static bool CheckDbConnect() { bool result = false; SqlConnection conn = new SqlConnection(Common.sqlcon); try { if (conn.State == ConnectionState.Closed) conn.Open(); else if (conn.State == ConnectionState.Broken) { conn.Close(); conn.Open(); } result = true; } catch (Exception em) { //MessageBox.Show("数据库连接失败。" + em.Message, "错误"); } finally { conn.Close(); } return result; } /// /// 检测端口是否占用 /// /// /// public static bool PortInUse(int port) { bool inUse = false; IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties(); IPEndPoint[] ipEndPoints = ipProperties.GetActiveTcpListeners(); foreach (IPEndPoint endPoint in ipEndPoints) { if (endPoint.Port == port) { inUse = true; break; } } return inUse; } /// /// 根据输送机站点获取对应库位号 /// /// 堆垛机状态值 /// 库位号 public static string GetLocByStn(int i_stn) { string loc_no = "0000000"; switch (i_stn) { case 100: loc_no = "0200101"; break; case 104: loc_no = "0300101"; break; case 200: loc_no = "0400101"; break; case 204: loc_no = "0500101"; break; default: loc_no = "0000000"; break; } return loc_no; } /// /// 根据库位号获取对应输送机站点编号 /// /// 堆垛机状态值 /// 库位号 public static int GetStnByLoc(string loc_no) { int i_stn = 0; switch (loc_no) { case "0200101": i_stn = 100; break; case "0300101": i_stn = 104; break; case "0400101": i_stn = 200; break; case "0500101": i_stn = 204; break; default: i_stn = 0; break; } return i_stn; } #region 堆垛机异常列表 /// /// 根据堆垛机异常码得到异常名称 /// /// 堆垛机异常码 /// 堆垛机异常名称 public static string GetCrnErrorName(int AlarmCode) { string errorName = ""; switch (AlarmCode) { case 0: errorName = ""; break; case 1: errorName = "主电源断路器断开"; break; case 2: errorName = "相位变化或缺相"; break; case 3: errorName = "内部 24V 供电异常"; break; case 4: errorName = "外部 24V 供电异常"; break; case 5: errorName = "24V总断路器异常"; break; case 6: errorName = "总交流接触器异常"; break; case 7: errorName = "行走抱闸接触器异常"; break; case 8: errorName = "起升抱闸接触器异常"; break; case 9: errorName = "货叉抱闸接触器异常"; break; case 11: errorName = "行走变频器报警"; break; case 12: errorName = "起升变频器报警"; break; case 13: errorName = "货叉变频器报警"; break; case 14: errorName = "行走马达保护器异常"; break; case 15: errorName = "起升马达保护器异常"; break; case 16: errorName = "货叉马达保护器异常"; break; case 18: errorName = "货叉位置错误"; break; case 19: errorName = "货叉触发左极限"; break; case 20: errorName = "货叉触发右极限"; break; case 21: errorName = "载货台货物左后超限"; break; case 22: errorName = "载货台货物左前超限"; break; case 23: errorName = "载货台货物右后超限"; break; case 24: errorName = "载货台货物右前超限"; break; case 25: errorName = "载货台货物左坍塌"; break; case 26: errorName = "载货台货物左超高"; break; case 27: errorName = "行走电机位置值未变动"; break; case 28: errorName = "起升电机位置值未变动"; break; case 29: errorName = "载货台货物右超高"; break; case 30: errorName = "货叉电机位置值未变动"; break; case 32: errorName = "载货台货物右坍塌"; break; case 33: errorName = "行走激光丢失"; break; case 34: errorName = "行走停准失败"; break; case 35: errorName = "起升激光丢失"; break; case 36: errorName = "起升停准失败"; break; case 37: errorName = "货叉测距异常"; break; case 38: errorName = "货叉停准失败"; break; case 39: errorName = "变频器总线IO通讯断开"; break; case 42: errorName = "行走电机运行超时"; break; case 43: errorName = "起升电机运行超时"; break; case 44: errorName = "货叉电机运行超时"; break; case 45: errorName = "载货台安全回路断开"; break; case 47: errorName = "柜门急停"; break; case 49: errorName = "松绳保护开关触发"; break; case 51: errorName = "外部急停或安全门打开"; break; case 53: errorName = "相序保护器异常"; break; case 54: errorName = "安全继电器异常"; break; case 55: errorName = "水平极限开关被触发"; break; case 56: errorName = "起升下极限开关触发"; break; case 57: errorName = "起升超速保护开关触发"; break; case 58: errorName = "起升上极限开关触发"; break; case 61: errorName = "放货时货架有货"; break; case 62: errorName = "自动模式无任务载货台有货"; break; case 63: errorName = "放货后载货台有货"; break; case 64: errorName = "取货后载货台无货"; break; case 66: errorName = "目标位置未找到"; break; case 67: errorName = "输送机不允许取货/放货"; break; case 69: errorName = "任务地址错误"; break; case 71: errorName = "上一任务未完成警告"; break; case 75: errorName = "上位机下发急停"; break; case 76: errorName = "电控柜门打开"; break; case 85: errorName = "载货台远程IO断开"; break; case 87: errorName = "触摸屏急停"; break; case 101: errorName = "货叉在中位没有中位开关信号"; break; case 102: errorName = "货叉在非中位有中位信号"; break; default: errorName = "未知"; break; } return errorName; } #endregion } }