C#上位机与PLC通信,测试程序,偶尔会出现界面卡死,不能进行数据采集。
奔跑的啸呼 2018-12-21 01:49:48 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);
}
}
}