当前位置:首页 > 工业控制 > 工业控制
[导读]小型车间多台欧姆龙组网联采集,优先用FINS over TCP:CJ/CS内置网口或CP1H加CP1W-CIF41、CJ1W-ETN21,NJ/NX可用FINS、EtherNet/IP或Modbus TCP。FINS按“内存区+地址”读写CIO/DM/WR/HR,比逐台OPC更轻,适合10~几十个节点的监控联网。


小型车间多台欧姆龙组网联采集,优先用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,不必逐台开私有驱动。



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭