上次分享的一个关于PLC的面向对象的编程方法的视频:
PLC的面向对象的编程方法,
今天通过一个实际案例编程来实战下。该程序实例是2017年的时候,基于西门子S71500+基恩士的一个条码阅读器的编程实例。以下内容也是当时编程测试后的文字总结,所以有些文字的描述会读起来可能会有时间差(偷懒没有修改),请谅解!
当如此编程后,后续只要用到该产品,你只要调用该FB块,既快捷又方便,而且经过长时间的测试和使用,FB的可靠性肯定会非常稳定;
以下是当时的正文:
最近拿到了一个条形码阅读器产品,针对这个产品我们进行了相关研究与编程工作,下面就以这个条形码阅读器的编程过程描述该如何进行一个产品性能的PLC编程工作。
注:面向对象编程方式花费时间长,测试工作比较多,但优点是程序可靠、维护方便以及后续使用便利等优点;
注:以下叙述都基于编程要求,不涉及其他相关内容(比如安装);
1.硬件结构图
如图所示BL-1300为条形码阅读器,其读到的条码通过一个N-L20的通信协议转换器转换把数据通过Profinet(西门子通信协议)协议发送到主控制器PLC(西门子)。
2.产品性能分析(工艺分析)
条码阅读器主要作用就是识别条形码,除此之外还具备其他辅助功能:比如条码类型检查,条码位置检查,条码质量检测等功能;
通过阅读产品手册(见附录),通过Profinet能读到的数据只有主要功能的数据,其他辅助功能的数据商家没有开放给PLC工程师;
相应数据映射如下列图示:
注:插槽8中的数据以及插槽13中的数据PLC无法读取或很难满足产生信号的条件(厂家答复);
3.PLC的硬件配置
依据上图数据映射关系,PLC硬件及IO配置如下
内存映射地址域:输入分配Byte 0至Byte 95;
输出分配Byte0 至 Byte4;
因为用于测试的条码为10位数字,所以插槽9中的Read Data选择64Byte长度的模块;
4.产品功能分析
阅读模式
条码阅读器分单标签阅读模式和多标签阅读模式;
单标签阅读模式:每一个触发周期只读一条条码,读到一条条码后即关闭激光不再阅读;
多标签阅读模式:每一个触发周期内可以阅读多个条码,并将每一个条码存储在缓存区域;
单标签阅读模式时序图:
多标签阅读模式1时序图:
多标签阅读模式2时序图:
5.编程说明
5.1功能块概述
功能块名字为:FB_Keynece_PN_BL1300;
功能:基恩士BL-1300条码阅读器基于Profinet协议的标准程序 程序归属:条码阅读
描述:基于BL-1300功能的西门子标准程序,实现以下功能及注意事项:
1.硬件触发或者指令触发模式;
2.单条码读取模式以及多条码读取模式1,多条码读取模式2
注意事项:
1.一般情况下,请选择单条码读取模式或多条码读取模式1;当且仅当条码格式为条码长度固定且需要检验出是否有不一样的条码,才选择多条码读取模式2;
2.数据统计功能仅限于单条码读取模式及多条码读取模式1;
5.2功能块说明
该程序主要基于西门子S71500(S7300/400)实现4.4.1中列举的三种条码阅读模式的时序图,该产品同一个信号定义在不同时序图中是不一样的,故程序中的使用可能会有多种状态,必须结合三个时序图阅读程序;
5.3程序接口配置
- 通过上述以及条码阅读器的通用功能,程序里面主要实现以下几个功能:
- 触发模式选择:条码阅读器触发可以通过硬件触发或者指令触发两种模式;
- 条码阅读模式选择:可以选择不同的阅读模式,如上述的三种阅读模式;
以上参数的设置或者模式选择在程序中的i_Setting的引脚设置,i_Setting的数据结构如下:
- 条码阅读器状态信号
条码阅读器状态信号主要包含在插槽1-5中,主要由以下部分组成
插槽 | 模块名称 | 长度 | 备注 |
1 | Handshake and General Error Status | 1Byte | |
2 | Busy status bits | 1Byte | |
3 | Completion Status bits | 1Byte | |
5 | Terminal Status bits | 1Byte | 硬件接线端口定义 |
1-5插槽的总长度为4个Byte即一个双字的长度,所以在程序块中的输入端口定义为一个Any类型i_Hardware_Status,在变量表中定义一个名称为ID_Reader_Status的双字类型的变量,程序中通过指针的指引将该双字里面的状态复制到功能块中的临时变量t_Hardware_Status;
临时变量t_Hardware_Status结构如下:
TYPE"UDT_BL1300_Hardware_IO"
VERSION: 0.1
STRUCT
HandShake_Error : Bool;
HandShake_Resu_Data_Avail : Bool;
HandShake_Resu_Data_Strobe : Bool;
HandShake_03 : Bool;
HandShake_04 : Bool;
HandShake_05 : Bool;
HandShake_Buffer_OverFlow : Bool;
HandShake_Gene_Error : Bool;
Busy : Bool;
Busy_01 : Bool;
Busy_02 : Bool;
Mode_Busy : Bool;
Busy_04 : Bool;
Busy_05 : Bool;
Busy_06 : Bool;
Busy_07 : Bool;
Read_Complete : Bool;
Complete_01 : Bool;
Complete_02 : Bool;
Complete_03 : Bool;
Complete_04 : Bool;
Complete_05 : Bool;
Complete_06 : Bool;
Complete_07 : Bool;
I_Trigger : Bool;
I_Setting : Bool;
IO_Spare_02 : Bool;
IO_Spare_03 : Bool;
o_Read_OK : Bool;
o_Read_Error : Bool;
o_Barcode_Posi_Warning : Bool;
o_Busy : Bool;
END_STRUCT;
END_TYPE
5.4备注及问题
在测试中该程序块主要实现不同阅读模式的时序图,当设备中有使用该产品时即可调用该程序块直接使用;
基于每个项目或产品的程序结构不同,该程序块主要实现条码的解析并存放在静态变量s_Last_Barcode_Read中,若要使用该数据则必须结合项目或设备PLC程序结构,在条件满足的情况下将条码数据应用于自己产品中;
另:基于时间及测试环境限制,当产品出现问题需要复位或者其他功能该程序块还没有测试,需要后续完善更新;