暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

解密TC 3 HMI,让PLC工程师开始网页设计

Lizzy的倍福园地 2021-07-13
3698

在工作中实践总结

在朋友圈分享讨论

做最接地气的公众号


内容摘要

本文旨在使用户对TC3 HMI 有原理性的了解,打消对HTML的顾虑,并且随时可以着手进行HMI开发以实现HMI开发的常用功能为导向,解读TC3 HMI的基本用法以及两千多页操作手册的内容。针对涉及HTML和JavaScript的部分做了通俗易懂的解释,并从自动化工程师的角度描述它们在TC3 HMI中的用法。

关键词

TC3 HMI,HTMLCSSJavaScriptJson

适用范围

不懂网页设计但要用TC3 HMI开发的自动化工程师


前言
TC3 HMIBeckhoff公司的组态软件,自推出市场以来,以其功能先进、扩展性强为广大国内客户所熟知。它最大特点是基于HTML5,使用浏览器打开指定网址就可以访问产线或者设备的组态画面。无疑这对最终用户很有吸引力,但对开发者却是个挑战:因为TC3 HMI涉及的HTMLCSSJava ScriptJson等知识对于自动化工程师而言太过陌生,毕竟大家不是做网页设计的。如果把TC 3 HMI比喻成屠龙宝刀,怎么舞得好另说,可怎么才舞得动? 
TC 3 HMI涉及的HTML技术真的那么高深吗?作为一个对HTML完全外行的自动化工程师,我花一周的时间亲历了从门外到门内的过程,结论是:除了Java Script算一种编程语言之外,HTMLCSSJSON都只是格式语言,用LD的工程师能学会ST,用ST的工程师就能学会Java Script,触类旁通而已,实在不必望而生畏。
所有的技术活最后都会变成体力活,一件艺术精品的呈现不是高屋建瓴侃侃而谈就能做到,而是躬身入局孜孜不倦地“实现”。一套完美的人机操作界面也是这样,TC3 HMI只是提供工具,而最终的作品需要工程师的经验、审美和对操作工人的感同身受,以及最重要的——实现!
下面是我根据自己的学习体会,整理的知识要点,希望你在“实现”的过程中可以更轻松更高效更加游刃有余。

 

目录

1     TC3 HMI入门

1.1   资料下载和安装

1.2   学习Quick Start

1.3   常用控件

1.4   常用功能

1.5   熟悉TcHMI Package提供的控件

1.5.1  用这些控件做画面

1.5.2  JavaScript访问控件

2     控件导入和导出功能

2.1   创建和导出TcHMI Package

2.2   导出现有项目中引用的Package

2.3   导入TcHMI Package

3     导入开源的代码

3.1   如何导入一个开源的控件

3.2   导入的开源.js脚本

3.3   .js脚本中使用PLC变量

4     问题和猜想

4.1   Question

4.2   Idea

5     学习资料

5.1   JAVA Script学习

5.1.1   资料

5.1.2   相对于PLC语言,JS的特点

5.1.3   TC3 HMI Function使用的JavaScript

5.1.4   C3 HMI的控件Event中执行的嵌入式脚本

5.2   Json学习

5.2.1   学习资料

5.2.2   什么是JSON

5.2.3   Json字符串的构成

5.2.4   Json字符串读入到Java Script对象

5.2.5   Tc 3 HMIFunction配套.json文件

5.3   HTML学习资料

5.3.1   HTML 是网页描述语言

5.3.2   HTML 标签

5.3.3   Tc3 HMI 中的HTML

5.4   CSS学习

5.4.1   学习资料

5.4.2   什么是CSS

5.4.3   TC3 HMI中的CSS文件



全文8700余字,阅读约需7分钟

PDF原文及相关例程:

http://www.baclizzy.com.cn//2020/0220/Tc3HMIstudy



1     TC3 HMI入门

1.1   资料下载和安装

(1) VS2017社区版

vs_community__1354608913.1581581688.exe

从微软官网下载,1.2M,安装时需要连网。安装选项“通用Windows开发平台”和“ASP.netWeb开发”,需要18.67G空间。网速10Mb/s以内,安装持续约一个小时,比以前安装VS2015VS2013快得多。


第一次使用前需要注册一个微软帐号,激活该帐号以后即可长期使用。

安装最新版的VS和最新版的TC3是为了使用最新版的TC3 HMI的所有功能,比如自建Framework就需要C#web组件,只装VS Shell就不行。


 (2)TC31-Full-Setup.3.1.4024.4.zip

从倍福官网下载,1012M

 (3)TE2000-HMI-Engineering.exe

从倍福官网下载,398M

 (4)TF2000-HMIServer.exe

从倍福官网下载,30M

 (5)TE2000_TC3_HMI_EN.pdf

从倍福官网下载,47M

 

1.2   学习Quick Start

TE2000_TC3_HMI_EN2020.pdf

Version 1.6,2020-01-22

4章:Quick StartPage 27-41

一字不落,对照每个功能测试。这是对界面的熟悉过程,不可以跨越。


1.3   常用控件

 (1)        历史曲线

 (2)        报警

 (3)        配方功能

 (4)        用户管理

这部分内容,手册很清楚,网校上的资料和培训视频也齐全。

我没有一个个试,相信不会有难度。


1.4   常用功能

 (1)        项目发布

手册第5.11 Publishing,第110页。

写得很清楚,连上硬件应该没有什么变数。

 (2)        PLC配置

默认PLC1是本机的851端,适用于ServerPLC在同一台控制器。

如果一个Server要访问多个PLC的数据,才需要配置。

手册13.1 ADS,第600页。

 (3)        主题(Theme

主题的使用比较简单,可以从按钮的Event事件去切换主题,也可以用JavaScript通过API函数去读取或者选择。至于每个主题要修改哪些控件的默认配置,可以手动在.theme文件中配置。理论上每个控件的每个属性都可以修改,并且修改过的控件会以加粗显示: 

高阶用户也可以在JS脚本中调用API函数“SetAttributeToThemeValue”去修改当前活动主题的某个属性值。


1.5   熟悉TcHMI Package提供的控件

1.5.1      用这些控件做画面

快速浏览第6章:

ControlsPage 132-521

这一章可以当字典查询,但不宜一项一项地照着测试。即使要查询的时候,也是打开一个Sample再对照手册来查询,然后修改Sample,以加深对控件的理解。 

速读以下章节:

6.2 Beckhoff控件:工具箱中所有可以插入画面的单个可视控件的配置说明
6.3 SystemControl对界面布局、指代、调用等后台运行复杂功能的控件,比如ContrainerRegionViewGrid都是在Quick Start中使用过的。
6.5 Framework Controls,在这一节讲得很简略,但其实很常用。倍福的综合示例“TC3_HMI_Sample”中就引用了现成的Framwork. 

1.5.2      JavaScript访问控件

手册第15章 Framework

最重要的是15.1.1 TcHmi,这里有倍福提供的所有组的API接口,就是在JavaScript中如何使用这些组件。实际上,在可视化界面做的任何设置,后台都会自动解释成JavaScript脚本,并且可以在Code视图中查看。只是为了兼容传统组态软件的用户习惯,保留了可视化的配置界面。


2     控件导入和导出功能

TC3 HMI很讲究模块化编程,最终的HMI项目一定是基于很多自定义的控件。所以HMI开发人员的必备技能之一就是控件的单个或者批量导入和导出。

手册第5 

5.13 Package Management 

2.1   创建和导出TcHMI Package

 (1)        新建TwinCAT HMI项目

选择TwinCAT HMI | Extensibility |TwinCAT Framework Control(JS)

表示用Java Script,也可以选其它两个使用C#

如果没有安装完整版的Visual Studio,就会提示没有模版,建不了Extensibility项目。

 (2)        导出Package

手册第5 

5.13.1 Creating a Package

导出的时候要选择路径。

比如选择Export to local repository,就会存到

C:\TwinCAT\Functions\TE2000-HMI-Engineering\References

 

2.2   导出现有项目中引用的Package

引用Package之前,这个Package的来源可能是自己做的,也可能是别人给的,也可能是看到某个项目里用到了一些你感兴趣的控件。比如: 

如何从现有项目中提取Package呢?可以定位到该项目的.hmipkgs路径下查看,比如:

\TC3_HMI_Sample\TcHmiProject\TcHmiApplicationSample\.hmipkgs 

.tchmipkg文件复制到PC以下路径:

C:\TwinCAT\Functions\TE2000-HMI-Engineering\References”,就可以在其它项目中安装使用这个Package了。

 

2.3   导入TcHMI Package

 (1)        基本步骤

手册第5.13.2节 Install a Package

C:\TwinCAT\Functions\TE2000-HMI-Engineering\References”下如果有自定义Package,就可以在HMI项目的Reference右键菜单选择“Manage TwinCAT HMI Packages”进行安装: 

Install要花的时间比较长,要耐心等待。等Install按钮变成“Uninstall”就表示安装成功。此时再打开Toolbox,就发现工具箱中就多了HMI:Additional. 

 

 (2)        遇到的问题及解决办法

提示缺.json文件

直接在新项目中插入Reference中添加的TcHmiNavBar时,提示报错: 

描述文件.json找不到,但是在指定的项目下并没有这样一个Description.json,实际上注册后这个Json文件在HMI项目的以下路径:

\.hmipkgs\97e05807-cd3f-439b-bec0-f0136d33f504\Content\ 

解决办法:关闭VS后重新打开,就可以装载了。 

- Event配置中的非标Function是如何输入的?

这个问题在Package的引用无关,是通用的控件配置问题。即:调用TcHmiNavBar的时候,onAttached的动作中,LoadContent以及SetLocale等是怎么输入的?因为选是选择不出来,只能手动输入,但是手动输从哪里打开? 

以及:

解决办法:从界面的Code中可以找到并编辑。可见辅助编辑的可视化界面不是万能的。 

-      自定义组件的说明书

自定义的组件是否配说明书或者功能视频?如果是正式发布或者授权的Package,作者当然会配说明书,但如果本来就是免费共享,就需要使用者自行摸索了。

对于普通TC HMI用户,可能连这个Framework都没有包括。所以“收藏”“开源社区”“导入导出”这是必备技能,否则完全靠一个工程师自己做出一个机器的界面,是非常困难的。

 

3     导入开源的代码

3.1   如何导入一个开源的控件

以“切西瓜”游戏为例

 (1) 拷入相关文件

将它的Html和相关的图片Logo都拷入项目文件夹。

 (2) 创建一个Iframe,并指定Source为某个html文件 

 

Region.Target> Game.content > Iframe.Src > Index.html  > all.js 

 (3)        Index文件中指定.js文件

游戏的代码就在.js里面,而相关的图片、声音、图标,都需要Copy到项目路径下。因为.js文件会引用这些图片、声音和图标,如果没有这些文件或者放的路径不对,.js文件就会执行不了。 

 (4)        运行效果 

 (5)  扩展:如何让游戏与PLC变量关联?

.js文件中,利用函数读取PLC变量,并参与游戏进程。

这个方法可以导入任何网页版游戏,或者其它感兴趣的内容。

 

3.2   导入的开源.js脚本

 (1) 把核心代码的.js文件复制到CodeBehind,并添加现有项: 

 (2) 新建一个JavaScriptFunction

新建引用echartsFunction 

命名为FunctionJS2,此时它的.json文件也自动建立了: 

 

双击.js文件,可以看到模板已经自动添加的代码: 

用户代码将添加到红线框的位置。

 (3)        View或者Content的画面上创建一个Contrainer 

并在它的Framework.onAttached事件中指定Function 

 (4)        把下载的js实现代码粘贴到FunctionJS2 

注意dom的用法,如果不声明一个dom,引用的控件就无法初始化。TcHmiContainer_2是准备放这个控件实例的容器名字。

Option中的代码隐藏了,里面是对控件的各个元素赋值。每个控件都会不一样,例中echartOption是这样的:

option = {

            title: {
                text: ''
            },
            tooltip: {
                trigger: 'axis',
                axisPointer: {
                    type: 'cross',
                    label: {
                        backgroundColor: '#6a7985'
                    }
                }
            },
            legend: {
                data: ['湖北', '广东', '浙江', '河南', '湖南']
            },
            toolbox: {
                feature: {
                    saveAsImage: {}
                }
            },
            grid: {
                left: '3%',
                right: '4%',
                bottom: '3%',
                containLabel: true
            },
            xAxis: [
                {
                    type: 'category',
                    boundaryGap: false,
                    data: ['02/01', '02/02','02/03', '02/04', '02/05', '02/06', '02/07']
                }
            ],
            yAxis: [
                {
                    type: 'value'
                }
            ],
            series: [
                {
                    name: '湖北',
                    type: 'line',
                    stack: '总量',
                    areaStyle: { normal: {} },
 
                    data: [820, 932, 901, 934,1290, 1330, 1320]
                },

 (5) 显示效果 

可以看到几条曲线显示的值,都是Opiton中定义的固定值

 

3.3   .js脚本中使用PLC变量

例如前面显示曲线的例子,对于自动化项目来说,这些数据通常都来自PLC,曲线应该是根据PLC变量的值动态变化的。这个示例中,Series[]中的Data值,就不该是一个常量组成的数组,而应该是一个数组变量。假如要用在画面中显示本周新冠肺炎各省确诊病例的趋势图,就可以在上述示例中增加以下步骤:

 (1) PLC中新建一个结构体“ST_SARS2”,

TYPEST_SARS2 :
STRUCT
       Hubei:            ARRAY[1..7]OF INT:=[100,20,30,35,38,40,41];
       Guangdong:    ARRAY[1..7] OF INT:=[10,100,30,35,38,40,41];
       Zhejiang:ARRAY[1..7] OF INT:=[10,20,100,35,38,40,41];
       Sichuan:  ARRAY[1..7] OF INT:=[10,20,30,100,38,40,41];
       Beijing:   ARRAY[1..7] OF INT:=[10,20,30,35,100,40,41];
       Shanghai:ARRAY[1..7] OF INT:=[10,20,30,35,38,100,41];
END_STRUCT
END_TYPE

 

并在Main中声明一个变量“arrayChina”:

arrayChina : ST_SARS2;

 (2) FunctionJS2.js中用SetInterval刷新数据

FunctionJS2.js的脚本中,并用SetInterval ( function{ }, 200 )200ms用函数Symol.ReadEx读取一次数组arrayChina的值:

var myData= null;
var data =[];
setInterval(function() {
   TcHmi.Symbol.readEx2("%s%PLC1.MAIN.arrayChina%/s%", function(data) {  if (data.error ===TcHmi.Errors.NONE) {  myData = data.value; }
            },200);

 (3) 同样在SetInterval中利用读取的数据刷新曲线

读入的值myData可以用来刷新Echart的曲线,例如:

myChart.setOption({
series:[{name: '湖北',
     type: 'line',
     stack: '总量',
areaStyle:{ normal: {} },
     data: myData.Hubei}] });

 (4) 运行结果

 

对照PLC变量arrayChina中的数据:

       Hubei: ARRAY[1..7]OF INT:=[100,20,30,35,38,40,41];
       Guangdong:ARRAY[1..7] OF INT:=[10,100,30,35,38,40,41];
       Zhejiang:ARRAY[1..7]OF INT:=[10,20,100,35,38,40,41];
       Sichuan:  ARRAY[1..7]OF INT:=[10,20,30,100,38,40,41];
       Beijing:   ARRAY[1..7]OF INT:=[10,20,30,35,100,40,41];
       Shanghai:ARRAY[1..7]OF INT:=[10,20,30,35,38,100,41]; 

可见图表中显示的正是结构体arrayChina中的数据

 (5) 扩展:如果显示的数组大小变化

如果希望显示不只是7天,而是10天的数据,应该怎么办呢?

-      修改PLC中的结构体中数组的大小

TYPEST_SARS2 :
STRUCT
       Hubei:            ARRAY[1..10]OF INT:=[100,20,30,35,38,40,41];
       Guangdong:    ARRAY[1..10] OF INT:=[10,100,30,35,38,40,41];
       Zhejiang:ARRAY[1..10] OF INT:=[10,20,100,35,38,40,41];
       Sichuan:  ARRAY[1..10] OF INT:=[10,20,30,100,38,40,41];
       Beijing:   ARRAY[1..10] OF INT:=[10,20,30,35,100,40,41];
       Shanghai:ARRAY[1..10] OF INT:=[10,20,30,35,38,100,41];    
       strDate:  ARRAY[1..10] OF STRING(8):=['02/01', '02/02', '02/03', '02/04','02/05', '02/06', '02/07', '02/08', '02/09', '02/10'];
END_STRUCT
END_TYPE

注意,为了不在.js代码中由于数组大小的不确定而修改X轴的标记,特意在结构体中增加strData数组,以初始化将来在界面上显示的日期字符。

-      修改.js文件中X轴的显示

       setInterval(function () {
           TcHmi.Symbol.readEx2("%s%PLC1.MAIN.arrayChina%/s%", function(data) {
                if (data.error ===TcHmi.Errors.NONE) {
                    myData = data.value;
                }
            });
            myChart.setOption({               
                xAxis: [
                    {
                        type: 'category',
                        boundaryGap: false,
                        data: myData.strDate
                    }
                ],
                series: [ 
                ]
            });
        }, 200)
        if (option && typeof option ==="object") {
            myChart.setOption(option, true);
        }

-      运行结果 

这样就不必为每次显示的数组大小而修改代码了。 

 (6)扩展:如果要修改曲线的显示方式

本例中这是几条曲线迭加的效果而不是独立显示的,这个效果是在控件的核心代码echarts.min.js中定义的,如果想修改曲线的显示方式而控件本身又没有开放相应的接口,就只能自己打开源代码去修改了。

有兴趣的话可以打开echarts.min.js来看看: 

echarts.min.js的代码放在Word中显示,需占用170A4纸: 

 

可见要写一个好用的控件相当不容易,好在互连网可以汇集众人的力量。而TC3 HMI开放了引用.js文件的功能,就等于是让用户站在众人的肩膀上进行创作,而不是使用组态软件厂家有限的控件。当然,要使用无限的互联网资源,学习一些JavaScript的知识也是必不可少的。 

 (7)        示例代码

详见“JS中引用PLC变量.zip

 

4     问题和猜想

4.1   Question

 (1)        如果开发HMI的人没有PLC项目源码

TC3 HMI的开发环境中,如何通过PLC项目文件获取变量,比如tpy或者tmc?

2020/02.14的新品介绍“beckhoff_新产品_16x9_cn.pptx”显示:Tc3 HMIVersion 1.12支持TMC文件。

 (2)        如果变量多,还是推荐组成结构体吗?

显然TC3 HMI有从ServerPLC读数结构体的能力,鉴于底层还是ADS通讯,所以其它高级语言与PLCADS通讯的经验/教训仍然适用。成千上万个离散的变量,放到哪种通讯都是效率很低的。

 

4.2   Idea

 (1)        Code界面 vs 可视化界面

熟悉js的工程师,完全可以在记事本而不是TC3 HMI中开发界面。可视化配置界面确实不是必须的,Code视图中的内容才是。

传统的组态软件用户习惯在可视化界面操作,而熟悉JavaScriptTcHMI的用户理论上可以脱离可视化界面而直接在Code视图中编辑。实际上确实可以用记事本打开.view文件,当然也可以修改。

现实的做法是,优先使用可视化的配置界面,仅当需要添加配置界面没有提供的功能,才自己进入Code界面进行脚本编辑。

 (2)        thinkmore

.view文件只包含div语句,不能冠以<html><body>执行,否则会执行报错。而尝试在.view中加入<p>这种最常用的HTML标签,则运行时既不报错,也不显示。

要验证.view的工作原理,可以在Chrome浏览器打开网页的时候,显示其HTML代码(默认快捷键 Ctrl+Shift+I)也许可以发现一些线索。不过这与TC3HMI的正常使用没有关系了,纯属个人好奇。

总之,TC3 HMI 不允许在最底层执行HTML文件。HTML文件只能以Iframe.Source的形式引用到HMI项目。


5     学习资料

5.1   JAVA Script学习

5.1.1      资料

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript

凡是在TE2000手册上搜索不到的Method,都可以在这个JAVA学习网站上找到。

 

虽然这里有完整的教程和参考资料,但是Tc HMI的用户并不需要完整阅读,因为TC HMI并不要求从零搭一个网站,绝大部分做网页的功能已经在模板中自动实现了。在这个网站上只要查询一些基本的语法、函数就可以了。如果是简单的普及性的内容,也可以查看百度文库中的两个简易资料(见附件):

       JavaScript(课件).ppt

       JAVA-SCRIPT入门学习.pdf 

5.1.2       相对于PLC语言,JS的特点

 (1)        关于句尾的“;”,推荐添加,但是也可以不加

 (2)        注释:js中注释用 *  */,而HTML中用 <!-- -->

后者在Tc3 HMI的编辑器中会自动成对。<p></p>等字符也有智能输入功能,只要写一个< 就会弹出p a picture等供选择。

 (3)        变量和函数声明都不需要指定类型          

 (4)        对象种类

其对象除了标准的数组、日期、字符串、数字等内置对象之外,还有浏览器对象和ActiveX对象以及自定义对象。比如TcHmi中定义的对象ServerSymbol

 (5)        执行条件在()里面,而执行代码在{}里面

-      IF语句

条件在If ( ) 的括号里,没有Then,满足条件要执行的代码在{}中。表示判断的等于,用两个“=”连起来,即“==”。而一个“=”就表示赋值。例如: 

-      Switch语句

Switch类似PLCST语言中的CASE语句,但是选择分支的变量用括号,而以Casen 来分开不同的分支: 

-      ForWhile 

注意For ( )的条件,要执行的代码用{ }而不是用DO来引导。 

 (6)        ST写法不同的几个常用运算符

求余       %    
不等于    !=    
自累加    x++,等效于X:=X+1  
自递减    x--,等效于X:=X-1     
指数运算       **
逻辑与    &&
逻辑或    ||
逻辑非    !

5.1.3      TC3 HMI Function使用的JavaScript

参考示例02_TC_Example_EL9227.tnzip,其中只用JavaScript来创建Funtion,用到的语法很少。

 (1)        典形的Function

 

-      JSON文件

在可视化界面中编辑参数更加方便,虽然TC3 HMI也提供了它的代码。在代码或者可视化界面中的修改结果是等效的。


 (2)        Functionjs文件基本格式 

(function (TcHmi) {

    var AddAmpere = function (current){

        returncurrent.toString().concat(' A');

   };   

   TcHmi.Functions.registerFunction('AddAmpere',AddAmpere);  

})(TcHmi);

这段代码中,只要定义好Funtion的名称AddAmpere(新建对象时命名)后,除了黄色部分外,都是自动生成的。而参数current等,在自动生成的子文件Name.function.json中定义。并且增减参数后,JavaScript中的function()中的参数也会自动更新。 

 (3)        固定组成部分

-      函数声明

(function(TcHmi) {
})(TcHmi);

-      函数注册

TcHmi.Functions.registerFunction('MySum',MySum); 

其中,TcHmi是个固定的指代,而.Functions按理并行的还有很多子元素,但是在JavaSritpt编辑器中没有Smart Coding功能,所以只能有样学样。同理,.regesterFuntion也是这样。在手册中找到了TcHmi下的内容,比如TcHmi.Functions.registerFunction 

在手册中查看TcHmi,完整的内容列表如下: 

其中包括:

NameSpace:比如ControlsFunctionsiFunctionsLog

Classs: 比如ServerSymbolThemeView

Functions

Enumerations

Interfaces:比如ColorFontStyle 

这些都是HMI开发才会用到的特别对象,可以用JavaScript来访问,而在写PLC程序的时候是完全不会涉及这些内容的。比如要表达一个颜色,PLC里面用一个长整数就可以表达,而在HMI里要表达颜色就要用专门的InterfaceColor 

 (4)        示例中用到的语法

-  ToString()Concat

AddAmpere:  return current.toString().concat(' A');
AddMilliSeconds:  return number.toString().concat(' ms');
AddPercent :  return number.toString().concat(' %'); 

在许多ClassMethod中,都包括了ToString。在TC HMI手册中搜索可得,例如: 

 

字符串的连接运算,不是TcHmi定义的,而是JS的语法,在“JAVA-SCRIPT入门学习.pdf”第7页有写。另外,关于toString(),在该书中也有提到。  

-ToFixed( )

MilliVoltToVolt      return (voltage/10).toFixed(1).concat('V');

ToFixed这个函数在TE2000的手册中没有,在“JAVA-SCRIPT入门学习.pdf”中也没有。在JAVA学习网站上找到ToFixed的用法描述:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed 

-Switch……CaseSymbol.ReadEx

CharIndexToString 的代码:

switch(charIndex)   {
       case 1: returnTcHmi.Symbol.readEx('%l%charStandard%/l%');
       case 2: returnTcHmi.Symbol.readEx('%l%charTypeF%/l%');
       case 3: returnTcHmi.Symbol.readEx('%l%charTypeT%/l%');
       case 4: returnTcHmi.Symbol.readEx('%l%charManual%/l%');
       default: return 'Unknown';
       }
OpModeIndexToString 的代码:
switch(index)  {
case 0:returnTcHmi.Symbol.readEx('%l%opModeStandAlone%/l%');
case 1:returnTcHmi.Symbol.readEx('%l%opModeEtherCat%/l%');

default: return 'Unknown';
       } 

Switch类似PLCST语言中的CASE语句,是JS的标准语法,不用解释。 

Symbol.readEx则可以从TE2000手册中找到这个方法: 

-      GaugeRangeColor(可选)

ColorGauge 
varColorGauge = function (current,warningLvl)return'[ 
{"color": { "color": "rgba(0, 151, 59,1)"},   
"start":0.0,"end":' +warningLvl*current/100 + '},  
{ "color": { "color": "rgba(220, 131,0, 1)"},   
"start":'+ warningLvl*current/100 + ', "end":' + 1.1*current + '}, 
{"color": {"color": "rgba(230, 0, 0,1)" },  
"start":'+1.1*current+' ,"end":'+current*1.5+'}
]';

       这个函数返回的类型比较特别,需要断句来看。实际上,它返回的是一个数组,共3个元素,每个元素又是一个结构体,包括ColorStartEnd。至于为什么要这样写,为什么时Color而不是Colour,这应该不是英式英语和美式英语的差别,而是在Gauge这个控件里确定的参数名称。用("color": "rgba(0, 151, 59,1)")表示一个颜色,是TcHMI基础框架的约定。      

5.1.4 TC3 HMI的控件Event中执行的嵌入式脚本

 

写在这里的Code,实际上是位于控件所在的Contend或者View的代码中,把这部分代码Copy到一个独立的Funtion中,本质上没有区别。 

5.2 Json学习

5.2.1 学习资料

https://www.w3school.com.cn/json/index.asp

5.2.2 什么是JSON

JSON(JavaScriptObject Notation) 是一种表达对象的文本格式。根据百度百科:JSON JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。

JSON 简单的语法格式和清晰的层次结构明显要比 XML 容易阅读,并且在数据交换方面,由于 JSON 所使用的字符要比 XML 少得多,可以大大节约传输数据所占用的带宽。所以IoT通讯中与云端交换数据也采用json格式。

5.2.3 Json字符串的构成

要表达中国几个省份包括的城市,Json字符串表达为: 

{
   "name": "中国",
   "province": [
{  "name":"黑龙江",
     "cities": {"city":["哈尔滨", "大庆"] }
           }, 
{  "name": "广东",
    "cities": {"city":["广州", "深圳", "珠海"] }
            }, 
{  "name": "台湾",
   "cities": { "city":["台北", "高雄"] }
            },
 
{  "name": "新疆",
   "cities": { "city":["乌鲁木齐"] }
           }
]
}

整个字符串只包含几个关键字符

{} 一个对象要用{}括起来
[]  如果值是数组,所有元素要用[]括起来
:   键名和键值之间用:分隔
,   数组的各元素之间用,分隔
“” 键名和键值,都用“”括起来

5.2.4 Json字符串读入到Java Script对象

var obj ={a: 'Hello', b: 'World'};   //这是一个对象,对应PLC就是结构体类型的变量,结构体包含两个元素ab,其值分别为字符串Hello和字符串Word
var json ='{"a": "Hello", "b": "World"}';  //这是一个字符串,并且符合json规则

要实现从JSON字符串转换为JS对象,使用 JSON.parse() 方法:

var obj =JSON.parse('{"a": "Hello", "b":"World"}'); //结果是 {a: 'Hello',b: 'World'} 

要实现从JS对象转换为JSON字符串,使用 JSON.stringify() 方法:

var json =JSON.stringify({a: 'Hello', b: 'World'}); //结果是 '{"a": "Hello", "b": "World"}' 

可见在json字符串中,变量名,变量值,都用双引号括起来了。

5.2.5 Tc 3 HMIFunction配套.json文件

 (1)  TC3 HMI中的Json文件

TC HMI中的Json文件是新建对象的时候自动生成的。比如创建一个Funtion(JS),系统就会自动创建同名的Json描述文件。但是CodeBehind.js文件就不会配套生成Json文件: 

 (2)  TCHMI提供比字符串更友好的可视化界面

如果用记事本打开 Functionjson文件,可以看到它包括一个总的描述,和若干个Argument,每个Argument有相同的属性需要填写。了解Json格式当然有助于裸眼阅读Json字符串,但Tc HMI中提供更加友好的可视化界面: 

用户甚至可以忽略Json格式,直接在这里编辑变量,后面就动自动生成相应的符合Json格式的字符串。

 

5.3HTML学习资料

5.3.1HTML 是用来描述网页的一种语言

HTML 指的是超文本标记语言 (Hyper Text Markup Language),它不是一种编程语言,而是一种标记语言 (markup language),它有一整套标记标签 (markup tag)HMTL文件就使用这些标记标签来描述网页。

-      HTML 文档 = 网页

HTML 文档描述网页,它包含 HTML 标签和纯文本。Web 浏览器的作用是读取 HTML 文档,并以网页的形式显示出它们。浏览器不会显示 HTML 标签,而是使用标签来解释页面的内容。

用记事本在写几行HTML语句,另存为.html文件,就可以用浏览器打开它演示网页效果,非常简单。 

5.3.2  HTML 标签

HTML 标签是由尖括号包围的关键词,通常是成对出现的,比如 <b> </b>,比如 <html></html>。带“/”的是结束标签,要放在后面。 

-     常用标签 

<html>……</html>

<head>……</head>

<body>……</body>

<p>……</p>:段落

<h1>……</h1>:一级标题,同理h2就是二级标题,最多到h6

<a>……</a>:链接

<br>……</br>:换行 

复杂一点的标签:<div>……</div>,这是布局,可以嵌套,TC3 HMI中用得非常多。

当然还有许多其它标签,可以表达复杂的格式,但是TC3 用户只要知道html的原理、简单用法、基本规则就可以了。如果碰到了之前不熟悉的标签,再到网上去查:

https://www.w3school.com.cn/html5/index.asp 

- HTML HTML5

后者只是增加了一些新的标签类型,可以更好更简洁地表达一些流行的对象,比如更好的音乐、视频播放。TC3 HMI支持HTML5 

5.3.3Tc3 HMI 中的HTML

初学者不需要自己编辑HTML文件,网页都是Tc3 HMI开发环境根据用户选择的控件、设置的参数在后台自己生成的。

用户可以通过Iframe并指定其Source(选项CommonSrc)链接到某个HTML文件来实现在Tc3 HMI的画面框架内的指定区域显示网页。例如3.1节中介绍的的导入一个网页版游戏。

高阶用户可以用这种方式实现自由的网页设计。


5.4 CSS学习

5.4.1学习资料

https://www.w3school.com.cn/cssref/index.asp 

5.4.2什么是CSS

根据百度百科,CSS指层叠样式表(英文全称:Cascading Style Sheets)。是一种用来表现HTMLXML等文件样式的计算机语言。

CSS定义样式结构,如字体、颜色、位置等,用于描述网页上的信息格式化和实现的方式。CSS样式可以直接存储于HTML网页或者单独一个带有文件扩展名.css的“样式单”文件。

CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。修改CSS就可以更新与之相关的所有页面元素。所以,CSS的规范是HTML规范的一个子集。即使不用CSSHTML也能把需要表达的格式表达出来,只是有了CSS表达起来更方便,类似“宏”或者“子程序”的作用。

-      HTML中的CSS

<head>
<styletype="text/css">
body{background-color: red}
p{margin-left: 20px}
</style>
</head>

 

-      独立的CSS文件

head>
<linkrel="stylesheet" type="text/css"href="mystyle.css">
</head>

具体的格式,就在mystyle.css中定义。

 

5.4.3TC3 HMI中的CSS文件

 (1)  项目下的.css文件

项目自有的.css文件只有两个:

TcHmiProject1\bin\Themes\Base\Style.css (TC3 Build 4022.4项目有但低版本的没有)

TcHmiProject1\bin\Fonts\Fonts.css (高低版本都有) 

其余.css文件都在“\TcHmiProject1\bin\Libraries\Controls\”的“\Beckhoff\System”下

每个子文件夹表示一个控件,每个控件都包含一个Style.css 

示例中通常都没有修改CSS的格式,相关CSS的代码都是自动生成的。 

 (2) 模板自带.css文件的内容

- Style.css

这个模板自带的Style.css文件中只对字体进行了定义。如果用户需要更丰富的格式显示,应该在相应主题下去修改Style.css文件即可。

/**
关于Tc HMI的字体包容性
我们默认引用Roboto Condensed(在文件夹Fonts中)作为网页字体,如果客户端的系统语言为于拉丁文、希腊文、越南文、西里尔等,将使用该字体恢复网页显示。
对于Roboto不能还原的象形文字,我们则使用预装的备用语言。
对于中文字符,各操作系统使用的恢复显示字体为:微软雅黑(Windows操作系统),Hiragino Sans GB(苹果操作系统),'Noto Sans CJK SC/TC' (安卓操作系统)'WenQuanYi Micro Hei' (Linux操作系统)
对于日文字符,各操作系统使用的恢复字体为:'Meiryo' (Windows操作系统), 'Hiragino Kaku Gothic Pro' (苹果操作系统), 'Noto Sans CJK JP' (安卓操作系统)
如果要使用其它字体,你可以把Woff文件添加到TcHmi项目并自行添加一个 @font-face Section(节)
谷歌的noto家族尝试覆盖所有应用,该功能可以免费使用,并且与Roboto匹配良好。
请参考:https//www.google.com//get///noto/and https//fonts.google.com//earlyaccess 
字体的使用在当前活动主题的主CSS文件中定义,例如 Themes/Base/Style.css)。*/ 
html {
    font-family:RobotoCondensed,
        'Microsoft YaHei', '微软雅黑',
        'Hiragino Sans GB', '冬青黑体',
        'STXihei', '华文细黑',
        'WenQuanYi Micro Hei',
        'Meiryo', 'メイリオ',
        'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ ProN',
        'Noto Sans CJK SC', 'Noto Sans CJK TC','Noto Sans CJK JP', 'Noto Sans CJK KR',
        sans-serif
        ;
    font-size: 12px;
    font-style: normal;
    font-weight: normal;
} 
-      Fonts.css
@font-face{       
    font-family: RobotoCondensed;
    src: url(Roboto-Condensed-webfont.woff);
}
 /**
关于Tc HMI的字体包容性
我们默认引用Roboto Condensed(在文件夹Fonts中)作为网页字体,如果客户端的系统语言为于拉丁文、希腊文、越南文、西里尔等,将使用该字体恢复网页显示。
对于Roboto不能还原的象形文字,我们则使用预装的备用语言。
对于中文字符,各操作系统使用的恢复显示字体为:微软雅黑(Windows操作系统),Hiragino Sans GB(苹果操作系统),'Noto Sans CJK SC/TC' (安卓操作系统)'WenQuanYi Micro Hei' (Linux操作系统)
对于日文字符,各操作系统使用的恢复字体为:'Meiryo' (Windows操作系统), 'Hiragino Kaku Gothic Pro' (苹果操作系统), 'Noto Sans CJK JP' (安卓操作系统)
如果要使用其它字体,你可以把Woff文件添加到TcHmi项目并自行添加一个 @font-face Section(节)
谷歌的noto家族尝试覆盖所有应用,该功能可以免费使用,并且与Roboto匹配良好。
请参考:https//www.google.com//get///noto/and https//fonts.google.com//earlyaccess 
字体的使用在当前活动主题的主CSS文件中定义,例如 Themes/Base/Style.css)。*/

END

用IE浏览器可访问本文的PDF完整版:

http://www.baclizzy.com.cn/2020/0220

示例程序和配套文档推荐用FTP工具下载:

ftp://baclizzy.com.cn:21/Lizzy的倍福园地/2020/0220

喜欢本文?识别二维码,可关注公众号

文章转载自Lizzy的倍福园地,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论