Commit 91e80306 刘韬

自动匹配算法

1 个父辈 a442e639
...@@ -57,8 +57,11 @@ namespace OnlineStore.Common ...@@ -57,8 +57,11 @@ namespace OnlineStore.Common
public static MyConfig<int> Temp_NG_BOX_MAXCOUNT = 50; public static MyConfig<int> Temp_NG_BOX_MAXCOUNT = 50;
public static MyConfig<int> Temp_Last_Reel_Width = 0; public static MyConfig<int> Temp_Last_Reel_Width = 0;
public static MyConfig<int> Temp_Last_Reel_Height = 0; public static MyConfig<int> Temp_Last_Reel_Height = 0;
public static MyConfig<int> Temp_Last_InMove_Reel_Width = 0;
public static MyConfig<int> Temp_Last_InMove_Reel_Height = 0;
public static MyConfig<string> Temp_OutMoveParam = "";
public static MyConfig<int> Runtime_StartMovePosition = 0;
/// <summary> /// <summary>
/// 摄像机名称 /// 摄像机名称
/// </summary> /// </summary>
......
...@@ -10,80 +10,129 @@ namespace OnlineStore.Common ...@@ -10,80 +10,129 @@ namespace OnlineStore.Common
{ {
public class Pn_Algo_Match public class Pn_Algo_Match
{ {
static Dictionary<string, string> algopnList; static Dictionary<string, AlgoData> algopnList_v2;
const string algopnFile = "Config\\algopn.txt"; const string algopnFile = "Config\\algopn.txt";
const string algopnFile_v2 = "Config\\algopn_V2.txt";
static Pn_Algo_Match() static Pn_Algo_Match()
{ {
algopnList = new Dictionary<string, string>(); algopnList_v2 = new Dictionary<string, AlgoData>();
LoadFile(); LoadFile();
} }
public static void LoadFile() public static void LoadFile()
{ {
if (!File.Exists(algopnFile)) if (File.Exists(algopnFile) && !File.Exists(algopnFile_v2))
{
UpgradeV1toV2();
}
if (!File.Exists(algopnFile_v2))
{ {
SaveFile(); SaveFile();
return; return;
} }
var ls = File.ReadAllText(algopnFile); var ls = File.ReadAllText(algopnFile_v2);
algopnList = JsonConvert.DeserializeObject<Dictionary<string, string>>(ls); algopnList_v2 = JsonConvert.DeserializeObject<Dictionary<string, AlgoData>>(ls);
if (algopnList == null) if (algopnList_v2 == null)
algopnList = new Dictionary<string, string>(); algopnList_v2 = new Dictionary<string, AlgoData>();
} }
static void SaveFile() static void SaveFile()
{ {
Directory.CreateDirectory(Path.GetDirectoryName(algopnFile)); Directory.CreateDirectory(Path.GetDirectoryName(algopnFile_v2));
File.WriteAllText(algopnFile + ".ready", JsonConvert.SerializeObject(algopnList)); File.WriteAllText(algopnFile_v2 + ".ready", JsonConvert.SerializeObject(algopnList_v2));
try try
{ {
File.Delete(algopnFile + ".bck"); File.Delete(algopnFile_v2 + ".bck");
File.Move(algopnFile, algopnFile + ".bck"); File.Move(algopnFile_v2, algopnFile_v2 + ".bck");
File.Move(algopnFile + ".ready", algopnFile); File.Move(algopnFile_v2 + ".ready", algopnFile_v2);
} }
catch { } catch { }
} }
public static void Set(string pn, string value, double? finetuning = null)
static void UpgradeV1toV2()
{
var ls = File.ReadAllText(algopnFile);
var algopnList = JsonConvert.DeserializeObject<Dictionary<string, string>>(ls);
if (algopnList == null)
{
SaveFile();
return;
}
foreach (var k in algopnList.Keys.ToArray())
{
AlgoData algoData = new AlgoData();
algoData.PN = k;
var d = algopnList[k].Split(',');
algoData.Algo = d[0];
if (d[0] == "IP_Template_PARTS" && d.Length > 1)
{
algoData.TemplateFile = d[1];
if (d.Length > 3)
algoData.fine = double.Parse(d[3]);
}
else if (d.Length > 2)
algoData.fine = double.Parse(d[2]);
if (!algopnList_v2.ContainsKey(k))
algopnList_v2.Add(k, algoData);
}
SaveFile();
}
public static void Set(string pn, string value, int? processlevel = null, double? finetuning = null)
{ {
if (string.IsNullOrEmpty(pn)) if (string.IsNullOrEmpty(pn))
return; return;
if (string.IsNullOrEmpty(value)) if (string.IsNullOrEmpty(value))
return; value = "auto";
AlgoData algodata;
LogUtil.info($"set pnalgo pn:{pn}, algo:{value}, finetuning:{finetuning}"); if (algopnList_v2.ContainsKey(pn))
algodata = algopnList_v2[pn];
else
{
algodata = new AlgoData();
algodata.PN = pn;
}
algodata.Algo = value;
if (processlevel.HasValue)
algodata.processlevel = processlevel.Value;
if (finetuning.HasValue)
algodata.fine = finetuning.Value;
if (finetuning != null) LogUtil.info($"set pnalgo pn:{pn}, algo:{value}, processlevel:{processlevel}, finetuning:{finetuning}");
value = value + "," + finetuning.ToString();
if (algopnList.ContainsKey(pn)) if (algopnList_v2.ContainsKey(pn))
algopnList[pn] = value; algopnList_v2[pn] = algodata;
else else
algopnList.Add(pn, value); algopnList_v2.Add(pn, algodata);
SaveFile(); SaveFile();
} }
public static string MatchPN(string pn, out bool hasMatch, out double? finetuning) public static bool MatchPN(string pn, out AlgoData AlgoData)
{ {
hasMatch = false; if (algopnList_v2.ContainsKey(pn))
finetuning = null;
if (algopnList.ContainsKey(pn))
{ {
hasMatch = true; AlgoData = algopnList_v2[pn];
var value = algopnList[pn]; return true;
if (value.IndexOf(",") > 0)
{
var vs = value.Split(',');
if (vs.Length == 3 && double.TryParse(vs[2], out double result))
{
value = vs[0] + "," + vs[1];
finetuning = result;
}
}
return value;
} }
else else
return "auto"; {
AlgoData = new AlgoData() { Algo = "auto" };
return false;
}
}
}
[Serializable]
public class AlgoData
{
public string PN { get; set; }
public string Algo { get; set; }
public string TemplateFile { get; set; }
public double fine { get; set; }
public double processlevel { get; set; }
public override string ToString()
{
return $"PN:{PN},{Algo},{TemplateFile},{processlevel},{fine}";
} }
} }
} }
...@@ -92,6 +92,9 @@ namespace DeviceLibrary ...@@ -92,6 +92,9 @@ namespace DeviceLibrary
LogUtil.info("ServoOff【" + AxisName + "】"); LogUtil.info("ServoOff【" + AxisName + "】");
AxisManager.ServoOff(Config.DeviceName, Config.GetAxisValue()); AxisManager.ServoOff(Config.DeviceName, Config.GetAxisValue());
} }
public bool HasHomeSignal() {
return AxisManager.GetHomeEndStatus(Config.DeviceName, (short)Config.GetAxisValue()) == 3;
}
public void HomeMove(MoveInfo MoveInfo,bool force=true) public void HomeMove(MoveInfo MoveInfo,bool force=true)
{ {
if (!force && AxisManager.GetHomeEndStatus(Config.DeviceName, (short)Config.GetAxisValue()) == 3) if (!force && AxisManager.GetHomeEndStatus(Config.DeviceName, (short)Config.GetAxisValue()) == 3)
...@@ -99,6 +102,13 @@ namespace DeviceLibrary ...@@ -99,6 +102,13 @@ namespace DeviceLibrary
LogUtil.info(AxisName + " 有原点信号,无需回原"); LogUtil.info(AxisName + " 有原点信号,无需回原");
return; return;
} }
if (ForceSafeCheck && !IsSafe(0, out string msg))
{
Msg.add(msg, MsgLevel.alarm);
RobotManage.UserPause(msg);
return;
}
Config.TargetPosition = 0; Config.TargetPosition = 0;
LogUtil.info(AxisName + "speed[" + Config.HomeHighSpeed + "]开始原点返回"); LogUtil.info(AxisName + "speed[" + Config.HomeHighSpeed + "]开始原点返回");
if (MoveInfo!=null) if (MoveInfo!=null)
...@@ -296,6 +306,10 @@ namespace DeviceLibrary ...@@ -296,6 +306,10 @@ namespace DeviceLibrary
public bool IsBusy { public bool IsBusy {
get => AxisManager.GetBusyStatus(Config.DeviceName, Config.GetAxisValue()) == 1; get => AxisManager.GetBusyStatus(Config.DeviceName, Config.GetAxisValue()) == 1;
} }
public bool IsHomeMoveEnd
{
get => AxisManager.IsHomeMoveEnd(Config.DeviceName, Config.GetAxisValue());
}
public bool IsServeoOn public bool IsServeoOn
{ {
get => AxisManager.IsServeoOn(Config.DeviceName, Config.GetAxisValue()); get => AxisManager.IsServeoOn(Config.DeviceName, Config.GetAxisValue());
......
...@@ -249,7 +249,7 @@ namespace DeviceLibrary ...@@ -249,7 +249,7 @@ namespace DeviceLibrary
r += "##" + c.CodeStr; r += "##" + c.CodeStr;
}); });
LogUtil.info("Camera 01"); LogUtil.info("Camera 01");
if (codeList.Count > 0 && cc.Find(c => c.CodeStr.StartsWith("S20")) != null) if (codeList.Count > 0 && cc.Find(c => Regex.IsMatch(c.CodeStr, @"^S[2-3]0")) != null)
{ {
hasRightCode = true; hasRightCode = true;
} }
......
...@@ -54,7 +54,7 @@ CREATE TABLE ""ReelInfo"" ( ...@@ -54,7 +54,7 @@ CREATE TABLE ""ReelInfo"" (
""LBLState"" TEXT, ""LBLState"" TEXT,
""OMSG"" TEXT, ""OMSG"" TEXT,
""2D_Barcode"" TEXT, ""2D_Barcode"" TEXT,
""DateTime"" date ""DateTime"" date,
PRIMARY KEY (""ID"") PRIMARY KEY (""ID"")
); );
"; ";
......
...@@ -151,20 +151,20 @@ namespace DeviceLibrary ...@@ -151,20 +151,20 @@ namespace DeviceLibrary
labelParam.codeInfos.ForEach((c) => { labelParam.codeInfos.ForEach((c) => {
if (c.CodeType == "2/5 Interleaved" || c.CodeType == "2/5 Industrial") if (c.CodeType == "2/5 Interleaved" || c.CodeType == "2/5 Industrial")
return; return;
if (c.CodeType != "Code 128" && c.CodeType != "Code 39" && c.CodeType != "Data Matrix ECC 200") if (c.CodeType != "Code 128" && c.CodeType != "Code 39" && c.CodeType != "Data Matrix ECC 200" && c.CodeType != "QR Code")
return; return;
Point op = new Point(c.X, c.Y); Point op = new Point(c.X, c.Y);
var a = (int)getAngle(org, op); var a = (int)getAngle(org, op);
a = a < 0 ? 360 + a : a; a = a < 0 ? 360 + a : a;
LogUtil.info($"{c.CodeType},{c.CodeStr},angles:{a}"); LogUtil.info($"{c.CodeType},{c.CodeStr},angles:{a}");
angles.Add(a); angles.Add(a);
if (c.CodeStr.Contains(labelParam.ReeID) && c.CodeType == "Data Matrix ECC 200") if (c.CodeStr.Contains(labelParam.ReeID) && (c.CodeType == "Data Matrix ECC 200" || c.CodeType == "QR Code"))
{ {
rightcode = c; rightcode = c;
} }
}); });
if (rightcode == null){ if (rightcode == null){
rightcode = labelParam.codeInfos[0]; rightcode = labelParam.codeInfos.Find(x=>x.CodeStr.Contains(labelParam.ReeID));
LogUtil.info($"没有发现准确的码, 随机贴标"); LogUtil.info($"没有发现准确的码, 随机贴标");
} }
...@@ -396,81 +396,6 @@ namespace DeviceLibrary ...@@ -396,81 +396,6 @@ namespace DeviceLibrary
pnreglist = File.ReadAllLines("config\\pn.list").ToList().FindAll((s) => { return !string.IsNullOrWhiteSpace(s); }).ToArray(); pnreglist = File.ReadAllLines("config\\pn.list").ToList().FindAll((s) => { return !string.IsNullOrWhiteSpace(s); }).ToArray();
qtyreglist = File.ReadAllLines("config\\qty.list").ToList().FindAll((s) => { return !string.IsNullOrWhiteSpace(s); }).ToArray(); qtyreglist = File.ReadAllLines("config\\qty.list").ToList().FindAll((s) => { return !string.IsNullOrWhiteSpace(s); }).ToArray();
} }
public static bool codeProcess(ReelParam labelParam,out string debugmsg) {
if (pnreglist == null)
LoadMatchList();
debugmsg = "";
List<CodeInfo> newcodeInfos = new List<CodeInfo>();
labelParam.PN = "";
foreach (var ci in labelParam.codeInfos.ToArray())
{
//string[] pnreglist = new string[] {
// @"^P([1-9]\d+)$",
// @"^(\d+)$%Code 128",
// @"^([1-9]\d{7,9})$"
//};
foreach (var qtyreg in pnreglist)
{
var partrules = qtyreg.Split('%');
if (partrules.Length == 2) {
if (ci.CodeType != partrules[1])
break;
}
var m = Regex.Match(ci.CodeStr, partrules[0]);
if (m.Success)
{
newcodeInfos.Add(ci);
//labelParam.codeInfos.Remove(ci);
labelParam.PN = m.Groups[1].Value;
debugmsg += $"匹配到PN:{labelParam.PN}\r\n命中规则:{qtyreg}\r\n";
break;
}
}
if (!string.IsNullOrEmpty(labelParam.PN))
break;
}
labelParam.QTY = 0;
foreach (var ci in labelParam.codeInfos.ToArray())
{
//string[] qtyreglist = new string[] {
// @"Q(\d{3,5})[^\d]",
// @"^Q(\d{3,5})$",
// @"^\w+\.\d([1-9]+0+)[1-9]+\d*$",
// @"^.+?;.+?;.+?;(\d{3,5}?);.+?;.+?$",
// @"^QUANTITY:(\d*)",
// @"^(\d{6})\s",
// @"\(\w*\s+(\d+)[a-zA-Z]",
//};
foreach (var qtyreg in qtyreglist)
{
var m = Regex.Match(ci.CodeStr, qtyreg);
if (m.Success)
{
newcodeInfos.Add(ci);
//labelParam.codeInfos.Remove(ci);
labelParam.QTY = int.Parse(m.Groups[1].Value);
debugmsg += $"匹配到QTY:{labelParam.QTY}\r\n命中规则:{qtyreg}\r\n";
break;
}
}
if (labelParam.QTY > 0)
break;
}
if (string.IsNullOrEmpty(labelParam.PN) || labelParam.QTY == 0)
return false;
////labelParam.codeInfos = newcodeInfos;
//labelParam.FC = "985022";
//labelParam.RI = "AL"+DateTime.Now.ToString("yyMMddHHmmssf");
//labelParam.Batch = DateTime.Now.ToString("MMdd");
//labelParam.WareCode = labelParam.RI;
LogUtil.info($"匹配成功:{labelParam.PN},{labelParam.QTY},{labelParam.ReeID}");
return true;
}
public T DeepClone<T>(T _object) public T DeepClone<T>(T _object)
{ {
T dstobject; T dstobject;
......
...@@ -108,7 +108,7 @@ namespace DeviceLibrary ...@@ -108,7 +108,7 @@ namespace DeviceLibrary
} }
public string ToDetailStr() public string ToDetailStr()
{ {
return $"{DateTime.Now:HH:mm:ss},{ReeID},{PN},{PlateW}inch,{CurrentStringNum},{NgMsg},{QTY},{WareCode}"; return $"{DateTime.Now:HH:mm:ss},{ReeID},{PN},{PlateW}x{PlateH},{CurrentStringNum},{NgMsg},{QTY},{WareCode}";
} }
public string ToSortStr() public string ToSortStr()
{ {
...@@ -141,6 +141,7 @@ namespace DeviceLibrary ...@@ -141,6 +141,7 @@ namespace DeviceLibrary
sw.Dispose(); sw.Dispose();
} }
databaseProc.Current.InsertOrUpdateRI(UID, PN, ReeID, IsNg, NgMsg, QTY, LabelState, Algo, WareCode, xrayfile, resultfile); databaseProc.Current.InsertOrUpdateRI(UID, PN, ReeID, IsNg, NgMsg, QTY, LabelState, Algo, WareCode, xrayfile, resultfile);
} }
/* /*
public void logresult(string xrayfile="",string resultfile="") public void logresult(string xrayfile="",string resultfile="")
......
...@@ -38,6 +38,100 @@ namespace DeviceLibrary ...@@ -38,6 +38,100 @@ namespace DeviceLibrary
RobotManage.UserPause("Reset_BTN", false); RobotManage.UserPause("Reset_BTN", false);
} }
} }
void HomeReset_BTN()
{
if (IOValue(IO_Type.SuddenStop_BTN).Equals(IO_VALUE.HIGH))
{
Msg.add(crc.GetString("Res0009", "按下复位按钮."), MsgLevel.info, ErrInfo.ResetBtn);
}
else
{
Msg.add(crc.GetString("Res0010", "急停未解除,按下复位按钮尝试复位安全继电器."), MsgLevel.info, ErrInfo.SuddenStop);
}
LogUtil.info("长按下复位按钮,系统不在运行,开始启动");
if (RobotManage.isRunning)
{
LogUtil.info("长按下复位按钮,系统正在运行,开始停止");
ButtenEvent?.Invoke(null, ErrInfo.SuddenStop);
while (RobotManage.isRunning) {
Thread.Sleep(100);
}
}
if (RobotManage.mainMachine.Loading_Batch_Axis.HasHomeSignal()
&& (RobotManage.mainMachine.Loading_Batch_Axis.IsInPosition(RobotManage.mainMachine.Config.Loading_Batch_Axis_P1)
|| RobotManage.mainMachine.Loading_Batch_Axis.IsInPosition(0))
)
{
LogUtil.info("入口批量轴在待机点或原点可以开始回原");
}
else if (RobotManage.mainMachine.LoadingCarOnPosition == MainMachine.CarPosition.OnPosition && RobotManage.mainMachine.IOValue(IO_Type.Loading_Car_Location_Up).Equals(IO_VALUE.HIGH) && RobotManage.mainMachine.Loading_Batch_Axis.HasHomeSignal())
{
LogUtil.info("入料车没有离开");
}
else
{
Msg.add("入料车没有取出,无法回原", MsgLevel.warning);
return;
}
if (RobotManage.mainMachine.Unloading_Batch_Axis.HasHomeSignal()
&& (RobotManage.mainMachine.Unloading_Batch_Axis.IsInPosition(RobotManage.mainMachine.Config.Unloading_Batch_Axis_P1)
|| RobotManage.mainMachine.Unloading_Batch_Axis.IsInPosition(0))
)
{
LogUtil.info("出口批量轴在待机点或原点可以开始回原");
}
else if (RobotManage.mainMachine.UnloadingCarOnPosition == MainMachine.CarPosition.OnPosition && RobotManage.mainMachine.IOValue(IO_Type.Unloading_Car_Location_Up).Equals(IO_VALUE.HIGH) && RobotManage.mainMachine.Unloading_Batch_Axis.HasHomeSignal())
{
LogUtil.info("出料车没有离开");
}
else
{
Msg.add("出料车没有取出,无法回原", MsgLevel.warning);
return;
}
Thread.Sleep(1000);
LogUtil.info("长按下复位按钮,开始清除报警");
AxisBean.List.ForEach((x) => { AxisManager.AlarmClear(x.Config.DeviceName, x.Config.GetAxisValue()); });
Thread.Sleep(100);
LogUtil.info("长按下复位按钮,打开伺服");
AxisBean.List.ForEach((x) => { x.Open(true,out _); });
Thread.Sleep(100);
LogUtil.info("长按下复位按钮,开始回原");
Loading_UpDown_Axis.HomeMove(null, true);
Unloading_UpDown_Axis.HomeMove(null, true);
while (!Loading_UpDown_Axis.IsHomeMoveEnd || !Unloading_UpDown_Axis.IsHomeMoveEnd) {
Thread.Sleep(500);
}
Loading_InOut_Axis.HomeMove(null, true);
Unloading_InOut_Axis.HomeMove(null, true);
while (!Loading_InOut_Axis.IsHomeMoveEnd || !Unloading_InOut_Axis.IsHomeMoveEnd)
{
Thread.Sleep(500);
}
Label_Z_Axis.HomeMove(ResetMoveInfo, forceHome);
while (!Label_Z_Axis.IsHomeMoveEnd)
{
Thread.Sleep(500);
}
Label_R_Axis.HomeMove(ResetMoveInfo, forceHome);
while (!Label_R_Axis.IsHomeMoveEnd)
{
Thread.Sleep(500);
}
Label_X_Axis.HomeMove(ResetMoveInfo, forceHome);
Label_Y_Axis.HomeMove(ResetMoveInfo, forceHome);
while (!Label_X_Axis.IsHomeMoveEnd || !Label_Y_Axis.IsHomeMoveEnd)
{
Thread.Sleep(500);
}
Thread.Sleep(500);
AxisBean.List.ForEach((x) => { x.HomeMove(null,true); });
}
void Run_BTN() { void Run_BTN() {
if (IOValue(IO_Type.SuddenStop_BTN).Equals(IO_VALUE.HIGH)) if (IOValue(IO_Type.SuddenStop_BTN).Equals(IO_VALUE.HIGH))
{ {
......
...@@ -22,6 +22,7 @@ namespace DeviceLibrary ...@@ -22,6 +22,7 @@ namespace DeviceLibrary
public string xrayImagePath; public string xrayImagePath;
Task GetResultTask = null; Task GetResultTask = null;
Dictionary<string, int> CountList = new Dictionary<string, int>(); Dictionary<string, int> CountList = new Dictionary<string, int>();
int xrayimageretry = 0;
void CountingMoveProcess() void CountingMoveProcess()
{ {
if (CheckWait(CountMoveInfo)) if (CheckWait(CountMoveInfo))
...@@ -132,13 +133,14 @@ namespace DeviceLibrary ...@@ -132,13 +133,14 @@ namespace DeviceLibrary
CountMoveInfo.MoveParam.IsNg = false; CountMoveInfo.MoveParam.IsNg = false;
CountMoveInfo.MoveParam.codeInfos = x; CountMoveInfo.MoveParam.codeInfos = x;
CountMoveInfo.MoveParam.bitmapfilename = s; CountMoveInfo.MoveParam.bitmapfilename = s;
xrayimageretry = 0;
var cc = x.Select((a) => a.CodeType+":"+a.CodeStr); var cc = x.Select((a) => a.CodeType+":"+a.CodeStr);
LastCode = String.Join("##", cc); LastCode = String.Join("##", cc);
CountMoveInfo.log("已完成扫码 Code:" + LastCode); CountMoveInfo.log("已完成扫码 Code:" + LastCode);
//Common.codeProcess(CountMoveInfo.MoveParam, out string mmm); //Common.codeProcess(CountMoveInfo.MoveParam, out string mmm);
CountMoveInfo.MoveParam.WareCode = CountMoveInfo.MoveParam.codeInfos.Where(c=>c.CodeStr.StartsWith("S20") && c.CodeType== "Data Matrix ECC 200").FirstOrDefault()?.CodeStr; CountMoveInfo.MoveParam.WareCode = CountMoveInfo.MoveParam.codeInfos.Where(c=> Regex.IsMatch(c.CodeStr, @"^S[2-3]0") && ( c.CodeType== "Data Matrix ECC 200"|| c.CodeType == "QR Code")).FirstOrDefault()?.CodeStr;
if (string.IsNullOrWhiteSpace(CountMoveInfo.MoveParam.WareCode)) if (string.IsNullOrWhiteSpace(CountMoveInfo.MoveParam.WareCode))
CountMoveInfo.MoveParam.WareCode = CountMoveInfo.MoveParam.codeInfos.Where(c=>c.CodeStr.StartsWith("S20")).FirstOrDefault().CodeStr; CountMoveInfo.MoveParam.WareCode = CountMoveInfo.MoveParam.codeInfos.Where(c=> Regex.IsMatch(c.CodeStr, @"^S[2-3]0")).FirstOrDefault().CodeStr;
CountMoveInfo.MoveParam.ReeID = CountMoveInfo.MoveParam.WareCode; CountMoveInfo.MoveParam.ReeID = CountMoveInfo.MoveParam.WareCode;
CountMoveInfo.MoveParam.PN = CountMoveInfo.MoveParam.codeInfos.Where(c=>c.CodeStr.StartsWith("AT")).FirstOrDefault()?.CodeStr; CountMoveInfo.MoveParam.PN = CountMoveInfo.MoveParam.codeInfos.Where(c=>c.CodeStr.StartsWith("AT")).FirstOrDefault()?.CodeStr;
if (string.IsNullOrWhiteSpace(CountMoveInfo.MoveParam.PN)) { if (string.IsNullOrWhiteSpace(CountMoveInfo.MoveParam.PN)) {
...@@ -231,8 +233,14 @@ namespace DeviceLibrary ...@@ -231,8 +233,14 @@ namespace DeviceLibrary
CountMoveInfo.log("准备送出"); CountMoveInfo.log("准备送出");
} }
else if (CountMoveInfo.IsTimeOut(10)) { else if (CountMoveInfo.IsTimeOut(10)) {
Msg.add("获取料盘X光图像超时", MsgLevel.alarm); CountMoveInfo.NextMoveStep(MoveStep.Count_05);
RobotManage.UserPause("获取料盘X光图像超时"); xrayimageretry++;
CountMoveInfo.log("获取料盘X光图像超时:"+ xrayimageretry);
if (xrayimageretry > 3)
{
Msg.add("获取料盘X光图像超时", MsgLevel.alarm);
RobotManage.UserPause("获取料盘X光图像超时");
}
} }
break; break;
case MoveStep.Count_ReadyOut: case MoveStep.Count_ReadyOut:
...@@ -408,46 +416,66 @@ namespace DeviceLibrary ...@@ -408,46 +416,66 @@ namespace DeviceLibrary
var pps = CountMoveInfo.MoveParam.PN; var pps = CountMoveInfo.MoveParam.PN;
if (string.IsNullOrEmpty(pps)) if (string.IsNullOrEmpty(pps))
pps = ""; pps = "";
var type = Pn_Algo_Match.MatchPN(pps, out _, out double? finetuning); Pn_Algo_Match.MatchPN(pps, out AlgoData algoData);
CountMoveInfo.log($"匹配到算法.{pps}={type}, finetuning={finetuning}"); CountMoveInfo.log($"匹配到算法.{pps}={algoData}");
CountMoveInfo.MoveParam.Algo = type; if (algoData.Algo == "auto" && string.IsNullOrEmpty(pps))
if (finetuning != null)
{ {
XrayImage.setFineTuning = finetuning.Value; try
{
var pid = ONNXAlgoMatch.MatchPID(xrayImagePath, ShrinkOffset, out float matchDeg);
CountMoveInfo.log($"自动匹配算法.{pid}={matchDeg}");
if (matchDeg >= 0.6f)
{
if (pid != "PID001")
if (Pn_Algo_Match.MatchPN(pid, out AlgoData t))
{
algoData = t;
CountMoveInfo.log($"自动匹配算法成功.{algoData}");
}
else
CountMoveInfo.log($"没有匹配过自动算法");
}
}
catch(Exception ex) {
CountMoveInfo.log($"MatchPID error:{ex}");
}
} }
else
{ CountMoveInfo.MoveParam.Algo = algoData.Algo;
if (algoData.fine>0)
XrayImage.setFineTuning = algoData.fine;
else
XrayImage.setFineTuning = ConfigHelper.Config.Get("setFineTuningDefault", 0.7); XrayImage.setFineTuning = ConfigHelper.Config.Get("setFineTuningDefault", 0.7);
}
if (type.StartsWith("IP_Template_PARTS")) if (algoData.processlevel > 0)
XrayImage.setProcessLevel(algoData.processlevel);
else
XrayImage.setProcessLevel(2);
if (algoData.Algo.StartsWith("IP_Template_PARTS"))
{ {
if (!File.Exists(type.Substring(17 + 1))) if (!File.Exists(algoData.TemplateFile))
{ {
CountMoveInfo.log($"模版文件丢失.{type.Substring(17 + 1)}"); CountMoveInfo.log($"模版文件丢失.{algoData.TemplateFile}");
type = "auto";
} }
} }
Bitmap dst = null; Bitmap dst = null;
if (type == "auto") if (algoData.Algo == "auto")
{ {
result = XrayImage.GetLocalCount(xrayImagePath, ShrinkOffset, out countStr, out dst); result = XrayImage.GetLocalCount(xrayImagePath, ShrinkOffset, out countStr, out dst);
CountMoveInfo.log("GetCountResult " + type + ", ShrinkOffset=" + ShrinkOffset + ", 调用 GetLocalCount 【" + xrayImagePath + "】,返回【" + result + "】,结果【" + (countStr != null ? string.Join(",", countStr) : "null") + "】"); CountMoveInfo.log("GetCountResult " + algoData.Algo + ", ShrinkOffset=" + ShrinkOffset + ", 调用 GetLocalCount 【" + xrayImagePath + "】,返回【" + result + "】,结果【" + (countStr != null ? string.Join(",", countStr) : "null") + "】");
} }
else if (type.StartsWith("IP_Template_PARTS")) else if (algoData.Algo.StartsWith("IP_Template_PARTS"))
{ {
string template = ""; string template = algoData.TemplateFile;
if (type.Length > 18)
{
template = type.Substring(17 + 1);
}
result = XrayImage.GetLocalCountTemplate(xrayImagePath, ShrinkOffset, template, out countStr, out dst); result = XrayImage.GetLocalCountTemplate(xrayImagePath, ShrinkOffset, template, out countStr, out dst);
CountMoveInfo.log("GetCountResult " + template + ", ShrinkOffset="+ ShrinkOffset + ", 调用 GetLocalCountTemplate 【" + xrayImagePath + "】,返回【" + result + "】,结果【" + (countStr != null ? string.Join(",", countStr) : "null") + "】"); CountMoveInfo.log("GetCountResult " + template + ", ShrinkOffset="+ ShrinkOffset + ", 调用 GetLocalCountTemplate 【" + xrayImagePath + "】,返回【" + result + "】,结果【" + (countStr != null ? string.Join(",", countStr) : "null") + "】");
} }
else else
{ {
result = XrayImage.GetLocalCountIrregular(xrayImagePath, ShrinkOffset, type.ToString(), out countStr, out dst); result = XrayImage.GetLocalCountIrregular(xrayImagePath, ShrinkOffset, algoData.Algo.ToString(), out countStr, out dst);
CountMoveInfo.log("GetCountResult " + type + ", ShrinkOffset=" + ShrinkOffset + " 调用 GetLocalCountIrregular 【" + xrayImagePath + "】,返回【" + result + "】,结果【" + (countStr != null ? string.Join(",", countStr) : "null") + "】"); CountMoveInfo.log("GetCountResult " + algoData.Algo + ", ShrinkOffset=" + ShrinkOffset + " 调用 GetLocalCountIrregular 【" + xrayImagePath + "】,返回【" + result + "】,结果【" + (countStr != null ? string.Join(",", countStr) : "null") + "】");
} }
if (dst != null) if (dst != null)
{ {
...@@ -485,6 +513,7 @@ namespace DeviceLibrary ...@@ -485,6 +513,7 @@ namespace DeviceLibrary
File.Delete(resfile); File.Delete(resfile);
Directory.Move(Path.Combine(root, resfilename), resfile); Directory.Move(Path.Combine(root, resfilename), resfile);
CountMoveInfo.MoveParam.logresult(xrayImagePath, resfile); CountMoveInfo.MoveParam.logresult(xrayImagePath, resfile);
CountMoveInfo.log($"写入点料记录:UID:{CountMoveInfo.MoveParam.UID},{CountMoveInfo.MoveParam.ToStr()}");
} }
else else
{ {
......
...@@ -103,6 +103,8 @@ namespace DeviceLibrary ...@@ -103,6 +103,8 @@ namespace DeviceLibrary
InCurrentStringNum = GetTopStringNum(INGetReelCheckIOList()); InCurrentStringNum = GetTopStringNum(INGetReelCheckIOList());
if (Loading_Batch_Axis.IsInPosition(Config.Loading_Batch_Axis_P2) && InCurrentStringNum==0) if (Loading_Batch_Axis.IsInPosition(Config.Loading_Batch_Axis_P2) && InCurrentStringNum==0)
{ {
StartMovePosition = Setting_Init.Runtime_StartMovePosition;
SetReelHeight(GetHeight(InCarMoveInfo));
InCarMoveInfo.log($"料车料盘检测为空"); InCarMoveInfo.log($"料车料盘检测为空");
InCarMoveInfo.NextMoveStep(MoveStep.InCarOut_01); InCarMoveInfo.NextMoveStep(MoveStep.InCarOut_01);
return; return;
...@@ -135,7 +137,8 @@ namespace DeviceLibrary ...@@ -135,7 +137,8 @@ namespace DeviceLibrary
} }
//if (!innewreel) //if (!innewreel)
// SetReelHeight(GetHeight(InCarMoveInfo)); StartMovePosition = Setting_Init.Runtime_StartMovePosition;
SetReelHeight(GetHeight(InCarMoveInfo));
//innewreel = false; //innewreel = false;
break; break;
case MoveStep.InCarReadyGet: case MoveStep.InCarReadyGet:
...@@ -146,7 +149,7 @@ namespace DeviceLibrary ...@@ -146,7 +149,7 @@ namespace DeviceLibrary
InCarMoveInfo.NextMoveStep(MoveStep.InCarReelGet_01); InCarMoveInfo.NextMoveStep(MoveStep.InCarReelGet_01);
break; break;
case MoveStep.InCarReelGet_01: case MoveStep.InCarReelGet_01:
InCarMoveInfo.NextMoveStep(MoveStep.InCarReelGet_02); InCarMoveInfo.NextMoveStep(MoveStep.InCarReelGet_02);
BatchAxisToP2(InCarMoveInfo, Loading_Batch_Axis, INGetReelCheckIOList(InCurrentStringNum), IO_VALUE.HIGH, Config.Loading_Batch_Axis_P2, Config.Loading_Batch_Axis_P2_speed); BatchAxisToP2(InCarMoveInfo, Loading_Batch_Axis, INGetReelCheckIOList(InCurrentStringNum), IO_VALUE.HIGH, Config.Loading_Batch_Axis_P2, Config.Loading_Batch_Axis_P2_speed);
InCarMoveInfo.log($"批量轴[{InCurrentStringNum}串]上升检测信号:{INGetReelCheckIOList(InCurrentStringNum)[0]}"); InCarMoveInfo.log($"批量轴[{InCurrentStringNum}串]上升检测信号:{INGetReelCheckIOList(InCurrentStringNum)[0]}");
break; break;
......
...@@ -21,8 +21,14 @@ namespace DeviceLibrary ...@@ -21,8 +21,14 @@ namespace DeviceLibrary
// InMoveInfo.log($"不再等待测高的步骤们无法设置盘高:{height}"); // InMoveInfo.log($"不再等待测高的步骤们无法设置盘高:{height}");
// return; } // return; }
//InMoveInfo.NextMoveStep(MoveStep.In_GetHeight); //InMoveInfo.NextMoveStep(MoveStep.In_GetHeight);
InMoveInfo.MoveParam.PlateH = height; if (InMoveInfo.MoveParam.PlateH == 0)
InMoveInfo.log($"设置盘高:{height}"); {
InMoveInfo.MoveParam.PlateH = height;
InMoveInfo.log($"设置盘高:{height}");
}
else {
InMoveInfo.log($"设置盘高失败:{height}");
}
} }
InCarReelPostion InFromPos; InCarReelPostion InFromPos;
...@@ -36,12 +42,18 @@ namespace DeviceLibrary ...@@ -36,12 +42,18 @@ namespace DeviceLibrary
{ {
case MoveStep.Wait: case MoveStep.Wait:
if (InCarMoveInfo.MoveStep== MoveStep.InCarReadyGet) { if (InCarMoveInfo.MoveStep== MoveStep.InCarReadyGet) {
Setting_Init.Runtime_StartMovePosition = Loading_Batch_Axis.GetAclPosition();
InMoveInfo.NewMove(MoveStep.In_01); InMoveInfo.NewMove(MoveStep.In_01);
InMoveInfo.MoveParam = InCarMoveInfo.MoveParam.clone(); InMoveInfo.MoveParam = InCarMoveInfo.MoveParam.clone();
InMoveInfo.MoveParam.UID= databaseProc.Current.GetID();
InMoveInfo.log("当前UID:" + InMoveInfo.MoveParam.UID);
var frompos = "Loading_T" + InCurrentStringNum; var frompos = "Loading_T" + InCurrentStringNum;
InFromPos = RobotManage.InCarReelPostion[frompos]; InFromPos = RobotManage.InCarReelPostion[frompos];
InToPos= RobotManage.InCarReelPostion["Loading_Counting_T" + InCurrentStringNum]; InToPos= RobotManage.InCarReelPostion["Loading_Counting_T" + InCurrentStringNum];
InMoveInfo.log($"料盘已经准备好:{frompos}"); InMoveInfo.log($"料盘已经准备好:{frompos}");
InMoveInfo.MoveParam.PlateH = 0;
Setting_Init.Temp_Last_InMove_Reel_Height = 0;
Setting_Init.Temp_Last_InMove_Reel_Width = 0;
} }
break; break;
case MoveStep.In_01: case MoveStep.In_01:
...@@ -71,21 +83,21 @@ namespace DeviceLibrary ...@@ -71,21 +83,21 @@ namespace DeviceLibrary
Loading_UpDown_Axis.AbsMove(InMoveInfo, InFromPos.UpDown_P2, Config.Loading_UpDown_Axis_P1_speed); Loading_UpDown_Axis.AbsMove(InMoveInfo, InFromPos.UpDown_P2, Config.Loading_UpDown_Axis_P1_speed);
InMoveInfo.log($"升降轴到达p2点"); InMoveInfo.log($"升降轴到达p2点");
break; break;
case MoveStep.In_06: case MoveStep.In_06:
if (IOValue(IO_Type.Loading_VacuumDegree_Check).Equals(IO_VALUE.HIGH)) if (IOValue(IO_Type.Loading_VacuumDegree_Check).Equals(IO_VALUE.HIGH))
{ {
InMoveInfo.NextMoveStep(MoveStep.In_07); InMoveInfo.NextMoveStep(MoveStep.In_07);
InMoveInfo.MoveParam.PlateH = 0;
Loading_InOut_Axis.AbsMove(InMoveInfo, Config.Unloading_InOut_Axis_P1, Config.Loading_InOut_Axis_P1_speed); Loading_InOut_Axis.AbsMove(InMoveInfo, Config.Unloading_InOut_Axis_P1, Config.Loading_InOut_Axis_P1_speed);
InMoveInfo.log($"进出轴到达p1点"); InMoveInfo.log($"进出轴到达p1点");
ReelGetted(true); ReelGetted(true);
InMoveInfo.log($"成功取到料盘"); InMoveInfo.log($"成功取到料盘");
} }
else else if (InMoveInfo.IsTimeOut(6))
{ {
InMoveInfo.NextMoveStep(MoveStep.Wait); InMoveInfo.NextMoveStep(MoveStep.Wait);
ReelGetted(false); //ReelGetted(false);
InMoveInfo.log($"未取到料盘"); InMoveInfo.log($"未取到料盘");
} }
break; break;
...@@ -102,6 +114,9 @@ namespace DeviceLibrary ...@@ -102,6 +114,9 @@ namespace DeviceLibrary
InMoveInfo.MoveParam.PlateW = 7; InMoveInfo.MoveParam.PlateW = 7;
else else
InMoveInfo.MoveParam.PlateW = 13; InMoveInfo.MoveParam.PlateW = 13;
Setting_Init.Temp_Last_InMove_Reel_Height = InMoveInfo.MoveParam.PlateH;
Setting_Init.Temp_Last_InMove_Reel_Width = InMoveInfo.MoveParam.PlateW;
InMoveInfo.log($"获取到尺寸{InMoveInfo.MoveParam.PlateW}x{InMoveInfo.MoveParam.PlateH}"); InMoveInfo.log($"获取到尺寸{InMoveInfo.MoveParam.PlateW}x{InMoveInfo.MoveParam.PlateH}");
} }
else { else {
...@@ -147,6 +162,9 @@ namespace DeviceLibrary ...@@ -147,6 +162,9 @@ namespace DeviceLibrary
var pos = InToPos.UpDown_P3 - (InMoveInfo.MoveParam.PlateH-8)*Config.Loading_UpDown_Axis_MMtoPOS; var pos = InToPos.UpDown_P3 - (InMoveInfo.MoveParam.PlateH-8)*Config.Loading_UpDown_Axis_MMtoPOS;
Loading_UpDown_Axis.AbsMove(InMoveInfo, pos, Config.Loading_UpDown_Axis_P1_speed); Loading_UpDown_Axis.AbsMove(InMoveInfo, pos, Config.Loading_UpDown_Axis_P1_speed);
InMoveInfo.log($"升降轴到达放料p3点,pos:{pos},PlateH:{InMoveInfo.MoveParam.PlateH}"); InMoveInfo.log($"升降轴到达放料p3点,pos:{pos},PlateH:{InMoveInfo.MoveParam.PlateH}");
Setting_Init.Temp_Last_Reel_Height = InMoveInfo.MoveParam.PlateH;
Setting_Init.Temp_Last_Reel_Width = InMoveInfo.MoveParam.PlateW;
} }
else { else {
Msg.add("点料区有料盘无法继续",MsgLevel.alarm); Msg.add("点料区有料盘无法继续",MsgLevel.alarm);
...@@ -171,13 +189,16 @@ namespace DeviceLibrary ...@@ -171,13 +189,16 @@ namespace DeviceLibrary
break; break;
case MoveStep.In_19: case MoveStep.In_19:
InMoveInfo.NextMoveStep(MoveStep.In_20); InMoveInfo.NextMoveStep(MoveStep.In_20);
CylinderMove(null, IO_Type.Counting_EnterDoor_Close, IO_Type.Counting_EnterDoor_Open, IO_VALUE.LOW);
InMoveInfo.log($"关闭点料机入口大门");
Loading_Middle_Axis.AbsMove(InMoveInfo, Config.Loading_Middle_Axis_P1, Config.Loading_Middle_Axis_P1_speed); Loading_Middle_Axis.AbsMove(InMoveInfo, Config.Loading_Middle_Axis_P1, Config.Loading_Middle_Axis_P1_speed);
Loading_UpDown_Axis.AbsMove(InMoveInfo, Config.Loading_UpDown_Axis_P1, Config.Loading_UpDown_Axis_P1_speed); Loading_UpDown_Axis.AbsMove(InMoveInfo, Config.Loading_UpDown_Axis_P1, Config.Loading_UpDown_Axis_P1_speed);
InMoveInfo.log($"旋转轴,升降轴到达p1点"); InMoveInfo.log($"旋转轴,升降轴到达p1点");
break; break;
case MoveStep.In_20: case MoveStep.In_20:
InMoveInfo.NextMoveStep(MoveStep.In_21);
CylinderMove(null, IO_Type.Counting_EnterDoor_Close, IO_Type.Counting_EnterDoor_Open, IO_VALUE.LOW);
InMoveInfo.log($"关闭点料机入口大门");
break;
case MoveStep.In_21:
CountMoveInfo.MoveParam = InMoveInfo.MoveParam.clone(); CountMoveInfo.MoveParam = InMoveInfo.MoveParam.clone();
CountMoveInfo.NextMoveStep(MoveStep.Count_01); CountMoveInfo.NextMoveStep(MoveStep.Count_01);
InMoveInfo.log("点料机开始点料"); InMoveInfo.log("点料机开始点料");
......
...@@ -132,6 +132,10 @@ namespace DeviceLibrary ...@@ -132,6 +132,10 @@ namespace DeviceLibrary
Label_p3.Y = (int)(Label_p3.Y * Config.PixelToPos_Y_Ratio) + Axis_Center_Point.Y; Label_p3.Y = (int)(Label_p3.Y * Config.PixelToPos_Y_Ratio) + Axis_Center_Point.Y;
LabelMoveInfo.log($"计算贴标像素点位为{p},轴点位为{Label_p3},角度{labelAngle},R轴{labelAxisPos},盘宽{LabelMoveInfo.MoveParam.PlateW}"); LabelMoveInfo.log($"计算贴标像素点位为{p},轴点位为{Label_p3},角度{labelAngle},R轴{labelAxisPos},盘宽{LabelMoveInfo.MoveParam.PlateW}");
Label_p3.X =Label_p3.X < 0 ? 0: Label_p3.X;
Label_p3.Y = Label_p3.Y < 0 ? 0: Label_p3.Y;
LabelMoveInfo.NextMoveStep(MoveStep.Lbl_11); LabelMoveInfo.NextMoveStep(MoveStep.Lbl_11);
Label_X_Axis.AbsMove(LabelMoveInfo, Label_p3.X, Config.Label_X_P1_speed); Label_X_Axis.AbsMove(LabelMoveInfo, Label_p3.X, Config.Label_X_P1_speed);
Label_Y_Axis.AbsMove(LabelMoveInfo, Label_p3.Y, Config.Label_Y_P1_speed); Label_Y_Axis.AbsMove(LabelMoveInfo, Label_p3.Y, Config.Label_Y_P1_speed);
......
using CodeLibrary; using CodeLibrary;
using Newtonsoft.Json;
using OnlineStore; using OnlineStore;
using OnlineStore.Common; using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary; using OnlineStore.LoadCSVLibrary;
...@@ -25,13 +26,28 @@ namespace DeviceLibrary ...@@ -25,13 +26,28 @@ namespace DeviceLibrary
switch (OutMoveInfo.MoveStep) switch (OutMoveInfo.MoveStep)
{ {
case MoveStep.Wait: case MoveStep.Wait:
if (CountMoveInfo.MoveStep== MoveStep.Count_ReadyOut) { if (IOValue(IO_Type.Unloading_VacuumDegree_Check).Equals(IO_VALUE.HIGH)) {
OutMoveInfo.MoveParam = JsonConvert.DeserializeObject<ReelParam>(Setting_Init.Temp_OutMoveParam);
OutMoveInfo.log($"吸盘上有料盘" + OutMoveInfo.MoveParam.ToDetailStr());
if (OutMoveInfo.MoveParam.QTY == 0)
{
OutMoveInfo.MoveParam.IsNg = true;
OutMoveInfo.MoveParam.NgMsg = "重置时无点料结果";
}
OutMoveInfo.NextMoveStep(MoveStep.Out_09);
}
else if (CountMoveInfo.MoveStep == MoveStep.Count_ReadyOut)
{
OutMoveInfo.NewMove(MoveStep.Out_01); OutMoveInfo.NewMove(MoveStep.Out_01);
OutMoveInfo.MoveParam = CountMoveInfo.MoveParam.clone(); OutMoveInfo.MoveParam = CountMoveInfo.MoveParam.clone();
Setting_Init.Temp_OutMoveParam = JsonConvert.SerializeObject(OutMoveInfo.MoveParam);
OutFromPos = RobotManage.OutCarReelPostion["Unloading_Counting"]; OutFromPos = RobotManage.OutCarReelPostion["Unloading_Counting"];
OutMoveInfo.log($"点料区料盘已经准备好:"+OutMoveInfo.MoveParam.ToDetailStr()); OutMoveInfo.log($"点料区料盘已经准备好:" + OutMoveInfo.MoveParam.ToDetailStr());
var cc = OutMoveInfo.MoveParam.codeInfos.Select((a) => a.CodeType + ":" + a.CodeStr); if (OutMoveInfo.MoveParam.codeInfos != null)
OutMoveInfo.log(String.Join("##", cc)); {
var cc = OutMoveInfo.MoveParam.codeInfos.Select((a) => a.CodeType + ":" + a.CodeStr);
OutMoveInfo.log(String.Join("##", cc));
}
} }
break; break;
case MoveStep.Out_01: case MoveStep.Out_01:
...@@ -82,7 +98,7 @@ namespace DeviceLibrary ...@@ -82,7 +98,7 @@ namespace DeviceLibrary
Unloading_InOut_Axis.AbsMove(OutMoveInfo, Config.Unloading_InOut_Axis_P1, Config.Unloading_InOut_Axis_P1_speed); Unloading_InOut_Axis.AbsMove(OutMoveInfo, Config.Unloading_InOut_Axis_P1, Config.Unloading_InOut_Axis_P1_speed);
OutMoveInfo.log($"进出轴到达p1点"); OutMoveInfo.log($"进出轴到达p1点");
} }
else else if (OutMoveInfo.IsTimeOut(6))
{ {
takeretry++; takeretry++;
if (OutMoveInfo.MoveParam.PlateH>32) if (OutMoveInfo.MoveParam.PlateH>32)
...@@ -90,7 +106,7 @@ namespace DeviceLibrary ...@@ -90,7 +106,7 @@ namespace DeviceLibrary
else else
OutMoveInfo.MoveParam.PlateH -= 2; OutMoveInfo.MoveParam.PlateH -= 2;
OutMoveInfo.log($"未取到料盘"); OutMoveInfo.log($"未取到料盘");
if (takeretry < 9 && OutMoveInfo.MoveParam.PlateH>=8) if (takeretry < 9 && OutMoveInfo.MoveParam.PlateH>=6)
{ {
OutMoveInfo.NextMoveStep(MoveStep.Out_05); OutMoveInfo.NextMoveStep(MoveStep.Out_05);
OutMoveInfo.log($"重试取盘:"+ OutMoveInfo.MoveParam.PlateH); OutMoveInfo.log($"重试取盘:"+ OutMoveInfo.MoveParam.PlateH);
...@@ -104,6 +120,12 @@ namespace DeviceLibrary ...@@ -104,6 +120,12 @@ namespace DeviceLibrary
break; break;
case MoveStep.Out_09: case MoveStep.Out_09:
OutMoveInfo.NextMoveStep(MoveStep.Out_10); OutMoveInfo.NextMoveStep(MoveStep.Out_10);
Unloading_Middle_Axis.AbsMove(OutMoveInfo, Config.Unloading_Middle_Axis_P1, Config.Unloading_Middle_Axis_P1_speed);
Unloading_UpDown_Axis.AbsMove(OutMoveInfo, Config.Unloading_UpDown_Axis_P1, Config.Unloading_UpDown_Axis_P1_speed);
OutMoveInfo.log($"旋转轴, 升降轴到p1");
break;
case MoveStep.Out_10:
OutMoveInfo.NextMoveStep(MoveStep.Out_11);
CylinderMove(null, IO_Type.Counting_ExitDoor_Close, IO_Type.Counting_ExitDoor_Open, IO_VALUE.LOW); CylinderMove(null, IO_Type.Counting_ExitDoor_Close, IO_Type.Counting_ExitDoor_Open, IO_VALUE.LOW);
OutMoveInfo.log($"关闭点料机入口大门"); OutMoveInfo.log($"关闭点料机入口大门");
if (OutMoveInfo.MoveParam.IsNg) if (OutMoveInfo.MoveParam.IsNg)
...@@ -112,7 +134,7 @@ namespace DeviceLibrary ...@@ -112,7 +134,7 @@ namespace DeviceLibrary
if (CountMoveInfo.MoveStep == MoveStep.Count_ReadyOut) if (CountMoveInfo.MoveStep == MoveStep.Count_ReadyOut)
CountMoveInfo.NextMoveStep(MoveStep.Count_Outted); CountMoveInfo.NextMoveStep(MoveStep.Count_Outted);
break; break;
case MoveStep.Out_10: case MoveStep.Out_11:
if (string.IsNullOrEmpty(OutMoveInfo.MoveParam.ReeID)) { if (string.IsNullOrEmpty(OutMoveInfo.MoveParam.ReeID)) {
OutMoveInfo.log($"没有获得Reelid"); OutMoveInfo.log($"没有获得Reelid");
OutMoveInfo.MoveParam.IsNg = true; OutMoveInfo.MoveParam.IsNg = true;
...@@ -122,7 +144,7 @@ namespace DeviceLibrary ...@@ -122,7 +144,7 @@ namespace DeviceLibrary
} }
if (CountList.ContainsKey(OutMoveInfo.MoveParam.ReeID)) if (CountList.ContainsKey(OutMoveInfo.MoveParam.ReeID))
{ {
OutMoveInfo.NextMoveStep(MoveStep.Out_11); OutMoveInfo.NextMoveStep(MoveStep.Out_12);
OutMoveInfo.MoveParam.QTY = CountList[OutMoveInfo.MoveParam.ReeID]; OutMoveInfo.MoveParam.QTY = CountList[OutMoveInfo.MoveParam.ReeID];
OutMoveInfo.log($"获得点料结果:{OutMoveInfo.MoveParam.QTY}"); OutMoveInfo.log($"获得点料结果:{OutMoveInfo.MoveParam.QTY}");
lock (CountList) lock (CountList)
...@@ -145,7 +167,7 @@ namespace DeviceLibrary ...@@ -145,7 +167,7 @@ namespace DeviceLibrary
OutMoveInfo.NextMoveStep(MoveStep.Out_20); OutMoveInfo.NextMoveStep(MoveStep.Out_20);
} }
break; break;
case MoveStep.Out_11: case MoveStep.Out_12:
if (false && LabelBusy) if (false && LabelBusy)
{ {
OutMoveInfo.log("等待贴标工作完毕"); OutMoveInfo.log("等待贴标工作完毕");
......
...@@ -28,6 +28,7 @@ namespace DeviceLibrary ...@@ -28,6 +28,7 @@ namespace DeviceLibrary
Task<(bool, string)> PrintTask = null; Task<(bool, string)> PrintTask = null;
bool IsLabelPrinted = false; bool IsLabelPrinted = false;
string printerrormsg = "";
void PrinterProcess() void PrinterProcess()
{ {
if (CheckWait(PrintMoveInfo)) if (CheckWait(PrintMoveInfo))
...@@ -55,17 +56,23 @@ namespace DeviceLibrary ...@@ -55,17 +56,23 @@ namespace DeviceLibrary
if (result) if (result)
{ {
PrintMoveInfo.NextMoveStep(MoveStep.Print_04); PrintMoveInfo.NextMoveStep(MoveStep.Print_04);
PrintMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000)); PrintMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
PrintMoveInfo.log("打印成功,等待标签被取走"); PrintMoveInfo.log("打印成功,等待标签被取走");
printerrormsg = "";
} }
else else
{ {
Msg.add("打印机反馈:" + msg, MsgLevel.alarm); Msg.add("打印机反馈:" + msg, MsgLevel.alarm);
RobotManage.UserPause("打印机反馈:" + msg); printerrormsg = msg;
PrintMoveInfo.NextMoveStep(MoveStep.Print_01); PrintMoveInfo.NextMoveStep(MoveStep.Print_01);
PrintMoveInfo.log("打印失败,再次打印"); PrintMoveInfo.log("打印失败,再次打印:" + msg);
} }
} }
else if (!string.IsNullOrEmpty(printerrormsg))
{
Msg.add("打印失败,再次打印.印机反馈:" + printerrormsg, MsgLevel.alarm);
}
else if (PrintMoveInfo.IsTimeOut(30)) { else if (PrintMoveInfo.IsTimeOut(30)) {
Msg.add("打印标签超时请检查打印机状态", MsgLevel.alarm); Msg.add("打印标签超时请检查打印机状态", MsgLevel.alarm);
} }
......
...@@ -16,6 +16,8 @@ namespace DeviceLibrary ...@@ -16,6 +16,8 @@ namespace DeviceLibrary
H02_HomeReset_01, H02_HomeReset_01,
H02_HomeReset_02, H02_HomeReset_02,
H02_HomeReset, H02_HomeReset,
H02_HomeReset_1,
H02_HomeReset_2,
H03_HomeReset, H03_HomeReset,
H04_HomeReset, H04_HomeReset,
H05_HomeReset, H05_HomeReset,
...@@ -77,6 +79,7 @@ namespace DeviceLibrary ...@@ -77,6 +79,7 @@ namespace DeviceLibrary
In_18, In_18,
In_19, In_19,
In_20, In_20,
In_21,
Count_01, Count_01,
......
...@@ -83,7 +83,7 @@ namespace DeviceLibrary ...@@ -83,7 +83,7 @@ namespace DeviceLibrary
IsLoadOk = false; IsLoadOk = false;
msg += "找不到料串位置文件" + "\n"; msg += "找不到料串位置文件" + "\n";
} }
xrayImage = new XrayImage("XrayImage", XrayImage.DeviceType.HAOBO); xrayImage = new XrayImage("XrayImage", XrayImage.DeviceType.HAOBO_V2);
string labellingPostionFile = "config\\LabellingPostion.csv"; string labellingPostionFile = "config\\LabellingPostion.csv";
if (File.Exists(labellingPostionFile)) if (File.Exists(labellingPostionFile))
{ {
...@@ -137,7 +137,6 @@ namespace DeviceLibrary ...@@ -137,7 +137,6 @@ namespace DeviceLibrary
} }
else else
{ {
LogUtil.info("标签打印机打开成功"); LogUtil.info("标签打印机打开成功");
} }
......
...@@ -169,6 +169,7 @@ ...@@ -169,6 +169,7 @@
this.lblAlarmcode.Tag = "not"; this.lblAlarmcode.Tag = "not";
this.lblAlarmcode.Text = "ErrCode:160"; this.lblAlarmcode.Text = "ErrCode:160";
this.lblAlarmcode.Visible = false; this.lblAlarmcode.Visible = false;
this.lblAlarmcode.Click += new System.EventHandler(this.lblAlarmcode_Click);
// //
// label4 // label4
// //
......
...@@ -446,6 +446,11 @@ namespace DeviceLibrary ...@@ -446,6 +446,11 @@ namespace DeviceLibrary
lbl.BackColor = this.BackColor; lbl.BackColor = this.BackColor;
} }
} }
private void lblAlarmcode_Click(object sender, EventArgs e)
{
MessageBox.Show(string.Join(",", HuichuanLibrary.HCBoardManager.GetAxisErrorDetail(currentAxis.Config.GetAxisValue())));
}
} }
} }
...@@ -87,6 +87,7 @@ DI,0,上料区提升工位料盘检测3,Loading_Batch_ReelCheck_T3,23,HC,X23,,,,,,,,,, ...@@ -87,6 +87,7 @@ DI,0,上料区提升工位料盘检测3,Loading_Batch_ReelCheck_T3,23,HC,X23,,,,,,,,,,
DI,0,上料区提升工位料盘检测4,Loading_Batch_ReelCheck_T4,24,HC,X24,,,,,,,,,, DI,0,上料区提升工位料盘检测4,Loading_Batch_ReelCheck_T4,24,HC,X24,,,,,,,,,,
DI,0,上料区提升工位料盘检测5,Loading_Batch_ReelCheck_T5,25,HC,X25,,,,,,,,,, DI,0,上料区提升工位料盘检测5,Loading_Batch_ReelCheck_T5,25,HC,X25,,,,,,,,,,
DI,0,上料区吸盘压力检测,Loading_VacuumDegree_Check,26,HC,X26,,,,,,,,,, DI,0,上料区吸盘压力检测,Loading_VacuumDegree_Check,26,HC,X26,,,,,,,,,,
DI,0,上料区推车检测2,Loading_Car_Check2,27,HC,X27,,,,,,,,,,
,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,
DI,0,下料区推车锁紧按钮,Unloading_CarLock_Btn,32,HC,X32,,,,,,,,,, DI,0,下料区推车锁紧按钮,Unloading_CarLock_Btn,32,HC,X32,,,,,,,,,,
DI,0,下料区推车检测,Unloading_Car_Check,33,HC,X33,,,,,,,,,, DI,0,下料区推车检测,Unloading_Car_Check,33,HC,X33,,,,,,,,,,
...@@ -100,7 +101,7 @@ DI,0,下料区提升工位料盘检测4,Unloading_Batch_ReelCheck_T4,40,HC,X40,,,,,,,,,, ...@@ -100,7 +101,7 @@ DI,0,下料区提升工位料盘检测4,Unloading_Batch_ReelCheck_T4,40,HC,X40,,,,,,,,,,
DI,0,下料区提升工位料盘检测5,Unloading_Batch_ReelCheck_T5,41,HC,X41,,,,,,,,,, DI,0,下料区提升工位料盘检测5,Unloading_Batch_ReelCheck_T5,41,HC,X41,,,,,,,,,,
DI,0,下料区吸盘压力检测,Unloading_VacuumDegree_Check,42,HC,X42,,,,,,,,,, DI,0,下料区吸盘压力检测,Unloading_VacuumDegree_Check,42,HC,X42,,,,,,,,,,
DI,0,NG箱检测,NGBOX_Check,43,HC,X43,,,,,,,,,, DI,0,NG箱检测,NGBOX_Check,43,HC,X43,,,,,,,,,,
,,,,,,,,,,,,,,,, DI,0,下料区推车检测2,Unloading_Car_Check2,44,HC,X44,,,,,,,,,,
,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,
DO,0,点料区待机状态(指示灯),Run_Led,0,HC,Y00,,,,,,,,,, DO,0,点料区待机状态(指示灯),Run_Led,0,HC,Y00,,,,,,,,,,
DO,0,点料区运行状态(指示灯),Standby_Led,1,HC,Y01,,,,,,,,,, DO,0,点料区运行状态(指示灯),Standby_Led,1,HC,Y01,,,,,,,,,,
......
...@@ -227,6 +227,16 @@ namespace OnlineStore.LoadCSVLibrary ...@@ -227,6 +227,16 @@ namespace OnlineStore.LoadCSVLibrary
/// </summary> /// </summary>
public static string Unloading_Device_Led = "Unloading_Device_Led"; public static string Unloading_Device_Led = "Unloading_Device_Led";
/// <summary>
/// DI,0,上料区推车检测2,Loading_Car_Check2,27,HC,X27,,,,,,,,,,
/// </summary>
public static string Loading_Car_Check2 = "Loading_Car_Check2";
/// <summary>
/// DI,0,下料区推车检测2,Unloading_Car_Check2,44,HC,X44,,,,,,,,,,
/// </summary>
public static string Unloading_Car_Check2 = "Unloading_Car_Check2";
} }
public enum IO_VALUE public enum IO_VALUE
{ {
......
...@@ -156,7 +156,7 @@ namespace TheMachine ...@@ -156,7 +156,7 @@ namespace TheMachine
// 简体中文ToolStripMenuItem // 简体中文ToolStripMenuItem
// //
this.简体中文ToolStripMenuItem.Name = "简体中文ToolStripMenuItem"; this.简体中文ToolStripMenuItem.Name = "简体中文ToolStripMenuItem";
this.简体中文ToolStripMenuItem.Size = new System.Drawing.Size(180, 26); this.简体中文ToolStripMenuItem.Size = new System.Drawing.Size(144, 26);
this.简体中文ToolStripMenuItem.Tag = "not"; this.简体中文ToolStripMenuItem.Tag = "not";
this.简体中文ToolStripMenuItem.Text = "简体中文"; this.简体中文ToolStripMenuItem.Text = "简体中文";
this.简体中文ToolStripMenuItem.Click += new System.EventHandler(this.简体中文ToolStripMenuItem_Click); this.简体中文ToolStripMenuItem.Click += new System.EventHandler(this.简体中文ToolStripMenuItem_Click);
...@@ -164,7 +164,7 @@ namespace TheMachine ...@@ -164,7 +164,7 @@ namespace TheMachine
// englishToolStripMenuItem // englishToolStripMenuItem
// //
this.englishToolStripMenuItem.Name = "englishToolStripMenuItem"; this.englishToolStripMenuItem.Name = "englishToolStripMenuItem";
this.englishToolStripMenuItem.Size = new System.Drawing.Size(180, 26); this.englishToolStripMenuItem.Size = new System.Drawing.Size(144, 26);
this.englishToolStripMenuItem.Tag = "not"; this.englishToolStripMenuItem.Tag = "not";
this.englishToolStripMenuItem.Text = "English"; this.englishToolStripMenuItem.Text = "English";
this.englishToolStripMenuItem.Click += new System.EventHandler(this.englishToolStripMenuItem_Click); this.englishToolStripMenuItem.Click += new System.EventHandler(this.englishToolStripMenuItem_Click);
......
...@@ -426,6 +426,49 @@ namespace TheMachine ...@@ -426,6 +426,49 @@ namespace TheMachine
MainMachine_ProcessMsgEvent(Msg.get()); MainMachine_ProcessMsgEvent(Msg.get());
return; return;
} }
LogUtil.info($"LoadingCarOnPosition:{RobotManage.mainMachine.LoadingCarOnPosition}, Loading_Car_Location_Up:{RobotManage.mainMachine.IOValue(IO_Type.Loading_Car_Location_Up)}, HasHomeSignal:{RobotManage.mainMachine.Loading_Batch_Axis.HasHomeSignal()}");
if (RobotManage.mainMachine.LoadingCarOnPosition == MainMachine.CarPosition.NoCar)
{
LogUtil.info("没有入料车");
}
else if (RobotManage.mainMachine.LoadingCarOnPosition == MainMachine.CarPosition.OnPosition && RobotManage.mainMachine.IOValue(IO_Type.Loading_Car_Location_Up).Equals(IO_VALUE.HIGH))
{
LogUtil.info("入料车没有离开");
}
else if (RobotManage.mainMachine.Loading_Batch_Axis.HasHomeSignal()
&& (RobotManage.mainMachine.Loading_Batch_Axis.IsInPosition(RobotManage.mainMachine.Config.Loading_Batch_Axis_P1)
|| RobotManage.mainMachine.Loading_Batch_Axis.IsInPosition(0))
)
{
LogUtil.info("入口批量轴在待机点或原点可以开始回原");
}
else
{
Msg.add("入料车没有取出,无法启动", MsgLevel.warning);
MainMachine_ProcessMsgEvent(Msg.get());
return;
}
if (RobotManage.mainMachine.UnloadingCarOnPosition == MainMachine.CarPosition.NoCar)
{
LogUtil.info("没有出料车");
}
else if (RobotManage.mainMachine.UnloadingCarOnPosition == MainMachine.CarPosition.OnPosition && RobotManage.mainMachine.IOValue(IO_Type.Unloading_Car_Location_Up).Equals(IO_VALUE.HIGH) )
{
LogUtil.info("出料车没有离开");
}
else if (RobotManage.mainMachine.Unloading_Batch_Axis.HasHomeSignal()
&& (RobotManage.mainMachine.Unloading_Batch_Axis.IsInPosition(RobotManage.mainMachine.Config.Unloading_Batch_Axis_P1)
|| RobotManage.mainMachine.Unloading_Batch_Axis.IsInPosition(0))
)
{
LogUtil.info("出口批量轴在待机点或原点可以开始回原");
}
else
{
Msg.add("出料车没有取出,无法启动", MsgLevel.warning);
MainMachine_ProcessMsgEvent(Msg.get());
return;
}
RobotManage.Start(); RobotManage.Start();
userpause = false; userpause = false;
if (RobotManage.isRunning) if (RobotManage.isRunning)
......
...@@ -137,7 +137,7 @@ namespace TheMachine ...@@ -137,7 +137,7 @@ namespace TheMachine
RobotManage.mainMachine.IOMove(IO_Type.Xray_Lock, IO_VALUE.HIGH); RobotManage.mainMachine.IOMove(IO_Type.Xray_Lock, IO_VALUE.HIGH);
Task.Delay(1000).Wait(); Task.Delay(1000).Wait();
RobotManage.XRay.Start(); RobotManage.XRay.Start();
Task.Delay(2000).Wait(); Task.Delay(3000).Wait();
var b = RobotManage.xrayImage.GenerateTemplate(2); var b = RobotManage.xrayImage.GenerateTemplate(2);
b.Wait(); b.Wait();
if (b.Result) if (b.Result)
......
...@@ -330,6 +330,27 @@ namespace OnlineStore.ACSingleStore ...@@ -330,6 +330,27 @@ namespace OnlineStore.ACSingleStore
this.Close(); this.Close();
} }
private void btn_addx_Click(object sender, EventArgs e)
{
if (int.TryParse(txt_xpos.Text, out int pos))
{
listBox_x.Items.Add(pos);
var l = listBox_x.Items.Cast<int>().ToList();
l.Sort();
listBox_x.Items.Clear();
l.ForEach(x => listBox_x.Items.Add(x));
}
else
MessageBox.Show("请填写数字");
}
private void btn_xposdel_Click(object sender, EventArgs e)
{
if (listBox_x.SelectedIndex < 0)
return;
listBox_x.Items.RemoveAt(listBox_x.SelectedIndex);
}
} }
} }
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="Column_Index.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column_position.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column_Del.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column_Index.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column_position.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column_Del.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>
\ No newline at end of file \ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!