欢迎光临
我们一直在努力

无需SCADA/OPC,实现直接与西门子PLC Web API通讯实现数据读写(二)

声明:文章中部分图片来源于网络,如有侵害,请联系作者删除。

书接上文,本篇主要在PLC端配置完成后,如何通过Web API接口实现与PLC数据集成。

CPU 提供基于 Web 的 API (Web API) 作为读取和写入 CPU 数据的界面。

Web API 可用于:

• 使用最新的先进技术实现 Web 应用程序;

• 通过脚本和编程语言与 CPU 的 Web 服务器通信;

• 创建可同时连接到多个 CPU 的 Web 应用程序,例如,创建可显示多个 CPU 状态的仪表板;

如第二点描述,通过应用程序编写可实现与Web服务器通信,从而实现与CPU数据的读写。

1.在 CPU、Web API 与终端设备之间建立了连接

下图举例说明了 CPU 与终端设备之间的 Web API。

Web API 正在不断扩展。下表列出了特定 CPU 固件版本可以使用的机制和方法:

方法

标准 T-CPU 的起始固件版本

F-CPU 的起始固件版本

PicProgram.Read

V2.8

V2.8

PicProgram.Write

V2.8

V2.8

PicProgram.DownloadProfilingData

V3.1

V3.1

PicProgram.Browse

V2.8

V2.8

2.API 端点

作为 RPC 协议,JSON-RPC V2.0 基于 HTTP。Web API 可通过向以下 URL 发送 POST 请求访

问:

https://[ip]/api/jsonrpc

Web API 支持 JSON-RPC 2.0 中定义的批量操作。虽然批量操作不受固定数量的方法调用的显

式限制,HTTP 请求主体有一定的限制。具体限制取决于 CPU 的固件版本:

• 对于固件版本 ≤ V3.0 的 CPU,该限制为 64 KB

• 对于固件版本 ≥ V3.1 的 CPU,该限制为 128 KB

3.读写过程数据

3.1 支持的数据类型

下表显示了:

• Web API 支持用于读取和写入过程值的数据类型

• Web API 中的表示

• TIA Portal 中数据类型的对应匹配项

3.2 块属性的参数分配

在 TIA Portal 中组态对 Web API 的访问

为了限制对项目数据块的读写访问,可以在相应块的属性中定义所需的参数。

要允许 Web API 访问数据块,请选中复选框“DB accessible from Webserver”。

3.3 变量表中用于访问 Web API 的参数分配

要实现 Web API 对变量的读写访问,必须启用选项“Accessible from

HMI/OPC UA/Web API”和“Writable from HMI/OPC UA/Web API”:

3.4 读取数据PlcProgram.Read 

使用 PlcProgram.Read 方法从 CPU 读取单个变量。 要调用 PlcProgram.Read 方法,需要“read_value”认证。

(1)请求的结构

在如下示例中,用户在“simple”表示中请求全局变量。

{

"var": "\\"MotorSpeed\\""

}

在如下示例中,用户在“raw”表示中请求数据块变量。

{

"var": "\\"MyDB\\".MyVariable",

"mode": "raw"

}

(2)响应结构

如果对服务器的请求成功,则服务器会返回 JSON 数据值。

以下示例显示在“simple”表示中读取“int”类型变量的结果。

-42

以下示例显示在“raw”表示中读取“dword”类型变量的结果。

[ 1, 47, 233, 0 ]

(3)可能出现的错误消息

3.5 写入数据PlcProgram.Write

使用 PlcProgram.Write 方法将单个过程变量写入 CPU。

要调用 PlcProgram.Write 方法,需要“write_value”认证。

(1)请求的结构

在如下示例中,用户以“simple”显示形式写入全局变量。

{

"var": "\\"MotorSpeed\\"",

"value":9001

}

在如下示例中,用户以“raw”表示形式将变量写入数据块。

{

"var": "\\"MyDB\\".MyVariable",

"value": [ 255, 77, 1, 99 ],

"mode": "raw"

}

在如下示例中,用户将包含 10 个字符的字符串变量写入“simple”表示:

{

"var": "\\"MyDB\\".MyString",

"value":"Short Str",

"mode": "simple"

}

在如下示例中,用户将包含 10 个字符的字符串变量与文本“Short Str”写入“raw”表示:

{

"var": "\\"MyDB\\".MyString",

"value": [ 10, 9, 83, 104, 111, 114, 116, 32, 83, 116, 114, 0 ],

"mode": "raw"

}

在如下示例中,用户将包含 6 个字符的 Wstring 变量写入“simple”表示:

{

"var": "\\"MyDB\\".MyWString",

"value":"Hello",

"mode": "simple"

}

在如下示例中,用户将包含 6 个字符的字符串变量与文本“Hello”写入“raw”表示中:

{

"var": "\\"MyDB\\".MyWString",

"value": [ 0, 6, 0, 5, 0, 72, 0, 101, 0, 108, 0, 108, 0, 111, 0, 0

],

"mode": "raw"

}

(2)响应结构

如果写操作成功,则服务器返回布尔值“true”。

(3)可能出现的错误消息

3.6 部分C#代码

 
using Siemens.Simatic.S7.Webserver.API.Models;
using Siemens.Simatic.S7.Webserver.API.RequestHandler;
using Siemens.Simatic.S7.Webserver.API.Responses;
using Siemens.Simatic.S7.Webserver.API.Models.ApiPlcProgramDataTypes;

// PlcProgramRead示例:object类型适用于API所实现的任何PLC数据类型,此处也可直接指定为"bool"
var boolReadResult = await requestHandler.PlcProgramReadAsync<object>("\\"DataTypes\\".\\"Bool\\"");
Console.WriteLine(boolReadResult.Result);
// TIA数据类型"Date_And_Time"和"S5Time"会以对象形式返回——因此API中分别实现了"ApiDateAndTime"和"ApiS5Time"类来处理
ApiResultResponse<ApiDateAndTime> dateAndTimeReadResult =
await requestHandler.PlcProgramReadAsync<ApiDateAndTime>("\\"DataTypes\\".\\"TIA_Dates\\".\\"Date_And_Time\\"");
DateTime myDt = dateAndTimeReadResult.Result.GetDateTime();
myDt = (new DateTime(2021, 04, 26, 16, 53, 22).AddMilliseconds(13));
await requestHandler.PlcProgramWriteAsync("\\"DataTypes\\".\\"TIA_Dates\\".\\"Date_And_Time\\"", new ApiDateAndTime(myDt));
dateAndTimeReadResult =
await requestHandler.PlcProgramReadAsync<ApiDateAndTime>("\\"DataTypes\\".\\"TIA_Dates\\".\\"Date_And_Time\\"");
Console.WriteLine(dateAndTimeReadResult.Result.GetDateTime().ToString("dd/MM/yyyy hh:mm:ss.fff tt"));
ApiResultResponse<ApiS5Time> s5TimeReadResult =
await requestHandler.PlcProgramReadAsync<ApiS5Time>("\\"DataTypes\\".\\"TIA_Dates\\".\\"S5Time\\"");
Console.WriteLine(s5TimeReadResult.Result.GetTimeSpan());
// 当使用PlcProgram.Read的"简单模式"时,像"Date"、"Time"、"LTime"、"Time_Of_Day"、"LTime_Of_Day"这类TIA数据类型
// 会以int/uint值返回——因此需要知道如何将这些值转换为DateTime/TimeSpan:
// 以"Date"为例(对于"Time"、"LTime"等类型需要相应调整转换逻辑)
var dateReadResult = await requestHandler.PlcProgramReadAsync<uint>("\\"DataTypes\\".\\"TIA_Dates\\".\\"Date\\"");
DateTime date = new DateTime(1990, 1, 1) + TimeSpan.FromDays(dateReadResult.Result);
date = new DateTime(2021, 04, 26);
// 写入时:计算目标时间与1990年1月1日之间的天数差,然后将其作为uint(或int、long等非double/float类型的整数
// 例如2而不是2.0——这是PLC所期望的数据格式)写入
TimeSpan ts = date – new DateTime(1990, 1, 1);
await requestHandler.PlcProgramWriteAsync("\\"DataTypes\\".\\"TIA_Dates\\".\\"Date\\"", (uint)ts.TotalDays);

本人使用C#进行测试学习,用于 .NET 的 WebserverApi 客户端库,可以访问github库进行下载,由于github库国内偶尔无法访问,可通过以下链接下载。

github库:https://github.com/siemens/simatic-s7-webserver-api

下载资源:
https://download.csdn.net/download/bjhtgy/91651118

赞(0)
未经允许不得转载:171主机测评 » 无需SCADA/OPC,实现直接与西门子PLC Web API通讯实现数据读写(二)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址