{"id":28820344,"url":"https://github.com/siemens/simatic-s7-webserver-api","last_synced_at":"2026-04-02T10:34:53.869Z","repository":{"id":40602443,"uuid":"422531801","full_name":"siemens/simatic-s7-webserver-api","owner":"siemens","description":"A .NET API Client Library for the SIMATIC S7 PLC Webserver API","archived":false,"fork":false,"pushed_at":"2025-06-10T08:58:36.000Z","size":1596,"stargazers_count":135,"open_issues_count":11,"forks_count":27,"subscribers_count":12,"default_branch":"main","last_synced_at":"2025-06-13T13:42:59.292Z","etag":null,"topics":["api","client-library","controller","dotnet","embedded","embedded-systems","factory-automation","json-api","jsonrpc2","plc","plcsim","s7-plc","siemens","siemens-s7","siemens-s7-1200","siemens-s7-plcs","simatic","sps"],"latest_commit_sha":null,"homepage":"https://www.nuget.org/packages/Siemens.Simatic.S7.Webserver.API/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/siemens.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-10-29T10:23:07.000Z","updated_at":"2025-06-13T08:32:20.000Z","dependencies_parsed_at":"2023-02-01T06:15:27.401Z","dependency_job_id":"6cbf4992-f35b-4be2-8662-3391aff85ab8","html_url":"https://github.com/siemens/simatic-s7-webserver-api","commit_stats":{"total_commits":20,"total_committers":3,"mean_commits":6.666666666666667,"dds":0.25,"last_synced_commit":"40117e7f5d249d8edd388938c400661bfe40ffb2"},"previous_names":[],"tags_count":54,"template":false,"template_full_name":null,"purl":"pkg:github/siemens/simatic-s7-webserver-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siemens%2Fsimatic-s7-webserver-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siemens%2Fsimatic-s7-webserver-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siemens%2Fsimatic-s7-webserver-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siemens%2Fsimatic-s7-webserver-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/siemens","download_url":"https://codeload.github.com/siemens/simatic-s7-webserver-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siemens%2Fsimatic-s7-webserver-api/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260299435,"owners_count":22988635,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","client-library","controller","dotnet","embedded","embedded-systems","factory-automation","json-api","jsonrpc2","plc","plcsim","s7-plc","siemens","siemens-s7","siemens-s7-1200","siemens-s7-plcs","simatic","sps"],"created_at":"2025-06-18T21:09:23.245Z","updated_at":"2026-02-16T21:13:36.294Z","avatar_url":"https://github.com/siemens.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"![1518F](./docs/screens/1518F.png)\r\n# WebserverApi Client Library for .NET\r\nThis package targeting .NET Framework: 4.8, 6.0, 7.0, 8.0, 9.0, 10.0 and .NET Standard 2.0 and above provides the user with Method calls to the PLC Webserver Api using the HttpClient to make the usage of Api functionalities easier.\r\n\r\n* Package name: **Siemens.Simatic.S7.Webserver.API**\r\n\r\n# Table of contents\r\n- [WebserverApi Client Library for .NET](#webserverapi-client-library-for-net)\r\n- [Table of contents](#table-of-contents)\r\n- [License](#license)\r\n- [Introduction](#introduction)\r\n  - [Overview](#overview)\r\n  - [Functionality](#functionality)\r\n  - [Dependencies](#dependencies)\r\n- [Engineering](#engineering)\r\n  - [Hardware setup](#hardware-setup)\r\n  - [Configuration](#configuration)\r\n  - [Operation](#operation)\r\n  - [Error handling](#error-handling)\r\n- [Topics (Web API methods)](#topics-web-api-methods)\r\n  - [ApiHttpClientRequestHandler](#apihttpclientrequesthandler)\r\n  - [WebApps](#webapps)\r\n    - [AsyncWebAppDeployer, WebAppConfigParser](#asyncwebappdeployer-webappconfigparser)\r\n  - [PlcProgram Browse Read and Write](#plcprogram-browse-read-and-write)\r\n  - [Modules](#modules)\r\n    - [ModulesBrowser](#modulesbrowser)\r\n    - [Modules.ReadIdentificationMaintenance](#modulesreadidentificationmaintenance)\r\n- [Compatibility](#compatibility)\r\n  - [SIMATIC S7-1500:](#simatic-s7-1500)\r\n- [Limitations](#limitations)\r\n- [OPC UA or Web API?](#opc-ua-or-web-api)\r\n- [Further Information about PLC (Webserver)](#further-information-about-plc-webserver)\r\n  - [SIMATIC S7-1500:](#simatic-s7-1500-1)\r\n  - [SIMATIC S7-1200 G2:](#simatic-s7-1200-g2)\r\n  - [SIMATIC S7-1200:](#simatic-s7-1200)\r\n\r\n# [License](LICENSE.md)\r\n\r\n# Introduction\r\n\r\n## Overview\r\nThis package provides an easy way to use the functionalities of the S7 Webserver API without taking care of the HTTP requests.\r\n\r\nIn the area of the requesthandling following comfort is in place:\r\n* GUIDGenerator: Create IDs (with a parameterizable length) for the requests \r\n* ApiRequestFactory: Create ApiRequests comfortably by providing the parameters for the according request\r\n* ApiRequestParameterChecker: Check the parameters on their validity before sending them to the plc (reduce traffic, enhance testability)\r\n* ApiResponseChecker: Pre-checking of Responses by the plc, throw exceptions that tell the user about the origin of an issue.\r\n* ApiHttpClientRequestHandler: Send the requests provided by an ApiRequestFactory to the plc and return the result inside a class\r\n\r\nSo generally all available methods of the S7 Web API can be called easily without taking care of RequestHandling, Id generation, result parsing, etc. Furthermore some comfort functionality is implemented:\r\n* WebApps \r\n    * ApiResourceHandler: Upload/Download of Web-resources (html files, js files,...)\r\n    * ApiWebAppDataSaver: Saving the configuration of an ApiWebAppData comfortably in a json file that can be parsed by the ApiWebAppConfigParser\r\n    * ApiWebAppDeployer: Deploy/Update of an ApiWebAppData to the plc\r\n    * ApiWebAppResourceBuilder: Create an ApiWebAppResource from a file (html, js, ...)\r\n* PlcProgram\r\n    * ApiPlcProgramHandler: Implementation to comfortably read/write all children of a struct via Bulk requests (under construction)\r\n* Files and Directories\r\n    * ApiFileResourceBuilder: Build an ApiFileResource from the path to a local resource (e.g. windows file)\r\n    * ApiDirectoryBuilder: Build a directory containing multiple files from a given ApiDirectoryBuilderConfiguration\r\n    * ApiFileHandler: Take care of Upload/Download of a file\r\n    * ApiDirectoryHandler: Take care of Upload/Update/download of a local directory (todo: download + deltadownload)\r\n* Backups\r\n    * ApiBackupHandler: Download/Restore a backup\r\n* Modules\r\n    * ModulesBrowser: Get all available modules.\r\n\r\n## Functionality\r\nThe Functionalities come together in the [ApiHttpClientRequestHandler](#apihttpclientrequesthandler) that implements the IAsyncApiRequesthandler (and also in any implementation of the IApiRequestHandler - not given by example). \r\n\r\nFurther examples of usage are also provided in the UnitTests of the component.\r\n\r\n## Dependencies\r\nPackage Name | Nuget Package URL | Project URL(s)\r\n------------------|------------------|------------------\r\nNETStandard.Library   | https://www.nuget.org/packages/NETStandard.Library/\t| https://dot.net/, https://github.com/dotnet/runtime\r\nMicrosoft.SourceLink.GitHub   | https://www.nuget.org/packages/Microsoft.SourceLink.GitHub/\t| https://github.com/dotnet/sourcelink\r\nSystem.Net.Http   | https://www.nuget.org/packages/system.net.http/\t| https://dot.net/, https://github.com/microsoft/referencesource/tree/master/System/net/System/Net/Http\r\nMicrosoft.Extensions.Logging.Abstractions | https://www.nuget.org/packages/Microsoft.Extensions.Logging.Abstractions/ |  https://dot.net/, https://github.com/dotnet/runtime\r\nNewtonsoft.Json   | https://www.nuget.org/packages/Newtonsoft.Json/\t| https://www.newtonsoft.com/json, https://github.com/JamesNK/Newtonsoft.Json\r\nGitVersioning   | https://www.nuget.org/packages/Nerdbank.GitVersioning/\t| https://github.com/dotnet/Nerdbank.GitVersioning\r\nMimeMapping   | https://www.nuget.org/packages/MimeMapping/\t| https://github.com/zone117x/MimeMapping\r\n\r\n# Engineering\r\n\r\n## Hardware setup\r\nDepending on the plc you are having a different number of sessions can co-exist during operation. For details please check the manual.\r\n\r\n## Configuration \r\nSee [ApiHttpClientRequestHandler](#apihttpclientrequesthandler).\r\n\r\n## Operation\r\nSee [ApiHttpClientRequestHandler](#apihttpclientrequesthandler), if you are able to successfully send the ApiBrowse request and log the responses the setup is fine.\r\n\r\n## Error handling\r\nDepending on the requests sent and the plc state there might be errors occurring. As an example there can only be 1 ApiTicket which needs to be closed after use. Therefore when calling e.g. WebApp.CreateResource the result might look like the following:\u003cbr\u003e{\"error\":{\"code\":4,\"message\":\"No Resources\"},\"id\":\"81dcdb3c-0704-454f-94a3-364a75b7eb4d\",\"jsonRpc\":\"2.0\"}\u003cbr\u003eIn this case the ApiHttpClientRequestHandler will throw an ApiNoResourcesException containing different scenarios when this exception might occur.\r\n\r\n# Topics (Web API methods)\r\n\r\n## ApiHttpClientRequestHandler\r\nIn the following example code you'll have to adjust the IpAddress (\"192.168.1.1\") and the login for your system - the Login \"Anonymous\"(previously \"Everybody\") with the password \"\" is a default user that is downloaded to the plc for the webserver once the webserver is activated in TIA portal. The used functions would fail for the default case that he doesn't have the permissions call the method (that he tried to call). It is not good practice to give a lot of rights to the user \"Anonymous\" therefore please adjust the connectionconfiguration to your configured user with a safe password that should be able to call the methods.\r\n\r\nTo use e.g. the Api Method \"Api.Browse\" to get all the Methods supported by the PLC Api do the following\r\n```cs\r\nvar serviceFactory = new ApiStandardServiceFactory();\r\nvar reqHandler = await serviceFactory.GetApiHttpClientRequestHandlerAsync(\"192.168.1.1\", \"Anonymous\", \"\");\r\nvar apiBrowseResponse = await reqHandler.ApiBrowseAsync();\r\nforeach(var method in apiBrowseResponse.Result)\r\n{\r\n    Console.WriteLine(method.Name);\r\n}\r\n```\r\n**Hint**: The PLC Certificate is by default not accepted by your PC - therefor you have to either download and store the certificate in the trusted root ca certificates (preferably!) or implement the validation callback for your system - a \"plain\" check for =\u003e true is not good practice but it will get you started in case you dont want to download and install the certificate.\r\n```cs\r\n...\r\nusing System.Net;\r\n...\r\n// For .net48\r\nServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) =\u003e true;\r\n// For .net6.0 and greater\r\nSiemens.Simatic.S7.Webserver.API.Services.ServerCertificateCallback.CertificateCallback = (sender, cert, chain, sslPolicyErrors) =\u003e true;\r\n```\r\nOf course you can also implement a check for the sender and so on.\r\n## WebApps\r\n![Gif_WebApp](./docs/screens/Gif_WebApp.gif)\r\nFor the PLC WebApps Further Comfort can be accomplished by using the ApiWebAppData and ApiWebAppResource implementations:\r\nGenerally you are free to configure everything on your own:\r\n```cs\r\npublic static DirectoryInfo CurrentExeDir\r\n{\r\n    get\r\n    {\r\n        string dllPath = System.Reflection.Assembly.GetExecutingAssembly().Location;\r\n        return (new FileInfo(dllPath)).Directory;\r\n    }\r\n}\r\n...\r\nvar app = new ApiWebAppData() { Name = \"customerExample\", State = ApiWebAppState.Enabled };\r\nawait requestHandler.WebAppCreateAsync(app);\r\napp = (await requestHandler.WebAppBrowseAsync(app)).Result.Applications.First();\r\nvar ticketForCreation = await requestHandler.WebAppCreateResourceAsync(app, \"index.html\", \"text/html\", \"2020-07-29T14:52:22Z\");\r\nawait requestHandler.UploadTicketAsync(ticketForCreation.Result, Path.Combine(CurrentExeDir.FullName, \"_WebApps\", \"customerExample\", \"index.html\"));\r\n// (optional) check for the Ticket state\r\nvar ticket = (await requestHandler.ApiBrowseTicketsAsync(ticketForCreation.Result)).Result.Tickets.First();\r\n// close the ticket again!\r\nawait requestHandler.ApiCloseTicketAsync(ticket.Id);\r\nif (ticket.State != ApiTicketState.Completed)\r\n{\r\n    throw new ApiTicketNotInCompletedStateException(ticket);\r\n}\r\nawait requestHandler.WebAppSetDefaultPageAsync(app, \"index.html\");\r\n// do this in a loop for all resources and perform management yourself OR            \r\n```\r\nbut further comfort can be accomplished with:\r\n### AsyncWebAppDeployer, WebAppConfigParser\r\nYou can use Implementations to comfortably deploy the apps to the plc with a Deployer and FileParser for your WebAppDirectory:\r\n```cs\r\nvar parser = new WebAppConfigParser(Path.Combine(CurrentExeDir.FullName, \"_WebApps\", \"customerExample\"), \"WebAppConfig.json\");\r\napp = parser.Parse();\r\nvar deployer = serviceFactory.GetApiWebAppDeployer(reqHandler);\r\nawait deployer.DeployOrUpdateAsync(app);\r\nvar apiWebAppBroseResourcesResponse = await requestHandler.WebAppBrowseResourcesAsync(\"customerExample\");\r\nforeach(var resource in apiWebAppBroseResourcesResponse.Result.Resources)\r\n{\r\n    Console.WriteLine(JsonConvert.SerializeObject(resource, new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore }));\r\n}\r\n```\r\nThe Parser and Deployer also use a set of comfort functions - in case you want to know or take a look they are using:\r\n```cs\r\nnamespace Siemens.Simatic.S7.Webserver.API.Services.WebApp {\r\npublic class ApiResourceHandler {}\r\npublic class ApiWebAppResourceBuilder {}\r\n}\r\n```\r\n**Hint**: It is possible to add another parameter to the new WebAppConfigParser(*,*,bool ignoreBOMDifference = false):\r\nThis is the case because uploading files using javascript on a webpage has shown that the BOM (Byte Order Mark) is not transmitted!\r\nTherefor if you upload a file using javascript and then make the deployer do the comparison between the file locally (windows explorer) and the one on the server(plc) the files would be different since the size is different by three bytes. To get rid of this \"false positive\" on a difference you can set the ignoreBOMDifference to true - but keep in mind that a change of 3 bytes would then also be accepted as no difference. The deployer would still reupload the file since the last_modified dates would not match!\r\n\r\n## PlcProgram Browse Read and Write\r\nThe PlcProgram Methods can be used to Browse available variables and to read or write their value.\r\n```cs\r\n...\r\nusing Siemens.Simatic.S7.Webserver.API.Models;\r\nusing Siemens.Simatic.S7.Webserver.API.RequestHandler;\r\nusing Siemens.Simatic.S7.Webserver.API.Responses;\r\nusing Siemens.Simatic.S7.Webserver.API.Models.ApiPlcProgramDataTypes;\r\n...\r\n// PlcProgramRead example: object will work for any plcdatatype that is implemented by the api, you could also provide \"bool\" here\r\nvar boolReadResult = await requestHandler.PlcProgramReadAsync\u003cobject\u003e(\"\\\"DataTypes\\\".\\\"Bool\\\"\");\r\nConsole.WriteLine(boolReadResult.Result);\r\n// Tia Data Type \"Date_And_Time\" and \"S5Time\" are returned as objects - therefore an Implementation is done as the \"ApiDateAndTime\" and \"ApiS5Time\"\r\nApiResultResponse\u003cApiDateAndTime\u003e dateAndTimeReadResult = \r\n    await requestHandler.PlcProgramReadAsync\u003cApiDateAndTime\u003e(\"\\\"DataTypes\\\".\\\"TIA_Dates\\\".\\\"Date_And_Time\\\"\");\r\nDateTime myDt = dateAndTimeReadResult.Result.GetDateTime();\r\nmyDt = (new DateTime(2021, 04, 26, 16, 53, 22).AddMilliseconds(13));\r\nawait requestHandler.PlcProgramWriteAsync(\"\\\"DataTypes\\\".\\\"TIA_Dates\\\".\\\"Date_And_Time\\\"\", new ApiDateAndTime(myDt));\r\ndateAndTimeReadResult = \r\n    await requestHandler.PlcProgramReadAsync\u003cApiDateAndTime\u003e(\"\\\"DataTypes\\\".\\\"TIA_Dates\\\".\\\"Date_And_Time\\\"\");\r\nConsole.WriteLine(dateAndTimeReadResult.Result.GetDateTime().ToString(\"dd/MM/yyyy hh:mm:ss.fff tt\"));\r\nApiResultResponse\u003cApiS5Time\u003e s5TimeReadResult = \r\n    await requestHandler.PlcProgramReadAsync\u003cApiS5Time\u003e(\"\\\"DataTypes\\\".\\\"TIA_Dates\\\".\\\"S5Time\\\"\");\r\nConsole.WriteLine(s5TimeReadResult.Result.GetTimeSpan());\r\n// TIA Data types like \"Date\", \"Time\", \"LTime\", \"Time_Of_Day\", \"LTime_Of_Day\" are returned as int/uint values when using\r\n// the \"simple\" mode for PlcProgram.Read =\u003e it makes sense to know how to get those into a DateTime/TimeSpan:\r\n// Example for \"Date\" (you'll have to adjust this for \"Time\",\"LTime\",...)\r\nvar dateReadResult = await requestHandler.PlcProgramReadAsync\u003cuint\u003e(\"\\\"DataTypes\\\".\\\"TIA_Dates\\\".\\\"Date\\\"\");\r\nDateTime date = new DateTime(1990, 1, 1) + TimeSpan.FromDays(dateReadResult.Result);\r\ndate = new DateTime(2021, 04, 26);\r\n// for writing: determine the amount of days that is between 1/1/1990 and the time you want to write =\u003e write the value as a uint\r\n// or int or long, ... a number that is no double/float =\u003e (2 not 2.0) - thats what the plc expects\r\nTimeSpan ts = date - new DateTime(1990, 1, 1);\r\nawait requestHandler.PlcProgramWriteAsync(\"\\\"DataTypes\\\".\\\"TIA_Dates\\\".\\\"Date\\\"\", (uint)ts.TotalDays);\r\n```\r\nAlso for these PlcProgram methods there is an Implementation for an ApiPlcProgramData object that can be used for the Api methods:\r\n```cs\r\n...\r\nusing System.Collections.Generic;\r\n...\r\n// Do not provide any variable when browsing to browse the \"root\" \"directory\" of the plc program data:\r\nList\u003cApiPlcProgramData\u003e allMyPlcProgramBlocks = (await requestHandler.PlcProgramBrowseAsync(ApiPlcProgramBrowseMode.Children)).Result;\r\n// A DB called \"DataTypes\" has the variables we care about:\r\nvar myPlcProgramDataBlock = allMyPlcProgramBlocks.First(el =\u003e el.Name == \"DataTypes\");\r\nvar myPlcProgramDataBlockChildren = (await requestHandler.PlcProgramBrowseAsync(ApiPlcProgramBrowseMode.Children, myPlcProgramDataBlock)).Result;\r\nmyPlcProgramDataBlock.Children = myPlcProgramDataBlockChildren;\r\n// It is important to set the Parent list correctly so the variable name will be provided correctly to read/write the value of the variable\r\nforeach(var child in myPlcProgramDataBlock.Children)\r\n{\r\n    child.Parents = new List\u003cApiPlcProgramData\u003e() { myPlcProgramDataBlock };\r\n}\r\n// now we want to read the value of a variable called \"Bool\":\r\nvar myBool = myPlcProgramDataBlock.Children.First(el =\u003e el.Name == \"Bool\");\r\nmyBool.Value = (await requestHandler.PlcProgramReadAsync\u003cbool\u003e(myBool)).Result;\r\nConsole.WriteLine(myBool.Value);\r\n// write the \"Bool\" variable\r\nawait requestHandler.PlcProgramWriteAsync(myBool, true);\r\n// and read the value again:\r\nmyBool.Value = (await requestHandler.PlcProgramReadAsync\u003cbool\u003e(myBool)).Result;\r\nConsole.WriteLine(myBool.Value);\r\n```\r\n\r\n## Modules\r\nThe Modules.* methods of the plc provide access to various data.\r\n### ModulesBrowser\r\nThe ModulesBrowser can retrieve all stations available at the plc:\r\n```cs\r\nvar browser = new ModulesBrowser(requestHandler, Logger);\r\nvar browseResult = await browser.BrowseAllModulesAsync();\r\n```\r\n### Modules.ReadIdentificationMaintenance\r\nModules.ReadIdentificationMaintenance can be used in the library via 2 ways:\r\n1. By passing generic types (for those (as long as you use the ones from the library) no 'number' parameter is needed):\r\n```cs\r\nvar hwIds = await requestHandler.ModulesBrowseAsync(mode: ModulesBrowseMode.Children);\r\nvar resp = await requestHandler.ModulesReadIdentificationMaintenanceAsync\u003cModulesIdentificationMaintenance_IM0_Data\u003e(hwIds.Result.Nodes.FirstOrDefault().Children.First().Hwid, ModulesReadIdentificationMaintenanceType.Actual);\r\n```\r\n2. By passing the number and receiving an 'object'\r\n```cs\r\nvar hwIds = await requestHandler.ModulesBrowseAsync(mode: ModulesBrowseMode.Children);\r\nvar resp = await requestHandler.ModulesReadIdentificationMaintenanceAsync(hwIds.Result.Nodes.FirstOrDefault().Children.First().Hwid, ModulesReadIdentificationMaintenanceNumber.Im0, ModulesReadIdentificationMaintenanceType.Actual);\r\n```\r\n\r\n\r\n# Compatibility\r\n\r\nUse the following table to find the correct client version for each Plc version (server)\r\n\r\n## SIMATIC S7-1500:\r\nPlc Version (S7-1500 + RH) | Client Library Version | S7-1200 G2 | S7-1200\r\n---------------------------|------------------------|------------|---------------\r\n2.9.x                      | 1.0.x                  |            | 4.5.x\r\n2.9.x                      | 2.0.x                  |            | 4.5.x\r\n3.0.x                      | 2.1.x                  |            | 4.6.x\r\n3.1.x                      | 2.2.x                  |            | 4.7.x\r\n4.0.x                      | 3.0.x                  | 1.0.x      | \r\n4.1.x                      | 3.3.x                  | 4.1.x      | \r\n\r\n**Hint**: This Library supports more API calls than the current S7-1200 (G2) does - the S7-1200 (G2) will likely(!) support the API calls of last version of the s7-1500 but this does NOT necessarily have to be the case - for details please always check the manual for the according version.\r\n\r\n# Limitations\r\n\r\nCurrently some Features are not implemented yet. Check out the [Issues](https://github.com/siemens/simatic-s7-webserver-api/issues) to get further information about open issues.\r\n\r\n# OPC UA or Web API?\r\n\r\nTo be honest, I'm not sure that a hard comparison between OPC UA and the Web API is that useful. \r\n\r\nBoth flavors of open interoperability to other systems are fully supported and continuously developed by Siemens. Some features are supported by either one or the other, and for the features that are supported by both, it's ultimately up to your preferences. \r\n\r\n**OPC UA** is a widely known and supported **industry standard** developed and maintained by the **OPC Foundation** that was created for a variety of **Plug\u0026Play** communication use cases. Quite in the sense of a strategic orientation of a cross vendor **interoperability**. The focus here is set on data exchange in the most interoperable and efficient way (subscriptions, companion specifications, …). This also includes **plc-to-plc-communication** via OPC Client and Server. \r\n\r\nThe focus of the **Web API** rather is **maintenance**, **problem finding** and offering the possibility to implement small and medium-sized **Web Applications**. This API is based on standardized **JSON-RPC** via **HTTPS** communication with a Simatic-specific data model.  \r\n\r\nUnfortunately a general performance expectation is hard to calculate as this is highly dependent on use cases, requirements, the given environment and the used system.\r\n\r\nFor feature-specific details and evaluation of what best suits your use case, please also take a look into the manuals of OPC UA or the Webserver.\r\n\r\n# Further Information about PLC (Webserver)\r\n\r\nSee Also:\r\n\r\n## SIMATIC S7-1500:\r\n- SIMATIC S7-1500: https://new.siemens.com/global/en/products/automation/systems/industrial/plc/simatic-s7-1500.html\r\n- SIMATIC S7-1500 Webserver Manual: https://support.industry.siemens.com/cs/us/en/view/59193560\r\n- SIMATIC S7-1500 Manual Collection: https://support.industry.siemens.com/cs/us/en/view/86140384\r\n\r\n## SIMATIC S7-1200 G2:\r\n- SIMATIC S7-1200 G2 Manual: https://support.industry.siemens.com/cs/de/de/view/109972011\r\n- \r\n## SIMATIC S7-1200:\r\n- SIMATIC S7-1200: https://new.siemens.com/global/en/products/automation/systems/industrial/plc/s7-1200.html\r\n- SIMATIC S7-1200 Manual: https://support.industry.siemens.com/cs/ch/en/view/109797241\r\n- SIMATIC S7-1200 Manual: https://support.industry.siemens.com/cs/us/en/view/91696622/45063671307","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsiemens%2Fsimatic-s7-webserver-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsiemens%2Fsimatic-s7-webserver-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsiemens%2Fsimatic-s7-webserver-api/lists"}