基本信息
源码名称:C#与PLC进行ModbusRTU通信
源码大小:1.92M
文件格式:.rar
开发语言:C#
更新时间:2019-11-21
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
已经验证可以和支持ModbusRTU 的PLC通信
已经验证可以和支持ModbusRTU 的PLC通信
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using HslCommunication;
using HslCommunication.ModBus;
using System.Threading;
using System.Runtime.InteropServices;
namespace ModbusRtuAndPLC
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private ModbusRtu busRtuClient = null;
private void btnOpenPort_Click(object sender, EventArgs e)
{
int baudRate;
if (!int.TryParse(txtRtuBaudrate.Text, out baudRate))
{
MessageBox.Show("波特率输入错误!");
return;
}
int dataBits;
if (!int.TryParse(txtRtuDataBit.Text, out dataBits))
{
MessageBox.Show("数据位输入错误!");
return;
}
int stopBits;
if (!int.TryParse(txtRtuStopBit.Text, out stopBits))
{
MessageBox.Show("停止位输入错误!");
return;
}
byte station;
if (!byte.TryParse(txtStastion.Text, out station))
{
MessageBox.Show("站号输入不正确!");
return;
}
busRtuClient?.Close();
busRtuClient = new ModbusRtu(station);
busRtuClient.AddressStartWithZero = checkBoxAddressStartWithZero.Checked;
comboBox2_SelectedIndexChanged(null, new EventArgs());
busRtuClient.IsStringReverse = checkBoxStringReversal.Checked;
try
{
busRtuClient.SerialPortInni(sp =>
{
sp.PortName = cboRTUProtSelect.Text;
sp.BaudRate = baudRate;
sp.DataBits = dataBits;
sp.StopBits = stopBits == 0 ? System.IO.Ports.StopBits.None : (stopBits == 1 ? System.IO.Ports.StopBits.One : System.IO.Ports.StopBits.Two);
sp.Parity = cboRtuParity.SelectedIndex == 0 ? System.IO.Ports.Parity.None : (cboRtuParity.SelectedIndex == 1 ? System.IO.Ports.Parity.Odd : System.IO.Ports.Parity.Even);
});
busRtuClient.Open();
btnClosePort.Enabled = true;
btnOpenPort.Enabled = false;
//panelRTU.Enabled = true;
Thread threadInput = new Thread(IOMonitorIput);
////设置为后台线程
threadInput.IsBackground = true;
System.Threading.Thread.Sleep(200);
threadInput.Start();
Thread threadOutput = new Thread(IOMonitorOutput);
////设置为后台线程
threadOutput.IsBackground = true;
System.Threading.Thread.Sleep(200);
threadOutput.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void btnClosePort_Click(object sender, EventArgs e)
{
// 断开连接
busRtuClient.Close();
btnClosePort.Enabled = false;
btnOpenPort.Enabled = true;
//panelRTU.Enabled = false;
}
private void checkBoxStringReversal_CheckedChanged(object sender, EventArgs e)
{
}
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
if (busRtuClient != null)
{
switch (comboBox2.SelectedIndex)
{
case 0: busRtuClient.DataFormat = HslCommunication.Core.DataFormat.ABCD; break;
case 1: busRtuClient.DataFormat = HslCommunication.Core.DataFormat.BADC; break;
case 2: busRtuClient.DataFormat = HslCommunication.Core.DataFormat.CDAB; break;
case 3: busRtuClient.DataFormat = HslCommunication.Core.DataFormat.DCBA; break;
default: break;
}
}
}
private void readResultRender<T>(OperateResult<T> result, string address, TextBox textBox)
{
if (result.IsSuccess)
{
textBox.AppendText(DateTime.Now.ToString("[HH:mm:ss] ") $"[{address}] {result.Content}{Environment.NewLine}");
}
else
{
MessageBox.Show(DateTime.Now.ToString("[HH:mm:ss] ") $"[{address}] 读取失败{Environment.NewLine}原因:{result.ToMessageShowString()}");
}
}
private void btnRtu_read_short_Click(object sender, EventArgs e)
{
// 读取short变量
readResultRender(busRtuClient.ReadInt16(txtRtuRegisterAddress_Read.Text), txtRtuRegisterAddress_Read.Text, txtRtu_ReadData);
}
private void btnRtuReadInput_bool_Click(object sender, EventArgs e)
{
// 读取bool变量
//txtRtuRegisterAddress_Read.Text = "14";
readResultRender(busRtuClient.ReadCoil(txtRtuRegisterAddress_Read.Text), txtRtuRegisterAddress_Read.Text, txtRtu_ReadData);
//txtRtuRegisterAddress_Read.Text = "15";
//readResultRender(busRtuClient.ReadCoil(txtRtuRegisterAddress_Read.Text), txtRtuRegisterAddress_Read.Text, txtRtu_ReadData);
}
List<TextBox> list = new List<TextBox>();
TextBox txtInShow = new TextBox();
//输入输出监控
public void IOMonitorIput()
{
// 读取输入
list.Add(txtInShow0);
list.Add(txtInShow1);
list.Add(txtInShow2);
list.Add(txtInShow3);
list.Add(txtInShow4);
list.Add(txtInShow5);
list.Add(txtInShow6);
list.Add(txtInShow7);
list.Add(txtInShow8);
list.Add(txtInShow9);
list.Add(txtInShow10);
list.Add(txtInShow11);
list.Add(txtInShow12);
list.Add(txtInShow13);
list.Add(txtInShow14);
list.Add(txtInShow15);
while (btnOpenPort.Enabled == false)
{
HslCommunication.OperateResult<bool[]> read = busRtuClient.ReadDiscrete("0", 16);
bool[] readInput = read.Content;
for (int i = 0; i < list.Count; i )
{
list[i].BackColor = (readInput[i] == true ? Color.Lime : Color.Gray);
}
// 读取操作
//bool coil100 = busRtuClient.ReadCoil("100").Content; // 读取线圈100的通断
//short short100 = busRtuClient.ReadInt16("100").Content; // 读取寄存器100的short值
//ushort ushort100 = busRtuClient.ReadUInt16("100").Content; // 读取寄存器100的ushort值
//int int100 = busRtuClient.ReadInt32("100").Content; // 读取寄存器100-101的int值
//uint uint100 = busRtuClient.ReadUInt32("100").Content; // 读取寄存器100-101的uint值
//float float100 = busRtuClient.ReadFloat("100").Content; // 读取寄存器100-101的float值
//long long100 = busRtuClient.ReadInt64("100").Content; // 读取寄存器100-103的long值
//ulong ulong100 = busRtuClient.ReadUInt64("100").Content; // 读取寄存器100-103的ulong值
//double double100 = busRtuClient.ReadDouble("100").Content; // 读取寄存器100-103的double值
//string str100 = busRtuClient.ReadString("100", 5).Content;// 读取100到104共10个字符的字符串
// 写入操作
//busRtuClient.Write("100", true);// 写入线圈100为通
//busRtuClient.Write("100", (short)12345);// 写入寄存器100为12345
//busRtuClient.Write("100", (ushort)45678);// 写入寄存器100为45678
//busRtuClient.Write("100", 123456789);// 写入寄存器100-101为123456789
//busRtuClient.Write("100", (uint)123456778);// 写入寄存器100-101为123456778
//busRtuClient.Write("100", 123.456);// 写入寄存器100-101为123.456
//busRtuClient.Write("100", 12312312312414L);//写入寄存器100-103为一个大数据
//busRtuClient.Write("100", 12634534534543656UL);// 写入寄存器100-103为一个大数据
//busRtuClient.Write("100", 123.456d);// 写入寄存器100-103为一个双精度的数据
//busRtuClient.Write("100", "K123456789");
}
}
List<TextBox> listOutPut = new List<TextBox>();
TextBox txtOutShow = new TextBox();
public void IOMonitorOutput()
{
listOutPut.Add(txtOutShow0);
listOutPut.Add(txtOutShow1);
listOutPut.Add(txtOutShow2);
listOutPut.Add(txtOutShow3);
listOutPut.Add(txtOutShow4);
listOutPut.Add(txtOutShow5);
listOutPut.Add(txtOutShow6);
listOutPut.Add(txtOutShow7);
listOutPut.Add(txtOutShow8);
listOutPut.Add(txtOutShow9);
listOutPut.Add(txtOutShow10);
listOutPut.Add(txtOutShow11);
listOutPut.Add(txtOutShow12);
listOutPut.Add(txtOutShow13);
listOutPut.Add(txtOutShow14);
listOutPut.Add(txtOutShow15);
while (btnOpenPort.Enabled == false)
{
HslCommunication.OperateResult<bool[]> read = busRtuClient.ReadCoil("0", 16);
bool[] readOutPut = read.Content;
for (int i = 0; i < listOutPut.Count; i )
{
//读取输出
listOutPut[i].BackColor = (readOutPut[i] == true ? Color.Lime : Color.Gray);
}
}
}
private void timerIOMoitor_Tick()
{
}
private void Form1_Load(object sender, EventArgs e)
{
//取消夸线程间的检查
Control.CheckForIllegalCrossThreadCalls = false;
//串口默认选COM4
cboRTUProtSelect.SelectedIndex = 3;
//校验位默认选ODD
cboRtuParity.SelectedIndex = 1;
//pictureBoxIN0.Image = Image.FromFile("灰色.png");
}
private void timerIOMoitor_Tick(object sender, EventArgs e)
{
}
private void btnRtuInputRead_bool_Click(object sender, EventArgs e)
{
// 离散输入读取
readResultRender(busRtuClient.ReadDiscrete(txtRtuRegisterAddress_Read.Text), txtRtuRegisterAddress_Read.Text, txtRtu_ReadData);
}
private void label9_Click(object sender, EventArgs e)
{
}
#region 单数据写入测试
private void btnWriteOutPut_Click(object sender, EventArgs e)
{
// bool写入
try
{
//writeResultRender(busRtuClient.WriteCoil(txtRtuRegisterAddress_Write.Text, bool.Parse(txtRtu_WriteData.Text)), txtRtuRegisterAddress_Write.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void btnShorWrite_Click(object sender, EventArgs e)
{
}
private void btnUshorWrite_Click(object sender, EventArgs e)
{
}
private void btnIntWrite_Click(object sender, EventArgs e)
{
}
private void btnUintWrite_Click(object sender, EventArgs e)
{
}
private void btnLongWrite_Click(object sender, EventArgs e)
{
}
private void btnDoubleWrite_Click(object sender, EventArgs e)
{
}
private void btnFloatWrite_Click(object sender, EventArgs e)
{
}
private void btnStringWrite_Click(object sender, EventArgs e)
{
}
#endregion
#region Write Coil
/// <summary>
/// 写一个线圈信息,指定是否通断
/// </summary>
/// <param name="address">起始地址</param>
/// <param name="value">写入值</param>
/// <returns>返回写入结果</returns>
//public OperateResult WriteCoil(string address, bool value)
//{
// // 解析指令
// // OperateResult<byte[]> command = BuildWriteOneCoilCommand(address, value);
// //if (!command.IsSuccess) return command;
// // 核心交互
// //return CheckModbusTcpResponse(command.Content);
//}
/// <summary>
/// 批量写入线圈信息,指定是否通断
/// </summary>
/// <param name="address">起始地址</param>
/// <param name="values">写入值</param>
/// <returns>返回写入结果</returns>
//public OperateResult WriteCoil(string address, bool[] values)
//{
// 解析指令
//OperateResult<byte[]> command = BuildWriteCoilCommand(address, values);
//if (!command.IsSuccess) return command;
// 核心交互
//return CheckModbusTcpResponse(command.Content);
//}
#endregion
}
}