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)); }
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)); }
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)); }
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}"); } }
/// <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()); }
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 virtual void ReadInputRegisters() { ushort[] registers = Master.ReadInputRegisters(SlaveAddress, 104, 2); Assert.AreEqual(new ushort[] { 0, 0 }, registers); }
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); }
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 }
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}"); } }
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); } }
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}"); } }
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); } } }