前言
参考来源:
基于Winform的NModbus4通信库解析与应用
网口通讯与串口通讯(内含代码)
环境:Visual Sudio2022 .Net FrameWork 4.7.2
一、基础了解
1. Modbus
Modbus 1979年,是第一个真正用于现场的通用语言。成为了个通讯标准。
是应用层的报文传输协议,有RTU、ASCII和TCP三种通讯协议
通讯方式
通信方式:串口、网口。【详情见:网口通讯与串口通讯(内含代码)】
区别:
串口通信需要设置:串口号、波特率、奇偶校验位、停止位。
网口通信需要设置:IP地址、端口。
存储区
- 存储区:输出线圈、输入线圈、输出寄存器、输入寄存器
线圈可以理解为一个位bit,那么这个存储区可以认为:存放的是bool型数据才用线圈。 - 存储区范围:5位(标准地址) 和 6位(拓展地址)
- 5位:Xxxxx 范围: X0001 - X9999
- 6位:Xxxxxx 范围:X00001 - X65536
Modbus功能码
- 功能码是用来标记是哪种动作,读取的是那部分区域。
2. Modbus RTU通信协议
- 遵从的报文格式:【RYU / ASCII】
从站地址(设备编号)+功能码+数据+校验
1byte +1byte+N byte + 2byte - 从站地址:区分是谁
- 功能码:指定做什么事
- 数据:具体的细节
- 校验:验证数据。
二、示例连接Modbus
下面是下载使用了NModbus4依赖包。
采用了winform框架。里面使用了timer定时器,两个文本框Label。
TcpClient tcp = new TcpClient();
private IModbusMaster master;
public ushort[] aa(ushort add, ushort length)
{
ushort[] a = null;
Task.Run(() =>
{
do
{
try
{
if (!tcp.Connected)
{
tcp.Connect("192.168.1.200", 502);
master = ModbusIpMaster.CreateIp(tcp);
}
a = master.ReadHoldingRegisters(1, add, length);
}
catch (Exception ex)
{
tcp.Close();
Thread.Sleep(10);
tcp = new TcpClient();
}
} while (a == null);
}).Wait(100); // 超过100ms没执行完,就不等待了,可能是网线掉了。
return a;
}
private void timer1_Tick(object sender, EventArgs e)
{
ushort[] a = aa(1000, 4);
if(a != null)
{
label1.Test = a[0].ToString();
}
else
{
label1.Text = "xxxx";
num++;
label2.Text = num.ToString();
}
}
更新时间
- 2024.07.18