/// <summary> /// 【发送指令】 /// 20170505 /// </summary> /// <param name="address">地址码</param> /// <param name="cmd">功能码</param> /// <param name="regAddr">地址码</param> /// <param name="regNum"></param> private void SendData(string address, string cmd, string regAddr, string regNum) { try { if (!isOpen) { SetPortProperty(); //设置并打开串口 } byte address1 = Convert.ToByte(address.Trim(), 16); //地址码 byte cmd1 = Convert.ToByte(cmd.Trim(), 16); //命令帧 byte regAddr1 = Convert.ToByte(regAddr.Trim(), 16); //寄存器地址 byte regNum1 = Convert.ToByte(regNum.Trim(), 16); //寄存器数量 //Modbus相关处理对象 MyModbus modbus = new MyModbus(); byte[] text = modbus.GetReadFrame(address1, cmd1, regAddr1, regNum1, 8); sp.Write(text, 0, 8); //tbxShowData.Text += "[ Send:" + BitConverter.ToString(text) + " ] [ Time:"+DateTime.Now +" ]\r\n"; ShowDataByTBX(1, BitConverter.ToString(text)); } catch (Exception e) { //ShowMessage(2, "系统错误!(可能原因:串口设置问题)"); ShowMessage(2, "系统错误!(可能原因:" + e.Message + ")"); } }
/// <summary> /// 【发送“全开”和“全关”的长数据帧数据】 /// 20170518 /// </summary> private void SendLongFrame() { if (!isOpen) { SetPortProperty();//设置并打开串口 } string str = ""; for (int i = 0; i < youtput; i++) { CheckBox ck = groupBox4.Controls.Find("Y" + i, false).First() as CheckBox; if (ck.Checked) { str = "1" + str; } else { str = "0" + str; } } byte[] data = { Convert.ToByte(macaddr, 16), //从机地址 Convert.ToByte("0F", 16), //功能码 Convert.ToByte("00", 16), //线圈起始地址 Convert.ToByte(youtput.ToString(), 16), //线圈数量 Convert.ToByte(Math.Ceiling(Convert.ToDouble(youtput * 1.0 / 8)).ToString(),16),//字节数 Convert.ToByte(string.Format("{0:X}", Convert.ToInt32(str,2)).PadLeft(2, '0'), 16),//线圈状态 0F }; //str = str.PadLeft(8, '0'); //string.Format("{0:}", Convert.ToInt32(str, 2)); //MessageBox.Show("你点击了" + string.Format("{0:X}", Convert.ToInt32(str, 2)).PadLeft(2,'0')); MyModbus modbus = new MyModbus(); byte[] text = modbus.GetLongReadFrame(data); sp.Write(text, 0, 10); ShowDataByTBX(1, BitConverter.ToString(text)); }
/// <summary> /// 【发送设置串口的长数据帧数据】 /// 20170523 /// </summary> private void Send13KLongFrame() { string setaddr = cbxSetAddress.Text.Trim(); string setbaudrate = cbxSetBaudRate.Text.Trim(); string setparity = cbxSetParity.Text.Trim(); if (string.IsNullOrEmpty(setaddr) || string.IsNullOrEmpty(setbaudrate) || string.IsNullOrEmpty(setparity)) { ShowMessage(2, "请设置左边的参数"); return; } else { //奇偶校验位转换 if (setparity == "无") { setparity = "00"; } else if (setparity == "奇校验") { setparity = "01"; } else { setparity = "10"; } //波特率转换 string[] ss = { "000", "001", "010", "011", "100", "101", "110", "111" }; setbaudrate = ss[cbxSetBaudRate.SelectedIndex]; } if (!isOpen) { SetPortProperty();//设置并打开串口 } //01 10 00 08 00 02 04 xx xx xx xx CRC //000+校验位2位+波特率3位 byte[] data = { Convert.ToByte(setaddr, 16),//从机地址 Convert.ToByte("10", 16), Convert.ToByte("00", 16), Convert.ToByte("08", 16), Convert.ToByte("00", 16), Convert.ToByte("02", 16), Convert.ToByte("04", 16), Convert.ToByte("00", 16), Convert.ToByte("0" + setparity.Substring(0, 1),16),//0 + 奇偶校验位第一位 Convert.ToByte(setparity.Substring(1, 1) + setbaudrate.Substring(0,1), 16),//奇偶校验位第二位 + 波特率第一位 Convert.ToByte(setbaudrate.Substring(1, 2),16),//波特率第二三位 }; //str = str.PadLeft(8, '0'); //string.Format("{0:}", Convert.ToInt32(str, 2)); //MessageBox.Show("你点击了" + string.Format("{0:X}", Convert.ToInt32(str, 2)).PadLeft(2,'0')); MyModbus modbus = new MyModbus(); byte[] text = modbus.Get13kReadFrame(data); sp.Write(text, 0, 13); ShowDataByTBX(1, BitConverter.ToString(text)); }
/// <summary> /// 【显示接收返回的数据】 /// </summary> /// <param name="resbuffer"></param> public void ShowRst(byte[] resbuffer) { try { MyModbus modbus = new MyModbus(); //tbxRecvData.Text += "Recv:" + modbus.SetText(resbuffer) + "\r\n"; //tbxRecvData.Text += "\r\n"; if (resbuffer.Length <= 0) { //tbxShowData.Text += "[ Recv:" + "无可读数据" + " ]\r\n\r\n"; ShowDataByTBX(2, "无可读数据"); return; } string str = modbus.SetText(resbuffer); if (str == "CRC校验错误") { ShowMessage(2, "CRC校验错误"); return; } if (str == "程序出错") { ShowMessage(2, "程序错误"); return; } string rst = ""; for (int i = 0; i < str.Length; i++) { if ((i + 1) % 2 == 0 && i < str.Length - 1) { rst += str[i] + "-"; } else { rst += str[i]; } } //MessageBox.Show(rst); //tbxShowData.Text += "[ Recv:" + rst + " ] [ Time:" + DateTime.Now + " ]\r\n\r\n"; ShowDataByTBX(2, rst);//展示数据 ShowMessage(1, "读取成功"); string[] data = rst.Split('-'); int address = Convert.ToInt32(cbxMacAddress.Text.Trim()); if (btnType == 1)//从机连接 { if (string.Format("{0:00}", address) == data[0]) { // Form1.m_io = Convert.ToInt32( data[4]); //Form1.ChangIO(64); //Form pf = this.MdiParent; if (PF.GetType() == typeof(Form1)) { ((Form1)PF).ChangIO(cbxMacAddress.Text.Trim(), 64); } ShowMessage(1, "从机连接成功"); MessageBox.Show("连接成功!", "系统提示"); this.Dispose(); } else { ShowMessage(2, "从机连接失败"); } } else if (btnType == 2)//读取串口 { if ("6D" == data[3]) { this.isReadOK = true; ShowMessage(1, "读取串口成功!"); //测试成功。 } } } catch { ShowMessage(2, "系统错误!"); } }
/// <summary> /// 【显示接收返回的数据】 /// </summary> /// <param name="resbuffer"></param> public void ShowRst(byte[] resbuffer) { try { MyModbus modbus = new MyModbus(); //tbxRecvData.Text += "Recv:" + modbus.SetText(resbuffer) + "\r\n"; //tbxRecvData.Text += "\r\n"; if (resbuffer.Length <= 0) { //tbxShowData.Text += "[ Recv:" + "无可读数据" + " ]\r\n\r\n"; ShowDataByTBX(2, "无可读数据"); return; } string str = modbus.SetText(resbuffer); if (str == "CRC校验错误") { ShowMessage(2, "CRC校验错误"); return; } if (str == "程序出错") { ShowMessage(2, "程序错误"); return; } string rst = ""; for (int i = 0; i < str.Length; i++) { if ((i + 1) % 2 == 0 && i < str.Length - 1) { rst += str[i] + "-"; } else { rst += str[i]; } } //MessageBox.Show(rst); //tbxShowData.Text += "[ Recv:" + rst + " ] [ Time:" + DateTime.Now + " ]\r\n\r\n"; ShowDataByTBX(2, rst);//展示数据 ShowMessage(1, "读取成功"); string[] data = rst.Split('-'); //{ "01", "02","03" } if (btnType == 1) //读取版本型号ye { tbxSofeVersion.Text = data[5] + " " + data[6]; //软件版本 tbxMacVersion.Text = data[3] + " " + data[4]; //从机型号 tbxHWVersion.Text = data[7] + " " + data[8]; //硬件版本 } else if (btnType == 2) //读取输入IO { int address = Convert.ToInt32(macaddr); if (string.Format("{0:00}", address) == data[0]) { ShowMessage(1, "读取成功"); } else { ShowMessage(2, "读取失败"); } if (data[3] == strFormat(0)) { ShowMessage(2, "当前没有输入"); } else { ShowMessage(1, "当前有输入"); } } else if (btnType == 3)//自动读取IO { } } catch { ShowMessage(2, "系统错误!"); } }