产品详情
西门子PLC卡件6ES7317-2AK14-0AB0
S7-300PLC中的FB和FC的分别?FB带有自己的背景DB而FC没有自己的背景DB,用FC和FB有什么分别呢,他们都能实现控制功能,到底该用FB还是该用FC,什么时候用FB什么时候用FC?
FB与FC没有太大的差别,FB带有背景数据块,而FC没有。所以FB带上不同的数据块,就可以带上不同的参数值。这样就可以用同一FB和不同的背景数据块,被多个对象调用。
FC和FB像C中的函数,只不过FB可以生成静态变量,在下次函数调用时数据可以保留,而FC的变量只在调用期内有效,下次调用又重新更换。每次调用FC的I/O区域必须要自己每次手动输入,而FB就不要,省去不少麻烦,如果在上位机控制直接输入DB控制地址就可以。
举个例子来说,有50台电机需要控制,这些电机除了参数不一样,控制流程上是一样的,每个
电机需要不同的参数去运行,运行中的过程参数要参与到下一次的控制过程中。
这个要求,用FC做的话,你需要针对不同的电机分配好DB块,来逐一的确认参数地址,不能混
淆,保存和调用不能出错,可以想象会有多麻烦。如果用FB来做呢?写好控制过程和定义的参
数的调用就可以了。针对电机重复调用同一个FB,每次调用一个独立的DB作为背景数据块
,完全不必理会背景DB中的数据是怎么存储的。如果功能需要修改,只要修改该FB就行了。
还有其他的例子,比如PID、比如流量累计等等。
fc就相当于流水线,加工完就过去了!没有任何纪录。fb+db不但可以加工,还能记录数据的。
一般有多个设备的时候,我们编写一个fb然后多次调用,自动生成相应的db,这样简化了我们
的工作。
FB的变量声明表中有静态变量,并可以进行多级的参数传递,因此在调用FB时需生成背景数据块,
而FC则没有这些.FB可以替代FC,反之则不行.
多级的参数传递即所谓的MULTIINSTANCE,你可以把FB,DB做为另外一个FB中的函数来调用,
如在FB2中可以使用FB1中的参数,而终只生成一个背景数据块。
Zane:
FB其实不会占用过多的资源,因为一个程序总是有这些变量的,无论是全局的还是局部变量。
我现在,大量使用的是FB,FC只用来编一些逻辑,及简单的子程序,或仅仅几个CALL指令调用
FB。使用FB及局部变量,更有利于程序的模块化,增加程序的可移植性,就象西门子公司提供的FB
块.
其实FB和FC根本的区别是:FB支持静态变量,而FC只支持临时变量。
静态变量:是调用FB返回时,仍然要为FB保留此变量区,因此不会改变这一区域的数据值。临
时变量却没有这样的特性。
所以在FC中如果在对临时数据变量处写入确定的数据前,就去读时就可能产生不可预见的结果
,而对于静态变量却不会,因为它会保留你上次写入的结果。
万泉河:
咱们编制的控制程序,FB极少用到。所说的用FB来替代FC实用的情况,更是少见,有谁曾经把
FC全部用光啦?恐怕系统都不能负担了。
提供的标准库中,FB倒是不少的。
如果你要编制的函数没有用到静态变量,恐怕没有必要使用FB吧?我看高级语言中,虽然静态
变量使用很容易,但实际用也很少啊。
侠客:我和zane的观点一样,我工作中也是把相同功能的工作编制成FB,然后在FC里调用,程
序修改起来方便,举个例子:如果你有10台电机,一般我们都要给他编制启动,停止逻辑,报
警,复位逻辑。如果我编一个FB把这些逻辑都做好了,为每一个电机分配一个背景数据块的话
,我在FC调用这些电机时,我只要把这些电机对应的I/O点添到FB的管脚上就可以了,完全不再
用考虑他里面的逻辑了,如果你全是用FC编这些逻辑的话,1、你要写10遍,2、如果你用粘贴
和复制的话,有可能有的I/O点忘记修改或其他一些错误,3、程序的结构性不强,维护起来浪费
时间。
所以,FB和FC结合起来用是的。
建议大家试试FB,当你理解了FB后,你会感到的
Zane:关于FB,FC的使用,我也是在具体的应用中一步一步地体会过来的,不过这仅是我个人
的看法与体会,并没有说一定要这样用,各位可以做不同的尝试。但有一点是肯定的,就是在
动手写程序之前,事先对整个项目要有一个很好的规划。
看老外的程序通常都是在FC里直接编程,而国内的多是在FB里编程然后再在FC里调用。这两种
方法各有什么优缺点呢?
用FC能实现的任务,就没必要用FB。
FCFB本质上一样
调用FB相当于在FC里opndi,并使用ar2来索引变量
FB的优点是数据块里的变量可按名字使用,仅仅是显示而已,执行效率和fc一样
补充:
实际上FC更加灵活,在fc里可以多次调用opndi访问多个背景块,ar2也可以做多种用途
而fb里的ar2原则上是不能使用了,调用fb还要数据块,麻烦
补充2:
FB实际上是编程环境玩的一个魔法而已
PLC的程序指令上实际是没有FB和FC的区别的
调用FB或者FC终都是转化为UC或CC的调用指令
要观察编程环境的这个魔法,只需写一个带参子程序(FB或FC),并在另一个块里调用,全部
下载后,再更改子程序的参数接口,下载该子程序
(此时调用块的调用指令已无效),然后上载调用块
1,一般用FB编写一些常用的控制程序,例如阀泵的控制等等,在接口得stat变量里面可以定义一些阀门得开度预设值(不通过输入,直接在HMI上面可以控制的),并且可以把现场的故障信号写入stat变量中,直接送到HMI上面。
2,而FC一般就是调用这些FB,给一些输入输出即可。
3,FC的所有输入输出必须赋值,而FB只要给出背景数据块即可。
4,当然如果说我不需要什么过程的数值,那就FC好了,简单。
如果大家对计算机编程有点了解的话,我觉得可以这样理解:
1、FC象程序里的“函数”,直接调用,针对过程编程;
2、FB则象是“类”,具有接口、属性以及方法,用于对“控制对象”编程,而FB的DB就象是一个具体的“控制对象”的实例。
西门子S7-200PLC具有脉冲输出功能,在运动控制系统中,伺服电机和步进电机是很重要的精确定位装置,而控制伺服电机和步进电机需要使用脉冲输出。S7-200系列PLC可以输出20--100KHz的脉冲。使用PTO和PWM指令可以输出普脉冲和脉宽调制输出。通过smb66-75,smb166-175来控制Q0.0的输出,通过smb76-85,smb176-185来控制Q0.1的脉冲输出。
控制伺服电机
伺服电机是运动控制中一个很重要的器件,通过它可以进行精确的位置控制。它一般带有编码器,通过高速计数功能,中断功能和脉冲输出功能,构成一个闭环系统,来进行精确的位置控制。
PLC的脉冲输出
由于PLC在进行高速输出时需要使用晶体管输出。当将高速输出点作为普通输出而带电感性负载时,例如电磁阀,继电器线圈等,一定要注意,在负载端加保护,例如并联二极管等。以保护输出点。
PLC的程序分为主程序、子程序和中断程序,本文详细的介绍了西门子S7-200系列PLC中断程序的编程方法。具体的讲解不同种类的中断程序的实现方法。熟练的使用中断程序是PLC编程的一项必要技能。相信本文会对广大PLC编程人员有所帮助。S7-200的中断包括定时中断,IO中断和通讯中断。其中IO中断可以通过外部的IO点来触发中断子程序。可以设置成几种模式,例如上升沿触发,下降沿触发等。定时中断是固定时间间隔便触发一次中断程序。通讯中断可以在数据接收或发送完成时或报文接收完成时触发中断程序。
定时中断功能
定时中断是测量周期的一个很重要的工具。在使用编码器测速度时也要用到定时中断,即用周期和脉冲数的比例关系来计算速度。定时中断的中断号为10(定时中断0),11(定时中断1),21(定时器T32中断),22(定时器T96中断)。
通讯中断的实现
S7-200的自由口通讯需要设置相应的中断来判断通讯是否正常。通讯分为三种即字符发送和接受完成,报文接受完成。其中断号为口1为8,9,23,口2为25,26,24
通过网站申请注册码REG_KEY
1、通过西门子技术支持网站申请,打开如下网址,点击“技术问题提交”:
http://support.automation.siemens.com/CN/llisapi.dll?func=cslib.csinfo2&aktprim=99&lang=zh
图29 技术支持网站
2、请按如下示例的步骤进行操作(注意:由于步骤3搜索出来的参考信息无法解决授权问题,请直接点击“继续”进入步骤4),如图30~34所示。
图30 步骤1
图31 步骤2
图32 步骤4
图33 步骤5
图34 步骤6
使用注册码REG_KEY
1、西门子授权中心收到技术支持申请后,将会尽快给您回复邮件;
2、当获取到注册码后,在项目中打开LICENSE_DB(DB3);
3、通过菜单“View--->Data View”将DB块切换到数据视图模式,将获取的17位注册码填写到“Actual value”中,如图35所示。
图35 输入注册码
4、将LICENSE_DB(DB3)下载到CPU中,CPU的INTF指示灯熄灭;并可通过查看MODBUSPN(FB102)的输出引脚LICENSED为true且不再报A090错误代码,确认注册码激活成功,如图36所示。
图36 注册码激活成功
6. CP进行Modbus TCP通讯FB输出常见故障代码及处理
|
STATUS(Hex) |
故障原因 |
处理措施 |
|
FB MODBUS故障 |
||
|
A002 |
Modbus起始地址Start_x错误 |
由通讯伙伴确认起始地址 |
|
A003 |
Modbus地址映射的DB块的数据区长度太短,低长度: -寄存器: (START_ADDRESS – start_x + LENGTH) * 2 -位 (START_ADDRESS – start_x + LENGTH) / 8 其他可能的原因: ·参数初始化错误(CP为Client时) ·客户端请求报文时错误的地址区域(CP为Server) |
扩展DB区域 当CP为Client时,修改参数START-ADDRESS或者LENGTH 当CP为Server时,修改客户端的请求 |
|
A004 |
仅在CP为Client时才有此故障: 参数DATA_TYPE及WRITE_READ设置不匹配,不可能对输入寄存器或离散输入进行写操作 |
修改此两个参数 |
|
A005 |
CP为Client时: 参数LENGTH设置无效 CP为Server时: Client请求的寄存器号无效,合法的数据类型范围如下: 读线圈/离散输入: 1 to 2000 写线圈: 1 to 1968 读寄存器: 1 to 125 写保持寄存器: 1 to 123 |
CP为Client时: 修改参数LENGTH CP为Server时: 修改Client请求的数据类型范围 |
|
A006 |
CP为客户端时: 数据区1-8中对应的Modbus地址范围(DATA_TYPE, START_ADDRESS和 LENGTH )不存在 CP为服务器时: 客户端请求的报文不正确 |
CP为Client时: 修改参数DATA_TYPE,START_ADDRESS和 LENGTH CP为Server时: 修改Client 请求或修改数据类型data_type_x.
|
|
A007 |
CP为Client时: 参数MONITOR监控时间设置无效,值必须>20ms |
修改参数MONITOR |
|
A008 |
接收监控超时,可能的原因: 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 对于MODBUSCP V1.x: 同步错误,报文丢失 |
检查通讯伙伴的参数设置,如单元标识符等 |
|
A009 |
当CP为Client时,接收标识符TI与发送不一致, 连接将终止和重新建立 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 |
通过抓包工具来分析和修正通讯伙伴的报文
|
|
A00A |
CP为Client时,接收参数UNIT 与发送的不一致,连接将终止和重新建立 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 |
|
|
A00B |
CP为Client时: 接收与发送功能码不一致 CP为Server时: 无效的功能码被接收 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 对于MODBUSCP V1.x: 同步错误,报文丢失 |
CP为Client时: 通过抓包工具来分析和修正通讯伙伴的数据报文格式 CP为Server时: 注意FB MODBUS仅支持功能码FC1、2、3、4、5、6、15、16 |
|
A00C |
接收到的字节长度与寄存器/位不匹配 CP为服务器时,CP将发一个响应异常给客户端 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 |
通过抓包工具来分析和修正通讯伙伴的报文
|
|
A00D |
仅在CP 为Client 时发生: 响应的MODBUS寄存器/位地址或长度与客户端请求的不一致 |
|
|
A00E |
MODBUS报文报头的长度与寄存器/位 不匹配,FB将忽略 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 对于MODBUSCP V1.x: 同步错误,报文丢失 |
|
|
A00F |
非0的协议标识符报文被接收 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 对于MODBUSCP V1.x: 同步错误,报文丢失 |
|
|
A010 |
数据区1-8 DB块号重复使用 |
确保每个Db块号只使用一次 |
|
A011 |
DATA_TYPE参数设置(范围为1-4) |
修改DATA_TYPE参数 |
|
A012 |
数据区参数data_type_1和data_type_2设置重叠
|
数据区不能有重叠的modbus地址区域 |
|
A013 |
数据区参数data_type_1和data_type_3设置重叠 |
修改此参数 |
|
A014 |
数据区参数data_type_1和data_type_4设置重叠 |
|
|
A015 |
数据区参数data_type_1和data_type_5设置重叠 |
|
|
A016 |
数据区参数data_type_1和data_type_6设置重叠 |
|
|
A017 |
数据区参数data_type_1和data_type_7设置重叠 |
|
|
A018 |
数据区参数data_type_1和data_type_8设置重叠 |
|
|
A019 |
当参数data_type_x设置不为0时,db_x被赋值0 |
db_x不能为0 |
|
A01A |
报头中长度错误: 范围3-253字节 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 |
通过抓包工具来分析和修正通讯伙伴的报文
|
|
A01B |
CP为Server及使用功能码FC05时: 接收的线圈值无效 CP将发送异常报文 |
|
|
A01E |
CP接收到无法识别的数据, 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 对于MODBUSCP V1.x: 同步错误,报文丢失 |
分析错误信息,通过抓包工具来分析和修正通讯伙伴的报文 |
|
A01F |
功能块FB MBBUSCP返回一个无效的状态 |
联系产品供货商 |
|
A020 |
参数Check_conn_cycle设置<1s时,对于功能块AG_CNTRL过短 |
当为Client模式时,参数Check_conn_cycle=TRUE下Check_conn_cycle设置需要>1s; 当为Server模式时,Check_conn_cycle设置需要>1s; |
|
A023 |
数据区参数data_type_2和data_type_3设置重叠
|
数据区不能有重叠的modbus地址区域 |
|
A024 |
数据区参数data_type_2和data_type_4设置重叠 |
|
|
A025 |
数据区参数data_type_2和data_type_5设置重叠 |
|
|
A026 |
数据区参数data_type_2和data_type_6设置重叠 |
|
|
A027 |
数据区参数data_type_2和data_type_7设置重叠 |
|
|
A028 |
数据区参数data_type_2和data_type_8设置重叠 |
|
|
A034 |
数据区参数data_type_3和data_type_4设置重叠 |
|
|
A035 |
数据区参数data_type_3和data_type_5设置重叠 |
|
|
A036 |
数据区参数data_type_3和data_type_6设置重叠 |
|
|
A037 |
数据区参数data_type_3和data_type_7设置重叠 |
|
|
A038 |
数据区参数data_type_3和data_type_8设置重叠 |
|
|
A045 |
数据区参数data_type_4和data_type_5设置重叠 |
|
|
A046 |
数据区参数data_type_4和data_type_6设置重叠 |
|
|
A047 |
数据区参数data_type_4和data_type_7设置重叠 |
|
|
A048 |
数据区参数data_type_4和data_type_8设置重叠 |
|
|
A056 |
数据区参数data_type_5和data_type_6设置重叠 |
|
|
A057 |
数据区参数data_type_5和data_type_7设置重叠 |
|
|
A058 |
数据区参数data_type_5和data_type_8设置重叠 |
|
|
A067 |
数据区参数data_type_6和data_type_7设置重叠 |
|
|
A068 |
数据区参数data_type_6和data_type_8设置重叠 |
|
|
A068 |
数据区参数data_type_7和data_type_8设置重叠 |
|
|
A07A |
参数id设置无效:范围1-64 |
修改参数id |
|
A07C |
参数data_type_1设置无效:范围0-4 |
修改参数data_type_x |
|
A07D |
参数data_type_1未定义,data_type_1为缺省的使用数据区,需要定义 |
修改参数data_type_1 |
|
A07E |
参数db_x值与背景DB中的值不一致 |
修改参数db_x |
|
A080 |
在OB1和OB100调用FB MODBUS功能块时使用了不同的背景DB |
需要使用相同的背景DB |
|
A081 |
CP为Client且使用FC05功能码时: 接收的线圈状态与发送不一致 |
通过抓包工具来分析和修正通讯伙伴的报文 |
|
A082 |
CP为Client且使用FC06功能码时: 接收的寄存器值与发送不一致 |
通过抓包工具来分析和修正通讯伙伴的报文 |
|
A083 |
仅在CP为Client时:在上一个请求还没有处理完成时又发送新的请求 |
等待DONE =TRUE 或 ERROR = TRUE后再发送新请求 |
|
A085 |
在授权期间由于无效的写权限导致发生错误 |
对于授权DB,确认参数REG_KEY的结构是否正确 |
|
A090 |
功能块未授权,此为一状态信息,参数ERROR并不会置1,功能块在未授权情况仍然可以运行而不影响通讯 |
针对CPU读出预授权解码,之后按照授权操作向IT4industry.部门索取授权码 |
|
A091 |
收到异常响应码1(仅在Client模式),连接将终止和重新建立 |
通讯伙伴不支持请求的报文 |
|
A092 |
收到异常响应码2(仅在Client模式),无效的或不存在的地址请求 |
确认参数LENGTH 或START_ADDRESS 是否正确 |
|
A093 |
收到异常响应码3(仅在Client模式) |
通讯伙伴无法执行报文接收(例如请求长度不支持等) |
|
A094 |
收到异常响应码4(仅在Client模式) |
通讯伙伴无法执行报文接收 |
|
A095 |
收到未知的异常响应码(仅在Client模式) |
通过抓包工具来分析和修正通讯伙伴的报文 |
|
FC/SFC故障 |
||
|
7xxx |
请参考SIMATIC的在线帮助 |
通过在线帮助SIMATIC manager -> mark block -> key F1 –> Ethernet -> see also -> code buation可以查到相关帮助信息 |
|
8xxx |
请参考SIMATIC的在线帮助 |
通过在线帮助SIMATIC manager -> mark block -> key F1 –> Ethernet -> see also -> code buation可以查到相关帮助信息 |
|
SFC24故障 |
||
|
80A1 |
DB=0或超出了CPU允许的范围 |
选择有效的DB |
|
80B2 |
DB块在CPU中不存在 |
DB_x参数中的DB块必须创建并下载到CPU中 |
|
80B3 |
DB块被创建为“Unbed”类型 |
DB块不能创建为“Unbed”类型 |













