|
|
发表于 2009-5-17 23:42:53
|
显示全部楼层
来自: 中国北京
三菱的PLC可以直接和电脑通信,软件要自己设计。
0 U4 d. x2 M7 ^, [$ [* e/ LPC与PLC通讯程序的设计。此部分的开发设计较难,需要掌握PC和PLC的有关通讯硬件驱动和通讯协议的知识。但对于小型控制系统来说,主要通过PC串口来通讯,所以通讯程序设计的关键是如何利用Visual Basic 6.0中的串口通信控件——MSComm控件,并根据PLC的串口通信协议设计出上下位机的数据交换程序。/ i k S; U/ ^- x J
PC与PLC通讯程序设计分析( p! ]9 N! L/ G
在分析具体的VB通讯程序之前,先要介绍有关VB串口通信控件MSComm的应用知识和三菱PLC 通讯协议。
9 b. t6 t3 l! ^& i/ @0 h1. MSComm控件简介% g& q+ n6 Y$ r
如图所示是Mscomm控件的图标。
; w4 ^2 T4 a6 ?- U, I它可以用来提供简单的串行端口通信功能,也可以用来创建功能完备、事件驱动的高级通信工具。 Mscomm控件提供了一系列标准通信命令的使用界面。使用它可以建立与串行端口的连接,通过串行端口再连接到其它设备(如调制解调器、PLC),发出命令,交换数据,以及监视和响应串行连接中发生的事件和错误。3 j$ e% ]- W. Y5 c& @/ d: {$ K5 {
2. MSComm控件的基本属性
0 F9 G; \' f0 \- H0 FMSComm 控件有很多重要的属性,基本属性如下:
1 u# [+ t. V2 O5 \7 S属性 描述 4 Y" ?+ ~; |( P2 E8 f" n2 b. l. j- V+ U
CommPort 设置并返回通讯端口号。
+ C5 g. L+ w0 q. x3 V1 G, kSettings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 ; {) K7 V4 c; V8 |# C, U
PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。
! d' P) h+ F, q+ g( hInput 从接收缓冲区返回和删除字符。 , I: `! A0 F- b" m, @4 z* }$ ~
Output 向传输缓冲区写一个字符串。4 X! E* ]1 a" _! \ l7 H* l
如下程序打开串行端口COM1- o: @% @9 x+ O+ ?+ s# D6 z
MSComm1.CommPort = 1 使用 COM1 7 q$ j! w) o) p
MSComm1.Settings = "9600,N,7,1" 9600波特率,无奇偶校验,7位数据,一个停止位。2 t* j: f: g2 N2 F) t4 u+ r
MSComm1.PortOpen = True ''打开端口,开始通信。4 d. y5 n7 _+ E! ]4 B
3. MSComm控件的通信方式) _5 Y+ V* o0 g
通信控件有2种不同的方式来处理和解决各类通信软件的开发和设计问题。
1 z, r6 _# _! n(1) 事件驱动
8 i' @ @8 s9 m事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如:当线路数据到达本端或CD线和RTS信号线状态发生变化时,要求我们使用相应的事件来跟踪和出理。在这些情况下, Mscomm控件将触发OnComm事件,CommEvent属性值也将被改变。所以在OnComm事件中读取CommEvent属性值就可以检测和处理通信错误等方面的问题。
2 ~. \: K! N0 \: L(2)查询方式
( d! |) n9 A$ K2 L利用定时器控件Timer,我们可以设计程序每隔一段时间去读取CommEvent的值并处理所发生错误和事件。
# [7 `4 \1 I8 l1 b& c9 u4. 本实例中采用的通讯方式
* H, M# q* I$ j) [在本例子中,PC与PLC 采用无握手协议的串行通信,它们只用两根数据线 TD和RD、一根信号地线连接,数据通信采用查询方式。根据系统功能要求,PC需发送两种类型的命令:
$ W& Z$ {( l, J i6 _ L! I9 Y( u(1) 周期性命令,它由定时器触发引起,每隔0.5秒发送一次。用它来向PLC查询实时显示的数据。如酒、水的瞬时流量,调节阀开度等。: F: r' G. a' g: w9 D6 E& {
(2) 非周期性命令,它由操作者按动命令按钮引起,非周期性发送。用它来传送输入参数、操作命令给PLC 。/ U/ @0 q9 q! A
在啤酒稀释的人机操作界面中,有运行时不可见的通信控件(MSComm1)一个、定时器控件一个Timer1。通信控件(MSComm1)用于初始化串口数据并打开串口;定时器控件(Timer1)用于每隔0.5秒执行通讯命令,把查询命令从 PC发送到PLC,同时接收PLC返回的应答数据。设计通讯数据的发送和查询功能,必须掌握PLC所遵循的通讯协议。2 S, H! R9 r3 Q; a
5. 三菱FX系列PLC通讯协议, d6 ]7 {& ]9 \9 n8 I
三菱FX系列PLC共有四种通信模式,本实例采用的是PLC与计算机专用协议通信方式(无须PLC编程,电脑直接读写操纵PLC),其通讯命令字和通讯格式介绍如下:1 K, _4 E+ D G9 P, r
PC发送给PLC的通信命令字
7 T' w$ M7 R% K# T命令字 注释- O# Z& A; ^: y% S0 f( p: x( v( t
BR 以1点为单位,读出位元件的状态) R. r! j* K2 Z( Q4 [% o0 s
WR 以16点为单位,读出位元件的状态,或以1字为单位,读出字元件的值. t& x j( d2 {% S+ X8 ?
BW 以1点为单位,写入位元件的状态$ `. r% ^4 V. ]$ Y: x+ |
WW 以16点为单位,写入位元件的状态,或以1字为单位,写入值到字元件( o o. m1 E. J! P. b
BT 以1点为单位,设置/复位 位元件
9 D E+ n. [+ O" Y9 {WT 以16点为单位,设置/复位 位元件,或以1字为单位,写入值到字元件
3 q& B i- ]/ r/ w& U7 U% ?1 E4 o kRR 控制PLC运行RUN
" o/ d6 h1 J# a+ W+ o, wRS 控制PLC停止STOP
) v9 x4 d1 \1 ?) tPC 读出PLC设备类型5 ^- h: f2 E9 h( S. I9 ]
TT 连接测试
! W0 a3 q9 |$ B5 QPC发送给PLC的通信命令格式6 ~( L% m7 a; ]. C+ v: R
约定说明:ENQ为请求标志,ASCII值5,VB中以chr(5)表示;
" J4 w f' m) J& U4 i ACK为正确标志,ASCII值6,VB中以chr(6)表示;
3 }, l* I) K9 R8 o STX为请求标志,ASCII值2,VB中以chr(2)表示;- E$ a, i4 R+ z% `$ C0 l4 q
EXT为请求标志,ASCII值3,VB中以chr(3)表示;
, E; a1 r( j/ H' \6 K. P; v* A; ` 表格中粗体字为需要求和效验的部分;/ Q. `1 E6 n4 }+ W
和效验为每一项的ASCII值的总和转换成十六进制后,取其低两位;! N4 c$ [6 @/ B- R
站号、PLC号、元件数量、和效验都是以十六进制表示;5 `/ A9 x# p0 ^4 L; z4 i8 V4 H
等待延时为0-150毫秒,以十六进制0H-FH表示,如100ms为AH。
; v2 g# X" D( s2 y' e! F1) 批量读出位元件—BR指令格式
0 q( G! m5 h7 Y' A" N. n+ Z1 2 3 4 5 6 7 8 15 16 17
* r3 y T$ x2 l8 k2 j, RPC侧: ENQ 站号 PLC号 BR 延时 首地址 数量 和校验 ACK 站号 PLC号
, Y) N; T0 o- f$ ~1 V+ D) D: bPLC侧: STX 站号 PLC号 数据 EXT 和校验
l' ]1 L5 f/ H- o {. a" f6 V 9 10 11 12 13 14 0 O* M* C% p2 q. ?
例如:要读出站号为5的PLC的X40到X44共5点的状态值,延时100毫秒,假设PLC中X40与X43为OFF,其余为ON,则指令数据如下:+ r; @. @! j) h. k, d
注释: 请求 站号 PLC号 命令 延时 元件首地址 元件数量 和校验
) Z3 `, M4 H. L: p$ n( b/ ?代码: ENQ 0 5 F F B R A X 0 0 4 0 0 5 4 7* [" W$ ~& |' M% m$ B) q7 R
ASCII码: 05H 30H 35H 46H 46H 42H 52H 41H 58 30H 30H 34H 30H 30H 35H 34H 37H4 e0 O; x: S" q, P
只要将以上代码以字符串形式(VB中可以表示为chr(5)&”05FFBRAX00400547”)发送到PLC,就会有正确的回应信息,如下:
Z# r2 |5 e# r$ W( V( @. H) w/ [注释: 头 站号 PLC号 位元件状态值 尾 和校验$ X$ j/ x1 L5 v$ W
代码: STX 0 5 F F 0 1 1 0 1 EXT E 7
3 b+ \+ r, Y. vASCII码: 02H 30H 35H 46H 46H 30H 31H 31H 30H 31H 03H 45H 37H
5 p7 A, w5 J) C- R% _2) 批量读出字元件—WR指令格式; m4 M6 B/ w1 m- I' s1 Q* P, Q
1 2 3 4 5 6 7 8 15 16 17( i% A0 t: _, Y) k* r
PC侧: ENQ 站号 PLC号 WR 延时 首地址 数量 和校验 ACK 站号 PLC号
4 j% I0 }/ j7 \ V4 z4 J- A0 ` YPLC侧: STX 站号 PLC号 数据 EXT 和校验 3 J1 j* H( {, I3 P% P3 N6 h/ o8 U; z
9 10 11 12 13 14
, v. c) n0 i* \! E该命令使用与BR命令相同。" Y- U* D: ^/ s# h+ ?2 ^! }5 u
3) 批量写入位元件—BW指令格式 + U1 a' H, {& k/ ?4 J) m: G" W
1 2 3 4 5 6 7 8 9 $ T" l" M1 X8 k; v
PC侧: ENQ 站号 PLC号 BW 延时 首地址 数量 写入值 和校验
% p+ h% w% z2 h0 j. ^7 XPLC侧: ACK 站号 PLC号2 Y. K& p6 Z# f( D
10 11 12
0 `* O2 c& i N' K1 ?4) 批量写入字元件—WW指令格式
) ^$ K( H# h2 ? e5 C( w+ f8 C4 [: q/ P4 A1 2 3 4 5 6 7 8 9 : o& u' M- [& B0 Z" R! U
PC侧: ENQ 站号 PLC号 WW 延时 首地址 数量 写入值 和校验
7 F+ y, E$ a' H2 A# I [PLC侧: ACK 站号 PLC号
* l! @. q$ K1 _+ d" X- L: K 10 11 12
! K* J! {& y, A5 I& Z. t: g6. VB通讯功能块设计分析
; W7 z. x# Z; z/ }0 B! T% [$ n根据三菱PLC的通讯指令格式,在PC中编写数据查询功能块RevData( )和数据发送功能块SendData( ),就可以在定时中断处理块TIMER1( )中调用查询功能块RevData( ),实现PC界面数据定时刷新;在每一次操作命令执行时,调用数据发送功能块SendData( ),把控制值写入PLC中,从而实现控制。下面给出这两个功能块的设计程序。) I+ B. n/ M4 g& Q; H: z# u+ w0 ^
1) 查询数据函数RevData( )/ C3 d6 U7 u4 z) T) V; Q
(没有和校验)0 q: S: z3 ^' N" w! S) s
Sub RevPLC (iNo As String, iType As String, iAdd As String, iNum As String)4 r5 ?; d, m3 K p8 s7 i
'' iNo为PLC站号,iType为元件类型,iAdd为首地址,iNum为元件数量
" v, ]8 m# q( J$ \; `" IDim Stmp As String2 w: L1 G9 {' t$ k, r3 m
Dim cha, j As Integer- Z% k+ n9 [' V+ K- w a2 I
Dim ChaCount As Integer
4 o6 c% {6 z2 E! fDim Comm As String3 a; w7 {2 o/ i: N% }6 R# C+ p
Select Case iType
. l6 L& B4 i5 o6 F! p! |* wCase "D" ''查询数据寄存器的值
* p9 S( x$ g1 D$ p! e/ U. TComm = "WR" ''命令类型:数据字读
( |" e7 `3 ^( z) vcha = Val("&H" & iNum) * 4 ''数据寄存器的值为十六进制表示,占4个字符
4 }& q) m) l' }- Z1 ACase "M", "X", "Y" ''查询继电器触电的值0 a: n) ~, O) b4 L% H9 @3 ^
Comm = "BR" ''命令类型:二进制位读
q2 X6 U# e# [cha = Val("&H" & iNum)
' U! ~+ t; \' k( N) N' ]0 q* u3 QEnd Select; w! A, b* V2 H3 m- g& H
iAdd = Right$("000" & iAdd, 4); d2 T7 k# X' A) ~' k7 m1 w
iNum = Right$("0" & iNum, 2)4 q, d: q! j8 |4 ^, d7 `+ L; ~
Stmp = Chr$(5) & iNo & "FF" & Comm & "A" & iType & iAdd & iNum ''输出命令格式
% V/ G7 K5 m" F2 eChaCount = 6 + cha ''要返回字符个数8 J' A+ j+ A" K2 S9 e# Y
main.MSComm1.InBufferCount = 0 ''输入缓冲区清零. {6 V2 d* @5 ?- W! B" v0 o* t
main.MSComm1.Output = Stmp ''设传送缓冲区内容为命令格式
7 b( `/ m/ |5 \0 g0 p6 ^Now=Second()& F6 r* x! [. [+ n; x$ [: F
Do, q7 }1 B& u! X3 r" ^2 p, H8 B6 A
DoEvents ''转让控制权,以便让操作系统进行数据传输
6 ]; B& P( u; ^If Second()-Now>1 Then Exit Sub5 a4 t, A2 L1 a5 z6 ~5 m/ i: C
Loop Until main.MSComm1.InBufferCount = ChaCount ''当接收到规定字符时停止循环
6 ]5 M g# S: q" f- Y9 ARevDataTmp = Mid$(main.MSComm1.Input, 6, cha) ''返回数据字符串保存在全局变量, T- b$ ^1 B' u7 l. Y$ ]
''RevDataTmp中& Y; m! L6 n0 i- ]! @% r
End Sub
! F5 b" Y, i) D! `2) 发送数据函数SendData( )9 P* F4 @: D) v6 e
(没有和校验)% q1 F1 h, ?/ q3 a) W2 @5 y- j
Sub SendPLC(iNo As String, iType As String, iAdd As String, iNum As String, iValue As String)
" M `9 z) h/ P% E4 H$ ^0 x2 m: P3 s P'' iNo为PLC站号,iType为元件类型,iAdd为首地址,iNum为元件数量,iValue为写入值
& L+ J# P% Y e+ M5 LDim Stmp As String z# P+ E. s; {# b. v( ^% t" P
Dim Comm As String8 l# y' A) B% x7 l2 Y. c, ~7 Z* h
Select Case iType
: u# O* W% @( y4 OCase "D" ''写数据寄存器的值
$ J0 g* f+ I! V6 K6 \/ VComm = "WW" ''命令类型:数据字写
% H- |' }8 x3 q2 O1 v J3 kiValue = Right$("0000" + Hex$(Val(iValue)), 4) ''写入值转换成十六进制表示& X% g- |9 Z( _: ~
Case "M" ''写继电器触点的值
) C( m6 R9 y) O8 b# F; cComm = "BW" ''命令类型:二进制位写
; G: m# e2 R# B9 QEnd Select& Z% {8 { R, z7 G* L1 Z
iAdd = Right$("000" & iAdd, 4)
1 Y! n: w. e# q, k7 O$ DiNum = Right$("0" & iNum, 2)2 b" {. u( _$ e
Stmp = Chr$(5) & iNo & "FF" & Comm & "A" & iType & iAdd & iNum & iValue ''输出命令格式
, g8 k4 h' J; I3 H2 ZMSComm1.Output = Stmp ''输出命令到传送缓冲区
' E9 d3 T- y6 iNow= Second()0 o4 ^1 Q! [% D" W6 l; W5 a3 E# p, s
Do
2 F* A0 R$ D$ N, S& n* z" DDoEvents ''转让控制权,以便让操作系统进行数据传输6 g% D* c+ R" d5 s8 i0 _
If Second()-Now>1 Then Exit Sub( O, a' d+ {$ U- D4 ~- [
Loop Until main.MSComm1.OutBufferCount = 0 ''当命令传送完时停止循环
. _& J1 k, |6 F9 o0 _' PEnd Sub |
评分
-
查看全部评分
|