西门子scl语言编程手册_高级工程师必备‖详解西门子SCL语言编程附案例,赶紧收藏...

本文详细介绍了西门子SCL编程语言,这是一种类似于PASCAL的高级语言,适用于SIMATIC S7系列。SCL适合处理复杂运算和数据管理任务,可以编译为STL。文章讲解了SCL的特点、与STL的对比、安装使用、软件兼容性、示例程序、常见问题解答,包括如何加密程序、如何调用FC/FB、如何访问数据块等内容,帮助读者深入理解和应用SCL编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一:S7-SCL简介

S7-SCL(Structured Control Language 结构化控制语言) 具有以下特点:

是一种类似于PASCAL的高级编程语言,符合国际标准IEC 61131-3PLCopen基础级认证适用于 SIMATIC S7-300 (推荐用于CPU314以上CPU), S7-400, C7 and WinACS7-SCL 为 PLC 做了优化处理,它不仅仅具有 PLC 典型的元素(例如 输入/输出,定时器,计数器,符号表),而且具有高级语言的特性, 例如:循环、选择、分支、数组、高级函数

S7-SCL 其非常适合于如下任务:

复杂运算功能

复杂数学函数

数据管理

过程优化


第二:S7-SCL 与 STL

S7-SCL 可以编译成 STL, 虽然其代码量相对于 STL 编程有所增加,但我们更关心的是程序结构和程序的总体效率。类似于计算机行业的发展,汇编语言已经被舍弃,取而代之的是 C/C++等高级语言。S7-SCL 对工程设计人员要求较高,需要其具有一定的计算机高级语言的知识和编程技巧。


第三:S7-SCL 的安装与使用

STEP7 标准版并不包括 S7-SCL 软件包及授权,需单独购买,STEP7 Professional 版包括了S7-SCL 的软件包及授权,安装即可。在 S7 程序中,S7-SCL 块可以与其它 STEP7 编程语言生成的块互相调用。S7-SCL 生成的块也可以作为库文件被其它语言引用。由于 S7-SCL 程序由 ASCII 文本构成,所以它非常容易被导入或导出。


第四:S7-SCL 软件兼容性

不同 S7-SCL 软件版本与 STEP7 及操作系统之间的兼容性:图中的 X 表示兼容,- 表示不兼容

仅仅 S7-SCL V5.1+SP1或以后版本支持

仅仅 S7-SCL V5.1+SP1或以后版本支持

仅仅 S7-SCL V5.1+SP1或以后版本支持


第五:S7-SCL 简单示例

在下面的例子中,编写一个完成软件滤波程序的 FB1, 程序每调用一次 FB1, 其采集一个新的过程变量,存储在 FIFO 堆栈中,共 10 个周期的采样值,超过 10 个周期的采样值将被舍弃。程序将此 10 个采样值中的最大最小值找出,并计算出除去最大值及最小值之后的平均值。

平均值(滤波输出)=(10 个采样值之和-最大值-最小值)/8 平均值(非滤波输出)=转换后的实时采样值

新建项目,插入 SCL Source

7878591e062db71b61b13a35ae921a4f.png

双击,SCLSource 打开 SCL 环境,并使用 FB 模板

accff11490c7ff5b74e28a873ffd9fb0.png

更改 FB编号

ab678db82775cce7c0ddfe380b7faf2b.png

使用参数模板

93ac8eb00eb7ce81f7c6e2e7d4206eb3.png

编辑 FB参数

959de4fc027d2684d1539078b406e32e.png

使用调用功能块向导

41200340d3ee3534b8f7f8f7adaccec6.png

调用 FC105

66102feb43b06d819380f1e8eb5edb9a.png

由于在 SCL中调用了 FC105, 还需在 SIMATIC Manager 将 FC105 添加到项目中

3190fa15f4e3ef9a4abda6f3cc5c2c3e.png

FC105 复制到当前项目中

869d3757e36882adb2f6f9e4bba72fe8.png

FB1 参数定义

eff4845bf9a37db6384b2741a39e0f81.png

FC105调用

3a2fc6c28775ea6a7a82adee35124abf.png

下面的程序中使用了判断条件,在此使用 IF 模板

640ad283dfa48712b3b6c743ef04ad8d.png

使用 IF, FOR-NEXT等高级语言的方式,很容易就可编写出滤波程序

d33ae0e683ee12a3d496c4fcac2c6ade.png

在菜单 Option-Customize中选择生成调试信息

92abd00ce8b0d946af42e2cf523a1900.png

在菜单的 File-Compile编译没有错误后,就可以生成 FB1 了,在 OB35 中可以调用 FB1,下载整个项目后监控 OB35:

输出参数 SCALED_VAL 为实时的采样值

输出参数 SCALED_FILTED 为滤波后的采样值

假设OB35的执行周期为T, 如果某时刻采样值发生变化,那么此数值将不同于以前的多个采样值,此数值可能被认定为最大值或最小值,而最大值或最小值将被忽略,这样就实现了滤波的效果。当采样值发生变化,并维持了大于等于2T的时间,此时的输入值的两次采样值会被滤掉一个采样值,而另一个采样值将参与平均值的运算。

7e4673f49aea052d6125946bd803765a.png

可以在高级语言界面下监控 FB1

5b4e2f1048c5c05d1f8913df8639f778.png

至此,一个简单的 S7-SCL 程序示例就结束了,本文中仅是对其非常简单的作了介绍。任何编程语言都有其复杂性,并非一朝一夕就可掌握。


第六:S7-SCL 常见问题

问题:S7-SCL 支持哪些 STEP7 块,与其它语言有什么关系?

解答:S7-SCL 支持如下 STEP7 的块:OB,FC,FB,DB,UDT。在 S7 程序中,S7-SCL 块可以与其它STEP7 编程语言生成的块互相调用。S7-SCL 可以被编译成 STL, S7-SCL 生成的块也可以作为库文件被其它语言引用。由于 S7-SCL 程序由 ASCII 文本构成,所以它非常容易被导入或导出。


问题:如何规范地的开发一个 S7-SCL 程序?

解答:开发一个 S7-SCL 程序,应当遵循如下流程:

规划需要的块类型,即程序的整体结构。如:是否仅仅一个 FC就可满足要求,还是需要生成其它 OB, FB 等

规划子任务(FB,FC等等)

定义各个子任务的之间输入/输出接口

定义各个子任务在原文件中的顺序及调用关系

定义符号表

编译检查

下载调试


问题:如何加密我的 S7-SCL 程序?

解答:S7-SCL 程序加密与 STL 程序加密方法几乎一样,用户可以在程序中加入关键字:

KNOW_HOW_PROTECT,再进行编译即可,下图中的 FC1 在编译后,即出现了加锁保护的图标 。注意:提供给最终用户的项目中应当删除 S7-SCL 源代码,否则用户在双击加密的块后(例如下图中的 FC1),依然可以关联打开 S7-SCL 源代码。

020a9f9c03af24338ebfb73a0fb83dad.png

问题:为什么双击打开 S7-SCL 类型的程序后,显示的格式却是 STL 格式?

解答:S7-SCL 程序编译后生成的执行代码实际上为 STL 格式,如下图中的 FC1, 虽然其标示为 SCL格式,但如果用户将 Source 目录中的 FC1 的源文件删除后,再双击打开 FC1 后,显示的将为 STL 格式。

a5e113ec5f8a5981abc33aa63c95ebc5.png

注意:提供给最终用户的项目中如果删除 S7-SCL 源代码,用户将只能看到 STL 格式的程序,稍微复杂些的 S7-SCL 程序在 STL 格式下几乎是无法阅读的。此方法类似于加密的效果。


问题:什么是 OK Flag?

解答:在 S7-SCL 程序中,OK 是一个布尔类型的特殊本地变量。它用来显示块执行是否正确。

OK 标志的使用与 STL 编程中对于 FC/FB 的 ENO 处理(STL 是用状态字的 BR 位来保存状态)非常相似。在程序的开始,可以将 OK 标志赋值为 TURE,如果程序执行有错误(例如 0 作为除数),则当程序退出时,用户通过程序将 OK 标志改写为 FALSE,此数值将被存储在输出参数 ENO 当中。OK 标志是一个系统变量,不需要定义,如果用户希望在程序中使用此标志,可以在 S7-SCL 编程菜单 Options>Customize>Compiler 中,应当选择 Set OK flag.项。否则 ENO 将无法被评估。

OK 标志使用的例子:

OK:= TRUE;

Division:= 1 / IN;

IF OK THEN // 除法操作正常

;// 此处可以添加在除法操作正常情况下,其它的用户程序

ELSE //除法操作不正常;// : END_IF;


问题:在 STL 中可以读取一个组织块的信息 (例如 OB1 中的循环时间),在 S7-SCL 中是否存在同样的可能?

解答:STEP7 中的任意 OB 块在生成之后,其内部都自动生成一些特有的临时变量,例如 OB1 中的变量 OB1_PREV_CYCLE 即为 CPU 上个扫描周期所用的时间。在 S7-SCL 编辑器中,通过“Insert > Block Template > OB”创建一个 OB 模板。在缺省情况下,此模板的临时变量区域将创建一个 ARRAY OF BYTE 类型的临时变量。此区域与 OB 块的临时变量区域是相对应的,但由于没有变量名称标识,并且数据类型也不相同,所以用户使用起来非常不方便。如果用户想要使用S7-SCL 格式的 OB 块内的特有变量,请按下列步骤进行:

1.在路径STEP7 的安装路径 Step7S7DATAS7wiz 下,包含所有 OB 块的 STL 格式模板, 可以使用写字板打开这些模板 (例如 awl), 并复制相应变量定义。

2.创建一个新的 S7-SCL源文件并插入刚才复制的变量定义。

3.调整 S7-SCL源文件中的语法结构

4.在这个程序的开始部分,可以设置 "Title" 和"Version" , 例如 和 Version= '0.1'

5.在 BEGIN语句后面插入一个分号,至此,即完成格式修改。

另外,也可以打开本文中的 S7-SCL 例子目录中的 OB_Templ 项目,其中包括了 44 个 S7-SCL 源文件格式的组织块。


问题:如何理解 FC/SFC 的输出参数 RET_VAL(返回值)?

解答:对于此问题,如果读者对 PASCAL 语言或者高级编程语言非常熟悉,可能此问题就非常容易解释。许多 SFC (系统功能) 都有输出参数 RET_VAL (返回值) ,它提供一个可供评估的错误代码。STEP 7 在线帮助中提供有更多关于系统功能和输出参数 RET_VAL 的信息。通过在 SIMATIC 管理器中选中 SFC 然后按“F1”键可以获取相关的在线帮助信息。

同样,一个 FC 也可以返回一个结果,下面给出了一些例子,说明了如何在 S7-SCL 中调用带有返回值 (RET_VAL) 的功能 (FC 或 SFC)。

定义 FC1, 函数类型为 INT (返回值)

f915861f552b4a69a8943d1b5973b672.png

调用一个系统功能 (SFC24):当调用系统功能 SFC 24“TEST_DB”(测试数据块) 时,得到关于 CPU主内存中一个数据块的信息。SFC24 确定指定 DB 的数据字节数,并检查该 DB 是否受到写保护。

选定 DB 所包含的数据字节数通过参数“DB_LENGTH”输出,参数“WRITE_PROT”包含关于选定 DB 的写保护 ID 的信息 (FALSE 表示没有写保护)。


问题:在 S7-SCL 程序中,PLC 中的地址标识与 STL/LAD 中的地址标识有何区别,使用中有何注意事项?

解答:在 S7-SCL 程序中,PLC 中的地址标识与 STL/LAD 中的地址标识基本相同,方便了编程人员快速掌握 S7-SCL 语言。下图为 PLC 中的 S7-SCL 程序地址标识格式:

图中一些格式有些特殊,实际上,下面的格式在 S7-SCL 中都是正确的。

DB1.D0.0:=DB1.DBX0.1;

DB1.DB1:=DB1.DBB1;

DB1.DW2:=DB1.DBW2;

DB1.DD4:=DB1.DBD4;

QX0.0:=Q0.0;

IX0.0:=I0.0;

MX0.0:=M0.0;

所以说,在一般情况下,编程人员依旧可以 STL 的标识方式用于 S7-SCL。

注意:如果数据块编号及地址都使用了间接寻址方式,则必须使用 S7-SCL 特定的标识方式,例如

如下语句:

STATUS_1:=WORD_TO_BLOCK (INDEX).DW [COUNTER]; (此格式正确)

STATUS_1:=WORD_TO_BLOCK (INDEX).DBW [COUNTER]; (此格式错误)

S7-SCL 中的 PLC 地址格式

2f8a229e80b7447c9b6dd2bb4324352c.png

x 可以为 0 至 65535 之间的数字(绝对地址)

y 可以为 0 至 7 之间的数字(位地址)

对于其它 FB,OB,DB, T,C 等等的标识格式,S7-SCL 格式基本与 STL 格式相同,此处不做说明。


问题:为什么用户人工输入的程序在编译时经常提示语法错误?

解答:S7-SCL 程序和所有的高级语言一样,有着自己特定的语法,而很多编程人员容易在人工输入程序时忽视语法格式,这样就造成编译错误。因此强烈建议编程人员使用 S7-SCL 的模板向导。

在菜单 Insert 中,提供了 Block Call, Block Template, Control Structure, 三个向导,用户可以通过使用此向导,提高输入效率。例如在下图中指出了两个常见错误,用户如果使用向导,就不容易出错误:

d919cd86718bf6aa19e69bade984ee9f.png

S7-SCL 常见的录入格式错误


问题:如何对 S7-SCL 程序中的数据块及静态变量初始化?

解答:S7-SCL 程序中对数据块及静态变量初始化和 STL 语言格式类似,下面的程序列出了正确格式:

DAT1 : REAL := 100.5; A1 : INT := 10 ;

A2 : STRING[6] := 'FACTOR';

A3 : ARRAY[1..12] OF REAL := 0.0, 10(100.0), 1.0;


问题:什么是“AT”指令,如何使用?

解答: AT 指令是 S7-SCL 中特有的一个指令,初学者可能会忽略此指令,或者对其理解不够深刻。AT 指令在 S7-SCL 中有着非常重要的地位,很多应用程序都必须使用此指令。下面将对此指令进行详细讲解。

AT 指令可以使用户能够以不同的数据类型来访问一个已经声明的变量。此指令类似于高

级编程语言中的“继承”概念。此指令有如下特点:

特点一:定义仅在块内有效,在接口参数中不出现

特点二:在块中可以使用其它数据类型的视图

特点三:它只是让另外一些变量继承了某个变量的特性,仅仅数据类型是新的,其它特性相同。

下面将通过具体程序对以上三个特点进行说明,首先定义 UDT100,UDT200,大小都为 12 个字节, 但结构不同。UDT100 包括一个 DATE_AND_TIME 数据类型(8 个字节),还包括一个实数(4 个字节);UDT200 包括 6 个字(12 个字节);在 FC2 定义输入参数 Buffer, Frame1,Frame2:

特点一:定义仅在块内有效,在接口参数中不出现。块内定以的输入参数有 3 个,但仅在块内有效,在接口参数仅出现 Buffer 输入参数

cbf0e47f3f667c43a8f709418afca537.png

AT 指令特点说明(a)

9a315151f559ea277098795745530333.png

AT 指 令 特 点 说 明 (b)

AT 指令应用例子 1:在 STL 中,用户如果希望取得 MB0 的某一位的数值是非常容易的,例如第 3 位,直接寻址 M0.2 就可以了。而在 S7-SCL 中,由于其具备高级语言的特点,所以定义的变量的绝对地址一般是不显现的。因此在 STL 中简单的操作,在 S7-SCL 中却复杂起来。但是通过使用AT 指令即可解决这个问题。下图中的例子中,当输入的某个字节,其输出依次为此字节的 8 个位。

588946eee985dee58569b65265ae8911.png

AT 指令应用例子 2:在 S7-SCL 中,ANY 数据类型的使用,经常会伴随着 AT 指令的使用,下面的例子演示了如何拆分改写 ANY 数据类型中的内容。程序执行结果相当于:

CALL "BLKMOV"

SRCBLK :=P#DB1.DBX 0.0 BYTE 10 RET_VAL:=MW0

DSTBLK :=P#DB1.DBX 0.0 BYTE 10

2441ed6f5adc6a62e57707034f406a20.png

AT 指令在使用当中,还有如下注意事项:

AT指令用于对某个变量进行其它数据类型的声明时,必须放在此变量的声明语句后面

AT指令生成的变量不可以初始化

AT指令用于对某个变量其它数据类型的声明时,占用内存大小要小于等于此变量的长度

AT指令用于对某个变量其它数据类型的声明时,如下的组合是允许的

bb63c2e30df76fb989ccd92d75ef687d.png

AT 指令使用限制

AT 指令用于 ANY 类型在 VAR_OUT 中是不允许的

Elementary (基本数据类型包括) :BOOL, BYTE, WORD, DWORD, INT, DINT, DATE, TIME, S5TIME, CHAR

Complex (复杂数据类型包括) :ARRAY, STRUCT, DATE_AND_TIME, STRING


问题:S7-SCL 程序中如何使用多重背景?

解答:S7-SCL 程序中可以使用多重背景,下面的程序列出了正确格式,声明完成后,在程序中即可调用:

Supply1 : FB10; //将 Supply1 定义为 FB10 类型

Supply2,Supply3,Supply4 : FB100; //将 Supply2,Supply3,Supply4 定义为 FB100 类型


问题:如何在 S7-SCL 程序中实现数据块间接寻址?

解答:S7-SCL 程序中对数据块间接寻址提供了良好的支持,编程也很简单。下面的程序列出了正确格式:

STATUS_1:= DB11.DW[COUNTER]; //字节间接寻址

STATUS_2:= DB12.DX[WNO, BITNO]; //位间接寻址,用户改变 WNO,BITNO 数值即可STATUS_1:= Database1.DW[COUNTER]; // Database1 为 DB 类型的本地变量STATUS_2:= Database2.DX[WNO, BITNO];

STATUS_1:= WORD_TO_BLOCK_DB(INDEX).DW[COUNTER];

//INDEX 被定义为 BLOCK_DB 数据类型,COUNTER 为整数数据类型,这样可以实现/数据块编号, 字节地址同时间接寻址,此功能是一种功能很强间接寻址方式。

//以下是数据块直接寻址方式格式,仅供参考。

STATUSBYTE :=DB101.DB10; //字节直接寻址格式

STATUS_3 :=DB30.D1.1; //位直接寻址格式

MEASVAL :=DB25.DW20; //字直接寻址格式STATUSBYTE :=Status_data.DB10;

STATUS_3 :="New data".D1.1;

MEASVAL :=Measdata.DW20;

STATUS_1 :=WORD_TO_BLOCK_DB (INDEX).DW10;


问题:在 S7-SCL 程序中调用 FC/FB 与在 STL/LAD 中调用 FB/FC 有何区别?

解答:在 STL/LAD 程序中调用 FB 可以不把参数填写完整,但在 S7-SCL 程序中调用 FB 时,必须把FB 参数填写完整;对于FC 的调用S7-SCL 与STL/LAD 区别不大。强烈建议编程人员使用S7-SCL 的模板向导调用 FB。下图的程序说明了两者的区别:

733f1648dd98c71b36ac3e1e688d04c4.png

问题:为了将 S7-SCL 中的位数据类型(BYTE, WORD 或 DWORD)转换到“REAL”数据类型时, 需要使用哪种数据类型转换程序?

解答:为了将 S7-SCL 中的位数据类型(BYTE, WORD 或 DWORD)转换到数字数据类型“REAL”时,需要使用以下指令:

从 BYTE 到REAL:“DINT_TO_REAL(DWORD_TO_DINT(BYTE_TO_DWORD(value))”

从 WORD到 REAL:

“DINT_TO_REAL(DWORD_TO_DINT(WORD_TO_DWORD(value))”

从 DWORD到 REAL:

“DINT_TO_REAL(DWORD_TO_DINT(value))”

注意事项:用户在将 BYTE, WORD 或 DWORD 数据类型转换到 “REAL” 数据类型时,S7-SCL 中常见的错误可以参考下例:

从 WORD 到 REAL:“DWORD_TO_REAL(WORD_TO_DWORD(value))”(错误程序)。

如果执行了这一转换,会得到错误的结果。

原因:DINT_TO_REAL 函数将把源数据转换并按照 IEEE REAL 的格式存储到目的变量,而

DWORD_TO_REAL 仅仅是从源数据拷贝位串至目的变量。

因此,为了获得正确的“ REAL ”数,必须总是通过中间步骤“ DWORD_TO_DINT ”和“DINT_TO_REAL”实现。


问题:在 S7-SCL 中如何区分某个变量名是本地变量,还是符号名?

解答:S7-SCL 中本地变量与符号名的引用有如下区别:

如果引用中只有变量名,则此变量为本地变量,如:Motor_Status:=Motor_1

如果引用中变量名称上包括“”,则此变量为符号名,如:Motor_Status:=“Motor_1”


问题:如何访问一个字符串中的单个字符?

解答:对于字符串中的单个字符,使用如下的访问格式,是错误的:

MB10 := str[5] 这样的表达式无法实现将字符串的第 5 个字符送至 MB10 中。方法:可以使用 IEC 函数 MID 来得到字符串的某个部分,例子如下:

VAR

str : STRING[20];

END_VAR

MB10:=CHAR_TO_BYTE(STRING_TO_CHAR(MID(IN:=str,L:=1,P:=5)));


问题:如何在访问结构时优化运行时间?

解答:如果需要多次访问一个结构,可在 S7-SCL 代码中也创建一个同样类型的临时变量来优化运行时间。用户可在临时变量声明中生成此变量,并在程序中多次使用它。假设用户希望完成如下操作:

DB4.Field.Value:= DB4.Field.Value1*DB4.Field.Value2*DB4.Field.Value3;

可见以上操作数都存在于 DB 的结构当中,在不进行优化的情况下,这段程序在运行时,将多次打开数据块,进行多次读取操作,程序运行所需时间较多。

fce361a1dc48600d67047fb140e1a6b2.png

定义数据块

解决方法:在 FC4 中声明一个与 DB4 中“field”变量结构相同的临时变量(例如“Temp”)。然后使用如下语句从 DB4 中将数据拷贝到临时存储区内:

Temp:=field;

对以上所描述的语句,可将 DB 变量“DB4.Field”替代为临时变量“Temp”:

field.Value:=Temp.Value1*Temp.Value2*Temp.Value3;

此时数据块中的数值被复制到 CPU 的 L 堆栈当中,在后续程序中,可以使用这些 L 堆栈中的临时变量替代原来数据块中的变量,由于 CPU 对 L 堆栈的访问速度远快于对数据块的访问速度,这样就实现了数据访问的优化。

e

584459c9181466a510225a381e7ff753.png

优化数据块访问

注意事项:变量声明“VAR_TEMP”存储在 CPU 的堆栈中。这可能会在小型 CPU 模块中导致堆栈溢出。因此使用临时变量要慎重。


问题:如何用布尔型变量优化 IF 语句来缩短循环时间?

解答:在优化 IF 语句后,S7-SCL 代码将变得更为紧凑,这样代码序列的处理就更快。程序计算的布尔类型数据相同,优化后事件仅分配给一个变量。相对于简化格式,IF 语句完整格式编程时需要加载另一个跳转和一个常量 (TRUE 或 FALSE) 。

示例 1:

当一个模拟量值(REAL 变量)超过限定(此处是 100)时设置一个比特位。

函数“IF_Test”包含了查询限定值的 IF 语句。整个 IF 语句可用以下语句代替:

IF_Test:= (100 < value) 。

b4b5b45ab6361c968f5338bbff2f838c.png

IF 语句不同格式(a)

示例 2:

查询在一个 WORD 变量中指定比特位 X 是否置位。

这里函数 BitX 的 IF 语句由以下语句代替:BitX:= status = 16#0004。

a0aa4a44c4018af39800ecb0bf447a4d.png

IF 语句不同格式(b)

注意事项:紧凑的 IF 语句加快了程序处理速度,但是优化处理可能使得程序变得不够清晰和难于理解。


问题:为什么我的 S7-SCL 程序在自己的计算机上编译正常,在别人的计算机上却打不开或无法编译?

解答:应当确认其它计算机是否安装了 S7-SCL 环境,而且要检查 S7-SCL 环境版本,例如:S7-SCL V5.3 SP1 提供了新的函数(SEL,MAX,MIN,LIMIT,MUX,BYTE_TO_INT,INT_TO_BYTE 等等),旧

版本无法识别这些函数。如果用户程序中使用了这些函数,在旧版本的 S7-SCL 环境下无法通过编译。


问题:为什么我的程序与别人的程序完全一致,却通不过编译?

解答:除了前面问题所需注意的事项外,符号表是初学者经常忽略的因素,这里额外单独强调一下。用户在编写 S7-SCL 程序源代码时,对符号进行良好的定义,可以使编程清晰易懂。而初学者经常仅仅复制其他人的源代码,却忘记复制符号表,以至于在 S7-SCL 程序中经常出现不清楚的名称定义,从而导致编译错误。


问题:为什么包含比较类型为 WORD/DWORD 的变量的 IF 语句不能被编译通过?

解答:当在 IF 指令内比较操作数时,如果变量声明为 WORD 和 DWORD 类型,S7-SCL 仅允许比较操作“=”和“<>”,而不允许比较操作“>”和“<”。作为一种补救措施,建议将变量类型声 明为 DINT。如果变量的类型不能声明为 DINT,在此比较之前则必须首先进行类型转换。


问题:当给一个双字类型变量分配了一个实型数值时,出现非法数据类型错误

解答:当给一个双字类型变量分配了一个实型数值时,出现"Invalid data type"消息,是由于数据类型不匹配造成的。注意仅当数据类型为 BOOL, BYTE, WORD 和 DWORD 时,允许对 DB 块的绝对地址访问。下图举例说明何时数据类型必须转换.

ba3d7178723f10fabb6f847398645791.png

问题:在输出窗口中的错误消息与程序行数字不符

解答:当 S7-SCL 程序行数超过 65535, S7-SCL 编译器把行计数器重新从 1 开始计数。例如,在 S7-SCL 源程序中,一个编程错误出现在第 65537 行, 以下行数字将被输出:"F: L 00001 error xyz”, 而不是 "F: L 65537 error xyz"

解决方法:双击 S7-SCL 编译器输出窗口中的错误消息,光标将跳至不正确的行。如果编程错误不在所指示的行,你可以使用菜单命令"Edit > Go To > Line..."然后输入" 65536 + 显示错误数字"跳至有错误语句的行。


问题:"The FB is not available or the instance declaration is missing"

解答:此消息出现在当一个 FC/FB/SFB/SFC 块在程序中被调用时,该块却不包含在块文件夹下。

解决方法 1:手动复制相关的程序块到 BLOCK 文件夹中然后重新编译 S7-SCL。

解决方法 2:调用 FC/FB/SFB/SFC 时,使用 S7-SCL 菜单中的 Insert>Block Call 向导,S7-SCL 将会自动将此 FC/FB/SFB/SFC 复制到当前的 BLOCK 目录中,从而避免以上情况出现。


问题:"Character strings have different lengths"

解答:示例中包含 FC1 和 FC2 带有字符串变量"name_1" 与"name_2", 当 FC1 被编译时,得到警告"Character strings have different lengths"。在运行期间,在赋值的右侧("name_1")可能是一个比左侧所允许的 STRING 变量("name_2")具有更长长度的 STRING 字符串。

解决方法:我们建议予左侧的变量"name_2"声明一个长度为 254 字符的 STRING 字符串。如果你编译具有这种声明的功能 FC2,上述警告将不会出现。

359dba58abd5d2d7ebc827b5c5863279.png

注意:如果你声明长达 254 字符的 STRING 字符串,将会需要更大的本地装载存储空间


问题:CPU 消息"STOP due to unknown OP code"

解答:当你在 S7-SCL 中使用转换功能"WORD_TO_BLOCK_DB(...)",并且编辑以下语句时该消息会被发出:

Display: = WORD_TO_INT (BYTE_TO_WORD (WORD_TO_BLOCK_DB (DBNo).DB [DBIndex]));

解决方法:我们建议以以下给出的两行语句来替代上面的语句:

tmp := WORD_TO_BLOCK_DB (DBNo).DB[DBIndex];

Display := WORD_TO_INT (BYTE_TO_WORD (tmp));


问题:在编译 UDT 时出现"Syntax error with UNLINKED"

解答:如果一个 UDT 在用"UNLINKED"声明之前已标识,该 UDT 不会被编译通过。"UNLINKED"属性不可用于 UDT。编译将会以错误消息"Syntax error with UNLINKED"结束。该规则也应用于 STL 源程序声明。UDT 通常不装载到 S7 CPU 中,而总是存储于"离线"的 S7 用户程序。

相关知识:对于"UNLINKED"数据块属性,意味着 DB 块有以下特性:

仅仅存储于装载存储器中

不占据任何 RAM空间。

"UNLINKED"属性声明在数据块的头部

与程序没有关联关系

d6f6c7a0c68158cb5980ab8b82112039.png

数据块的 UNLINKIF 属性


问题:在编译 DB 时出现"Syntax error with 2#1100_1100"

解答:如果你赋一个二进制数字作为初始值给一个数据块中 BYTE 类型的变量,编译 S7-SCL 源程序时将出现错误消息"Syntax error with 2#..."

例如:Var1: BYTE:= b#2#1100_1100;

在 S7-SCL, 数据块由 AWL 编译器生成。如果你在数据块准备部分和赋值部分同时初始化变量,你必须使用 AWL 专用符号。因此在示例中的 BYTE 类型的变量,仅允许指定十六进制数字作为初始值。S7-SCL 符号 (例如 B#2#1100_1100) 只可用在代码区,因为 S7-SCL 编译器只在代码区被使用。解决方法:将二进制数字改为十六进制数字作为初始值,

例如:Var1: BYTE: = b#16#cc;


问题:为什么我的程序编译通过,但无法运行?

解答:当使用 S7-SCL 语言时,建议使用的 CPU 类型 最低为 CPU314。即便如此,用户也应当注意系统资源的限制。例如:当定义临时变量的时候,不要超过所用 CPU 技术参数中的本地数据大小的限制。否则可能导致程序无法运行。


问题:为什么我的程序无法被监控?

解答:为了程序可以被监控,在编译 S7-SCL 程序时,在菜单 Options>Customize>Compiler 中, 应当选择 Create debug info 项。注意:Create object code 项也应当被选择,否则程序编译时仅仅作语法检查,而不生成可执行程序。Optimize object code 项也应当被选择,此选项将优化程序代码。


问题:在 S7-SCL 哪些变量在监控时无法被显示?解答:在监控时,如下变量无法被显示:

复杂数据类型不被显示,但复杂数据类型中的基本数据类型可以被显示(例如字节数组中的某个字节)

DATE_AND_TIME、STRING、BLOCK_FB、BLOCK_FC、BLOCK_DB、BLOCK_SDB、TIMER、

COUNTER 不被显示

以符号格式访问的数据块不被显示,例如:"myDB".DW0, "myDB" 为某个数据块的符号名注意:有时候监控变量的数据超出了 CPU 能够提供的资源数量,也将出现部分无法显示的情况。

### 解决 IntelliJ IDEA 中 `@Autowired` 注解导致的红色波浪线错误 在使用 Spring 框架时,如果遇到 `@Autowired` 注解下的依赖注入对象显示为红色波浪线错误或者黄色警告的情况,通常是由以下几个原因引起的: #### 1. **Spring 插件未启用** 如果 Spring 支持插件未被激活,则可能导致 IDE 无法识别 `@Autowired` 或其他 Spring 特定的功能。可以通过以下方式解决问题: - 打开设置菜单:`File -> Settings -> Plugins`。 - 确认已安装并启用了名为 “Spring Framework Support” 的官方插件[^1]。 #### 2. **项目配置文件缺失或不正确** Spring 需要通过 XML 文件、Java Config 类或其他形式来定义 Bean 定义。如果没有正确加载这些配置文件,可能会导致 `@Autowired` 报错。 - 确保项目的 `applicationContext.xml` 或者基于 Java 的配置类(带有 `@Configuration` 和 `@Bean` 注解)已被正确定义和引入。 - 对于 Spring Boot 项目,确认是否存在 `spring.factories` 文件以及是否包含了必要的组件扫描路径[^3]。 #### 3. **模块依赖关系问题** 当前模块可能缺少对 Spring Core 或 Context 组件库的有效引用。这可能是由于 Maven/Gradle 构建工具中的依赖项声明不足造成的。 - 检查 `pom.xml` (Maven) 或 `build.gradle` (Gradle),确保包含如下核心依赖之一: ```xml <!-- For Maven --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> ``` ```gradle // For Gradle implementation 'org.springframework:spring-context:${springVersion}' ``` - 更新项目依赖树以应用更改:右键点击项目根目录 -> `Maven -> Reload Project` 或运行命令 `./gradlew build --refresh-dependencies`。 #### 4. **IDE 缓存损坏** Intellij IDEA 的缓存机制有时会因各种因素而失效,从而引发误报错误。清除缓存可以有效缓解此类情况。 - 使用快捷组合键 `Ctrl + Alt + Shift + S` 进入项目结构对话框;也可以尝试执行操作序列:`File -> Invalidate Caches / Restart... -> Invalidate and Restart`. #### 5. **启动异常影响正常解析** 若之前存在类似 `com.intellij.diagnostic.PluginException` 的严重初始化失败日志记录,则表明某些关键服务未能成功加载,进而干扰到后续功能表现[^2]。建议重新下载最新稳定版本的 IDEA 并按照标准流程完成初次部署工作。 ```java // 示例代码片段展示如何正确运用 @Autowired 注解实现自动装配 @Service public class StudentService { private final Repository repository; public StudentService(@Qualifier("specificRepository") Repository repo){ this.repository = repo; } } @Component class SpecificComponent{ @Autowired private transient StudentService studentService; // 此处应无任何编译期告警现象发生 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值