예제 #1
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));
        }
예제 #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
        private float GetAnalog(ModbusMaster master, int point)
        {
            var words = master.ReadInputRegisters(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));
        }
예제 #4
0
 public override void DataReader(ModbusMaster master)
 {
     try
     {
         ushort[] Loop1 = master.ReadInputRegisters(ID, 4096, 82);
         ushort[] Loop2 = master.ReadInputRegisters(ID, 4352, 82);
         ushort[] Loop3 = master.ReadInputRegisters(ID, 4608, 82);
         ushort[] Loop4 = master.ReadInputRegisters(ID, 4864, 82);
         Analysis(Loop1, 0);
         Analysis(Loop2, 1);
         Analysis(Loop3, 2);
         Analysis(Loop4, 3);
         ConnectFlag = true;
     }
     catch (Exception ex)
     {
         ConnectFlag = false;
         Log.Error(ex, $"PA60解析異常、通訊編號: {GatewayIndex}、設備編號: {DeviceIndex}");
     }
 }
예제 #5
0
        /// <summary>
        /// Read contiguous block of 32 bit input 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>Input registers status</returns>
        public static uint[] ReadInputRegisters32(this ModbusMaster master, byte slaveAddress, ushort startAddress, ushort numberOfPoints)
        {
            if (master == null)
            {
                throw new ArgumentNullException("master");
            }
            ValidateNumberOfPoints(numberOfPoints, 62);

            var rawRegisters = master.ReadInputRegisters(slaveAddress, startAddress, (ushort)(numberOfPoints * 2));

            return(Convert(rawRegisters).ToArray());
        }
예제 #6
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);
        }
예제 #7
0
 public virtual void ReadInputRegisters()
 {
     ushort[] registers = Master.ReadInputRegisters(SlaveAddress, 104, 2);
     Assert.AreEqual(new ushort[] { 0, 0 }, registers);
 }
예제 #8
0
        public void Start()
        {
            _CTS = new CancellationTokenSource();
            _T   = Task.Factory.StartNew(() =>
            {
                while (!_CTS.IsCancellationRequested)
                {
                    if (_ModbusTCP != null && _ModbusTCP.Connected)
                    {
                        _Master = _ModbusTCP;
                    }
                    else if (_ModbusRTU != null && _ModbusRTU.Connected)
                    {
                        _Master = _ModbusRTU;
                    }

                    ushort[] sr;
                    string status = string.Empty;
                    lock (_Locker)
                        sr = _Master.ReadInputRegisters(1, 50000, 120);

                    if (sr == null)//连接已断开
                    {
                    }
                    else
                    {
                        //安全互锁
                        switch (sr[0])
                        {
                        case 1:
                            status = "已连接";
                            break;

                        case 2:
                            status = "断开";
                            break;

                        default:
                            break;
                        }
                        Interlock = string.Format("{0} ({1})", sr[0], status);

                        //USB连接状态
                        switch (sr[1])
                        {
                        case 1:
                            status = "已连接";
                            break;

                        case 2:
                            status = "关闭";
                            break;

                        case 3:
                            status = "正在启动";
                            break;

                        case 4:
                            status = "丢失";
                            break;

                        default:
                            status = string.Empty;
                            break;
                        }
                        USBStatus = string.Format("{0} ({1})", sr[1], status);

                        //打标卡急停
                        switch (sr[2])
                        {
                        case 2:
                            status = "急停";
                            break;

                        case 1:
                            status = "正常";
                            break;

                        default:
                            status = string.Empty;
                            break;
                        }
                        USCEStop = string.Format("{0} ({1})", sr[2], status);


                        //振镜头报错
                        switch (sr[3])
                        {
                        case 2:
                            status = "报错";
                            break;

                        case 1:
                            status = "正常";
                            break;

                        default:
                            status = string.Empty;
                            break;
                        }
                        ScannerError = string.Format("{0} ({1})", sr[3], status);

                        SystemTime    = new DateTime(sr[6], sr[7], sr[8], sr[9], sr[10], sr[11]).ToString();
                        TotalMarkTime = new TimeSpan(sr[12], sr[13], sr[14], sr[15]).ToString();

                        switch (sr[16])
                        {
                        case 1:
                            status = "正常";
                            break;

                        case 2:
                            status = "错误";
                            break;

                        default:
                            status = string.Empty;
                            break;
                        }
                        ActiveGood = string.Format("{0} ({1})", sr[16], status);

                        TemplateStatus   = sr[17];
                        TextStatus       = sr[18];
                        DateStatus       = sr[19];
                        SerialStatus     = sr[20];
                        DataMatrixStatus = sr[21];
                        SystemStatus     = sr[22];
                        ExecutionCount   = sr[23];

                        switch (sr[22])
                        {
                        case 1:
                            status = "空闲";
                            break;

                        case 2:
                            status = "正在执行";
                            break;

                        default:
                            status = string.Empty;
                            break;
                        }
                        Executing = string.Format("{0} ({1})", sr[24], status);

                        MarkBeginStatus = string.Format("{0} ({1})", sr[25], (QuickCoding.StatusCode)sr[25]);
                        MarkEndStatus   = string.Format("{0} ({1})", sr[26], (QuickCoding.StatusCode)sr[26]);
                        TotalMarkCount  = sr[27].ToString();
                        MarkDelay       = string.Format("{0} (ms)", sr[28]);

                        switch (sr[29])
                        {
                        case 0:
                            status = "NA";
                            break;

                        case 1:
                            status = "正常";
                            break;

                        case 2:
                            status = "报警";
                            break;

                        default:
                            break;
                        }
                        CO2_LaserReady = string.Format("{0} ({1})", sr[29], status);

                        switch (sr[30])
                        {
                        case 0:
                            status = "NA";
                            break;

                        case 1:
                            status = "正常";
                            break;

                        case 2:
                            status = "报警";
                            break;

                        default:
                            break;
                        }
                        CO2_OverTemp = string.Format("{0} ({1})", sr[30], status);

                        switch (sr[31])
                        {
                        case 0:
                            status = "NA";
                            break;

                        case 1:
                            status = "正常";
                            break;

                        case 2:
                            status = "报警";
                            break;

                        default:
                            break;
                        }
                        CO2_DCFault = string.Format("{0} ({1})", sr[31], status);


                        switch (sr[32])
                        {
                        case 0:
                            status = "NA";
                            break;

                        case 1:
                            status = "温度异常";
                            break;

                        case 2:
                            status = "高反";
                            break;

                        case 3:
                            status = "正常";
                            break;

                        case 4:
                            status = "MO失败";
                            break;

                        default:
                            break;
                        }
                        FiberStatus = string.Format("{0} ({1})", sr[32], status);
                    }
                    SpinWait.SpinUntil(() => false, 100);
                }
            }, _CTS.Token);
        }
예제 #9
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
        }
예제 #10
0
 public override void DataReader(ModbusMaster master)
 {
     try
     {
         ushort[] value  = master.ReadInputRegisters(ID, 0, 82);
         ushort[] value1 = master.ReadInputRegisters(ID, 200, 8);
         ushort[] value2 = master.ReadInputRegisters(ID, 342, 40);
         int      Index  = 0;
         Rv          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         Sv          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         Tv          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         RA          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         SA          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         TA          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         kW_A        = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //R相有效功率
         kW_B        = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //S相有效功率
         kW_C        = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //T相有效功率
         kVA_A       = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //R相視在功率
         kVA_B       = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //S相視在功率
         kVA_C       = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //T相視在功率
         kVAR_A      = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //R相虛功率
         kVAR_B      = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //S相虛功率
         kVAR_C      = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //T相虛功率
         PF_A        = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //R相功率因數
         PF_B        = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //S相功率因數
         PF_C        = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //T相功率因數
         RV_Angle    = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //R相位角
         SV_Angle    = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //S相位角
         TV_Angle    = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //T相位角
         _           = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //平均線電壓
         _           = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //平均線電流
         _           = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //加總線電流
         kW          = MathClass.work16to754(value[Index + 1], value[Index]) / 1000; Index += 2; //總系統有效功率
         kVA         = MathClass.work16to754(value[Index + 1], value[Index]) / 1000; Index += 2; //總系統視在功率
         kVAR        = MathClass.work16to754(value[Index + 1], value[Index]) / 1000; Index += 2; //總系統虛功率
         PF          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //總系統功率因數
         _           = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //總系統相位角
         HZ          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //頻率
         _           = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //總輸入累積用電度
         _           = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //總輸出累積用電度
         _           = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;        //總輸入累積視在功率
         kVA         = MathClass.work16to754(value[Index + 1], value[Index]);                    //總輸出累積視在功率
         Index       = 0;
         RSv         = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         STv         = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         TRv         = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         _           = MathClass.work16to754(value1[Index + 1], value1[Index]);             //平均相電壓
         Index       = 0;
         kWh         = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //總累積用電度數
         kVARh       = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //總累積虛功率
         _           = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //R相輸入累積用電度數
         _           = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //S相輸入累積用電度數
         _           = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //T相輸入累積用電度數
         _           = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //R相輸出累積用電度數
         _           = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //S相輸出累積用電度數
         _           = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //T相輸出累積用電度數
         kWh_A       = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //R相總累積用電度數
         kWh_B       = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //S相總累積用電度數
         kWh_C       = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //T相總累積用電度數
         _           = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //R相輸入累積視在功率
         _           = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //S相輸入累積視在功率
         _           = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //T相輸入累積視在功率
         _           = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //R相輸出累積視在功率
         _           = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //S相輸出累積視在功率
         _           = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //T相輸出累積視在功率
         kVAR_A      = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //R相總累積視在功率
         kVAR_B      = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //S相總累積視在功率
         kVAR_C      = MathClass.work16to754(value2[Index + 1], value2[Index]); Index += 2; //T相總累積視在功率
         ConnectFlag = true;
     }
     catch (Exception ex)
     {
         ConnectFlag = false;
         Log.Error(ex, $"CPM6解析異常、通訊編號: {GatewayIndex}、設備編號: {DeviceIndex}");
     }
 }
예제 #11
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);
            }
        }
예제 #12
0
 public override void DataReader(ModbusMaster master)
 {
     try
     {
         int      Index  = 0;
         ushort[] value  = master.ReadInputRegisters(ID, 1024, 72);
         ushort[] value1 = master.ReadInputRegisters(ID, 1152, 40);
         Rv          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         Sv          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         Tv          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         _           = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2; //平均
         RSv         = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         STv         = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         TRv         = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         _           = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;//平均
         RA          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         SA          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         TA          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         _           = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2; //平均
         HZ          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         kW_A        = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2; //功率
         kW_B        = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2; //功率
         kW_C        = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2; //功率
         kW          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         kVAR_A      = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2; //虛功率
         kVAR_B      = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2; //虛功率
         kVAR_C      = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2; //虛功率
         kVAR        = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         kVA_A       = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2; //視在功率
         kVA_B       = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2; //視在功率
         kVA_C       = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2; //視在功率
         kVA         = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         PF_A        = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2; //功率因數
         PF_B        = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2; //功率因數
         PF_C        = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2; //功率因數
         PF          = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         RV_Angle    = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         SV_Angle    = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         TV_Angle    = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         RA_Angle    = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         SA_Angle    = MathClass.work16to754(value[Index + 1], value[Index]); Index += 2;
         TA_Angle    = MathClass.work16to754(value[Index + 1], value[Index]);
         Index       = 0;
         kWh_A       = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         _           = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         kVARh_A     = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         _           = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         kVAh_A      = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         kWh_B       = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         _           = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         kVARh_B     = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         _           = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         kVAh_B      = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         kWh_C       = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         _           = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         kVARh_C     = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         _           = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         kVAh_C      = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         kWh         = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         _           = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         kVARh       = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         _           = MathClass.work16to754(value1[Index + 1], value1[Index]); Index += 2;
         kVAh        = MathClass.work16to754(value1[Index + 1], value1[Index]);
         ConnectFlag = true;
     }
     catch (Exception ex)
     {
         ConnectFlag = false;
         Log.Error(ex, $"PA310解析異常、通訊編號: {GatewayIndex}、設備編號: {DeviceIndex}");
     }
 }
예제 #13
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);
                }
            }
        }