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