发布于 2006-11-13 11:41:08
0楼
我(QQ:9150312)是这样做的:先做DB数据块,一个从站对应一个DB发送数据块和一个DB接收数据块。如:1号从站发送数据块为DB1,接收数据块为DB11;2号从站发送数据块为DB2,接收数据块为DB12;有七个从站做七个对应的数据块。
在OB1中应用定时器做一个600MS时间脉冲,脉冲宽度为70MS,用于触发发送数据块FB8,再调用一个计数器对发送的脉冲进行计数,范围为0到8,如果计数值大于等于8,就归为0,用计数器的数值来对应从站,如数值为1,将对应1号从站的DB发送数据块1和一个DB接收数据块块号11分别传送到字MW300(发送DB块块号)和字MW302(接收DB块块号);以此类推,如数值为2,将对应2号从站的DB发送数据块2和一个DB接收数据块块号12分别传送到字MW300(发送DB块块号)和字MW302(接收DB块块号)。传送完成后,触发发送数据块。程序如下:
network 1
AN T 10
L S5T#1S
SD T 9
network 2
A T 9
L S5T#70MS
SD T 10
network 3
L 0
T MW 30
NOP 0
network 4
A T 9
CU C 1
BLD 101
A M 55.0
L MW 30
S C 1
A M 55.1
R C 1
L C 1
T MW 32
LC C 1
T MW 34
NOP 0
Network 5
L MW 32
L 1
==I
= L 0.0
A L 0.0
JNB _001
L 1
T MW 300
_001: NOP 0
A L 0.0
JNB _002
L 11
T MW 302
_002: NOP 0
A L 0.0
FP M 57.0
= M 56.0
Network 6
L MW 32
L 2
==I
= L 0.0
A L 0.0
JNB _003
L 2
T MW 300
_003: NOP 0
A L 0.0
JNB _004
L 12
T MW 302
_004: NOP 0
A L 0.0
FP M 57.1
= M 56.1
……
Network 12
A(
O M 56.0
O M 56.1
O M 56.2
O M 56.3
O M 56.4
O M 56.5
O M 56.6
O M 56.7
)
A T 9
S M 101.0
A T 10
R M 101.0
NOP 0
Network 13
L MW 32
L 5
>=I
= M 55.0
= M 55.1
Network 14
A M 101.0
= L 0.0
BLD 103
A M 101.1
= L 0.1
BLD 103
CALL FB 8 , DB102
SF :='S'
REQ :=L0.0
R :=L0.1
LADDR :=256
DB_NO :=MW300
DBB_NO :=0
LEN :=MW126
R_CPU_NO:=
R_TYP :='X'
R_NO :=
R_OFFSET:=
R_CF_BYT:=
R_CF_BIT:=
DONE :=M101.2
ERROR :=M101.3
STATUS :=MW106
NOP 0
Network 15
AN M 101.4
= L 0.0
BLD 103
CALL FB 7 , DB101
EN_R :=L0.0
R :=
LADDR :=256
DB_NO :=MW302
DBB_NO :=0
L_TYP :=
L_NO :=
L_OFFSET:=
L_CF_BYT:=
L_CF_BIT:=
NDR :=M100.3
ERROR :=M100.2
LEN :=MW124
STATUS :=MW104
NOP 0
完成上述编程以后,一个从站对应唯一的一个发送数据块和一个接收数据块,使得通讯变得很简单,在对应的从站发送数据块中写入相应的通讯数据,DB块第一个字节为从站的站地址,第二个字节为Function Code值,代表指令的读写功能和数据区,第三个字节和第四个字节所组成的整数代表所读数据区的地址偏移量,第五个字节和第六个字节所组成的整数代表总共要读写多少位数据,注意该数值必须在1-2040范围内,否则发送指令不执行。
QQ:9150312