Exemple #1
0
 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("设置失败!");
     }
 }
Exemple #2
0
        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();
            }
        }
Exemple #3
0
 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();
     }
 }
Exemple #4
0
        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;
                    }
                }
            }
        }
Exemple #5
0
 private void btnSetAddress_Click(object sender, EventArgs e)
 {
     ModbusTool.SetAddress(byte.Parse(txtDeviceAddr.Text));
 }
Exemple #6
0
 private void cmbCom_SelectedIndexChanged(object sender, EventArgs e)
 {
     ModbusTool.CloseComm();
     btnOpen.Enabled  = true;
     btnClose.Enabled = false;
 }
Exemple #7
0
 private void btnClose_Click(object sender, EventArgs e)
 {
     ModbusTool.CloseComm();
     btnOpen.Enabled  = true;
     btnClose.Enabled = false;
 }
Exemple #8
0
        //发送一行数据,一行内容中包括地址和数据,如果不选择“第一列为地址”,则地址也作为数据发送
        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);
        }