首先我们下载FreeModbus源码,然后放到自己的工程中,新建一个MODBUS_TCP和PORT_TCP文件夹,然后将相关文件复制到里面,如下图所示:
* x; [, j* ~# f( o( J" p" y; N
# q) k" n1 R# e* V' j: N! k: }* V+ c$ V2 J
然后修改porttcp中的代码:# j9 l% O/ Z" ^; c1 |& b
首先定义一个数组用于接收数据:- static UCHAR aucTCPBuf[MB_TCP_BUF_SIZE]; //接收缓冲区
复制代码
- l7 S! y& a7 Y3 ~8 p E然后在xMBTCPPortInit中初始化socket连接,然后监听端口。/ j. Q" C3 z) W4 V' k: S v$ s/ i
9 Y+ r+ ~% B; o0 _! [
- BOOL# V. j) U1 r8 e1 z+ ] X+ W
- xMBTCPPortInit( USHORT usTCPPort )
5 X9 q, i7 G2 Q1 J6 O - {
1 ?& V, }" I% V1 ^' N! L7 J: r5 L7 U - BOOL bOkay = FALSE;; {9 u* t3 Z, e' I6 H- y3 `( i& A
- % `, z: ?( p. r. I+ x4 @" |
- // 侦听端口 Modbus-TCP 端口
! `: r" b C8 N) J. a( p - socket_init(SOCK_TCP_PORT,Sn_MR_TCP_TCP,local_tcp_port++,Sn_MR_ND_TCP);
8 t0 j5 _+ @; k3 A0 H1 p9 A - listen_tcp_socket(SOCK_TCP_PORT);! N- Q3 n& h8 P# F) J {% l- c7 V
4 q0 |$ @! C& x+ i/ P- bOkay = TRUE;& ?1 k! m0 w% U5 B- ? O
- return bOkay;! m4 A) s3 r* O# l; U H
- }
复制代码
; T2 c1 y: P' U& j) W H( @然后在xMBTCPPortSendResponse函数中发送数据
: k0 O) z+ S: H: W% U4 D- Y9 k! P' M+ V! K5 y6 h9 T2 U p
- BOOL
, _0 s n9 r, s6 A; l: [5 ]3 ]1 } - xMBTCPPortSendResponse(const UCHAR * pucMBTCPFrame, USHORT usTCPLength )8 C, T2 D, w8 L5 v3 R0 }8 B" c
- {: U( I# ?4 C4 e' l
- send_tcp_socket_data(SOCK_TCP_PORT,(UCHAR*)pucMBTCPFrame,usTCPLength); 4 C% w& L; b. |1 \ o6 j+ L3 X7 R% k7 W
- return TRUE;2 f' u& l" I5 y1 p' `
- }
复制代码
9 J9 Z& B+ `: |' O- L7 J o然后在xMBPortTCPPool执行接收和其他操作# z8 c, R; [+ V7 Z: J8 J; \
' D3 T$ Z/ Y' J7 K0 h- BOOL
@5 }+ H3 Y6 `0 i- s5 F; r - xMBPortTCPPool( void )
5 {" c" A* H2 A+ I6 k2 p7 S7 l( G# F - { - r+ {1 H! H q) W
- unsigned short int us_rlen;* y! {8 v7 P2 f/ M: R6 B( F2 d! O
- unsigned char i;
+ w) \) _5 z/ G: K3 `9 ] - i=get_tcp_socket_state(SOCK_TCP_PORT);
2 O1 y& n A6 n$ D3 E4 m
) C; M; u0 x# I+ x" n o( g' p- if(i==SOCK_ESTABLISHED_TCP) E/ r* n* V8 ?$ l% t1 ?
- {+ \$ e4 `5 Q4 |9 ?- o. _
- if(get_tcp_socket_irq(SOCK_TCP_PORT) & Sn_IR_CON_TCP) //查看中断有没有发生
- @4 [5 E5 S- F# `; ?" U) V - {
) J% ^+ x4 S) a$ K5 o# Z - clear_tcp_socket_irq(SOCK_TCP_PORT, Sn_IR_CON_TCP); /*清除接收中断标志位*/
1 P- w k' o! S# E K - }$ t w" F0 E+ y$ h
- us_rlen=get_tcp_rx_buffer_size(SOCK_TCP_PORT); //获取接收到的数据字节 /*定义len为已接收数据的长度*/! o6 a% u. H' n$ U x0 r
- if(us_rlen==0) //没有接收到数据
! Y) M9 j; S! E v* s$ V - return FALSE; //返回 I" A; [( B5 {
- else
r( T; V8 V5 b) C6 k) d9 C - {
5 ~7 j k& F0 ?7 J! m2 ]0 |/ _ - recv_tcp_socket_data(SOCK_TCP_PORT,aucTCPBuf,us_rlen); //接收数据 /*接收来自Server的数据*/% b) p( x& p* E1 b+ {
- printf("receive\r\n");
( S. i& |: l, o \. [ - usTCPBufLen=us_rlen;. v R$ t1 Z( P, O) R5 _' _4 N
- }* ?4 G) V- n9 P( }4 ?
- ( void )xMBPortEventPost( EV_FRAME_RECEIVED ); //发送已接收到新数据到Modbus-TCP状态机; H5 e( e) b& i- F8 o0 }
- }
/ S7 r+ p8 u! U - else if(i==SOCK_CLOSED_TCP) //如果socket关闭8 g; f, w5 i0 e( P O
- {
: ~9 k, f; H* I/ e- N - socket_init(SOCK_TCP_PORT,Sn_MR_TCP_TCP,local_tcp_port++,Sn_MR_ND_TCP);//重新初始化' a6 J) Z) f9 W0 G& x
- }! s- K3 I% i, t2 q
- else if(i==SOCK_INIT_TCP) //如果socket初始化完毕,监听端口9 B, S( o6 T6 M8 ]: m% k
- {( J0 s) N% e/ ~0 s, H
- listen_tcp_socket(SOCK_TCP_PORT);
}! B% J* c- [$ u, N0 e% r - }
5 Y3 M( [. ]) I - else if(i==SOCK_CLOSE_WAIT_TCP) //如果socket等待关闭,关闭socket连接
8 t% @, t! J" b0 j1 ^) i - {9 @4 U9 P8 u9 `2 ^
- close_tcp_socket(SOCK_TCP_PORT);- I- M2 P! ?# @" ?, \* L
- }
) v6 U* B6 r5 `1 A2 s" `) Z8 R# @0 F
% F; y! s9 q7 |# M! b0 C- return TRUE;. w% p1 G3 S5 K, C6 A$ s. x
- }
复制代码 ( P5 G. F: x. K
其次还要实现读线圈、写线圈、读离散输入、写保持寄存器、读保持寄存器、读输入寄存器等功能,如下:
: p. u. T8 T7 S* w) `( s! \6 Y1 d- N; m6 b% v
- #define REG_INPUT_START 0x0001 //输入寄存器起始地址
% N5 D; d, d7 U ]. S - #define REG_INPUT_NREGS 8 //输入寄存器数量% j {& \1 _; H* f
- 6 D3 c: I! L3 h
- #define REG_HOLDING_START 0x0001 //保持寄存器起始地址
- n: ?. B: H, ~* J5 }7 |3 Y. e - #define REG_HOLDING_NREGS 8 //保持寄存器数量 H* n& @- G: q! P: {
- g9 Q: h9 B- b- K& f) `; `6 t
- #define REG_COILS_START 0x0001 //线圈起始地址
. I" W7 g( f) [+ O - #define REG_COILS_SIZE 16 //线圈数量
% Q4 B" }, w7 i( N
# o' o+ C3 u* s) _0 ~0 p- #define REG_DISCRETE_START 0x0001 //开关寄存器其实地址, |& g' G3 @3 U) k" j
- #define REG_DISCRETE_SIZE 16 //开关寄存器数量
4 M" j2 L+ n+ p. Y - //输入寄存器内容
0 E8 A' H' Z" }. A$ J' p) O3 n& E- ^ - uint16_t usRegInputBuf[REG_INPUT_NREGS] = {0x1000,0x1001,0x1002,0x1003,0x1004,0x1005,0x1006,0x1007};
, t' D2 ~6 u5 ~0 t# @ - //保持寄存器内容
, {* L1 h0 h6 c* j( F. H - uint16_t usRegHoldingBuf[REG_HOLDING_NREGS] = {0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007};
0 w% i8 g& p s `6 _ - //线圈状态5 J4 H- u% q. |
- uint8_t ucRegCoilsBuf[REG_COILS_SIZE] = {0x01,0x01,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00};7 M: j; m0 `* O1 d Q
- //离散寄存器内容
" h+ d; Y$ o% @2 J' l - uint8_t ucRegDiscreteBuf[REG_DISCRETE_SIZE] = {0x01,0x01,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x01};
+ M4 |4 e" J" B0 Z/ N! }
3 t' K/ d# s C. Y% A5 W- /****************************************************************************$ }; q0 b% n' h
- * 名 称:eMBRegInputCB
0 G+ T; L; o6 O5 |/ W& M) D - * 功 能:读取输入寄存器,对应功能码是 04 eMBFuncReadInputRegister& W+ f1 _" \+ ^( t
- * 入口参数:pucRegBuffer: 数据缓存区,用于响应主机
, v2 y, D& L% d1 N; A+ {! P - * usAddress: 寄存器地址2 j l. O, x3 {1 C& J; G
- * usNRegs: 要读取的寄存器个数8 ~ j& Z. l9 `: L1 x/ S
- * 出口参数:" Q+ E& J' \: R# d4 [* h
- * 注 意:上位机发来的 帧格式是: SlaveAddr(1 Byte)+FuncCode(1 Byte)
& @# N" ^7 T8 l# J - * +StartAddrHiByte(1 Byte)+StartAddrLoByte(1 Byte)( i) `6 M t5 x; [3 H0 k
- * +LenAddrHiByte(1 Byte)+LenAddrLoByte(1 Byte)+
6 O& y' { O( l# {! S4 S3 Z5 c - * +CRCAddrHiByte(1 Byte)+CRCAddrLoByte(1 Byte)7 M& L& ^8 f& M+ L8 A! u% a4 V
- * 3 区
8 e! Y r# ~1 C - ****************************************************************************/" o+ J; B0 k; @
- eMBErrorCode! X! M% g: d& C0 @7 ~1 q- B2 m
- eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
. L, M3 h/ [% i. Z - {
+ N4 f- A, | s8 y, L - eMBErrorCode eStatus = MB_ENOERR;/ j7 C' v' g6 l+ Z
- int iRegIndex;
* y+ r4 u) W6 H% u
, u; ~0 I; J& Q( z4 U- if( ( usAddress >= REG_INPUT_START )$ V. m6 a$ _8 f
- && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )4 X9 c5 c9 ~) r _) V
- {
O/ U+ T1 K' K0 |5 {3 B, J - iRegIndex = ( int )( usAddress - REG_INPUT_START );! W& F* {5 Z/ Q# c1 ]) ^; ^
- while( usNRegs > 0 )& ^8 e. B+ {7 j$ k; B
- {0 d- R, P) Y* e, V
- *pucRegBuffer++ = ( UCHAR )( usRegInputBuf[iRegIndex] >> 8 );
6 `$ V" v; a# q9 t4 }7 \ - *pucRegBuffer++ = ( UCHAR )( usRegInputBuf[iRegIndex] & 0xFF );
7 I7 B' O# I& | - iRegIndex++;4 D: W! I2 A2 x& N4 C7 L
- usNRegs--;) z' l: r* v9 V6 K/ \5 y7 Q6 q
- }! ?! d. m: w- d3 I( z
- }
4 {/ ^) \) M2 `0 b - else
& A# q3 P( S4 j( g6 m - {7 ~. y) y6 T2 e7 Q3 Q% P
- eStatus = MB_ENOREG;
3 [5 T2 A- ~) Q5 M% y+ } - }" `) u& C0 N- n! a/ p5 q
0 F6 m W# b+ M' ]) g- return eStatus;
9 F! F- ^6 w% }3 h' Y4 u9 ] - }
4 L+ q$ ` U1 d1 S3 O# Y, K - d4 z f. Y" [3 h- p5 m
- /****************************************************************************& T4 j \/ F+ I; g3 }4 L
- * 名 称:eMBRegHoldingCB ' D+ Z. i! g5 g9 l
- * 功 能:对应功能码有:06 写保持寄存器 eMBFuncWriteHoldingRegister ) H& F, Q1 P9 b1 x0 W
- * 16 写多个保持寄存器 eMBFuncWriteMultipleHoldingRegister
: S6 w) V8 P; U8 @: b' G4 n6 m0 D/ u - * 03 读保持寄存器 eMBFuncReadHoldingRegister/ C* I& q& m! H J0 D
- * 23 读写多个保持寄存器 eMBFuncReadWriteMultipleHoldingRegister
9 R1 {7 X2 b' _$ ?. x6 `( |6 N$ P - * 入口参数:pucRegBuffer: 数据缓存区,用于响应主机
5 N& N2 l% |! ]2 K& g - * usAddress: 寄存器地址
% \0 Z, \/ O @7 X3 X( G - * usNRegs: 要读写的寄存器个数
. A: O s# S' h! o! x# s - * eMode: 功能码/ n1 _) G- i9 ^: b
- * 出口参数:2 ^4 Q. B. }! ?: B. o& i
- * 注 意:4 区/ X( _0 o7 k( c" V! q) R
- ****************************************************************************/
* s1 a! d1 ?4 r7 ~/ q - eMBErrorCode
3 M q, r& G3 u- m- C - eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )' k/ m; I4 T/ L c+ h/ \3 l
- {
3 Q. j' ?" X1 ]8 q - eMBErrorCode eStatus = MB_ENOERR;1 E/ v- d* p8 O% |7 Z; I3 b0 H2 N/ K
- int iRegIndex;
% X1 l. c5 U) G9 b' ~" l - ! G6 ?/ J& c: v- |- y! C% x, j+ L
- ( F+ B! [1 t! o% w |/ F$ h. d
- if((usAddress >= REG_HOLDING_START)&&\
* ~* m* K5 A6 I; m. s' Y - ((usAddress+usNRegs) <= (REG_HOLDING_START + REG_HOLDING_NREGS)))2 R9 d# k/ v' Y9 V9 k
- {; r, o2 b1 }2 h7 t+ G4 K
- iRegIndex = (int)(usAddress - REG_HOLDING_START);
9 B1 m' d/ c- P$ X - switch(eMode)
+ M1 B4 c" _$ n3 v& I - {
) W0 k9 g+ T4 E# d# l0 f* W - case MB_REG_READ://读 MB_REG_READ = 0% n( h2 ^! M2 f" C
- while(usNRegs > 0)& r }# H. j& u$ _5 K) U, f% W
- {- R; G2 Q2 |8 ^0 `0 E
- *pucRegBuffer++ = (u8)(usRegHoldingBuf[iRegIndex] >> 8);
! E* C* ]5 h" ]1 v1 Y - *pucRegBuffer++ = (u8)(usRegHoldingBuf[iRegIndex] & 0xFF); 3 Q( S( n3 I3 d
- iRegIndex++;
: o" ?3 b- P$ }: G8 K0 n: G V - usNRegs--; 4 I! [% q' T$ Y
- }
1 K* [; C# E5 d1 F0 ^ - break;
5 b! v+ @% w" @+ @( p6 s - case MB_REG_WRITE://写 MB_REG_WRITE = 0
3 F' }! i J; E0 C - while(usNRegs > 0)8 h, j( p6 E8 v
- { * }2 N* f! ] a( q' M& |) g
- usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;
- g g% a" Z+ k- ]' F3 T3 N - usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;% O( M& e$ P: E
- iRegIndex++;0 N7 _5 q# _# ]/ P0 v9 C: d
- usNRegs--;8 I9 U- f. m( m$ S/ _0 I- ^4 v' f
- }0 f& V# S* {5 x7 h9 q6 q. ]
- break;
2 G8 j1 x A$ y - }
; {7 h. C2 {$ N# x( [ - }6 G4 {& @. k4 o' p, I
- else//错误
+ Q8 S* i) x, g - {
: s; C- l0 V6 `4 r: h6 G - eStatus = MB_ENOREG;
1 g) ~( k1 \( T( ? W5 H3 G - } 4 O9 c, n9 I: N6 b1 @: L
-
0 B, R8 L9 o# c5 M o3 b' z, ] - return eStatus;
/ Z7 O( B0 s m6 i! l# b* ~ - }
3 n9 v* ^* b5 n1 Z4 c( O$ d* G- K - 2 q% X$ m! i# k% G
- /****************************************************************************7 d( r: e# o% P
- * 名 称:eMBRegCoilsCB ! T$ q, ?# y$ \3 I+ C
- * 功 能:对应功能码有:01 读线圈 eMBFuncReadCoils [ @( Z( u. K" J
- * 05 写线圈 eMBFuncWriteCoil0 O! x1 J- P' H* m9 O9 \+ p
- * 15 写多个线圈 eMBFuncWriteMultipleCoils
% X3 l7 C5 S1 s0 J0 g# `% H5 ~6 N - * 入口参数:pucRegBuffer: 数据缓存区,用于响应主机
$ R3 }) V) L' A; G# s$ o; I - * usAddress: 线圈地址
: v: n6 z# `% k% x9 S8 A, C - * usNCoils: 要读写的线圈个数
i4 r3 p3 p) g6 A# E - * eMode: 功能码
3 D7 @6 W/ B/ _4 o7 M: t, [ - * 出口参数:
& |, K- Z1 \% _ [- X - * 注 意:如继电器 8 W+ [5 w$ I8 x8 g: m
- * 0 区
( }- R8 \2 h( w. V - ****************************************************************************/1 s: Y& C! n5 ` K+ E6 F, d
- eMBErrorCode3 U' G6 z% L3 U' A$ p$ V; T8 r
- eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )4 x. X" p( k- G9 f0 S1 A* \
- {* M8 _8 v1 F9 q7 a
- eMBErrorCode eStatus = MB_ENOERR;
# z I/ U) e+ [1 r3 `. x. V8 o - int iRegIndex;- t# B( X9 b; A0 H1 x, s/ s) ?
- u8 i;
2 W* f; B1 U8 b9 L# |# ?% {$ H - USHORT readNumber=usNCoils;8 H5 A* X( V8 H$ a
- USHORT coilValue=0x0000;* o. F/ |7 ^$ P' M9 A( m( A
- if((usAddress >= REG_COILS_START)&&\. B" M) u8 ]; Y0 a
- ((usAddress+usNCoils) <= (REG_COILS_START + REG_COILS_SIZE)))
2 ~; x% s5 _% z. Q/ m - {
5 I7 N- ~- b$ x/ Y% S - iRegIndex = (int)(usAddress + usNCoils-REG_COILS_START);' @* `! I: a1 p# q; o: X
- switch(eMode)
+ S- F5 S4 J E5 y9 {9 C; I4 i' p - { 7 O( X1 X& r7 x6 Y" q
- case MB_REG_READ://读 MB_REG_READ = 0/ ~0 n6 D" W3 `" j' e
- for(i=0;i<usNCoils;i++)
( t! U; a4 w; e8 E& j: r2 }7 z' o$ B - {
/ y0 v' V0 a. h$ P - readNumber--;% T3 h% J9 |, ]& N8 V k
- iRegIndex--;4 v, x( x1 H$ k1 P4 {& [7 G
- coilValue|=ucRegCoilsBuf[iRegIndex]<<readNumber;$ }3 s* l1 b% S! `% O# g6 T
- }
! Z. g/ X, |+ D$ K - if(usNCoils<=8)
+ }. {& c# C R% Y& a - {( O, N/ y# ^1 Y# J0 x/ @
- * pucRegBuffer=coilValue;
& C0 p, N. |9 O. Q4 u - }
" E) C/ \3 }* c4 S" r$ _5 k - else7 @) j3 N' q% e& Y) {
- {/ I& t& ]# T x% s7 F! h3 h
- * pucRegBuffer++ = (coilValue)&0x00ff;6 c2 Y* l) z& O) C
- * pucRegBuffer++ = (coilValue>>8)&0x00ff;
4 j! K4 x8 P1 ^! t8 i0 [; q - }9 F+ Q7 i6 Z5 q& _9 }
- break;
# G" Y! ?) \9 Q0 k) w# m7 O - case MB_REG_WRITE://写 MB_REG_WRITE = 1
7 M0 s3 T5 J7 t- J# |2 x/ G! N - while(usNCoils > 0)
- f2 w4 t" G, \ - { * V% ~0 y4 B' p3 L& ?2 {1 E% g
- // usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;6 O5 V% z3 b: w
- // usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;
& s9 Z/ f. ^9 N9 C8 o- L - iRegIndex++;
( z9 O, t8 S5 l% q% H- \! o$ t/ G - usNCoils--;
, T4 [9 i0 P/ O! I9 I - }
" S# \; Z6 N# X. d. ]: x1 y - break;% t& i) L- h1 `! E6 ^& x6 d/ r) K
- }
8 {1 J- X P3 |4 B0 m, x - }4 D1 \, ^7 x- x2 \4 A
- else//错误
8 ]2 E; F8 w& V/ P6 ^! a- t% d - {
0 G; r- x; ]5 N' [ - eStatus = MB_ENOREG;
1 [' G( v7 e5 y" ?- c1 F4 U - }
- a: V- L8 g2 V! T. r: A
: W( {3 b: I9 T' |- return eStatus;
2 q2 G5 x+ {! M9 ` - }$ \6 G. |0 {& o8 t1 t
- /****************************************************************************
! C* | {7 x' [3 T$ w$ s - * 名 称:eMBRegDiscreteCB % y+ x j4 u$ O& q( z# Z' j2 H& D
- * 功 能:读取离散寄存器,对应功能码有:02 读离散寄存器 eMBFuncReadDiscreteInputs
) C- t$ s3 e* y8 x) ^( E% p! p - * 入口参数:pucRegBuffer: 数据缓存区,用于响应主机 " I5 z, X& k% D0 ]& C
- * usAddress: 寄存器地址# T- H) E& q0 O7 V3 U
- * usNDiscrete: 要读取的寄存器个数9 {4 n6 x4 o# y
- * 出口参数:" l! E$ E) E" y- Q: w
- * 注 意:1 区
, R* k3 e2 b* g9 d! L' |7 I9 j( J - ****************************************************************************/
7 }/ B% W5 K/ x( d3 Q - eMBErrorCode4 \: H. a2 z/ k; w% W$ ~1 W/ r
- eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )/ {" u$ x8 c# O8 U5 t o' Z5 E
- {1 g) c1 l/ ~2 ^6 b& p
- eMBErrorCode eStatus = MB_ENOERR;+ \% f* C4 h: T' P
- int iRegIndex;& _; v9 n) i* Q9 w: O4 P. k
- u8 i;
4 Y$ ?- @6 }2 c" _& } - USHORT readNumber=usNDiscrete;7 ? @. x) z) o( B9 O
- USHORT coilValue=0x0000;2 M" x" b x& b
- iRegIndex = (int)(usAddress + usNDiscrete-REG_DISCRETE_START);( V6 j( n4 s; n) q
- if((usAddress >= REG_DISCRETE_START)&&\
6 A" x, U1 }& Z2 Q6 j+ a) G1 R3 B - ((usAddress+usNDiscrete) <= (REG_DISCRETE_START + REG_DISCRETE_SIZE))), ]1 y3 B7 X- ?/ g# B' I- M
- {
4 J, V0 O4 [0 m7 \ - for(i=0;i<usNDiscrete;i++), T N+ ?! R5 |$ P4 e9 \" e' A) ~4 s
- {9 T/ F0 z) Q8 i3 m0 R
- readNumber--;
) L6 `$ B# B- r1 j$ e - iRegIndex--;
8 n! R3 \$ t5 M" G3 ] - coilValue|=ucRegDiscreteBuf[iRegIndex]<<readNumber;
0 i8 t! X7 m6 h& ]) o) }7 R+ { - }- q2 M& S% y5 N5 r5 s9 U( \3 r+ N# \
- if(usNDiscrete<=8)$ n' P, z$ q2 z) ^9 v
- {
) l7 |& @ v: ] - * pucRegBuffer=coilValue;8 Q4 k; H5 k4 P; ~# S& y
- }- e* x* w- w; v- w8 B' P
- else
$ b5 X" A/ v' `7 Q4 J - {* m& ^/ J0 a# e2 T5 a
- * pucRegBuffer++ = (coilValue)&0x00ff;/ r. d7 E( ?1 }' w3 j
- * pucRegBuffer++ = (coilValue>>8)&0x00ff;) s( K" k8 @! c& X
- }7 W4 I5 U" l% L3 X
- }
. I1 o7 O( S& ^9 y! w - else6 ]+ p+ \% w. \2 A9 X
- {
" J5 u2 D# \4 x6 a) h - eStatus = MB_ENOREG;3 \' Y; ^4 y# X( U# g
- }
; s) i2 Q, M9 L* Q - return eStatus;% V9 B% x- H9 X
- }
. m7 n. a2 N8 \ H
/ Y# m5 y- a% D! ~- N- / b6 ]4 O, S u1 Y% S4 F) a5 Z, s9 x
) w2 }' z# N; r( T4 M2 E- . d! j' g% E/ l4 N* b% Y
复制代码
- Z2 [: ~( `& j* Y) }* l7 y: s$ z8 @
|