C# ModBus 读取数据
简单介绍:
项目上需要与多家公司做接口对接。我们提供接口的有,其他公司提供的接口也有。所有的接口全部对接完了,遇到一个非常棘手的问题,需要获取甲方船厂设备上的状态,就给了一个文档,文档上写了IP、端口、协议、一些地址,没有API文档,拿到手上一面懵逼,这怎么玩儿。。。。
文档如下:

百度百科:
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
看上去好像跟Socket差不多,本身又不是工业领域出身的,大概知道是一种工业领域通用的一套通信标准,下面直接上DEMO示例
第一步:下载类库
使用的类库已上传百度云盘:

链接:https://pan.baidu.com/s/1JtaGC0r17jjnQPMhkMKRJg
提取码:wagl
第二步:引入类库

第三步:引入命名空间
using HslCommunication.ModBus;
using HslCommunication;
第四步:初始化对象
初始化方式一、
private ModBusTcpClient busTcpClient = new ModBusTcpClient("192.168.1.195", , 0xFF); // ip、端口、站号(默认为0xFF) 初始化方式二、
private ModBusTcpClient busTcpClient = new ModBusTcpClient("192.168.1.195"); // 端口号502,站号0
第五步:开启连接
开启连接:
busTcpClient.ConnectServer(); 关闭连接:
busTcpClient.ConnectClose( );
第六步:读写操作
private void userButton30_Click(object sender, EventArgs e)
{
// 读取操作
bool coil100 = busTcpClient.ReadCoil("").Content; // 读取线圈100的通断
short short100 = busTcpClient.ReadInt16("").Content; // 读取寄存器100的short值
ushort ushort100 = busTcpClient.ReadUInt16("").Content; // 读取寄存器100的ushort值
int int100 = busTcpClient.ReadInt32("").Content; // 读取寄存器100-101的int值
uint uint100 = busTcpClient.ReadUInt32("").Content; // 读取寄存器100-101的uint值
float float100 = busTcpClient.ReadFloat("").Content; // 读取寄存器100-101的float值
long long100 = busTcpClient.ReadInt64("").Content; // 读取寄存器100-103的long值
ulong ulong100 = busTcpClient.ReadUInt64("").Content; // 读取寄存器100-103的ulong值
double double100 = busTcpClient.ReadDouble("").Content; // 读取寄存器100-103的double值
string str100 = busTcpClient.ReadString("", ).Content;// 读取100到104共10个字符的字符串 // 写入操作
busTcpClient.WriteCoil("", true);// 写入线圈100为通
busTcpClient.Write("", (short));// 写入寄存器100为12345
busTcpClient.Write("", (ushort));// 写入寄存器100为45678
busTcpClient.Write("", );// 写入寄存器100-101为123456789
busTcpClient.Write("", (uint));// 写入寄存器100-101为123456778
busTcpClient.Write("", 123.456);// 写入寄存器100-101为123.456
busTcpClient.Write("", 12312312312414L);//写入寄存器100-103为一个大数据
busTcpClient.Write("", 12634534534543656UL);// 写入寄存器100-103为一个大数据
busTcpClient.Write("", 123.456d);// 写入寄存器100-103为一个双精度的数据
busTcpClient.Write("", "K123456789"); }
项目界面:

完整代码(粗略写了DEMO,有不规范的地方,大佬莫怪):
using System;
using System.Windows.Forms;
using HslCommunication.ModBus;
using HslCommunication; namespace ModbusDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 初始化类
/// </summary>
private ModbusTcpNet busTcpClient =null;
/// <summary>
/// 监听状态
/// </summary>
private bool IsEnable = false;
private void Form1_Load(object sender, EventArgs e)
{
txtPort.Text = "";
txtIp.Text = "172.30.16.220";
textBox2.Text = "";
}
/// <summary>
/// 开启服务
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button5_Click(object sender, EventArgs e)
{
try
{
if (IsEnable)
{
MessageBox.Show("请勿重复建立连接!");
return;
}
string ip = txtIp.Text.Trim();
int port = Convert.ToInt32(txtPort.Text);
if (ip==null || ip=="")
{
MessageBox.Show("ip不能为空!");
return;
}
busTcpClient = new ModbusTcpNet(ip, port, 0x01);
OperateResult res = busTcpClient.ConnectServer();
if (res.IsSuccess==true) //接收状态返回值
{
IsEnable = true;
MessageBox.Show("开启连接成功");
}
else
{
MessageBox.Show("开启连接失败");
}
}
catch (Exception ex)
{
MessageBox.Show("开启连接失败!", ex.Message.ToString());
}
}
private void Button6_Click(object sender, EventArgs e)
{
try
{
if (!IsEnable)
{
MessageBox.Show("尚未建立连接!");
return;
}
busTcpClient.ConnectClose();
IsEnable = false;
MessageBox.Show("关闭连接成功!");
}
catch (Exception ex)
{
MessageBox.Show("关闭连接失败!", ex.Message.ToString());
}
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Application.Exit();
} private void Button3_Click(object sender, EventArgs e)
{
try
{
if (!IsEnable)
{
MessageBox.Show("尚未建立连接!");
return;
}
if (busTcpClient == null)
{
MessageBox.Show("尚未初始化对象!");
return;
}
string txt = textBox2.Text.Trim();
if (txt=="")
{
MessageBox.Show("地址不能为空!");
return;
}
bool coil100 = busTcpClient.ReadCoil(txt).Content; // 读取线圈100的通断
textBox1.Text = "";
MessageBox.Show("监听成功!");
textBox1.Text = coil100 == true ? "true" : "false";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
}
}
项目:
链接:https://pan.baidu.com/s/1a3pnftQ2QAZFJcoKl9p_qQ
提取码:rhsl
C# ModBus 读取数据的更多相关文章
- Modbus通用数据读取工具设计及使用
一.公共功能码定义 二.能读取的数据类型 1.bit类型,比如01功能码,读到的就是位的状态,是ON 还是OFF,也就是对应着0或1. 2.byte类型,比如03功能码. 3.short类型,比如03 ...
- 20170222==(MODBUS读取多个寄存器)
MODBUS读取多个寄存器(功能码04) 为了简单我这里只用4个寄存器,当让你也可以用125个寄存器,但是最多也只能用125个寄存器的.每个寄存器有上面的表知道为一个字的大小即2个字节或者叫16比特位 ...
- modbus tcp数据报文结构
modbus tcp数据报文结构 请求:00 00 00 00 00 06 09 03 00 00 00 01 响应:00 00 00 00 00 05 09 03 02 12 34 一次modbus ...
- struts2中从后台读取数据到<s:select>
看到网上好多有struts2中从后台读取数据到<s:select>的,但都 不太详细,可能是我自己理解不了吧!所以我自己做了 一个,其中可能 有很多不好的地方,望广大网友指出 结果如图 p ...
- [MVC4]ASP.NET MVC4+EF5(Lambda/Linq)读取数据
继续上一节初始ASP.NET MVC4,继续深入学习,感受了一下微软的MVC4+EF5(EntityFramework5)框架的强大,能够高效的开发出网站应用开发系统,下面就看一下如何用MVC4+EF ...
- ubuntu server 12.04U盘安装,提示无法挂载安装光盘或光盘读取数据出错
今天用Ultraiso将Ubuntu server 12.04 刻入U盘中安装系统,中间提示错误:1.检测不到cdrom(即U盘没有挂载上):2.从光盘中读取数据出错.问题如下图所示: 上网搜了下解决 ...
- MySQL数据库中tinyint类型字段读取数据为true和false
今天遇到这么一个问题,公司最近在做一个活动,然后数据库需要建表,其中有个字段是关于奖励发放的状态的字段,结果读取出来的值为true 一.解决读取数据为true/false的问题 场景: 字段:stat ...
- My Game --文件读取数据
My Game --线段数据 中说到背景的绘制由贝赛尔曲线生成线段,用 DrawNode 画多边形,同时一张背景有两座山,一座山有两条以上贝赛尔曲线保存,用了嵌套的数据类:Bezier,LineLay ...
- Java—从文件中读取数据
1.FileInputStream() // 构建字节输入流对象,参数为文件名 FileInputStream fin = new FileInputStream("message" ...
随机推荐
- 爬虫之突破xm-sign校验反爬
喜马拉雅 网页分析 - 打开我们要爬取的音乐专辑https://www.ximalaya.com/ertong/424529/ - F12打开开发者工具 - 点击XHR 随便点击一首歌曲会看到存储所有 ...
- 入职两个月,WPF开发感想
1 .新工作,新开始 2.WPF初次接触以及学习MVVM开发模式 3.后台数据操作,ORACLE 存储过程(边做边学) 4.总结 4.1工作开发中的小问题 ,遇到的坑: 4.2 解决的问题,学校到的 ...
- Spark Week1 HomeWork
package wikipedia import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org. ...
- [leetcode] 21. Merge Two Sorted Lists (Easy)
合并链表 Runtime: 4 ms, faster than 100.00% of C++ online submissions for Merge Two Sorted Lists. class ...
- [virtualenvwrapper] 命令小结
创建环境 mkvirtualenv env1 mkvirtualenv env2 环境创建之后,会自动进入该目录,并激活该环境. 切换环境 workon env1 workon env2 列出已有环境 ...
- Spring Cloud Config 实现配置中心,看这一篇就够了
Spring Cloud Config 是 Spring Cloud 家族中最早的配置中心,虽然后来又发布了 Consul 可以代替配置中心功能,但是 Config 依然适用于 Spring Clou ...
- Git的一些简单而且常用的操作
转载自我自己的博客 介绍 很多初学者可能并不太清楚Git 与GitHub 这两个概念的联系和区别,在这里我大致介绍一下这两个名词. Git 是一个免费.开源的分布式版本控制系统(VCS).版本控制系统 ...
- Git学习(二):Git的初步使用
一.Git的最小配置 1.使用如下命令创建Git的用户名和邮箱,如下所示: $git config --global user.name 'your_name' $git config --globa ...
- Nginx配置安装(Mac)
我用到的安装工具是:homebrew 真的很方便! 步骤1: 打开终端,输入 brew info nginx结果:我们可以看到,nginx在本地还未安装(Not installed),nginx的来源 ...
- 自定义SWT控件一之自定义单选下拉框
一.自定义下拉控件 自定义的下拉框,是自定义样式的,其中的下拉框使用的是独立的window,非复选框的下拉框双击单机其它区域或选择完之后,独立window构成的下拉框会自动消失. package co ...