怎样学习PLCPLC入门.docx
- 文档编号:26036720
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:27
- 大小:75.94KB
怎样学习PLCPLC入门.docx
《怎样学习PLCPLC入门.docx》由会员分享,可在线阅读,更多相关《怎样学习PLCPLC入门.docx(27页珍藏版)》请在冰豆网上搜索。
怎样学习PLCPLC入门
西门子PLC的几种编程语言
不同的商家的PLC有不同的编程语言,但就某个商家而言,PLC的编程语言也就那么几种。
下面,以西门子PLC的编程语言为例,说明一下,各种编程语言的异同。
1、顺序功能图(SFC-SeauentialFuctionChart)
这是位于其它编程语言之上的图形语言,用来编程顺序控制的程序(如:
机械手控制程序)。
编写时,工艺过程被划分为若干个顺序出现的步,每步中包括控制输出的动作,从一步到另一步的转换由转换条件来控制,特别适合于生产制造过程。
西门子STEP7中的该编程语言是S7 Graph。
2、梯形图(LAD-LAdderDiagram)
这是使用使用最多的PLC编程语言。
因与继电器电路很相似,具有直观易懂的特点,很容易被熟悉继电器控制的电气人员所掌握,特别适合于数字量逻辑控制。
梯形图由触点、线圈和用方框表示的指令构成。
触点代表逻辑输入条件,线圈 代表逻辑运算结果,常用来控制的指示灯,开关和内部的标志位等。
指令框用来表示定时器、计数器或数学运算等附加指令。
在程序中,最左边是主信号流,信号流总是从左向右流动的。
不适合于编写大型控制程序。
3、语句表(STL-STatementList)
是一种类似于微机汇编语言的一种文本编程语言,由多条语句组成一个程序段。
语言表适合于经验丰富的程序员使用,可以实现某些梯形图不能实现的功能。
4、功能块图(FBD-FunctionBlockDiagram)
功能块图使用类似于布尔代数的图形逻辑符号来表示控制逻辑,一些复杂的功能用指令框表示,适合于有数字电路基础的编程人员使用。
功能块图用类似于与门、或门的框图来表示逻辑运算关系,方框的左侧为逻辑运算的输入变量,右侧为输出变量,输入、输出端的小圆圈表示“非”运算,方框用“导线”连在一起,信号自左向右。
5、结构化文本(ST-StructuredText)
结构化文本(ST)是为IEC61131-3标准创建的一种专用的高级编程语言。
与梯形图相比,它实现复杂的数学运算,编写的程序非常简洁和紧凑。
STEP7的S7SCL结构化控制语言,编程结构和C语言和Pascal语言相似,特别适合于习惯于使用高级语言编程的人使用
在西门子PLC中使用SCL语言编程的技巧
<<在S7300400型PLC中使用高级语言编程>>,即使我自己都从没有把任何使用SCL编写的程序用到实际控制中,当时的感觉是使用SCL编程到处受限,没有STL语言灵活和强大。
直到最近使用施耐德的Unity软件编程,并使用这种已经国际标准化的文本语言(等同于西门子的SCL语言),才体会到它的优点:
<1>、程序容易阅读,便于诊断和维护;<2>、程序容易在不同厂家之间的PLC之间转换。
西门子的STL语言是强大,但难于阅读,编写程序也需要异常小心,其最强大的可能是它的寄存器寻址(类似于一些计算机高级语言中的地址指针),SCL没有这个功能,那就多费一些程序代码来实现同样的功能,程序是否优秀更应该看重程序的架构和提高程序生产效率的标准化,好的PLC程序不应该只有自己明白,而是让更多的人明白。
在西门子PLC中使用SCL语言的场合一般是编写标准功能块FB,其编程方式和西门子的其他编程语言,如梯形图Lad、语句表STL是完全不同的,同时为了实现程序的国际标准化,即为了方便的将程序代码移植到不同厂家的PLC系统上,尽量不要在SCL中使用西门子独有的功能块。
1、在FB块中使用结构编写FB块的准则,就是其使用的内部变量尽量与外部隔离,除了像PLC的新启动/重启动标志,以及一些方波/脉冲波等全局变量可以在FB块中使用外,其他的任何全局变量都不应该在FB内部使用,即使是自定义结构也应该在FB中单独定义,在FB块中使用结构应该在静态类型变量中定义,
如下:
VAR//StaticVariablesIM:
STRUCT//DatastructureofInternalFlagsH1_AFCountImp:
BOOL:
=False;//AuxFlagCounterImpulseH1_CountImp:
BOOL:
=False;//CounterImpulseH1_ELCountMV:
BOOL:
=False;//EndlessCounterMaximumValueEND_STRUCT;//otherdatastructure…END_VAR在使用这些结构时,可以按照如下方式:
IM.H1_CountImp:
=Imp;
2、在SCL中替代Set/Reset指令的方法SCL中不存在Set/Reset指令,或者说也没有必要使用。
在SCL中,不使用排他条件Else的条件语句就是一个Set/Reset指令。
如下编程:
IFTHENVariablename:
=1;END_IF;其等同于:
(S)
若加上Else条件,如下:
IFTHENVariablename:
=1;ELSEVariablename:
=0;END_IF;则等同于:
()
一条完整的包含置位和复位的语句可以使用如下方式编程:
IFTHENVariablename:
=1;END_IF;IFTHENVariablename:
=0;END_IF;其等效于SR指令,若将上面的两个条件语句的先后次序颠倒一下,则等效于RS指令。
3、简化程序指令<1>、尽量使用赋值语句替代那些不用于SR/RS指令的BOOL型赋值条件语句,如下:
IFfnAdd&(button=false)THENpus1:
=true;ELSEpus1:
=false;END_IF;其等效于pus1:
=fnAdd&(NOTbutton),这样使程序看起来更加简洁和容易阅读。
<2>、对于非BOOL型赋值语句则不能这如上简化,而是可以通过SEL函数实现:
IFfnAdd&(button=false)THENpus1:
=value1;ELSEpus1:
=value2;END_IF;其等效于pus1:
=SEL(G:
=fnAdd&(button=false),IN0:
=value2,IN1:
=value1);使用该函数时注意两点:
<1>、参数名不能省略;<2>、当选择条件G为TRUE时,选择后一个参数值IN1,为FALSE时,选择前一个参数值IN0,这点与计算机C语言等正好相反。
<3>、XOR指令有着比AND和OR更为复杂的表达,能使用XOR的地方应该尽量使用IF(condition1AND(NOTcondition2))OR(condition2AND(NOTcondition1))THENResult:
=true;ELSEResult:
=false;END_IF;其等效于Result:
=condition1XORcondition2;XOR功能就是两条件不同输出TRUE,相同输出FALSE
4、脉冲沿检测功能使用以下两条语句替代脉冲上升沿检测函数,譬如检测button_Input上升沿的代码如下:
Puls:
=button_Input&(NOTbutton_Last);button_Last:
=button_Input;同样的下降沿脉冲检测如下:
Puls:
=(NOTbutton_Input)&button_Last;button_Last:
=button_Input;
5、编写脉冲发生器波峰持续时间仅为一个PLC扫描周期的波形称为脉冲波,而波峰持续时间大于或等于两个PLC扫描周期的波形称为方波,脉冲波可用于计数、定时,方波可用于控制信号灯的闪烁输出,可以在西门子PLC的硬件配置中配置一个字节的各种时间的方波(波峰时间和波谷时间为1:
1),假设"FP_1Sec"为这个字节中1秒的方波,则:
<1>、间隔1秒的脉冲波“Impls_1Sec”如下编程:
“Impls_1Sec”:
="FP_1Sec"AND(NOT“Impls_1Sec_Aux”);“Impls_1Sec_Aux”:
="FP_1Sec";<2>、间隔10秒的脉冲波“Impls_10Sec”如下编程:
IF(“Impls_10Sec”)THENCount_Actual:
=0;“Impls_10Sec”:
=0;ELSEIF(“Impls_1Sec”)THENCount_Actual:
=Count_Actual+1;END_IF;“Impls_10Sec”:
=Count_Actual>=10;END_IF;Count_Actual的初始值为0,同时当系统新启动时,也需将其设为零。
间隔更长时间的脉冲波编程都可以按照上面的方式编程。
6、尽量使用编程计数功能来替代定时器功能,这样使程序更可靠和易于阅读假设Input_Condition为输入,Output_Delay为通过定时处理后的输出,Timer_Setpoint为时间设定点,Timer_Actual为当前时间计数的实际值,“Impls_1Sec”为系统编程产生的1秒脉冲。
<1>、在输入条件满足的情况下,延时输出的定时器:
IF(NOTInput_Condition)THENTimer_Actual:
=0;Output_Delay:
=0;ELSEIF(“Impls_1Sec”ANDNOTOutput_Delay)THENTimer_Actual:
=Timer_Actual+1;END_IF;Output_Delay:
=Timer_Actual>=Timer_Setpoint;END_IF;
<2>、有记忆的延时输出定时器,即在延时过程中,若输入条件终止,不影响延时,这种定时器必须使用其它的信号复位。
IFInput_ConditionTHENOutput_Aux:
=1;END_IF;IF(NOTOutput_Aux)THENTimer_Actual:
=0;Output_Delay:
=0;ELSEIF(“Impls_1Sec”ANDNOTOutput_Delay)THENTimer_Actual:
=Timer_Actual+1;END_IF;Output_Delay:
=Timer_Actual>=Timer_Setpoint;END_IF;若想终止Output_Delay的输出,必须在后面追加一条条件语句,用于复位Output_Aux
<3>、立即输出,延时断开的定时器IFInput_ConditionTHENTimer_Actual:
=0;Output_Aux:
=0;Output_Delay:
=1;//立即输出ELSEIF(“Impls_1Sec”ANDNOTOutput_Aux)THENTimer_Actual:
=Timer_Actual+1;END_IF;Output_Aux:
=Timer_Actual>=Timer_Setpoint;END_IF;IFOutput_AuxTHENOutput_Delay:
=0;//延时断开END_IF;
<4>、在检测到一个上升沿脉冲后,立即输出,并开始计时,在时间到达后断开。
IFInput_ConditionTHENOutput_Aux:
=1;END_IF;IF(NOTOutput_Aux)THENTimer_Actual:
=0;Timer_Arrived:
=0;ELSEIF(NOTTimer_ArrivedAND“Impls_1Sec”)THENTimer_Actual:
=Timer_Actual+1;END_IF;Timer_Arrived:
=Timer_Actual>=Timer_Setpoint;END_IF;IFTimer_ArrivedTHENOutput_Aux:
=0;END_IF;Output_Delay:
=Output_Aux;
通过以上的编程方式可以实现任何定时器功能,而代码却可以为不同的PLC系统所使用。
7、使用编程计数功能来替代计数器在SCL语言中使用计数功能是最为简单的,其关键是必须首先对输入进行脉冲检测假设Input_Imp为输入脉冲,CountImp为输入脉冲检测,Counter为计数值,Factor为计数因子(更详细点就是每来一次脉冲,计数值增加多少)。
(*-----CreateImpulse(ImpulseEvaluation)-----------------------------------------------------*)CountImp:
=Input_ImpAND(NOTCountImp_Old);CountImp_Old:
=Input_Imp;(*-----Counter---------------------------------------------------------------------------------*)IFCountImpTHENCounter:
=Counter+Factor;END_IF;一个完整的计数程序应该还有计数器复位功能以及计数值上限检测条件(以防止计数值溢出)。
8、新故障/新警告的检测一个完整的FB块应该能够检测故障/警告,以及新故障/新警告,假设Input1,Input2…Inputn对应故障的输入(有信号表示OK),Fault1,Fault2…Faultn对应故障位,NFault1,NFault2…NFaultn对应新故障位,Flt和NFlt分别对应综合的故障和新故障,Ackn对应故障应答输入,为常开点,Mute对应新故障消除输入(或者称为蜂鸣器沉寂),为常开点:
Fault1:
=NOTInput1OR(Fault1ANDNOTAckn);NFault1:
=Fault1AND(MuteORNFault1);Fault2:
=NOTInput2OR(Fault2ANDNOTAckn);NFault2:
=Fault2AND(MuteORNFault2);…Flt:
=Fault1ORFault2ORFaultnNFlt:
=(Fault1ANDNOTNFault1)OR(Fault2ANDNOTNFault2)OR(FaultnANDNOTNFaultn)NFlt就是最终的新故障输出指示,新警告的检测与之类似。
9、字中取位字中取位有两种方式,一种是通过西门子所特有的字取位方式实现,一种是通过计算机编程的标准方式实现,假设Input_Word为输入参数,Word类型,W0,W1,…W15为位变量。
<1>、通过西门子的M变量实现:
Temp_Aux:
=MW[10];MW[10]:
=Input_Word;W0:
=M[11,0];W1:
=M[11,1];W2:
=M[11,2];W3:
=M[11,3];W4:
=M[11,4];W5:
=M[11,5];W6:
=M[11,6];W7:
=M[11,7];W8:
=M[10,0];W9:
=M[10,1];W10:
=M[10,2];W11:
=M[10,3];W12:
=M[10,4];W13:
=M[10,5];W14:
=M[10,6];W15:
=M[10,7];MW[10]:
=Temp_Aux;
<2>、通过标准编程实现w0:
=(Input_Word&16#1)=16#1;w1:
=(Input_Word&16#2)=16#2;w2:
=(Input_Word&16#4)=16#4;w3:
=(Input_Word&16#8)=16#8;w4:
=(Input_Word&16#10)=16#10;w5:
=(Input_Word&16#20)=16#20;w6:
=(Input_Word&16#40)=16#40;w7:
=(Input_Word&16#80)=16#80;w8:
=(Input_Word&16#100)=16#100;w9:
=(Input_Word&16#200)=16#200;w10:
=(Input_Word&16#400)=16#400;w11:
=(Input_Word&16#800)=16#800;w12:
=(Input_Word&16#1000)=16#1000;w13:
=(Input_Word&16#2000)=16#2000;w14:
=(Input_Word&16#4000)=16#4000;w15:
=(Input_Word&16#8000)=16#8000;
使用方式1会更加简单和容易理解一些,但方式2具有更加宽广的应用场合,更加标准化,即使是当今的计算机编程在取位操作时也类似于上面的编程。
字取位的场合,一般用于总线数据(譬如变频器的状态数据),则可能是字/整数,此时就需要用到上面的编程。
10、将位组合成字相当于“字中取位”的反向操作,这也有两种方法,一种方法是使用M变量,类似于“字中取位”的方式<1>,另一种也是标准编程,假设Output_Word为输出参数,Word类型,W0,W1,…W15为位变量。
<1>、通过西门子的M变量实现:
Temp_Aux:
=MW[10];M[11,0]:
=W0;M[11,1]:
=W1;M[11,2]:
=W2;M[11,3]:
=W3;M[11,4]:
=W4;M[11,5]:
=W5;M[11,6]:
=W6;M[11,7]:
=W7;M[10,0]:
=W8;M[10,1]:
=W9;M[10,2]:
=W10;M[10,3]:
=W11;M[10,4]:
=W12;M[10,5]:
=W13;M[10,6]:
=W14;M[10,7]:
=W15;Output_Word:
=MW[10];MW[10]:
=Temp_Aux;<2>、通过标准编程实现IFW0THENOutput_Word:
=Output_WordOR16#1;ELSEOutput_Word:
=Output_WordAND(NOT16#1);END_IF;IFW1THENOutput_Word:
=Output_WordOR16#2;ELSEOutput_Word:
=Output_WordAND(NOT16#2);END_IF;IFW2THENOutput_Word:
=Output_WordOR16#4;ELSEOutput_Word:
=Output_WordAND(NOT16#4);END_IF;IFW3THENOutput_Word:
=Output_WordOR16#8;ELSEOutput_Word:
=Output_WordAND(NOT16#8);END_IF;IFW4THENOutput_Word:
=Output_WordOR16#10;ELSEOutput_Word:
=Output_WordAND(NOT16#10);END_IF;IFW5THENOutput_Word:
=Output_WordOR16#20;ELSEOutput_Word:
=Output_WordAND(NOT16#20);END_IF;IFW6THENOutput_Word:
=Output_WordOR16#40;ELSEOutput_Word:
=Output_WordAND(NOT16#40);END_IF;IFW7THENOutput_Word:
=Output_WordOR16#80;ELSEOutput_Word:
=Output_WordAND(NOT16#80);END_IF;IFW8THENOutput_Word:
=Output_WordOR16#100;ELSEOutput_Word:
=Output_WordAND(NOT16#100);END_IF;IFW9THENOutput_Word:
=Output_WordOR16#200;ELSEOutput_Word:
=Output_WordAND(NOT16#200);END_IF;IFW10THENOutput_Word:
=Output_WordOR16#400;ELSEOutput_Word:
=Output_WordAND(NOT16#400);END_IF;IFW11THENOutput_Word:
=Output_WordOR16#800;ELSEOutput_Word:
=Output_WordAND(NOT16#800);END_IF;IFW12THENOutput_Word:
=Output_WordOR16#1000;ELSEOutput_Word:
=Output_WordAND(NOT16#1000);END_IF;IFW13THENOutput_Word:
=Output_WordOR16#2000;ELSEOutput_Word:
=Output_WordAND(NOT16#2000);END_IF;IFW14THENOutput_Word:
=Output_WordOR16#4000;ELSEOutput_Word:
=Output_WordAND(NOT16#4000);END_IF;IFW15THENOutput_Word:
=Output_WordOR16#8000;ELSEOutput_Word:
=Output_WordAND(NOT16#8000);END_IF;同样的,使用标准化编程会繁琐一些,但有着很强的通用性,在总线通讯控制中,很多控制字(如变频器)都是以字的形式传递,所以需要把一些BOOL数据合并到一个字中,可以采用上面的对字中的位进行置位/复位操作的方式,但事实上使用时,控制命令可能只有启动/停止和方向控制等,所以这是可以直接对输出赋值,譬如当我们知道16#0F对应启动命令和正传时,可以直接使用如下赋值语句即可控制变频器正向运转:
Output_Word:
=16#0F,如需反向运转,则再赋另一个值即可,而不需要像上面那样对字的每一位操作。
以上是我总结的一些使用技巧,其编程可能有更好的实现方式,欢迎来信探讨
PLC的结构及基本配置
一般讲,PLC分为箱体式和模块式两种。
但它们的组成是相同的,对箱体式PLC,有一块CPU板、I/O板、显示面板、内存块、电源等,当然按CPU性能分成若干型号,并按I/O点数又有若干规格。
对模块式PLC,有CPU模块、I/O模块、内存、电源模块、底板或机架。
无任哪种结构类型的PLC,都属于总线式开放型结构,其I/O能力可按用户需要进行扩展与组合。
PLC的基本结构框图如下:
接受 驱动
现场信号
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 怎样 学习 PLCPLC 入门