彭秀英,王宗强,张尊良
(中国石油大学 地球科学与技术学院,山东 青岛 266580)
FORTRAN是一种非常适合科学计算的底层程序开发语言,拥有强大的程序集和计算类的数据结构,数值计算速度快,在GPS定轨和定位软件开发中应用广泛。C#是目前最新的一种基于.NET平台的面向对象开发语言,具有强大的界面开发平台,适用于交互式图形界面的系统开发[1]。因此,基于C#与FORTRAN语言的混合编程技术,充分利用两种语言各自的优点,优势互补,可以开发出既具有高效计算能力又具有友好界面的应用程序软件,如数值仿真系统[2]、土木工程计算[3]、地震速度分析[4]等。
精密单点定位(Precise Point Positioning,PPP)技术采用精密卫星星历和钟差以及一台GPS双频接收机的伪距和载波相位观测值,单机即可实现从毫米到厘米级的静态定位以及厘米到分米级的动态定位[5-7]。PPP技术无需建立基准站,不受作用距离的限制,目前已成为GPS精密定位和导航的重要手段,在GPS气象学、地震形变监测、远程海上动态精密定位等领域得到广泛应用。目前,国际上著名的几个定轨/定位软件如GIPSY、BERNESE、EPOS等均具有精密单点定位功能,国内武汉大学研制的PANDA软件[8]和TRIP软件[9],也均实现了精密单点定位的数据处理。笔者在已有精密单点定位FORTRAN程序的基础上,基于C#与FORTRAN混合编程技术,实现精密单点定位软件的研制。采用txt文件进行控制参数信息的传递以及基于数组的字符串传递方法,很好地解决了PPP软件输入参数多、参数传递中容易出错等问题。利用IGS跟踪站数据,采用研制的精密单点定位软件,对PPP单天解的精度进行了验证。
实现C#和FORTRAN混合编程,常用的方法是将FORTRAN控制台应用程序编制成动态链接库(DLL)文件,用C#开发友好的用户界面,并调用该DLL文件实现混合编程。由于C#和FORTRAN语言有着许多各自不同的约定(如命名约定、函数调用、参数传递约定等),因此在实现C#与FORTRAN的混合编程时,必须统一这些基本约定[1-4]。本文基于C#与FORTRAN混合编程,实现精密单点定位软件的研制,其基本流程如图1所示。
图1 软件基本流程
在精密单点定位的数据处理中,需输入较多的控制参数信息,如GPS观测值数据文件、接收机天线类型和天线高信息、IGS精密星历与钟差产品的类型和采样间隔、定位类型(静态、动态,陆地、水上、空中)、卫星截止高度角、GPS原始数据采样率、数据处理间隔、数据处理的时间窗口(起始历元和结束历元)等。上述控制参数和字符串的传递是实现C#与FORTRAN混合编程的关键。在FORTRAN语言编制的精密单点定位程序中,上述信息是以控制参数文件(*.txt)的形式,传递给FORTRAN程序调用的。因此,采用C#与FORTRAN语言混合编程时,本文仍然利用txt文件实现精密单点定位中众多控制参数信息的快速传递,并采用数组形式进行C#与FORTRAN之间的字符串传递,从而很好地解决了传递参数多、容易出错等问题。
首先,将精密单点定位所需控制参数信息通过C#开发的交互式图形界面传递给软件;然后,利用C#语言将传递进来的控制参数信息输出并写入控制参数文件(*.txt);最后,由C#调用定位模块(FORTRAN动态链接库),从txt文件中读取定位所需控制参数信息,从而实现C#到FORTRAN动态链接库的快速参数传递。
由于需要使用C#的文件操作函数,因此需要使用命名空间using System.IO,该命名空间包含允许读写文件和数据流的一些操作方法。
具体程序实现如下:
1)利用C#语言,读取“设置”窗口中所输入的控制参数值(所有的控制参数全部写到一个类里面,并定义成静态类方便后面调用)。
列举3种范例:
controlPara.CutoffAngle=double.Parse(textBox1.Text);%截止高度角
controlPara.AntTypeFile=this.comboBox1.Text;%天线类型
if(radioButton13.Checked)
{
controlPara.PositioningType=0;%定位类型
}
2)利用新建工程地址和观测值文件地址,得到控制参数文件(*.txt)的地址和名称。实现语句如下:
string controlfilename="control_parameter_"+controlPara.ObsFile+".txt";
controlPara.Ctr_FileName=dz5+controlfilename;
3)利用C#语言,将控制参数信息输出并写入上述控制参数文件(*.txt)。输出的txt文件可为定位模块(FORTRAN动态链接库)提供定位所需的控制参数信息,从而快速实现C#到FORTRAN的参数传递。
部分代码如下:
StreamWriter outputstream=File.Create-Text(@controlPara.Ctr_FileName);
outputstream.WriteLine("PPP control parameter");
使用上述基于txt文件的参数传递方法,在制作和调用FORTRAN动态链接库(DLL)文件时,可以避免许多由参数类型和长度而引起的混乱,且该方法可以实现修改较少代码就能轻松实现混合编程的功能。此方法也可以用于C#和Matlab等语言的混合编程,同时给其他语言之间的混合编程提供了借鉴。
C#语言使用\O表示字符串的结束,而FORTRAN语言采用最右端添加空格的方式表示字符串的结束,并在最右端使用一个隐藏的参数表示字符串的实际长度。因此在两种语言间传递字符串时极易出错。本文采用了基于数组形式的字符串传递,该方法简单而实用。
1)在C#中将字符串分割为字符数组,再将字符数组转换为ASCII码数组,然后传递给FORTRAN语言。
部分代码如下:
string c=controlPara.Ctr_FileName;
ASCIIEncoding ascii=new ASCIIEncoding();
int[]num=new int[c.Length];
for(int i=0;i<c.Length;i++)
{
num[i]=(int)ascii.GetBytes(c)[i];
}
执行上述代码,即可把控制参数txt文件地址和名称字符串进行转换,放在ASCII码数组num[]中。
2)在FORTRAN中利用char()函数将ASCII码数组还原为字符串。
部分代码如下:
character(m)::str
dimension num(m)
integer i
do i=1,m
str(i:i)=char(num(i))
end do
执行上述代码,即可将ASCII码数组还原为字符串,从而得到控制参数txt文件的地址和名称。
在FORTRAN语言中,将精密单点定位FORTRAN程序以子程序进行编译,生成可以在C#中调用的动态链接库(DLL)文件。在FORTRAN子程序中需要进行以下说明:
!DECMYM ATTRIBUTES DLLEXPORT::PPP
!DECMYM ATTRIBUTES ALIAS:'UNIP'::PPP
这是FORTRAN制作DLL文件和编写一般FORTRAN程序的根本区别,即在程序代码中要说明哪些函数可以被外界调用。
在C#平台中调用FORTRAN动态链接库(DLL)文件,即可执行软件的精密单点定位功能。
1)须把制作的FORTRAN动态链接库(DLL)文件,拷贝到C#应用程序目录的bin文件夹下的Debug中,以保证该DLL文件在调用目录下。
2)创建一个新类calldll,用于存放调用DLL的声明语句,以方便DLL文件的调用。
public static class calldll
{
[DllImport("PPP.dll",SetLastError=true,CharSet=CharSet.Unicode,CallingConvention=CallingConvention.StdCall)]
public static extern void PPP(ref int ka,ref int m);
}
这样也方便调用多个DLL,只要在这个类中加两句声明即可。
3)在C#中调用FORTRAN动态链接库(DLL)文件
calldll.PPP(ref num[0],ref m);
直接调用即可,需要注意的是函数名要大写,传递的变量要与声明中相对应。
精密单点定位软件的主界面如图2所示,其核心部分为“数据处理”菜单,具体包括“设置”和“处理”两项。“设置”要求用户输入精密单点定位所需的所有控制参数信息,弹出窗口如图3所示。
图2 软件主界面
图3 控制参数设置
输入控制参数后,然后点击“数据处理”菜单中的“处理”选项,软件即可自动进行精密单点定位的数据处理,最后将定位结果输出并保存在文本文件中。
为了验证精密单点定位(PPP)软件的定位精度,本文基于IGS事后精密星历和钟差产品,利用IGS跟踪站实测数据,进行了静态PPP数据处理。以IGS发布的跟踪站周解(三维地心坐标)为参考值,对PPP单天解的精度进行评价。同时,以跟踪站周解坐标位置为原点,将PPP单天解的三维地心坐标(X,Y,Z)转换为站心坐标(N,E,U),从而对PPP单天解的平面位置和高程方向的精度进行评价。以chan(长春)、shao(上海)为例,各站点单天解的真误差和均方根差(RMS)统计,详见表1。
表1 PPP单天解的误差统计 m
由表1可知:相对于IGS发布的跟踪站周解坐标,各站点PPP单天解坐标在X,Y,Z或N,E,U方向的误差大部分都小于1cm,其均方根差(RMS)均优于1cm,与国内外其他较为成熟的PPP软件的精度相当[8]。其中N方向的RMS较小,而E,U方向的RMS稍大;分析其原因主要与GPS观测值误差改正模型精度以及PPP相位模糊度浮点解有关,采用PPP相位模糊度固定技术可进一步提高E坐标方向的精度[10]。
基于C#与FORTRAN混合编程技术可以充分利用C#和FORTRAN语言各自的优点,使开发的软件既具有高效的计算性能又具有友好的交互界面。本文采用基于txt文件的快速参数传递和基于数组形式的字符串传递方法,很好地解决了精密单点定位中众多控制参数的传递问题,可为其他专业应用软件的开发提供借鉴。
[1]林国勇,董洵,吴婉凡.在.NET平台下C#和FORTRAN的混合语言编程[J].计算机系统应用,2003(9):58-60.
[2]朱泰山,王一一,冯国泰.基于FORTRAN与C#混编数值仿真软件系统的实现[J].电脑编程技巧与维护,2008(14):12-15.
[3]周涛,郭占元,郭向荣.FORTRAN与C#混合编程在土木工程计算中的应用[J].山东交通学院学报,2009,17(1):80-86.
[4]李勤,李庆春,冯宏.C#和FORTRAN混合编程在地震速度分析中的应用[J].地球物理学进展,2010,25(4):1503-1507.
[5]Zumberge JF,Heflin MB,Jefferson DC,Watkins MM,and Webb FH,“Precise point positioning for the efficient and robust analysis of GPS data from large networks,”J Geophy Res,102(B3),1997:5005-5017.
[6]Kouba J and Heroux P,“Precise point positioning using IGS orbit and clock products,”GPS Solut,2001,5(2):12-28.
[7]马国元,李广云,李宗春.机载PPP与动基线测量相对定位精度比较与分析[J].测绘工程,2012,21(5):69-70.
[8]施闯,赵齐乐,楼益栋,等.卫星导航系统综合分析处理软件PANDA及研究进展[J].航天器工程,2009,18(4):64-70.
[9]张小红,刘经南,Rene Forsberg.基于精密单点定位技术的航空测量应用实践[J].武汉大学学报:信息科学版,2006,31(1):19-23.
[10]GE M,GENDT G,ROTHACHER M,et al.Resolution of GPS carrier-phase ambiguities in precise point positioning(PPP)with daily observations[J].J Geod,2008,82(7):389-399.