资讯动态

GEOCOM中文手册精讲:TS30/TS50测量机器人二次开发实战指南

发布时间:2026/10/16 10:42:01 来源:尧图企业网站定制
简介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...CRLF应答一般是%R1P,状态,返回值1,返回值2...CRLF%R1是请求编号Q表示RequestP表示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位OfficeDeclare后面必须带PtrSafe否则会直接编译失败。这套写法做原型验证足够真上生产环境我还是建议迁到C或独立上位机。3. 自动化测量核心模块AUT与BAP的函数组合与参数边界3.1 AUT模块定位、转面、微调与超时参数AUT模块是整个自动测量系统的“马达”。它管望远镜转到哪、什么时候算转到位、转完后要不要自动锁定目标。我把手册里最常用的几个参数整理成了下表函数作用关键参数典型取值AUT_SetTolerance设置定位公差水平角公差、垂直角公差视精度要求常用0.5″~2″AUT_ReadTolerance读取当前公差返回两个公差值可在程序里回读确认AUT_SetTimeout设置定位超时超时毫秒数5000~15000AUT_ReadTimeout读取当前超时返回毫秒数同上AUT_DoPosition将望远镜转到指定角度Hz、V角度值双精度角度AUT_DoFace转面目标面号0面11面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 If3.2 ATR与PowerSearch搜索与跟踪的调用顺序TS30/TS50这类型号带了ATR自动目标识别和PowerSearch快速搜索功能。手册里这两个功能是分开的两个函数族但现场用的时候必须按顺序衔接先用AUT_GetATRSearchWindow确认当前窗口大小。用AUT_SetATRSearchWindow把搜索窗收窄到现场需要的范围。开启PowerSearch范围AUT_PS_EnableRange。调用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拿的是“仪器内存里已经存好的历史数据”。适合的场景是外业测量完成后统一导数据而不是实时回传。文件传输的标准步骤是调用FTR_SetupList建立待传输文件列表。用FTR_ListFile查看列表内容并核对文件名。调用FTR_SetupDownload初始化下载参数。执行FTR_Download开始传输。完成后调用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协议以CRLF作为命令结束标志少一个\n仪器就会一直等待完整帧第三个可能是串口被其他程序占用比如调试助手没关就启动了上位机。解决把波特率统一为19200并从手册里调COM_GetBaudrate回读仪器端当前波特率自动匹配所有命令字符串末尾强制追加vbCrLf开发机上关掉一切串口调试工具避免端口抢占。5.2 现象二连续发送多条命令时应答数据串位程序连续调用两个函数第二个函数的应答里混入了第一个函数的返回值所有数据错位。原因ASCII协议下仪器按请求顺序应答但如果上位机在上一条应答完全读完之前就发了下一条请求响应就会在串口缓冲里排队解析方却只读了最新一段。这是典型的“请求比响应快”问题本质不是仪器丢数据而是上位机协议状态机没做完整。解决维护一个互斥规则——同一串口连接上下一条命令必须在上一条返回之后发送且每次读取循环要把串口缓冲区的所有字节都取干净直到读到帧尾再开始解析。我在代码里会给每个请求编号如果响应中的请求编号与当前不一致强制丢弃并重试这比单纯加延时可控得多。5.3 现象三VBA里读到的双精度数据和仪器屏幕显示不一致同一个函数返回的距离值仪器屏显是100.1234程序里却是1.001234E02或者小数位被截断成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 Sub6.2 从手册目录快速反查参数手册目录就是一套“函数索引表”。拿到具体的二次开发需求我通常用三个问题定位哪个模块哪个函数哪些参数模块看首字母前缀函数看目录编号参数看各函数条目下的“数据类型”和“常数和类型”两节。具体来说目录里每个模块都分USAGE、常数和类型、函数三节。USAGE讲这个模块的适用范围常数和类型给出可用的枚举值函数部分则按编号列出每个函数完整签名。当你在现场需要找某个功能而不知道函数名时先想所属模块再翻这一模块的函数列表比从第一页顺序读效率高得多。我有一次调TS30的自动锁定功能就是因为没看USAGE直接翻了AUT的函数列表找跟踪相关函数浪费了一个晚上。后来才发现该功能在AUS模块下AUS才是管ATR模式和用户锁定状态的地方。从那以后我每次拿到新固件都强制先看一眼各个模块的USAGE再走一遍最小闭环最后才进业务逻辑。这条习惯救过我不少现场希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑