全球FlexSim系统仿真中文论坛

搜索
查看: 16516|回复: 16

FlexSim案例三 货架与全局表动态关联

[复制链接]
Yumaotuo 发表于 2018-4-26 11:33:06 | 显示全部楼层 |阅读模式
本帖最后由 Yumaotuo 于 2018-4-26 11:35 编辑

1、案例描述

设置货架的行数、列数,自动根据其行列数绘制相应行列数的全局表,并自动填充行表头和列表头,在全局表内填入1表示相应货格可以放置货物,然后货架对全局表进行全面检索,根据1的位置将货物放置到相应货格,摆放成想要的图案。
2、模型布局


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循环进行检索,及相应货架、全局表脚本语言进行编写,大家可以编写不同的逻辑来尝试一下~~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 1威望 +10 收起 理由
非凡 + 10 赞一个!

查看全部评分

冯小辉 发表于 2018-4-26 20:58:22 | 显示全部楼层
厉害,,谢谢分享
非凡 发表于 2018-4-28 10:51:25 | 显示全部楼层
很好的分享,要好好研究一下
st0614455 发表于 2018-7-3 16:13:33 | 显示全部楼层
很好得分享
王婉珍 发表于 2019-6-10 13:15:04 | 显示全部楼层
厉害,尝试下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|全球FlexSim系统仿真中文论坛 ( 京ICP备14043114号-2 )

GMT+8, 2024-3-29 16:57 , Processed in 0.079450 second(s), 16 queries .

Powered by Discuz! X3.3© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表