using DevExpress.XtraEditors; using DevExpress.XtraEditors.Controls; using DevExpress.XtraGrid; using DevExpress.XtraGrid.Columns; using DevExpress.XtraGrid.Views.Base; using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraWaitForm; using Gs.DevApp.ToolBox; using Microsoft.Win32; using NModbus; using NModbus.Device; using NModbus.Serial; using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Drawing; using System.IO.Ports; using System.Linq; using System.Windows.Forms; using static DevExpress.Data.Filtering.Helpers.SubExprHelper.ThreadHoppingFiltering; using DateTime = System.DateTime; namespace Gs.DevApp { public partial class XtraForm2 : DevExpress.XtraEditors.XtraForm { public delegate void HandleInterfaceUpdataDelegate(string text); public SerialPort Sp = new SerialPort(); private XtraForm2.HandleInterfaceUpdataDelegate interfaceUpdataHandle; public XtraForm2() { InitializeComponent(); this.cmbBaudRate.EditValue = (object)"9600"; this.GetComList(); } private void GetComList() { this.cmbSerialPortNum.Properties.Items.Clear(); this.cmbBaudRate.Properties.Items.AddRange(new ImageComboBoxItem[5] { new ImageComboBoxItem("14400", (object) "14400", -1), new ImageComboBoxItem("9600", (object) "9600", -1), new ImageComboBoxItem("4800", (object) "4800", -1), new ImageComboBoxItem("2400", (object) "2400", -1), new ImageComboBoxItem("1200", (object) "1200", -1) }); RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("Hardware\\DeviceMap\\SerialComm"); if (registryKey == null) return; foreach (string valueName in registryKey.GetValueNames()) { string description = (string)registryKey.GetValue(valueName); this.cmbSerialPortNum.Properties.Items.Add(new ImageComboBoxItem(description, (object)description)); } if (this.cmbSerialPortNum.Properties.Items.Count > 0) this.cmbSerialPortNum.SelectedIndex = 0; } public void GetWeight() { ModbusFactory factory = new ModbusFactory(); LogHelper.Debug(this.ToString(), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":创建modbus对象..."); IModbusMaster rtuMaster = (IModbusMaster)factory.CreateRtuMaster(this.Sp); bool flag = true; while (true) { try { if (!this.Sp.IsOpen) { LogHelper.Debug(this.ToString(), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":重新打开串口连接..."); this.Sp.Open(); rtuMaster = (IModbusMaster)factory.CreateRtuMaster(this.Sp); } if (rtuMaster == null) { LogHelper.Debug(this.ToString(), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":重新创建modbus对象..."); rtuMaster = (IModbusMaster)factory.CreateRtuMaster(this.Sp); } // DataTable dataTable = this._sqlHelper.ExecuteDataTable("\r\nselect top 1 * from WOMZLA(nolock) \r\nwhere ZLA004=convert(varchar(10),getdate(),120) and ZLA003='IQC' and ZLA008='N'\r\norder by ZLA005"); //if (dataTable != null && dataTable.Rows.Count > 0) //{ // // LoggerHelper.WriteInfoLog($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}:发送上下限数据:{dataTable.Rows[0]["ZLA006"]}|{dataTable.Rows[0]["ZLA007"]}"); // byte slaveAddress1 = byte.Parse("1"); // ushort startAddress1 = ushort.Parse("0104"); // ushort[] ushort2_1 = this.stringToUshort2(dataTable.Rows[0]["ZLA006"].ToString()); // rtuMaster.WriteMultipleRegisters(slaveAddress1, startAddress1, ushort2_1); // byte slaveAddress2 = byte.Parse("1"); // ushort startAddress2 = ushort.Parse("0102"); // ushort[] ushort2_2 = this.stringToUshort2(dataTable.Rows[0]["ZLA007"].ToString()); // rtuMaster.WriteMultipleRegisters(slaveAddress2, startAddress2, ushort2_2); // this._sqlHelper.ExecuteNonQuery($"update WOMZLA set ZLA008='Y',ZLA009=convert(varchar(20),getdate(),120) where ZLA001='{dataTable.Rows[0]["ZLA001"]}'"); //} //else { byte slaveAddress3 = byte.Parse("1"); ushort startAddress3 = ushort.Parse("0002"); ushort numberOfPoints1 = ushort.Parse("2"); ushort[] numArray = rtuMaster.ReadHoldingRegisters(slaveAddress3, startAddress3, numberOfPoints1); float single = BitConverter.ToSingle(this.CombomBinaryArray(BitConverter.GetBytes(numArray[1]), BitConverter.GetBytes(numArray[0])), 0); this.Invoke((Delegate)this.interfaceUpdataHandle, (object)single.ToString()); byte slaveAddress4 = byte.Parse("1"); ushort startAddress4 = ushort.Parse("0001"); ushort numberOfPoints2 = ushort.Parse("1"); int int32 = Convert.ToInt32(rtuMaster.ReadHoldingRegisters(slaveAddress4, startAddress4, numberOfPoints2)[0].ToString()); string str = Convert.ToString(int32, 2).PadLeft(16 /*0x10*/, '0'); char ch1 = str[1]; char ch2 = str[6]; if (ch1 == '0' && ch2 == '0') { // this._sqlHelper.ExecuteNonQuery($"\r\nif not exists(select 1 from WOMZLB(nolock) where ZLB001='IQC' and ZLB002='{single.ToString()}' and ZLB003='{int32.ToString()}')\r\nbegin\r\n if exists(select 1 from WOMZLB(nolock) where ZLB001='IQC')\r\n begin\r\n\t update WOMZLB set ZLB002='{single.ToString()}',ZLB003='{int32.ToString()}' where ZLB001='IQC'\r\n end\r\n else\r\n begin\r\n\t insert into WOMZLB(ZLB001,ZLB002,ZLB003)\r\n\t select 'IQC','{single.ToString()}','{int32.ToString()}'\r\n end\r\nend\r\n"); flag = true; } else if (flag) { // this._sqlHelper.ExecuteNonQuery($"\r\nif not exists(select 1 from WOMZLB(nolock) where ZLB001='IQC' and ZLB002='{single.ToString()}' and ZLB003='{int32.ToString()}')\r\nbegin\r\n if exists(select 1 from WOMZLB(nolock) where ZLB001='IQC')\r\n begin\r\n\t update WOMZLB set ZLB002='0',ZLB003='{int32.ToString()}' where ZLB001='IQC'\r\n end\r\n else\r\n begin\r\n\t insert into WOMZLB(ZLB001,ZLB002,ZLB003)\r\n\t select 'IQC','0','{int32.ToString()}'\r\n end\r\nend\r\n"); flag = false; } MessageBox.Show(single.ToString() + ":" + int32.ToString()); LogHelper.Debug(this.ToString(), "single:" + single.ToString()); LogHelper.Debug(this.ToString(), "int32:" + int32.ToString()); } // Thread.Sleep(2000); } catch (Exception ex) { // Thread.Sleep(2000); MessageBox.Show(ex.Message); LogHelper.Debug(this.ToString(), "single:" + ex.Message); } } } private byte[] CombomBinaryArray(byte[] srcArray1, byte[] srcArray2) { byte[] destinationArray = new byte[srcArray1.Length + srcArray2.Length]; Array.Copy((Array)srcArray1, 0, (Array)destinationArray, 0, srcArray1.Length); Array.Copy((Array)srcArray2, 0, (Array)destinationArray, srcArray1.Length, srcArray2.Length); return destinationArray; } private void simpleButton1_Click(object sender, EventArgs e) { try { DateTime now = DateTime.Now; // LoggerHelper.WriteInfoLog(now.ToString("yyyy-MM-dd HH:mm:ss") + ":开始采集"); if (this.cmbBaudRate.Text.Trim() != "" && this.cmbSerialPortNum.Text != "") { now = DateTime.Now; // LoggerHelper.WriteInfoLog(now.ToString("yyyy-MM-dd HH:mm:ss") + ":配置串口通信"); // this.interfaceUpdataHandle = new MainForm.HandleInterfaceUpdataDelegate(this.UpdateTextBox); this.Sp.PortName = this.cmbSerialPortNum.Text.Trim(); this.Sp.BaudRate = Convert.ToInt32(this.cmbBaudRate.Text.Trim()); this.Sp.Parity = Parity.None; this.Sp.StopBits = StopBits.One; now = DateTime.Now; // LoggerHelper.WriteInfoLog(now.ToString("yyyy-MM-dd HH:mm:ss") + ":打开串口同通信"); this.Sp.Open(); MessageBox.Show("打开成功Sp:" + Sp.IsOpen.ToString()); //this.button1.Enabled = false; //this.button2.Enabled = true; //this.timer1.Enabled = false; //now = DateTime.Now; //LoggerHelper.WriteInfoLog(now.ToString("yyyy-MM-dd HH:mm:ss") + ":启动刷新数据定时器"); //this.timer1.Start(); } else { now = DateTime.Now; // LoggerHelper.WriteErrorLog(now.ToString("yyyy-MM-dd HH:mm:ss") + ":请输入正确的端口号和波特率"); int num = (int)MessageBox.Show("请输入正确的端口号和波特率!"); this.cmbSerialPortNum.Focus(); } } catch (Exception ex) { // LoggerHelper.WriteErrorLog($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}:{ex.Message}"); int num = (int)MessageBox.Show($"端口{this.cmbSerialPortNum.Text.Trim()}打开失败!{ex.Message}"); } } private void simpleButton2_Click(object sender, EventArgs e) { GetWeight(); } public void ReadWeight222() { ModbusFactory factory = new ModbusFactory(); try { // 1. 配置串口参数(需与电子秤一致) string portName = "COM1"; // 串口号 int baudRate = 9600; // 波特率 Parity parity = Parity.None; // 校验位 int dataBits = 8; // 数据位 StopBits stopBits = StopBits.One; // 停止位 // 2. 创建串口连接 SerialPort serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits); serialPort.Open(); // 3. 创建Modbus RTU主站 IModbusMaster master = (IModbusMaster)factory.CreateRtuMaster(serialPort); // 4. 配置读取参数 //byte slaveId = 1; // 从站地址(电子秤的Modbus地址) //ushort startAddress = 0; // 寄存器起始地址(40001对应地址0) //ushort numRegisters = 2; // 读取2个寄存器(32位数据) byte slaveAddress3 = byte.Parse("1"); ushort startAddress3 = ushort.Parse("0"); ushort numberOfPoints1 = ushort.Parse("2"); // 5. 读取保持寄存器 ushort[] registers = master.ReadHoldingRegisters(slaveAddress3, startAddress3, numberOfPoints1); // 6. 处理返回数据(假设数据为32位浮点数,大端格式) byte[] bytes = new byte[4]; Buffer.BlockCopy(registers, 0, bytes, 0, 4); // 处理字节序(根据设备要求可能需要调整) if (BitConverter.IsLittleEndian) { Array.Reverse(bytes); // 如果设备是大端模式,需要反转字节 } // 转换为浮点数 float weight = BitConverter.ToSingle(bytes, 0); MessageBox.Show(weight.ToString()); } catch (Exception ex) { Console.WriteLine($"读取失败: {ex.Message}"); MessageBox.Show("err:" + ex.Message.ToString()); } } private void simpleButton3_Click(object sender, EventArgs e) { ModbusFactory factory = new ModbusFactory(); // 1. 配置串口参数 SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); serialPort.Open(); // 构造自定义功能码请求帧(示例:功能码 0x31) byte[] request = new byte[] { 0x01, 0x31, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00 }; serialPort.Write(request, 0, request.Length); // 读取响应 byte[] buffer = new byte[256]; int bytesRead = serialPort.Read(buffer, 0, buffer.Length); MessageBox.Show($"响应数据: {BitConverter.ToString(buffer, 0, bytesRead)}"); //serialPort.Close(); // 2. 创建Modbus RTU主站 IModbusMaster modbusMaster = (IModbusMaster)factory.CreateRtuMaster(serialPort); try { while (true) { // 3. 读取保持寄存器(从站地址1,起始地址0x0001,读取2个寄存器) ushort[] registers = modbusMaster.ReadHoldingRegisters(1, 0x0001, 2); MessageBox.Show("d"); // 4. 解析数据(假设寄存器存储的是重量值,单位为克) int weight = (registers[0] << 16) + registers[1]; Console.WriteLine($"重量值: {weight} g"); MessageBox.Show($"重量值: {weight} g"); System.Threading.Thread.Sleep(1000); // 每秒读取一次 } } catch (Exception ex) { MessageBox.Show(ex.Message); Console.WriteLine($"错误: {ex.Message}"); } finally { serialPort.Close(); } } } }