实例介绍
【实例简介】已经验证可以和支持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
}
}
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


支持(0) 盖楼(回复)