110-西门子PLC S7-1200程序实例,版本博图V15及以上,内容包括 1,西门子1200与安川机器人TCP/IP通讯,包含机器人GSD文件; 2,西门子1200控制6轴伺服电机,四台台脉冲控制台达B2伺服,两台PN通讯控制西门子V90伺服电机; 3,两台西门子1200开放式通讯交互数据联动; 4,与4台位移传感器modbus485轮询读取参数;
最近在工厂自动化项目里折腾了一把西门子S7-1200,实现了几个硬核功能,这里直接上干货。
**1. 安川机器人TCP/IP通讯**
安川机器人和S7-1200的通讯核心在于GSD文件导入。把安川提供的GSD文件扔进博图的硬件目录,设备组态里直接拖个机器人模块到PROFINET网络。
关键代码段:
// PLC侧发送数据块 TSEND_C(REQ:=#Send_Trigger, CONT:=TRUE, LEN:=10, DATA:=P#DB10.DBX0.0 BYTE 10);这里用TSEND_C功能块发送10字节数据到机器人,DB10是存放发送数据的区域。机器人侧需要配置相同的IP和端口号,双方数据格式对齐(比如前4字节是位置指令,后6字节是状态位)。
避坑指南:GSD文件版本要和博图兼容,遇到过V15.1不认新版GSD,最后用安川的旧版文件解决。
**2. 六轴伺服混合控制**
四台台达B2用脉冲控制,两台V90走PROFINET。脉冲轴配置在博图的“轴工艺对象”里,关键参数是输出类型选PTO(脉冲+方向)。
// 脉冲轴启动代码 MC_Power(Axis:=Axis1, Enable:=TRUE); // 使能轴 MC_MoveVelocity(Axis:=Axis1, Velocity:=500); // 速度模式V90直接组态成PROFINET设备,用MC_Home回零后走绝对定位。
突发状况:脉冲轴偶尔丢脉冲?检查PLC输出点电流是否足够,或者加个中间继电器缓冲信号。
**3. 两台PLC数据联动**
开放式通讯(OUC)比S7通讯更灵活。两边PLC各自建个TCON_IP连接:
// PLC1发送数据 TSEND(CONNECT:=DB20.ouConnection, DATA:=P#DB30.DBX0.0 BYTE 20); // PLC2接收数据 TRCV(CONNECT:=DB25.ouConnection, DATA:=P#DB35.DBX0.0 BYTE 20);两边IP地址互指,数据块长度必须一致。实测传输周期最快10ms,适合非实时数据(比如状态标志、产量统计)。
**4. Modbus485轮询四传感器**
用CM1241 RS485模块,轮询核心是分时处理。建个数组存站号,指针循环+1触发读取:
// 轮询逻辑 IF "Modbus_Complete" THEN "Current_Slave" := ("Current_Slave" + 1) MOD 4; END_IF; // 读指令 MB_MASTER(REQ:=TRUE, MB_ADDR:=Slave_List["Current_Slave"], DATA_ADDR:=40001, DATA_LEN:=2);重点:每个从站超时设500ms,防止某个传感器卡死整个链路。数据解析用MOVE指令把MBDATAIN搬到实际变量里。
最后碎碎念
项目里最头疼的是不同协议混用时CPU负载,1200的带机量到极限时得优化程序结构——比如用状态机拆分任务,或者把非实时操作丢到循环外触发执行。代码尽量模块化,下次改参数不用满程序找点位...(别问我怎么知道的)