全球FlexSim系统仿真中文论坛
标题: FlexSim案例三 货架与全局表动态关联 [打印本页]
作者: Yumaotuo 时间: 2018-4-26 11:33
标题: FlexSim案例三 货架与全局表动态关联
本帖最后由 Yumaotuo 于 2018-4-26 11:35 编辑
1、案例描述
设置货架的行数、列数,自动根据其行列数绘制相应行列数的全局表,并自动填充行表头和列表头,在全局表内填入1表示相应货格可以放置货物,然后货架对全局表进行全面检索,根据1的位置将货物放置到相应货格,摆放成想要的图案。
2、模型布局
[attach]4298[/attach]
3、代码编写
代码主要集中在放置到层、放置到列、重置触发、进入触发、离开触发中。
重置触发
//计算图形总共需要临时实体的个数
int baynum = rackgetnrofbays(current);//统计货架列数和行数以便绘制全局表
int levelnum = rackgetnroflevels(current);
settablesize("xin",levelnum,baynum);//对全局表的行列数进行绘制
//对全局表的行表头、列表头填写以便对照
for(int i = 1;i <= levelnum;i++)
{
settableheader("xin",1,i,concat("第",numtostring(levelnum+1-i),"行"));
}
for(int j = 1;j <= baynum;j++)
{
settableheader("xin",2,j,concat("第",numtostring(j),"列"));
}
//对全局表进行 1 的扫描,计算1的个数
int rownum = gettablerows("xin");
int colnum = gettablecols("xin");
int sum;
for(int i = 1;i <= rownum;i++)
{
for(intj = 1;j <= colnum;j++)
{
sum= sum+gettablenum("xin", i, j);
}
}
setlabel(current,1,sum);//赋值标签以备关闭进入端口
进入触发
//如果货架当前数量等于图形所需数量则关闭进入端口,等待处理一段时间再打开
int zongshu = getlabel(current,1);
int rackcontent = content(current);
//int input = getinput(current);
if(rackcontent == zongshu)
{
closeinput(current);
}
离开触发
//货物离开后发现货架有空余的货格那么打开端口继续进货
int zongshu = getlabel(current,1);
int rackcontent = content(current);
if(rackcontent+1 == zongshu)
{
openinput(current);
}
放置到列
//通过对全局表的每一个值进行扫描,获取数值1所在的列值
int input = getinput(current);
int rownum = gettablerows("xin");//统计全局表的行列数,动态变化
int colnum = gettablecols("xin");
int sum = 0;
int baynum = 0;
for(int i = 1;i <= rownum;i++)//对全局表每一行扫描
{
for(intj = 1;j <= colnum;j++)//对全局表每一列扫描
{
sum= sum+gettablenum("xin", i, j);
if(sum== input)//如果sum等于了进入数量,说明扫描到了1,那么获取其列号j
{
baynum= j;
i= rownum+1;//找到1就不在执行最初的for循环
pt("(");//打印出临时实体坐标值(列,行)
pd(baynum);
pt(",");
break;
}
//如果第一遍的货架排放完成后,那么执行下面的语句对货架填补
if(sum!= input&&i == rownum)
{
for(intk = 1;k <= rownum;k++)
{
for(intm = 1;m <= colnum;m++)
{
intpanduan = gettablenum("xin",k,m);//判断表格中的位置是否是关键1的位置
intcellnum = rackgetcellcontent(current,m,rownum+1-k);//获取上面关键位置1所代表的货架上关键货格的当前容量
if(panduan== 1&&cellnum == 0)//如果此位置是1关键位置,并且关键货格没有货物那么填补货物
{
baynum= m;
k= rownum+1;
break;
}
}
}
}
}
}
return baynum;
放置到层
//通过对全局表的每一个值进行扫描,获取数值1所在的 行 值
int input = getinput(current);
int rownum = gettablerows("xin");//统计全局表的行列数,动态变化
int colnum = gettablecols("xin");
int sum = 0;
int levelnum = 0;
for(int i = 1;i <= rownum;i++)
{
for(intj = 1;j <= colnum;j++)
{
sum= sum+gettablenum("xin", i, j);
if(sum== input)//如果sum等于了进入数量,说明扫描到了1,那么获取其行号i
{
levelnum= rownum+1-i;//由于货架的行号和全局表行号相反,要进行简单处理
i= rownum+1;
pd(levelnum);//打印出临时实体坐标值
pt(");");
pr();
break;
}
//如果第一遍的货架排放完成后,那么执行下面的语句对货架填补
if(sum!= input&&i == rownum)
{
for(intk = 1;k <= rownum;k++)
{
for(intm = 1;m <= colnum;m++)
{
int panduan =gettablenum("xin",k,m);//判断表格中的位置是否是关键1的位置
intcellnum = rackgetcellcontent(current,m,rownum+1-k);//获取上面关键位置1所代表的货架上关键货格的当前容量
if(panduan== 1&&cellnum == 0)//如果此位置是1关键位置,并且关键货格没有货物那么填补货物
{
levelnum= rownum+1-k;
k = rownum+1;
break;
}
}
}
}
}
}
return levelnum;
本模型通过利用for循环进行检索,及相应货架、全局表脚本语言进行编写,大家可以编写不同的逻辑来尝试一下~~~
作者: WangQinqin 时间: 2018-4-26 11:38
学习学习~
作者: 冯小辉 时间: 2018-4-26 20:58
厉害,,谢谢分享
作者: 非凡 时间: 2018-4-28 10:51
很好的分享,要好好研究一下
作者: Lucy 时间: 2018-5-2 15:04

作者: wubing 时间: 2018-5-7 20:36
谢谢
作者: st0614455 时间: 2018-7-3 16:13
很好得分享
作者: 18678957290 时间: 2018-7-30 10:43
厉害
作者: 王婉珍 时间: 2019-6-10 13:15
厉害,尝试下
作者: hg6036051 时间: 2019-8-27 08:52
6666
作者: taiheilam2 时间: 2019-10-2 13:21
感谢分享
作者: summer1 时间: 2020-12-17 20:00
感谢
作者: HZQ123 时间: 2021-11-29 08:53
有点懵呀
作者: richwater 时间: 2022-6-28 17:18
厉害,没怎么看懂,但思路大致明白
作者: bgw 时间: 2022-11-25 15:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: 十二 时间: 2023-4-7 10:51
感谢分享,要好好研究一下啦!
作者: daf 时间: 2023-5-9 14:16
很好得分享
欢迎光临 全球FlexSim系统仿真中文论坛 (http://www.flexsimasia.com/) |
Powered by Discuz! X3.3 |