西门子1200博途程序与威纶触摸屏画面实例 ,博图版本V15及以上,内容涉及上位机通讯,modbus485,伺服等。 具体有: 1,西门子1200控制4台步进电机; 2,西门子1200与4台MS300变频器modbus485轮询读写参数; 3,西门子1200与上位机TCP/IP通讯控制相机拍照,反馈数据; 4,设备为多工位联动控制。
在自动化产线中,多工位设备联调是个技术活,最近用S7-1200+威纶通触摸屏做了个四工位打标机,正好把踩过的坑和实现方案分享给大家。这个项目用到了Modbus轮询、以太网通信和运动控制,咱们边撸代码边聊实战细节。
1. 步进电机四轴协同控制
直接上硬核的轴配置代码:
// 轴使能 MC_Power(Enable:=TRUE, Axis:=Axis_1, Status=>#Status_1); MC_Power(Enable:=TRUE, Axis:=Axis_2, Status=>#Status_2); // 相对定位 MC_MoveRelative( Positions:=500.0, Velocity:=300.0, Axis:=Axis_1, Execute:=#StartMove);这里有个骚操作:四个轴必须用"MC_SyncMove"做同步启动,否则工位会出现累积误差。注意DB块里每个轴要单独分配背景数据块,我第一次调试时四个轴全动不起来,就是DB块地址冲突了。
2. Modbus485轮询四台变频器
Modbus主站轮询最麻烦的是时序控制,来看我的轮询逻辑:
// 轮询状态机 CASE #modbus_state OF 0: // 读取1号变频器频率 MB_MASTER(REQ:=TRUE, MB_ADDR:=1, MODE:=0, DATA_ADDR:=40001, DATA_LEN:=1); #modbus_state := 10; 10: IF #MB_DONE THEN #Frequency[0] := MW100; // 数据存放在MW100 #modbus_state := 1; END_IF; 1: // 写入2号变频器目标频率 MB_MASTER(REQ:=TRUE, MB_ADDR:=2, MODE:=1, DATA_ADDR:=40002, DATA_LEN:=1); #modbus_state := 11; 11: IF #MB_DONE THEN #modbus_state := 2; END_IF; // ...后续从站处理关键点:每个从站操作后必须插入50ms延时(用TON定时器实现),否则会出现报文粘连。实测MS300变频器的响应时间约35ms,别把轮询周期设得太紧。
西门子1200博途程序与威纶触摸屏画面实例 ,博图版本V15及以上,内容涉及上位机通讯,modbus485,伺服等。 具体有: 1,西门子1200控制4台步进电机; 2,西门子1200与4台MS300变频器modbus485轮询读写参数; 3,西门子1200与上位机TCP/IP通讯控制相机拍照,反馈数据; 4,设备为多工位联动控制。
3. 上位机拍照控制
TCP/IP通信这里有个坑:1200的TSEND_C最多只能建立4个连接,我们这里要同时连接相机和MES系统,得做好连接管理:
// 建立TCP连接 TCON(REQ:=#Connect_Request, ID:=1, CONNECT:=DB_Camera_Conn); // 发送拍照指令 TSEND(REQ:=#Camera_Trigger, ID:=1, DATA:=P#DB_Camera.SendBuffer, LEN:=10); // 接收图像数据 TRCV(EN_R:=TRUE, ID:=1, DATA:=P#DB_Camera.RecvBuffer, LEN:=1024);注意数据块要设置为非优化访问,否则上位机解析会错位。实测发现每次发送前需要用MOVE指令更新发送区数据,直接操作DB块指针有时会丢包。
4. 多工位联动
核心是采用状态矩阵法,每个工位独立状态机:
// 工位状态机 FOR #i := 0 TO 3 DO CASE #Station_State[#i] OF 0: // 待机 IF #Start_Signal THEN #Station_State[#i] := 1; END_IF; 1: // 物料到位 IF #Sensor[#i] THEN StartMotor(#i); #Station_State[#i] := 2; END_IF; 2: // 加工中 IF #Motor_Done[#i] THEN TriggerCamera(#i); #Station_State[#i] := 3; END_IF; END_CASE; END_FOR;重点:各工位状态变量必须用ARRAY存储,单独用不同变量会导致扫描周期不同步。联动时通过"ANYTOJSON"函数将状态打包上传给MES系统,这比传统的数据映射方式更灵活。
最后在威纶通画面上做了个骚操作:用宏指令实现设备运行状态的伪3D效果,把四个工位的动画层叠加显示。其实HMI开发比PLC编程更费时间,特别是要做报警履历的时候...(此处省略被甲方逼着改界面布局的800字吐槽)