欧姆龙PLC以太网通信实战:实现小型车间设备联网系统
小型车间多台欧姆龙组网联采集,优先用FINS over TCP:CJ/CS内置网口或CP1H加CP1W-CIF41、CJ1W-ETN21,NJ/NX可用FINS、EtherNet/IP或Modbus TCP。FINS按“内存区+地址”读写CIO/DM/WR/HR,比逐台OPC更轻,适合10~几十个节点的监控联网。
一、PLC侧基础配置
CX-Programmer里给每台上静态IP、同网段、不冲突FINS节点。CP1H+CIF41:PLC参数—网络—FINS/TCP,勾Enable FINS/TCP Server、Allow Unicast,端口9600;节点号建议等于IP末段,例如192.168.1.10对应节点10。 CJ多PLC互传可用SEND/RECV:本地D100起10字发到对端节点20,控制字写目标网络/节点/超时,响应字存本地D200。
// CJ示例:SEND把D100~D109发到192.168.1.20节点20
SEND(200) S:#0000 C:#0100140A R:D100 N:10 D:D200
// 控制字示例 D300=网络1/节点20/超时0x0A,实际按手册拆字
// RECV(201) 对端D400~D409收回本地D200区,反向同步用
NJ/NX在Sysmac Studio建以太网端口、开FINS服务或EtherNet/IP标签数据链接;部分NX1P若不支持FINS TCP,可走Modbus TCP或从站网关转换。
二、Python上位批量采集
用原生socket做FINS/TCP,先握手交换节点,再读DM、写设定值。以下示例连接单台、读D100起10字、写D200=1234,带3秒超时和重连:
import socket, struct, time
def fins_connect(ip, port=9600, local_node=5):
s = socket.create_connection((ip, port), timeout=3)
s.sendall(bytes.fromhex("46494E53" "0000000C" "00000000" "00000000")
+ struct.pack(">I", local_node))
s.recv(24) # 忽略握手响应,仅确认节点
return s
def read_dm(s, dst_node, word, count):
body = bytes([0x80,0x00,0x02,0x00,dst_node,0x00,
0x00,0x05,0x00,0x00,0x01,0x01])
body += bytes([0x82]) + struct.pack(">I", word)[1:] + struct.pack(">H", count)
frame = bytes.fromhex("46494E53") + struct.pack(">I", 12+len(body)) \
+ bytes(4) + body
s.sendall(frame); resp = s.recv(1024)
return resp[-2*count:] # 简化取尾部字数据,按大端解析
def write_dm(s, dst_node, word, value):
body = bytes([0x80,0x00,0x02,0x00,dst_node,0x00,
0x00,0x05,0x00,0x00,0x01,0x02])
body += bytes([0x82]) + struct.pack(">I", word)[1:] \
+ struct.pack(">H", 1) + struct.pack(">H", value & 0xFFFF)
frame = bytes.fromhex("46494E53") + struct.pack(">I", 12+len(body)) \
+ bytes(4) + body
s.sendall(frame); s.recv(1024)
plcs = [("192.168.1.10",10),("192.168.1.11",11),("192.168.1.12",12)]
for ip,node in plcs:
try:
s=fins_connect(ip); print(ip, read_dm(s,node,100,10)); s.close()
except Exception as e:
time.sleep(2) # 指数退避可再封装
生产把单连接改连接池,按设备分SID;FINS/TCP单socket半双工,别并发发多帧,写和轮询分开更稳。
三、车间组网与稳定点
地址规划:192.168.10.0/24统管OT,PLC、HMI、采集机同网段;跨网段走工业VPN,不把9600直接映射公网。
交换机:无管理二层可跑小车间,20台以上用管理型,开IGMP Snooping、L4 QoS,EtherNet/IP组播不广播风暴。
轮询节奏:状态量500ms~1s,模拟量1s,报警事件用PLC主动写标志位或上位订阅;单命令别低于100ms,避免CPU忙返错。
重连容错:socket关闭、空闲超时、节点冲突都重做握手;DM点表用CSV从CX/Sysmac导出,符号名映射地址,程序不硬写D100。
协议选型:PLC间大数据用FINS/UDP或SEND/RECV,上位集中采集用FINS/TCP更可靠,NJ/NX新项目可OPC UA/标签服务,老CP/CJ继续FINS最省事。
按“静态IP+节点规划—FINS TCP读写—Python连接池轮询—工业交换隔离—断线重握手”落地,小型车间十几到几十台欧姆龙可快速并网,产量、报警、能耗统一上MES,不必逐台开私有驱动。





