📄 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 + -