多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

欧姆龙CP1H外接CIF串口模块与上位机Host Link通信配置详解

欧姆龙CP1H外接CIF串口模块与上位机Host Link通信配置详解 1. 场景还原为什么CP1H-XA还要外挂CIF串口模块1.1 图纸上一句“PC LINK”现场拆出三种理解前阵子接手一个产线改造项目控制柜里躺着一台欧姆龙CP1H-XA客户图纸上的通讯说明只有一行字“PLC搭载CIF串口模块与从机PC LINK。”就这一行字先后劝退了两拨人。第一波说程序里没写过PC LINK功能得加钱第二波说CIF模块型号没写全得换成专门的通讯单元。其实这种配置在欧姆龙串口项目里属于基本功CP1H本体自带的RS-232C口或者通过选件板槽外扩一个CIF串口模块配合上位机链接Host Link协议PC端用一组ASCII命令帧就能把CIO、DM、HR这些数据区读出来、写进去。图纸上写的“PC LINK”在大多数现场项目里指的就是这条上位机链路而不是字面意义上的PLC间数据链接。我见过太多工程师栽在“PC LINK”这三个字上。老手册里PC Link指两台PLC或者PLC与PC之间通过串口共享数据区新版欧姆龙手册又把它改叫Serial PLC Link而现场工程师管“PC用串口连上PLC”统称PC LINK。同一个词三种含义处理方式完全不同。写这篇东西之前我先翻了一下手里的CP1H硬件手册和CX-Programmer操作记录把所有从头到尾要靠经验踩的坑都捋了一遍从选件板选型、接线、CX-P设置到上位机发第一帧命令一步一步来。1.2 CP1H-XA到底强在哪里先说设备本体。CP1H-XA不是单纯的继电器型PLC它是带内置模拟量的高功能型。以最常见的CP1H-XA40DR-A为例拆开型号看CP1H系列名属于一体化紧凑型PLCCPU、电源、I/O一体比CJ系列便宜适合单机设备。X基本型CPU不带内置以太网口。A带内置模拟量4路输入、2路输出标配12位分辨率单机做温度、压力、频率采集很顺手。40I/O点数为40点输入24点、输出16点。DR继电器输出。A电源为AC100~240V。这机器正面有一个USB口CX-Programmer调试用、一个内置RS-232C口、一个选件板槽。选件板槽就是给CIF系列模块准备的。很多工程师没注意CP1H不是每个型号都非得外接CIF才有串口它本身就带一个串口缺的是第二个串口。为什么要第二个串口最典型的情况触摸屏占了内置RS-232C口做NT Link或Host Link上位机又要同时读取数据或者现场设备需要RS-485远距离组网而本体只支持RS-232C。这时候选件板槽就派上用场了。1.3 CIF01和CIF11怎么选“CIF串口模块”是口语叫法实际型号分好几种。CP1H和CJ系列的选件板/单元不通用千万别买错。CP1H用CP1W-CIF01RS-232C选件板和CP1W-CIF11RS-422A/485选件板比较常见CJ系列则是CJ1W-CIF01和CJ1W-CIF11插在CPU机架或扩展机架的I/O槽里。模块型号接口类型通信距离典型场景CP1W-CIF01RS-232C15米以内接PC、触摸屏、变频器CP1W-CIF11RS-422A/485500米~1公里多台PLC组网、远程仪表CP1W-CIF12RS-232C15米以内与CIF01类似速度更高CJ1W-CIF01RS-232C15米以内CJ系列接上位机CJ1W-CIF11RS-422A/485500米~1公里CJ系列远距离/多站通信选型逻辑其实很简单距离近、点对点、PC直连选CIF01距离远、要挂多台从站、现场干扰大选CIF11。CIF11是5线制接口带终端电阻选择和屏蔽地接线要认真处理否则通信时好时坏。选好模块之后接线又是另一个坑。RS-232C是交叉接法PLC的发送脚SD接PC的接收脚RDPLC的接收脚RD接PC的发送脚SD信号地SG接信号地。我用的是标准9针串口线2-3交叉、5直连拿万用表量一遍再上电省得一顿操作下来发现线序反了。1.4 一个典型设备的通讯架构长什么样整套系统落地的架构通常是这样的CP1H-XA做主站D100块存工艺参数W0.00~W0.15存运行状态位模拟量通道采集温度、压力触摸屏接本体自带RS-232C口做画面监控外扩的CIF01或CIF11选件板接上位机PCPC通过Host Link命令轮询读写PLC数据区。这套架构的好处是触摸屏和上位机互不干扰PLC程序里不需要写任何通信指令上位机发命令、PLC硬件自动回响应程序侧只需要把数据放到约定好的地址里就行。这时候有人会问上位机读写PLC不是得写FINS指令吗不用。Host Link模式下PC做主站主动发命令帧PLC做从站自动应答PLC程序里完全不需要调用SEND/RECV之类的指令。真正要规划的只是数据区哪些地址给上位机读哪些地址给上位机写读写权限怎么分。2. 先把“PC LINK”掰扯清楚欧姆龙串口协议的几种打开方式2.1 CP1H的串口模式到底有哪些CP1H的串口端口包括内置RS-232C口和选件板CIF01/CIF11在CX-Programmer的PLC设置里可以切换好几种通信模式每一种模式的帧格式、主从关系、适用场景都不同。我用表格整理了一下通信模式主/从关系典型用途是否需要PLC程序配合Host Link上位机链接PC为主站PLC为从站PC/工控机读写PLC不需要Serial PLC Link串行PLC链接PLC间互为主从多台PLC共享数据不需要设好数据区即可NT LinkPLC为从站触摸屏为主站欧姆龙触摸屏连接不需要No Protocol无协议PLC为主站接自由协议仪表、扫码枪需要TXD/RXD指令拼帧Modbus-RTU从站PLC为从站第三方上位机/触摸屏/仪表不需要Modbus-RTU主站PLC为主站PLC轮询Modbus设备需要Modbus指令或配置同一个串口只能选一种模式。如果CIF01接上位机就选Host Link如果CIF11挂了多个PLC做数据同步就选Serial PLC Link如果触摸屏是欧姆龙NT系列选NT Link。很多人项目做了一半发现通信无效跑到现场一看端口模式是No Protocol上位机发Host Link命令当然没响应。2.2 现场叫法和手册定义的区别老实说我一开始也被“从机PC LINK”这个词绕晕过。严格按欧姆龙定义PC Link指的是PLC与PLC之间通过串口链接数据在链接区自动共享没有上位机命令这一说。而PC用串口读PLC正经名字叫Host Link上位机链接。这两者从通信手段到数据访问方式都不一样。但现实项目中“PC LINK”往往被当成泛称使用图纸、招标文件、设备清单里随处可见。遇到这种含糊描述我的处理办法是先去现场确认两件事第一对端到底是谁是PC还是另一台PLC第二中间串口是直连还是通过Modem/转换器。如果对端是PC默认按Host Link方案做把通信参数和命令帧搞对项目十有八九能通。2.3 数据区规划和“Word变量”到底指什么不管用哪种协议上位机读写PLC最终都是读写PLC的存储区。欧姆龙CP1H的数据区包括CIO区、WR区内部继电器、HR区保持继电器、DM区数据存储器、AR区、TC区等。对串口通信来说最常用的是DM区和WR区DM断电保持适合存配方、工艺参数、累计值WR区按位访问方便适合做设备状态、报警、启停控制。这里就得提一下热搜里那个“欧姆龙word变量”的问题。在CX-Programmer的符号表里变量符号分BOOL和CHANNEL字/通道两种类型。字变量对应一个完整的16位通道上位机读写时按一个字16bit处理范围是0~65535无符号或-32768~32767有符号。比如定义一个名为“温度1”的WORD变量地址分配到D100那么上位机读D100时读到的就是“温度1”这个字的原始值。字里的每一位也可以单独用BOOL变量映射比如“设备运行中”对应W0.00上位机读W0的0号位就能拿到启停状态。数据区规划这一块我强烈建议在PLC程序里做个地址清单区分“上位机只读”“上位机只写”“上位机读写”三类地址把地址范围、数据类型、量程换算都写清楚。实际调试的时候上位机工程师不需要看懂PLC梯形图只需要这张地址表就能干活。3. CX-Programmer侧配置实操从新建工程到断电重启3.1 通信参数这样设一次就配对打开CX-Programmer新建工程时设备类型选CP1HCPU型号选对应的CP1H-XA40DR-A连接方式选USB先和PLC连上把现有程序备份出来。然后双击工程树里的“设置”打开PLC设置窗口找到“内置RS-232C端口”或“串行选件板”配置页。这里要注意CP1H的PLC设置里内置RS-232C口和选件板口是两套独立配置项。CIF01/CIF11插在选件板槽上对应的是“串行选件板”页如果项目用的是本体自带232口才是“内置RS-232C端口”页。选错页改了半天没反应是新手最常见的操作失误。关键参数如下通信模式Host Link上位机链接单元号00多台PLC组网时分别设00、01、02……波特率9600或19200现场线长、干扰大可适当降到9600数据格式7位数据位、偶校验、2位停止位或者8位数据位、偶校验、1位停止位PC端必须和PLC端完全一致响应等待时间默认即可上位机轮询周期短的话可以设成0。设置完成后把PLC切到编程模式执行“PLC设置下载”把设置传送到PLC然后断电再上电。这一步必须做串口模式相关设置不是即时生效的很多工程师在线改完设置发现通信还是不通就是忘了重启。上电后在CX-Programmer里选Host Link连接方式填好COM口号、波特率、数据格式点在线能连上就说明PLC侧配置没毛病。连上后顺手在符号表里看一下当前程序用的地址把要开放给上位机的地址记下来。3.2 程序侧到底要不要加东西Host Link通信模式下PLC程序不需要写任何通信相关的梯形图指令。上位机命令过来CP1H内部通信处理器自动解析并访问数据区。程序里要做的事只有一件把需要和上位机交互的数据放到约定地址。举个例子。设备状态字放在W0W0.00是运行中W0.01是故障W0.02是手动模式温度当前值放在D100压力当前值放在D101上位机要下发的目标温度放在D200目标压力放在D201。PLC程序里正常写梯形图把这些地址里的数据算出来、更新进去就行。上位机读到的是W0和D100、D101里的实时值上位机写D200、D201PLC程序再根据新值做PID调节。整个数据流不需要一条通信指令。如果用的是CX-Programmer 9.x以上版本在线修改程序时还要注意PLC设置里开启了“在线编辑”权限修改完程序需要整体下载一次只传程序不动设置避免把已经配好的Host Link参数覆盖掉。3.3 CJ系列和CP系列是一回事吗标题里提到CJ/CP程序很多工程师担心CJ系列和CP系列连上位机的配置方法不一样。实际上Host Link的ASCII命令帧、FCS校验方式、数据区访问方式在CJ和CP里是同一套东西。CJ系列CPU本体不带串口时插一块CJ1W-CIF01或CIF11模块然后在IO表中给这个模块分配单元号再到PLC设置里对应的串行通信单元页配置Host Link即可。唯一要注意的是CJ系列的程序和地址范围比CP1H大比如DM区地址范围更大CJ1H/CJ2H的CIO区更多上位机读取时地址编码要按对应型号的地址范围来。命令帧格式完全通用数据区地址编码规则也一样验证方法就是同一份串口助手脚本先连CP1H测通再连CJ系列测通实际项目里我基本就是这么干的。4. 上位机读写实操从串口助手发第一帧到代码落库4.1 先用串口助手验证链路别急着写上位机上位机开发之前我习惯先用串口助手把通信链路验证通。这一步能排除硬件问题也能把命令帧格式跑熟。具体做法是电脑上装一个USB转RS-232C转换器接到CIF01选件板打开串口助手设置COM口、波特率9600、数据位8、校验位偶、停止位1然后发送下面这一帧00RD0100000225*\r小提示串口助手里有些会自动追加回车换行和帧尾的*CR重复问题不大但个别情况下会干扰接收判断建议把“发送新行”关掉手动在帧末尾加回车符。这一帧的含义是开头00是PLC单元号RD是读DM区命令0100是起始地址D100四位十六进制0002是读取字数25是FCS校验码*是帧结束符\r是回车。正常响应是00RD0100000212345678FCS*\r其中1234是D100的值5678是D101的值。如果PLC里D100没写数据响应里可能就是0000或者程序写入的默认值。只要能看到响应帧链路就是通的。4.2 帧格式逐字节拆解第一次接触欧姆龙Host Link的人最容易懵的就是地址编码和FCS校验。我把这帧逐字节拆开讲清楚。命令帧结构是固定的 单元号 命令码 正文 FCS * CR。ASCII码0x40固定起始符00PLC单元号CX-P里设置的那个值默认00RD命令码RD读DM区WD写DM区RR读CIO区WR写CIO区0100起始地址D100写成4位十六进制0100。这里千万注意是四位的十六进制数不是把“100”直接拼上去读D100写成“0100”读D99要写成“0063”读D200写成“00C8”0002读2个字如果要一次读50个字就写003225FCS校验码计算规则是从后面第一个字符开始到正文结束不包含、*、CR所有字符的ASCII码逐字节异或异或结果转成两位大写十六进制。以“00RD01000002”为例0x30异或0x30得0x00再异或0x52得0x52再异或0x44得0x16一路算下去最后得到0x25转成ASCII就是“25”。建议这段校验逻辑放在上位机代码里自动算不要手算*固定帧结束符\r回车符即0x0D。响应帧结构类似 单元号 命令码 正文 FCS * CR。响应正文里每个字占4位十六进制多个字按顺序排列。4.3 常用命令表贴到项目文档里直接用功能命令帧格式以单元号00为例说明读DM区00RD 起始地址4位hex 字数4位hex FCS *CR例00RD01000002...写DM区00WD 起始地址4位hex 数据(每字4位hex) FCS *CR每字4位hex连续拼接读CIO区00RR 起始地址4位hex 字数4位hex FCS *CR含WR区地址按CIO编号写CIO区00WR 起始地址4位hex 数据 FCS *CR可写W区/CIO位状态读HR区00RH 起始地址4位hex 字数4位hex FCS *CR保持继电器区写HR区00WH 起始地址4位hex 数据 FCS *CR断点保持适合存配方读PLC型号00MM FCS *CR返回CP1H-XA40DR-A等型号名这里面RR/WR命令访问的CIO区在不同系列里对应关系略有差别CP1H的CIO区包含内置I/O地址、扩展单元地址和W区。实际使用中上位机读W0、W1这种中间继电器地址用RR命令起始地址写W区的CIO编号。比如W0对应CIO编号0000读W0到W3就是00RR00000004 FCS *CR。具体映射建议对照CP1H的I/O地址分配表不同扩展配置下地址会偏移。4.4 上位机C#组帧代码抄作业版这一段代码可以直接拿去用我前后在几个项目里都跑得很稳。核心就是组帧、校验、发送、接收解析。public static string MakeHostLinkFrame(string body) { byte fcs 0; foreach (char c in body) { fcs ^ (byte)c; } return body fcs.ToString(X2) *\r; } public static byte[] ReadDM(int unitNo, int startAddr, int wordCount) { string body unitNo.ToString(D2) RD startAddr.ToString(X4) wordCount.ToString(X4); string frame MakeHostLinkFrame(body); return Encoding.ASCII.GetBytes(frame); }发送之后接收端按字节读缓存到以开头、以结尾的完整帧再做FCS校验。校验逻辑不复杂把和之间的所有字符异或一遍和帧尾两位十六进制比对一致就解析数据区。解析响应时从响应正文里依次取4位hex转ushort。如果有符号需求再把ushort转short上位机显示和PLC数值得对上。这里有个经验PLC程序里如果用的是“温度1”这个WORD变量上位机读到的是原始AD值温度换算公式必须和PLC程序里一致否则显示永远不对。发送后一定要等一下响应再发下一条串口是半双工一问一答。超时建议设300ms重试2次。轮询频率不要太高实际项目里200ms轮询一次足够把通信负荷压得太高触摸屏那边反而容易掉线。4.5 批量读写的性能优化思路上位机轮询PLC数据时最忌讳一条一条读。一次命令只读一个字、写一个字32个地址就要发32帧光通信开销就把CPU占满了。正确做法是连续地址合并成一条命令。比如温度、压力、流量三个值连续放在D100~D102一次读3个字命令帧是00RD01000003 FCS *CR一次拿到3个数据。写参数时同理D200~D205六个目标值连续下发一条WD命令写完。但要注意上位机写DM区时数据是按字拼接的顺序千万别搞错。我见过一个项目上位机把D200和D201的值写反了产量累计和班次编号对调产线统计全乱排查到天亮才发现是数据拼接顺序错了。如果数据区不连续中间隔着几十个地址宁可多分几条命令也别为了省帧数把一堆无关地址包括进来。比如设备状态在W0温度在D100中间隔着一大段DM区那就分两条命令RR读W0RD读D100。这样每条命令的数据量小而且不会读到不相关的值。5. 现场排错实录串口通信翻车的八个经典场景5.1 一点响应都没有先查物理层串口项目里超过一半的无响应是物理层问题。遇到这种我从来不在调试软件里干瞪眼直接万用表量线。RS-232C是交叉接法PC的RXD接PLC的SDPC的TXD接PLC的RD信号地接信号地。如果中间加过转接头线序大概率出问题。CIF11的接线更要注意A/B不要接反屏蔽层单端接地终端电阻按传输距离和站点数量决定距离短、只接一台设备可以不上终阻距离长、站点多就必须加上。现场经常出现一种情况近端调试正常线一拉长就丢包十有八九是屏蔽地没处理好。USB转串口线也是个坑。便宜的CH340线跑9600波特率还凑合调到19200以上就开始出现偶发错误。项目上位机正式部署时我用的是FTDI芯片的工业级转换器虽然贵一点但调试期省下的时间远超差价。5.2 参数不匹配通一会断一会如果串口助手里能看到响应但响应内容偶尔乱码或者发几帧之后就没动静了先怀疑波特率和数据格式。PLC设置里是9600、7E2PC端设的是9600、8N1命令大概率发不过去即使偶尔对上也会在长帧传输时出错。欧姆龙Host Link默认是7位数据位、偶校验、2位停止位这是老传统。实际操作时我一般统一设成8E1两边都改兼容性更好。改完之后必须重新下载PLC设置并断电重启这一点前面强调过真现场里每回都要踩一次。5.3 地址写错响应全是错误码响应帧会回来但内容是错误码这是地址问题。欧姆龙Host Link的地址全部用四位十六进制表示。D100写成100是不行的必须0100D99对应0063。起始地址超过实际范围也会报错比如CP1H的DM区最大到D32767你往D40000发响应直接返回错误码。调试时我用过最笨也最有效的方法PLC程序里启动时把几个固定值写到D0~D9里比如D01234、D15678。上位机第一条命令就是读D0~D9只要读回来的值和PLC程序写入的值一致地址编码规则就验证对了。这个自检思路建议做成上位机的标准启动流程。5.4 错误码速查表现场照着查响应错误码含义处理方式01命令长度错误检查帧长度、命令码是否完整02数据格式错误检查地址/数据是否为4位hex04地址超出范围对照PLC地址范围改起始地址13FCS校验错误检查校验算法和帧尾结构14格式错误检查是否漏了*CR数据位是否完整15数据错误检查写入数据的类型和范围16地址错误地址编码格式不对重点查十六进制转换精度1A命令不支持该命令码和端口模式不匹配确认是否为Host Link模式响应帧结构是 单元号 命令码 错误码 FCS CR比如00RD1400FCS\r中间14就是错误码。有了这个表现场排查能快很多。5.5 连上CX-P后上位机就掉线这个问题验证了一个端口只能干一件事。调试阶段用CX-P通过USB连PLC上位机通过CIF01走串口发命令两者互不干扰但如果CX-P也用同一个串口在线就会和上位机抢通信端口。具体表现是CX-P在线成功上位机马上超时断开CX-P上位机又恢复。另外还要检查PLC设置里“串行选件板”到底配的是Host Link还是No Protocol。CP1H的CIF01选件板如果被程序里的TXD/RXD指令当成了自由协议口上位机发Host Link命令自然石沉大海。查看方法是打开PLC程序搜索TXD、RXD指令的端口号看有没有对选件板端口发送指令。5.6 数据偶发错乱多半是干扰和接地如果通信速率不高、链路也通但偶发读到的数据跟实际值差一两个字节建议把波特率从19200降到9600同时检查串口线屏蔽层是否在PLC侧单端接地。RS-232C在工业现场的抗干扰能力本来就一般走线时避开变频器输出侧、电焊机电源线能绕就绕。CIF11走RS-485时终端电阻和偏置电阻按需配置。多站组网时最后一个站加终端电阻线路特别长、空闲状态电平不稳时在A/B之间加偏置电阻。这些细节现场容易忽略但恰恰是丢包率从10%降到0的关键。6. 如果客户要求的真的是“串行PLC链接”6.1 欧姆龙真正的PLC Link怎么配万一客户说的“PC LINK”真的是两台欧姆龙PLC数据共享那就得按Serial PLC Link来做。这个功能在CX-Programmer的PLC设置里端口模式选“Serial PLC Link主站”或“Serial PLC Link从站”。CP1H之间通过CIF11的RS-422A/485可以组最多9个站每个站设置一个通信单元号数据在固定的链接区自动共享。CP1H的串行PLC链接数据区默认是CIO 3100起步每个站按单元号分配一段通道。比如站号0的发送区是CIO 3100~3109站号1的发送区是CIO 3110~3119。所谓“发送区”就是本机写入、其他站自动读取的区域本机要读别的站的数据直接访问对应的CIO通道即可程序里不需要通信指令。这跟Host Link完全是两个方向Host Link是上位机主动读PLC Link是PLC后台自动刷。把这个功能配好之后两台PLC之间不需要上位机中转A机的温度数据写到自己的发送区B机程序直接拿来用。对多机联动、数据同步的场景这是欧姆龙原生的最省事方案。但我要提醒一句如果对端明确是PC工控机、组态软件别走这条路。没有任何一款组态软件默认支持PC作为Serial PLC Link站点。PC端老老实实用Host Link上位机做主站发命令PLC做从站响应这才是能落地的方案。6.2 PC要当“从机”时的折中架构如果客户死咬“PC是从机”这个说法现场又不方便改图纸我的做法是分级架构PLC之间用Serial PLC Link共享数据把关键数据汇总到主站PLC的DM区上位机PC再用Host Link读主站PLC的DM区。这样PLC之间数据链接是真·PC LinkPC和PLC之间的连接是Host Link两者各司其职客户图纸上的名词也能对上调试环节也不会出幺蛾子。还有一个小技巧图纸上写“从机PC LINK”但没写协议时先找供应商要到完整的PLC程序。看程序里是否出现过TXD/RXD、协议宏调用或者串口网关Serial Gateway配置。很多旧设备改造项目的所谓“PC LINK”其实是上位机通过Modbus-RTU读写PLCCP1H把端口设置成Modbus-RTU从站就能用根本不用欧姆龙专用帧。这种细节不看原程序根本猜不出来。回到开头那个现场。我最后给的方案就是CIF01选件板接上位机端口配Host Link上位机用RD/WD命令读写D区和W区程序侧补了一个上电初始化块把设备型号和版本号写到D0~D1方便上位机确认链路。整个调试过程从串口助手动第一帧开始到C#上位机批量读写稳定运行加起来不到半天。有的坑是在实践中反复踩出来的比如地址四位hex、FCS自动计算、端口模式与CX-P在线互斥这些点我写出来也是希望后来者少走几趟弯路。欧姆龙串口通信本身不难难的是把每一个看起来理所当然的“小设置”都对上。
返回列表