|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
$regfile = "m128def.dat" '单片机型号头文件4 e1 {. W+ K, g3 x, [
$crystal = 8000000 '晶振频率; A; ?- G2 l; l" m4 R5 I
$baud = 19200
% h! p6 x& \" C8 Q6 q$ D2 B* S; q$hwstack = 256
# Y: f- m* k, m2 o3 a" V9 x$swstack = 256
* T- k& z1 x [/ U- z1 R$framesize = 256
3 G! j+ n0 K2 k9 q5 L$ v
6 G4 o" D2 N0 u$ [Declare Sub Send(byval Str_code As String); W2 [. a# N! n/ G% Q
) S& N4 N6 v0 t9 x) A+ o# }. I0 s
Declare Function Can_data(byval Std_mode As Integer , Byval Data_length As Integer , _
; |, |' u T: m3 r Byval Func_code As String , Byval Node_id As String , _
# g* N8 J- Y" W- [9 W- Y Byval Str_data As String) As String* E- z3 c; \. G5 o5 y8 c
Declare Sub Set_enable(byval Node_id As String , Byval Ctrl_mode As Integer , Byval Value As Integer)
1 f+ A4 k1 W U/ X8 @- i
5 m2 W. E8 V8 l3 R6 N, E1 I! hConfig Portd = Output
( B! K5 W& I$ A) _Const Std_frame = 1 '标准帧- s+ U! f' O" ~% W9 ?& M$ D
Const Ext_frame = 0 '扩展帧* Z: Y! t7 m# k3 @8 N
Const Position_mode = 0 '位置模式
- r; b6 s& J7 O( A6 sConst Speed_mode = 1 '速度模式
& E* M2 x3 }" }3 s8 E7 i# r7 {" {3 M0 u2 ^
Dim Can_code As String * 26# [! @5 U3 d+ L9 N+ a
3 [# @' ?' F7 }9 ~% h6 pPortd = &HFF O! Q1 B9 V" d1 H
Wait 1 _$ D4 S2 m; f F* {; q
'1号伺服位置模式上使能
! O5 o3 ~+ x7 j, [Set_enable "01" , Position_mode , 1
8 t+ v- V* U2 l- N7 ?3 L7 UPortd.3 = 09 O7 s+ o. _2 t1 y, X
Wait 1, K1 {8 U1 V7 k g2 n
'2号伺服速度模式上使能
& i/ h2 P! R" ~ M8 jSet_enable "02" , Speed_mode , 1* J- j" i/ K# }
Portd.4 = 0* j( \: X) W8 U
Wait 10% z2 R1 P$ y/ I" T ^. |$ i+ {
6 o D9 S; n" ~: R'1号伺服掉使能
7 Z C# Y1 J: f1 R! n& ISet_enable "01" , Position_mode , 0 f# a' x. [2 A N$ g/ Z2 L7 z1 \
Portd.3 = 15 R( x" W% O$ \4 ~# {" T
Wait 1
8 q! A u1 u. }# D! a3 i5 e" R+ ^'2号伺服掉使能) M" {2 ? d$ _
Set_enable "02" , Speed_mode , 0 ?0 t0 N; s+ k; t+ e7 s
Portd.4 = 1! K1 N; H' ^3 V) g8 S( C$ Y" B+ j
Wait 1
' M* W! h F& M9 n+ b& ]4 t( r$ n
1 H. i# u0 ?: l" M6 bEnd
% _( `" {1 Q) C" ?: B' K" F
* ~6 t7 l. A7 y'按值发送
3 G0 ^* X6 x" M* {0 h; u* JSub Send(byval Str_code As String )
+ ^5 j! I7 W! v6 q1 q" P Local I1 As Integer , Mystr As String * 4 , Mybyte As Byte , Length As Integer
% t) z7 ^+ C! @/ P) n+ S X Length = Len(str_code)/ V. X+ i7 C0 S& g. K5 q
For I1 = 1 To Length Step 2" o5 x; Y' o( J' b j k4 ]3 o
Mystr = Mid(str_code , I1 , 2)
0 L) E7 K& N# c9 N" w; e. L) X Mybyte = Hexval(mystr)
2 H0 P1 Y2 L& K% B! ^ Printbin Mybyte- e; W& f0 }, Q7 F9 B9 c1 g
Next1 ^+ x, ]* ^; }8 u! [) G% J
End Sub
7 {7 L3 m4 `: [6 f' Y. J
/ O! D1 \& r8 n+ b) j# A- W'Can帧数据Std_mode=1为标准帧=0为扩展帧,
: ?2 p! }5 n: P5 |# J'Data_length为数据区长度最大8字节,4 R: P. \ q9 L1 ]
'Func_code为功能码一个字节,
$ N8 ^/ o; U. L, J# [. ^. [% |'Node_id为节点ID一个字节,
, p2 R, b |+ `5 d+ ~. [( t'Str_data数据区十六进制字符串,最大8个字节
! C1 X7 A: H) v7 L- HFunction Can_data(byval Std_mode As Integer , Byval Data_length As Integer , _
3 h; G5 ?0 Q/ B! l( V# M0 o Byval Func_code As String , Byval Node_id As String , _
$ F) @2 l- u" D7 P F, C4 L5 R Byval Str_data As String) As String
7 w6 |- S, f: X; w, n
; T( N+ E4 a% ?/ L- @1 @( u E1 I Local Count As Integer , Str_code As String * 26 , I As Integer5 Z" o5 r8 n1 w' @" F
6 O3 @5 @6 k, R% V% E& B. }: C2 h$ A. L
Select Case Std_mode6 m: W# F' {, ^: h# i9 u& }0 G7 [8 x+ ~
Case Is = Std_frame
0 V4 e# M+ B2 `' Q, { Str_code = "0" + Str(data_length) '标准帧的第一个字符为0第二个字符为数据区的字节数(最大8字节)
$ W; I* G9 u$ S9 h Case Is = Ext_frame
@1 S6 i4 J2 S: k' B* l Str_code = "8" + Str(data_length) '扩展帧的第一个字符为8第二个字符为数据区的字节数(最大8字节)
3 F+ V1 S9 ?8 C) k4 L End Select2 Z7 U, {0 p1 o1 {+ {
, t, \! m1 L9 p" T Str_code = Str_code + "0000"% F* `; q! h& O3 x. G. D
$ C' G1 q. A' Z4 C& l1 M2 \! {
If Len(func_code) = 1 Then0 P& d2 m0 L8 V8 Q$ Z' E
Str_code = Str_code + "0"8 h- _- q* N; F1 A( {) A6 z9 w
End If
% S6 h4 L6 ?' P) t# w, n Str_code = Str_code + Func_code2 K) ?: G# V1 f- M
9 z q8 W' ?4 B, y9 Y1 e0 q2 d If Len(node_id) = 1 Then Str_code = Str_code + "0"
) X7 S. K+ M' v$ r5 h# v0 ~ Str_code = Str_code + Node_id$ r* ?& T: J a- s6 A, |* P
* c5 {! H0 w7 b Count = Len(str_data)
; M* R2 Q6 D0 M* b& o% O Count = 16 - Count4 ^7 i( ]' z: L0 p V0 P7 B$ k8 U
Str_code = Str_code + Str_data# Z/ s2 x' {, W4 F- P, {) R" D
For I = 1 To Count
* _6 M9 r* q9 N! ^ Str_code = Str_code + "0" c4 r" }0 p/ i+ A
Next I% Q' d' D. x* i: m; k1 K: ?6 r
Can_data = Str_code
* l6 X" {1 B) H8 l+ S$ ~/ o" H9 kEnd Function
' t: G1 h+ P) U9 s; M5 T+ X5 a: V/ i: D( m1 o
'伺服驱动器使能Node_id为驱动器节点ID,! v& J. P' p2 _& V. O4 e# |
'Ctrl_mode有两种模式,位置模式Position_mode = 0和速度模式 Speed_mode = 1
' t8 B; b) L& B) _'Value值设置非0为上使能,设置为0为掉使能
! ]. O6 `1 i6 w; }Sub Set_enable(byval Node_id As String , Byval Ctrl_mode As Integer , Byval Value As Integer)
" k/ b$ w/ v) [4 G1 U If Value <> 0 Then
! Z5 d9 K$ O+ A1 ~7 s '上使能0 {7 k2 E( f- T$ Q- e
'02 00 00 02 0A 00 00 00 00 00 00 00 00 '控制字清00 H# }( c1 X- N
Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0000" ) '获得完整can报文
( `+ P) b! f3 i+ t. G1 r. F Send Can_code '发数据
7 b) u6 H, _8 c Waitms 5) }5 W) p- Q3 e2 k( Q
Select Case Ctrl_mode8 s: X3 j4 y3 V9 @& q
Case Is = Position_mode
2 J) D! x8 Z2 j+ U$ ^% _2 L '01 00 00 03 0A 01 00 00 00 00 00 00 00 '速度模式
2 E6 ^- ]# c& r+ q Can_code = Can_data(std_frame , 1 , "03" , Node_id , "01" ) '获得完整can报文
, V1 E' o1 N6 g" X% B7 \# S, r Send Can_code '发数据, G5 p n6 b+ Y
Waitms 5
+ A, _& W! v. l9 ]7 c5 z x Case Is = Speed_mode% _4 j% c8 T4 |* t6 I
'01 00 00 03 0A 03 00 00 00 00 00 00 00 '位置模式
5 `5 Z$ R, l( Q' ^0 b; U) ~) C Can_code = Can_data(std_frame , 1 , "03" , Node_id , "03" ) '获得完整can报文! \ \; U% t4 X* r. T. p7 K
Send Can_code '发数据
3 @7 _4 e# f! D3 |7 W Waitms 5
! @' ^& o+ Y( V4 v/ b, _, C4 n End Select9 f* t% P# M& X1 E- Z
'02 00 00 02 0A 06 00 00 00 00 00 00 00 '始能第一步
- |# o1 v5 B$ n, D+ k- x Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0600" ) '获得完整can报文
+ {: j3 n$ d8 D7 R, h% A* z Send Can_code '发数据
6 j* W) i9 v5 ? x$ J Waitms 5* t% l5 F1 J% q* }8 u/ U+ d# i
'02 00 00 02 0A 07 00 00 00 00 00 00 00 '始能第二步4 m/ K; e" h* E. T, x* ?9 Q$ c6 S9 N, t
Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0700" ) '获得完整can报文
& s6 o8 ?, _5 ^( z% k1 P6 V3 B Send Can_code '发数据
: Y5 Y8 G* k2 H! b; M4 T3 ]8 W! d Waitms 54 p1 s& W- |; W/ d
'02 00 00 02 0A 0F 00 00 00 00 00 00 00 '始能第三步
) A) f% \! z- f- J ^. U Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0F00" ) '获得完整can报文' W. {8 o# S) e" Y0 k) s
Send Can_code '发数据+ w$ J4 R T0 u) `! l4 U. n
Waitms 5
% k \. K' }. n Else
4 O& f4 l0 C! e; l8 [( s '掉使能02 00 00 02 0A 05 00 00 00 00 00 00 00# J4 x0 w) ]' s' e$ q
Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0500" ) '获得完整can报文# U k+ {6 w3 h) Y, Z' ]
Send Can_code '发数据
+ Q6 u9 ?( g; Y2 M* E; a End If; t q* `/ ~' c
End Sub
7 a _; g/ I6 K" ~, J) b4 Y |
|