|
发表于 2007-2-6 18:30:40
|
显示全部楼层
来自: 中国江苏苏州
4)编程实现的代码构成$ i' W, s+ u( z9 \+ G8 x6 ]9 Y
(1) LRC算法校验的实现2 \, v8 Z' L0 g+ d3 j) R
Public Function LRC(str As String) As String; v/ r1 Z/ D0 Q& e. @
c = 0/ w1 L. _' c# n( X' B8 W
l = Len(str)
' J# e4 @. j+ `For c = c + 1 To l1 z" l4 ?. q8 ^& k
c_data = Mid$(str, c, 2) 5 y" |+ F) B, Y3 _: I
d_lrc = d_lrc + Val("&H" + c_data)
. ]+ I7 R3 z& g: I0 Lc = c + 1# [! w5 {/ y: E2 ~
Next c4 Z3 c3 N! O% U- D1 D
If d_lrc > &HFF Then$ _/ V( x( {2 h% |
d_lrc = d_lrc Mod &H100
& q5 u1 z2 o3 O" X; J9 E. g0 MEnd If7 e4 G6 w4 m$ M) O' U
h_lrc = Hex(&HFF - d_lrc + 1)) \2 k/ e( t0 n2 P
If Len(h_lrc) > 2 Then, {8 S' {; D$ }; @
h_lrc = Mid(h_lrc, Len(h_lrc) - 1, 2)
7 |( Z$ {( m8 Q6 x. d0 [' }" ?9 QEnd If
) M" j7 H$ k# W5 m% \LRC = h_lrc
+ N) f# i0 y. W7 REnd Function' v7 ^- o3 Z" u# a1 o8 i% F$ u
(2) 运行的开始就判断PLC的状态并设置标志位8 z, _- b' t& q$ `5 t" O
'初次运行打开串口,并显示PLC运行状态
6 p; k/ \( t. W; q- XPrivate Sub Form_Load() o; M7 x% ]/ P' C3 N$ i
Dim s1 As String3 b. r% |2 L8 A0 G
Dim s2 As String) R- F' y6 R3 W% y$ k8 F% @/ O
Dim s22 As String
" Z( D b4 Z- z* [4 d' RDim s3 As String
4 A+ G9 l! R: k# | u rDim s4 As String
|! q6 k- M, O8 t, ?MSComm1.PortOpen = True; c: E' V0 [2 k I# ?
s2 = "01010C300001"2 R2 @7 @9 f: ?, ~$ A
s22 = LRC(s2)
, T$ @* T, g( H: v+ p' Os1 = ":" + s2 + s22 + Chr$(13) + Chr$(10)
# W8 |5 L' y4 k" E7 Q' i$ O! QMSComm1.Output = s1
6 q1 i& r) |5 G0 v$ I* {' Zs3 = MSComm1.Input
9 f5 u F+ Q1 X+ z# js4 = Mid$(s, 6, 8)
5 p% h1 Y8 k% gIf s4 = "0C30FF00" Then0 D4 A2 `0 _. Y1 L. |
plc = 1 'PLC为运行标志3 U4 e/ t8 \. w4 E9 m8 A
Else
( \ D3 A [7 D7 B) x( rplc = 0 'PLC为停止标志
1 X* f2 [6 V, L rEnd If
7 A' }# W- d: @, HEnd Sub
0 P" t; g. f2 w$ E(3) 下面一段为用指示灯表示PLC的运行状态
( {3 m+ b8 x% D+ b+ s& HPrivate Sub Timer5_Timer()0 g9 r) s4 s- P. E4 i! B
Dim s1 As String+ S, X0 T4 z6 E* }
Dim s2 As String
+ d2 D( }' ]8 n" m7 uDim s22. j! g0 p! u$ r
Dim s3 As String/ _0 t0 W4 }- q5 V6 r- W9 t
Dim s4 As String9 p0 h# g0 {( D9 S& f$ F
s2 = "01010C300001"6 d* Y4 q: C; F% v( ]0 [' ?) V
s22 = LRC(s2)
- `5 k- }8 e8 j# s% L; d6 Ps1 = ":" + s2 + s22 + Chr$(13) + Chr$(10)+ m/ Z( `4 \: D
MSComm1.Output = s1
9 n* _6 n! o4 a/ Ts3 = MSComm1.Input- B# H+ x. L8 c$ o9 ^/ Q: j
s4 = Mid$(s3, 8, 2)& C* x% U% z+ B3 G0 ]; t) w
If s4 = "31" Then
2 _. q" j, ]1 J9 ]9 [2 n" Kplc = 1 'PLC为运行标志! k( y8 t: |! U
Else: If s4 = "30" Then plc = 0 'PLC为停止标志3 Q' w, d2 ]: D: u, t3 W- z
End If
7 e% H+ a1 K/ x9 AIf plc = 1 Then" l$ b* q3 M9 Z4 J) P
Label2.Caption = "PLC正在运行......"4 G6 |: ]; Z. R
Shape1.FillColor = RGB(0, 255, 0) 'green
8 ]9 N( N' b; u* R% @! Q4 PElse2 E( O. I0 a; g+ X6 I( D
Label2.Caption = "PLC已经停止"
" _3 R: g& B, r0 I UShape1.FillColor = RGB(255, 0, 0) 'red* U/ c" V- m7 w" ]0 g9 l
End If
+ W4 j9 K' y/ l! z d1 d2 zEnd Sub; c& D% |3 {: ]& W
(4) PLC的起动与停止
; o3 _: O" I8 B( c'起动PLC
$ S/ y! u9 q1 A" b# p) s; P" L6 qPrivate Sub start_Click()% p5 }0 b4 F9 v1 u) ^
Dim strout As String) \, b& R) e3 ]2 e$ m
Timer5.Enabled = False
# [& o' _! w; K2 bstr = "00050C30FF00" 'M1072 为PLC起动停止标志位。查地址表,M1072为OC30.FF00为置6 D- I4 u" }2 |) w
ON,0000为置OFF。) q- l- d9 ^8 q- E/ a A, L, f+ x
'以上都是固定格式,要牢记。. j0 l, \1 m0 ?9 S5 _+ U
LRCC = LRC(str) '计算 str的lrc校验码。" X* i5 z' e q: d: c9 }
strout = ":" + str + LRCC + Chr$(13) + Chr$(10) '欲传送之数据。13为D,10为A
1 I# n* n- \ T9 uMSComm1.Output = strout
2 Q. }- M. c' U; G* _2 [Timer5.Enabled = True& O% Q% z5 e; }& a `+ C
End Sub
4 t; j9 y) W+ ]6 K'停止PLC
$ S, S8 q a0 H4 D" J0 ~( kPrivate Sub stop_Click()
% Z p1 ]' W& g) k4 }4 H, FDim strout As String
! n5 _( I2 ]/ X* P* Z/ S6 c' b) E/ ATimer5.Enabled = False+ q9 G3 u+ Y. M i! k- z
str = "00050C300000"
* b, H& \3 a Y, I8 f0 c9 VLRCC = LRC(str)) m8 l: q g+ ]5 W
strout = ":" + str + LRCC + Chr$(13) + Chr$(10)
+ R4 O- k' k" H' C6 v8 M0 _MSComm1.Output = strout3 B0 {$ I* L _: ]! I
Timer5.Enabled = True5 {+ \" W \+ v( ]" }
End Sub
1 e& I e) {' a& I! OY0、Y1的ON/OFF与PLC起动/停止的控制方式相同,指示灯的表示方式也相同。D256,D512数据写入的操作类似,限于篇幅其它代码就不再列出了。5 结束语4 ~9 B7 A% |4 g; D; E- W1 t5 `
VB语言易于编程使用,为与串行设备的通信提供了很大的方便。台达PLC采用标准的目前广为流行的MODBUS协议,为实现PLC与监控计算机的通信提供了简化的平台。由于台达所有的机电产品都支持MODBUS协议,所以,掌握了VB与PLC通信过程,也就等于掌握了PC与台达所有机电产品的通信。 |
|