通過上次的學習,我們應該已經知道可以通過修改SM存儲區(包括控制字節),然后執行PLS指令來改變PTO或PWM波形。除了前面學習的使用步驟和一些使用要點,我們還要知道的就是PTO狀態字節的空閑位(SM66.7或SM76.7),它標志著脈沖輸出完成。另外,在脈沖輸出完成時,我們還可以利用脈沖發送完成中斷,使程序跳轉到中斷服務程序進行執行。那么就補充這幾點內容。下面我們做利用一個脈沖輸出指令做電機正反轉控制的例子。
主程序:
高速計數器子程序:
高速脈沖輸出子程序:
中斷程序INT_0:
我們首先先做一個高速計數子程序和脈沖輸出子程序,在高速計數器子程序中,首先是定義控制字節,送16#F8到SMB37,定義為加計數更新當前值,傳送0到SMD38寫入初始值,定義的是高速計數器HSC0和HSC模式12,然后激活高速計數器,還做了高速計數器中斷,PTO0完成中斷的事件為中斷事件號19,我們建立中斷程序0和中斷事件19的中斷連接,并全局允許中斷。
而在高速脈沖輸出子程序里面,我們定義一下接口,定義周期io_time為LW0,為IN類型的,定義脈沖數io_NO為LD2,也是為IN類型的,然后寫子程序。首先傳送16#85到SMB67中定義控制字節,這里選擇的是PTO模式、單段、1us/周期、裝入周期和脈沖數的情況(控制字節的定義可以參考PTO/PWM控制字節表),并傳送LW0到SMW68中寫入周期值,傳送LD2到SMD72中寫入脈沖數,最后執行PLS指令。那么這樣是做了一個帶功能參數的子程序,之后在主程序中可以對這個帶功能參數的子程序進行調用。
然后我們編寫主程序,在主程序的網絡一中,首先用SM0.1首次掃描驅動高速計數器子程序進行高速計數初始化,同時對Q0.0的過程映像區清零,同時也對高速脈沖輸出進行初始化。在網絡中,我們用I0.2的上升沿來驅動立即置位指令,立即置位Q0.2,同時調用高速脈沖輸出子程序,周期設為100us,脈沖為10000個,同時還要傳送16#F8到SMB37并執行HSC指令進行加計數并更新當前值。那么就就是說當我們接通I0.2時,會在I0.2的上升沿立即置位Q0.2,電機正轉,100us發10000個脈沖,同時高速計數器進行加計數。因為建立了脈沖完成中斷,那么當脈沖發生完成時,會進入到中斷程序進行執行。
那么我們就可以在中斷程序中編寫反轉的控制,因為原來是正轉,那么Q0.2是接通的,那么我們就用Q0.2的常開觸點來驅動立即復位指令,立即復位Q0.2,同時調用高速脈沖輸出子程序,周期設為200us,脈沖為10000個,同時還要傳送16#B0到SMB67并執行HSC指令進行減計數并不更新當前值。那么就是說進入中斷時會立即復位Q0.2,電機反轉,200us發10000個脈沖,同時高速計數器進行減計數。
那么對于這樣一個例子,應用到了帶參數的子程序調用、中斷和高速計數器的內容,會不會比較難以理解呢,如果覺得有些模糊的話,可以回看一下前面中斷和高速計數器的內容,這樣可以加深印象呢。