|
发表于 2007-2-6 18:30:40
|
显示全部楼层
来自: 中国江苏苏州
4)编程实现的代码构成- g: P/ l. ]) t) W: ]
(1) LRC算法校验的实现! y2 `; B& |/ r6 i7 w( L. N D
Public Function LRC(str As String) As String. x2 M6 R+ F) s- r( P9 x
c = 0
8 h+ |- p' D4 T" El = Len(str)
0 l# u3 j: C. ?/ O! HFor c = c + 1 To l3 `5 v4 Z1 V0 b2 @4 r0 Z
c_data = Mid$(str, c, 2)
3 z3 u9 G+ f* C. a9 ?& Ad_lrc = d_lrc + Val("&H" + c_data)
# \- [( D5 }4 A( @8 T9 Hc = c + 1
2 N6 l! N7 T$ X; C* WNext c
- j, {- ?8 i, N6 J/ B" w: pIf d_lrc > &HFF Then$ j) }. O! m4 z5 i8 ^' h
d_lrc = d_lrc Mod &H100
) `4 S9 _' @6 O5 {End If
4 l6 e" @# y) R5 K/ Z0 [h_lrc = Hex(&HFF - d_lrc + 1) Q6 o# ?+ j2 \: V$ ]
If Len(h_lrc) > 2 Then
) l' L% h! M R, p0 h# hh_lrc = Mid(h_lrc, Len(h_lrc) - 1, 2) {& Z" V) T9 f/ A: X
End If
/ ]3 k4 _5 S# l/ f: E4 xLRC = h_lrc; O5 Z9 N q' O
End Function
0 ?" t% ?; ^! m" g6 p" ^( S(2) 运行的开始就判断PLC的状态并设置标志位
+ z% }) T( j. j9 V'初次运行打开串口,并显示PLC运行状态
: K2 b3 b# Q! O! F- sPrivate Sub Form_Load()
8 B: B% j# t) P6 D5 x0 KDim s1 As String
1 P1 o8 g( w; W$ hDim s2 As String3 i* V l7 x) l8 [
Dim s22 As String
& Q. k. P" m2 q# l- pDim s3 As String
* m. c$ g- O. U7 r* xDim s4 As String
$ ~9 a2 [2 j; ^* nMSComm1.PortOpen = True" Q0 ~8 W! y/ m/ E P
s2 = "01010C300001"
; C% H: {- v5 n1 Ms22 = LRC(s2)
( R0 i5 s/ R( ?7 `1 Ks1 = ":" + s2 + s22 + Chr$(13) + Chr$(10)8 @ z+ W# c9 p. j( e3 v" u' K
MSComm1.Output = s1( T/ A9 U$ F$ M% `% A/ I
s3 = MSComm1.Input
( `! q! O/ x6 ]$ U2 v! c+ b" ws4 = Mid$(s, 6, 8)
! a! K7 `) o9 S% qIf s4 = "0C30FF00" Then" ?; F \$ t! \ N/ B
plc = 1 'PLC为运行标志
: e- J8 D- N8 O* [( jElse+ j$ n7 X A- D+ y$ u4 i
plc = 0 'PLC为停止标志( i$ B3 h8 q+ c" ^# ?
End If
% n1 e+ R/ ^% f* }" cEnd Sub( }5 O4 d) C1 [
(3) 下面一段为用指示灯表示PLC的运行状态
w8 a) S- {; @! ?Private Sub Timer5_Timer()
5 X# \3 m' g. @5 p2 J# m1 YDim s1 As String3 x" s$ y5 s& b4 s; N4 n0 X
Dim s2 As String0 Q# l7 P( i( u- X6 c- E1 b$ K& b
Dim s22( N+ b+ V. n2 L. q, @" {
Dim s3 As String
8 J; F1 W, m" EDim s4 As String# \- f! |. {' {+ L+ M) K0 p
s2 = "01010C300001" n) _ r7 |9 Z( G) J6 v+ h) }
s22 = LRC(s2)
2 F) y5 k G# {* p. O! gs1 = ":" + s2 + s22 + Chr$(13) + Chr$(10)2 G2 e' N. z9 H: E/ m- S W
MSComm1.Output = s1
* E! S: E% `' @6 Ks3 = MSComm1.Input
5 J$ b. ]- G& zs4 = Mid$(s3, 8, 2)
* W- F( l9 K% ?% kIf s4 = "31" Then
& }7 t$ u# w2 D4 k7 U$ a+ Q* k$ iplc = 1 'PLC为运行标志3 j3 y2 D% O) v- n
Else: If s4 = "30" Then plc = 0 'PLC为停止标志
0 i* A" G3 b9 ?2 CEnd If
8 Y/ N' F3 ]; @2 z1 d' dIf plc = 1 Then
0 ^5 t: J! B/ B" T5 n: ~8 G1 eLabel2.Caption = "PLC正在运行......") y2 x) R( B k4 a
Shape1.FillColor = RGB(0, 255, 0) 'green
! x5 B- _' Y! {Else9 W6 d1 Y$ P. m
Label2.Caption = "PLC已经停止"+ p& Z- Q) G/ m7 ^( Z
Shape1.FillColor = RGB(255, 0, 0) 'red
3 ~, c6 J- F# q9 D0 aEnd If
; W c, G. h4 P1 A- AEnd Sub
* S! o p; |) b( w% |(4) PLC的起动与停止3 I2 ]6 V2 A ?* I
'起动PLC7 S; k+ _0 s4 p- I
Private Sub start_Click()
& p4 Q( z/ g: ZDim strout As String
$ }3 T: Q% T, T0 j3 S0 n! _Timer5.Enabled = False) ]* L' P) I. v: U( j, ~8 N9 J
str = "00050C30FF00" 'M1072 为PLC起动停止标志位。查地址表,M1072为OC30.FF00为置
6 p$ S. G; o. |2 Z% p# C7 p, [+ CON,0000为置OFF。9 O0 I+ y6 S+ k+ o( Y D$ Z
'以上都是固定格式,要牢记。
9 d& e) | X7 n/ x/ b* DLRCC = LRC(str) '计算 str的lrc校验码。, B8 Z5 B' x( }
strout = ":" + str + LRCC + Chr$(13) + Chr$(10) '欲传送之数据。13为D,10为A
+ B. W" ]5 N$ S$ Q" @. E. UMSComm1.Output = strout% C8 y) l# O) v. ]
Timer5.Enabled = True8 B' v4 a4 u/ b1 r6 }! h
End Sub
5 A2 n; u% l! X9 j' S# g7 i'停止PLC
7 B0 g3 D2 k* a4 _" L$ vPrivate Sub stop_Click()
2 ?" Q; f% _9 k0 K* d% L o e% kDim strout As String8 a' J! Z) Y$ Y/ m6 q+ w
Timer5.Enabled = False ^' G8 y% ~) |( w4 e
str = "00050C300000"2 a% L7 y4 G- u8 Y0 \
LRCC = LRC(str)
' r' C7 h8 _/ m: W x5 Cstrout = ":" + str + LRCC + Chr$(13) + Chr$(10)
' c, ^* y8 c8 W3 G: XMSComm1.Output = strout' o+ H) M4 f! H7 @) }
Timer5.Enabled = True
' [& [1 r. D1 _. t, y1 }1 FEnd Sub
5 r) o7 I7 B( s' p! E) RY0、Y1的ON/OFF与PLC起动/停止的控制方式相同,指示灯的表示方式也相同。D256,D512数据写入的操作类似,限于篇幅其它代码就不再列出了。5 结束语
6 I/ O( Q4 t; s8 R8 vVB语言易于编程使用,为与串行设备的通信提供了很大的方便。台达PLC采用标准的目前广为流行的MODBUS协议,为实现PLC与监控计算机的通信提供了简化的平台。由于台达所有的机电产品都支持MODBUS协议,所以,掌握了VB与PLC通信过程,也就等于掌握了PC与台达所有机电产品的通信。 |
|