×

使用Modbus模拟胶印机

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2023-06-20

分享资料个

描述

介绍

该项目展示了一个 HMI 应用程序,该应用程序模拟使用 Modbus TCP/IP 服务器运行的胶印机的操作。这是用于演示 Modbus 功能的胶印机的简化模拟。请注意,我们编写此模拟器并不是因为我们是印刷行业的专家,而是因为我们需要具有特定功能集的便携式模拟器。

该模拟器的开发目的是在 ARM 和 x86 上的 Linux 上运行,使用 C++ 和 QT 框架。它使用libmodbus库来处理 Modbus 通信。此外,它还设计有用于触摸屏的 GUI,以及 800x600 分辨率的显示屏。

软件设置

该应用程序分两部分开发。第一部分由负责托管机器逻辑的库组成。它包含机器和组件。机器是组件的宿主,它们之间可以交换消息。机器可以通知组件其状态(启动/停止),如果组件为空,则组件可以通知机器,在这种情况下机器需要停止工作。传送带是最重要的组件,因为它负责定期对所有其他组件执行 ping 操作。原因之一是改变他们的计数。

第二部分是QT应用程序。它包含作为依赖项的库。它使用模拟器的钩子和 QT 中的 Signal/Slot 机制来提供来自模拟器的值并与之交互。同样,Modbus 服务器允许交互和监控模拟器值。

应用程序的部署是一个循序渐进的过程,我们将逐步完成。该过程包括:

  • 克隆源代码
  • 安装所有依赖项
  • 构建应用程序
  • 进行额外的硬件设置

我们从最简单的步骤开始——通过执行以下操作克隆应用程序的源代码:

git clone https://github.com/Wolkabout/offset-printing-machine-simulator-application.git --recurse-submodules

完成后,我们需要安装所有依赖项。下面列出了依赖项:

  • gcc、制作和制作 (>= 3.14)
  • libpthread-stubs0-dev (pthread), libmodbus-dev (libmodbus)
  • libqt4-dev, libqt4-dev-bin

您可以以更快的方式执行此操作 - 通过执行包含的 shell 脚本。如果您有权访问 apt 和 snap 商店,则此功能可用。请执行下列操作:

. dependencies.sh

如果没有,请在您的发行版各自的包提供商上安装依赖项。或者,对于 cmake (>= 3.14) 和 Raspberry Pi,在您的硬件上编译它。

安装完所有依赖项后,您终于可以构建应用程序了。为了简化这个过程,我们创建了一个 shell 脚本来为您构建应用程序。执行以下命令:

. build.sh

运行构建脚本后,您应该有一个可执行文件准备好执行,并移动到文件夹 /out。要运行该应用程序,请键入下一个命令:

./modbus-application

就是这样!该应用程序正在全面运行!您将登陆如下所示的主屏幕:

pYYBAGOSjhuAQTA8AABLIY9vZaQ728.png
 

您可以在底部看到控件,那里有后退和主页按钮。日志按钮指向日志屏幕,而设置按钮指向设置屏幕。

开始演示按钮显示应用程序的主要部分,即模拟器。

poYBAGOSjh6AU5FnAACGkAYL1fo869.png
 

在此屏幕上,您可以看到机器所处的状态以及所有控件。它们如下所列:

  • 引起模拟问题:卡纸和急停
  • 重新填充组件
  • 改变机器的速度

您还可以通过按“重置为配置”按钮从设置屏幕将机器重置为默认状态。

硬件设置

我们的硬件设置设置为Compulab Fitlet2 IoT PCIEI DM-F08A 工业显示器。Ubuntu 19.04 Desktop 安装在驱动器上。此特定组合需要安装Penmount Touchscreen 驱动程序。

剩下要做的是对运行应用程序的硬件进行一些小的配置。完成设置需要几个步骤。这些包括:

  • 创建 xdg/autostart 桌面条目
  • 设置静态IP地址

要添加桌面自动启动条目,请将桌面文件从项目的附件复制到/etc/xdg/autostart/文件夹。这将在您下次重新启动计算机时显示效果。

然后继续设置静态IP地址。这是通过几个步骤完成的。

poYBAGOSjiKAFuA4AAAg7b_HUQo083.png
 

转到“有线设置”,然后更改连接接口的设置。您需要禁用 DHCP 并将其设置为手动。设置地址、网络掩码和网关。如果您需要找到这些设置,请查看您的路由器设置。大多数情况下,IP 地址为 192.168.0.x。所以,一般来说,您会想要使用 192.168.0.1 和 192.168.0.255 之间的任何空闲地址。请注意,在大多数情况下,网络掩码是 255.255.255.0,网关是路由器的地址,通常是 192.168.0.1。

pYYBAGOSjiWAFsDcAABgO13ZOts448.png
 

结论

 

设置完所有内容后,您终于拥有了一个功能齐全的模拟器。它包含胶印机的工作逻辑,您可以通过 GUI 通过 Modbus 访问它。我们使用 Modpoll 测试了 Modbus,并针对此处链接的特定寄存器进行了测试

下一步是将设备与网关连接,该网关能够使用 Modbus 启动和轮询数据并将其发送到云端。在这里查看我们的其他 Hackster 项目是如何实现的

--

您是否考虑过 IoT 项目?通过 Hackster.io 与 WolkAbout 社区分享。我们很想看看您可以使用 WolkAbout 物联网平台做什么!

如果您在开发它时需要帮助,我们可以满足您的要求!阅读我们团队的项目并继续关注新项目。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'使用Modbus模拟胶印机',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);