简介:《广数980TD系列信号采集信号线定义》面向数控车床初学者、在线操机员与维修人员,聚焦广数980TD系统在机床信号采集与输出接线中的识读与排故需求,帮助读者在设备调试、日常维护和故障定位时快速对照信号定义。包内共1个docx文档,压缩包约814KB,内容集中、便于检索核对,主要围绕980TDi与980TDc两种机型的62A输出接插件展开。文档具体列明Y2.5运行信号对应34号、Y2.6计数信号对应35号、Y2.7报警信号对应36号,并说明IO采集盒COM端接+24V电源接口,可作为接线核对与异常排查的参考。已有3166人学习,适合需要建立信号采集基础、提升操作与维修效率的技术人员收藏备用。
1. 三个端子的错觉:为什么照着图纸接线仍然采不到信号
很多人第一次给数控车床接状态采集,都是照着图纸把 34、35、36 三根线拧到端子上,通电,然后发现运行信号一直是高电平、计数信号一个数都不涨。图纸没问题,问题出在把“端子号”当成了“信号”本身。980TD 系列的这份信号线定义里,真正决定成败的东西藏在两个不起眼的位置:一是 Y2.5 这个软元件地址,它要经软元件地址、模块点号、物理脚位三层映射,才能落到 62A 接插件的 34 脚;二是定义末尾那句“IO 采集盒 COM 端接 +24V 电源接口”背后的电流回路方向。前者决定你读的是不是那个点,后者决定你读到的电平是不是反的。搞懂这两件事,三根线才从“能接上”变成“能读对”。
2. 地址的三层映射:Y2.5 是怎么走到 62A 的 34 号脚的
2.1 软元件地址不是端子号,它是字节加位
Y2.5 这个写法里,Y 表示 PLC 的输出线圈区,2 是字节地址,5 是位号。一个字节装 8 个点,所以 Y2 这一个字节里排着 Y2.0 到 Y2.7 共 8 个输出点,运行、计数、报警正好占了最高的三位。常见实现是:系统每个扫描周期把输出映像寄存器整字节刷到 IO 模块,模块再把每位的通断推到对应端子。于是“我要读运行”在软件侧的操作,本质是读某个字节的第 5 位。
这里有个容易被忽略的设计动机:为什么偏偏挑 Y2.5、Y2.6、Y2.7 三个连着的位,而不是散落在 Y0、Y5、Y9?因为连着排在一个字节里,采集端可以一次读字节拿到三个状态,省掉三次寻址,也方便在梯形图里用一条字节比较指令做“组合状态判断”。这是典型的“把面向外部的信号集中成一段”的做法。前面那些字节通常分给了刀架转位、冷却、主轴、卡盘这类强电负载,它们变化频繁、对时序敏感,不适合跟状态指示混在一起。
真正需要留心的点在于:Y 地址是软的,端子的编号是硬的。这中间的映射关系不写在电气原理图上,也不会由地址本身推出来,而是由机床厂的接口定义固定下来。同样一个 Y2.5,不同批次的机床完全可能落到 62A 的不同脚上。所以理解这段定义,正确的姿势不是背“34 是运行”,而是建立“软元件地址 → 模块点号 → 接插件脚位”这条链,并且每换一台机床都重新核一遍这条链。
2.2 模块点号是中间那层,62A 是最后那层
完整的三层是这样的:第一层 Y2.5 是编程地址;第二层是 IO 模块上的物理点序号,比如“本模块第 14 点”;第三层是 62A 输出接插件的第 34 号脚。中间这层最容易被跳过,但它恰恰是排错时最有用的锚点,因为模块面板上通常有点位指示灯,你可以一边看灯一边对地址,不需要碰万用表。
980TDi 和 980TDc 在这个位置上的定义是一致的:都是 62A 输出接插件,Y2.5 对 34 号脚走运行,Y2.6 对 35 号脚走计数,Y2.7 对 36 号脚走报警。两个型号保持这一段兼容,对做采集的人是很实际的便利:同一套线束、同一张映射表能覆盖两种机床。但不要把这种一致性外推,型号不同意味着系统版本、PLC 程序结构、甚至整个 IO 分区的起始地址都可能不同,只有这三个点是被特意对齐过的。血泪经验是:只验证了这三个点就以为整张表通用,接别的信号时全错位。
| 软元件地址 | 语义 | 62A 脚位 | 信号类型 | 典型持续 |
|---|---|---|---|---|
| Y2.5 | 运行 | 34 | 电平 | 整个循环 |
| Y2.6 | 计数 | 35 | 脉冲 | 几十毫秒 |
| Y2.7 | 报警 | 36 | 电平(可能锁存) | 直到复位 |
这张表就是采集程序的骨架。把它写成代码里的常量,比写在注释里靠谱得多,因为后面做取反、做去抖、做通道命名检查时都要用它:
# 三层映射固化成一个字典:plc_addr 是给人看的,terminal 是给接线工看的 # active_level=0 表示低电平有效,理由在第 3 章展开 IO_MAP = { "Y2.5": {"point": 14, "terminal": 34, "name": "RUN", "active_level": 0, "kind": "level"}, "Y2.6": {"point": 15, "terminal": 35, "name": "COUNT", "active_level": 0, "kind": "pulse"}, "Y2.7": {"point": 16, "terminal": 36, "name": "ALARM", "active_level": 0, "kind": "level"}, } def addr_to_channel(plc_addr: str) -> int: """把 PLC 软元件地址翻成采集盒通道号,通道号 = 模块点号 - 1""" item = IO_MAP[plc_addr] return item["point"] - 1point用 1 起算、通道号用 0 起算,这种差一在接线和查寄存器时是经典翻车点。kind字段看着多余,实际决定后面用哪条处理路径:电平信号直接读,脉冲信号必须挂边沿检测。active_level不写死成常量而是放进表里,是为了照顾不同机床厂的接法差异,改一个数字比改十处判断安全。
2.3 建完表怎么验,顺序比方法更重要
验证映射对不对,方法很朴素:让机床进一个已知动作(比如空跑一个循环),万用表直流电压档,黑表笔固定夹在机床的 0V 上,红表笔点 34 号脚,看电压是否随动作翻转。然后再点 35、36,看是不是分别对应循环计数和报警。
但顺序上有个讲究——先验极性,再验点位。原因很简单:如果极性判断错了,你会看到 34 号脚“一直有电压”,第一反应是“点位接错了”或者“地址不对”,于是开始动线、改地址,越改越乱。正确的做法是先确认“这个脚在动作时电压确实是变化的”,锁定变化,再去确认“变化的是不是我要的那一路”。把两件事混在一起查,会让你同时怀疑接线、映射、极性三个变量,这是现场最容易失控的局面。
断电状态也值得单独确认一次。系统上电初始化的瞬间,输出映像寄存器会先整体清零再按程序装载,某些输出点在毫秒级里会出现一次短暂的通断。如果你的采集端在开机后立刻采信,很容易收到一条假的“运行中”或者一次假的计数。这不是映射问题,但会被误判成映射问题,所以验证时把“上电头几秒”单独看一遍,能省掉后面很多冤枉路。
3. COM 接 +24V:一条回路决定了你的电平是反的
3.1 电流从哪来、往哪走
采集盒的每个输入通道内部基本都是一颗光耦,COM 端是这些光耦的公共端。定义里明确写“COM 端接 +24V 电源接口”,意思就是所有光耦的阳极被统一拴在 +24V 上。光耦要发光,阴极那一侧——也就是接到 34 号脚的那根线——必须被拉到接近 0V,电流才有通路。完整回路是:+24V 电源 → 采集盒 COM → 光耦发光二极管 → 通道输入端子 → 62A 的 34 号脚 → 机床内部的输出三极管 → 机床侧 0V。
这条回路一旦画出来,结论就固定了:机床那一路输出必须是“导通时把端子拉到 0V”的类型,也就是常说的漏型输出。因为只有它导通时把 34 号脚接到 0V,采集盒的光耦才会亮。反过来,如果机床是导通时输出 +24V 的源型,那么端子对 COM 同电位,光耦两端没有压差,无论机床怎么动作,采集端读到的永远是“断开”。这不是灵敏度问题,是物理上就没有电流。
所以那句“COM 接 +24V”不是一句接线备注,它是整个采集链的电平契约。它决定了你在软件里看到的 1 到底代表机床在运行还是没运行,也决定了取反逻辑写在哪一层。
3.2 三步判断极性,别靠猜
现场判断极性,我一般走三步,每一步都有明确的观测对象,不靠经验拍脑袋。
第一步,断电测阻值特征。万用表电阻档,一支表笔固定在 0V,另一支点 34 号脚,如果读到一个明显的二极管压降特征(几百欧到几千欧,且换表笔后读数差异大),说明这条路上有半导体结,基本可以确认是输出三极管而不是机械触点。
第二步,上电但机床空闲,测对 0V 的电压。读数接近 24V,说明空闲状态端子被上拉到高,导通时大概率拉低;读数接近 0V,说明空闲是低,导通时才给高。这一步就把极性定了大半。
第三步,让机床真正跑起来,再测一次同一个脚。看电压是否翻转、翻转方向是否和第二步的推断一致。三步走完,极性就没有悬念了,不需要去猜梯形图怎么写的。
代码侧的对应处理是这样:
def normalize(raw_bits: int, mask: int, active_level: int) -> bool: """ raw_bits: 采集盒读回的原始字节 mask: 取位掩码,例如 Y2.5 对应 1 << 5 active_level: 0 表示低电平有效(共阳接法 + 漏型输出) 返回: True 表示该信号当前“有效” """ raw = 1 if (raw_bits & mask) else 0 return raw != active_level if active_level in (0, 1) else bool(raw)mask用移位而不是写死的十进制数,是为了让“第几位”这件事在代码里可见。active_level用一个常量而不是在每个判断里写not,好处是换机床只改一处。这段逻辑看着简单,但把它放在统一的入口函数里,比散落在十几个地方各写一遍if not x要安全得多——踩过的坑是某处漏了一个取反,结果报警和运行的含义整体对调,排查了半天才发现是两行代码的差异。
3.3 共阳接法绕不开的那个“共地”
这里有个必须提前想清楚的问题:共阳接法意味着信号电流要回到 +24V 电源的负极,也就是 0V。采集盒的 0V 和机床输出侧的 0V 必须是同一路,否则回路不闭合,光耦照样不亮。很多采集盒标称“光耦隔离”,容易让人误以为两侧电源可以完全独立,但那是针对差分输入或者双端输入的结构;定义里这种 COM 接 +24V 的单端共阳接法,物理上就要求共 0V。
共 0V 带来的副作用是干扰路径也连通了。机床侧接触器吸合、主轴启停、变频器工作,都会在 0V 线上叠加尖峰。这些尖峰进了采集盒,表现就是报警通道偶尔闪一下、计数值莫名多一个。所以共地这件事的正确做法不是“不共”,而是“共得干净”:24V 与动力线分开走槽、信号线用屏蔽双绞并且只在采集盒一侧接地、感性负载线圈两端加续流二极管。这些不是可选项,是让那三根线长期稳定的前提。
如果极性确实对不上,比如机床是源型输出,那解决办法是把 COM 从 +24V 改接到 0V,同时确认采集盒支持这种接法。改之前务必断电核对,因为把 +24V 和 0V 直接短在一起,轻则烧采集盒保险,重则连机床侧的输出三极管一起带走。
4. 三个信号的时序语义:运行、计数、报警根本不是一类东西
4.1 运行是电平量,怕的是毛刺不是速度
运行信号在整个加工循环里保持有效,你用几秒一次的频率去读都不会漏。它的风险不在采样率,而在于你对“有效”的语义假设。同一个 980TD 系列,不同机床厂写梯形图的方式可能不同:有的在循环启动后就置位,暂停、单段、换刀过程中一直保持;有的只在切削进给时有效,快速定位时就撤销。这两种做法都能叫“运行”,但采到的数据含义完全不同。
所以拿到一台新机床,建议先做一次语义标定:手动走一段慢速进给、再走一段快速定位、再按暂停,把运行信号的变化点和实际动作一一对上,记下它在哪些阶段是有效的。这个动作花十分钟,能避免后面几个月的数据被错误解读。
另一个必须处理的是上电毛刺。系统初始化时输出映像寄存器会整体刷新,某些中间继电器也会抖动,34 号脚可能在几十毫秒内出现一次假的有效电平。采集端如果直接采信,就会凭空多出一条“运行记录”。常见的实现思路是加一个启动屏蔽窗口,比如上电后前 3 秒不产生任何状态事件,或者要求运行信号连续保持 500ms 以上才确认为真。
4.2 计数是脉冲量,这是一场采样周期和脉宽的赛跑
计数信号和运行信号完全不是一类。它是在每个工件完成、或者每个循环结束时发一个脉冲,宽度可能只有一个 PLC 扫描周期,几毫秒到几十毫秒。如果你的采集端是每秒轮询一次寄存器,那么丢失计数就是必然事件,不是偶发故障。
最让人抓狂的地方在于它的表现是“有时候准有时候不准”。因为脉冲什么时候来、你的轮询什么时候到,两者的相位关系是随机的。跑一百个工件,可能丢三个,也可能一个不丢,看起来像玄学,本质是采样定理在起作用:采样周期必须小于脉冲宽度,否则必然漏掉。
工程上有两条路。一是把采样周期压到脉宽的十分之一以下,比如 100ms 甚至 50ms 轮询,代价是通讯负载上升。二是用采集盒的硬件计数或者输入捕获功能,让硬件自己数边沿,软件只负责定期读计数值,这也是我更推荐的做法,因为它把“不漏”这件事从软件时序问题变成了硬件保证。
即便采样够快,边沿检测也不能省。只比较“当前电平”和“上一次电平”,从低到高算一次,才能保证一个脉冲只计一次:
class EdgeCounter: def __init__(self, active_level=0, min_pulse_ms=20, poll_ms=50): self.active_level = active_level self.min_pulse_ms = min_pulse_ms # 短于这个宽度的抖动直接丢弃 self.poll_ms = poll_ms self.prev = False self.count = 0 self.last_edge_ts = 0 def feed(self, raw_bit: int, ts_ms: int): cur = (raw_bit != self.active_level) # 归一化成“有效=True” if cur and not self.prev: # 上升沿 if ts_ms - self.last_edge_ts >= self.min_pulse_ms: self.count += 1 self.last_edge_ts = ts_ms self.prev = curmin_pulse_ms是去抖窗口,比它窄的“边沿”一律当噪声。poll_ms必须明显小于最小脉宽,否则再好的去抖也救不回丢掉的脉冲。last_edge_ts除了去抖,还顺手记录了时间戳,后面算节拍、算设备利用率都要用它。这三个参数不是拍出来的,是拿示波器或者高速采样实测出脉宽之后再定的。
4.3 报警可能是锁存的,别只看实时电平
报警信号看着最像运行信号,其实差别很大。运行是“过程状态”,报警是“事件状态”。问题在于 36 号脚输出的到底是不是锁存后的报警:有的机床厂让它在报警存续期间保持有效,报警复位后自动撤销;有的做成一旦触发就保持,直到人工按复位。前者你实时读电平就够了,后者如果你只在报警消失后才去读,就会完全错过这次故障。
稳妥的做法是在采集侧自己加一层锁存:记录报警首次触发的时间戳、持续时间、以及在这段时间里运行信号和计数值的状态,形成一个最小的事件快照。这样即便机床侧不锁存,你这边也有后悔药。表结构不用复杂,一张事件表加一张当前状态表就够:
| 字段 | 含义 | 取值示例 |
|---|---|---|
| alarm_start_ts | 报警首次有效的时间 | 毫秒时间戳 |
| alarm_end_ts | 报警撤销时间,未撤销为空 | 毫秒时间戳 |
| run_state_at_start | 报警发生时是否在运行 | 0 / 1 |
| count_at_start | 报警发生时的累计计数 | 整数 |
| source_channel | 来源通道(36 号脚) | 16 |
run_state_at_start和count_at_start这两个字段看着是冗余,实际是排障时最有用的信息:报警发生时到底在不在加工、已经做了多少个工件,这两条一摆出来,很多“偶发报警”立刻能定位到具体工序。
4.4 把三路合成一个状态机
三路信号最终要合成一个说得清的状态。我习惯用三个状态加一个独立累加器:空闲、运行、报警,计数独立走。状态优先级是报警高于运行高于空闲,因为报警期间即使运行信号还有效,对外也应该报故障。
这个状态机不需要写得很重,十几行就够,关键是每次状态迁移都要带时间戳,并且落盘。采集这类信号最怕的不是采不到,是采到了但说不清“什么时候变成这样的”。带时间戳的状态迁移序列,比任何实时曲线都好用。
5. 常见问题排查:五条现场踩坑记录
5.1 线接好了,通道指示灯就是不亮
现象:34 号脚接到采集盒通道上,机床运行,采集盒对应的指示灯不亮,软件里读到的也一直是无效。
原因:最常见的是 COM 端没接 +24V,或者接成了 0V。定义里那句备注是整条回路的起点,漏掉它,后面所有的接线都是空接。第二常见的是采集盒电源没上或者保险断了,指示灯不亮但接线看起来完全正确。
解决:先测 COM 端对 0V 是否有 24V,没有就先解决供电;再量通道端子对 0V 的电压,机床运行时应该接近 0V。两步都正常但灯不亮,才去怀疑通道本身坏了或者映射表错了。
5.2 信号一直有效,从来不翻转
现象:无论机床在不在加工,采集端显示运行信号恒为有效,计数也一直不变。
原因:极性和机床输出类型不匹配。采集盒共阳接法要求机床是漏型输出,如果机床是源型,端子对 COM 同电位,光耦常亮或常灭,读出来就是一个不动的值。另一种可能是端子接错了一位,34 接到了 33 或者 35,读到的其实是另一路信号。
解决:断电改接前先用万用表按第 3 章的三步走一遍,确认端子电压是否随动作翻转。如果电压确实翻转而软件不翻转,问题在采集盒侧;如果电压根本不翻转,问题在极性或点位。
5.3 计数值偶尔多一个或少一个
现象:跑一百个工件,采集端统计出来 98 或 101,差值不固定。
原因:少计数通常是采样周期大于脉冲宽度。多计数通常是触点抖动或者干扰把一个脉冲读成了多个。这两种现象方向相反,但都表现为“计数不准”,容易混在一起查。
解决:先用高速采样或示波器实测脉宽,再定采样周期和去抖窗口。采样周期要明显小于脉宽,去抖窗口要小于脉宽但要大于抖动时间。这两个参数的取值区间其实很窄,必须实测,靠拍出来的值迟早出事。
5.4 一开机就显示“运行中”
现象:机床刚上电,还没按启动,采集端已经记了一条运行记录。
原因:上电瞬间输出映像寄存器刷新、中间继电器吸合抖动,34 号脚上出现了毫秒级的假有效电平。采集端如果上电就开始采信,第一个事件一定是假的。
解决:加启动屏蔽窗口,上电后前几秒不产生状态事件;同时要求运行信号连续保持一定时间才确认。这两条一起上,比只做其中一条稳。
5.5 主轴启停时报警信号闪一下
现象:机床正常加工,每次主轴启动或者接触器动作,报警通道偶尔出现一次短暂有效,但机床上并没有报警显示。
原因:干扰。信号线和动力线同槽走线,感性负载断电时的反电动势耦合到 24V 回路里,采集盒看到的是一个窄脉冲。共 0V 的接法让这条耦合路径更通畅。
解决:信号线与动力线分开走线,屏蔽层单端接地,接触器线圈两端加续流二极管,采集侧再加一道软件去抖。电气侧治本,软件侧兜底,两边都做才稳。
6. 设计取舍:这套定义够用,但你必须知道它哪里不够
这套三线定义最值得琢磨的地方,是它选择用三个独立的物理点表达三个正交语义,而不是用一根线传一串编码。代价是占用三个输出点和一个接插件脚位,收益是每一路都独立、可单独验证、互不影响,而且采集端不需要任何解析逻辑——读位就是读状态。对于一台数控车床对外暴露的状态需求来说,这个取舍是划算的:运行、计数、报警恰好构成一个最小的可观测集合,再多就是浪费,再少就说不清设备在干什么。
第二个取舍在电平上。COM 统一接 +24V,把采集盒做成共阳输入,迫使机床侧输出走漏型,好处是公共端只有一根线、接线简单、抗干扰时正电源作为参考电位更稳,坏处是它绑死了机床的输出类型,遇到源型机床必须改接。这是典型的“用兼容性换简洁性”,也是为什么定义里要专门写一句备注——那句话是在提醒你,这套接法的前提条件在哪。
这套定义真正缺的东西也很清楚:没有握手、没有断线检测、没有时间同步。采集端无法区分“信号有效”和“线断了被上拉成有效”,只能靠“某个信号长时间不变化”来间接怀疑。所以如果要在这套基础上做上位系统,有三件事必须自己补上:给每一路加变化检测和心跳,超过阈值不变就报可疑;给每条事件打本地时间戳,并且定期和上位机对时;把原始电平和归一化后的语义分开存,方便回头核对是不是取反错了。
我最早做这块的时候,觉得三个端子接上就完事了,结果在一台机床前耗了整整一个下午,最后发现是 COM 接错到了 0V。从那以后我每次动手接线之前,都强制走一遍“先看 COM 对 0V 的电压、再看端子随动作是否翻转、最后才看软件读到的值”这个顺序,再急也不跳步。顺序对了,问题基本都出在第一层;顺序乱了,三层会一起骗你。希望帮到你。
本文还有配套的精品资源,点击获取