Beispiel #1
0
        /// <summary>
        /// Simple Modbus TCP slave example.
        /// </summary>
        public static void StartModbusTcpSlave()
        {
            byte      slaveId = 1;
            int       port    = 502;
            IPAddress address = new IPAddress(new byte[] { 127, 0, 0, 1 });

            // create and start the TCP slave
            TcpListener slaveTcpListener = new TcpListener(address, port);

            slaveTcpListener.Start();

            ModbusSlave slave = ModbusTcpSlave.CreateTcp(slaveId, slaveTcpListener);

            slave.DataStore = DataStoreFactory.CreateDefaultDataStore();

            slave.Listen();

            // prevent the main thread from exiting
            Thread.Sleep(Timeout.Infinite);
        }
        public ModbusTCPSlaveDevice(Project theProject)
        {
            mProject = theProject;

            // TODO: make ID and port properties and "start" object after fully initialized (register as needing "start" after config fully processed?  add a method to all objects which gets called after object is fully config'ed?
            byte slaveID = 1;
            int  port    = 502;
            //IPAddress address = new IPAddress(new byte[] { 127, 0, 0, 1 });

            // create and start the TCP slave
            TcpListener slaveTcpListener = new TcpListener(port);

            slaveTcpListener.Start();
            mSlave           = ModbusTcpSlave.CreateTcp(slaveID, slaveTcpListener);
            mSlave.DataStore = DataStoreFactory.CreateDefaultDataStore();
            Thread slaveThread = new Thread(mSlave.Listen);

            slaveThread.Start();
            theProject.globalModbusSlave = this;
        }
Beispiel #3
0
        /// <summary>
        /// Simple Modbus serial RTU slave example.
        /// </summary>
        public static void StartModbusSerialRtuSlave()
        {
            using (SerialPort slavePort = new SerialPort("COM2"))
            {
                // configure serial port
                slavePort.BaudRate = 9600;
                slavePort.DataBits = 8;
                slavePort.Parity   = Parity.None;
                slavePort.StopBits = StopBits.One;
                slavePort.Open();

                byte unitId = 1;

                // create modbus slave
                ModbusSlave slave = ModbusSerialSlave.CreateRtu(unitId, slavePort);
                slave.DataStore = DataStoreFactory.CreateDefaultDataStore();

                slave.Listen();
            }
        }
Beispiel #4
0
        /// <summary>
        ///     Simple Modbus serial ASCII slave example.
        /// </summary>
        public static void StartModbusSerialAsciiSlave()
        {
            using (SerialPort slavePort = new SerialPort("COM2"))
            {
                // configure serial port
                slavePort.BaudRate = 9600;
                slavePort.DataBits = 8;
                slavePort.Parity   = Parity.None;
                slavePort.StopBits = StopBits.One;
                slavePort.Open();

                byte unitId = 1;

                var adapter = new SerialPortAdapter(slavePort);
                // create modbus slave
                ModbusSlave slave = ModbusSerialSlave.CreateAscii(unitId, adapter);
                slave.DataStore = DataStoreFactory.CreateDefaultDataStore();

                slave.ListenAsync().GetAwaiter().GetResult();
            }
        }
Beispiel #5
0
        /// <summary>
        ///     Simple Modbus TCP slave example.
        /// </summary>
        public void StartModbusTcpSlave()
        {
            byte slaveId = 1;

            int port = 502;

            IPAddress address = new IPAddress(new byte[] { 127, 0, 0, 1 });

            // create and start the TCP slave

            TcpListener slaveTcpListener = new TcpListener(address, port);

            slaveTcpListener.Start();



            ModbusSlave slave = ModbusTcpSlave.CreateTcp(slaveId, slaveTcpListener);

            slave.DataStore = DataStoreFactory.CreateDefaultDataStore();

            slave.ListenAsync().GetAwaiter().GetResult();
        }
Beispiel #6
0
        /// <summary>
        /// This method creates a modbus slave on the desired port.
        /// </summary>
        /// <param name="commPort">
        /// The name for the slave serial port
        /// </param>
        /// <param name="baudRate">
        /// the serial port baud rate
        /// </param>
        /// <param name="dataStore">
        /// The data store object used for registers
        /// </param>
        public void initialize(string commPort, int baudRate, out DataStore dataStore)
        {
            //configure Modbus Slave
            SerialPort slavePort = new SerialPort(commPort);

            slavePort.BaudRate = baudRate;
            slavePort.DataBits = 8;
            slavePort.Parity   = Parity.None;
            slavePort.StopBits = StopBits.One;
            slavePort.Open();

            byte slaveId = 1;

            //create slave on seperate thread
            ModbusSlave slave = ModbusSerialSlave.CreateRtu(slaveId, slavePort);

            slave.DataStore = DataStoreFactory.CreateDefaultDataStore();
            dataStore       = slave.DataStore;
            Thread slaveThread = new Thread(new ThreadStart(slave.Listen));

            slaveThread.Start();
        }
Beispiel #7
0
        /// <summary>
        ///     Simple Modbus TCP slave example.
        /// </summary>
        public static void StartModbusTcpSlave()
        {
            byte      slaveId = 1;
            int       port    = 503;
            IPAddress address = new IPAddress(new byte[] { 127, 0, 0, 1 });

            // create and start the TCP slave
#pragma warning disable CS0618 // Тип или член устарел
            TcpListener slaveTcpListener = new TcpListener(port);
#pragma warning restore CS0618 // Тип или член устарел
            slaveTcpListener.Start();

            ModbusSlave slave = ModbusTcpSlave.CreateTcp(slaveId, slaveTcpListener);
            slave.DataStore = DataStoreFactory.CreateDefaultDataStore();
            //slave.Transport.ReadTimeout = 3000;
            //slave.Transport.WriteTimeout = 3000;

            slave.Listen();

            // prevent the main thread from exiting
            Thread.Sleep(Timeout.Infinite);
        }
Beispiel #8
0
        /// <summary>
        /// Simple Modbus serial RTU slave example.
        /// </summary>
        public static void StartModbusSerialRtuSlave()
        {
            using (SerialPort slavePort = new SerialPort("COM2"))
            {
                // configure serial port
                slavePort.BaudRate = 9600;
                slavePort.DataBits = 8;
                slavePort.Parity   = Parity.None;
                slavePort.StopBits = StopBits.One;
                slavePort.Open();

                byte unitId = 1;

                // create modbus slave
                ModbusSlave slave = ModbusSerialSlave.CreateRtu(unitId, slavePort);
                slave.DataStore = DataStoreFactory.CreateDefaultDataStore();

                slave.Listen();

                slave.ModbusSlaveRequestReceived += (obj, args) => { Console.WriteLine("[MODBUS SLAVE] I HAVE it!!!"); };
            }
        }
Beispiel #9
0
        public static void Slave(string selectedPort, string selectedBaudRate, string selectedParity, string selectedDataBits, string selectedStopBits)
        {
            int baudRate = int.Parse(selectedBaudRate);
            int dataBits = int.Parse(selectedDataBits);


            using (SerialPort slavePort = new SerialPort(selectedPort))
            {
                slavePort.BaudRate = baudRate;
                slavePort.DataBits = dataBits;
                SetParity(selectedParity, slavePort);
                SetStopBits(selectedStopBits, slavePort);
                slavePort.Open();

                slave           = ModbusSerialSlave.CreateRtu(1, slavePort);
                slave.DataStore = DataStoreFactory.CreateDefaultDataStore();
                slave.DataStore.DataStoreWrittenTo += new EventHandler <DataStoreEventArgs>(Modbus_DataStoreWriteTo);

                SetDefaultValue();

                slave.Listen();
            }
        }
Beispiel #10
0
        private void button4_Click(object sender, EventArgs e)
        {
            button3.Enabled = true;
            button4.Enabled = false;

            byte      slaveID = (byte)numericUpDown3.Value;
            int       port    = (int)numericUpDown2.Value;
            IPAddress address = IPAddress.Parse(comboBox3.Text); //new IPAddress(new byte[] { 10, 36, 5, 217 });

            // create and start the TCP slave
            slaveTcpListener = new TcpListener(address, port);
            slaveTcpListener.Start();

            slaveTcpM           = ModbusTcpSlave.CreateTcp(slaveID, slaveTcpListener);
            slaveTcpM.DataStore = DataStoreFactory.CreateDefaultDataStore();

            slaveTcp = new Thread(slaveTcpM.Listen);
            slaveTcp.IsBackground = true;
            slaveTcp.Start();

            // prevent the main thread from exiting
            //Thread.Sleep(Timeout.Infinite);
        }
Beispiel #11
0
        /// <summary>
        /// runs the modbus server to interface with the plc
        /// </summary>
        protected override void HandleClientManagementThread()
        {
            byte slaveId = 1;

            // create and start the TCP slave
            PLC_Modbusserver = ModbusTcpSlave.CreateTcp(slaveId, PLCTCPListener);
            //coils, inputs, holdingRegisters, inputRegisters
            PLC_Modbusserver.DataStore = DataStoreFactory.CreateDefaultDataStore(0, 0, 256, 0);
            // PLC_Modbusserver.DataStore.SyncRoot.ToString();

            PLC_Modbusserver.ModbusSlaveRequestReceived   += new EventHandler <ModbusSlaveRequestEventArgs>(Server_Read_handler);
            PLC_Modbusserver.DataStore.DataStoreWrittenTo += new EventHandler <DataStoreEventArgs>(Server_Written_to_handler);

            PLC_Modbusserver.Listen();

            //PLC_Modbusserver.ListenAsync().GetAwaiter().GetResult();

            // prevent the main thread from exiting
            while (keep_modbus_server_alive)
            {
                Thread.Sleep(100);
            }
        }
Beispiel #12
0
        void doStuff()
        {
            DataStore data52 = DataStoreFactory.CreateDefaultDataStore();
            Dictionary <byte, DataStore> map = new Dictionary <byte, DataStore>();

            byte unitID52 = 52;

            map.Add(unitID52, data52);
            string portname = "";

            if (InvokeRequired)
            {
                this.Invoke((MethodInvoker) delegate() { portname = comboBox1.SelectedItem.ToString(); });
            }


            using (SerialPort com = new SerialPort(portname, 9600, Parity.None, 8, StopBits.One))
            {
                com.Open();
                slave = ModbusSerialSlave.CreateRtu(map, com);
                //slave.stop = false;
                slave.Listen();
            }
        }
Beispiel #13
0
 internal ModbusSlave(byte unitId, ModbusTransport transport)
     : base(transport)
 {
     DataStore = DataStoreFactory.CreateDefaultDataStore();
     UnitId    = unitId;
 }
Beispiel #14
0
        private void bt_slave()
        {
            BluetoothClient bt_client = null;
            string          BtAdress  = null;
            string          BtName    = null;

            try
            {
                bt_client = new BluetoothClient();
            }
            catch { MessageBox.Show("Bluetooth модуль не подключен!"); return; }

            while (BtAdress == null)
            {
                foreach (BluetoothDeviceInfo device in bt_client.DiscoverDevices(10, true, false, false, false))
                {
                    Console.WriteLine(device.DeviceName);
                    BtAdress = device.DeviceAddress.ToString();
                    BtName   = device.DeviceName;
                }

                Thread.Sleep(1000);
            }

            label10.Text = BtName;

            // Создаем последовательный порт, используя стороннее приложение btcom.exe

            Process a = Process.Start(Environment.CurrentDirectory + "\\btcom.exe", "-b\"" + BtAdress + "\" -c -s1101");

            a.WaitForExit();

            // Поиск названия созданного порта

            const string             Win32_SerialPort = "Win32_SerialPort";
            SelectQuery              q = new SelectQuery(Win32_SerialPort);
            ManagementObjectSearcher s = new ManagementObjectSearcher(q);
            object id = null;

            foreach (object cur in s.Get())
            {
                ManagementObject mo = (ManagementObject)cur;
                id = mo.GetPropertyValue("DeviceID");
                object pnpId = mo.GetPropertyValue("PNPDeviceID");
                Console.WriteLine("DeviceID:    {0} ", id);
                Console.WriteLine("PNPDeviceID: {0} ", pnpId);
                Console.WriteLine("");
            }

            //id = "COM2";

            if (id != null)
            {
                label11.BeginInvoke((MethodInvoker)(() => label11.Text = id.ToString()));

                int bd = 9600;
                comboBox5.BeginInvoke((MethodInvoker)(() => bd = int.Parse(comboBox5.SelectedItem.ToString())));

                // Открываем последовательный порт
                btSerialPort = new SerialPort(id.ToString(), bd);

                try
                {
                    //ModbusRtuMaster.OpenPort(btSerialPort);
                    btSerialPort.Open();

                    byte unitId = (byte)numericUpDown1.Value;

                    // create modbus slave
                    ModbusSlave slave = ModbusSerialSlave.CreateRtu(unitId, btSerialPort);
                    slave.DataStore = DataStoreFactory.CreateDefaultDataStore();
                    slave.ModbusSlaveRequestReceived += (obj, args) => { Console.WriteLine("[MODBUS SLAVE] I got it!!!"); };

                    Console.WriteLine("BT PORT IS OPEN!");

                    slave.Listen();
                }
                catch
                {
                    MessageBox.Show("Ошибка открытия порта!");
                }
            }
        }
Beispiel #15
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ModbusSlave"/> class.
 /// </summary>
 public ModbusSlave(byte unitID, ModbusTransport transport)
     : base(transport)
 {
     _dataStore = DataStoreFactory.CreateDefaultDataStore();
     _unitID    = unitID;
 }
Beispiel #16
0
        private static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder()
                          .SetBasePath(Directory.GetCurrentDirectory())
                          .AddJsonFile("settings.json");

            Configuration = builder.Build();

            var address = Configuration["address"];

            Console.WriteLine($"Start Advantech Wise4012e Modbus simulation at {address}");

            var slaveTcpListener = new TcpListener(IPAddress.Parse(address), 502);

            slaveTcpListener.Start();

            byte SlaveID = 1;

            var slave = ModbusTcpSlave.CreateTcp(SlaveID, slaveTcpListener);

            slave.DataStore = DataStoreFactory.CreateDefaultDataStore();

            slave.DataStore.DataStoreReadFrom  += DataStore_DataStoreReadFrom;
            slave.DataStore.DataStoreWrittenTo += DataStore_DataStoreWrittenTo;

            slave.DataStore.HoldingRegisters[1] = (ushort)0;
            slave.DataStore.HoldingRegisters[2] = (ushort)0;

            slave.DataStore.CoilDiscretes[1]  = false;
            slave.DataStore.CoilDiscretes[2]  = false;
            slave.DataStore.CoilDiscretes[17] = false;
            slave.DataStore.CoilDiscretes[18] = false;

            var awaiter = slave.ListenAsync().GetAwaiter();

            Console.WriteLine($"Slave {SlaveID} supports switch 1, switch 2, relay 17, relay 18, knob 40001, knob 40002");

            while (true)
            {
                Console.WriteLine($"> {slave.DataStore.CoilDiscretes[1]} {slave.DataStore.CoilDiscretes[2]} {slave.DataStore.CoilDiscretes[17]} {slave.DataStore.CoilDiscretes[18]} {slave.DataStore.HoldingRegisters[1]:0000} {slave.DataStore.HoldingRegisters[2]:0000} - Write '1 [bit]' '2 [bit]' '17 [bit]' '18 [bit]' '40001 [int]' '40002 [int]' or Q to exit");
                Console.Write("> ");

                var input = Console.ReadLine();

                if (input.ToUpper() == "Q")
                {
                    break;
                }

                var fields = input.Split(' ');

                switch (fields[0])
                {
                case "1":
                    slave.DataStore.CoilDiscretes[1] = Convert.ToBoolean(Convert.ToInt16(fields[1]));
                    break;

                case "2":
                    slave.DataStore.CoilDiscretes[2] = Convert.ToBoolean(Convert.ToInt16(fields[1]));
                    break;

                case "17":
                    slave.DataStore.CoilDiscretes[17] = Convert.ToBoolean(Convert.ToInt16(fields[1]));
                    break;

                case "18":
                    slave.DataStore.CoilDiscretes[18] = Convert.ToBoolean(Convert.ToInt16(fields[1]));
                    break;

                case "40001":
                    var value1 = Math.Abs(Convert.ToInt32(fields[1]));
                    slave.DataStore.HoldingRegisters[1] = value1 > 4500 ? (ushort)4500 : (ushort)value1;
                    break;

                case "40002":
                    var value2 = Math.Abs(Convert.ToInt32(fields[1]));
                    slave.DataStore.HoldingRegisters[2] = value2 > 4500 ? (ushort)4500 : (ushort)value2;
                    break;
                }
            }
        }