Ejemplo n.º 1
0
        public void setValue <T>(IModbusConfig config, T value)
        {
            lock (locker)
            {
                var toWrite = (ushort)Convert.ChangeType(value, typeof(ushort));

                SerialPort port = new SerialPort(config.portName, config.baudRate);
                if (port.IsOpen)
                {
                    port.Close();
                }
                lock (_locker)
                {
                    port.Open();
                    IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);
                    master.Transport.ReadTimeout  = 1000;
                    master.Transport.WriteTimeout = 1000;

                    //Запись
                    master.WriteMultipleRegisters(config.device_address, config.register_write_address, new ushort[] { toWrite });

                    port.Close();
                    Thread.Sleep(100);
                }
            }
        }
Ejemplo n.º 2
0
        public T getValue <T>(IModbusConfig config)
        {
            lock (locker)
            {
                SerialPort port = new SerialPort(config.portName, config.baudRate);
                try
                {
                    if (port.IsOpen)
                    {
                        port.Close();
                    }
                    lock (_locker)
                    {
                        port.Open();
                        IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);
                        master.Transport.ReadTimeout  = 200;
                        master.Transport.WriteTimeout = 200;

                        //Получение данных
                        ushort value = master.ReadHoldingRegisters(config.device_address, config.register_read_address, 1)[0];

                        port.Close();
                        port.Dispose();

                        switch (config.regType)
                        {
                        case RegType.INT16:
                            short signed_value = 0;
                            //Отрицательные значения отсчитываются от максимального значения в обратную сторону -1 = 65534
                            if (value >= 32768)
                            {
                                signed_value = (short)((short)value - 65535);
                            }
                            return((T)Convert.ChangeType(value, typeof(T)));

                        case RegType.UINT16:
                            return((T)Convert.ChangeType(value, typeof(T)));
                        }
                        return((T)Convert.ChangeType(1, typeof(T)));
                    }
                }
                catch (Exception ex)
                {
                    port.Dispose();
                    throw ex;
                }
            }
        }