MAIN: S7200自由口通讯程序 LD SM0.1 CALL SBR_0:SBR0 //初始化子程序 LD SM0.7 = SM30.0 SBR_0: 初始化子程序 LD SM0.0 MOVW +2, VW8 //PLC自由口地址,此处每台机器需设不同的地址 LD SM0.0 MOVB 9, SMB30 //通讯参数,波特率9600,自由口通讯 MOVD &VB100, VD40 MOVW +10, VW54 MOVB 12, VB150 MOVB VB9, VB151 MOVD &VB151, VD60 MOVB 6, SMB34 ATCH INT_0:INT0, 10 ATCH INT_1:INT1, 8 ENI INT_0: 中断程序入口 LD SM0.0 DTCH 10 MOVD VD40, VD46 MOVW +10, VW44 MOVW +10, VW54 ATCH INT_2:INT2, 8 //接受中断起用服务程序INT2 INT_1: 延时转向INT0 LD SM0.0 MOVB 5, SMB34 ATCH INT_0:INT0, 10 INT_2: 接受地址,并判断 LDB= SMB2, VB9 //地址和本机相符 MOVW VW8, AC0 MOVB 255, SMB34 ATCH INT_3:INT3, 8 //起用中断服务INT3,接受包 ATCH INT_5:INT5, 10 //起用延时监控服务INT5 CRETI LDB= SMB2, VB9 //地址和本机不符 NOT ATCH INT_0:INT0, 10 //返回中断入口 ATCH INT_1:INT1, 8 INT_3: 主接受服务程序,同时做异或校验 LD SM0.0 XORW SMW1, AC0 MOVB SMB2, *VD46 INCD VD46 DECW VW44 LD SM1.0 //完成预定的接受字节数 ATCH INT_4:INT4, 8 //起用通讯数据处理主程序 INT_4: 通讯数据处理主服务程序 LD SM0.0 BMB VB100, VB152, 6 //接受报头拷贝到发送报头 LD SM0.0 DTCH 8 //暂停响应接受中断 INCD VD46 MOVB SMB2, *VD46 XORW SMW1, AC0 ANDW 16#FF, AC0 //检查异或校验 LDN SM1.0 //异或校验错误 MOVB VB100, AC0 MOVB 16#80, AC1 ORW AC0, AC1 MOVB AC1, VB152 MOVB 16#1, VB158 MOVW +10, VW54 JMP 3 //校验错误,向PC返回错误码 LD SM1.0 //异或正确 MOVW +4, VW34 ATCH INT_8:INT8, 8 //起用服务程序INT8响应接受中断,接受包尾 LD SM0.0 //数据处理 LPS AB= VB101, 0 //V寄存器 MOVD &VB0, VD50 LRD AB= VB101, 1 //Q寄存器 MOVD &QB0, VD50 LRD AB= VB101, 2 //I寄存器 MOVD &IB0, VD50 LRD MOVW +0, VW56 LRD MOVW VW102, VW58 LPP +D VD56, VD50 LDB= VB100, 0 //PLC向PC发送数据 MOVB VB104, AC0 MOVB VB105, AC1 MUL AC1, AC0 BMB *VD50, VB158, AC0 +I +8, AC0 MOVW AC0, VW54 -I +2, VW54 MOVB AC0, VB150 LDB= VB100, 1 //PLC从PC接受数据 BMB VB106, *VD50, VB105 MOVW +10, VW54 MOVB 12, VB150 LBL 3 LD SM0.0 MOVB 50, SMB34 ATCH INT_6:INT6, 10 //延时起用INT6,置位发送电平 MOVD VD60, VD66 MOVB *VD66, AC0 MOVB 0, VB250 //发送数据异或校验次数监视 LBL 0 //发送数据异或校验 LD SM0.0 INCD VD66 MOVB *VD66, AC1 XORW AC1, AC0 INCB VB250 LDB= VB250, 150 //若校验次数超过150次,退出 MOVB 6, SMB34 ATCH INT_7:INT7, 10 CRETI LD SM0.0 DECW VW54 LDN SM1.0 //若发送校验未完成预定的次数,跳转到循环0 JMP 0 LD SM0.0 INCD VD66 MOVB AC0, *VD66 LD SM0.0 MOVB VB150, AC0 +I +4, AC0 MOVB AC0, VB150 INT_5: 接受时间监控服务程序 LD SM0.0 MOVD VD40, VD46 MOVW +10, VW44 MOVB 5, SMB34 ATCH INT_1:INT1, 8 ATCH INT_0:INT0, 10 INT_6:发送数据 LD SM0.0 MOVB 250, SMB34 ATCH INT_7:INT7, 10 //起用发送时间监控 ATCH INT_7:INT7, 9 //发送中断(发送完成时触发)起用服务程序INT7 A SM4.5 XMT VB150, 0 INT_7: 结束中断服务程序 LD SM0.0 DTCH 9 //关闭发送中断 MOVB 6, SMB34 ATCH INT_0:INT0, 10 //返回中断入口 ATCH INT_1:INT1, 8 INT_8: 接受包尾,正常情况下本中断服务程序连续调用四次, 接受四个0XFF,程序本身不做任何处理 CRETI |