?? tip028.ob1
字號:
MOVB VB217, VB109 // 為RUN設置STW
MOVB 16#7F, VB110 //
MOVW VW200, VW111 // 設置頻率
NETWORK 22 //
LD M0.1 // 檢查狀態,看是否允許改變電機旋轉方向
JMP 0 // 只有在STOP后才允許,否則不允許
//保存以前的電機旋轉方向
NETWORK 23 //
LD I1.0 // 根據輸入I1.0的狀態,設置電機旋轉方向。
= V109.3 // set V109.3 to indicate counterclockwise
// direction.
NOT // If input I1.0 is not on,
= V109.4 // set V109.4 to indicate clockwise
// direction.
NETWORK 24 // Label LBL0
// This network is the destination for the Jump to Label 0 instruction.
// The program jumps to this label if M0.1 in Network 22 is on (has
// a signal state of 1) to calculate the BCC and initiate the
// Transmit time-out timer.
LBL 0 // Call the routines to calculate
// the BCC and initiate the Transmit
// time-out timer.
NETWORK 25 // Calculate the BCC and Initiate the Transmit Time-Out Timer
// Load special memory bit SM0.0 to process this network every scan
// cycle.
LD "Always_On" // Load SM0.0.
CALL 6 // 計算BBC
CALL 7 // 初始化XMT及XMT定時器
NETWORK 26 // 子程序2結束
RET // End SBR2.
NETWORK 27 // 子程序3
// 增加電機頻率的處理子程序,頻率增量存于VW202.若I0.5為1,則倍增;
//若上溢出,則設為32767;
SBR 3 // 增加頻率
NETWORK 28 //
LD "Always_On" // Load SM0.0.
+I VW202, VW200 // 增加因子
NETWORK 29
LD I0.5 // 倍增嗎?
+I VW202, VW200 //
NETWORK 30 //
LDW>= VW200, +16384 // 判是否上溢出
MOVW +16384, VW200 // 若上溢出,則設為最大值(16384)
NETWORK 31 //
LD M0.1 // 若M0.1=1,則
CALL 2 // 發送信息,增加頻率
NETWORK 32 // 子程序3結束
RET // End SBR3.
NETWORK 33 // 子程序4
//降低電機頻率子程序,頻率減量存于VW202,若I0.5為(ON),則倍減;若下溢出,則為0
SBR 4 // 降低頻率.
NETWORK 34 //
LD "Always_On" //
-I VW202, VW200 // 降低因子
NETWORK 35 //
LD I0.5 // 倍減?
-I VW202, VW200 //
NETWORK 36 //
LD "Neg_Result" // 判是否下溢出
MOVW +0, VW200 // 若下溢出,則設為0。
NETWORK 37 //
LD M0.1 // 若M0.1=1,則
CALL 2 // 發送信息,降低頻率
NETWORK 38 // 子程序4結束
RET // End SBR4.
NETWORK 39 // 子程序5
//停止電機的子程序
SBR 5 // 停止電機
NETWORK 40 //
LD "Always_On" // Load SM0.0.
MOVB 16#C, VB109 // 為STOP設置STW
MOVB 16#7E, VB110 //
CALL 6 // 計算BCC.
CALL 7 // 初始化XMT及XMT定時器
NETWORK 41 // 子程序5結束
RET // End SBR5.
NETWORK 42 // 子程序6
//用XOR(異或)計算信息的檢查和,并存入緩沖區。
SBR 6 // 計算USS5的BCC
NETWORK 43 //
//十六進制信息為:02,0C,ADR,BYTE1,...,BYTE10,BCC
//本程序入口時,AC1指向信息LEN字節(OC)位置。
//本程序出口時,AC1指向BCC字節位置。
//將BCC存入信息緩沖區
//AC2含有BCC
LD "Always_On" //
MOVD &VB101, AC1 // 設置緩沖區地址指針
MOVD 16#E, AC2 // 2*OR12,信息的頭兩字節
FOR AC3, +1, +11 // 計算剩余11個字符的BCC
XORW *AC1, AC2 //
INCD AC1 // 地址指針加1
NETWORK 44 //
NEXT //
NETWORK 45 //
LD "Always_On" //
INCD AC1 // 指針加1指向BBC位置。
MOVB AC2, *AC1 // 把BCC存到信息緩沖區中。
NETWORK 46 // 子程序6結束
RET .
NETWORK 47 // 子程序7
//初始化XMT及XMT定時器
SBR 7 // 初始化XMT,捕捉XMT中斷。
NETWORK 48 //
LD "Always_On" //
XMT VB99, 0 // 發送
ATCH 0, 9 // 捕捉XMT中斷(事件9),并調用中斷程序0
MOVB 255, "Time_0_Intrvl" // 設置XMT定時器,255ms,實際只用約7ms(19.2kb)
ATCH 1, 10 // 捕捉XMT定時器中斷(事件10),并調用中斷程序1
NETWORK 49 // 子程序7結束
RET
//
/
//
NETWORK 50 //***中斷程序0***
// XMT(發送)中斷處理,關掉XMT定時器,起動接收從設備響應
INT 0 // 中斷程序0,XMT中斷處理
NETWORK 51
LD "Always_On" //
DTCH 10 // 退出XMT定時器
DTCH 9 // 中止XMT事件
MOVW +3, VW204 // 刷新XMT重試次數(3次)
MOVW +14, VW208 // 響應信息中接收字符數(14個)
MOVW +0, VW215 // 清除BCC累加器
MOVD &VB114, VD211 // 設置接收緩沖區指針
ATCH 2, 8 // 捕捉RCV(接收)中斷,并調用中斷程序2
ATCH 3, 10 // 捕捉接收定時器中斷(事件10),并調用中斷程序3
NETWORK 52 // 中斷程序0結束
RETI // End INT0.
NETWORK 53 //中斷程序1
// 若XMT(發送)定時器時間到,這段程序取得控制權,XMT操作會重試,直到可重試次數減到0
INT 1 // 定時器中斷0處理——發送
NETWORK 54 //
LD "Always_On" //
DTCH 9 // 停止XMT發送
DTCH 10 // 退出定時器
DECW VW204 // 重試次數減1,若為0,則
NETWORK 55 //
LD "Result_0" // SM1.0=1
MOVB 3, VB210 // .
MOVB 3, QB0 // 用QB0指示發送器超時
MOVW +3, VW204 // 刷新發送重試計數(3次)
S M0.0, 1 // 使RUN,RAMP有效(M0.0=1)
CRETI //
NOT // 重試
XMT VB99, 0 // 發送
ATCH 0, 9 // 捕捉XMT中斷,并調用中斷程序0
MOVB 255, "Time_0_Intrvl" // S設置XMT定時器為255ms,實際只用約7ms(19.2kb)
ATCH 1, 10 // 捕捉定時器中斷,并調用中斷程序1
NETWORK 56 // 中斷程序1結束
RETI
NETWORK 57 // 中斷程序2
// 這段處理程序計算接收字符數,并校驗錯誤
//若檢驗到錯誤,則再試接收,直至可重試次數減到0
INT 2 //接收字符處理
NETWORK 58 //
LD "Always_On" //
MOVB "Receive_Char", AC0 //得到接收字符
XORW AC0, VW215 // 累積BCC,即用XOR(異或)計算BCC
MOVB AC0, *VD211 // 把接收到的字符送入緩沖區
INCD VD211 // 緩沖區指針加1
DECW VW208 // 有待接收的字符減1
NETWORK 59 //
LDN "Result_0" // 檢驗是否結束
CRETI //
NOT //
DTCH 10 // 退出接收定時器
DTCH 8 // 關掉接收
AB= 0, VB216 // 檢驗已算好的BCC是否為0
NOT //
MOVB 2, VB210 // 壞的BCC操作碼
MOVB 2, QB0 //
JMP 0 // BCC正確,檢驗信息的其他部分
NETWORK 60 //
LDB= VB114, 16#2 // STX第一個字符嗎?
AB= VB115, 16#C // 長度=12嗎
AB= VB116, VB102 // 將信息發往同一從設備嗎
// 任何其他校驗都會因相應響應而經過這一段
MOVB 0, VB210 // 操作正確
MOVB 0, QB0 //
JMP 0 //
NETWORK 61 //
LD "Always_On" //
MOVB 1, VB210 // 信息中有不對的地方
MOVB 1, QB0 //
NETWORK 62 //
LBL 0
NETWORK 63 //
MOVW +3, VW206 // 刷新接收可重試次數(3次)
NETWORK 64 // 中斷程序2結束
RETI
NETWORK 65 // 中斷程序3
//若響應的接收時間已到,這段程序取得控制權,再試發送信息,再試接收。
//在超時時操作重試,直至可重試次數減為0
INT 3 // 定時器中斷0處理——接收
NETWORK 66
LD "Always_On" //
DTCH 8 // 關掉接收中斷
DTCH 10 // 退出接收定時器
DECW VW206 // 檢查可重試次數,重試次數減1,若為0,
// 則
NETWORK 67 //
LD "Result_0" // SM1.0=1
MOVB 4, VB210 //
MOVB 4, QB0 // 用QB0指示接收超時,
MOVW +3, VW206 // 刷新接收重試次數
S M0.0, 1 // 使RUN,PARM有效
CRETI // 條件返回
NOT //
MOVD &VB114, VD211 // 設置接收緩沖區的指針
MOVW +0, VW215 // 清除BCC累加器,再重試發送
XMT VB99, 0 // 發送
ATCH 0, 9 // 捕捉XMT(發送)中斷,并調用中斷程序0
MOVB 255, "Time_0_Intrvl" // 設定XMT(發送)定時器為255ms
ATCH 1, 10 // 捕捉定時器中斷(事件10),并調用中斷程序1
NETWORK 68 // 中斷程序3結束
RETI
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -