ARTICLE DETAIL

资讯详情

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

TIA博途V15.1+PLCSIM Advanced实现Modbus TCP/IP虚拟PLC通信仿真全流程

TIA博途V15.1+PLCSIM Advanced实现Modbus TCP/IP虚拟PLC通信仿真全流程 开头搞自动化这么多年跟Modbus TCP/IP打交道的场景实在是太多了。以前调试PLC通信程序动不动就要找实物设备——两个PLC、一个交换机加上各种接线人还得蹲在现场守着。要是碰上项目现场设备还没到货想提前把程序逻辑跑通简直是奢望。幸好西门子这套虚拟仿真方案已经相当成熟了TIA博途V15.1配合PLCSIM Advanced V2.0可以在纯软件环境下跑出真实PLC的通信效果连Modbus TCP/IP这种典型的工业以太网协议都能模拟得像模像样。我这次就把整套配置过程完整走了一遍从虚拟PLC创建、IP地址规划到Modbus服务器端MB_SERVER和客户端MB_CLIENT指令组态再到DB块逐条配置踩了不少坑最后总算把通信跑通了。这篇东西把全流程和关键DB块配置一并整理出来给正在研究虚拟仿真通信的朋友做个参考省得你们再走弯路。这个方案适合谁用不管是搞设备调试的工程师、做课程设计的自动化专业学生还是想在公司内部验证程序逻辑又不方便搬实物设备的项目组都能从中找到直接能抄作业的配置方法。不夸张地说掌握这套玩法之后很多通信程序的验证工作根本不需要碰硬件。1. 环境准备与软件版本选型1.1 版本兼容性分析先说版本问题这一步如果没选对后面的所有配置都是白搭。PLCSIM Advanced和TIA博途的版本匹配关系很严格不是随便两个版本都能装在一起用的。我这次用的是TIA博途V15.1加PLCSIM Advanced V2.0的组合。这个搭配在目前的工程实践中属于比较稳定成熟的一套网上能找到的教程和案例也相对丰富。需要特别说明的是PLCSIM Advanced和普通PLCSIM是两个完全不同的东西——普通PLCSIM就是最简单的逻辑仿真模拟不了网口通信而PLCSIM Advanced基于Hypervisor技术可以虚拟出一个带完整网络接口的PLC支持S7通信、Modbus TCP、TCP/IP等以太网协议的仿真。这就像一个是模型玩具一个是能真正跑起来的模拟驾驶舱差别非常大。安装顺序也有讲究。建议先装TIA博途V15.1再装PLCSIM Advanced V2.0。如果反过来经常会出现两个软件互相找不到授权、或者PLCSIM Advanced插件在TIA中不显示的情况。装完PLCSIM Advanced之后还需要手动启动它的授权服务这一步很多人容易忽略。注意PLCSIM Advanced V2.0对操作系统有要求Windows 10专业版/企业版基本没问题但家庭版可能会碰到Hyper-V相关的兼容问题。安装前先确认系统版本和BIOS中的虚拟化选项已开启。1.2 网卡与虚拟网卡的配置思路PLCSIM Advanced模拟出来的PLC要跟外界通信靠的就是实体机的网卡。这里有一个重要的概念PLCSIM Advanced会建立一个虚拟以太网适配器实体机通过这个虚拟网卡跟虚拟PLC交换数据。所以在跑仿真之前你得先把网络环境规划好。比较常见的做法是让PLC实例的IP和实体机网卡在同一个网段。比如实体机有线网卡的IP是192.168.1.10那虚拟PLC的IP就可以配成192.168.1.11这样两者之间就能互相访问。但如果你计算机上有多块网卡无线有线虚拟网卡经常会出现PLCSIM Advanced选错网卡的情况导致通信一直建立不起来。这个坑我后面专门讲先记住这个原则一定要指定PLCSIM Advanced使用哪块物理网卡。2. Modbus TCP/IP通信基础概念2.1 什么是Modbus TCP/IP在进入配置之前先花点时间把Modbus TCP/IP协议本身弄清楚。Modbus协议诞生于1979年刚开始是Modicon公司为了PLC通信开发的串行协议后来慢慢扩展到了TCP/IP网络上——这就成了Modbus TCP/IP。它的工作模式是典型的客户端/服务器Client/Server模式。服务器端在西门子PLC里对应MB_SERVER指令监听502端口等待客户端的连接请求客户端对应MB_CLIENT指令主动发起连接发送读写请求。这里的角色分配是个关键点很多人一开始会混淆以为服务器端是“提供服务”的就一定先启动实际在Modbus TCP里客户端和服务器端的角色只跟谁主动发起连接有关跟谁更重要没关系。Modbus TCP/IP的数据模型被划分成四个区域线圈Coil、离散输入Discrete Input、保持寄存器Holding Register和输入寄存器Input Register。日常用得最多的是线圈和保持寄存器。线圈按位寻址适合控制启动、停止信号保持寄存器按字寻址16位适合传输温度、压力、速度这些数值数据。在西门子PLC里这些数据区域会被映射到固定地址的DB块映射关系完全由你在MB_SERVER或MB_CLIENT指令的配置中定义。2.2 为什么选择PLCSIM Advanced做Modbus仿真有人可能问TIA博途自带PLCSIM能不能直接模拟Modbus TCP答案是普通PLCSIM不支持原因是它没有虚拟网络接口仿真环境里的通信指令根本没有载体可以传输数据。PLCSIM Advanced解决的就是这个问题。它虚拟出来的PLC实例拥有独立的IP地址和MAC地址完全等同于一台真实PLC的网络行为。用Modbus Poll或者自己写Python socket脚本去连这个虚拟IP得到的结果跟连真机几乎一模一样。还一个好处是速度——不用烧录程序、不用等PLC重启加载改完程序直接下载几秒钟就能跑起来。我在项目前期验证通信数据格式、地址映射逻辑的时候基本全靠这套工具效率提升非常明显。2.3 通信数据流向的整体认识在做具体配置前脑子里一定要有整条数据链路的概念。我这次的实验环境里虚拟了一个带MB_CLIENT指令的PLC作为客户端去读写另一个虚拟PLC的DB块数据。那台作为服务器的PLCDB块中的数据通过MB_SERVER指令开放给外部。这里要先理解一个西门子PLC的特殊之处在PLC的存储区里没有直接叫“Modbus寄存器”的东西只有I、Q、M、DB这些区域。所以Modbus指令要做的就是把外部Modbus地址映射到PLC实际存储区域中。这个映射关系是通过指令的配置参数实现的——服务器侧配置的是“从站地址映射到哪个DB块”客户端侧配置的是“从哪个PLC存储区读取/写入到Modbus从站的哪个地址”。搞懂了这个映射关系剩下的指令配置就是在填参数。3. TIA博途V15.1组态与虚拟PLC创建3.1 新建项目与添加PLC在TIA博途中新建项目后首先是添加PLC设备。这个过程跟正常做项目没什么两样但有一个关键点选设备型号时最好选择支持固件版本高于V2.0的CPU比如我这次用的是CPU 1511-1 PN。为什么因为PLCSIM Advanced对仿真PLC的固件版本有最低要求太老的固件版本可能无法正常实例化。这里提一个容易踩的坑——你添加的CPU型号必须是PLCSIM Advanced能支持的。如果在创建虚拟PLC实例的时候找不到对应的CPU类型大概率就是型号选错了。官方兼容性列表可以查一下但更简单的办法是选当前最新的常见型号比如1511、1515、1516系列基本都在支持范围内。添加完CPU之后建议顺手把CPU的IP地址设置好。在设备视图中选中CPU打开属性窗口找到PROFINET接口以太网地址设置中填上规划好的IP。这一步做了后面创建PLCSIM Advanced实例时会更省事。3.2 启动PLCSIM Advanced并创建虚拟PLC实例组态完成之后先不要急着下载程序而是先把PLCSIM Advanced跑起来。打开PLCSIM Advanced后界面是英文的但功能比较直观主界面里有两个关键选项卡“Online Access”和“PLC instances”。创建实例的步骤很简单在PLC instances选项卡中点击“New”输入一个实例名称选择虚拟PLC的型号然后设置IP地址。需要注意IP地址尽量与TIA项目中的CPU IP一致这样后面在线连接不会出幺蛾子。有一种很常见的操作顺序错误——有些人先把项目下载到了仿真PLC才开始创建PLCSIM Advanced实例结果发现实例界面里根本没有对应PLC。正确流程是先把PLCSIM Advanced实例创建好确定实例处于Running状态然后再回到TIA博途中去下载程序。提示PLCSIM Advanced的虚拟PLC实例启动后实体机系统里会出现一个新的虚拟网卡相当于给这台仿真PLC插了一根虚拟网线。3.3 下载程序到虚拟PLC下载程序时在TIA博途中选择“下载到设备”目标设备选择PLCSIM Advanced的虚拟实例而不是普通的PG/PC接口。如果搜索不到设备检查一下PLCSIM Advanced实例是否已经在运行以及TIA的项目IP和实例IP是否一致。下载过程需要输入访问密码不需要PLCSIM Advanced默认是不设保护密码的。不过如果你的CPU组态中开了访问保护那就要在PLCSIM Advanced中配置相同的密码才能完成连接。下载完成后把CPU切到RUN模式。到这里一个“能跑程序的虚拟PLC”就诞生了。4. Modbus TCP通信指令配置详解4.1 服务器侧MB_SERVER指令配置服务器侧的任务是开放PLC的数据区供外部读写。在TIA博途中打开OB1从右侧指令树中找到“通信”“开放式用户通信”“其他”“Modbus TCP”把MB_SERVER指令拖到程序段里。注意V15.1中Modbus TCP指令是集成在指令库中的不需要额外安装库文件。MB_SERVER指令有几个重要参数逐个说明DISCONNECT断开连接的布尔量输入。一般填False或一个常为False的M点。如果这个信号变True则服务器断开当前连接。MB_HOLD_REG保持寄存器指向的数据块。这是关键参数指向一个DB块这个DB块中的数据就是外部可以读写的寄存器区。CONNECT连接描述指向一个UDT的实例数据。这个UDT类型是“TCON_IP_v4”里面包含了对端的IP地址、端口号等信息。NDR接收新数据标志位。当服务器收到来自客户端的写请求并且写入了数据时NDR会输出一个脉冲。DR发送数据完成标志位。当服务器成功响应了客户端的读请求时DR输出脉冲。STATUS状态字记录通信过程中的错误代码。配置时最重要的一件事是在背景DB中CONNECT参数所指向的UDT必须正确填上端口号。Modbus TCP的标准端口是502你可以在连接描述中指定其它端口但客户端和服务器必须保持一致。4.2 客户端侧MB_CLIENT指令配置客户端侧是主动发起读写的角色。MB_CLIENT指令的参数比服务器侧稍微多一些重点说几个不太好理解的REQ读写的触发信号上升沿触发一次读写操作。可以接一个定时脉冲比如时钟存储器位也可以由程序逻辑控制。MODE功能码选择。这个太重要了——MODE为0表示读保持寄存器MODE为1表示写保持寄存器MODE为2表示写单个线圈MODE为3表示读线圈MODE为4表示写多个线圈。曾经有朋友在调试时写保持寄存器一直不成功查了半天发现MODE填的是0写成读模式去了。MB_MODE和MB_DATA_ADDR这两个参数一个决定读还是写一个决定从站的寄存器地址。注意MB_DATA_ADDR填写的是Modbus从站的地址编号不是PLC里的地址。比如要读从站保持寄存器地址40001那么MB_DATA_ADDR填40001或0取决于协议约定西门子的指令是直接填实际地址。MB_DATA_LEN读写数据长度字节数。如果是读保持寄存器长度一般填写寄存器数量×2。MB_DATA_PTR本地数据缓冲区指向一个DB块或M区读写的数据就放在这里。CONNECT同样是连接描述指向TCON_IP_v4类型的UDT实例。这里要填服务器的IP和端口。4.3 连接描述UDT的详细配置不管客户端还是服务器指令都依赖一个连接描述UDT来定义通信对端信息。在西门的例子程序里通常会看到他们用“TConfig”这个名称并创建了一个叫做“TCON_IP_v4”类型的UDT数据块。实际配置中需要打开这个UDT背景DB逐项填写InterfaceId填写16#0000表示自动选择网卡接口。但如果你有多个网卡建议填写具体的硬件标识符否则可能默认选到错误的网卡。ID连接编号必填。比如16#0001。ActiveEst决定本端是主动建立连接还是被动监听。服务器填False被动等待连接客户端填True主动连接服务器。RemoteAddress对端IP地址注意是4个BYTE。数组元素[1]到[4]分别对应IP的四个字节。RemotePort对端端口。服务器侧不用填监听本地端口客户端侧填写502。这些参数填错一个通信就建立不起来而且报错提示往往不是特别直观需要自己逐项排查。4.4 时钟存储器的设置MB_CLIENT的REQ触发信号一般习惯用时钟存储器给一个固定频率的脉冲。比如用M0.31Hz时钟位作为触发信号那么每一秒就会执行一次读写操作。在TIA博途中启用时钟存储器CPU属性 系统与时钟存储器 勾选“启用时钟存储器字节”并在后面的输入框中填一个M字节地址比如100那么M100.0到M100.7就是不同频率的时钟位。这是调试时的常用技巧省得自己写定时器产生脉冲。5. 完整DB块配置表与地址映射关系5.1 服务器侧保持寄存器DB块设计服务器侧MB_HOLD_REG指向的就是保持寄存器数据块。设计这个DB时要注意数据类型尽量使用WORD、INT、REAL这些16位或32位类型因为Modbus的保持寄存器按16位字划分。我这次设计了一个名为“DB_Modbus_Server_HoldReg”的DB块结构如下偏移地址数据类型变量名说明0IntReg_0_Int对应保持寄存器400012IntReg_1_Int对应保持寄存器400024DIntReg_2_DInt对应保持寄存器40003-40004占两个字8RealReg_4_Real对应保持寄存器40005-40006占两个字12BoolReg_6_Bit0对应保持寄存器40007的第0位14WordReg_7_Word对应保持寄存器40008注意Bool类型在Modbus映射中比较特殊——Modbus线圈区的位和保持寄存器的位读写规则不同。如果你想通过寄存器读写单个位需要在程序里做位提取不能直接把一个Bool地址填到保持寄存器里。实操提示在TIA博途中要勾选“优化块访问”前的复选框去掉否则DB块没有确定的偏移地址不利于后面在线监控和数据映射理解。虽然没有物理偏移也可以让Modbus指令正常工作但对初学者来说先取消优化块访问能看到清晰的地址偏移更容易排查问题。5.2 客户端侧数据缓冲区DB块设计客户端侧的MB_DATA_PTR指向一个数据缓冲区DB。这个DB的作用是存放从服务器读取到或待写入服务器的数据。我设计了“DB_Modbus_Client_Buffer”结构为数组或独立变量偏移地址数据类型变量名说明0Array[0..9] of WordReadBuffer存放从从站读取的保持寄存器数据20Array[0..9] of WordWriteBuffer存放待写入从站的保持寄存器数据实际变量名可以根据需求调整但缓冲区的格式要跟MB_DATA_LEN和MODE匹配。比如MODE为0读取保持寄存器MB_DATA_LEN填20即读取10个寄存器每个寄存器2字节那么读回来的数据就存放在ReadBuffer中。在程序中可以加一段简单的传送逻辑把ReadBuffer中的值传送到更具体的全局DB中用做后续逻辑运算。5.3 连接参数DB块与UDT实例除了数据缓冲区还需要创建存放连接参数的DB块。在添加MB_CLIENT指令的时候系统会提示为指令分配背景DB这个背景DB中会自动包含一个CONNECT参数类型为TCON_IP_v4。打开这个背景DB把CONNECT参数展开逐项填写目标IP、端口等信息。这里有一个细节值得注意TCON_IP_v4结构体中的RemoteAddress是BYTE数组不能用直观的IP地址字符串形式填写需要将IP拆成四个字节。比如192.168.1.11就填在RemoteAddress[1]192[2]168[3]1[4]11。5.4 地址映射关系速查表为了便于理解和调试我把Modbus地址和PLC数据块的映射关系整理成了一张速查表Modbus地址功能PLC侧位置说明40001保持寄存器只读DB_Server_HoldReg.Reg_0_Int服务器返回数据40002保持寄存器只读DB_Server_HoldReg.Reg_1_Int服务器返回数据40003-4000432位DIntDB_Server_HoldReg.Reg_2_DInt高字在前40005-4000632位RealDB_Server_HoldReg.Reg_4_Real高字在前40007保持寄存器(位操作)DB_Server_HoldReg.Reg_6_Bit0需要程序处理这张表在实际项目中会随业务逻辑而变化但映射关系和思路是通用的。6. 实际操作过程与通信验证6.1 完整实操流程回顾下面还原一下我这次从零开始跑通通信的全过程按照顺序操作绝大多数情况下都能成功创建TIA博途V15.1项目添加CPU 1511-1 PN配置IP为192.168.1.10。在程序中创建服务器和客户端所需的数据块、UDT背景DB。编写OB1程序调用MB_SERVER和MB_CLIENT指令配置好所有参数。编译项目确保没有错误。打开PLCSIM Advanced V2.0创建实例“MyVirtualPLC”选对应CPU型号IP填192.168.1.10点击Start。回到TIA博途点击下载按钮目标接口选择“PLCSIM Advanced”下载完成后将CPU切到RUN。此时两个虚拟PLC实例都处于运行状态。如果是要模拟两台PLC通信就再创建一个PLCSIM Advanced实例填另一个IP比如192.168.1.11把客户端程序下载进去。打开变量监控表或使用TIA的在线监控观察MB_CLIENT的NDR、DR和STATUS状态。6.2 用Modbus Poll验证通信结果为了更直观地看到通信效果我在实体机上安装了Modbus Poll一款通用的Modbus主站测试工具用它去连接PLCSIM Advanced模拟出来的服务器端PLC。设置如下Connection typeTCP/IPRemote IP address192.168.1.10Remote port502Function03 Read Holding RegistersAddress1对应40001Quantity10如果一切正常Modbus Poll窗口里会持续刷新从虚拟PLC读到的保持寄存器值。这些值就是DB_Modbus_Server_HoldReg中的数据。此时在TIA中修改这个DB的某个变量Modbus Poll中的对应地址也会跟着变化说明通信链路完全打通。这个方法比直接看PLC指令状态字直观得多。整个过程等于用一台虚拟的真实PLC做了回环通信协议栈、地址映射、数据链路全部得到了验证。6.3 TIA在线监控中观察到的指令状态在TIA博途中进入在线模式打开OB1程序可以看到MB_CLIENT和MB_SERVER指令的实参值。正常的通信状态下MB_CLIENT的STATUS值应该是16#0000表示无错误。NDR和DR会随着每一次读写操作产生脉冲。MB_SERVER的STATUS值同样为16#0000。如果STATUS不是0需要根据错误代码排查。常见的几个错误代码含义我整理在后面的问题排查表中。7. 常见问题与排查技巧实录7.1 通信建立不起来的常见原因调试过程中最容易遇到的就是STATUS报错、通信建立不起来。下面把高频问题整理成一张速查表现象可能原因排查方式客户端STATUS16#809B连接拒绝IP或端口不对检查UDT中RemoteAddress和端口客户端STATUS16#80C4网络不可达ping测试虚拟PLC的IP确认网卡选择正确服务器无响应服务器未启动或DISCONNECT信号为True检查MB_SERVER背景DB中的连接描述参数通信时断时续实体机休眠或网卡节能策略关闭网卡节能设置高性能电源计划TRUN/RUN改变时通信中断PLCSIM Advanced版本和TIA不匹配确认版本配套兼容7.2 关于PLCSIM Advanced虚拟网卡的坑实体机如果有多个网络接口PLCSIM Advanced在选择通信网卡时会出现一个很隐蔽的坑。它默认使用系统中“优先级最高”的网卡。如果你有无线网卡连接了互联网而有线网卡连接的是PLC网络PLCSIM Advanced完全有可能选到无线网卡导致虚拟PLC和实体机之间通信数据走错了接口。解决办法是在PLCSIM Advanced的设置中明确指定虚拟PLC要绑定的物理网卡。具体操作在PLCSIM Advanced界面中选择“Online Access”选项卡可以看到当前可用的物理网卡列表确保你需要的网卡处于已选择状态。7.3 数据错位的处理经验调试过程中发现读上来的数据跟自己写入的数值对不上这个情况大概率是地址映射计算错了。Modbus的保持寄存器是按字寻址的而PLC侧如果有REAL或DINT这类32位数据会占用两个寄存器。数据处理时要注意大端小端问题——Modbus协议默认大端高字节在前。在跨平台通信时比如跟单片机、PC程序通信经常要自己做字节序转换。碰到了这种问题先在Modbus Poll里找到对应寄存器地址确认数据位置正确再检查PLC程序中的数据排列。千万不要上来就怀疑通信有问题——通信本身往往没问题是地址对应关系错了。7.4 提高仿真通信稳定性的建议用PLCSIM Advanced做长时间通信测试时有几个方法可以减少中途掉线的概率。第一把实体机的电源计划设置为高性能关闭硬盘和网卡休眠选项。第二如果实体机有多个网口尽量保持只有一块网卡处于工作状态或者干脆禁用其它无关网卡。第三PLCSIM Advanced的虚拟PLC实例长时间运行后可能会出现内存占用过高、响应变慢的情况这种情况重启一下实例就恢复正常。还有一个容易被忽视的是Windows防火墙。PLCSIM Advanced和TIA的通信端口被防火墙拦截时表现出的现象就是下载程序时搜索不到设备或者在线监控时频繁断开。安装软件时如果防火墙弹窗记得选择“允许访问”别一气之下全点了拒绝。8. 扩展思考与实际应用建议8.1 这套方案的工程应用价值很多人觉得虚拟仿真只是教学演示用的玩具其实不然。我在实际项目中已经多次用这套环境做通信协议验证和技术预研。比如项目组需要判断现场设备是否支持某一种特定格式的Modbus数据区从采购设备到接线调试可能要等上一两周但用PLCSIM Advanced模拟可以当天出结果直接把测试报告发给甲方沟通效率完全不一样。特别是分散式控制系统中多个PLC之间通过Modbus TCP交换数据功能块的提前验证完全可以在办公室里完成。等到设备进场程序已经基本验证完毕现场调试时间大大缩短省下的时间就是项目利润。8.2 更进一步与真实设备混合使用PLCSIM Advanced虚拟PLC还有一个很有意思的用法——跟真实设备混合组网。虚拟PLC的IP和实体机在同一网段时真实PLC或其它支持Modbus TCP的设备完全可以把它视为一台普通的PLC进行通信。这意味着你可以在没有物理PLC的情况下做上位机组态软件、SCADA系统、甚至MES系统与PLC的联调测试。我做HMI组态画面的同事就经常用这个办法——画面组态完成后直接连PLCSIM Advanced上模拟的数据进行画面联调不需要每次都等真机到位。这种软硬结合的工作方式大大减少了对硬件设备的依赖项目交付节奏快了很多。8.3 后续方向建议如果你把基础通信调通了下一步可以尝试的扩展方向包括用PLCSIM Advanced模拟多个PLC的分布式通信场景验证数据同步逻辑。结合SCADA软件如WinCC做上位机与虚拟PLC的完整链路联调。尝试自己用Python写一个Modbus TCP主站或从站程序与虚拟PLC进行跨语言通信理解协议栈细节。学习S7-1500 PLC的Modbus TCP通信诊断方法比如读取通信诊断状态字等。每一步扩展都会让你对工业以太网通信有更深的理解。这个系列的内容足够学一阵子而且实用性很强。结尾最后说点实在的体会。用PLCSIM Advanced跑Modbus TCP仿真刚开始一定会遇到各种莫名其妙的问题尤其是版本不匹配、网卡选错、地址映射对不上这些。但只要把基础概念理清楚严格按照“先建实例、再下载程序、最后检查映射关系”的顺序操作绝大多数问题都能顺利解决。我个人在实际操作中最深刻的感受是别一遇到问题就去翻代码逻辑先确认网络层通不通——一条简单的ping命令就能帮你滤掉一半的故障原因。这套环境用顺了之后你对Modbus TCP的理解会比只看文档快得多因为你能直观地看到每一个参数的改变如何影响通信行为这种“所见即所得”的学习方式比死记硬背指令参数表高效太多。希望这篇配置记录能帮你少走一些弯路早点把通信跑通。
返回列表