| | |
| | | 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.Text; |
| | | using System.Threading.Tasks; |
| | | 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(); |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |