勤工俭学
deep throat
级别: 论坛先锋
精华主题: 0
发帖数量: 188 个
工控威望: 1567 点
下载积分: 5955 分
在线时间: 120(小时)
注册时间: 2016-03-10
最后登录: 2024-09-27
查看勤工俭学的 主题 / 回贴
楼主  发表于: 2017-07-14 22:47
用gx-designer3写的触摸屏,gx-developer写的PLC程序。
功能有机种存储、、查看、选定、搜索、修改和删除。
关键是思路,程序稍微修改一下既可以套用了。尽可能地模块化吧。
附件里包括触摸屏程序、PLC程序和程序思路文档。
2017/8/31更
之前把程序上传后也没怎么理会了。前几天把压缩包发给同事时,打开发现上传的程序搞错了,程序里面既没有注释也不完整。对于那些已经下载程序的朋友们表达歉意。


抱歉了,浪费你们的时间了!



下面我把有注释的程序更换了,在这之前顺便把重名检测功能加上去了,并且用gt simulator仿真过,本人暂时没有发现bug。如有发现的朋友,可以跟我说一下。

关于思路的那个文档我也整理了一下,因为原来的文档是我记录思路的第一现场,散乱。

思路如下
这个程序适应于生产型号调用、存储和查看等功能。因为PLC代码的可移植性太差了,思路就显得尤为重要了。下面的内容就是本程序的思路。
首先明白调用,存储和查看之间该怎样处理数据。首先确定一个型号需要多少存储空间。这里确定一个型号为10个寄存器。在寄存器里给各个功能分配存储空间,各种功能就是对空间里的信息进行读写。这里分配D1000到D1009为设定区域,D1010到D1019为调用区域,D1020到D2000为存储空间。接下来解释各个区域有什么作用。

设定区域顾名思义,在存储前对型号进行各种参数的设定。例如,型号名称为ABC,定位参数X轴为100,Y轴为200,Z轴为300,单相电机或三相电机。这些数据都在这个区域设定完毕,再按照一定的规律存储到D1020至D2000之间的空间。这个区域还需根据实际情况进一步细分D1000至D1009之间的空间的功能。程序里将D1000至D1002分配为型号名称,D1003为X轴,D1004为Y轴,D1005为Z轴,D1006.0为单相电机,D1006.1为三相电机。此外,在设定区域内可搜索名称输入框中的型号,设定区域还可以用作查看已存储型号的参数。
调用区域,正常生产时,所需要的数据从调用区域读取。该区域细分功能与设定区域细分功能是一样的,并且一一对应的。调用区域在我的理解里算是一个接口吧,其他的程序就从这个区域读取相应的数据,用作生产。设立这个区域还有一个原因就是为了和设定区域以及存储区域进行隔离。为了避免在操作设定区域和存储区域时,影响正常生产。

存储区域这个就是存储已经设定好的型号,相当于数据库功能。根据每个型号分配的寄存器个数,每个型号在存储区域内占有10个寄存器。排列如下,D1020至D1029,D1030至D1039,如此类推。
各个区域之间的数据处理。

设定区域>存储区域>调用区域
存储区域>设定区域

上面表示三个区域之间的关系,箭头方向表示数据写入方向,并且一个箭头代表一个BMOV指令。
按下存储按钮,将设定区域写入存储区域。
型号编号有变动、搜索成功和选定,将存储区域的数据写入设定区域,显示。
按下选定按钮,将存储区域的数据写入调用区域,。
按下删除按钮,将清零当前显示的型号和清空设定区域。
按下清空按钮,清空设定区域。
根据上面的动作,写好三个BMOV指令至关重要。

以上是大体的方向,下面的内容将涉及到各个功能的细节,以及曾经遇到的问题。
设定区域有一个型号编号输入框,要想查看已存储型号的参数,只需要输入相对于的型号编号即可。
1,设定区域要清零。
因为预先给每个型号分配的寄存器个数超过了实际需要的个数,并且没使用到的寄存器在人机界面上是无法对其进行读写的。清空主要是在存储前对这部分寄存器进行清零。

2,搜索只对型号名称进行搜索,对于型号参数不搜索。
搜索成功后,将搜索到的内容显示在设定区域。这里只需要将搜索到的型号的编号反馈给设定区域的编号输入寄存器即可。
存储前要对准备存储的型号名称进行重名检查及空白名称检查。重名检查也需要逐一对比,这部分功能与搜索有重叠,在搜索的基础上稍微修改即可。但有一点应该注意的,就是重名检查要跳过当前编号的型号。具体来说就是,将原本存储在编号8的A型号存储在编号8的空间上并没有违反重名规则。
空白名称检查,在程序里名称以ASCII码存放的,在ASCII中空白字符并不是0000,所以空白名称检查要考虑这种情况的出现。在人机界面中,一个寄存器在ASCII码显示框为空白的情况有两种,一种是x00,一种是x20。假设ASCII码输入框为4位,但只输入一个A。这是对于寄存器来说可不是只有一个字符A,而依然是4个字符,只是一个为A,其他三个为空字符。但是空字符在寄存器内表示的数值却不是x00,而是x20。
目前我遇到的问题都已经解决了。
[ 此帖被勤工俭学在2017-08-31 21:16重新编辑 ]
本帖最近评分记录:
  • 下载积分:+5(新工电工) 感谢分享!
  • 工控威望:+20(ymmfa) 感谢分享!
  • 下载积分:+2(li051005) 感谢分享!
    kyy80
    态度决定一切``````
    级别: 工控侠客
    精华主题: 0
    发帖数量: 1226 个
    工控威望: 3496 点
    下载积分: 4402 分
    在线时间: 1979(小时)
    注册时间: 2008-02-17
    最后登录: 2024-11-22
    查看kyy80的 主题 / 回贴
    1楼  发表于: 2017-07-16 19:25
    谢谢楼主。。。。。。。。。。。。。。。。。