cdk
3 天以前 91d3b71e4ff6884ae4c064929b0071ed98363ff9
DevApp/Gs.DevApp/XtraForm2.cs
@@ -1,21 +1,291 @@
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();
            }
        }
    }
}