技术论坛

 回复:应用探讨——SCL 编程语言使用探讨

返回主题列表
作者 主题

总坛主
西门子官方工程师西门子官方工程师

经验值:23725
发帖数:3679
精华帖:8
楼主    2013-08-15 16:06:54
主题:应用探讨——SCL 编程语言使用探讨
SCL 编程语言与计算机高级编程语言有着非常相近的特性,在经典的Step7 5.X平台和新推出的TIA Portal 平台下都支持该编程语言。在特定的应用场合,使用SCL编程会非常的方便,而且在新一代控制器S7-1500硬件平台下,使用SCL编程其代码执行效率较其他编程语言高效的多,是鼓励大家使用的一种编程语言。因此,在接下来的一个月里开设此话题,讨论SCL编程特点、在Step7 5.X,TIA Portal V11 及TIA Portal V12环境的使用问题。欢迎有SCL使用经验的朋友积极分享您的应用感触,当然也欢迎打算在今后的工作中使用此编程语言的朋友积极投入到话题讨论,欢迎提出您的疑问,我们互相探讨共同提高。

活动奖励:
此次集中交流将持续至9月15日,其中所有精华帖作者将获得加倍精华奖励积分;最终所有有效留帖的网友将获得加倍发帖积分。更多积分带给您更多奖品兑换的自由。
对于有突出发言贡献的网友可获得金币奖励,可以在当前的兑换奖品中兑换奖品。
交流结束后也将专门整理重要内容,供广大网友分享参考。
预祝大家交流愉快,收获丰富!
坤之剑


经验值:2000
发帖数:315
精华帖:3
3楼    2013-08-15 20:16:18
精华帖  主题:回复:应用探讨——SCL 编程语言使用探讨
先讲一下自己的感受吧,
1、首先我认为SCL非常接近我们的思维,在编制时程序可读性比较强
2、对于指针编程也是SCL的优势,可以很轻松的实现STL能实现的指针编程,这样我们在时间紧迫的
情况下就不需要再去花时间去搞懂STL的指针编程
3、支持FOR、WHILE、REPEAT等循环指令,并且有EXIT指令跳出本次循环,灵活性强。
4、支持AT指令,如同高级语言的继承,父体是一字节ProgramCommand,然后
定义 ProgramCommandBit AT ProgramCommand:ARRAY[1..8] OF BOOL,
可实现取这个字节的每一位:ProgramCommandBit [0]、ProgramCommandBit [1]、、、、、
5、可以利用SCl源文件生成UDT、DB块,并赋予初始值、、、、
6、调试时一样可以像STL、LAD那样在线监视,并且各个变量的状态显示很直观,在线监控要
在编译时生成调试信息,保证PLC与程序的时间戳相同,即可在线监控。另外支持断点调试,
可以很直观的监控循环体每一步执行的结果。
6、目前我遇到SCL在生成调试信息时经常提示生成的调试信息超过64KB,再进行减少代码还是提示此信息
不知各位有没有遇到我这样的情况、、、、、
坤之剑


经验值:2000
发帖数:315
精华帖:3
8楼    2013-08-16 13:32:53
精华帖  主题:回复:应用探讨——SCL 编程语言使用探讨
我要纠正一下:
SCL语言是类PASCAL语言,并不是C,前些年比较风靡的DELPHI就是采用的PASCAL语言。
另外补充一下对SCL的感受:
1、CASE指令可实现STL的JL指令的功能,使用起来更直观化,另外支持GOTO跳转,对于程序实现步进控制同样很方便。
2、SCL不仅可以在线调试,而且支持变量"参考数据"功能,并且变量符号与绝对地址无一疏漏。
3、对于SCL上升沿下降沿检测的实现我并不同意4楼所说,同样只需要像STL、LAD定义一个沿检测位,
即可轻松实现沿检测功能,下面举一上升沿例子:
上升沿检测原理: IF In AND NOT Mem THEN //沿检测逻辑
执行语句部分;
END_IF;
Mem:=In;
注:Mem就是我们需要的中间存储位、 In被检测的变量
4、另外在西门子介绍SCl时着重强调了几项功能:



以上几种功能我深有体会
5、SCL同样支持多重背景调用功能。
6、对于STL能实现的复杂运算功能目前我还没发现SCL不能支持的,在没使用SCL之前的我程序基本都是用STL,使用了SCL之后同样很方便。
另外提一下对SCL能所改进的地方:
1、能在创建功能块的过程中生成块符号名
2、编译生成调试信息支持更大的容量
-我心飞翔-
侠圣

经验值:3148
发帖数:132
精华帖:1
20楼    2013-08-17 08:46:54
精华帖  主题:回复:应用探讨——SCL 编程语言使用探讨
我刚开始学习SCL时算是一点基础都没有,计算机语言更是不懂。我就看手册,把你想说的话用SCL的方式表达出来,不断的写,不断的仿真,最后还是小有成绩吧。
西门子SCL中文手册
http://www.gongkong.com/webpage/datum/200708/B-9242-A3646E9400AA.htm
SCL编程
http://www.ad.siemens.com.cn/download/OnlineReading.aspx?DocId=2757
用SCL编写的程序,把源代码删除后再打开将用STL方式显示,对于保护自主知识还是有一定好处的,因为STL很难看懂。
在实验中会遇到各种问题,原因就是对手册的知识没留心或是没有真正理解,这都将促使我们寻找答案。很希望和大家共同探讨,共同进步。
我心飞翔!
剑忠
奇侠

经验值:9641
发帖数:622
精华帖:57
29楼    2013-08-18 21:11:10
精华帖  主题:回复:应用探讨——SCL 编程语言使用探讨
用过一段时间STEP7 Professional V11版本的SCL编程,与STEP7 V5.x版本的SCL编程对比,具有以下特点:
1、STEP7 V11版本编辑器具有代码收折/展开功能。
2、STEP7 V11版本编辑器具有I/O参数表,因此可在参数表里定义I/O变量使用;而STEP7 V5.x版本只能靠写代码定义I/O参数变量。
3、STEP7 V11版本编辑器中,变量引用时加入了“#”前缀符号,并且是自动强制添加前缀符号。
4、STEP7 V11和STEP7 V5.x版本都能导出SCL源代码。但STEP7 V5.x版本能直接Copy所有的源代码保存;然而STEP7 V11版本直接Copy编辑器中的源代码是没有I/O参数变量定义部分源代码,只能采用导出方式才能完整Copy所有的源代码。
大学之道,在明明德,在亲民,在止于至善。
伊默
至圣

经验值:19231
发帖数:4256
精华帖:118
30楼    2013-08-19 08:53:04
精华帖  主题:回复:应用探讨——SCL 编程语言使用探讨
用SCL的时间相对比较长,我也来说几名:
首先确实不用争论那种编程语言最好,IEC标准的五种语言存在就说明了它们存在的理由。 只是相对来讲,现在SCL的功能会相对强化,而且使用SCL的人员会增加。 毕竟现在使用PLC的人员学历相对会有提高,受过大学教育的都有一点高级语言的基础,这降低了使用SCL的门槛。

SCL具有以下的优点:
1、数据处理,这是SCL存在的最大优点。可以直接用公式的形式进行数据运算。比如写个简易PID指令啥的非常方便。
2、逻辑处理,这一条可能大家会有疑问。但是SCL在处理一些循环类,分支选择类,条件判断类的逻辑时确实是很方便。 我自己原来使用STL写过简易的modbus库。 后来使用S7-1200因为不支持STL,只好用SCL写一个。 结果写下来后觉得明显比以前STL写的简易,而且条理清晰。
3、程序格式的扁平化。 这一点可能是仁者见仁智者见智。 我本人很不喜欢用LAD,其中一条原因就是LAD太占用画面,一个页面显示不了几行。可能复杂点的逻辑没办法在一个页面内读完…… STL相对好一点,不过由于它是纵向排列逻辑,所以点整个电脑页面比SCL多。 相对来讲我更习惯SCL这种编程,阅读逻辑。


至于缺点,只要你不想用的,那都是缺点,呵呵。 还是看各人习惯,不习惯的东西,总觉得就是别扭!
相对来讲博途里的SCL比老版STEP7的SCL改进很多,排版也智能多了。 反倒上剑忠提到的形参问题,我个人更喜欢老版写代码的方式(这样复制粘贴更方便),当然也有人喜欢用变量表的方式。 而其他的厂家更多的是这两种方式可以自由切换,岂不是更方便?(我以前跟西门子提过这种建议,不知道他们是否会采纳)。
I can do it
youhm
至圣

经验值:13571
发帖数:4924
精华帖:81
36楼    2013-08-20 08:10:41
精华帖  主题:回复:应用探讨——SCL 编程语言使用探讨
quote:以下是引用like821080在2013-08-20 07:01:20的发言:
我一直不怎么敢用,主要是自己对SCL不会监控,为什么监控不了呢?


如何才能做到监控SCL呢?我发现如果右键选择监控是能监控的,不过是已经转换成STL语言了

你应该是在编译设置里没有激活“建立调试信息”。


youhm
至圣

经验值:13571
发帖数:4924
精华帖:81
51楼    2013-08-21 21:37:07
精华帖  主题:回复:应用探讨——SCL 编程语言使用探讨
quote:以下是引用小釉在2013-08-21 20:28:59的发言:
1“SCL 中的AT指令没有用过,不知道什么在什么时候考虑用这个指令


AT指令可以使用户能够以不同的数据类型来访问一个已经声明的变量,比如定义一个字节变量A,用AT定义一个布尔数组B,通过布尔数组B就可以访问字节变量的每一个位了
A :BYTE;
B AT A:ARRAY[0..7] OF BOOL;
氢气
游侠

经验值:441
发帖数:47
精华帖:8
87楼    2013-09-05 17:09:42
精华帖  主题:回复:应用探讨——SCL 编程语言使用探讨
quote:以下是引用*在2013-08-30 16:31:00的发言:
有没有谁在SCL编写的FC中使用ANY指针做为输入接口?个人感觉在SCL中很不方便,就又用回至STL了。大家有什么体会?

可以作为输入参数的接口,有些系统功能块的接口参数就是ANY类型。做了个相加求和的小程序供参考:

FUNCTION FC10 : Void
VAR_INPUT
Addr1:ANY;
END_VAR
VAR_OUTPUT
Sum:REAL;
END_VAR
VAR_TEMP
TempAny:ANY;
STRForDB AT TempAny: STRUCT
SyntaxID:BYTE;
DataType:BYTE;
DataCount:INT;
DB_Number:WORD;
Byte_Pointer:DWORD;
END_STRUCT;
DataNum:INT;
TempSum:REAL;
END_VAR
TempAny:=Addr1;
TempSum:=0.0;
FOR DataNum:= 0 TO STRForDB.DataCount-1 BY 1 DO
TempSum:=TempSum+DWORD_TO_REAL(WORD_TO_BLOCK_DB(STRForDB.DB_Number).DD[DataNum*4]);
END_FOR;
Sum:=TempSum;
END_FUNCTION

在OB1中调用FC10:
ORGANIZATION_BLOCK OB1
VAR_TEMP
info : ARRAY[0..19] OF BYTE;
DBAddr: STRUCT
SyntaxID:BYTE;
DataType:BYTE;
DataCount:WORD;
DB_Number:WORD;
Byte_Pointer:DWORD;
END_STRUCT;
DBAddrAny AT DBAddr: ANY;
RealSum:REAL;
END_VAR
DBAddr.SyntaxID:=16#10;
DBAddr.DataType:=16#08;
DBAddr.DataCount:=10;
DBAddr.DB_Number:=16#1;
DBAddr.Byte_Pointer:=dw#16#84000000;
Sum(Addr1 :=DBAddrAny // IN: ANY
,Sum:=RealSum // OUT: REAL
); // VOID
END_ORGANIZATION_BLOCK
这样就完成了从OB1中传递参数给FC10,求和,本例中相当于求“P#DB1.DBX0.0 REAL 10”的和。
例子中是用AT指令和两个STRUCT将ANY指针“分解”,至于有没有STL简洁,就仁者见仁智者见智了。
不过在循环体中,SCL语言明显比STL语言简洁,数据处理也是SCL语言的优势。
---------------------来自西门子工程师
坏笨笨
侠士

经验值:1689
发帖数:402
精华帖:4
90楼    2013-09-06 08:46:11
精华帖  主题:回复:应用探讨——SCL 编程语言使用探讨
quote:以下是引用nucman在2013-08-20 10:06:16的发言:
借万泉河兄的帖子,我谈谈结构化编程的问题,其实如果规划好编程结构,不但能使接口清晰,适合团队合作共同开发,而且也能使每个人开发的FB或FC也容易很多,并且适合后期修改及管理。
如何规划,我个人的习惯是在需要SCL编程的FB或FC中全部采用内部变量,在输入和输出的定义中可以采用UDT也可以采用数组或者结构体,作为FB或FC的内外数据接口,SCL编写的FB或FC只对内部变量操作。
至于语法,其实并不复杂,可能刚开始时有些不习惯。尤其是在TIA Portal编程环境下,可以对指令直接进行拖拽操作,不用记忆方便快捷。其实最关键的是规划,是编程思想,这个东西其实在各种编程语言中都是相通的。

quote:以下是引用万泉河在2013-08-17 09:05:40的发言:
评价一个编程语言,个人认为比较重要的有两个方面:
1,语法。
2,资源的接口.

从语法及编程框架来说,SCL与其他高级语言非常相似,所以很容易上手。比如一段高级语言里面的程序脚本,很容易按照SCL的语法重构。
只不过,这里的语言语法太复杂,A:=1 ,等号前面还要加个冒号就让人很不适应.而后面还要补个分号啥的,也比VB等复杂。
程序调试中精力全放在这上面了。
讨厌。

而对于资源来说,我们的程序需要接口去从外围获得数据,并将结果输出到外部接口。因为用SCL通常是做FC,FB块,普通的I/O都是通过形参传进来的,而用的较多的是DB块。在PLC里面,DB块相当于电脑里面的文件。
在SCL中操作DB块,感觉很麻烦,需要对这个DB块整体做定义,而我其实只是访问其中一部分数据而已。
而如果多个SCL程序中用到同一个DB,就要重复定义。搞的就比较乱。当编译的时候就需要选择部分编译,否则就很容易把原块给冲掉了。


兄弟,你说出了我的心声,我正是这么干的,硬生生的把公司原来几百个块压缩成10几个块,而且复用性高,我把很多类似的设备都用udt描述了,传递到fb,现在做工程只不过现在拖拖拉拉调用块,指定设备类型,映射下IO而已,更本用不着做设备控制逻辑,统统用SCL写好了。最爽的一点,我把西门子人机界面的参数也做成结构体了,PLC内部变量映射到人机结构体,西门子人机我只要拖拉一个做好的结构体指定地址就完成了一个设备所有的参数。做工程完全变成了搭积木,而且我做成的设备接口(UDT结构描述)一成不变,给上位机开发者带来了很大的方便,甚至可以做成固定形式,一次开发就行。
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。