圖片: 
					 
				找不到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重新編輯 ]