基于HslCommunication实现基于WebApi,javascript来读写PLC。。。

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于HslCommunication实现基于WebApi,javascript来读写
PLC。

本⽂介绍在⼀些特殊的场景和需求下,使⽤HslCommunication的可以实现⼀些⽐较有意思的功能。

例⾏介绍HSL的安装
在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输⼊下⾯的指令安装:
Install-Package HslCommunication
我们来看看这种系统的架构设计模式。

我们有⼀个主的后台服务器来连接现场的各种PLC设备,然后进⾏数据交互。

这个没有问题,很好实现,但是现在有需求,我们在远程客户端界⾯,或是⼿机端界⾯,浏览器界⾯,等等,需要对远程的PLC进⾏读写⼀些数据操作,这时候怎么实现是最简单⽅便的?
在HSL⾥,提供了两种简单的可能性。

可以辅助你快速实现需要的操作信息。

优点:对客户端的控制更强,权限控制也更加强,可以细化到每个API的权限控制,和MQTT深度结合,⽀持访问TOPIC信息,传输数据有进度报告。

缺点:MRPC为定制协议,需要定制开发,⽬前实现了C#,java,python版本,其他平台或是语⾔都需要定制实现。

2.基于WebApi实现,下⽂详细说明。

优点:客户端标准化,使⽤postman即可测试,绝⼤多数语⾔和平台都⽀持webapi接⼝,已经有相关的轮⼦,可以直接调⽤。

缺点:MRPC的优点就是缺点。

我们开始写代码,我们先假设有1个PLC需要不停的采集,分析数据,做处理。

我们新建⼀个控制台程序,安装HslCommunication组件。

为了⽅便起见,我们假设这个PLC是西门⼦PLC,实际上⽆论什么牌⼦的都是⼀样的。

namespace ConsoleServer
{
class Program
{
static void Main( string[] args )
{
SiemensS7Net plc = new SiemensS7Net( SiemensPLCS.S1200, "127.0.0.1" ); // 此处拿了本地虚拟的PLC测试
plc.SetPersistentConnection( ); // 设置了长连接
while (true)
{
Thread.Sleep( 1000 ); // 每秒读取⼀次
OperateResult<short> read = plc.ReadInt16( "M100" );
if (read.IsSuccess)
{
// 读取成功后,进⾏业务处理,存⼊数据库,或是其他的分析
Console.WriteLine( "读取成功,M100:" + read.Content );
}
else
{
// 读取失败之后,显⽰下状态
Console.WriteLine( "读取PLC失败,原因:" + read.Message );
}
}
}
}
}
此处就简化了⼀些操作信息,反正是要执⾏⼀些业务操作的。

现在我们需要在客户端的程序⾥,增加⼀个按钮,⽐如功能是锁定机台。

这个功能的实现是写⼊M300.1为True。

如果解锁,就是写false
因为我们的客户端是部署在其他电脑的,当然是需要新建⼀个winform的项⽬了,如果是WPF也是⼀样的。

也是弄两个按钮出来,然后写事件。

有了事件之后,我们怎么来写代码呢?
如果想实现基于webapi来读写,代码⾮常精简。

我们改造下服务器端的实现:
namespace ConsoleServer
{
class Program
{
static void Main( string[] args )
{
SiemensS7Net plc = new SiemensS7Net( SiemensPLCS.S1200, "127.0.0.1" ); // 此处拿了本地虚拟的PLC测试
plc.SetPersistentConnection( ); // 设置了长连接
HttpServer httpServer = new HttpServer( );
httpServer.RegisterHttpRpcApi( "MainPlc", plc );
httpServer.Start( 8000 ); // 需要管理员启动
while (true)
{
Thread.Sleep( 1000 ); // 每秒读取⼀次
OperateResult<short> read = plc.ReadInt16( "M100" );
if (read.IsSuccess)
{
// 读取成功后,进⾏业务处理,存⼊数据库,或是其他的分析
Console.WriteLine( "读取成功,M100:" + read.Content );
}
else
{
// 读取失败之后,显⽰下状态
Console.WriteLine( "读取PLC失败,原因:" + read.Message );
}
}
}
}
}
增加了三段话,实例化服务,注册PLC,启动。

当前的服务器提供了什么RPC的接⼝呢?,我们运⾏起来。

然后⽤HslCommunication的DEMO程序打开瞧瞧就可以了。

服务器端启动之后,就是⼀直在打印读取成功了。

没有其他的内容
好了,到这⾥我们的程序写完了,我们的PLC已经提供了远程读写的WebApi的接⼝了,可能我们会问,在哪⾥呢?我们打开demo看看。

上⾯的操作之后我们看到了所有的接⼝列表。

我们点击其中的⼀个接⼝,例如 ReadOrderNumber 接⼝,我们想读取PLC的订货号。

点击之后,界⾯变化了。

不管他,我们直接点击读取。

我们看到有数据返回了。

我们成功读取到了⼀个json字符串,是不是很熟悉,获取规则如下:
因为读取是可能会失败的,也就是Content属性可能为空,那么我们就需要先判断 IsSuccess 为 True ,我们再去拿Content的数据。

如果为 False,那么代表读取失败了,失败原因就在 Message ⾥⾯。

这时候,你可以显⽰出来。

或是记录⽇志,写⼊写⼊数据库都是可以的。

我们再来尝试读取M100的short数据,在PLC⾥就是 MW100的值。

结果如下:
当我们重新选择ReadInt16接⼝的⽅法时,
这时候已经显⽰当前的接⼝已经有⼀次调⽤的信息了。

我们再测试⼀个写⼊的操作。

我们可以读取验证⼀下、
OK,我们现在⽤POSTMAIN测试⼀下。

需要注意的是,当前的⽅法是POST的。

既然⽀持webapi,最后我们来尝试在⽹页上的操作,我们先做⼀个⽹页,放⼀个按钮,然后搞⼀个点击事件。

去请求数据,然后显⽰读取结果。

我们⽤到了 jquery,页⾯如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>HslCommunication教程</title>
<script src="https:///jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
<h1>测试Webapi的内容</h1>
<p>点击下⽅的按钮即可
</p>
<button onclick="GetPlcValue()">测试</button>
<p>结果如下:</p>
<p id="test1"></p>
<script type="text/javascript">
function GetPlcValue(){
$.ajax({
type:'post',
async: false,
url:'http://127.0.0.1:8000/MainPlc/ReadInt16',
dataType:'JSON',
data:JSON.stringify({
'address': 'M100'
}),
success:function(result){
console.log(result);
if(result.IsSuccess){
$("#test1").text("Read Success, value is : " + result.Content);
}
else{
$("#test1").text("Read Failed, Message: " + result.Message);
}
}
});
}
</script>
</body>
</html>
很简单没啥内容,我们运⾏下。

emmm,好像遇到跨域问题了,没关系,我们在服务器上稍微更改⼀下。

然后我们在页⾯上再次进⾏操作⼀下:
同理,写⼊都是类似的。

最后我们来聊聊,如何实现你⾃⼰的API接⼝到 webapi上。

例如我们要增加⼀个算法的接⼝,传⼊两个数,返回⽅法之和。

我们定义⼀个类。

public class Algorithms
{
[HslCommunication.Reflection.HslMqttApi(HttpMethod = "POST", Description = "这是⼀个计算两个数相加的⽅法。

")]
public int Add(int a, int b )
{
return a + b;
}
}
我们看这个⽅法,定义了POST,当然了,GET也可以的,这样客户端的⽅式只要匹配就好了。

然后我们注册下服务
完事,我们看看客户端的界⾯。

我们更改下传⼊的值
这时候的POSTMAN就是要携带基本的验证了,我们来看看加⼀个权限控制的api的使⽤⽅法
public class Algorithms
{
[HslCommunication.Reflection.HslMqttApi(HttpMethod = "POST", Description = "这是⼀个计算两个数相加的⽅法。

")]
public int Add(int a, int b )
{
return a + b;
}
[HslCommunication.Reflection.HslMqttPermission(UserName = "admin")]
[HslCommunication.Reflection.HslMqttApi( HttpMethod = "POST", Description = "这是⼀个计算两个数相乘的⽅法。

" )]
public int Multipy( int a = 10, int b = 20 )
{
// 当前⽅法只能⽤户名为admin的调⽤
return a * b;
}
}
我们增加的第⼆个⽅法就是增加权限的控制,这样的话,客户端再请求的话,就是需要增加权限头我们先看POSTMAN
我们看到了返回了数据,然后我们再看看发送的header⾥都有什么
这个内容就校验的内容之⼀了,好了,我们在js⾥可以这么写代码了
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>HslCommunication教程</title>
<script src="https:///jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
<h1>测试Webapi的内容</h1>
<p>点击下⽅的按钮即可
</p>
<button onclick="GetPlcValue()">测试</button>
<p>结果如下:</p>
<p id="test1"></p>
<script type="text/javascript">
function GetPlcValue(){
$.ajax({
headers:{
'Authorization': 'Basic YWRtaW46MTIzNDU2'
},
type:'post',
async: false,
url:'http://127.0.0.1:8000/Algorithms/Multipy',
dataType:'JSON',
data:JSON.stringify({
'a': 10,
'b': 20
}),
success:function(result){
console.log(result);
$("#test1").text("Read Success, value is : " + result);
//if(result.IsSuccess){
//$("#test1").text("Read Success, value is : " + result.Content);
//}
//else{
//$("#test1").text("Read Failed, Message: " + result.Message); //}
}
});
}
</script>
</body>
</html>
然后再运⾏,就是返回了正确的结果了
如果有什么其他的问题,欢迎留⾔。

相关文档
最新文档