前几期课程,我们讲述了PLC的梯形图语言的基本知识,并与大家分享了使用ZDevelop软件的ZPLC语言调用ZVision视觉指令的方法。

本期课程我们将通过使用ZPLC语言实现识别条形码的视觉功能的程序示例,进一步带领大家去了解PLC玩转机器视觉的实现方法。

会PLC也能玩转机器视觉(二)- 条码识别

#一 、 检测原理

##(一)识别条形码

条形码是由不同的宽度、不同的反射率的条(黑色)和空(白色)组成的,根据特定的编码规则编制,用于表达一组数字、字母信息的图形标识符。机器视觉在进行条形码识别的过程中,将采集到的条形码信息二值化为黑白条,并根据条形码的编码规则输出对应的存储内容。

##(二)PLC玩转视觉

在《会PLC也能玩转机器视觉(一)》的推文中,我们介绍了使用ZPLC编程语言调用ZBasic语言的方法,即EXE @BASIC指令。本期课程我们将和大家分享另一种调用方法,即使用ZPLC编程语言调用BASIC子程序。

#二、 软件演示

##(一)检测要求

使用ZDevelop软件的ZBASIC编程语言编写程序,用于识别软件所在目录的flash文件夹下命名为“code”文件夹下的条形码内容。再使用ZPLC编程语言调用BASIC程序的主任务,进行循环检测识别。

##(二)实例演示

1.打开ZDevelop软件:新建项目→新建HMI文件→新建main.bas文件→新建global_variable.bas文件→新建Plc1.plc文件,用于编写PLC执行程序→文件添加到项目。
  
  
  2.设计HMI界面。

3.在global_variable.bas文件中添加全局变量。

  '''''全局变量大部分使用数组结构'''''''注:basic编程中很多函数会以TABLE(系统的数据结构)做为参数''table 说明 table 说明''1~7 矩形roi控件坐标数据 24 数据码类型''11~12 鼠标操作时获取的坐标 26 数据码结果'主任务状态'0 - 未初始化'1 - 停止'2 - 运行中'3 - 正在停止GLOBAL DIM main_task_statemain_task_state = 1' 任务号划分, 主任务id - 10GLOBAL DIM main_task_idmain_task_id = 10'定义图像变量GLOBAL ZVOBJECT grabImg'识别消耗时间GLOBAL DIM d_identfy_timed_identfy_time = 0'识别结果,结果存储方式为:类型:识别内容,如EAN-13:123456789GLOBAL DIM d_identfy_rst(256)'定义本地图片索引GLOBAL DIM d_indexd_index=0'定义读取图片的路径GLOBAL DIM File_Name(100)'全局变量定义完成后再运行HMI文件RUN "Hmi.hmi",1

4.关联HMI界面控件变量。
  

5.在main.bas文件中添加界面初始化函数,并在hmi系统设置中关联初始化函数名。

  end'HMI界面初始化函数GLOBAL SUB hmi_init()main_task_state = 1 '初始化定位检测主任务状态为停止状态1ZV_RESETCLIPSIZE(1280, 960) '初始化时依据图像分辨率设置区域的裁剪尺寸,此处图像分辨率为1280x960ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(10, 5), HMI_CONTROLSIZEY(10, 5)) '设置锁存的大小d_identfy_rst=""ZV_LATCHCLEAR(0)'清空锁存通道0END SUB

6.在main.bas文件中添加HMI界面按下单次执行按钮响应的函数,并关联动作函数名。

  'HMI界面按下单次执行按钮时响应的函数GLOBAL SUB btn_identfy_test()'开始识别TICKS = 0'开始计时if(d_index=4) thend_index=0endifFile_Name="\code\"+TOSTR(d_index,1,0)+".bmp" '.../flash/code/目录下的图片所在的路径名称ZV_IMGREAD(grabImg,File_Name,0)DIM tmp1(64),tmp2(64) '定义中间变量参数ZVOBJECT codeList, codeRstZV_CLEAR(codeList) '清空结果列表d_identfy_rst=""'根据编码类型(自动)和扫描步长(1)读取采集图像中的对应数据码内容,将结果存放到codeList中ZV_CODEREAD(grabImg,codeList,0,1)if ZV_LISTCOUNT(codeList) > 0 then '如果列表中元素的数量大于0ZV_LISTGET(codeList,codeRst,0) '取出第一个条码结果作为显示ZV_CODETYPESTR(codeRst,64,24) '获取数据码类型并将其存入起始索引为24的TABLE中DMCPY tmp1(0),TABLE(24),64 '将TABLE中的数组拷贝至tmp1中ZV_CODESTR(codeRst,64,26) '获取数据码结果并将其存入起始索引为26的TABLE中DMCPY tmp2(0), TABLE(26), 64 '将TABLE中的数组拷贝至tmp2中d_identfy_rst = tmp1 + ":"tmp2 '显示识别结果为 数据码类型:数据码结果elsed_identfy_rst = "identify fail!" '识别失败给变量赋值"identify fail!"endifZV_LATCH(grabImg, 0)d_index=d_index+1d_identfy_time = abs(TICKS) '计算识别消耗的时间END SUB

7.在main.bas文件中添加HMI界面按下连续运行按钮响应的函数,并关联动作函数名。

  'HMI界面按下连续运行按钮时响应的函数GLOBAL SUB btn_run()if (1 = main_task_state) then '如果主任务处于停止状态if (0 = PROC_STATUS(main_task_id)) then'如果程序中任务未开启main_task_state = 2 '将主任务状态设置为正在运行状态RUNTASK main_task_id, main_task'开启主任务endifendifEND SUB''主任务执行的函数'main_task:' while(1)' if (3 = main_task_state) then'如果主任务状态处于正在停止状态即停止按钮按下时' main_task_state = 1'将主任务状态设置为停止状态' exit while '退出循环' endif'' '否则重复执行以下操作' btn_identfy_test() '识别条形码'' wend'END

8.在main.bas文件中添加HMI界面按下停止运行按钮响应的函数,并关联动作函数名。

  'HMI界面按下停止按钮时响应的函数GLOBAL SUB btn_stop()if (2 = main_task_state) then '如果主任务状态处于2即正在连续执行任务时main_task_state = 3 '将主任务状态置为3,退出循环endifEND SUB

9.在main.bas文件中注释连续运行执行的主任务的函数部分,在Plc1.plc文件中添加ZPLC调用主任务执行函数子程序的代码。

#三、效果演示
  

本次,正运动技术会PLC也能玩转机器视觉(二),就分享到这里。

更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。

本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。

会PLC也能玩转机器视觉(二)- 条码识别相关推荐

  1. 会PLC也能玩转机器视觉(二)

    前几期课程,我们讲述了PLC的梯形图语言的基本知识,并与大家分享了使用ZDevelop软件的ZPLC语言调用ZVision视觉指令的方法. 本期课程我们将通过使用ZPLC语言实现识别条形码的视觉功能的 ...

  2. 会PLC也能玩转机器视觉(三)- BLOB斑点定位

    在<会PLC也能玩转机器视觉(二)>的课程中,我们讲述了ZPLC调用BASIC子程序完成机器视觉识别条形码的功能. 本期课程我们将通过BLOB斑点定位的视觉功能,继续和大家一起探讨使用ZP ...

  3. 会PLC也能玩转机器视觉(一)

    梯形图(LAD, LadderLogic Programming Language)是PLC使用得最多的图形编程语言,被称为PLC的第一编程语言. 梯形图语言沿袭了继电器控制电路的形式,梯形图是在常用 ...

  4. linux查看nas剩余大小,老徐玩NAS 篇二:我的群晖储存空间哪儿去了——100%破案的教程...

    老徐玩NAS 篇二:我的群晖储存空间哪儿去了--100%破案的教程 2019-05-26 23:28:21 74点赞 866收藏 36评论 前言 为了更好的体验Nas的功能,我前段时间终于安耐不住在J ...

  5. 【Microsoft Azure 的1024种玩法】二十六. 在Azure VM中手动部署Windows Admin Center管理平台

    [简介] Windows Admin Center是微软开发的一套可以部署在本地基于浏览器的GUI的工具集平台,其平台可用于管理Windows相关服务器和PC机器,我们可以利用Windows Admi ...

  6. 【Microsoft Azure 的1024种玩法】二十四.通过Azure Front Door 的 Web 应用程序防火墙来对 OWASP TOP 10 威胁进行防御

    [简介] 我们都知道像 SQL 注入.跨站点脚本攻击(XSS)之类的恶意攻击以及 OWASP 发现的十大威胁都可能会导致服务中断或数据丢失,让 Web 应用程序所有者受到巨大威胁.那么如何有效的解决O ...

  7. 【Microsoft Azure 的1024种玩法】二十七. Azure Virtual Desktop虚拟桌面之快速创建配置(一)

    [简介] Azure 虚拟桌面是在云中运行的桌面和应用虚拟化服务,我们可以通过Azure 的虚拟桌面设置多会话 Windows 11 或 Windows 10操作系统的 部署,使整个 Windows ...

  8. 机器视觉(十二):二维条码识别

    目录: 机器视觉(一):概述 机器视觉(二):机器视觉硬件技术 机器视觉(三):摄像机标定技术 机器视觉(四):空域图像增强 机器视觉(五):机器视觉与世界杯 机器视觉(六):频域图像增强 机器视觉( ...

  9. C#上位机基础学习_基于SOCKET实现与PLC服务器的TCP通信(二)

    C#上位机基础学习_基于SOCKET实现与PLC服务器的TCP通信(二) 测试软件: TIA PORTAL V15.1 S7-PLCSIM ADVANCED V3.0 Visual Studio 20 ...

最新文章

  1. Dataset之谷歌地图数据集:谷歌地图数据集的简介、安装、使用方法之详细攻略
  2. Spark Streaming初步使用以及工作原理详解
  3. u大师u盘装系统win7_优盘如何装系统 u盘装系统的步骤
  4. Android 实现验证码效果图
  5. java 一元线性回归_一元线性回归的java实现
  6. spring 多数据源- 原理
  7. WSL 1 运行 Ubuntu 20.04 将会出现问题
  8. mount: none already mounted or /cgroup busy
  9. 零基础学python-零基础适合学习python吗?
  10. [Hive]Hive表文件压缩介绍
  11. Android开发技术周报 Issue#38
  12. goflyway安装
  13. 【转】android 常用theme
  14. docker常用操作(六)docker安装内网穿透nps
  15. 均匀线阵常规波束形成 matlab程序,波束形成Matlab程序
  16. 万字长文!用文本挖掘深度剖析54万首诗歌
  17. Win10的投屏功能无法使用问题解决思路
  18. Dreammaker水疗流行的Eclipse从他们的加州系列,审议
  19. win10开机自动打开http://go.microsoft.com/fwlink/?LinkID=219472clcid=0x409
  20. 微信小程序rotateZ实现卡片翻转

热门文章

  1. linux自定义命令-通过关键字批量杀死进程
  2. 详解“==”和equals的区别
  3. 逻辑值分类True False
  4. 倍福--绝对编码器位置保存
  5. ACM-ICPC 2018 南京赛区网络预赛 E. AC Challenge
  6. OpenMP 学习(二)
  7. win10无法打开组策略,gpedit.msc打不开
  8. http://www.dewen.net.cn/q/16042/jquery fadeIn和fadeOut问题
  9. jQuery仿QQ音乐播放器
  10. 转发一篇好文:36氪翻译自medium的文章: 读书没有 KPI:为什么坚持“一年读 100 本书”没用?...