首先我们下载FreeModbus源码,然后放到自己的工程中,新建一个MODBUS_TCP和PORT_TCP文件夹,然后将相关文件复制到里面,如下图所示:
! r& u6 n, e! b2 }% X) t1 L
& u, H7 c7 N8 [. u& |- n
* E! t! |& L5 I( F1 K9 w
然后修改porttcp中的代码:; k9 J: [0 u$ O5 s! J
首先定义一个数组用于接收数据:- static UCHAR aucTCPBuf[MB_TCP_BUF_SIZE]; //接收缓冲区
复制代码
4 c, p% Y8 \& M然后在xMBTCPPortInit中初始化socket连接,然后监听端口。 V+ R% J! W0 C
\9 P& c/ v9 b9 c! ^- BOOL
: B+ l* p4 O) e! o; W - xMBTCPPortInit( USHORT usTCPPort )4 N5 d& j; \$ j
- {
4 p, B4 J# U% @/ | - BOOL bOkay = FALSE;
* w% ?: A( X$ s" h! E% f0 G) T7 [6 K - 1 p$ M: F# { \: m: w& F
- // 侦听端口 Modbus-TCP 端口
% Y0 T- U6 w Y2 Y' i' s" P - socket_init(SOCK_TCP_PORT,Sn_MR_TCP_TCP,local_tcp_port++,Sn_MR_ND_TCP);
4 M' F2 l4 P9 M8 @( W& h7 J - listen_tcp_socket(SOCK_TCP_PORT);
! S! A7 f; {8 B9 P
6 X2 Y5 s. M) A; | |- bOkay = TRUE;9 b. s, l W2 V' j/ f! s
- return bOkay;% R3 S3 R5 _7 ~ T$ m( _3 O' U
- }
复制代码 4 H$ n) \7 }3 p) o; C W
然后在xMBTCPPortSendResponse函数中发送数据: D# u. z9 W! w* p2 q
$ o+ j# e- A5 L" T: A9 M$ e
- BOOL5 H, i: o K& T- z( e, `2 ]
- xMBTCPPortSendResponse(const UCHAR * pucMBTCPFrame, USHORT usTCPLength )1 H; S$ [! q$ `2 Y
- {! x! ?2 h! V5 z# V
- send_tcp_socket_data(SOCK_TCP_PORT,(UCHAR*)pucMBTCPFrame,usTCPLength); # I$ N+ V1 K7 J+ U! c
- return TRUE;8 ?1 y" _) f0 Q
- }
复制代码 7 U+ }0 P4 K% o4 k
然后在xMBPortTCPPool执行接收和其他操作
. K8 E# Q$ b+ K; r' |
- O8 ~; D( \! G; z7 N7 u8 U! t- I- BOOL
) E3 e7 L0 F% d9 ]* S& Y! V - xMBPortTCPPool( void )) Q/ U. _5 l' f1 B* q; x# m: J
- { 9 H5 ~1 U8 r( Q* P7 [
- unsigned short int us_rlen;5 P3 M2 U$ L0 M2 X' ^3 a; c+ D. T
- unsigned char i;& U( c1 P2 C& f" r
- i=get_tcp_socket_state(SOCK_TCP_PORT);
x0 T: [/ e* Z8 M7 {
& _4 f) ]5 ?; C3 c1 I- if(i==SOCK_ESTABLISHED_TCP)
8 T% P0 f: p9 u - {
8 ^# D F) W( S' Z& o) W - if(get_tcp_socket_irq(SOCK_TCP_PORT) & Sn_IR_CON_TCP) //查看中断有没有发生
. ~4 o" T, t* D - {
$ C, f- f4 u4 ]7 E6 j! ^ - clear_tcp_socket_irq(SOCK_TCP_PORT, Sn_IR_CON_TCP); /*清除接收中断标志位*/
. Q: i v1 N* s# q) Y - }
; G; o2 `6 R7 P+ M0 z - us_rlen=get_tcp_rx_buffer_size(SOCK_TCP_PORT); //获取接收到的数据字节 /*定义len为已接收数据的长度*/$ Q, X/ \" X/ b
- if(us_rlen==0) //没有接收到数据
' O% N9 e% c/ T/ _$ y$ E w - return FALSE; //返回
3 t' T [# r- i- O) S9 `5 l - else( D6 H4 H/ D' P# c$ }0 E0 W
- {
' P `/ i& r$ V8 w+ O - recv_tcp_socket_data(SOCK_TCP_PORT,aucTCPBuf,us_rlen); //接收数据 /*接收来自Server的数据*/! }0 o. t/ b* F4 X8 o
- printf("receive\r\n");
2 n' @! ^, J, g5 f" v; u t) T& o+ ^ - usTCPBufLen=us_rlen;
7 ~- ~) v0 e5 c0 N. R" c1 S" L - }
1 y8 @" f/ \' T7 n+ O& y - ( void )xMBPortEventPost( EV_FRAME_RECEIVED ); //发送已接收到新数据到Modbus-TCP状态机4 C i' o' U" s3 u& j
- }
0 G8 G4 B2 d; r3 W! O. q - else if(i==SOCK_CLOSED_TCP) //如果socket关闭
7 z' R' \2 M8 J+ @* n9 d - {9 w) X p* ^. U" h
- socket_init(SOCK_TCP_PORT,Sn_MR_TCP_TCP,local_tcp_port++,Sn_MR_ND_TCP);//重新初始化
. ?1 i+ \) Y) ~) u7 e- p - }
. ~: A& F6 d+ j( y J - else if(i==SOCK_INIT_TCP) //如果socket初始化完毕,监听端口
* a# Y. @0 b S3 l2 g - {) u% s/ Z3 l7 i
- listen_tcp_socket(SOCK_TCP_PORT);; l6 d1 X2 u. W- T. o
- }! C3 D0 {8 V3 I. k
- else if(i==SOCK_CLOSE_WAIT_TCP) //如果socket等待关闭,关闭socket连接! o2 |" l# Y7 ~9 i
- {1 T4 g1 G- u/ M( m
- close_tcp_socket(SOCK_TCP_PORT);4 k3 T, h2 e* P) O% [" J5 C
- }
6 D+ W" p: T: \$ t
$ W: X5 O- f g& y# m7 J- return TRUE;
. N/ V$ R6 _: H" X% Y; n" w1 `$ V' J - }
复制代码
( i0 g) e" I( j% d/ ^7 K7 a0 T其次还要实现读线圈、写线圈、读离散输入、写保持寄存器、读保持寄存器、读输入寄存器等功能,如下:
: A3 J1 ?* {. \$ R$ }& {/ B# e# ^) O4 }; v+ j# R1 w
- #define REG_INPUT_START 0x0001 //输入寄存器起始地址
5 i2 n# k4 }& }" e: r& p - #define REG_INPUT_NREGS 8 //输入寄存器数量, Z6 ]) J) z8 i) E3 Y! N4 r
) \. L# \4 {& H" l- #define REG_HOLDING_START 0x0001 //保持寄存器起始地址' _3 G; d% ]: t9 h1 p
- #define REG_HOLDING_NREGS 8 //保持寄存器数量. ]5 U, v3 a* r2 ]
- 0 M. y7 a* a" C- j5 V
- #define REG_COILS_START 0x0001 //线圈起始地址
3 l/ i/ }6 f1 o* [" t: q - #define REG_COILS_SIZE 16 //线圈数量- g. |' l4 \% z# f1 l; w
, r. b9 c- I2 d; x) e U- #define REG_DISCRETE_START 0x0001 //开关寄存器其实地址
9 ?: g. |# N$ s5 T - #define REG_DISCRETE_SIZE 16 //开关寄存器数量
, Y) K" g, T/ H8 e9 J( o - //输入寄存器内容( O5 w( V+ p6 @% w: `! s) u
- uint16_t usRegInputBuf[REG_INPUT_NREGS] = {0x1000,0x1001,0x1002,0x1003,0x1004,0x1005,0x1006,0x1007};
. q2 h6 k$ n0 k9 F* M ^ g% r - //保持寄存器内容
' u# @ Y) Y4 m! B$ Y. v ^ - uint16_t usRegHoldingBuf[REG_HOLDING_NREGS] = {0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007}; 6 w* O/ q4 z3 h; l3 ]/ Y7 S
- //线圈状态- g% @0 z$ }7 g4 a! G
- uint8_t ucRegCoilsBuf[REG_COILS_SIZE] = {0x01,0x01,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00};" g- ]8 P' K+ q; _ M
- //离散寄存器内容- G' Q' a" [% l; Z) ]5 q4 T" X
- uint8_t ucRegDiscreteBuf[REG_DISCRETE_SIZE] = {0x01,0x01,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x01}; + ^" i5 V* j5 v& {
' N7 ~$ ^. U9 B# m- /****************************************************************************
2 X, ~3 q3 \; _" t' Q5 c - * 名 称:eMBRegInputCB ( J6 h0 l1 b& ~) r$ `
- * 功 能:读取输入寄存器,对应功能码是 04 eMBFuncReadInputRegister9 h I! U: @4 e( W. X6 V% c8 B
- * 入口参数:pucRegBuffer: 数据缓存区,用于响应主机 $ {( ~8 q8 K! h0 U; X" n& M
- * usAddress: 寄存器地址 Z! z: I% C. `( O
- * usNRegs: 要读取的寄存器个数. F& U- U* [6 n1 d7 }7 Z; U
- * 出口参数:6 t5 D# {# L. A+ w: J
- * 注 意:上位机发来的 帧格式是: SlaveAddr(1 Byte)+FuncCode(1 Byte): E. d( C2 t5 T; j4 `- W
- * +StartAddrHiByte(1 Byte)+StartAddrLoByte(1 Byte)
3 P: i8 \; D% v' n: g% T" d - * +LenAddrHiByte(1 Byte)+LenAddrLoByte(1 Byte)+
1 p- B+ N" W m' j# B" K - * +CRCAddrHiByte(1 Byte)+CRCAddrLoByte(1 Byte)
+ c" m1 e+ F3 E- T: d- I+ P - * 3 区( D# y5 z, k" q q9 K
- ****************************************************************************/3 `( z+ ]/ Q: l8 B
- eMBErrorCode
* b, x% O1 a% w - eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
. {" K6 L$ @/ K. z - {
0 m$ [9 x/ a6 W5 r5 J - eMBErrorCode eStatus = MB_ENOERR;
7 `) }7 g$ ^5 B2 {7 g* h$ ^ - int iRegIndex;
& L+ I6 a! \( {" U6 X1 q
+ N7 n* ?8 u. S7 w8 g- if( ( usAddress >= REG_INPUT_START )& M; }' K7 r' X( z. g# D' T1 z6 Z
- && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )
; W2 @) e! {- h: P - {
4 b: E& J( t* F" B( R' ` - iRegIndex = ( int )( usAddress - REG_INPUT_START );
- U9 C: F8 W" w# I+ E - while( usNRegs > 0 )
- k; y9 d! ^3 D. } - {+ ^& Q: j) @4 y: @ f. H3 W% N2 N
- *pucRegBuffer++ = ( UCHAR )( usRegInputBuf[iRegIndex] >> 8 );
. w! n: ?' O0 |, ~/ y; F - *pucRegBuffer++ = ( UCHAR )( usRegInputBuf[iRegIndex] & 0xFF );/ F7 R! p8 D; f' n) U+ V
- iRegIndex++;2 e! w2 X' Y8 d! K6 V0 e: \+ F
- usNRegs--;, _9 q8 W* O) X2 t
- }. n d; t6 y& b$ I5 j( G
- }; V* E* F s% G4 J
- else
/ P% P, x7 K: N) |, }% m, t - {) s* |! E; d: p* ]$ J# h
- eStatus = MB_ENOREG;
9 h' m! B. T: A6 R. j- f1 z0 \9 \ - }
# i7 H. F. Z7 Y* z9 w5 q1 N# ^
3 B6 Y2 {. f9 p8 ~- return eStatus;( N5 X- a& M1 A, f
- }9 A+ o8 U2 N* K% T5 F8 T3 M
- * ]0 c* X* v2 |4 B- K3 k& Q7 ]
- /****************************************************************************
0 {5 |9 }) d( g/ M9 N2 \( K, R* [ - * 名 称:eMBRegHoldingCB - n. D4 D- M l4 }" @1 k; B& t
- * 功 能:对应功能码有:06 写保持寄存器 eMBFuncWriteHoldingRegister
+ S$ d% p: O$ ?# B4 g - * 16 写多个保持寄存器 eMBFuncWriteMultipleHoldingRegister
$ v5 z) f m C" L+ e' t, ~, o/ `+ @ - * 03 读保持寄存器 eMBFuncReadHoldingRegister
9 q1 n; z2 C+ P/ g+ S! e# I - * 23 读写多个保持寄存器 eMBFuncReadWriteMultipleHoldingRegister; C$ k, S' } n0 N
- * 入口参数:pucRegBuffer: 数据缓存区,用于响应主机
4 }+ c; Y8 @0 u' `2 ] - * usAddress: 寄存器地址
! H3 B% w+ ~3 M. b3 b9 c - * usNRegs: 要读写的寄存器个数
% {9 w' c; O2 S. z/ q - * eMode: 功能码
. G* A. Y/ w, t( w( I) r E - * 出口参数:: q, b9 Y/ H& h
- * 注 意:4 区/ o! C- Q* {9 M5 y
- ****************************************************************************/
, L/ N5 w# m* `1 b8 F C- d$ |9 v - eMBErrorCode2 U) i) H1 @4 m6 f
- eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
% t3 C/ C6 h! U% I6 ? - {
. e+ p* a: L8 Q9 A C - eMBErrorCode eStatus = MB_ENOERR;
; S4 X7 f: y( a& X; O2 q - int iRegIndex;
) } P3 A3 i6 [ - ) M2 R2 w6 s2 v/ B
- + r3 |" r% |2 E7 J, ]0 t
- if((usAddress >= REG_HOLDING_START)&&\
8 w" D5 O( T9 v - ((usAddress+usNRegs) <= (REG_HOLDING_START + REG_HOLDING_NREGS)))
) T3 x: T" S* ~9 A) ~! x ~. d - {
4 q/ i" w8 `. W8 v1 m& m - iRegIndex = (int)(usAddress - REG_HOLDING_START);
+ n( P8 ^- b C# V3 K% e - switch(eMode)0 K$ `! V Z( o- y7 O5 O
- { 1 X* @) {, v0 r7 V0 G$ @
- case MB_REG_READ://读 MB_REG_READ = 0, S: O, Y: ^9 ]! A% `
- while(usNRegs > 0)4 A0 ^2 }' E) M; Z$ v+ U! y* a5 x$ h
- {+ W1 H" R& b* n, o( ~
- *pucRegBuffer++ = (u8)(usRegHoldingBuf[iRegIndex] >> 8);
8 W5 u6 S6 N' ^ - *pucRegBuffer++ = (u8)(usRegHoldingBuf[iRegIndex] & 0xFF); , ?4 ^2 L, Q7 M7 ~7 U( L
- iRegIndex++;
5 _* |# C4 T/ B- j8 H3 b - usNRegs--; 5 H; G" p) O# e
- } P Y# ` d( R
- break;5 E, B* k1 i# x9 ]; W
- case MB_REG_WRITE://写 MB_REG_WRITE = 0
3 b L3 r) r, e& M( T* y- ? - while(usNRegs > 0)
; e& A0 I7 o, M4 Z; F ^6 I - { 3 B" |6 a' n& C2 _/ q& k0 M
- usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;4 q0 b6 k5 |& m/ u0 v
- usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;
0 H5 i" \, [5 w1 Z - iRegIndex++;
* g) S. U( o" b* V1 h/ g2 v& w - usNRegs--;
C2 P: F; l, Y/ }5 }% [9 b - }
$ }0 y |' l" Q6 N - break;
% `# p9 e& Y1 N0 \; L: P3 }: Y - }
8 T! B5 L& a% g7 p# j - }
) F# K/ A% }" c! C; `& \% T - else//错误 m2 Y9 V! x! G7 \- ^
- {5 [ L& D1 {6 s# P0 n
- eStatus = MB_ENOREG;- Y5 ]7 N. T+ k+ D- Z# Y
- }
4 r1 ?4 D& A, q( z& W( j -
0 N0 q7 J* |: c* C4 P - return eStatus;
) K4 z3 J" y; x - } F5 ]9 {$ D7 J
- $ x( c7 ?7 j( d1 A) b9 S& ?
- /****************************************************************************$ T) r4 e5 v, f- i/ N
- * 名 称:eMBRegCoilsCB 4 J% P [; g% }4 b$ C& t* M
- * 功 能:对应功能码有:01 读线圈 eMBFuncReadCoils* ?5 S' U9 b7 r1 W
- * 05 写线圈 eMBFuncWriteCoil8 o9 d5 v, _! A* t
- * 15 写多个线圈 eMBFuncWriteMultipleCoils* f: ?$ m6 Z p' d+ _
- * 入口参数:pucRegBuffer: 数据缓存区,用于响应主机 ; f6 o' g, f- {, [- F: M
- * usAddress: 线圈地址0 H+ b+ v- K6 J- D2 z, t. d& ~
- * usNCoils: 要读写的线圈个数
+ F) x3 E/ C/ N% ` - * eMode: 功能码, Q0 `8 d6 }, M2 x
- * 出口参数:# F4 |9 {* F" e0 S
- * 注 意:如继电器 & y5 H. H) |5 k9 `8 _9 u- q, ]3 \/ v7 c
- * 0 区. i- l. e, W& N& Q
- ****************************************************************************/
+ Q/ ^3 G4 j4 u/ Z1 ?4 e: f2 { - eMBErrorCode0 x4 s& Q% s# a
- eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )/ Q5 L2 h; G& d: `/ n4 K- E5 e
- {! p& c! i* ?( l: ~6 h
- eMBErrorCode eStatus = MB_ENOERR;
/ B9 J7 I$ j" L$ j: m$ h: t/ _ - int iRegIndex;
9 B7 K) U, @' d - u8 i;
) B3 a* C: S+ y- R; W% T - USHORT readNumber=usNCoils;
4 x, p; ~6 \* Z( Y2 Z0 n# A - USHORT coilValue=0x0000;5 i. N+ t8 Y2 h3 d( z- g9 K
- if((usAddress >= REG_COILS_START)&&\" T2 `( h" s' `% c3 n7 e W2 L
- ((usAddress+usNCoils) <= (REG_COILS_START + REG_COILS_SIZE))): @3 E7 O+ X# ~7 l: W8 a
- {
8 D7 }( X5 p [/ O0 L3 X - iRegIndex = (int)(usAddress + usNCoils-REG_COILS_START);
* E6 W0 W; p8 O1 ^% H - switch(eMode)
6 |2 {9 z$ l6 b- Z7 z2 \2 B - { 9 d9 K/ _ B0 k" e: {
- case MB_REG_READ://读 MB_REG_READ = 0
0 E5 A9 U7 A. k - for(i=0;i<usNCoils;i++)
# h; W& U# K0 D" k8 @2 B( d - {
& F- F) i" p( d- [' g, ] - readNumber--;
" x5 o! O5 u2 U* T" i* G0 Y& K8 x - iRegIndex--;& ^) m6 l% v: Z7 O
- coilValue|=ucRegCoilsBuf[iRegIndex]<<readNumber;
% _5 @3 |# I: C8 B0 G9 t0 w - }
! M! \6 B4 \$ `) C! }$ c" f& |1 V( a - if(usNCoils<=8)& V8 t6 p( V! g! L+ X6 Z6 R& ^
- {- R% X; N/ R5 h
- * pucRegBuffer=coilValue;) I6 E; [2 c5 v+ V% x
- }
- T- ]0 Q6 F% R3 `" | - else
4 q1 G8 {2 H* s: c& s - {7 a) i$ M! e7 g3 E2 }1 | K. T
- * pucRegBuffer++ = (coilValue)&0x00ff;
: J. C$ C: b% J, s - * pucRegBuffer++ = (coilValue>>8)&0x00ff;
- W! D) C; q8 | - }! w+ ~$ ?: z4 S
- break;
/ t9 _8 }: ~9 F1 d; Q8 u - case MB_REG_WRITE://写 MB_REG_WRITE = 1
5 f& P: b1 C, k8 T( i - while(usNCoils > 0)$ R& E) e5 j/ @8 i! M7 @
- { / x; k! |3 p3 D2 A% L i
- // usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;
0 c( k5 k7 l/ Y: X/ E7 Y - // usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;, a8 g. @! S, y$ \- o4 X4 ]& e
- iRegIndex++;
) Y. g( [ a" Q! R0 @ F; t - usNCoils--;0 B8 y* Y- v, U0 A3 {
- }
6 P) B+ f$ {9 U+ b, P$ Z w% c/ E - break;
Y* M& O- c C6 \ - }. c: r q' A: S+ P8 K- p# D
- }6 U% I+ ~/ A: P/ R
- else//错误, J0 Q2 v$ i1 a' b0 S; @ c. K
- {" ?1 q4 d% q U" ~3 r* k( I
- eStatus = MB_ENOREG;
4 r9 I0 c) \' n. Q8 y - } ' o$ x- I Z& c1 F3 O
- 0 M- j ^) b* v: r/ @8 {
- return eStatus;9 G) u+ Q2 R( |
- }/ S; i* n( U6 M# S4 H; I$ [/ ^
- /****************************************************************************
6 x8 V4 n/ I$ P4 W0 V5 L, Z - * 名 称:eMBRegDiscreteCB 0 D3 Q; N' K$ L" Q! Z. J
- * 功 能:读取离散寄存器,对应功能码有:02 读离散寄存器 eMBFuncReadDiscreteInputs
7 t; C1 E* }% I" M. q - * 入口参数:pucRegBuffer: 数据缓存区,用于响应主机
& V, _9 b+ X: F% U - * usAddress: 寄存器地址
+ X- z$ t& O6 o N - * usNDiscrete: 要读取的寄存器个数) }9 o9 \8 Y. ]; v# L+ U$ {9 e+ X
- * 出口参数:4 Q: l ?# P. [( W) V& U7 v7 s
- * 注 意:1 区9 r8 V) _# T2 L+ [7 i: T
- ****************************************************************************/
~6 f" b2 i3 X; r+ F8 g - eMBErrorCode7 \4 U( e" k/ U/ {) @
- eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )! |9 t& F5 C/ ]: p
- {
1 j5 j3 }0 d2 o' e* h- z - eMBErrorCode eStatus = MB_ENOERR;* ~8 Z3 q7 J. J
- int iRegIndex;
3 E: Z, r6 w1 T( L+ M - u8 i;
' P8 y8 `- U! [. t3 A; t - USHORT readNumber=usNDiscrete;) \0 c+ C" W4 E5 W, s( H
- USHORT coilValue=0x0000;( l' G6 p j$ _. V' \+ T
- iRegIndex = (int)(usAddress + usNDiscrete-REG_DISCRETE_START);/ z* }5 e( u- d2 F
- if((usAddress >= REG_DISCRETE_START)&&\
- k8 H4 X! J- h0 V8 `- V - ((usAddress+usNDiscrete) <= (REG_DISCRETE_START + REG_DISCRETE_SIZE)))7 a t5 Z. r0 {: Y% a3 c
- {
2 K' X! x& I& o4 c- p7 [ - for(i=0;i<usNDiscrete;i++)
' o5 H0 |* Q) W& E4 m" z0 t - {! j- L! B; D- v/ x
- readNumber--;& E0 ~7 z5 ]& k6 v, X, J# a+ U
- iRegIndex--;
2 G9 j4 W) ?/ e# t; D3 r0 R" Z - coilValue|=ucRegDiscreteBuf[iRegIndex]<<readNumber;7 M2 Z8 ^" L9 P/ p2 Q8 ?: `
- }; Z' K5 n' l1 T6 u# g4 |7 E# B' I6 e K
- if(usNDiscrete<=8)# k& U6 T2 M Q, G6 k, P
- {
+ @! r( C7 n* r! p# V T- `: _$ j$ u - * pucRegBuffer=coilValue;
* ]7 q( k3 L) ]; ?+ ^ - }( X' B) \. h4 k5 k K
- else; r P S0 ~3 F& ?' u" R H `, |
- {
. p$ |0 T1 w% E* m& b - * pucRegBuffer++ = (coilValue)&0x00ff;
8 l: p; b- f+ ~ - * pucRegBuffer++ = (coilValue>>8)&0x00ff;: u3 l/ j. E* J5 o* x" Y
- }+ i3 D& D1 t3 R
- }4 F5 O% ^) Q4 U0 ~% _ Z
- else& _/ p7 b# |8 a* m6 a/ X
- {
2 b5 ?6 D* E: X5 t1 b7 c+ k& ` - eStatus = MB_ENOREG;
1 A/ u) s5 _ S, e- s6 Y - }- z( F) }( _/ `# K
- return eStatus;2 S {9 N2 \# M
- }3 D, z* k5 Z6 b9 ~7 H: [
- ) k8 B3 q1 f0 j+ e2 I
; ^6 V- c# p' `& w0 b, r- ( j ~* j( P* W) g2 J0 Z
- ( |' t ]$ q! \* a, J
复制代码
% z5 B: q }4 p5 H$ z, [
/ D, l8 P, P5 X) z |