Skip to content

Commit 8aad6ae

Browse files
Bugfix lock object
1 parent 7c8f648 commit 8aad6ae

File tree

1 file changed

+141
-138
lines changed

1 file changed

+141
-138
lines changed

EasyModbus/ModbusServer.cs

Lines changed: 141 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -290,8 +290,8 @@ public class ModbusServer
290290
public bool FunctionCode16Disabled { get; set; }
291291
public bool FunctionCode23Disabled { get; set; }
292292
public bool PortChanged { get; set; }
293-
object lockCoils;
294-
object lockHoldingRegisters;
293+
object lockCoils = new object();
294+
object lockHoldingRegisters = new object();
295295

296296
#region events
297297
public delegate void CoilsChanged(int coil, int numberOfCoils);
@@ -455,168 +455,171 @@ private void numberOfClientsChanged()
455455
if (numberOfConnectedClientsChanged != null)
456456
numberOfConnectedClientsChanged();
457457
}
458-
#endregion
459-
458+
#endregion
459+
460+
object lockProcessReceivedData = new object();
460461
#region Method ProcessReceivedData
461462
private void ProcessReceivedData(object networkConnectionParameter)
462463
{
463-
Byte[] bytes = new byte[((NetworkConnectionParameter)networkConnectionParameter).bytes.Length];
464-
if (debug) StoreLogData.Instance.Store("Received Data: " + BitConverter.ToString(bytes), System.DateTime.Now);
465-
NetworkStream stream = ((NetworkConnectionParameter)networkConnectionParameter).stream;
466-
int portIn = ((NetworkConnectionParameter)networkConnectionParameter).portIn;
467-
IPAddress ipAddressIn = ((NetworkConnectionParameter)networkConnectionParameter).ipAddressIn;
468-
469-
470-
Array.Copy(((NetworkConnectionParameter)networkConnectionParameter).bytes, 0, bytes, 0, ((NetworkConnectionParameter)networkConnectionParameter).bytes.Length);
471-
472-
ModbusProtocol receiveDataThread = new ModbusProtocol();
473-
ModbusProtocol sendDataThread = new ModbusProtocol();
474-
475-
try
464+
lock (lockProcessReceivedData)
476465
{
477-
UInt16[] wordData = new UInt16[1];
478-
byte[] byteData = new byte[2];
479-
receiveDataThread.timeStamp = DateTime.Now;
480-
receiveDataThread.request = true;
481-
if (!serialFlag)
482-
{
483-
//Lese Transaction identifier
484-
byteData[1] = bytes[0];
485-
byteData[0] = bytes[1];
486-
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
487-
receiveDataThread.transactionIdentifier = wordData[0];
488-
489-
//Lese Protocol identifier
490-
byteData[1] = bytes[2];
491-
byteData[0] = bytes[3];
492-
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
493-
receiveDataThread.protocolIdentifier = wordData[0];
466+
Byte[] bytes = new byte[((NetworkConnectionParameter)networkConnectionParameter).bytes.Length];
467+
if (debug) StoreLogData.Instance.Store("Received Data: " + BitConverter.ToString(bytes), System.DateTime.Now);
468+
NetworkStream stream = ((NetworkConnectionParameter)networkConnectionParameter).stream;
469+
int portIn = ((NetworkConnectionParameter)networkConnectionParameter).portIn;
470+
IPAddress ipAddressIn = ((NetworkConnectionParameter)networkConnectionParameter).ipAddressIn;
494471

495-
//Lese length
496-
byteData[1] = bytes[4];
497-
byteData[0] = bytes[5];
498-
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
499-
receiveDataThread.length = wordData[0];
500-
}
501-
502-
//Lese unit identifier
503-
receiveDataThread.unitIdentifier = bytes[6 - 6 * Convert.ToInt32(serialFlag)];
504-
//Check UnitIdentifier
505-
if ((receiveDataThread.unitIdentifier != this.unitIdentifier) & (receiveDataThread.unitIdentifier != 0))
506-
return;
507472

508-
// Lese function code
509-
receiveDataThread.functionCode = bytes[7 - 6 * Convert.ToInt32(serialFlag)];
473+
Array.Copy(((NetworkConnectionParameter)networkConnectionParameter).bytes, 0, bytes, 0, ((NetworkConnectionParameter)networkConnectionParameter).bytes.Length);
510474

511-
// Lese starting address
512-
byteData[1] = bytes[8 - 6 * Convert.ToInt32(serialFlag)];
513-
byteData[0] = bytes[9 - 6 * Convert.ToInt32(serialFlag)];
514-
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
515-
receiveDataThread.startingAdress = wordData[0];
475+
ModbusProtocol receiveDataThread = new ModbusProtocol();
476+
ModbusProtocol sendDataThread = new ModbusProtocol();
516477

517-
if (receiveDataThread.functionCode <= 4)
518-
{
519-
// Lese quantity
520-
byteData[1] = bytes[10 - 6 * Convert.ToInt32(serialFlag)];
521-
byteData[0] = bytes[11 - 6 * Convert.ToInt32(serialFlag)];
522-
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
523-
receiveDataThread.quantity = wordData[0];
524-
}
525-
if (receiveDataThread.functionCode == 5)
526-
{
527-
receiveDataThread.receiveCoilValues = new ushort[1];
528-
// Lese Value
529-
byteData[1] = bytes[10 - 6 * Convert.ToInt32(serialFlag)];
530-
byteData[0] = bytes[11 - 6 * Convert.ToInt32(serialFlag)];
531-
Buffer.BlockCopy(byteData, 0, receiveDataThread.receiveCoilValues, 0, 2);
532-
}
533-
if (receiveDataThread.functionCode == 6)
534-
{
535-
receiveDataThread.receiveRegisterValues = new ushort[1];
536-
// Lese Value
537-
byteData[1] = bytes[10 - 6 * Convert.ToInt32(serialFlag)];
538-
byteData[0] = bytes[11 - 6 * Convert.ToInt32(serialFlag)];
539-
Buffer.BlockCopy(byteData, 0, receiveDataThread.receiveRegisterValues, 0, 2);
540-
}
541-
if (receiveDataThread.functionCode == 15)
478+
try
542479
{
543-
// Lese quantity
544-
byteData[1] = bytes[10 - 6 * Convert.ToInt32(serialFlag)];
545-
byteData[0] = bytes[11 - 6 * Convert.ToInt32(serialFlag)];
546-
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
547-
receiveDataThread.quantity = wordData[0];
480+
UInt16[] wordData = new UInt16[1];
481+
byte[] byteData = new byte[2];
482+
receiveDataThread.timeStamp = DateTime.Now;
483+
receiveDataThread.request = true;
484+
if (!serialFlag)
485+
{
486+
//Lese Transaction identifier
487+
byteData[1] = bytes[0];
488+
byteData[0] = bytes[1];
489+
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
490+
receiveDataThread.transactionIdentifier = wordData[0];
491+
492+
//Lese Protocol identifier
493+
byteData[1] = bytes[2];
494+
byteData[0] = bytes[3];
495+
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
496+
receiveDataThread.protocolIdentifier = wordData[0];
497+
498+
//Lese length
499+
byteData[1] = bytes[4];
500+
byteData[0] = bytes[5];
501+
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
502+
receiveDataThread.length = wordData[0];
503+
}
548504

549-
receiveDataThread.byteCount = bytes[12 - 6 * Convert.ToInt32(serialFlag)];
505+
//Lese unit identifier
506+
receiveDataThread.unitIdentifier = bytes[6 - 6 * Convert.ToInt32(serialFlag)];
507+
//Check UnitIdentifier
508+
if ((receiveDataThread.unitIdentifier != this.unitIdentifier) & (receiveDataThread.unitIdentifier != 0))
509+
return;
550510

551-
if ((receiveDataThread.byteCount % 2) != 0)
552-
receiveDataThread.receiveCoilValues = new ushort[receiveDataThread.byteCount / 2 + 1];
553-
else
554-
receiveDataThread.receiveCoilValues = new ushort[receiveDataThread.byteCount / 2];
555-
// Lese Value
556-
Buffer.BlockCopy(bytes, 13 - 6 * Convert.ToInt32(serialFlag), receiveDataThread.receiveCoilValues, 0, receiveDataThread.byteCount);
557-
}
558-
if (receiveDataThread.functionCode == 16)
559-
{
560-
// Lese quantity
561-
byteData[1] = bytes[10 - 6 * Convert.ToInt32(serialFlag)];
562-
byteData[0] = bytes[11 - 6 * Convert.ToInt32(serialFlag)];
511+
// Lese function code
512+
receiveDataThread.functionCode = bytes[7 - 6 * Convert.ToInt32(serialFlag)];
513+
514+
// Lese starting address
515+
byteData[1] = bytes[8 - 6 * Convert.ToInt32(serialFlag)];
516+
byteData[0] = bytes[9 - 6 * Convert.ToInt32(serialFlag)];
563517
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
564-
receiveDataThread.quantity = wordData[0];
518+
receiveDataThread.startingAdress = wordData[0];
565519

566-
receiveDataThread.byteCount = bytes[12 - 6 * Convert.ToInt32(serialFlag)];
567-
receiveDataThread.receiveRegisterValues = new ushort[receiveDataThread.quantity];
568-
for (int i = 0; i < receiveDataThread.quantity; i++)
520+
if (receiveDataThread.functionCode <= 4)
521+
{
522+
// Lese quantity
523+
byteData[1] = bytes[10 - 6 * Convert.ToInt32(serialFlag)];
524+
byteData[0] = bytes[11 - 6 * Convert.ToInt32(serialFlag)];
525+
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
526+
receiveDataThread.quantity = wordData[0];
527+
}
528+
if (receiveDataThread.functionCode == 5)
529+
{
530+
receiveDataThread.receiveCoilValues = new ushort[1];
531+
// Lese Value
532+
byteData[1] = bytes[10 - 6 * Convert.ToInt32(serialFlag)];
533+
byteData[0] = bytes[11 - 6 * Convert.ToInt32(serialFlag)];
534+
Buffer.BlockCopy(byteData, 0, receiveDataThread.receiveCoilValues, 0, 2);
535+
}
536+
if (receiveDataThread.functionCode == 6)
569537
{
538+
receiveDataThread.receiveRegisterValues = new ushort[1];
570539
// Lese Value
571-
byteData[1] = bytes[13 + i * 2 - 6 * Convert.ToInt32(serialFlag)];
572-
byteData[0] = bytes[14 + i * 2 - 6 * Convert.ToInt32(serialFlag)];
573-
Buffer.BlockCopy(byteData, 0, receiveDataThread.receiveRegisterValues, i * 2, 2);
540+
byteData[1] = bytes[10 - 6 * Convert.ToInt32(serialFlag)];
541+
byteData[0] = bytes[11 - 6 * Convert.ToInt32(serialFlag)];
542+
Buffer.BlockCopy(byteData, 0, receiveDataThread.receiveRegisterValues, 0, 2);
574543
}
544+
if (receiveDataThread.functionCode == 15)
545+
{
546+
// Lese quantity
547+
byteData[1] = bytes[10 - 6 * Convert.ToInt32(serialFlag)];
548+
byteData[0] = bytes[11 - 6 * Convert.ToInt32(serialFlag)];
549+
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
550+
receiveDataThread.quantity = wordData[0];
575551

576-
}
577-
if (receiveDataThread.functionCode == 23)
578-
{
579-
// Lese starting Address Read
580-
byteData[1] = bytes[8 - 6 * Convert.ToInt32(serialFlag)];
581-
byteData[0] = bytes[9 - 6 * Convert.ToInt32(serialFlag)];
582-
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
583-
receiveDataThread.startingAddressRead = wordData[0];
584-
// Lese quantity Read
585-
byteData[1] = bytes[10 - 6 * Convert.ToInt32(serialFlag)];
586-
byteData[0] = bytes[11 - 6 * Convert.ToInt32(serialFlag)];
587-
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
588-
receiveDataThread.quantityRead = wordData[0];
589-
// Lese starting Address Write
590-
byteData[1] = bytes[12 - 6 * Convert.ToInt32(serialFlag)];
591-
byteData[0] = bytes[13 - 6 * Convert.ToInt32(serialFlag)];
592-
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
593-
receiveDataThread.startingAddressWrite = wordData[0];
594-
// Lese quantity Write
595-
byteData[1] = bytes[14 - 6 * Convert.ToInt32(serialFlag)];
596-
byteData[0] = bytes[15 - 6 * Convert.ToInt32(serialFlag)];
597-
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
598-
receiveDataThread.quantityWrite = wordData[0];
552+
receiveDataThread.byteCount = bytes[12 - 6 * Convert.ToInt32(serialFlag)];
599553

600-
receiveDataThread.byteCount = bytes[16 - 6 * Convert.ToInt32(serialFlag)];
601-
receiveDataThread.receiveRegisterValues = new ushort[receiveDataThread.quantityWrite];
602-
for (int i = 0; i < receiveDataThread.quantityWrite; i++)
603-
{
554+
if ((receiveDataThread.byteCount % 2) != 0)
555+
receiveDataThread.receiveCoilValues = new ushort[receiveDataThread.byteCount / 2 + 1];
556+
else
557+
receiveDataThread.receiveCoilValues = new ushort[receiveDataThread.byteCount / 2];
604558
// Lese Value
605-
byteData[1] = bytes[17 + i * 2 - 6 * Convert.ToInt32(serialFlag)];
606-
byteData[0] = bytes[18 + i * 2 - 6 * Convert.ToInt32(serialFlag)];
607-
Buffer.BlockCopy(byteData, 0, receiveDataThread.receiveRegisterValues, i * 2, 2);
559+
Buffer.BlockCopy(bytes, 13 - 6 * Convert.ToInt32(serialFlag), receiveDataThread.receiveCoilValues, 0, receiveDataThread.byteCount);
560+
}
561+
if (receiveDataThread.functionCode == 16)
562+
{
563+
// Lese quantity
564+
byteData[1] = bytes[10 - 6 * Convert.ToInt32(serialFlag)];
565+
byteData[0] = bytes[11 - 6 * Convert.ToInt32(serialFlag)];
566+
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
567+
receiveDataThread.quantity = wordData[0];
568+
569+
receiveDataThread.byteCount = bytes[12 - 6 * Convert.ToInt32(serialFlag)];
570+
receiveDataThread.receiveRegisterValues = new ushort[receiveDataThread.quantity];
571+
for (int i = 0; i < receiveDataThread.quantity; i++)
572+
{
573+
// Lese Value
574+
byteData[1] = bytes[13 + i * 2 - 6 * Convert.ToInt32(serialFlag)];
575+
byteData[0] = bytes[14 + i * 2 - 6 * Convert.ToInt32(serialFlag)];
576+
Buffer.BlockCopy(byteData, 0, receiveDataThread.receiveRegisterValues, i * 2, 2);
577+
}
578+
579+
}
580+
if (receiveDataThread.functionCode == 23)
581+
{
582+
// Lese starting Address Read
583+
byteData[1] = bytes[8 - 6 * Convert.ToInt32(serialFlag)];
584+
byteData[0] = bytes[9 - 6 * Convert.ToInt32(serialFlag)];
585+
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
586+
receiveDataThread.startingAddressRead = wordData[0];
587+
// Lese quantity Read
588+
byteData[1] = bytes[10 - 6 * Convert.ToInt32(serialFlag)];
589+
byteData[0] = bytes[11 - 6 * Convert.ToInt32(serialFlag)];
590+
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
591+
receiveDataThread.quantityRead = wordData[0];
592+
// Lese starting Address Write
593+
byteData[1] = bytes[12 - 6 * Convert.ToInt32(serialFlag)];
594+
byteData[0] = bytes[13 - 6 * Convert.ToInt32(serialFlag)];
595+
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
596+
receiveDataThread.startingAddressWrite = wordData[0];
597+
// Lese quantity Write
598+
byteData[1] = bytes[14 - 6 * Convert.ToInt32(serialFlag)];
599+
byteData[0] = bytes[15 - 6 * Convert.ToInt32(serialFlag)];
600+
Buffer.BlockCopy(byteData, 0, wordData, 0, 2);
601+
receiveDataThread.quantityWrite = wordData[0];
602+
603+
receiveDataThread.byteCount = bytes[16 - 6 * Convert.ToInt32(serialFlag)];
604+
receiveDataThread.receiveRegisterValues = new ushort[receiveDataThread.quantityWrite];
605+
for (int i = 0; i < receiveDataThread.quantityWrite; i++)
606+
{
607+
// Lese Value
608+
byteData[1] = bytes[17 + i * 2 - 6 * Convert.ToInt32(serialFlag)];
609+
byteData[0] = bytes[18 + i * 2 - 6 * Convert.ToInt32(serialFlag)];
610+
Buffer.BlockCopy(byteData, 0, receiveDataThread.receiveRegisterValues, i * 2, 2);
611+
}
608612
}
609613
}
610-
}
611-
catch (Exception exc)
612-
{ }
613-
this.CreateAnswer(receiveDataThread, sendDataThread, stream, portIn, ipAddressIn);
614+
catch (Exception exc)
615+
{ }
616+
this.CreateAnswer(receiveDataThread, sendDataThread, stream, portIn, ipAddressIn);
614617
//this.sendAnswer();
615618
this.CreateLogData(receiveDataThread, sendDataThread);
616619

617620
if (logDataChanged != null)
618621
logDataChanged();
619-
622+
}
620623
}
621624
#endregion
622625

0 commit comments

Comments
 (0)