|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
$regfile = "m128def.dat" '单片机型号头文件7 t3 o X$ \6 H% C3 ~
$crystal = 8000000 '晶振频率
/ x& X6 H, ?% ?" \, m$baud = 19200- K v* u& H H5 @
$hwstack = 256
! E0 s8 K! v/ \* m$swstack = 256
" L) S: |/ l3 q; r) t$framesize = 256/ Y0 A) T) A. [. ?
0 q$ T: P2 d' e+ c/ Z: ^
Declare Sub Send(byval Str_code As String)) v" D' j% S ?1 j3 V* g, j
: e" Q* G, b, o6 ]" X. Y) j
Declare Function Can_data(byval Std_mode As Integer , Byval Data_length As Integer , _
, ~1 i3 B1 ?( S Byval Func_code As String , Byval Node_id As String , _; _" Q2 [# ?$ u& Y. i# ^
Byval Str_data As String) As String
* o' V! g3 p6 ]* P3 o u2 ZDeclare Sub Set_enable(byval Node_id As String , Byval Ctrl_mode As Integer , Byval Value As Integer)
0 @ e1 d( _( `. t
; A+ G3 R0 z& p' EConfig Portd = Output
* ]. n3 W5 y" H- H1 X* `Const Std_frame = 1 '标准帧 s5 D) R' z! e3 d
Const Ext_frame = 0 '扩展帧: T6 O+ m- ?. ?3 N: y, c
Const Position_mode = 0 '位置模式
- D) Y3 P9 F1 s) C; ` v* x, v1 H; QConst Speed_mode = 1 '速度模式
+ z- a1 t* Q5 n' J$ A0 F: ?+ y/ B$ v P; _4 o
Dim Can_code As String * 269 b% Y& K' G+ s& O
5 `% c6 ?8 ^5 BPortd = &HFF% C! N7 h. o6 b
Wait 1( N8 h: k0 L3 n c, O5 D
'1号伺服位置模式上使能0 j: l7 i& y$ `0 R3 S! V; c) o% k
Set_enable "01" , Position_mode , 1, w3 h/ q9 h+ h- w/ y
Portd.3 = 0
" L3 Y, f# D* R, gWait 1
/ X% {0 o/ k# w7 p: x'2号伺服速度模式上使能
: M. F0 @. X9 U* PSet_enable "02" , Speed_mode , 1
& K# c5 q# }6 V {* q3 z9 sPortd.4 = 0
% \! N( G: H3 O( U# e6 |8 h3 kWait 108 X+ {( T/ A/ }7 Z0 ~* x& }% c( }, P( `
; L3 e3 n: I: L/ ~' N+ `3 b* p
'1号伺服掉使能: H2 \& U( n' U
Set_enable "01" , Position_mode , 0
: Y* }( K- R* O, [8 K6 ^( jPortd.3 = 13 ]! X0 b% y g% O4 h5 A
Wait 1/ H; ~+ M4 U$ l) I" Z# H E
'2号伺服掉使能# c) b1 f/ ]. V5 S
Set_enable "02" , Speed_mode , 0+ v# t% L& Z0 P: h W9 H
Portd.4 = 1( ]% L) o2 W. l
Wait 1% `( `: Y3 W* N, p4 ~/ J6 w- G
8 a: e; D `$ x) {End: P# L+ F8 O) h$ ^. y5 s- ^6 Q
& _2 o% X; r0 M, l" i'按值发送
- |" W$ e# s1 \Sub Send(byval Str_code As String )' o. K. e4 S( C% C
Local I1 As Integer , Mystr As String * 4 , Mybyte As Byte , Length As Integer
4 N2 a3 B+ S% f6 Q2 C Length = Len(str_code)
$ N$ a, g& { v) k( W' ^ For I1 = 1 To Length Step 2
9 b8 P) t# [( { Mystr = Mid(str_code , I1 , 2)
5 a5 H3 L6 y% B( ?$ o; s Mybyte = Hexval(mystr)0 _( T) g4 _. Y+ a
Printbin Mybyte
; E3 o% T) d4 s$ d |- T/ @' F Next( Z/ t/ h( ?. R7 `
End Sub
, t! i$ |, S! i3 Z0 B
: X; n0 j5 s& V; `* A+ \# z'Can帧数据Std_mode=1为标准帧=0为扩展帧, v9 j: x4 U6 R' q1 [8 r
'Data_length为数据区长度最大8字节," X! L! R9 L5 r( g" i
'Func_code为功能码一个字节,; l) \1 n6 K6 t. I' ]) n& n
'Node_id为节点ID一个字节,
+ b. |* y- C p8 k* y- i'Str_data数据区十六进制字符串,最大8个字节$ M: T! [; J4 ]+ A4 p* Z8 }
Function Can_data(byval Std_mode As Integer , Byval Data_length As Integer , _
5 D0 @3 n8 f v4 U2 B Byval Func_code As String , Byval Node_id As String , _, B6 a( G" m( o' Q/ w# q7 o5 o
Byval Str_data As String) As String
0 U7 {. c% G1 I. \1 n: Q
% |4 d! N& i- V h, {! K Local Count As Integer , Str_code As String * 26 , I As Integer4 l; o9 W: Y& ?8 ]" G
! o0 D2 |6 o$ ^- B, Q+ h5 S Select Case Std_mode
7 j. k; C' G7 y( [: z6 g3 ~3 z9 a Case Is = Std_frame
& g$ G3 @) M& _7 Y6 K9 l7 @0 o4 k Str_code = "0" + Str(data_length) '标准帧的第一个字符为0第二个字符为数据区的字节数(最大8字节), _& ]; l; u+ \* p( p+ S3 m2 Q6 _
Case Is = Ext_frame
I6 v% K) n- V2 v Str_code = "8" + Str(data_length) '扩展帧的第一个字符为8第二个字符为数据区的字节数(最大8字节)/ S7 p2 |5 T$ |5 ~" q/ \
End Select
: l( b, @5 L1 ?3 Z$ R* r) G) U8 G& A; W+ K8 A; H
Str_code = Str_code + "0000"7 W/ G' k" |% _( n" H4 X& Q
- b% C3 n% r. X, ]0 g
If Len(func_code) = 1 Then
2 D1 R# }7 i3 Y& n; b Str_code = Str_code + "0"
- Y7 j- \" S1 M" t End If
2 d0 ?. T6 [. q5 W+ \" c/ N0 S1 J Str_code = Str_code + Func_code
! M$ b% l* z* J$ \" W+ Q( R& W& ~: {- k/ Z! H4 x% N% m; x2 `
If Len(node_id) = 1 Then Str_code = Str_code + "0"6 U) I' `! Y4 K+ Q3 w8 O
Str_code = Str_code + Node_id
+ d6 F% X E0 x* S) B6 ~- r3 c& Q9 G8 o9 p' s
Count = Len(str_data)( z/ f* c# K* M& A: x/ {* z
Count = 16 - Count
$ X" M$ c5 N* U6 z Str_code = Str_code + Str_data1 h+ B. a& J' }0 |" [0 h/ W% C* j
For I = 1 To Count
9 E* y4 ], o7 @! p( J$ _3 T Str_code = Str_code + "0"
( |2 {! [1 N/ a Next I
9 a, ]( P4 r, V$ _7 W9 _/ U+ u$ F Can_data = Str_code
! M% V( Y1 g. a+ S: {5 T0 W1 yEnd Function+ A( P- W& P s4 T" s
9 e5 G. L' z4 T/ |( [
'伺服驱动器使能Node_id为驱动器节点ID,1 B P7 ^+ D% h G4 L1 U3 X3 X* I; H/ Q
'Ctrl_mode有两种模式,位置模式Position_mode = 0和速度模式 Speed_mode = 1
9 `2 K r: q9 S2 Q; g; }& k'Value值设置非0为上使能,设置为0为掉使能7 G3 E# I2 Q% S# C( p/ D
Sub Set_enable(byval Node_id As String , Byval Ctrl_mode As Integer , Byval Value As Integer)
$ _6 h8 Q( ?. g0 w- C If Value <> 0 Then. m1 G6 O$ M9 C
'上使能
. O, S. u9 j( q* p8 v '02 00 00 02 0A 00 00 00 00 00 00 00 00 '控制字清01 R3 a. W( E/ a* B [& j% U
Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0000" ) '获得完整can报文
+ [) n f* U$ Y v Send Can_code '发数据
% v! ~6 L- z% g: N P, V( Y4 } Waitms 5- P# r9 \2 M! |, G
Select Case Ctrl_mode! s( x/ z1 f+ c2 n, [
Case Is = Position_mode% x( d. |6 O1 A3 E' F/ b
'01 00 00 03 0A 01 00 00 00 00 00 00 00 '速度模式4 f& t- i7 G, p [
Can_code = Can_data(std_frame , 1 , "03" , Node_id , "01" ) '获得完整can报文
, |8 t& T( b4 M: n Send Can_code '发数据
( `: R6 `6 S: t2 p+ [- B Waitms 5 |3 n7 ^' c+ Y
Case Is = Speed_mode% V% S8 |# [6 {- u, M6 r
'01 00 00 03 0A 03 00 00 00 00 00 00 00 '位置模式
+ n! C& E& \; f! I' O Can_code = Can_data(std_frame , 1 , "03" , Node_id , "03" ) '获得完整can报文# T+ K- V/ {8 \; _( M8 Z m
Send Can_code '发数据
4 M8 u4 W6 e: [" B$ i' u Waitms 54 n$ q. N% A$ ^& V
End Select9 y) {4 z2 N' {& Q2 V1 R
'02 00 00 02 0A 06 00 00 00 00 00 00 00 '始能第一步
: O, d" Y0 q2 F% } Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0600" ) '获得完整can报文
7 P6 b/ ]8 ]" O, u* p; [ Send Can_code '发数据1 O- j8 c& ^# ?( y8 @' `
Waitms 5: B& P# ~6 @9 ^6 N6 R
'02 00 00 02 0A 07 00 00 00 00 00 00 00 '始能第二步 Y5 y& a" z! H' S w1 ^
Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0700" ) '获得完整can报文+ p' Z* M5 z# K
Send Can_code '发数据" a& L7 r/ _- u* z; K9 f
Waitms 5
; X3 X1 m% p/ H4 k( ] '02 00 00 02 0A 0F 00 00 00 00 00 00 00 '始能第三步7 @: y5 J6 V2 }) d0 O9 ?9 z& Z
Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0F00" ) '获得完整can报文: N9 d' n$ D- w1 q0 G: X
Send Can_code '发数据, X: A6 U- ?7 D
Waitms 55 [4 C, X( c B0 N' ^. a. z
Else$ _7 \6 F# p( w% J( s
'掉使能02 00 00 02 0A 05 00 00 00 00 00 00 00
0 |% B- V6 C8 Q$ }1 V Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0500" ) '获得完整can报文) T' `5 m' ^) p% M+ k( ~
Send Can_code '发数据7 X7 ^$ ]8 W, B& s' M: \$ b
End If7 m7 z' M+ _0 D2 f y: a
End Sub
% A. Y& Y+ P7 b. z. L( Q/ O9 ^ |
|