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" ...
随机推荐
- 微信小程序开发--组件(5)
一.editor 富文本编辑器,可以对图片.文字进行编辑. 编辑器导出内容支持带标签的 html和纯文本的 text,编辑器内部采用 delta 格式进行存储. 通过setContents接口设置内容 ...
- 【朝花夕拾】Android自定义View篇之(十一)View的滑动,弹性滑动与自定义PagerView
前言 由于手机屏幕尺寸有限,但是又经常需要在屏幕中显示大量的内容,这就使得必须有部分内容显示,部分内容隐藏.这就需要用一个Android中很重要的概念——滑动.滑动,顾名思义就是view从一个地方移动 ...
- vbox 设置时间不与主机同步
C:\Users\2345-lp0395>"D:\Program Files\Oracle\VirtualBox\VBoxManage.exe" setexadata win ...
- MFC开发--截图工具
近期学习了MFC的相关知识,MFC(Microsoft Foundation Classes)是微软公司提供的一个类库,可以这样简单理解,就是对于Win32的封装(MFC对windows API函数的 ...
- ctrl shift o失效
是这样的.preference -> general -> keys ,找到Organize Imports ,然后 在 “WHEN”里面 要选择 Editing JAVA SOURCE. ...
- Excel催化剂开源第20波-条件格式版聚光灯功能,行列标示方便阅读
Excel聚光灯功能,辅助数据查看,选择区域下的高亮显示所在行列位置,此功能已被广大Excel开发者研究得十分透彻,各种版本的聚光灯流转在网络里,同样地也是一大堆的VBA代码,难找.Net的现成代码, ...
- HTML介绍和标签
1.HTML介绍 1.概述 html不是一种编程语言,是一种描述性的标记语言,用于描述超文本内容的显示方式.比如字体,颜色,大小等. 超文本:音频,视频,图片称为超文本. 标记:<英文单词或者字 ...
- linux初学者-磁盘阵列篇
linux初学者-磁盘阵列篇 在磁盘的使用中,有时候需要提高磁盘的读写数据速度,就要用到磁盘组——raid,也就是磁盘阵列. 磁盘阵列是由最少两块以上的磁盘组成的,raid有许多模式,在这里将介绍其中 ...
- SSM - Mybatis SQL映射文件
MyBatis 真正的力量是在映射语句中.和对等功能的jdbc来比价,映射文件节省很多的代码量.MyBatis的构建就是聚焦于sql的. sql映射文件有如下几个顶级元素:(按顺序) cache配置给 ...
- web设计之无懈可击
无懈可击的web设计旨在尽可能地考虑页面元素在各个情况下都能够呈现最好的效果. 1. 思路总览 2. 灵活的文字 3. 可伸缩的导航栏 4. 可扩展的行 5. 自由的框式组件 6. 图片/标题/说明文 ...