从 Siemens S7 1500 PLC 上的 Web 服务器页面读取 JSON 结构
Reading a JSON structure from a web server page on a Siemens S7 1500 PLC
我一直在使用 HTML 和 javascript 创建图形网页来显示来自我的 Siemens S7 1500 PLC 的数据。我一直在使用 $.getJSON 命令成功地从 PLC 读取值,当请求信息的网页由 PLC Web 服务器提供并且与带有 [= 的文件位于同一目录中时44=] 结构和所有需要的值。
我有一台 PC 通过以太网连接到我的 PLC,我希望 运行 在 PC 上本地访问一个网页,并从 PLC 网络服务器读取页面提供的值。
当要读取的数据位于 Web 服务器上的同一目录中时,我当前读取值的代码如下所示:
<script type="text/javascript">
$(document).ready(function(){
$.ajaxSetup({ cache: false });
setInterval(function() {
$.getJSON("inputs.htm", function(data){
// Variable Declaration
engineSpeed = data.engineSpeed;
engineFuelLevelScaled = data.engineFuelLevelScaled;
powerEndDischargePressurePSI = data.powerEndDischargePressurePSI;
powerEndDischargeFlowRateBBLM = data.powerEndDischargeFlowRateBBLM;
powerEndSuctionPressurePSI = data.powerEndSuctionPressurePSI;
});
},1000);
});
</script>
"inputs.htm" 文件很简单:
{
"engineSpeed" : ":="WebData".engineSpeed:",
"engineFuelLevelScaled" : ":="WebData".engineFuelLevelScaled:",
"powerEndDischargePressurePSI" : ":="WebData".powerEndDischargePressurePSI:",
"powerEndDischargeFlowRateBBLM" : ":="WebData".powerEndDischargeFlowRateBBLM:",
"powerEndSuctionPressurePSI" : ":="WebData".powerEndSuctionPressurePSI:"
}
其中 "WebData" 是用我的 PLC 上的值更新的数据块。
我对它的工作方式很满意,但是当我尝试 运行 本地页面以查看 "inputs.htm" 页面时,它没有工作。
我的 PLC 的 IP 地址为 172.17.2.11,我已将 $.getJSON 更改为:
$.getJSON("http://172.17.2.11/awp/GeminiOnline/inputs.htm", function(data){
和
$.getJSON("172.17.2.11/awp/GeminiOnline/inputs.htm", function(data){
虽然都没有用。我知道这些是正确的网址,因为我可以访问其中任何一个并读取我尝试访问的值。
我已经在我的 PLC 的 Web 服务器上设置了权限,允许所有用户完全访问,因此不再需要登录。我想知道是否有我遗漏的步骤或 $.getJSON 结构的某些限制阻止我像这样阅读。
如有任何意见,我们将不胜感激。如果您有任何其他方法可以让我在 PC 本地托管的页面中读取当前 PLC 值,那也会有所帮助。
提前致谢。
我最终确实解决了我的问题,尽管它需要一种完全不同的攻击方法。它不喜欢我的跨域请求,并尝试让 JSONp 工作,但我无法完全管理它。在一位同事的帮助下,我们开发了以下内容:
<script>
function httpGet(theUrl)
{
// Calls the initial request
xmlhttp = new XMLHttpRequest();
var date = new Date();
xmlhttp.open("GET", theUrl + "?" + date.getTime(), false ); // Note that the + "?" + data.getTime() is used to trick the browser from using the cached results from a previous page request
xmlhttp.send();
// Sets a timing interval
setInterval(function(){
// If the request was successful, then parse the string and start a new request
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
// Extract the JSON String
var jsonString = xmlhttp.responseText;
data = $.parseJSON(jsonString);
//YOUR CODE CAN GO HERE, USING THE DATA AS YOU WOULD REGULARLY
}
}, 1000);
}
httpGet("http://172.17.2.10/awp/GeminiOnline/inputs.htm");
无论如何,使用 XMLHttpRequest() 和其他函数我能够从我的其他页面读取数据,就像我之前使用 .getJSON() 一样。
我一直在使用 HTML 和 javascript 创建图形网页来显示来自我的 Siemens S7 1500 PLC 的数据。我一直在使用 $.getJSON 命令成功地从 PLC 读取值,当请求信息的网页由 PLC Web 服务器提供并且与带有 [= 的文件位于同一目录中时44=] 结构和所有需要的值。
我有一台 PC 通过以太网连接到我的 PLC,我希望 运行 在 PC 上本地访问一个网页,并从 PLC 网络服务器读取页面提供的值。
当要读取的数据位于 Web 服务器上的同一目录中时,我当前读取值的代码如下所示:
<script type="text/javascript">
$(document).ready(function(){
$.ajaxSetup({ cache: false });
setInterval(function() {
$.getJSON("inputs.htm", function(data){
// Variable Declaration
engineSpeed = data.engineSpeed;
engineFuelLevelScaled = data.engineFuelLevelScaled;
powerEndDischargePressurePSI = data.powerEndDischargePressurePSI;
powerEndDischargeFlowRateBBLM = data.powerEndDischargeFlowRateBBLM;
powerEndSuctionPressurePSI = data.powerEndSuctionPressurePSI;
});
},1000);
});
</script>
"inputs.htm" 文件很简单:
{
"engineSpeed" : ":="WebData".engineSpeed:",
"engineFuelLevelScaled" : ":="WebData".engineFuelLevelScaled:",
"powerEndDischargePressurePSI" : ":="WebData".powerEndDischargePressurePSI:",
"powerEndDischargeFlowRateBBLM" : ":="WebData".powerEndDischargeFlowRateBBLM:",
"powerEndSuctionPressurePSI" : ":="WebData".powerEndSuctionPressurePSI:"
}
其中 "WebData" 是用我的 PLC 上的值更新的数据块。
我对它的工作方式很满意,但是当我尝试 运行 本地页面以查看 "inputs.htm" 页面时,它没有工作。
我的 PLC 的 IP 地址为 172.17.2.11,我已将 $.getJSON 更改为:
$.getJSON("http://172.17.2.11/awp/GeminiOnline/inputs.htm", function(data){
和
$.getJSON("172.17.2.11/awp/GeminiOnline/inputs.htm", function(data){
虽然都没有用。我知道这些是正确的网址,因为我可以访问其中任何一个并读取我尝试访问的值。
我已经在我的 PLC 的 Web 服务器上设置了权限,允许所有用户完全访问,因此不再需要登录。我想知道是否有我遗漏的步骤或 $.getJSON 结构的某些限制阻止我像这样阅读。
如有任何意见,我们将不胜感激。如果您有任何其他方法可以让我在 PC 本地托管的页面中读取当前 PLC 值,那也会有所帮助。
提前致谢。
我最终确实解决了我的问题,尽管它需要一种完全不同的攻击方法。它不喜欢我的跨域请求,并尝试让 JSONp 工作,但我无法完全管理它。在一位同事的帮助下,我们开发了以下内容:
<script>
function httpGet(theUrl)
{
// Calls the initial request
xmlhttp = new XMLHttpRequest();
var date = new Date();
xmlhttp.open("GET", theUrl + "?" + date.getTime(), false ); // Note that the + "?" + data.getTime() is used to trick the browser from using the cached results from a previous page request
xmlhttp.send();
// Sets a timing interval
setInterval(function(){
// If the request was successful, then parse the string and start a new request
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
// Extract the JSON String
var jsonString = xmlhttp.responseText;
data = $.parseJSON(jsonString);
//YOUR CODE CAN GO HERE, USING THE DATA AS YOU WOULD REGULARLY
}
}, 1000);
}
httpGet("http://172.17.2.10/awp/GeminiOnline/inputs.htm");
无论如何,使用 XMLHttpRequest() 和其他函数我能够从我的其他页面读取数据,就像我之前使用 .getJSON() 一样。