1. 为什么要在仿真环境里打通MCGS和PLCSIM Advanced
做过自动化项目的朋友都知道,一套完整的控制系统在落地之前,最理想的验证方式就是在纯软件环境里把逻辑跑通、把画面联调好,确认没问题了再去现场接线调试。但现实往往很骨感——PLC硬件还没到货、触摸屏还在采购流程里、现场设备根本没条件让你反复试错。这时候如果能把PLC仿真器和触摸屏组态软件连起来,就等于在电脑里搭了一套“虚拟产线”,逻辑对不对、画面跳转顺不顺、数据交互有没有问题,全都能提前暴露出来。
MCGS(Monitor and Control Generated System)是国内工控圈用得非常多的一款组态软件,尤其是昆仑通态的TPC系列触摸屏,在中小型自动化项目里出镜率极高。而西门子的PLCSIM Advanced是S7-1200/1500系列PLC的高级仿真工具,它比早期的PLCSIM强在哪儿?核心就一点:支持以太网通信仿真。普通的PLCSIM只能做内部逻辑仿真,外部设备根本连不上它;PLCSIM Advanced则虚拟出了一张网卡,能像真实PLC一样响应网络请求,这就为MCGS这类第三方组态软件连接仿真PLC提供了物理层面的可能性。
这套方案解决的核心问题是:在没有实体PLC和实体触摸屏的情况下,完成MCGS画面与S7-1200/1500程序的联合调试。适合谁?一是正在学习西门子PLC和MCGS组态的在校学生,二是手头没有硬件但需要验证项目逻辑的工程师,三是想从S7-200 SMART迁移到1200/1500平台、顺便把触摸屏通信也摸一遍的老手。整个流程涉及TIA博图的硬件组态、PLCSIM Advanced的虚拟实例启动、MCGS的设备驱动配置、以及最关键的IP地址和通信端口匹配。下面我把整个流程拆开揉碎,一步步说清楚。
2. 整体方案设计与核心思路拆解
2.1 为什么选PLCSIM Advanced而不是普通PLCSIM
普通PLCSIM走的是西门子内部的虚拟通信接口,它跟TIA博图的仿真PLC之间是“私密通道”,外部程序想接进来基本没门。PLCSIM Advanced则不同,它提供了三种通信模式:Softbus、TCP/IP、PLCSIM Virtual Eth. Adapter。其中PLCSIM Virtual Eth. Adapter模式会在Windows系统里虚拟出一张网卡,这张网卡有独立的IP地址,仿真PLC就挂在这张网卡上,任何支持标准S7通信或Modbus TCP的第三方软件都能通过这张虚拟网卡跟仿真PLC通信。
MCGS这边,昆仑通态的驱动库里自带“西门子S7-1200/1500”以太网驱动,底层走的是S7通信协议。只要IP地址和机架槽号对得上,MCGS就能像连真实PLC一样连上PLCSIM Advanced的虚拟实例。这就是整个方案的底层逻辑:用虚拟网卡打通通信链路,让MCGS以为自己在跟一台真实的S7-1200说话。
2.2 版本匹配的坑:不是随便装两个软件就能连
这里必须先泼一盆冷水。PLCSIM Advanced对TIA博图的版本有严格要求,不是任意组合都能跑通。根据我的实测经验,比较稳妥的搭配是:
| TIA博图版本 | PLCSIM Advanced版本 | 备注 |
|---|---|---|
| V15.1 | V2.0 SP1 | 经典稳定组合 |
| V16 | V3.0 | 推荐,兼容性好 |
| V17 | V4.0 | 需要较新系统 |
| V18 | V5.0 | 最新组合,功能最全 |
MCGS这边,建议用MCGS Pro 3.3.6及以上版本,驱动库里对S7-1200/1500的支持比较完善。如果你用的是老版本的MCGS嵌入版7.7,驱动可能只支持S7-200/300,连1200会出问题。这一点在动手之前一定要确认清楚,否则后面调半天通信连不上,回头发现是驱动不支持,那才叫冤枉。
2.3 通信链路的数据流向
整个系统的数据流向是这样的:MCGS画面上的按钮或输入框产生操作信号,通过S7通信协议打包成以太网帧,发往PLCSIM Advanced虚拟网卡的IP地址;PLCSIM Advanced收到请求后,把数据映射到仿真PLC的对应DB块或M区;PLC程序执行逻辑运算后,把结果写回DB块;MCGS再通过读取操作把数据取回来,刷新到画面上。
理解了这个流向,后面配置的时候就知道每一步在干什么。比如为什么要在TIA博图里把DB块设置为“非优化访问”?因为优化访问的DB块没有固定的绝对地址,MCGS这种第三方软件没法按偏移量去读写。再比如为什么PLCSIM Advanced要选Virtual Eth. Adapter模式?因为只有这个模式才会在系统里生成一张真实的虚拟网卡,MCGS才能通过IP地址找到它。
3. TIA博图侧配置全流程
3.1 新建项目与PLC硬件组态
打开TIA博图,新建一个项目,添加一个S7-1200 CPU。具体型号选什么?如果你只是做仿真验证,选CPU 1214C DC/DC/DC就够了,这个型号在PLCSIM Advanced里支持得最好。添加完CPU之后,双击“设备与网络”,进入设备视图,确认一下CPU的以太网接口已经分配了IP地址。这个IP地址在仿真环境下不会真正生效,但TIA博图内部需要它来做通信组态,随便填一个跟虚拟网卡同网段的地址就行,比如192.168.0.1。
接下来是关键一步:在CPU属性里找到“保护”选项卡,勾选“允许从远程伙伴使用PUT/GET通信访问”。这个选项默认是不勾的,如果不勾,MCGS的S7通信请求会被PLC直接拒绝,现象就是MCGS显示“通信超时”或“连接被拒绝”。很多人卡在这一步,以为是IP配错了,其实是这个访问权限没开。
3.2 建立DB块并设置非优化访问
在程序块里新建一个全局DB块,比如命名为“DB_MCGS”。双击打开,在属性里找到“属性”选项卡,把“优化的块访问”前面的勾去掉。这一步至关重要,因为MCGS需要按绝对地址访问DB块,优化访问的DB块地址是符号化的,第三方软件读不了。
去掉优化访问之后,编译一下DB块,就能看到每个变量的偏移量了。比如你定义了一个数组Data[0..9],类型是Real,那么Data[0]的偏移量就是0.0,Data[1]是4.0,以此类推。这些偏移量就是MCGS里配置连接变量时要填的地址。
注意:DB块的编号也要记下来,比如DB1、DB2,MCGS里填地址的时候需要用到。建议把DB块编号和变量偏移量整理成一张表,后面配置MCGS的时候直接对着填,不容易出错。
3.3 编写测试程序
为了验证通信是否成功,写一段简单的测试程序。比如用一个定时器让一个整数变量每秒加一,或者用M区的几个位来做按钮的启停控制。我一般习惯在OB1里写这样的逻辑:
// 每秒计数一次 "DB_MCGS".Counter := "DB_MCGS".Counter + 1; // 按钮控制电机启停 IF "DB_MCGS".StartBtn THEN "DB_MCGS".MotorRun := TRUE; END_IF; IF "DB_MCGS".StopBtn THEN "DB_MCGS".MotorRun := FALSE; END_IF;这段程序的作用是:MCGS画面上按“启动”按钮,PLC的MotorRun置位;按“停止”按钮,MotorRun复位。同时Counter变量每秒自增,用来验证数据刷新是否正常。程序写完后编译整个项目,确保没有错误。
3.4 启动PLCSIM Advanced虚拟实例
打开PLCSIM Advanced,在界面里选择“PLCSIM Virtual Eth. Adapter”模式。然后设置虚拟网卡的IP地址,这个地址要跟TIA博图里CPU的IP地址在同一网段,但不要冲突。比如TIA里CPU设的是192.168.0.1,虚拟网卡就可以设192.168.0.100。子网掩码统一用255.255.255.0。
设置好之后,点击“Start”启动虚拟实例。这时候Windows的网络适配器列表里会多出一张虚拟网卡,状态是“已连接”。如果显示“未连接”或“网络电缆被拔出”,说明虚拟网卡驱动没装好,需要重新安装PLCSIM Advanced的驱动组件。
虚拟实例启动后,回到TIA博图,点击“下载到设备”,目标接口选择虚拟网卡对应的那个网段,就能把程序下载到仿真PLC里。下载完成后,TIA博图会显示“在线”,说明仿真PLC已经在运行了。
4. MCGS侧配置与通信调试
4.1 新建MCGS工程与设备组态
打开MCGS Pro,新建一个工程,选择对应的触摸屏型号。如果你用的是TPC1061Ti这类常见型号,直接选就行;如果只是做仿真验证,随便选一个分辨率匹配的型号也可以,因为仿真环境下触摸屏型号不影响通信。
进入“设备窗口”,双击“设备工具箱”,找到“西门子S7-1200/1500”以太网驱动,添加到设备组态里。然后双击这个驱动,进入属性设置。这里有几个关键参数:
- IP地址:填PLCSIM Advanced虚拟网卡的IP地址,比如192.168.0.100
- 端口号:默认102,不用改
- 机架号:S7-1200固定为0
- 槽号:S7-1200固定为1
- 本地TSAP:一般填03.00
- 远程TSAP:一般填03.01
这些参数里,机架号和槽号是最容易填错的。S7-300/400的机架号通常是0、槽号是2,但S7-1200/1500的槽号是1。填错了就连不上,现象是MCGS一直显示“正在连接”然后超时。
4.2 建立连接变量与地址映射
驱动添加好之后,在“实时数据库”里新建几个变量,比如Counter、StartBtn、StopBtn、MotorRun。然后在设备组态的“通道连接”里,把这些变量跟PLC的地址对应起来。
地址格式是这样的:DB编号.偏移量。比如Counter变量对应DB1.DBD0,StartBtn对应DB1.DBX4.0,StopBtn对应DB1.DBX4.1,MotorRun对应DB1.DBX4.2。注意数据类型要匹配:Counter是整数,用DBD0;StartBtn是布尔量,用DBX4.0。
实操心得:MCGS的地址格式跟西门子博图里的表示方法略有不同。博图里写DB1.DBD0,MCGS里也写DB1.DBD0,但有些版本的MCGS驱动要求写成DB1.DBW0或DB1.DBB0,具体取决于数据类型。如果通信连上了但数据读不对,先检查地址格式和数据类型是否匹配。
4.3 画面组态与按钮绑定
在用户窗口里新建一个画面,放几个按钮和显示框。启动按钮绑定StartBtn变量,操作属性设为“按下时置1,松开时置0”;停止按钮绑定StopBtn,同样设置。Counter变量用一个标签显示,设置成每秒刷新一次。MotorRun用一个指示灯显示,0是灰色,1是绿色。
画面做好之后,点击“下载”到MCGS模拟器。MCGS Pro自带模拟运行功能,不需要真实触摸屏也能跑。下载完成后,模拟器会自动启动,显示你做的画面。
4.4 通信调试与数据验证
现在到了最关键的环节:验证通信是否成功。在MCGS模拟器里按一下启动按钮,观察PLC那边的MotorRun是否置位。如果MCGS画面上指示灯变绿了,说明通信链路是通的。再看Counter变量,如果数字在每秒递增,说明数据读取也正常。
如果通信失败,按这个顺序排查:
- 检查PLCSIM Advanced虚拟网卡的IP地址是否跟MCGS里填的一致
- 在Windows命令行里ping一下虚拟网卡的IP,看能不能通
- 检查TIA博图里CPU的“允许PUT/GET通信访问”是否勾选
- 检查DB块是否去掉了优化访问
- 检查机架号和槽号是否填对
- 检查MCGS驱动版本是否支持S7-1200/1500
这套排查流程我走过很多遍,90%的问题都出在第3步和第4步。尤其是PUT/GET访问权限,很多人根本不知道有这个选项,通信连不上就以为是IP问题,其实IP早就通了,只是PLC拒绝了读写请求。
5. 常见问题与排查技巧实录
5.1 通信连接超时怎么办
这是最常见的问题,现象是MCGS一直显示“正在连接”然后报超时错误。排查思路分三层:第一层是网络层,确认虚拟网卡IP和MCGS里填的IP在同一网段,用ping命令测试连通性;第二层是协议层,确认TIA博图里PUT/GET通信访问已开启,DB块已去优化;第三层是驱动层,确认MCGS驱动版本支持S7-1200/1500,机架槽号填写正确。
如果ping通了但MCGS还是连不上,大概率是PUT/GET权限没开。这个选项在CPU属性的“保护”选项卡里,勾上之后需要重新编译下载才生效。
5.2 数据读到了但数值不对
通信连上了,Counter也能读,但数值跟PLC里实际的不一样。这种情况通常是数据类型或地址偏移量搞错了。比如PLC里Counter是DInt类型占4个字节,MCGS里如果按Word类型读,只能读到低16位,数值就会不对。解决办法是在MCGS里把变量类型改成32位整数,地址用DBD。
还有一种情况是DB块的偏移量算错了。博图里编译DB块后可以看到每个变量的偏移量,但如果你在DB块里插入了新变量,后面的偏移量会全部变化。所以每次修改DB块结构后,都要重新核对MCGS里的地址映射。
5.3 PLCSIM Advanced启动失败
有时候PLCSIM Advanced启动虚拟实例时会报错,提示“无法创建虚拟网卡”或“实例启动失败”。这通常是Windows的Hyper-V或WSL占用了虚拟化资源,导致PLCSIM Advanced的虚拟网卡驱动加载不了。解决办法是在Windows功能里关闭Hyper-V和WSL,重启电脑后再试。如果必须用WSL,可以考虑用VMware虚拟机来跑PLCSIM Advanced,但这样网络配置会更复杂一些。
5.4 MCGS模拟器画面不刷新
MCGS模拟器启动了,画面也显示了,但按钮按下去没反应,数据也不刷新。先检查MCGS的“设备调试”窗口,看通信状态是否显示“正常”。如果显示“正常”但数据不刷新,可能是变量的采集周期设得太长。在实时数据库里把变量的采集周期改成100ms或200ms,刷新速度会明显改善。
另外,MCGS模拟器跟PLCSIM Advanced之间的通信是单向轮询的,MCGS主动去读PLC的数据,PLC不会主动推。所以如果PLC里的数据变化很快,MCGS这边可能会有延迟,这是正常现象,不是通信故障。
5.5 常见问题速查表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 通信超时 | PUT/GET权限未开 | CPU属性里勾选允许PUT/GET |
| 通信超时 | IP不在同一网段 | 检查虚拟网卡和MCGS的IP设置 |
| 数据读不到 | DB块优化访问未关 | DB块属性里去掉优化访问 |
| 数据读到了但不对 | 数据类型不匹配 | 检查MCGS变量类型和地址格式 |
| 虚拟实例启动失败 | Hyper-V占用虚拟化 | 关闭Hyper-V后重启 |
| 画面不刷新 | 采集周期太长 | 改为100-200ms |
| 按钮无反应 | 变量绑定错误 | 检查按钮的操作属性设置 |
6. 进阶技巧与实战经验分享
6.1 用脚本模拟真实设备响应
仿真环境最大的好处是可以“作弊”。比如你想模拟一个温度传感器的信号,不需要真的接传感器,直接在PLC程序里写一段斜坡函数,让温度值从25度慢慢升到100度,MCGS画面上就能看到温度曲线在变化。这种模拟方式比接真实传感器还方便,因为你可以精确控制变化速率和范围。
再比如电机启停控制,你可以在PLC程序里加一个延时,模拟电机从启动到达到额定转速的过程,MCGS画面上就能看到电流逐渐上升的动画效果。这些细节在真实设备上很难反复调试,但在仿真环境里想怎么改就怎么改。
6.2 多画面切换与报警记录
MCGS支持多画面组态,你可以做几个不同的画面,比如主监控画面、参数设置画面、报警记录画面。在仿真环境下,画面切换的响应速度跟真实触摸屏几乎一样,可以用来验证画面逻辑是否合理。报警记录功能也可以提前测试,比如在PLC里模拟一个超温报警,看MCGS能不能正确弹出报警窗口并记录时间。
6.3 数据归档与趋势曲线
MCGS的数据归档功能可以把变量历史数据存到数据库里,然后用趋势曲线控件显示出来。在仿真环境下,你可以让PLC产生一段模拟数据,比如正弦波或方波,然后在MCGS里看趋势曲线是否平滑、采样间隔是否合理。这个功能在调试PID控制的时候特别有用,因为你可以反复调整PID参数,观察响应曲线的变化,而不需要担心把真实设备搞坏。
6.4 从仿真到实机的平滑过渡
仿真验证通过之后,把程序下载到真实PLC和触摸屏上,通信配置基本不用改,只需要把MCGS里的IP地址改成真实PLC的IP就行。DB块的地址映射也完全一致,因为仿真和实机的程序是同一套。这就是这套方案最大的价值:一次调试,两边通用。
不过有一点要注意:真实PLC的IP地址和虚拟网卡的IP地址通常不在同一网段,所以MCGS里要改IP。另外真实PLC的PUT/GET权限默认也是关闭的,下载程序后记得在TIA博图里勾上。
6.5 性能优化建议
PLCSIM Advanced的仿真性能跟电脑配置关系很大。如果电脑内存小于16GB,跑起来可能会卡顿,尤其是同时开TIA博图、PLCSIM Advanced和MCGS模拟器的时候。建议把虚拟机的内存分配调大一些,或者关掉不必要的后台程序。另外,MCGS的采集周期不要设得太短,100ms到200ms足够了,设成10ms反而会增加通信负担,导致数据刷新不稳定。
我在实际使用中发现,把PLCSIM Advanced的虚拟网卡设置为“专用网络”而不是“公用网络”,通信稳定性会更好一些。Windows的防火墙有时候会拦截虚拟网卡的通信请求,把网络类型改成专用之后,防火墙规则会宽松一些。如果还是不行,可以临时关闭防火墙测试一下,确认是防火墙问题后再添加例外规则。
最后再分享一个小技巧:如果你经常做仿真调试,可以把TIA博图项目、PLCSIM Advanced配置和MCGS工程打包成一个模板,下次新建项目的时候直接复制一份改改就行,省得每次都从头配置。尤其是DB块的地址映射表,整理成Excel表格存好,换项目的时候直接对照修改,效率能提高不少。