简单介绍:

  项目上需要与多家公司做接口对接。我们提供接口的有,其他公司提供的接口也有。所有的接口全部对接完了,遇到一个非常棘手的问题,需要获取甲方船厂设备上的状态,就给了一个文档,文档上写了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 读取数据的更多相关文章

  1. Modbus通用数据读取工具设计及使用

    一.公共功能码定义 二.能读取的数据类型 1.bit类型,比如01功能码,读到的就是位的状态,是ON 还是OFF,也就是对应着0或1. 2.byte类型,比如03功能码. 3.short类型,比如03 ...

  2. 20170222==(MODBUS读取多个寄存器)

    MODBUS读取多个寄存器(功能码04) 为了简单我这里只用4个寄存器,当让你也可以用125个寄存器,但是最多也只能用125个寄存器的.每个寄存器有上面的表知道为一个字的大小即2个字节或者叫16比特位 ...

  3. 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 ...

  4. struts2中从后台读取数据到<s:select>

    看到网上好多有struts2中从后台读取数据到<s:select>的,但都 不太详细,可能是我自己理解不了吧!所以我自己做了 一个,其中可能 有很多不好的地方,望广大网友指出 结果如图 p ...

  5. [MVC4]ASP.NET MVC4+EF5(Lambda/Linq)读取数据

    继续上一节初始ASP.NET MVC4,继续深入学习,感受了一下微软的MVC4+EF5(EntityFramework5)框架的强大,能够高效的开发出网站应用开发系统,下面就看一下如何用MVC4+EF ...

  6. ubuntu server 12.04U盘安装,提示无法挂载安装光盘或光盘读取数据出错

    今天用Ultraiso将Ubuntu server 12.04 刻入U盘中安装系统,中间提示错误:1.检测不到cdrom(即U盘没有挂载上):2.从光盘中读取数据出错.问题如下图所示: 上网搜了下解决 ...

  7. MySQL数据库中tinyint类型字段读取数据为true和false

    今天遇到这么一个问题,公司最近在做一个活动,然后数据库需要建表,其中有个字段是关于奖励发放的状态的字段,结果读取出来的值为true 一.解决读取数据为true/false的问题 场景: 字段:stat ...

  8. My Game --文件读取数据

    My Game --线段数据 中说到背景的绘制由贝赛尔曲线生成线段,用 DrawNode 画多边形,同时一张背景有两座山,一座山有两条以上贝赛尔曲线保存,用了嵌套的数据类:Bezier,LineLay ...

  9. Java—从文件中读取数据

    1.FileInputStream() // 构建字节输入流对象,参数为文件名 FileInputStream fin = new FileInputStream("message" ...

随机推荐

  1. 洛谷 P2671 求和

    题目描述 一条狭长的纸带被均匀划分出了nn个格子,格子编号从11到nn.每个格子上都染了一种颜色color\_icolor_i用[1,m][1,m]当中的一个整数表示),并且写了一个数字number\ ...

  2. UVA10071 Back to High School Physics:题解

    题目链接:https://www.luogu.org/problemnew/show/UVA10071 题意简叙: 粒子从0速度提速到t时速度为v,求出2*t时所运动的距离 分析: 这道题是一道物理题 ...

  3. 【CYH-02】noip2018数论模拟赛:比赛通知栏

    鉴于公开赛有时可能无法更改比赛描述呢... 所以我们准备在这里(和团队宣言里)发布一些比赛公告. 请及时关注

  4. 个人永久性免费-Excel催化剂功能第58波-批量生成单选复选框

    插件的最大威力莫过于可以把简单重复的事情批量完全,对日常数据采集或打印报表排版过程中,弄个单选.复选框和用户交互,美观的同时,也能保证到数据采集的准确性,一般来说用原生的方式插入单选.复选框,操作繁琐 ...

  5. git学习 c的某位老哥的,(侵删)

    Git命令行基本操作 安装Git 网上有很多Git安装教程,如果需要图形界面,windows下建议使用TortoiseGit,linux建议使用Git GUI或者GITK. Git基本配置 git c ...

  6. php_review_day1

    php中的小知识点(小白笔记整理):-----------------------------------------------------读取本地文件内的数据: file_get_contents ...

  7. Go语言圣经习题练习_1.5. 获取URL

    练习 1.7: 函数调用io.Copy(dst, src)会从src中读取内容,并将读到的结果写入到dst中,使用这个函数替代掉例子中的ioutil.ReadAll来拷贝响应结构体到os.Stdout ...

  8. GCD和扩展GCD

    gcd(a, b)用于求解自然数a,b的最大公约数 int gcd(int a, int b) { ) return a; return gcd(b, a%b); } extgcd(a, b, x, ...

  9. 动态规划_Apple Catching_POJ-2385

    It and ) in his field, each full of apples. Bessie cannot reach the apples when they are on the tree ...

  10. React入门理解demo

    1.React文档结构 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...