最近在网上看到一段项目程序,而且作者好象是北京西门子的,很重视,准备仔细研究下,看看人家的编程思路,程序是实现S7-300和S7-200的自由口无线通讯,我对其中一段关于S7-200接收数据程序有点不理解,请大家指点下,S7-200程序如下;
LD SM0.1
MOVB 1, VB1
//设置站地址
LD SM0.7
EU
O SM0.1
CALL SBR_0
//首次运行或模式开关从TERM打到ON时定义通信口为自由口
LD SM0.7
ED
CALL SBR_1
//模式开关从ON拨到TERM时定义通信口为PPI从站
子程序SBR_0
LD SM0.0
MOVB 16#09, SMB30
ENI
ATCH INT_11, 8
//定义通信口0为自由口模式,9.6K波特率,无校验,8位数据位,连接接收字符中断为中断程序INT_11
子程序SBR_1
LD SM0.0
MOVB 16#C0, SMB30
DTCH 8
DTCH 9
//恢复普通PPI通信设置
中断程序INT_11
LD SM0.0
AB= SMB2, VB1
MOVW +5, VW200
MOVD &VB640, VD688
ATCH INT_12, 8
//若站地址正确,连接接收字符中断到中断程序INT_12,并使VW200=5来计数,在INT_12中连续接收五个字节;若站地址错误,则继续由INT_11接收字节数据,要在S7-300中程序中将其余六个字节的高位进行设计,避免出现为内容1或2地址信息的字节,即使传输过程中因外界干扰,其余六个字节出现为1或2的假地址情况,程序也会在接下来1~2个接收过程中,因INT_13中断程序中的校验指令作用,得到错误校验值,而恢复到正常接收状态。
中断程序INT_12
LD SM0.0
MOVB SMB2, *VD688
INCD VD688
DECW VW200
//接收5个字节
LD SM1.0
MOVB 1, VB639
MOVW VW639, VW700
XORW VW641, VW700
ATCH INT_13, 8
//通过异或指令进行数据校验,连接接收字符中断到中断程序INT_13,即由第七个字节触发中断程序INT_13
中断程序INT_13
LD SM0.0
DTCH 8
//中断分离
LDW= VW700, VW643
MOVD VD640, VD400 //校验正确,将控制信息数据存到VB400~VB402
MOVB 6, VB600
MOVB VB1, VB601
BMB VB100, VB602, 5
ATCH INT_14, 9
XMT VB600, 0
//校验正确,使能发送,发送6字节数据VB601~VB606,连接发送指令结束到中断程序INT_14
LDW<> VW700, VW643
ATCH INT_11, 8
//校验不正确,连接接收字符中断到中断程序INT_11,进行新一次接收
中断程序INT_14
LD SM0.0
DTCH 9
ATCH INT_11, 8
//发送结束则连接接收字符中断到中断程序INT_11,进行新一次接收
S7-200通过字符中断接收数据,我的理解是:
1.当S7-200接收第一个字符时,执行的是中断程序11.如果这个字符是站地址,则打开中断程序12,但此时不会执行中断程序12。因为此时缓冲区SMB2的值已被取走,存到VB1.
2.当S7-200接收接下来5个字符时,会执行中断程序12,而不执行中断程序11.因为一个
中断事件号和多个中断处理程序建立关联,PLC只能确认最后一个被指
定的关联,前面都是无效的。执行完中断程序12后,打开了中断程序13
3.当接受第7个字符时,执行中断程序13,而不执行中断程序11,12了。在中断程序13开始关掉中断事件8.此时一条完整接收信息完成。PLC然后根据接收请求,整理发送数据,最后重新打开中断事件8,以及打开中断程序11,准备进入下一次循环接收。
以上三点是我的个人理解,请大家指点,谢谢!!
如果想要完整的文章,请留下邮箱或QQ