案例7:天然气管网供应系统仿真
7.1 流程描述
- 案例描述
某地一个天然气供应网络由一个中心站和两个分站构成。中心站的储存能力为10万方、每个分站的储存能力为3万方。两个分站为终端客户供应天然气,终端客户天然气消耗量具有一定的随机性,分站1每小时的消耗量是服从范围(100,200)方/小时的均匀分布,分站2每小时的消耗量是服从范围(85,260)方/小时的均匀分布;中心站既要满足两个分站的天然气需求,也要向其终端用户供应天然气,中心站终端客户的需求速率为服从范围(150,350)方/小时的均匀分布。
期初中心站罐容6.5万方,两个分站的罐容分别是1.2万方,中心站与两个分站之间的输送管道充满,管容均为1000方。
当中心站储气储量降低至3万方时,其上游供应商输送一个批次天然气,输送速率为1200方/小时,直到充满罐容的95%
当两个分站天然气储量降低至1万方时,中心站按照速率400方/小时向分站运送天然气,直至充满罐容的95%。
- 仿真目标
试建立上述天然气管网供应系统的仿真模型,运行30天= 24*30 = 720小时,观察与分析该地天燃气供应网络的运行与产能情况。
- 建模分析
在本案例中的输送和营运的对象是天然气,是一种连续型“Fluid”流体元素,它的到达与使用是由天然气供应网络中的其它设备决定的,因此在模型中创建一个“Passive”类型的“Fluid”元素代表它,命名为“天然气”,该元素即为案例流程中的气源地。
供应网络中的三个站,实际就是一个天然气的存储装置,因此创建三个Tank储罐元素,分别命名为“中心站”、“分站1”、“分站2”,分别代表中心站和两个分站。
创建6个pipe管道元素代表天然气供应网络中,气源地、储气站、终端客户之间的分输管道。其中:“Pipe1”连接气源地与中心站, “Pipe2”连接中心站与分站1,“Pipe3”连接中心站与分站2,“Pipe4”连接分站1与其终端客户,“Pipe5”连接分站2与其终端客户,“Pipe6”连接中心站与其终端客户。
创建三个开关变量:Key_center、Key_sub1、Key_sub2分别用来监控中心站、分站1、分站2的罐容水平,根据这些开关变量的变化来打开或关闭供应网络中的从气源地到中心站、从中心站到分站的输送,从而实现该天然气供应网络的运营逻辑。
- 建模步骤
- 启动BHTC Simulation仿真系统,点击控制面板上的“新建模型”按钮,开始模型构建过程。
- 设施布局:
✤ 使用设计模版,分别点击“流体”、“储罐”、“管道”图标,根据提示创建上述建模分析中说明的气源地、储气站、输送管道元素,并在屏幕上对它们适当布局,结果如下图所示。

✤ 继续点击设计模版上的“变量”图标创建三个监控储罐罐容水平的开关变量:Key_center、Key_sub1、Key_Sub2。
- 参数定义:
✤ 双击模型结构树上的“天然气”元素节点,打开它的属性对话框,如下图所示,点击选择“流体类型”为“Passive”,然后点击“确认”按钮关闭属性对话框,完成“天然气”元素属性定义。

✤ 双击模型结构树上的“Pipe1”元素节点,打开它的属性对话框,输入它的流程参数。如下:
| 设备 名称 | Fill from 逻辑 | 管道容量 | 管道额定流速 | Flow to 逻辑 |
| Pipe1 | IF Key_center = 1 Then connect_with = array(“天然气”) END IF | 1000 | 1200 | connect_with = array(“中心站”) |
案例中并未说明从气源地到中心站的输送管道的长度,这里就使用缺省值“1000”方,“Pipe1”管道的输入逻辑(见表中的”Fill from”描述)是:当开关变量Key_center = 1,才使用流体输入规则语句与气源地元素连接,以“Pipe1”管道的额定速度“1200方/小时”从气源地输送“天然气”到中心站,因为管道容量很小,这样1小时之内天然气就可送达中心站,不会因输送距离影响中心站天然气的供应。
✤ 双击模型结构树上的“中心站”元素节点,打开它的属性对话框,输入它的流程参数。如下:
| 设备 名称 | Fill from逻辑 | 初始流体 | 初始容量 | 储罐容量 | Flow to 逻辑 |
| 中心站 | 无 | “天然气” | 65000 | 100000 | connect_with = array(“Pipe6”) |
在“Pipe1”元素中的“Flow to”逻辑中已经定义了将管道中的“天然气”输送到“中心站”的逻辑,因此在“中心站的”输入逻辑“Fill from”代码中无需再重复定义,保持为空即可。
在中心站的“Flow to”输出逻辑中,将“中心站”与分输管道“Pipe6”连通起来,只要“中心站”储罐有罐容,就会一直按照“Pipe6”管道的流速,向“Pipe6”管道内输送“天然气”,而“Pipe6”管道连接的正是“中心站”自己需要直接供应的终端用户。
✤ 双击模型结构树上的“Pipe2”元素节点,打开它的属性对话框,输入它的流程参数。如下:
| 设备 名称 | Fill from 逻辑 | 初始流体 | 管道容量 | 管道额定流速 | Flow to 逻辑 |
| Pipe2 | connect_with = array(“中心站”) | 天然气 | 1000 | 400 | IF Key_sub1 = 1 Then connect_with = array(“分站1”) END IF |
案例中并未说明从“中心站”到“分站1”的输送管道的长度,这里就使用缺省值“1000”方,并且对“Pipe2”管道设置了初始流体“天然气”。在BHTC Simulation系统中,一旦“Pipe”管道元素被设置了初始流体,那么在模型仿真运行的初始时刻,该“Pipe”元素管道内就充满了初始流体,这也符合实际的管网分输系统的通行规则。在“Pipe2”管道的输出逻辑“Flow to”中设定了规则:只要监控“分站1”开关变量Key_sub = 1 就立即将“Pipe2”与“分站1”连通,因为“Pipe2”管道已经充满了天然气,因此一旦连通就立即向“分站1”储罐中按“400方/小时”的流速输送天然气。
重复上述操作,定义连接“中心站”与“分站2”之间的“Pipe3”管道元素的属性参数,如下表所示:
| 设备 名称 | Fill from 逻辑 | 初始流体 | 管道容量 | 管道额定流速 | Flow to 逻辑 |
| Pipe3 | connect_with = array(“中心站”) | 天然气 | 1000 | 400 | IF Key_sub2 = 1 Then connect_with = array(“分站2”) END IF |
✤ 双击模型结构树上的“分站1”元素节点,打开它的属性对话框,输入它的流程参数。如下:
| 设备 名称 | Fill from逻辑 | 初始流体 | 初始容量 | 储罐容量 | Flow to 逻辑 |
| 分站1 | 无 | “天然气” | 12000 | 30000 | connect_with = array(“Pipe4”) |
在“Pipe2”元素中的“Flow to”逻辑中已经定义了将管道中的“天然气”输送到“分站1”的逻辑,因此在“分站1”的输入逻辑“Fill from”代码中无需再重复定义,保持为空即可。
在“分站1”的“Flow to”输出逻辑中,将“分站1”与分输管道“Pipe4”连通起来,只要“分站1”储罐有罐容,就会一直按照“Pipe4”管道的流速,向“Pipe4”管道内输送“天然气”,而“Pipe4”管道连接的正是“分站1”自己需要直接供应的终端用户。
重复上述操作,定义“分站2”元素的属性参数,如下表所示:
| 设备 名称 | Fill from逻辑 | 初始流体 | 初始容量 | 储罐容量 | Flow to 逻辑 |
| 分站2 | 无 | “天然气” | 12000 | 30000 | connect_with = array(“Pipe5”) |
✤ 双击模型结构树上的“Pipe4”元素节点,打开它的属性对话框,输入它的流程参数。如下
| 设备 名称 | Fill from 逻辑 | 初始流体 | 管道容量 | 管道额定流速 | Flow to 逻辑 |
| Pipe4 | 无 | 无 | 1000 | MM_System_Math_uniform(100, 200) | connect_with= array(“ship”) |
在“分站1”元素中的“Flow to”逻辑中已经定义了将储罐中的“天然气”输送到“Pipe4”管道的逻辑,因此在“Pipe4”管道自身的输入逻辑“Fill from”代码中无需再重复定义,保持为空即可。“Pipe4”管道元素代表的是由“分站1”向其终端用户供应天然气的分输管道,因此,如上表所示,我们使用管道的额定流速代表其终端用户天然气需求。
重复上述操作,分别定义“分站2”、“中心站”向各自终端用户供应天然气的分输管道属性参数,如下表所示:
| 设备 名称 | Fill from 逻辑 | 初始流体 | 管道容量 | 管道额定流速 | Flow to 逻辑 |
| Pipe5 | 无 | 无 | 1000 | MM_System_Math_uniform(85, 260) | connect_with= array(“ship”) |
| 设备 名称 | Fill from 逻辑 | 初始流体 | 管道容量 | 管道额定流速 | Flow to 逻辑 |
| Pipe6 | 无 | 无 | 1000 | MM_System_Math_uniform(150, 350) | connect_with= array(“ship”) |
✤ 接下来定义模型中三个开关变量的变化逻辑。双击模型结构树上的“中心站”节点,打开它的属性对话框,点击左上角的“报警”选项卡,将属性对话框切换至“报警”选项卡如下图所示:

如图,在液面升高报警属性框中,输入高液面位置“95000”方,点击“Rising Action”按钮,打开代码编辑框,录入代码:Key_center = 0 然后关闭代码框,点击图中的“增加”按钮,为“中心站”储罐增加一条高液面位置报警,涵义就是当储罐中的液面位置升高至罐容的95%时,就触发执行报警代码,即令开关变量Key_center = 0,这样就会切断气源地与中心站的连接,停止向“中心站”供气。如图。继续在液面下降报警属性框中,输入低液面位置“30000”方,点击“Falling Action”按钮,打开代码编辑框,录入代码:Key_center = 1 然后关闭代码框,点击图中的“增加”按钮,为“中心站”储罐增加一条低液面位置报警,涵义就是当储罐中的液面位置下降至“30000”方时,就触发执行报警代码,即令开关变量Key_center = 1,这样就会再次建立气源地与中心站的连接,开始向“中心站”供气。
类似地,重复上述操作,定义监控两个分站罐容水平的开关变量Key_sub1、Key_sub2的变化逻辑,如下图所示:

- 仿真运行
在控制面板的“仿真时长”输入框内输入“720”,点击“运行模型”按钮,运行仿真。
观察仿真的动画过程可以看出,仿真开始运行时,三个储气站立即通过三根管道“Pipe4”、“Pipe5”、“Pipe6”向其终端用户分输天然气。一段时间后很快两个分站液面水平降至其“低液面”报警线,这时系统触发由“中心站”向“分站”供气机制,“中心站”开始向两个分站分别供气,直至“分站”液面到达其“高液面”报警位置而停止供气。在“中心站”向“分站”供气的过程中,“中心站”的液面位置迅速降低至“低液面”报警线,触发气源地的供应机制,气源地开始向“中心站”通过管道“Pipe1”供气直至“中心站”液面到达“高液面”报警线而停供。随着时间的进行,上述的天然气供应过程,不断地循环往复进行,直至仿真结束。
仿真结束后,勾选模型结构树上气源地输气管道“Pipe1”节点点击报表工具栏上“管道报表”按钮,获得它的统计信息如下:
| 管道名称 | Volume in | Volume Out | Volume Now | Idle时间占比 | Flow时间占比 | Setup时间占比 | BreakDwn时间占比 |
| Pipe1 | 320000 | 320000 | 0 | 62.615 | 37.384 | 0 | 0 |
由表中统计数据可以看出,本案例天然气供应网络在30天的运行中,共计从上游气源地输入32万方天然气,输气管道利用率较高,超过60%。
类似的取得三个连接终端客户输送管道Pipe4、Pipe5、Pipe6的统计数据如下:
| 管道名称 | Volume in | Volume Out | Volume Now | Idle时间占比 | Flow时间占比 | Setup时间占比 | BreakDwn时间占比 |
| Pipe4 | 88689.02 | 87689.02 | 1000 | 0.089 | 99.91 | 0 | 0 |
| 管道名称 | Volume in | Volume Out | Volume Now | Idle时间占比 | Flow时间占比 | Setup时间占比 | BreakDwn时间占比 |
| Pipe5 | 89746.32 | 88746.32 | 1000 | 0.089 | 99.91 | 0 | 0 |
| 管道名称 | Volume in | Volume Out | Volume Now | Idle时间占比 | Flow时间占比 | Setup时间占比 | BreakDwn时间占比 |
| Pipe6 | 137059.3 | 136059.3 | 1000 | 0.089 | 99.91 | 0 | 0 |
合计30天中,给终端用户供应天然气总量为(即本案例天然气供应网络的产能):
312494.64方(87689.02 + 88746.32 + 136059.3)
类似的取得三个储气站的统计数据如下:
| Tank名称 | Volume in | Volume Out | Volume Now | 满罐时间占比 |
| 中心站 | 385000 | 316125.9 | 68874.06 | 0 |
| Tank名称 | Volume in | Volume Out | Volume Now | 满罐时间占比 |
| 分站1 | 100800.1 | 88689.02 | 12110.99 | 0 |
| Tank名称 | Volume in | Volume Out | Volume Now | 满罐时间占比 |
| 分站2 | 102266.7 | 89746.32 | 12520.36 | 0 |
从三个储气站各自当前罐容量中,减掉各自的初始罐容即得到在30天运营后,比期初多出的天然气量 = (68874.06 – 65000) + (12110.99 – 12000.0) + (12520.36 – 12000)= 4505.41方,另外期初时刻三根终端用户的分输管道皆为空,30天结束后,当前Pipe4、Pipe5、Pipe6均有1000方罐容,这样合计起来,30天结束后本案例供应网络中共计比期初多出 4505.41 + 3000.0 = 7505.41方天然气,在此基础上,再加上三根终端用户管道30天合计给终端用户供气量:312494.64方,即系统总计比期初多出:312494.64方 + 7505.41 = 320000.05方,这与系统从气源地管道Pipe1获得天然气量32万方数字吻合。
点击模型结构树上的“天然气”节点,取得它的统计信息如下:
| Fluid名称 | Volume Total in | Volume Rejected | Volume Shipped | Volume in Process |
| 天然气 | 411000.0 | 0 | 312494.6.06 | 98505.41 |
由表可知,经过运行30天的运行,总计有41.1万方天然气进入系统。本案例天然气供应网络有两个渠道进入天然气,一是通过管道“Pipe1”从上游气源地调运天然气,从“Pipe1”的统计信息可知,30天共计调运了32万方天然气进入系统;另一个渠道就是在系统运行期初,三个储气站、以及连接中心站与分站的两根管道分别有期初存量,分别为:6.5万方 + 1.2万方 + 1,2万方 + 0.2万方 = 9.1万方,这样32万方 + 9.1万方 = 41.1万方,与“天然气”节点的统计信息一致。
“天然气”统计信息表中“Volume Shipped”一项数据为30天累计离开系统的天然气总量,这一数据与“Pipe4”、“Pipe5”、“Pipe6”终端用户输气管道30天累计给终端用户供应天然气总量一致。
“天然气”统计信息表中“Volume in Process”一项数据为当前还留存在系统中的天然气存量98505.41方。检查当前系统各设备的存量,三个储气站分别是:68874.06方 + 12110.99方 + 12520.36方 = 93505.41方,在加上系统当前5个输气管道的存量5000方,总计系统当前设备中的天然气存量 = 93505.41 + 5000 = 98505.41,这一数据与“天燃气”节点的统计数据一致。
7.2 案例小结
通过本案的学习了解和掌握Fluid元素、Tank元素、Pipe元素的使用方法,以及如何使用它们的相互配合,建立连续体工业流程系统的仿真模型。
