目录
前言
官方文档:
HslCommunication的在线文档
额外参考文章:
VS使用Nuget教程详解 Visual studio 安装第三方的组件库
自己学了如何用S7.Net链接PLC后,公司领导希望我会用HslCommunication库链接PLC。所以,学的快的永远有活做啊。。。
一、相关基础知识铺路
1. HslCommunication
- 它是个通讯库,内部有很多链接方式,不只是可以连接西门子的产品。【但我目前用西门子做记录】
- 需要掌握一定的C#编程能力
2. NuGet
- 具体参考这篇博客写的内容:VS使用Nuget教程详解 Visual studio 安装第三方的组件库
二、实际链接操作
Step1. 安装HslCommunication
方法1:
方法2:
Install-Package HslCommunication
Step2. 引入空间名
using HslCommunication;
using HslCommunication.Profinet.Siemens;
Step3. 调用编写方法
我个人是喜欢单独创建个Manager文件夹,在这个文件夹中创建个EquipConrolManager这个类,对连接和连接后的读取方法进行管理。
在这个EquipControlManager.cs这个类中引入Hsl的空间名后,创建个连接方法,在这个连接方法中进行连接。
using HslCommunication;
using HslCommunication.Profinet.Siemens;
private SiemensS7Net Plc = null;
/// <summary>
/// 连接PLC
/// </summary>
/// <param name="ipAddress"></param>
/// <param name="cpuType"></param>
/// <returns></returns>
public string ConnectPLC(string ipAddress, string cpuType)
{
try
{
SiemensPLCS siemensPLCS = (SiemensPLCS)Enum.Parse(typeof(SiemensPLCS), cpuType);
Plc = new SiemensS7Net(siemensPLCS, ipAddress);
return "连接成功";
}
catch (Exception ex)
{
return $"连接失败,{ex.Message}";
}
}
由于我创建的界面【如下图所示】中,ipAddress和cpuType都是通过文本框来传递的,也就是获得的是string类型的数据,所以上面的代码中要将string的cpuType进行转换为SiemensPLCS类型,这是应为SiemensS7Net的cpuType参数的类型就是SiemensS7Net。
三、读取操作
1. 注意
- Hsl的方式进行读取数据的方式,是直接通过DW0,DB
2. OperateResult泛型
以ReadBool()为例,其原本定义为:
OperateResult< bool> ReadBool(string address){……};
返回类型是OperateResult< T >
那么使用ReadBool函数时,需要用个OperateResult< bool>类型的变量接收。例如:
OperateResult<bool> result = ReadBool("地址");
那么此时该如何获取这个bool值呢?需要通过result.Content
属性来实现
bool value = result.Content;
补充下,更常见的写法,是要结合result.IsSuccess属性的。如下:
if(result.IsSuccess)
{
bool value = result.Content;
}
else
{
//处理错误情况
Console.WriteLine( "读取PLC失败,原因:" + result.Message;
MessageBox.Show(result.Message);
}
3. 自己读取地址时的恶心事
首先,是我学艺不精,弄不懂地址的哪些事。。。后来摸索出了基于HslCommunication读取地址的一些解法。
首先,我想读取DB块中的转换值,地址的偏移量事6.0。
而我采用的HSl读取函数为:
OperateResult<float> result = Plc.ReadFloat(varAddress);
if (result.IsSuccess)
{
return result.Content;
}
这里的传入地址值真的太磨人了,ReadFloat原函数如下:
后来我发现一个可以确认我 这个地址到底是D6还是W6的方法,就是将这个值应用到博图的Main函数中,如下:
可以看到,相对地址是%DB1.DBD6,绝对地址是DB1.DBD6。
接着我将%DB1.DBD6,DB1.DBD6,DBD6,D6这些值带进去实验,结果DB1.DBD6通过了。
方法虽然笨了些,但是真的是傻瓜式的操作了。
自问自答
HslCommunication库和S7.net之间有啥区别,为啥我感觉自己用它链接PLC s71200时候很相似?这两个库是包含关系吗
搜索结果:没有直接的包含关系,但HslCommunication库中包含了一个用于操作西门子S7协议的SiemensS7Net类
更新时间
- 2024.07.23:创建
- 2024.07.24:补充读取操作和地址填写