西门子1200多个经典通讯参考西门子案例西门子共计50多个包含各种通讯、脉冲控制、各种程序案例、 原因:逻辑清晰,一看就懂学懂这个,你也可以独当一面 规格如下: 1200 与 1200 Profinet 通信/单独1例(仅供学习用) S7-1200与S7-1200 PUT通讯/单独1例(仅供学习用) S7-1200与S7-1200 TCP通信/单独1例(仅供学习用) S7-1200与S7-300 PN S7通信/单独1例(仅供学习用) S7-1200与S7-300PN通信/单独1例(仅供学习用) S7-1200的移动块和存储区移动/单独1例(仅供学习用) 升降梯/单独1例(仅供学习用) 四轴脉冲控制/单独1例(仅供学习用) 跑马灯/单独1例(仅供学习用) 交通灯/单独1例(仅供学习用) 喷泉控制/单独1例(仅供学习用) 1200设置时间及时间相加减/单独1例(仅供学习用) S7-1200与S7-1200GET通信/单独1例(仅供学习用)

玩西门子1200的朋友,肯定绕不开各种通讯调试和经典程序逻辑——毕竟搞工控的,能把通讯打通、把程序逻辑捋顺,才算入门站稳脚。今天把压箱底的几个实用案例掏出来,代码、逻辑全给你扒明白,新手照着抄都能跑通。

一、1200与1200 Profinet通信:实时以太网的正确打开方式

Profinet是西门子最常用的实时以太网通讯,主从站组态好之后,数据交换快到离谱。

先看主站侧的数据交换代码,其实核心就是硬件组态后的映射读写:

// 主站发送数据到从站Q区
L     "DB_Main_Send".ProductionData  // 主站要发的生产数据(比如DB块里的字)
T     "IO_Slave_1200".Q0_0           // 从站的Q0.0对应地址,组态时映射好

// 主站读取从站I区数据
L     "IO_Slave_1200".I0_0           // 从站I0.0的输入信号
T     "DB_Main_Recv".SensorData      // 存到主站DB块做处理

唠两句重点

  • 组态时务必把主从站的设备名称和实际硬件一致,不然连不上(别问我怎么知道的,曾经因为打错一个字母调了一下午);
  • Profinet是“硬映射”,数据直接在I/Q区交换,不需要额外调用指令,比S7协议效率高,适合实时性要求高的场景,比如生产线联动。

二、PUT/GET通讯:不用组态也能跨PLC传数据

如果不想麻烦组态Profinet,PUT/GET绝对是懒人福音——纯软件S7协议,只要IP能ping通就能传数据。

先上PUT发送的代码片段:

// 调用PUT指令,给对面1200发数据
"PUT_DB".REQ := M0.0;        // 上升沿触发(别一直置1,浪费资源)
"PUT_DB".ID := 1;             // 连接ID,组态S7连接时设的数值要对应
"PUT_DB".ADDR_1 := 'DB1.DBW0';// 对方PLC的目标地址,必须是字符串格式
"PUT_DB".SD_1 := "DB_Local".SendValue;// 本地要发的数据,比如一个温度值
"PUT_DB".DONE := M0.1;        // 发送完成的标志位,后续可以做判断
"PUT_DB".ERROR := M0.2;       // 出错就看STATUS找原因,比如连接断了

GET和PUT几乎一模一样,就是把SD换成RD,从对面读数据。

西门子1200多个经典通讯参考西门子案例西门子共计50多个包含各种通讯、脉冲控制、各种程序案例、 原因:逻辑清晰,一看就懂学懂这个,你也可以独当一面 规格如下: 1200 与 1200 Profinet 通信/单独1例(仅供学习用) S7-1200与S7-1200 PUT通讯/单独1例(仅供学习用) S7-1200与S7-1200 TCP通信/单独1例(仅供学习用) S7-1200与S7-300 PN S7通信/单独1例(仅供学习用) S7-1200与S7-300PN通信/单独1例(仅供学习用) S7-1200的移动块和存储区移动/单独1例(仅供学习用) 升降梯/单独1例(仅供学习用) 四轴脉冲控制/单独1例(仅供学习用) 跑马灯/单独1例(仅供学习用) 交通灯/单独1例(仅供学习用) 喷泉控制/单独1例(仅供学习用) 1200设置时间及时间相加减/单独1例(仅供学习用) S7-1200与S7-1200GET通信/单独1例(仅供学习用)

踩坑提示:PLC的防火墙要开S7访问权限,不然会报连接错误;还有,对方的DB块要设置成“可访问”,不然PUT不进去。

三、交通灯控制:新手练逻辑的绝佳案例

看似简单的交通灯,实则藏着定时器、状态切换的核心逻辑,搞懂它,其他时序控制都不在话下。

核心代码用基本触点和定时器实现循环:

// 红灯亮30秒逻辑
NETWORK
LD     T32,>=,T#30S
O      M0.0  // 初始触发位
=      Q0.0  // 红灯输出
TON    T32, T#30S
A      Q0.2  // 黄灯灭时复位,回到红灯
R      M0.0

// 绿灯亮25秒逻辑
NETWORK
LD     T32,>=,T#30S
AN     T33,>=,T#25S
=      Q0.1  // 绿灯输出
TON    T33, T#25S
A      Q0.1
R      T32  // 绿灯亮完复位红灯定时器

// 黄灯闪烁5秒逻辑
NETWORK
LD     T33,>=,T#25S
AN     T34,>=,T#5S
XOR    M0.1  // 用异或实现闪烁
=      Q0.2  // 黄灯输出
TON    T34, T#5S
A      Q0.2
R      T33  // 黄灯闪完复位绿灯定时器

逻辑拆解

  • 用三个定时器串联触发,红灯到点触发绿灯,绿灯到点触发黄灯,黄灯到点回到红灯,形成循环;
  • 黄灯闪烁用XOR和辅助M点实现,相当于每触发一次就反转一次输出,不用写复杂的交替定时器,新手友好。

四、1200时间设置与加减:定时任务的核心

做设备排班、生产计时的朋友,肯定要和系统时间打交道,1200的时间指令比你想象的简单。

先看设置系统时间:

// 触发设置时间,用上升沿
LD     M1.0
T_SET  IN:= "DB_Time".SetDateTime,  // 自定义的DTL类型变量(比如2024-05-20 18:00:00)
       OUT:= "LocalDateTime",       // 系统本地时间变量(自带的,不用自己建)
       RET_VAL:= MW10;              // 返回值,0就是设置成功

再看时间加减,直接用T_ADD指令,不用自己换算秒数:

// 给当前时间加2小时
LD     M1.1
T_ADD  IN1:= "LocalDateTime",
       IN2:= T#2H,  // 直接写时间间隔,T#10M就是10分钟,T#1D就是1天
       OUT:= "DB_Time".AddResult,
       RET_VAL:= MW12;

实用技巧:把设置好的时间存到DB块,断电再上电时用OB100(启动组织块)读出来重新设置,避免时间丢失;时间加减还能用来算设备运行时长,比如用当前时间减开机时间,直接得到运行小时数。

五、剩下的案例,核心逻辑换汤不换药

  • 四轴脉冲控制:用MCPower、MCMoveAbsolute这些运动指令,组态好轴的参数(脉冲当量、加速时间),给个目标位置就能让伺服跑起来,代码就是调用指令填参数;
  • 升降梯:核心是上下限位检测+楼层触发,用SCR顺序控制每一层的动作,比如“上升到2层→触发限位→停梯开门→延时关门→等待下指令”;
  • 跑马灯:循环移位就行,用ROL(循环左移)指令,把Q区的位每次移一位,配合定时器触发,比如ROL QW0, 1,QW0的位就会一直左移,实现跑马灯效果;
  • 存储区移动:用MOVEBLK批量移数据,比如MOVEBLK IN:=P#DB1.DBX0.0 BYTE 10, OUT:=P#DB2.DBX0.0 BYTE 10, N:=10,一次性把DB1的10个字节移到DB2,比一个个MOVE高效10倍。

这些案例每个都单独成块,逻辑清晰到新手看一遍就能复刻——把这些吃透,不管是车间的通讯调试,还是设备的程序编写,都能独当一面。毕竟工控这行,核心就是把复杂问题拆解成简单的逻辑块,剩下的就是抄作业+微调了😎。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐