圖片: 
 
					找不到st編程的教程,硬是自己摸索,一點(diǎn)一點(diǎn)摳出來的。
后來發(fā)現(xiàn)
iQ-R 結(jié)構(gòu)化文本(ST)編程指南就是教程,關(guān)于語法、其他手冊(cè)上找不到的較難理解的結(jié)構(gòu)變量都有示例。
完全st編程的中斷寫法好幾天無從著手,把FXCPU結(jié)構(gòu)化順序指令篇看了一遍又一遍,才摸索出來,具體見工程附件。
工程是未完成的不完整工程,只是希望自己認(rèn)為較難理解手冊(cè)沒提及的st編程方法對(duì)需要的同志有所幫助。
另外吐槽一下st編輯器,變量不能在程序里定義,只能在標(biāo)簽窗口定義,結(jié)構(gòu)體成員引用不能單獨(dú)設(shè)置字體顏色,這些都影響閱讀。
總之,gx works2 的st編輯器比較簡陋,但可閱讀性已經(jīng)比梯形圖好多了。
| 復(fù)制代碼 (****************************************************************************************************** 程序“恒定掃描”設(shè)置* M8039 = TRUE, 則程序?yàn)楹愣ㄖ芷趻呙?/li>* 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;(* 每包包裝時(shí)間所需計(jì)數(shù)值 = 60000ms / 10ms / 預(yù)置包裝速度,每分鐘為60000ms,定時(shí)器為10ms *)TVal_Packing :=  6000 / Param_PresetSpeed;(****************************************************************************************************** 清零*****************************************************************************************************)IF( HmiKey_BagCnt_CLR ) THEN     MakeBagCnt := 0;END_IF;IF( HmiKey_PackingCnt_CLR ) THEN     PackingCnt := 0;END_IF;    (***************************************************************************************************** * 警報(bào)發(fā)生 * 報(bào)警鎖,任何一種警報(bào)發(fā)生,自動(dòng)包裝都將停止運(yùn)行 ****************************************************************************************************)  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按鈕開關(guān)*****************************************************************************************************)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  ); (* 伺服拉膜;指針參數(shù),指向全局變量 *)        (* 真空箱閉合 *)    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,每分鐘的計(jì)數(shù)值為60000 / 5 = 12000 *)    IF( Cnt < 11999 ) THEN         Cnt := Cnt + 1;    END_IF;            IF( PackingFlow = FLOW_END  ) AND ( HmiKey_FillPack[1]  ) THEN             MakeBagCnt := MakeBagCnt + 1;             (* 制袋計(jì)數(shù) *)        PackingCnt := PackingCnt + 1;             (* 包裝計(jì)數(shù) *)        PackingSpeed := 12000 / Cnt;              (* 包裝速度計(jì)算 *)        Cnt := 0;            END_IF;        IF( PackingFlow = FLOW_END ) AND ( HmiKey_EmptyBagTest[1]  OR  HmiKey_FillBagOne[1] )  THEN                 MakeBagCnt := MakeBagCnt + 1;             (* 制袋計(jì)數(shù) *)        PackingSpeed := 12000 / Cnt;        Cnt := 0;                    END_IF;    (* 包裝流程結(jié)束,復(fù)位定時(shí)器、伺服結(jié)束標(biāo)志、制袋一個(gè)按鈕 *)    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;(***************************************************************************************************** * 包裝膜卷棍電機(jī)控制 * * 說明:接近開關(guān)的感應(yīng)體是一個(gè)自由落體的金屬橫桿,由包裝膜拉動(dòng)其上下運(yùn)動(dòng)表示包裝膜的松緊。 *       感應(yīng)體運(yùn)動(dòng)到頂部,頂部金屬感應(yīng)開關(guān)動(dòng)作,說明包裝膜被拉緊,包裝膜卷棍電機(jī)運(yùn)轉(zhuǎn)送膜; *       感應(yīng)體運(yùn)動(dòng)到中部,中部金屬感應(yīng)開關(guān)動(dòng)作,說明送膜已經(jīng)足夠,停止送膜; *       感應(yīng)體運(yùn)動(dòng)到底部,底部金屬感應(yīng)開關(guān)動(dòng)作,說明接近開關(guān)的感應(yīng)體已經(jīng)沒有包裝膜拉動(dòng)其運(yùn)動(dòng), *       或者送膜太多,感應(yīng)體自由落體到底部 ****************************************************************************************************) 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;(* 手動(dòng)控制,放膜 *)IF HmiKey_ManualOP THEN         IF( HMI手動(dòng)_放膜 ) THEN                 SET( TRUE, Y_FilmMotor_Y13 ); (* 手動(dòng)送膜 *)            ELSE                  RST( TRUE, Y_FilmMotor_Y13 );                END_IF;    END_IF;
 | 
[ 此帖被nos001在2019-07-04 17:38重新編輯 ]