为啥要用脚本语言
CTRL 语言是WinCC OA 的内置脚本语言,很容易上手,他的语法跟C语言很相似,但是没有C语言中复杂的指针操作,很多小伙伴会想,为什么WinCC OA 要自己实现一套脚本语言,直接使用C不就得了?
WinCC OA 是使用C/C++作为其核心语言的一款SCADA软件, C/C++语言是编译型语言,性能高,但我们使用这种类型的语言去实现SCADA的时候,会有一些问题,项目中的一丁点修改就需要重新编译,小项目还好,大项目编译起来是非常浪费时间的,尤其是SCADA软件讲究的就是支持工程师快速的修改并实现,这是软件设计中很重要的一个设计原则,依赖倒置原则,简要来说就是我们要将一些容易变化的代码,抽象出来,使整个系统耦合度更松,基于这个WinCC OA 团队基于C++实现了CTRL 语言,让我们非常方便的进行组态,同时CTRL封装了很多软件的专业性技术,使得我们更容易上手
对于语法的学习 建议大家参照官方文档 ,文档中有很详细的说明, 本篇文章主要针对于,日常我们用到的数据类型/结构 做一个简单整理
常用数据类型:
anytype
int
long
float
double
bool
char
string
langString
注: WinCC OA 中float 与double 是等价的
langString 用于界面的多语言实现
anytype 顾名思义 任何类型, 系统会根据上下文做类型推导
动态数组 每种基本类型都能衍生出一个动态数组类型
dyn_anytype
dyn_int
dyn_long
dyn_float
dyn_double
dyn_bool
dyn_char
dyn_string
dyn_langString
对于数组的操作 WinCC OA 提供了很多函数,大家不妨自己试一下,动态数组是一个日常我们经常用到的数据类型
注:对于数组的遍历,需要注意,OA默认从1开始(大多数语言从0开始),这可能跟工控人员的操作习惯有关
dyn_string fruitList;
dynAppend(fruitList,"apple");
dynAppend(fruitList,"banana");
dynAppend(fruitList,"orange");
// 注意遍历操作 从1开始
for(int i = 1;i<=fruitList.count();i++)
{
DebugN(fruitList[i]);
}
所有的基础数据类型 也有动态二维数组 dyn_dyn_double ,这里就不一 一说明了.
Mapping
Mapping 直译过来 映射的意思 是一个非常重要的数据结构,简而言之,他就是一个键值对,( 键:就是存的值的编号;值:就是要存放的数据),使用起来就跟查字典差不多,很多书籍也说这是一种字典结构(这里只是笼统的说,实际上根据实现的不同,有很多细分的叫法,这里不详细说明)
对于mapping的使用建议相关函数都要了解
使用WinCC OA 的mapping 数据类型 能够很容易的组织自己的逻辑结构,同时与其他系统交互时mapping数据类型与jsong格式的数据很容易进行转换,便于大家做接口与扩展
/ /这里使用mapping 组织自己的逻辑结构
mapping OACoder;
OACoder["name"]="eric";
OACoder["age"]=18;
mapping address;
address["city"]="DALIAN";
address["area"]="HIGH TECH";
OACoder["addr"] = address;
线程操作:
对于一些耗时的任务 我们应该单独封装起来 启用一个单独的线程进程操作
WinCC OA 的多线程操作非常简单
通过startThread()函数 传递需要运行的函数名,就可以完成一个线程的操作
void myFunction()
{
int a;
for (a = 0; a < 10; a++)
DebugN(getThreadId(), a);
}
main()
{
startThread("myFunction");
startThread("myFunction");
}