中铁十二局集团电气化工程有限公司 天津 300308
摘要 通过将软横跨的手工计算过程转换为Excel能够识别处理的Excel函数、VBA程序模块,用VBA设计良好的数据输入输出交互窗口,再将分散的程序、窗口、模块整体组合联系起来,成为一个计算系统,实现Excel预制接触网软横跨
0 前言
在目前的接触网施工中,接触网软横跨的预制计算主要有两种。一种是手工预制接触网软横跨,这是一项繁琐、重复的计算过程,计算量很大,手工计算费时费力而且容易出错。一种是由专业的软件制作团队制作的接触网软横跨预制软件。目前接触网软横跨预制主要有autolisp、C++等开发,但是此类程序的编写需要程序制作的专业人士完成。
而利用Excel中自带的函数及VBA编程工具编制一些相对简单的程序就能完成复杂的软横跨预制计算。其中部分计算过程可以由Excel自带的函数计算,而一些较为复杂的计算过程,则可以通过Excel中自带的VBA编程工具通过编写程序代码实现。该方法综合了手工计算与专业软件的优势,既弥补了手工计算繁琐易错的缺陷,又无需技术人员具备专业的软件知识便可掌握,填补了接触网软横跨预制领域的空白。
过VBA实现Excel预制接触网软横跨可以分为参数搜集测量、建立计算模块、设计建立窗口、程序整体设计和程序的调试修改等几个步骤。预制的过程是一个循序渐进的过程,前面参数的搜集测量和计算出的结果为最终的计算做铺垫。接触网软横跨的预制过程是环环相扣的,因此在整个开发过程中需要仔细严谨的对待。
1参数搜集测量
对接触网软横跨预制计算进行VBA编程开发,首先要获取计算所需的相关参数。有些是图纸或规程直接可以得到的参数,如:支柱的尺寸、线材的线密度、各种金具绝缘子的质量尺寸等。还有就是需要通过现场测量得到的参数,如:侧面限界、股道间距、股道高差、支柱斜率、支柱地面到正线轨平面的距离。
2将计算公式转换为Excel函数或者VBA语言,建立计算模块
一般简单的计算通过Excel自带的函数就能解决,但是如果碰到反复的计算、有循环的计算、需要条件判断的计算,就需要通过编写VBA 程序模块来解决。
接触网软横跨预制计算可以根据所求的过程建立模块,软横跨的手工计算的流程是:①横向承力索驰度F1、F2的计算;②偏移距离a1、a2、a3、b1、b2、b3的计算;③各节点负载Q1、Q2、Q3…的计算;④确定横向承力索最低点,最低点到左侧横向承力索悬挂点L1,最低点到横向承力索右侧悬挂点L2;⑤子力矩M1、M2的计算;⑥横向承力索水平分力T的计算;⑦横向承力索各股道悬挂点至支柱悬挂点的高差m1、m2、m3…的计算。如图1所示。
图1 软横跨预制示意图
2.1各节点负载的计算
每个节点的负载由纵向悬挂负载G,节点零件负载J,横向承力索与上、下部定位绳总重P,绝缘子总重Z组成。由于需要事先对节点类型等进行判断,所以用VBA的条件语句判断之后再套用公式比直接在Excel中计算要简便。负载计算程序如下:
Function jd_fz(a1, a2, a0, m, gc, gj, l, gFJL, ggd, p1, p2, p0, gjyz, cp1, cp2, cp0, nFJL) As Double
‘声明模块名称及所需输入的数据名称类型
Dim c1, c2,c3,n As Integer
‘声明计算过程中需要的变量
If m = 6 Or m = 7 Or m = 10 Then n = 2 Else If m = 0 Then n = 0 Else n = 1
‘通过节点类型判断悬挂承导线的根数,6、7、10型节点为2,0型节点为0,其他类型为1
If p1 = 8 Or p1 = 1 Or p1 = 2 Or p1 = 3 Or p1 = 4 Then c1 = 3 Else If p1 = 9 Then c1 = 4 Else c1 = 0
‘通过节点类型判断悬挂绝缘子的数量,8、1、2、3、4型节点为3个,9型节点为4个,其他类型0个
jd_fz = n * (gc + gj) * l + c1 * cp1 * gjyz * 0.5 + 5 * n + (a1 + a2) * (nFJL * gFJL + 2 * ggd) * 0.5 + c2 * cp2 * gjyz * 0.5
‘计算节点负载公式
End Function
‘程序结束,返回计算结果
然后再在Excel单元格中对模块程序调用,调用方法为在单元格中输入=jd_fz(引用各数据所在单元格)。如=jd_fz(A1,B2,C3,D4,…),这样就能得到节点的负载值。
2.2最低点判断
Function P_Low(a1, a2, a3, a4, a5, a0, g1, g2, g3, g4, g5) As Double
‘声明模块名称及所需输入的数据名称类型,该程序以5股道为例,可以根据实际股道数对程序进行修改
Dim n As Integer
Dim c1, c2, c3, c4, c5, c , FN1, FP, gt, FN2 As Double
‘声明计算过程中需要的变量
c1 = a1
c2 = c1 + a2
c3 = c2 + a3
c4 = c3 + a4
c5 = c4 + a5
c = c5 + a0
‘求负载力矩
FN1 = (g1 * c1 + g2 * c2 + g3 * c3 + g4 * c4 + g5 * c5) / c
‘求支柱反力FN1
gt = g1 + g2 + g3 + g4 + g5
‘求节点总负载
FN2 = gt - FN1
’求支柱反力FN2
FP = FN2
n = 1
FP = FP - g1
If FP <= 0 Then GoTo 100
n = n + 1
FP = FP - g2
If FP <= 0 Then GoTo 100
n = n + 1
FP = FP - g3
If FP <= 0 Then GoTo 100
n = n + 1
FP = FP - g4
If FP <= 0 Then GoTo 100
n = n + 1
FP = FP - g5
If FP <= 0 Then GoTo 100
100 P_Low = n
‘FP减去负载1,当FP大于零时,程序继续执行减负载2、负载3…,每减一次n数值自动加1。当FP减小到小于零时,该点为最低点,程序跳转至P_Low=n,此时n的值就是最低点的值。
End Function
‘程序结束,返回计算结果
当最低点确定之后,它到支柱两端悬挂点的距离L1、L2就能很容易的计算出来。
2.3分界力T的求解
Function FJL_T(n, FN1, f1, a1, a2, a3, a4, a5, g1, g2, g3) As Double
‘声明模块名称及所需输入的数据名称类型
Dim c1, c2, c3, c4, fn As Double
‘声明计算过程中需要的变量
c1 = a1 + a2 + a3 + a4 + a5
c2 = a2 + a3 + a4 + a5
c3 = a3 + a4 + a5
c4 = a4 + a5
‘对股道间距求和方便下面的计算
fn = FN1
将支柱反力赋值给fn,FN1为上步P_Low程序模块所求的支柱反力
Select Case n
‘根据表达式的值,来决定执行几组语句中的其中之一。n为上P_Low程序模块所求最低点的值。当n=1时,执行Case Is = 1,FJL_T = "股道1无法为最低";当n=2时,执行Case Is = 2,FJL_T = (fn * (c1 - c3) - g1 * a2) / f1;以此类推。
Case Is = 1
FJL_T = "股道1无法为最低"
Case Is = 2
FJL_T = (fn * (c1 - c3) - g1 * a2) / f1
Case Is = 3
FJL_T = (fn * (c1 - c4) - g1 * (c2 - c4) - g2 * a3) / f1
Case Is = 4
FJL_T = (fn * (c1 - c5) - g1 * (c2 - c5) - g2 * (c3 - c5) - g3 * a4) / f1
Case Is = 5
FJL_T = "股道5无法为最低"
Case Else
FJL_T = "数据错误"
End Select
‘Select case语句结束
End Function
‘程序结束
m1、m2…的求解以最低点为分界点,根据公式,左侧mi=[FN1(a1+ai)-Q(i-1)*ai]/T,右侧mj=[FN2(b1+aj)-Q(j-1)*aj,即可以求出横向承力索各分段长度的高差。
3数据输入输出窗体的设计、建立
在VBA程序窗口的菜单栏选择插入用户窗体,插入相关的控件,如标签、文字框等,组合成如图2所示的人机交互窗口。
图2 数据输入交互窗口
把数据输入窗口建立好以后,将数据框内的数据赋值到相应的单元格或者程序当中。用VBA程序语言表示为
Private Sub CommandButton1_Click()
‘声明当按确定按钮后,程序触发,给单元格或者程序赋值。Private表示该程序过程只对该窗口有效。
Range("C2").Value = TextBox1.Text
Range("C8").Value = TextBox23.Value
‘将窗口中的数据或文本赋值到对应的单元格或程序中
UserForm1.Hide
‘窗口关闭
End Sub
这样设计的目的就是为了增加良好的人机交互界面,让非软件设计人员也能很容易的就会使用。同理得到的接触网软横跨预制计算结果可以使用程序的逆过程让结果显示出来。
4程序的整体设计,模块调用流程
当用于接触网软横跨计算的VBA模块及窗口建立好以后,它们还是独立、分散的,还不能用于软横跨的预制计算。只有将它们联系起来,形成一个能用于软横跨计算的程序系统的时候,才能得到我们想要的结果。所以要掌握整个程序系统的执行过程,并用一些Excel函数或者VBA语句将各独立的模块、窗口连接起来。
程序的执行过程为1、调用VBA数据输入窗口程序,将测量到的数据和图纸设计给的有关数据输入窗口。对窗口进行调用需要触发,以便于我们将测量到的数据输入窗口。通过录制一个按钮控件,来触发数据输入窗口的弹出。用VBA程序语言表述为
Private Sub CommandButton1_Click()
‘单击按钮控件触发程序执行
userForm1.Show
‘显示出窗口对象
End Sub
2、按确定按钮,将窗口内的数据赋值到相关的程序或者单元格。VBA语言表述见上
3、在单元格中调用VBA程序模块,按照接触网软横跨的预制流程计算,最后得到横承、上下部定位绳的分段长度。对通用程序模块调用的一般方法为:在单元格输入=模块名(变量对应的单元格1,变量对应的单元格2,。。。)
4、调用VBA窗口程序,将计算结果赋值到数据输出窗口并显示出来。程序与触发数据输入窗口类似,不同的是需要将单元格中的数据赋值到窗口中。具体用VBA语言表述为:
Private Sub CommandButton1_Click()
‘声明当按确定按钮后,程序触发,给单元格或者程序赋值。
TextBox1.Text = Range("C2").Value
TextBox23.Value = Range("C8").Value
‘将单元格或程序中的数据或文本赋值到对应的窗口中
UserForm1.Show
‘显示数据输出窗口
End Sub
5根据结果绘预制图
根据已知的数据及测量到的数据就能将预制图中的上下部定位绳总长及分段长度绘制出来。上部定位绳的总长可以以正线股道为基准,以导高+结构高度为高水平连接两端支柱确定;分段长度根据直吊弦的位置确定。下部定位绳同样以正线股道为基准,以导高为高度水平连接两端支柱确定;分段长度根据定位器及拉出值确定。
根据m1、m2…的值可以得出直吊弦,再用多段线连接起来,就是横向承力索的分段长度。如下图3所示。
图3 求横向承力索分段长度示意图
6结语
基于VBA的接触网软横跨预制计算能够代替繁杂的手工计算,提高计算效率,并且能够防止由于人为的疏忽造成的错误。人机交互界面良好,即使没有接触过VBA程序的技术人员也会使用。最主要的是该程序系统完全由常用软件Excel及自带的VBA语言承载,如果具备基础的VBA知识,更是可以对程序进行修改调试,达到自己需要的效果。
参考文献
[1]于万聚.高速电气化铁路接触网[M].西南交通大学出版社,2002
[2] Excel Home.别怕,Excel VBA其实很简单[M].人民邮电出版社,2012
论文作者:闵道聪
论文发表刊物:《电力技术》2016年第3期
论文发表时间:2016/7/14
标签:程序论文; 数据论文; 窗口论文; 股道论文; 节点论文; 模块论文; 负载论文; 《电力技术》2016年第3期论文;