图片: 
					 
				找不到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重新编辑 ]