private void WriteMultipleRegisters(ModbusTransferData modbusTransferData)
        {
            var data = modbusTransferData.Data;

            var address = data.GetUint16(0);
            var numOfRegistersToWrite = data.GetUint16(2);
            var numOfBytes            = data[4];

            var registersData = new ushort[numOfRegistersToWrite];

            Buffer.BlockCopy(data, 5, registersData, 0, numOfBytes);

            for (int i = 0; i < numOfRegistersToWrite; i++)
            {
                HoldingRegisters[address + i] = registersData[i];
            }

            var newData = new byte[4];

            Buffer.BlockCopy(modbusTransferData.Data, 2, newData, 0, newData.Length);

            SendResponse(new ModbusTransferData(
                             modbusTransferData.DeviceAddress,
                             modbusTransferData.Command,
                             newData));
        }
        private void WriteMultipleCoils(ModbusTransferData modbusTransferData)
        {
            var data = modbusTransferData.Data;

            var address           = data.GetUint16(0);
            var numOfCoilsToWrite = data.GetUint16(2);
            var numOfBytes        = data[4];

            var coilsData = new byte[numOfBytes];

            Buffer.BlockCopy(data, 5, coilsData, 0, coilsData.Length);

            var bitArray = new BitArray(coilsData);

            for (int i = 0; i < numOfCoilsToWrite; i++)
            {
                Coils[address + i] = bitArray[i];
            }

            var newData = new byte[4];

            Buffer.BlockCopy(modbusTransferData.Data, 2, newData, 0, newData.Length);

            SendResponse(new ModbusTransferData(
                             modbusTransferData.DeviceAddress,
                             modbusTransferData.Command,
                             newData));
        }
        private void WriteSingleRegister(ModbusTransferData modbusTransferData)
        {
            var data = modbusTransferData.Data;

            var address      = data.GetUint16(0);
            var valueToWrite = data.GetUint16(2);

            HoldingRegisters[address] = valueToWrite;

            SendResponse(modbusTransferData);
        }
Beispiel #4
0
 public void SendAsSlave(ModbusTransferData transferData)
 {
     if (!_connected)
     {
         OnMastersDataReceived(transferData.EncodeTransferData(), 1);
     }
     else
     {
         _modbusSlavesClient.WriteLine(transferData.EncodeTransferData());
     }
 }
        private void OnSlavesDataReceived(ModbusTransferData modbusTransferData)
        {
            if (modbusTransferData.DeviceAddress == 0)
            {
                OnDataReceived(modbusTransferData);
            }

            if (modbusTransferData.DeviceAddress == _slaveModuleProcess.Identifier)
            {
                OnDataReceived(modbusTransferData);
            }
        }
Beispiel #6
0
        public void SendAsMaster(ModbusTransferData transferData, byte masterIdentifier)
        {
            _logger.WriteDebug("-------------------------------------------------------------------");

            if (!_connected)
            {
                OnSlavesDataReceived(transferData.EncodeTransferData());
            }
            else
            {
                _modbusMasterClients[masterIdentifier].WriteLine(transferData.EncodeTransferData());
            }
        }
Beispiel #7
0
        private void OnMastersDataReceived(ModbusTransferData modbusTransferData, byte masterIdentifier)
        {
            if (modbusTransferData.DeviceAddress != 0)
            {
                return;
            }
            if (masterIdentifier != MasterModuleProcess.Identifier)
            {
                return;
            }

            OnDataReceived(modbusTransferData);
        }
        private void ReadHoldingOrInputRegisters(ModbusTransferData modbusTransferData, ushort[] holdingOrInput)
        {
            var data = modbusTransferData.Data;

            var startAddress = data.GetUint16(0);
            var numOfHoldingOrInputRegistersToRead = data.GetUint16(2);

            var newData = new ushort[numOfHoldingOrInputRegistersToRead];

            Array.Copy(holdingOrInput, startAddress, newData, 0, numOfHoldingOrInputRegistersToRead);

            SendReadHoldingOrInputRegisterResponse(
                modbusTransferData.Command,
                newData);
        }
        private void ReadCoilsOrInputs(ModbusTransferData modbusTransferData, BitArray coilsOrInputs)
        {
            var data = modbusTransferData.Data;

            var startAddress             = data.GetUint16(0);
            var numOfCoilsOrInputsToRead = data.GetUint16(2);

            var bitArray = coilsOrInputs.Get(
                startAddress,
                numOfCoilsOrInputsToRead);

            SendReadCoilsOrInputsResponse(
                modbusTransferData.Command,
                bitArray);
        }
Beispiel #10
0
        private void OnSlavesDataReceived(string data)
        {
            _logger.WriteDebug(String.Format("Slaves data received: {0}", data.Trim()));

            ModbusTransferData decodedMessage;

            try {
                decodedMessage = new ModbusTransferData(data);
            } catch (ArgumentException) {
                _logger.WriteDebug("!ERROR! Problems during decoding.");
                return;
            }

            _logger.WriteDebug(String.Format("Decoded as: {0}", decodedMessage));

            if (SlavesDataReceived != null)
            {
                SlavesDataReceived(decodedMessage);
            }
        }
        private void OnDataReceived(ModbusTransferData modbusTransferData)
        {
            switch (modbusTransferData.Command)
            {
            case ModbusCommand.ReadCoils:
                ReadCoilsOrInputs(modbusTransferData, Coils);
                break;

            case ModbusCommand.ReadInputs:
                ReadCoilsOrInputs(modbusTransferData, Inputs);
                break;

            case ModbusCommand.ReadHoldingRegisters:
                ReadHoldingOrInputRegisters(modbusTransferData, HoldingRegisters);
                break;

            case ModbusCommand.ReadInputRegisters:
                ReadHoldingOrInputRegisters(modbusTransferData, InputRegisters);
                break;

            case ModbusCommand.WriteSingleCoil:
                WriteSingleCoil(modbusTransferData);
                break;

            case ModbusCommand.WriteSingleRegister:
                WriteSingleRegister(modbusTransferData);
                break;

            case ModbusCommand.WriteMultipleCoils:
                WriteMultipleCoils(modbusTransferData);
                break;

            case ModbusCommand.WriteMultipleRegisters:
                WriteMultipleRegisters(modbusTransferData);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        private void WriteSingleCoil(ModbusTransferData modbusTransferData)
        {
            var data = modbusTransferData.Data;

            var address     = data.GetUint16(0);
            var booleanData = data.GetUint16(2);

            switch (booleanData)
            {
            case 0xFF00:
                Coils[address] = true;
                break;

            case 0x0000:
                Coils[address] = false;
                break;

            default:
                throw new IndexOutOfRangeException();
            }
            SendResponse(modbusTransferData);
        }
 private void SendResponse(ModbusTransferData modbusTransferData)
 {
     _modbusTransferManager.SendAsSlave(modbusTransferData);
 }
Beispiel #14
0
 protected override void OnDataReceived(ModbusTransferData modbusTransferData)
 {
     LastResponse = modbusTransferData.ToString();
 }
Beispiel #15
0
 protected abstract void OnDataReceived(ModbusTransferData modbusTransferData);