简介:面向工业自动化工程师、PLC系统集成与现场调试人员的一份以太网通讯配置资料,聚焦罗克韦尔AB Compact系列与西门子S7-1500之间的跨品牌数据交换,借助IGT-DSER智能网关以免编程方式完成配置。资源包仅含1个PDF文件,约453KB,篇幅紧凑,便于随查随用。文档围绕AB侧IN_INT16/OUT_OUT16数组与S7侧DB101、DB102数据块的建立与对应关系展开,说明取消优化访问、下载重启使配置生效等关键细节;同时给出网关双网口IP规划、设备ID、起始地址、字节数量及44818/102端口设置方法,并配合RSLogix 5000与博图强制数据测试验证双向传输。已有2189人学习,适合需要快速打通AB与西门子PLC通讯、降低集成成本的读者作为配置参考和排错思路。
1. 一条产线两套 PLC,160 字节数据要来回跑
老产线上一台罗克韦尔 AB 的 CompactLogix 跑得稳稳当当,新上的工位偏要加一台西门子 S7-1500,两边各有各的编程软件和变量体系,中间还得交换 160 字节输入、80 字节输出。这种活儿通常有三种干法:加通讯模块、在两边各写一套 Socket 或 OPC 程序、塞一台智能网关做数据映射。前两种都要写代码,还得有人长期盯着重连和超时;第三种是配置化的,罗克韦尔 AB 与西门子 PLC 之间的以太网通讯只填起始地址和数量,不写一行程序。IGT-DSER 属于后面这一类,支持多点对多点、以太网与串口混合、热插拔和断电自恢复。下面按现场实际顺序拆:数组怎么建、DB 怎么取消优化、类型 4 怎么切、映射表每一列填什么、哪一步最容易翻车。
2. 链路先算清楚:CIP 与 S7 的协议差异,以及双网口网关在中间做了什么
2.1 两个协议栈差在哪,不编程到底省掉了哪一层
AB 的 PLC 走 EtherNet/IP,底层是 CIP,显式报文落在 TCP 44818 上,寻址方式是符号化的标签名,RSLogix 5000 里看到的IN_INT16就是控制器标签;西门子 S7-1500 走 S7 通讯,端口 102,数据块默认是「优化的块访问」,只暴露符号不暴露稳定偏移,第三方设备想按字节读写,必须先把优化访问取消掉。两套协议在报文结构、寻址方式、字节序上都不是一路的。
网关在里面扮演的是双客户端角色:一侧做 CIP 客户端去读写 AB 的标签,另一侧做 S7 客户端去读写 DB 的字节偏移,中间维护一张映射表和一套调度循环,按周期把源区的字节复制到目标区。省掉的是两边各写通讯程序、处理连接断开重连、做元素宽度换算和大小端对齐这些活;省不掉的是数据区规划、类型一致性核对和偏移校验,这几件事只要错一个,网关状态栏就会给你脸色看。
有些现场会选 OPC UA 服务器做中转,常见做法是找一台工控机常开,装服务、配通道、再做变量映射。这套方案不是不行,但多了一台需要维护的主机,系统补丁、授权、掉电重启后的服务自启都得管。网关是嵌入式设备,配置下载完就自己跑,断电再来电自动恢复,这是它在这类「两个品牌、两套网段、数据量不大」的场景里最实用的地方。要注意的是它只做数据搬运,不做逻辑运算,别指望在网关里写联锁。
2.2 双网口加设备 ID:不改现场网段的路由模型
现场地址是这样的:AB 的 PLC 是 192.168.1.9,S7-1500 是 192.168.2.111,压根不在一个网段。网关网口 1 默认 192.168.1.244,网口 2 默认 192.168.2.244,各自落在对应网段里,等于一台双宿主机分别跟两边说话。所以既不用改 PLC 的 IP,也不用在现场交换机上加路由,更不用把两个网段硬拧到一起。
设备 ID 是映射表里的逻辑编号,范围 1~254,自由分配。它跟 IP 不是强绑定关系,映射表的每一条只认「设备 ID 加区」,具体这台设备是哪个 IP,在设备参数里单独配。这样后期换一台 PLC、改一次 IP,只需要改设备那一栏,几十条映射条目不用重排。反过来说,同一个设备 ID 在所有条目里必须保持一致,我见过有人第一条填 1、第二条手滑填 3,结果一条通一条不通,排查了半天。
注意:两个网口不要配成同一网段,也不要让网口 1 的网段里出现第二台 192.168.1.244。地址冲突的表现是网关能搜到但通讯时断时续,很容易误判成网关硬件问题。
2.3 数据区规划:先定方向、字节数与元素宽度
规划这一步偷懒,后面全是返工。统一用「字节」做预算单位,再折算成各侧的元素个数:INT 是 2 字节,DINT 和 REAL 是 4 字节,SINT 是 1 字节。本例的方向和数量先定死:
| 方向 | AB 侧数据区 | 西门子侧数据区 | 字节数 | 元素数 |
|---|---|---|---|---|
| 西门子写到 AB | IN_INT16(INT 数组) | DB101(INT 数组) | 160 | 80 个 INT |
| AB 写到西门子 | OUT_INT16(INT 数组) | DB102(INT 数组) | 80 | 40 个 INT |
命名上有个小经验:别从网关视角取名字,容易把 IN/OUT 弄反。以「谁写这个区」来命名更稳,本例里 IN_INT16 是 AB 的接收区,OUT_INT16 是 AB 的发送区,跟 AB 自己的习惯一致。两侧元素宽度尽量保持一致,一边 INT 一边 DINT 虽然字节数能对上,但元素边界错位,读出来就是一堆看着像又不对的数。
预算可以用一段脚本先算一遍,比拿计算器按可靠:
# 映射预算:根据两侧元素类型和数量,算出字节数与网关"字节数量"参数 ELEM_BYTES = {"BOOL": 1, "SINT": 1, "INT": 2, "WORD": 2, "DINT": 4, "DWORD": 4, "REAL": 4} def plan(name, ab_type, ab_count, s7_type, s7_count): ab_bytes = ELEM_BYTES[ab_type] * ab_count s7_bytes = ELEM_BYTES[s7_type] * s7_count # 字节总数必须相等,否则映射一定截断或越界 assert ab_bytes == s7_bytes, f"{name}: 两侧字节数不一致 {ab_bytes} vs {s7_bytes}" # 元素宽度必须相等,否则同一条目内的元素边界会错位 assert ELEM_BYTES[ab_type] == ELEM_BYTES[s7_type], f"{name}: 元素宽度不一致,会错位" return f"{name}: 共 {ab_bytes} 字节,网关字节数量填 {ab_bytes},{ELEM_BYTES[ab_type]}" print(plan("S7->AB", "INT", 80, "INT", 80)) # 160 字节,填 160,2 print(plan("AB->S7", "INT", 40, "INT", 40)) # 80 字节,填 80,2这段脚本干的事很直白:ELEM_BYTES是元素宽度字典,两个assert分别卡住字节总数和元素宽度,防止有人把 DB 里一半改成 DINT 而数组还是 INT。输出里逗号后面的数字就是后面填表时「字节数量」参数的第二个值,本例是 2,因为 INT 占 2 字节;如果哪天 AB 侧数组改成 DINT,同样的元素数量就要变成160,4。脚本报断言失败时,别急着改脚本,回去把两侧的类型统一。
3. PLC 侧数据区怎么建:AB 的 INT 数组与西门子的非优化 DB
3.1 AB 侧:IN_INT16 与 OUT_INT16 的维度、类型与生效条件
在 RSLogix 5000(或 Studio 5000)里打开控制器标签,新建两个标签:名称IN_INT16,数据类型 INT,维度 80;名称OUT_INT16,数据类型 INT,维度 40。类型别图省事用 BOOL 数组或者自定义 UDT,BOOL 数组在 CIP 里是按位打包的,第三方设备读出来是按字节的,处理起来多一层坑;UDT 则要求网关侧能解析成员偏移,配置复杂度直接翻倍。
新建完标签必须下载并重启 PLC 才会生效,这一步是原文明确写了的,也是我踩过最多次的坑:标签在软件里看得见,网关就是读不到,报标签不存在或者路径无效。原因是控制器标签表在下载后才会重建,光保存不下载,网关拿到的还是旧表。判断方法很简单,RSLogix 5000 里在线状态下看控制器标签列表,如果IN_INT16的「监视值」那列能展开出 80 个元素,说明已经生效。
| 标签名 | 类型 | 元素数 | 字节数 | 方向 | 备注 |
|---|---|---|---|---|---|
| IN_INT16 | INT | 80 | 160 | 西门子写入 | 控制器标签,必须下载重启生效 |
| OUT_INT16 | INT | 40 | 80 | 读给西门子 | 同上,保持元素宽度一致 |
还有一点容易被忽略:标签要建在控制器标签(Controller Tags)下,不要建在某个程序的 Program Tags 里。程序局部标签对外部客户端不可见,网关按名字去找只能扑空。如果确实需要程序局部变量,做法是把它映射成控制器标签的别名,别名同样要下载后生效。
3.2 西门子侧:DB101 与 DB102 与非优化访问
在 TIA Portal 里新建两个全局数据块,号码分别固定为 DB101 和 DB102,DB101 用于写入到 AB 的 PLC,DB102 用于接收 AB 的数据。块内不建议搞复杂结构,直接建基本类型数组:DB101 建Array[0..79] of Int,对应 160 字节;DB102 建Array[0..39] of Int,对应 80 字节。用数组而不是一个个散变量,好处是偏移连续,出问题时按字节偏移一算就能定位到第几个元素。
关键设置是取消「优化的块访问」。S7-1500 的 DB 默认开启优化访问,变量只有符号名没有固定偏移,网关这种按偏移读写的客户端拿不到地址。在 DB 属性里把「优化的块访问」取消勾选,编译下载后,DB 编辑器的偏移量列会出现 0.0、2.0、4.0 这样的具体地址,说明非优化生效了。同样,新建的 DB 要下载并重启 PLC 才会正常参与通讯。
| 数据块 | 元素定义 | 元素数 | 字节数 | 方向 | 关键设置 |
|---|---|---|---|---|---|
| DB101 | Array[0..79] of Int | 80 | 160 | 写到 AB | 取消优化块访问,起始偏移 0 |
| DB102 | Array[0..39] of Int | 40 | 80 | 接收 AB | 取消优化块访问,起始偏移 0 |
还有一个常见误用:DB 里用了Struct嵌套或者String,偏移虽然能算出来,但长度不是直观的字节数,映射表的「字节数量」很难填准。跨品牌通讯的数据区尽量只放基本类型,这样每一侧的字节数都能口算出来,出问题时也好对账。
3.3 起始地址与偏移:0 还是 1,以及多维数组怎么写
AB 侧的「起始地址」填的是标签名,必须与 PLC 内定义的名称完全一致,大小写也要对上,IN_INT16写成in_int16有可能读不到。如果数据区是多维数组,就填数组下标,二维写法是0,0,表示从第一行第一列开始,网关按行优先顺序取字节。这个格式在手册里写得比较靠后,第一次配容易在这里卡住。
西门子侧的「起始地址」填的是 DB 内的字节偏移,不是元素序号。从 DB101 的第一个字节开始就是 0,从 DB101.DBX10.0 开始则是 10。很多人下意识填 1,结果整体错两个字,数据看着像是对上了,实际每个值都偏了一位。判断方法:把 DB 里第一个元素强制成 1001,看 AB 侧对应位置是不是 1001,如果错位就往回查偏移。
起始地址对了,还要确认长度不越界。AB 侧数组只有 80 个 INT,映射条目写 160 字节正好用满;如果误填 200 字节,网关会读到数组外面的内存,表现为末尾几个点乱跳,而前面全是对的。这种「大部分正常、尾部异常」的现象,基本都要往长度越界上想。
4. 网关配置全流程:类型 4、双网口 IP 与映射表逐字段填法
4.1 搜索模块、读默认参数、切到类型 4(IGT-CLI-MEX)
把运行参数设置软件的电脑接到网关网口 1 所在网段,网口 1 默认地址是 192.168.1.244,电脑设成同网段的空闲地址。打开软件搜索模块,搜到后先点「读取默认参数」,把网关当前配置拉回来看一眼,避免在旧配置上叠加修改。
接着走「功能」→「类型与设备选择」,页面里有四种类型,选最下面那一项,点「确认当前选择」,系统会变成IGT-CLI-MEX,也就是多设备数据交互模式。切类型的作用是打开多设备、多方向的数据表能力,默认那种点对点模式只有一组收发,撑不起两台 PLC 各自双向读写。切完之后要下载并重启,重启前不要急着配映射表,因为重启会重新初始化内部数据结构。
这一步的常见翻车是:切完类型直接点下载,但没点「确认当前选择」,界面上看着像选中了,实际参数没写进去,重启后类型又回到默认。确认方法是重启后重新读取参数,看系统栏是不是还显示IGT-CLI-MEX。
4.2 两个网口的 IP 规划与接线
本例两侧地址和目标接线如下:
| 网关端口 | 网关地址 | 对端设备 | 对端地址 | 说明 |
|---|---|---|---|---|
| 网口 1 | 192.168.1.244(默认) | AB CompactLogix | 192.168.1.9 | 与 AB 同网段 |
| 网口 2 | 192.168.2.244(默认) | 西门子 S7-1500 | 192.168.2.111 | 与 S7 同网段 |
两个网口都用默认地址就行,只要现场没有同地址设备。接线时网口 1 接 AB 的交换机,网口 2 接西门子那侧的交换机,别为了省一根线把两台 PLC 塞进同一台交换机再单口进网关,那样两个网段就混在一起了,网关侧也不会做路由转发。
上电之前先做两件事:确认两侧 PLC 的 IP 与现场规划一致,确认网关两个网口没有接反。接反的表现是两侧都不通,状态栏全红,但用电脑单独 ping 两个 PLC 都是通的。
# 在网关同网段的调试电脑上,分别验证两侧 PLC 的 IP 可达 ping -c 4 192.168.1.9 # AB CompactLogix ping -c 4 192.168.2.111 # 西门子 S7-1500 # 若调试电脑只有一个网口,先接网口 1 侧网段测 AB,再换到网口 2 侧网段测 S7ping 通只代表 IP 层可达,不代表应用端口通。CIP 显式报文走 44818,S7 通讯走 102,端口被防火墙或交换机 ACL 拦掉时,ping 依然正常。有条件的话顺手测一下端口:
# 端口连通性检查,telnet 未安装时可用 nc nc -vz 192.168.1.9 44818 nc -vz 192.168.2.111 102这两条命令分别验证 AB 的 CIP 端口和西门子的 S7 端口。如果 44818 通而 102 不通,问题基本在西门子侧的访问控制或者网络策略,跟网关参数无关,别在映射表里反复试。
4.3 通讯配置表:设备 ID、DB 号/文件号、起始地址、字节数量、网络端口
网口参数下载重启后,走「功能」→「PLC 之间通讯配置」进入数据表页面。这张表是整个方案的核心,每一行是一条单向数据通道,两行组成一次双向交换。按本例填出来大致是这样:
| 条目 | 源设备 ID | 源区(DB 号/文件号) | 源起始地址 | 目标设备 ID | 目标区(DB 号/文件号) | 目标起始地址 | 字节数量 | 网络端口 |
|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 101 | 0 | 1 | 0,0 | IN_INT16 | 160,2 | 44818 / 102 |
| 2 | 1 | 0,0 | OUT_INT16 | 2 | 102 | 0 | 80,2 | 44818 / 102 |
逐列说明,这几列的名字起得容易让人误会:
设备 ID 是每台 PLC 的号码,1~254 之间自由分配,本例 AB 给 1、S7 给 2。分配完记下来,后面所有条目都用这两个号。
「DB 号码/文件号码」这一列对两种设备含义不同:对西门子是 DB 号,填 101 或 102;对 AB 是数组内的起始地址,多维数组填0,0。同一列两种语义,是这张表里最容易填错的地方,填写时先看这一行的设备 ID 指向谁,再决定填 DB 号还是下标。
「起始地址」对 AB 是数组名或变量名,必须与 PLC 内完全一致,本例是IN_INT16和OUT_INT16;对西门子是 DB 内的字节偏移,本例从 0 开始。
「字节数量」填目标设备的数据量加元素宽度,160,2表示 160 字节、每个元素 2 字节;如果数组类型换成 DINT,同样 160 字节要写成160,4。这个参数的第二个数决定了网关怎么把字节偏移换算成元素下标,填错的表现是元素整体错位。
「网络端口」AB 填 44818,S7 填 102。这两列在界面里通常按设备侧展示,填的时候对准设备,不要对着源或者目标的方向去填。
现场条目多的时候,我会先把映射关系落到一张 CSV 里,改一条就改一行,填表时照着抄:
import csv # 现场纸面映射固化成文件,避免手抖改错某一条 rows = [ # 条目, 源ID, 源区, 源地址, 目标ID, 目标区, 目标地址, 字节数量, 端口 [1, 2, "101", "0", 1, "0,0", "IN_INT16", "160,2", 44818], [2, 1, "0,0", "OUT_INT16", 2, "102", "0", "80,2", 102], ] header = ["条目", "源ID", "源区", "源地址", "目标ID", "目标区", "目标地址", "字节数量", "端口"] with open("mapping.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(header) writer.writerows(rows)这段脚本不跟网关通信,纯粹是把纸面映射结构化。真正有价值的是那份 CSV 会留在工程文档里,半年后有人问「DB102 到底对应 AB 哪个数组」,翻表就有答案,不用再去翻网关界面。条目多的时候还可以在脚本里加一层校验,比如检查同一个设备 ID 的字节数加起来有没有超过 PLC 数组长度。
4.4 下载重启与状态栏判读
参数填完点下载,然后重启网关。重启后回到数据表页面,消息栏会显示「所有条目通讯正常」,这句提示的含义是每一条通道都已经建立并且周期刷新。如果显示的是某条异常,先看异常条目对应的设备 ID,再回 4.2 确认那台设备的 IP 和端口,最后才怀疑数据类型和地址。
断电重启后网关能自恢复运行,配置是掉电保存的,前提是下载真的写进去了。判断方法跟 4.1 一样,重启后再读一次参数,看数据表条目数对不对。这一步花三十秒,能省掉现场一半的「明明配了却不生效」。
5. 避坑与排查:五个会让你返工的细节
5.1 配置阶段:类型、偏移、标签名
现象一:网关报标签不存在或者读取失败。原因多半是 AB 侧新建的数组没有下载重启,控制器标签表还是旧的;也可能标签建在了 Program Tags 下面,外部客户端看不见。解决方法是下载并重启 CPU,然后在控制器标签列表里确认IN_INT16、OUT_INT16真实存在且能展开元素。改过标签名之后一定要同步改网关表,名字是严格匹配的。
现象二:数据看着有,但整体错开一段。原因通常是西门子侧的起始地址填了元素序号而不是字节偏移。DB101 的起始地址应该是 0,不是 1;如果从第 5 个元素开始,填的是 10 而不是 5。解决办法是把 DB 里第一个元素强制成特征值,去 AB 侧看它落在第几个位置,反推出实际偏移,再回来改表。
现象三:西门子侧数据全是 0,写进去也不生效。原因基本是 DB 还开着优化访问,第三方客户端拿不到固定偏移。判断方法是打开 DB 看偏移量列,如果只显示符号不显示 0.0、2.0 这类地址,就是没取消优化。取消之后要重新编译下载并重启,光改属性不下载不算数。
5.2 运行阶段:宽度、网段、状态恢复
现象四:只有一侧通,另一侧状态异常。先查网段和接线,两个网口接反、或者两个网口被配到同一网段,都会出现这种单边通的情况。再查端口,AB 侧必须是 44818、S7 侧必须是 102,端口填反了表现是连接超时而不是立刻报错,容易误判成网络慢。解决办法是把两个网口分别接到对应网段,IP 不冲突,用nc分别验证端口。
现象五:跑几天后开始断续,重启网关又好了。常见原因是 AB 侧的程序下载导致标签表重建,网关持有的连接失效,需要重新握手;也可能是有人改了标签名或者数组长度而网关表没跟着改。还有一种隐蔽情况:一侧元素类型从 INT 改成了 DINT,字节数没变,但元素宽度变了,映射表里的160,2就错了。解决办法是每次 PLC 侧程序变更后,都重新核对一遍映射表和元素类型。
还有一个不算坑但值得记一笔的现象:数值高低字节颠倒。INT 类型两侧都是 16 位,正常不会出现;如果发现一个 16 位数高字节和低字节对调,先确认两侧元素宽度是否一致,再看网关侧有没有字交换相关设置。不要在 PLC 程序里直接写 SWAP 去凑,那样换个数据区又得再改一遍,问题被藏起来了。
6. 验证与扩容:强制值双向核对和一套能长期用的自检习惯
配置显示「所有条目通讯正常」只说明通道建立了,不代表数据对得上。验证要分两个方向做,而且必须测头尾,不能只测中间。
先测西门子到 AB。在 DB101 的前 10 个元素写入一组特征值,比如 1001 到 1010;最后 10 个元素写另一组,比如 9001 到 9010。然后用 RSLogix 5000 在线监视IN_INT16,看第 1 到第 10 个元素是不是 1001 到 1010,第 71 到第 80 个元素是不是 9001 到 9010。中间对不代表两端对,长度越界和偏移错位往往只在尾部暴露。
再测 AB 到西门子。在OUT_INT16的前 5 个元素写 2001 到 2005,最后 5 个元素写 8001 到 8005,用博图在线监视 DB102 对应位置。这一步能同时验证反向通道和 DB102 的偏移设置。两组都通过,双向链路才算真正打通。
扩容的思路是把这张表当配置而不是当程序。增加一批数据,就在 AB 侧加一个数组、在西门子侧加一个非优化 DB,然后在表里加两行,设备 ID 和端口照抄已有条目,只改区号、起始地址和字节数量。条目变多之后注意两点:一是同一个设备 ID 下的字节总量不要超过对应数组长度,二是总条目数增加会拉长网关的轮询周期,几百字节的交换量问题不大,上千字节就要评估一下刷新时间够不够工艺用。
我自己的习惯是把映射表、PLC 侧的类型截图、网关参数导出一起放进工程文档,每次 PLC 程序有改动,上电前先把头尾各 5 个点强制一遍,确认偏移没错再交给工艺调试。有次赶工期跳过这一步,结果 DB 取消优化后忘了重新下载,现场调了两个小时才发现数据压根没写进去。从那以后我每次改完 DB 或数组,都强制走一遍「下载、重启、头部 5 点、尾部 5 点」的流程,不再凭状态栏那句「通讯正常」下结论。希望帮到你。
本文还有配套的精品资源,点击获取