static void Main(string[] args) { ModbusClient modBusClient = new ModbusClient("127.0.0.1", 502); modBusClient.Connect(); bool[] readCoils = modBusClient.ReadCoils(0, 10); int[] readInputRegisters = modBusClient.ReadInputRegisters(0, 10); int[] readsHoldingRegisters = modBusClient.ReadHoldingRegisters(0, 10); bool[] readDiscreteInputs = modBusClient.ReadDiscreteInputs(0, 10); int[] ar = new int[5]; ar[0] = 1; ar[1] = 2; ar[2] = 3; int[] readMultipleRegisters = modBusClient.ReadWriteMultipleRegisters(0, 10, 0, ar); for (int i = 0; i < readCoils.Length; i++) { Console.WriteLine("Value of Coil :" + (9 + i + 1) + " " + readCoils[i].ToString()); } for (int i = 0; i < readsHoldingRegisters.Length; i++) { Console.WriteLine("Value of HoldingRegister :" + (9 + i + 1) + " " + readsHoldingRegisters[i].ToString()); } Console.Read(); }
public void ReadInputRegister() { try { Console.WriteLine("Please Enter The Starting Address of Input Register:"); string holdingregister = Console.ReadLine(); int register = Convert.ToInt32(holdingregister); int[] readInputRegisters = modbusClient.ReadInputRegisters(register, 50); if (readInputRegisters != null) { for (int i = 0; i < readInputRegisters.Length; i++) { Console.ForegroundColor = ConsoleColor.Green; Decimal _toDecimal = Convert.ToDecimal(readInputRegisters[i]); Console.WriteLine((register) + ":" + "<" + _toDecimal + ">"); register++; } } Console.ResetColor(); modbusClient.Disconnect(); Console.ReadKey(); } catch (Exception e) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(e.Message); Console.ResetColor(); Console.ReadLine(); } }
private void updateModbus() { try { int[] registers = modbusClient.ReadHoldingRegisters(0, 4); int[] inputs = modbusClient.ReadInputRegisters(0, 5); bool[] coilStatus = modbusClient.ReadCoils(0, 5); double pressure = ((float)inputs[0] - 100) / 100.0; double tank_lvl = inputs[1] / 10.0; double flow_rate = inputs[4]; double return_flow_rate = inputs[2]; double tank_flow_rate = inputs[3]; int mode = registers[3]; pump_state = coilStatus[0]; relief_valve_state = coilStatus[4]; isolation_valve_state = coilStatus[2]; return_valve_state = coilStatus[3]; inlet_valve_state = coilStatus[1]; station_pressure.Text = "Value: " + pressure.ToString() + " bar"; station_flow.Text = "Rate: " + flow_rate.ToString() + " KL/h"; station_return_flow.Text = "Rate: " + return_flow_rate.ToString() + " KL/h"; station_tank_flow.Text = "Rate: " + tank_flow_rate.ToString() + " KL/h"; station_tank_lvl.Text = tank_lvl.ToString() + " KL"; isolation_valve.Image = (isolation_valve_state == true) ? Image.FromFile("./sprites/valve_on.png") : Image.FromFile("./sprites/valve_off.png"); station_pump.Image = (pump_state == true) ? Image.FromFile("./sprites/pump_on.png") : Image.FromFile("./sprites/pump_off.png"); relief_valve.Image = (relief_valve_state == true) ? Image.FromFile("./sprites/valve_on_90.png") : Image.FromFile("./sprites/valve_off_90.png"); inlet_valve.Image = (inlet_valve_state == true) ? Image.FromFile("./sprites/valve_on_90.png") : Image.FromFile("./sprites/valve_off_90.png"); return_valve.Image = (return_valve_state == true) ? Image.FromFile("./sprites/valve_on.png") : Image.FromFile("./sprites/valve_off.png"); isolation_valve_btn.BackColor = (stations_data.stationVariables[4].man_isolation_valve_state == 1) ? Color.LimeGreen : Color.Gainsboro; pump_btn.BackColor = (stations_data.stationVariables[4].man_pump_state == 1) ? Color.LimeGreen : Color.Gainsboro; relief_valve_btn.BackColor = (stations_data.stationVariables[4].man_valve_state == 1) ? Color.LimeGreen : Color.Gainsboro; return_valve_btn.BackColor = (stations_data.stationVariables[4].man_return_valve_state == 1) ? Color.LimeGreen : Color.Gainsboro; inlet_valve_btn.BackColor = (stations_data.stationVariables[4].man_inlet_valve_state == 1) ? Color.LimeGreen : Color.Gainsboro; } catch { isolation_valve.Image = Image.FromFile("./sprites/valve_offline.png"); station_pump.Image = Image.FromFile("./sprites/pump_offline.png"); relief_valve.Image = Image.FromFile("./sprites/valve_offline_90.png"); inlet_valve.Image = Image.FromFile("./sprites/valve_offline_90.png"); return_valve.Image = Image.FromFile("./sprites/valve_offline.png"); station_pressure.Text = "Value: - "; station_flow.Text = "Rate: - "; station_return_flow.Text = "Rate: - "; station_tank_flow.Text = "Rate: - "; station_tank_lvl.Text = " - "; isolation_valve_btn.Enabled = false; pump_btn.Enabled = false; relief_valve_btn.Enabled = false; return_valve_btn.Enabled = false; inlet_valve_btn.Enabled = false; } }
public static int[] LayDuLieuTCPInputRegister(ModbusClient modbus, ushort quantityInputRegisters, ushort minAddressInputRegister, ThietBiModel thietBiModel) { List <int> readInputRegisters = new List <int>(); if (quantityInputRegisters != 0) { try { int soNguyenSauChia = quantityInputRegisters / DonViQuantityMoiLanDoc; for (int i = 0; i <= soNguyenSauChia; i++) { if (i != soNguyenSauChia) { int startAddress = i * DonViQuantityMoiLanDoc + minAddressInputRegister; int quantity = DonViQuantityMoiLanDoc - minAddressInputRegister; var temp = modbus.ReadInputRegisters(startAddress, (ushort)(quantity)); readInputRegisters.AddRange(temp.ToList()); } else if (i == soNguyenSauChia) { int startAddress = i * DonViQuantityMoiLanDoc + minAddressInputRegister; int quantity = quantityInputRegisters % DonViQuantityMoiLanDoc - minAddressInputRegister; if (quantity != 0) { var temp = modbus.ReadInputRegisters(startAddress, (ushort)(quantity)); readInputRegisters.AddRange(temp.ToList()); } } } } catch (ModbusException ex) { ExceptionFunctionCode(ex, thietBiModel); throw; } catch (Exception ex)//Lỗi lấy dữ liệu thất bại { ExceptionErrorConnection(ex, thietBiModel); throw; } } return(readInputRegisters.ToArray()); }
private void button_givedata_Click(object sender, EventArgs e) { dataGridView1.Rows.Clear(); modbusClient = new ModbusClient("192.168.100.8", 502); //Ip-Address and Port of Modbus-TCP-Server modbusClient.Connect(); try { int Address = Convert.ToInt32(startingAddress.Text); int kolvo = Convert.ToInt32(quantity.Text); if (RadioHolding.Checked == true) { int[] readHoldingRegisters = modbusClient.ReadHoldingRegisters((Address - 40001), (kolvo - Address + 1)); for (int i = 0; i < readHoldingRegisters.Length; i++) { if (i < readHoldingRegisters.Length - 1) { dataGridView1.Rows.Insert(i, 1); } dataGridView1.Rows[i].Cells[1].Value = readHoldingRegisters[i].ToString(); dataGridView1.Rows[i].Cells[0].Value = (Address + i); } } if (RadioInput.Checked == true) { int[] ReadInputRegisters = modbusClient.ReadInputRegisters((Address - 30001), (kolvo - Address + 1)); for (int i = 0; i < ReadInputRegisters.Length; i++) { if (i < ReadInputRegisters.Length - 1) { dataGridView1.Rows.Insert(i, 1); } dataGridView1.Rows[i].Cells[1].Value = ReadInputRegisters[i].ToString(); dataGridView1.Rows[i].Cells[0].Value = (Address + i); } } button_changedata.Enabled = true; } catch (Exception ex) { MessageBox.Show(ex.Message.ToString() + "\n\nДиапазон адрессов:\n\nInputRegister - 30001\nHoldingRegisters - 40001"); } }
public void lerDados(int tipo) { int startadd, quant; string[] dados = new string[1]; try { if (modbus.Connected) { if (int.TryParse(tb_endi.Text, out startadd) && int.TryParse(tb_quantidade.Text, out quant) { tb_dados.Text = ""; switch (tipo) { case 1: bool[] dadosCo = modbus.ReadCoils(startadd, quant); dados = dadosCo.Select(x => x.ToString()).ToArray(); break; case 2: bool[] dadosDI = modbus.ReadDiscreteInputs(startadd, quant); dados = dadosDI.Select(x => x.ToString()).ToArray(); break; case 3: int[] dadosHR = modbus.ReadHoldingRegisters(startadd, quant); dados = dadosHR.Select(x => x.ToString()).ToArray(); break; case 4: int[] dadosIR = modbus.ReadInputRegisters(startadd, quant); dados = dadosIR.Select(x => x.ToString()).ToArray(); break; } for (int i = 0; i < dados.Length; i++) { tb_dados.Text += "Dado " + i.ToString() + ": " + dados[i].ToString() + "\r\n"; } } } else { MessageBox.Show("Servidor MODBUS TCP Desconectado"); } } catch (Exception err) { MessageBox.Show("Erro na leitura dos dados MODBUS. \r\nErro: " + err.Message); } }
private string ReadDataFromSlave(int FunctionCode, int startingAddress) { try // 데이터 Gathering 시도 { switch (FunctionCode) { case 0: return(modbusClient.ReadCoils(startingAddress, 1)[0].ToString()); // FC 1 00000-100000 시작번지 부터 지정한 개수 읽기 case 1: return(modbusClient.ReadDiscreteInputs(startingAddress, 1)[0].ToString()); // FC 2 100001-200000 case 2: return(modbusClient.ReadHoldingRegisters(startingAddress, 1)[0].ToString()); // FC 3 400001-500000 case 3: return(modbusClient.ReadInputRegisters(startingAddress, 1)[0].ToString()); // FC 4 300000-400000 default: // 이외의 값이 들어올 때 처리 return(null); } } catch (Exception) { return(null); } #region 예외처리 보관함 /*catch (ModbusException) // 모드버스 예외 발생 시 * { * i--; // 예외 발생한 부분 다시 반복 * } * catch (TimeoutException) // 타임 아웃 에러 시 * { * i--; // 예외 발생한 부분 다시 반복 * } * catch (StackOverflowException) // 데이터 과다복용 사망 시 * { * i--; * } * catch (NullReferenceException) * { * readData[i] = "Null 붙잡을 노래"; * } */ #endregion }
public int[] ReadInputRegister(byte slaveAddress, ushort startAddress, ushort numberOfPoints) { Log.Debug("GET ReadInputRegister: SlaveAddress {0}, StartAddress {1}, NumberOfPoints {2}", slaveAddress, startAddress, numberOfPoints); try { _master.UnitIdentifier = slaveAddress; var response = _master.ReadInputRegisters(startAddress, numberOfPoints); Log.Debug("RESPONSE ReadInputRegister: {0}", String.Join(",", response)); return(response); } catch (Exception ex) { Log.Error(ex, "ERROR: ReadInputRegister: SlaveAddress {0}, StartAddress {1}, NumberOfPoints {2} - MSG: {3}", slaveAddress, startAddress, numberOfPoints, ex.Message); //throw ex; return(null); } }
// read %AI public int[] ReadAI(int startingAddress, int quantity) { int[] val = new int[quantity]; try { ModbusClient client = new ModbusClient(IPAddress, Port); client.Connect(); val = client.ReadInputRegisters(startingAddress, quantity); client.Disconnect(); } catch { } return(val); }
//点击连接 private void b_connect_Click(object sender, RoutedEventArgs e) { modbusClient.Connect(); Thread.Sleep(1000); int[] i = modbusClient.ReadInputRegisters(10, 1); foreach (int team in i) { if (team != 1) { ConnectStatus.Content = "连接失败"; } else { ConnectStatus.Content = "连接成功"; ConnectStatus.Foreground = new SolidColorBrush(Colors.Green); } } }
public int get_EtatMachine() { int registre; try { //string data = ""; int[] readHoldingRegisters = modbusClient.ReadInputRegisters(0, 2); registre = readHoldingRegisters[1]; //data += registre; //MessageBox.Show(data); } catch { registre = 0; //MessageBox.Show("Connexion automate interrompue."); } return(registre); }
private void timer1_Tick(object sender, EventArgs e) { try { if (svimaster.Connected == false) { svimaster.UnitIdentifier = 1; // Not necessary since default slaveID = 1; svimaster.Baudrate = 9600; // Not necessary since default baudrate = 9600 svimaster.Parity = System.IO.Ports.Parity.Even; svimaster.StopBits = System.IO.Ports.StopBits.One; svimaster.ConnectionTimeout = 1000; svimaster.Connect(); label1.BackColor = Color.YellowGreen; label1.Text = "Connect"; } if (svimaster.Connected == true) { int[] Weight; float NetWeight; Weight = svimaster.ReadInputRegisters(25, 2); NetWeight = ModbusClient.ConvertRegistersToFloat(Weight); textBoxWeight.Text = Convert.ToString(Convert.ToUInt64(NetWeight.ToString()) - Convert.ToUInt64(textBoxNumberOfPareSnag.Text)); } } catch { svimaster.Disconnect(); try { svimaster.Connect(); } catch { textBoxWeight.Text = "99999999"; } } }
public async Task ClientReadInputRegisterTest() { // Function Code 0x04 var expectedRequest = new byte[] { 0, 0, 0, 6, 3, 4, 0, 6, 0, 3 }; var expectedResponse = new List <Register> { new Register { Address = 6, Value = 123 }, new Register { Address = 7, Value = 0 }, new Register { Address = 8, Value = 12345 } }; using (var server = new MiniTestServer()) { server.RequestHandler = (request, clientIp) => { CollectionAssert.AreEqual(expectedRequest, request.Skip(2).ToArray(), "Request is incorrect"); Console.WriteLine("Server sending response"); return(new byte[] { request[0], request[1], 0, 0, 0, 9, 3, 4, 6, 0, 123, 0, 0, 48, 57 }); }; server.Start(); using (var client = new ModbusClient(IPAddress.Loopback, server.Port, new ConsoleLogger())) { await client.Connect(); Assert.IsTrue(client.IsConnected); var registers = await client.ReadInputRegisters(3, 6, 3); Assert.IsTrue(string.IsNullOrWhiteSpace(server.LastError), server.LastError); CollectionAssert.AreEqual(expectedResponse, registers, "Response is incorrect"); } } }
private void btnReadInputRegisters_Click(object sender, EventArgs e) { try { if (!modbusClient.Connected) { button3_Click(null, null); } int[] serverResponse = modbusClient.ReadInputRegisters(int.Parse(txtStartingAddressInput.Text) - 1, int.Parse(txtNumberOfValuesInput.Text)); lsbAnswerFromServer.Items.Clear(); for (int i = 0; i < serverResponse.Length; i++) { lsbAnswerFromServer.Items.Add(serverResponse[i]); } } catch (Exception exc) { MessageBox.Show(exc.Message, "Exception Reading values from Server", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
//lấy dữ liệu của các thiết bị private void getDataDevice(KeyValuePair <string, DeviceModel> deviceUnit, string filePath) { string[] output = new string[deviceUnit.Value.ListDuLieuChoTungPLC.Count]; //doc tung dong trong list data cua 1 device for (int i = 0; i < deviceUnit.Value.ListDuLieuChoTungPLC.Count; i++) { DuLieuModel duLieuTemp = deviceUnit.Value.ListDuLieuChoTungPLC.ElementAt(i).Value; string giaTriDuLieu = ""; try { if (Convert.ToInt32(duLieuTemp.DiaChi) <= 65536) { bool[] readCoil = mobus.ReadCoils(Convert.ToInt32(duLieuTemp.DiaChi), 1); giaTriDuLieu = readCoil[0].ToString(); } else if (Convert.ToInt32(duLieuTemp.DiaChi) <= 165536 && Convert.ToInt32(duLieuTemp.DiaChi) >= 100001) { bool[] discreteInput = mobus.ReadDiscreteInputs(Convert.ToInt32(duLieuTemp.DiaChi) - 100001, 1); giaTriDuLieu = discreteInput[0].ToString(); } else if (Convert.ToInt32(duLieuTemp.DiaChi) <= 365536 && Convert.ToInt32(duLieuTemp.DiaChi) >= 300001) { int[] readRegister = mobus.ReadInputRegisters(Convert.ToInt32(duLieuTemp.DiaChi) - 300001, 1); giaTriDuLieu = readRegister[0].ToString(); } else if (Convert.ToInt32(duLieuTemp.DiaChi) <= 465536 && Convert.ToInt32(duLieuTemp.DiaChi) >= 400001) { int[] readHoldingRegister = mobus.ReadHoldingRegisters(Convert.ToInt32(duLieuTemp.DiaChi) - 400001, 1); giaTriDuLieu = readHoldingRegister[0].ToString(); } duLieuTemp.GiaTri = Convert.ToInt32(giaTriDuLieu); duLieuTemp.ThoiGianDocGiuLieu = DateTime.Now; deviceUnit.Value.TrangThaiKetNoi = 1; } catch (Exception ex) { } } }
private void timer2_Tick(object sender, EventArgs e) { try { timer2.Enabled = false; bool[] readCoils = modbusClient.ReadCoils(Decimal.ToInt32(nudCoil1.Value), 1); bool[] readCoils2 = modbusClient.ReadCoils(Decimal.ToInt32(nudCoil2.Value), 1); int[] readHoldingRegisters = modbusClient.ReadHoldingRegisters(Decimal.ToInt32(nudReg1.Value), 1); int[] readHoldingRegisters2 = modbusClient.ReadHoldingRegisters(Decimal.ToInt32(nudReg2.Value), 1); int[] readInputRegisters = modbusClient.ReadInputRegisters(0, 1);// đọc analogue input txtGiaTri1.Text = readHoldingRegisters[0].ToString(); txtGiaTri2.Text = readHoldingRegisters2[0].ToString(); chk1.Checked = readCoils[0]; chk2.Checked = readCoils2[0]; txtInputReg.Text = readInputRegisters[0].ToString(); timer2.Enabled = true; } catch { lblStatus.Text = "Error"; } }
public void GetValues(ConnectionProperties connectionProperties) { modbusClient = connectionProperties.modbusClient; if (!modbusClient.Connected) { modbusClient.IPAddress = connectionProperties.ModbusTCPAddress; modbusClient.Port = connectionProperties.Port; modbusClient.Connect(); } foreach (FunctionProperties functionProperty in connectionProperties.FunctionPropertiesList) { switch (functionProperty.FunctionCode) { case FunctionCode.ReadCoils: functionProperty.values = modbusClient.ReadCoils(functionProperty.StartingAdress, functionProperty.Quantity); break; case FunctionCode.ReadDiscreteInputs: functionProperty.values = modbusClient.ReadDiscreteInputs(functionProperty.StartingAdress, functionProperty.Quantity); break; case FunctionCode.ReadHoldingRegisters: functionProperty.values = modbusClient.ReadHoldingRegisters(functionProperty.StartingAdress, functionProperty.Quantity); break; case FunctionCode.ReadInputRegisters: functionProperty.values = modbusClient.ReadInputRegisters(functionProperty.StartingAdress, functionProperty.Quantity); break; default: break; } } if (valuesChanged != null) { valuesChanged(this); } }
private void timer2_Tick(object sender, EventArgs e) { if (ligadot) { if (modbusClient == null) { return; } try { //le a temperatura e mostra no supervisório tratar tensão de o a 10 int temperatura = modbusClient.ReadInputRegisters(128, 1)[0]; temperatura = (temperatura / 1000) + 20; trackBar4.Value = temperatura; string temp = temperatura.ToString(); label19.Text = temp; //le a tensão e mostra no supervisório tratar de 1 a 5 int tensao = modbusClient.ReadHoldingRegisters(3128, 1)[0]; // recebe valor de 400 a 2000 (1 a 5) double tensa = (tensao - 400) * 0.137; string tens = tensa.ToString(); label31.Text = tens; // pega a vazão do arduino e envia para o CLP //transforma o valor de vazao para o CLP float vaz = vazao * 1000; int val = (int)vaz; modbusClient.WriteSingleRegister(10020, val); } catch (Exception ex) { MessageBox.Show(ex.Message, "Erro na escrita de dados no CLP!"); } } }
private void Read_Data() { modbusClient = new ModbusClient("127.0.0.1", 502); //Ip-Address and Port of Modbus-TCP-Server // modbusClient.Disconnect(); try { modbusClient.Connect(); b_Modbus_Connect = true; } catch (Exception) { b_Modbus_Connect = false; SaveLogFile("Modbus 연결 실패"); return; } while (true) { try { n_Value_pm25 = modbusClient.ReadInputRegisters(0, 20); System.Threading.Thread.Sleep(1000); n_Value_pm10 = modbusClient.ReadInputRegisters(100, 20); System.Threading.Thread.Sleep(1000); n_SensorState = modbusClient.ReadInputRegisters(200, 20); } catch (Exception) { modbusClient.Disconnect(); b_Modbus_Connect = false; SaveLogFile("Modbus data Read Fail"); n_SensorState = Enumerable.Repeat(3, 20).ToArray(); return; } for (int i = 0; i < 6; i++) { DateTime dataTime = DateTime.Now; string time = DateTime.Now.ToString("yy_MM"); string time1 = DateTime.Now.ToString("yy-MM-dd-HH-mm-ss"); string sInsert_Text = "INSERT INTO sensor_data_"; sInsert_Text += time + " VALUES (null," + Convert.ToString(i + 1) + ",'" + time1 + "',"; sInsert_Text += Convert.ToString(n_Value_pm25[i * 2]) + "," + Convert.ToString(n_Value_pm10[i * 2]) + ")"; if (mysql.sql(sInsert_Text) == false) { SaveLogFile("insert Fail" + sInsert_Text); string s_Create_Query = "CREATE TABLE `manage`.`sensor_data_#Date` " + "(`index_id` BIGINT(20) NOT NULL AUTO_INCREMENT,`class` INT(11) NOT NULL, " + "`regdate` TIMESTAMP NULL DEFAULT NULL, `pm2.5` INT(11) NULL DEFAULT '0', " + "`pm10` INT(11) NULL DEFAULT '0', INDEX `index_id` (`index_id`) USING BTREE)"; s_Create_Query = s_Create_Query.Replace("#Date", time); mysql.sql(s_Create_Query); //년월 테이블 생성 mysql.sql(sInsert_Text); //실패한 데이터 다시 insert } if (n_Config_Value[i] <= n_Value_pm25[i * 2] && b_Alarm[i] == false) { b_Alarm[i] = true; string sInsert_AlarmText = "INSERT INTO alarm_list VALUES (null," + Convert.ToString(i + 1) + ",'" + time1 + "',"; sInsert_AlarmText += Convert.ToString(n_Config_Value[i]) + "," + Convert.ToString(n_Config_Value2[i]) + "," + Convert.ToString(n_Value_pm25[i * 2]) + "," + Convert.ToString(n_Value_pm10[i * 2]) + ")"; mysql.sql(sInsert_AlarmText); } else if (n_Config_Value[i] >= n_Value_pm25[i * 2] && b_Alarm[i] == true) { b_Alarm[i] = false; } if (n_Config_Value2[i] <= n_Value_pm10[i * 2] && b_Alarm2[i] == false) { b_Alarm2[i] = true; string sInsert_AlarmText = "INSERT INTO alarm_list VALUES (null," + Convert.ToString(i + 1) + ",'" + time1 + "',"; sInsert_AlarmText += Convert.ToString(n_Config_Value[i]) + "," + Convert.ToString(n_Config_Value2[i]) + "," + Convert.ToString(n_Value_pm25[i * 2]) + "," + Convert.ToString(n_Value_pm10[i * 2]) + ")"; mysql.sql(sInsert_AlarmText); } else if (n_Config_Value2[i] >= n_Value_pm10[i * 2] && b_Alarm2[i] == true) { b_Alarm2[i] = false; } } SetLabel(label_Class1PM25, n_Value_pm25[0].ToString()); SetLabel(label_Class2PM25, n_Value_pm25[2].ToString()); SetLabel(label_Class3PM25, n_Value_pm25[4].ToString()); SetLabel(label_Class4PM25, n_Value_pm25[6].ToString()); SetLabel(label_Class5PM25, n_Value_pm25[8].ToString()); SetLabel(label_Class6PM25, n_Value_pm25[10].ToString()); SetLabel(label_Class1PM10, n_Value_pm10[0].ToString()); SetLabel(label_Class2PM10, n_Value_pm10[2].ToString()); SetLabel(label_Class3PM10, n_Value_pm10[4].ToString()); SetLabel(label_Class4PM10, n_Value_pm10[6].ToString()); SetLabel(label_Class5PM10, n_Value_pm10[8].ToString()); SetLabel(label_Class6PM10, n_Value_pm10[10].ToString()); System.Threading.Thread.Sleep(1000); } b_Modbus_Connect = false; }
static async Task RunClientAsync() { //InternalLoggerFactory.DefaultFactory.AddProvider(new ConsoleLoggerProvider((s, level) => true, false)); ModbusClient client = new ModbusClient(0x01, "127.0.0.1"); try { await client.Connect(); while (true) { Console.WriteLine(@" <-------------------------------------------------------> 1: Read Coils; 2: Read Discrete Inputs; 3: Read Holding Registers; 4: Read Input Registers; 5: Write Single Coil; 6: Write Single Register; 15: Write Multiple Coils; 16: Write Multiple Registers; <------------------------------------------------------->"); var line = Console.ReadLine(); if (string.IsNullOrEmpty(line)) { break; } Console.WriteLine("<------------------------------------------------------->"); var command = Convert.ToInt32(line); ModbusFunction response = null; ushort startingAddress = 0x0000; ushort quantity = 0x000A; var state = true; ushort value = 0x0001; switch (command) { case 1: response = client.ReadCoils(startingAddress, quantity); var coils = (response as ReadCoilsResponse).Coils; for (int i = 0; i < quantity; i++) { Console.WriteLine(coils[i]); } break; case 2: response = client.ReadDiscreteInputs(startingAddress, quantity); var inputs = (response as ReadDiscreteInputsResponse).Inputs; for (int i = 0; i < quantity; i++) { Console.WriteLine(inputs[i]); } break; case 3: response = client.ReadHoldingRegisters(startingAddress, quantity); foreach (var register in (response as ReadHoldingRegistersResponse).Registers) { Console.WriteLine(register); } break; case 4: response = client.ReadInputRegisters(startingAddress, quantity); foreach (var register in (response as ReadInputRegistersResponse).Registers) { Console.WriteLine(register); } break; case 5: response = client.WriteSingleCoil(startingAddress, state); Console.WriteLine((response as WriteSingleCoilResponse).State == state ? "Successed" : "Failed"); break; case 6: response = client.WriteSingleRegister(startingAddress, value); Console.WriteLine((response as WriteSingleRegisterResponse).Value == value ? "Successed" : "Failed"); break; case 15: var states = new bool[] { true, true, true, true, true, true, true, true, true, true }; response = client.WriteMultipleCoils(startingAddress, states); Console.WriteLine((response as WriteMultipleCoilsResponse).Quantity == states.Length); break; case 16: var registers = new ushort[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; response = client.WriteMultipleRegisters(startingAddress, registers); Console.WriteLine((response as WriteMultipleRegistersResponse).Quantity == registers.Length); break; } } await client.Close(); Console.ReadLine(); } catch (Exception exception) { Console.WriteLine(exception.Message); } }
static void startCollecting(bool status) { try { ModbusClient modbusClient = new ModbusClient("COM3"); modbusClient.Baudrate = 115200; // Not necessary since default baudrate = 9600 modbusClient.Parity = System.IO.Ports.Parity.None; modbusClient.StopBits = System.IO.Ports.StopBits.Two; modbusClient.ConnectionTimeout = 5000; modbusClient.Connect(); Console.WriteLine("Device Connection Successful"); String[] sensordata = { "ID", "Temp", "Humidity", "Part03", "Part05", "DateTime" }; Console.WriteLine("Count\t" + string.Join("\t", sensordata) + "\t\t Run Time"); SqlConnection myConnection = new SqlConnection(@"Data Source=DESKTOP-DLIT;Initial Catalog=SensorDataDB;Integrated Security=True"); myConnection.Open(); status = true; DateTime startTime = DateTime.Now; int dataCount = 0; while (status) { for (byte j = 1; j < 4; j++) { dataCount += 1; modbusClient.UnitIdentifier = j; //string timestamp0 = now.ToString("yyyy-MM-dd HH:mm:ss.fff"); // int[] test1 = modbusClient.ReadInputRegisters(10, 6); DateTime timestamp = DateTime.Now; var timeCount = DateTime.Now - startTime; string timestamp0 = timestamp.ToString("yyyy-MM-dd HH:mm:ss.fff"); decimal temp = test1[0]; decimal humid = test1[1]; int[] part03_arr = { 0, 0 }; int[] part05_arr = { 0, 0 }; part03_arr[0] = test1[3]; part03_arr[1] = test1[2]; part05_arr[0] = test1[5]; part05_arr[1] = test1[4]; Int64 part03 = ModbusClient.ConvertRegistersToInt(part03_arr); Int64 part05 = ModbusClient.ConvertRegistersToInt(part05_arr); Console.WriteLine(dataCount + "\t" + j + "\t" + (temp / 100m).ToString("F", CultureInfo.InvariantCulture) + "\t" + (humid / 100m).ToString("F", CultureInfo.InvariantCulture) + "\t\t" + String.Format("{0:n0}", part03) + "\t" + String.Format("{0:n0}", part05) + "\t" + timestamp0 + "\t {0}일 {1}시간 {2}분 {3}초", timeCount.Days, timeCount.Hours, timeCount.Minutes, timeCount.Seconds); string sql_str_temp = "INSERT INTO DEV_TEMP_" + j.ToString() + " (Temperature, DateAndTime) Values (@Temperature, @DateAndTime)"; string sql_str_humid = "INSERT INTO DEV_HUMID_" + j.ToString() + " (Humidity, DateAndTime) Values (@Humidity, @DateAndTime)"; string sql_str_part03 = "INSERT INTO DEV_PART03_" + j.ToString() + " (Particle03, DateAndTime) Values (@Particle03, @DateAndTime)"; string sql_str_part05 = "INSERT INTO DEV_PART05_" + j.ToString() + " (Particle05, DateAndTime) Values (@Particle05, @DateAndTime)"; SqlCommand myCommand_temp = new SqlCommand(sql_str_temp, myConnection); SqlCommand myCommand_humid = new SqlCommand(sql_str_humid, myConnection); SqlCommand myCommand_part03 = new SqlCommand(sql_str_part03, myConnection); SqlCommand myCommand_part05 = new SqlCommand(sql_str_part05, myConnection); myCommand_temp.Parameters.AddWithValue("@Temperature ", (temp / 100m).ToString("F", CultureInfo.InvariantCulture)); myCommand_temp.Parameters.AddWithValue("@DateAndTime", timestamp0); myCommand_temp.ExecuteNonQuery(); myCommand_humid.Parameters.AddWithValue("@Humidity", (humid / 100m).ToString("F", CultureInfo.InvariantCulture)); myCommand_humid.Parameters.AddWithValue("@DateAndTime", timestamp0); myCommand_humid.ExecuteNonQuery(); myCommand_part03.Parameters.AddWithValue("@Particle03", part03); myCommand_part03.Parameters.AddWithValue("@DateAndTime", timestamp0); myCommand_part03.ExecuteNonQuery(); myCommand_part05.Parameters.AddWithValue("@Particle05", part05); myCommand_part05.Parameters.AddWithValue("@DateAndTime", timestamp0); myCommand_part05.ExecuteNonQuery(); } } myConnection.Close(); modbusClient.Disconnect(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } catch (Exception e) { Console.WriteLine(e.ToString()); } }
private void FetchFromModbusServer() { if (ModbusHost.HasValue && ModbusAddress1.Value > 0) { int registerToRead; switch (DataType.Value) { case DataTypeEnum.INT32: case DataTypeEnum.FLOAT: registerToRead = 2; break; case DataTypeEnum.LONG: case DataTypeEnum.DOUBLE: registerToRead = 4; break; case DataTypeEnum.INT16_SIGNED: case DataTypeEnum.INT16_UNSIGNED: default: registerToRead = 1; break; } ModbusClient.RegisterOrder regOrder; if (!RegisterOrder.HasValue || RegisterOrder.Value == ByteOrderEnum.LOW_HIGH) { regOrder = ModbusClient.RegisterOrder.LowHigh; } else { regOrder = ModbusClient.RegisterOrder.HighLow; } ModbusClient modbusClient = null; try { modbusClient = new ModbusClient(ModbusHost.Value, ModbusPort.Value); modbusClient.ConnectionTimeout = 5000; modbusClient.Connect(); modbusClient.UnitIdentifier = (byte)ModbusID.Value; int[] readHoldingRegisters; switch (FunctionCode.Value) { case FunctionCodeEnum.FC_04: readHoldingRegisters = modbusClient.ReadInputRegisters(ModbusAddress1.Value, registerToRead); break; case FunctionCodeEnum.FC_03: default: readHoldingRegisters = modbusClient.ReadHoldingRegisters(ModbusAddress1.Value, registerToRead); break; } double result = 0; string result_str = ""; switch (DataType.Value) { case DataTypeEnum.INT32: // probably signed ... result = ModbusClient.ConvertRegistersToInt(readHoldingRegisters, regOrder); break; case DataTypeEnum.FLOAT: result = ModbusClient.ConvertRegistersToFloat(readHoldingRegisters, regOrder); break; case DataTypeEnum.LONG: result = ModbusClient.ConvertRegistersToLong(readHoldingRegisters, regOrder); break; case DataTypeEnum.DOUBLE: result = ModbusClient.ConvertRegistersToDouble(readHoldingRegisters, regOrder); break; case DataTypeEnum.INT16_SIGNED: result = readHoldingRegisters[0]; break; case DataTypeEnum.INT16_UNSIGNED: // unsigned for (int i = 0; i < (readHoldingRegisters.Length); i++) { int tmp = readHoldingRegisters[i]; if (tmp == -32768) // fix for 0x00 { tmp = 0; } if (tmp < 0) // no negative values ! { tmp = tmp + (int)Math.Pow(2, 16); } result = result + (tmp * Math.Pow(2, (16 * ((readHoldingRegisters.Length) - (i + 1))))); result_str = result_str + " 0x" + tmp.ToString("X4"); } break; default: result_str = "internal: invalid datatype"; break; } OutputValue1.Value = result; ErrorMessage.Value = result_str; this.SchedulerService.InvokeIn(new TimeSpan(0, 0, TimeSpan.Value), FetchFromModbusServer); } catch (Exception e) { this.ErrorMessage.Value = e.ToString(); this.SchedulerService.InvokeIn(new TimeSpan(0, 1, 0), FetchFromModbusServer); } finally { if (modbusClient != null) { modbusClient.Disconnect(); } } } }
private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { try { modbusClient = new ModbusClient(socket.Ip, socket.port); modbusClient.Connect(); this.Invoke((MethodInvoker) delegate { log1.listView1.Items.Add(new ListViewItem(new[] { DateTime.Now.ToString(), "connected to Ip=" + socket.Ip + "port=" + socket.Ip })); }); modbusClient.Disconnect(); } catch (Exception err) { this.Invoke((MethodInvoker) delegate { //log1.textBox1.AppendText(DateTime.Now + ":\t please check your Ip or Port settings"); log1.listView1.Items.Add(new ListViewItem(new[] { DateTime.Now.ToString(), "please check your Ip or Port settings " + err.Message })); }); goto out_s; } while (runsystem) { bool datawritten = false; wait: try { modbusClient = new ModbusClient(socket.Ip, socket.port); modbusClient.Connect(); } catch (Exception err) { if (!datawritten) { this.Invoke((MethodInvoker) delegate { //log1.textBox1.AppendText(DateTime.Now + ":\t please check your Ip or Port settings"); log1.listView1.Items.Add(new ListViewItem(new[] { DateTime.Now.ToString(), "please check your Ip or Port settings" + err.Message })); }); sendmail("Plc bağlantısı kesildi"); datawritten = true; } System.Threading.Thread.Sleep(1000); goto wait; } List <sqlpost> post = new List <sqlpost>(); for (int i = 0; i < set1.dataGridView1.Rows.Count - 1; i++) { if (set1.dataGridView1.Rows[i].Cells[1].Value != null) { // //************************************ LW **************************// // #region -----LW------ if (set1.dataGridView1.Rows[i].Cells[1].Value.ToString() == "LW") { int[] readHoldingRegisters; try { readHoldingRegisters = modbusClient.ReadInputRegisters( Convert.ToInt32(set1.dataGridView1.Rows[i].Cells[0].Value), 1); } catch (Exception err) { this.Invoke((MethodInvoker) delegate { log1.listView1.Items.Add(new ListViewItem(new[] { DateTime.Now.ToString(), "please check your Ethernet connection" + err.Message })); }); goto wait; } if (readHoldingRegisters[0].ToString() != set1.dataGridView1.Rows[i].Cells[2].Value.ToString()) { post.Add(new sqlpost { definition = set1.dataGridView1.Rows[i].Cells[3].Value.ToString(), address = set1.dataGridView1.Rows[i].Cells[0].Value.ToString(), value = readHoldingRegisters[0].ToString(), }); set1.dataGridView1.Rows[i].Cells[2].Value = readHoldingRegisters[0].ToString(); } } #endregion // //*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! LW !!!!!!!!!!!!!!!!!!!!!!!!!*// // // //************************************ RW **************************// // #region -----RW------ if (set1.dataGridView1.Rows[i].Cells[1].Value.ToString() == "RW") { int[] readHoldingRegisters; try { readHoldingRegisters = modbusClient.ReadInputRegisters( Convert.ToInt32(set1.dataGridView1.Rows[i].Cells[0].Value) + 10000 - 1, 1); } catch (Exception err) { this.Invoke((MethodInvoker) delegate { log1.listView1.Items.Add(new ListViewItem(new[] { DateTime.Now.ToString(), "please check your Ethernet connection" + err.Message })); }); goto wait; } if (readHoldingRegisters[0].ToString() != set1.dataGridView1.Rows[i].Cells[2].Value.ToString()) { post.Add(new sqlpost { definition = set1.dataGridView1.Rows[i].Cells[3].Value.ToString(), address = set1.dataGridView1.Rows[i].Cells[0].Value.ToString(), value = readHoldingRegisters[0].ToString(), }); set1.dataGridView1.Rows[i].Cells[2].Value = readHoldingRegisters[0].ToString(); } } #endregion // //*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! RW !!!!!!!!!!!!!!!!!!!!!!!!!*// // } } modbusClient.Disconnect(); if (post != null) { string lastitem = null; string connectionString; connectionString = "Server = " + server.servername + "; Port = " + server.sql_port + "; Database = " + server.dbname + "; Uid = " + server.username + "; Pwd = " + server.password + ";"; using (MySqlConnection connection = new MySqlConnection(connectionString)) { try { connection.Open(); foreach (var item in post) { if (item != null) { lastitem = item.definition + "\t" + item.address + "\t" + DateTime.Now.ToString(); MySqlCommand insertCommand = new MySqlCommand("INSERT INTO " + server.tbname + "(deviceID, value, datetime)VALUES(@0, @1, @2)", connection); insertCommand.Parameters.Add("@0", MySqlDbType.VarChar).Value = item.definition; insertCommand.Parameters.Add("@1", MySqlDbType.VarChar).Value = item.value; insertCommand.Parameters.Add("@2", MySqlDbType.VarChar).Value = DateTime.Now.ToString(); insertCommand.ExecuteNonQuery(); SQLerror = false; this.Invoke((MethodInvoker) delegate { log1.listView1.Items.Add(new ListViewItem(new[] { DateTime.Now.ToString(), "Data has added to SQL " })); dmon1.listView1.Items.Add(new ListViewItem(new[] { item.definition, item.address, item.value, DateTime.Now.ToString() }, "written")); }); } } } catch (Exception ex) { if (SQLerror == false) { this.Invoke((MethodInvoker) delegate { log1.listView1.Items.Add(new ListViewItem(new[] { DateTime.Now.ToString(), "sql error: " + ex.Message })); sendmail("SQL bağlantı sorunu \n veri =" + lastitem + "\nyazılmadı"); }); SQLerror = true; } } } } } out_s: System.Threading.Thread.Sleep(50); }
public override void Execute(ModbusClient modbusClient) { ModbusReadCommandParameters mdb_read_comm_pars = this.CommandParameters as ModbusReadCommandParameters; ushort startAddress = mdb_read_comm_pars.StartAddress; ushort quantity = mdb_read_comm_pars.Quantity; if (quantity <= 0) { string message = $"Reading Quantity: {quantity} does not make sense."; Logger.LogError(message); throw new Exception(message); } if (startAddress + quantity >= ushort.MaxValue || startAddress + quantity == ushort.MinValue || startAddress == ushort.MinValue) { string message = $"Address is out of bound. Start address: {startAddress}, Quantity: {quantity}"; Logger.LogError(message); throw new Exception(message); } int[] data = new int[0]; try { if (modbusClient.Connected) { data = modbusClient.ReadInputRegisters(startAddress - 1, quantity); } else { Logger.LogError("modbusClient is disconected "); } } catch (Exception e) { Logger.LogError("Error on ReadInputRegisters()", e); throw e; } Data = new Dictionary <long, AnalogModbusData>(data.Length); var currentAddressToGidMap = SCADAModel.CurrentAddressToGidMap; var currentSCADAModel = SCADAModel.CurrentScadaModel; var commandValuesCache = SCADAModel.CommandedValuesCache; for (ushort i = 0; i < data.Length; i++) { ushort address = (ushort)(startAddress + i); int rawValue = data[i]; //for commands enqueued during model update if (!currentAddressToGidMap[PointType.ANALOG_INPUT].ContainsKey(address)) { Logger.LogWarn($"ReadInputRegistersFunction execute => trying to read value on address {address}, Point type: {PointType.ANALOG_INPUT}, which is not in the current SCADA Model."); continue; } long gid = currentAddressToGidMap[PointType.ANALOG_INPUT][address]; //for commands enqueued during model update if (!currentSCADAModel.ContainsKey(gid)) { Logger.LogWarn($"ReadInputRegistersFunction execute => trying to read value for measurement with gid: 0x{gid:X16}, which is not in the current SCADA Model."); continue; } if (!(currentSCADAModel[gid] is AnalogSCADAModelPointItem pointItem)) { string message = $"PointItem [Gid: 0x{gid:X16}] is not type AnalogSCADAModelPointItem."; Logger.LogError(message); throw new Exception(message); } float eguValue = pointItem.RawToEguValueConversion(rawValue); if (pointItem.CurrentEguValue != eguValue) { pointItem.CurrentEguValue = eguValue; Logger.LogInfo($"Alarm for Point [Gid: 0x{pointItem.Gid:X16}, Address: {pointItem.Address}] set to {pointItem.Alarm}."); } CommandOriginType commandOrigin = CommandOriginType.OTHER_COMMAND; if (commandValuesCache.ContainsKey(gid) && commandValuesCache[gid].Value == pointItem.CurrentRawValue) { commandOrigin = commandValuesCache[gid].CommandOrigin; commandValuesCache.Remove(gid); Logger.LogDebug($"[ReadInputRegistersFunctions] Command origin of command address: {pointItem.Address} is set to {commandOrigin}."); } AnalogModbusData analogData = new AnalogModbusData(pointItem.CurrentEguValue, pointItem.Alarm, gid, commandOrigin); Data.Add(gid, analogData); //Logger.LogDebug($"ReadInputRegistersFunction execute => Current value: {pointItem.CurrentEguValue} from address: {address}, gid: 0x{gid:X16}."); } //Logger.LogDebug($"ReadInputRegistersFunction executed SUCCESSFULLY. StartAddress: {startAddress}, Quantity: {quantity}"); }
public string ReadItem(ePWRREAD_ITEMS key) { if (modbusClnt.Connected) { goto LBL_ERROR; } var item = _dicItems[key]; if (false == item.bEnb) { goto LBL_ERROR; } string rtn = null; switch (type) { case ePWRTYPE.ElgenBattery: break; case ePWRTYPE.ElgenCharger: { switch (key) { case ePWRREAD_ITEMS.Temp_1st: case ePWRREAD_ITEMS.Temp_2nd: case ePWRREAD_ITEMS.Temp_3th: case ePWRREAD_ITEMS.Temp_4th: { modbusClnt.UnitIdentifier = 1; var val = modbusClnt.ReadInputRegisters(item.add, 1).FirstOrDefault(); rtn = val.ToString(); break; } case ePWRREAD_ITEMS.Current: case ePWRREAD_ITEMS.Voltage: case ePWRREAD_ITEMS.Error: case ePWRREAD_ITEMS.State: case ePWRREAD_ITEMS.Ver: { modbusClnt.UnitIdentifier = 2; var val = modbusClnt.ReadInputRegisters(item.add, 1).FirstOrDefault(); switch (key) { case ePWRREAD_ITEMS.Current: case ePWRREAD_ITEMS.Voltage: case ePWRREAD_ITEMS.Temp_1st: case ePWRREAD_ITEMS.Temp_2nd: case ePWRREAD_ITEMS.Temp_3th: case ePWRREAD_ITEMS.Temp_4th: case ePWRREAD_ITEMS.Error: rtn = val.ToString(); break; case ePWRREAD_ITEMS.State: rtn = val.ToString().ToEnum <ePWR_CHR_STATE>().ToString(); break; case ePWRREAD_ITEMS.Ver: rtn = (val / 100).ToString(); break; default: goto LBL_ERROR; } break; } default: goto LBL_ERROR; } break; } case ePWRTYPE.AutonicMeter: { switch (key) { case ePWRREAD_ITEMS.Current: modbusClnt.UnitIdentifier = 2; break; case ePWRREAD_ITEMS.Voltage: modbusClnt.UnitIdentifier = 1; break; case ePWRREAD_ITEMS.Temp_1st: case ePWRREAD_ITEMS.Temp_2nd: case ePWRREAD_ITEMS.Temp_3th: case ePWRREAD_ITEMS.Temp_4th: modbusClnt.UnitIdentifier = 3; break; default: goto LBL_ERROR; } var val = modbusClnt.ReadInputRegisters(item.add, 1).FirstOrDefault(); switch (key) { case ePWRREAD_ITEMS.Current: case ePWRREAD_ITEMS.Voltage: rtn = (val / 10.0).ToString(); break; default: rtn = val.ToString(); break; } break; } default: goto LBL_ERROR; } return(rtn); LBL_ERROR: return(null); }
public int[] ReadInputRegisters(int startReg, int length) { return(_client.ReadInputRegisters(startReg, length)); }
private async Task ExecuteAnalogReadCommand(ModbusFunctionCode functionCode, ushort startAddress, ushort quantity) { string verboseMessage = $"{baseLogString} entering ExecuteAnalogReadCommand method, command's functionCode: {functionCode}, startAddress: {startAddress}, quantity:{quantity}."; Logger.LogVerbose(verboseMessage); int[] data; PointType pointType; if (functionCode == ModbusFunctionCode.READ_HOLDING_REGISTERS) { verboseMessage = $"{baseLogString} ExecuteAnalogReadCommand => about to call ModbusClient.ReadHoldingRegisters({startAddress - 1}, {quantity}) method."; Logger.LogVerbose(verboseMessage); //KEY LOGIC pointType = PointType.ANALOG_OUTPUT; data = modbusClient.ReadHoldingRegisters(startAddress - 1, quantity); verboseMessage = $"{baseLogString} ExecuteAnalogReadCommand => ModbusClient.ReadHoldingRegisters({startAddress - 1}, {quantity}) method SUCCESSFULLY executed. Resulting data count: {data.Length}."; Logger.LogVerbose(verboseMessage); } else if (functionCode == ModbusFunctionCode.READ_INPUT_REGISTERS) { verboseMessage = $"{baseLogString} ExecuteAnalogReadCommand => about to call ModbusClient.ReadInputRegisters({startAddress - 1}, {quantity}) method."; Logger.LogVerbose(verboseMessage); //KEY LOGIC pointType = PointType.ANALOG_INPUT; data = modbusClient.ReadInputRegisters(startAddress - 1, quantity); verboseMessage = $"{baseLogString} ExecuteAnalogReadCommand => ModbusClient.ReadInputRegisters({startAddress - 1}, {quantity}) method SUCCESSFULLY executed. Resulting data count: {data.Length}."; Logger.LogVerbose(verboseMessage); } else { string message = $"{baseLogString} ExecuteAnalogReadCommand => function code is neither ModbusFunctionCode.READ_HOLDING_REGISTERS nor ModbusFunctionCode.READ_INPUT_REGISTERS"; Logger.LogError(message); throw new ArgumentException(message); } //this.analogMeasurementCache = new Dictionary<long, AnalogModbusData>(data.Length); this.analogMeasurementCache.Clear(); var modelReadAccessClient = ScadaModelReadAccessClient.CreateClient(); var modelUpdateAccessClient = ScadaModelUpdateAccessClient.CreateClient(); var gidToPointItemMap = await modelReadAccessClient.GetGidToPointItemMap(); var addressToGidMap = await modelReadAccessClient.GetAddressToGidMap(); var commandDescriptionCache = await modelReadAccessClient.GetCommandDescriptionCache(); for (ushort i = 0; i < data.Length; i++) { ushort address = (ushort)(startAddress + i); int rawValue = data[i]; if (!addressToGidMap.ContainsKey((short)pointType)) { Logger.LogWarning($"{baseLogString} ExecuteAnalogReadCommand => Point type: {pointType} is not in the current addressToGidMap."); continue; } //for commands enqueued during model update, that are not valid if (!addressToGidMap[(short)pointType].ContainsKey(address)) { Logger.LogWarning($"{baseLogString} ExecuteAnalogReadCommand => trying to read value on address {address}, Point type: {pointType}, which is not in the current addressToGidMap."); continue; } long gid = addressToGidMap[(short)pointType][address]; //for commands enqueued during model update, that are not valid if (!gidToPointItemMap.ContainsKey(gid)) { Logger.LogWarning($"{baseLogString} ExecuteAnalogReadCommand => trying to read value for measurement with gid: 0x{gid:X16}, which is not in the current SCADA Model."); continue; } if (!(gidToPointItemMap[gid] is IAnalogPointItem pointItem)) { string message = $"{baseLogString} ExecuteAnalogReadCommand => PointItem [Gid: 0x{gid:X16}] does not implement {typeof(IAnalogPointItem)}."; Logger.LogError(message); throw new Exception(message); } //KEY LOGIC if (pointItem.CurrentRawValue != rawValue) { pointItem = (IAnalogPointItem)(await modelUpdateAccessClient.UpdatePointItemRawValue(pointItem.Gid, rawValue)); Logger.LogInformation($"{baseLogString} ExecuteAnalogReadCommand => Alarm for Point [Gid: 0x{pointItem.Gid:X16}, Address: {pointItem.Address}] set to {pointItem.Alarm}."); } //LOGIC CommandOriginType commandOrigin = CommandOriginType.UNKNOWN_ORIGIN; if (commandDescriptionCache.ContainsKey(gid) && commandDescriptionCache[gid].Value == pointItem.CurrentRawValue) { commandOrigin = commandDescriptionCache[gid].CommandOrigin; await modelUpdateAccessClient.RemoveCommandDescription(gid); Logger.LogDebug($"{baseLogString} ExecuteAnalogReadCommand => Command origin of command address: {pointItem.Address} is set to {commandOrigin}."); //LOGIC AnalogModbusData analogData = new AnalogModbusData(pointItem.CurrentEguValue, pointItem.Alarm, gid, commandOrigin); this.analogMeasurementCache.Add(gid, analogData); verboseMessage = $"{baseLogString} ExecuteAnalogReadCommand => AnalogModbusData added to measurementCache. MeasurementGid: {analogData.MeasurementGid:X16}, Value: {analogData.Value}, Alarm: {analogData.Alarm}, CommandOrigin: {analogData.CommandOrigin} ."; Logger.LogVerbose(verboseMessage); } } //LOGIC await modelUpdateAccessClient.MakeAnalogEntryToMeasurementCache(this.analogMeasurementCache, true); verboseMessage = $"{baseLogString} ExecuteAnalogReadCommand => MakeAnalogEntryToMeasurementCache method called. measurementCache count: {this.analogMeasurementCache.Count}."; Logger.LogVerbose(verboseMessage); }
/// <summary> /// 데이터 수집하고, 수집이 정상 이루어지면 true 반환함 아니면 false. /// </summary> /// <param name="slave">ModbusClient 변수</param> /// <param name="id_index">ModbusClient 변수의 index값 </param> /// <returns></returns> private static bool collect(ModbusClient slave, int id_index) { bool result = false; allDataCollected = new List <long>(); Int64 part_high, part_low, particle; string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); string timestamp2 = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss.fff"); string dataStr = "Res: "; try { int[] chk = slave.ReadInputRegisters(0, 12); if (chk[0] != 0) { int[] d = slave.ReadInputRegisters(0, 38); if (d[0] != 0 && d[22] != 0) { result = true; string S_timestamp = $"20{d[12]}-0{d[13]}-{d[14].ToString("D2")} {d[15].ToString("D2")}:{d[16].ToString("D2")}:{d[17].ToString("D2")}"; List <string> stringNames = new List <string>() { "온도", "습도", "p0.1", "p0.3", "p0.5", "p1.0", "p3.0", "p5.0", "p10.0", "p25.0" }; dataStr += timestamp2; int temperature = d[18] * 100 + d[19]; int humidity = d[20] * 100 + d[21]; allDataCollected.Add(temperature); allDataCollected.Add(humidity); // "slaveId : {slave.UnitIdentifier} dataStr += $", {stringNames[0]}:{d[18]}.{d[19]}, {stringNames[1]}:{d[20]}.{d[21]}, "; int index = 2; for (int regAdd = 22; regAdd < 38;) { part_high = d[regAdd] >= 0 ? d[regAdd] : 65536 + d[regAdd]; part_low = d[regAdd + 1] >= 0 ? d[regAdd + 1] : 65536 + d[regAdd + 1]; particle = (part_high == 65535 && part_low == 65535) ? -1 : (part_high * 65536 + part_low); if (regAdd != 22 && regAdd != 30) { // do not print particle 0.1um, particle3.0um whose value is always -1 dataStr += $"\t{stringNames[index]}: {String.Format("{0:n0}", particle)},"; } allDataCollected.Add(particle); regAdd += 2; index += 1; } Console.WriteLine(dataStr); store2db(allDataCollected, id_index, timestamp, S_timestamp); } } } catch (Exception e) { Console.WriteLine($"Data Collection Error: slaveID:{slave.UnitIdentifier}, IP:{slave.IPAddress}." + e.Message + " " + e.StackTrace); } return(result); }
private void buttonExecute_Click(object sender, EventArgs e) { start = Int32.Parse(addBox1.Text); licznik = Int32.Parse(addBox2.Text); //bool[] b; //var dict = new ConcurrentDictionary<int, int>(); //var task = Task.Factory.StartNew(() => CykliczneOdpytanie(ref dict)); //wynik = new List<ChartData>(); //ChartData chartDate = new ChartData(); if (functionBox.SelectedItem == "01 Read Coil Status") { cts.Cancel(); cts.Dispose(); cts = new CancellationTokenSource(); ThreadPool.QueueUserWorkItem(new WaitCallback(CoilOdczyt), cts.Token); //Task.Factory.StartNew(() => CoilOdczyt()); //Task.Factory.StartNew(() => backgroundWorker1.RunWorkerAsync()); //listBox1.DataSource = modbusClient.ReadCoils(start, licznik); //backgroundWorker1.RunWorkerAsync(); //Thread.Sleep(1000); //for (int i = 0; i < licznik; i++) //{ // chartDate.IDex = i; // if (bool.Parse(listBox1.Items[i].ToString()) == false) // { // chartDate.Value = 0; // } // else if (bool.Parse(listBox1.Items[i].ToString()) == true) // { // chartDate.Value = 1; // } // wynik.Add(chartDate); //} } else if (functionBox.SelectedItem == "02 Read Input Status") { cts.Cancel(); cts.Dispose(); cts = new CancellationTokenSource(); listBox1.DataSource = modbusClient.ReadDiscreteInputs(start, licznik); } else if (functionBox.SelectedItem == "03 Read Holding Registers") { cts.Cancel(); cts.Dispose(); cts = new CancellationTokenSource(); listBox1.DataSource = modbusClient.ReadHoldingRegisters(start, licznik); //for (int i = 0; i < licznik; i++) //{ // chartDate.IDex = i; // chartDate.Value = int.Parse(listBox1.Items[i].ToString()); // wynik.Add(chartDate); //} } else if (functionBox.SelectedItem == "04 Read Input Registers") { cts.Cancel(); cts.Dispose(); cts = new CancellationTokenSource(); listBox1.DataSource = modbusClient.ReadInputRegisters(start, licznik); } else { cts.Cancel(); cts.Dispose(); cts = new CancellationTokenSource(); listBox1.DataSource = modbusClient.ReadHoldingRegisters(start, licznik); } }
} //End Function Disconnect /// <summary> /// Reads data from the Server Device.</summary> public bool Read(DataExtClass[] DataOut) { bool retVar = false; int i, j, jj, SAddress, boolReg, boolBit; uint highWord, lowWord; DAConfClass thisArea; //If is not initialized and not connected return error. if (!(isInitialized && (DataOut != null))) { Status.NewStat(StatType.Bad, "Not Ready for Reading"); return false; } //If the DataOut and Internal data doesnt have the correct amount of data areas return error. if (!((DataOut.Length == MasterDriverConf.NDataAreas) && (IntData.Length == MasterDriverConf.NDataAreas))) { Status.NewStat(StatType.Bad, "Data Containers Mismatch"); return false; } if (!(isConnected && ModTCPObj.Connected)) { Status.NewStat(StatType.Bad, "Connection Error..."); this.Disconect(); return false; } //Cicle thru Data Areas. for (i = 0; i < MasterDriverConf.NDataAreas; i++) { thisArea = MasterDataAreaConf[i]; SAddress = int.Parse(thisArea.StartAddress); if (thisArea.Enable && (!thisArea.Write)) { try { //Read the data from the device switch (thisArea.dataType) { case DriverConfig.DatType.Bool: if ((thisArea.DBnumber >= 1) && (thisArea.DBnumber <= 2)) { if (thisArea.DBnumber == 1) IntData[i].dBool = ModTCPObj.ReadCoils(SAddress, thisArea.Amount); if (thisArea.DBnumber == 2) IntData[i].dBool = ModTCPObj.ReadDiscreteInputs(SAddress, thisArea.Amount); if (IntData[i].dBool.Length == thisArea.Amount) retVar = true; } else if ((thisArea.DBnumber >= 3) && (thisArea.DBnumber <= 4)) { boolReg = (int)Math.Ceiling(thisArea.Amount / 16.0); if (thisArea.DBnumber == 3) IntData[i].dInt = ModTCPObj.ReadHoldingRegisters(SAddress, boolReg); if (thisArea.DBnumber == 4) IntData[i].dInt = ModTCPObj.ReadInputRegisters(SAddress, boolReg); //Check read complete set of data if (IntData[i].dInt.Length == boolReg) retVar = true; } else { //Invalid Conf retVar = false; Status.NewStat(StatType.Warning, "Wrong FC for Read, Check Config."); } break; case DriverConfig.DatType.Byte: case DriverConfig.DatType.Word: if ((thisArea.DBnumber >= 3) && (thisArea.DBnumber <= 4)) { if (thisArea.DBnumber == 3) IntData[i].dInt = ModTCPObj.ReadHoldingRegisters(SAddress, thisArea.Amount); if (thisArea.DBnumber == 4) IntData[i].dInt = ModTCPObj.ReadInputRegisters(SAddress, thisArea.Amount); //Check read complete set of data if (IntData[i].dInt.Length == thisArea.Amount) retVar = true; } else {//Invalid Conf retVar = false; Status.NewStat(StatType.Warning, "Wrong FC for Read, Check Config."); } break; case DriverConfig.DatType.DWord: case DriverConfig.DatType.Real: if ((thisArea.DBnumber >= 3) && (thisArea.DBnumber <= 4)) { if (thisArea.DBnumber == 3) IntData[i].dInt = ModTCPObj.ReadHoldingRegisters(SAddress, (2 * thisArea.Amount)); if (thisArea.DBnumber == 4) IntData[i].dInt = ModTCPObj.ReadInputRegisters(SAddress, (2 * thisArea.Amount)); if (IntData[i].dInt.Length == (2 * thisArea.Amount)) retVar = true; } else {//Invalid Conf retVar = false; Status.NewStat(StatType.Warning, "Wrong FC for Read, Check Config."); } break; default: Status.NewStat(StatType.Warning, "Wrong DataArea Type, Check Config."); retVar = false; break; } } catch (Exception e) { Status.NewStat(StatType.Bad, e.Message); return false; } //Copy data to the Data Out if (retVar) { jj = 0; //Index reinitialize for (j = 0; j < thisArea.Amount; j++) { switch (thisArea.dataType) { case DriverConfig.DatType.Bool: if ((thisArea.DBnumber >= 1) && (thisArea.DBnumber <= 2)) { DataOut[i].Data.dBoolean[j] = IntData[i].dBool[j]; } else if ((thisArea.DBnumber >= 3) && (thisArea.DBnumber <= 4)) { boolReg = Math.DivRem(j, 16, out boolBit); var b = new BitArray(new int[] { IntData[i].dInt[boolReg] }); ; DataOut[i].Data.dBoolean[j] = b[boolBit]; } break; case DriverConfig.DatType.Byte: DataOut[i].Data.dByte[j] = (byte)(IntData[i].dInt[j] & MaskByte); break; case DriverConfig.DatType.Word: DataOut[i].Data.dWord[j] = (ushort)(IntData[i].dInt[j] & MaskWord); break; case DriverConfig.DatType.DWord: case DriverConfig.DatType.Real: //Endianess of the double word. if (RegOrder == ModbusClient.RegisterOrder.HighLow) { highWord = ((uint)IntData[i].dInt[jj] & MaskWord) << 16; lowWord = ((uint)IntData[i].dInt[(jj + 1)] & MaskWord); } else { highWord = ((uint)IntData[i].dInt[jj] & MaskWord); lowWord = ((uint)IntData[i].dInt[(jj + 1)] & MaskWord) << 16; } //Store the value in the DataOut. if (thisArea.dataType == DriverConfig.DatType.DWord) { DataOut[i].Data.dDWord[j] = (highWord | lowWord); } else { //Float point decimal. DataOut[i].Data.dReal[j] = (highWord | lowWord) / ((float)1000.0); } jj = jj + 2; break; default: Status.NewStat(StatType.Warning, "Wrong DataArea Type, Check Config."); break; } } // For j DataOut[i].NowTimeTicks = DateTime.UtcNow.Ticks; } else { Status.NewStat(StatType.Warning, "ModBus Read error.."); DataOut[i].NowTimeTicks = 0; } //if retVar == 0. Was reading ok? }// Area Enable } //For cicle Data Areas. return retVar; } // End Read Function