尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

工业PLC跨协议数据转发实战:CIP与OPC UA到寄存器的精准映射

工业PLC跨协议数据转发实战:CIP与OPC UA到寄存器的精准映射 1. 项目本质与工业现场真实痛点解析在工厂自动化产线里我见过太多次这样的场景新上的视觉检测系统用的是OPC UA协议老产线的AB ControlLogix PLC只认CIP而车间调度系统又要求把所有设备状态统一写进一台西门子S7-1500的DB块里——三套系统像三个说不同方言的人站在同一间控制室里却没法对话。这个标题说的“工业控制常用的CIP协议、OPC UA协议的标签数据转发到另外的PLC寄存器地址”根本不是什么高大上的协议转换实验而是每天都在发生的、关乎产线能否连续运行的硬需求。核心关键词CIP、OPC UA、PLC、寄存器地址、标签每一个词背后都连着真实的物理设备和产线停机风险。CIP是罗克韦尔系PLC的“母语”OPC UA是跨厂商设备互通的“世界语”而寄存器地址就是PLC内存里那个具体存放温度值、电机转速、故障代码的“门牌号”标签则是工程师在组态软件里给这个地址起的“人名”。转发的本质是让A设备上叫“MainConveyor_Speed”的标签其数值能实时、准确、不丢不乱地出现在B设备的MW100地址里。这不是写个Demo就能交差的事——产线节拍是2秒一个工件数据延迟超过300ms就可能触发连锁停机西门子PLC的DB块有字节对齐要求错一位就导致整个结构体读取错乱AB PLC的CIP连接数有限制硬扛50个标签并发读写会直接断链。所以这篇内容不讲抽象协议栈只讲我在汽车焊装车间、食品灌装线、光伏组件组装线上踩过坑、验证过的实操路径怎么选中继设备、怎么配置映射关系、怎么验证数据一致性、怎么应对网络抖动和PLC重启。适合正在被多品牌设备集成问题卡住的自动化工程师、负责产线升级的项目负责人以及刚从学校出来、发现课本里没教过“两个PLC怎么互相喂数据”的应届生。你不需要懂ASN.1编码但得知道为什么OPC UA的NodeId不能直接填进TIA Portal的变量表也得明白CIP的Assembly Instance和S7的DB编号在内存布局上根本不是一回事。2. 协议底层逻辑与转发架构设计原理2.1 CIP与OPC UA的本质差异不是“翻译”而是“重新表达”很多人把协议转换理解成语言翻译比如把英文句子逐字翻成中文。但在工业现场CIP和OPC UA连“语法树”都长不一样强行直译必然出错。CIPCommon Industrial Protocol本质是嵌入在以太网帧里的二进制指令集它没有“标签”概念只有显式报文Explicit Message和隐式报文Implicit Message两种通信模式。显式报文用于配置、读写单个数据走TCP像寄挂号信隐式报文用于高速I/O数据交换走UDP像发短信。它的数据组织单位是Assembly Object装配对象每个Assembly有Instance ID实例号比如Instance 4对应输入数据Instance 5对应输出数据里面的数据按DINT、REAL、BOOL等原始类型连续排列没有字段名只有偏移量。你读取ControlLogix的输入点实际是从Assembly Instance 4的Offset 0开始读4个字节这4个字节代表什么全靠工程师心里默念“这是主输送带速度”。OPC UA则完全不同它是一个面向服务的架构SOA核心是地址空间Address Space由节点Node构成树状结构。每个节点有NodeId唯一标识、BrowseName浏览名、DisplayName显示名、Value值等属性。标签Tag在这里是变量节点Variable Node的别名比如NodeId为ns2;sMainConveyor.Speed的节点其BrowseName是SpeedDisplayName是主输送带速度。OPC UA传输的是结构化数据自带数据类型、时间戳、质量戳甚至支持方法调用和事件订阅。它不关心底层是TCP还是HTTPS也不管数据在内存里怎么排布——只要服务端把MainConveyor.Speed这个节点的值更新了所有订阅它的客户端立刻收到通知。所以转发不是把CIP的Assembly Instance 4 Offset 0的4个字节原样塞进OPC UA的ns2;sMainConveyor.Speed节点。而是要解构CIP的二进制流识别出其中哪个字节段对应哪个工艺参数再按OPC UA的编码规则通常是UA Binary重新打包写入目标节点。反过来把OPC UA的Speed值写回CIP也要先解码UA Binary提取出REAL类型的浮点数值再按CIP的DINT或REAL格式写入Assembly指定的Offset位置。这个过程里数据类型转换、字节序Endianness处理、数组索引映射、结构体拆包全是雷区。我曾在调试一条包装线时发现AB PLC传过来的温度值总是比实际高10倍最后查出来是CIP里用的是UINT16无符号16位整数而OPC UA客户端默认按INT16有符号解析最高位当成了符号位导致数值溢出。这种错误不会报错只会默默给你一个离谱的数字。2.2 转发架构的三种主流路径为什么放弃“纯软件方案”面对这种跨协议数据搬运业内常见三种技术路径纯软件桥接、专用协议网关、PLC内置功能。我必须坦白纯软件方案比如用Python写个OPC UA Client读数据再用pylogix写CIP写入在真实产线里基本不可行原因很现实第一Windows PC的稳定性远不如PLC一次系统更新、一个杀毒软件扫描就可能中断服务第二PC的网络栈和实时性无法保证OPC UA的Publish/Subscribe机制在PC上容易丢包CIP的隐式报文对网络抖动极其敏感第三也是最致命的PC作为中间节点一旦宕机上下游PLC就彻底失联产线直接停摆。这违背了工业控制“单点故障不影响全局”的黄金法则。第二种是专用协议网关比如Kepware、Matrikon、Softing的OPC UA Server或者国产的ThingsBoard、Ignition Edge。这类设备本质是嵌入式Linux盒子固化了协议栈启动快、功耗低、无风扇、支持宽温。它们的优势在于成熟度高、配置界面友好、支持大量设备驱动。但代价是成本高一台入门级网关价格抵得上两台小型PLC、灵活性差定制化脚本能力弱、升级依赖厂商。我曾用Kepware做过一个12台变频器的状态聚合项目配置完OPC UA Server后发现它把所有变频器的“运行状态”布尔量统一映射成了ns2;sDrive1.Status.Running这样的长NodeId而下游的SCADA系统只认Drive1_Running这种短标签名结果硬是花了两天在Kepware的Tag Alias里逐个重命名。第三种也是我目前在新项目里首选的方案利用PLC自身的多协议能力做“协议路由”。现代中高端PLC早已不是单协议孤岛。西门子S7-1500支持OPC UA Server/Client通过TIA Portal的“OPC UA”指令块可以直接读写其他OPC UA服务器的节点罗克韦尔ControlLogix 5580内置了OPC UA Server并可通过Add-On InstructionsAOI调用CIP通信汇川H5U系列PLC则原生支持CIP和Modbus TCP双协议。这意味着你可以让一台PLC既当CIP的Master去读取老设备数据又当OPC UA的Client把数据写进新系统的地址空间。这种方案把转发逻辑下沉到最可靠的硬件层消除了PC单点故障配置和调试都在熟悉的PLC编程环境里完成工程师无需学习新工具链。当然它要求PLC型号较新、固件版本够高且需要仔细规划PLC的CPU负载——读100个CIP标签写100个OPC UA节点对S7-1500 CPU 1511-1PN的循环周期影响微乎其微但对1200系列就得精打细算。2.3 寄存器地址映射的核心陷阱对齐、偏移与数据截断标题里“转发到另外的PLC寄存器地址”听着简单实操中最容易栽跟头的就是地址映射。PLC的寄存器地址不是一串随意的数字而是受内存布局Memory Layout和数据类型对齐Data Alignment严格约束的。以西门子S7为例DB块里的数据存储遵循“字节对齐”规则INT16位必须从偶数字节开始如DB1.DBX0.0, DB1.DBX2.0DINT32位必须从4的倍数字节开始如DB1.DBX0.0, DB1.DBX4.0REAL32位浮点同理。如果强行把一个REAL类型的数据写进DB1.DBX1.0TIA Portal编译时会报错即使编译过去运行时读取也会得到乱码。更隐蔽的是结构体UDT的填充Padding。比如定义一个UDT包含一个BOOL1位和一个REAL32位你以为占5字节实际编译后占8字节——因为REAL必须对齐到4字节边界编译器会在BOOL后面自动插入3字节填充。我曾遇到一个案例某OEM厂提供的UDT定义里Motor_TorqueREAL紧跟在Motor_EnableBOOL后面我们按字节偏移计算把CIP读来的扭矩值写进了DBX2.0结果SCADA上显示的扭矩永远是0。最后用S7-PLCSIM Advanced抓内存快照才发现Motor_Torque实际起始地址是DBX4.0前面2字节是填充。另一个致命陷阱是数据截断Truncation。CIP里一个DINT是32位有符号整数范围-2147483648 ~ 2147483647OPC UA的Int32同理。但如果你把CIP的DINT值写进西门子PLC的INT16位地址比如MW100那么高位16位会被直接丢弃数值发生不可逆的畸变。更麻烦的是浮点数CIP的REAL和OPC UA的Float都是IEEE 754单精度但西门子S7的REAL类型在DB块里存储时有时会因优化设置被压缩成USINT8位无符号用于状态位这时写入浮点值就会变成0或最大值。我的经验是所有跨协议转发必须建立一张《数据类型映射对照表》明确源协议数据类型、目标PLC数据类型、是否需缩放Scaling、是否需字节序转换Big Endian/Little Endian。例如AB PLC的CIPREALLittle Endian→ S7-1500 DB块REALLittle Endian直接拷贝但→ S7-1200的REAL某些固件版本默认Big Endian就必须在PLC程序里用SWAP指令交换高低字节。这张表不是可选项是项目启动时必须和客户、OEM厂三方签字确认的交付物。3. 实操步骤详解以S7-1500为中继PLC的完整配置流程3.1 硬件与软件环境准备版本兼容性是第一道坎在动手前必须确认所有设备的固件Firmware和软件Software版本满足最低兼容要求这是无数项目延期的根源。以西门子S7-1500作为中继PLC为例关键版本门槛如下S7-1500 CPU固件版本必须≥V2.8.0。低于此版本的CPU不支持OPC UA Client功能只能做Server即只能被别人读不能主动读别人。V2.8.0是分水岭它首次引入了OPC_UA_Client指令块允许PLC主动连接外部OPC UA服务器。TIA Portal软件版本必须≥V17。V16及更早版本对OPC UA Client的支持极不完善配置向导缺失错误提示晦涩。V17开始OPC UA相关功能被整合进“通信”“OPC UA”菜单配置流程大幅简化。目标OPC UA服务器必须支持OPC UA PubSub over UDP推荐或 OPC UA Binary over TCP。避免使用仅支持OPC UA XML或HTTPS的服务器因为S7-1500的OPC UA Client不支持这些传输层。Kepware、Ignition、Prosys OPC UA Simulation Server均符合要求。CIP通信侧若需读取AB PLCS7-1500本身不支持CIP协议必须加装CP 1543-1通讯处理器以太网接口模块并确保其固件≥V3.1.0。CP 1543-1通过“开放式用户通信OUC”功能可以发送CIP显式报文。注意CP 1543-1的OUC功能与S7-1500 CPU的OPC UA Client功能是独立的互不干扰可以同时启用。提示版本不匹配的典型症状是TIA Portal里找不到OPC_UA_Client指令块或在“设备配置”“OPC UA”页面下点击“添加OPC UA客户端”按钮无响应。此时不要怀疑自己操作先查固件和软件版本。我曾在一个项目里客户坚持用V16的TIA Portal结果折腾一周才意识到是软件版本问题换V17后半小时完成配置。3.2 配置S7-1500作为OPC UA Client从零建立安全连接第一步在TIA Portal V17中打开你的S7-1500项目进入“设备配置”视图。右键点击CPU在弹出菜单中选择“添加新设备” “通信” “OPC UA客户端”。系统会自动生成一个名为OPC_UA_Client_1的设备实例。双击它进入属性配置页。最关键的配置项是**“连接参数”**服务器URL填写目标OPC UA服务器的地址格式为opc.tcp://192.168.1.100:4840。注意端口号4840是OPC UA默认端口但很多服务器如Kepware会改用49320等非标端口务必在服务器端确认。安全策略选择None无加密或Basic256Sha256推荐。None适用于内网调试Basic256Sha256提供TLS加密防止数据被窃听。选择后者时必须在服务器端生成并导入证书否则连接失败。用户认证如果OPC UA服务器启用了用户名密码认证强烈建议生产环境启用在此处勾选“启用用户身份验证”并输入用户名如admin和密码。密码在TIA Portal中是明文显示的但下载到PLC后会加密存储。第二步配置**“订阅”**。点击“订阅”选项卡点击“添加订阅”。为这个订阅起一个有意义的名字如Sub_SensorData。设置“发布间隔Publishing Interval”这是决定数据刷新频率的关键参数。对于温度、压力等慢变参数设为1000ms1秒足够对于电机转速、电流等快变参数需设为100ms或更低。注意发布间隔越小网络和CPU负载越高需权衡。第三步也是最易出错的一步添加要读取的节点Tags。点击“添加变量”在弹出窗口中你需要手动输入OPC UA的NodeId。这里没有自动发现功能必须提前从OPC UA服务器的地址空间浏览器里复制准确的NodeId。例如Kepware里一个温度标签的NodeId可能是ns2;sChannel1.Device1.Temperature。在TIA Portal中粘贴进去后系统会自动识别其数据类型如Double。为这个变量起一个PLC内部变量名如Temp_MainConveyor。这个变量将自动创建在PLC的Global DB全局数据块里类型与源节点一致。注意NodeId中的ns代表命名空间索引Namespace Indexs代表字符串形式的标识符String Identifier。不同服务器的命名空间索引可能不同ns2在Kepware里是默认的设备命名空间但在Prosys模拟器里可能是ns1。务必在服务器端确认否则读不到数据。我曾因抄错一个字符ns2;s...写成ns2;s...多了一个空格导致PLC一直显示“BadNodeIdUnknown”错误排查了3小时才找到。3.3 配置CP 1543-1实现CIP通信用OUC发送显式报文CP 1543-1不支持CIP隐式报文I/O Connection只能用OUCOpen User Communication发送CIP显式报文。这意味着你需要自己构造CIP报文的二进制结构。幸运的是西门子提供了标准的TSEND_C和TRCV_C指令块配合预定义的CIP报文模板大大降低了难度。首先在“设备配置”中右键CP 1543-1选择“属性” “常规” “开放式用户通信”勾选“启用开放式用户通信”。然后在PLC程序中新建一个FB功能块命名为CIP_Read_AB_PLC。在FB的接口区声明以下变量Input_IPSTRING[15]存储AB PLC的IP地址如192.168.1.200Assembly_InstanceINT要读取的Assembly实例号如4输入OffsetINT数据在Assembly内的字节偏移量如0Data_LengthINT要读取的字节数如4读一个DINTRead_ResultARRAY[0..3] OF BYTE存储读取到的4个字节核心逻辑在FB内部使用TSEND_C指令向AB PLC的IP地址和端口CIP默认端口0xAF12即44818发送一个构造好的CIP报文。CIP报文结构固定前4字节是0x00000000预留接着是0x0000接口句柄0x0000超时0x0000CIP命令码0x006E表示读请求0x0000状态码0x0000发送ID0x0000选项然后是具体的请求数据0x0000路径大小0x20Class IDAssembly Class0x04Instance ID即Assembly_Instance0x28Attribute ID0x28表示读取整个Assembly0x0000附加路径此处为空。TRCV_C指令接收AB PLC返回的响应报文从中解析出状态码0x0000表示成功和实际数据。这个FB的难点在于CIP报文的二进制构造。西门子官方文档ID: 109740022提供了完整的CIP报文模板我已将其封装成一个标准库只需调用CIP_Read_Assembly函数传入IP、Instance、Offset、Length即可返回字节数组。这样工程师无需深究二进制细节专注业务逻辑。3.4 数据映射与转发逻辑在PLC程序中完成“翻译”现在S7-1500已经能从OPC UA服务器读到Temp_MainConveyorREAL类型也能从AB PLC的CIP Assembly里读到Read_Result4字节BYTE数组。下一步是在PLC的主程序OB1里把这两股数据“搬运”到目标PLC的寄存器地址。假设目标PLC是一台S7-1200IP为192.168.1.150我们需要把温度值写入其DB1的DBD100地址32位浮点数。这里有两个关键动作第一数据类型转换与缩放。Temp_MainConveyor是REALDBD100也是REAL理论上可以直接MOVE。但如果OPC UA服务器传来的温度值单位是摄氏度而S7-1200的HMI期望的是华氏度就需要缩放Fahrenheit : Celsius * 1.8 32.0。这个计算必须在S7-1500的PLC程序里完成不能依赖下游PLC。第二跨PLC写入。S7-1500写S7-1200最可靠的方式是使用S7通信S7 Communication而非TCP Socket。在TIA Portal中“网络视图”里右键S7-1500选择“添加新连接” “S7连接”。目标设备选择S7-1200连接类型选“PUT/GET”。PUT指令用于写入GET用于读取。在PLC程序中调用PUT指令块REQ使能信号用一个100ms的脉冲触发CONT持续使能保持连接DEST_ID目标PLC的连接ID在连接属性里自动生成SD源数据区指向Temp_MainConveyor变量LEN数据长度单位是字节REAL是4字节填4PUT指令执行后Temp_MainConveyor的值就精准地写入了S7-1200的DB1.DBX100.0即DBD100地址。整个过程在PLC的一个扫描周期内完成毫秒级延迟。实操心得PUT/GET指令的LEN参数极易出错。如果填1只写1个字节会导致后续3个字节仍是旧值形成“半写入”状态数据完全错乱。我习惯在程序里加一个MOVE指令先把Temp_MainConveyor复制到一个临时REAL变量再把这个临时变量的地址传给SD并用SIZEOF函数计算LEN确保万无一失。另外S7连接必须在双方PLC的“属性”“保护”“连接机制”里勾选“允许从远程伙伴建立连接”否则PUT会返回0x80C1错误连接拒绝。4. 关键配置参数详解与避坑指南4.1 OPC UA Client参数精调平衡实时性与稳定性OPC UA Client的几个核心参数直接决定了数据转发的“心跳”是否稳健发布间隔Publishing Interval如前所述这是数据刷新的节奏。但需注意它并非绝对精确。OPC UA服务器会根据自身负载将多个客户端的请求合并发送。因此即使你设为100ms实际收到数据的间隔可能在90~110ms之间波动。对于要求严格同步的场景如多轴联动必须启用OPC UA的PubSubPublish-Subscribe模式它基于UDP延迟更低10ms但配置更复杂且要求服务器和客户端都支持。S7-1500 V2.9固件开始支持PubSub但V17 TIA Portal尚无图形化配置需手动编辑JSON配置文件。订阅生命期Subscription Lifetime单位毫秒默认3000030秒。它定义了服务器在未收到客户端心跳Keep-Alive时维持该订阅的时间。客户端会自动发送心跳间隔为Publishing Interval * 3。如果网络偶尔抖动心跳丢失服务器会在生命期结束后删除订阅客户端需重新建立。为防误删可将生命期设为Publishing Interval * 10比如发布间隔100ms生命期设为1000ms。最大通知数量Max Notifications指每次发布消息中最多携带多少个数据变更通知。默认值1000。如果订阅了1000个标签且它们在同一毫秒内全部变化这个值刚好够用。但如果只订阅10个标签却设为1000会浪费带宽。建议按实际订阅数的2~3倍设置如订阅50个标签设为150。安全通道失效时间Security Token Lifetime当使用Basic256Sha256安全策略时TLS会话密钥有有效期默认3600000ms1小时。到期后客户端需重新握手。这个时间不宜过短频繁握手增加开销也不宜过长密钥长期有效有安全风险。生产环境推荐设为1800000ms30分钟。常见问题速查表现象可能原因排查方法OPC UA Client状态显示“BadWaitingForInitialData”订阅已建立但尚未收到任何数据检查OPC UA服务器端确认该NodeId确实有值在更新用UaExpert客户端连接同一服务器验证该节点可读状态显示“BadTimeout”网络不通或服务器无响应在S7-1500上ping目标服务器IP检查防火墙是否放行4840端口确认服务器OPC UA服务已启动状态显示“BadBadConfigurationError”连接参数错误如URL格式不对、安全策略不匹配仔细核对URL中的IP、端口、协议前缀确认服务器端安全策略与客户端一致检查证书是否过期4.2 CIP通信参数与性能瓶颈如何避免“读着读着就断了”CP 1543-1的OUC通信性能瓶颈主要在报文往返时间RTT和CPU处理能力上RTT从S7-1500发出CIP读请求到收到AB PLC响应整个过程耗时。在千兆以太网、距离100米的理想条件下RTT约2~5ms。但若网络中有HUB、老旧交换机或AB PLC CPU负载过高RTT可能飙升至50ms以上。OUC指令块有一个TIMEOUT参数单位毫秒默认1000。如果RTT超过此值指令会报错0x80C2超时。我的经验是在现场实测RTT后将TIMEOUT设为RTT的3倍。例如实测RTT为8ms则设TIMEOUT:25。CPU负载每个OUC指令块占用约1~2ms的CPU时间。如果一个循环里调用10个CIP_Read_Assembly就会吃掉10~20ms严重挤压其他控制逻辑的执行时间。解决方案是分时轮询Time-Sliced Polling将100个CIP标签分成10组每组10个每100ms轮询一组。这样单次CPU占用2ms总循环周期仍可控。连接数限制CP 1543-1最多支持16个OUC连接。每个TSEND_C/TRCV_C对占用一个连接。如果项目需要同时读取3台AB PLC每台读20个标签就需要60个连接远超上限。此时必须用连接复用Connection Reuse对同一台AB PLC的所有读请求共用一个OUC连接通过改变报文中的Assembly_Instance和Offset来区分。这要求你在FB里管理好连接状态避免并发冲突。实操心得CIP通信最怕“假死”。AB PLC可能因程序卡死不再响应CIP请求但TCP连接依然保持。此时OUC指令会一直等待直到超时。为防止单点故障拖垮整个PLC我在每个CIP读取FB里都加入一个“看门狗定时器Watchdog Timer”。如果连续3次读取失败STATUS0就自动关闭当前OUC连接延时1秒后重新建立。这个简单的逻辑让系统在AB PLC意外重启后能在5秒内自动恢复通信远胜于人工干预。4.3 寄存器地址映射的终极校验法用PLCSIM Advanced做内存快照纸上谈兵的地址映射永远不如亲眼所见。TIA Portal自带的PLCSIM Advanced仿真器是验证映射正确性的终极武器。它能让你像用示波器看波形一样实时观察PLC内存里每个字节的变化。操作步骤在TIA Portal中为S7-1500项目生成一个PLCSIM Advanced兼容的仿真文件.awd。启动PLCSIM Advanced加载该文件。在仿真器的“监视”视图中添加你要验证的目标地址如DB1.DBX0.0对应DBD0。在PLC程序中设置一个测试模式当某个M100.0位为1时强制将Temp_MainConveyor的值比如100.0写入DB1.DBX0.0。在仿真器里切换M100.0为1观察DB1.DBX0.0的值。如果显示100.0说明REAL类型映射正确如果显示0.0或1.17549e-38最小正浮点数说明字节序或对齐出了问题。进阶技巧在“内存”视图中直接查看DB1的十六进制内存 dump。100.0的IEEE 754单精度表示是0x42C80000Little Endian。如果dump里DB1.DBX0.0位置看到00 00 C8 42顺序正确如果看到42 C8 00 00说明是Big Endian需要SWAP。这个方法能100%暴露所有地址映射错误比在真实PLC上反复下载、测试、排查高效十倍。我所有的新项目都会在PLCSIM Advanced里完成全部地址映射的验证确保一次下载到现场就成功。5. 常见问题与实战排查技巧实录5.1 “数据能读到但写不进目标PLC”四层排查法这是最让人抓狂的问题。数据显示在S7-1500的变量表里一切正常但下游PLC的寄存器地址就是纹丝不动。我的标准化排查流程如下第一层PLC程序逻辑层检查PUT指令的REQ输入是否为真。REQ必须是上升沿或持续高电平。我常犯的错误是把REQ连到了一个常“1”的M0.0但忘了PUT指令是“边沿触发”需要脉冲。正确做法是用TP脉冲定时器生成一个100ms的脉冲。检查PUT指令的ERROR输出。如果ERROR1读取STATUS输出查西门子手册的错误代码。0x80C1是连接拒绝0x80C2是超时0x80C3是地址无效。第二层网络连接层在S7-1500的Web服务器HTTP://192.168.1.100里进入“诊断”“连接”查看到S7-1200的S7连接状态。如果是“未连接”说明网络不通或S7-1200未启用S7通信。在S7-1200上用TIA Portal的“在线与诊断”功能检查“保护”“连接机制”是否勾选了“允许从远程伙伴建立连接”。这是90%的连接失败原因。第三层地址空间层在S7-1200的TIA Portal项目里打开目标DB块如DB1确认DBD100地址确实存在且数据类型是REAL。有时工程师会误建INT类型导致写入失败。确认DB块的“访问权限”是“读写”。如果设为“只读”PUT指令会静默失败。第四层硬件物理层用笔记本电脑安装S7-PLCSIM Advanced加载S7-1200的仿真程序用同样的PUT指令尝试写入。
返回列表