摘 要:
C#通过ModbusTCP读取温度值。这里是Eric.Zhou的微信公众号“常州电气工程师”。
1. 软硬件版本
1.1. 温度传感器
1.1.1. 控制器硬件
1,带RS485通讯的温度传感器
2,艾莫迅RS485转以太网串口服务器RS485-ETH
1.2. 上位机
1.1.2. 普通电脑硬件
带有Windows系统的普通电脑,带有RJ45网口
1.1.3. C#开发软件
Visual Studio 2019 Community(免费)
2. 准备工作
2.1. 通讯接线与电源
温度传感器和串口服务器都是DC24V供电。串口服务器和电脑之间是网线相连。温度传感器黄线定义为A+接到串口服务器的A+,温度传感器绿线定义为B-接到串口服务器的B-。
2.2. IP地址设定
已知艾莫迅RS485-ETH串口服务器的默认IP地址是192.168.1.12,默认端口号是502。将普通电脑的IP地址设定为同网段的IP地址,比如192.168.1.10。
串口服务器,IP是在模块网页设置中对应修改,我们保持默认。
电脑的IP地址设定路径为:控制面板-->网络和共享中心-->以太网-->属性-->网络选项卡-->Internet协议版本4(TCP/IPv4)-->属性-->使用下面的IP地址(S)。
2.3. 温度值的Modbus地址
查阅带RS485通讯的温度传感器的资料,得知温度值的状态寄存器数据起始地址0,字节数2.
3. 编程操作
在C#中,编写一个画面,只含有一个Label控件。最终实现的效果是,这个Label实时显示当前温度。这里是Eric.Zhou的微信公众号“常州电气工程师”。
3.1. C#的编程
在C#中创建新项目,项目类型是Windows窗体应用(.Net Framework),语言为C#,Windows桌面应用。
在“解决方案资源管理器”中,右击新建的项目,右键快捷菜单中选中“管理NuGet程序包(N)...”
选中NModbus4版本为2.1.0,点击安装。NModbus4是一个开源、免费的.Net库,专门用于C#与Modbus通讯。
向C#界面,拖放1个Label控件。
为了让Label,循环扫描温度值,我们需要向C#界面,拖放一个定时器Timer。
在Form1.cs中,添加语句 using System.Net.Socket,这是一句命名空间引用指令,用于引入网络通信库,用于TCP/IP连接。添加语句using Modbus.Device.这句话很关键,引入了Modbus通讯库。用来发Modbus指令、读寄存器数据。
在public partial class Form1:Form { }中,写上TcpClient client这句话的意思是,声明了一个“TcpClient通信对象”的变量,给它取名字client。写上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.Net.Sockets;//TcpClinent命名空间
using Modbus.Device;
namespace Cpp用ModbusTCP读取温度值
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
TcpClient client;//全局变量,TCP客户端,负责网线通信
ModbusIpMaster master;//全局变量,Modbus主站,负责Modbus指令
private void Form1_Load(object sender, EventArgs e)//窗口一打开,就建立//ModbusTCP连接
{
client = new TcpClient("192.168.1.12", 502);//串口服务器的IP和端口号
master = ModbusIpMaster.CreateIp(client);//创建Modbus主站对象,绑定刚才<font face="新宋体">//</font>的<font face="新宋体">//</font>TCP连接
}
private void timer1_Tick(object sender, EventArgs e)
{
ushort[] inputs;//ushort是无符号16位整数
inputs = master.ReadHoldingRegisters(1,0,1);//第一位是Modbus从站站号,第//二//位是保持寄存器的地址,第三位是数据长度
double temp1 = Convert.ToDouble(inputs[0]);//把读到的ushort 类型 转成 浮点数 //double
double temp2 = temp1 / (double)10;
label1.Text = temp2.ToString();//把计算好的温度显示到窗口的label1 标签上。
}
}
}
3.2. 调试运行
点击菜单里的“启动”,即可运行程序。如果程序没有Bug,我们可以看到运行效果如下:
当按下“启动”按钮时,Label控件,实时显示当前温度。我们可以给温度传感器加热,观察当前温度的读数变化。