PCB LDI 实现周期自动更新 实现思路
一.基本思路整理如下:
二.封周期启动程序C#代码(部份代码)
/// <summary>
/// 单个生产型号 更新周期
/// </summary>
/// <param name="pdctno"></param>
/// <param name="gpid"></param>
/// <returns></returns>
private MOD_ReturnDate BatUpdateWeek(string pdctno, int gpid)
{ string OutFilePath = Application.StartupPath + @"log\AutoUpdateWeek.txt";
if (File.Exists(OutFilePath)) File.Delete(OutFilePath);
string Script_Path = Application.StartupPath + @"\GenesisScript.exe";
string strjob = pdctno.ToLower();
Script_Run(Script_Path, gpid, strjob, "", "Param=AutoUpdateWeek");
Stopwatch sw = new Stopwatch();
sw.Start();
MOD_ReturnDate ReturnDate;
while (!File.Exists(OutFilePath))
{
Thread.Sleep();
if (sw.ElapsedMilliseconds > ) //一分钟后脚本还未执行返回信息,关闭进程
{
Process[] arrayProcess = Process.GetProcesses();
foreach (Process p in arrayProcess)
{
if (p.ProcessName.ToLower() == "genesisscript")
{
p.Kill();
}
}
break;
}
}
sw.Stop();
string errinfo = "";
if (File.Exists(OutFilePath))
{
string AutoUpdateWeekJSON = File.ReadAllText(OutFilePath);
ReturnDate = JsonHelper.DeserializeJsonToObject<MOD_ReturnDate>(AutoUpdateWeekJSON);
}
else
{
errinfo = "超时";
ReturnDate = new MOD_ReturnDate() { JobName = strjob, tgzJOBname = "", State = , ReturnInfo = errinfo };
}
return ReturnDate;
}
/// <summary>
/// 启动循环遍历
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Click(object sender, EventArgs e)
{
string[] jobList = {"A0001A0", "A0001A1" }; //手动赋值,在实际应用:这里数据应该是从DB数据库,由MES过数触发写入,
foreach (var item in jobList)
{
int pid = getPIDonly();
if (pid > -)
{
MOD_ReturnDate ReturnDate = BatUpdateWeek(item, pid);
}
else
{
MessageBox.Show("未检测到G启动");
break;
}
}
}
三.更新周期脚本C#代码(部份代码)
/// <summary>
/// 自动调TGZ更新周期
/// </summary>
/// <param name="JOBname"></param>
/// <param name="ReturnInfo"></param>
/// <param name="ParentTechName">外层干膜|阻焊|字符 填写其中一个或者不填检测全部</param>
/// <returns>1成功 0失败(异常) -1不存在周期</returns>
public static int AutoUpdateWeekScript(string JOBname, ref string tgzJOBname, ref string ReturnInfo, string ParentTechName = "")
{
string WeekFormat = ""; //WWYY YYWW等
string WeekFormatNum = "";//2618 1826 等
int isOK = ;
isOK = AutoUpdateWeek.getWeekFormat(JOBname, ref WeekFormat, ref ReturnInfo, ParentTechName); //抓取流程指示 周期格式
if (isOK == )
{
isOK = InputTGZ(JOBname, ref tgzJOBname, ref ReturnInfo);//导入TGZ
if (isOK == )
{
int AddDay = ;//延后封周期天数
DateTime CurrentDateWeekTime = getDateTimeNow(JOBname, ref AddDay);//获取封周期时间
WeekFormatNum = AutoUpdateWeek.getWeek(CurrentDateWeekTime, WeekFormat, AddDay); string job = tgzJOBname;
isOK = AutoUpdateWeek.UpdateWeekScript(job, WeekFormatNum, ref ReturnInfo); //UI 更新genesis JOB 周期 (处理当前Job,处理后不关闭Job窗口)
if (isOK == )
{
g.COM($"check_inout,mode=out,type=job,job={job}");
g.COM($"save_job,job={job},override=no");
string OutDir = "E:/work/" + job + "/";
if (!Directory.Exists(OutDir)) Directory.CreateDirectory(OutDir);
g.COM($"export_job,job={job},path={OutDir},mode=tar_gzip,submode=full,overwrite=yes");
}
g.COM($"check_inout,mode=in,type=job,job={job}");
g.COM($"close_job,job={job}");
g.COM($"close_form,job={job}");
g.COM($"close_flow,job={job}");
}
}
return isOK; //1成功 0失败(异常) -1不存在周期
} /// <summary>
/// UI 更新genesis JOB 周期 (处理当前Job,处理后不关闭Job窗口)
/// </summary>
/// <param name="JOBname"></param>
/// <param name="WeekFormatNum"></param>
/// <param name="ReturnInfo"></param>
/// <returns></returns>
public static int UpdateWeekScript(string JOBname, string WeekFormatNum, ref string ReturnInfo)
{
if (string.IsNullOrEmpty(WeekFormatNum))
{
ReturnInfo = "周期未计算,不允许执行";
return ;
} job job_ = new G_Helper.job();
step step_ = new G_Helper.step(JOBname);
List<string> SETstepList = new List<string> { "cam", "set" };
List<string> stepList = job_.get_step_list(JOBname).Where(tt => SETstepList.IndexOf(tt) > -).ToList();
List<string> layerList = new List<string>();
if (stepList.Count > )
{
layerList = step_.get_layer_list(stepList[]).Where(tt => tt.StartsWith("datecode")).ToList();
}
int WeekLength = WeekFormatNum.Length;
int UpdateDateCodeLayerNum = ;
bool WeekLengthDiff = false;
string UpdateDateCodeStr = "周期更新信息\r\n";
if (layerList.Count > )
{
foreach (var stepname_ in stepList)
{
bool isStepUpdate = false;
step_.open_step(stepname_);
foreach (var layername in layerList)
{
g.COM($"display_layer,name={layername},display=yes,number=1");
g.COM($"work_layer,name={layername}");
g.COM("filter_reset,filter_name=popup");
g.COM("adv_filter_set,filter_name=popup,update_popup=yes,fontname=datecode");
g.COM("adv_filter_set,filter_name=popup,update_popup=no,txt_types=string");
g.COM("filter_area_strt");
g.COM("filter_area_end,layer=,filter_name=popup,operation=select,area_type=none,inside_area=no,intersect_area=no");
int datecodeCount = int.Parse(g.COM(g._get_select_count)); //datecode字体个数
if (datecodeCount > )
{
g.COM("clear_highlight");
g.COM("sel_clear_feat");
g.COM($"adv_filter_set,filter_name=popup,update_popup=yes,str_len=yes,min_str_len={WeekLength},max_str_len={WeekLength}");
g.COM("filter_area_strt");
g.COM("filter_area_end,layer=,filter_name=popup,operation=select,area_type=none,inside_area=no,intersect_area=no");
int datecodeWeekLengthCount = int.Parse(g.COM(g._get_select_count));//datecode字体且长度相同个数
if (datecodeWeekLengthCount > && datecodeWeekLengthCount == datecodeCount)
{
g.COM("sel_change_txt,text=" + WeekFormatNum);
UpdateDateCodeStr = UpdateDateCodeStr + $"Step名:{stepname_} Layer名:{layername} 成功 \r\n";
UpdateDateCodeLayerNum++;
isStepUpdate = true;
}
else if (datecodeWeekLengthCount > && datecodeWeekLengthCount != datecodeCount)
{
UpdateDateCodeStr = UpdateDateCodeStr + $"Step名:{stepname_} Layer名:{layername} 失败(多种周期长度) \r\n";
WeekLengthDiff = true;
}
else
{
UpdateDateCodeStr = UpdateDateCodeStr + $"Step名:{stepname_} Layer名:{layername} 失败(周期长不致) \r\n";
WeekLengthDiff = true;
}
}
g.COM("filter_reset,filter_name=popup");
}
if (!isStepUpdate)
{
step_.close_step();
}
}
}
else
{
ReturnInfo = "未检测datecode层,无法更新周期";
return ;
}
if (UpdateDateCodeLayerNum > && !WeekLengthDiff)
{
ReturnInfo = UpdateDateCodeStr;
return ;
}
else if (WeekLengthDiff)
{
ReturnInfo = "datecode字体长度与更新周期字体长度不一致\r\n" + UpdateDateCodeStr;
return ;
}
else
{
ReturnInfo = "未检测datecode字体,无法更新周期";
return ;
}
}
PCB LDI 实现周期自动更新 实现思路的更多相关文章
- PCB LDI文件 自动化输出(改造)实现思路
由于工厂采用Liunxs系统输出LDI文件,由于我们数据库是用的Windows Server,编程语言是.net 无法与Liunxs系统进行有效对接, 所以造成才会造成LDI 资料输效率极低,人员工作 ...
- 使用七牛云存储实现Android的自动更新
为了修复Bug或更新软件,我们通常需要实现自动更新,没有哪一个牛逼的人能够搞到每一个用户的机子去帮他们更新. 1.自动更新的流程 我们将了解一下自动更新的思路.既然软件要自动更新,那么它必须知道自己是 ...
- WinForm通用自动更新AutoUpdater项目实战
目前我们做的上位机项目还是以Winform为主,在实际应用过程中,可能还会出现一些细节的修改.对于这种情况,如果上位机带有自动更新功能,我们只需要将更新后的应用程序打包放在指定的路径下,可以让用户自己 ...
- EntityFrameworkCore 模型自动更新(上)
话题 嗯,距离上一次写博文已经过去近整整十个月,还是有一些思考,但还是变得懒惰了,心思也不再那么专注,有点耗费时间,学习也有点停滞不前,那就顺其自然,随心所欲吧,等哪天心血来潮,想写了就写写 模型自动 ...
- 谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现(更新优化思路)
注:本文仅用于在博客园学习分享,还在随着项目不断更新和完善中,多有不足,暂谢绝各平台或个人的转载和推广,感谢支持. 一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是 ...
- hibernate查询出的实体,set值后,自动更新到数据库
1.问题症状描述 最近在处理一个新需求问题,代码的大致逻辑是获取一个实体对象,调用该对象的set方法设置其中的某些字段,然后把修改后的实体作为参数供其他地方调用,根据返回值来决定是否更新这个 ...
- HBuilderX开发app实现自动更新版本
需求说明:使用MUI+Vue等技术并且通过HBuilderX打包开发移动app,在有版本更新时需要自动提示用户有新版本,并且可以点击下载自动安装. 思路说明: 应用打开时(使用Vue的生命周期mo ...
- QML 从无到有 3 (自动更新)
新的需求出来啦,需要自动更新功能,不怕程序升级了. 自动更新,QML不好写,需要c++来辅助,这里就涉及QML中调用c++功能(这里就不写了,百度一下,很多). 思路:获取版本>下载程序> ...
- 分析nuget源码,用nuget + nuget.server实现winform程序的自动更新
源起 (个人理解)包管理最开始应该是从java平台下的maven开始吧,因为java的开发大多数是基于开源组件开发的,一个开源包在使用时很可能要去依赖其他的开源包,而且必须是特定的版本才可以.以往在找 ...
随机推荐
- js 闭包 定时器
; !function (win) { ; //内部私有 , ; //内部私有 //test.prototype.tt1 = 0;//共有变量 var test = function () {}; t ...
- C# 处理URL地址
calendarset.do?start=1548518400&end=1552147200&_=1546421856958calendarset.do?start=155093760 ...
- C# 获得星期几
var temp = System.DateTime.Today.ToString("dddd", new System.Globalization.CultureInfo(&qu ...
- CDR X8图框精确剪裁在哪?
对于CorelDRAW,刚从低版本升级为高版本的同学可能一下子理不清方向,因为在CorelDRAW X8中有很多功能命令做了整改和位置的变化.很多用户反映,CDR中的图框精确剪裁不见了,然而并不是该命 ...
- centos设置ssh安全只允许用户从指定的IP登陆
1.编辑文件 /etc/ssh/sshd_config vi /etc/ssh/sshd_config 2.root用户只允许在如下ip登录 AllowUsers root@203.212.4.117 ...
- Oracle行转列/列转行
1.oracle的pivot函数 原表 使用pivot函数: with temp as(select '四川省' nation ,'成都市' city,'第一' ranking from dual u ...
- Day 11 文件和异常
文件和异常 在实际开发中,常常需要对程序中的数据进行持久化操作,而实现数据持久化最直接简单的方式就是将数据保存到文件中.说到“文件”这个词,可能需要先科普一下关于文件系统的知识,对于这个概念,维基百科 ...
- 数据结构与算法(6) -- heap
binary heap就是一种complete binary tree(完全二叉树).也就是说,整棵binary tree除了最底层的叶节点之外,都是满的.而最底层的叶节点由左至右又不得有空隙. 以上 ...
- linux下的vi的使用方法
vi的使用: 一般指令模式: vi打开一个文件就直接进入一般指令模式,可以进行删除.复制.粘贴.但是不可以对文件的内容进行修改. 常用命令: ctrl + f 向下移动一页 ctrl + b 向上移动 ...
- php 漏洞分析
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串.