using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using Modbus.Device;
using Modbus.IO;
using Modbus;
using System.Text;
using Modbus.Message;
using Modbus.Data;
namespace MES
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void label1_Click(object sender, EventArgs e)
{ } static SerialPort serialPort1 = new SerialPort("COM7");//声明串口 IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(serialPort1);
byte slaveId = 2;
//Read holdregisters
ushort startAddress = 50;
ushort numRegisters = 10;
//Read input
ushort startAddress_c1 = 0;
ushort numRegisters_c1 = 8;
//Read output
ushort startAddress_c2 = 0;
ushort numRegisters_c2 = 8;//读取现场状态
public void ReadState()
{
//寄存器数值
ushort[] registers = master.ReadHoldingRegisters(slaveId, startAddress, numRegisters);
float f_done = ushort2float(registers[0], registers[1]);
float f_un = (Convert.ToSingle(Txtb_Set.Text))-f_done; Txtb_Done.Text = f_done.ToString();
Txtb_Un.Text = f_un.ToString();
//进度条显示
//布尔量输入
bool []intput_1 = master.ReadInputs (slaveId, startAddress_c1, numRegisters_c1);
if (intput_1[0])
Lab_Xianti.ForeColor = Color.Green;
else
Lab_Xianti.ForeColor = Color.Gray; //布尔量输出
bool[] state = master.ReadCoils(slaveId, startAddress_c2, numRegisters_c2);
if (state[1])
Lab_RaoXian.ForeColor = Color.Green;
else
Lab_RaoXian.ForeColor = Color.Gray; }
//窗口加载时打开串口,设置参数
private void Form2_Load(object sender, EventArgs e)
{ serialPort1.BaudRate = 9600;
serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
serialPort1.ReadTimeout = 1000;
serialPort1.WriteTimeout = 1000; serialPort1.Open();//只能执行一次,不能在定时器中持续调用
////serialPort1.ReceivedBytesThreshold = 1;
//ReadState();
}
// public Timer timer1 =new Timer();
//实时时间显示
private void timer1_Tick(object sender, EventArgs e)
{
DateTime dt = DateTime.Now;
label4_Time.Text = dt.ToString();
}
//定时采集数据
private void timer2_Tick(object sender, EventArgs e)
{
ReadState();
progressBar1.Value = Convert.ToInt32((Convert.ToSingle(Txtb_Done.Text) / (Convert.ToSingle(Txtb_Set.Text)) * 100));
}
//ushort2float
public float ushort2float(ushort a, ushort b)
{
string aa = Convert.ToString((a), 16);
string bb = Convert.ToString((b), 16);
bb = aa + bb;
//string to float
uint num = uint.Parse(bb, System.Globalization.NumberStyles.AllowHexSpecifier);
byte[] floatVals = BitConverter.GetBytes(num);
float f = BitConverter.ToSingle(floatVals, 0);
return f;
} private void button1_Click(object sender, EventArgs e)
{
progressBar1.Value = Convert.ToInt32((Convert.ToSingle(Txtb_Done.Text) / (Convert.ToSingle(Txtb_Set.Text)) * 100));
} private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
master.Dispose();
master = null; // Destroy serial port
serialPort1.Close();
serialPort1.Dispose();
serialPort1 = null;
System.Environment.Exit(0);
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using Modbus.Device;
using Modbus.IO;
using Modbus;
using System.Text;
using Modbus.Message;
using Modbus.Data;
namespace MES
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void label1_Click(object sender, EventArgs e)
{ } static SerialPort serialPort1 = new SerialPort("COM7");//声明串口 IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(serialPort1);
byte slaveId = 2;
//Read holdregisters
ushort startAddress = 50;
ushort numRegisters = 10;
//Read input
ushort startAddress_c1 = 0;
ushort numRegisters_c1 = 8;
//Read output
ushort startAddress_c2 = 0;
ushort numRegisters_c2 = 8;//读取现场状态
public void ReadState()
{
//寄存器数值
ushort[] registers = master.ReadHoldingRegisters(slaveId, startAddress, numRegisters);
float f_done = ushort2float(registers[0], registers[1]);
float f_un = (Convert.ToSingle(Txtb_Set.Text))-f_done; Txtb_Done.Text = f_done.ToString();
Txtb_Un.Text = f_un.ToString();
//进度条显示
//布尔量输入
bool []intput_1 = master.ReadInputs (slaveId, startAddress_c1, numRegisters_c1);
if (intput_1[0])
Lab_Xianti.ForeColor = Color.Green;
else
Lab_Xianti.ForeColor = Color.Gray; //布尔量输出
bool[] state = master.ReadCoils(slaveId, startAddress_c2, numRegisters_c2);
if (state[1])
Lab_RaoXian.ForeColor = Color.Green;
else
Lab_RaoXian.ForeColor = Color.Gray; }
//窗口加载时打开串口,设置参数
private void Form2_Load(object sender, EventArgs e)
{ serialPort1.BaudRate = 9600;
serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
serialPort1.ReadTimeout = 1000;
serialPort1.WriteTimeout = 1000; serialPort1.Open();//只能执行一次,不能在定时器中持续调用
////serialPort1.ReceivedBytesThreshold = 1;
//ReadState();
}
// public Timer timer1 =new Timer();
//实时时间显示
private void timer1_Tick(object sender, EventArgs e)
{
DateTime dt = DateTime.Now;
label4_Time.Text = dt.ToString();
}
//定时采集数据
private void timer2_Tick(object sender, EventArgs e)
{
ReadState();
progressBar1.Value = Convert.ToInt32((Convert.ToSingle(Txtb_Done.Text) / (Convert.ToSingle(Txtb_Set.Text)) * 100));
}
//ushort2float
public float ushort2float(ushort a, ushort b)
{
string aa = Convert.ToString((a), 16);
string bb = Convert.ToString((b), 16);
bb = aa + bb;
//string to float
uint num = uint.Parse(bb, System.Globalization.NumberStyles.AllowHexSpecifier);
byte[] floatVals = BitConverter.GetBytes(num);
float f = BitConverter.ToSingle(floatVals, 0);
return f;
} private void button1_Click(object sender, EventArgs e)
{
progressBar1.Value = Convert.ToInt32((Convert.ToSingle(Txtb_Done.Text) / (Convert.ToSingle(Txtb_Set.Text)) * 100));
} private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
master.Dispose();
master = null; // Destroy serial port
serialPort1.Close();
serialPort1.Dispose();
serialPort1 = null;
System.Environment.Exit(0);
}
}
}
解决方案 »
- Winform程序中Form的嵌套引发的不可操作问题
- 高手进(高分),c#正则获取网页指定内容
- WPF DataGrid 列在拖动后恢复最初的列显示顺序
- 自动登录获取网页源码 500错误!
- 如何确定一个textbox里的值是不是能转换成整型
- dataGridView在编辑单元格时触发那个事件?(例如textBox在编辑时触发TextChanged事件)
- 要求某人在两小时内回复 若无回复则自动产生一条记录在.net中怎样实现
- c# 多线程的问题
- 求c#实现概率问题?通分、约分……
- 高分!server2003问题!
- 如何把web.config中的设置配置项迁移到Core中
- 微信授权过程中cookie能写入,跳转页面后读取不到
耗时的操作都需要放到工作线程中去,使用线程,UI交互就需要使用委托使用timer也可以,但是timer有短板,无法解决重入
也就是如果某一轮由于异常没有执行完超时,
发生重入后,就会发生问题。如果对线程不熟悉,可以换成backgroundworker控件
//定时采集数据
private void timer2_Tick(object sender, EventArgs e)
{
ReadState();
progressBar1.Value = Convert.ToInt32((Convert.ToSingle(Txtb_Done.Text) / (Convert.ToSingle(Txtb_Set.Text)) * 100));
}就算是另外开线程也不好开吧,因为你靠定时器2每隔一段时间操作一次耗时的操作,估计你的程序需要重新设计了,要不你把定时器2定时的时间长一点,但是定时的时间需要是串口读写时间的倍数
这里有范例:
http://blog.sina.com.cn/s/blog_16d7d3ecb0102x1z5.html