图片:
找不到st编程的教程,硬是自己摸索,一点一点抠出来的。
后来发现
iQ-R 结构化文本(ST)编程指南就是教程,关于语法、其他手册上找不到的较难理解的结构变量都有示例。
完全st编程的中断写法好几天无从着手,把FXCPU结构化顺序指令篇看了一遍又一遍,才摸索出来,具体见工程附件。
工程是未完成的不完整工程,只是希望自己认为较难理解手册没提及的st编程方法对需要的同志有所帮助。
另外吐槽一下st编辑器,变量不能在程序里定义,只能在标签窗口定义,结构体成员引用不能单独设置字体颜色,这些都影响阅读。
总之,gx works2 的st编辑器比较简陋,但可阅读性已经比梯形图好多了。
复制代码- (*****************************************************************************************************
- * 程序“恒定扫描”设置
- * M8039 = TRUE, 则程序为恒定周期扫描
- * D8039 = 扫描周期, 单位为ms,最小恒定扫描周期为1ms
- *****************************************************************************************************)
- M8039 := TRUE;
- IF M8039 THEN
- D8039 := 5;
- END_IF;
- (*****************************************************************************************************
- * 初始化
- *****************************************************************************************************)
- EI ( TRUE ); (* 允许中断 *)
- IF M8002 THEN
-
- FOR j := 0 TO 30 BY 1 DO
- Tcnt[j] := -1;
- END_FOR;
- RST( TRUE, HmiKey_ManualOP );
- RST( TRUE, bMode_Manual );
- RST( TRUE, HmiKey_AutoPack );
- RST( TRUE, bMode_Auto );
- DownFill_FB_Call( );
- VerticalSeal_FB_Call( );
- BagFold_FB_Call( );
-
- END_IF;
- (* 每包包装时间所需计数值 = 60000ms / 10ms / 预置包装速度,每分钟为60000ms,定时器为10ms *)
- TVal_Packing := 6000 / Param_PresetSpeed;
- (*****************************************************************************************************
- * 清零
- *****************************************************************************************************)
- IF( HmiKey_BagCnt_CLR ) THEN
- MakeBagCnt := 0;
- END_IF;
- IF( HmiKey_PackingCnt_CLR ) THEN
- PackingCnt := 0;
- END_IF;
- (*****************************************************************************************************
- * 警报发生
- * 报警锁,任何一种警报发生,自动包装都将停止运行
- ****************************************************************************************************)
- IF( bAlarm_Lock_AutoPack = TRUE ) THEN
-
- ZRST( TRUE, Y001, Y007 );
- ZRST( TRUE, Y010, Y017 );
- ZRST( TRUE, Y020, Y027 );
-
- FOR j := 0 TO 30 BY 1 DO
- Tcnt[j] := -1;
- END_FOR;
-
- END_IF;
- (*****************************************************************************************************
- * HMI按钮开关
- *****************************************************************************************************)
- Key_Hmi_FB_Call();
-
- (*****************************************************************************************************
- * 包装流程
- *
- *****************************************************************************************************)
- IF( bMode_Auto ) AND ( bAlarm_Lock_AutoPack = FALSE ) AND ( HmiKey_FillPack[1] OR HmiKey_EmptyBagTest[1] OR HmiKey_FillBagOne[1] ) THEN
-
- IF( HmiKey_FillPack[1] ) THEN
- DownFill_FB_Call( hmi_key := KeyDownID, pT_DownFillDly := Tcnt[ ID_DOWN_FILL_DLY ], iX := iX_DownFill ); (* 下料 *)
- END_IF;
-
- IF( HmiKey_EmptyBagTest[1] OR HmiKey_FillBagOne[1] ) THEN
-
- IF( PackingFlow = 0 ) THEN
-
- SET( TRUE, bEnd_DownFill );
- PackingFlow := FLOW_PULL_FILM;
-
- END_IF;
-
- END_IF;
- VerticalSeal_FB_Call( bEnable := bServo_End ); (* 纵封 *)
-
- BagFold_FB_Call( bEnable:= bServo_End ); (* 折角 *)
-
- ServoControl_FB_Call( pServoEnd := bServo_End ); (* 伺服拉膜;指针参数,指向全局变量 *)
-
- (* 真空箱闭合 *)
- IF( bServo_End = TRUE ) THEN
-
- IF( Tcnt[ ID_VACUUM_BOX_CLOSE_DLY ] = -1 ) THEN
- Tcnt[ ID_VACUUM_BOX_CLOSE_DLY ] := Param_VcmBoxCloseDly ;
- END_IF;
-
- IF( Tcnt[ ID_VACUUM_BOX_CLOSE_DLY ] = 0 ) AND ( bAlarm_GlassDoor = FALSE ) THEN
-
- Tcnt[ ID_VACUUM_BOX_CLOSE_DLY ] := -255;
- Tcnt[ ID_BAG_CUT_DLY ] := Param_CutDly;
- SET( TRUE, Y_VacuumBox_Y3 );
-
- END_IF;
-
- END_IF;
- (* 剪切包装膜 *)
- IF( Y_VacuumBox_Y3 ) THEN
-
- IF( Tcnt[ ID_BAG_CUT_DLY ] = 0 ) AND ( bAlarm_GlassDoor = FALSE ) THEN
-
- Tcnt[ ID_BAG_CUT_DLY ] := -255;
- Tcnt[ ID_BAG_CUT ] := Param_Cut;
- SET( TRUE, Y_Cutter_Print_cylinder );
-
- END_IF;
-
- IF( Tcnt[ ID_BAG_CUT ] = 0 ) THEN
-
- Tcnt[ ID_BAG_CUT ] := -255;
- Tcnt[ ID_VACUUMIZE ] := Param_Vacuum;
- RST( TRUE, Y_Cutter_Print_cylinder );
- SET( TRUE, Y_VacuumPump_Y5 );
- SET( TRUE, Y_Vacuum_cylinder );
-
- END_IF;
-
- END_IF;
- (* 包装袋抽真空、封口,恒温,冷却 *)
- IF( Tcnt[ ID_VACUUMIZE ] = 0 ) THEN (* 抽真空 *)
-
- Tcnt[ ID_VACUUMIZE ] := -255;
- Tcnt[ ID_HEAT_SEAL ] := Param_HeatSeal;
- SET( TRUE, Y_HoriSeal_cylinder );
-
- END_IF;
-
- IF( Tcnt[ ID_HEAT_SEAL ] = 0 ) THEN (* 热封 *)
- Tcnt[ ID_HEAT_SEAL ] := -255;
- Tcnt[ ID_SEAL_KEEP ] := Param_SealKeep;
- RST( TRUE, Y_HoriSeal_cylinder );
- END_IF;
-
- IF( Tcnt[ ID_SEAL_KEEP ] = 0 ) THEN (* 恒温保持 *)
- Tcnt[ ID_SEAL_KEEP ] := -255;
- Tcnt[ID_SEAL_COOL ] := Param_SealCool;
- SET( TRUE, Y_AirIn_cylinder );
- END_IF;
-
- IF( Tcnt[ID_SEAL_COOL ] = 0 ) THEN (* 冷却等待 *)
- RST( TRUE, Y_VacuumBox_Y3 );
- RST( TRUE, Y_Vacuum_cylinder );
- RST( TRUE, Y_AirIn_cylinder );
- PackingFlow := FLOW_END;
- END_IF;
-
- (* 每分钟为60000ms,程序扫描周期为5ms,每分钟的计数值为60000 / 5 = 12000 *)
- IF( Cnt < 11999 ) THEN
- Cnt := Cnt + 1;
- END_IF;
-
- IF( PackingFlow = FLOW_END ) AND ( HmiKey_FillPack[1] ) THEN
-
- MakeBagCnt := MakeBagCnt + 1; (* 制袋计数 *)
- PackingCnt := PackingCnt + 1; (* 包装计数 *)
- PackingSpeed := 12000 / Cnt; (* 包装速度计算 *)
- Cnt := 0;
-
- END_IF;
-
- IF( PackingFlow = FLOW_END ) AND ( HmiKey_EmptyBagTest[1] OR HmiKey_FillBagOne[1] ) THEN
-
- MakeBagCnt := MakeBagCnt + 1; (* 制袋计数 *)
- PackingSpeed := 12000 / Cnt;
- Cnt := 0;
-
- END_IF;
- (* 包装流程结束,复位定时器、伺服结束标志、制袋一个按钮 *)
- IF( PackingFlow = FLOW_END ) THEN
-
- PackingFlow := 0;
- RST( TRUE, bServo_End );
- RST( TRUE, HmiKey_FillBagOne[0] );
- FOR j := 0 TO 30 BY 1 DO
- Tcnt[j] := -1;
- END_FOR;
-
- END_IF;
-
- END_IF;
- (*****************************************************************************************************
- * 包装膜卷棍电机控制
- *
- * 说明:接近开关的感应体是一个自由落体的金属横杆,由包装膜拉动其上下运动表示包装膜的松紧。
- * 感应体运动到顶部,顶部金属感应开关动作,说明包装膜被拉紧,包装膜卷棍电机运转送膜;
- * 感应体运动到中部,中部金属感应开关动作,说明送膜已经足够,停止送膜;
- * 感应体运动到底部,底部金属感应开关动作,说明接近开关的感应体已经没有包装膜拉动其运动,
- * 或者送膜太多,感应体自由落体到底部
- ****************************************************************************************************)
- IF bMode_Auto THEN
-
- IF( ix_PackFilm_SensorTop ) THEN
-
- SET( TRUE, Y_FilmMotor_Y13 ); (* 送膜 *)
-
- ELSIF( ix_PackFilm_SensorMid OR ix_PackFilm_SensorBot ) THEN
-
- RST( TRUE, Y_FilmMotor_Y13 ); (* 送膜停止 *)
-
- END_IF;
-
- END_IF;
- (* 手动控制,放膜 *)
- IF HmiKey_ManualOP THEN
-
- IF( HMI手动_放膜 ) THEN
-
- SET( TRUE, Y_FilmMotor_Y13 ); (* 手动送膜 *)
-
- ELSE
-
- RST( TRUE, Y_FilmMotor_Y13 );
-
- END_IF;
-
- END_IF;
|
[ 此帖被nos001在2019-07-04 17:38重新编辑 ]