ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

三菱Q系列PLC SOCKET通讯实战:配置、指令与调试全解析

三菱Q系列PLC SOCKET通讯实战:配置、指令与调试全解析 简介资源是一份关于三菱Q系列PLC之间SOCKET通讯的完整讲解文档面向工业自动化现场工程师、电气设计人员以及正在学习PLC以太网通信的初学者。文档以Q03UDE为例先解释SOCKET对TCP/IP协议的封装原理再依次介绍硬件配置与软件环境梳理1#、2#两台PLC的通信实验步骤并对SP.SOCOPEN、SP.SOCSND、SP.SOCRCV三条应用指令逐一说明最后给出参考手册。包内为单个docx文件容量824KB内容结构紧凑便于按章节查阅。目前已有1644人学习下载适用于需要快速理解三菱Q系列内置以太网Socket编程、并完成实际通信调试的读者。通过该文档可理清从网络参数设置到指令调用的完整链路减少自行摸索时间。 做自动化项目这些年我遇到过不少“看起来很好办、上手就卡壳”的通信需求。比如两台三菱Q系列PLC就在同一个柜子里要互相传几十个字的数据现场又没有多余的数字量模块最直接的办法就是走以太网。但真到了写程序才发现以太网通讯有这么多种打开方式TCP、UDP、Active、Passive、连接编号……不把概念理清楚写出来的程序要么连不上要么收发乱套。这篇文章就围绕三菱Q系列PLC之间的SOCKET通讯把完整落地过程掰开揉碎讲一遍从选型、参数配置、指令逻辑到现场排查和稳定性设计让后来者少走弯路。1. 为什么两台Q系列还要用SOCKET通讯选型前先想清楚这几件事1.1 Q系列PLC之间常见通讯方式的适用边界三菱Q系列PLC之间交换数据常规选择其实不少。最容易想到的是CC-Link现场总线只要在两边各挂一个CC-Link模块组好网络、配好站号数据就能周期性自动刷新。这种方式实时性好、稳定性高特别适合IO联动、大批量数据周期性读取。缺点是成本高而且如果现场只是临时加一两个数据点专门为此组一张CC-Link网就显得笨重。第二种是MC协议也就是三菱私有MELSEC通信协议。通过以太网一台PLC可以直接读写另一台PLC的软元件比如用A站去读B站的D区。MC协议胜在开发简单上位机组态软件基本都自带以太网驱动填个IP就能通信。但它有个天然短板报文格式是封闭的每一条指令都围绕“读写软元件”设计的想传一段完全自定义的二进制帧或者实现复杂的请求应答业务会非常别扭。第三种就是这里要说的SOCKET通讯。它把PLC当成一个标准TCP/IP终端报文长什么样、里面放什么内容完全由你定义。两台Q系列PLC之间可以走SOCKETPLC和第三方设备之间也可以走SOCKET只要双方约好帧格式就行。所以当你遇到“对方不是三菱设备”“对方要求自定义协议”“需要在同一条连接里混合多种命令”这些场景时SOCKET几乎是唯一选项。1.2 SOCKET通讯的核心价值与代价SOCKET通讯的本质是让PLC拥有一个普通网络终端的所有能力。三菱Q系列的内置以太网口或者QJ71E71模块底层已经帮你把TCP三次握手、IP分片、重传这些协议栈处理好了你不需要自己去实现协议只需要做三件事配置网络参数、调用连接指令、收发数据。但这里有个很容易被忽视的代价SOCKET通讯不会像CC-Link那样自动把对方的数据映射到本地软元件也没有MC协议里那种“读D100就自动返回D100内容”的现成指令。所有数据都是被动地“待在”以太网模块缓冲区里必须由你的程序用SEND和RECV指令主动搬运。很多第一次接触的人参数都配好了指令也调用了但数据就是不到D区就是因为没理解这个“主动搬运”机制。所以在做技术选型时我的建议很清楚如果只是两台三菱Q系列PLC之间简单读写D区优先用MC协议省时省力如果涉及自定义协议、非三菱设备、或者需要灵活控制通信时序再用SOCKET通讯。别一上来就追求“底层控制”工程上够用远比炫技重要。2. 动手前必须敲定的四个参数硬件、IP、TCP/UDP、打开方式2.1 用内置网口还是QJ71E71模块Q系列PLC有两种常见形态带以太网能力一种是CPU内置以太网口比如Q03UDECPU、Q06UDEHCPU这一代网口直接做在CPU上另一种是独立以太网模块比如QJ71E71-100插在基板上。两者在SOCKET通讯上的编程思路基本一致都是OPEN、SEND、RECV、CLOSE这套指令但细节上有点差异。内置网口的好处是省槽位、成本低适合点对点或少量连接的场景。独立以太网模块则能提供更丰富的连接资源有些型号还支持模块自动打开、固定缓冲区等功能适合多客户端接入或复杂协议转换。如果你只是两台Q系列PLC互相通信内置网口完全够用不需要额外花一块模块的钱。选型时注意看CPU型号支持的连接数量有的型号最多只能开几个SOCKET连接别等程序写完了才知道资源不够。2.2 IP地址、端口号与网络拓扑怎么定网络拓扑越简单越好。两台PLC加一台工业交换机这是最稳的接法。IP地址规划要避开现场其他设备的冲突比如A站设192.168.0.10B站设192.168.0.20子网掩码都用255.255.255.0端口号双方约定统一我用得比较多的是5000或者6000避开常见端口就行。有一个细节很多人不重视如果两台PLC之间不经过交换机而是用网线直连虽然现在很多网口都支持自动翻转但最好在项目初期就明确“走交换机”还是“直连”。我在现场遇到过直连时偶尔丢包、加了一个小交换机就稳定的情况所以除非空间极度有限否则建议中间加交换机既有隔离作用出了故障也方便用电脑接进去抓包排查。2.3 TCP和UD到底该选哪个TCP是面向连接的三次握手建立连接数据有确认、重传、排序机制可靠性高。UDP是无连接的发出去就不管了速度快但可能丢包乱序。PLC之间的控制类数据传输我强烈建议选TCP。有些工程师觉得UDP更简单、不需要管理连接状态就用在控制命令上结果现场稍微有点干扰命令丢了设备不动了再排查就非常痛苦。UDP适合的只是状态广播、报警信息这类丢了也无所谓的场景。如果你不确定选哪个直接TCP别纠结。2.4 Active与Passive打开方式最容易搞反的概念这是新手最容易踩的坑。在SOCKET通讯里主动打开Active的一方扮演“客户端”被动打开Passive的一方扮演“服务器”。主动方负责发起连接请求被动方负责监听等待连接。如果A站要主动连B站A站参数里必须选TCP Active同时填上B站的IP和端口B站参数里必须选TCP Passive监听同一个端口。两台PLC通信时一定是一头Active、一头Passive。如果两边都配成Active两边都在发请求永远连不上如果两边都配成Passive两边都在等别人来连更是死等。这个错很隐蔽因为程序编译、下载、网络Ping都是通的但连接就是建立不起来。2.5 GX Works2里的参数设置步骤在GX Works2里双击PLC参数进入内置以太网端口设置或以太网模块设置主要填这些项设置项推荐值说明IP地址按规划填同一个网段子网掩码255.255.255.0不要用对端不认识的掩码通信协议TCP/IP按需求选TCP或UDP打开方式Active/Passive一端Active一端Passive本地端口号5000双方统一对方IP地址对端IP仅Active时需要对方端口号5000Active端要填通讯数据代码二进制自定义报文优先二进制参数下载后必须在CPU复位后重新上电才生效。这个操作很容易被忽略我见过有人改了IP参数不重启PLC然后拿着电脑怎么Ping都不通折腾半小时后才发现是没复位。所以记牢改完网络参数一定断电重启别省这一步。3. 四条指令打通数据链路OPEN、SEND、RECV、CLOSE的使用逻辑3.1 OPEN连接打开指令的两种用法OPEN指令负责建立一条TCP连接。在程序里它是以“无头指令”的方式触发的也就是说它需要前面的触点满足条件才会执行一次。OPEN的典型参数包括目标模块起始I/O号、控制数据起始软元件以及写在控制数据区里的连接编号、打开方式等。举个例子// M0上升沿触发打开一条连接 IF M0 AND NOT M100 THEN D100 : 0; // 完成状态区清零后由指令写入结果 D101 : 0; // 连接编号0号连接 D102 : 0; // 打开方式程序打开 OPEN #U0 D100; M100 : TRUE; // 打开未复归前不重复触发 END_IF;这里有一点要看清楚OPEN只是发出一条“帮我打开连接”的指令模块真正把TCP连接建立起来是异步的。你需要轮询D100里的完成状态变成0才代表成功。如果完成状态非0就是错误码去查以太网模块手册的出错代码表。有的项目会在参数里直接配置“模块启动时自动打开”这样就不再需要程序里的OPEN指令连接会随PLC上电自动建立。这个做法适合服务器端固定监听的情况能简化程序但客户端主动重连的场景我还是建议用程序控制OPEN方便做重连逻辑。3.2 SEND和RECV数据搬运的对称操作SEND负责把本站一段连续寄存器数据发送到指定连接。RECV负责从指定连接接收数据存到本站寄存器。它们的参数结构很像都有完成状态、连接编号、数据起始软元件、数据长度。// 发送D200起8个字到0号连接 D102 : 0; // 完成状态清零 D103 : 0; // 连接编号0 D104 : D200; // 发送数据起始软元件 D105 : 8; // 发送长度字 SEND #U0 D102; // 从0号连接接收数据最多接收16个字存入D300 D106 : 0; // 完成状态清零 D107 : 0; // 连接编号0 D108 : D300; // 接收数据存放在D300 D109 : 16; // 最大接收长度字 RECV #U0 D106;这里要特别提醒两个常见误区一是长度单位三菱的SEND和RECV长度基本都是按“字”算的16位一个字。如果自定义协议是按“字节”设计的一定要换算清楚否则发送内容会截断或者多收错收。二是RECV不一定每次调用都能收到数据大多数情况下完成状态返回0但接收长度可能也是0表示“没有新数据”程序里要把“无数据”和“数据异常”分开处理不能因为没数据就把正常状态也当错误。3.3 CLOSE别忽略连接关闭后的状态复位CLOSE指令用来断开一个连接。执行CLOSE后这个连接编号会被释放可以重新OPEN或者分配给其他连接。很多新手在调试时连上了、发完数据不执行CLOSE下次想重新OPEN同一个连接编号就会报错因为连接还“挂”着。TCP连接关闭后还有一个特殊阶段叫TIME_WAIT是底层协议栈为了保证重传的旧包不串到新连接里而引入的等待时间。如果马上重新OPEN有时会失败或者需要等几秒这属于正常现象。工程上如果每帧数据都要重新连接通信效率会非常低所以更合理的做法是长连接保持OPEN只有检测到异常时才CLOSE再重新OPEN。3.4 一段可以套用的状态机逻辑我在项目里习惯把收发逻辑写成一个小状态机避免每个扫描周期都重复触发指令。基本状态是空闲→打开连接→等待打开成功→发送数据→等待发送完成→接收应答→处理数据→等待下一次发送。每一状态只执行对应指令并用“完成状态”推动状态跳转。这种写法的好处是可靠、易维护不会因为某个指令重复执行导致缓冲区和连接状态混乱。4. 一个能直接改着用的实例客户端发送请求服务器应答回传4.1 场景与软元件分配假设A站是客户端主动打开B站是服务器被动监听。A站向B站发送8个字的数据B站收到后把这个8个字原样回传同时回传一个状态字表示接收成功。这在项目里可以扩展成“A站下发命令B站执行后回传结果”。软元件分配如下站点用途软元件范围A站发送缓冲区D200~D207A站接收缓冲区D300~D315B站接收缓冲区D500~D515B站发送缓冲区D600~D607A站和B站的IP、端口、打开方式按照第2章的配置提前写进PLC参数。4.2 服务器端B站逻辑B站是被动打开上电后执行一次OPEN然后一直监听。由于是服务器通常不会主动CLOSE。每一轮扫描都调用RECV如果收到数据且长度大于0就触发SEND把同样内容回传。程序骨架大致是这样// B站上电初始化 IF FirstScan THEN D100 : 0; D101 : 0; D102 : 0; OPEN #U0 D100; // Passive监听 END_IF; // 周期性接收 D106 : 0; D107 : 0; D108 : D500; D109 : 16; RECV #U0 D106; IF D106 0 AND D110 0 THEN // 收到数据D110中为实际接收长度按手册对应偏移 M500 : TRUE; END_IF; // 回传数据 IF M500 THEN FOR i : 0 TO 7 DO D600[i] : D500[i]; END_FOR; D112 : 0; D113 : 0; D114 : D600; D115 : 8; SEND #U0 D112; M500 : FALSE; END_IF;4.3 客户端A站逻辑A站主动连B站。上电后OPEN等待连接建立成功后往D200~D207填入要发送的数据触发SEND。发送完成后执行RECV等待B站应答收到应答后解析数据。关键是“等待连接成功”这个环节。我的做法是发送标志位只在连接状态正常时置ON其它时候都禁止SEND。连接状态可以通过轮询OPEN完成状态或者模块自带的连接状态位来判断。4.4 报文格式与字节序问题两台PLC之间自定义报文我建议在数据最前面加帧头和长度字段。比如D200放0xAA55D201放数据长度D202放命令字D203后面放业务数据。这样接收端收到后先判断帧头再看长度和命令最后解析数据能避免很多数据错位问题。字节序是另一个大坑。三菱PLC寄存器是16位字如果对面是上位机或者非三菱设备要注意数据在TCP字节流里到底是大端还是小端。最笨也最有效的验证方法联调最开始让A站发一串1、2、3、4这样的特征值B站收到后看看D区里的值是不是刚好反过来。如果反了就要在参数里调整字节顺序或者在程序里做高低字节交换。这个问题不提前对齐后面所有数据解析都会错。5. 现场调试的避坑清单与完整排查链路5.1 错误代码01809000是怎么回事网上经常有人搜“三菱error 01809000h怎么解决”这个报错大多出现在GX Works2连接PLC、或者某个以太网功能执行异常的时候。01809000这类错误本质是模块返回了一个“异常状态”可能是IP地址冲突、端口被占用、参数没有正确下发、或者访问了不存在的连接编号。在SOCKET通讯里OPEN或SEND的完成状态如果是非0值第一件事就是看详细错误码手册。不同模块手册后面都有一张出错代码一览表比如“0180H 连接未打开”“0182H 连接编号超范围”等等。别凭直觉猜我最开始调试时就吃过亏明明数据区参数写错了愣是查了半天网络。5.2 连接失败按这个顺序排查最快找到根因当你发现两台PLC怎么都连不上时不要盲目改程序按下面这个链路一步步走物理层看两个PLC网口指示灯、交换机端口灯是否正常。用一台电脑分别Ping两个IP如果哪个Ping不通先解决物理链路和IP配置。参数层确认两个站是否一个Active一个Passive端口号是否一致IP是否同一网段子网掩码是否正确。连接编号程序中是否有多个地方同时操作同一个连接编号或者OPEN还没完成就再次OPEN。程序逻辑确认OPEN指令确实被执行了而不是被某个互锁条件一直卡住。用抓包工具这时候在交换机的镜像口上用Wireshark抓包看有没有TCP SYN包发出、有没有SYN ACK回应。空有一端发包另一端没反应基本就是Active/Passive不匹配或者端口没对。我遇到过印象最深一次A站和B站都设成了Active两边程序都正常Ping也通但连接就是建不起来。后来用抓包一看两边都在发SYN包但没人回ACK这才反应过来是模式搞反了。5.3 数据收发正常但内容错乱怎么排查连接通了、指令也执行了但收到的数据不对这属于“逻辑层”问题和网络关系不大。常见原因有四个长度单位换算错SEND/RECV长度按字算如果对方按字节解析数据内容会多出一倍。字节序反了0x1234变成0x3412按我前面说的特征值法最方便验证。缓冲区地址重叠发送区和接收区指向同一个D区导致数据自己把自己覆盖。帧同步丢失没有帧头或帧头不唯一数据错位后整包都废了。如果是和上位机联调建议先用网络调试助手模拟对端。把PLC当客户端网络调试助手当服务器先单机调试通了再接另一台PLC。这样能把PLC侧问题和网络链路问题隔离开。5.4 长期稳定性设计心跳、重连与超时都不能少SOCKET通讯调通只是开始设备要长期运行稳定性设计必须跟上。第一加心跳包。客户端每秒发一个心跳命令服务器收到后回一个心跳应答。如果连续几个周期没收到心跳就判定连接异常主动CLOSE后重新OPEN同时把这个异常记到报警区。这样即使网络抖动断开了系统也能在几秒内自动恢复。第二加超时监控。SEND和RECV指令虽然是异步的但如果你在某条指令上一直等完成状态程序可能卡住。我的做法是用一个定时器比如500ms内完成状态没变为0就认为指令超时强制置位错误标志清理相关控制数据再决定是否重发。第三多连接场景下固定连接编号。如果一个CPU上同时开了两三个SOCKET连接建议每一个连接固定使用一个连接编号并在程序里加注释不要动态切换。这样以后排查问题看连接编号就知道是哪个通信任务能省很多时间。最后再分享一个我个人的习惯做这类项目时把所有SOCKET相关的控制数据、收发缓冲区集中放在D区一段连续地址里不要东一块西一块。程序里再加一段初始化逻辑在PLC上电时把这段区域全部清零。这样无论调试还是后期维护打开程序就能快速定位比临时零散地定义要省心得多。两台Q系列PLC之间的SOCKET通讯说到底就是“参数配好、状态机写稳、异常能自愈”做到这三点现场基本就不会再叫你半夜去处理问题了。本文还有配套的精品资源点击获取
返回列表