一、代码结构
( \- P5 K8 y& O& z+ n首先复制FreeModbus官网的协议栈里后缀为.m的文件,复制到自己的工程中,如下图所示:0 a2 w1 @: _0 U6 p+ W' w
8 l) [* d+ B! X: }' V- R4 H
+ c1 Q) f2 e3 G* g% m
# ~& \* U' B, t# q二、代码修改
! e% w7 c' {, X# B1 i) J) [! q* @. {2 W1.首先在主函数中调用初始化函数并且使能modbus:
+ ^) c) ?' E8 p$ V/ f. [- _3 y% i F, I
- eMBMasterInit(MB_RTU, 2, 115200, MB_PAR_EVEN);" u9 o* t- U! [. [
- eMBMasterEnable();
复制代码 & v. L9 Q, P# s, [7 @" i+ y
2.在一个大循环中调用eMBMasterPoll。
* ]' T4 R" t. c6 Q, p三、操作从机- usModbusUserData[0] = (USHORT)(rt_tick_get()/10);
4 o, _* |2 S, I' [+ @4 _" @: t - usModbusUserData[1] = (USHORT)(rt_tick_get()%10);
" D, S: L5 h3 s: L - errorCode = eMBMasterReqWriteHoldingRegister(1,3,usModbusUserData[0],200);
% X/ A% M* G7 l9 f' f( W1 @. i - & V4 m- w9 y, J, |+ z1 U% t
- // errorCode = eMBMasterReqReadHoldingRegister(1,3,1,RT_WAITING_FOREVER);
+ A" n* _8 ]" O( D n0 Q9 w3 B - // errorCode = eMBMasterReqWriteCoil(1,8,0xFF00,RT_WAITING_FOREVER);
, n# I1 b1 w A - if (errorCode != MB_MRE_NO_ERR) 9 w6 |9 a, `, ~$ V$ I
- {; E2 k* h3 _+ Q' N
- errorCount++;
$ ~0 [- \1 c' Q( a1 L- B - rt_kprintf("error\n");2 @$ }7 o! T8 X: s& E5 {
- }
" n$ \7 ?" g" Q3 n- }, c+ [ - else
- \" R' f( C* [ - rt_kprintf("no error\n");
复制代码
) @( r9 ^( d+ t# p- b2 T读取出来的数据在这几个数组中& e1 }+ ]% b' b) q: O! `9 I
& Q G+ E6 v1 N$ T4 K: p3 S- /*-----------------------Master mode use these variables----------------------*/; r" u2 W: m6 f' b/ h
- #if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0
. s+ K) I7 s( M - //Master mode:DiscreteInputs variables
^. u0 _3 ]' \3 ` - USHORT usMDiscInStart = M_DISCRETE_INPUT_START;
0 M& _. Q$ X1 l, E. M3 Z - #if M_DISCRETE_INPUT_NDISCRETES%89 J8 i' z1 h1 p' C0 m
- UCHAR ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8+1];
: j, v+ C9 G9 g7 Z - #else; w! \. ^# J0 w8 p
- UCHAR ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8]; {1 F0 n! C- Y+ f
- #endif
+ ~. v; T5 V$ F. F - //Master mode:Coils variables
' x% Y* p" n2 Y1 A0 R2 _1 ?6 h - USHORT usMCoilStart = M_COIL_START;
/ L. L3 V; R/ A1 r. W+ b - #if M_COIL_NCOILS%8: M( z( Q8 e* G; X; U* W
- UCHAR ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8+1];7 A3 y# N! L2 b$ B9 q" l* z
- #else
9 B1 l0 [0 M. l' \7 E - UCHAR ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8];; e0 T, K, N. Y& y {2 ]
- #endif
8 r: W2 ^) { h4 D, T) N! m6 x - //Master mode:InputRegister variables
# ?4 M+ e7 j8 N# y3 w3 H - USHORT usMRegInStart = M_REG_INPUT_START;1 v, e5 _* x1 _# H( N; R1 {# J
- USHORT usMRegInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_INPUT_NREGS];; D" O% b! R; G3 k9 F, g: _, G
- //Master mode:HoldingRegister variables w }' m: z1 g, ?' K4 M b
- USHORT usMRegHoldStart = M_REG_HOLDING_START;0 J- N e5 O4 }1 i& _: D
- USHORT usMRegHoldBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_HOLDING_NREGS];/ S! X! }: h& O" r5 b5 n2 E6 x
复制代码 : H6 }9 K6 e$ b' M2 P
四、注意点
" y+ |3 K6 ^% }/ L. T U% N; g4 Z* q1.只支持ID连续的从机。
. Q v, k* h/ v5 }2.下面的工程有问题:
9 |; B6 B+ T8 v( }a.读取从机的寄存器错误率比较高,是因为程序的问题。( E9 |! R" v3 q9 j+ F7 l% h& Y
b.操作从机的波特率比较讲究,除了115200,换其他的波特率程序会卡死。
* T; j) h9 l, \, oc.下面的工程仅供参考,不可在实际项目中使用。
& |# e% ~2 G! k/ gd.如果有大神解决了上面的问题,麻烦告诉一下,本人学习学习。
G. {9 f8 x1 m; z3 V# j! u
+ c* Q$ @9 W' `. w" H. S
) D& h3 d S# o; f8 n7 q
5 _+ f7 t7 S7 b8 h! E5 g$ D |