quote:以下是引用LaoHuai在2010-12-24 11:42:19的发言:
我来发几个SMB2的例子(特别适合初学者):
SMB2为自由口接收字符的暂放区,从端口0或端口1接收的每个字符都放在这里。
SMB2只能存放一个字节字符,而对方发送的一帧可能是很多字符,所以在接收到下个字符之前,应该在中断里将接收到的字符移走。
每接收一个字符会产生一次中断,端口0产生中断事件8,端口1产生中断事件25。
例1:通讯方法(用串口调试软件)控制PLC的输出:
PLC写入如下程序:比如向PLC发1时,Q0.0亮,发2,那么Q0.1亮,发255,那么从Q0.0到Q0.7都亮,发送0,则都不亮。
LD SM0.1
MOVB 9, SMB30
ATCH INT_0, 8。
ENI
INT_0:
LD SM0.0
MOVB SMB2, QB0
用串口调试软件向PLC发1时,Q0.0亮,发2,那么Q0.1亮,发255,那么从Q0.0到Q0.7都亮,发送0,则都不亮,你可以试试。
串口调试软件设置:9600波特率,数据位8,停止位1,无奇偶校验。
例2:如果有2个PLC,那么将两个通讯口(PORT0)3 3接,8 8接。如果只有一个PLC,那么用串口调试软件当主站也可以。
主站程序:向从站发送4个字节的数据。
网络1:
LD SM0.1
MOVB 9, SMB30
MOVB 4, VB0
MOVB 1, VB1
MOVB 2, VB2
MOVB 3, VB3
MOVB 4, VB4
网络2:
LD SM0.5
EU
XMT VB0, 0 // 每秒发送一次
从站程序1:
MAIN:OB1
LD SM0.1
MOVB 9, SMB30
ATCH INT0, 8
ENI
INT_0:INT0
LD SM0.0
MOVB SMB2, VB10
ATCH INT1, 8
INT_1:INT1
LD SM0.0
MOVB SMB2, VB11
ATCH INT2, 8
INT_2:INT2
LD SM0.0
MOVB SMB2, VB12
ATCH INT3, 8
INT_3:INT3
LD SM0.0
MOVB SMB2, VB13
ATCH INT0, 8
如果主从站同时启动,或者从站启动比主站启动早,那么VB11=1,VB12=2,VB13=3,VB14=4.
如果主站先发送,那么VB11就不一定是1了,可能是2或3或4。
从站程序2:
MAIN:OB1
LD SM0.1
MOVB 0, VB10
MOVB 9, SMB30
MOVD &VB10, VD80
ATCH INT_0:INT0, 8
ENI
INT_0:INT0
Network 1
LD SM0.0
INCB MB10
MOVB SMB2, *VD80
INCD VD80
Network 2
LDB= MB10, 4
MOVB 0, MB10
-D +4, VD80
这个例子只是比上个例子少了3个中断而已。
从站程序3:
MAIN:OB1
LD SM0.1
MOVB 9, SMB30
ATCH INT0, 8
ENI
INT_0:INT0
Network 1
LDB<> SMB2, 1
CRETI
Network 2
LD SM0.0
MOVB SMB2, VB10
ATCH INT1, 8
INT_1:INT1
LD SM0.0
MOVB SMB2, VB11
ATCH INT2, 8
INT_2:INT2
LD SM0.0
MOVB SMB2, VB12
ATCH INT3, 8
INT_3:INT3
LD SM0.0
MOVB SMB2, VB13
ATCH INT0, 8
如果1是起始字符,那么在中断0里加个判断,就不会发生接收数据错位的问题。
针对您的一个例子。我做了实验。结果和您说的不一样!
当发送0-9之间的数时候,q0.5,q0.5都是常亮的。同时由q0.0-0.3组合亮所发送的数字。
如:发送1,q0.0,亮;2,q0.1亮,3,q0.0,0.1都亮,4,q0.2亮……大概是这四位用二进制方法来表达了发送数。具体什么原因我还没有参透。似乎是有规律的!