winform使用NModbus4与信捷PLC通信
引用NModbus4.dll
----------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Modbus.Device;
namespace NModbus4Demo
{
public partial class txtForm1 : Form
{
#region 声明变量
Thread th1; //读取线圈状态线程
Thread th2; //读取Y0-Y7线圈状态
private static AutoResetEvent threadEvent = new AutoResetEvent(false);
ModbusSerialMaster master;
SerialPort port = new SerialPort(); //实例化串口类
#endregion
public txtForm1()
{
InitializeComponent();
}
private void txtForm1_Load(object sender, EventArgs e)
{
this.comboBox1.SelectedIndex = 1;
connectionPLC(); //连接PLC
th1 = new Thread(new ThreadStart(readOneCoil));
th2 = new Thread(new ThreadStart(readYCoils));
}
#region 事件
//读取单个线圈
private void button3_Click(object sender, EventArgs e)
{
string address = this.textBox2.Text;
if (address == "")
{
MessageBox.Show("请输入地址", "erro");
}
else
{
th1.Start();
this.button3.Enabled = false;
this.label12.Visible = true;
}
}
//写入单个寄存器点击事件
private void button1_Click_1(object sender, EventArgs e)
{
WriteSingleRegister(Convert.ToUInt16(this.textBox7.Text), Convert.ToUInt16(this.textBox8.Text));
}
//窗体关闭事件
private void txtForm1_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
//写入单个线圈
private void button2_Click(object sender, EventArgs e)
{
bool value;
if (this.comboBox2.SelectedItem.ToString() == "ON")
{
value = true;
}
else if (this.comboBox2.SelectedItem.ToString() == "OFF")
{
value = false;
}
else
{
value = false;
}
writeSingleCoil(Convert.ToUInt16(this.textBox9.Text), value);
}
//查看地址事件
private void button4_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.Show();
}
//监控Y0-Y7线圈状态按钮事件
private void button5_Click(object sender, EventArgs e)
{
th2.Start();
}
#endregion
#region 方法
//连接PLC
private void connectionPLC()
{
port.PortName = "COM5";
port.BaudRate = 19200;
port.Parity = Parity.Even;
port.StopBits = StopBits.One;
port.DataBits = 8;
try
{
port.Open();
this.lab_conncg.Visible = true;
this.lab_connsb.Visible = false;
this.panel1.BackColor = Color.Green;
}
catch (System.Exception)
{
this.lab_conncg.Visible = false;
this.lab_connsb.Visible = true;
this.panel1.BackColor = Color.Red;
throw new Exception("串口 " + port.PortName + " 已打开失败!");
}
master = ModbusSerialMaster.CreateRtu(port);
master.Transport.ReadTimeout = 2000;
master.Transport.WriteTimeout = 2000;
//其中transport还有重试次数和重试间隔时间,默认是3和250
//master.Transport.Retries + " " + master.Transport.WaitToRetryMilliseconds;
}
bool last; //上次状态
//读取单个线圈
public void readOneCoil()
{
while (true)
{
string address = this.textBox2.Text;
bool[] coils = new bool[8];
try
{
coils = master.ReadCoils(1, Convert.ToUInt16(address), 1);
}
catch (Exception ex) { }
if (coils[0])
{
//this.label23.Text = "上升沿信号已触发";
this.label6.BackColor = Color.Green;
//last = true;
}
else
{
//last = false;
this.label6.BackColor = Color.Black;
}
}
}
//读取所有Y0-Y7
public void readYCoils()
{
while (true)
{
string address = this.textBox2.Text;
bool[] coils = new bool[8];
try
{
coils = master.ReadCoils(1,18432,8);
}
catch (Exception ex) { }
#region 判断线圈状态
if (coils[0])
{
this.y0.BackColor = Color.Red;
}
else
{
this.y0.BackColor = Color.Black;
}
if (coils[1])
{
this.y1.BackColor = Color.Red;
}
else
{
this.y1.BackColor = Color.Black;
}
if (coils[2])
{
this.y2.BackColor = Color.Red;
}
else
{
this.y2.BackColor = Color.Black;
}
if (coils[3])
{
this.y3.BackColor = Color.Red;
}
else
{
this.y3.BackColor = Color.Black;
}
if (coils[4])
{
this.y4.BackColor = Color.Red;
}
else
{
this.y4.BackColor = Color.Black;
}
if (coils[5])
{
this.y5.BackColor = Color.Red;
}
else
{
this.y5.BackColor = Color.Black;
}
if (coils[6])
{
this.y6.BackColor = Color.Red;
}
else
{
this.y6.BackColor = Color.Black;
}
if (coils[7])
{
this.y7.BackColor = Color.Red;
}
else
{
this.y7.BackColor = Color.Black;
}
#endregion
}
}
/// <summary>
/// 写入单个寄存器
/// </summary>
private void WriteSingleRegister(ushort registerAdr, ushort value)
{
master.WriteSingleRegister(1, registerAdr, value);
}
/// <summary>
/// 写入单个线圈
/// </summary>
/// <param name="coilAdr">线圈地址</param>
/// <param name="value">布尔型值</param>
public void writeSingleCoil(ushort coilAdr, bool value)
{
master.WriteSingleCoil(1, coilAdr, value);
}
#endregion
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)