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}"); } }
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)); }
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)); }
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}"); } }
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)); }
public ushort[] ReadHoldingRegisters(ushort start, ushort len) { ushort[] result = null; if (RTUConnected || TCPConnected) { lock (_Locker) { result = _Master.ReadHoldingRegisters(1, start, len); } } return(result); }
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 }); }
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); }
/// <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()); }
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}"); } }
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); }
public virtual void ReadHoldingRegisters() { ushort[] registers = Master.ReadHoldingRegisters(SlaveAddress, 104, 2); Assert.AreEqual(new ushort[] { 0, 0 }, registers); }
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}"); } }
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); } } }
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); }
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 { 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}"); } }
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); } }
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(); } }