private void btnOpen_Click(object sender, EventArgs e) { if (ModbusTool.SetComm(cmbCom.SelectedItem.ToString(), int.Parse(cmbBaud.SelectedItem.ToString()), int.Parse(cmbDataBit.SelectedItem.ToString()), cmbParity.SelectedIndex, cmbStopBit.SelectedIndex) == nOK) { btnOpen.Enabled = false; btnClose.Enabled = true; } else { MessageBox.Show("设置失败!"); } }
private void btnReadInputRegister_Click(object sender, EventArgs e) { if (!ModbusTool.bConnect) { MessageBox.Show("请先打开串口!"); return; } txtWrong.Text = ""; string strData = ""; try { ushort startAddress; try { startAddress = Convert.ToUInt16(txtStartAddr.Text, 16); } catch (Exception) { MessageBox.Show("请输入正确的起始地址!"); return; } ushort numofPoints; bool isValid = ushort.TryParse(txtAmount.Text, out numofPoints); if (isValid == false) { MessageBox.Show("请输入正确的数量!"); return; } ushort[] register = ModbusTool.ReadInputRegisters(startAddress, numofPoints); //for (int i = 0; i < numofPoints; i++) //{ // strData = strData + "," + register[i].ToString(); //} StringBuilder sb = new StringBuilder(); for (int i = 0; i < numofPoints; i++) { sb.Append(register[i].ToString("X4")); if ((i + 1) % 2 == 0) { sb.Append(" "); } } txtRead.Text = sb.ToString(); } catch (Exception ex) { string str = ex.Message; txtWrong.Text = ex.ToString(); } }
private void btnWriteRegisters_Click(object sender, EventArgs e) { if (!ModbusTool.bConnect) { MessageBox.Show("请先打开串口!"); return; } txtWrong.Text = ""; try { String str = txtWrite.Text.ToString(); String data = str.Replace(" ", ""); if (data.Length % 4 != 0) { data = "000" + data; } int dataCount = data.Length / 4; int[] arr = new int[dataCount]; ushort[] uArr = new ushort[dataCount]; for (int i = dataCount; i > 0; i--) { uArr[dataCount - i] = (Convert.ToUInt16(data.Substring(data.Length - 4 * i, 4), 16)); } //for (int i = 0; i < dataCount; i++) //{ // Buffer.BlockCopy(arr, 4 * i, uArr, 4 * i, 4); //} //List<ushort> listData = new List<ushort>(); ushort startAddress; try { startAddress = Convert.ToUInt16(txtStartAddr.Text, 16); } catch (Exception) { MessageBox.Show("请输入正确的起始地址!"); return; } ModbusTool.WriteMultipleRegisters(startAddress, uArr); } catch (Exception ex) { string str = ex.Message; txtWrong.Text = ex.ToString(); } }
private void btnReadHoldingRegister_Click(object sender, EventArgs e) { if (!ModbusTool.bConnect) { MessageBox.Show("请先打开串口!"); return; } txtWrong.Text = ""; string strData = ""; try { ushort startAddress; try { startAddress = Convert.ToUInt16(txtStartAddr.Text, 16); } catch (Exception) { MessageBox.Show("请输入正确的起始地址!"); return; } ushort numofPoints; bool isValid = ushort.TryParse(txtAmount.Text, out numofPoints); if (isValid == false) { MessageBox.Show("请输入正确的数量!"); return; } ushort[] register = ModbusTool.ReadHoldingRegisters(startAddress, numofPoints); //for (int i = 0; i < numofPoints; i++) //{ // strData = strData + register[i].ToString() + " "; //} StringBuilder sb = new StringBuilder(); for (int i = 0; i < numofPoints; i++) { sb.Append(register[i].ToString("X4")); if ((i + 1) % 2 == 0) { sb.Append(" "); } } txtRead.Text = sb.ToString(); } catch (Exception ex) { //Connection exception //No response from server. //The server maybe close the com port, or response timeout. if (ex.Source.Equals("System")) { txtWrong.Text = DateTime.Now.ToString() + " " + ex.Message; } //The server return error code. //You can get the function code and exception code. if (ex.Source.Equals("Modbus")) { string str = ex.Message; int FunctionCode; string ExceptionCode; str = str.Remove(0, str.IndexOf("\r\n") + 17); FunctionCode = Convert.ToInt16(str.Remove(str.IndexOf("\r\n"))); Console.WriteLine("Function Code: " + FunctionCode.ToString("X")); str = str.Remove(0, str.IndexOf("\r\n") + 17); ExceptionCode = str.Remove(str.IndexOf("-")); switch (ExceptionCode.Trim()) { case "1": txtWrong.Text = "Exception Code: " + ExceptionCode.Trim() + "----> Illegal function!"; break; case "2": txtWrong.Text = "Exception Code: " + ExceptionCode.Trim() + "----> Illegal data address!"; break; case "3": txtWrong.Text = "Exception Code: " + ExceptionCode.Trim() + "----> Illegal data value!"; break; case "4": txtWrong.Text = "Exception Code: " + ExceptionCode.Trim() + "----> Slave device failure!"; break; default: txtWrong.Text = "Exception Code: " + ExceptionCode.Trim() + "----> Read failure!"; break; } } } }
private void btnSetAddress_Click(object sender, EventArgs e) { ModbusTool.SetAddress(byte.Parse(txtDeviceAddr.Text)); }
private void cmbCom_SelectedIndexChanged(object sender, EventArgs e) { ModbusTool.CloseComm(); btnOpen.Enabled = true; btnClose.Enabled = false; }
private void btnClose_Click(object sender, EventArgs e) { ModbusTool.CloseComm(); btnOpen.Enabled = true; btnClose.Enabled = false; }
//发送一行数据,一行内容中包括地址和数据,如果不选择“第一列为地址”,则地址也作为数据发送 private int SendLine(int nLineId, bool bModbus, bool bWithAddress, bool bHex) { string address = ltStrAddress[nLineId - 1].Replace(" ", ""); String str = ""; String data = ""; if (ltStr.Count >= nLineId) { str = ltStr[nLineId - 1].Replace(" ", ""); } if (bWithAddress) { data = str; } else { data = address + str; //如果不选择“第一列为地址”,则地址也作为数据发送 } if (bModbus) { if (data.Length % 2 != 0) { data = "0" + data; } if (data.Length % 4 != 0) //发送以字为单位,即ushort { data = "00" + data; } int dataCount = (data.Length) / 2; ushort[] uArr = new ushort[dataCount / 2]; string subStr; for (int i = 0; i < dataCount / 2; i++) { subStr = data.Substring(4 * i, 4); uArr[i] = Convert.ToUInt16(subStr, 16); } ushort startAddress = 0; if (bWithAddress) { try { startAddress = Convert.ToUInt16(address, 16); } catch (Exception) { return(2); } } else { startAddress = RegisterAddress; } ModbusTool.WriteMultipleRegisters(startAddress, uArr); if (txtSend.Text.Length > 1000000) { txtSend.Text = ""; } if (bShowSend) { if (bWithAddress) { data = address + "," + data; } txtSend.AppendText(data + "\r\n"); txtSend.ScrollToCaret(); } } else //如果不是Modbus才考虑是否16进制发送 { if (!bHex) //ASCII码发送Excel中内容 { if (data.Length > 0) { ModbusTool.serialPort.Write(data); if (txtSend.Text.Length > 1000000) { txtSend.Text = ""; } if (bShowSend) { txtSend.AppendText(data + "\r\n"); txtSend.ScrollToCaret(); } } } else { byte[] arr = null; try { arr = StrToHexByte(data); } catch (Exception) { return(1); } if (data.Length > 0) { ModbusTool.SendAny(arr, 0, arr.Length); if (txtSend.Text.Length > 1000000) { txtSend.Text = ""; } if (bShowSend) { txtSend.AppendText(data + "\r\n"); txtSend.ScrollToCaret(); } } } } return(0); }