学习想法:开始学习Modbus RTU了,其实就是NModbus4的学习使用,目前先记录下通信连接的学习过程,后续学习到了再详细记录;
第一步:引入NModbus4类库
using Modbus.Device;
第二步:建立Form1界面,
GroupBox : GroupBox1-串口状态、GroupBox2-通讯信息;
Button : btConnect-启动连接、btMessageClear-清空;
ComboBox : cbxPort-串口号、cbxBaudRate-波特率、cbxDataBits-数据位、cbxParity-奇偶校验、
cbxStopBits-停止位;
TextBox : tbMessage-通讯信息;
串口号旁边的小红点是一个Button,用来做串口号搜索的指示,Lamp1-指示灯1
第二步:串口号搜索程序,利用定时器进行定时搜索,搜索到串口号后会添加到Combobox中
1)定义变量
#region 定义全局变量
//端口序号
private int m_comBoxNums = 0;
//串口实例
private SerialPort serialPort = new SerialPort();
//ModbusRTU主站字段
private static IModbusMaster master;
#endregion
2)添加timer1_Tick程序
private void timer1_Tick(object sender, EventArgs e)//定时刷新串口,获取端口号,指示灯闪烁
{
string Cur_PortName = cbxPort.Text;
try
{
string[] strName = null;
strName = SerialPort.GetPortNames();
if (m_comBoxNums != strName.Length)
{
m_comBoxNums = strName.Length;
cbxPort.Items.Clear();
cbxPort.Text = null;
for (int i = 0; i < m_comBoxNums; i++)//判断串口刷新后状态
{
if (strName[i] == Cur_PortName) { cbxPort.Text = Cur_PortName; }
cbxPort.Items.Add(strName[i]);
}
cbxPort.Text = strName[0];
serialPort.PortName = cbxPort.Text;
}
}
catch (Exception ex)
{
if (ex.Source != null)
{
}
}
if(Lamp1.BackColor == Color.Red)
{
Lamp1.BackColor = Color.Green;
}
else
{
Lamp1.BackColor = Color.Red;
}
}
3)使用虚拟串口驱动添加端口(因为现在使用的笔记本没有自带的串口,所以就使用虚拟串口驱动进行测试,也方便后续使用Modbus Slave测试)
第三步:ComboBox :cbxBaudRate-波特率、cbxDataBits-数据位、cbxParity-奇偶校验、cbxStopBits-停止位,信息的添加;
点击ComboBox右上角的小箭头,选择“编辑项”,把相应的数据添加到“字符串集合编辑器”中
1)波特率(300、600、1200、2400、4800、9600、14400、19200、38400、57600、115200、128000、256000)
2)数据位(7、8)
3)奇偶校验(Odd、Even、None)
4)停止位(One、Two)
第四步:添加窗口上电默认程序
private void Form1_Load(object sender, EventArgs e)//窗口加载
{
//窗口开启定时器默认打开
timer1.Enabled = true;
//设置默认选中项
cbxBaudRate.SelectedIndex = 5;
cbxDataBits.SelectedIndex = 1;
cbxParity.SelectedIndex = 1;
cbxStopBits.SelectedIndex = 0;
//通讯信息文本框清空
tbMessage.Text = "";
}
第五步:添加ComboBox选择数据方法,主要是奇偶校验和停止位,其他的直接获取后进行类型转换即可
1)奇偶校验
///
/// 获取窗体选中的奇偶校验
///
///
private Parity GetSelectedParity()
{
switch (cbxParity.SelectedItem.ToString())
{
case "Odd":
return Parity.Odd;
case "Even":
return Parity.Even;
case "None":
return Parity.None;
default:
return Parity.None;
}
}
2)停止位
///
/// 获取窗体选中的停止位
///
///
private StopBits GetSelectedStopBits()
{
switch (cbxStopBits.SelectedItem.ToString())
{
case "One":
return StopBits.One;
case "Two":
return StopBits.Two;
default:
return StopBits.One;
}
}
第六步:添加ShowMesage的方法,这个方法让我们更便捷的显示需要显示到消息框信息
void ShowMesage(string Mes)//通讯显示函数
{
string ch = "\r\n";
Mes += ch;
tbMessage.AppendText(Mes);
}
第七步:添加btConnect_Click启动连接程序,
private void btConnect_Click(object sender, EventArgs e)//启动连接
{
if (serialPort.IsOpen)
{
timer1.Enabled = true;
serialPort.Close();
btConnect.Text = "启动连接";
ShowMesage(serialPort.PortName.ToString() + ","
+ serialPort.BaudRate.ToString() + ","
+ serialPort.DataBits.ToString() + ","
+ serialPort.Parity.ToString() + ","
+ serialPort.StopBits.ToString() + ","
+ "通信已断开");
}
else
{
try
{
timer1.Enabled = false;
//创建Rtu主站
serialPort.PortName = cbxPort.SelectedItem.ToString();
serialPort.BaudRate = Convert.ToInt32(cbxBaudRate.SelectedItem);
serialPort.DataBits = Convert.ToInt32(cbxDataBits.SelectedItem);
serialPort.Parity = GetSelectedParity();
serialPort.StopBits = GetSelectedStopBits();
//创建ModbusRTU主站实例
master = ModbusSerialMaster.CreateRtu(serialPort);
serialPort.Open();
Lamp1.BackColor = Color.Green;
}
catch
{
btConnect.Text = "启动连接";
ShowMesage( serialPort.PortName.ToString()+ ","
+ serialPort.BaudRate.ToString() + ","
+ serialPort.DataBits.ToString() + ","
+ serialPort.Parity.ToString() + ","
+ serialPort.StopBits.ToString() + ","
+ "通信未建立");
return;
}
btConnect.Text = "断开连接";
ShowMesage(serialPort.PortName.ToString() + ","
+ serialPort.BaudRate.ToString() + ","
+ serialPort.DataBits.ToString() + ","
+ serialPort.Parity.ToString() + ","
+ serialPort.StopBits.ToString() + ","
+ "通信已建立");
}
}
第八步:添加Form1_FormClosing事件,在事件中添加窗口关闭时断开串口连接程序
private void Form1_FormClosing(object sender, FormClosingEventArgs e)//窗口关闭
{
try
{
if (serialPort.PortName != null)
{
serialPort.Close();
}
}
catch (Exception ex)
{
if (ex.Source != null)
{
}
}
}
第九步:添加btMessageClear_Click事件,用于消息框清空
private void btMessageClear_Click(object sender, EventArgs e)//消息框清空
{
tbMessage.Text = "";
}
***效果展示