ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ABB机器人组合信号GO/GI:原理、配置与避坑指南

ABB机器人组合信号GO/GI:原理、配置与避坑指南

简介:这份PDF文档面向使用ABB机器人进行自动化集成与PLC通信的工程师及学习者,聚焦数字量、模拟量之外的第三种信号类型——组合输入输出(GO/GI),解决多路DO/DI顺序赋值导致程序臃肿、PLC易误判的问题。文档从概念入手,说明组信号如何将两个以上数字信号合并为单一信号,再以组输出GO为例完整演示Signal配置流程:命名、选择Group Output类型、匹配IO单元、按地址连续与否填写Device Mapping(如1-3或1,4,6),并强调重启生效。核心部分讲解GO值的二进制计算原理,用DO1=1、DO2=0、DO3=1对应输入5的实例说明位序与加权关系,并指出GI配置与计算方向相反、方法可参照GO。资源包仅含1个PDF文件,大小约1.16MB,篇幅精炼、图文步骤清晰,适合现场调试时快速查阅。目前已有929人学习,可作为组信号配置与排错的操作参考。

1. 组合信号:为什么三条 DO 分开写,PLC 反而更容易误判

在 ABB 机器人里写 IO 交互,很多人第一反应是老老实实一行行SetDO:DO1 置 1、DO2 置 0、DO3 置 1,三条指令依次执行。看起来逻辑清清楚楚,可一旦对面是 PLC,这套写法就埋了雷。三条指令不是原子操作,中间隔着控制器扫描周期和通讯刷新,PLC 完全可能在第 1 条和第 2 条之间读到「DO1=1、DO2 还是旧值」的中间态,于是把一次取料完成误判成别的状态。组合信号 GO/GI 解决的正是这件事:把多个数字量打包成一个整体,一次赋值、一次刷新,让 PLC 看到的状态永远是一致的。搞懂它,本质上是搞懂机器人 IO 的位映射和刷新机制,而不是记住一个配置界面。

2. 组合信号的底层机制:一个整数怎么变成三根线

2.1 从「顺序赋值」到「一次写入」的语义差别

普通 DO 是单点信号,每条SetDO指令只改一个位。控制器执行指令是串行的,写 DO1 之后要等下一个扫描周期才轮到 DO2,这中间的时间窗口就是误判的温床。组合输出 GO 在控制器内部被当成一个整型变量看待,你给 GO 赋一个值,控制器在同一个刷新周期里把这个整数的各个二进制位一次性拆开、映射到对应的物理 DO 上。也就是说,对上层程序而言只有「一次写」,对底层硬件而言是「同一拍输出」。

这个差别在时序上非常关键。假设控制器扫描周期是 4ms,三条SetDO最坏情况下跨越 8ms 以上,PLC 的输入刷新如果恰好落在中间,读到的就是半成品状态。而 GO 赋值只占一个周期,PLC 要么看到旧值、要么看到新值,不存在中间态。常见的实现思路是:组信号在控制器内部维护一个影子寄存器,赋值时先写寄存器,周期末统一刷到 IO 总线,这就是它能做到「同时」的原因。

2.2 位序、地址与二进制权重的对应关系

GO 的值不是随便填的,它由「绑定了哪些 DO」和「这些 DO 在组里的排位」共同决定。配置时在 Device Mapping 里填的地址列表,决定了位序:列表第一个地址对应最低位(2 的 0 次方),第二个对应 2 的 1 次方,依此类推。所以地址连续填1-3,意味着 DO1 是 bit0、DO2 是 bit1、DO3 是 bit2。

要让 DO1=1、DO2=0、DO3=1,就是 bit0 和 bit2 置位,值为 2⁰ + 2² = 1 + 4 = 5。这里有个容易绕晕的点:原文例子里写的是 2⁰+2²=5,对应的是 DO1 和 DO3,因为 DO1 排第一位、DO3 排第三位。位序看的是「在映射列表里的位置」,不是 DO 编号本身。地址不连续时填1,4,6,那么 DO1 是 bit0、DO4 是 bit1、DO6 是 bit2,此时给 GO 赋 5,置位的是 bit0 和 bit2,也就是 DO1 和 DO6,而不是 DO1 和 DO3。这个映射关系一旦配错,现象就是「值对了但输出到错的针脚」,排查起来非常费劲。

2.3 GI 的反向解码:输入侧同样是一次采样

组输入 GI 是镜像逻辑。PLC 把多个 DI 状态打包成一个整数写过来,机器人侧读 GI 得到的是一个整数值,再按同样的位序拆回各个 DI。它的价值同样在于一致性:如果分开WaitDI三条,第一条满足、第二条还没满足时程序就往下走了,逻辑上等于读到了撕裂的输入快照。用 GI 则是一次采样拿到完整组合,程序里判断GI1=5就等价于「DI1=1 且 DI2=0 且 DI3=1」同时成立。

下面这段伪代码对比了两种写法在语义上的差异,注释标出了关键点:

# 传统写法:三次独立读写,中间存在时间窗口 SetDO(DO1, 1) # 此刻 PLC 可能已读到 DO1=1, DO2=旧值 SetDO(DO2, 0) SetDO(DO3, 1) # 三条全部生效前,状态不一致 # 组合信号写法:一次赋值,控制器周期末统一刷新 GO1 = 5 # bit0=DO1, bit2=DO3,同一拍输出 # 输入侧同理 if GI1 == 5: # 一次采样,等价于 DI1=1 且 DI2=0 且 DI3=1 pass

参数上要盯住两件事:一是映射列表的顺序,它决定权重;二是组信号的位宽,配置了几个地址就只能表达 2 的几次方种状态,超出范围的值会被截断或报错,这一点在后面的排查章节会展开。

3. 配置链路拆解:从 Signal 界面到重启生效

3.1 信号类型与设备绑定为什么必须对齐

在 Signal 配置里新建信号,Type of Signal 选 Group Output,这一步只是声明了「这是个组」。真正决定它管哪几根线的是 Assigned to Device 和 Device Mapping:前者选 IO 单元,必须和要绑定的那些 DO 属于同一个设备,否则映射根本落不到物理通道上;后者填地址列表,必须和已有 DO 的地址严格一致。常见的翻车是设备选错——现场有多个 IO 单元时,地址数字看起来对得上,但绑到了另一个单元,结果 GO 赋值后物理输出毫无反应。

地址填写有两种形式:连续用1-3,离散用1,4,6。这里没有「智能推断」,填什么就是什么,顺序即权重。配置完成后必须重启机器人,因为组信号的映射表是在控制器启动时加载的,热改不会立即生效。很多人配完直接测试发现没反应,八成是漏了重启这一步。

3.2 值的计算:把需求翻译成二进制再翻译成十进制

实际编程时不要心算二进制,容易错位。稳妥的做法是先列出「哪些位要为 1」,再按位序求和。比如映射是1,4,6,需要 DO1 和 DO6 输出,那就是 bit0 和 bit2,值 1+4=5。如果需求变成 DO4 和 DO6,就是 bit1 和 bit2,值 2+4=6。可以用一段小脚本辅助核算,避免现场手算出错:

# 根据映射列表和目标 DO,算出 GO 应赋的整数值 mapping = [1, 4, 6] # Device Mapping 里填的地址顺序,即位序 targets = [1, 6] # 希望置 1 的 DO 地址 value = 0 for do_addr in targets: bit = mapping.index(do_addr) # 在映射列表中的位置就是位号 value |= (1 << bit) # 按位或,累加权重 print(value) # 输出 5

这段逻辑的关键在mapping.index():位号来自列表位置而非地址数值,这正是前面强调的映射顺序决定权重。1 << bit把位号转成 2 的幂,|=累加。现场如果映射改了,只改mapping列表即可,计算逻辑不用动,比背公式可靠。

3.3 双向通讯里的角色分工

GO 和 GI 在一条完整握手里是成对出现的。机器人用 GO 告诉 PLC「我取料完成了」,PLC 用 GI 告诉机器人「去取 1 号物料」。设计时要把这两条链路的值约定写进通讯协议文档,明确每个位代表什么、哪些组合是合法状态。因为组信号本质是「打包的布尔向量」,它不携带语义,语义全靠双方约定。约定不清时,一个值可能被两边解读成不同含义,这类问题在联调阶段最难查,因为单看机器人侧或 PLC 侧都「没错」。

4. 避坑与排查:组信号现场最常见的五个坑

4.1 配完不重启,赋值毫无反应

现象:Signal 里配置齐全,程序里给 GO 赋值,物理 DO 不动。原因:组信号映射表在控制器启动时加载,配置改动未生效。解决:确认配置后完整重启,等启动完成再测,不要用热改后的状态直接判断对错。

4.2 地址顺序填反,输出跑到别的针脚

现象:值算对了,但置 1 的是意料之外的 DO。原因:Device Mapping 的列表顺序就是位序,填6,4,1和填1,4,6权重完全相反。解决:配置时按「低位在前」的习惯书写,并在协议文档里记录顺序,测试时逐位验证而不是只看总值。

4.3 值超出位宽被截断

现象:给 GO 赋了一个较大的数,高位对应的 DO 没反应。原因:组只绑定了 N 个地址,只能表达 0 到 2^N−1,超出部分无效。解决:赋值前确认位宽,程序里加范围校验,避免把「值写大了」误判成硬件故障。

4.4 设备选错,映射落空

现象:地址数字和 DO 完全一致,但组信号控制不了任何输出。原因:Assigned to Device 选到了另一个 IO 单元。解决:核对 DO 所属设备与组信号所属设备是否同一个,多单元现场尤其要逐项确认。

4.5 只改一侧协议,握手对不上

现象:机器人发 5,PLC 收到的却是别的值或判为非法。原因:两侧对位序或合法组合的约定不一致,或 PLC 侧解析时按了不同顺序拆位。解决:把位定义、合法值、刷新时序写进同一份协议,联调时用固定测试值逐位核对,不要靠「看起来能跑」过关。

5. 设计取舍:为什么用整数打包,而不是给每条信号加时间戳

组信号这套机制的核心取舍是「用位宽换一致性」。它把多个布尔量压进一个整数,代价是表达能力受限于 2^N,且语义完全依赖双方约定;收益是刷新原子化、程序简洁、PLC 不会读到撕裂状态。有人会问,为什么不给每条 DO 加时间戳或序列号来保证顺序?那样做通讯开销大、PLC 侧解析复杂,而工业现场绝大多数握手只需要「一组状态同时可见」,整数打包正好匹配这个需求。另一个取舍是配置期绑定而非运行期动态映射:映射表在启动时固化,换来的是刷新路径短、确定性高,代价是改映射必须重启。这符合产线对确定性的偏好,而不是灵活性。

验证这套机制是否真的生效,我习惯用固定值做逐位回读:给 GO 依次赋 1、2、4,观察对应 DO 是否单独动作,再赋 5 看组合是否正确,输入侧用 PLC 强制 GI 值反向验证。这套动作能同时暴露位序错、设备错、位宽不足三类问题。从那以后我每次配组信号,都强制先跑一遍单位、双位、组合三档回读再进联调,省下的排查时间远比这几分钟多。希望帮到你。

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进