『7x24小时有问必答』
  要:
C#通过ModbusRTU读取温度值。这里是Eric.Zhou的微信公众号“常州电气工程师”。

1.  硬件版本

1.1.  温度传感器

1.1.1.  控制器硬件

1,RS485通讯的温度传感器
2,RS232RS485转换器

1.2.  上位机

1.1.2.  普通电脑硬件

带有Windows系统的普通电脑,带有RS232串口。

1.1.3.  C#软件

Visual Studio 2019 Community(免费)

2.  准备工作

2.1.  通讯接线与电源

温度传感器DC24V供电。RS232RS485转换器为电源适配器供电。温度传感器黄线定义为A+接到转换器的A+,温度传感器绿线定义为B-接到转换器的B-
1.png
2.2.  温度值的Modbus地址
查阅带RS485通讯的温度传感器的资料,得知温度值的状态寄存器数据起始地址0,字节数2.
2.png
3.  编程操作
C#中,编写一个画面,只含有一个Label控件。最终实现的效果是,这个Label实时显示当前温度。这里是Eric.Zhou的微信公众号“常州电气工程师”。
3.png
3.1.  C#编程
C#中创建新项目,项目类型是Windows窗体应用(.Net Framework),语言为C#Windows桌面应用。
4.png
“解决方案资源管理器”中,右击新建的项目,右键快捷菜单中选中“管理NuGet程序包(N)...
5.png
浏览,下面输入nmodbus4,选中NModbus4版本为2.1.0,点击安装。NModbus4是一个开源、免费的.Net库,专门用于C#Modbus通讯。
6.png
浏览,下面输入System.IO.Ports,选中System.IO.Ports,点击安装。System.IO.Ports是官方的串口操作类库,让程序能直接调用串口功能,实现和硬件的Modbus RTU通信。
7.png
C#界面,拖放1Label控件。
8.png
为了让Label,循环扫描温度值,我们需要向C#界面,拖放一个定时器Timer
9.png
10.png
定时器会自动每隔一段时间执行一次。
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
11.png
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控件,实时显示当前温度。我们可以给温度传感器加热,观察当前温度的读数变化。
12.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码