|
发表于 2007-2-6 18:30:40
|
显示全部楼层
来自: 中国江苏苏州
4)编程实现的代码构成
8 B/ Y& z$ Q, P6 c0 Z( W( r" b(1) LRC算法校验的实现
- h, D( B) `1 pPublic Function LRC(str As String) As String
2 o* m* ^/ x# X: _" a3 @( s W1 wc = 0: c2 B5 C4 Z9 l. D
l = Len(str) g! Y. t7 k. ^2 R4 C
For c = c + 1 To l, M- P: O) g0 e4 T& f$ t
c_data = Mid$(str, c, 2) 0 y5 z( q4 E( W; v9 @- a
d_lrc = d_lrc + Val("&H" + c_data)* \2 b, F/ l: z( z
c = c + 1
+ {% o/ Q, w4 q! Q$ }Next c ~' g8 P* [ H R6 {5 ]$ y
If d_lrc > &HFF Then
/ @/ a$ D- D% v: k/ Kd_lrc = d_lrc Mod &H100
8 L8 C: Z, l& I6 X* GEnd If+ B7 J& j- g) z* ] B4 B4 o/ q
h_lrc = Hex(&HFF - d_lrc + 1)) |* Z$ m' @% n( e' \+ `
If Len(h_lrc) > 2 Then
1 f- c& `5 O/ N( H; F3 qh_lrc = Mid(h_lrc, Len(h_lrc) - 1, 2)
: ?/ a2 \' J, K; p. v" [End If
' F- k# {1 o5 a* m- aLRC = h_lrc
K8 u2 ^, z8 u9 f0 `# }. X+ x" rEnd Function7 H! k1 K* G/ T% p \9 b
(2) 运行的开始就判断PLC的状态并设置标志位
/ {9 @( z4 K3 A5 z6 ['初次运行打开串口,并显示PLC运行状态' W' S# U- b) w
Private Sub Form_Load()
" t5 K# {/ A; o; zDim s1 As String
5 C0 T; s& r7 QDim s2 As String
$ E F; A7 L( i* ?Dim s22 As String5 |: o: P8 u+ U3 K9 L+ n
Dim s3 As String' f. v3 W9 ]) ~, [: Y3 o( k
Dim s4 As String
- e7 l: [' z2 |* T; oMSComm1.PortOpen = True% V: z0 A9 H) _, u7 ~3 o
s2 = "01010C300001"
; J% f5 r8 k# z+ \s22 = LRC(s2)
9 Q- G/ b) p. Es1 = ":" + s2 + s22 + Chr$(13) + Chr$(10)
% x4 n: [$ [6 ~MSComm1.Output = s18 B% l) K# j- L; M
s3 = MSComm1.Input* _9 M0 l6 {+ z3 o# w& Y
s4 = Mid$(s, 6, 8)
- o9 N( ^9 b X/ Z8 TIf s4 = "0C30FF00" Then
( h7 t9 @) b Q1 q% jplc = 1 'PLC为运行标志
E- A n3 R. q |' C8 ^7 V" sElse9 o U3 } E1 o: E
plc = 0 'PLC为停止标志
& g; k! W& c4 u2 r4 d# o5 HEnd If
4 f, D6 G1 D0 a! f0 C$ M# h/ {% cEnd Sub
, t# E, \" }2 s# m. X(3) 下面一段为用指示灯表示PLC的运行状态& c/ j) c3 b) p4 \% h) d( T
Private Sub Timer5_Timer()
& o/ X w# [6 }Dim s1 As String) k: H3 w( a4 W
Dim s2 As String! g4 L2 `6 a7 B* j' D3 C/ d+ q% n
Dim s227 ?5 N [+ E' s( Y3 o
Dim s3 As String
5 w6 F1 a U4 {: q7 bDim s4 As String4 w. T. t- N# W3 }$ _! M
s2 = "01010C300001"6 K9 W8 j& Y) s. Q' H
s22 = LRC(s2)
% w* W. Z- ~2 M, is1 = ":" + s2 + s22 + Chr$(13) + Chr$(10)' s1 |2 n7 G+ c9 C# a# ?! D+ T: p1 K
MSComm1.Output = s12 b! T+ V; {2 P- K: h/ W; Z3 K
s3 = MSComm1.Input% a6 _5 F5 J1 `7 Z3 F- u; w* H8 _
s4 = Mid$(s3, 8, 2)
6 ^/ p& D6 r2 y# hIf s4 = "31" Then
* Q: v7 s+ e" ^# |: J; [" T, \plc = 1 'PLC为运行标志6 n& @ L3 b4 t/ [: W& B
Else: If s4 = "30" Then plc = 0 'PLC为停止标志$ Z% Y6 Y& p/ w
End If
. D1 n- \6 v6 o8 Y% zIf plc = 1 Then
: o6 F6 }4 c. M# O# X, ]! e: iLabel2.Caption = "PLC正在运行......"5 \! \- v2 R- r! a. }
Shape1.FillColor = RGB(0, 255, 0) 'green# |0 `; f, k: j
Else9 Q8 ]3 G2 b% M% R; S
Label2.Caption = "PLC已经停止"$ m) s2 t, H6 m3 o
Shape1.FillColor = RGB(255, 0, 0) 'red2 b6 c% l- h4 V4 Y8 Q
End If4 P6 Z, `) G6 X
End Sub, x8 \# K/ K( k
(4) PLC的起动与停止
! j( {% ~; i4 i' x6 G'起动PLC
8 ~6 ^& u% i0 y) M* v4 o5 zPrivate Sub start_Click()% ~2 I) `; a N9 J0 i
Dim strout As String/ ?; h" b9 V( d" a* \
Timer5.Enabled = False
) k1 M( f& x, a2 F1 H, }/ ]str = "00050C30FF00" 'M1072 为PLC起动停止标志位。查地址表,M1072为OC30.FF00为置+ u* ]: O J; @* [* h! J+ Z; o& p
ON,0000为置OFF。! L/ R$ @, c( [! H
'以上都是固定格式,要牢记。4 _3 P7 I3 x% s
LRCC = LRC(str) '计算 str的lrc校验码。
# K7 N. _: \0 jstrout = ":" + str + LRCC + Chr$(13) + Chr$(10) '欲传送之数据。13为D,10为A. Y }/ u0 N, }1 P
MSComm1.Output = strout
" v$ o. o8 c+ a% d$ O2 O$ kTimer5.Enabled = True
8 j0 u8 Q" |6 Y3 `End Sub: a, V5 O) J5 x* h' R
'停止PLC
' S9 [+ @. R: i! DPrivate Sub stop_Click()
' j9 X. S: P2 `4 S; H3 [; n dDim strout As String
, ?) G: h* Z6 r/ @: F; g. WTimer5.Enabled = False
1 k; ]# e5 \& a j& Wstr = "00050C300000"4 W( W& b3 i7 B$ j
LRCC = LRC(str)5 V& i1 K5 Q* D4 C* N
strout = ":" + str + LRCC + Chr$(13) + Chr$(10)" ~& F; X- Z( `6 M. X; j
MSComm1.Output = strout
; T6 P5 H: p! n% i! P2 ^Timer5.Enabled = True
- _$ {- R. @ ~9 \% {) p) \9 zEnd Sub6 \1 _$ Z1 U/ B
Y0、Y1的ON/OFF与PLC起动/停止的控制方式相同,指示灯的表示方式也相同。D256,D512数据写入的操作类似,限于篇幅其它代码就不再列出了。5 结束语
0 E* }& L# @' q$ b( p+ Y. jVB语言易于编程使用,为与串行设备的通信提供了很大的方便。台达PLC采用标准的目前广为流行的MODBUS协议,为实现PLC与监控计算机的通信提供了简化的平台。由于台达所有的机电产品都支持MODBUS协议,所以,掌握了VB与PLC通信过程,也就等于掌握了PC与台达所有机电产品的通信。 |
|