Technical Article
海德汉INSTR返回0,是没找到工件标签吗?
按TNC640 NC34059x-17解释INSTR从0起的位置、未命中返回源长度及BEG搜索起点,用PART-A和PART-PART示例区分字符串位置与STRLEN结果。
用海德汉字符串宏检查工件标签,搜索结果明明是0,程序却走进了“未找到”分支;换一个不存在的关键词,结果反而变成6。这里先别怀疑标签读错,INSTR返回的是位置,不是“1成功、0失败”的布尔标志。
本文按TNC 640、NC软件34059x-17的Klartext编程手册说明。例子只处理已经定义的非空ASCII字符串,不读取机床状态、不移动轴,也不把这套返回值套到其他控制系统。
首字符的位置是0,字符串长度却是6
把源字符串设为PART-A,一共6个字符,内部位置依次是0、1、2、3、4、5。搜索PART,从第一个字符就能匹配,返回0正是命中。搜索ZZ找不到,控制器返回源字符串的总长度6,而不是-1。

因此,“结果等于0就报警”会把位于开头的合法标签误判成缺失;“结果大于0就放行”又会把未命中的长度值当成成功。对于这里限定的已定义、非空源串和非空搜索串,应结合源长度判定,而不是只看结果是否为正。
先把返回值看清,再写跳转条件
下面是无轴运动的Klartext片段,不是完整加工程序。QS10保存源文本,QS13保存关键词,Q50接收搜索结果,Q52接收源长度。集成前应确认这些参数没有被当前程序占用。
DECLARE STRING QS10 = "PART-A" DECLARE STRING QS13 = "PART" Q50 = INSTR ( SRC_QS10 SEA_QS13 BEG0 ) Q52 = STRLEN ( SRC_QS10 )
这一组的预期结果为Q50=0、Q52=6。只把QS13改为ZZ,再执行搜索行,预期Q50=6。不要把重新声明关键词后的旧Q50拿来判断:赋值与搜索是不同的程序段。
对本文的非空条件,命中位置落在0到源长度减1之间;未命中结果等于源长度。若业务要求“必须以PART开头”,条件就是命中位置为0;若允许关键词出现在任意位置,则需要确认结果处于有效位置范围。前者不是后者的缩写。
BEG2不是“从第二个字符开始”
BEG使用同一套从0开始的位置编号。BEG2表示从第三个字符开始搜索。把源串换成PART-PART,源长度是9:从BEG0开始会命中第一组PART,返回0;从BEG2开始跳过第一个起点,会命中第二组,返回5。这个5仍是源串中的绝对位置,不是从BEG2另起算得到3。

手册还明确:存在多个匹配时,INSTR返回本次搜索找到的第一个位置。想检查第二处出现,必须设计新的搜索起点;重复执行同一个BEG0,不会自动推进到下一处。
别把STRLEN的-1搬给INSTR
同版手册给STRLEN的规定是:所选字符串参数未定义时返回-1。这是长度函数的未定义状态,不是INSTR“关键词不存在”的返回值。先确认源串及关键词已按程序意图赋值,再解释搜索结果,能避免把未赋值、空内容和未命中混成一个问题。
这里不定义空搜索串、中文字符计数、越界BEG的通用处理规则。实际工件标签若包含这些条件,应补上对应输入约束,不能把本例的PART-A算例扩大成所有文本输入都可放行。
修改后处理或宏时,可先按后处理安全修改的对比方法隔离这段字符串判断,记录源串、关键词、BEG、返回位置和长度五项。本文数字来自字符计数与官方返回规则推导,没有声称已经在机床上运行。
资料依据:HEIDENHAIN TNC 640 Klartext编程手册,NC 34059x-17,10/2022,字符串赋值见第324页,INSTR见第330页,STRLEN见第331页。