首页 > 编程语言 >转载C#五大通信库,来源CSDN

转载C#五大通信库,来源CSDN

时间:2023-12-25 09:01:03浏览次数:46  
标签:case ModbusLib return C# modbusLib 通信 break CSDN 转载

关于ModbusTCP通信的内容。

五大通信库:Modbus
前记
本文主要以C#作为编程语言,结合目前市场上常用的5种通信库,分别与台达DVP-32 PLC进行通信研究,并对研究的结论进行分享。

通信库简介
一、EasyModbus

简介:EasyModbus支持Modbus TCP, Modbus UDP and Modbus RTU,开源协议为MIT。

二、SharpModbus

简介:SharpModbus是一个开源的Modbus工具,支持ModbusTCP与ModbusRTU,开源协议为MIT。

三、NModbus4

简介:NModbus4是一个开源的Modbus通信库,开源协议为MIT。

四、HslCommunication

简介:HslCommunication是一个商业通信库,涵盖各种不同设备的通信。

五、xktComm

简介:xktComm是一个商业通信库,涵盖西门子、欧姆龙、三菱、基恩士等PLC,也支持Modbus及OPC通信。

通信库开发
针对各种库创建了一个枚举类型:
public enum ModbusLib
{
EasyModbus,
SharpModbus,
NModbus4,
hslCommunication,
xktComm
}

针对每个库创建一个通信对象:
//创建对象

    //EasyModbus
    private ModbusClient easyModbus = new ModbusClient();

    //SharpModbus
    private ModbusMaster sharpModbus;

    //NModbus4
    private ModbusIpMaster nModbus;

    //HslCommunication
    private ModbusTcpNet hsl;

    //xktComm
    private ModbusTcp xktModbus = new ModbusTcp();

针对各个库实现连接方法:
private bool Connect(ModbusLib modbusLib)
{
try
{
switch (modbusLib)
{
case ModbusLib.EasyModbus:
easyModbus.Connect(ipAddress, port);
break;
case ModbusLib.SharpModbus:
sharpModbus = ModbusMaster.TCP(ipAddress, port);
break;
case ModbusLib.NModbus4:
TcpClient tcpClient = new TcpClient();
tcpClient.Connect(ipAddress, port);
nModbus = ModbusIpMaster.CreateIp(tcpClient);
break;
case ModbusLib.hslCommunication:
hsl = new ModbusTcpNet(ipAddress, port);
return hsl.ConnectServer().IsSuccess;
case ModbusLib.xktComm:
return xktModbus.Connect(ipAddress, port);
default:
break;
}
}
catch (Exception)
{
return false;
}
return true;
}
针对各个库实现断开连接方法
private void DisConnect(ModbusLib modbusLib)
{
switch (modbusLib)
{
case ModbusLib.EasyModbus:
easyModbus.Disconnect();
break;
case ModbusLib.SharpModbus:
sharpModbus.Dispose();
break;
case ModbusLib.NModbus4:
nModbus.Dispose();
break;
case ModbusLib.hslCommunication:
hsl.ConnectClose();
break;
case ModbusLib.xktComm:
xktModbus.DisConnect();
break;
default:
break;
}
}
针对各个库实现一个读取变量的方法:
public bool ReadSingleReg(ModbusLib modbusLib)
{
try
{
switch (modbusLib)
{
case ModbusLib.EasyModbus:
return easyModbus.ReadHoldingRegisters(0, 1).Length == 1;
case ModbusLib.SharpModbus:
return sharpModbus.ReadHoldingRegisters(1, 0, 1).Length == 1;
case ModbusLib.NModbus4:
return nModbus.ReadHoldingRegisters(0, 1).Length == 1;
case ModbusLib.hslCommunication:
return hsl.ReadInt16("0").IsSuccess;
case ModbusLib.xktComm:
return xktModbus.ReadKeepReg(0, 1).Length == 2;
default:
return false;
}
}
catch (Exception)
{
return false;
}
}
通信功能开发
由于每个库实现的功能都一样,所以开发了一个控件,将相关接口预留出来,后续直接调用即可。

控件提供了启动(Start)、停止(Stop)事件,提供了Modbus库类型,可以选择设置,也可以通过属性对通信结果和耗时时间进行赋值。
使用也非常简单,直接拖到界面上,设置好库类型,绑定上Start和Stop事件即可。
测试的核心代码如下:
private void modbusCtl1_Start(object sender, EventArgs e)
{
if (sender is ModbusCtl control)
{
ModbusLib modbusLib = control.ModbusType;
if (Connect(modbusLib))
{
cts = new CancellationTokenSource();
stopwatch.Restart();
int successCount = 0;//成功次数
int totalCount = 0;//总次数
Task.Run(() =>
{
while (!cts.IsCancellationRequested)
{
if (ReadSingleReg(modbusLib))
{
successCount++;
}
totalCount++;
if (successCount != 0 && totalCount != 0)
{
control.Result = successCount.ToString() + "/" + totalCount.ToString();
control.CommRate = stopwatch.ElapsedMilliseconds / successCount;
}
}
}, cts.Token);
cts.Token.Register(() =>
{
stopwatch.Stop();
Thread.Sleep(100);
DisConnect(modbusLib);
});
}
}
}

原作者地址:https://blog.csdn.net/ken2232/article/details/132623906

标签:case,ModbusLib,return,C#,modbusLib,通信,break,CSDN,转载
From: https://www.cnblogs.com/sumingboke/p/17925243.html

相关文章

  • .Net Core 实现 自定义Http的Range输出实现断点续传或者分段下载
    一、Http的Range请求头,结合相应头Accept-Ranges、Content-Range可以实现如下功能:1.断点续传。用于下载文件被中断后,继续下载。2.大文件指定区块下载,如视频、音频拖动播放,直接定位到指定位置下载内容。可以避免每次都读取、传输整个文件,从而提升服务端性能。3.大文件分包批量下......
  • numpy、scipy、pandas、matplotlib的读书报告
    1、NumpyNumPy(NumericalPython)是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy是一个运行速度非常快的数学库,主要用于数组计算,包含:一个强大的N维数组对象ndarray。广播功能函数。整合C/C++/Fortran代码......
  • codeforces刷题(1100):1907C_div3
    C、RemovalofUnattractivePairs跳转原题点击此:该题地址1、题目大意  给定一个字符串,可以删除相邻的两个不相等的字符。问你删除后能得到最小的字符串长度为多少。2、题目解析  因为只要两个不相等的字符相邻就能消除,所以只需要找到数量最多的字符,只要它的数量比其它字......
  • ThreadLocal是什么?有哪些应用场景?
    大家好,我是joker,希望你快乐。多线程情况下操作共享变量会产生线程安全问题,需要进行线程间同步,但是并不是所有的情况都是多线程去操作共享变量,有些线程是无状态的只进行操作处理,不涉及共享数据操作,所以就需要threadlocal登场了。threadlocal是什么?threadlocal根据命名来看,分为两......
  • 【STL】 vector
    #include<vector>连续的顺序的储存结构(和数组一样的类别),但是有长度可变的特性。构造vector<类型>arr(长度,[初值])时间复杂度:O(n)常用的一维和二维数组构造示例,高维也是一样的(就是会有点长)。vector<int>arr;//构造int数组vector<int>arr(100);//构造初......
  • Cesium基础入门教程
    Cesium中的坐标系以及坐标转换Cesium中常用的坐标Cesium中坐标转换经纬度坐标转换成世界坐标两种方式将经纬度转换成世界坐标1.直接转换varcartesian3=Cesium.Cartesian3.fromDegrees(lng,lat,height);2.借助ellipsoid对象,先转换成弧度再进行转换varcartograp......
  • 系统架构设计面试指南(01)-微服务和CAP
    系统设计是定义满足特定需求的系统的架构、接口和数据的过程。系统设计通过协同和高效的系统满足您的业务或组织需求。一旦业务或组织确定了其需求,就可以开始构建一个将这些需求融入物理系统设计的过程,以满足客户的需求。您设计系统的方式将取决于您是选择自定义开发、商业解决方案......
  • mac zsh: command not found: python
    前言在mac上安装python后,会自动在.zprofile文件中,加入:#SettingPATHforPython3.12#Theoriginalversionissavedin.zprofile.pysavePATH="/Library/Frameworks/Python.framework/Versions/3.12/bin:${PATH}"exportPATH此时,python-V,还是会报错zsh:comman......
  • 『LeetCode』8. 字符串转换整数 (atoi) String to Integer (atoi)
    题目描述请你来实现一个myAtoi(strings)函数,使其能将字符串转换成一个32位有符号整数(类似C/C++中的atoi函数)。函数myAtoi(strings)的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。确定最终结果是负数还是正......
  • 机器学习-无监督机器学习-密度聚类DBSCAN-19
    目录1.DBSCAN2.OPTICS2.MeanShift1.DBSCANDensitybasedclusteringDBSCAN不要求我们指定cluster簇的数量,避免了异常值,并且在任意形状和大小的cluster簇中工作得非常好。它没有质心,聚类簇是通过将相邻的点连接在一起的过程形成的。超参数:Epsilon(ɛ):设置的最大半径。最......