在西门子plc中使用scl语言编程的技巧_第1页
在西门子plc中使用scl语言编程的技巧_第2页
在西门子plc中使用scl语言编程的技巧_第3页
在西门子plc中使用scl语言编程的技巧_第4页
在西门子plc中使用scl语言编程的技巧_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在西门子PLC中使用SCL语言编程的技巧前言两年半前我就在工控网上发表了有关SCL编程的知识,但发表完后,即使我自己都从没有把任何使用SCL编写的程序用到实际控制中,当时的感觉是使用SCL编程到处受限,没有STL语言灵活和强大。直到最近使用施耐德的UNITY软件编程,并使用这种已经国际标准化的文本语言(等同于西门子的SCL语言),才体会到它的优点、程序容易阅读,便于诊断和维护;、程序容易在不同厂家之间的PLC之间转换。西门子的STL语言是强大,但难于阅读,编写程序也需要异常小心,其最强大的可能是它的寄存器寻址(类似于一些计算机高级语言中的地址指针),SCL没有这个功能,那就多费一些程序代码来实现同样的功能,程序是否优秀更应该看重程序的架构和提高程序生产效率的标准化,好的PLC程序不应该只有自己明白,而是让更多的人明白。在西门子PLC中使用SCL语言的场合一般是编写标准功能块FB,其编程方式和西门子的其他编程语言,如梯形图LAD、语句表STL是完全不同的,同时为了实现程序的国际标准化,即为了方便的将程序代码移植到不同厂家的PLC系统上,尽量不要在SCL中使用西门子独有的功能块。1、在FB块中使用结构编写FB块的准则,就是其使用的内部变量尽量与外部隔离,除了像PLC的新启动/重启动标志,以及一些方波/脉冲波等全局变量可以在FB块中使用外,其他的任何全局变量都不应该在FB内部使用,即使是自定义结构也应该在FB中单独定义,在FB块中使用结构应该在静态类型变量中定义,如下VAR/STATICVARIABLESIMSTRUCT/DATASTRUCTUREOFINTERNALFLAGSH1_AFCOUNTIMPBOOLFALSE/AUXFLAGCOUNTERIMPULSEH1_COUNTIMPBOOLFALSE/COUNTERIMPULSEH1_ELCOUNTMVBOOLFALSE/ENDLESSCOUNTERMAXIMUMVALUEEND_STRUCT/OTHERDATASTRUCTUREEND_VAR在使用这些结构时,可以按照如下方式IMH1_COUNTIMPIMP2、在SCL中替代SET/RESET指令的方法SCL中不存在SET/RESET指令,或者说也没有必要使用。在SCL中,不使用排他条件ELSE的条件语句就是一个SET/RESET指令。如下编程IFTHENVARIABLENAME1END_IF其等同于S若加上ELSE条件,如下IFTHENVARIABLENAME1ELSEVARIABLENAME0END_IF则等同于一条完整的包含置位和复位的语句可以使用如下方式编程IFTHENVARIABLENAME1END_IFIFTHENVARIABLENAME0END_IF其等效于SR指令,若将上面的两个条件语句的先后次序颠倒一下,则等效于RS指令。3、简化程序指令、尽量使用赋值语句替代那些不用于SR/RS指令的BOOL型赋值条件语句,如下IFFNADDELSEPUS1FALSEEND_IF其等效于PUS1FNADDELSEPUS1VALUE2END_IF其等效于PUS1SELGFNADD使用该函数时注意两点、参数名不能省略;、当选择条件G为TRUE时,选择后一个参数值IN1,为FALSE时,选择前一个参数值IN0,这点与计算机C语言等正好相反。、XOR指令有着比AND和OR更为复杂的表达,能使用XOR的地方应该尽量使用IFCONDITION1ANDNOTCONDITION2ORCONDITION2ANDNOTCONDITION1THENRESULTTRUEELSERESULTFALSEEND_IF其等效于RESULTCONDITION1XORCONDITION2XOR功能就是两条件不同输出TRUE,相同输出FALSE4、脉冲沿检测功能使用以下两条语句替代脉冲上升沿检测函数,譬如检测BUTTON_INPUT上升沿的代码如下PULSBUTTON_INPUTBUTTON_LASTBUTTON_INPUT同样的下降沿脉冲检测如下PULSNOTBUTTON_INPUTBUTTON_LASTBUTTON_INPUT5、编写脉冲发生器波峰持续时间仅为一个PLC扫描周期的波形称为脉冲波,而波峰持续时间大于或等于两个PLC扫描周期的波形称为方波,脉冲波可用于计数、定时,方波可用于控制信号灯的闪烁输出,可以在西门子PLC的硬件配置中配置一个字节的各种时间的方波(波峰时间和波谷时间为11),假设“FP_1SEC“为这个字节中1秒的方波,则、间隔1秒的脉冲波“IMPLS_1SEC”如下编程“IMPLS_1SEC”“FP_1SEC“ANDNOT“IMPLS_1SEC_AUX”“IMPLS_1SEC_AUX”“FP_1SEC“、间隔10秒的脉冲波“IMPLS_10SEC”如下编程IF“IMPLS_10SEC”THENCOUNT_ACTUAL0“IMPLS_10SEC”0ELSEIF“IMPLS_1SEC”THENCOUNT_ACTUALCOUNT_ACTUAL1END_IF“IMPLS_10SEC”COUNT_ACTUAL10END_IFCOUNT_ACTUAL的初始值为0,同时当系统新启动时,也需将其设为零。间隔更长时间的脉冲波编程都可以按照上面的方式编程。6、尽量使用编程计数功能来替代定时器功能,这样使程序更可靠和易于阅读假设INPUT_CONDITION为输入,OUTPUT_DELAY为通过定时处理后的输出,TIMER_SETPOINT为时间设定点,TIMER_ACTUAL为当前时间计数的实际值,“IMPLS_1SEC”为系统编程产生的1秒脉冲。、在输入条件满足的情况下,延时输出的定时器IFNOTINPUT_CONDITIONTHENTIMER_ACTUAL0OUTPUT_DELAY0ELSEIF“IMPLS_1SEC”ANDNOTOUTPUT_DELAYTHENTIMER_ACTUALTIMER_ACTUAL1END_IFOUTPUT_DELAYTIMER_ACTUALTIMER_SETPOINTEND_IF、有记忆的延时输出定时器,即在延时过程中,若输入条件终止,不影响延时,这种定时器必须使用其它的信号复位。IFINPUT_CONDITIONTHENOUTPUT_AUX1END_IFIFNOTOUTPUT_AUXTHENTIMER_ACTUAL0OUTPUT_DELAY0;ELSEIF“IMPLS_1SEC”ANDNOTOUTPUT_DELAYTHENTIMER_ACTUALTIMER_ACTUAL1END_IFOUTPUT_DELAYTIMER_ACTUALTIMER_SETPOINTEND_IF若想终止OUTPUT_DELAY的输出,必须在后面追加一条条件语句,用于复位OUTPUT_AUX、立即输出,延时断开的定时器IFINPUT_CONDITIONTHENTIMER_ACTUAL0OUTPUT_AUX0OUTPUT_DELAY1/立即输出ELSEIF“IMPLS_1SEC”ANDNOTOUTPUT_AUXTHENTIMER_ACTUALTIMER_ACTUAL1END_IFOUTPUT_AUXTIMER_ACTUALTIMER_SETPOINTEND_IFIFOUTPUT_AUXTHENOUTPUT_DELAY0/延时断开END_IF、在检测到一个上升沿脉冲后,立即输出,并开始计时,在时间到达后断开。IFINPUT_CONDITIONTHENOUTPUT_AUX1END_IFIFNOTOUTPUT_AUXTHENTIMER_ACTUAL0TIMER_ARRIVED0ELSEIFNOTTIMER_ARRIVEDAND“IMPLS_1SEC”THENTIMER_ACTUALTIMER_ACTUAL1END_IFTIMER_ARRIVEDTIMER_ACTUALTIMER_SETPOINTEND_IFIFTIMER_ARRIVEDTHENOUTPUT_AUX0END_IFOUTPUT_DELAYOUTPUT_AUX通过以上的编程方式可以实现任何定时器功能,而代码却可以为不同的PLC系统所使用。7、使用编程计数功能来替代计数器在SCL语言中使用计数功能是最为简单的,其关键是必须首先对输入进行脉冲检测假设INPUT_IMP为输入脉冲,COUNTIMP为输入脉冲检测,COUNTER为计数值,FACTOR为计数因子(更详细点就是每来一次脉冲,计数值增加多少)。CREATEIMPULSEIMPULSEEVALUATIONCOUNTIMPINPUT_IMPANDNOTCOUNTIMP_OLDCOUNTIMP_OLDINPUT_IMPCOUNTERIFCOUNTIMPTHENCOUNTERCOUNTERFACTOREND_IF一个完整的计数程序应该还有计数器复位功能以及计数值上限检测条件(以防止计数值溢出)。8、新故障/新警告的检测一个完整的FB块应该能够检测故障/警告,以及新故障/新警告,假设INPUT1,INPUT2INPUTN对应故障的输入(有信号表示OK),FAULT1,FAULT2FAULTN对应故障位,NFAULT1,NFAULT2NFAULTN对应新故障位,FLT和NFLT分别对应综合的故障和新故障,ACKN对应故障应答输入,为常开点,MUTE对应新故障消除输入(或者称为蜂鸣器沉寂),为常开点FAULT1NOTINPUT1ORFAULT1ANDNOTACKNNFAULT1FAULT1ANDMUTEORNFAULT1FAULT2NOTINPUT2ORFAULT2ANDNOTACKNNFAULT2FAULT2ANDMUTEORNFAULT2FLTFAULT1ORFAULT2ORFAULTNNFLTFAULT1ANDNOTNFAULT1ORFAULT2ANDNOTNFAULT2ORFAULTNANDNOTNFAULTNNFLT就是最终的新故障输出指示,新警告的检测与之类似。9、字中取位字中取位有两种方式,一种是通过西门子所特有的字取位方式实现,一种是通过计算机编程的标准方式实现,假设INPUT_WORD为输入参数,WORD类型,W0,W1,W15为位变量。、通过西门子的M变量实现TEMP_AUXMW10MW10INPUT_WORDW0M11,0W1M11,1W2M11,2W3M11,3W4M11,4W5M11,5W6M11,6W7M11,7W8M10,0W9M10,1W10M10,2W11M10,3W12M10,4W13M10,5W14M10,6W15M10,7MW10TEMP_AUX、通过标准编程实现W0INPUT_WORDW1INPUT_WORDW2INPUT_WORDW3INPUT_WORDW4INPUT_WORDW5INPUT_WORDW6INPUT_WORDW7INPUT_WORDW8INPUT_WORDW9INPUT_WORDW10INPUT_WORDW11INPUT_WORDW12INPUT_WORDW13INPUT_WORDW14INPUT_WORDW15INPUT_WORD使用方式1会更加简单和容易理解一些,但方式2具有更加宽广的应用场合,更加标准化,即使是当今的计算机编程在取位操作时也类似于上面的编程。字取位的场合,一般用于总线数据(譬如变频器的状态数据),则可能是字/整数,此时就需要用到上面的编程。10、将位组合成字相当于“字中取位”的反向操作,这也有两种方法,一种方法是使用M变量,类似于“字中取位”的方式,另一种也是标准编程,假设OUTPUT_WORD为输出参数,WORD类型,W0,W1,W15为位变量。、通过西门子的M变量实现TEMP_AUXMW10M11,0W0M11,1W1M11,2W2M11,3W3M11,4W4M11,5W5M11,6W6M11,7W7M10,0W8M10,1W9M10,2W10M10,3W11M10,4W12M10,5W13M10,6W14M10,7W15OUTPUT_WORDMW10MW10TEMP_AUX、通过标准编程实现IFW0THENOUTPUT_WORDOUTPUT_WORDOR161ELSEOUTPUT_WORDOUTPUT_WORDANDNOT161END_IFIFW1THENOUTPUT_WORDOUTPUT_WORDOR162ELSEOUTPUT_WORDOUTPUT_WORDANDNOT162END_IFIFW2THENOUTPUT_WORDOUTPUT_WORDOR164ELSEOUTPUT_WORDOUTPUT_WORDANDNOT164END_IFIFW3THENOUTPUT_WORDOUTPUT_WORDOR168ELSEOUTPUT_WORDOUTPUT_WORDANDNOT168END_IFIFW4THENOUTPUT_WORDOUTPUT_WORDOR1610ELSEOUTPUT_WORDOUTPUT_WORDANDNOT1610END_IFIFW5THENOUTPUT_WORDOUTPUT_WORDOR1620ELSEOUTPUT_WORDOUTPUT_WORDANDNOT1620END_IFIFW6THENOUTPUT_WORDOUTPUT_WORDOR1640ELSEOUTPUT_WORDOUTPUT_WORDANDNOT1640END_IFIFW7THENOUTPUT_WORDOUTPUT_WORDOR1680ELSEOUTPUT_WORDOUTPUT_WORDANDNOT1680END_IFIFW8THENOUTPUT_WORDOUTPUT_WORDOR16100ELSEOUTPUT_WORDOUTPUT_WORDANDNOT16100END_IFIFW9THENOUTPUT_WORDOUTPUT_WORDOR16200ELSEOUTPUT_WORDOUTPUT_WORDANDNOT16200END_IFIFW10THENOUTPUT_WORDOUTPUT_WORDOR16400ELSEOUTPUT_WORDOUTPUT_WORDANDNOT16400END_IFIFW11THENOUTPUT_WORDOUTPUT_WORDOR16800ELSEOUTPUT_WORDOUTPUT_WORDANDNOT16800END_IFIFW12THENOUTPUT_WORDOUTPUT_WORDOR161000ELSEOUTPUT_WORDOUTPUT_WORDANDNOT161000END_IFIFW13THENOUTPUT_WORDOUTPUT_WORDOR162000ELSEOUTPUT_WORDOUTPUT_WORDANDNOT162000END_IFIFW14THENOUTPUT_WORDOUTPUT_WORDOR164000ELSEOUTPUT_WORDOUTPUT_WORDANDNOT164000END_IFIFW15THENOUTPUT_WORDOUTPUT_WORDOR168000ELSEOUTPUT_WORDOUTPUT_WORDANDNOT168000END_IF同样的,使用标准化编程会繁琐一些,但有着很强的通用性,在总线通讯控制中,很多控制字(如变频器)都是以字的形式传递,所以需要把一些BOOL数据合并到一个字中,可以采用上面的对字中的位进行置位/复位操作的方式,但事实上使用时,控制命令可能只有启动/停止和方向控制等,所以这是可以直接对输出赋值,譬如当我们知道160F对应启动命令和正传时,可以直接使用如下赋值语句即可控制变频器正向运转OUTPUT_WORD160F,如需反向运转,则再赋另一个值即可,而不需要像上面那样对字的每一位操作。以上是我总结的一些使用技巧,其编程可能有更好的实现方式,欢迎来信探讨。SCL语言编程时,ANY类型参数如何赋值SQZTH发表于20081016144200在我们熟悉的LAD/STL编程语言中,对ANY类型的参数赋值时,可以写成“PDB1DBX00BYTE20“就行了。其实这时系统在私下帮我们作了些事情,而在SCL语言中,这些事情就得由我们自己作。是什么事情呢这得回归到本质ANY类型的参数是以怎样的结构存储在PLC中的查资料可知,它是以长度为10个字节BYTE的连续区域来存储的,这10BYTES的定义为SYNTAX_ID1BYTE/对ANY类型始终为1610DATATYPE1BYTE/01BOOL,02BYTE可查相关资料REPETITION_FACTOR2BYTES1WORDDB_NUMBER2BYTES1WORDBYTE_POINTER4BYTES1DWORD对“PDB1DBX00BYTE20

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论