摘 要:
C#通过ModbusRTU读取温度值。这里是Eric.Zhou的微信公众号“常州电气工程师”。
1. 软硬件版本
1.1. 温度传感器
1.1.1. 控制器硬件
1,带RS485通讯的温度传感器
2,RS232转RS485转换器
1.2. 上位机
1.1.2. 普通电脑硬件
带有Windows系统的普通电脑,带有RS232串口。
1.1.3. C#开发软件
Visual Studio 2019 Community(免费)
2. 准备工作
2.1. 通讯接线与电源
温度传感器DC24V供电。RS232转RS485转换器为电源适配器供电。温度传感器黄线定义为A+接到转换器的A+,温度传感器绿线定义为B-接到转换器的B-。
2.2. 温度值的Modbus地址
查阅带RS485通讯的温度传感器的资料,得知温度值的状态寄存器数据起始地址0,字节数2. 3. 编程操作
在C#中,编写一个画面,只含有一个Label控件。最终实现的效果是,这个Label实时显示当前温度。这里是Eric.Zhou的微信公众号“常州电气工程师”。
3.1. C#的编程
在C#中创建新项目,项目类型是Windows窗体应用(.Net Framework),语言为C#,Windows桌面应用。
在“解决方案资源管理器”中,右击新建的项目,右键快捷菜单中选中“管理NuGet程序包(N)...”
浏览,下面输入nmodbus4,选中NModbus4版本为2.1.0,点击安装。NModbus4是一个开源、免费的.Net库,专门用于C#与Modbus通讯。
浏览,下面输入System.IO.Ports,选中System.IO.Ports,点击安装。System.IO.Ports是官方的串口操作类库,让程序能直接调用串口功能,实现和硬件的Modbus RTU通信。
向C#界面,拖放1个Label控件。
为了让Label,循环扫描温度值,我们需要向C#界面,拖放一个定时器Timer。
定时器会自动每隔一段时间执行一次。
在Form1.cs中,添加语句using System.IO.Ports,这是串口必备的类库,这句话是告诉编译器,我要使用这个类库的串口功能了。添加语句using Modbus.Device.这句话很关键,引入了Modbus通讯库。用来发Modbus指令、读寄存器数据。先有串口功能,再谈Modbus。
使用Modbus 库,自动帮你组包、发送、解析 Modbus RTU 协议。(你不用自己写底层 0103 0000 0001 这种原始报文了)。
在public partial class Form1:Form { }中,写上SerialPort serial port这句话的意思是,声明了一个“串口”的变量,给它取名字serial port。写上ModbusIpMaster master这句话的意思是创建了一个Modbus主站对象。在窗口的属性页,事件选项卡中,行为-->有Load事件,双击Load,就可以跳转到窗口载入事件的代码。同样路径,有FormClosing事件,双击FormClosing,就可以跳转到窗口关闭事件的代码。
双击timer1,进入timer1的定时事件。将timer1属性的Enabled设置为True。
Form1.cs的全部代码如下:
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 System.IO.Ports;//包含类库。串口通信用(操作COM口)
using Modbus.Device;//包含类库。Modbus协议(发送/解析Modbus指令)
namespace CPP视频讲解_Modbus_RTU通讯
{
public partial class Form1 : Form//窗口类
{
SerialPort serialport;//串口对象,用于打开串口等
Modbus.Device.ModbusSerialMaster master;//Modbus主站对象,发送Modbus指令(读保持寄//存器等)
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
serialport = new SerialPort("COM1",9600,Parity.None,8,StopBits.One); //串口号,波特率等
serialport.Open();//打开串口,准备通信
master = Modbus.Device.ModbusSerialMaster.CreateRtu(serialport);//把串口交给Modbus库管理
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
serialport.Close();//窗口关闭时,关闭串口,释放资源
}
private void timer1_Tick(object sender, EventArgs e)
{
ushort[] inputs;
inputs= master.ReadHoldingRegisters(1,0,1);//第一位是Modbus从站站号,第二位//是保持寄存器的地址,第三位是该保持寄存器数值的长度
double temp1 = Convert.ToDouble(inputs[0]);
double temp2 = temp1 / (double)10;//读取到的数值,除以10
label1.Text = temp2.ToString();//读值显示到标签
}
}
}
3.2. 调试运行
点击菜单里的“启动”,即可运行程序。如果程序没有Bug,我们可以看到运行效果如下:
当按下“启动”按钮时,Label控件,实时显示当前温度。我们可以给温度传感器加热,观察当前温度的读数变化。