|
|
发表于 2007-2-6 18:30:40
|
显示全部楼层
来自: 中国江苏苏州
4)编程实现的代码构成% Q0 v2 c- M9 |7 e7 i( i) T0 ?
(1) LRC算法校验的实现; e1 W7 `8 [1 D4 `% G+ u
Public Function LRC(str As String) As String3 j0 X( c4 h! }; [ Z3 v
c = 0
/ x9 E$ Y0 q& Z& ?l = Len(str)
6 j3 B& {- B+ T5 pFor c = c + 1 To l; ^: f2 L9 v3 ^+ p8 d! F4 z
c_data = Mid$(str, c, 2)
2 d( [/ y( T) ?( `# e" k6 o) zd_lrc = d_lrc + Val("&H" + c_data)) n2 }1 R1 a) \- O0 S1 B$ g5 I
c = c + 1
7 e! n; f, h9 _8 G, M& x! S1 y5 A* JNext c
" P; } t3 v% ]' iIf d_lrc > &HFF Then8 ~/ l$ m. Y8 ~8 ?8 ^# x
d_lrc = d_lrc Mod &H100
3 U0 M6 i9 b8 m9 ^# NEnd If
7 E* E" }% I" r# L, W( ?h_lrc = Hex(&HFF - d_lrc + 1), s1 |3 K% }9 f% _
If Len(h_lrc) > 2 Then
/ r2 |' W2 r L) ^0 Gh_lrc = Mid(h_lrc, Len(h_lrc) - 1, 2)! n, _4 _6 V+ W) Q# x( [% ^6 h0 Z
End If: Z$ q2 O$ V, w" }
LRC = h_lrc
! r% G0 U5 |. r: X, f- UEnd Function
' V/ ^7 F- x! b- b t(2) 运行的开始就判断PLC的状态并设置标志位4 q w( t, T0 Z, t' l& t
'初次运行打开串口,并显示PLC运行状态( G" ?4 L) |9 R* n
Private Sub Form_Load()- B/ L7 V, k& Y; R& k, x% t& n( B8 w
Dim s1 As String
w! |* K' G# d' `4 J7 V3 cDim s2 As String, T) p. I3 x. e! Y6 h8 t, x
Dim s22 As String
/ f x3 v" N7 F/ rDim s3 As String
- S# I) k' f: n6 `1 [* K: s0 d. r* nDim s4 As String
6 z3 P3 P( j/ y, G5 eMSComm1.PortOpen = True, U5 }& D% v, @$ @3 Y/ z& F) ~
s2 = "01010C300001"; v/ a6 N9 X4 B+ H" W
s22 = LRC(s2)! R8 P+ n# `* X3 X) J' c
s1 = ":" + s2 + s22 + Chr$(13) + Chr$(10)
& g/ f* ^) e5 JMSComm1.Output = s1
4 ]7 M( D) G1 |. l; Ls3 = MSComm1.Input+ A# w6 i/ S; r3 p$ U
s4 = Mid$(s, 6, 8)6 e3 ~) _: y% ~% X( a
If s4 = "0C30FF00" Then
3 A1 J, ~& C( [, U. S% ^& `plc = 1 'PLC为运行标志- ~- P v1 f! P3 ?) a7 Z7 B
Else; S* `3 ?0 L% D& Z2 o! t
plc = 0 'PLC为停止标志
* U0 W3 F% i/ gEnd If$ Q# B# q% V, p4 v7 Q
End Sub
9 s: m1 q; F, D& ^2 @(3) 下面一段为用指示灯表示PLC的运行状态
# r6 z0 S! C: {: h7 r" y& vPrivate Sub Timer5_Timer()
) ~) i4 _; ~4 E; }0 s3 d8 H/ kDim s1 As String* M M u! S/ f2 r9 s) d
Dim s2 As String
8 [ ]% M0 D' m$ n& J7 jDim s22- S9 L( p' m& `! i& v4 E! u Q' \
Dim s3 As String
* `4 p& ?' j8 ?- RDim s4 As String
1 i! A& w- a* Vs2 = "01010C300001"
& A& s) W( o' ?1 M# E! s9 b) Ys22 = LRC(s2)& s! D2 r6 q0 Y% }
s1 = ":" + s2 + s22 + Chr$(13) + Chr$(10)% ~8 C8 Q6 M6 z* ?0 e# p( D
MSComm1.Output = s16 @5 W2 @8 [; M" N
s3 = MSComm1.Input
3 ~) | o5 o' q! ?1 }s4 = Mid$(s3, 8, 2)
/ K- e$ U* ]+ f4 u8 l2 N" vIf s4 = "31" Then) F1 b* K) E8 }0 {4 U
plc = 1 'PLC为运行标志" N/ u7 O/ ?0 D$ C. ?5 A, ]
Else: If s4 = "30" Then plc = 0 'PLC为停止标志
: c+ L* Y9 G, W' Z: I2 C, G2 p& PEnd If
1 C% b3 Z5 _! ?" U) ZIf plc = 1 Then" k1 |+ y+ I8 S5 p. D0 c
Label2.Caption = "PLC正在运行......"2 T, d3 y' c( @* V# E
Shape1.FillColor = RGB(0, 255, 0) 'green2 W# }" p' h$ G
Else5 K" A9 o) C; u7 ^; f: E
Label2.Caption = "PLC已经停止") L: K5 W7 h# R6 e; {- f
Shape1.FillColor = RGB(255, 0, 0) 'red
. }, @& e% U$ c3 bEnd If
1 a: ~# `7 z' `/ }$ BEnd Sub- ?. i# o. C) O) a0 q% ^
(4) PLC的起动与停止
; U- w$ Q4 [+ T" |+ [8 n w! x'起动PLC
0 a4 x+ z$ ^- xPrivate Sub start_Click()
5 ` A) V+ l; |: g4 Z# V3 C: _Dim strout As String* A/ V( f9 K& l* P X2 }) r8 Z
Timer5.Enabled = False
, ?, n9 n0 X8 y( i m& Q' X: Pstr = "00050C30FF00" 'M1072 为PLC起动停止标志位。查地址表,M1072为OC30.FF00为置5 z7 O3 i. c# i7 A( G
ON,0000为置OFF。& L9 p$ W4 K; C+ w5 q
'以上都是固定格式,要牢记。
# J" o& x% x8 g8 x0 oLRCC = LRC(str) '计算 str的lrc校验码。
) f+ r. W( [3 [8 k( Y7 g& y+ A4 g \strout = ":" + str + LRCC + Chr$(13) + Chr$(10) '欲传送之数据。13为D,10为A! U- x$ N( J( i4 w. {0 C
MSComm1.Output = strout* y* c) B) R( U7 W/ D9 `; g
Timer5.Enabled = True) H) z4 P% c+ l8 |& U9 {) j
End Sub
+ p" W& T1 F+ T) ~# B+ A6 `, `* @'停止PLC/ q" ]( w/ g) y' S5 }" y
Private Sub stop_Click()0 f& E( ?" c) B
Dim strout As String/ E% d2 L9 z/ }' k/ B
Timer5.Enabled = False
r) E* Y( V% Y! u g( b5 Qstr = "00050C300000"
; z& ^# A: I% L4 O( CLRCC = LRC(str)( c# p0 b, I( \+ l# ]6 _
strout = ":" + str + LRCC + Chr$(13) + Chr$(10)
+ \# ], B& y7 Q9 k5 R% ^6 eMSComm1.Output = strout- ]1 {; u G$ B/ J0 |7 z5 O( z$ g
Timer5.Enabled = True+ y3 Q8 N. A6 S8 ^
End Sub7 q$ p& {% V2 H: R
Y0、Y1的ON/OFF与PLC起动/停止的控制方式相同,指示灯的表示方式也相同。D256,D512数据写入的操作类似,限于篇幅其它代码就不再列出了。5 结束语; u# D1 _4 r/ A! o6 D
VB语言易于编程使用,为与串行设备的通信提供了很大的方便。台达PLC采用标准的目前广为流行的MODBUS协议,为实现PLC与监控计算机的通信提供了简化的平台。由于台达所有的机电产品都支持MODBUS协议,所以,掌握了VB与PLC通信过程,也就等于掌握了PC与台达所有机电产品的通信。 |
|