☰
GEOCOM中文手册精讲:TS30/TS50测量机器人二次开发实战指南
2026/10/15 8:46:22 网站建设 项目流程

简介:TS30、TS50系列测量机器人Geocom中文说明书,是一份面向徕卡测量机器人二次开发人员的完整接口参考文档,旨在解决开发者在调用Geocom协议时遇到的原理不清、接口不明等问题。资源从TPS1200系统软件与GEOCOM使用背景讲起,系统梳理操作一般概念、ASCII协议语法、C/C++及VBA函数调用协议,并重点展开GEOCOM编程基础:包含数据类型定义、通信操作方式、常见程序示例与TPS1200仪器操作方式等内容,可帮助读者深入理解测量机器人的数据交换机制和开发流程。该说明书适用于土木工程、工业制造、地质勘探等需要对测量机器人进行自动化数据采集和实时传输的场景,也适合有一定编程基础、希望提高测量精度与作业效率的测绘工程师进阶学习。资源包仅含1个docx文档,体积1.49MB,目录结构清晰,从概述到协议语法再到代码实例层层递进。目前已有2419人学习下载,是掌握Leica测量机器人二次开发、快速排查通信错误的重要参考资料。

1. 拿到TS30/TS50的GEOCOM中文手册:先搞懂它管的是哪一层

但凡接触过测量机器人二次开发的人,第一眼看到GEOCOM这个名词,多半会误以为它是一套需要另外安装的软件。其实它更像一层“遥控协议”:你通过串口或蓝牙,用ASCII字符串、C/C++函数或VBA调用,让TS30、TS50这类全站仪去转面、搜棱镜、测距、回传数据,全程不用碰仪器内部的嵌入式系统。这份中文手册的价值,就是把GEOCOM里AUT、BAP、CSV、EDM这些模块的每个函数、每个参数、每种返回格式逐条列清楚。适合做自动化监测、基坑沉降、工业测量上位机的人作为案头参考,也适合刚入手TM30、TPS1200系列、正在搭第一个自动测量程序的新手用来建立整体认知。

2. GEOCOM的三种调用通道:ASCII、C/C++、VBA怎么选

2.1 GEOCOM的通信模型:一层RPC,三个入口

GEOCOM本质上是一套远程过程调用协议。仪器端跑着一个常驻服务,你的上位机程序把“函数名 + 参数”发过去,仪器执行完把返回值发回来。所有模块如AUT(自动化)、BAP(基本应用)、CSV(中央服务)、EDM(电子测距)都是在这个框架下对外的函数集合。

手册在“使用GEOCOM的一般概念”里明确分了三条调用通道:

  • ASCII协议:用文本命令,格式直观,适合串口调试、教学验证、轻型脚本。
  • C/C++函数调用协议:官方推荐的正式开发方式,性能稳定,便于做多线程和封装。
  • VBA调用协议:适合快速做Excel报表、数据后处理,也适合不太想维护独立工程的人。

选型上我一般这么判断:如果是一个长期运行的高频自动测量系统,选C/C++;如果只是给测量数据做个二次处理原型,或者现场临时验证某个函数行为,用VBA最快;如果你需要在一台不带操作系统、只有串口的嵌入式板上直接驱动仪器,那就用ASCII协议。三条通道最终调用的是同一批内部函数,只是封装层级不同。

2.2 ASCII协议:语法、数据类型与一个最小示例

ASCII协议的核心格式是请求行和应答行。手册里的语法可以简化为:

%R1Q,<函数名>:<参数1>,<参数2>...<CR><LF>

应答一般是:

%R1P,<状态>,<返回值1>,<返回值2>...<CR><LF>

%R1是请求编号,Q表示Request,P表示Positive应答。状态位为0时表示执行成功,非0对应手册末尾列出的错误码。这个设计看起来简单,但它是后面所有排错的基础——收到数据先用状态位判断,再谈解析数据。

以下是一段用VBA直接发ASCII命令给仪器的示意代码,流程是“打开串口→发命令→等待应答→判断状态”:

Private Sub TestAsciiGeoCom() Dim COM As Object Set COM = CreateObject("MSCommLib.MSComm") COM.CommPort = 3 ' 串口号,按实际改 COM.Settings = "19200,n,8,1" ' 波特率、无校验、8位数据、1位停止位 COM.InputMode = 0 ' 0=文本模式,1=二进制模式 COM.PortOpen = True ' ASCII请求:读取软件版本号 Dim cmd As String cmd = "%R1Q,CSV_GetSWVersion:" & vbCrLf COM.Output = cmd ' 等待应答,现场可改为超时循环 Do While COM.InBufferCount = 0 DoEvents Loop Dim resp As String resp = COM.Input ' 应答形如 %R1P,0,<主版本>,<次版本>,... Debug.Print resp COM.PortOpen = False End Sub

这段代码有三个参数值得注意:波特率、InputMode、请求编号。波特率必须和仪器端COM模块里读到的一致,否则应答全是乱码;InputMode在调用返回数值型参数时应改成1二进制模式,上面为了演示读版本号用了文本模式;请求编号%R1可以在同一连接里叠加%R2、%R3以区分并发任务,但刚上手时强制自己只用一个编号能省掉大量版本冲突问题。

2.3 C/C++框架:从RPC到GeoCOM基本应用框架

C/C++调用方式的关键,是先理解“模块_功能”的命名规则,比如:

  • AUT_开头是自动化相关:定位、搜索、转面、跟踪。
  • BAP_开头是基本测量:测距、测角、棱镜配置。
  • CSV_开头是中央服务:仪器号、时间、固件版本、电量。

理解这个规则后,查手册目录就很快:先确认需求属于哪个模块,再去对应章节看USAGE、常数类型和函数定义。

下面是C++风格的GeoCOM调用框架示意,演示“连接→读版本→关闭”的最小流程:

#include <cstdio> #include "GeoCom.h" // 官方头文件 int main() { long errCode = 0; char* version = nullptr; // 1. 初始化通信子系统 GeoCOM_Init(); // 2. 打开串口,第三个参数是波特率 errCode = COM_OpenPort(3, "COM3", 19200); if (errCode != 0) { printf("开放端口失败: %ld\n", errCode); return -1; } // 3. 读取软件版本,输出为字符串 errCode = CSV_GetSWVersion(&version); if (errCode == 0) { printf("Software Version: %s\n", version); GeoCOM_Free(version); } else { printf("读版本失败: %ld\n", errCode); } // 4. 关闭端口 COM_ClosePort(3); GeoCOM_Shutdown(); return 0; }

这个框架里最容易被忽略的是GeoCOM_Init()和GeoCOM_Shutdown()。手册里对应“客户特定的GEOCOM功能”一节,它们负责分配内部缓冲区、初始化错误表。我见过有同事跳过这两步直接调COM_OpenPort,结果偶发内存异常,排查了一下午。按手册的顺序走,先初始化再开端口,是避免莫名其妙崩溃的第一条纪律。

2.4 VBA方式:Excel上位机的快速路径

VBA方式适合把仪器数据直接灌进Excel。手册里的基本GeoCOM应用框架,在VBA里通常以“声明DLL函数 + 打开端口 + 调函数”三段式出现。下面是一个简化版:

Private Declare PtrSafe Function CSV_GetSWVersion Lib "GeoCOM.dll" _ (ByRef version As String) As Long Sub ReadVersionVBA() Dim ret As Long Dim version As String * 256 ' 先初始化通信,再调函数 ret = CSV_GetSWVersion(version) If ret = 0 Then Range("A1").Value = version Else MsgBox "错误码: " & ret End If End Sub

这里要留意VBA里字符串参数和C类型不匹配的坑:手册在“VBA中的数据类型——派生的一般规则”里专门讲了这个。我建议所有字符串参数先声明定长String * 256,避免短字符串导致缓冲区溢写;数值参数用Long,双精度用Double,不要用Integer。你若用的是64位Office,Declare后面必须带PtrSafe,否则会直接编译失败。这套写法做原型验证足够,真上生产环境我还是建议迁到C++或独立上位机。

3. 自动化测量核心模块:AUT与BAP的函数组合与参数边界

3.1 AUT模块:定位、转面、微调与超时参数

AUT模块是整个自动测量系统的“马达”。它管望远镜转到哪、什么时候算转到位、转完后要不要自动锁定目标。我把手册里最常用的几个参数整理成了下表:

函数作用关键参数典型取值
AUT_SetTolerance设置定位公差水平角公差、垂直角公差视精度要求,常用0.5″~2″
AUT_ReadTolerance读取当前公差返回两个公差值可在程序里回读确认
AUT_SetTimeout设置定位超时超时毫秒数5000~15000
AUT_ReadTimeout读取当前超时返回毫秒数同上
AUT_DoPosition将望远镜转到指定角度Hz、V角度值双精度角度
AUT_DoFace转面目标面号0=面1,1=面2

这里面最容易翻车的是超时和公差配合。定位超时设太短,仪器转动还没到位就被判定失败;设太长,卡住时整个程序会停在半路。我习惯把超时机制做成两段:第一段等待15秒让电机执行到位,第二段用AUT_ReadTolerance回读实际偏差,偏差超标再做一次微调。

设置公差和超时的代码示意:

' 定位公差先收紧,超时给足 AUT_SetTolerance 1.0, 1.0 ' 水平、垂直各1秒 AUT_SetTimeout 10000 ' 10秒超时 ' 转到指定方向 Dim ret As Long ret = AUT_DoPosition(123.4567, 90.1234) If ret <> 0 Then ' 失败后回读错误文本,用于排查 Debug.Print AUT_GetErrorMessage(ret) End If

3.2 ATR与PowerSearch:搜索与跟踪的调用顺序

TS30/TS50这类型号带了ATR自动目标识别和PowerSearch快速搜索功能。手册里这两个功能是分开的两个函数族,但现场用的时候必须按顺序衔接:

  1. 先用AUT_GetATRSearchWindow确认当前窗口大小。
  2. 用AUT_SetATRSearchWindow把搜索窗收窄到现场需要的范围。
  3. 开启PowerSearch范围:AUT_PS_EnableRange。
  4. 调用AUT_PS_SearchNext迭代搜索目标。

顺序反了的表现是:仪器搜到棱镜却跟踪不稳,或者PowerSearch扫过整个工地却报“无目标”。本质原因是搜索窗口、搜索范围两者独立生效,前者限定了ATR的视场范围,后者限定了PowerSearch的扫描边界,必须先明确你要它扫多大区域,再决定用哪个函数去扫。

核心参数有三个:ATR搜索窗口的宽和高(角度单位)、PowerSearch扫描范围、每次AUT_PS_SearchNext的搜索步长。实际现场,我通常把ATR窗口调到能罩住棱镜大致位置,PowerSearch范围则只覆盖测站前方的有效区域,避免把后方反光物体当成目标。这里有一个“玄学”一样的经验:如果棱镜附近有金属护栏,PowerSearch常常会锁到护栏角上,这时不要急着缩小搜索窗口,先尝试换到ATR模式让它按反射特征确认目标,成功率会明显提高。

3.3 BAP模块:先配棱镜再测距测角

BAP模块是日常测点用的“基本应用”。它和AUT最大的区别是:AUT管望远镜转,BAP管“转完之后测什么、按什么模式测”。

以BAP_MeasDistanceAngle为例,它会一次性返回水平角Hz、垂直角V和斜距。但在调用它之前,必须先完成两件事:

  • 用BAP_SetEDMType设置测距模式,比如IR(红外棱镜模式)、RL(反射片模式)、LO(无棱镜模式)。
  • 用BAP_SetDefaultPrismType或BAP_SetPrismType2设置棱镜常数。

漏掉第二步的表现是测距值稳定,但和钢尺对不上,差几十毫米甚至几百毫米。因为仪器端默认按标准棱镜常数计算,而你现场用的可能是免棱镜模式或另一款棱镜。下面这段是标准调用顺序:

// 1. 设置测距模式为IR棱镜模式 BAP_SetEDMType(EDM_IR); // 2. 设置默认棱镜类型,比如Leica圆棱镜常数 BAP_SetDefaultPrismType(PRISM_LEICA_ROUND); // 3. 执行距离+角度测量 double hz, v, dist; long ret = BAP_MeasDistanceAngle(&hz, &v, &dist); if (ret == 0) { printf("Hz=%.5f V=%.5f Dist=%.3f\n", hz, v, dist); }

参数说明:代码里的EDM_IR和PRISM_LEICA_ROUND都是手册“常数和类型”一节里定义的枚举值。不同固件版本对枚举名略有差异,我通常会在程序启动时用BAP_GetEDMType回读一遍当前模式,而不是直接假定默认值。这样即便仪器上次被人手动改成免棱镜模式,程序也能在第一次测距前自动纠偏。

还有BAP_GetTargetType这个函数,用来读当前EDM的目标类型——棱镜、反射片还是免棱镜。这个参数常被忽视,但它决定BAP_MeasDistanceAngle内部用哪一套距离算法,和BAP_SetEDMType必须保持一致。如果你发现测距值异常但棱镜常数又没错,先回读目标类型,这是最快的定位手段。

4. 设备状态与数据回传:CSV、EDM、FTR、IMG四件套装在哪用

4.1 CSV中央服务:读仪器号、日期与固件版本

CSV模块在GEOCOM里负责和设备“身份证”相关的所有事情。程序联机后我做的第一件事,不是测距,而是依次读取仪器号、软件版本、日期时间、电池电量和内部温度:

函数用途返回值类型
CSV_GetInstrumentNo读取工厂定义的仪器号字符串
CSV_GetInstrumentName读取厂商特定的仪器名称字符串
CSV_GetSWVersion读取软件版本字符串
CSV_GetDateTime读取日期时间字符串
CSV_CheckPower检查可用电源状态字符串
CSV_GetIntTemp读取仪器内部温度双精度

这组数据撑起了测量数据的“文件头”。做自动化监测时,每次测量记录里必须带上仪器号、采集时间、仪器温度,否则后期查起来无从追溯。下面是一段在测量开始前读取这些信息的示例:

char instrumentNo[128] = {0}; long ret = CSV_GetInstrumentNo(instrumentNo); if (ret == 0) { printf("Instrument: %s\n", instrumentNo); } // 读取仪器内部温度,用于后期温差补偿 double temp = 0.0; ret = CSV_GetIntTemp(&temp); if (ret == 0) { printf("Temp: %.2f\n", temp); }

CSV_GetDateTime和CSV_GetDateTimeCentiSec的区别是后者带百分之一秒精度。如果你的数据要和外部高精度时钟同步,务必用带CentiSec的版本,配合网络对时服务器,可以让测量时间戳误差控制到几十毫秒以内。这个精度在做动态监测时很关键,否则同一个点位不同时刻的数据没法对齐。

4.2 FTR文件传输与IMG图像:测量数据落盘与取图

FTR模块负责把仪器内部的已知点、测量数据文件下载到电脑上。它和直接调用测量函数的区别在于:测量函数拿的是“实时值”,FTR拿的是“仪器内存里已经存好的历史数据”。适合的场景是外业测量完成后统一导数据,而不是实时回传。

文件传输的标准步骤是:

  1. 调用FTR_SetupList建立待传输文件列表。
  2. 用FTR_ListFile查看列表内容并核对文件名。
  3. 调用FTR_SetupDownload初始化下载参数。
  4. 执行FTR_Download开始传输。
  5. 完成后调用FTR_AbortDownload关闭传输会话。

这五个步骤不能跳。一次典型的问题是:直接调用FTR_Download却报“无文件可传”,原因就是漏了FTR_SetupList,仪器端不知道你要哪个文件。

IMG模块则是为带相机功能的型号准备的。IMG_TakeTccImage可以抓取望远镜当前视野图像,常用于自动监测中的巡查取证。在调用它之前,先用IMG_GetTccConfig确认图像尺寸和压缩配置,再用IMG_SetTccConfig设置需要的参数。这样抓出来的图既不大到撑爆内存,也不小到看不清细节。图像数据和FTR文件一样都是二进制流,解析时一定要按手册里给的字节顺序处理,否则图像会错位成花屏。

4.3 EDM激光指示与测距模式切换

EDM模块里除了测距,还包含两个现场高频率用到的“小功能”:激光指示器、电子导光强度调整。

EDM_Laserpointer用来打开或关闭激光指示。开放光后,仪器会射出可见激光点,方便人工对准目标。但注意,激光开启状态下调用BAP_MeasDistanceAngle可能影响某些型号的测距结果,所以自动测量程序里应该先测距后开激光,或者测量前强制关闭。

EDM_SetElintensity调整的是导向光的亮度。阳光强烈的环境,导向光太弱看不见;夜间或隧道里,导向光太强反而刺眼。它不影响测距精度,纯粹是现场便利性功能。有人把这个参数写死成一个值,我不太建议:亮度需求随光照环境变化很大,把它做成界面上的可调项,现场会省很多沟通成本。

5. 避坑:通信超时、字节序与棱镜常数的五个现场记录

5.1 现象一:发送命令后收不到任何应答

联机第一次测试时,程序把请求发出去了,端口也打开了,但等了两秒串口缓冲依旧为空。检查仪器端屏幕,能看到接收到了命令。

原因:波特率不匹配是最常见的,比如仪器端设19200而上位机用了9600;其次是没有发送回车换行符,ASCII协议以<CR><LF>作为命令结束标志,少一个\n仪器就会一直等待完整帧;第三个可能是串口被其他程序占用,比如调试助手没关就启动了上位机。

解决:把波特率统一为19200,并从手册里调COM_GetBaudrate回读仪器端当前波特率自动匹配;所有命令字符串末尾强制追加vbCrLf;开发机上关掉一切串口调试工具,避免端口抢占。

5.2 现象二:连续发送多条命令时,应答数据串位

程序连续调用两个函数,第二个函数的应答里混入了第一个函数的返回值,所有数据错位。

原因:ASCII协议下,仪器按请求顺序应答,但如果上位机在上一条应答完全读完之前就发了下一条请求,响应就会在串口缓冲里排队,解析方却只读了最新一段。这是典型的“请求比响应快”问题,本质不是仪器丢数据,而是上位机协议状态机没做完整。

解决:维护一个互斥规则——同一串口连接上,下一条命令必须在上一条返回之后发送;且每次读取循环要把串口缓冲区的所有字节都取干净,直到读到帧尾再开始解析。我在代码里会给每个请求编号,如果响应中的请求编号与当前不一致,强制丢弃并重试,这比单纯加延时可控得多。

5.3 现象三:VBA里读到的双精度数据和仪器屏幕显示不一致

同一个函数返回的距离值,仪器屏显是100.1234,程序里却是1.001234E+02,或者小数位被截断成100.12。

原因:手册里COM_SetDoublePrecision一节讲得很清楚:GEOCOM接口传输双精度数据时可以按整精度或降精度处理,上位机端设置和仪器端不一致时,小数位数就会丢失。

解决:调COM_SetDoublePrecision并在两边设置相同的精度模式;如果还是不对,用COM_GetDoublePrecision把当前值打出来看一眼,往往能直接看出问题。另外VBA里声明Double没问题,但传递指针时若按ByVal传入,得到的就是指针地址而不是值,这个在VBA调DLL时最容易出现“灵异数值”,一定先查参数传递方式。

5.4 现象四:棱镜常数看起来没错,距离就是差几十毫米

测距结果稳定,重复性也好,但和已知值对不上,差量接近某个固定偏移,比如30mm。

原因:仪器里的“默认棱镜类型”和应用现场实际使用的棱镜型号不匹配。比如默认值是反射片模式,实际用的是圆棱镜,常数差了不止一个量级;或者调了BAP_SetDefaultPrismType只改了默认值,但仪器当前目标类型仍是RL或LO,内部走的是另一套算法。

解决:先调BAP_GetTargetType确认当前目标类型,再用BAP_SetPrismType2写入用户棱镜定义。用户棱镜定义是BAP模块里一个独立的参数组,适用于棱镜常数不在默认列表里的非标棱镜。写完再用BAP_GetPrismType2回读,读到的值才是实际参与计算的值。这个“写后即读”的习惯能避免绝大多数设置没生效的坑。

5.5 现象五:ATR定位超时,自动测量卡在同一个方向

仪器转动正常,但每次转到目标附近就反复搜索,直到触发超时退出。

原因:ATR搜索窗口设置得太小,棱镜没有落在窗口内;或者当前环境里反光物体太多,ATR优先锁定了干扰目标,FineAdjust微调一直在错误目标上徘徊。还有一种情况:PowerSearch范围设置过大,导致每次搜索都先扫完一大片区域才开始微调。

解决:用AUT_GetATRSearchWindow读当前窗口值,再按棱镜距离换算现场实际覆盖范围,适当放大窗口;如果是干扰目标问题,改用AUT_SetATRSearchWindow收窄窗口,并在调用AUT_FineAdjust前先手动确认目标。至于PowerSearch范围,建议根据测站到目标区域的夹角计算,不要随手给一个360度全域。记住一个经验:搜索范围不是越大越好,越大的范围意味着越高的误锁概率。

6. 一小段验证:连接、测距、回传数据的三步最小闭环

6.1 三步验证流程

拿到一份新手册、新固件或者新仪器,我先不急着看功能,而是强行走一遍“连接→测距→回传”的最小闭环。这个闭环能覆盖通信链路、EDM配置、数据解析三大块,跑通了再谈业务功能。

第一步是连接验证。打开串口、设置波特率,调用CSV_GetSWVersion读到准确版本号。这一步如果通过,通信链路就是通的。

第二步是测距验证。手动放一个棱镜,调用BAP_SetEDMType、BAP_SetDefaultPrismType,然后执行BAP_MeasDistanceAngle,检查返回的Hz、V、距离值是否和仪器屏幕显示一致。

第三步是回传验证。把测距结果按自定义文本协议发回上位机,并在上位机界面上正确显示。代码示意:

' 最小闭环:连接 → 测距 → 文本回传 Sub MiniLoop() GeoCOM_Init COM_OpenPort 3, "COM3", 19200 BAP_SetEDMType EDM_IR BAP_SetDefaultPrismType PRISM_LEICA_ROUND Dim hz As Double, v As Double, dist As Double Dim ret As Long ret = BAP_MeasDistanceAngle(hz, v, dist) If ret = 0 Then ' 按固定格式回传 Debug.Print "MEAS|" & hz & "|" & v & "|" & dist End If COM_ClosePort 3 GeoCOM_Shutdown End Sub

6.2 从手册目录快速反查参数

手册目录就是一套“函数索引表”。拿到具体的二次开发需求,我通常用三个问题定位:哪个模块?哪个函数?哪些参数?模块看首字母前缀,函数看目录编号,参数看各函数条目下的“数据类型”和“常数和类型”两节。

具体来说,目录里每个模块都分USAGE、常数和类型、函数三节。USAGE讲这个模块的适用范围,常数和类型给出可用的枚举值,函数部分则按编号列出每个函数完整签名。当你在现场需要找某个功能而不知道函数名时,先想所属模块,再翻这一模块的函数列表,比从第一页顺序读效率高得多。

我有一次调TS30的自动锁定功能,就是因为没看USAGE,直接翻了AUT的函数列表找跟踪相关函数,浪费了一个晚上。后来才发现该功能在AUS模块下,AUS才是管ATR模式和用户锁定状态的地方。从那以后,我每次拿到新固件都强制先看一眼各个模块的USAGE,再走一遍最小闭环,最后才进业务逻辑。这条习惯救过我不少现场,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询