前段时间, 微信群里有个网友杠我:
万老师, 你如果能研究把烟台方法应用到信捷小PLC中,实现优雅编程就厉害了。
我说,那怎么样?
佩服你厉害。
那就是男人之间最朴素的赌约了:承认你厉害。
虽然没有啥实际意义, 我还是到信捷官网下载了编程软件研究了一下。
属于最简单的那种PLC, 没有FC, 也没有FB, 只有一个C函数功能,然而主要用于自定义算法实现的,看来也用不上什么大用场。
所以简单研究后, 就放弃了。 软件卸载, 文档资料也都删除到回收站里了。
反正我也没吹过牛,没拍过胸脯, 做不出就做不出了。 也不是我个人的责任。 没什么。
然而两天前, 某位参加了烟台方法学习的深圳的学员讲, 他们那里周边有很多非标设备的厂家,大量使用信捷PLC控制,因为成本低,所以用量很大。 是一块巨大的市场。
所以, 如果我们能努力研究下,开发出便捷高效的程序架构,帮助这些工厂实现一定程度的标准化架构,也可以带来一些市场收益。
所以我就把删除的文件从回收站里又翻出来恢复,软件也重新安装了。 再从头研究了解。 其实本意想的是, 如果实在不能实现面向对象模块的重复调用, 那就最朴素的方法平铺开写,然后通过STL的规律, 顶多想办法 再用高级语言软件生成一套上位编程软件,对象的应用库都在上位软件中,在上层实现面向对象的标准化应用, 顶多实现过程麻烦一点,但只要花出些精力实现了, 以后一劳永逸,也仍然可以实现高效和优雅。
于是按照上述的思路, 把80双联开关的例子程序在信捷PLC中实现了, 先做了一般发给他。
然后再具体翻阅文档的时候, 发现信捷PLC虽然不支持单独文件格式的子程序,所有程序都在一个主程序中实现, 然而仍然可以有子程序:
虽说相当简陋,但也总比一遍一遍无穷次地重复写代码要好一些。
所以研究了如何用这个P子程序实现功能块的方法。 只有实现了功能块, 后面才有可能实现面向对象的标准化应用。
而这种子程序的缺点非常多,没有参数接口,没有INPUT, OUTPUT, TEMP , STATIC, 其实就是啥都没有。
那么就需要把这些功能全都逐一规划实现。
比如没有INOUT接口, 我们可以统一规划M100-M199为输入接口,而M200-M299为输出接口。所有FB均使用同一接口,可以实现在调用时结构的统一规范,易于使用。
那么每个FB逻辑内部, 需要对使用的公共M区(以及D区)进行备份保存现场,以及运行数据恢复。那么需要得到每个实例的UID标识, 以将静态数据保存到固定的存储区域。
然而也并不适合所有数据全部存储,需要部署安排一部分TEMP区域,否则所有数据都保存的话,在系统设备多的时候,D区很快会耗光。
我做三菱标准化的时候为什么曲折特别多?就是因为它的FB里面没有TEMP, 全靠STATIC VAR , 导致软元件消耗非常快,动辄一不小心就耗光。
而对于TEMP区,还需要考虑到子程序多重调用产生的堆栈和出栈的问题,同一个子程序内部,在调用了另外的子程序进入并回来后,TEMP的数据以及INOUT的数值都不应该丢失被冲掉。
即需要有一个堆栈层数的计量。
这种编程其实已经完全回到最古老的汇编语言的编程了。 而其实所有高级语言,以及PLC语言, 最终也都是经过编译后成为汇编语言并到机器码,才被CPU识别并执行。 所以是否支持面向对象的功能, 那是高级语言系统的区别, 到了机器代码层级,都一回事, 并没有什么区别。
比如我所规划的:
M5000-5099 100 BIT TEMP,M5100-5199 100bit INPUT,M5200-5299 100BIT OUTPUT,DM5300-5320 20WORD TEMP, 其中DM5300存放了当前UID的偏移量---堆栈保存到的D1100
D1000-1020 20WORD STATIC
D1000 参数给定/运行INPUT/OUTPUT
D1020 参数给定内部使用
D1040-1060 TEMP
---堆栈40wWORD保存到的D1200
D1060 运行值静态
有人会反驳, 标准化编程你不是反对用全局变量嘛? 这不还是规划使用了全局变量
放心, 我这里规划的全局变量,都是同一套变量在重复使用, 而且使用之前会保存现场值,使用之后会恢复现场值。
比如M5000的数据我用过了,然而如果有相邻的程序功能, 有人恰巧也用到了M5000,也不影响。(这里面又又出现了谈虎色变双线圈色又变的故事, 下回专门讲)
最终程序用到的只是D1000—D7999的数据区。 而且数据区的使用都是自动分配的不会发生呼吸干涉, 即便调试程序, 都不需要查阅数据区的使用情况。
如下是实现了定时器以及MOTOR块的情况:
以及电机块的实例化调用:
大学时代有学习过汇编语言, 考试成绩还不错。 然而工作这么多年,除了曾经解读加密软件的反汇编代码曾经接触过一点之外,一直没有机会用到。 没想到那点技能和理解,今天又用上了。
这个程序暂时不打算公开。因为并没有经过调试,还有很多错误。因为我并没有信捷PLC的真机,而信捷的软件里也没有仿真功能。 所以虽然我把架构搭好了,到真正能跑起来, 差的还很远很远。 要完全实现标准化烟台方法, 更是不知到哪年了。
也不打算做完整的培训例子教程,一方面不晓得同行的需求度有多高,我耗费心血做下来市场不认可, 也是白白浪费精力。 另一方面,这个的开发难度比起即便SMART和三菱,又高出了一个层级, 那么价格会比他们更高,而对于习惯使用廉价PLC的同行及工厂来说, 这部分费用肯定难以承受。
开发难度高,学习难度也更高了。 学习的门槛就更高。所以也不认为有推广的意义。 如果哪位玩汇编熟练的老手,想做同样的工作,看看我上面两张截图和说明, 估计自己也能做出来。
如果哪位手里有淘汰不用的信捷PLC的硬件, 又非常想获得这套例子程序参考,可以跟我联系交换。 但无论如何必须接受一点:程序是不完整的, 一定有很多错误。所以你肯定是先接受了本文中提出的理论理念, 认为有可行性,才来加入学习。 而不是像行业中的某些人,拿到我书看到其中的TIA误写成TAI这样的错误,就破口大骂,抱怨书的内容垃圾, 甚至大有一种通过一个小错误全盘掀翻所有理论, 并逼你下跪认错的架势。 太令人不齿了。
其他的有应用信捷PLC, 或者其它类似的小型PLC如军创等的厂家, 如果有研发非标设备的需求, 希望能有协助开发标准化程度高一些的程序架构,现在可以联系合作了。
附件:
[本地下载]