【导读】经典step7的scl语言和博途的scl略有不同,下面就经典step7的scl与stl区别及一些常见问题做一个总结。
【一】scl 与 stlscl(structured control language)语言,也就是结构化控制语言,它其实和iec标准制定的st语言是一样的。s7-scl 可以编译成 stl, 虽然其代码量相对于 stl 编程有所增加,但我们更关心的是程序结构和程序的总体效率。类似于计算机行业的发展,汇编语言已经被舍弃,取而代之的是 c/c++等高级语言。s7-scl 对工程设计人员要求较高,需要其具有一定的计算机高级语言的知识和编程技巧。
stl是step7时代推出的语言,它不是struct text language的缩写,所以它和st语言完全没关系。stl语言是一种汇编语言,是面向机器底层的语言,可以直接操作寄存器,可读性不强,和80c51单片机的机器语言是一个层面。所以它是一种低级语言,而st和scl都是中高级语言。
【二】s7-scl 常见问题
(1)如何规范地的开发一个 s7-scl 程序?
解答:开发一个 s7-scl 程序,应当遵循如下流程:
• 规划需要的块类型,即程序的整体结构。• 规划子任务(fb,fc 等等)• 定义各个子任务的之间输入/输出接口• 定义各个子任务在原文件中的顺序及调用关系• 定义符号表• 编译检查• 下载调试
(2)s7-scl 支持哪些 step7 块,与其它语言有什么关系?
解答:s7-scl 支持如下 step7 的块:ob,fc,fb,db,udt。在 s7 程序中,s7-scl 块可以与其它step7 编程语言生成的块互相调用。s7-scl 可以被编译成 stl, s7-scl 生成的块也可以作为库文件被其它语言引用。由于 s7-scl 程序由 ascii 文本构成,所以它非常容易被导入或导出。
(3)为什么双击打开 s7-scl 类型的程序后,显示的格式却是 stl 格式?
解答:s7-scl 程序编译后生成的执行代码实际上为 stl 格式,如下图中的 fc1, 虽然其标示为 scl格式,但如果用户将 source 目录中的 fc1 的源文件删除后,再双击打开 fc1 后,显示的将为 stl格式。
(4)什么是 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;
(5)在 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 块内的特有变量,请按下列步骤进行:
• 在路径 step7 的安装路径 step7s7datas7wiz 下,包含所有 ob 块的 stl 格式模板,可以使用写字板打开这些模板 (例如 ob31.awl), 并复制相应变量定义。• 创建一个新的 s7-scl 源文件并插入刚才复制的变量定义。• 调整 s7-scl 源文件中的语法结构• 在这个程序的开始部分, 可以设置 title 和version , 例如 title=' ' 和 version= '0.1'• 在 begin 语句后面插入一个分号,至此,即完成格式修改。另外,也可以打开本文中的 s7-scl 例子目录中的 ob_templ 项目,其中包括了 44 个 s7-scl 源文件格式的组织块。
(6)如何理解 fc/sfc 的输出参数 ret_val(返回值)?
解答:对于此问题,如果读者对 pascal 语言或者高级编程语言非常熟悉,可能此问题就非常容易解释。许多 sfc (系统功能) 都有输出参数 ret_val (返回值) ,它提供一个可供评估的错误代码。step 7 在线帮助中提供有更多关于系统功能和输出参数 ret_val 的信息。通过在 simatic管理器中选中 sfc 然后按“f1”键可以获取相关的在线帮助信息。同样,一个 fc 也可以返回一个结果,下面给出了一些例子,说明了如何在 s7-scl 中调用带有返回值 (ret_val) 的功能 (fc 或 sfc)。
定义 fc1, 函数类型为 int (返回值)
调用 fc1,得到返回值:
调用一个系统功能 (sfc24):当调用系统功能 sfc 24 “test_db”(测试数据块) 时,得到关于 cpu主内存中一个数据块的信息。sfc24 确定指定 db 的数据字节数,并检查该 db 是否受到写保护。选定 db 所包含的数据字节数通过参数“db_length”输出,参数“write_prot”包含关于选定 db 的写保护 id 的信息 (false 表示没有写保护)。
(7)在 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 地址格式。x 可以为 0 至 65535 之间的数字(绝对地址),y 可以为 0 至 7 之间的数字(位地址),对于其它 fb,ob,db, t,c 等等的标识格式,s7-scl 格式基本与 stl 格式相同,此处不做说明。
(8)为什么用户人工输入的程序在编译时经常提示语法错误?
解答:s7-scl 程序和所有的高级语言一样,有着自己特定的语法,而很多编程人员容易在人工输入程序时忽视语法格式,这样就造成编译错误。因此强烈建议编程人员使用 s7-scl 的模板向导。在菜单 insert 中,提供了 block call, block template, control structure, 三个向导,用户可以通过使用此向导,提高输入效率。例如在下图中指出了两个常见错误,用户如果使用向导,就不容易出错误:
(9)s7-scl 程序中如何使用多重背景?
解答:s7-scl 程序中可以使用多重背景,下面的程序列出了正确格式,声明完成后,在程序中即可调用:
supply1 : fb10; //将 supply1 定义为 fb10 类型supply2,supply3,supply4 : fb100; //将 supply2,supply3,supply4 定义为 fb100 类型
(10)如何在 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;
(11)在 s7-scl 程序中调用 fc/fb 与在 stl/lad 中调用 fb/fc 有何区别?
解答:在 stl/lad 程序中调用 fb 可以不把参数填写完整,但在 s7-scl 程序中调用 fb 时,必须把fb参数填写完整;对于fc的调用s7-scl与stl/lad区别不大。强烈建议编程人员使用s7-scl的模板向导调用 fb。
(12)为了将 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”实现。
(13)在 s7-scl 中如何区分某个变量名是本地变量,还是符号名?
解答:s7-scl 中本地变量与符号名的引用有如下区别:
• 如果引用中只有变量名,则此变量为本地变量,如:motor_status:= motor_1• 如果引用中变量名称上包括“”,则此变量为符号名,如:motor_status:= “motor_1”
(14)如何访问一个字符串中的单个字符?
解答:对于字符串中的单个字符,使用如下的访问格式,是错误的:
mb10 := str[5] 这样的表达式无法实现将字符串的第 5 个字符送至 mb10 中。
方法:可以使用 iec 函数 mid 来得到字符串的某个部分,例子如下:varstr : string[20];end_varmb10:=char_to_byte(string_to_char(mid(in:=str,l:=1,p:=5)));
(15)如何加密我的 s7-scl 程序?
解答:s7-scl 程序加密与 stl 程序加密方法几乎一样,用户可以在程序中加入关键字:know_how_protect,再进行编译即可,下图中的 fc1 在编译后,即出现了加锁保护的图标 。
注意:提供给最终用户的项目中应当删除 s7-scl 源代码,否则用户在双击加密的块后(例如下图中的 fc1),依然可以关联打开 s7-scl 源代码。
注意:提供给最终用户的项目中如果删除 s7-scl 源代码,用户将只能看到 stl 格式的程序,稍微复杂些的 s7-scl 程序在 stl 格式下几乎是无法阅读的。此方法类似于加密的效果。
(16)如何对 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;
智能化扬尘在线监测系统能实时监测扬尘污染
鱼泡网通过大数据、AI等技术在创业创新大赛全国选拔赛斩获佳绩
PLC技术可持续发展方向
华为P10今日正式预售 买韩货还是买徕卡双摄之王?
DSP技术的指示灯实验
SCL与STL的区别是什么?SCL常见问题及解决办法!
PCIE2XMCx4载板转接卡
承德科胜玻璃瓶真空旋盖机|辣椒酱旋盖机|河北旋盖机
Digg详解
西门子TIA V19有哪些新增功能
烟气在线监测系统常见颗粒物测量值异常维修
iPhone 11全系列取消3D Touch,采用触感触控技术
科大讯飞与香港亚视在香港签订战略合作协议
S7-SCL功能块(FB)的结构
大数据和物联网最终都要为人服务
SUV霸主哈弗H6终于换代
半协第七届大会召开 周子学连任半协理事长
罗克韦尔PLC发现严重漏洞,及其后果与应对措施
移动出行要闻摘选:腾势汽车与腾讯达成战略合作
诚迈科技作为矿鸿生态伙伴,签约鄂尔多斯工业互联网平台