☰
西门子S7-1200/1500编程实战:从博途入门到FB封装与工业通讯
2026/10/13 14:01:59 网站建设 项目流程

作为一个围着西门子PLC转了这么多年的人,我见了太多朋友从S7-200 SMART、三菱FX系列转到S7-1200/1500时,第一反应都是“卧槽这软件怎么这么复杂”。博途TIA Portal打开的一瞬间,满屏的组态树、设备视图、网络视图,直接把很多人劝退。但只要路子对了,S7-1200/1500这个平台其实是目前市面上对新手最友好、上限又极高的一个选择。

这篇东西不是照着说明书给你翻译一遍,而是我实打实带项目、带人过程中总结出来的“宝藏级”经验:从软件环境怎么搭、仿真怎么玩,到FB功能块怎么写才能复用、通讯怎么接才能不踩雷,再到博途报错怎么排、防火墙怎么配,我会把最干的货都倒出来。你如果是刚接触西门子1200/1500,或者手上有项目但心里没底,这篇文章就是给你准备的。

1. 先别急着写代码,搞清楚主线

很多新手最典型的操作,是下载一个博途V17,新建一个项目,拖两个线圈进去,点下载,然后就懵了:怎么还要设IP地址?怎么还要编译?怎么一下载就把PLC切到STOP了?其实这些问题的根源,是你还不了解S7-1200/1500这套体系的整体逻辑。

1.1 从S7-300/200过来的朋友,先忘掉三个习惯

如果你是S7-200或者S7-300的老用户,有真么几个固化习惯必须先纠正,不然转到博途会非常痛苦。

第一个是“看门狗”思维。以前在STEP 7里,程序结构是OB1从上往下跑,你现在依然可以在OB1里写全部逻辑,PLC照样能跑。但博途只是一个壳,它的核心资产是数据块(DB)和功能块(FB/FC)。同样的功能,用OB1里面一大堆M点实现,和用FB封装一个带背景数据块的实现,后期的维护成本是天上地下。

第二个是“一个项目一个程序”的思维。以前你习惯把所有逻辑揉在一个大程序里,博途里你完全可以按设备、按工位拆成多个FB,再用OB调用。比如流水线项目,把每个工位的逻辑封装到独立的FB里,每个工位一个背景DB,查问题的时候直接在对应的DB里看实时值,效率高到离谱。

第三个是“上电就写,管他什么组态”的思维。在1200/1500平台上,硬件组态不只是用来配置站地址,它直接决定了你的程序能不能编译。比如你用了高速计数器、运动控制轴、PID Compact,这些功能块必须先在硬件组态里把对应通道、工艺对象配置好,程序里才能调用,否则编译直接报错。这一点和三菱、台达那种软元件全开放的体系差别非常大。

1.2 用项目倒推学习:选一个最容易出成绩的载体

我教过很多零基础的新手,发现最容易出信心的项目载体就是“十字路口红绿灯”。这玩意看起来谁都懂,但它几乎覆盖了PLC编程的所有基础要素:数字量输入(启动按钮)、数字量输出(红黄绿灯)、定时器(延时切换)、计数器(循环次数)和状态机的雏形。

红绿灯程序网上有各种版本,但我的建议是:别直接抄,你要自己先画时序图——就是把红黄绿灯在60秒内的亮灭状态画成一条时间轴,然后想清楚这一个循环里有多少个时间节点,每个时间节点触发什么动作。这一步做完,你会发现后面所有编程都是在把你的时序思路翻译成梯形图或者SCL。

写红绿灯程序设计两套方案都值得做一遍:第一套用LAD(梯形图),让你熟悉触点和线圈的思维;第二套用SCL(结构化控制语言),让你体验IF、CASE这种高级语言的逻辑表达力。等你两套都写出来了,你会对“PLC程序的表达方式不只有梯形图”这个观念有切肤体会。这也解答了为什么很多人问“西门子PLC1200编程100例”该看什么——你看100个例子的本质,不是背梯形图,是看人家面对一个场景时是先画流程还是先写代码。

1.3 选对平台:S7-1200和S7-1500到底怎么选

标题里写着1200/1500,不少新手会纠结到底学哪个。我直接说结论:学习阶段选1200,项目阶段看控制器性能需求。

1200的优势是价格亲民、体积小、接线方便,它用的是micro SD卡存储程序,断电保持靠内置的保持性存储区,对小项目来说完全够用。1500的优势是处理性能强、内存大,支持更复杂的功能比如运动控制多轴插补、安全集成、高精度PID等等,而且1500的DB访问性能比1200强了一个档次。

编程软件都是博途,指令体系在基础层面几乎一致,这意味着你在1200里写好的FB,只要不涉及时钟同步、工艺对象这类高级功能,拖到1500项目里几乎可以直接复用。所以我的建议是:先用1200 PLC练手,把FB、通讯、仿真全玩溜了,再碰到需要上1500的项目,你没有任何学习成本,只是换个硬件。

2. 博途环境搭建与仿真调试

如果说PLC本身是身体,博途就是大脑。很多新手的第一个大坑就栽在软件环境上——版本太多,不知道装哪个;装好了又授权报错;好不容易打开,连接PLC时又碰到防火墙捣乱。这一章我把这些问题一次讲透。

2.1 版本选择与授权问题:别被“新版万岁”带偏

博途目前从V13一路出到V18、V19,每代又分Basic、Professional、Advanced等不同版本。我给你的建议是:学习用V17或V18,这是目前教程资源最丰富、兼容性也最稳的版本。如果你公司项目里用到的触摸屏、驱动器的固件版本比较老,别盲目追新版本,因为博途低版本打不开高版本项目,但高版本软件是可以向下兼容旧固件的,前提是你组态时选择正确的固件版本。

很多朋友卡在授权(License)上,软件装好了,一编译就提示“STEP 7 Basic 未授权”之类。这个不用慌,西门子官方有试用版的授权方式,可以在软件里选择试运行模式,功能上大部分都能用,只是有一些限制比如STEP 7 Professional里的部分高级选件需要正式授权。对于个人学习来说,试用版已经足够你把基础、通讯、仿真全部跑通。如果你在公司干活,让采购直接找代理商买正式授权是最好的正道,别折腾来找去,浪费时间的成本远高于授权费用。

提示:安装博途前先把系统区域语言改成“中文(简体)”,否则就算装的是中文版,菜单和帮助文件里也可能出现乱码。Windows 10/11专业版或企业版优先,家庭版有时候会因为组策略问题导致授权服务异常,能避则避。

2.2 S7-PLCSIM和S7-PLCSIM Advanced的区别

很多新手问:我手头没有PLC,怎么学?答案是用仿真。博途里自带的S7-PLCSIM就是最简单的一层仿真器,它能仿真数字量输入输出、定时器、计数器、DB数据块,连在线监视和强制都支持。写个红绿灯控制,用仿真跑通了,你的基本逻辑就没问题了。

但要注意,S7-PLCSIM解决不了你“学习真实通讯”的需求。因为它是纯软件仿真,不支持Profinet、Modbus TCP这类的实际通讯链路的搭建。如果你要做C#连接、OPC UA通信,或者要和真实触摸屏/机器人的通讯测试,就得用S7-PLCSIM Advanced。

S7-PLCSIM Advanced本质上是在你的电脑上虚拟出一个S7-1500 PLC,它占用一个网卡的IP地址,外部程序可以通过以太网和它通信。我用它做过C#上位机联合调试:博途里下载程序到虚拟PLC,然后用C#写的OPC UA客户端连上去读写数据,完全不需要真实硬件,这在开发上位机原型阶段省了巨多钱和时间。

2.3 防火墙与通讯设置:博途找不到设备的经典解法

连接PLC时最常见的报错是“设备无法访问”,或者在线搜索设备搜不到。九成原因是Windows防火墙拦截了博途的通讯端口。博途和PLC通讯主要走的是TCP/UDP的102端口(Profinet S7通讯)以及一系列的组播端口用于设备发现。

最快的解决办法:在Windows防火墙里对博途安装目录下的Siemens Automation软件放行,或者干脆把“Public Profile”里的防火墙状态临时关掉做一下测试。如果关掉防火墙就能连上,你就知道问题出在防火墙规则,然后去把博途安装目录下的可执行程序逐个添加进“允许通过防火墙”清单即可。注意,关防火墙只做排查用,生产环境绝对不能裸奔,正确姿势是精确放行程序而不是关闭整个防火墙。

注意:如果你电脑上装了多个版本的博途,或者装了其它工业软件(比如WinCC、TIA选件),它们各自有不同的服务端口,搜不到设备时先用“在线访问”功能查看网卡是否能收到PLC的报文,再用命令行ping一下PLC的IP确认物理链路通不通,层层排查,别上来就重装软件。

3. 核心程序能力:指令、功能块与实例程序

软件环境搞定,后面才是真正考验功力的地方。很多新手卡在指令太多记不住,其实没有任何人能把博途里的指令全背下来,重要的是掌握那些高频、核心、能通用的内容。

3.1 定时器别混用:IEC定时器和S5定时器的区别

在S7-200 SMART里你用TON、TOF、TONR已经习惯了,到博途里你发现定时器多了:IEC定时器(TON、TOF、TP、TONR)和S5定时器(S5TIME格式的那种)。刚开始我也很纳闷,这俩到底用哪个?

我的经验是:新项目一律用IEC定时器。IEC定时器的精度更高,支持实数时间基,而且它的变量类型是TIME或LTIME,可以直接用一个DB里的变量做设定值,这对程序的可读性非常好。S5定时器是历史遗留,它用S5TIME格式存储时间值,好处是梯形图里可以直接填一个“S5T#5S”,但它的定时范围和精度都不如IEC定时器,尤其在1500这种高性能CPU上如果你还用S5时间格式,完全是在暴殄天物。

有个易错点是IEC定时器的IN输入端:很多新手用常开触点直接接上去,仿真发现定时器不走,怎么排查都不明白。原因往往是定时器块没有放在一个周期性执行的OB里,或者IN端前面的逻辑因为某种原因一直为FALSE。请记住,定时器是“沿触发还是电平触发”取决于你写的方式,TON是电平触发型,只要IN为TRUE就持续计时。

3.2 功能块封装:以阀门控制FB为例

这是在热词里出现的“西门子阀门FB块”,也是我认为新手进阶最重要的一个分水岭。什么叫功能块封装能力?就是你把一个设备的控制逻辑,比如电磁阀、气缸、变频器启停,做成一坨“黑盒子”,输入端给它命令和状态,输出端接执行器和反馈信号。以后遇到同类型的设备,直接调用这个FB,给它分配一个不同的背景数据块,就完成了一个新设备的编程。

我给你一个最简单的阀门控制FB的例子:

FUNCTION_BLOCK FB_Valve VAR_INPUT bOpenCommand : BOOL; // 开阀指令 bCloseCommand : BOOL; // 关阀指令 bOpenFeedback : BOOL; // 开到位反馈 bCloseFeedback : BOOL; // 关到位反馈 bFaultReset : BOOL; // 故障复位 END_VAR VAR_OUTPUT bOpenOut : BOOL; // 开阀输出 bCloseOut : BOOL; // 关阀输出 bFault : BOOL; // 故障 bOpenPosition : BOOL; // 已开到位 bClosePosition : BOOL; // 已关到位 END_VAR VAR tonFault : TON; bTmpFault : BOOL; END_VAR

这个FB的内部逻辑其实很简单:输出=输入指令,反馈状态直接透传到输出端,同时做一个“开阀超时反馈检测”——如果发出开阀指令后过了设定时间还没收到开到位反馈,就输出一个故障。这样你就把一个阀门的“换向指令、反馈采集、超时保护”全部收进一个块里。后面每个阀门就是调用一次FB_Valve,工程量大减。

封装FB时有个重要的习惯:输入、输出变量名字最好跟设备现场的标签一致。比如你在DCS或者触摸屏上叫“XV-101开命令”,你在FB的输入管脚也叫这个名字,这样后期查通讯变量地址时一目了然,不会理解偏差。

3.3 从普通程序到“百例”之路:结合实例理解套路

网上流传“西门子PLC1200编程100例”,很多新手把这个当成武侠秘籍,以为看完了就会武功。我说句实在话,这种“百例”真正的价值不在于第37个例子里的某个定时器怎么接,而在于你看完之后能归纳出常见的“程序套路”。

比如电机控制,就是启保停电路加正反转互锁;气缸控制,就是双线圈或单线圈加到位反馈和超时报警;加热控制,就是PID温度闭环加升温速率限制;红灯绿灯控制,就是时序状态机加计时器。凡是一个实际设备,拆解开来都是这几个基本环节的组合。我强烈建议你在学习时养成一个习惯:每做一个例程,把它适合复用的逻辑抽象成一个FC或者FB,存在自己的“知识库”项目里,下次看到类似需求直接拖出来改一改。久而久之,你写的就不是程序,而是“模板组合拳”。

3.4 安全PLC与Muting功能块:进阶方向

热词里出现“西门子安全PLC 安全光栅程序编写”和“西门子muting功能块”,说明有一部分读者已经在接触安全相关应用了。这里我简单说两句:S7-1200F和S7-1500F是安全型PLC,它们编程时要额外使用安全程序部分,用F-LAD/F-FBD编写,所有安全输入输出都要经过安全模块。安全光栅接入后要做信号评估,最简单的做法是把安全光栅的输出接到安全输入模块上,然后通过安全程序切断接触器控制回路。

Muting功能块是用于屏蔽安全装置的逻辑块,典型应用场景是自动生产线上的物料入口:安全光栅装在入口处,当检测到托盘或工件通过时,短暂屏蔽安全光栅,不让它触发停机,而检测到人的轮廓时则不屏蔽并立即停机。这个逻辑需要精心设计,因为它涉及安全额定值的计算,不是随便拉几个定时器就行。建议新手先不要碰安全编程,在普通PLC逻辑和常规功能块成熟之后再逐步学习安全标准(如ISO 13849)和西门子的安全编程规范。

4. 通讯实战:从485到OPC UA

PLC的价值一半在控制,一半在通讯。一个不和外界打交道的PLC只是一个高级继电器,而通讯这块恰恰是新手问得最多、也最容易犯错的。

4.1 485通讯块该怎么写

热词“485通讯块如何写程序”是很有代表意义的问题。在实际项目中,S7-1200/1500做485通讯通常有两种路径:

路径一是加通信模块,比如CB1241(1200的RS485通信板),或者CM1241 RS485通信模块。路径二是用支持Modbus RTU的通信模块,直接在博途里调用Modbus RTU从站/主站指令库。我强烈建议你首选Modbus RTU指令库,而不自己去手写一串串的字符收发,因为西门子已经封装好了底层协议,你只需要配置参数,调用MB_COMM_LOAD和MB_MASTER/MB_SLAVE这些指令即可。

写485通讯程序的要点有两个:一是波特率、校验位、数据格式要和对方设备完全一致,这个是最容易踩坑的,双方不一致时通讯报文就是乱码;二是轮询机制,如果PLC做Modbus主站,要一个个地轮询从站,不能同时发多帧数据,否则总线冲突。我给新手一个建议:写一个通讯FB,输入参数是从站地址、功能码、数据地址、数据长度、轮询使能,输出是通讯状态和数据缓冲,以后每个485仪表都调这个FB,你只需要配置好每个仪表的参数表即可,非常省心。

4.2 与上位机通讯:C#连接西门子OPC UA

“C#连接西门子opc”也是一个高频需求。现在S7-1200/1500都支持OPC UA服务器功能,1500只需要在博途里勾选“OPC UA”并设置好安全策略和用户账号,1200的话则需要固件版本V4.0以上才支持。启用OPC UA后,外部程序可以通过OPC UA协议直接读写PLC的DB、I/O、M区。

C#连接OPC UA,我推荐使用Opc.Ua.Core和Opc.Ua.Client这两个NuGet程序包,你把PLC的OPC UA服务器端点地址(形如opc.tcp://192.168.0.1:4840)填进去,然后创建一个会话,就可以进行节点读取和订阅。这里的核心难点是节点ID的路径计算:西门子OPC UA的节点路径对应“Data Blocks / 你的DB名 / 变量名”这种结构,你可以用UaExpert这个工具浏览PLC的地址空间,把节点ID抓出来填到你的C#程序里。

4.3 与机器人/变频器/DCS的通讯组合拳

热词里“西门子1500和库卡机器人交互”“ABB变频器与西门子PLC”“西门子PLC与DCS通讯”都是真实项目里高频的场景。这类跨设备通讯目前最流行的就是Profinet。

和ABB变频器通讯,你在博途的硬件目录里可以直接搜到ABB的GSD文件(GSDML描述文件),安装后像组态一个分布式I/O一样把变频器导入项目,然后你就可以直接在程序里读写ABB变频器的控制字、状态字、频率设定值和实际值。注意控制字和状态字的位定义一定要参照ABB手册,很多新手把速度写进去了电机不转,一查就是控制字里的“运行使能”和“斜坡使能”没有置位。

和库卡机器人交互,如果是新的KRC5系统,直接在博途里组态Profinet的IO设备,然后按照双方约定的映射表把输入输出字节对应到机器人的外部自动运行接口。和DCS通讯时,常见的是走Modbus TCP或者OPC UA,取决于DCS支持什么,一般来说DCS侧做Modbus主站,PLC做Modbus从站,把需要的变量映射到Modbus保持寄存器区,两边地址表一核对就能跑起来。

4.4 威纶通触摸屏与Intouch标签导入

“威纶通触摸屏导入西门子s7-1200标签”这个需求非常典型,因为很多人直接在触摸屏软件里一个个手敲点位,又累又容易错。威纶通的EBPro软件里,新建一个“S7-1200 Ethernet”设备之后,可以在“Tag”页面选择从PLC导入标签,前提是博途里把DB的“优化块访问”属性关掉,这样才能生成绝对地址(比如DB1.DBX0.0),触摸屏才能通过S7协议访问到这些地址。这是我反复强调的一个坑:1200/1500的DB默认是优化访问,很多第三方通讯(包括触摸屏、组态软件、C#轻量通讯)都访问不了优化的DB,你需要右键DB->属性->把“优化的块访问”勾掉,然后重新编译下载。

Intouch和1500通讯,一般也是通过S7协议或者DAServer来实现,操作上更偏上位机组态,这里不展开细节,但核心依然是找到正确的驱动、填对PLC IP和DB块号。

4.5 UDP组播:什么时候用得上

“西门子1200 udp组播”这个看起来比较冷门,其实在什么场景下用呢?就是你要做多台PLC之间的数据同步,或者PLC给多个上位机同时广播数据。UDP组播只需要一个IP地址组(比如239.255.0.1),所有加入这个组的主机都能收到数据。西门子1200/1500通过TIA里的TSEND_C/TRCV_C指令或者更底层的UDP块可以实现组播。

但要注意,UDP组播是“发了就不管”的通讯方式,报文丢了不会重传,不适合关键数据的传输,关键数据还是老老实实走S7协议或者Profinet IO。

5. 常见问题排查与学习路线建议

最后这部分,我把平时被问得最多的问题和踩坑经验整理出来,基本可以当速查手册用。

5.1 博途报错与离线排查技巧

博途软件报错“STEP 7 basic”未授权,前面的章节已经讲了一部分。另外有个高频问题是编译提示“存在错误”,但错误列表又不明显,这时候你点开下方“编译”窗口,把“错误/警告”切换成“所有问题”,很多藏在警告里的事情就浮出水面了。再有就是下载时提示“模块的固件版本与项目不匹配”,那是因为你在组态里选择的CPU固件版本和实际硬件版本不一致,在设备视图CPU属性里改成实际版即可。

还有人在博途V17里碰到“显示设备不兼容的版本”这种提示,多半是试图把V16或V18创建的项目用V17打开,博途项目向上兼容、向下不兼容,版本不匹配没辙,只能换对应版本软件,或者从高版本导出为“TIA项目格式”(.zap17之类)给低版本导入,但支持有限,别太指望。

5.2 程序块解锁与保护:密码忘记怎么办

热词里有“西门子step7程序块解锁”和“保护机密plc组态数据的密码时出错”,这一块属于很多工程师的闹心操作。说实话,如果你是厂家且忘记了自己设的块密码,博途没有官方提供的“找回”功能,唯一合法途径是联系西门子技术支持走解锁流程,并且要提供购货证明等信息。如果你是项目乙方,接收到了一个遗留项目,原厂不提供密码,程序块被加密,这时候你只能要求原厂配合解锁,没有其他捷径可走。至于网上某些所谓“解密工具”,建议碰都不要碰,既可能损坏项目文件,也可能涉及法律风险。我的经验是:项目交付时一定把源码程序包和块密码明文写进交付文档里,转交给业主方,这是业内基本素养。

5.3 几个高低搭配的必备学习资源

聊点轻松实用的。收藏夹里我会给新手放这些资源:

第一是西门子官方技术支持网站里的FAQ和应用例程,尤其“Automation License Manager”相关的授权操作手册和“S7-1200/1500功能手册”,虽然看得费劲,但遇到问题最靠谱的还是官方文档。

第二是博途自带的帮助系统,按F1弹出的帮助手册里包含全部指令的详细解释和时序图,往往比你在搜索引擎上找半天还灵。

第三是我自己的习惯:建一个“测试项目”,专门用来试验新指令。每次看到一个不熟悉的指令或功能块,我先在测试项目里构造一个小场景跑仿真,跑通了再决定是否在实际项目里用。这比在正式项目里直接改代码安全一个数量级。

5.4 西门子与三菱:PID参数能不能换算

热词里“西门子和三菱的pid参数可以换算吗”是个很有意思的问题。我的回答是:能换算,但不能直接照抄。三菱FX系列PID指令里的增益用百分比表示(例如K=20%表示比例带),温控指令还有采样时间、微分时间、积分时间这些参数;西门子的PID_Compact里,增益Gain是真正的比例系数Kp,积分时间Ti和微分时间Td的单位是秒。两者之间的关系:三菱的K值除以100后再取倒数,大致对应西门子的Kp,比如三菱K=50%,相当于西门子Gain=2。但这个换算只适合作为初始值,因为两套PID算法结构不同,内部还涉及积分限幅、微分滤波、执行器饱和这些差异,最终参数还是要现场调。

写在最后

刚才说了这么多,我最想表达的一个观点是:西门子1200/1500所谓“新手友好”不是指它简单,而是它的学习曲线设计得比老一代产品平滑太多了,博途里的在线帮助、仿真器、事件驱动的诊断机制,都是老前辈们的知识沉淀。但你如果希望靠“收藏一份神贴”就学会PLC,那是白日做梦。

我给每一个新手的行动建议永远是这三句话:一是动手做一个小项目,红绿灯也好、电机启保停也好,把博途下载、在线监视、仿真全流程走一遍;二是封装自己的第一个功能块,把最常用的控制逻辑做成FB,感受一下复用带来的快感;三是勇敢地在测试项目里犯错,模拟通讯断线、模拟超时报警、模拟I/O模块掉线,把这些异常情况都体验一遍,比看一百遍说明书都有用。

最后再分享一个小技巧:博途在线监视时,把一个FB的“实例”右键添加到“监控表”里,你可以同时看多个FB的输入输出状态,调试效率直接翻倍。这个功能很多老手都不一定知道,但用习惯了就很难戒掉。PLC这条路,耐心比聪明重要,持续动手比收藏攻略重要。希望能对正在跨越1200/1500这道门槛的你有所帮助。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询