你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32驱动w5500移植FreeModbus实现ModbusTCP

[复制链接]
STMCU小助手 发布时间:2022-4-23 16:17
首先我们下载FreeModbus源码,然后放到自己的工程中,新建一个MODBUS_TCP和PORT_TCP文件夹,然后将相关文件复制到里面,如下图所示:
! r& u6 n, e! b2 }% X) t1 L 20200323102539294.png & u, H7 c7 N8 [. u& |- n
* E! t! |& L5 I( F1 K9 w
然后修改porttcp中的代码:; k9 J: [0 u$ O5 s! J
首先定义一个数组用于接收数据:
  1. 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! ^
  1. BOOL
    : B+ l* p4 O) e! o; W
  2. xMBTCPPortInit( USHORT usTCPPort )4 N5 d& j; \$ j
  3. {
    4 p, B4 J# U% @/ |
  4.     BOOL bOkay = FALSE;
    * w% ?: A( X$ s" h! E% f0 G) T7 [6 K
  5. 1 p$ M: F# {  \: m: w& F
  6.     // 侦听端口 Modbus-TCP 端口
    % Y0 T- U6 w  Y2 Y' i' s" P
  7.         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
  8.         listen_tcp_socket(SOCK_TCP_PORT);
    ! S! A7 f; {8 B9 P

  9. 6 X2 Y5 s. M) A; |  |
  10.     bOkay = TRUE;9 b. s, l  W2 V' j/ f! s
  11.     return bOkay;% R3 S3 R5 _7 ~  T$ m( _3 O' U
  12. }
复制代码
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
  1. BOOL5 H, i: o  K& T- z( e, `2 ]
  2. xMBTCPPortSendResponse(const UCHAR * pucMBTCPFrame, USHORT usTCPLength )1 H; S$ [! q$ `2 Y
  3. {! x! ?2 h! V5 z# V
  4.         send_tcp_socket_data(SOCK_TCP_PORT,(UCHAR*)pucMBTCPFrame,usTCPLength);        # I$ N+ V1 K7 J+ U! c
  5.     return TRUE;8 ?1 y" _) f0 Q
  6. }
复制代码
7 U+ }0 P4 K% o4 k
然后在xMBPortTCPPool执行接收和其他操作
. K8 E# Q$ b+ K; r' |
- O8 ~; D( \! G; z7 N7 u8 U! t- I
  1. BOOL
    ) E3 e7 L0 F% d9 ]* S& Y! V
  2. xMBPortTCPPool( void )) Q/ U. _5 l' f1 B* q; x# m: J
  3. {  9 H5 ~1 U8 r( Q* P7 [
  4.         unsigned short int us_rlen;5 P3 M2 U$ L0 M2 X' ^3 a; c+ D. T
  5.         unsigned char i;& U( c1 P2 C& f" r
  6.         i=get_tcp_socket_state(SOCK_TCP_PORT);
      x0 T: [/ e* Z8 M7 {

  7. & _4 f) ]5 ?; C3 c1 I
  8.         if(i==SOCK_ESTABLISHED_TCP)
    8 T% P0 f: p9 u
  9.         {
    8 ^# D  F) W( S' Z& o) W
  10.                 if(get_tcp_socket_irq(SOCK_TCP_PORT) & Sn_IR_CON_TCP)                //查看中断有没有发生
    . ~4 o" T, t* D
  11.                 {
    $ C, f- f4 u4 ]7 E6 j! ^
  12.                         clear_tcp_socket_irq(SOCK_TCP_PORT, Sn_IR_CON_TCP);         /*清除接收中断标志位*/                                                         
    . Q: i  v1 N* s# q) Y
  13.                 }
    ; G; o2 `6 R7 P+ M0 z
  14.                 us_rlen=get_tcp_rx_buffer_size(SOCK_TCP_PORT);                                 //获取接收到的数据字节                                                   /*定义len为已接收数据的长度*/$ Q, X/ \" X/ b
  15.                 if(us_rlen==0)                                                                                                //没有接收到数据
    ' O% N9 e% c/ T/ _$ y$ E  w
  16.                         return FALSE;                                                                                        //返回
    3 t' T  [# r- i- O) S9 `5 l
  17.                 else( D6 H4 H/ D' P# c$ }0 E0 W
  18.                 {
    ' P  `/ i& r$ V8 w+ O
  19.                         recv_tcp_socket_data(SOCK_TCP_PORT,aucTCPBuf,us_rlen);         //接收数据                                                                            /*接收来自Server的数据*/! }0 o. t/ b* F4 X8 o
  20.                         printf("receive\r\n");
    2 n' @! ^, J, g5 f" v; u  t) T& o+ ^
  21.                         usTCPBufLen=us_rlen;
    7 ~- ~) v0 e5 c0 N. R" c1 S" L
  22.                 }
    1 y8 @" f/ \' T7 n+ O& y
  23.                 ( void )xMBPortEventPost( EV_FRAME_RECEIVED );                        //发送已接收到新数据到Modbus-TCP状态机4 C  i' o' U" s3 u& j
  24.         }
    0 G8 G4 B2 d; r3 W! O. q
  25.         else if(i==SOCK_CLOSED_TCP)                                                                        //如果socket关闭
    7 z' R' \2 M8 J+ @* n9 d
  26.         {9 w) X  p* ^. U" h
  27.                 socket_init(SOCK_TCP_PORT,Sn_MR_TCP_TCP,local_tcp_port++,Sn_MR_ND_TCP);//重新初始化
    . ?1 i+ \) Y) ~) u7 e- p
  28.         }
    . ~: A& F6 d+ j( y  J
  29.         else if(i==SOCK_INIT_TCP)                                                                //如果socket初始化完毕,监听端口
    * a# Y. @0 b  S3 l2 g
  30.         {) u% s/ Z3 l7 i
  31.                 listen_tcp_socket(SOCK_TCP_PORT);; l6 d1 X2 u. W- T. o
  32.         }! C3 D0 {8 V3 I. k
  33.         else if(i==SOCK_CLOSE_WAIT_TCP)                                                        //如果socket等待关闭,关闭socket连接! o2 |" l# Y7 ~9 i
  34.         {1 T4 g1 G- u/ M( m
  35.                 close_tcp_socket(SOCK_TCP_PORT);4 k3 T, h2 e* P) O% [" J5 C
  36.         }
    6 D+ W" p: T: \$ t

  37. $ W: X5 O- f  g& y# m7 J
  38.         return TRUE;
    . N/ V$ R6 _: H" X% Y; n" w1 `$ V' J
  39. }
复制代码

( i0 g) e" I( j% d/ ^7 K7 a0 T其次还要实现读线圈、写线圈、读离散输入、写保持寄存器、读保持寄存器、读输入寄存器等功能,如下:
: A3 J1 ?* {. \$ R$ }& {/ B# e# ^) O4 }; v+ j# R1 w
  1. #define REG_INPUT_START       0x0001        //输入寄存器起始地址
    5 i2 n# k4 }& }" e: r& p
  2. #define REG_INPUT_NREGS       8                        //输入寄存器数量, Z6 ]) J) z8 i) E3 Y! N4 r

  3. ) \. L# \4 {& H" l
  4. #define REG_HOLDING_START     0x0001        //保持寄存器起始地址' _3 G; d% ]: t9 h1 p
  5. #define REG_HOLDING_NREGS     8                        //保持寄存器数量. ]5 U, v3 a* r2 ]
  6. 0 M. y7 a* a" C- j5 V
  7. #define REG_COILS_START       0x0001        //线圈起始地址
    3 l/ i/ }6 f1 o* [" t: q
  8. #define REG_COILS_SIZE        16                        //线圈数量- g. |' l4 \% z# f1 l; w

  9. , r. b9 c- I2 d; x) e  U
  10. #define REG_DISCRETE_START    0x0001        //开关寄存器其实地址
    9 ?: g. |# N$ s5 T
  11. #define REG_DISCRETE_SIZE     16                        //开关寄存器数量
    , Y) K" g, T/ H8 e9 J( o
  12. //输入寄存器内容( O5 w( V+ p6 @% w: `! s) u
  13. uint16_t usRegInputBuf[REG_INPUT_NREGS] = {0x1000,0x1001,0x1002,0x1003,0x1004,0x1005,0x1006,0x1007};
    . q2 h6 k$ n0 k9 F* M  ^  g% r
  14. //保持寄存器内容               
    ' u# @  Y) Y4 m! B$ Y. v  ^
  15. uint16_t usRegHoldingBuf[REG_HOLDING_NREGS] = {0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007};                                        6 w* O/ q4 z3 h; l3 ]/ Y7 S
  16. //线圈状态- g% @0 z$ }7 g4 a! G
  17. 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
  18. //离散寄存器内容- G' Q' a" [% l; Z) ]5 q4 T" X
  19. 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& {

  20. ' N7 ~$ ^. U9 B# m
  21. /****************************************************************************
    2 X, ~3 q3 \; _" t' Q5 c
  22. * 名          称:eMBRegInputCB ( J6 h0 l1 b& ~) r$ `
  23. * 功    能:读取输入寄存器,对应功能码是 04 eMBFuncReadInputRegister9 h  I! U: @4 e( W. X6 V% c8 B
  24. * 入口参数:pucRegBuffer: 数据缓存区,用于响应主机   $ {( ~8 q8 K! h0 U; X" n& M
  25. *                                                usAddress: 寄存器地址  Z! z: I% C. `( O
  26. *                                                usNRegs: 要读取的寄存器个数. F& U- U* [6 n1 d7 }7 Z; U
  27. * 出口参数:6 t5 D# {# L. A+ w: J
  28. * 注          意:上位机发来的 帧格式是: SlaveAddr(1 Byte)+FuncCode(1 Byte): E. d( C2 t5 T; j4 `- W
  29. *                                                                +StartAddrHiByte(1 Byte)+StartAddrLoByte(1 Byte)
    3 P: i8 \; D% v' n: g% T" d
  30. *                                                                +LenAddrHiByte(1 Byte)+LenAddrLoByte(1 Byte)+
    1 p- B+ N" W  m' j# B" K
  31. *                                                                +CRCAddrHiByte(1 Byte)+CRCAddrLoByte(1 Byte)
    + c" m1 e+ F3 E- T: d- I+ P
  32. *                                                        3 区( D# y5 z, k" q  q9 K
  33. ****************************************************************************/3 `( z+ ]/ Q: l8 B
  34. eMBErrorCode
    * b, x% O1 a% w
  35. eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
    . {" K6 L$ @/ K. z
  36. {
    0 m$ [9 x/ a6 W5 r5 J
  37.     eMBErrorCode    eStatus = MB_ENOERR;
    7 `) }7 g$ ^5 B2 {7 g* h$ ^
  38.     int             iRegIndex;
    & L+ I6 a! \( {" U6 X1 q

  39. + N7 n* ?8 u. S7 w8 g
  40.     if( ( usAddress >= REG_INPUT_START )& M; }' K7 r' X( z. g# D' T1 z6 Z
  41.         && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )
    ; W2 @) e! {- h: P
  42.     {
    4 b: E& J( t* F" B( R' `
  43.         iRegIndex = ( int )( usAddress - REG_INPUT_START );
    - U9 C: F8 W" w# I+ E
  44.         while( usNRegs > 0 )
    - k; y9 d! ^3 D. }
  45.         {+ ^& Q: j) @4 y: @  f. H3 W% N2 N
  46.             *pucRegBuffer++ = ( UCHAR )( usRegInputBuf[iRegIndex] >> 8 );
    . w! n: ?' O0 |, ~/ y; F
  47.             *pucRegBuffer++ = ( UCHAR )( usRegInputBuf[iRegIndex] & 0xFF );/ F7 R! p8 D; f' n) U+ V
  48.             iRegIndex++;2 e! w2 X' Y8 d! K6 V0 e: \+ F
  49.             usNRegs--;, _9 q8 W* O) X2 t
  50.         }. n  d; t6 y& b$ I5 j( G
  51.     }; V* E* F  s% G4 J
  52.     else
    / P% P, x7 K: N) |, }% m, t
  53.     {) s* |! E; d: p* ]$ J# h
  54.         eStatus = MB_ENOREG;
    9 h' m! B. T: A6 R. j- f1 z0 \9 \
  55.     }
    # i7 H. F. Z7 Y* z9 w5 q1 N# ^

  56. 3 B6 Y2 {. f9 p8 ~
  57.     return eStatus;( N5 X- a& M1 A, f
  58. }9 A+ o8 U2 N* K% T5 F8 T3 M
  59. * ]0 c* X* v2 |4 B- K3 k& Q7 ]
  60. /****************************************************************************
    0 {5 |9 }) d( g/ M9 N2 \( K, R* [
  61. * 名          称:eMBRegHoldingCB - n. D4 D- M  l4 }" @1 k; B& t
  62. * 功    能:对应功能码有:06 写保持寄存器 eMBFuncWriteHoldingRegister
    + S$ d% p: O$ ?# B4 g
  63. *                                                                                                        16 写多个保持寄存器 eMBFuncWriteMultipleHoldingRegister
    $ v5 z) f  m  C" L+ e' t, ~, o/ `+ @
  64. *                                                                                                        03 读保持寄存器 eMBFuncReadHoldingRegister
    9 q1 n; z2 C+ P/ g+ S! e# I
  65. *                                                                                                        23 读写多个保持寄存器 eMBFuncReadWriteMultipleHoldingRegister; C$ k, S' }  n0 N
  66. * 入口参数:pucRegBuffer: 数据缓存区,用于响应主机   
    4 }+ c; Y8 @0 u' `2 ]
  67. *                                                usAddress: 寄存器地址
    ! H3 B% w+ ~3 M. b3 b9 c
  68. *                                                usNRegs: 要读写的寄存器个数
    % {9 w' c; O2 S. z/ q
  69. *                                                eMode: 功能码
    . G* A. Y/ w, t( w( I) r  E
  70. * 出口参数:: q, b9 Y/ H& h
  71. * 注          意:4 区/ o! C- Q* {9 M5 y
  72. ****************************************************************************/
    , L/ N5 w# m* `1 b8 F  C- d$ |9 v
  73. eMBErrorCode2 U) i) H1 @4 m6 f
  74. eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
    % t3 C/ C6 h! U% I6 ?
  75. {
    . e+ p* a: L8 Q9 A  C
  76.         eMBErrorCode    eStatus = MB_ENOERR;
    ; S4 X7 f: y( a& X; O2 q
  77.         int             iRegIndex;
    ) }  P3 A3 i6 [
  78. ) M2 R2 w6 s2 v/ B
  79. + r3 |" r% |2 E7 J, ]0 t
  80.         if((usAddress >= REG_HOLDING_START)&&\
    8 w" D5 O( T9 v
  81.                 ((usAddress+usNRegs) <= (REG_HOLDING_START + REG_HOLDING_NREGS)))
    ) T3 x: T" S* ~9 A) ~! x  ~. d
  82.         {
    4 q/ i" w8 `. W8 v1 m& m
  83.                 iRegIndex = (int)(usAddress - REG_HOLDING_START);
    + n( P8 ^- b  C# V3 K% e
  84.                 switch(eMode)0 K$ `! V  Z( o- y7 O5 O
  85.                 {                                       1 X* @) {, v0 r7 V0 G$ @
  86.                         case MB_REG_READ://读 MB_REG_READ = 0, S: O, Y: ^9 ]! A% `
  87.                                 while(usNRegs > 0)4 A0 ^2 }' E) M; Z$ v+ U! y* a5 x$ h
  88.                                 {+ W1 H" R& b* n, o( ~
  89.                                         *pucRegBuffer++ = (u8)(usRegHoldingBuf[iRegIndex] >> 8);            
    8 W5 u6 S6 N' ^
  90.                                         *pucRegBuffer++ = (u8)(usRegHoldingBuf[iRegIndex] & 0xFF); , ?4 ^2 L, Q7 M7 ~7 U( L
  91.                                         iRegIndex++;
    5 _* |# C4 T/ B- j8 H3 b
  92.                                         usNRegs--;                                        5 H; G" p) O# e
  93.                                 }                              P  Y# `  d( R
  94.                         break;5 E, B* k1 i# x9 ]; W
  95.                         case MB_REG_WRITE://写 MB_REG_WRITE = 0
    3 b  L3 r) r, e& M( T* y- ?
  96.                                 while(usNRegs > 0)
    ; e& A0 I7 o, M4 Z; F  ^6 I
  97.                                 {         3 B" |6 a' n& C2 _/ q& k0 M
  98.                                         usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;4 q0 b6 k5 |& m/ u0 v
  99.                                         usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;
    0 H5 i" \, [5 w1 Z
  100.                                         iRegIndex++;
    * g) S. U( o" b* V1 h/ g2 v& w
  101.                                         usNRegs--;
      C2 P: F; l, Y/ }5 }% [9 b
  102.                                 }
    $ }0 y  |' l" Q6 N
  103.                         break;                                
    % `# p9 e& Y1 N0 \; L: P3 }: Y
  104.                 }
    8 T! B5 L& a% g7 p# j
  105.         }
    ) F# K/ A% }" c! C; `& \% T
  106.         else//错误  m2 Y9 V! x! G7 \- ^
  107.         {5 [  L& D1 {6 s# P0 n
  108.                 eStatus = MB_ENOREG;- Y5 ]7 N. T+ k+ D- Z# Y
  109.         }        
    4 r1 ?4 D& A, q( z& W( j
  110.         
    0 N0 q7 J* |: c* C4 P
  111.         return eStatus;
    ) K4 z3 J" y; x
  112. }  F5 ]9 {$ D7 J
  113. $ x( c7 ?7 j( d1 A) b9 S& ?
  114. /****************************************************************************$ T) r4 e5 v, f- i/ N
  115. * 名          称:eMBRegCoilsCB 4 J% P  [; g% }4 b$ C& t* M
  116. * 功    能:对应功能码有:01 读线圈 eMBFuncReadCoils* ?5 S' U9 b7 r1 W
  117. *                                                  05 写线圈 eMBFuncWriteCoil8 o9 d5 v, _! A* t
  118. *                                                  15 写多个线圈 eMBFuncWriteMultipleCoils* f: ?$ m6 Z  p' d+ _
  119. * 入口参数:pucRegBuffer: 数据缓存区,用于响应主机   ; f6 o' g, f- {, [- F: M
  120. *                                                usAddress: 线圈地址0 H+ b+ v- K6 J- D2 z, t. d& ~
  121. *                                                usNCoils: 要读写的线圈个数
    + F) x3 E/ C/ N% `
  122. *                                                eMode: 功能码, Q0 `8 d6 }, M2 x
  123. * 出口参数:# F4 |9 {* F" e0 S
  124. * 注          意:如继电器 & y5 H. H) |5 k9 `8 _9 u- q, ]3 \/ v7 c
  125. *                                                0 区. i- l. e, W& N& Q
  126. ****************************************************************************/
    + Q/ ^3 G4 j4 u/ Z1 ?4 e: f2 {
  127. eMBErrorCode0 x4 s& Q% s# a
  128. eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )/ Q5 L2 h; G& d: `/ n4 K- E5 e
  129. {! p& c! i* ?( l: ~6 h
  130.         eMBErrorCode    eStatus = MB_ENOERR;
    / B9 J7 I$ j" L$ j: m$ h: t/ _
  131.         int             iRegIndex;
    9 B7 K) U, @' d
  132.         u8 i;
    ) B3 a* C: S+ y- R; W% T
  133.         USHORT readNumber=usNCoils;
    4 x, p; ~6 \* Z( Y2 Z0 n# A
  134.         USHORT coilValue=0x0000;5 i. N+ t8 Y2 h3 d( z- g9 K
  135.         if((usAddress >= REG_COILS_START)&&\" T2 `( h" s' `% c3 n7 e  W2 L
  136.         ((usAddress+usNCoils) <= (REG_COILS_START + REG_COILS_SIZE))): @3 E7 O+ X# ~7 l: W8 a
  137.         {
    8 D7 }( X5 p  [/ O0 L3 X
  138.                 iRegIndex = (int)(usAddress + usNCoils-REG_COILS_START);
    * E6 W0 W; p8 O1 ^% H
  139.                 switch(eMode)
    6 |2 {9 z$ l6 b- Z7 z2 \2 B
  140.                 {                                       9 d9 K/ _  B0 k" e: {
  141.                         case MB_REG_READ://读 MB_REG_READ = 0
    0 E5 A9 U7 A. k
  142.                                 for(i=0;i<usNCoils;i++)
    # h; W& U# K0 D" k8 @2 B( d
  143.                                 {
    & F- F) i" p( d- [' g, ]
  144.                                         readNumber--;
    " x5 o! O5 u2 U* T" i* G0 Y& K8 x
  145.                                         iRegIndex--;& ^) m6 l% v: Z7 O
  146.                                         coilValue|=ucRegCoilsBuf[iRegIndex]<<readNumber;
    % _5 @3 |# I: C8 B0 G9 t0 w
  147.                                 }
    ! M! \6 B4 \$ `) C! }$ c" f& |1 V( a
  148.                                 if(usNCoils<=8)& V8 t6 p( V! g! L+ X6 Z6 R& ^
  149.                                 {- R% X; N/ R5 h
  150.                                         * pucRegBuffer=coilValue;) I6 E; [2 c5 v+ V% x
  151.                                 }
    - T- ]0 Q6 F% R3 `" |
  152.                                 else
    4 q1 G8 {2 H* s: c& s
  153.                                 {7 a) i$ M! e7 g3 E2 }1 |  K. T
  154.                                         * pucRegBuffer++ = (coilValue)&0x00ff;
    : J. C$ C: b% J, s
  155.                                         * pucRegBuffer++ = (coilValue>>8)&0x00ff;
    - W! D) C; q8 |
  156.                                 }! w+ ~$ ?: z4 S
  157.                         break;                           
    / t9 _8 }: ~9 F1 d; Q8 u
  158.                         case MB_REG_WRITE://写 MB_REG_WRITE = 1
    5 f& P: b1 C, k8 T( i
  159.                                 while(usNCoils > 0)$ R& E) e5 j/ @8 i! M7 @
  160.                                 {         / x; k! |3 p3 D2 A% L  i
  161.                                         //                         usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;
    0 c( k5 k7 l/ Y: X/ E7 Y
  162.                                         //           usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;, a8 g. @! S, y$ \- o4 X4 ]& e
  163.                                                 iRegIndex++;
    ) Y. g( [  a" Q! R0 @  F; t
  164.                                                 usNCoils--;0 B8 y* Y- v, U0 A3 {
  165.                                 }
    6 P) B+ f$ {9 U+ b, P$ Z  w% c/ E
  166.                         break;
      Y* M& O- c  C6 \
  167.                 }. c: r  q' A: S+ P8 K- p# D
  168.         }6 U% I+ ~/ A: P/ R
  169.         else//错误, J0 Q2 v$ i1 a' b0 S; @  c. K
  170.         {" ?1 q4 d% q  U" ~3 r* k( I
  171.                 eStatus = MB_ENOREG;
    4 r9 I0 c) \' n. Q8 y
  172.         }        ' o$ x- I  Z& c1 F3 O
  173. 0 M- j  ^) b* v: r/ @8 {
  174.         return eStatus;9 G) u+ Q2 R( |
  175. }/ S; i* n( U6 M# S4 H; I$ [/ ^
  176. /****************************************************************************
    6 x8 V4 n/ I$ P4 W0 V5 L, Z
  177. * 名          称:eMBRegDiscreteCB 0 D3 Q; N' K$ L" Q! Z. J
  178. * 功    能:读取离散寄存器,对应功能码有:02 读离散寄存器 eMBFuncReadDiscreteInputs
    7 t; C1 E* }% I" M. q
  179. * 入口参数:pucRegBuffer: 数据缓存区,用于响应主机   
    & V, _9 b+ X: F% U
  180. *                                                usAddress: 寄存器地址
    + X- z$ t& O6 o  N
  181. *                                                usNDiscrete: 要读取的寄存器个数) }9 o9 \8 Y. ]; v# L+ U$ {9 e+ X
  182. * 出口参数:4 Q: l  ?# P. [( W) V& U7 v7 s
  183. * 注          意:1 区9 r8 V) _# T2 L+ [7 i: T
  184. ****************************************************************************/
      ~6 f" b2 i3 X; r+ F8 g
  185. eMBErrorCode7 \4 U( e" k/ U/ {) @
  186. eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )! |9 t& F5 C/ ]: p
  187. {
    1 j5 j3 }0 d2 o' e* h- z
  188.         eMBErrorCode    eStatus = MB_ENOERR;* ~8 Z3 q7 J. J
  189.         int             iRegIndex;
    3 E: Z, r6 w1 T( L+ M
  190.         u8 i;
    ' P8 y8 `- U! [. t3 A; t
  191.         USHORT readNumber=usNDiscrete;) \0 c+ C" W4 E5 W, s( H
  192.         USHORT coilValue=0x0000;( l' G6 p  j$ _. V' \+ T
  193.         iRegIndex = (int)(usAddress + usNDiscrete-REG_DISCRETE_START);/ z* }5 e( u- d2 F
  194.         if((usAddress >= REG_DISCRETE_START)&&\
    - k8 H4 X! J- h0 V8 `- V
  195.         ((usAddress+usNDiscrete) <= (REG_DISCRETE_START + REG_DISCRETE_SIZE)))7 a  t5 Z. r0 {: Y% a3 c
  196.         {
    2 K' X! x& I& o4 c- p7 [
  197.                 for(i=0;i<usNDiscrete;i++)
    ' o5 H0 |* Q) W& E4 m" z0 t
  198.                 {! j- L! B; D- v/ x
  199.                         readNumber--;& E0 ~7 z5 ]& k6 v, X, J# a+ U
  200.                         iRegIndex--;
    2 G9 j4 W) ?/ e# t; D3 r0 R" Z
  201.                         coilValue|=ucRegDiscreteBuf[iRegIndex]<<readNumber;7 M2 Z8 ^" L9 P/ p2 Q8 ?: `
  202.                 }; Z' K5 n' l1 T6 u# g4 |7 E# B' I6 e  K
  203.                 if(usNDiscrete<=8)# k& U6 T2 M  Q, G6 k, P
  204.                 {
    + @! r( C7 n* r! p# V  T- `: _$ j$ u
  205.                         * pucRegBuffer=coilValue;
    * ]7 q( k3 L) ]; ?+ ^
  206.                 }( X' B) \. h4 k5 k  K
  207.                 else; r  P  S0 ~3 F& ?' u" R  H  `, |
  208.                 {
    . p$ |0 T1 w% E* m& b
  209.                         * pucRegBuffer++ = (coilValue)&0x00ff;
    8 l: p; b- f+ ~
  210.                         * pucRegBuffer++ = (coilValue>>8)&0x00ff;: u3 l/ j. E* J5 o* x" Y
  211.                 }+ i3 D& D1 t3 R
  212.         }4 F5 O% ^) Q4 U0 ~% _  Z
  213.         else& _/ p7 b# |8 a* m6 a/ X
  214.         {
    2 b5 ?6 D* E: X5 t1 b7 c+ k& `
  215.                 eStatus = MB_ENOREG;
    1 A/ u) s5 _  S, e- s6 Y
  216.         }- z( F) }( _/ `# K
  217.     return eStatus;2 S  {9 N2 \# M
  218. }3 D, z* k5 Z6 b9 ~7 H: [
  219. ) k8 B3 q1 f0 j+ e2 I

  220. ; ^6 V- c# p' `& w0 b, r
  221. ( j  ~* j( P* W) g2 J0 Z
  222. ( |' t  ]$ q! \* a, J
复制代码

% z5 B: q  }4 p5 H$ z, [
/ D, l8 P, P5 X) z
收藏 评论0 发布时间:2022-4-23 16:17

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版