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();
|
}
|
|
}
|
}
|
}
|