43
43
#include "mbconfig.h"
44
44
45
45
/* ----------------------- Defines ------------------------------------------*/
46
- #define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0)
47
- #define MB_PDU_FUNC_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 )
48
- #define MB_PDU_FUNC_READ_SIZE ( 4 )
46
+ #define MB_PDU_REQ_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0 )
47
+ #define MB_PDU_REQ_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 )
48
+ #define MB_PDU_REQ_READ_SIZE ( 4 )
49
49
#define MB_PDU_FUNC_READ_REGCNT_MAX ( 0x007D )
50
+ #define MB_PDU_FUNC_READ_BYTECNT_OFF ( MB_PDU_DATA_OFF + 0 )
51
+ #define MB_PDU_FUNC_READ_VALUES_OFF ( MB_PDU_DATA_OFF + 1 )
52
+ #define MB_PDU_FUNC_READ_SIZE_MIN ( 1 )
50
53
54
+ #define MB_PDU_REQ_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF + 0)
55
+ #define MB_PDU_REQ_WRITE_VALUE_OFF ( MB_PDU_DATA_OFF + 2 )
56
+ #define MB_PDU_REQ_WRITE_SIZE ( 4 )
51
57
#define MB_PDU_FUNC_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF + 0)
52
58
#define MB_PDU_FUNC_WRITE_VALUE_OFF ( MB_PDU_DATA_OFF + 2 )
53
59
#define MB_PDU_FUNC_WRITE_SIZE ( 4 )
54
60
61
+ #define MB_PDU_REQ_WRITE_MUL_ADDR_OFF ( MB_PDU_DATA_OFF + 0 )
62
+ #define MB_PDU_REQ_WRITE_MUL_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 )
63
+ #define MB_PDU_REQ_WRITE_MUL_BYTECNT_OFF ( MB_PDU_DATA_OFF + 4 )
64
+ #define MB_PDU_REQ_WRITE_MUL_VALUES_OFF ( MB_PDU_DATA_OFF + 5 )
65
+ #define MB_PDU_REQ_WRITE_MUL_SIZE_MIN ( 5 )
66
+ #define MB_PDU_REQ_WRITE_MUL_REGCNT_MAX ( 0x0078 )
55
67
#define MB_PDU_FUNC_WRITE_MUL_ADDR_OFF ( MB_PDU_DATA_OFF + 0 )
56
68
#define MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 )
57
- #define MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF ( MB_PDU_DATA_OFF + 4 )
58
- #define MB_PDU_FUNC_WRITE_MUL_VALUES_OFF ( MB_PDU_DATA_OFF + 5 )
59
- #define MB_PDU_FUNC_WRITE_MUL_SIZE_MIN ( 5 )
60
- #define MB_PDU_FUNC_WRITE_MUL_REGCNT_MAX ( 0x0078 )
61
-
62
- #define MB_PDU_FUNC_READWRITE_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0 )
63
- #define MB_PDU_FUNC_READWRITE_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 )
64
- #define MB_PDU_FUNC_READWRITE_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF + 4 )
65
- #define MB_PDU_FUNC_READWRITE_WRITE_REGCNT_OFF ( MB_PDU_DATA_OFF + 6 )
66
- #define MB_PDU_FUNC_READWRITE_BYTECNT_OFF ( MB_PDU_DATA_OFF + 8 )
67
- #define MB_PDU_FUNC_READWRITE_WRITE_VALUES_OFF ( MB_PDU_DATA_OFF + 9 )
68
- #define MB_PDU_FUNC_READWRITE_SIZE_MIN ( 9 )
69
+ #define MB_PDU_FUNC_WRITE_MUL_SIZE ( 4 )
70
+
71
+ #define MB_PDU_REQ_READWRITE_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0 )
72
+ #define MB_PDU_REQ_READWRITE_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 )
73
+ #define MB_PDU_REQ_READWRITE_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF + 4 )
74
+ #define MB_PDU_REQ_READWRITE_WRITE_REGCNT_OFF ( MB_PDU_DATA_OFF + 6 )
75
+ #define MB_PDU_REQ_READWRITE_WRITE_BYTECNT_OFF ( MB_PDU_DATA_OFF + 8 )
76
+ #define MB_PDU_REQ_READWRITE_WRITE_VALUES_OFF ( MB_PDU_DATA_OFF + 9 )
77
+ #define MB_PDU_REQ_READWRITE_SIZE_MIN ( 9 )
78
+ #define MB_PDU_FUNC_READWRITE_READ_BYTECNT_OFF ( MB_PDU_DATA_OFF + 0 )
79
+ #define MB_PDU_FUNC_READWRITE_READ_VALUES_OFF ( MB_PDU_DATA_OFF + 1 )
80
+ #define MB_PDU_FUNC_READWRITE_SIZE_MIN ( 1 )
69
81
70
82
/* ----------------------- Static functions ---------------------------------*/
83
+ eMBException prveMBError2Exception ( eMBErrorCode eErrorCode );
71
84
72
85
/* ----------------------- Start implementation -----------------------------*/
73
86
#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0
@@ -86,21 +99,53 @@ eMBMasterReqWriteHoldingRegister( UCHAR ucSndAddr, USHORT * pusDataBuffer, USHOR
86
99
vMBMasterGetPDUSndBuf (& ucMBFrame );
87
100
vMBMasterSetDestAddress (ucSndAddr );
88
101
ucMBFrame [MB_PDU_FUNC_OFF ] = MB_FUNC_WRITE_REGISTER ;
89
- ucMBFrame [MB_PDU_FUNC_WRITE_ADDR_OFF ] = usRegAddr >> 8 ;
90
- ucMBFrame [MB_PDU_FUNC_WRITE_ADDR_OFF + 1 ] = usRegAddr ;
91
- ucMBFrame [MB_PDU_FUNC_WRITE_VALUE_OFF ] = pusDataBuffer [0 ] >> 8 ;
92
- ucMBFrame [MB_PDU_FUNC_WRITE_VALUE_OFF + 1 ] = pusDataBuffer [0 ] ;
93
- vMBMasterSetPDUSndLength ( MB_PDU_SIZE_MIN + MB_PDU_FUNC_WRITE_SIZE );
102
+ ucMBFrame [MB_PDU_REQ_WRITE_ADDR_OFF ] = usRegAddr >> 8 ;
103
+ ucMBFrame [MB_PDU_REQ_WRITE_ADDR_OFF + 1 ] = usRegAddr ;
104
+ ucMBFrame [MB_PDU_REQ_WRITE_VALUE_OFF ] = pusDataBuffer [0 ] >> 8 ;
105
+ ucMBFrame [MB_PDU_REQ_WRITE_VALUE_OFF + 1 ] = pusDataBuffer [0 ] ;
106
+ vMBMasterSetPDUSndLength ( MB_PDU_SIZE_MIN + MB_PDU_REQ_WRITE_SIZE );
94
107
( void ) xMBMasterPortEventPost ( EV_MASTER_FRAME_SENT );
95
108
}
96
109
return eErrStatus ;
97
110
}
111
+
112
+ eMBException
113
+ eMBMasterFuncWriteHoldingRegister ( UCHAR * pucFrame , USHORT * usLen )
114
+ {
115
+ USHORT usRegAddress ;
116
+ eMBException eStatus = MB_EX_NONE ;
117
+ eMBErrorCode eRegStatus ;
118
+
119
+ if ( * usLen == ( MB_PDU_SIZE_MIN + MB_PDU_FUNC_WRITE_SIZE ) )
120
+ {
121
+ usRegAddress = ( USHORT )( pucFrame [MB_PDU_FUNC_WRITE_ADDR_OFF ] << 8 );
122
+ usRegAddress |= ( USHORT )( pucFrame [MB_PDU_FUNC_WRITE_ADDR_OFF + 1 ] );
123
+ usRegAddress ++ ;
124
+
125
+ /* Make callback to update the value. */
126
+ eRegStatus = eMBRegHoldingCB ( & pucFrame [MB_PDU_FUNC_WRITE_VALUE_OFF ],
127
+ usRegAddress , 1 , MB_REG_WRITE );
128
+
129
+ /* If an error occured convert it into a Modbus exception. */
130
+ if ( eRegStatus != MB_ENOERR )
131
+ {
132
+ eStatus = prveMBError2Exception ( eRegStatus );
133
+ }
134
+ }
135
+ else
136
+ {
137
+ /* Can't be a valid request because the length is incorrect. */
138
+ eStatus = MB_EX_ILLEGAL_DATA_VALUE ;
139
+ }
140
+ return eStatus ;
141
+ }
98
142
#endif
99
143
100
144
#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0
101
145
102
146
eMBMasterReqErrCode
103
- eMBMasterReqWriteMultipleHoldingRegister ( UCHAR ucSndAddr ,USHORT * pusDataBuffer , USHORT usRegAddr , USHORT usNRegs )
147
+ eMBMasterReqWriteMultipleHoldingRegister (UCHAR ucSndAddr ,
148
+ USHORT * pusDataBuffer , USHORT usRegAddr , USHORT usNRegs )
104
149
{
105
150
UCHAR * ucMBFrame ;
106
151
USHORT usRegIndex = 0 ;
@@ -112,23 +157,72 @@ eMBMasterReqWriteMultipleHoldingRegister( UCHAR ucSndAddr,USHORT * pusDataBuffer
112
157
{
113
158
vMBMasterGetPDUSndBuf (& ucMBFrame );
114
159
vMBMasterSetDestAddress (ucSndAddr );
115
- ucMBFrame [MB_PDU_FUNC_OFF ] = MB_FUNC_WRITE_MULTIPLE_REGISTERS ;
116
- ucMBFrame [MB_PDU_FUNC_WRITE_MUL_ADDR_OFF ] = usRegAddr >> 8 ;
117
- ucMBFrame [MB_PDU_FUNC_WRITE_MUL_ADDR_OFF + 1 ] = usRegAddr ;
118
- ucMBFrame [MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF ] = usNRegs >> 8 ;
119
- ucMBFrame [MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF + 1 ] = usNRegs ;
120
- ucMBFrame [MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF ] = usNRegs * 2 ;
121
- ucMBFrame += MB_PDU_FUNC_WRITE_MUL_VALUES_OFF ;
160
+ ucMBFrame [MB_PDU_FUNC_OFF ] = MB_FUNC_WRITE_MULTIPLE_REGISTERS ;
161
+ ucMBFrame [MB_PDU_REQ_WRITE_MUL_ADDR_OFF ] = usRegAddr >> 8 ;
162
+ ucMBFrame [MB_PDU_REQ_WRITE_MUL_ADDR_OFF + 1 ] = usRegAddr ;
163
+ ucMBFrame [MB_PDU_REQ_WRITE_MUL_REGCNT_OFF ] = usNRegs >> 8 ;
164
+ ucMBFrame [MB_PDU_REQ_WRITE_MUL_REGCNT_OFF + 1 ] = usNRegs ;
165
+ ucMBFrame [MB_PDU_REQ_WRITE_MUL_BYTECNT_OFF ] = usNRegs * 2 ;
166
+ ucMBFrame += MB_PDU_REQ_WRITE_MUL_VALUES_OFF ;
122
167
while ( usNRegs > usRegIndex )
123
168
{
124
169
* ucMBFrame ++ = pusDataBuffer [usRegIndex ] >> 8 ;
125
170
* ucMBFrame ++ = pusDataBuffer [usRegIndex ++ ] ;
126
171
}
127
- vMBMasterSetPDUSndLength ( MB_PDU_SIZE_MIN + MB_PDU_FUNC_WRITE_MUL_SIZE_MIN + 2 * usNRegs );
172
+ vMBMasterSetPDUSndLength ( MB_PDU_SIZE_MIN + MB_PDU_REQ_WRITE_MUL_SIZE_MIN + 2 * usNRegs );
128
173
( void ) xMBMasterPortEventPost ( EV_MASTER_FRAME_SENT );
129
174
}
130
175
return eErrStatus ;
131
176
}
177
+
178
+ eMBException
179
+ eMBMasterFuncWriteMultipleHoldingRegister ( UCHAR * pucFrame , USHORT * usLen )
180
+ {
181
+ UCHAR * ucMBFrame ;
182
+ USHORT usRegAddress ;
183
+ USHORT usRegCount ;
184
+ UCHAR ucRegByteCount ;
185
+
186
+ eMBException eStatus = MB_EX_NONE ;
187
+ eMBErrorCode eRegStatus ;
188
+
189
+ if ( * usLen == MB_PDU_SIZE_MIN + MB_PDU_FUNC_WRITE_MUL_SIZE )
190
+ {
191
+ vMBMasterGetPDUSndBuf (& ucMBFrame );
192
+ usRegAddress = ( USHORT )( ucMBFrame [MB_PDU_REQ_WRITE_MUL_ADDR_OFF ] << 8 );
193
+ usRegAddress |= ( USHORT )( ucMBFrame [MB_PDU_REQ_WRITE_MUL_ADDR_OFF + 1 ] );
194
+ usRegAddress ++ ;
195
+
196
+ usRegCount = ( USHORT )( ucMBFrame [MB_PDU_REQ_WRITE_MUL_REGCNT_OFF ] << 8 );
197
+ usRegCount |= ( USHORT )( ucMBFrame [MB_PDU_REQ_WRITE_MUL_REGCNT_OFF + 1 ] );
198
+
199
+ ucRegByteCount = ucMBFrame [MB_PDU_REQ_WRITE_MUL_BYTECNT_OFF ];
200
+
201
+ if ( ucRegByteCount == 2 * usRegCount )
202
+ {
203
+ /* Make callback to update the register values. */
204
+ eRegStatus =
205
+ eMBRegHoldingCB ( & ucMBFrame [MB_PDU_REQ_WRITE_MUL_VALUES_OFF ],
206
+ usRegAddress , usRegCount , MB_REG_WRITE );
207
+
208
+ /* If an error occured convert it into a Modbus exception. */
209
+ if ( eRegStatus != MB_ENOERR )
210
+ {
211
+ eStatus = prveMBError2Exception ( eRegStatus );
212
+ }
213
+ }
214
+ else
215
+ {
216
+ eStatus = MB_EX_ILLEGAL_DATA_VALUE ;
217
+ }
218
+ }
219
+ else
220
+ {
221
+ /* Can't be a valid request because the length is incorrect. */
222
+ eStatus = MB_EX_ILLEGAL_DATA_VALUE ;
223
+ }
224
+ return eStatus ;
225
+ }
132
226
#endif
133
227
134
228
#if MB_FUNC_READ_HOLDING_ENABLED > 0
@@ -146,23 +240,69 @@ eMBMasterReqReadHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRe
146
240
vMBMasterGetPDUSndBuf (& ucMBFrame );
147
241
vMBMasterSetDestAddress (ucSndAddr );
148
242
ucMBFrame [MB_PDU_FUNC_OFF ] = MB_FUNC_READ_HOLDING_REGISTER ;
149
- ucMBFrame [MB_PDU_FUNC_READ_ADDR_OFF ] = usRegAddr >> 8 ;
150
- ucMBFrame [MB_PDU_FUNC_READ_ADDR_OFF + 1 ] = usRegAddr ;
151
- ucMBFrame [MB_PDU_FUNC_READ_REGCNT_OFF ] = usNRegs >> 8 ;
152
- ucMBFrame [MB_PDU_FUNC_READ_REGCNT_OFF + 1 ] = usNRegs ;
153
- vMBMasterSetPDUSndLength ( MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE );
243
+ ucMBFrame [MB_PDU_REQ_READ_ADDR_OFF ] = usRegAddr >> 8 ;
244
+ ucMBFrame [MB_PDU_REQ_READ_ADDR_OFF + 1 ] = usRegAddr ;
245
+ ucMBFrame [MB_PDU_REQ_READ_REGCNT_OFF ] = usNRegs >> 8 ;
246
+ ucMBFrame [MB_PDU_REQ_READ_REGCNT_OFF + 1 ] = usNRegs ;
247
+ vMBMasterSetPDUSndLength ( MB_PDU_SIZE_MIN + MB_PDU_REQ_READ_SIZE );
154
248
( void ) xMBMasterPortEventPost ( EV_MASTER_FRAME_SENT );
155
249
}
156
250
return eErrStatus ;
157
251
}
158
252
253
+ eMBException
254
+ eMBMasterFuncReadHoldingRegister ( UCHAR * pucFrame , USHORT * usLen )
255
+ {
256
+ UCHAR * ucMBFrame ;
257
+ USHORT usRegAddress ;
258
+ USHORT usRegCount ;
259
+
260
+ eMBException eStatus = MB_EX_NONE ;
261
+ eMBErrorCode eRegStatus ;
262
+
263
+ if ( * usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN )
264
+ {
265
+ vMBMasterGetPDUSndBuf (& ucMBFrame );
266
+ usRegAddress = ( USHORT )( ucMBFrame [MB_PDU_REQ_READ_ADDR_OFF ] << 8 );
267
+ usRegAddress |= ( USHORT )( ucMBFrame [MB_PDU_REQ_READ_ADDR_OFF + 1 ] );
268
+ usRegAddress ++ ;
269
+
270
+ usRegCount = ( USHORT )( ucMBFrame [MB_PDU_REQ_READ_REGCNT_OFF ] << 8 );
271
+ usRegCount = ( USHORT )( ucMBFrame [MB_PDU_REQ_READ_REGCNT_OFF + 1 ] );
272
+
273
+ /* Check if the number of registers to read is valid. If not
274
+ * return Modbus illegal data value exception.
275
+ */
276
+ if ( ( usRegCount >= 1 ) && ( 2 * usRegCount == pucFrame [MB_PDU_FUNC_READ_BYTECNT_OFF ] ) )
277
+ {
278
+ /* Make callback to fill the buffer. */
279
+ eRegStatus = eMBRegHoldingCB ( & pucFrame [MB_PDU_FUNC_READ_VALUES_OFF ], usRegAddress , usRegCount , MB_REG_READ );
280
+ /* If an error occured convert it into a Modbus exception. */
281
+ if ( eRegStatus != MB_ENOERR )
282
+ {
283
+ eStatus = prveMBError2Exception ( eRegStatus );
284
+ }
285
+ }
286
+ else
287
+ {
288
+ eStatus = MB_EX_ILLEGAL_DATA_VALUE ;
289
+ }
290
+ }
291
+ else
292
+ {
293
+ /* Can't be a valid request because the length is incorrect. */
294
+ eStatus = MB_EX_ILLEGAL_DATA_VALUE ;
295
+ }
296
+ return eStatus ;
297
+ }
298
+
159
299
#endif
160
300
161
301
#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0
162
302
163
303
eMBMasterReqErrCode
164
- eMBMasterReqReadWriteMultipleHoldingRegister ( UCHAR ucSndAddr ,USHORT * pusDataBuffer , USHORT usReadRegAddr , USHORT usNReadRegs ,
165
- USHORT usWriteRegAddr , USHORT usNWriteRegs )
304
+ eMBMasterReqReadWriteMultipleHoldingRegister (UCHAR ucSndAddr , USHORT * pusDataBuffer , USHORT usWriteRegAddr ,
305
+ USHORT usNWriteRegs , USHORT usReadRegAddr , USHORT usNReadRegs )
166
306
{
167
307
UCHAR * ucMBFrame ;
168
308
USHORT usRegIndex = 0 ;
@@ -175,27 +315,80 @@ eMBMasterReqReadWriteMultipleHoldingRegister( UCHAR ucSndAddr,USHORT * pusDataBu
175
315
vMBMasterGetPDUSndBuf (& ucMBFrame );
176
316
vMBMasterSetDestAddress (ucSndAddr );
177
317
ucMBFrame [MB_PDU_FUNC_OFF ] = MB_FUNC_READWRITE_MULTIPLE_REGISTERS ;
178
- ucMBFrame [MB_PDU_FUNC_READWRITE_READ_ADDR_OFF ] = usReadRegAddr >> 8 ;
179
- ucMBFrame [MB_PDU_FUNC_READWRITE_READ_ADDR_OFF + 1 ] = usReadRegAddr ;
180
- ucMBFrame [MB_PDU_FUNC_READWRITE_READ_REGCNT_OFF ] = usNReadRegs >> 8 ;
181
- ucMBFrame [MB_PDU_FUNC_READWRITE_READ_REGCNT_OFF + 1 ] = usNReadRegs ;
182
- ucMBFrame [MB_PDU_FUNC_READWRITE_WRITE_ADDR_OFF ] = usWriteRegAddr >> 8 ;
183
- ucMBFrame [MB_PDU_FUNC_READWRITE_WRITE_ADDR_OFF + 1 ] = usWriteRegAddr ;
184
- ucMBFrame [MB_PDU_FUNC_READWRITE_WRITE_REGCNT_OFF ] = usNWriteRegs >> 8 ;
185
- ucMBFrame [MB_PDU_FUNC_READWRITE_WRITE_REGCNT_OFF + 1 ] = usNWriteRegs ;
186
- ucMBFrame [MB_PDU_FUNC_READWRITE_BYTECNT_OFF ] = usNWriteRegs * 2 ;
187
- ucMBFrame += MB_PDU_FUNC_READWRITE_WRITE_VALUES_OFF ;
318
+ ucMBFrame [MB_PDU_REQ_READWRITE_READ_ADDR_OFF ] = usReadRegAddr >> 8 ;
319
+ ucMBFrame [MB_PDU_REQ_READWRITE_READ_ADDR_OFF + 1 ] = usReadRegAddr ;
320
+ ucMBFrame [MB_PDU_REQ_READWRITE_READ_REGCNT_OFF ] = usNReadRegs >> 8 ;
321
+ ucMBFrame [MB_PDU_REQ_READWRITE_READ_REGCNT_OFF + 1 ] = usNReadRegs ;
322
+ ucMBFrame [MB_PDU_REQ_READWRITE_WRITE_ADDR_OFF ] = usWriteRegAddr >> 8 ;
323
+ ucMBFrame [MB_PDU_REQ_READWRITE_WRITE_ADDR_OFF + 1 ] = usWriteRegAddr ;
324
+ ucMBFrame [MB_PDU_REQ_READWRITE_WRITE_REGCNT_OFF ] = usNWriteRegs >> 8 ;
325
+ ucMBFrame [MB_PDU_REQ_READWRITE_WRITE_REGCNT_OFF + 1 ] = usNWriteRegs ;
326
+ ucMBFrame [MB_PDU_REQ_READWRITE_WRITE_BYTECNT_OFF ] = usNWriteRegs * 2 ;
327
+ ucMBFrame += MB_PDU_REQ_READWRITE_WRITE_VALUES_OFF ;
188
328
while ( usNWriteRegs > usRegIndex )
189
329
{
190
330
* ucMBFrame ++ = pusDataBuffer [usRegIndex ] >> 8 ;
191
331
* ucMBFrame ++ = pusDataBuffer [usRegIndex ++ ] ;
192
332
}
193
- vMBMasterSetPDUSndLength ( MB_PDU_SIZE_MIN + MB_PDU_FUNC_READWRITE_SIZE_MIN + 2 * usNWriteRegs );
333
+ vMBMasterSetPDUSndLength ( MB_PDU_SIZE_MIN + MB_PDU_REQ_READWRITE_SIZE_MIN + 2 * usNWriteRegs );
194
334
( void ) xMBMasterPortEventPost ( EV_MASTER_FRAME_SENT );
195
335
}
196
336
return eErrStatus ;
197
337
}
198
338
339
+ eMBException
340
+ eMBMasterFuncReadWriteMultipleHoldingRegister ( UCHAR * pucFrame , USHORT * usLen )
341
+ {
342
+ USHORT usRegReadAddress ;
343
+ USHORT usRegReadCount ;
344
+ USHORT usRegWriteAddress ;
345
+ USHORT usRegWriteCount ;
346
+ UCHAR * ucMBFrame ;
347
+
348
+ eMBException eStatus = MB_EX_NONE ;
349
+ eMBErrorCode eRegStatus ;
350
+
351
+ if ( * usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READWRITE_SIZE_MIN )
352
+ {
353
+ vMBMasterGetPDUSndBuf (& ucMBFrame );
354
+ usRegReadAddress = ( USHORT )( ucMBFrame [MB_PDU_REQ_READWRITE_READ_ADDR_OFF ] << 8U );
355
+ usRegReadAddress |= ( USHORT )( ucMBFrame [MB_PDU_REQ_READWRITE_READ_ADDR_OFF + 1 ] );
356
+ usRegReadAddress ++ ;
357
+
358
+ usRegReadCount = ( USHORT )( ucMBFrame [MB_PDU_REQ_READWRITE_READ_REGCNT_OFF ] << 8U );
359
+ usRegReadCount |= ( USHORT )( ucMBFrame [MB_PDU_REQ_READWRITE_READ_REGCNT_OFF + 1 ] );
360
+
361
+ usRegWriteAddress = ( USHORT )( ucMBFrame [MB_PDU_REQ_READWRITE_WRITE_ADDR_OFF ] << 8U );
362
+ usRegWriteAddress |= ( USHORT )( ucMBFrame [MB_PDU_REQ_READWRITE_WRITE_ADDR_OFF + 1 ] );
363
+ usRegWriteAddress ++ ;
364
+
365
+ usRegWriteCount = ( USHORT )( ucMBFrame [MB_PDU_REQ_READWRITE_WRITE_REGCNT_OFF ] << 8U );
366
+ usRegWriteCount |= ( USHORT )( ucMBFrame [MB_PDU_REQ_READWRITE_WRITE_REGCNT_OFF + 1 ] );
367
+
368
+ if ( ( 2 * usRegReadCount ) == pucFrame [MB_PDU_FUNC_READWRITE_READ_BYTECNT_OFF ] )
369
+ {
370
+ /* Make callback to update the register values. */
371
+ eRegStatus = eMBRegHoldingCB ( & ucMBFrame [MB_PDU_REQ_READWRITE_WRITE_VALUES_OFF ],
372
+ usRegWriteAddress , usRegWriteCount , MB_REG_WRITE );
373
+
374
+ if ( eRegStatus == MB_ENOERR )
375
+ {
376
+ /* Make the read callback. */
377
+ eRegStatus = eMBRegHoldingCB (& pucFrame [MB_PDU_FUNC_READWRITE_READ_VALUES_OFF ],
378
+ usRegReadAddress , usRegReadCount , MB_REG_READ );
379
+ }
380
+ if ( eRegStatus != MB_ENOERR )
381
+ {
382
+ eStatus = prveMBError2Exception ( eRegStatus );
383
+ }
384
+ }
385
+ else
386
+ {
387
+ eStatus = MB_EX_ILLEGAL_DATA_VALUE ;
388
+ }
389
+ }
390
+ return eStatus ;
391
+ }
199
392
#endif
200
393
#endif
201
394
0 commit comments