首页 > 其他分享 >基于1500/1200 PLC的webserver---用户自定义页面

基于1500/1200 PLC的webserver---用户自定义页面

时间:2024-05-07 10:23:00浏览次数:21  
标签:function 自定义 Bootstrap DB 1200 1500 html test id

1. 创建html页面

  • 页面需要包含字符集信息:<meta http-equiv="content-type" content="text/html; charset=utf-8">
  • 包含AWP命令的html文件,大小限制为64KB
  • 最简单的页面自动刷新:<meta http-equiv="Refresh" content="10">

2. AWP指令

  • AWP 命令公式中""之前的空格,对于命令的正确编译至关重要。疏漏空格字符可能导致编译器无法生成正确代码。 这种情况下,编译器不会显示错误。
  • 读取变量::=<Varname>:
    • M,Q,I:直接使用"变量符号名"
    • DB:规则为"DB名".变量名
"test_MB" :="test_MB":
"test_MW" :="test_MW":
"web_test2_优化".b :="web_test2_优化".b:
  • 读取特殊变量(从PLC读取并传给HTTP响应头):<!-- AWP_Out_Variable Name='<Type>:<Name>' [Use='<Varname>'] -->
    • type对应特殊变量的类型
    • type1:HEADER
    • type2:COOKIE_VALUE
    • type3:COOKIE_EXPIRES
    • name对应HEADER或COOKIE的名称
<!-- AWP_Out_Variable Name='"此处填写变量名"' -->
<!-- AWP_Out_Variable Name='"HEADER:Status"' Use='"Status"' -->
  • 写入变量:<!-- AWP_In_Variable Name='<Varname1>' [Use='<Varname2>'] ... -->,方括号 [ ] 中包含的项为可选项。
    • 能被写入的变量事先要激活从 HMI/OPC UA/Web API 可访问从 HMI/OPC UA/Web API 可写
    • 配合POST命令写入,添加表单<form action="" method="post"> </form>,添加文本域<input name="PLC变量名" type="text" /> :,添加按钮<input name="" type="submit" value="" /> :
    • 案例如下,要写入的变量先在最前面声明出来
<!-- AWP_In_Variable Name='"test_MB"' -->
<!-- AWP_In_Variable Name='"test_MW"' -->
<!-- AWP_In_Variable Name='"web_test2_优化".b' -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://wwww.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="Refresh" content="5"/>
<title>1200_RD_WR</title>
</head>
<body>
<p><strong>数据读取</strong></p>
  <p>"test_MB" :="test_MB":</p>
  <p>"test_MW" :="test_MW":</p>
  <p>"web_test2_优化".b :="web_test2_优化".b:</p>

<p><strong>数据写入</strong></p>
<form action="" method="post">
<input name='"test_MB"' type="text" />
<input name="" type="submit" value="set" />
</form>
<form action="" method="post">
<input name='"test_MW"' type="text" />
<input name="" type="submit" value="set" />
</form>
<form action="" method="post">
<input name='"web_test2_优化".b' type="text" />
<input name="" type="submit" value="set" />
</form>
</body>
</html>

预览效果:

更多例子:

<!-- AWP_In_Variable Name='"AWP_test".byte_var' -->
<!-- AWP_In_Variable Name='"AWP_test".word_var' -->
<!-- AWP_In_Variable Name='"AWP_test".bool_var' -->
<!-- AWP_In_Variable Name='"AWP_test".int_var' -->
<!-- AWP_Start_Struct Name='"AWP_test".my_struct' -->
:="AWP_test".my_struct.byte_var:
:="AWP_test".my_struct.word_var:
:="AWP_test".my_struct.bool_var:
<!-- AWP_End_Struct -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://wwww.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="Refresh" content="5"/>
<title>1200_RD_WR</title>
</head>
<body>
<p><strong>数据读取</strong></p>
  <p>show byte :="AWP_test".byte_var:</p>
  <p>show word :="AWP_test".word_var:</p>
  <p>show bool :="AWP_test".bool_var:</p>
  <p>show struct :="AWP_test".my_struct.byte_var:</p>

<p><strong>数据写入</strong></p>
<form action="" method="post">
<input name='"AWP_test".byte_var' type="text" />
<input name="" type="submit" value="set" />
</form>
<form action="" method="post">
<input name='"AWP_test".word_var' type="text" />
<input name="" type="submit" value="set" />
</form>
<form action="" method="post">
<input name='"AWP_test".bool_var' type="text" />
<input name="" type="submit" value="set" />
</form>
<form action="" method="post">
  <input name='"AWP_test".int_var' type="text" />
  <input name="" type="submit" value="set" />
  </form>
  <!-- AWP_In_Variable Name='"AWP_test".my_struct.byte_var' -->
  <form action="" method="post">
    <input name='"AWP_test".my_struct.byte_var' type="text" />
    <input name="" type="submit" value="set" />
    </form>
</body>
</html>

预览效果

3. 组态

  • 组态用户自定义,选html文件所在目录,选默认打开的html页面,生成块。
  • 生成的块属于占用程序资源,成为程序的一部分
  • 通过WWW指令来让标准web页面可以访问web页面(如果想要通过程序控制何时web页面可见,则可以通过用户程序控制www块的调用)
// call www
// #TmpWWWreturnInt=0,无错误
// #TmpWWWreturnInt=16#00yx,相关位的请求处于等待状态
// #TmpWWWreturnInt=16#803a,未装载DB
// #TmpWWWreturnInt=16#8081,DB类型格式或版本错误
// #TmpWWWreturnInt=16#80C1,资源不足以用于初始化web
#TmpWWWreturnInt:=WWW(333);
  • 只能在 CPU 处于停止模式时下载用户定义的网页程序块(正常下载硬件组态时候PLC就处于停止模式)
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

4. 拓展应用

  • 用bool量控制图形
//图片1url: Images.Lamp00.png
//图片2url: Images.Lamp01.png
//用Bool变量来替换Lamp0x后面的这个x,0的时候就是Lamp00.png,1的时候就是Lamp01.png
<img src='Images/Lamp0:="TestFinished":.png' />
  • 基于json做html中的变量刷新
  1. 建立json文件
{
    "Device1":":="Bootstrap_DB".Device1:",
    "Device2":":="Bootstrap_DB".Device2:",
    "Device3":":="Bootstrap_DB".Device3:",
    "Temperature":":="Bootstrap_DB".Temperature:",
    "Humidity":":="Bootstrap_DB".Humidity:",
    "Pressure":":="Bootstrap_DB".Pressure:",
    "Tag1":":="Bootstrap_DB".Tag1:"
}
  1. 需要从html输入到plc的文件
<!-- AWP_In_Variable Name='"Bootstrap_DB".Device1' -->:="Bootstrap_DB".Device1:
<!-- AWP_In_Variable Name='"Bootstrap_DB".Device2' -->:="Bootstrap_DB".Device2:
<!-- AWP_In_Variable Name='"Bootstrap_DB".Device3' -->:="Bootstrap_DB".Device3:
<!-- AWP_In_Variable Name='"Bootstrap_DB".Tag1' -->:="Bootstrap_DB".Tag1:
  1. js可以通过id寻找到要显示或者要输入的变量
//开始之前,还有一点需要在html文件中做一下修改,就是要给每一个在页面中需要显示或者输入的元素给定一个唯一的id值,因为Js脚本是通过id值找到页面中的元素的,例如第一行的温度,就需要在html文件中温度的元素处给定一个id值,这里给定的id值是Temperature,每一个元素的id值必须唯一

<li class="nav-item">
  <button type="button" class="btn btn-primary">
    温度 <span class="badge badge-light" id="Temperature">0</span>
  </button>
</li>
  1. 在head中引入外部json
<script type="text/javascript" src="src/js/jquery-2.0.2.min.js"></script>
  1. js做一个1000ms刷新的时钟
<script type="text/javascript">
	$(document).ready(function () {
		$.ajaxSetup({
			cache: false
		});
		setInterval(function () {
			
      //放入代码
			
			});
		}, 1000);
	});
</script>
  1. 使用getJSON获得json中的参数
// 通过之前定义的id值访问到网页中温度的元素,之后用data替换元素中的text,这段代码就这个意思
$.getJSON("IO_Output.html", function (data) {
				$('#Temperature').text(data
					.Temperature);
});
  1. 把功能代码放到时钟里面去
<script type="text/javascript">
	$(document).ready(function () {
		$.ajaxSetup({
			cache: false
		});
		setInterval(function () {
			$.getJSON("IO_Output.html", function (data) {
				$('#Temperature').text(data
					.Temperature);
				$('#Humidity').text(data
					.Humidity);
				$('#Pressure').text(data
					.Pressure);
				$('#Temperature_t').text(data
					.Temperature);
				$('#Humidity_t').text(data
					.Humidity);
				$('#Pressure_t').text(data
					.Pressure);
				$('#tag1').text(data
					.Tag1);	
			});
		}, 1000);
	});
</script>
  1. 控制PLC的某一个bool量
//首先还是需要在按钮的元素中给定一个唯一的id值,这个id值device1ON,id值一定要有意义,不然元素太多根本记不清哪个id对应的什么东西 
<button class="btn btn btn-success" id="device1ON">ON</button>
//之后需要在脚本中等待鼠标的点击动作,当这个元素上有click的事件发生,就执行POST的动作,把val的值赋给PLC的变量,这里是Bootstrap_DB".Device1
$("#device1ON").click(function () {
			url = "IO_Input.html";
			name = '"Bootstrap_DB".Device1';
			val = 1;
			sdata = escape(name) + '=' + val;
			$.post(url, sdata, function (result) {});
	});
//页面中的所有按钮都可以这样处理,下面这段脚本就实现了PLC中一个布尔量的开和关
<script type="text/javascript">
	$(document).ready(function () {
		$.ajaxSetup({
			cache: false
		});
    $("#device1ON").click(function () {
			url = "IO_Input.html";
			name = '"Bootstrap_DB".Device1';
			val = 1;
			sdata = escape(name) + '=' + val;
			$.post(url, sdata, function (result) {});
		});
		$("#device1OFF").click(function () {
			url = "IO_Input.html";
			name = '"Bootstrap_DB".Device1';
			val = 0;
			sdata = escape(name) + '=' + val;
			$.post(url, sdata, function (result) {});
		});
	}); 
</script>
  1. 数值写入PLC
//这个和按下按钮控制变量的实现机制是一样的,只不过需要有个输入框,输入框也需要有一个唯一的id值
<input class="form-control" type="text" placeholder="输入任意值" id="setValue">
和按钮触发的代码唯一不同的是,val变量处不能给定1或者0,而是要从输入框元素中获取,当然还是靠id值找到输入框
$("#setWrite").click(function () {
			url = "IO_Input.html";
			name = '"Bootstrap_DB".Tag1';
			val = $('input[id=setValue]').val();
			sdata = escape(name) + '=' + val;
			$.post(url, sdata, function (result) {});
		});
  1. 图形显示
//再来说一种,有些时候希望一个Bool变量不是单纯的在网页端显示1或者0,而是能用图形来进行显示,这个也是可以实现的,当然首先还是你要给img元素一个唯一的id值
<img id="Lamp3" src='image/Lamp00.png' alt="">
//那怎么替换图片呢,自然是通过改变src属性的值就可以,可以通过在脚本里面判断一个与图片相关的变量的值,当这个值变化是,对应的图片的src属性也跟着变化,这段代码就是判断按钮按下后,灯泡变量
if (data.Device3 == true) {
		$("#Lamp3").attr("src",'image/Lamp01.png')
}

参考官网1200 网页发布

标签:function,自定义,Bootstrap,DB,1200,1500,html,test,id
From: https://www.cnblogs.com/xiacuncun/p/18159249

相关文章

  • 一起了解开源自定义表单的优势表现
    随着社会的进步和科技的发展,越来越多的中小企业希望采用更为先进的软件平台,助力企业实现高效率的流程化管理。低代码技术平台、开源自定义表单已经慢慢走入大众视野,成为一款灵活、高效的数字化转型工具。流辰信息专注于低代码技术平台的研发与创新工作,竭尽全力为通信业、电力、高......
  • VS2017+QT5.9.1 自定义loggerControl
    创建自定义类LoggerControl继承QListWidget#pragmaonce#include<QListWidget>#include"Helper.h"#include<QTime>#include<QPainter>classLoggerControl:publicQListWidget{Q_OBJECTpublic:LoggerControl(QWidget*paren......
  • 删除字符串中与另一个字符串中的相同字母的自定义函数
    #include<stdio.h>/********************************************************************* 函数名称: str_DestDel* 函数功能:删除一个字符串中与另一个字符串中的相同字母并且不区分大小写* 函数参数:* @strA 需要操作的字符串* @strB 作为参考的字......
  • YOLOV8训练自定义数据集
    一、仓库地址YOLOV8二、数据预处理2.1将标注数据按照类别划分到不同的文件目录#单独筛选某一类缺陷importnumpyasnpimportos#shutil:操作多文件或者文件集合(复制、移除等)importshutil#------------------------------------------------------------------##作......
  • vue + Ant Design Vue 表格自定义勾选状态
     //勾选规则//1.勾选当前不勾联动选子级//2.勾选当前需要联动勾选父级//3.勾选当前取消需要联动取消子级和联动取消父级,如果存在平级则不取消父级<template><a-spin:spinning="state.spining"><div><a-modalref="mModal"id="mModal"class="partial......
  • VMware ESXi 8.0U2b macOS Unlocker HP (惠普) HPE (慧与) OEM 定制版自定义镜像
    VMwareESXi8.0U2bmacOSUnlockerHP(惠普)HPE(慧与)OEM定制版自定义镜像ESXi8.0U2标准版,Dell(戴尔)、HPE(慧与)、Lenovo(联想)、Inspur(浪潮)、Cisco(思科)、Hitachi(日立)、Fujitsu(富士通)、NEC(日电)OEM定制版请访问原文链接:VMwareESXi8.0U2bmacOSUn......
  • VMware ESXi 8.0U2b macOS Unlocker Dell (戴尔) OEM 定制版自定义镜像 A06
    VMwareESXi8.0U2bmacOSUnlockerDell(戴尔)OEM定制版自定义镜像A06ESXi8.0U2标准版,Dell(戴尔)、HPE(慧与)、Lenovo(联想)、Inspur(浪潮)、Cisco(思科)、Hitachi(日立)、Fujitsu(富士通)、NEC(日电)OEM定制版请访问原文链接:VMwareESXi8.0U2bmacOSUnlocke......
  • VMware ESXi 7.0U3p macOS Unlocker HP (惠普) HPE (慧与) OEM 定制版自定义镜像
    VMwareESXi7.0U3pmacOSUnlockerHP(惠普)HPE(慧与)OEM定制版自定义镜像ESXi7.0U3标准版,Dell(戴尔)、HPE(慧与)、Lenovo(联想)、Inspur(浪潮)、Cisco(思科)、Hitachi(日立)、Fujitsu(富士通)、NEC(日电)OEM定制版请访问原文链接:VMwareESXi7.0U3pmacOSUn......
  • VMware ESXi 7.0U3p macOS Unlocker Dell (戴尔) OEM 定制版自定义镜像 A20
    VMwareESXi7.0U3pmacOSUnlockerDell(戴尔)OEM定制版自定义镜像A20ESXi7.0U3标准版,Dell(戴尔)、HPE(慧与)、Lenovo(联想)、Inspur(浪潮)、Cisco(思科)、Hitachi(日立)、Fujitsu(富士通)、NEC(日电)OEM定制版请访问原文链接:VMwareESXi7.0U3pmacOSUnlocke......
  • 总结一下公共字段(aop加自定义注解加反射)
    应用场景在一些业务类的创建中,我们需要反复对不同的类的同一个属性进行赋值,那么问题就出现了**代码冗余**如何解决呢思路:利用aop创造一个切面如何创造一个切面呢实质上就是扫描加设置增强位置那么如何扫描到对应的赋值方法上呢这里需要用到自定义注解了自定义注解://这......