예제 #1
0
 public override void DataReader(ModbusMaster master)
 {
     try
     {
         int      Index  = 0;
         ushort[] value  = master.ReadHoldingRegisters(ID, 4096, 46);
         ushort[] value1 = master.ReadHoldingRegisters(ID, 4142, 20);
         _        = MathClass.work16to10(value[Index], value[Index + 1]); Index += 2;
         Rv       = MathClass.work16to10(value[Index], value[Index + 1]); Index += 2;
         Sv       = MathClass.work16to10(value[Index], value[Index + 1]); Index += 2;
         Tv       = MathClass.work16to10(value[Index], value[Index + 1]); Index += 2;
         RSv      = MathClass.work16to10(value[Index], value[Index + 1]); Index += 2;
         STv      = MathClass.work16to10(value[Index], value[Index + 1]); Index += 2;
         TRv      = MathClass.work16to10(value[Index], value[Index + 1]); Index += 2;
         _        = MathClass.work16to10(value[Index], value[Index + 1]) * 0.001F; Index += 2;
         RA       = MathClass.work16to10(value[Index], value[Index + 1]) * 0.001F; Index += 2;
         SA       = MathClass.work16to10(value[Index], value[Index + 1]) * 0.001F; Index += 2;
         TA       = MathClass.work16to10(value[Index], value[Index + 1]) * 0.001F; Index += 2;
         PF       = MathClass.work16to10(value[Index], value[Index + 1]) * 0.001F; Index += 2;
         PF_A     = MathClass.work16to10(value[Index], value[Index + 1]) * 0.001F; Index += 2; //PFE L1
         PF_B     = MathClass.work16to10(value[Index], value[Index + 1]) * 0.001F; Index += 2; //PFE L2
         PF_C     = MathClass.work16to10(value[Index], value[Index + 1]) * 0.001F; Index += 2; //PFE L3
         _        = MathClass.work16to10(value[Index], value[Index + 1]) * 0.001F; Index += 2; //三相相位角
         RV_Angle = MathClass.work16to10(value[Index], value[Index + 1]) * 0.001F; Index += 2; //三相相位角 L1
         SV_Angle = MathClass.work16to10(value[Index], value[Index + 1]) * 0.001F; Index += 2; //三相相位角 L2
         TV_Angle = MathClass.work16to10(value[Index], value[Index + 1]) * 0.001F; Index += 2; //三相相位角 L3
         kVA      = MathClass.work16to10(value[Index], value[Index + 1]) * 0.001F; Index += 2;
         kVA_A    = MathClass.work16to10(value[Index], value[Index + 1]) * 0.001F; Index += 2; //三相視在功率 L1
         kVA_B    = MathClass.work16to10(value[Index], value[Index + 1]) * 0.001F; Index += 2; //三相視在功率 L2
         kVA_C    = MathClass.work16to10(value[Index], value[Index + 1]) * 0.001F;             //三相視在功率 L3
         Index    = 0;
         kW       = MathClass.work16to10(value1[Index], value1[Index + 1]) * 0.001F; Index += 2;
         kW_A     = MathClass.work16to10(value1[Index], value1[Index + 1]) * 0.001F; Index += 2;        //有效功率 L1
         kW_B     = MathClass.work16to10(value1[Index], value1[Index + 1]) * 0.001F; Index += 2;        //有效功率 L2
         kW_C     = MathClass.work16to10(value1[Index], value1[Index + 1]) * 0.001F; Index += 2;        //有效功率 L3
         kVAR     = MathClass.work16to10(value1[Index], value1[Index + 1]) * 0.001F; Index += 2;
         kVAR_A   = MathClass.work16to10(value1[Index], value1[Index + 1]) * 0.001F; Index += 2;        //無效功率 L1
         kVAR_B   = MathClass.work16to10(value1[Index], value1[Index + 1]) * 0.001F; Index += 2;        //無效功率 L2
         kVAR_C   = MathClass.work16to10(value1[Index], value1[Index + 1]) * 0.001F; Index += 2;        //無效功率 L3
         kWh      = MathClass.work16to10(value1[Index], value1[Index + 1]) * 0.001F; Index += 2;
         kVARh    = MathClass.work16to10(value1[Index], value1[Index + 1]) * 0.001F;
     }
     catch (Exception ex)
     {
         ConnectFlag = false;
         Log.Error(ex, $"ABBM2M解析異常、通訊編號: {GatewayIndex}、設備編號: {DeviceIndex}");
     }
 }
예제 #2
0
        void Test(ModbusModel model, ModbusMaster master)
        {
            master.WriteCoil(1, 2, true);
            Assert.AreEqual(true, master.ReadCoil(1, 2));
            master.WriteCoil(1, 3, false);
            Assert.AreEqual(false, master.ReadCoil(1, 3));
            master.WriteCoils(1, 4, bo(false, true));
            Assert.AreEqual(bo(true, false, false, true), master.ReadCoils(1, 2, 4));

            model.setDIs(11, 12, bo(true, true, false, false));
            Assert.AreEqual(true, master.ReadInput(11, 12));
            Assert.AreEqual(true, master.ReadInput(11, 13));
            Assert.AreEqual(false, master.ReadInput(11, 14));
            Assert.AreEqual(false, master.ReadInput(11, 15));
            Assert.AreEqual(bo(true, true, false, false), master.ReadInputs(11, 12, 4));

            master.WriteRegister(1, 2, 0xabcd);
            Assert.AreEqual(0xabcd, master.ReadHoldingRegister(1, 2));
            master.WriteRegister(1, 3, 0xcdab);
            Assert.AreEqual(0xcdab, master.ReadHoldingRegister(1, 3));
            master.WriteRegisters(1, 4, us(0xcda1, 0xcda2));
            Assert.AreEqual(us(0xabcd, 0xcdab, 0xcda1, 0xcda2), master.ReadHoldingRegisters(1, 2, 4));

            model.setWIs(11, 12, us(0xabcd, 0xcdab, 0xcda1, 0xcda2));
            Assert.AreEqual(0xabcd, master.ReadInputRegister(11, 12));
            Assert.AreEqual(0xcdab, master.ReadInputRegister(11, 13));
            Assert.AreEqual(0xcda1, master.ReadInputRegister(11, 14));
            Assert.AreEqual(0xcda2, master.ReadInputRegister(11, 15));
            Assert.AreEqual(us(0xabcd, 0xcdab, 0xcda1, 0xcda2), master.ReadInputRegisters(11, 12, 4));
        }
예제 #3
0
        public static void SharedSlaveTest(ModbusModel model, ModbusMaster master)
        {
            master.WriteCoil(1, 2, true);
            Assert.AreEqual(true, master.ReadCoil(1, 2));
            master.WriteCoil(1, 3, false);
            Assert.AreEqual(false, master.ReadCoil(1, 3));
            master.WriteCoils(1, 4, H.bo(false, true));
            Assert.AreEqual(H.bo(true, false, false, true), master.ReadCoils(1, 2, 4));

            //race condition avoided by access order
            model.setDIs(11, 12, H.bo(true, true, false, false));
            Assert.AreEqual(true, master.ReadInput(11, 12));
            Assert.AreEqual(true, master.ReadInput(11, 13));
            Assert.AreEqual(false, master.ReadInput(11, 14));
            Assert.AreEqual(false, master.ReadInput(11, 15));
            Assert.AreEqual(H.bo(true, true, false, false), master.ReadInputs(11, 12, 4));

            master.WriteRegister(1, 2, 0xabcd);
            Assert.AreEqual(0xabcd, master.ReadHoldingRegister(1, 2));
            master.WriteRegister(1, 3, 0xcdab);
            Assert.AreEqual(0xcdab, master.ReadHoldingRegister(1, 3));
            master.WriteRegisters(1, 4, H.us(0xcda1, 0xcda2));
            Assert.AreEqual(H.us(0xabcd, 0xcdab, 0xcda1, 0xcda2), master.ReadHoldingRegisters(1, 2, 4));

            //race condition avoided by access order
            model.setWIs(11, 12, H.us(0xabcd, 0xcdab, 0xcda1, 0xcda2));
            Assert.AreEqual(0xabcd, master.ReadInputRegister(11, 12));
            Assert.AreEqual(0xcdab, master.ReadInputRegister(11, 13));
            Assert.AreEqual(0xcda1, master.ReadInputRegister(11, 14));
            Assert.AreEqual(0xcda2, master.ReadInputRegister(11, 15));
            Assert.AreEqual(H.us(0xabcd, 0xcdab, 0xcda1, 0xcda2), master.ReadInputRegisters(11, 12, 4));
        }
예제 #4
0
 public override void DataReader(ModbusMaster master)
 {
     try
     {
         int      Index    = 0;
         ushort[] kwhvalue = master.ReadHoldingRegisters(ID, 0, 2); //kwh
         ushort[] kwvalue  = master.ReadHoldingRegisters(ID, 8, 2); //kw
         kWh         = MathClass.work16to10(kwhvalue[Index + 1], kwhvalue[Index]) * 0.01;
         kW          = MathClass.work16to10(kwvalue[Index + 1], kwvalue[Index]) * 0.001;
         ConnectFlag = true;
     }
     catch (Exception ex)
     {
         ConnectFlag = false;
         Log.Error(ex, $"PM200解析異常、通訊編號: {GatewayIndex}、設備編號: {DeviceIndex}");
     }
 }
예제 #5
0
        private float GetAnalog2(ModbusMaster master, int point)
        {
            var words = master.ReadHoldingRegisters(1, (ushort)(2 * point), 2);
            var bytes = new byte[4];

            bytes[0] = (byte)((words[0] >> 8) & 0xff);
            bytes[1] = (byte)((words[0] >> 0) & 0xff);
            bytes[2] = (byte)((words[1] >> 8) & 0xff);
            bytes[3] = (byte)((words[1] >> 0) & 0xff);
            return(ByteArrayToFloat(bytes));
        }
예제 #6
0
 public ushort[] ReadHoldingRegisters(ushort start, ushort len)
 {
     ushort[] result = null;
     if (RTUConnected || TCPConnected)
     {
         lock (_Locker)
         {
             result = _Master.ReadHoldingRegisters(1, start, len);
         }
     }
     return(result);
 }
예제 #7
0
        private void MainWork()
        {
            var res = Master.ReadHoldingRegisters(1, 4008, 3);

            for (int i = 0; i < res.Length; i++)
            {
                res[i]++;
            }
            var id = (ushort)Thread.CurrentThread.ManagedThreadId;

            Master.WriteMultipleRegisters(1, 4008, new ushort[] { id, id, id, id });
        }
예제 #8
0
        public int readRegister(ref ModbusRegisters regs)
        {
            if (master == null)
            {
                commsts = COMMSTS_UNKONOWN;
                return(RET_INITFAILURE);
            }

            lock (locker)
            {
                if (tcpClient == null)
                {
                    commsts = COMMSTS_PORTNOTOPEN;
                    return(RET_INITFAILURE);
                }

                try
                {
                    regs.values = master.ReadHoldingRegisters(regs.slaveid, regs.startAddress, regs.numRegisters);

                    for (int i = 0; i < regs.numRegisters; i++)
                    {
                        regs.stReg[i].value = regs.values[i];
                    }
                }
                catch (TimeoutException ex)
                {
                    //LogClass.GetInstance().WriteLogFile("ReadHoldingRegisters Timeout:" + port.ReadTimeout.ToString());
                    //MessageBox.Show("Serial Port Read Timeout:" + port.ReadTimeout.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    if (rtycnt++ < MAX_RETYR_COUNT)
                    {
                        return(RET_TIMEOUT);
                    }
                    else
                    {
                        commsts = COMMSTS_FAILURE;
                        return(RET_COMMERROR);
                    }
                }
                catch (Exception ex)
                {
                    LogClass.GetInstance().WriteExceptionLog(ex);
                    //MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    commsts = COMMSTS_FAILURE;
                    return(RET_FAILURE);
                }
            }
            rtycnt  = 0;
            commsts = COMMSTS_NORMAL;
            return(RET_OK);
        }
예제 #9
0
        /// <summary>
        /// Read contiguous block of 32 bit holding registers.
        /// </summary>
        /// <param name="master">The Modbus master.</param>
        /// <param name="slaveAddress">Address of device to read values from.</param>
        /// <param name="startAddress">Address to begin reading.</param>
        /// <param name="numberOfPoints">Number of holding registers to read.</param>
        /// <returns>Holding registers status</returns>
        public static uint[] ReadHoldingRegisters32(this ModbusMaster master, byte slaveAddress, ushort startAddress, ushort numberOfPoints)
        {
            if (master == null)
            {
                throw new ArgumentNullException("master");
            }
            ValidateNumberOfPoints(numberOfPoints, 62);

            // read 16 bit chunks and perform conversion
            var rawRegisters = master.ReadHoldingRegisters(slaveAddress, startAddress, (ushort)(numberOfPoints * 2));

            return(Convert(rawRegisters).ToArray());
        }
예제 #10
0
        private static ushort[] TryRead(ModbusMaster modbus, ModbusRegisterType registerType, int address, int register)
        {
            switch (registerType)
            {
            case ModbusRegisterType.AnalogInput:
                return(modbus.ReadInputRegisters((byte)address, (ushort)register, 1));

            case ModbusRegisterType.Holding:
                return(modbus.ReadHoldingRegisters((byte)address, (ushort)register, 1));

            case ModbusRegisterType.Coil:
                return(modbus.ReadCoils((byte)address, (ushort)register, 1).Select(c => c ? (ushort)1 : (ushort)0).ToArray());

            case ModbusRegisterType.DiscreteInput:
                return(modbus.ReadInputs((byte)address, (ushort)register, 1).Select(c => c ? (ushort)1 : (ushort)0).ToArray());
            }

            return(null);
        }
 public override void DataReader(ModbusMaster master)
 {
     try
     {
         ushort[] Value = master.ReadHoldingRegisters(ID, 0, 2);
         ConnectFlag = true;
         if (Value[0] > 32767)
         {
             Temperature = (Value[0] - 65536) / 10F;
         }
         else
         {
             Temperature = Value[0] / 10F;
         }
         Humidity = Value[1] / 10F;
     }
     catch (Exception ex)
     {
         ConnectFlag = false;
         Log.Error(ex, $"黑色溫濕度感測器解析異常、通訊編號: {GatewayIndex}、設備編號: {DeviceIndex}");
     }
 }
예제 #12
0
        private Dictionary <int, string> SendRequests(ModbusMaster master, MasterSettings masterSettings)
        {
            if (master == null)
            {
                return(null);
            }

            var results = new Dictionary <int, string>();

            foreach (var slave in masterSettings.SlaveSettings)
            {
                string hexResults = "";

                PackagesCounter.RequestedPackagesCount += 1;

                try
                {
                    if (masterSettings.IsLoggerEnabled)
                    {
                        Logger.WriteDebug($"Sent request to a slave: DeviceId = {slave.DeviceId}; SlaveAddress={slave.StartAddress}; NumberOfRegisters={slave.NumberOfRegisters}.");
                    }

                    switch (slave.ActionType)
                    {
                    case ActionTypes.Read:
                        var registers = master.ReadHoldingRegisters(slave.DeviceId, slave.StartAddress,
                                                                    slave.NumberOfRegisters);

                        if (registers == null || registers.Length == 0)
                        {
                            throw new EmptyResultException(
                                      $"Slave with address {slave.DeviceId} returned an empty result when reading {slave.NumberOfRegisters} registers starting with register number {slave.StartAddress}.");
                        }

                        PackagesCounter.RecievedPackagesCount += 1;
                        isConnectionLost = false;

                        var inputs = registers.ConvertToBitArray();

                        hexResults = inputs.ConvertToHex();

                        var startAddress = slave.StartAddress;

                        foreach (var type in slave.Types)
                        {
                            switch (type.Item2)
                            {
                            case ModbusDataType.SInt16:
                                // Берём из массива битов первые 16, чтобы сконвертировать их в знаковое 16-битное целое число.
                                var sInt16Part = inputs.Take(8 * type.Item1).ToArray();

                                // Обрезаем у массива эти первые 16 бит (16 бит = 2 байта).
                                inputs = inputs.Skip(8 * type.Item1).ToArray();

                                // Преобразуем массив битов в строку, состоящую из единиц и нулей.
                                var sInt16BinaryString = string.Join("", sInt16Part.Select(x => x ? 1 : 0));

                                // Конвертируем полученное двоичное число в знаковое 16-битное целое число.
                                var sInt16 = Convert.ToInt16(sInt16BinaryString, 2);

                                // Добавляем полученное число в список значений.
                                results.Add(startAddress, sInt16.ToString());

                                // Перемещаем указатель на следующий регистр (16 бит = 2 байта = 1 регистр)
                                startAddress += (ushort)(type.Item1 / 2);

                                break;

                            case ModbusDataType.UInt16:
                                // Берём из массива битов первые 16, чтобы сконвертировать их в беззнаковое 16-битное целое число.
                                var uInt16Part = inputs.Take(8 * type.Item1).ToArray();

                                // Обрезаем у массива эти первые 16 бит (16 бит = 2 байта).
                                inputs = inputs.Skip(8 * type.Item1).ToArray();

                                // Преобразуем массив битов в строку, состоящую из единиц и нулей.
                                var binaryString = uInt16Part.Select(x => x ? 1 : 0);

                                // Конвертируем полученное двоичное число в беззнаковое 16-битное целое число.
                                var uShort = Convert.ToUInt16(string.Join("", binaryString), 2);

                                // Добавляем полученное число в список значений.
                                results.Add(startAddress, uShort.ToString());

                                // Перемещаем указатель на следующий регистр (16 бит = 2 байта = 1 регистр)
                                startAddress += (ushort)(type.Item1 / 2);

                                break;

                            case ModbusDataType.SInt32:
                                // Берём из массива битов первые 32, чтобы сконвертировать их в знаковое 32-битное целое число.
                                var sInt32Part = inputs.Take(8 * type.Item1).ToArray();

                                // Обрезаем у массива эти первые 32 бит (32 бит = 4 байта).
                                inputs = inputs.Skip(8 * type.Item1).ToArray();

                                // Преобразуем массив битов в строку, состоящую из единиц и нулей.
                                var sInt32BinaryString = sInt32Part.Select(x => x ? 1 : 0);

                                // Конвертируем полученное двоичное число в знаковое 32-битное целое число.
                                var sInt32 = Convert.ToInt32(string.Join("", sInt32BinaryString), 2);

                                // Добавляем полученное число в список значений.
                                results.Add(startAddress, sInt32.ToString());

                                // Перемещаем указатель на следующий регистр (32 бита = 4 байта = 2 регистра)
                                startAddress += (ushort)(type.Item1 / 2);

                                break;

                            case ModbusDataType.UInt32:
                                // Берём из массива битов первые 32, чтобы сконвертировать их в беззнаковое 32-битное целое число.
                                var uInt32Part = inputs.Take(8 * type.Item1).ToArray();

                                // Обрезаем у массива эти первые 32 бит (32 бит = 4 байта).
                                inputs = inputs.Skip(8 * type.Item1).ToArray();

                                // Преобразуем массив битов в строку, состоящую из единиц и нулей.
                                var binaryUInt32String = uInt32Part.Select(x => x ? 1 : 0);

                                // Конвертируем полученное двоичное число в беззнаковое 32-битное целое число.
                                var uInt32 = Convert.ToUInt32(string.Join("", binaryUInt32String), 2);

                                // Добавляем полученное число в список значений.
                                results.Add(startAddress, uInt32.ToString());

                                // Перемещаем указатель на следующий регистр (32 бита = 4 байта = 2 регистра)
                                startAddress += (ushort)(type.Item1 / 2);

                                break;

                            case ModbusDataType.Hex:
                                // Берём из массива битов первые 32, чтобы сконвертировать их в беззнаковое 32-битное целое число.
                                var hexPart = inputs.Take(8 * type.Item1).ToArray();

                                // Обрезаем у массива эти первые 32 бит (32 бит = 4 байта).
                                inputs = inputs.Skip(8 * type.Item1).ToArray();

                                // Преобразуем массив битов в строку, состоящую из единиц и нулей.
                                var binaryHexString = hexPart.Select(x => x ? 1 : 0);

                                // Конвертируем полученное десятичное число в знаковое 32-битное целое число, после этого конвертируем число в 16-ричную систему счисления.
                                var hex = Convert.ToUInt32(string.Join("", binaryHexString), 2).ToString("X");

                                // Добавляем полученное число в список значений.
                                results.Add(startAddress, $"0x{hex}");

                                // Перемещаем указатель на следующий регистр (32 бита = 4 байта = 2 регистра)
                                startAddress += (ushort)(type.Item1 / 2);

                                break;

                            case ModbusDataType.UtcTimestamp:
                                // В данном случае мы должны считать целое число (тоже беззнаковое 32-битное) и преобразовать к дате.
                                // Берём из массива битов первые 32, чтобы сконвертировать их в знаковое 32-битное целое число.
                                var utcTimestampPart = inputs.Take(8 * type.Item1).ToArray();
                                inputs = inputs.Skip(8 * type.Item1).ToArray();

                                // Преобразуем массив битов в строку, состоящую из единиц и нулей.
                                var binaryUtcTimestampString = utcTimestampPart.Select(x => x ? 1 : 0);

                                // Конвертируем полученное двоичное число в беззнаковое 32-битное целое число.
                                var utcTimestamp = Convert.ToUInt32(string.Join("", binaryUtcTimestampString), 2);

                                // Добавляем полученное число в список значений.
                                results.Add(startAddress, new DateTime(1970, 1, 1).AddSeconds(utcTimestamp)
                                            .ToLocalTime()
                                            .ToString("yyyy.MM.dd HH:mm:ss"));

                                // Перемещаем указатель на следующий регистр (32 бита = 4 байта = 2 регистра)
                                startAddress += (ushort)(type.Item1 / 2);

                                break;

                            case ModbusDataType.String:
                                bool[] stringPart;

                                if (inputs.Length > 8 * type.Item1)
                                {
                                    stringPart = inputs.Take(8 * type.Item1).ToArray();
                                    inputs     = inputs.Skip(8 * type.Item1).ToArray();

                                    results.Add(startAddress, stringPart.ConvertToString());

                                    startAddress += (ushort)(type.Item1 / 2);
                                }
                                else
                                {
                                    stringPart = inputs;
                                    inputs     = new bool[0];

                                    results.Add(startAddress, stringPart.ConvertToString());

                                    startAddress += (ushort)(stringPart.Length / 16);
                                }

                                break;

                            default:
                                throw new ArgumentOutOfRangeException();
                            }
                        }

                        if (masterSettings.IsLoggerEnabled)
                        {
                            Logger.WriteDebug($"Recieved data from slave: DeviceId = {slave.DeviceId}; SlaveAddress={slave.StartAddress}; NumberOfRegisters={slave.NumberOfRegisters}; {hexResults}");
                        }

                        break;

                    case ActionTypes.Write:
                        var data = new ushort[] { Convert.ToUInt16(slave.Formula) };

                        master.WriteMultipleRegisters(slave.DeviceId, slave.StartAddress, data);

                        if (masterSettings.IsLoggerEnabled)
                        {
                            Logger.WriteDebug($"Sent data to slave: DeviceId = {slave.DeviceId}; SlaveAddress={slave.StartAddress}; {data}");
                        }

                        break;
                    }
                }
                catch (SlaveException slaveException)
                {
                    switch (slaveException.SlaveExceptionCode)
                    {
                    case 130:
                        if (!isConnectionLost)
                        {
                            Logger.Write(slaveException.Message);
                        }
                        isConnectionLost = true;
                        break;

                    default:
                        if (loggerEnabled)
                        {
                            Logger.Write(slaveException.Message);
                        }
                        else
                        {
                            throw slaveException;
                        }
                        break;
                    }
                }
                catch (Exception exception)
                {
                    if (loggerEnabled)
                    {
                        Logger.Write(exception.Message);
                    }
                    else
                    {
                        throw exception;
                    }
                }
            }

            return(results);
        }
예제 #13
0
 public virtual void ReadHoldingRegisters()
 {
     ushort[] registers = Master.ReadHoldingRegisters(SlaveAddress, 104, 2);
     Assert.AreEqual(new ushort[] { 0, 0 }, registers);
 }
예제 #14
0
        public override void DataReader(ModbusMaster master)
        {
            try
            {
                ushort[] Voltage_Current_Unit = master.ReadHoldingRegisters(ID, 40, 1);
                ushort[] Master_Unit          = master.ReadHoldingRegisters(ID, 66, 2);
                int      Voltage_Unit         = MathClass.work2to10(MathClass.work10to2(Voltage_Current_Unit[0]).Substring(8, 8)); //電壓單位換算
                int      Current_Unit         = MathClass.work2to10(MathClass.work10to2(Voltage_Current_Unit[0]).Substring(0, 8)); //電流單位換算
                int      Unit     = MathClass.work2to10(MathClass.work10to2(Master_Unit[0]).Substring(8, 8));                      //kVA、kVAR、kW、kWh
                ushort[] kwhValue = master.ReadHoldingRegisters(ID, 0, 2);                                                         //kWh
                ushort[] Value    = master.ReadHoldingRegisters(ID, 22, 9);                                                        //電壓電流
                ushort[] Value1   = master.ReadHoldingRegisters(ID, 42, 12);                                                       //kVA、kVAR、kW
                ushort[] HzValue  = new ushort[] { Master_Unit[1] };                                                               //頻率
                ushort[] PFValue  = master.ReadHoldingRegisters(ID, 84, 1);                                                        //功率因數
                #region 電壓單位換算
                int Index = 0;
                switch (Voltage_Unit) //電壓單位換算
                {
                case 1:               //(0.1mV)
                {
                    Rv  = Value[Index] * 0.0001; Index++;
                    Sv  = Value[Index] * 0.0001; Index++;
                    Tv  = Value[Index] * 0.0001; Index += 4;
                    RSv = Value[Index] * 0.0001; Index++;
                    STv = Value[Index] * 0.0001; Index++;
                    TRv = Value[Index] * 0.0001;
                }
                break;

                case 2:
                {
                    Rv  = Value[Index] * 0.001; Index++;
                    Sv  = Value[Index] * 0.001; Index++;
                    Tv  = Value[Index] * 0.001; Index += 4;
                    RSv = Value[Index] * 0.001; Index++;
                    STv = Value[Index] * 0.001; Index++;
                    TRv = Value[Index] * 0.001;
                }
                break;

                case 4:
                {
                    Rv  = Value[Index] * 0.01; Index++;
                    Sv  = Value[Index] * 0.01; Index++;
                    Tv  = Value[Index] * 0.01; Index += 4;
                    RSv = Value[Index] * 0.01; Index++;
                    STv = Value[Index] * 0.01; Index++;
                    TRv = Value[Index] * 0.01;
                }
                break;

                case 8:
                {
                    Rv  = Value[Index] * 0.1; Index++;
                    Sv  = Value[Index] * 0.1; Index++;
                    Tv  = Value[Index] * 0.1; Index += 4;
                    RSv = Value[Index] * 0.1; Index++;
                    STv = Value[Index] * 0.1; Index++;
                    TRv = Value[Index] * 0.1;
                }
                break;

                case 16:
                {
                    Rv  = Value[Index] * 1; Index++;
                    Sv  = Value[Index] * 1; Index++;
                    Tv  = Value[Index] * 1; Index += 4;
                    RSv = Value[Index] * 1; Index++;
                    STv = Value[Index] * 1; Index++;
                    TRv = Value[Index] * 1;
                }
                break;

                case 32:
                {
                    Rv  = Value[Index] * 10; Index++;
                    Sv  = Value[Index] * 10; Index++;
                    Tv  = Value[Index] * 10; Index += 4;
                    RSv = Value[Index] * 10; Index++;
                    STv = Value[Index] * 10; Index++;
                    TRv = Value[Index] * 10;
                }
                break;
                }
                #endregion
                #region 電流單位換算
                Index = 3;
                switch (Current_Unit)//電流單位換算
                {
                case 1:
                {
                    RA = Value[Index] * 0.0001; Index++;
                    SA = Value[Index] * 0.0001; Index++;
                    TA = Value[Index] * 0.0001;
                }
                break;

                case 2:
                {
                    RA = Value[Index] * 0.001; Index++;
                    SA = Value[Index] * 0.001; Index++;
                    TA = Value[Index] * 0.001;
                }
                break;

                case 4:
                {
                    RA = Value[Index] * 0.01; Index++;
                    SA = Value[Index] * 0.01; Index++;
                    TA = Value[Index] * 0.01;
                }
                break;

                case 8:
                {
                    RA = Value[Index] * 0.1; Index++;
                    SA = Value[Index] * 0.1; Index++;
                    TA = Value[Index] * 0.1;
                }
                break;

                case 16:
                {
                    RA = Value[Index] * 1; Index++;
                    SA = Value[Index] * 1; Index++;
                    TA = Value[Index] * 1;
                }
                break;

                case 32:
                {
                    RA = Value[Index] * 10; Index++;
                    SA = Value[Index] * 10; Index++;
                    TA = Value[Index] * 10;
                }
                break;
                }
                #endregion
                #region kVA、kVAR、kW、kWh單位換算
                Index = 0;
                switch (Unit)
                {
                case 1:
                {
                    kVA_A  = Value1[Index] * 0.0001; Index++;
                    kVA_B  = Value1[Index] * 0.0001; Index++;
                    kVA_C  = Value1[Index] * 0.0001; Index++;
                    kVA    = Value1[Index] * 0.0001; Index++;
                    kVAR_A = Value1[Index] * 0.0001; Index++;
                    kVAR_B = Value1[Index] * 0.0001; Index++;
                    kVAR_C = Value1[Index] * 0.0001; Index++;
                    kVAR   = Value1[Index] * 0.0001; Index++;
                    kW_A   = Value1[Index] * 0.0001; Index++;
                    kW_B   = Value1[Index] * 0.0001; Index++;
                    kW_C   = Value1[Index] * 0.0001; Index++;
                    kW     = Value1[Index] * 0.0001;
                    kWh    = MathClass.work16to10(kwhValue[0], kwhValue[1]) * 0.0001;
                }
                break;

                case 2:
                {
                    kVA_A  = Value1[Index] * 0.001; Index++;
                    kVA_B  = Value1[Index] * 0.001; Index++;
                    kVA_C  = Value1[Index] * 0.001; Index++;
                    kVA    = Value1[Index] * 0.001; Index++;
                    kVAR_A = Value1[Index] * 0.001; Index++;
                    kVAR_B = Value1[Index] * 0.001; Index++;
                    kVAR_C = Value1[Index] * 0.001; Index++;
                    kVAR   = Value1[Index] * 0.001; Index++;
                    kW_A   = Value1[Index] * 0.001; Index++;
                    kW_B   = Value1[Index] * 0.001; Index++;
                    kW_C   = Value1[Index] * 0.001; Index++;
                    kW     = Value1[Index] * 0.001;
                    kWh    = MathClass.work16to10(kwhValue[0], kwhValue[1]) * 0.001;
                }
                break;

                case 4:
                {
                    kVA_A  = Value1[Index] * 0.01; Index++;
                    kVA_B  = Value1[Index] * 0.01; Index++;
                    kVA_C  = Value1[Index] * 0.01; Index++;
                    kVA    = Value1[Index] * 0.01; Index++;
                    kVAR_A = Value1[Index] * 0.01; Index++;
                    kVAR_B = Value1[Index] * 0.01; Index++;
                    kVAR_C = Value1[Index] * 0.01; Index++;
                    kVAR   = Value1[Index] * 0.01; Index++;
                    kW_A   = Value1[Index] * 0.01; Index++;
                    kW_B   = Value1[Index] * 0.01; Index++;
                    kW_C   = Value1[Index] * 0.01; Index++;
                    kW     = Value1[Index] * 0.01;
                    kWh    = MathClass.work16to10(kwhValue[0], kwhValue[1]) * 0.01;
                }
                break;

                case 8:
                {
                    kVA_A  = Value1[Index] * 0.1; Index++;
                    kVA_B  = Value1[Index] * 0.1; Index++;
                    kVA_C  = Value1[Index] * 0.1; Index++;
                    kVA    = Value1[Index] * 0.1; Index++;
                    kVAR_A = Value1[Index] * 0.1; Index++;
                    kVAR_B = Value1[Index] * 0.1; Index++;
                    kVAR_C = Value1[Index] * 0.1; Index++;
                    kVAR   = Value1[Index] * 0.1; Index++;
                    kW_A   = Value1[Index] * 0.1; Index++;
                    kW_B   = Value1[Index] * 0.1; Index++;
                    kW_C   = Value1[Index] * 0.1; Index++;
                    kW     = Value1[Index] * 0.1;
                    kWh    = MathClass.work16to10(kwhValue[0], kwhValue[1]) * 0.1;
                }
                break;

                case 16:
                {
                    kVA_A  = Value1[Index] * 1; Index++;
                    kVA_B  = Value1[Index] * 1; Index++;
                    kVA_C  = Value1[Index] * 1; Index++;
                    kVA    = Value1[Index] * 1; Index++;
                    kVAR_A = Value1[Index] * 1; Index++;
                    kVAR_B = Value1[Index] * 1; Index++;
                    kVAR_C = Value1[Index] * 1; Index++;
                    kVAR   = Value1[Index] * 1; Index++;
                    kW_A   = Value1[Index] * 1; Index++;
                    kW_B   = Value1[Index] * 1; Index++;
                    kW_C   = Value1[Index] * 1; Index++;
                    kW     = Value1[Index] * 1;
                    kWh    = MathClass.work16to10(kwhValue[0], kwhValue[1]) * 1;
                }
                break;

                case 32:
                {
                    kVA_A  = Value1[Index] * 10; Index++;
                    kVA_B  = Value1[Index] * 10; Index++;
                    kVA_C  = Value1[Index] * 10; Index++;
                    kVA    = Value1[Index] * 10; Index++;
                    kVAR_A = Value1[Index] * 10; Index++;
                    kVAR_B = Value1[Index] * 10; Index++;
                    kVAR_C = Value1[Index] * 10; Index++;
                    kVAR   = Value1[Index] * 10; Index++;
                    kW_A   = Value1[Index] * 10; Index++;
                    kW_B   = Value1[Index] * 10; Index++;
                    kW_C   = Value1[Index] * 10; Index++;
                    kW     = Value1[Index] * 10;
                    kWh    = MathClass.work16to10(kwhValue[0], kwhValue[1]) * 10;
                }
                break;

                case 64:
                {
                    kVA_A  = Value1[Index] * 100; Index++;
                    kVA_B  = Value1[Index] * 100; Index++;
                    kVA_C  = Value1[Index] * 100; Index++;
                    kVA    = Value1[Index] * 100; Index++;
                    kVAR_A = Value1[Index] * 100; Index++;
                    kVAR_B = Value1[Index] * 100; Index++;
                    kVAR_C = Value1[Index] * 100; Index++;
                    kVAR   = Value1[Index] * 100; Index++;
                    kW_A   = Value1[Index] * 100; Index++;
                    kW_B   = Value1[Index] * 100; Index++;
                    kW_C   = Value1[Index] * 100; Index++;
                    kW     = Value1[Index] * 100;
                    kWh    = MathClass.work16to10(kwhValue[0], kwhValue[1]) * 100;
                }
                break;
                }
                #endregion
                HZ          = HzValue[0] * 0.1;
                PF          = PFValue[0] * 0.001;
                ConnectFlag = true;
            }
            catch (Exception ex)
            {
                ConnectFlag = false;
                Log.Error(ex, $"TWC-CPM4解析異常、通訊編號: {GatewayIndex}、設備編號: {DeviceIndex}");
            }
        }
예제 #15
0
        private void Sequencer_Worker()
        {
            while (seqThreadStop == false)
            {
                if (master != null)
                {
                    byte   slaveId      = (byte)(StartAddr + CurrentSlave);
                    ushort startAddress = (ushort)Register;
                    ushort numInputs    = (ushort)Quantity;

                    //datagridview was resized
                    if (dataGrid.Rows.Count - 1 < CurrentSlave)
                    {
                        CurrentSlave = 0;
                    }

                    int requests = (int)dataGrid.Rows[CurrentSlave].Cells[1].Value;
                    int errors   = (int)dataGrid.Rows[CurrentSlave].Cells[2].Value;

                    requests++;

                    try
                    {
                        // write three registers
                        ushort[] inputs = null;
                        bool[]   bools  = null;

                        switch (Function)
                        {
                        case 0:
                            bools = master.ReadCoils(slaveId, startAddress, numInputs);
                            break;

                        case 1:
                            bools = master.ReadInputs(slaveId, startAddress, numInputs);
                            break;

                        case 2:
                            inputs = master.ReadHoldingRegisters(slaveId, startAddress, numInputs);
                            break;

                        case 3:
                            inputs = master.ReadInputRegisters(slaveId, startAddress, numInputs);
                            break;
                        }


                        if (bools != null)
                        {
                            for (int i = 0; i < numInputs; i++)
                            {
                                dataGrid.Rows[CurrentSlave].Cells[i + 3].Value = bools[i] ? "1" : "0";
                            }
                        }
                        else if (inputs != null)
                        {
                            for (int i = 0; i < numInputs; i++)
                            {
                                dataGrid.Rows[CurrentSlave].Cells[i + 3].Value = (short)(inputs[i]);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        errors++;
                    }

                    dataGrid.Rows[CurrentSlave].Cells[1].Value = requests;
                    dataGrid.Rows[CurrentSlave].Cells[2].Value = errors;


                    CurrentSlave++;

                    if ((CurrentSlave + StartAddr) > StopAddr)
                    {
                        CurrentSlave = 0;
                    }

                    Thread.Sleep(ScanRate);
                }


                while (seqThreadPause)
                {
                    Thread.Sleep(100);
                }
            }
        }
예제 #16
0
파일: Form1.cs 프로젝트: Kirve/entesdeneme
        private void button1_Click(object sender, EventArgs e)
        {
            //çalışan kod

            TcpClient TCP_Client = new TcpClient();

            TCP_Client.SendTimeout    = 2000;
            TCP_Client.ReceiveTimeout = 2000;
            IAsyncResult result = TCP_Client.BeginConnect("192.168.4.187", 502, null, null);

            result.AsyncWaitHandle.WaitOne(2000, true);

            ModbusMaster MBus = ModbusIpMaster.CreateIp(TCP_Client);

            ushort[] datas = MBus.ReadHoldingRegisters(1, 10, 4);

            for (int i = 0; i < 4; i++)
            {
                _items.Add(datas[i].ToString());
            }
            listBox1.DataSource = _items;

            byte[] b1 = BitConverter.GetBytes(datas[0]);
            byte[] b2 = BitConverter.GetBytes(datas[3]);
            byte[] b3 = new byte[4];
            b3[0] = b1[0];
            b3[1] = b1[1];
            b3[2] = b2[0];
            b3[3] = b2[1];
            long volt = BitConverter.ToInt64(b3, 0);

            label3.Text = volt.ToString();

            TCP_Client.Close();


            UdpClient udpci = new UdpClient();

            udpci.Connect("192.168.4.187", 502);
            SerialPort   sp   = new SerialPort("COM1", 115200);
            ModbusMaster MBus = ModbusSerialMaster.CreateRtu(udpci);

            ushort[] datass = MBus.ReadHoldingRegisters(1, 0, 10);


            SerialPort sp = new SerialPort("COM1", 115000);

            sp.Open();
            ModbusSerialMaster MBus = ModbusSerialMaster.CreateRtu(sp);

            ushort[] readData = MBus.ReadHoldingRegisters(1, 0X1A, 3);
            MBus.Transport.ReadTimeout = 300;
            byte[] b1 = BitConverter.GetBytes(readData[1]);
            byte[] b2 = BitConverter.GetBytes(readData[0]);
            byte[] b3 = new byte[4];
            b3[0] = b1[0];
            b3[1] = b1[1];
            b3[2] = b2[0];
            b3[3] = b2[1];
            float watt = BitConverter.ToSingle(b3, 0);
        }
예제 #17
0
        public override void ReadData(List <Device> devices, ModbusMaster master)
        {
            int DeviceIndex = 0;
            int Index       = 0;

            #region 第一部分
            try
            {
                ushort[] Part1Value1 = master.ReadInputRegisters(devices[DeviceIndex].ID, 0, 80);
                ushort[] Part1Value2 = master.ReadHoldingRegisters(devices[DeviceIndex].ID, 120, 30);
                AI64Module.ttime  = DateTime.Now.ToString("yyyyMMddHHmmss");
                AI64Module.CaseNo = CaseNo;
                AI64Module.Ai1    = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai2    = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai3    = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai4    = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai5    = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai6    = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                _ = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai7 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                _ = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                _ = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai8  = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai9  = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai10 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai11 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai12 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai13 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai14 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai15 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai16 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai17 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai18 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai19 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai20 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai21 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai22 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                _ = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai23 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                _ = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai24 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                _ = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai25 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai26 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                _ = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai27 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai28 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai29 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai30 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai31 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai32 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index])); Index += 2;
                AI64Module.Ai33 = Convert.ToDecimal(MathClass.work16to754(Part1Value1[Index + 1], Part1Value1[Index]));
                Index           = 0;
                AI64Module.Ai34 = Convert.ToDecimal(MathClass.work16to754(Part1Value2[Index + 1], Part1Value2[Index])); Index += 2;
                AI64Module.Ai35 = Convert.ToDecimal(MathClass.work16to754(Part1Value2[Index + 1], Part1Value2[Index])); Index += 2;
                AI64Module.Ai36 = Convert.ToDecimal(MathClass.work16to754(Part1Value2[Index + 1], Part1Value2[Index])); Index += 2;
                AI64Module.Ai37 = Convert.ToDecimal(MathClass.work16to754(Part1Value2[Index + 1], Part1Value2[Index])); Index += 2;
                AI64Module.Ai38 = Convert.ToDecimal(MathClass.work16to754(Part1Value2[Index + 1], Part1Value2[Index])); Index += 2;
                AI64Module.Ai39 = Convert.ToDecimal(MathClass.work16to754(Part1Value2[Index + 1], Part1Value2[Index])); Index += 2;
                AI64Module.Ai40 = Convert.ToDecimal(MathClass.work16to754(Part1Value2[Index + 1], Part1Value2[Index])); Index += 2;
                AI64Module.Ai41 = Convert.ToDecimal(MathClass.work16to754(Part1Value2[Index + 1], Part1Value2[Index])); Index += 2;
                AI64Module.Ai42 = Convert.ToDecimal(MathClass.work16to754(Part1Value2[Index + 1], Part1Value2[Index])); Index += 2;
                AI64Module.Ai43 = Convert.ToDecimal(MathClass.work16to754(Part1Value2[Index + 1], Part1Value2[Index])); Index += 2;
                AI64Module.Ai44 = Convert.ToDecimal(MathClass.work16to754(Part1Value2[Index + 1], Part1Value2[Index])); Index += 2;
                AI64Module.Ai45 = Convert.ToDecimal(MathClass.work16to754(Part1Value2[Index + 1], Part1Value2[Index])); Index += 2;
                AI64Module.Ai46 = Convert.ToDecimal(MathClass.work16to754(Part1Value2[Index + 1], Part1Value2[Index])); Index += 2;
                AI64Module.Ai47 = Convert.ToDecimal(MathClass.work16to754(Part1Value2[Index + 1], Part1Value2[Index])); Index += 2;
                AI64Module.Ai48 = Convert.ToDecimal(MathClass.work16to754(Part1Value2[Index + 1], Part1Value2[Index]));
                DeviceIndex++;
            }
            catch (ThreadAbortException) { }
            catch (Exception ex)
            {
                ConnectionFlag = false;
                Log.Error(ex, $"AI數值第一部分讀取錯誤 ID: {devices[DeviceIndex].ID}");
            }
            #endregion
            #region 第二部分
            try
            {
                Index = 0;
                ushort[] Part2Value1 = master.ReadInputRegisters(devices[DeviceIndex].ID, 0, 34);
                AI64Module.Ai49 = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index])); Index += 2;
                AI64Module.Ai50 = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index])); Index += 2;
                AI64Module.Ai51 = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index])); Index += 2;
                _ = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index])); Index += 2;
                AI64Module.Ai52 = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index])); Index += 2;
                AI64Module.Ai53 = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index])); Index += 2;
                AI64Module.Ai54 = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index])); Index += 2;
                _ = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index])); Index += 2;
                _ = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index])); Index += 2;
                _ = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index])); Index += 2;
                _ = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index])); Index += 2;
                _ = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index])); Index += 2;
                _ = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index])); Index += 2;
                AI64Module.Ai55 = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index])); Index += 2;
                AI64Module.Ai56 = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index])); Index += 2;
                AI64Module.Ai57 = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index])); Index += 2;
                AI64Module.Ai58 = Convert.ToDecimal(MathClass.work16to754(Part2Value1[Index + 1], Part2Value1[Index]));
                ConnectionFlag  = true;
            }
            catch (ThreadAbortException) { }
            catch (Exception ex)
            {
                ConnectionFlag = false;
                Log.Error(ex, $"AI數值第二部分讀取錯誤 ID: {devices[DeviceIndex].ID}");
            }
            #endregion
        }
예제 #18
0
 public override void DataReader(ModbusMaster master)
 {
     try
     {
         int      Index = 0;
         ushort[] data  = master.ReadHoldingRegisters(ID, 100, 44);
         ushort[] data1 = master.ReadHoldingRegisters(ID, 324, 13);
         ushort[] data2 = master.ReadHoldingRegisters(ID, 368, 6);
         RSv      = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         STv      = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         TRv      = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         RA       = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         SA       = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         TA       = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         kVA      = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         kW       = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         kVAR     = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         PF       = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         kWh      = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         kVARh    = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         kVAh     = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         RV_Angle = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         SV_Angle = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         TV_Angle = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         RA_Angle = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         SA_Angle = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         TA_Angle = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         Rv       = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         Sv       = MathClass.work16to754(data[Index + 1], data[Index]); Index += 2;
         Tv       = MathClass.work16to754(data[Index + 1], data[Index]);
         Index    = 0;
         if (data1[Index] > 32767)
         {
             HZ = (data1[Index] - 65536) * 0.002f; Index++;
         }
         else
         {
             HZ = (data1[Index] * 0.002f); Index++;
         }
         if (data1[Index] > 32767)
         {
             kW_A = (data1[Index] - 65536) * 0.2f; Index++;
         }
         else
         {
             kW_A = (data1[Index] * 0.2f); Index++;
         }
         if (data1[Index] > 32767)
         {
             kVAR_A = (data1[Index] - 65536) * 0.2f; Index++;
         }
         else
         {
             kVAR_A = (data1[Index] * 0.2f); Index++;
         }
         if (data1[Index] > 32767)
         {
             kVA_A = (data1[Index] - 65536) * 0.2f; Index++;
         }
         else
         {
             kVA_A = (data1[Index] * 0.2f); Index++;
         }
         if (data1[Index] > 32767)
         {
             PF_A = (data1[Index] - 65536) * 0.0001f; Index++;
         }
         else
         {
             PF_A = (data1[Index] * 0.0001f); Index++;
         }
         if (data1[Index] > 32767)
         {
             kW_B = (data1[Index] - 65536) * 0.2f; Index++;
         }
         else
         {
             kW_B = (data1[Index] * 0.2f); Index++;
         }
         if (data1[Index] > 32767)
         {
             kVAR_B = (data1[Index] - 65536) * 0.2f; Index++;
         }
         else
         {
             kVAR_B = (data1[Index] * 0.2f); Index++;
         }
         if (data1[Index] > 32767)
         {
             kVA_B = (data1[Index] - 65536) * 0.2f; Index++;
         }
         else
         {
             kVA_B = (data1[Index] * 0.2f); Index++;
         }
         if (data1[Index] > 32767)
         {
             PF_B = (data1[Index] - 65536) * 0.0001f; Index++;
         }
         else
         {
             PF_B = (data1[Index] * 0.0001f); Index++;
         }
         if (data1[Index] > 32767)
         {
             kW_C = (data1[Index] - 65536) * 0.2f; Index++;
         }
         else
         {
             kW_C = (data1[Index] * 0.2f); Index++;
         }
         if (data1[Index] > 32767)
         {
             kVAR_C = (data1[Index] - 65536) * 0.2f; Index++;
         }
         else
         {
             kVAR_C = (data1[Index] * 0.2f); Index++;
         }
         if (data1[Index] > 32767)
         {
             kVA_C = (data1[Index] - 65536) * 0.2f; Index++;
         }
         else
         {
             kVA_C = (data1[Index] * 0.2f); Index++;
         }
         if (data1[Index] > 32767)
         {
             PF_C = (data1[Index] - 65536) * 0.0001f; Index++;
         }
         else
         {
             PF_C = (data1[Index] * 0.0001f); Index++;
         }
         Index       = 0;
         kWh_A       = MathClass.work16to10(data2[Index], data2[Index + 1]) * 0.001; Index += 2;
         kWh_B       = MathClass.work16to10(data2[Index], data2[Index + 1]) * 0.001; Index += 2;
         kWh_C       = MathClass.work16to10(data2[Index], data2[Index + 1]) * 0.001;
         ConnectFlag = true;
     }
     catch (Exception ex)
     {
         ConnectFlag = false;
         Log.Error(ex, $"HC6600解析異常、通訊編號: {GatewayIndex}、設備編號: {DeviceIndex}");
     }
 }
예제 #19
0
        public bool Read()
        {
            if (_master == null)
            {
                throw new NullReferenceException("_master");
            }

            var minReg = Registers.Min();
            var maxReg = Registers.Max();
            var count  = Convert.ToUInt16(maxReg - minReg + 1);

            try
            {
                //等300ms,有些设备需要休息时间,主要是新普惠的破设备太坑爹
                Thread.Sleep(300);
                //锁一下Transport,避免和其它的调用者发生冲突
                lock (Transport)
                    switch (Function)
                    {
                    case MBFunction.ReadInputs:
                        var inputsResult = _master.ReadInputs(minReg, count);
                        if (inputsResult == null)
                        {
                            return(false);
                        }
                        Values.Clear();
                        if (inputsResult.Any())
                        {
                            Values = inputsResult.Select(b => b ? (UInt16)1 : (UInt16)0).ToList();
                        }
                        break;

                    case MBFunction.ReadHoldingRegisters:
                        var holdingRegistersResult = _master.ReadHoldingRegisters(minReg, count);
                        if (holdingRegistersResult == null)
                        {
                            return(false);
                        }
                        Values.Clear();
                        if (holdingRegistersResult.Any())
                        {
                            Values = holdingRegistersResult.ToList();
                        }
                        break;

                    case MBFunction.ReadInputRegisters:
                        var inputRegistersResult = _master.ReadInputRegisters(minReg, count);
                        if (inputRegistersResult == null)
                        {
                            return(false);
                        }
                        Values.Clear();
                        if (inputRegistersResult.Any())
                        {
                            Values = inputRegistersResult.ToList();
                        }
                        break;

                    default:
                        return(false);
                    }
                return(true);
            }
            catch (ObjectDisposedException odx)
            {
                throw odx;
            }
            catch (Exception ex)
            {
                XTrace.WriteException(ex);
                return(false);
            }
        }
예제 #20
0
        protected virtual void SettingsRead()
        {
            ioDelay();
            ushort[] st = master.ReadHoldingRegisters(DeviceID, aSettingsStart, aSettingsLength);

            // zoom, flags
            _flagsWriteable = st[aSettingsFlagsOffset];
            ref_null        = st[6];
            // settings
            foreach (var p in settings)
            {
                //if (p != null) p.RawValue = st[aSettingsParametersOffset + GetId( p )];
                if (p != null)
                {
                    p.RawValue = st[aSettingsParametersOffset + p.ID];
                }
            }
            // settings initialization
            if (init)
            {
                SettingsInit(st);
            }

            // inputs
            ioDelay();


            st            = master.ReadHoldingRegisters(DeviceID, aInputsStart, aInputsLength);
            FlagsReadOnly = st[aInputsFlagsOffset];



            short[] st1 = new short[st.Length];
            for (int i = 0; i < st.Length; i++)
            {
                st1[i] = (short)st[i];
            }

            if (st1[2] < 0)
            {
                sign  = -1;
                st[2] = (ushort)(st1[2] * sign);
            }

            else
            {
                sign = 1;
            }



            foreach (var p in inputs)
            {
                //if (p != null) p.RawValue = p.WantedValue = st[ p.ID ];
                if (p != null)
                {
                    p.RawValue = p.WantedValue = st[p.ID];
                }
            }

            // id
            var sb = new StringBuilder();

            for (int i = aInputsIDOffset; i < aInputsIDOffset + 6; ++i)
            {
                sb.AppendFormat(i != aInputsIDOffset ? ":{0:X4}" : "{0:X4}", st[i]);
            }
            var sbid = sb.ToString();

            if (ID != sbid)
            {
                // CHANGED!
                ID = sb.ToString();
            }
            var sb2 = new StringBuilder();

            for (int i = aInputsMD5Offset; i < aInputsMD5Offset + 6; ++i)
            {
                sb2.AppendFormat(i != aInputsMD5Offset ? ":{0:X4}" : "{0:X4}", st[i]);
            }
            var sbmd5 = sb2.ToString();

            if (MD5 != sbmd5)
            {
                // CHANGED!
                MD5 = sb2.ToString();
            }
        }