|
|
发表于 2007-2-6 18:30:40
|
显示全部楼层
来自: 中国江苏苏州
4)编程实现的代码构成
2 w# F* ]/ F1 B2 ]8 R(1) LRC算法校验的实现, L% M! D. v! x$ B8 `* \$ Y0 l
Public Function LRC(str As String) As String! a5 Z9 V! U; t
c = 0# I' R$ E1 n% f w3 P1 c1 g
l = Len(str)
3 T1 C, x+ M( r# p pFor c = c + 1 To l
5 W8 v* b) { `, c& R hc_data = Mid$(str, c, 2)
$ D3 d( ~9 g( Y8 T V3 o- id_lrc = d_lrc + Val("&H" + c_data)# A U: u* v% B3 R' @6 a9 ~) o
c = c + 1. r+ g; z% U- x8 V
Next c
# p. b' K( z- J# |" T+ C2 v3 p2 r: Q$ ZIf d_lrc > &HFF Then
% M3 a! d9 H3 ?% gd_lrc = d_lrc Mod &H100' c/ ]5 ^# M! T
End If
/ {+ ^ H# H& O- g G' ]! O, kh_lrc = Hex(&HFF - d_lrc + 1)( ^( h5 K7 E) P& x3 _+ j/ t" a
If Len(h_lrc) > 2 Then
2 @& k" K* e/ v8 S/ v, a5 vh_lrc = Mid(h_lrc, Len(h_lrc) - 1, 2)
2 s# N) c1 t1 k; ]End If
; p- B: a- s) q; r+ I1 ILRC = h_lrc
9 v2 k1 \9 t- b# uEnd Function! ?; T: K. t6 K1 ]/ Z7 D
(2) 运行的开始就判断PLC的状态并设置标志位
6 j' W* t/ n% E* e8 K9 f( Q'初次运行打开串口,并显示PLC运行状态
- Z; u$ M! t& S1 q' b" s; |Private Sub Form_Load()# B; R1 H- [$ Y6 u* c8 i& w) N* F
Dim s1 As String! c. a$ b: j9 d. R Y7 x- m- K$ X
Dim s2 As String2 G: G5 \) Q6 m @: o" Z7 g
Dim s22 As String
" y( w7 [0 e' O+ Y% n4 J: K1 ?( RDim s3 As String
, w k' [, G( ~Dim s4 As String$ `' x% Z& ?3 r/ K# Q
MSComm1.PortOpen = True
3 p& U7 ^4 i6 V8 c# s& ts2 = "01010C300001"
0 ?* i$ q$ V# ps22 = LRC(s2)
% C; B0 x( C; ss1 = ":" + s2 + s22 + Chr$(13) + Chr$(10)
1 D4 T8 a+ E! \8 ~$ _( RMSComm1.Output = s1
( V" A5 V$ N1 h2 xs3 = MSComm1.Input
8 ~0 }; N/ J9 }3 ?- _) J/ L5 r- _s4 = Mid$(s, 6, 8)5 t( \: v# w0 o9 j) W: o9 k: G
If s4 = "0C30FF00" Then7 E. k* A! Y9 O
plc = 1 'PLC为运行标志' I7 B; G) s- i& B0 Y3 |8 ~; [/ @
Else# X) p e0 K& ~: L
plc = 0 'PLC为停止标志, |$ o% k9 n3 j$ ], n: n
End If5 R. o$ D7 V5 W* u. r$ q2 \6 ^
End Sub
+ W( ^' ^$ d, R5 Y, C& s(3) 下面一段为用指示灯表示PLC的运行状态
* x/ L7 H5 \! h5 SPrivate Sub Timer5_Timer()
; I0 {8 F. u( ]; M8 F( }0 [Dim s1 As String
) Y9 g& I. g5 } a K R5 rDim s2 As String# i h6 n$ W& w4 D
Dim s22
1 h* I1 N3 k0 I/ IDim s3 As String
! X% [+ z' @' c$ n, r# LDim s4 As String
% _+ _1 z+ U6 ^8 t1 As2 = "01010C300001". F( N$ G; ?5 B; f2 z; x9 ~, Z# c
s22 = LRC(s2)
3 Q5 i+ T* Y- d8 N" _) ws1 = ":" + s2 + s22 + Chr$(13) + Chr$(10)+ t, a+ a, H. k7 n" V( D/ d9 H
MSComm1.Output = s1
- _9 K) F2 ^3 y, R1 c' _/ s: Z% l- ~s3 = MSComm1.Input S8 H; f* X+ ~7 E6 n$ h
s4 = Mid$(s3, 8, 2)- E+ s. H% f8 { y. l3 w+ X9 h
If s4 = "31" Then+ H7 _+ n+ A5 O: K! b2 t
plc = 1 'PLC为运行标志
: W6 x, x) Z& v) ]$ gElse: If s4 = "30" Then plc = 0 'PLC为停止标志& V0 A$ d$ m+ J9 }: v; [+ S
End If: x' M! Y2 |" ?) S Q2 v
If plc = 1 Then
' ~* }, D% |" r' H! S9 ?; P/ C" \Label2.Caption = "PLC正在运行......"9 K7 _! i9 F2 R3 ]* C
Shape1.FillColor = RGB(0, 255, 0) 'green
6 E+ u$ u5 C# V; Q9 M$ R: w9 iElse
' K( B2 D, _ B$ V, q$ T8 \Label2.Caption = "PLC已经停止"
+ _, h. N" j" i+ yShape1.FillColor = RGB(255, 0, 0) 'red7 X! j" S5 S/ C7 R7 I
End If
# @5 L1 K! C6 d6 a ~/ XEnd Sub6 E e1 F) V# n! l' I2 c
(4) PLC的起动与停止% a# }6 }1 k5 s# T
'起动PLC: N2 v4 p8 @$ N z' X6 R- x4 e" z
Private Sub start_Click(); L4 _% }# Q! W: w6 S& m
Dim strout As String
+ {. l0 t1 [' ? K0 ZTimer5.Enabled = False
; J) w6 l, V. P. Vstr = "00050C30FF00" 'M1072 为PLC起动停止标志位。查地址表,M1072为OC30.FF00为置+ s! [$ U$ e; J5 B# t5 u! D
ON,0000为置OFF。( j$ Z0 {2 e U9 S* K5 M$ C
'以上都是固定格式,要牢记。
1 Y8 R# n4 \6 \1 q5 G' R/ ALRCC = LRC(str) '计算 str的lrc校验码。
8 K4 V2 l/ w" ~" A p% A" ]strout = ":" + str + LRCC + Chr$(13) + Chr$(10) '欲传送之数据。13为D,10为A
' b; A# p: }" n, c9 ]" ^MSComm1.Output = strout
! ~# G6 q3 ?* ETimer5.Enabled = True
, F& j- |/ Y. X/ Y! wEnd Sub
3 L* z" y* M$ Q7 s'停止PLC* {' v S5 {0 f! i0 I$ i/ t; { v
Private Sub stop_Click()& {) `7 {- ~+ }; B
Dim strout As String
# q( }# E( p; B# ] YTimer5.Enabled = False2 l! N0 e F7 q( H# G
str = "00050C300000"; u }: }0 ^8 z' H! K. t
LRCC = LRC(str)
4 S( f- j5 V+ z5 v5 @$ `4 ~$ B7 ustrout = ":" + str + LRCC + Chr$(13) + Chr$(10)
$ _: C. ~2 v2 E+ A6 z: e, dMSComm1.Output = strout
" E0 A9 g! m0 b& \0 ]Timer5.Enabled = True5 [+ P i+ s: r% m- s
End Sub/ `% ?; _ m( t; g% }$ r
Y0、Y1的ON/OFF与PLC起动/停止的控制方式相同,指示灯的表示方式也相同。D256,D512数据写入的操作类似,限于篇幅其它代码就不再列出了。5 结束语- C1 ]0 P3 P! b9 d
VB语言易于编程使用,为与串行设备的通信提供了很大的方便。台达PLC采用标准的目前广为流行的MODBUS协议,为实现PLC与监控计算机的通信提供了简化的平台。由于台达所有的机电产品都支持MODBUS协议,所以,掌握了VB与PLC通信过程,也就等于掌握了PC与台达所有机电产品的通信。 |
|