1
- using System ;
1
+ using DataService ;
2
+ using System ;
2
3
using System . Collections . Generic ;
3
4
using System . ComponentModel ;
4
5
using System . IO ;
5
6
using System . IO . Ports ;
6
7
using System . Text ;
7
- using System . Timers ;
8
- using DataService ;
9
8
10
9
namespace ModbusDriver
11
10
{
@@ -111,8 +110,8 @@ public ModbusRTUReader(IDataServer server, short id, string name, string port =
111
110
_serialPort . DataBits = 8 ;
112
111
_serialPort . Parity = Parity . Even ;
113
112
_serialPort . StopBits = StopBits . One ;
114
- if ( ! string . IsNullOrEmpty ( spare1 ) ) byte . TryParse ( spare1 , out _slaveId ) ;
115
113
}
114
+
116
115
private SerialPort _serialPort ;
117
116
118
117
/*
@@ -125,10 +124,10 @@ public ModbusRTUReader(IDataServer server, short id, string name, string port =
125
124
Long:代表有符号的64位整数,范围从-9223372036854775808 ~ 9223372036854775808
126
125
Ulong:代表无符号的64位整数,范围从0 ~ 18446744073709551615。
127
126
*/
128
- private byte [ ] CreateReadHeader ( int startAddress , ushort length , byte function )
127
+ private byte [ ] CreateReadHeader ( int id , int startAddress , ushort length , byte function )
129
128
{
130
129
byte [ ] data = new byte [ 8 ] ;
131
- data [ 0 ] = _slaveId ; // Slave id high byte 从站地址
130
+ data [ 0 ] = ( byte ) id ; // Slave id high byte 从站地址
132
131
data [ 1 ] = function ; // Message size
133
132
byte [ ] _adr = BitConverter . GetBytes ( ( short ) startAddress ) ; //以字节数组的形式返回指定的 16 位无符号整数值。
134
133
//apply on small endian, TODO:support big endian
@@ -145,10 +144,10 @@ private byte[] CreateReadHeader(int startAddress, ushort length, byte function)
145
144
}
146
145
147
146
#region 写单个线圈或单个离散输出 功能码:0x05
148
- public byte [ ] WriteSingleCoils ( int startAddress , bool OnOff )
147
+ public byte [ ] WriteSingleCoils ( int id , int startAddress , bool OnOff )
149
148
{
150
149
byte [ ] data = new byte [ 8 ] ;
151
- data [ 0 ] = _slaveId ; // Slave id high byte
150
+ data [ 0 ] = ( byte ) id ; // Slave id high byte
152
151
data [ 1 ] = Modbus . fctWriteSingleCoil ; // Function code
153
152
byte [ ] _adr = BitConverter . GetBytes ( ( short ) startAddress ) ;
154
153
data [ 2 ] = _adr [ 1 ] ; // Start address
@@ -162,11 +161,11 @@ public byte[] WriteSingleCoils(int startAddress, bool OnOff)
162
161
#endregion
163
162
164
163
#region 写多个线圈 功能码:0x0F 15
165
- public byte [ ] WriteMultipleCoils ( int startAddress , ushort numBits , byte [ ] values )
164
+ public byte [ ] WriteMultipleCoils ( int id , int startAddress , ushort numBits , byte [ ] values )
166
165
{
167
166
int len = values . Length ;
168
167
byte [ ] data = new byte [ len + 9 ] ;
169
- data [ 0 ] = _slaveId ; // Slave id high byte 从站地址高八位
168
+ data [ 0 ] = ( byte ) id ; // Slave id high byte 从站地址高八位
170
169
data [ 1 ] = Modbus . fctWriteMultipleCoils ; // Function code 功能码
171
170
byte [ ] _adr = BitConverter . GetBytes ( ( short ) startAddress ) ;
172
171
data [ 2 ] = _adr [ 1 ] ; // Start address 开始地址高八位
@@ -184,10 +183,10 @@ public byte[] WriteMultipleCoils(int startAddress, ushort numBits, byte[] values
184
183
#endregion
185
184
186
185
#region 写单个保持寄存器 功能码:0x06
187
- public byte [ ] WriteSingleRegister ( int startAddress , byte [ ] values )
186
+ public byte [ ] WriteSingleRegister ( int id , int startAddress , byte [ ] values )
188
187
{
189
188
byte [ ] data = new byte [ 8 ] ;
190
- data [ 0 ] = _slaveId ; // Slave id high byte 从站地址高八位
189
+ data [ 0 ] = ( byte ) id ; // Slave id high byte 从站地址高八位
191
190
data [ 1 ] = Modbus . fctWriteSingleRegister ; // Function code 功能码
192
191
byte [ ] _adr = BitConverter . GetBytes ( ( short ) startAddress ) ;
193
192
data [ 2 ] = _adr [ 1 ] ; // Start address 开始地址高八位
@@ -202,12 +201,12 @@ public byte[] WriteSingleRegister(int startAddress, byte[] values)
202
201
#endregion
203
202
204
203
#region 写多个保持寄存器 功能码:0x10 16
205
- public byte [ ] WriteMultipleRegister ( int startAddress , byte [ ] values )
204
+ public byte [ ] WriteMultipleRegister ( int id , int startAddress , byte [ ] values )
206
205
{
207
206
int len = values . Length ;
208
207
if ( len % 2 > 0 ) len ++ ;
209
208
byte [ ] data = new byte [ len + 9 ] ;
210
- data [ 0 ] = _slaveId ; // Slave id high byte 从站地址
209
+ data [ 0 ] = ( byte ) id ; // Slave id high byte 从站地址
211
210
data [ 1 ] = Modbus . fctWriteMultipleRegister ; // Function code 功能码
212
211
byte [ ] _adr = BitConverter . GetBytes ( ( short ) startAddress ) ;
213
212
data [ 2 ] = _adr [ 1 ] ; // Start address 开始地址高八位
@@ -237,47 +236,47 @@ public int PDU
237
236
get { return 0xFD ; } //0xFD 十进制为253
238
237
}
239
238
240
- byte _slaveId ; //设备ID 单元号 字节号
241
- /// <summary>
242
- /// 设备ID 单元号 字节号
243
- /// </summary>
244
- public byte SlaveId
245
- {
246
- get { return _slaveId ; }
247
- set { _slaveId = value ; }
248
- }
249
-
250
239
public DeviceAddress GetDeviceAddress ( string address )
251
240
{
252
241
DeviceAddress dv = DeviceAddress . Empty ;
253
242
if ( string . IsNullOrEmpty ( address ) )
254
243
return dv ;
244
+ var sindex = address . IndexOf ( ':' ) ;
245
+ if ( sindex > 0 )
246
+ {
247
+ int slaveId ;
248
+ if ( int . TryParse ( address . Substring ( 0 , sindex ) , out slaveId ) )
249
+ dv . Area = slaveId ;
250
+ address = address . Substring ( sindex + 1 ) ;
251
+ }
255
252
switch ( address [ 0 ] )
256
253
{
257
254
case '0' :
258
255
{
259
- dv . Area = Modbus . fctReadCoil ;
256
+ dv . DBNumber = Modbus . fctReadCoil ;
260
257
int st ;
261
258
int . TryParse ( address , out st ) ;
262
259
dv . Bit = ( byte ) ( st % 16 ) ;
263
260
st /= 16 ;
264
261
dv . Start = st ;
262
+ dv . Bit -- ;
265
263
}
266
264
break ;
267
265
case '1' :
268
266
{
269
- dv . Area = Modbus . fctReadDiscreteInputs ;
267
+ dv . DBNumber = Modbus . fctReadDiscreteInputs ;
270
268
int st ;
271
269
int . TryParse ( address . Substring ( 1 ) , out st ) ;
272
270
dv . Bit = ( byte ) ( st % 16 ) ;
273
271
st /= 16 ;
274
272
dv . Start = st ;
273
+ dv . Bit -- ;
275
274
}
276
275
break ;
277
276
case '4' :
278
277
{
279
278
int index = address . IndexOf ( '.' ) ;
280
- dv . Area = Modbus . fctReadHoldingRegister ;
279
+ dv . DBNumber = Modbus . fctReadHoldingRegister ;
281
280
if ( index > 0 )
282
281
{
283
282
dv . Start = int . Parse ( address . Substring ( 1 , index - 1 ) ) ;
@@ -286,12 +285,14 @@ public DeviceAddress GetDeviceAddress(string address)
286
285
else
287
286
dv . Start = int . Parse ( address . Substring ( 1 ) ) ;
288
287
dv . Start -- ;
288
+ dv . Bit -- ;
289
+ dv . ByteOrder = ByteOrder . Network ;
289
290
}
290
291
break ;
291
292
case '3' :
292
293
{
293
294
int index = address . IndexOf ( '.' ) ;
294
- dv . Area = Modbus . fctReadInputRegister ;
295
+ dv . DBNumber = Modbus . fctReadInputRegister ;
295
296
if ( index > 0 )
296
297
{
297
298
dv . Start = int . Parse ( address . Substring ( 1 , index - 1 ) ) ;
@@ -300,10 +301,11 @@ public DeviceAddress GetDeviceAddress(string address)
300
301
else
301
302
dv . Start = int . Parse ( address . Substring ( 1 ) ) ;
302
303
dv . Start -- ;
304
+ dv . Bit -- ;
305
+ dv . ByteOrder = ByteOrder . Network ;
303
306
}
304
307
break ;
305
308
}
306
- dv . Bit -- ;
307
309
return dv ;
308
310
}
309
311
@@ -317,11 +319,11 @@ public string GetAddress(DeviceAddress address)
317
319
object _async = new object ( ) ;
318
320
public byte [ ] ReadBytes ( DeviceAddress address , ushort size )
319
321
{
320
- int area = address . Area ;
322
+ var func = ( byte ) address . DBNumber ;
321
323
try
322
324
{
323
- byte [ ] header = area == Modbus . fctReadCoil ? CreateReadHeader ( address . Start * 16 , ( ushort ) ( 16 * size ) , ( byte ) area ) :
324
- CreateReadHeader ( address . Start , size , ( byte ) area ) ;
325
+ byte [ ] header = func < 3 ? CreateReadHeader ( address . Area , address . Start * 16 , ( ushort ) ( 16 * size ) , func ) :
326
+ CreateReadHeader ( address . Area , address . Start , size , func ) ;
325
327
_serialPort . Write ( header , 0 , header . Length ) ;
326
328
byte [ ] frameBytes = new byte [ size * 2 + 5 ] ;
327
329
byte [ ] data = new byte [ size * 2 ] ;
@@ -330,7 +332,7 @@ public byte[] ReadBytes(DeviceAddress address, ushort size)
330
332
{
331
333
while ( numBytesRead != frameBytes . Length )
332
334
numBytesRead += _serialPort . Read ( frameBytes , numBytesRead , frameBytes . Length - numBytesRead ) ;
333
- if ( frameBytes [ 0 ] == _slaveId && Utility . CheckSumCRC ( frameBytes ) )
335
+ if ( frameBytes [ 0 ] == func && Utility . CheckSumCRC ( frameBytes ) )
334
336
{
335
337
Array . Copy ( frameBytes , 3 , data , 0 , data . Length ) ;
336
338
return data ;
@@ -348,14 +350,14 @@ public byte[] ReadBytes(DeviceAddress address, ushort size)
348
350
349
351
public ItemData < int > ReadInt32 ( DeviceAddress address )
350
352
{
351
- byte [ ] bit = ReadBytes ( address , 4 ) ;
353
+ byte [ ] bit = ReadBytes ( address , 2 ) ;
352
354
return bit == null ? new ItemData < int > ( 0 , 0 , QUALITIES . QUALITY_BAD ) :
353
355
new ItemData < int > ( BitConverter . ToInt32 ( bit , 0 ) , 0 , QUALITIES . QUALITY_GOOD ) ;
354
356
}
355
357
356
358
public ItemData < uint > ReadUInt32 ( DeviceAddress address )
357
359
{
358
- byte [ ] bit = ReadBytes ( address , 4 ) ;
360
+ byte [ ] bit = ReadBytes ( address , 2 ) ;
359
361
return bit == null ? new ItemData < uint > ( 0 , 0 , QUALITIES . QUALITY_BAD ) :
360
362
new ItemData < uint > ( BitConverter . ToUInt32 ( bit , 0 ) , 0 , QUALITIES . QUALITY_GOOD ) ;
361
363
}
@@ -409,7 +411,7 @@ public ItemData<object> ReadValue(DeviceAddress address)
409
411
410
412
public int WriteBytes ( DeviceAddress address , byte [ ] bit )
411
413
{
412
- var data = WriteMultipleRegister ( address . Start , bit ) ;
414
+ var data = WriteMultipleRegister ( address . Area , address . Start , bit ) ;
413
415
_serialPort . Write ( data , 0 , data . Length ) ;
414
416
_serialPort . ReadByte ( ) ;
415
417
var chr = _serialPort . ReadByte ( ) ;
@@ -418,7 +420,7 @@ public int WriteBytes(DeviceAddress address, byte[] bit)
418
420
419
421
public int WriteBit ( DeviceAddress address , bool bit )
420
422
{
421
- var data = WriteSingleCoils ( address . Start + address . Bit , bit ) ;
423
+ var data = WriteSingleCoils ( address . Area , address . Start + address . Bit , bit ) ;
422
424
_serialPort . Write ( data , 0 , data . Length ) ;
423
425
_serialPort . ReadByte ( ) ;
424
426
var chr = _serialPort . ReadByte ( ) ;
@@ -427,7 +429,7 @@ public int WriteBit(DeviceAddress address, bool bit)
427
429
428
430
public int WriteBits ( DeviceAddress address , byte bits )
429
431
{
430
- var data = WriteSingleRegister ( address . Start , new byte [ ] { bits } ) ;
432
+ var data = WriteSingleRegister ( address . Area , address . Start , new byte [ ] { bits } ) ;
431
433
_serialPort . Write ( data , 0 , data . Length ) ;
432
434
_serialPort . ReadByte ( ) ;
433
435
var chr = _serialPort . ReadByte ( ) ;
@@ -436,23 +438,23 @@ public int WriteBits(DeviceAddress address, byte bits)
436
438
437
439
public int WriteInt16 ( DeviceAddress address , short value )
438
440
{
439
- var data = WriteSingleRegister ( address . Start , BitConverter . GetBytes ( value ) ) ;
441
+ var data = WriteSingleRegister ( address . Area , address . Start , BitConverter . GetBytes ( value ) ) ;
440
442
_serialPort . Write ( data , 0 , data . Length ) ;
441
443
var chr = _serialPort . ReadByte ( ) ;
442
444
return ( chr & 0x80 ) > 0 ? - 1 : 0 ;
443
445
}
444
446
445
447
public int WriteUInt16 ( DeviceAddress address , ushort value )
446
448
{
447
- var data = WriteSingleRegister ( address . Start , BitConverter . GetBytes ( value ) ) ;
449
+ var data = WriteSingleRegister ( address . Area , address . Start , BitConverter . GetBytes ( value ) ) ;
448
450
_serialPort . Write ( data , 0 , data . Length ) ;
449
451
var chr = _serialPort . ReadByte ( ) ;
450
452
return ( chr & 0x80 ) > 0 ? - 1 : 0 ;
451
453
}
452
454
453
455
public int WriteUInt32 ( DeviceAddress address , uint value )
454
456
{
455
- var data = WriteMultipleRegister ( address . Start , BitConverter . GetBytes ( value ) ) ;
457
+ var data = WriteMultipleRegister ( address . Area , address . Start , BitConverter . GetBytes ( value ) ) ;
456
458
_serialPort . Write ( data , 0 , data . Length ) ;
457
459
_serialPort . ReadByte ( ) ;
458
460
var chr = _serialPort . ReadByte ( ) ;
@@ -461,7 +463,7 @@ public int WriteUInt32(DeviceAddress address, uint value)
461
463
462
464
public int WriteInt32 ( DeviceAddress address , int value )
463
465
{
464
- var data = WriteMultipleRegister ( address . Start , BitConverter . GetBytes ( value ) ) ;
466
+ var data = WriteMultipleRegister ( address . Area , address . Start , BitConverter . GetBytes ( value ) ) ;
465
467
_serialPort . Write ( data , 0 , data . Length ) ;
466
468
_serialPort . ReadByte ( ) ;
467
469
var chr = _serialPort . ReadByte ( ) ;
@@ -470,7 +472,7 @@ public int WriteInt32(DeviceAddress address, int value)
470
472
471
473
public int WriteFloat ( DeviceAddress address , float value )
472
474
{
473
- var data = WriteMultipleRegister ( address . Start , BitConverter . GetBytes ( value ) ) ;
475
+ var data = WriteMultipleRegister ( address . Area , address . Start , BitConverter . GetBytes ( value ) ) ;
474
476
_serialPort . Write ( data , 0 , data . Length ) ;
475
477
_serialPort . ReadByte ( ) ;
476
478
var chr = _serialPort . ReadByte ( ) ;
@@ -479,11 +481,11 @@ public int WriteFloat(DeviceAddress address, float value)
479
481
480
482
public int WriteString ( DeviceAddress address , string str )
481
483
{
482
- var data = WriteMultipleRegister ( address . Start , Encoding . ASCII . GetBytes ( str ) ) ;
484
+ var data = WriteMultipleRegister ( address . Area , address . Start , Encoding . ASCII . GetBytes ( str ) ) ;
483
485
_serialPort . Write ( data , 0 , data . Length ) ;
484
486
_serialPort . ReadByte ( ) ;
485
487
var chr = _serialPort . ReadByte ( ) ;
486
- return chr == _slaveId ? - 1 : 0 ;
488
+ return chr == address . DBNumber ? - 1 : 0 ;
487
489
}
488
490
489
491
public int WriteValue ( DeviceAddress address , object value )
0 commit comments