void cleanQuery() { // вначале разбираем очередь на запись writeComm wr; // создание дубликата writeQuveryDuble и освобождение исходной коллеции List <writeComm> writeQuveryDuble = new List <writeComm>(); lock (block) { for (int i = 0; i < writeQuvery.Count; i++) { writeQuveryDuble.Add(writeQuvery[i]); } writeQuvery.Clear(); } //lock try { for (int i = 0; i < writeQuveryDuble.Count; i++) { wr = writeQuveryDuble[i]; if (wr.reg == 0) { if (wr.len == 1) { master.WriteSingleCoil(wr.address, (bool)wr.value); } else { bool[] b = (bool[])wr.value; master.WriteMultipleCoils(wr.address, b); } } if (wr.reg == 3) { if (wr.type == 2 || wr.type == 3) //2 байтный int { if (wr.len == 1) { master.WriteSingleRegister(wr.address, BitConverter.ToUInt16(BitConverter.GetBytes((int)wr.value), 0)); } else { ushort[] b = (ushort[])wr.value; master.WriteMultipleRegisters(wr.address, b); } } if (wr.type >= 4 && wr.type <= 7) //4 байтный int { if (wr.len == 1) { ushort[] b = new ushort[2]; b[0] = BitConverter.ToUInt16(BitConverter.GetBytes((int)wr.value), 0); b[1] = BitConverter.ToUInt16(BitConverter.GetBytes((int)wr.value), 2); master.WriteMultipleRegisters(wr.address, b); } else { int[] b = (int[])wr.value; for (ushort j = 0; j < wr.len; j++) { ushort[] bb = new ushort[2]; bb[0] = BitConverter.ToUInt16(BitConverter.GetBytes(b[j]), 0); bb[1] = BitConverter.ToUInt16(BitConverter.GetBytes(b[j]), 2); master.WriteMultipleRegisters((ushort)(wr.address + (j * 2)), bb); } } } if (wr.type >= 8 && wr.type <= 9) //4 байтный float { if (wr.len == 1) { byte[] b = BitConverter.GetBytes((float)wr.value); ushort[] bb = new ushort[2]; bb[0] = BitConverter.ToUInt16(b, 0); bb[1] = BitConverter.ToUInt16(b, 2); master.WriteMultipleRegisters(wr.address, bb); } else { float[] bb = (float[])wr.value; for (int j = 0; j < wr.len; j++) { byte[] b = BitConverter.GetBytes(bb[j]); ushort[] bbb = new ushort[2]; bbb[0] = BitConverter.ToUInt16(b, 0); bbb[1] = BitConverter.ToUInt16(b, 2); master.WriteMultipleRegisters((ushort)(wr.address + (j * 2)), bbb); } } } //if } //if } //for } catch (Exception err) { Util.errorTCP(); Util.errorMessage(err.Message, description); device.status = err.HResult; device.ready = false; //??????????????????????????????/ } //writeQuvery.Clear(); }
public void Tomodbus() { this.timerModbus.Stop(); try { int port = Convert.ToInt32(Pub_dtTSetting.Rows[0][4]); //<--- This is your value // define array to keep address Input Register--------------------------------------- int tagB = 0; for (int row = 0; row < Pub_dtTTAGMapping.Rows.Count; row++) { string tagtype = dataGridView1.Rows[row].Cells[6].Value.ToString();//TagType if (tagtype == "B") { tagB++; } } int[][] mosbusAdrInputRegister = new int[tagB][]; for (int index1 = 0; index1 < tagB; index1++) { mosbusAdrInputRegister[index1] = new int[2]; } //----------------------------------------------------------------------------------- //IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName()); foreach (var ip in host.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) { using (TcpClient tcpClient = new TcpClient()) { tcpClient.Connect(ip.ToString(), port); //if port 502 open, server not start throw exception ModbusIpMaster master2Family = ModbusIpMaster.CreateIp(tcpClient); int Count_Boolean = 0; bool[] boolvalueto_inputRegister = new bool[dataGridView1.Rows.Count]; slave2Family.DataStore.InputDiscretes.Clear(); // clear Input Status for manual add for (int row = 0; row < Pub_dtTTAGMapping.Rows.Count; row++) { string Mb_Address = dataGridView1.Rows[row].Cells[2].Value.ToString(); //MB address string Value = dataGridView1.Rows[row].Cells[3].Value.ToString(); //Value string tagtype = dataGridView1.Rows[row].Cells[6].Value.ToString(); //TagType if (tagtype == "F") { string ValueString = dataGridView1.Rows[row].Cells[3].Value.ToString();//Value //Convert float to Hex--------------------------------------------------------------------------------- float strTofloat; bool result = float.TryParse(ValueString, out strTofloat); if (result == true) { byte[] buffer = BitConverter.GetBytes(strTofloat); int intVal = BitConverter.ToInt32(buffer, 0); //if don't have this line then program do like string to hex //https://gregstoll.com/~gregstoll/floattohex/ //http://string-functions.com/string-hex.aspx string hexstring = intVal.ToString("X8"); //separate hex string------------------------------------------------------------------------------------- string hexstrinng_left = hexstring.Substring(0, 4); ushort hexshort_left = Convert.ToUInt16(hexstrinng_left, 16); //like under line string hexstrinng_right = hexstring.Substring(4); ushort hexshort_right = Convert.ToUInt16(hexstrinng_right, 16); //Prepare MbAddress to send--------------------------------------------------------------------------------- int int32Mb_Address = Convert.ToInt32(Mb_Address) - 400000 - 1;//-1 cause modscan32 start index 0 ushort RightShortMbAddress = Convert.ToUInt16(int32Mb_Address); //ushort RightShortMbAddress = (ushort)int32Mb_Address; int LeftMbAddress = int32Mb_Address + 1; ushort LeftShortMbAddress = Convert.ToUInt16(LeftMbAddress); //ushort LeftShortMbAddress = (ushort)LeftMbAddress; //--------------------------------------------------------------------------------------------------------------- master2Family.WriteSingleRegister(RightShortMbAddress, hexshort_right); master2Family.WriteSingleRegister(LeftShortMbAddress, hexshort_left); } //end if result } //end if Tagtype F else if (tagtype == "B") { bool boolvalue = Convert.ToBoolean(Convert.ToInt16(Value)); int int32Mb_Address = Convert.ToInt32(Mb_Address) - 100000 - 1;//-1 cause modscan32 start index 0 master2Family.WriteSingleCoil(Convert.ToUInt16(int32Mb_Address), boolvalue); mosbusAdrInputRegister[Count_Boolean][0] = int32Mb_Address; mosbusAdrInputRegister[Count_Boolean][1] = Convert.ToInt32(Value); ++Count_Boolean; //if (boolvalue == true) //{ // //slave.DataStore.InputDiscretes.Add(true); // slave2Family.DataStore.InputDiscretes.Add(false); //} //else //{ // //slave.DataStore.InputDiscretes.Add(false); // slave2Family.DataStore.InputDiscretes.Add(true); //} } //end else if Tagtype B } //end for loop int getlastaddress = mosbusAdrInputRegister[mosbusAdrInputRegister.Length - 1][0]; int matchIndexInputregister = 0; for (int indexInputRegister = 0; indexInputRegister <= getlastaddress; indexInputRegister++) { if (indexInputRegister == mosbusAdrInputRegister[matchIndexInputregister][0]) { if (mosbusAdrInputRegister[matchIndexInputregister][1] == 1) { //slave.DataStore.InputDiscretes.Add(true); slave2Family.DataStore.InputDiscretes.Add(true); } else { //slave.DataStore.InputDiscretes.Add(false); slave2Family.DataStore.InputDiscretes.Add(false); } matchIndexInputregister++; } else { slave2Family.DataStore.InputDiscretes.Add(false); } } datastore.InputRegisters.Clear(); } } //end if ipv4 } //end foreach } catch (Exception ex) { using (StreamWriter sw = File.AppendText(indebuglogFolderPath + "\\" + filename + ".txt")) { sw.WriteLine("ERROR : " + ex); } } }
private void FormAutomatic_Load(object sender, EventArgs e) { coilM22 = new bool[1]; lastCoilM22 = new bool[1]; coilM22[0] = false; lastCoilM22[0] = false; // Create Modbus modbusMasterTCP ipAddress = "192.168.1.2"; // textBoxIPAddress.Text; //ipAddress = "127.0.0.1"; // textBoxIPAddress.Text; tcpClient.BeginConnect(ipAddress, tcpPort, null, null); modbusMasterTCP = ModbusIpMaster.CreateIp(tcpClient); timerReadModbus.Enabled = true; // aktifkan mode baca data dari plc // Serial Port Scanner serialPortScanner.PortName = "COM1"; //COM1 try { serialPortScanner.Open(); serialOpen = true; } catch (Exception err) { serialOpen = false; MessageBox.Show(err.ToString()); } if (serialOpen) { thread = new Thread(bacaDataSerial); thread.Start(); threadRun = true; } // Update Current Settings loadCurrentSetting(); // Trigger M8 Kalau 4P int a = textBoxReference.Text.IndexOf('T', 4); if (a == 4) { modbusMasterTCP.WriteSingleCoil(1, 8, true); } else { modbusMasterTCP.WriteSingleCoil(1, 8, false); } totalPass = Int32.Parse(textBoxPass.Text); totalFail = Int32.Parse(textBoxFail.Text); totalQty = Int32.Parse(textBoxTotalQty.Text); // Update ke PLC /* * try * { * modbusMasterTCP.WriteSingleRegister(0, (ushort)totalPass); // MW0 == Pass * modbusMasterTCP.WriteSingleRegister(1, (ushort)totalFail); // MW1 == Fail * } * catch (Exception err) * { * // By Pass * } * */ // }
private void bacaDataSerial() { while (serialOpen) { if (serialPortScanner.BytesToRead > 0) { char data = (char)serialPortScanner.ReadChar(); if (data != '\r' || data != '\n') { dataSerial += data; } if (data == '\n') { Invoke(new Action(() => textBoxScannerData.Text = dataSerial)); // Check Length if (dataSerial.Length == 32) { // Check Head Assy for (int i = 6; i < 22; i++) { dataHeadAssy += dataSerial[i]; } // Update TextBox Head Assy Invoke(new Action(() => textBoxScannerHeadAssy.Text = dataHeadAssy)); //Invoke(new Action(() => textBoxTotalQty.Text = totalQty.ToString())); // Compare Pass Fail int retCompare = string.Compare(textBoxScannerHeadAssy.Text, textBoxHeadAssy.Text); //retCompare = 0; // saya baypass dlu // Pass Product if (retCompare == 0) { totalPass++; // Update Textbox Invoke(new Action(() => textBoxPass.Text = totalPass.ToString())); setTotalQty(getTotalQty() + 1); // update product count // Update Textbox Data Matrix DateTime date = DateTime.Now; string stringDate = date.ToString("ddMMyyhhmmss"); string stringDataMatrix = textBoxReference.Text + stringDate + " " + getTotalQty().ToString("D" + 5); Invoke(new Action(() => textBoxDataMatrix.Text = stringDataMatrix)); // Update Excell Data updateExcelData(); // Send Pass Signal try { modbusMasterTCP.WriteSingleCoil(1, 11, true); // M11 => false } catch (Exception err) { MessageBox.Show(err.ToString()); } } else { totalFail++; Invoke(new Action(() => textBoxFail.Text = totalFail.ToString())); Invoke(new Action(() => textBoxDataMatrix.Text = "")); try { modbusMasterTCP.WriteSingleCoil(1, 11, false); // M11 => false } catch (Exception err) { MessageBox.Show(err.ToString()); } } // Message to operator // If Fail Show Textbox if (retCompare != 0) { MessageBox.Show("Product Fail, Please Remove Product !!"); //MessageBox.Show("dfas","Asda"," } // If Pass Printing else { //MessageBox.Show("masuk"); int a = textBoxReference.Text.IndexOf('T', 4); if (a == 4) { printLabel(3); //MessageBox.Show("4P"); } else { if (textBoxAA1.Text == "") { printLabel(2); // 3 pole no kc //MessageBox.Show("3pkc"); } else { printLabel(1); // 3 pole //MessageBox.Show("3P"); } } } if (totalPass == totalQty) { MessageBox.Show("Production Completed !" + "Total Pass = "******"Total Qty = " + totalQty.ToString()); } Invoke(new Action(() => timerClearScannerData.Enabled = true)); // aktifkan timer clear dataSerial = ""; dataHeadAssy = ""; } else { try { modbusMasterTCP.WriteSingleCoil(1, 11, false); // M11 => false } catch (Exception err) { MessageBox.Show(err.ToString()); } //MessageBox.Show("Scanner NO READ, Please Rescan !!"); //timerClearScannerData.Enabled = true; Invoke(new Action(() => timerClearScannerData.Enabled = true)); dataSerial = ""; dataHeadAssy = ""; } } } } }
private bool ResponseData(IO_SERVER server, IO_COMMUNICATION comm, IO_DEVICE device, IO_PARA para, string value) { if (para == null) { return(false); } if (para.IO_POINTTYPE == "计算值" || para.IO_POINTTYPE == "关系数据库值") { return(false); } //设备地址不能为空 if (device.IO_DEVICE_ADDRESS == "") { return(false); } try { //通过设备驱动进行数据解析,并生成下置的数据bytes if (device.DeviceDrive != null) { ScadaDeviceKernel Driver = (ScadaDeviceKernel)device.DeviceDrive; //获取参数中的 if (tcpClient != null && tcpClient.Connected && master != null) { ParaPack paraPack = new ParaPack(para.IO_PARASTRING); if (paraPack.Count > 0) { ushort offset = ushort.Parse(paraPack.GetValue("偏置")); switch (paraPack.GetValue("内存区")) { case "01": { if (ushort.Parse(value) > 0) { master.WriteSingleCoil(byte.Parse(device.IO_DEVICE_ADDRESS), offset, true); } else { master.WriteSingleCoil(byte.Parse(device.IO_DEVICE_ADDRESS), offset, false); } } break; case "02": //此类型只能查询,不能写入 { } break; case "03": { Modbus_Type datatype = (Modbus_Type)Enum.Parse(typeof(Modbus_Type), paraPack.GetValue("数据类型")); bool ishigh = paraPack.GetValue("存储位置") == "高八位" ? true : false; int charsize = int.Parse(paraPack.GetValue("字节长度")); bool isposition = paraPack.GetValue("按位存取") == "1" ? true : false; int dataposition = int.Parse(paraPack.GetValue("数据位")); switch (datatype) { case Modbus_Type.单精度浮点数32位: { ushort[] buff = new ushort[2]; float WriteValue = float.Parse(value); ModbusConvert.SetReal(buff, 0, WriteValue); master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff); } break; case Modbus_Type.双精度浮点数64位: { ushort[] buff = new ushort[4]; double WriteValue = double.Parse(value); ModbusConvert.SetDouble(buff, 0, WriteValue); master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff); } break; case Modbus_Type.字符型: { ushort[] buff = new ushort[charsize]; string WriteValue = value; if (value.Length > charsize) { WriteValue = value.Substring(0, charsize); } if (value.Length < charsize) { WriteValue = value.PadRight(charsize, ' '); } ModbusConvert.SetString(buff, 0, WriteValue); master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff); } break; case Modbus_Type.无符号整数8位: { ushort[] buff = new ushort[1]; byte WriteValue = byte.Parse(value); ModbusConvert.SetByte(buff, 0, WriteValue, ishigh); master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff[0]); } break; case Modbus_Type.符号整数8位: { ushort[] buff = new ushort[1]; sbyte WriteValue = sbyte.Parse(value); ModbusConvert.SetSByte(buff, 0, WriteValue, ishigh); master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff[0]); } break; case Modbus_Type.无符号整数16位: { if (isposition) { //获取当前寄存器的值 ushort[] datas = master.ReadHoldingRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, 1); ushort dataValue = ModbusConvert.GetUShort(datas, 0); if (short.Parse(value) > 0) { dataValue = Convert.ToUInt16(dataValue >> dataposition & 1); } else { dataValue = Convert.ToUInt16(dataValue >> dataposition & 0); } //新发送的值 ushort[] datas2 = new ushort[1]; ModbusConvert.SetUShort(datas2, 0, dataValue); master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, datas2[0]); } else { ushort WriteValue = ushort.Parse(value); ushort[] buff = new ushort[1]; ModbusConvert.SetUShort(buff, 0, WriteValue); master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff[0]); } } break; case Modbus_Type.符号整数16位: { if (isposition) { //获取当前寄存器的值 ushort[] datas = master.ReadHoldingRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, 1); short dataValue = ModbusConvert.GetShort(datas, 0); if (short.Parse(value) > 0) { dataValue = Convert.ToInt16(dataValue >> dataposition & 1); } else { dataValue = Convert.ToInt16(dataValue >> dataposition & 0); } //新发送的值 ushort[] datas2 = new ushort[1]; ModbusConvert.SetShort(datas2, 0, dataValue); master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, datas2[0]); } else { Int16 WriteValue = Int16.Parse(value); ushort[] buff = new ushort[1]; ModbusConvert.SetShort(buff, 0, WriteValue); master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff[0]); } } break; case Modbus_Type.无符号整数32位: { uint WriteValue = uint.Parse(value); ushort[] buff = new ushort[2]; ModbusConvert.SetUInt(buff, 0, WriteValue); master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff); } break; case Modbus_Type.符号整数32位: { int WriteValue = int.Parse(value); ushort[] buff = new ushort[2]; ModbusConvert.SetInt(buff, 0, WriteValue); master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff); } break; } } break; } } } } } catch { return(false); } return(true); }