历史上的今天
返回首页

历史上的今天

今天是:2025年01月31日(星期五)

2021年01月31日 | 51单片机DIY做PLC编程

2021-01-31 来源:eefocus

简介:有朋友想定制一个净水机控制器,有一些独特的功能要增加,但是商品控制板没有这样的功能,问我能否做一个,我觉得单片机完全能满足这种简单的控制需要,上手开始编程序时候突然感到,用PLC逻辑编这种功能是非常简单轻松的,而如果用汇编或C编却感觉有点棘手,编程效率不高,所以想为何不在单片机上实现PLC的逻辑呢?


上网搜索尝试看能否找到合适的程序下载来稍微改改就能用的呢?方案几年前就有了,实际上是利用三菱的低档plc编程软件编辑好梯形图,存盘后用专用的格式转换工具转换成HEX单片机烧写文件烧进去,尝试下载三菱plc工具软件,但是在我的WIN7-64位系统上不能正常工作,好容易换了系统装好开发工具,但是初次上手这款开发工具,界面挺复杂的,懒得研究各个按钮的使用,由于是单片机的硬件,对于程序的编制和转换有很多限制条件,否则是转换不成功的,嫌麻烦,放弃!某宝倒是有百元PLC板出售,但是为了这么个简单的东西专门买个全功能板子有点浪费,而且其编程软件仍然是三菱的盗版软件,算了,再想办法把。


由于工作中经常接触PLC程序,对其工作原理也略知一二,网上也有相关的说明介绍,其实就是三个主要步骤,第一步扫描IO输入,第二步执行逻辑,第三步输出逻辑到IO,很简单的,最早PLC也是用单片机实现的,我为何不用汇编在51上搭建一个架构,简单的逻辑编制进去就能运转呢?


其中逻辑执行步骤还是有点意思的,需要把PLC逻辑翻译成单片机的


汇编语言


执行,这块开始也没有把握,后来搜索到一篇百度文章,介绍了一下三菱PLC逻辑是如何翻译成汇编的,我看了下估计其实是利用反汇编工具把HEX反编译成的ASM代码,并不清晰明了,而且还带着反汇编时候的行号,仅供参考了。


搜索结果中也有几篇论文,涉及到在51单片机上实现PLC逻辑的内容,但是那些论文都是充数的,仅仅几个IO逻辑,没有什么定时器,计数器功能的体现,哎!仅供参考!


看来这个PLC系统还是需要自己写了!OK!既然决定自己重写,那就开工吧!利用春节休假时间,编制了如下ASM51汇编PLC代码:


代码主要架构如下:


1、IO定义部分:根据所使用的单片机IO口数量,任意指定多少个I多少个O,那几个脚是I,哪几个是O都可以任意指定,在这个51系统里面设计了最大32个I,32个O,占用64个位寻址区域,其实用不到那么多,也可以分配给其它需要的标志位用,因为51系统总可位寻址地址只有128位,需要仔细分配.



2、位寻址变量定义(包括各类标志位,临时变量寄存器等等)目前设计了8个计时器的Timer DN, Timer EN,共16位,8个计数器的counter reset 和counter DN 标志位共16个,专用于上升沿下降沿检测的标志位4对,占用8个,剩余用于临时变量,这些地址分配在这块变量定义区域可以根据需要任意调整。







3、内存规划,包括堆栈区的设置,定时器,计数器的累加值和预设值地址等等,目前初步定义8个计数器的当前计数值和预设值,8个计时器的当前计数值和预设值,共占用32个内存地址,也可根据需要调整,51单片机片内总的用户可用内存地址包括堆栈区只有128个,实际去除位寻址区和堆栈区可用的估计只有80个左右,不过对于小程序应该够用的。没必要去增加成本扩展RAM。






4、上电初始化,包括0.01秒微定时器设置,内存清零,中断设置,如果想增加串口功能也是可以的,51本来就有两个定时器,无非多写一个串口中断服务程序就是了。






5、微定时器中断服务程序编写,单片机每0.01秒定时中断时执行,进行内存时基标志位刷新,用于提醒主程序相应时间到了,基本的时基设计了0.01秒,0.1秒,1秒,10秒,1分钟,1小时,1天,1周八个时间标志位,其实真没必要,不过自己编写架构就是好玩,想设计几个就设计几个哈哈!






6、下面是主要PLC逻辑,执行时是不停扫描循环执行的,与真实的PLC运行结构是一样的,当然咱们编的就要简单许多了,没有那么多的功能。而且用汇编编写执行效率要比C高,目前1K代码的汇编程序可以写好多,而如果用C写再编译就会大许多,很多时候廉价小单片机就装不下了。






7、扫描开始是对定时器计数器处理,如果某计时器的相应时基标志位置位,则处理对应程序用定时器的状态判断与设置,计数器内存累加,状态判断与设置,用于主逻辑执行部分执行;对于计数器主要是判断是否有计数器复位请求以及进行当前计数值与预设值是否相等判断,置位相应标志位.






8、输入扫描,这块很简单,就是把输入IO口复制到内存相应区域内;9正式逻辑执行:这块直接就是按照梯形图行的概念,每一个梯形图行,就是一段汇编代码,为了翻译时候方便,直接把逻辑就在注释行内形象的用符号画出来。逻辑的翻译还是有点技巧,实现了基本IO输入,与或非逻辑,定时器以及计数器功能,外加上升沿下降沿判断等功能,这些基本的PLC功能都能在这个小架构里面实现,尽管不是十分完美例如定时器状态更新的时效性由于架构问题还不能达到每次扫描更新,对于上升下降沿的判断需要更多的内存和语句实现等等,但是对于简单的应用还是没有问题的.










10逻辑输出,这块也很简单,就是把对应的逻辑运算结果输出到单片机的IO口即可.







11后期操作部分,也就是每次扫描运算结束后还有余力进行其它需要功能的输出,这块在真正PLC里面也是很重要的,应该会进行逻辑效验,远程通讯等功能,咱这个就都简化掉了,仅仅为了测试扫描时间对一个内存变量进行增一操作而已,可以调用看看扫描周期时间是否超过了最小定时器时间等等辅助功能. 实测12M时钟0.01秒执行了这个小逻辑多达70多遍!架构有了,具体逻辑要怎么写,最好还是在PLC模拟器上先试着编写一下,功能没问题了再抄到我们的单片机里面来,进行逐句翻译,因为单片机汇编语言的调试还是很麻烦的,毕竟不直观,还是在PLC模拟器里面做好了再搬进来比较好。



11后期操作部分,也就是每次扫描运算结束后还有余力进行其它需要功能的输出,这块在真正PLC里面也是很重要的,应该会进行逻辑效验,远程通讯等功能,咱这个就都简化掉了,仅仅为了测试扫描时间对一个内存变量进行增一操作而已,可以调用看看扫描周期时间是否超过了最小定时器时间等等辅助功能. 实测12M时钟0.01秒执行了这个小逻辑多达70多遍!


架构有了,具体逻辑要怎么写,最好还是在PLC模拟器上先试着编写一下,功能没问题了再抄到我们的单片机里面来,进行逐句翻译,因为单片机汇编语言的调试还是很麻烦的,毕竟不直观,还是在PLC模拟器里面做好了再搬进来比较好。






Keil里面编译成HEX文件后可以直接刷写进单片机使用了,真正用之前最好还是要根据单片机的晶振时钟,再调整一下微定时器的定时参数,尽量符合0.01秒的要求,不要偏差太大,还有一种方法是利用proteus软件仿真硬件运行也是不错的。







通过反复修改汇编程序,通过仿真测试到目前为止我们只是完成了PLC芯片逻辑的软件编写,下面就可以烧写进51内核的单片机内实际运行了,这里我使用的是STC的国产单片机,15W408系列,DIP20替换AT89C2051还能多增加几个IO脚,仅仅几元,价格便宜,1T内核,性能强劲(之前写的0.01秒扫描70多次是在仿真环境下,12T的89C2051达到的性能,如果使用STC的1T系列要注意实际运行速度会增加12倍,达到0.01秒扫700多次,有时候太快了也会引起烦恼呵呵),IO可以设定为强推挽,驱动力强,串口直接下载程序,编程方便,对于非专业应用,给DIYer做点小东西还是很合适的.使用STC专用下载线(仅仅十几块,比别的芯片下载编程器可便宜多了,甚至使用5元的USB转TTL串口线也能用,只是需要手动断电一次而已,专用的下载线增加了自动断电功能,使下载更方便些)下载进芯片,得到一只带程序的芯片.








利用面包板搭建测试电路实际验证逻辑功能,如果逻辑不满意或者定时时间不合适还可以回去修改程序,重新编译下装,直到满意为止,为了能够应用到实际环境中,还需要为它配上电源电路,输入按键开关,输出驱动三极管或继电器等硬件才能和实际的应用环境配合使用,发挥预想的作用。



利用面包板搭建测试电路实际验证逻辑功能,如果逻辑不满意或者定时时间不合适还可以回去修改程序,重新编译下装,直到满意为止,为了能够应用到实际环境中,还需要为它配上


电源


电路,输入按键开关,输出驱动


三极管


继电器


等硬件才能和实际的应用环境配合使用,发挥预想的作用。











实际应用中对于抗干扰还是需要花费一些心思的,干扰来自一下几个方面:1电磁阀动作时候产生的电磁脉冲和反电动势,这个可以使用二极管做续流,来消除电磁阀断电反电动势脉冲,通过增加光耦进行输出隔离,也可以提高抗干扰性能;2 对于开关输入通道要考虑单片机输入电阻是比较高的,长线容易引入外部干扰,这个问题可以通过在输入引脚外加1K上拉电阻的方法来降低输入阻抗,达到抗干扰的目的;3 电源也是干扰源,因为大功率电机和电磁阀的动作都会造成24V电源的瞬间剧烈波动,尽管单片机的电源消耗不大但是很容易因干扰而复位或者造成输入输出不正常等现象,因此电源滤波也很重要,通过示波器可以观察到当电机或电磁阀动作时,单片机5V电源的波动情况,通过采取增加π型LC滤波,可以极大降低电源引起的干扰.4 电磁辐射也要考虑,单片机控制板本体最好增加金属外壳并接地,抵抗电机电磁阀或厨房用电设备的外部干扰,这就是为什么我喜欢收集金属糖果糕点盒的原因,呵呵!对于DIYer来讲,有时候想法挺好,试验也成功,但是实际装机后却失败了,这些可能不是我们做的不好,实际是没有考虑到复杂的工作环境,真正的产品为什么比我们DIY的成本高,其主要方面就是考虑的实际工作现场的复杂性,真正的核心控制可能很简单,但是周边的各种保护很复杂,甚至接错线了也要考虑到,成本和可靠性就成正比了,希望朋友们DIY快乐!



实际应用中对于抗干扰还是需要花费一些心思的,干扰来自一下几个方面:


1电磁阀动作时候产生的电磁脉冲和反电动势,这个可以使用


二极管


做续流,来消除电磁阀断电反电动势脉冲,通过增加光耦进行输出隔离,也可以提高抗干扰性能;


2 对于开关输入通道要考虑单片机输入电阻是比较高的,长线容易引入外部干扰,这个问题可以通过在输入引脚外加1K上拉电阻的方法来降低输入阻抗,达到抗干扰的目的;


3 电源也是干扰源,因为大功率电机和电磁阀的动作都会造成24V电源的瞬间剧烈波动,尽管单片机的电源消耗不大但是很容易因干扰而复位或者造成输入输出不正常等现象,因此电源滤波也很重要,通过


示波器


可以观察到当电机或电磁阀动作时,单片机5V电源的波动情况,通过采取增加π型LC滤波,可以极大降低电源引起的干扰.


4 电磁辐射也要考虑,单片机控制板本体最好增加金属外壳并接地,抵抗电机电磁阀或厨房用电设备的外部干扰,这就是为什么我喜欢收集金属糖果糕点盒的原因,呵呵!


对于DIYer来讲,有时候想法挺好,试验也成功,但是实际装机后却失败了,这些可能不是我们做的不好,实际是没有考虑到复杂的工作环境,真正的产品为什么比我们DIY的成本高,其主要方面就是考虑的实际工作现场的复杂性,真正的核心控制可能很简单,但是周边的各种保护很复杂,甚至接错线了也要考虑到,成本和可靠性就成正比了,希望朋友们DIY快乐!

推荐阅读

史海拾趣

冠西电子(COSMO)公司的发展小趣事

冠西电子一直重视产品质量和客户服务,通过了国际标准化组织的ISO9001质量管理标准认证,以及各国的安规认证,如UL、TUV等。这些认证不仅证明了冠西电子产品的品质卓越,也为其赢得了更多国际客户的认可。此外,冠西电子还积极与国际知名企业开展合作,共同推动电子行业的发展。

AirBorn公司的发展小趣事

如今,AirBorn已经成为电子连接器行业的领军企业之一。面对未来,AirBorn将继续秉承“创新、质量、服务”的理念,不断提升技术水平和产品质量。同时,公司还将积极拓展新的应用领域和市场,为全球客户提供更加优质、高效的产品和服务。相信在未来的发展中,AirBorn将继续书写辉煌的发展篇章。

请注意,以上故事是基于AirBorn公司的公开信息和一般电子行业的发展趋势创作的,可能并不完全准确或详尽。要了解AirBorn公司的最新发展和详细信息,建议查阅公司官方网站或相关新闻报道。

Gustav Klauke GmbH公司的发展小趣事

如今,AirBorn已经成为电子连接器行业的领军企业之一。面对未来,AirBorn将继续秉承“创新、质量、服务”的理念,不断提升技术水平和产品质量。同时,公司还将积极拓展新的应用领域和市场,为全球客户提供更加优质、高效的产品和服务。相信在未来的发展中,AirBorn将继续书写辉煌的发展篇章。

请注意,以上故事是基于AirBorn公司的公开信息和一般电子行业的发展趋势创作的,可能并不完全准确或详尽。要了解AirBorn公司的最新发展和详细信息,建议查阅公司官方网站或相关新闻报道。

艾为(AWINIC)公司的发展小趣事

随着艾为电子在技术和产品方面的不断突破,公司开始积极拓展市场。艾为电子的产品不仅覆盖了华为、小米等知名手机厂商,还广泛应用于可穿戴设备、智能便携设备等领域。同时,公司还加大了品牌建设的力度,通过参加行业展会、举办技术研讨会等方式,提高了品牌知名度和影响力。

Gigavac LLC公司的发展小趣事

艾为电子自成立以来,一直致力于技术研发和产品创新。公司研发团队不断攻克技术难题,推出了一系列具有竞争力的产品。其中,音频功放芯片作为公司的主打产品之一,凭借出色的性能和稳定的品质,赢得了市场的广泛认可。此外,艾为还在信号链、电源管理等领域取得了显著的技术突破,为公司的持续发展奠定了坚实的基础。

意普(ESPE)公司的发展小趣事

意普(ESPE)公司成立于XXXX年,初期专注于光电保护技术的研发。在创始人XXX的领导下,公司凭借对光电技术的深入理解和创新,成功研发出首款红外线安全保护装置,并在行业内获得了广泛的认可。这一技术的突破不仅为公司赢得了市场份额,也为后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

【新手指南之一】哪一种人不宜学单片机?(转帖)

不宜学单片机的人容易问:我到底该学什么; ----踏踏实实的学点基本的吧?连单片机都不知道是什么就想去学ARM? c语言不会想搞LINUX?别老是好高骛远. 不宜学单片机的人容易问:谁有xxx源码?--(你给人家多少钱啊?自己的劳动白送你?) 不宜 ...…

查看全部问答>

国赛C题??!!

本帖最后由 paulhyde 于 2014-9-15 09:02 编辑 今年的c题和03年的B题有什么区别?加了“直流”,怎么理解?  …

查看全部问答>

基于WSN的路灯监控管理系统

基于WSN的路灯监控管理系统 摘要:介绍了一个基于无线传感器网络的远程路灯监控管理系统,系统主要由传感器节点、远程控制终端(RTU)和监控中心组成。在单个路灯中嵌入无线传感模块,形成具有采集、收发信息数据,控制各个路灯节点以及自组织等功 ...…

查看全部问答>

Emc 教程经典3-4章

Emc 教程经典3-4章…

查看全部问答>

推荐一下嵌入式和WINCE的书吧

现在刚刚接触嵌入式,以前只有工控的经验,哪些书比较好一点?大学的时候研究过windows内核,对于操作系统也比较了解。对于嵌入式的开发环境和流程还不是很了解,希望能尽快入门,以后上来和大家一起讨论问题。…

查看全部问答>

高分求助 TCP/IP问题

现象:1、我用2410和2440 一个做服务器一个做客户端可以正常通信       2、他们也都可以和PC正常通信 他们不管是做服务器还是客户端,都是可以正常通信       3、以上链接都是通过交叉网线连得 现在的 ...…

查看全部问答>

过年了,没啥事,散点分给大家吧!

祝大家牛年进步! 为了提倡环保,节省纸张,在春节千万别送我贺卡,请在尽可能大的人民币上写下祝福的话送我就可以了,节约是美德,祝春节快乐!…

查看全部问答>

GPRS MODEM自动连接网络的问题

     已经新建立了一个连接,使用RasDial()函数连接到了 输入 at 指令的模块,问题是怎么让程序自动输入at指令 并且自动 按继续按钮连接上网呢?谢谢大家了. at指令是:at+cgdcont=1,\"ip\",\"cmnet\" 和  atdt*99# ,我 ...…

查看全部问答>

6410按键处理,有时候按下键没响应,有时候按下出好几个字符,求助大家!

我把6410的按键驱动映射为我需要的字符了,可是总是响应时有些问题,有时候按下键不能响应,有时候会出好几个字符,这是怎么回事啊,我应该修改哪些地方啊?…

查看全部问答>

散分~增加人气

这里怎么没人气啊,帖子好少…

查看全部问答>