发明名称 离散型企业智能作业控制方法
摘要 本发明公开了一种离散型企业智能作业控制方法,首先对多种具有不固定子部件级数和多道装配工序的产品采用不固定嵌套循环层数和数组构建产品结构树,并计算生产能力初定各工序单元工位数;在考虑产品从属关系、产品装配流程、生产计划时间、产品配套时间、缺件补齐时间、异常推迟时间、实际完成时间、产品优先级、正常上班时间各工序单元工位数和加班时间各工序单元工位数十种因素自动寻找部件装配的最佳路径,该最佳路径以甘特图方式实时显示控制现场作业,作业开工勾选调用作业指导书进行作业和作业进程返馈,从而实现离散型企业智能的作业控制。本发明能够提升企业快速响应能力,提高产品质量和生产率,确保履约率。
申请公布号 CN102930397B 申请公布日期 2016.04.13
申请号 CN201210433134.3 申请日期 2012.11.01
申请人 北方信息控制集团有限公司 发明人 陈友春;许清;王龙莹;陈国胜;胡文花;唐晓冬;聂永海;张云龙;吴庆;曹磊;郭晓丹;马宁;程晓敏;付羽翀;赵晓宝;季冬;孙士亮
分类号 G06Q10/06(2012.01)I 主分类号 G06Q10/06(2012.01)I
代理机构 南京理工大学专利中心 32203 代理人 唐代盛
主权项 一种离散型企业智能作业控制方法,其特征在于对多种具有不固定子部件级数和多道装配工序的产品采用不固定嵌套循环层数和数组构建产品结构树;按相似性分成八个生产单元,每个单元又安排可控制数量的工位,半天按210分钟,计算生产能力初定各工序单元工位数;在考虑产品从属关系、产品装配流程、生产计划时间、产品配套时间、缺件补齐时间、异常推迟时间、实际完成时间、产品优先级、正常上班时间各工序单元工位数和加班时间各工序单元工位数十种因素,控制具有从属关系产品的每一个部件在每一个工位上装配的最佳时间点,自动寻找部件装配的最佳路径;该最佳路径以甘特图方式实时显示控制现场作业;作业开工勾选调用作业指导书进行作业和作业进程反馈,从而实现离散型企业智能的作业控制;所述计算生产能力初定各工序单元工位数:对不固定子部件级数的产品采用不固定嵌套循环层数和数组的方法寻找到产品所有的装配部件,根据产品所有的装配部件的作业时长计算产品的生产能力;确定各工序单元工位数量的过程如下:1)选择需要计算生产能力的截止时间,过滤这段时间内生产计划表的产品计划,测试过滤后生产计划表有没有记录,如果没有记录,计算结束;如果有记录,记录数记作li_row,进行生产能力计算,生成生产能力计算表;2)生产计划表按产品代号、部件代号、批次号字段升序排序;将产品的装配工序按相似性进行分类,定义各工序单元的工序名称,根据产品装配工艺相似性的特点,将装配工序定义为钳装、装擦、电装、电调、总校、联调、装箱、装外八个工序单元;3)依次读入已过滤的生产计划表的不同的产品代号,作为生产能力计算表的各记录项,记录读完后,增加计划工时、达额工时、能力工时、各工序单元工位数四个记录汇总项;4)设置表示循环层数变量int i,数组string zcc[20],zcb[20],long lii_row[20];读取生产计划表第一条记录的产品代号、部件代号、计划数量ljsll;5)查找对应于装配流程表各工序单元的作业时长,如果读不到数据或读的数据为空,那么作业时长值为0,将计划数量ljsll与对应部件对应工序单元的作业时长相乘的数据与生产能力计算表对应生产计划表中产品代号的原数据相加,将结果设置给生产能力计算表中对应生产计划表中产品代号的记录的相应字段;如果生产能力计算表中对应生产计划表中产品代号的原数据为空,则将计划数量ljsll与对应部件对应工序单元的作业时长相乘的数据设置给生产能力计算表中对应生产计划表中产品代号的记录的相应字段;6)将产品明细表按产品代号、部件代号字段过滤,得到所有子部件;7)赋值i=1,测试子部件的记录数,记作lii_row[i];8)判断有没有子部件,如果lii_row[i]=0,表示没有子部件,那么生产计划表中的光标指向下一条记录,读取下一条记录的产品代号、部件代号、计划数量ljsll,重复步骤5)、6)、7)、8);如果lii_row[i]>0,表示有子部件,读取其子部件的第一条记录的产品代号cpdh、部件代号ljdh、部件名称ljmc、所属产品zcc[i]、所属部件zcb[i]、所属数量(ljsl),ljsll=ljsll*ljsl;9)以产品代号、部件代号为条件查找装配流程表对应部件各工序单元的作业时长,如果读不到数据或读的数据为空,那么作业时长值为0,将计划数量ljsll与对应部件对应工序单元的作业时长相乘的数据与生产能力计算表中对应生产计划表中产品代号的原数据相加,将结果设置给生产能力计算表中对应生产计划表中产品代号的记录的相应字段;如果生产能力计算表中对应生产计划表中产品代号的原数据为空,则将计划数量ljsll与对应部件对应工序单元的作业时长相乘的数据设置给生产能力计算表中对应生产计划表中产品代号的记录的相应字段;10)将产品明细表按zcc[i],zcb[i]字段过滤,得到所有子部件;11)测试子部件的记录数,记作lii_row[i+1];12)判断有没有子部件,如果lii_row[i+1]=0,表示没有子部件,那么恢复父项过滤条件;光标指向下一条记录,读取下一条记录的产品代号cpdh、部件代号ljdh、部件名称ljmc、所属产品zcc[i]、所属部件zcb[i]、所属数量(ljsl),ljsll=ljsll*ljsl;重复步骤9)、10)、11)、12);如果lii_row[i+1]>0,表示有子部件;赋值i=i+1;读取子部件的第一条记录的产品代号cpdh、部件代号ljdh、部件名称ljmc、所属产品zcc[i]、所属部件zcb[i]、所属数量(ljsl),ljsll=ljsll*ljsl;13)重复步骤9)、10)、11)、12);14)当光标指向i级子部件级的结尾时,回到父项,设置i=i–1;判断光标是回到父项的从第1条到第li_row[i]条记录之间的一条记录还是父项的结尾记录;如果是回到父项的从第1条到第li_row[i]条记录之间的一条记录,则恢复父项的过滤条件,进行下一条记录的测试和判断;如果是回到父项的结尾记录,则进入上一层循环,再次设置i=i–1,直到i=1;15)将生产能力计算表中计算得到的各条产品记录中的各个工序单元横向汇总求和,设置给该记录的产品工时字段;16)将生产能力计算表中计算得到的各条产品记录中的各个工序单元及产品工时进行纵向汇总求和,得到的数据设置给计划工时记录相对应的各字段;17)将生产能力计算表中计划工时各工序单元的数值除以作业天数,再除以每天作业的分钟数,就到得生产能力计算表中工位数量安排的近似值;18)将生产能力计算表中各工序单元的计划工时和产品工时与达额率相乘,得到的数据设置给达额工时记录相对应的各字段;19)将工作时长与各工序单元工位数相乘得到能力工时,得到的数据设置给达额工时记录相对应的各字段;其中考虑产品从属关系、产品装配流程、生产计划时间、产品配套时间、缺件补齐时间、异常推迟时间、实际完成时间、产品优先级、正常上班时间各工序单元工位数和加班时间各工序单元工位数十种因素的表,寻找控制具有从属关系产品的每一个部件在每一个工位上装配的最佳时间点,自动寻找具有不固定级数从属关系的产品的部件装配最佳路径,过程如下:(1)由加班表和工序单元工位表运用显示区间天数的确定,周末的判断,循环中日期和时间的表达方法生成工序时间表,步骤如下:1)清除工序时间表原来的数据;2)用户输入截止日期em_2,今天的第二天与截止日期之间的日期称为显示区间,记作变量xx;3)如果截止日期的年份等于今天today()的年份,显示区间的天数xx为截止日期的号数,减去今天today()的号数,加上从今天today()的月份到截止日期月份的前一个月期间每个月最后一天的号数的累加和;4)如果截止日期的年份等于今天today()的年份加1,显示区间的天数xx为截止日期的号数,减去今天today()的号数,加上从今天today()的月份到今天today()当年十二月期间每个月最后一天的号数,加上截止日期当年一月到截止日期月份前一个月期间每个月最后一天的号数的累加和;5)如果截止日期的年份大于今天today()的年份加1,显示区间的天数xx为截止日期的号数,减去今天today()的号数,加上从今天today()的月份到今天today()当年十二月期间每个月最后一天的号数,加上截止日期当年一月到截止日期月份前一个月期间每个月最后一天的号数,加上从今天today()的次年一月到截止日期前一年十二月期间每个月最后一天的号数的累加和;6)取每个月最后一天的方法为:月份设为变量li_month,如果li_month=12,那么最后一天的号数为31;如果li_month<12,那么下个月月份为本月加1,即li_month+1,每个月的最后一天就是下个月1号的前一天;7)以显示区间的天数为第一层循环的次数,以工序单元工位表的工序名称字段为第二层循环的次数,以工序单元工位表的工位数字段为第三层循环次数进入循环,依次读数、赋值、设置直至完成三层循环,工序时间表完成设置;8)在步骤7)的循环中,依次读数、赋值、设置直至完成三层循环的方法如下:读取工序单元工位表中每条记录的工序名称,设置给工序时间表的工序名称字段;读取工序单元工位表中每条记录的工位数,设置给工序时间表的顺序号字段;工序时间表的次序号用两位数n‑m表示,n表示今天today()后第几天数,n从1到xx;m表示时间段,用1、2、3表示;1表示上午班8:00‑11:30,2表示下午班12:30‑16:00,3表示晚班17:00‑20:30;每班次上班时间分别为:上午班时间08:00;下午班时间12:30;晚班时间17:00;工序时间表的起始时间为日期时间型数据,含日期和时间;取今天today()后的第n天日期,判断第n天是不是星期天或星期六;如果是,那么工序单元工位表中的工位数不参与循环;工序时间表的有效性均设为0;读取加班表中的记录;将工序时间表按顺序号字段降序排列;查找工序时间表中对应同时段并且同工序名称的记录的顺序号;如果查找到,则插入新的相应记录,记录的顺序号从查找到的顺序号以后排;如果查找不到,则插入新的相应记录,记录的顺序号从1开始排,直到循环结束;9)工序时间表生成后,按工序名称、起始时间、次序号字段升序,顺序号字段降序排序;(2)保留部件进度表表示已开工的、异常的、完工的记录,清除其他记录,并绑定部件进度表的保留记录与工序时间表对应的顺序号,步骤如下:1)有效性0表示项目确定;有效性1表示开始时间确定;有效性2表示结束时间确定;有效性3表示已作开工“作业勾选”;4表示已填报作业异常;有效性5表示已作完成“作业勾选”;2)保留有效性为3,或有效性为4或有效性为5的记录,清除部件进度表的其它数据;3)整理保留的有效性为3、或4、或5的记录,将部件进度表中按批次号、所属产品、所属部件、产品代号、部件代号、工序号、列号字段升序排序,设置批次号、所属产品、所属部件、产品代号、部件代号、工序号、列号相同的记录序号从1开始重新设置;将部件进度表中批次号、所属产品、所属部件、产品代号、部件代号、工序号相同,列号不相同的记录列号从1开始重新设置;(3)对多种具有不固定子部件级数和多道装配工序的产品采用不固定嵌套循环层数和数组的方法,根据产品从属关系、产品装配流程、生产计划、正常上班时间各单元工位数和加班时间各单元工位数五种因素,生成部件进度表所有记录项,生成所有记录项时赋值批次号、所属产品、所属部件、产品代号、部件代号、部件名称、工序号、工序名称、列号、序号、优先级、作业时长、非作业时长、有效性字段,步骤如下:1)生产计划表按批次号、产品代号、部件代号、开始时间字段升序排序;2)生产计划表按“完成情况”不等于‘完成’条件进行过滤;3)测试生产计划表记录数,记作li_row,如果li_row=0,退出本步骤;如果li_row>0,表示生产计划表有记录;4)读取生产计划表第一条记录的产品代号cpdh、部件代号ljdh、部件名称ljmc、批次号cpph、数量ljsll、优先级yxji字段的数值;5)以产品代号为cpdh、部件代号为ljdh过滤条件对装配流程表过滤,测试部件对应于装配流程表的记录数,记作g_rownumber;如果g_rownumber=0,表示装配流程表没有记录,转到下一节的内容;如果g_rownumber>0,表示装配流程表有记录,以g_rownumber为二层循环次数,以ljsll为三层循环次数;读取装配流程表第一条记录的工序号gxh和工序名称gxmc,在部件进度表中查找有没有批次号、所属产品、所属部件、产品代号、部件代号、工序号、列号都相同的记录,如果有,记作xx;那么插入ljsll条记录,记录的列号从xx到(xx+ljsll),记录的序号和有效性的值为0,记录的批次号cpph、所属产品zccp、所属部件zcbj、产品代号cpdh、部件代号ljdh、部件名称Ljmc、工序号gxh、工序名称gxmc、列号、序号、优先级yxji、有效性字段赋值;如果没有,插入ljsll条记录,记录的列号从1到ljsll、记录的序号和有效性的值为0,记录的批次号cpph、所属产品zccp、所属部件zcbj、产品代号cpdh、部件代号ljdh、部件名称Ljmc、工序号gxh、工序名称gxmc、列号、序号、优先级yxji、有效性字段赋值;然后光标指向装配流程表下一条记录……直到二层循环结束,这样就将对应的所有工序的信息设置给部件进度表中的批次号、所属产品、所属部件、产品代号、部件代号、部件名称、工序号、工序名称、列号、序号、优先级、有效性相应字段;6)将产品明细表按产品代号cpdh,部件代号ljdh字段过滤,得到产品明细表中的所有子部件;7)设置变量循环层数i,数组string zcc[20],zcb[20],long lii_row[20],赋值i=1;8)测试其记录数,记作lii_row[i],判断有没有子部件:如果lii_row[i]=0,表示没有子部件,那么生产计划表中的光标指向下一条记录,读取下一条记录的产品代号cpdh、部件代号ljdh、部件名称ljmc、批次号cpph、数量ljsll、优先级yxji、完成日期wcrq;重复步骤5)、6)、7)、8);如果lii_row[i]>0,表示有子部件,读取子部件的第一条记录的产品代号cpdh、部件代号ljdh、部件名称ljmc、所属产品zcc[i]、所属部件zcb[i]、所属数量ljsl,赋值ljsll=ljsl*ljsll;9)以产品代号cpdh、部件代号ljdh为过滤条件对装配流程表过滤,测试装配流程表记录数,记作g_rownumber;如果g_rownumber=0,表示装配流程表没有记录,转到下一节;如果g_rownumber>0,表示装配流程表有记录,表示装配流程表有记录,以g_rownumber为二层循环次数,以ljsll为三层循环次数;读取装配流程表第一条记录的工序号gxh和工序名称gxmc,在部件进度表中查找有没有批次号、所属产品、所属部件、产品代号、部件代号、工序号、列号相同的记录;如果有,记作xx,插入ljsll条记录,记录的列号从xx到xx+ljsll,记录的序号和有效性的值为0,记录的批次号cpph、所属产品、所属部件、产品代号cpdh、部件代号ljdh、部件名称ljmc、工序号gxh、工序名称gxmc、列号、序号、优先级yxji、有效性字段赋值;如果没有,插入ljsll条记录,记录的列号从1到ljsll,记录的序号和有效性的值为0,记录的批次号cpph、所属产品、所属部件、产品代号cpdh、部件代号ljdh、部件名称ljmc、工序号gxh、工序名称gxmc、列号、序号、优先级yxji、有效性字段赋值;然后光标指向装配流程表下一条记录……直到二层循环结束;这样就将对应的所有工序的信息设置给部件进度表中的批次号、所属产品、所属部件、产品代号、部件代号、部件名称、工序号、工序名称、列号、优先级、有效性相应字段;10)将产品明细表按zcc[i],zcb[i]字段过滤,得到所有子部件;11)测试子部件的记录数,记作lii_row[i+1];12)判断有没有子部件,如果lii_row[i+1]=0,表示没有子部件,那么恢复父项过滤条件;光标指向下一条记录;读取下一条记录的产品代号cpdh、部件代号ljdh、部件名称ljmc、所属产品zcc[i]、所属部件zcb[i]、所属数量ljsl,赋值ljsll=ljsl*ljsll;重复步骤9)、10)、11)、12);如果lii_row[i+1]>0,表示有子部件;赋值i=i+1;读取子部件每一条记录的产品代号cpdh、部件代号ljdh、部件名称ljmc,所属产品zcc[i],所属部件zcb[i],所属数量ljsl,赋值ljsll=ljsl*ljsll;13)重复步骤9)、10)、11)、12);14)当光标指向i级的结尾时,回到父项,设置i=i–1;判断光标是回到父项的从第1条到第li_row[i]条记录之间的一条记录还是父项的结尾记录;如果是回到父项的从第1条到第li_row[i]条记录之间的一条记录,则恢复父项的过滤条件,进行下一条记录的测试和判断;如果是回到父项的结尾记录,则进入上一层循环,再次设置i=i–1,直至i=1;15)部件进度表按批次号、所属产品、所属部件、产品代号、部件代号、部件名称、工序号、列号字段升序排序,删除批次号、所属产品、所属部件、产品代号、部件代号、部件名称、工序号、列号都相同的记录中有效性为0的记录;(4)运用一个子部件对应多个父部件,一个父部件对应多个子部件的多对多关系的对应方法,确定部件进度表保留记录的转向单元的工序号、转向工序名、转向顺序的步骤如下:优先确定有效性为3、4或5的记录的下道工序,由部件进度表有效性为3、4或5的记录的非作业时长zysc与结束时间wcrq,用连续时间相加的方法确定部件进度表下道工序或父部件第一道装配工序的开始时间的方法如下:1)测试部件进度表有效性为3、4或5的记录数,如果记录数为0,退出本步骤;如果记录数不为0,作以下处理;2)将部件进度表中按批次号、所属产品、所属部件、产品代号、部件代号、工序号、列号、序号字段升序排序,读取部件进度表中批次号、所属产品、所属部件、产品代号、部件代号、工序号、列号字段;如果读取的部件进度表中批次号、所属产品、所属部件、产品代号、部件代号、工序号、列号与上一条记录相同,则跳过;如果读取的部件进度表中批次号、所属产品、所属部件、产品代号、部件代号、工序号、列号不相同,则将上一条记录作如下处理;3)赋值wcrq的分钟记为mw;小时数记为hw,非作业时长记为zysc;4)设置记录的本班次上班时间,如果m=1,那么hs1=8,ms1=0;如果m=2,那么hs1=12,ms1=30;如果m=3,那么hs1=17,ms1=0,设置n1=n;5)如果设置部件进度表下道工序或父部件第一道装配工序的开始时间为ksrq,ksrq与当班次上班时间的时长为tysc,那么tysc=(hw‑hs1)*60+(mw‑ms1)+zysc;6)如果tysc<=210且(mw+zysc)<60,那么ksrq的分钟数为mw+zysc,小时数为hw;7)如果tysc<=210且(mw+zysc)>=60,那么ksrq的小时数为hw+int((mw+zysc)/60),分钟数为mw=mod((mw+zysc),60);8)m=m+1,读取记录的下班次数据;如果m=4,那么m=1,n=n+1;读取工序时间表工序名称为gxmc、有效性为0、次序号为n‑m的记录;如果读到记录,设工序时间表的起始时间为的小时数和分钟数分别为hs2和ms2;记录下班次的上班时间的小时数和分钟数分别为hs和ms;如果m=1,赋值hs=8,ms=0;如果m=2,赋值hs=12,ms=30;如果m=3,赋值hs=17,ms=0;如果读不到工序时间表的记录,那么回到本步骤8)开始处循环,直到读到记录,xx=(n‑n1)*1440+(hs2‑hs1)*60+(ms2‑ms1),yy=(n‑n1)*1440+(hs‑hs1)*60+(ms‑ms1)+210;9)如果tysc>210且tysc<=xx,那么ksrq的小时数为hs2,分钟数为ms2;如果tysc>xx且tysc<=yy,那么非作业时长zysc=zysc‑((n‑n1)*1440+(hs2‑hw)*60+(ms2‑mw));ksrq的小时数为hs2+int((ms2+zysc)/60),分钟数为mod((ms2+zysc),60);如果tysc>yy,那么设置hs1=hs,ms1=ms,hw=hs2,mw=ms2,回到本步骤9)开始处循环,直到tysc>xx不成立;10)判断部件进度表记录工序有没有下道工序,如果部件进度表本条记录的工序有下道工序,设置它的开始时间为ksrq,同时设置本条记录的下道工序的有效性字段为1,同时读取本条记录的下道工序的工序号、工序名称,写入本条记录转向工序号、转向工序名字段,做为工件完工勾选后的流转方向;11)如果部件进度表本条记录的工序没有下道工序,则到产品明细表中查找产品代号、部件代号、所属产品、所属部件均对应的记录的单台数记为ljsl,说明子部件与父部件的关系为ljsl条子部件对应1条父部件;读取工序号为1,序号为0的同批次号的父部件的所有子部件,其记录数记作xx1,再读取工序号为1,序号为0的同批次号的父部件,其记录数记作xx2,两者相除的结果记作xx3,表明父部件被查找xx3次其有效性就可以改为1,这样就建立了对于多个父部件对应多个子部件的多对多关系的对应的唯一性;12)如果该部件的工序号为1的父部件的记录的开始时间不为空,那么记作ksrq1,取ksrq与ksrq1的最大值为ksrq,那么该部件的父部件的工序号为1的记录的开始时间设置为ksrq;同时读取其父部件的工序号和工序名称,写入该子部件记录转向工序号、转向工序名字段,做为工件完工勾选后的流转方向;13)如果父部件的子部件对应了xx3次父部件,则将该父部件的有效性改为1;14)循环处理每条记录,循环结束后按同样的方法处理最后一条记录;15)将部件进度表不设置条件过滤,如果转向工序号为1,说明转向父部件,转向工序号不为1,说明转向下道工序;依此方法依次查找每条记录转向工序号、转向工序名对应的顺序号,填入记录的转向顺序号字段;(5)根据产品配套时间、缺件补齐时间、实际完成时间、作业异常推迟时间、优先级五种因素,运用条件符合时参与排序、把表示工件的部件进度表的开始时间与表示工位的工序时间表的起始时间作比较取最有利时间的方法、间断时间相加的方法、连续时间相加的方法、多对多关系的对应方法四种方法,生成部件进度表开始时间、结束时间、顺序号、转向工序号、转向工序名、转向顺序号的步骤如下:1)部件进度表按工序号为1且有效性为0条件过滤,确定部件进度表对应记录的有效性为1且初定部件进度表有效性为1的记录的开始时间,方法如下:测试部件进度表记录数,记作g_rownumber,如果g_rownumber=0,表示部件进度表没有可操作的记录,程序结束;如果g_rownumber>0,表示部件进度表有可操作的记录,读取部件进度表第一条记录的产品代号记作变量cpdh、部件代号记作ljdh;查找部件进度表中所属产品等于cpdh,所属部件等于ljdh,有效性为0的记录,如果查到,说明有子部件,跳出本节内容;如果查不到,表示没有子部件,将部件进度表有效性设置为1,设置部件进度表中该记录的开始时间的日期为今天today()后1天,时间为8点;依次读取部件进度表的下一条记录的产品代号记作变量cpdh、部件代号记作ljdh,重复上述内容;……经过g_rownumber次循环,取值、过滤、判断,就确定了部件进度表中每条记录的有效性是否为1,并初步确定有效性字段为1的记录的开始时间;2)初定缺件补齐时间表对应部件进度表中的记录的初始时间,方法如下:测试缺件补齐时间表的记录数为g_rownumber,如果g_rownumber>0,表示缺件补齐时间表有记录;以g_rownumber为循环次数作循环,读取缺件补齐时间表中的第一条记录的补齐日期、产品代号、部件代号,在产品明细表中查找父部件,读取父部件的所属产品、所属部件、工序名称字段数据,将作为条件,查找部件进度表中的对应记录,读取部件进度表对应记录的开始时间;如果缺件补齐时间表中的补齐日期的第二天与时间08:00合成,生成的日期时间大于部件进度表对应记录的开始时间,那么将该缺件补齐时间表中的补齐日期的第二天与时间08:00合成生成的日期时间设置给该缺件所属部件在部件进度表中对应记录的开始时间;3)工序时间表按有效性为0的过滤条件进行过滤,部件进度表按有效性1的过滤条件进行过滤;测试部件进度表的记录数记作g_rownumber,测试工序时间表的记录数记作g_rownumber1;如果都大于0,那么读取部件进度表的第一条记录;用DO…LOOP WHILE condition循环语句做以下步骤4)、5)、6)、7)、8)的处理;4)运用条件符合时参与排序、把表示工件的部件进度表的开始时间与表示工位的工序时间表的起始时间作比较取最有利时间的方法,确定有效性为1的部件进度表记录的开始时间datetime ksrq和顺序号的方法如下:部件进度表按开始时间、优先级、工序名称、批次号、所属产品、所属部件、产品代号、部件代号、列号、序号字段升序排序;工序时间表按次序号、起始时间、工序名称、顺序号字段升序排序;确定有效性为1的部件进度表记录的开始时间datetime ksrq和顺序号的方法如下:读取部件进度表第一条记录的工序名称赋值给变量gxmc、开始时间赋值给ksrq;计算ksrq为今天today()后的第几天,值赋给n,根据ksrq的小时数变量hk判断作业时间段;如果hk>=8且hk<12,那么是上午班,m=1,hs=8,ms=0;如果hk>=12且hk<=16,那么是下午班,m=2,hs=12,ms=30;hk>=17且hk<=20,那么是晚班,m=3,hs=17,ms=0;按n‑m格式合成次序号,工序时间表按工序名称为gxmc、有效性为0、次序号为(n‑m)过滤条件进行过滤,测试工序时间表的记录数li_row;如果记录数li_row大于0,读取工序时间表工序名称为gxmc、有效性为0、次序号为n‑m的第一条记录的顺序号赋值给变量yy,起始时间给变量qsrq,取qsrq和ksrq最大值赋给ksrq,设置部件进度表本条记录的开始时间为ksrq,次序号为(n‑m),顺序号为yy;如果测试工序时间表的记录数li_row不大于0,那么m=m+1;如果m=4,那么m=1,n=n+1,回到本步骤4)开始处循环,直到记录数大于0,即找到空余时间段;5)根据部件进度表开始时间和作业时长,用间断时间相加的方法确定结束时间datetime wcrq的方法如下:读取部件进度表的作业时长为zysc;设部件进度表第一条记录的结束时间wcrq的分钟记作变量int mw,小时记作变量int hw,其结束时间与上班时间的时长记作变量tysc,那么tysc=(hk‑hs)*60+(mk‑ms)+zysc,设置mw=mk+zysc;半天的工作时间3.5小时为210分钟;如果tysc<210且mw<60,那么结束时间wcrq的分钟数为mw=mk+zysc,小时数为hw=hk,设置其有效性为2,设置其完成时间为wcrq,设置工序时间表工序名称为gxmc、有效性为0、次序号为n‑m,顺序号为yy的记录的起始时间wcrq;如果tysc<210且mw>=60,那么结束时间wcrq的小时数为hw=hk+int((mk+zysc)/60),分钟数为mw=mod((mk+zysc),60),设置该记录的有效性为2,设置该记录的完成时间为wcrq,设置工序时间表工序名称为gxmc、有效性为0、次序号为n‑m,顺序号为yy的记录的起始时间wcrq;如果tysc=210,那么结束时间wcrq的小时数为hw=hk+int((mk+zysc)/60),分钟数为mw=mod((mk+zysc),60),设置该记录的有效性为2,设置该记录的完成时间为wcrq,设置工序时间表工序名称为gxmc、有效性为0、次序号为n‑m,顺序号为yy的记录的有效性为1;如果tysc>210,那么作以下处理:6)设置工序时间表工序名称为gxmc、有效性为0、次序号为n‑m的该记录的有效性为1,同时需将部件进度表对应记录拆分成两部分记录;部件进度表对应记录拆分成的第一部分记录的开始时间为原开始时间不变,hs1、ms1分别表示下班时间的小时数和分钟数;如果m=1,那么hs1=11,ms1=30;如果m=2,那么hs1=16,ms1=00;如果m=3,那么hs1=20,ms1=30;部件进度表对应记录拆分成的第一部分记录的结束时间的日期设置为今天today()后n天,时间的小时为hs1,时间的分钟为ms1;部件进度表对应记录拆分成的第一部分记录的有效性为2;部件进度表该记录第一部分记录的作业时长为(hs1‑hk)*60+(ms1–mk),部件进度表该记录第一部分记录的时长为0.00,设置工序时间表工序名称为gxmc、有效性为0、次序号为n‑m,顺序号为yy的记录的有效性为1,zysc=zysc‑(hs1‑hk)*60‑(ms1‑mk);m=m+1,如果m=4,那么m=1,n=n+1,工序时间表按工序名称为gxmc、有效性为0、次序号为(n‑m)过滤条件进行过滤;测试工序时间表的记录数li_row,如果记录数li_row大于0,插入新的记录行做为部件进度表对应记录第二部分记录,批次号、所属产品、所属部件、产品代号、部件代号、部件名称、工序号、工序名称、优先级、列号、非作业时长与原记录保持不变,其有效性值为2,作业时长为zysc;读取工序时间表工序名称为gxmc、有效性为0、次序号为n‑m的第一条记录的顺序号赋值给变量yy,起始时间给变量qsrq,将qsrq设置给部件进度表的开始时间,设置其次序号为(n‑m),顺序号为yy;如果工序时间表记录数li_row不大于0,那么回到本步骤6)开始处循环,直到记录数大于0,即找到空余时间段;确定第二部分结束时间datetime wcrq,设其结束时间wcrq的分钟记作变量int mw,小时记作变量int hw,其结束时间与上班时间的时长记作变量tysc,设qsrq的分钟数为mk,小时数为hk,那么tysc=(hk‑hs)*60+(mk‑ms)+zysc,设置mw=mk+zysc;半天的工作时间3.5小时为210分钟;如果tysc<210且mw<60,那么其结束时间wcrq的分钟数为mw=mk+zysc,小时数为hw=hk,设置其结束时间为wcrq,设置其有效性为2;设置其序号为1,如果第二部分再拆分,则第三部件序号为2,依次类推;设置工序时间表工序名称为gxmc、有效性为0、次序号为n‑m,顺序号为yy的记录的起始时间wcrq;如果tysc<210且mw>=60,那么部件进度表记录的结束时间wcrq的小时数为hw=hk+int((mk+zysc)/60),分钟数为mw=mod((mk+zysc),60);设置其结束时间为wcrq,设置其有效性为2,设置其序号为1,如果第二部分再拆分,则第三部件序号为2,依次类推;设置工序时间表工序名称为gxmc、有效性为0、次序号为n‑m,顺序号为yy的记录的起始时间wcrq;如果tysc=210,那么其结束时间wcrq的分钟数为hw=hk+int((mk+zysc)/60),小时数为mw=mod((mk+zysc),60),设置该记录的有效性为2,设置该记录的完成时间为wcrq,设置其序号为1,如果第二部分再拆分,则第三部件序号为2,依次类推;设置工序时间表工序名称为gxmc、有效性为0、次序号为n‑m,顺序号为yy的记录的有效性为1;如果tysc>210,回到步骤6)即本步骤开始处循环,直至tysc>=210不成立;这样就设置部件进度表记录的结束时间wcrq、有效性2;确定了新插入记录的次序号、顺序号、序号字段;设置工序时间表工序名称为gxmc、有效性为0、次序号为n‑m、顺序号为yy的记录的起始时间wcrq或有效性1;7)由部件进度表非作业时长zysc与结束时间wcrq,用连续时间相加的方法确定部件进度表下道工序或父部件第一道装配工序的开始时间的方法如下:赋值wcrq的分钟记为mw;小时数记为hw,非作业时长记为zysc;设置记录的本班次上班时间,如果m=1,那么hs1=8,ms1=0;如果m=2,那么hs1=12,ms1=30;如果m=3,那么hs1=17,ms1=0,设置n1=n;如果设置部件进度表下道工序或父部件第一道装配工序的开始时间为ksrq,ksrq与当班次上班时间的时长为tysc,那么tysc=(hw‑hs1)*60+(mw‑ms1)+zysc,如果tysc<=210且(mw+zysc)<60,那么ksrq的分钟数为mw+zysc,小时数为hw;如果tysc<=210且(mw+zysc)>=60,那么ksrq的小时数为hw+int((mw+zysc)/60),分钟数为mw=mod((mw+zysc),60);8)m=m+1,读取记录的下班次数据;如果m=4,那么m=1,n=n+1,读取工序时间表工序名称为gxmc、有效性为0、次序号为n‑m的记录;如果读到记录,设工序时间表的起始时间为的小时数和分钟数分别为hs2和ms2;记录下班次的上班时间的小时数和分钟数分别为hs和ms;如果m=1,赋值hs=8,ms=0;如果m=2,赋值hs=12,ms=30;如果m=3,赋值hs=17,ms=0;如果读不到工序时间表的记录,那么回到步骤8)开始处循环,至到读到记录,xx=(n‑n1)*1440+(hs2‑hs1)*60+(ms2‑ms1),yy=(n‑n1)*1440+(hs‑hs1)*60+(ms‑ms1)+210;如果tysc>210且tysc<=xx,那么ksrq的小时数为hs2,分钟数为ms2;如果tysc>xx且tysc<=yy,那么非作业时长zysc=zysc‑((n‑n1)*1440+(hs2‑hw)*60+(ms2‑mw));ksrq的小时数为hs2+int((ms2+zysc)/60),分钟数为mod((ms2+zysc),60);如果tysc>yy,那么设置hs1=hs,ms1=ms,hw=hs2,mw=ms2,回到本步骤8)开始处循环,直到tysc>xx不成立;9)运用多对多关系的对应方法找出部件进度表下道工序或父部件第一道装配工序,将开始时间和有效性赋值判断部件进度表记录工序有没有下道工序,如果部件进度表本条记录的工序有下道工序,设置它的开始时间为ksrq,同时设置本条记录的下道工序的有效性字段为1,同时读取本条记录的下道工序的工序号、工序名称,写入本条记录转向工序号、转向工序名字段,做为工件完工勾选后的流转方向;如果部件进度表本条记录的工序没有下道工序,则到产品明细表中查找产品代号、部件代号、所属产品、所属部件均对应的记录的单台数记为ljsl,说明子部件与父部件的关系为ljsl条子部件对应1条父部件;读取工序号为1,序号为0的同批次号的父部件的所有子部件,其记录数记作xx1,再读取工序号为1,序号为0的同批次号的父部件,其记录数记作xx2,两者相除的结果记作xx3,表明父部件被查找xx3次其有效性就可以改为1,这样就建立了对于多个父部件对应多个子部件的多对多关系的对应的唯一性;如果该部件的工序号为1的父部件的记录的开始时间不为空,那么记作ksrq1,取ksrq与ksrq1的最大值为ksrq,那么该部件的父部件的工序号为1的记录的开始时间设置为ksrq,同时读取其父部件的工序号和工序名称,写入该子部件记录转向工序号、转向工序名字段,做为工件完工勾选后的流转方向;如果父部件的子部件对应了xx3次父部件,则将该父部件的有效性改为1;10)用DO…LOOP WHILE condition循环语句,进行步骤4)、5)、6)、7)、8);按这种方法一直下去,当部件进度表正在确定的所有部件均没有父部件,且其对应的所有装配工序的开始时间和结束时间都确定后,即部件进度表的开始时间、结束时间、顺序号都生成后,或者工序时间表的所有记录的有效性都为1后,循环结束;11)将部件进度表不设置条件过滤,如果转向工序号为1,说明转向父部件,转向工序号不为1,说明转向下道工序,依此规则依次查找每条记录转向工序号、转向工序名对应的顺序号,填入记录的转向顺序号字段;运用天数、班次、边界时间字段的生成方法和三层循环中变量和数据的关联方法,将部件装配的最佳路径以背景色不同的甘特图方式实时显示控制工位作业的时间,方法如下:1)部件进度表按次序号、顺序号、开始时间、批次号、所属产品、所属部件、产品代号、部件代号、列号、序号字段升序排序;2)部件进度表按工序名称字段过滤条件进行过滤;3)测试部件进度表的记录数,如果等于0,表示部件进度表按上述条件过滤后没有记录,退出本步骤;4)如果部件进度表的记录数大于0,设置循环语句依次读取从部件进度表的每一条记录;5)读取部件进度表的第一条记录的次序号,用函数找出‘‑’在次序表中按从左到右的位置,记作l_i[5];取次序号从左第1个到第(l_i[5]‑1)个字符串,转换成Integer类型值,赋值给甘特图表的天数字段,从第(l_i[5]+1)个到最左边字符串,转换成Integer类型值,赋值给甘特图表班次字段;设班次字段用变量m表示;则m的值为1、2或3;如果m=1,那么hs1=8,ms1=0;如果m=2,那么hs1=12,ms1=30;m=3,那么hs1=17,ms1=0;读取部件进度表第一条记录的顺序号赋值给甘特图表的顺序号字段;读取部件进度表的第一条记录的开始时间赋给变量ksrq,结束时间赋值给变量wcrq;读取部件进度表的第一条记录的产品代号赋值给变量cpdh,部件代号赋值给变量ljdh;判断部件进度表记录的时间在甘特图表半天21个时间段的哪一段,过程是:如果不等式(hour(ksrq)‑hs1)*60+(Minute(ksrq)‑ms1)<10,同时(hour(wcrq)‑hs1)*60+(Minute(wcrq)‑ms1)>0则查找甘特图表本条记录S10字段是否有数据,如果没有,将变量string(cpdh+’‑’+ljdh)赋值给S10字段;如果不等式(hour(ksrq)‑hs1)*60+(Minute(ksrq)‑ms1)<20,同时(hour(wcrq)‑hs1)*60+(Minute(wcrq)‑ms1)>10则查找甘特图表本条记录S20字段是否有数据,如果没有,将变量string(cpdh+’‑’+ljdh)赋值给S20字段;如果不等式(hour(ksrq)‑hs1)*60+(Minute(ksrq)‑ms1)<30,同时(hour(wcrq)‑hs1)*60+(Minute(wcrq)‑ms1)>20则查找甘特图表本条记录S30字段是否有数据,如果没有,将变量string(cpdh+’‑’+ljdh)赋值给S30字段;……用同样的方法一直到判断部件进度表记录的时间是否在甘特图表半天第21个时间段;如果不等式(hour(ksrq)‑hs1)*60+(Minute(ksrq)‑ms1)<210,同时(hour(wcrq)‑hs1)*60+(Minute(wcrq)‑ms1)>200则查找甘特图表本条记录S210字段是否有数据,如果没有,将变量string(cpdh+’‑’+ljdh)赋值给S210字段;6)读取部件进度表的第二条记录的次序号赋值给字符型变量zcc,用函数找出‘‑’在zcc中按从左到右的位置,记作l_i;取zcc从左第1个到第(l_i[5]‑1)个字符串,转换成Integer类型值赋值给数值型变量n;从第(l_i[5]+1)个到最左边字符串,转换成Integer类型值赋值给数值型变量m,读取部件进度表第二条记录的顺序号设置给数值型变量l_i;查找甘特图表中天数等于n,班次等于m,顺序号等于l_i的记录,如果查找到,表明甘特图表有符合条件的记录,记作li_row;如果查不到,表明甘特图表没有符合条件的记录,在甘特图表插入新的记录,记录号为li_row,插入的甘特图表的新记录的天数字段赋值为n,班次字段赋值为m,顺序号字段赋值为l_i;m的值为1、2或3;如果m=1,那么hs1=8,ms1=0;如果m=2,那么hs1=12,ms1=30;m=3,那么hs1=17,ms1=0;读取部件进度表的第二条记录的开始时间赋给变量ksrq,结束时间赋值给变量wcrq;读取部件进度表的第二条记录的产品代号赋值给变量cpdh,部件代号赋值给变量ljdh;判断部件进度表记录的时间在甘特图表半天21个时间段的哪一段,过程是:如果不等式(hour(ksrq)‑hs1)*60+(Minute(ksrq)‑ms1)<10,同时(hour(wcrq)‑hs1)*60+(Minute(wcrq)‑ms1)>0则查找甘特图表本条记录S10字段是否有数据,如果没有,将变量string(cpdh+’‑’+ljdh)赋值给S10字段;如果不等式(hour(ksrq)‑hs1)*60+(Minute(ksrq)‑ms1)<20,同时(hour(wcrq)‑hs1)*60+(Minute(wcrq)‑ms1)>10则查找甘特图表本条记录S20字段是否有数据,如果没有,将变量string(cpdh+’‑’+ljdh)赋值给S20字段;如果不等式(hour(ksrq)‑hs1)*60+(Minute(ksrq)‑ms1)<30,同时(hour(wcrq)‑hs1)*60+(Minute(wcrq)‑ms1)>20则查找甘特图表本条记录S30字段是否有数据,如果没有,将变量string(cpdh+’‑’+ljdh)赋值给S30字段;……用同样的方法一直到判断部件进度表记录的时间是否在甘特图表半天第21个时间段;如果不等式(hour(ksrq)‑hs1)*60+(Minute(ksrq)‑ms1)<210,同时(hour(wcrq)‑hs1)*60+(Minute(wcrq)‑ms1)>200则查找甘特图表本条记录S210字段是否有数据,如果没有,将变量string(cpdh+’‑’+ljdh)赋值给S210字段;7)依次读取部件进度表的第三条到最后一条记录,用步骤6)的方法完成甘特图表数据的赋值。
地址 211153 江苏省南京市江宁区将军大道528号